社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
是的,我们每个人在平台的眼里,价值都是不一样的。
比如一些天天上网购物,拆快递拆到手软的美女帅哥们,他们就是各个平台的高活跃高价值用户,他们要是哪天有停止购物准备跑路的痕迹,平台的运营朋友会急得想死,千方百计进行挽留,毕竟你是他们的衣食爹妈,死活得让你继续贡献软妹币。
还有一些用户就没这么好运了。
比如东哥这种死抠门,三年五年不见得出一次血,一个49块钱买的破衬衣要穿好几个春夏秋冬。这种的话,平台都懒得鸟你,你特么爱来不来,多一个不多,少一个不少,出门左拐,慢走不送。
那么平台是通过哪些维度进行用户价值判断与划分的呢?
今天的主角RFM模型就来告诉你答案。
— 1 —
RFM模型
有的人看到模型两个字,就瑟瑟发抖,以为要用各种数学公式,想都不想就一脸嫌弃。其实你误会了,RFM模型真的非常友好,要不然东哥这种纯文科生也搞不掂。
看名称你就知道,这个模型主要就是三个要素:
R,Rencency,就是最近一次消费是啥时候。比如你上次买姨妈巾是一个月前。
F,Frequency,就是你的消费频率,比如你一月来一次大姨妈,那你一个月会买一次姨妈巾,一年就是12次,当然也有人一次性买一年的,那么你的消费频率就低了,一年才1次。
M,Monetary,就是你的消费金额,有的人穷,买20块钱的;有的人富,姨妈巾都要镀金的,那么可能几百几千的。
嗯,相信你对RFM模型的三个指标已经非常清楚了。那么,RFM模型为什么成立呢?逻辑是什么?
逻辑也很简单:
1、最近买过的人,应该比最近没买过的人更有价值
2、一年来买10次的人,应该比一年来买1次的人更有价值
3、消费额度100的人,应该比消费1块钱的人更有价值
在这个逻辑下,我们就会对RFM的每个指标进行打分,最后算出RFM的总分,并以此来判断客户的分层。
当然每个公司对指标的侧重点不一样,所以赋分阶段也可以有所偏向。
— 2 —
数据准备
1、数据输入
import numpy as np import pandas as pd from pyecharts import Bar,WordCloud,Pie df=pd.read_excel(r'C:UsersAdministratorDesktop销售数据.xlsx') df.head()
这个数据里面字段比较多对不对?但是RFM模型只有三个指标,所以根本不需要这么多字段,那么我们只要选出模型所需要的字段即可。
2、字段选择
df=df[['订单号','订单日期','顾客姓名','销售额']] df.head()
想要的数据字段有了,但你有没有发现,有的一个订单号拆分成了好几个?比如32号,拆成了3个,那么我们就得把这些东西给整合起来。
3、订单整合
df=df.groupby(['订单号','订单日期','顾客姓名'])['销售额'] df=df.agg([np.sum]).reset_index() df=df[['订单日期','顾客姓名','sum']].rename(columns={'sum':'销售额'})
这段代码看起来很简单,但是也包含了很多信息哦。比如数据分组、聚合、行及列索引重命名等。
好了,现在数据已经准备好了,开始建立模型。
— 3 —
建模过程
1、计算指标值
只有每个值都算出来了,我们才能根据这些值进行分层,从而判断不同用户的价值。
1.1、计算距今天数
df['距今']=(pd.to_datetime('today')-df['订单日期']).dt.days df.head()
这个是R值的基础。也就是用今天(我是9月13日做的)的时间减去用户每次消费的时间。知道用户每次消费距今的时间,我们才能筛选出距今最近的一次消费时间。
1.2、计算RFM值
R0=df.groupby(by=['顾客姓名'])['距今'].aggregate([('最近一次消费','min')]) F0=df.groupby(by=['顾客姓名'])['顾客姓名'].aggregate([('消费频次','count')]) M0=df.groupby(by=['顾客姓名'])['销售额'].aggregate([('消费金额','sum')]) rfm= pd.merge(pd.merge(R0,F0,on='顾客姓名',how='right'),M0,on='顾客姓名',how='right') #rfm = R0.join(F0).join(M0) 第二种方法 #rfm=pd.concat([R0,F0,M0],axis=1) 第三种方法 rfm.head()
用分组、聚合分别算出指标值,最后用merge函数进行拼接。当然用join、concat函数也行,根据自己的熟悉程度和习惯进行选择。
到现在为止,我们已经算出了RFM模型所有需要的所有值了。每个用户最近一次消费距今多少天,消费频次是多少,消费金额是多少,都知道了。
2、对指标进行分级
我们看到消费频次有1次到10多次的,那么我们就要对这些次数进行分级,相应的频次对应相应的等级,划分出用户价值。RFM模型分级一般分3到5级,我这里采用5分法。
2.1、给RFM的每个值进行打分评级
bins = rfm.最近一次消费.quantile(q=np.linspace(0,1,6),interpolation='nearest') bins[0] =0 labels =[5, 4, 3, 2, 1] R1 = pd.cut(rfm.最近一次消费,bins,labels=labels); bins = rfm.消费频次.quantile(q=np.linspace(0,1,6),interpolation='nearest') bins[0]=0 labels=[1,2,3,4,5] F1 = pd.cut(rfm.消费频次,bins,labels=labels); bins = rfm.消费金额.quantile(q=np.linspace(0,1,6),interpolation='nearest') bins[0]=0 labels=[1, 2, 3, 4, 5] M1 = pd.cut(rfm.消费金额,bins,labels=labels); rfm['R1']=R1 rfm['F1']=F1 rfm['M1']=M1 rfm.head()
quantile是分位数函数,cut是切片函数,类似于tableau中的数据桶。
这一步是整个建模过程中最重要的一步,如何进行分组,是rfm模型的灵魂。分组不对,会直接影响你的模型应用效果。
如果你暂时没有经验数据,那么用分位数函数进行分组就是最科学的。
从结果看到,指标分级出来了。我们已经给每个用户的每个指标进行了打分。
有朋友会有疑问,R值打分是从5到1,而其他值是从1到5呢?
解释一下:因为R值是距今的天数,所以值越大,离现在越久,所以分数越低,价值越低,因此标签是倒过来的;而其他的指标,值越大,越有价值,比如消费额度越高越好,所以是顺序进行打分。
2.2、对RFM总分进行统计分级
每个指标的分数已经算出来,现在就要对各个指标进行赋分汇总。
因为在不同业务中,每个指标的重要性是不一样的,有的阶段,频率很重要,有的阶段,销售额很重要。所以需要区别对待。
就像我们大学的时候考试,平时成绩占40%,期末考试占60%
rfm模型也可以进行这样的赋分操作。
rfm['RFM'] =0.2*R1.astype(int) + 0.3*F1.astype(int) + 0.5*M1.astype(int) rfm.head()
现在RFM总分出来了。我这里的赋分标准是倾向于消费金额的,消费额越大,分数越大。
这里astype(int) 很关键,因为涉及到数学运算,所以必须把对象转化为int整数型。
2.3、对每个用户价值进行判断
这就是RFM模型的最后一步,即根据rfm总分对每个用户进行贴标签,然后分层运营。
bins = rfm.RFM.quantile(q=[0,0.125,0.25,0.375,0.5,0.625,0.75,0.875,1],interpolation='nearest') bins[0] =0 labels = ['流失客户','一般维持客户','一般发展客户','潜力客户','重要挽留客户','重要保持客户','重要发展客户','重要价值客户'] rfm['用户分层'] = pd.cut(rfm.RFM,bins,labels=labels) rfm.head()
嗯,现在每个用户都有一个标签了。是不是感觉以后做用户运营更方便了呢?
— 4 —
模型可视化
1、人数汇总
这一步需要把每个标签的人数都统计出来,然后可以看分布情况,从而对用户整体能有个大致认知。
df1=rfm.reset_index().dropna() df1=df1.pivot_table('顾客姓名',index='用户分层',aggfunc='count') df1=df1.rename(columns={'顾客姓名':'人数'}).reset_index() df1
2、可视化柱形图
bar = Bar(title = "客户分层分布图",width = 600,height = 400) bar.add(name ="分布",x_axis=df1['用户分层'],y_axis=df1['人数'], is_datazoom_show=True,is_label_show=True) bar.render('客户分层分布图.html') bar
3、最终代码汇总
import numpy as np import pandas as pd from pyecharts import Bar,WordCloud,Pie df=pd.read_excel(r'C:UsersAdministratorDesktop销售数据.xlsx') df=df[['订单号','订单日期','顾客姓名','销售额']] df=df.groupby(['订单号','订单日期','顾客姓名'])['销售额'].agg([np.sum]).reset_index() df=df[['订单日期','顾客姓名','sum']].rename(columns={'sum':'销售额'}) df['距今']=(pd.to_datetime('today')-df['订单日期']).dt.days R0=df.groupby(by=['顾客姓名'])['距今'].aggregate([('最近一次消费','min')]) F0=df.groupby(by=['顾客姓名'])['顾客姓名'].aggregate([('消费频次','count')]) M0=df.groupby(by=['顾客姓名'])['销售额'].aggregate([('消费金额','sum')]) rfm= pd.merge(pd.merge(R0,F0,on='顾客姓名',how='right'),M0,on='顾客姓名',how='right') #rfm = R0.join(F0).join(M0) #rfm=pd.concat([R0,F0,M0],axis=1) bins = rfm.最近一次消费.quantile(q=np.linspace(0,1,6),interpolation='nearest') bins[0] =0 labels =[5, 4, 3, 2, 1] R1 = pd.cut(rfm.最近一次消费,bins,labels=labels); bins = rfm.消费频次.quantile(q=np.linspace(0,1,6),interpolation='nearest') bins[0]=0 labels=[1,2,3,4,5] F1 = pd.cut(rfm.消费频次,bins,labels=labels); bins = rfm.消费金额.quantile(q=np.linspace(0,1,6),interpolation='nearest') bins[0]=0 labels=[1, 2, 3, 4, 5] M1 = pd.cut(rfm.消费金额,bins,labels=labels); rfm['R1']=R1 rfm['F1']=F1 rfm['M1']=M1 rfm['RFM'] =0.2*R1.astype(int) + 0.3*F1.astype(int) + 0.5*M1.astype(int) bins = rfm.RFM.quantile(q=[0,0.125,0.25,0.375,0.5,0.625,0.75,0.875,1],interpolation='nearest') bins[0] =0 labels = ['流失客户','一般维持客户','一般发展客户','潜力客户','重要挽留客户','重要保持客户','重要发展客户','重要价值客户'] rfm['用户分层'] = pd.cut(rfm.RFM,bins,labels=labels) df1=rfm.reset_index().dropna() df1=df1.pivot_table('顾客姓名',index='用户分层',aggfunc='count') df1=df1.rename(columns={'顾客姓名':'人数'}).reset_index() bar = Bar(title = "客户分层分布图",width = 600,height = 400) bar.add(name ="分布",x_axis=df1['用户分层'],y_axis=df1['人数'], is_datazoom_show=True,is_label_show=True) bar.render('客户分层分布图.html') bar
对的,复制上面代码,你就可以得到最终可视化结果图,是不是很简单呢?
— 5 —
写在后面
RFM模型应用非常广泛,无论是传统公司还是互联网公司,都可以进行。
同时,RFM模型也非常灵活,你可以对模型进行修正运用,比如在R、F、M上再加一些别的元素,有的公司折扣比较多,你就可以把折扣因素加上来。
另外你可能觉得客户划分成8个类型有点多,没这个必要,那么你可以只分成5类也未尝不可。只要符合实际业务就行。比如你可以把靠后的三个类型直接归结为低价值客户。
还要说明的是,RFM模型在分组贴标签的操作中也有不同的方法,比如我这里是用分位数方法,但是还有的应用中会选择平均数方法。不过我个人觉得,平均数方法做出来的数据并不那么准确。
最后说几句:
Python学习是个永无止境的过程。只要是技术,就越精越好。
这就要求我们要不断去实践,站在岸上学不会游泳,你只要亲自找数据做分析了,你才会不断碰壁,不断遇到困难,接下来你就会想办法解决这些问题,你的技术就在这个过程中慢慢变成熟了。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!