paper2skills Playbook

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 个月营收区间,支撑融资/战略会议
业务痛点
增长放缓不知道问题在哪CAC 越来越高已经高于 LTV新市场要不要进没有数据支撑

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 卡片。