RFM 模型
问题
什么是 RFM 模型?如何用 RFM 进行用户价值分层?
答案
RFM 三要素
RFM 是衡量用户交易价值的经典模型,由三个维度组成:
| 维度 | 定义 | 越高越好? |
|---|---|---|
| R(Recency) | 最近一次消费距今的天数 | 越小越好(最近刚买过) |
| F(Frequency) | 一段时间内的消费次数 | 越大越好 |
| M(Monetary) | 一段时间内的消费金额 | 越大越好 |
RFM 用户分层
每个维度用高/低二分,产生 种用户类型:
| R | F | M | 用户类型 | 运营策略 |
|---|---|---|---|---|
| 高 | 高 | 高 | 重要价值客户 | VIP 服务、专属权益 |
| 高 | 低 | 高 | 重要发展客户 | 提频:刺激复购 |
| 高 | 高 | 低 | 一般价值客户 | 提单价:推高客单 |
| 高 | 低 | 低 | 一般发展客户 | 培养消费习惯 |
| 低 | 高 | 高 | 重要保持客户 | 挽回:召回优惠 |
| 低 | 低 | 高 | 重要挽留客户 | 紧急召回 |
| 低 | 高 | 低 | 一般保持客户 | 低成本维护 |
| 低 | 低 | 低 | 流失客户 | 放弃或低成本触达 |
R 的方向
注意 R 的含义是"最近一次消费距今天数"。R 值小表示最近消费过,是"好"的信号。表中"高"指 R 值小(近期活跃),"低"指 R 值大(很久没买了)。
SQL 实现
RFM 计算与分层
WITH rfm_raw AS (
SELECT
user_id,
-- R: 最近消费距今天数(越小越好)
DATEDIFF(CURRENT_DATE, MAX(order_date)) AS recency,
-- F: 消费次数
COUNT(DISTINCT order_id) AS frequency,
-- M: 消费金额
SUM(amount) AS monetary
FROM orders
WHERE order_date >= DATE_SUB(CURRENT_DATE, INTERVAL 180 DAY)
AND status = 'paid'
GROUP BY user_id
),
rfm_score AS (
SELECT
user_id,
recency, frequency, monetary,
-- 用中位数作为阈值(也可用分位数或业务经验值)
CASE WHEN recency <= (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY recency) FROM rfm_raw)
THEN 1 ELSE 0 END AS r_high,
CASE WHEN frequency >= (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY frequency) FROM rfm_raw)
THEN 1 ELSE 0 END AS f_high,
CASE WHEN monetary >= (SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY monetary) FROM rfm_raw)
THEN 1 ELSE 0 END AS m_high
FROM rfm_raw
)
SELECT
user_id,
recency, frequency, monetary,
CASE
WHEN r_high = 1 AND f_high = 1 AND m_high = 1 THEN '重要价值客户'
WHEN r_high = 1 AND f_high = 0 AND m_high = 1 THEN '重要发展客户'
WHEN r_high = 1 AND f_high = 1 AND m_high = 0 THEN '一般价值客户'
WHEN r_high = 1 AND f_high = 0 AND m_high = 0 THEN '一般发展客户'
WHEN r_high = 0 AND f_high = 1 AND m_high = 1 THEN '重要保持客户'
WHEN r_high = 0 AND f_high = 0 AND m_high = 1 THEN '重要挽留客户'
WHEN r_high = 0 AND f_high = 1 AND m_high = 0 THEN '一般保持客户'
ELSE '流失客户'
END AS rfm_segment
FROM rfm_score;
RFM 评分法(进阶)
除了二分法,也可以给 R/F/M 各打 1~5 分,产生更精细的分层(最多 125 组):
RFM 五分评分
SELECT
user_id,
-- 用 NTILE 五等分
NTILE(5) OVER (ORDER BY recency DESC) AS r_score, -- recency 越小分越高
NTILE(5) OVER (ORDER BY frequency ASC) AS f_score,
NTILE(5) OVER (ORDER BY monetary ASC) AS m_score
FROM rfm_raw;
RFM 的局限
| 局限 | 说明 |
|---|---|
| 只看交易行为 | 未考虑浏览、收藏等非交易行为 |
| 阈值主观 | 中位数 or 业务经验,结果差异较大 |
| 静态分层 | 不能反映用户动态变化趋势 |
| 不适用低频 | 一年买一次的业务(如汽车)F 没意义 |
替代方案
- CLV(客户终身价值):更全面评估用户价值
- 聚类分群:K-Means 让数据自动发现用户群体
- RFM + 标签:RFM 基础上叠加用户标签(如偏好品类),做更精细运营
常见面试问题
Q1: 用 RFM 模型给用户分层后,运营策略怎么制定?
答案:
核心原则:高价值用户花精力维护,低价值用户控制成本
| 用户类型 | 策略 | 具体动作 |
|---|---|---|
| 重要价值 | 留住 | 专属客服、VIP 权益、生日礼品 |
| 重要发展 | 提频 | 会员积分、复购优惠券 |
| 重要保持 | 挽回 | 召回短信、大额优惠券 |
| 流失用户 | 放弃 | 停止投入或仅低成本触达 |
Q2: RFM 的阈值怎么定?
答案(三种方式):
- 中位数:快速简单,但可能不贴合业务
- 分位数(如 20%/40%/60%/80%):更精细
- 业务规则:如 R≤7 天为"高",F≥3 次为"高"——需要和运营讨论
Q3: RFM 和 CLV 有什么关系?
答案:
- RFM 是现状快照:用户目前的价值等级
- CLV 是未来预测:预计用户一生会带来多少价值
- RFM 可以作为 CLV 预测模型的输入特征
- CLV 更适合长周期、高 LTV 的业务(SaaS、保险)
相关链接
- 用户分群 - 更多分群方法
- 同期群分析 - 用 Cohort 跟踪用户变化
- SQL 分析实战练习 - RFM 分析 SQL 练习题