什么是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)
履行代码,得到的数据如下图所示。
能够看到,最终一列数据,便是对每个用户细分的用户分层。最终,咱们来看看,每个类别的用户数是多少,代码如下: