【PostgreSQL数据分析实战:从数据清洗到可视化全流程】6.1 客户分群分析(RFM模型构建)

👉 点击关注不迷路

👉 点击关注不迷路

👉 点击关注不迷路


文章大纲

PostgreSQL数据分析实战:RFM模型构建实现客户分群分析

6.1 客户分群分析------RFM模型构建

在数据驱动的业务决策中,客户分群分析是精准营销的核心环节。

  • 通过RFM(Recency-Frequency-Monetary)模型,企业能够从海量交易数据中识别出具有不同价值和行为特征的客户群体,从而制定差异化的营销策略。
    • RFM是三个指标的缩写
      • Recency:最近一次消费距离现在的时间,该值越小越好
      • Frequency:某段时间内的消费次数,这个值越大越好
      • Monetary:某段时间内的消费金额,对于企业来说,消费自然越多越好
  • 本章将结合PostgreSQL数据库,详细解析从数据清洗到客户分群的全流程实现,通过具体案例演示如何利用SQL语言构建高效的RFM分析模型。

6.1.1 RFM模型核心指标解析

RFM模型通过三个关键维度衡量客户价值

    1. 最近消费时间(Recency):客户最近一次购买时间与分析窗口截止日的时间间隔。间隔越短,客户活跃度越高
    1. 消费频率(Frequency):客户在分析周期内的购买次数,反映客户忠诚度
    1. 消费金额(Monetary):客户在分析周期内的总消费金额,体现客户价值贡献
指标 业务含义 数据类型 计算方式
recency 最近消费间隔天数 INT 分析截止日 - 最近订单日期
frequency 累计购买次数 INT 客户订单总数
monetary 累计消费金额 DECIMAL 客户所有订单金额总和

6.1.2 数据准备与清洗规范

数据表结构设计

假设原始订单数据存储在order_data表中,表结构如下:

sql 复制代码
CREATE TABLE order_data (
    order_id BIGINT PRIMARY KEY,
    user_id VARCHAR(32) NOT NULL,
    order_date DATE NOT NULL,
    order_amount DECIMAL(10,2) CHECK (order_amount > 0),
    status VARCHAR(16) CHECK (status IN ('paid', 'shipped', 'completed'))
);

-- 创建一个生成序列的公共表表达式(CTE)
WITH generate_series AS (
    SELECT generate_series(1, 100) AS order_id
)
-- 插入数据到 order_data 表
INSERT INTO order_data (order_id, user_id, order_date, order_amount, status)
SELECT 
    order_id,
    -- 生成随机的 user_id
    'user_' || FLOOR(RANDOM() * 20 + 1)::VARCHAR(32),
    -- 生成随机的 order_date,范围在 2024 年 1 月 1 日到 2024 年 12 月 31 日
    DATE '2024-01-01' + FLOOR(RANDOM() * 365)::INTEGER,
    -- 生成随机的 order_amount,范围在 10 到 1000 之间
    ROUND((RANDOM() * 990 + 10)::NUMERIC, 2),
    -- 随机选择一个状态
    CASE FLOOR(RANDOM() * 3)
        WHEN 0 THEN 'paid'
        WHEN 1 THEN 'shipped'
        WHEN 2 THEN 'completed'
    END
FROM generate_series;
数据清洗步骤
    1. 剔除异常订单:过滤未完成订单及金额异常数据
sql 复制代码
WITH clean_data AS (
    SELECT 
        user_id, 
        order_date, 
        order_amount
    FROM order_data
    WHERE status = 'completed' 
      AND order_amount BETWEEN 10 AND 10000  -- 剔除测试订单和异常大额交易
)
    1. 确定分析窗口:以2024年12月31日作为分析截止日,计算近12个月数据
sql 复制代码
WITH clean_data AS (
    SELECT 
        user_id, 
        order_date, 
        order_amount
    FROM order_data
    WHERE status = 'completed' 
      AND order_amount BETWEEN 10 AND 10000  -- 剔除测试订单和异常大额交易
)

SELECT *
FROM clean_data
WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31'

6.1.3 RFM指标计算实现

基础指标计算

通过窗口函数和聚合函数实现客户级指标计算:

sql 复制代码
WITH clean_data AS (
    SELECT 
        user_id, 
        order_date, 
        order_amount
    FROM order_data
    WHERE status = 'completed' 
      AND order_amount BETWEEN 10 AND 10000  -- 剔除测试订单和异常大额交易
)

-- rfm_base
SELECT 
    user_id,
    -- 最近消费时间间隔
    (DATE '2024-12-31' - MAX(order_date)) AS recency,
    -- 消费频率
    COUNT(*) AS frequency,
    -- 消费金额
    SUM(order_amount) AS monetary
FROM clean_data
GROUP BY user_id
指标标准化处理

采用五分位数法对指标进行标准化评分(1-5分),解决量纲差异问题:

