[R] Help RFM analysis in R (i want a code where i can define my own breaks instead of system defined breaks used in auto_RFM package)

Jim Lemon drjimlemon at gmail.com
Mon Oct 9 12:21:56 CEST 2017


Hi Hemant,
Here is an example that might answer your questions. Please don't run
previous code as it might not work.

I define the break values as arguments to the function
(rbreaks,fbreaks,mbreaks) If you want the breaks to work, make sure that
they cover the range of the input values, otherwise you get NAs.

# expects a three (or more) column data frame where
# column 1 is customer ID, column 2 is amount of purchase
# and column 3 is date of purchase
qdrfm<-function(x,rbreaks=3,fbreaks=3,mbreaks=3,date.format="%Y-%m-%d",
 weights=c(1,1,1),finish=NA) {

 # if no finish date is specified, use current date
 if(is.na(finish)) finish<-as.Date(date(), "%a %b %d %H:%M:%S %Y")
 x$rscore<-as.numeric(finish-as.Date(x[,3],date.format))
 x$rscore<-as.numeric(cut(x$rscore,breaks=rbreaks,labels=FALSE))
 custIDs<-unique(x[,1])
 ncust<-length(custIDs)
 rfmout<-data.frame(custID=custIDs,rscore=rep(0,ncust),
  fscore=rep(0,ncust),mscore=rep(0,ncust))
 rfmout$rscore<-cut(by(x$rscore,x[,1],min),breaks=rbreaks,labels=FALSE)
 rfmout$fscore<-cut(table(x[,1]),breaks=fbreaks,labels=FALSE)
 rfmout$mscore<-cut(by(x[,2],x[,1],sum),breaks=mbreaks,labels=FALSE)
 rfmout$cscore<-(weights[1]*rfmout$rscore+
  weights[2]*rfmout$fscore+
  weights[3]*rfmout$mscore)/sum(weights)
 return(rfmout[order(rfmout$cscore),])
}

set.seed(12345)
x2<-data.frame(ID=sample(1:50,250,TRUE),
 purchase=round(runif(250,5,100),2),
 date=paste(rep(2016,250),sample(1:12,250,TRUE),
  sample(1:28,250,TRUE),sep="-"))

# example 1
qdrfm(x2)

# example 2
qdrfm(x2,rbreaks=c(0,200,400),fbreaks=c(0,5,10),mbreaks=c(0,350,700),
 finish=as.Date("2017-01-01"))

Jim

	[[alternative HTML version deleted]]



More information about the R-help mailing list