Python - Pandas如何实现RFM模型
·
使用 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值)和客户分层的规则,使其更贴合业务需求。
更多推荐


所有评论(0)