
本节给大家介绍的是RFM模型,RFM模型是衡量客户价值和客户创利能力的重要工具和手段,通过一个客户的近期购买行为、购买的总体频率以及消费额度三个指标来描述该客户的价值状况。其中,用R(Recency)表示交易间隔、F(Frequency)表示交易频度、M(Monetary)表示交易金额组成,具体的含义如下表格所示:
数据获取
公众号后台回复
RFM模型
获取本节所使用的数据集
下面一起来学习

本文所使用的数据集一共包含七个字段和5500条样本,这些字段分别是用户id,用户出生日期,下单时间,订单ID、支付方式、支付金额和是否享受折扣。
import pandas as pddata = pd.read_csv( r'C:\Users\尚天强\Desktop\Orders.csv',engine='python',encoding='gbk') data.head()
#查看数据情况data.shape
(5500, 7)
#重复值计数data['Uid'].duplicated().value_counts()
False 2822 True 2678 Name: Uid, dtype: int64
对用户id字段重复数计数,发现一共有2678个重复值。
#删除重复值data.drop_duplicates(subset=['Uid'],keep='first',inplace=True)data['Uid'].duplicated().value_counts()
False 2822 Name: Uid, dtype: int64
删除用户id的重复值后剩余2822条记录。
#查看是否有缺失值,以及查看数据类型data.info()
# 将交易日期处理为日期数据类型data['Order_Date'] = pd.to_datetime(data.Order_Date,format='%Y/%m/%d')
# 假设2018-11-11是计算当天,求交易日期至计算当天的距离天数data['Days'] = pd.to_datetime('2018-11-11') - data['Order_Date']
# 从时间距离中获取天数data['Days'] = data['Days'].dt.days
data.head()
# 统计每个客户距离指定日期有多久没有消费了,即找出最小的最近消费距离R = data.groupby(by=['Uid'],as_index=False)['Days'].agg('min')
# 统计每个客户交易的总次数,即对订单ID计数F = data.groupby(by=['Uid'],as_index=False)['Order_Id'].agg('count')

# 统计每个客户交易的总额,即对每次的交易金额求和M = data.groupby(by=['Uid'],as_index=False)['Pay_Amt'].agg('sum')
# 将R、F、M三个数据框关联,merge默认内连接,可省略,两表on条件的关联列名均为CustomerID,同样可省略RFM_Data = R.merge(F).merge(M)
修改列名RFM_Data.columns = ['Uid', 'R', 'F', 'M']
RFM_Data.head()
判断R列是否大于等于R列的平均值,使用loc将符合条件R_S列的值赋值为1 RFM_Data.loc[RFM_Data['R'] >= RFM_Data.R.mean(), 'R_S'] = 1
判断R列是否小于R列的平均值,使用loc将符合条件R_S列的值赋值为2RFM_Data.loc[RFM_Data['R'] < RFM_Data.R.mean(), 'R_S'] = 2
同R_S赋值方法,对F_S、M_S进行赋值,但与R相反,F、M均为越大越好RFM_Data.loc[RFM_Data['F'] <= RFM_Data.F.mean(), 'F_S'] = 1RFM_Data.loc[RFM_Data['F'] > RFM_Data.F.mean(), 'F_S'] = 2RFM_Data.loc[RFM_Data['M'] <= RFM_Data.M.mean(), 'M_S'] = 1RFM_Data.loc[RFM_Data['M'] > RFM_Data.M.mean(), 'M_S'] = 2
RFM_Data.head()
这里使用一个小技巧计算RFM综合分值
RFM综合分值=100*R_S+10*F_S+1*M_S
计算RFM综合分值RFM_Data['RFM'] = 100*RFM_Data.R_S+10*RFM_Data.F_S+1*RFM_Data.M_S
RFM_Data.head()
定义RFM综合分值与客户类型的对应关系表CustomerType = pandas.DataFrame(data={'RFM': [111,112,121,122,211,212,221,222],'Type': ['潜在客户','重点挽留客户','一般保持客户','重点保持客户','一般发展客户','重点发展客户','一般价值客户','高价值客户'] } )
将RFMData与RFM综合分值客户类型的对应关系表合并为一个数据框,merge默认内连接,可省略,两表on条件的关联列名均为RFM,同样可省略RFM_Data = RFM_Data.merge(CustomerType)
RFM_Data.head()

按RFM、Type进行分组统计客户数RFM_Data.groupby(by=['RFM','Type'])['Uid'].agg('count')
import pandas as pds=pd.DataFrame({'Type':['潜在客户','重点挽留客户','一般保持客户','重点保持客户','一般发展客户','重点发展客户','一般价值客户','高价值客户'],'客户数':[681,22,174,276,489,6,324,850]},index=['潜在客户','重点挽留客户','一般保持客户','重点保持客户','一般发展客户','重点发展客户','一般价值客户','高价值客户'])s.sort_values(by='客户数',ascending=True, inplace=True)s.plot(kind='barh')
导出数据 RFM_Data.to_excel(r'C:\Users\尚天强\Desktop\RFM模型.xlsx',index=None)
通过RFM模型分类后发现,高价值客户数最多,这部分客户最近一次交易时间近、交易频次高、交易金额大,是优质客户,针对这部分客户,可以加大一些优惠力度,享受高折扣,以及做好客情维护。
而潜在客户数也较多,这部分客户最近一次交易时间长、交易频次低、交易金额小,有流失风险,鉴于这部分客户数占比较多,优先考虑挽回,可主动增加造访机会,挽回客户。

