RFM很久以前已经写过一篇Python实现的方式,并给出了可视化的展示方法,文章是《RFM模型_Python》,可以跳转去查看。然后对RFM模型的介绍也是引用的那一篇的,直接复制过来了,之后最后实现的方式是MySQL实现的。
RFM模型是衡量客户价值和客户创利能力的重要工具和手段。在众多的客户关系管理(CRM)的分析模式中,RFM模型是被广泛提到的。该模型通过一个客户的近期购买行为、购买的总体频率以及花了多少钱三项指标来描述该客户的价值状况。后面有实现方式和可视化展示。
一般情况下,三个维度,每个维度去高低两个值,放在一起就形成了8个指标,如下。也可以根据实际情况划分更多维度,就能进行更精细化的客户分群了。
- 重要价值用户,RFM三个值都很高,要提供vip服务;
- 重要发展用户,消费频率低,但是其他两个值很高,就要想办法提高他的消费频率;
- 重要保持用户,最近消费距离现在时间较远,也就是F值低,但是消费频次和消费金额高。这种用户,是一段时间没来的忠实客户。应该主动和他保持联系,提高复购率;
- 重要挽留客户,最近消费时间距离现在较远、消费频率低,但消费金额高。这种用户,即将流失,要主动联系用户,调查清楚哪里出了问题,并想办法挽回;
- 一般价值客户,也叫潜力客户。这类用户消费频次高,时间近,只是消费金额低,需要想办法提高购买金额;
- 一般发展客户,也叫新客户。刚接触平台,可以大力发展;
- 一般保持客户
- 一般挽留客户,也叫流失客户。这种客户基本上是无效的客户了,应该只是有羊毛的时候来了一下的人。
实现方式其实也很简单,Excel、PowerPivot、SQL、R、Python都可以很轻松的实现,这里就以SQL为例,操作一下。
首先分别计算三个指标
R最近一次购买日期距今天数,有两种方法,因为我们的数据是到2021.1.31号的,所以比较日期就是和1.31号进行比较。第一种方法是先计算每条订单的日期和1.31号的日期差,然后取最小值就是最近一次购买日期的天数;第二种方法是用1.31号和每个用户的最近一次日期进行比较,算出来也是一样的。这里多说一句,因为使用了聚合函数,所以需要用GROUP BY对用户id分组一下,不然会报错。
F购买次数,这个就很简单了,对每个用户的订单号去重计数就可以了。
** M购买金额**,也是一样的,对每个用户金额求和在聚合就行了。
下面三个指标一起写,SQL语句如下↓
SELECT
`用户id`,
MIN(DATEDIFF('2021-01-31',日期)) AS R1,
DATEDIFF('2021-01-31',MAX(日期)) AS R2,
COUNT(DISTINCT 订单号) AS F,
SUM(单价*数量) AS M
FROM
`order`
GROUP BY
`用户id`
我们已经得到了每个用户的RFM值,现在需要把每个值分成0和1两类。如果实际情况需要,也可以分更多类,而且分类最好结合业务实际情况,多和业务的同学交流。我们这里就按天数小于30天为1,订单号大于10单为1,金额大于10万为1,用IF语句就行,如果条件多了就要CASE-WHEN,SQL语句和结果如下↓
SELECT
`用户id`,
MIN(DATEDIFF('2021-01-31',日期)) AS R1,
DATEDIFF('2021-01-31',MAX(日期)) AS R2,
COUNT(DISTINCT 订单号) AS F,
SUM(单价*数量) AS M,
IF(MIN(DATEDIFF('2021-01-31',日期))>30,0,1) AS R_Value,
IF(COUNT(DISTINCT 订单号)>10,1,0) AS F_Value,
IF(SUM(单价*数量)>100000,1,0) AS M_Value
FROM
`order`
GROUP BY
`用户id`
然后我们再根据RFM值,匹配出相应的客户解释,这里就用CASE_WHEN了,SQL语句如下↓
SELECT
`用户id`,
R_Value,
F_Value,
M_Value,
(CASE
WHEN R_Value = 1 AND F_Value = 1 AND M_Value = 1 THEN '1重要价值客户'
WHEN R_Value = 0 AND F_Value = 1 AND M_Value = 1 THEN '2重要发展客户'
WHEN R_Value = 1 AND F_Value = 0 AND M_Value = 1 THEN '3重要发展客户'
WHEN R_Value = 0 AND F_Value = 0 AND M_Value = 1 THEN '4重要挽留客户'
WHEN R_Value = 1 AND F_Value = 1 AND M_Value = 0 THEN '5一般价值客户'
WHEN R_Value = 1 AND F_Value = 0 AND M_Value = 0 THEN '6一般发展客户'
WHEN R_Value = 0 AND F_Value = 1 AND M_Value = 0 THEN '7一般保持客户'
ELSE '8一般挽留客户'
END
) AS 客户类型
FROM
(SELECT
`用户id`,
MIN(DATEDIFF('2021-01-31',日期)) AS R1,
DATEDIFF('2021-01-31',MAX(日期)) AS R2,
COUNT(DISTINCT 订单号) AS F,
SUM(单价*数量) AS M,
IF(MIN(DATEDIFF('2021-01-31',日期))>30,0,1) AS R_Value,
IF(COUNT(DISTINCT 订单号)>10,1,0) AS F_Value,
IF(SUM(单价*数量)>100000,1,0) AS M_Value
FROM
`order`
GROUP BY
`用户id`) tp
到上面基本工作就完成了,下面再汇总一下每类客户的数据,直观感受一下,然后想想每一类客户使用什么样的营销策略,SQL语句看上去很复杂,其实就是在上面的基础上,把上面的语句作为一个子查询,在GROUP BY一下就行了↓
SELECT
客户类型,
COUNT(*) AS 客户数量
FROM
(SELECT
R_Value,
F_Value,
M_Value,
(CASE
WHEN R_Value = 1 AND F_Value = 1 AND M_Value = 1 THEN '1重要价值客户'
WHEN R_Value = 0 AND F_Value = 1 AND M_Value = 1 THEN '2重要发展客户'
WHEN R_Value = 1 AND F_Value = 0 AND M_Value = 1 THEN '3重要发展客户'
WHEN R_Value = 0 AND F_Value = 0 AND M_Value = 1 THEN '4重要挽留客户'
WHEN R_Value = 1 AND F_Value = 1 AND M_Value = 0 THEN '5一般价值客户'
WHEN R_Value = 1 AND F_Value = 0 AND M_Value = 0 THEN '6一般发展客户'
WHEN R_Value = 0 AND F_Value = 1 AND M_Value = 0 THEN '7一般保持客户'
ELSE '8一般挽留客户'
END
) AS 客户类型
FROM
(SELECT
`用户id`,
MIN(DATEDIFF('2021-01-31',日期)) AS R1,
DATEDIFF('2021-01-31',MAX(日期)) AS R2,
COUNT(DISTINCT 订单号) AS F,
SUM(单价*数量) AS M,
IF(MIN(DATEDIFF('2021-01-31',日期))>30,0,1) AS R_Value,
IF(COUNT(DISTINCT 订单号)>10,1,0) AS F_Value,
IF(SUM(单价*数量)>100000,1,0) AS M_Value
FROM
`order`
GROUP BY
`用户id`) tp)tp2
GROUP BY
客户类型
最后需要把用户分类和用户信息导出来给到运营的同学,让他们去针对每一类客户进行电话或邮箱的触达跟进。这里只需要跟进用户id关联一下用户表就行了。SQL语句如下↓
SELECT
u.`用户id`,
u.`省份`,
u.性别,
u.年龄,
u.电话,
u.邮箱,
R_Value,
F_Value,
M_Value,
(CASE
WHEN R_Value = 1 AND F_Value = 1 AND M_Value = 1 THEN '1重要价值客户'
WHEN R_Value = 0 AND F_Value = 1 AND M_Value = 1 THEN '2重要发展客户'
WHEN R_Value = 1 AND F_Value = 0 AND M_Value = 1 THEN '3重要发展客户'
WHEN R_Value = 0 AND F_Value = 0 AND M_Value = 1 THEN '4重要挽留客户'
WHEN R_Value = 1 AND F_Value = 1 AND M_Value = 0 THEN '5一般价值客户'
WHEN R_Value = 1 AND F_Value = 0 AND M_Value = 0 THEN '6一般发展客户'
WHEN R_Value = 0 AND F_Value = 1 AND M_Value = 0 THEN '7一般保持客户'
ELSE '8一般挽留客户'
END
) AS 客户类型
FROM
(SELECT
`用户id`,
MIN(DATEDIFF('2021-01-31',日期)) AS R1,
DATEDIFF('2021-01-31',MAX(日期)) AS R2,
COUNT(DISTINCT 订单号) AS F,
SUM(单价*数量) AS M,
IF(MIN(DATEDIFF('2021-01-31',日期))>30,0,1) AS R_Value,
IF(COUNT(DISTINCT 订单号)>10,1,0) AS F_Value,
IF(SUM(单价*数量)>100000,1,0) AS M_Value
FROM
`order`
GROUP BY
`用户id`) tp
LEFT JOIN user_t AS u ON u.用户id = tp.用户id
End
◆ 蒙太奇马赛克图
◆ Python高德地图可视化
◆ Python不规则条形图