使用 Pandas 实现 RFM 模型是一个经典的数据分析实战案例,它能帮助企业通过 最近一次消费 (Recency)消费频率 (Frequency)消费金额 (Monetary) 三个维度来量化客户价值,并实现精准分层。

下面是一个完整的、可复现的 RFM 模型实现流程,包含从数据准备到客户分层的全部步骤。

🎯 RFM模型核心原理

  • R (Recency) - 最近一次消费时间:客户最近一次购买距今的时间。时间越短,客户价值越高,留存可能性越大。
  • F (Frequency) - 消费频率:客户在特定周期内的购买次数。次数越多,忠诚度越高。
  • M (Monetary) - 消费金额:客户在特定周期内的总消费金额。金额越大,贡献价值越高。

🛠️ 完整代码实现

我们将通过一个模拟的电商订单数据集,一步步实现RFM分析。

1. 数据准备与清洗

首先,我们创建一个模拟数据集,并进行必要的预处理,例如转换日期格式和剔除异常订单。

import pandas as pd
import numpy as np

# 1.1 创建模拟订单数据
data = {
    '用户ID': [1, 2, 3, 1, 2, 3, 4, 5, 6, 4, 1],
    '订单ID': [101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111],
    '下单时间': ['2025-05-10', '2025-05-11', '2025-05-12', '2025-05-14', '2025-05-16', 
                '2025-05-17', '2025-05-18', '2025-05-20', '2025-05-21', '2025-05-22', '2025-06-01'],
    '交易金额': [200, 300, 150, 400, 500, 200, 350, 100, 450, 600, 300],
    '订单状态': ['成功', '成功', '成功', '成功', '成功', '成功', '成功', '成功', '成功', '成功', '退款'] # 包含退款订单
}
df = pd.DataFrame(data)

# 1.2 数据清洗
# 将下单时间转换为日期类型
df['下单时间'] = pd.to_datetime(df['下单时间'])
# 剔除退款订单,确保数据准确性
df = df[df['订单状态'] == '成功']

# 定义分析的基准日期(通常是数据集中最晚的日期+1天)
today_date = df['下单时间'].max() + pd.Timedelta(days=1)

print("清洗后的数据预览:")
print(df.head())
2. 计算RFM核心指标

接下来,我们按用户ID进行分组,聚合计算出每个用户的R、F、M值。

# 2.1 使用groupby和agg函数一次性计算R、F、M
rfm_df = df.groupby('用户ID').agg({
    '下单时间': lambda x: (today_date - x.max()).days,  # R: 最近一次消费距今的天数
    '订单ID': 'count',                                   # F: 购买次数
    '交易金额': 'sum'                                    # M: 消费总金额
}).reset_index()

# 重命名列,使其更清晰
rfm_df.columns = ['用户ID', 'R', 'F', 'M']

print("\nRFM指标计算结果:")
print(rfm_df)
3. 指标分箱与打分

为了便于比较和分层,我们将连续的R、F、M值划分为不同的等级(例如1-5分)。这里我们使用 pd.qcut 进行分位数切割,确保每个分数段的用户数量大致相等。

注意:R值越小代表价值越高,所以打分时分数是反向的(5, 4, 3, 2, 1)。F值和M值越大价值越高,分数是正向的(1, 2, 3, 4, 5)。

# 3.1 定义打分函数
def rfm_score(df, column, ascending=True):
    # ascending=True 表示值越大分数越高 (用于F, M)
    # ascending=False 表示值越大分数越低 (用于R)
    labels = [1, 2, 3, 4, 5] if ascending else [5, 4, 3, 2, 1]
    df[column + '_score'] = pd.qcut(df[column], q=5, labels=labels, duplicates='drop')
    return df

# 3.2 应用打分
rfm_df = rfm_score(rfm_df, 'R', ascending=False) # R值打分
rfm_df = rfm_score(rfm_df, 'F', ascending=True)  # F值打分
rfm_df = rfm_score(rfm_df, 'M', ascending=True)  # M值打分

# 将分数列转换为整数类型以便后续计算
rfm_df['R_score'] = rfm_df['R_score'].astype(int)
rfm_df['F_score'] = rfm_df['F_score'].astype(int)
rfm_df['M_score'] = rfm_df['M_score'].astype(int)

print("\nRFM打分结果:")
print(rfm_df)
4. 生成综合标签与客户分层

最后,我们根据打分结果生成综合标签,并定义规则将客户划分到不同的价值群体中。

# 4.1 计算RFM总分 (可选)
rfm_df['RFM_Score'] = rfm_df['R_score'] + rfm_df['F_score'] + rfm_df['M_score']

# 4.2 定义客户分层规则
# 这里使用一个简单的规则:根据总分进行划分
def customer_segment(score):
    if score >= 12:
        return '重要价值客户'   # 高R高F高M
    elif score >= 9:
        return '潜力客户'       # 表现中等偏上
    elif score >= 6:
        return '一般保持客户'   # 表现中等
    else:
        return '流失风险客户'   # 低R低F低M

rfm_df['客户分层'] = rfm_df['RFM_Score'].apply(customer_segment)

print("\n最终客户分层结果:")
print(rfm_df[['用户ID', 'R', 'F', 'M', 'RFM_Score', '客户分层']])

通过以上四个步骤,你就完成了一个完整的RFM客户价值分析。你可以根据自己业务的实际情况,调整分箱的数量(q值)和客户分层的规则,使其更贴合业务需求。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