Python-数据分析综合案例-RFM模型
一、模型基础概念
-
核心作用:
-
评估用户价值,区分会员层级
-
衡量营销效果的关键指标
-
基于交易行为(Recency, Frequency, Monetary)
-
-
三大维度:
维度
含义
业务意义
评分规则
R (Recency)
最近一次购买时间
用户活跃度
值越小→分越高(时间近)
F (Frequency)
购买频率
用户忠诚度
值越大→分越高
M (Monetary)
购买总金额
用户贡献值
值越大→分越高
-
用户分群策略(8类):
R
F
M
用户类别
业务策略
高
高
高
重要价值用户
重点维护,提供VIP服务
高
低
高
重要发展用户
提升复购率(如推送优惠券)
低
高
高
重要保持用户
防止流失(如专属召回活动)
低
低
高
重要挽留用户
高价值流失用户,优先挽回
高
高
低
一般价值用户
引导提高客单价
高
低
低
一般发展用户
刺激消费频次和金额
低
高
低
一般保持用户
低成本维护,避免流失
低
低
低
一般挽留用户
酌情放弃或低成本触达
二、模型实现流程
数据准备阶段
import pandas as pd
import numpy as np
# 1. 数据导入
df_raw = pd.read_excel('./sales.xlsx', index_col='USERID')
# 2. 数据清洗
sales_data = df_raw.dropna() # 删除缺失值
sales_data = sales_data[sales_data['AMOUNTINFO'] > 1] # 过滤无效订单
RFM核心计算
# 3. 计算基础指标
deadline_date = pd.to_datetime("2024-12-29") # 基准日期
recency_value = sales_data['ORDERDATE'].groupby(sales_data.index).max()
frequency_value = sales_data['ORDERDATE'].groupby(sales_data.index).count()
monetary_value = sales_data['AMOUNTINFO'].groupby(sales_data.index).sum()
# 4. 计算R间隔(天数)
r_interval = (deadline_date - recency_value).dt.days
# 5. 五分位法评分(关键步骤)
r_score = pd.cut(r_interval, bins=5, labels=[5,4,3,2,1]) # R值越小分越高
f_score = pd.cut(frequency_value, bins=5, labels=[1,2,3,4,5]) # F/M值越大分越高
m_score = pd.cut(monetary_value, bins=5, labels=[1,2,3,4,5])
注:pd.cut()参数详解
x:待分段的连续数据
bins:分段边界值列表或分段数量
labels:各分段对应的标签
right:是否包含右边界(默认True)
数据合并与策略应用
# 6. 合并RFM矩阵
rfm_list = [r_score, f_score, m_score]
rfm_cols = ['r_score','f_score','m_score']
rfm_pd = pd.DataFrame(np.array(rfm_list).T, # 转置保证行列对齐
dtype=np.int32,
columns=rfm_cols,
index=frequency_value.index)
# 策略1:加权得分(业务可调权重)
rfm_pd['rfm_wscore'] = rfm_pd['r_score']*0.2 + rfm_pd['f_score']*0.2 + rfm_pd['m_score']*0.6
# 策略2:RFM组合编码(字符串拼接)
rfm_pd_tmp = rfm_pd.astype(str) # 简化原代码
rfm_pd['rfm_comb'] = rfm_pd_tmp['r_score'] + rfm_pd_tmp['f_score'] + rfm_pd_tmp['m_score']
# 7. 导出结果
rfm_pd.to_csv('rfm_result.csv')
三、可视化分析
1. 客户分层柱状图
import matplotlib.pyplot as plt
# 按加权分分层
bins = [0, 2, 4, 5] # 分层阈值
labels = ['Low', 'Medium', 'High']
rfm_pd['Segment'] = pd.cut(rfm_pd['rfm_wscore'], bins=bins, labels=labels)
# 绘制柱状图
segment_counts = rfm_pd['Segment'].value_counts()
segment_counts.plot(kind='bar', color=['red','orange','green'])
plt.title('Customer Value Segmentation')
plt.xlabel('Segment Tier')
plt.ylabel('Customer Count')
plt.xticks(rotation=0)
plt.show()
2. 客户占比饼图
# 绘制饼图
segment_counts.plot(kind='pie',
autopct='%1.1f%%',
colors=['red','orange','green'],
startangle=90,
counterclock=False)
plt.title('Customer Proportion by RFM Tier')
plt.ylabel('')
plt.show()
四、关键注意事项
-
时间基准敏感性:
-
不同截止日期会导致R值变化,需定期更新分析
-
建议选择业务周期结束点(如财年末)
-
-
数据预处理要点:
-
删除金额≤1的订单(避免系统测试干扰)
-
缺失值处理:删除或填充(如用中位数)
-
-
分段优化建议:
-
五分位法可能不均衡,可改用业务自定义阈值
-
例:R值按30/90/180天分段
-
-
策略选择:
-
加权得分:适合综合评估用户价值
-
RFM组合:适合精细化运营分组(如555用户单独触达)
-
五、常见问题解决
-
报错
TypeError:-
检查
pd.cut()的labels长度需等于bins分段数
-
-
结果异常:
-
验证
groupby是否正确:确保按用户ID聚合 -
检查时间格式:
pd.to_datetime()强制转换日期
-
-
可视化不显示中文:
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)