Skip to content

TaotaoByte/ecommerce-rfm-analysis

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

电商用户行为分析与 RFM 价值分群

基于真实电商订单数据,构建用户消费行为全维度分析体系,运用 RFM 模型 + 五分位法精准识别高价值用户与流失风险群体,输出可落地的精细化运营策略。


目录


项目概述

本项目基于 UCI Machine Learning Repository 提供的英国在线零售商真实交易数据集,运用 Python 数据分析技术栈,完成从数据清洗、KPI 核算、RFM 用户价值分群到可视化看板的全链路分析,最终输出多维度 Excel 运营报表与业务洞察。

核心能力覆盖:

  • 数据清洗与指标核算:搭建用户消费核心 KPI 报表,覆盖活跃度、客单价、复购频次等维度,可支持运营活动效果的日常追踪。
  • RFM 模型 + 五分位法:划分 8 类用户层级,精准识别高价值用户与流失风险群体,输出分群运营策略建议。
  • 多维度业务看板:基于 Python 输出消费趋势时序图、用户价值矩阵,可快速完成活动复盘与数据呈现。

业务价值

在电商运营中,用户分层是精细化营销的基础。传统的"一刀切"营销方式效率低下,而通过 RFM 模型将用户划分为不同价值层级后,可以:

  • 精准投放资源:将营销预算集中在高价值用户群体,提升 ROI。
  • 降低流失率:及时识别流失风险用户,通过召回策略减少用户流失。
  • 提升复购率:针对有消费潜力但近期未下单的用户,设计激活活动。
  • 优化产品策略:根据高价值用户的品类偏好,调整库存结构与上新节奏。

数据集说明

本项目使用了三套同源的 UCI Online Retail 数据集,分别来自不同渠道,便于对比验证分析结果的稳定性。

数据集 来源 时间范围 原始记录数 有效记录数 用户数
Online Retail.xlsx UCI 官方 2010-12 ~ 2011-12 541,909 391,867 4,318
OnlineRetail.csv 阿里云天池 2010-12 ~ 2011-12 541,909 391,867 4,318
online_retail_II.csv Kaggle 2009-12 ~ 2011-12 1,067,371 777,859 5,838

字段说明:

字段 含义 示例
InvoiceNo 订单号(以 C 开头表示取消/退货) 536365
StockCode 商品编码 85123A
Description 商品描述 WHITE HANGING HEART T-LIGHT HOLDER
Quantity 购买数量(负数表示退货) 6
InvoiceDate 订单日期时间 2010-12-01 08:26:00
UnitPrice 商品单价(英镑) 2.55
CustomerID 客户唯一标识 17850
Country 客户所在国家 United Kingdom

数据特点:

  • 该零售商主营礼品与家居用品,客户以批发商和小型企业为主。
  • 数据中存在大量退货记录(Quantity < 0)和缺失 CustomerID 的记录。
  • 单价与数量分布极不均匀,存在明显的极端异常值。

技术架构

┌─────────────────────────────────────────────────────────────┐
│                      数据层 (Datasets)                       │
│   UCI XLSX    │   阿里云 CSV    │   Kaggle CSV (II代)        │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                    数据处理层 (ETL & Clean)                  │
│   加载 → 去重 → 缺失值处理 → 异常值过滤 → 字段标准化         │
└─────────────────────────────────────────────────────────────┘
                              │
              ┌───────────────┼───────────────┐
              ▼               ▼               ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│   KPI 指标核算   │ │   RFM 价值分群   │ │   可视化看板     │
│  · 月度销售额    │ │  · Recency打分   │ │  · 消费趋势图    │
│  · 客单价分布    │ │  · Frequency打分 │ │  · RFM矩阵图    │
│  · 复购率统计    │ │  · Monetary打分  │ │  · 三维散点图    │
│  · 品类偏好     │ │  · 五分位法分群  │ │  · 活跃度分析    │
└─────────────────┘ └─────────────────┘ └─────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                   输出层 (Results & Reports)                 │
│   综合运营报表.xlsx  │  kpi_report.xlsx  │  rfm_report.xlsx   │
│   charts/ (4张PNG看板图)                                    │
└─────────────────────────────────────────────────────────────┘

技术栈:

类别 工具/库 用途
编程语言 Python 3.x 全链路数据处理与分析
数据处理 pandas, numpy 数据清洗、聚合、统计计算
可视化 matplotlib, seaborn 静态图表与看板生成
报表输出 openpyxl Excel 多 Sheet 报表
版本控制 Git 代码版本管理

项目结构