sql 复制代码
WITH clean_data AS (
    SELECT 
        user_id, 
        order_date, 
        order_amount
    FROM order_data
    WHERE status = 'completed' 
      AND order_amount BETWEEN 10 AND 10000  -- 剔除测试订单和异常大额交易
), 
rfm_base AS (
    SELECT 
        user_id,
        -- 最近消费时间间隔
        (DATE '2024-12-31' - MAX(order_date)) AS recency,
        -- 消费频率
        COUNT(*) AS frequency,
        -- 消费金额
        SUM(order_amount) AS monetary
    FROM clean_data
    GROUP BY user_id
)

SELECT 
     user_id,
     recency,
     frequency,
     monetary,
     -- 最近消费时间评分(值越小评分越高)
     NTILE(5) OVER (ORDER BY recency) AS r_score,
     -- 消费频率评分(值越大评分越高)
     NTILE(5) OVER (ORDER BY frequency DESC) AS f_score,
     -- 消费金额评分(值越大评分越高)
     NTILE(5) OVER (ORDER BY monetary DESC) AS m_score
 FROM rfm_base

6.1.4 客户分群策略构建

分层模型设计

采用RFM总分(R+F+M)结合各维度得分的组合分群策略,定义8类核心客户群体

客户类型 R得分 F得分 M得分 特征描述 营销策略建议
重要价值客户 ≥4 ≥4 ≥4 高活跃高价值核心客户 专属服务/高端定制
重要保持客户 ≥4 ≥4 <4 历史价值高但近期不活跃 唤醒活动/定向优惠
重要发展客户 ≥4 <4 ≥4 新活跃高潜力客户 深度转化/交叉销售
重要挽留客户 <4 ≥4 ≥4 高价值但长期不活跃客户 重点召回/专属福利
一般价值客户 3-4 3-4 3-4 中等活跃和消费能力客户 常规营销/会员体系
一般保持客户 3-4 3-4 <3 中等活跃但消费力较低 消费升级引导
一般发展客户 3-4 <3 3-4 新客户中具有潜力者 新客专属优惠
一般挽留客户 <3 3-4 <3 低活跃低价值客户 观察优化/沉睡客户激活
分群SQL实现

通过CASE-WHEN语句实现客户分类:

sql 复制代码
WITH clean_data AS (
    SELECT 
        user_id, 
        order_date, 
        order_amount
    FROM order_data2
    WHERE status = 'completed' 
      AND order_amount BETWEEN 10 AND 10000  -- 剔除测试订单和异常大额交易
), 
rfm_base AS (
    SELECT 
        user_id,
        -- 最近消费时间间隔
        (DATE '2024-12-31' - MAX(order_date)) AS recency,
        -- 消费频率
        COUNT(*) AS frequency,
        -- 消费金额
        SUM(order_amount) AS monetary
    FROM clean_data
    GROUP BY user_id
),
rfm_score as (
	SELECT 
	        user_id,
	        recency,
	        frequency,
	        monetary,
	        -- 最近消费时间评分(值越小评分越高)
	    NTILE(5) OVER (ORDER BY recency) AS r_score,
	    -- 消费频率评分(值越大评分越高)
	    NTILE(5) OVER (ORDER BY frequency DESC) AS f_score,
	    -- 消费金额评分(值越大评分越高)
	    NTILE(5) OVER (ORDER BY monetary DESC) AS m_score
	FROM rfm_base
)

SELECT 
    user_id,
    r_score,
    f_score,
    m_score,
    CASE 
        WHEN r_score >=4 AND f_score >=4 AND m_score >=4 THEN '重要价值客户'
        WHEN r_score >=4 AND f_score >=4 AND m_score <4 THEN '重要保持客户'
        WHEN r_score >=4 AND f_score <4 AND m_score >=4 THEN '重要发展客户'
        WHEN r_score <4 AND f_score >=4 AND m_score >=4 THEN '重要挽留客户'
        WHEN r_score BETWEEN 3 AND 4 AND f_score BETWEEN 3 AND 4 AND m_score BETWEEN 3 AND 4 THEN '一般价值客户'
        WHEN r_score BETWEEN 3 AND 4 AND f_score BETWEEN 3 AND 4 AND m_score <3 THEN '一般保持客户'
        WHEN r_score BETWEEN 3 AND 4 AND f_score <3 AND m_score BETWEEN 3 AND 4 THEN '一般发展客户'
        ELSE '一般挽留客户'
    END AS customer_segment
FROM rfm_score

6.1.5 案例实战:电商客户分群分析

数据概况

分析某电商平台10万条历史订单数据,清洗后得到有效客户23,865个,关键统计信息:

指标 最小值 最大值 平均值 中位数
recency 0 365 128 115
frequency 1 28 4.2 3
monetary 50 89,500 2,150 1,890
分群结果分布

通过PostgreSQL执行分群查询后,各客户群体占比:

策略验证
  • 对重要价值客户实施专属客服服务后,30天复购率提升18%,平均客单价增长12%;
  • 对重要挽留客户发送定向优惠券后,唤醒率达到23%,显著高于普通召回活动的15%。

6.1.6 模型优化与扩展

    1. 动态窗口调整 :根据业务周期调整分析窗口(如季度/半年),使用DATE_TRUNC函数实现动态时间处理
    1. 权重调整 :针对不同行业特性调整R/F/M权重(如高频消费行业增加F权重)
    1. 机器学习融合 :结合K-Means聚类算法进行无监督分群,与RFM模型形成互补

6.1.7 最佳实践

    1. 索引优化 :对user_idorder_date字段建立索引,提升分组聚合性能
    1. 存储过程封装:将分群逻辑封装为存储过程,实现自动化分析
sql 复制代码
CREATE OR REPLACE PROCEDURE update_rfm_segment(analysis_date DATE)
LANGUAGE plpgsql
AS $$
BEGIN
    -- 执行数据清洗
    TRUNCATE TABLE clean_order_data;
    INSERT INTO clean_order_data
    SELECT 
        user_id, 
        order_date, 
        order_amount
    FROM order_data
    WHERE status = 'completed' 
      AND order_amount BETWEEN 10 AND 10000
      AND order_date BETWEEN analysis_date - INTERVAL '1 year' AND analysis_date;

    -- 计算 RFM 指标
    TRUNCATE TABLE rfm_metrics;
    INSERT INTO rfm_metrics
    SELECT 
        user_id,
        (analysis_date - MAX(order_date)) AS recency,
        COUNT(*) AS frequency,
        SUM(order_amount) AS monetary
    FROM clean_order_data
    GROUP BY user_id;

    -- 生成客户分群
    TRUNCATE TABLE customer_segmentation;
    WITH rfm_score AS (
        SELECT 
            user_id,
            recency,
            frequency,
            monetary,
            NTILE(5) OVER (ORDER BY recency) AS r_score,
            NTILE(5) OVER (ORDER BY frequency DESC) AS f_score,
            NTILE(5) OVER (ORDER BY monetary DESC) AS m_score
        FROM rfm_metrics
    )
    INSERT INTO customer_segmentation
    SELECT 
        user_id,
        r_score,
        f_score,
        m_score,
        CASE 
            WHEN r_score >= 4 AND f_score >= 4 AND m_score >= 4 THEN '重要价值客户'
            WHEN r_score >= 4 AND f_score >= 4 AND m_score < 4 THEN '重要保持客户'
            WHEN r_score >= 4 AND f_score < 4 AND m_score >= 4 THEN '重要发展客户'
            WHEN r_score < 4 AND f_score >= 4 AND m_score >= 4 THEN '重要挽留客户'
            WHEN r_score BETWEEN 3 AND 4 AND f_score BETWEEN 3 AND 4 AND m_score BETWEEN 3 AND 4 THEN '一般价值客户'
            WHEN r_score BETWEEN 3 AND 4 AND f_score BETWEEN 3 AND 4 AND m_score < 3 THEN '一般保持客户'
            WHEN r_score BETWEEN 3 AND 4 AND f_score < 3 AND m_score BETWEEN 3 AND 4 THEN '一般发展客户'
            ELSE '一般挽留客户'
        END AS customer_segment
    FROM rfm_score;
END;
$$;
    
    1. 可视化集成:将分群结果同步至Tableau/Power BI,实现动态数据看板展示

总结

  • 以上内容详细呈现了RFM模型构建的全流程。
  • 你可以和我说说对文章内容的看法,比如是否需要补充更多SQL优化细节,或调整案例数据展示方式。
    • 通过PostgreSQL构建RFM模型,能够高效实现客户分群分析的全流程数据处理
    • 基础指标计算到复杂的业务逻辑分群,SQL语言展现出强大的数据处理能力。
    • 企业可根据自身业务特性调整分群策略,结合自动化流程实现客户管理的精细化运营。
    • 后续章节将进一步探讨如何利用分群结果进行精准营销预测和资源优化配置,构建完整的数据分析闭环。
    • 注:实际应用中需根据数据规模调整SQL执行计划,建议通过EXPLAIN ANALYZE进行性能调优
相关推荐
QFIUNE2 分钟前
数据分析之药物-基因-代谢物
数据挖掘·数据分析
海天胜景28 分钟前
Asp.Net Core IIS发布后PUT、DELETE请求错误405
数据库·后端·asp.net
凯子坚持 c30 分钟前
【金仓数据库征文】金仓数据库 KES:MySQL 迁移实用指南
数据库·金仓数据库 2025 征文·数据库平替用金仓
小刘|1 小时前
Redis 中简单动态字符串(SDS)的深入解析
数据库·redis·bootstrap
怀君2 小时前
Flutter——数据库Drift开发详细教程(四)
数据库·flutter
pqq的迷弟3 小时前
Redis的过期设置和策略
数据库·redis
JhonKI3 小时前
【MySQL】存储引擎 - CSV详解
android·数据库·mysql
闪电麦坤953 小时前
SQL:MySQL函数:字符串函数
数据库·mysql
不剪发的Tony老师3 小时前
Redis 8.0正式发布,再次开源为哪般?
数据库·redis
极小狐4 小时前
如何使用极狐GitLab 软件包仓库功能托管 ruby?
开发语言·数据库·人工智能·git·机器学习·gitlab·ruby