Python pandas RFM模型应用实例详解
本文实例讲述了PythonpandasRFM模型应用。分享给大家供大家参考,具体如下:
什么是RFM模型
根据美国数据库营销研究所ArthurHughes的研究,客户数据库中有3个神奇的要素,这3个要素构成了数据分析最好的指标:
- 最近一次消费(Recency):客户最近一次交易时间的间隔。R值越大,表示客户交易距今越久,反之则越近;
- 消费频率(Frequency):客户在最近一段时间内交易的次数。F值越大,表示客户交易越频繁,反之则不够活跃;
- 消费金额(Monetary):客户在最近一段时间内交易的金额。M值越大,表示客户价值越高,反之则越低。
RFM实践应用
1、前提假设验证
RFM模型的应用是有前提假设的,即R、F、M值越大价值越大,客户未来的为企业带来的价值越大。这个前提假
设其实已经经过大量的研究和实证,假设是成立的。不过为了更加严谨,确保RFM模型对于特殊案例是有效的,
本文还进行了前提假设验证:
ps:Frequency、Monetary均为近6个月内的数据,即1-6月数据;
利用相关性检验,验证假设:
- 最近购买产品的用户更容易产生下一次消费行为
- 消费频次高的用户,用户满意度高,忠诚度高,更容易产生下一次消费行为
- 消费金额高的用户更容易带来高消费行为
2、RFM分级
简单的做法,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)
3、客户分类
本文采用K-means聚类进行分类,聚类结果结合业务划分为4大类:
- Cluster1:价值用户R、F、M三项指标均较高;
- Cluster2,3:用户贡献值最低,且用户近度(小于2)和频度较低,为无价值客户;
- Cluster4:发展用户,用户频度和值度较低,但用户近度较高,可做up营销;
- Cluster5:挽留客户,用户近度较低,但频度和值度较高,需采用挽留手段
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]='重点挽留客户'
})
4、RFM打分
步骤3,我们将客户划分为四大类,其实如果一类客户中还有大量的客户,此时为了精细化营销,可以根据RFM进行加权打分,给出一个综合价值的分。这里,运用AHP层次分析法确定RFM各指标权重:
客户价值RFM_SCORE=0.25rankR+0.20rankF+0.55*rankM
AHP层次分析法(专家打分法)
总结
上述客户分类其实比较粗旷,真正在面对千万级客户量时,如此划分为四大类是难以满足运营需求的。运营中,还需要综合CRM中其他指标、维度。
ps:后续作者利用RFM客户价值得分进行潜在客户挖掘,尝试利用决策树等模型挖掘平台潜在客户特征。
简单实例
importpandasaspd
importnumpyasnp
importtime
#todo读取数据
data=pd.read_csv('RFM_TRAD_FLOW.csv',encoding='gbk')
#print(ret)
#todoRFM------>R(最近一次消费)
#todo时间与字符串相互转换
data['time']=data['time'].map(lambdax:time.mktime(time.strptime(x,'%d%b%y:%H:%M:%S')))
#print(data)
#todo分组
groupby_obj=data.groupby(['cumid','type'])
#forname,dataingroupby_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(lambdax:x.replace(np.nan,min(x)),axis=0)
#print(data_trans)
r_trans['r_max']=r_trans.apply(lambdax:sum(x),axis=1)
#print(r_trans)
#todoRFM------>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(lambdax:-x)
#print(f_trans)
f_trans['f_total']=f_trans.apply(lambdax:sum(x),axis=1)
#print(f_trans)
#todoRFM------>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(lambdax: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程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。