一、RFM
1、 RFM模型是众多客户关系管理(CRM)分析方法中的一种,能够方便快速有效的量化用户价值和创利能力。
2、RFM模型有三个要素,分别是:Recency(最近一次交易距今时间)、Frequency(交易频率)、Monetary(交易金额)。
R值(最近一次交易距今时间)
用户最近一次交易距今的时间。间隔时间越短,则值越大,这类客户也是最有可能对活动产生反应的群体。
F值(交易频率)
用户在限定的时间内所购买的次数。最常购买的顾客,也是满意度、忠诚度最高的顾客。
M值(交易金额)
用户的交易金额,可以分为累计交易金额和平均每次交易金额,根据不同的目的取不同的数据源进行建模分析。
3、根据R、F、M的三个值的指标,进行分类,客户分为以下标准的8类RFM划分的8类客户标准
知识点详解:RFM模型数据源准备只需四个字段:客户名称、交易日期、交易次数/频率、交易金额。
二、Python建立RFM模型知识点详解:Python建立RFM模型流程?
1、加载数据
2、数据清洗
1)列名重命名
2)删除重复值
3)缺失值处理
4)一致化处理
5)异常值处理
6)选择子集/关键字段提取
3、构建模型
1)关键字段构造
2)维度打分
3)分值计算
4)客户分层
4、RFM模型结果分析
1)查看各类用户占比情况
2)不同类型用户总消费金额贡献占比情况
1、加载数据
①加载处理数据所需要的库
#1加载数据处理所需要的的库
import pandas as pd
import numpy as np
import os
②读取数据文件知识点详解:Python|os.chdir()
os.chdir() 将当前工作目录切换到指定的路径。
详细请看:Python|os.chdir()zhuanlan.zhihu.com知识点详解:如何利用python查看Excel文件?
df=pd.read_excel('excel文件名.xlsx')
df
#将当前的工作目录切换到指定目录(C:\Users\14861\Desktop\项目经验\RFM模型\RFM\数据源)
os.chdir('C:\\Users\\14861\\Desktop\\项目经验\\RFM模型\\RFM\\数据源')
#利用python查看Excel文件(文件名:PYTHON-RFM实战数据)数据字段信息
df=pd.read_excel('PYTHON-RFM实战数据.xlsx')
df
2、数据清洗
1)列名重命名
数据字段名本身已经便于理解,因此,不需要重命名。
2)删除重复值
本数据没有重复值,因此不需要进行删除重复值操作。
3)缺失值处理
缺失值定位
#接着再观察数据的类型和缺失情况:
df.info()
订单一共28833行,没有任何缺失值。
因此不需要进行缺失值处理。
4)一致化处理
根据以上操作了解到数据源数据类型:付款日期:时间格式;实付金额、邮费和购买数量:数值型;其他均为字符串类型。
因此不需要进行一致化处理
5)异常值处理
①查看订单状态
#查看订单状态有哪些?
df['订单状态'].unique()
订单只有这两种状态,其中退款订单对于我们模型价值不大,需要在后续清洗中剔除。
②删除订单状态中:付款以后用户退款成功,交易自动关闭的数据。
#删除退款
df=df.loc[df['订单状态']=='交易成功',:]
df.head()
print('删除退款后还剩:%d行'%len(df))
6)选择子集/关键字段提取
构建RFM模型只需四个字段:客户名称、交易日期、交易次数/频率、交易金额。
在数据中对应的只需要买家昵称、付款日期、购买数量、实付金额等字段;
df=df[['买家昵称','付款日期','实付金额']]
df.head()
3、构建模型
1)关键字段构造
①R值
即每个用户最后一次购买时间距今多少天。
如果用户只下单过一次,用现在的日期减去付款日期即可;若是用户多次下单,需先筛选出这个用户最后一次付款的时间,再用今天减去它。
#筛选用户最后一次付款时间
r=df.groupby('买家昵称')['付款日期'].max().reset_index()
r.head()
#计算最后一次付款时间距今(2019-7-1:订单数据是2019-7-1生成的,即把这是时间当做是今天)多少天了?
r['R']=(pd.to_datetime('2019-7-1')-r['付款日期']).dt.days
r=r[['买家昵称','R']]
r.head()
②F值
每个用户累计购买频次。
把单个用户一天内多次下单行为看作整体一次。
因此,引入一个精确到天的日期标签,依照“买家昵称”和“日期标签”进行分组,把每个用户一天内的多次下单行为合并,再统计购买次数:
#引入日期标签辅助列
df['日期标签']=df['付款日期'].astype(str).str[:10]
#把单个用户一天内的订单合并
dup_f=df.groupby(['买家昵称','日期标签'])['付款日期'].count().reset_index()
#对合并后的用户统计频次
f=df_1.groupby('买家昵称')['付款日期'].count().reset_index()
f.columns=['买家昵称','F']
f.head()
③M值
用户的交易金额,可以分为累计交易金额和平均每次交易金额,根据不同的目的取不同的数据源进行建模分析。
这里选取用户平均支付金额。
用户平均支付金额=用户累计支付金额/购买频次
#计算累计支付金额
sum_m=df.groupby('买家昵称')['实付金额'].sum().reset_index()
sum_m.columns=['买家昵称','总支付金额']
com_m=pd.merge(sum_m,f,left_on='买家昵称',right_on='买家昵称',how='inner')
#计算平均支付金额
com_m['M']=com_m['总支付金额']/com_m['F']
com_m.head()
④合并三个指标
rfm=pd.merge(r,com_m,left_on='买家昵称',right_on='买家昵称',how='inner')
rfm=rfm[['买家昵称','R','F','M']]
rfm.head()
2)维度打分
R值根据行业经验,设置为30天一个跨度,区间左闭右开:
F值和购买频次挂钩,每多一次购买,分值就多加一分:
M值做个简单的区间统计,然后分组,这里我们按照50元的一个区间来进行划分:
3)分值计算(pandas)
①计算R的分值
rfm['R-SCORE']=pd.cut(rfm['R'],bins=[0,30,60,90,120,1000000],labels=[5,4,3,2,1],right=False).astype(float)
rfm.head()
②计算F的分值
rfm['F-SCORE']=pd.cut(rfm['F'],bins=[1,2,3,4,5,1000000],labels=[1,2,3,4,5],right=False).astype(float)
rfm.head()
③计算M的分值
rfm['M-SCORE']=pd.cut(rfm['M'],bins=[0,50,100,150,200,1000000],labels=[1,2,3,4,5],right=False).astype(float)
rfm.head()
④判断R、F、M的每个分值是否大于平均值?
rfm['R是否大于均值']=(rfm['R-SCORE']>rfm['R-SCORE'].mean())*1
rfm['F是否大于均值']=(rfm['F-SCORE']>rfm['F-SCORE'].mean())*1
rfm['M是否大于均值']=(rfm['M-SCORE']>rfm['M-SCORE'].mean())*1
rfm.head()
#Python中判断后返回的结果是True和False,对应着数值1和0,只要把这个布尔结果乘上1,
# True就变成了1,False变成了0。
4)客户分层
①人群数值
#先引入一个人群数值的辅助列,把之前判断的R\F\M是否大于均值的三个值给串联起来:
rfm['人群数值']=(rfm['R是否大于均值']*100)+(rfm['F是否大于均值']*10)+(rfm['M是否大于均值']*1)
rfm.head()
人群数值的理解:0代表流失客户;1代表高消费唤回客户;101代表频次深耕客户。
②人群标签
#为了得到最终人群标签,再定义一个判断函数,通过判断人群数值的值,来返回对应的分类标签:
def transform_label(x):
if x==111:
label='重要价值客户'
elif x==110:
label='消费潜力客户'
elif x==101:
label='频次深耕客户'
elif x==100:
label='新客户'
elif x==11:
label='重要价值流失预警客户'
elif x==10:
label='一般客户'
elif x==1:
label='高消费唤回客户'
elif x==0:
label='流失客户'
return label
#最后把标签分类函数应用到人群数值列:
rfm['人群类型']=rfm['人群数值'].apply(transform_label)
rfm.head()
4、RFM模型结果分析
1)查看各类用户占比情况
#查看各类用户占比情况:
count=rfm['人群类型'].value_counts().reset_index()
count.columns=['人群类型','人数']
count['人数占比']=count['人数']/count['人数'].sum()
count
2)不同类型用户总消费金额贡献占比情况
#不同类型用户总消费金额贡献占比情况
rfm['购买总金额']=rfm['F']*rfm['M']
money=rfm.groupby('人群类型')['购买总金额'].sum().reset_index
money.columns=['人群类型','消费金额']
money['金额占比']=money['消费金额']/money['消费金额'].sum()
money