.
├── src/                            # 源代码目录
│   ├── generate_data.py            # 模拟数据生成(用于无真实数据时的演示)
│   ├── load_uci_data.py            # 真实数据集加载与字段适配
│   ├── data_cleaning.py            # 数据清洗(去重、缺失值、异常值、退货过滤)
│   ├── kpi_analysis.py             # 用户消费核心 KPI 核算
│   ├── rfm_analysis.py             # RFM 模型 + 五分位法八分群
│   └── visualization.py            # 多维度可视化看板生成
├── datasets/                       # 原始数据集(Git 忽略,需自行下载)
│   ├── Online Retail.xlsx          # UCI 经典版
│   ├── OnlineRetail.csv            # 阿里云天池版
│   └── online_retail_II.csv        # Kaggle 第二代
├── results/                        # 分析结果输出(Git 忽略,运行后生成)
│   ├── output_online_retail_xlsx/  # XLSX 经典版分析结果
│   ├── output_onlineretail_csv/    # CSV 天池版分析结果
│   └── output_online_retail_ii/    # 第二代分析结果
├── docs/                           # 文档与配图
│   ├── 01_消费趋势时序图.png
│   ├── 02_RFM用户价值矩阵.png
│   ├── 03_活跃度与复购分析.png
│   └── 04_RFM三维散点图.png
├── main.py                         # 单数据集分析入口
├── run_all_datasets.py             # 三数据集批量分析入口
├── requirements.txt                # Python 依赖
└── README.md                       # 项目说明(本文件)

快速开始

环境准备

# 克隆仓库
git clone https://github.com/TaotaoByte/ecommerce-rfm-analysis.git
cd ecommerce-rfm-analysis

# 安装依赖
pip install -r requirements.txt

运行分析

# 分析单个数据集(默认使用第二代数据集)
python main.py

# 分析指定数据集
python main.py --real-data datasets/OnlineRetail.csv

# 批量分析三个数据集
python run_all_datasets.py

使用模拟数据(演示用)

from main import run_pipeline
run_pipeline(use_real_data=False)

分析全流程详解

1. 数据清洗

原始数据存在大量的脏数据,必须经过严格的清洗流程才能保证后续分析的准确性。

1.1 清洗步骤

步骤 处理方式 处理数量(II代数据集)
加载原始数据 读取 CSV,解析日期字段 1,067,371 条
删除 CustomerID 缺失 CustomerID 为空的记录无法识别用户,直接删除 -243,007 条
删除取消/退货订单 InvoiceNoC 开头或 Quantity <= 0 -18,815 条
过滤极端异常值 使用 IQR 法过滤单价与数量的极端异常 -1,594 条
标准化字段 重命名列、计算 item_amount = Quantity * UnitPrice -
最终有效数据 - 777,859 条

1.2 关键清洗代码

def clean_data(df):
    # 删除 CustomerID 缺失的记录
    df = df.dropna(subset=['CustomerID'])

    # 删除取消订单(InvoiceNo 以 C 开头)和退货(Quantity <= 0)
    df = df[~df['InvoiceNo'].astype(str).str.startswith('C')]
    df = df[df['Quantity'] > 0]

    # 使用 IQR 法过滤极端异常值
    for col in ['UnitPrice', 'Quantity']:
        Q1 = df[col].quantile(0.25)
        Q3 = df[col].quantile(0.75)
        IQR = Q3 - Q1
        lower = Q1 - 3 * IQR
        upper = Q3 + 3 * IQR
        df = df[(df[col] >= lower) & (df[col] <= upper)]

    # 计算单品金额
    df['item_amount'] = df['Quantity'] * df['UnitPrice']

    return df

2. KPI 指标体系

清洗后的数据用于构建用户消费核心 KPI 报表,覆盖以下维度:

2.1 月度销售趋势

monthly_kpi = df.groupby('order_month').agg(
    total_sales=('item_amount', 'sum'),
    total_orders=('order_id', 'nunique'),
    total_users=('user_id', 'nunique'),
    avg_order_value=('item_amount', 'mean')
).reset_index()

2.2 用户活跃度分层

活跃度等级 定义 用户数(II代) 占比
高活跃 购买频次 >= 中位数 + 1个标准差 1,105 18.9%
中活跃 购买频次在 [中位数, 中位数+标准差) 1,299 22.3%
低活跃 购买频次 < 中位数 2,334 40.0%
沉睡用户 最后购买日期距今 > 90天(按分析日2011-12-09) 1,730 29.6%

2.3 复购率

total_users = df['user_id'].nunique()
repurchase_users = df.groupby('user_id')['order_id'].nunique()
repurchase_rate = (repurchase_users > 1).sum() / total_users

整体复购率:72.35%

