RFM模型介绍
RFM模型是衡量客户价值和客户创利能力的重要工具和手段。在众多的客户关系管理(CRM)的分析模式中,RFM模型是被广泛提到的。该机械模型通多一个客户的近期购买行为、购买总体频率,以及花了多少钱3项指标来描述该客户的价值状况。
最近一次消费(Recency)
消费频率(Frequency)
消费金额(Monetary)
R/F/M计算(sql处理法)
1、R值计算
可选取2020-12-31日(最后一天)作为判断最近一次消费的距离日期
SELECT customerid,(to_date('2020-12-31','yyyy-mm-dd')-to_date(MAX(date_id),'yyyy-mm-dd')) R_time
FROM customer_order
GROUP BY customerid
ORDER BY R_time
- 根据分析结果显示的天数差来反应客户忠诚度。天数差越小说明客户忠诚度越高
2、F值计算
频率帮助我们了解客户进行了多少次消费
SELECT customerid,count(DISTINCT invoiceno) as F_times
FROM customer_order
GROUP BY customerid;
3、M值计算
SELECT customerid,sum(total_price) M_times
FROM customer_order
GROUP BY customerid;
- 根据计算可以了解到交易金额的主要范围
4、RFM数据汇总
为方便后续数据处理,为RFM值创建视图
CREATE VIEW view_rfm AS
(select CustomerID,
(to_date('2020-12-31','yyyy-mm-dd')-to_date(MAX(date_id),'yyyy-mm-dd')) "天数差",
count(DISTINCT invoiceno) "消费次数",
sum(total_price) "消费金额" s
from customer_order
group by CustomerID
5、RFM评分
#N,n,a自定义界值
SELECT CustomerID,天数差,消费次数,消费金额,
(case when 天数差<=N1 then 5
when 天数差 >N1 and 天数差 <=N2 then 4
when 天数差>N2 and 天数差<=N3 then 3
when 天数差>N3 and 天数差<=N4 then 2 else 1 END) "R评分",
(case when 消费次数<=n1 then 1
when 消费次数 >n1 and 消费次数 <=n2 then 2
when 消费次数>n2 and 天数差<=n3 then 3
when 消费次数>n3 and 消费次数<=n4 then 4 else 5 END) "F评分",
(case when 消费金额<=a1 then 1
when 消费金额 >a1 and 消费金额 <=a2 then 2
when 消费金额>a2 and 消费金额<=a3 then 3
when 消费金额>a3 and 消费金额<=a4 then 4 else 5 END) "M评分"
from view_rfm;
6、客户分层阈值
RFM评分完成,保存视图为view_rfm1,用各自的平均值做为客户划分的阈值,再做最后的客户分层处理
select ROUND(avg(R评分),1) "R平均值",ROUND(avg(F评分),1) "F平均值",ROUND(avg(M评分),1) "M平均值"
FROM view_rfm1;
select CustomerID,
(case when R评分>3 then 1 else 0 END) "R值",
(case when F评分>1 then 1 else 0 END) "F值",
(case when M评分>1.1 then 1 else 0 END) "M值"
FROM view_rfm1;
# RFM完成后,保存视图为view_rfm2
7、客户分层
根据RFM阈值和客户评分分层表,对客户行为进行分层处理
SELECT CustomerID,
(case when R值=1 and F值=1 and M值=1 then '重要价值客户'
when R值=0 and F值=1 and M值=1 then '重要唤回客户'
when R值=1 and F值=0 and M值=1 then '重要发展客户'
when R值=0 and F值=0 and M值=1 then '重要挽留客户'
when R值=1 and F值=1 and M值=0 then '一般价值客户'
when R值=1 and F值=0 and M值=0 then '一般发展客户'
when R值=0 and F值=1 and M值=0 then '一般保持客户'
ELSE '一般挽留客户' END) "客户分层"
from view_rfm2
-
重要价值客户,RFM值都很高,可为其提供优质专属服务,提高其消费体验,增加客户忠诚度
重要发展客户,消费频率低,但是R和M值都很高,可以进行定向推广或提供价格优惠,提高其消费频次
重要唤回客户,最近消费的时间较为久远,可能存在流失,但以前的消费金额与频率较高,需了解具体长时间未消费的原因,针对性提供对策
重要挽留客户,消费金额高,但长时间未进行消费且消费频率低,可主动联系或举行老客户召回活动,尽可能挽留
R/F/M计算(python处理法)
#画RFM,先对数据进行透视
rfm=df.pivot_table(index='user_id',
values=['date_id','total_price','invoiceno'],
aggfunc={'date_id':'max',
'total_price':'sum',
'invoiceno':'sum'})
RFM计算:
#获取最近消费,可选取2020年最后一天作为判断最近一次消费的距离日期
rfm['R']= (rfm.to_date('2020-12-31','yyyy-mm-dd') - rfm.order_dt.max())/np.timedelta64(1,'D')
# 重命名 R :消费时间 F:消费金额 M:消费频次
rfm.rename(columns={'order_products':"F",'order_amount':'M'},inplace=True)
#和各自的均值比较
rfm[['R','F','M']].apply(lambda x:x-x.mean())
#定义打标签的函数
def rfm_func(x):
level=x.apply(lambda x:'1' if x>=0 else '0')
# level 的类型是 series,index 是 R、F、M
label=level.R + level.F + level.M
d={# R 为1 表示比均值大,离最早时间近,F为1 表示 消费金额比较多,M 为1 表示消费频次比较多,所以是重要价值客户
'111':'重要价值客户',
'011':'重要保持客户',
'101':'重要发展客户',
'001':'重要挽留客户',
'110':'一般价值客户',
'010':'一般保持客户',
'100':'一般发展客户',
'000':'一般挽留客户',
}
result=d[label]
return result
# 注意这里是要一行行的传递进来,所以 axis=1,传递一行得到一个 111,然后匹配返回一个值
rfm['label']=rfm[['R','F','M']].apply(lambda x:x-x.mean()).apply(rfm_func,axis=1)
导入excel表中进行Powerbi作图
#对标签求和计数
rfm.groupby('label').sum()
rfm.groupby('label').count()
#导入excel表中
rfm.to_excel(r'.\临时表\RFM模型.xlsx'
- RFM 的划分标准应该以业务为准,也可以通过切比雪夫去除极值后求均值,并且 RFM 的各个划分标准可以都不一样
- 尽量用小部分的用户覆盖大部分的额度;不要为了数据好看划分等级