RFM用户分析模型究竟是什么?在之前的博客已经介绍了它的意义以及如何在现有的数据的情况下,利用Pandas创建分析模型,这里不再重复,详细可以参考我博客https://blog.csdn.net/weixin_48591974/article/details/116192534
这一期将详细介绍如何利用SQL直接获取所需的数据去创建RFM用户分析模型。SQL ---- Structured Query Language(结构化查询语言 ),它是一种专门用来与数据库沟通的语言,提供了很多从数据库中高效地读写数据、查询数据的方法。常用的DBMS(数据库管理软件) 有 MySQL、Access、SQLite、SQL SERVER、Oracle 等等。
Recency:最近一次消费,即上一次交易距今多少天,反应了客户是否流失;
Frequency:消费频率,一段时间内客户的消费频率,反应了客户的消费活跃度;
Monetary:消费金额,一段时间内客户消费总金额,反应了客户价值
根据 RFM 这 3个 Dimension,可以分为8种客户类型,如下图:
以下将简单介绍3个指标值的计算方法:
F 值的计算:例如要计算 子表 orders 里 user_id 为 8002011的值。
统计数据行数,我们可以使用 count() 函数完成,最后得出 F值为 3
SELECT count(*) AS F
FROM orders
WHERE user_id = 8002011;
M 值的计算: 使用 sum() 函数将计算字段 price * amount 所有行加起来就得出 user_id 8002011 总消费金额为 13000
SELECT sum(price * amount) AS M
FROM orders
WHERE user_id = 8002011;
R 值的计算:在orders表中,可见时间是以 Integer 类型存在,也就是以格兰威治秒数(Unix时间戳)类型存在,指的是从1970年1月1日开始计算的秒数。关于时间戳和日期转换方法,可以运用 python的 datetime module 去实现转换。例如今天(2024-01-12)所对应的时间戳经过转换为 1704988800(秒),因此可以用这数值减去最近一次消费的日期,最后转换成天数,就知道 user_id 8002011最近一次消费距离今天为多少天。
SELECT (1704988800 - max(pay_time)) / (24 * 60 * 60) AS R,
FROM orders
WHERE user_id = 8002011;
有了以上对3个指标的计算方法,以下就继续介绍各种方法进行分析。假设有如下总的数据表(更多数据行省略…)
首先通过GROUP BY 子句,将原数据进行 分组,再通过聚合函数把字段组合相同的行划分为同一组。具体语法如下:
SELECT user_id AS 用户ID,
user_name AS 用户昵称,
(1704988800 - max(pay_time)) / (24 * 60 * 60) AS R,
count(user_id) AS F,
sum(price * amount) AS M
FROM orders
GROUP BY user_id;
这样就可以把每位用户的 RFM 值都计算出来了。
刚才根据 R、F、M 维度表现的高与低,把用户分划分为 8 类,我们可以选择中位数作为区分高、低的依据。
数据表 orders 共包含 21名用户数据。所以如果我们想获取中位数,查询语句需要写成 LIMIT 10, 1 由于21的中位数为 11, 因此 LIMIT 语句的第1个参数为 10,第2个参数为返回1行的结果,那就是中位数的值。
获取 R 的中位数: 结果为32
SELECT (1704988800 - max(pay_time)) / (24 * 60 * 60) AS R
FROM orders
GROUP BY user_id
ORDER BY R
LIMIT 10,1;
获取 F 的中位数: 结果为3
SELECT count(user_id) AS F
FROM orders
GROUP BY user_id
ORDER BY F
LIMIT 10,1;
获取 M 的中位数: 结果为 36500
SELECT sum(price * amount) AS M
FROM orders
GROUP BY user_id
ORDER BY M
LIMIT 10,1;
接着,以如何获得 “新用户” 和 "流失用户"为例去继续编写语句分析。以上已经得出 R、F、M 的中位数。由于R(最近一次消费)的值越小,说明用户越活跃,因此低于 32 的被划分为 R 水平 高,反之为 R 水平 低。同理,我们可以得出 F 和 M 的划分方法, F:低于 3 为水平 低,反之为 高;M:低于 36500 为水平 低,反之为 高。
HAVING 子句在用法上和 WHERE 子句非常相似,它们都能够根据指定条件筛选数据,也可以使用我们在 SELECT 子句中定义的字段别名。不同之处在于,WHERE 子句作用于原数据表,用来筛选 行;而 HAVING 子句作用于分组结果,用来筛选 分组。所以在编写语句时,必须区分好。
SELECT user_id AS 用户ID,
user_name AS 用户昵称,
(1704988800 - max(pay_time)) / (24 * 60 * 60) AS R,
count(user_id) AS F,
sum(price * amount) AS M
FROM orders
GROUP BY user_id
HAVING R <=32
AND F < 3
AND M < 36500;
得出"新用户" 数据表:
SELECT user_id AS 用户ID,
user_name AS 用户昵称,
(1704988800 - max(pay_time)) / (24 * 60 * 60) AS R,
count(user_id) AS F,
sum(price * amount) AS M
FROM orders
GROUP BY user_id
HAVING R > 32
AND F < 3
AND M < 36500;
得出"流失用户" 数据表:
同理,其它6个维度的客户分析也是同样编写相对应的条件语句进行筛选。对于在众多的用户中如何可以快速、科学地分类,尤其前5个维度,对于每个商业行业有着重要的作用,也是掌握企业命运的风向标。