RFM Customer Segmentation for Targeted Marketing
Skill-RFM-Customer-Segmentation · 06-增长模型
experimentrecommendation广告与投放客服与VOC推荐与搜索WF-B 广告优化WF-C 客服分诊WF-D 选品扫描WF-F 动态定价WF-H 复购增长
收录于用户增长决策手册
实现难度⭐☆☆☆☆
业务优先级⭐⭐⭐⭐⭐
业务视角
适用角色CEO / 增长负责人 · CMO · 财务负责人
适用平台Amazon · TikTok Shop · DTC 独立站 · 多市场
什么情况下用公司增长放缓,不知道是市场饱和还是产品问题还是获客太贵;老板要 12 个月 GMV 预测,只能靠感觉
成功是什么样的建立增长拆解模型找到瓶颈,预测未来 6-12 个月营收区间,支撑融资/战略会议
业务痛点
1. 解决的问题
R (Recency):最近一次购买距今多少天。越近越可能再次购买。
2. 核心算法逻辑
核心思想:用三个维度刻画用户价值——
3. 业务应用场景
业务问题:Momcozy 有10万注册用户,营销团队想给不同用户发不同的邮件/推送。但一刀切的消息打开率<2%,转化率<0.1%。
RFM应用: 1. 计算每个用户的R、F、M得分 2. 分群并制定差异化策略: - 冠军用户(~5%):新品预售邀请、VIP专属折扣 - 沉睡用户(~20%):"我们想念你" + 15% off coupon - 新用户(~15%):首单复购引导(买吸奶器→推荐储奶袋) - 潜力用户(~10%):快速升级(满$150送配件套装)
预期产出: - 邮件打开率:2% → 8% - 点击率:0.3% → 1.5% - 转化率:0.1% → 0.5%
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
- ROI:营销转化率提升3-5x,营销成本降低30-50%
- 难度:⭐☆☆☆☆(1/5)— 最简单实用的分群方法
- 优先级:⭐⭐⭐⭐⭐(5/5)— 任何营销团队的必备基础能力
7. 代码模板
代码块数量:1 · 路径:未检测到
"""
RFM Customer Segmentation — 用户价值分群
用于精准营销和用户生命周期管理
"""
import numpy as np
import pandas as pd
from datetime import datetime, timedelta
class RFMSegmentation:
"""RFM用户分群"""
def __init__(self, recency_bins=5, frequency_bins=5, monetary_bins=5):
self.recency_bins = recency_bins
self.frequency_bins = frequency_bins
self.monetary_bins = monetary_bins
def calculate_rfm(self, df, customer_col, date_col, amount_col):
"""
计算RFM指标
Args:
df: DataFrame,每行一个订单
customer_col: 用户ID列名
date_col: 订单日期列名
amount_col: 订单金额列名
"""
df = df.copy()
df[date_col] = pd.to_datetime(df[date_col])
# 计算基准日期(数据最后一天+1)
snapshot_date = df[date_col].max() + timedelta(days=1)
rfm = df.groupby(customer_col).agg({
date_col: lambda x: (snapshot_date - x.max()).days, # Recency
customer_col: 'count', # Frequency
amount_col: 'sum' # Monetary
}).reset_index()
rfm.columns = ['customer_id', 'recency', 'frequency', 'monetary']
# R:越小越好(最近购买),所以反转分数
rfm['r_score'] = pd.qcut(rfm['recency'], self.recency_bins,
labels=range(self.recency_bins, 0, -1)).astype(int)
# F:越大越好
rfm['f_score'] = pd.qcut(rfm['frequency'].rank(method='first'), self.frequency_bins,
labels=range(1, self.frequency_bins + 1)).astype(int)
# M:越大越好
rfm['m_score'] = pd.qcut(rfm['monetary'].rank(method='first'), self.monetary_bins,
labels=range(1, self.monetary_bins + 1)).astype(int)
return rfm
def segment(self, rfm):
"""根据RFM得分分群"""
def classify(row):
r, f, m = row['r_score'], row['f_score'], row['m_score']
if r >= 4 and f >= 4 and m >= 4:
8. 论文来源
未自动抽取;请查看原始 Skill 卡片。