RFM模型:是衡量客户价值和客户创利能力的重要工具和手段。在众多的客户关系管理(CRM)的分析模式中,RFM模型是被广泛提到的。该机械模型通过一个客户的近期购买行为(recency)、购买的总体频率(Frequency)以及花了多少钱(Monetary)3项指标来描述该客户的价值状况。
RFM模型意义:
1、最近有过交易行为的客户,再次发生交易的可能性要高于最近买有交易行为的客户;
2.交易频率较高的客户比交易频率较低的客户,更有可能再次发生交易行为;
3.过去所有交易总金额较多的客户,比交易总金额较少的客户,更有消费积极性
RFM模型每一类根据活跃程度与贡献有两种可能(高或低),排列组合到一起对应到8中情况:如图所示RFM模型价值划分
分析目的:基于客户消费行为数据进行用户价值划分为用户分类,刻画用户价值画像
分析过程:
对R_s类进行编码并计算各项得分,表示离指定日期越近,得分越高,最高4分,最低1分
F_s类,特定时间段内交易频率越高,得分越高,最高4分,最低1分
M_s类,特定时间段内交易金额越高,得分越高,最高4分,最低1分
Python代码如下:
import pandas as pd
import datetime as dt
import warnings
warnings.filterwarnings('ignore')
orders = pd.read_excel('C:\\Users\\willc\\Desktop\\data\\RFM Analysis.xlsx')#导入数据文件
orders.head()
order_dateorder_idcustomergrand_total
02009-07-11CA-2011-100006Dennis Kane378
12007-08-11CA-2011-100090Ed Braxton699
22011-03-14CA-2011-100293Neil Franz sisch 91
32011-01-29CA-2011-100328Jasper Cacioppo 4
42004-08-11CA-2011-100363Jim Mitchum 21
now = dt.datetime(2014,12,31)###选择时间
orders['order_date'] = pd.to_datetime(orders['order_date'])###时间格式转换
###数据的分组变换处理
rfmtable = orders.groupby('customer').agg({'order_date':lambda x: (now-x.max()).days,#recency
'order_id':lambda x: len(x),#frequency
'grand_total':lambda x: x.sum()})#monetary
rfmtable.rename(columns = {'order_date': 'recency',
'order_id': 'frequeency',
'grand_total': 'monetary'},inplace = True)##重命名对列名称
rfmtable.head()
recencyfrequencymonetary_value
customer
Aaron Bergman11443887
Aaron Hawkins1271744
Aaron Smayling46173050
Adam Bellavance10587756
Adam Hart34103249
接下来对数据进行切割分层利用分位数函数(quantile),并且建立细分表
quantiles = rfmtable.quantile(q = [0.25,0.5,0.75])
quantiles
recencyfrequencymonetary_value
0.2544.05.01145.0
0.50154.06.02257.0
0.75404.08.03784.0
rfmsegmentation = rfmtable
def rfmclass(x, p, d):
if x <= d[p][0.25]
return 1
elif x <= d[p][0.50]:
return 2
elif x <= d[p][0.75]:
return 3
else:
return 4
def fmclass(x ,p ,d):
if x <= d[p][0.25]:
return 4
elif x <= d[p][0.50]:
return 3
elif x <= d[p][0.75]:
return 2
else:
return 1
rfmsegmentation['R_Quantile'] = rfmsegmentation['recency'].apply(fmclass,args=('recency',quantiles))
rfmsegmentation['F_Quantile'] = rfmsegmentation['frequency'].apply(rfmclass,args=('frequency',quantiles))
rfmsegmentation['M_Quantile'] = rfmsegmentation['monetary_value'].apply(rfmclass,args=('monetary_value',quantiles))
rfmsegmentation['RFMClass'] = rfmsegmentation.R_Quantile.map(str)+rfmsegmentation.F_Quantile.map(str)+rfmsegmentation.M_Quantile.map(str)
rfmsegmentation.head()
recencyfrequencymonetary_valueR_QuantileF_QuantileM_QuantileRFMClass
customer
Aaron Bergman11443887111111
Aaron Hawkins1271744432432
Aaron Smayling46173050133133
Adam Bellavance10587756334334
Adam Hart34103249443443
rfmsegmentation.to_csv('C:\\Users\\willc\\Desktop\\RFM.csv')