什么是RFM?RFM最早产生于电商领域,根据客户的交易频次和交易额衡量客户的价值,对客户进行细分。RFM是衡量客户价值的三个维度,分别为R(Recency)交易间隔、F(Frequency)交易频度、M(Monetary)交易金额组成。
- R表示间隔(Recency):也就是客户最近一次交易距今的间隔,需要注意的是,R是最近一次交易时间到现在的间隔,而不是最近一次的交易时间,R越大,表示客户越久
未发生交易,反之R越小,表示客户越近有交易发生。
- F表示频次(Frequency):也就是客户在最近一段时间内交易的次数,一般来说选取一个特定的时间段,F越大,表示客户交易越频繁,反之F越小,表示客户不够
活跃。
- M表示额度(Monetary):也在同样的时间段内,客户交易的金额,M越大,表示客户价值越高,M越小,表示客户价值越低。
importpandasdata=pandas.read_csv('D:/RFM分析.csv',engine='python'
可以大致看一眼data数据的样式,如下图所示。
#将交易日期处理为日期数据类型data['DealDateTime']=pandas.to_datetime(data.DealDateTime,format='%Y/%m/%d')#假设2015-10-1是计算当天,求交易日期至计算当天的距离天数data['Days']=pandas.to_datetime('2015-10-1')-data['DealDateTime']#从时间距离中获取天数data['Days']=data['Days'].dt.days
- 最近交易间隔R:使用CustomerID作为分组列,距离指定日期间隔天数Days作为聚合列,统计函数使用最小值函数min,即可得到每个客户的最近交易间隔R。
- 交易频率F:使用CustomerID作为分组列,OrderID作为聚合列,统计函数使用计数函数count。
- 交易总额M:使用CustomerID作为分组列,订单金额Sales作为聚合列,统计函数使用求和函数sum。
#统计每个客户距离指定日期有多久没有消费了,即找出最小的最近消费距离R=data.groupby(by=['CustomerID'],as_index=False)['Days'].agg('min')#统计每个客户交易的总次数,即对订单ID计数F=data.groupby(by=['CustomerID'],as_index=False)['OrderID'].agg('count')#统计每个客户交易的总额,即对每次的交易金额求和M=data.groupby(by=['CustomerID'],as_index=False)['Sales'].agg('sum')
执行以上代码,得到的结果如下图所示。
接下来使用merge方法,将R、F、M三个数据在客户CustomerID维度上关联起来,因为它们拥有共同的列名,在这种情况下,on参数可以省略不写,代码如下:
#将R、F、M三个数据框关联,merge默认内连接,可省略,两表on条件的关联列名均为CustomerID,同样可省略RFMData=R.merge(F).merge(M)#修改列名RFMData.columns=['CustomerID','R','F','M']
执行以上代码,得到的结果如下图所示。
-
R分值(R_S):距离指定日期越近,R_S越大,R>=平均值,R_S为1,R<平均值,R_
S为2。
-
F分值(F_S):定义为交易频率越高,F_S越大,F<=平均值,F_S为1,F>平均值,F_
S为2。
-
M分值(M_S):定义为交易金额越高,M_S越大,M<=平均值,M_S为1,M>平均值,M_S为2。
对各个用户的RFM的数据行进行打分赋值,代码如下:
#判断R列是否大于等于R列的平均值,使用loc将符合条件R_S列的值赋值为1RFMData.loc[RFMData['R']>=RFMData.R.mean(),'R_S']=1#判断R列是否小于R列的平均值,使用loc将符合条件R_S列的值赋值为2RFMData.loc[RFMData['R']<RFMData.R.mean(),'R_S']=2#同R_S赋值方法,对F_S、M_S进行赋值,但与R相反,F、M均为越大越好RFMData.loc[RFMData['F']<=RFMData.F.mean(),'F_S']=1RFMData.loc[RFMData['F']>RFMData.F.mean(),'F_S']=2RFMData.loc[RFMData['M']<=RFMData.M.mean(),'M_S']=1RFMData.loc[RFMData['M']>RFMData.M.mean(),'M_S']=2
执行代码,R_S、F_S、M_S的分组分值就计算出来了,如下图所示。
#计算RFM综合分值RFMData['RFM']=100*RFMData.R_S+10*RFMData.F_S+1*RFMData.M_S
执行代码,得到的RFM综合分值如下图所示。CustomerID:14568的分层为221,对应的就是一般价值用户。
#定义RFM综合分值与客户类型的对应关系表CustomerType=pandas.DataFrame(data={'RFM':[111,112,121,122,211,212,221,222]'Type':['潜在客户','重点挽留客户','一般保持客户','重点保持客户','一般发展客户','重点发展客户','一般价值客户','高价值客户']})#将RFMData与RFM综合分值客户类型的对应关系表合并为一个数据框#merge默认内连接,可省略,两表on条件的关联列名均为RFM,同样可省略RFMData=RFMData.merge(CustomerType)
执行代码,得到的数据如下图所示。
可以看到,最后一列数据,就是对每个用户细分的用户分层。最后,我们来看看,每个类别的用户数是多少,代码如下:
#按RFM、Type进行分组统计客户数RFMData.groupby(by=['RFM','Type'])['CustomerID'].agg('count')
执行代码,就可以得到各个客户类型的客户数了。
去年今日运营文章
- 2023: 京东总部员工自爆工资与公积金现状(0)
- 2023: 中老年网红,下一个流量红海?丨小红书银发博主内容分析(0)
- 2023: 两个不同品牌的智能手机怎么传备忘录内容(0)
- 2023: 微信视频号如何打造爆款?(0)
- 2023: 冲上热搜TOP10!入秋还有九件套?小红书关键词数据搜罗种草方式!(0)
本文转载于大数据分析与运营知识星球,本文观点不代表爱运营立场,转载请联系原出处。如内容、图片有任何版权问题,请联系爱运营处理。