您好,登錄后才能下訂單哦!
本文實例講述了Python pandas RFM模型應用。分享給大家供大家參考,具體如下:
根據美國數據庫營銷研究所Arthur Hughes的研究,客戶數據庫中有3個神奇的要素,這3個要素構成了數據分析最好的指標:
RFM模型的應用是有前提假設的,即R、F、M值越大價值越大,客戶未來的為企業帶來的價值越大。這個前提假
設其實已經經過大量的研究和實證,假設是成立的。不過為了更加嚴謹,確保RFM模型對于特殊案例是有效的,
本文還進行了前提假設驗證:
ps:Frequency、Monetary均為近6個月內的數據,即1-6月數據;
利用相關性檢驗,驗證假設:
簡單的做法,RFM三個指標以均值來劃分,高于均值的為高價值、低于均值的為低價值,如此可以將客戶劃分為8大類:
本文采取的方法是將三個指標進行標準化,然后按照分為數劃分為5個等級,數值越大代表價值越高;當然最終劃分的規則還是要結合業務來定。劃分為5個等級后,客戶可以細分為125種。
#讀取數據 rfm<-read.csv('~/desktop/rfm1_7.csv',header=TRUE) summary(rfm) #數據分布 par(mfrow=c(1,3)) boxplot(rfm$rankR1) boxplot(rfm$rankF1) boxplot(rfm$rankM1) #rfm分級 breaks1<-quantile(rfm$Recency, probs = seq(0, 1, 0.2),names = FALSE) breaks1<-c(1,14,30,57,111,181) #以流失用戶的定義來設置分級 30天以上為流失用戶 breaks2<-quantile(rfm$Frequency, probs = seq(0, 1, 0.2),names = FALSE) breaks2<-c(1,2,3,6,14,164) breaks3<-quantile(rfm$Monetary, probs = seq(0, 1, 0.2),names = FALSE) rfm$rankR1<- cut(rfm$Recency,breaks1, 5,labels=F) rfm$rankR1<- 6-rfm$rankR1 rfm$rankF1<- cut(rfm$Frequency,breaks2, 5,labels=F) rfm$rankM1<- cut(rfm$Monetary,breaks3, 5,labels=F)
本文采用K-means聚類進行分類,聚類結果結合業務劃分為4大類:
k值選擇:
聚類結果:
#聚類 df<-rfm[,c(6,7,8)] p1<-fviz_nbclust(df, kmeans, method = "wss") p2<-p1 + geom_vline(xintercept = 5, linetype = 2) km_result <- kmeans(df, 5) dd <- cbind(rfm,df, cluster = km_result$cluster) ##查看每一類的數目 table(dd$cluster) picture<-fviz_cluster(km_result, df, geom = "point") ####聚類結果解釋#### rfm_final <- within(dd,{Custom = NA Custom[cluster == 1] = '高價值客戶' Custom[cluster == 2 ] = '無價值客戶' Custom[ cluster == 3] = '無價值客戶' Custom[cluster == 4] = '重點發展客戶' Custom[cluster == 5] = '重點挽留客戶' })
步驟3,我們將客戶劃分為四大類,其實如果一類客戶中還有大量的客戶,此時為了精細化營銷,可以根據RFM進行加權打分,給出一個綜合價值的分。這里,運用AHP層次分析法確定RFM各指標權重:
客戶價值RFM_SCORE= 0.25rankR + 0.20rankF+0.55*rankM
AHP層次分析法(專家打分法)
上述客戶分類其實比較粗曠,真正在面對千萬級客戶量時,如此劃分為四大類是難以滿足運營需求的。運營中,還需要綜合CRM中其他指標、維度。
ps:后續作者利用RFM客戶價值得分進行潛在客戶挖掘,嘗試利用決策樹等模型挖掘平臺潛在客戶特征。
import pandas as pd import numpy as np import time #todo 讀取數據 data = pd.read_csv('RFM_TRAD_FLOW.csv',encoding='gbk') # print(ret) # todo RFM------>R(最近一次消費) #todo 時間與字符串相互轉換 data['time'] = data['time'].map(lambda x:time.mktime(time.strptime(x,'%d%b%y:%H:%M:%S'))) # print(data) # todo 分組 groupby_obj = data.groupby(['cumid','type']) # for name,data in groupby_obj: # print(name) # print(data) # todo 取值 R = groupby_obj[['time']].max() # print( # todo 轉為透視表 r_trans = pd.pivot_table(R,index='cumid',columns='type',values='time') # print(data_trans) # todo 替換缺失值 有缺失值,替換成最遠的值 r_trans[['Special_offer','returned_goods']] = r_trans[['Special_offer','returned_goods']].apply(lambda x:x.replace(np.nan,min(x)),axis = 0) # print(data_trans) r_trans['r_max'] = r_trans.apply(lambda x:sum(x),axis=1) # print(r_trans) # todo RFM------>F(消費頻率) # 取值 F =groupby_obj[['transID']].count() # print(F) #轉為透視表 f_trans = pd.pivot_table(F,index='cumid',columns='type',values='transID') # print(f_trans) #替換缺失值 f_trans[['Special_offer','returned_goods']]= f_trans[['Special_offer','returned_goods']].fillna(0) # print(f_trans) # f_trans['returned_goods'] = f_trans['returned_goods'].map(lambda x:-x) # print(f_trans) f_trans['f_total'] = f_trans.apply(lambda x:sum(x),axis=1) # print(f_trans) # todo RFM------>M(消費金額) # 取值 M =groupby_obj[['amount']].sum() # print(M) #轉為透視表 m_trans = pd.pivot_table(M,index='cumid',columns='type',values='amount') # print(f_trans) #替換缺失值 m_trans[['Special_offer','returned_goods']]= m_trans[['Special_offer','returned_goods']].fillna(0) # print(f_trans) # m_trans['m_total'] = m_trans.apply(lambda x:sum(x),axis=1) # print(m_trans) # 合并 RFM=pd.concat([r_trans["r_max"],f_trans['f_total'],m_trans['m_total']],axis=1) print(RFM) r_score = pd.cut(RFM.r_max,3,labels=[0,1,2]) f_score = pd.cut(RFM.r_max,3,labels=[0,1,2]) m_score = pd.cut(RFM.r_max,3,labels=[0,1,2])
關于Python相關內容感興趣的讀者可查看本站專題:《Python函數使用技巧總結》、《Python面向對象程序設計入門與進階教程》、《Python數據結構與算法教程》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結》及《Python入門與進階經典教程》
希望本文所述對大家Python程序設計有所幫助。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。