2.4 客单价

avg_order_value = df.groupby('order_id')['item_amount'].sum().mean()

整体客单价:£413

2.5 品类偏好分析

数据集中商品数量庞大(约 3,800+ 种),通过关键词提取将商品归为 7 大品类:

品类 描述 核心商品举例
家居装饰 蜡烛、相框、挂件 CANDLE, FRAME, HANGING
厨房用品 餐具、烘焙工具 CAKE, MUG, LUNCH BOX
节日礼品 圣诞、情人节主题 CHRISTMAS, VALENTINE
文具手账 笔记本、便签 NOTEBOOK, PAPER, PEN
园艺户外 花盆、园艺工具 GARDEN, PLANTER
儿童玩具 积木、玩偶 DOLL, TOY, BLOCKS
其他 无法归类的长尾商品 BAG, CLOCK, LAMP 等

3. RFM 模型原理与实现

RFM 模型是客户关系管理(CRM)领域最经典的用户价值分析模型,通过三个维度衡量用户价值:

  • R (Recency):最近一次消费距今天数。数值越小,用户越活跃。
  • F (Frequency):消费频次。数值越大,用户忠诚度越高。
  • M (Monetary):消费总金额。数值越大,用户价值越高。

3.1 指标计算

def calculate_rfm(df, analysis_date=None):
    if analysis_date is None:
        analysis_date = df['order_date'].max() + timedelta(days=1)

    rfm = df.groupby('user_id').agg(
        last_purchase_date=('order_date', 'max'),
        frequency=('order_id', 'nunique'),
        monetary=('item_amount', 'sum')
    ).reset_index()

    rfm['recency'] = (analysis_date - rfm['last_purchase_date']).dt.days
    return rfm[['user_id', 'recency', 'frequency', 'monetary']]

3.2 五分位法打分

对每个维度的指标值按五分位划分为 1~5 分:

def rfm_score(x, col, quintiles):
    if col == 'recency':
        # Recency 越小越好,所以反向打分
        if x <= quintiles[col][0.2]: return 5
        elif x <= quintiles[col][0.4]: return 4
        elif x <= quintiles[col][0.6]: return 3
        elif x <= quintiles[col][0.8]: return 2
        else: return 1
    else:
        # Frequency 和 Monetary 越大越好
        if x <= quintiles[col][0.2]: return 1
        elif x <= quintiles[col][0.4]: return 2
        elif x <= quintiles[col][0.6]: return 3
        elif x <= quintiles[col][0.8]: return 4
        else: return 5

3.3 八分群逻辑

将 R、F、M 的得分分别与各自的中位数(3分)比较,得到高低两个层级,组合成 8 类用户:

def classify_rfm(row):
    r, f, m = row['R_score'] >= 3, row['F_score'] >= 3, row['M_score'] >= 3
    if r and f and m:     return '重要价值用户'
    if r and not f and m: return '重要发展用户'
    if not r and f and m: return '重要保持用户'
    if not r and not f and m: return '重要挽留用户'
    if r and f and not m: return '一般价值用户'
    if r and not f and not m: return '一般发展用户'
    if not r and f and not m: return '一般保持用户'
    return '流失风险用户'
用户层级 R F M 业务含义
重要价值用户 核心 VIP,贡献最多营收
重要发展用户 有消费力但频次低,需提升粘性
重要保持用户 曾经是 VIP,需召回激活
重要挽留用户 高价值但即将流失,需紧急挽留
一般价值用户 活跃且忠诚,但消费力有限
一般发展用户 新用户或低频用户,需培养习惯
一般保持用户 曾经活跃但近期沉默
流失风险用户 即将流失或已流失,需评估是否召回

4. 核心分析结果

以下结果基于 Online Retail II(第二代)数据集(2009-12 ~ 2011-12,777,859 条有效记录)。

4.1 总体概览

指标 数值
数据时间范围 2009-12-01 ~ 2011-12-09
清洗后有效记录 777,859 条
覆盖订单数 36,580 笔
覆盖用户数 5,838 人
总销售额 £16,369,951
整体复购率 72.35%
整体客单价 £413

4.2 月度销售趋势

分析期内月度销售额呈现明显波动,其中 2011 年 11 月达到峰值(受黑五/圣诞季促销影响),2011 年 12 月因数据截断仅包含 9 天数据。

4.3 RFM 八分群详细统计

