一、项目简介

1.1 项目背景

在电商行业精细化运营时代,依靠传统经验划分用户已经无法满足精准营销、客户留存、流失预警等业务需求。本次项目基于真实电商订单数据,使用 Python 完成数据清洗、探索性数据分析、多维度可视化、LRFM 指标构建、KMeans 聚类用户分群全流程实战,结合渠道收益、月度营收、小时客流、月度退款等业务指标综合分析,最终完成用户分层并输出可落地的运营建议,适合数据分析初学者、Python 学习者、电商运营人员参考学习。

1.2 技术栈与工具

  • 开发环境:Jupyter Notebook
  • 核心库:pandas(数据处理)、matplotlib(基础可视化)、pyecharts(交互式图表)、scikit-learn(数据标准化、KMeans 聚类)
  • 分析模型:LRFM 客户价值模型 + KMeans 无监督聚类算法

1.3 分析目标

  1. 对电商订单数据进行清洗、去重、缺失值、异常值处理,保障数据质量;
  2. 多维度探索业务数据:渠道收益、月度营收、分时营收、月度退款走势;
  3. 构建 LRFM 客户价值四维度指标,量化用户消费行为;
  4. 使用手肘法确定最优聚类数,基于 KMeans 完成用户分群;
  5. 结合饼图、雷达图可视化分群结果,解读不同用户群体特征并给出运营策略。

二、数据说明

2.1 数据源

数据集为 order2021kmeans.xlsx 电商订单数据,共 104557 条有效订单记录,包含 11 个核心字段:

表格

字段名称 字段说明 数据类型
订单顺序编号 订单自增 ID 整型
订单号 唯一订单标识 字符串
用户名 用户唯一标识 字符串
商品编号 下单商品编码 字符串
订单金额 商品原始金额 浮点型
付款金额 用户实际支付金额 浮点型
渠道编号 下单渠道 字符串
平台类型 微信公众号 / APP 等 字符串
下单时间 用户提交订单时间 时间格式
付款时间 用户完成支付时间 时间格式
是否退款 订单是否发生退款 字符串(是 / 否)

2.2 LRFM 指标定义

本项目采用LRFM 模型刻画用户全生命周期消费特征,四个指标释义如下:

  1. L(Length,用户生命周期长度):用户首次消费到最后一次消费的时间跨度(天),衡量用户与平台绑定时长;
  2. R(Recency,最近消费间隔):用户最后一次消费距离数据集最晚日期的天数,数值越小代表用户越活跃;
  3. F(Frequency,消费频次):用户累计下单次数,反映用户复购能力;
  4. M(Monetary,消费金额):用户累计实际支付总金额,代表用户商业价值。

三、完整代码实现(分步解析)

3.1 环境配置与库导入

首先安装依赖库,统一设置中文显示(解决 Matplotlib 中文乱码、负号显示异常问题)。

python

运行

# 安装pyecharts(国内清华镜像,加速下载)
!pip install pyecharts -i https://pypi.tuna.tsinghua.edu.cn/simple

# 导入所有依赖库
import pandas as pd
import numpy as np
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')
# 设置Matplotlib中文
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False

3.2 数据读取与基础探索

读取 Excel 订单数据,查看数据前 5 行、数据结构、描述性统计,初步掌握数据全貌。

python

运行

# 读取订单数据
df = pd.read_excel('order2021kmeans.xlsx')
# 查看前5行数据
df.head()
# 查看数据类型、缺失值、行数等基础信息
df.info()
# 数值型字段描述性统计(均值、极值、分位数)
df.describe()

运行结果解读

  1. 数据集共 104557 条记录、11 个字段;仅渠道编号存在少量缺失值;
  2. 下单时间付款时间已自动识别为时间格式,无需二次转换;
  3. 付款金额最小值为负数,属于异常值,后续需要处理。

3.3 数据预处理(清洗核心步骤)

数据清洗是数据分析的基础,依次完成去重、异常值处理、缺失值删除

python

运行

# 1. 重复值检测:统计重复行数
print("重复数据行数:", df.duplicated().sum())

# 2. 异常值处理:付款金额存在负数(退款/异常扣款),取绝对值修正
df['付款金额'] = df['付款金额'].abs()

# 3. 缺失值处理:统计缺失值并直接删除缺失行
print("各字段缺失值数量:\n", df.isnull().sum())
df.dropna(inplace=True)

3.4 多维度业务可视化分析

渠道、月份、小时、退款四个维度做业务可视化,挖掘平台营收规律。

3.4.1 按渠道划分收益(柱状图 + 饼图)

统计各渠道总付款金额,分析核心营收渠道。

python

运行

# 按渠道分组,汇总付款金额并降序排序
channel_revenue = df.groupby('渠道编号')['付款金额'].sum().sort_values(ascending=False)

# 绘制Matplotlib柱状图
plt.figure(figsize=(10,8))
channel_revenue.plot(kind='bar')
plt.xticks(rotation=45)
plt.xlabel('渠道编号')
plt.ylabel('总收益')
plt.title('按渠道划分的收益')
plt.show()

# 绘制pyecharts交互式饼图
data_pie = [list(z) for z in zip(channel_revenue.index, channel_revenue.values)]
pie = (
    Pie()
    .add('渠道收益', data_pie, rosetype='radius', radius=["20%","60%"])
    .set_global_opts(title_opts=opts.TitleOpts(title='按渠道划分的收益占比'))
)
pie.render_notebook()
3.4.2 按月份划分整体收益(折线图)

提取付款月份,分析全年营收走势。

python

运行

# 提取付款时间的月份
df['月份'] = df['付款时间'].dt.month
# 按月汇总收益
month_revenue = df.groupby('月份')['付款金额'].sum().reset_index()

# 绘制月度收益折线图
plt.figure(figsize=(10,8))
plt.plot(month_revenue['月份'], month_revenue['付款金额'])
plt.xticks(range(1,13))  # 强制显示1-12月刻度
plt.title('按月份划分的收益')
plt.xlabel('月份')
plt.ylabel('总收益')
plt.show()
3.4.3 按日期 + 小时划分分时收益

拆分星期、小时、日期,分析用户下单支付高峰时段。

python

运行

# 筛选正常订单(排除退款订单)
data = df.loc[df['是否退款'] == '否']
# 提取小时、日期、星期名称
data['付款小时'] = data['付款时间'].dt.hour
data['付款天数'] = data['付款时间'].dt.day
data['付款天数名称'] = data['付款时间'].dt.day_name()

# 按星期+小时分组汇总收益
hourly_sales = data.groupby(['付款天数名称','付款小时'])['付款金额'].sum().reset_index()
hourly_sales = hourly_sales.rename(columns={'付款金额': 'TotalValue'})

# 按24小时为一组切分数据
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)

# 绘制多折线分时收益图
name_list = hourly_sales['付款天数名称'].unique()
line = (
    Line()
    .add_xaxis(split_dfs[0]['付款小时'].astype(str).tolist())
    .set_global_opts(
        title_opts=opts.TitleOpts(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.4 附加题:月度退款金额分析(折线图)

单独提取退款订单,分析全年退款走势,辅助风险管控。

python

运行

# 提取付款月份
df['月份'] = df['付款时间'].dt.month
# 筛选退款订单
data_refund = df.loc[df['是否退款'] == '是']
# 按月汇总退款金额
refund = data_refund.groupby('月份')['付款金额'].sum()

# 绘制月度退款折线图
refund.plot(kind='line', title='每个月份退款金额')
plt.show()

3.5 构建 LRFM 用户指标体系

基于用户维度,计算 L、R、F、M 四大核心指标,形成用户画像数据集。

python

运行

# 重新读取原始数据(保证数据完整性)
data = pd.read_excel("order2021kmeans.xlsx")

# 1. 计算L:用户生命周期长度(最后付款时间 - 首次付款时间,单位:天)
L = (data.groupby('用户名')['付款时间'].max() - data.groupby('用户名')['付款时间'].min()).dt.days.reset_index()

# 2. 计算R:最近消费间隔(距离数据集最晚日期的天数)
data['付款时间'] = pd.to_datetime(data['付款时间'])
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()

# 合并四大指标为LRFM数据集
LRFMdata = L.merge(R, on='用户名').merge(F, on='用户名').merge(M, on='用户名')
# 重命名列名
LRFMdata.columns = ['用户名','L','R','F','M']
# 查看LRFM数据
LRFMdata.head()

3.6 数据标准化 + 手肘法确定 K 值

LRFM 各指标数值量级差异大,需做最大最小值标准化;使用手肘法选择 KMeans 最优聚类数。

python

运行

from sklearn.preprocessing import MinMaxScaler
from sklearn.cluster import KMeans

# 备份数据,提取待标准化特征列(L/R/F/M)
model_data = LRFMdata.copy()
scale_matrix = model_data.iloc[:, 1:5]

# 最大最小值标准化
model_scaler = MinMaxScaler()
data_scaled = model_scaler.fit_transform(scale_matrix)
print("标准化后数据:\n", data_scaled.round(3))

# 手肘法:遍历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_)

# 绘制手肘图,确定最优K值
plt.plot(range(1,10), SSE, marker = 'o')
plt.title('手肘法确定聚类K值')
plt.xlabel('聚类数量K')
plt.ylabel('SSE误差平方和')
plt.show()

结论:手肘图拐点出现在 K=3,因此本次选择 3 个用户分群

3.7 KMeans 聚类 + 分群统计

基于最优 K 值完成聚类,将分群标签合并至原数据,统计每个群体的指标均值与人数。

python

运行

# 构建KMeans模型,聚类数K=3
n_clusters = 3
model_kmeans = KMeans(n_clusters=n_clusters)
cluster_labels_k = model_kmeans.fit_predict(data_scaled)

# 将聚类标签转为DataFrame并合并到原始数据
cluster_labels = pd.DataFrame(cluster_labels_k, columns=['Cluster_Id'])
merge_data = pd.concat((model_data, cluster_labels), axis=1)

# 筛选LRFM+分群标签列
merged_lrfm = merge_data[['M', 'F', 'R', 'L', 'Cluster_Id']]
# 统计每个分群LRFM指标均值
mean_lrfm = merged_lrfm.groupby('Cluster_Id').mean().reset_index()
# 统计每个分群用户数量(保证顺序匹配)
mean_lrfm['count'] = merged_lrfm['Cluster_Id'].value_counts().sort_index().values
# 查看分群统计结果
print("各用户分群指标均值&人数:\n", mean_lrfm)

3.8 可视化用户分群(雷达图)

使用 pyecharts 绘制雷达图,直观对比 3 类用户的 LRFM 特征差异。

python

运行

from pyecharts import options as opts
from pyecharts.charts import Radar

# 定义雷达图维度
dims = ['M', 'F', 'R', 'L']
indicators = []
# 自动计算每个维度最大值(预留10%边距)
for dim in dims:
    max_val = mean_lrfm[dim].max() * 1.1
    indicators.append(opts.RadarIndicatorItem(name=dim, max_=max_val))

# 提取3个分群的数据
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()
    .add_schema(schema=indicators)
    .add("Cluster 0", [cluster_0_data], color="#FF0000")
    .add("Cluster 1", [cluster_1_data], color="#0000FF")
    .add("Cluster 2", [cluster_2_data], color="#008000")
    .set_global_opts(title_opts=opts.TitleOpts(title="用户分群特征雷达图"))
)
# 渲染为HTML文件,同时在Notebook展示
c.render("radar_chart.html")
c.render_notebook()

四、结果分析与业务解读

4.1 整体业务分析结论

  1. 渠道维度:头部渠道贡献绝大部分营收,可加大核心渠道运营投入,对低收益渠道做优化或淘汰;
  2. 时间维度:平台营收存在明显月度周期,可在营收低谷期策划促销活动提升 GMV;支付高峰集中在固定时段,可选择高峰时段推送营销消息;
  3. 退款维度:全年退款金额走势平稳,无集中退款风险,平台订单履约整体稳定。

4.2 三类用户分群特征与运营策略

结合 LRFM 指标 + 雷达图,将 3 类用户划分为不同价值层级,针对性制定策略:

  1. Cluster 0(高价值核心用户)

    • 特征:L(生命周期长)、F(频次高)、M(金额高)、R(间隔短),平台忠实高消费用户;
    • 运营策略:重点维护留存,发放专属会员权益、大额优惠券、新品优先购权限,搭建会员体系锁定核心用户。
  2. Cluster 1(潜力活跃用户)

    • 特征:近期消费活跃(R 值低),生命周期与消费金额中等,复购意愿较强;
    • 运营策略:转化提升,推送爆款商品、满减活动,引导提升客单价与消费频次,转化为核心用户。
  3. Cluster 2(低价值沉睡用户)

    • 特征:R值极高(长期未消费)、消费频次与金额偏低,属于流失 / 低活跃用户;
    • 运营策略:唤醒召回,定向推送专属唤醒优惠券、老用户回归福利;若多次召回无响应,可减少营销资源投入。

五、项目总结与拓展方向

5.1 项目总结

本项目完整复现了电商订单数据分析 + LRFM 用户分群工业级流程,从原始脏数据出发,完成清洗、探索、指标构建、聚类建模、可视化、业务解读全链路。核心亮点:

  1. 适配真实千万级订单数据,数据清洗逻辑可直接应用于企业业务;
  2. 结合传统业务报表与机器学习聚类,实现 “描述分析 + 挖掘分析” 结合;
  3. 所有代码注释完整,新手可直接复制运行,学习门槛低。

5.2 拓展优化方向

  1. 模型优化:引入轮廓系数辅助选择 K 值,提升聚类精度;尝试 DBSCAN、层次聚类等算法对比效果;
  2. 指标优化:在 LRFM 基础上增加商品偏好、客单价等维度,构建更精细的用户画像;
  3. 自动化:将代码封装为函数,实现定时自动分析、自动生成分析报告;
  4. 落地对接:将分群结果对接营销系统,实现自动化精准推送。

六、常见问题解决

  1. Matplotlib 中文乱码:代码中已配置SimHei黑体,Windows 系统直接生效;Linux/Mac 需替换对应中文字体;
  2. pyecharts 图表不显示:Jupyter 中必须使用render_notebook(),仅render()只会生成 HTML 文件;
  3. KMeans 聚类结果不一致:添加random_state固定随机种子,保证结果可复现;
  4. 数据量过大运行卡顿:对千万级数据可采用分块读取、抽样分析优化性能。

标签:Python数据分析 电商分析 KMeans聚类 LRFM模型 用户分群 pandas实战 数据可视化 分类:Python实战 | 机器学习 | 数据分析

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