电商用户分群实战:LRFM+K-Means 聚类挖掘高价值用户(完整代码 + 分析)
一、项目简介
1.1 项目背景
电商行业飞速发展,平台沉淀了海量用户交易数据,如何从海量数据中区分高价值用户、流失用户、普通新用户,是企业开展精准营销、提升营收的核心问题。
本次项目基于某电商真实订单数据,结合LRFM 用户价值模型与K-Means 无监督聚类算法,完成从数据清洗、探索性分析、特征工程、数据标准化、模型训练到结果解读的全流程实战,最终实现用户分层,并输出落地化电商运营策略。
1.2 技术栈
- 数据分析:
Pandas、NumPy - 可视化:
Matplotlib、Pyecharts - 机器学习:
Scikit-learn(K-Means、数据预处理) - 运行环境:Jupyter Notebook / Python 3.10+
1.3 核心模型说明
LRFM 模型是传统 RFM 模型的升级,四大指标定义:
- L(生命周期):用户首次消费到最后一次消费的时间差,衡量用户忠诚度与平台陪伴时长;
- R(最近消费间隔):用户距离最后一次消费的天数,数值越大,用户流失风险越高;
- F(消费频率):用户累计下单次数,反映用户复购意愿;
- M(消费金额):用户累计消费总额,直接代表用户消费价值。
1.4 整体流程
数据加载与预处理 → 业务数据可视化分析 → LRFM 特征构建 → 数据标准化 → K-Means 聚类(肘部法则选 K)→ 聚类结果可视化 → 用户分群解读 + 商业建议
二、环境依赖安装
执行以下命令安装所需第三方库:
bash
运行
pip install pandas numpy matplotlib scikit-learn openpyxl pyecharts
三、完整代码实现
3.1 导入库与全局配置
解决 Matplotlib 中文乱码、忽略无关警告:
python
运行
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
from pyecharts.charts import Pie, Line, Radar
from pyecharts import options as opts
import warnings
# 全局配置
warnings.filterwarnings('ignore')
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 中文显示
mpl.rcParams['axes.unicode_minus'] = False # 负号显示
3.2 数据加载、探索与预处理
数据集字段:订单顺序编号、订单号、用户名、商品编号、订单金额、付款金额、渠道编号、平台类型、下单时间、付款时间、是否退款。处理逻辑:查看基础信息 → 去重 → 过滤异常值 → 删除缺失值 → 时间格式转换。
python
运行
# 读取Excel数据,修改为你的文件路径
data = pd.read_excel("D:\hzl\data\order2021kmeans (1).xlsx")
# 1. 查看数据基本信息
print("===== 数据基本信息 =====")
print(f"数据集形状:{data.shape}")
print("\n前5行数据:")
print(data.head())
print("\n数据字段类型:")
print(data.dtypes)
print("\n缺失值统计:")
print(data.isnull().sum())
# 2. 数据预处理
# 查看重复值
print("\n重复数据条数:", data.duplicated().sum())
data.drop_duplicates(inplace=True)
# 过滤异常值:付款金额小于等于0为无效订单
data = data[(data['付款金额'] > 0)]
# 删除缺失值
data.dropna(inplace=True)
# 时间字段转为标准datetime类型(核心步骤)
data['付款时间'] = pd.to_datetime(data['付款时间'])
data['下单时间'] = pd.to_datetime(data['下单时间'])
print("数据预处理完成!")
3.3 探索性可视化分析
从渠道、月份、每日时段三个维度分析平台整体收益分布,掌握业务规律。
3.3.1 按渠道统计收益(柱状图 + 玫瑰饼图)
python
运行
# 按渠道分组统计总收益
channel_revenue = data.groupby('渠道编号')['付款金额'].sum().sort_values(ascending=False).reset_index()
# 绘制柱状图
plt.figure(figsize=(10,8))
plt.bar(channel_revenue['渠道编号'], channel_revenue['付款金额'])
plt.xticks(rotation=45)
plt.title('按渠道划分的收益')
plt.xlabel('渠道编号')
plt.ylabel('收益')
plt.show()
# 绘制玫瑰饼图
pie_data = [list(z) for z in zip(channel_revenue['渠道编号'], channel_revenue['付款金额'])]
pie = (
Pie()
.add('渠道收益', pie_data, rosetype='radius', radius=["20%","60%"])
.set_global_opts(title_opts=opts.TitleOpts(title='按渠道划分的收益'))
)
pie.render_notebook()
3.3.2 按月份统计收益(折线图)
python
运行
# 提取付款月份
data['月份'] = data['付款时间'].dt.month
month_revenue = data.groupby('月份')['付款金额'].sum().reset_index()
# 绘制月度收益折线图
plt.figure(figsize=(10,8))
plt.plot(month_revenue['月份'], month_revenue['付款金额'])
plt.xticks(range(1,13))
plt.title('按月份划分的收益')
plt.xlabel('月份')
plt.ylabel('收益')
plt.show()
3.3.3 按星期 + 小时统计时段收益
分析用户消费高峰时段,为活动投放提供依据:
python
运行
# 提取小时、星期名称
data['付款小时'] = data['付款时间'].dt.hour
data['付款天数名称'] = data['付款时间'].dt.day_name()
# 分组统计每星期每小时收益
hourly_sales = data.groupby(['付款天数名称','付款小时'])['付款金额'].sum().reset_index()
hourly_sales = hourly_sales.rename(columns={'付款金额': 'TotalValue'})
# 数据切分
split_dfs = []
num_groups = len(hourly_sales) // 24
for i in range(num_groups):
start_index = i * 24
end_index = start_index + 24
split_df = hourly_sales.iloc[start_index:end_index]
split_dfs.append(split_df)
print(split_dfs[0])
# 绘制多时段折线图
name_list = hourly_sales['付款天数名称'].unique()
line = (
Line()
.add_xaxis(split_dfs[0]['付款小时'].astype(str).tolist())
.set_global_opts(
title_opts={"text":"每日每小时收益总额"},
legend_opts=opts.LegendOpts(orient='vertical',pos_top='5%',pos_right='5%')
)
)
for i in range(num_groups):
line.add_yaxis(name_list[i], split_dfs[i]['TotalValue'].tolist())
line.render_notebook()
3.4 核心特征工程:构建 LRFM 指标
基于业务逻辑,对用户分组计算 L、R、F、M 四大特征,并合并为特征表:
python
运行
# 1. 计算L:用户生命周期(最后付款时间 - 首次付款时间,单位:天)
user_last_time = data.groupby('用户名')['付款时间'].max()
user_first_time = data.groupby('用户名')['付款时间'].min()
L = (user_last_time - user_first_time).dt.days.reset_index()
# 2. 计算R:最近消费间隔(距离数据集最后一天的天数)
max_date = max(data['付款时间'])
data['diff'] = max_date - data['付款时间']
data['diff'] = data['diff'].dt.days
R = data.groupby('用户名')['diff'].min().reset_index()
# 3. 计算F:消费频率(下单总次数)
F = data.groupby('用户名')['订单号'].count().reset_index()
# 4. 计算M:累计付款金额
M = data.groupby('用户名')['付款金额'].sum().reset_index()
# 合并四大特征
LRFMdata = L.merge(R).merge(F).merge(M)
# 重命名列
LRFMdata.columns=['用户名','L','R','F','M']
print(LRFMdata.head())
3.5 数据标准化
LRFM 各特征量级差异极大,必须做归一化处理,避免数值大的特征主导聚类结果:
python
运行
from sklearn.preprocessing import MinMaxScaler
model_data = LRFMdata.copy()
# 提取特征矩阵(剔除用户名字段)
scale_matrix = model_data.iloc[:, 1:5]
# 最大最小值归一化 [0,1]
model_scaler = MinMaxScaler()
data_scaled = model_scaler.fit_transform(scale_matrix)
print(data_scaled.round(3))
3.6 K-Means 聚类 + 肘部法则确定 K 值
使用肘部法则计算不同 K 值下的 SSE(误差平方和),找到最优聚类数:
python
运行
from sklearn.cluster import KMeans
# 遍历K=1~9,计算SSE
SSE = []
for i in range(1,10):
kmeans = KMeans(n_clusters = i,random_state = 10)
kmeans.fit(data_scaled)
SSE.append(kmeans.inertia_)
# 绘制肘部曲线
plt.plot(range(1,10), SSE, marker = 'o')
plt.title('肘部法则确定K值')
plt.xlabel('聚类数量K')
plt.ylabel('SSE误差平方和')
plt.show()
根据曲线拐点,本次选择 K=3 完成正式聚类:
python
运行
# 训练K-Means模型
n_clusters = 3
model_kmeans = KMeans(n_clusters=n_clusters)
cluster_labels_k = model_kmeans.fit_predict(data_scaled)
# 将聚类标签合并回原数据表
cluster_labels = pd.DataFrame(cluster_labels_k, columns=['Cluster_Id'])
merge_data = pd.concat((model_data, cluster_labels), axis=1)
print(merge_data.head())
3.7 聚类结果统计与可视化
3.7.1 各群体指标均值 & 人数统计
python
运行
merged_lrfm = merge_data[['M','F','R','L','Cluster_Id']]
# 计算每个聚类的指标均值
mean_lrfm = merged_lrfm.groupby('Cluster_Id').mean().reset_index()
# 统计每个群体人数
mean_lrfm['count'] = merged_lrfm['Cluster_Id'].value_counts().values
print(mean_lrfm)
3.7.2 群体人数占比饼图
python
运行
data_lrfm = [list(z) for z in zip(mean_lrfm['Cluster_Id'], mean_lrfm['count'])]
pie_lrfm = (
Pie()
.add('每种分类人数占比', data_lrfm, radius=["35%","50%"])
.set_global_opts(title_opts=opts.TitleOpts(title="每种分类人数占比"))
)
pie_lrfm.render_notebook()
3.7.3 LRFM 特征雷达图(核心可视化)
直观对比三类用户的特征差异:
python
运行
# 配置雷达图指标
dims = ['M', 'F', 'R', 'L']
indicators = []
for dim in dims:
max_val = mean_lrfm[dim].max() * 1.1
indicators.append(opts.RadarIndicatorItem(name=dim, max_=max_val))
# 提取三类用户数据
cluster_0_data = mean_lrfm[mean_lrfm['Cluster_Id'] == 0][dims].values[0].tolist()
cluster_1_data = mean_lrfm[mean_lrfm['Cluster_Id'] == 1][dims].values[0].tolist()
cluster_2_data = mean_lrfm[mean_lrfm['Cluster_Id'] == 2][dims].values[0].tolist()
# 绘制雷达图
c = (
Radar(init_opts=opts.InitOpts(width="800px", height="600px"))
.add_schema(schema=indicators)
.add("Cluster 0", [cluster_0_data], color="#FF0000",
linestyle_opts=opts.LineStyleOpts(color="#FF0000"))
.add("Cluster 1", [cluster_1_data], color="#0000FF",
linestyle_opts=opts.LineStyleOpts(color="#0000FF"))
.add("Cluster 2", [cluster_2_data], color="#008000",
linestyle_opts=opts.LineStyleOpts(color="#008000"))
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title="用户分群特征雷达图"),
legend_opts=opts.LegendOpts(pos_top="10%"),
)
)
c.render("radar_chart_raw.html")
c.render_notebook()
四、聚类结果分析与用户画像
核心规则:R 值越大 = 距离上次消费越久 = 流失风险越高;L/F/M 数值越大,代表用户价值、忠诚度越高。
4.1 Cluster 1(蓝色):高价值核心 VIP 用户
- 特征:消费金额 M、生命周期 L、消费频次 F 均为三类中最高,R 值偏小,用户近期保持活跃;
- 用户画像:平台忠实老用户,消费能力强、复购率高,是平台核心营收来源;
- 定位:重要保持型客户。
4.2 Cluster 0(红色):高风险沉睡流失用户
- 特征:R 值极大,平均长期未消费;历史消费金额中等,具备一定消费能力,但生命周期与消费频次偏低;
- 用户画像:曾经的优质用户,目前活跃度极低,处于流失边缘;
- 定位:重要挽留型客户。
4.3 Cluster 2(绿色):普通新用户 / 低价值用户
- 特征:L、F、M 整体偏低,R 值中等,近期有少量互动;
- 用户画像:以新注册用户、单次尝试性消费用户为主,粘性弱、消费潜力未挖掘;
- 定位:发展型潜力用户。
五、电商商业运营策略建议
5.1 针对核心 VIP 用户(Cluster 1)
- 提供专属权益:VIP 客服、积分加倍、生日专属福利,提升用户归属感;
- 新品优先体验:新品预售、限量商品优先开放给该群体;
- 流失监控:实时跟踪 R 指标变化,一旦出现长时间未消费,及时进行关怀触达。
5.2 针对沉睡流失用户(Cluster 0)
- 定向召回:推送大额专属优惠券、回归礼包,搭配情感化营销文案唤醒用户;
- 原因调研:抽样回访,梳理用户流失原因(服务、价格、竞品等),优化平台短板;
- 成本管控:若召回成本过高,可放弃部分重度流失用户,聚焦意向人群。
5.3 针对普通新用户(Cluster 2)
- 提升复购:推出新人二次购优惠、满减活动,引导用户多次下单;
- 增强粘性:引导关注公众号、加入用户社群,拉长用户生命周期;
- 交叉营销:根据首购商品推荐关联品类,挖掘消费潜力,尝试转化为核心用户。
六、项目总结
- 技术层面:完整实现了数据清洗→可视化分析→特征工程→标准化→K-Means 聚类全链路数据分析流程,掌握 LRFM 模型与无监督聚类在业务中的落地用法;
- 业务层面:通过数据量化用户价值,实现精细化用户分层,告别粗放式营销,为电商精准运营提供数据支撑;
- 拓展方向:可增加用户地域、商品品类特征做多维度聚类,也可结合分类算法构建用户流失预测模型。
七、补充说明
- 代码基于 Jupyter Notebook 编写,直接复制即可运行,仅需修改 Excel 文件路径;
- Pyecharts 会生成 HTML 交互式图表,可单独打开查看细节;
- 该方案可直接复用在电商、零售、本地生活等行业的用户运营场景中。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)