用户层级 用户占比 营收贡献 平均消费金额 平均购买频次 平均最近消费天数
重要价值用户 41.3% 83.7% £7,047 11.5 笔 28 天
重要保持用户 10.6% 8.4% £2,228 5.2 笔 89 天
流失风险用户 21.8% 2.1% £299 1.8 笔 142 天
重要发展用户 4.0% 1.8% £1,262 2.0 笔 35 天
重要挽留用户 4.1% 1.7% £1,156 1.9 笔 128 天
一般价值用户 5.4% 1.0% £537 4.5 笔 32 天
一般发展用户 5.4% 0.6% £304 1.6 笔 38 天
一般保持用户 7.4% 0.7% £323 3.1 笔 96 天

关键洞察:

  • 头部效应极其显著:前 51.9% 的用户(重要价值 + 重要保持)贡献了 92.1% 的营收。
  • 流失风险用户占比高:21.8% 的用户处于流失风险状态,但仅贡献 2.1% 营收,召回成本需精打细算。
  • 重要发展用户有潜力:4.0% 的用户消费金额高但频次低,是提升复购率的关键突破口。

5. 运营策略建议

基于 RFM 八分群结果,针对不同层级用户制定差异化运营策略:

5.1 重要价值用户(占比 41.3%,贡献 83.7% 营收)

  • 策略:VIP 专属服务,提升忠诚度,防止流失。
  • 具体动作
    • 建立 VIP 会员体系,提供专属折扣、优先发货、生日礼品。
    • 定期推送新品预览与限量款,满足其尝鲜需求。
    • 一对一客户经理跟进,及时解决售后问题。
    • 邀请加入品牌社群,增强归属感。

5.2 重要保持用户(占比 10.6%,贡献 8.4% 营收)

  • 策略:召回激活,唤醒沉睡的高价值用户。
  • 具体动作
    • 发送个性化召回邮件/短信,附带大额优惠券(如满 £100 减 £20)。
    • 推送其历史购买品类的热销新品,降低决策成本。
    • 限时活动倒计时,制造紧迫感。

5.3 流失风险用户(占比 21.8%,贡献 2.1% 营收)

  • 策略:低成本召回,评估是否值得投入。
  • 具体动作
    • 发送"我们想念你"系列邮件,附带小额优惠券。
    • 推送清仓折扣与包邮活动,降低尝试门槛。
    • 对长期无响应用户停止投入,避免沉没成本。

5.4 重要发展用户(占比 4.0%,贡献 1.8% 营收)

  • 策略:提升购买频次,培养消费习惯。
  • 具体动作
    • 设计"满 N 单返券"活动,激励多次下单。
    • 推送搭配购、组合装,提升单次订单价值。
    • 订阅制服务(如每月礼盒),锁定长期复购。

5.5 重要挽留用户(占比 4.1%,贡献 1.7% 营收)

  • 策略:紧急挽留,防止彻底流失。
  • 具体动作
    • 电话/短信一对一沟通,了解流失原因。
    • 提供定制化解决方案(如退换货政策放宽)。
    • 赠送高价值礼品,重建品牌好感。

可视化看板

本项目输出 4 张核心可视化图表,直观呈现分析结果。

1. 消费趋势时序图

展示分析期内月度销售额、订单数、用户数的变化趋势,识别销售高峰与低谷。

消费趋势时序图

2. RFM 用户价值矩阵

以 R(最近消费)为横轴、F(消费频次)为纵轴、气泡大小表示 M(消费金额),直观展示用户分布与分层。

RFM用户价值矩阵

3. 活跃度与复购分析

展示不同活跃度等级用户的复购率与客单价对比,验证活跃度与消费能力的正相关性。

活跃度与复购分析

4. RFM 三维散点图

在三维空间中展示 R、F、M 三个维度的分布,颜色区分用户层级,直观感受用户价值的立体分布。

RFM三维散点图


关键发现与洞察

  1. 头部效应显著:51.9% 的高价值用户贡献 92.1% 营收,符合电商行业"二八定律"。资源应向 VIP 倾斜。

  2. 复购率健康:72.35% 的复购率说明产品质量与用户满意度较高,但仍有 27.65% 的用户为一次性购买,需优化首单体验与二次触达。

  3. 流失风险不容忽视:21.8% 的用户处于流失风险状态,虽然贡献低,但基数大。建议建立自动化流失预警机制,当用户超过 60 天未下单时自动触发召回流程。

  4. 重要发展用户是增长引擎:4.0% 的重要发展用户消费金额高但频次低,通过会员积分、订阅制等手段将其转化为重要价值用户,是提升 GMV 的最快路径。

  5. 季节性波动明显:11-12 月为销售旺季(圣诞礼品需求),建议提前 2 个月备货并加大营销投入;1-2 月为淡季,适合进行用户召回与清仓活动。


参考与致谢

About

电商用户行为分析与 RFM 价值分群项目

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages