我是怎么利用Python+RFM模型高效了解用户! - Go语言中文社区

我是怎么利用Python+RFM模型高效了解用户!


 

是的,我们每个人在平台的眼里,价值都是不一样的。

比如一些天天上网购物,拆快递拆到手软的美女帅哥们,他们就是各个平台的高活跃高价值用户,他们要是哪天有停止购物准备跑路的痕迹,平台的运营朋友会急得想死,千方百计进行挽留,毕竟你是他们的衣食爹妈,死活得让你继续贡献软妹币。

还有一些用户就没这么好运了。

比如东哥这种死抠门,三年五年不见得出一次血,一个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学习是个永无止境的过程。只要是技术,就越精越好。

这就要求我们要不断去实践,站在岸上学不会游泳,你只要亲自找数据做分析了,你才会不断碰壁,不断遇到困难,接下来你就会想办法解决这些问题,你的技术就在这个过程中慢慢变成熟了。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Pythoncxy/article/details/101203551
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-02 18:00:42
  • 阅读 ( 1339 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