RFM模型在客戶管理中常被用來衡量客戶價值和客戶創新能力,主要考量三個指標:最近一次消費-Recency、消費頻率-Frequency、消費金額-Monetary。根據以上三個維度對客戶做細分,假定每個維度劃分五個等級,得到客戶R值(1-5),F值(1-5),M值(1-5)。那麼客戶就被分作125個細分羣,就可根據客戶交易行爲差異針對不同羣體做不同推薦。或進一步針對不同業務場景,對R、F、M賦予不同權重Wr、Wf、Wm得到每個用戶得分:W=Wr*R+Wf*F+Wm*M,根據最終得分W排序,再劃分等級,採用不用的營銷策略
分析的數據是累計一段時間內客戶的消費記錄,每筆記錄至少需要客戶名稱、消費時間、消費金額三個要素。用R模擬生成隨機消費記錄數據,客戶編號爲1000-1999共100人,消費記錄10000條,消費記錄產生時間在2014-01-01到2015-12-29之間
sales<-data.frame(sample(1000:1999,replace=T,size=10000),abs(round(rnorm(10000,178,55)))+1) #第一列隨機產生用戶ID,第二列產生用戶消費數據
#runif(n,min=0, max=1)產生隨機數,stats::是表明runif函數來自於stats
sales.dates<-as.Date("2014/1/1") + 728*sort(stats::runif(10000))
sales<-cbind(sales,sales.dates)
names(sales)<-c("用戶ID","消費金額","消費時間")
str(sales)
根據上述消費記錄,得到Recency、Frequency、Monetary值
sales$距離時間<-round(as.numeric(difftime(Sys.Date(),sales[,3],units="days")))
salesM<-aggregate(sales[,2],list(sales$用戶ID),sum) #總消費金額
names(salesM)<-c("用戶ID","Monetization")
salesF<-aggregate(sales[,2],list(sales$用戶ID),length) #消費次數
names(salesF)<-c("用戶ID","Frequency")
salesR<-aggregate(sales[,4],list(sales$用戶ID),min) #最近一次消費時間
names(salesR)<-c("用戶ID","Recency")
test1<-merge(salesF,salesR,"用戶ID")
salesRFM<- merge(salesM,test1,"用戶ID")
每個維度劃分成5個層次,做均值劃分。並給R、F、M分別賦權重0.5,0.3,0.2來求客戶最終得分,客戶最終得分在1-5之間
#均值劃分
salesRFM0<-salesRFM
salesRFM0$rankR<-cut(salesRFM0$Recency,5,labels=F)
salesRFM0$rankR<-6-salesRFM0$rankR #rankR,5最近,1最遠
salesRFM0$rankF<-cut(salesRFM0$Frequency,5,labels=F) #rankF,1最少,5最頻繁
salesRFM0$rankM<-cut(salesRFM0$Monetization,5,labels=F) #rankM,1最少,5最多
salesRFM0$rankRMF<- 0.5*rankR + 0.3*rankF + 0.2*rankM
對Receny、Frequency、Monetary標準化後,以權重0.5,0.3,0.2來求客戶最終得分,客戶最終得分在0-1之間
#標準化後劃分
salesRFM1<-salesRFM
salesRFM1$rankR<-(salesRFM1$Recency-min(salesRFM1$Recency))/(max(salesRFM1$Recency)-min(salesRFM1$Recency))
salesRFM1$rankR<-1-salesRFM1$rankR #rankR,1是最近,0是最遠
salesRFM1$rankF<-(salesRFM1$Frequency-min(salesRFM1$Frequency))/(max(salesRFM1$Frequency)-min(salesRFM1$Frequency)) #rankF,0是最少,1是最頻繁
salesRFM1$rankM<-(salesRFM1$Monetization-min(salesRFM1$Monetization))/(max(salesRFM1$Monetization)-min(salesRFM1$Monetization)) #rankM,0是最少,1是最多
salesRFM1$rankRMF<- 0.5*salesRFM1$rankR + 0.3*salesRFM1$rankF + 0.2*salesRFM1$rankM