如今线上电商流量增长见顶,砸钱投放、全平台统一发券的粗放营销成本越来越高,转化效果却持续下滑。想要提升营收、降低运营损耗,核心思路只有一个:把钱花在对的用户身上

本文基于真实电商订单数据集order2021kmeans.xlsx,用 Python 完整复现「数据清洗→营收可视化探索→LRFM 特征构建→K-Means 用户聚类→人群分层运营方案」全流程,全程附带可直接运行代码,数据分析从业者、电商运营都能直接复用这套方案。

一、项目整体流程与技术栈

1. 数据源说明

数据集order2021kmeans.xlsx为电商真实订单明细,核心字段:

  • 用户标识:用户名
  • 交易信息:订单号、付款时间、付款金额、是否退款
  • 渠道信息:渠道编号

2. 依赖工具库

python

运行

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from pyecharts.charts import Line, Pie, Radar
from pyecharts import options as opts
from sklearn.preprocessing import MinMaxScaler
from sklearn.cluster import KMeans
import warnings
warnings.filterwarnings('ignore')

# 解决matplotlib中文乱码
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False

3. 整体分析链路

数据加载清洗 → 营收多维度可视化(渠道 / 月份 / 时段 / 退款) → LRFM 用户特征构建 → 数据标准化 → K-Means 聚类分群 → 结果可视化 + 用户分层运营策略

二、第一步:数据预处理,清洗脏数据

原始数据存在异常付款金额、缺失渠道、时间字段为文本等问题,先完成基础清洗:

python

运行

# 读取Excel订单数据
df = pd.read_excel("order2021kmeans.xlsx")

# 1. 时间字段转为datetime格式,用于提取月份、小时、间隔
df['付款时间'] = pd.to_datetime(df['付款时间'])

# 2. 处理异常:付款金额负数修正
df['付款金额'] = df['付款金额'].abs()

# 3. 删除渠道编号缺失的无效数据
df = df.dropna(subset=['渠道编号'])

# 4. 复制数据副本,避免SettingWithCopyWarning
data = df.copy()

三、第二步:营收可视化探索,看懂平台经营现状

在做用户分层前,先从宏观维度摸清平台营收、退款规律,定位业务问题。

1. 各渠道营收柱状图

统计各渠道总付款金额,直观区分优质引流渠道与低效渠道:

python

运行

# 按渠道汇总收益
channel_revenue=df.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()

2. 月度总收益柱状图

提取付款月份,分析全年营收淡旺季,指导大促、备货节奏:

python

运行

df['月份']=df['付款时间'].dt.month
month_revenue=df.groupby('月份')['付款金额'].sum().reset_index()

plt.figure(figsize=(10,8))
plt.bar(month_revenue['月份'],month_revenue['付款金额'])
plt.xticks(range(1,13))
plt.title('按月份划分的收益')
plt.xlabel('月份')
plt.ylabel('收益')
plt.show()

3. 分时段、分星期收益折线图(仅统计有效成交订单)

过滤退款订单,拆分星期 + 小时维度,找到用户集中下单高峰,用于广告投放、优惠券定时推送:

python

运行

# 筛选非退款有效订单
data=df.loc[df['是否退款']=='否']
# 提取时间特征
data['付款小时'] =data['付款时间'].dt.hour
data['付款天数名称'] = data['付款时间'].dt.day_name()

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

# pyecharts绘制多折线图
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=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[i],split_dfs[i]['TotalValue'].tolist(),label_opts=opts.LabelOpts(is_show=False))
line.render_notebook()

4. 附加题:月度退款金额折线图

单独筛选退款订单,统计每月退款总额,结合营收计算退款率,定位售后、品控问题高发月份:

python

运行

# 筛选退款订单
refund_data = df.loc[df['是否退款'] == '是']
# 按月汇总退款金额
month_refund = refund_data.groupby('月份')['付款金额'].sum().reset_index()

plt.figure(figsize=(10, 8))
plt.plot(month_refund['月份'], month_refund['付款金额'], marker='o', linewidth=2, color='#c82423')
plt.xticks(range(1, 13))
plt.title('各月份退款总金额走势')
plt.xlabel('月份')
plt.ylabel('退款总金额')
plt.grid(alpha=0.3)
plt.show()

四、第三步:核心特征工程 —— 构建 LRFM 用户价值指标

传统 RFM 模型只看消费频次、金额、活跃度,本次增加L 客户生命周期,四维指标完整刻画用户价值:

  • L(生命周期):用户首次到末次消费间隔天数,衡量用户忠诚度
  • R(最近消费间隔):距离最后一次下单的天数,越小越活跃
  • F(消费频率):用户总下单次数
  • M(消费金额):用户累计消费总额

python

运行

# 1. 计算L:用户生命周期
L = (data.groupby('用户名')['付款时间'].max() - data.groupby('用户名')['付款时间'].min()).dt.days.reset_index()
L.columns = ['用户名','L']

# 2. 计算R:最近消费间隔
max_date = max(data['付款时间'])
data['diff']= max_date - data['付款时间']
data['diff']=data['diff'].dt.days
R = data.groupby('用户名')['diff'].min().reset_index()
R.columns = ['用户名','R']

# 3. 计算F:下单频次
F = data.groupby('用户名')['订单号'].count().reset_index()
F.columns = ['用户名','F']

# 4. 计算M:总消费金额
M = data.groupby('用户名')['付款金额'].sum().reset_index()
M.columns = ['用户名','M']

# 合并四维特征,得到用户画像表
LRFMdata = L.merge(R,on='用户名').merge(F,on='用户名').merge(M,on='用户名')

五、第四步:数据标准化 + K-Means 聚类分群

L/R/F/M 指标单位、数值量级差异巨大,必须标准化后再聚类,否则数值大的天数指标会主导分类结果。

1. 特征标准化

python

运行

model_data = LRFMdata.copy()
# 提取4个数值特征
scale_matrix = model_data[['L','R','F','M']]
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(scale_matrix)

2. 肘部法则确定最优聚类数 K

通过 SSE 误差平方和找到曲线拐点,确定最佳用户分群数量:

python

运行

SSE = []
for k in range(1,10):
    kmeans = KMeans(n_clusters = k,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,因此将用户划分为 3 类。

3. 训练 K-Means 模型,给用户打上人群标签

python

运行

# 训练模型
kmeans_model = KMeans(n_clusters=3,random_state=10)
cluster_labels = kmeans_model.fit_predict(data_scaled)

# 把聚类标签合并到用户LRFM表
label_df = pd.DataFrame({"Cluster_Id":cluster_labels})
merge_data = pd.concat([model_data,label_df],axis=1)

六、第五步:聚类结果可视化,解读三类用户画像

1. 用户群体占比饼图

直观查看平台三类用户的人数分布:

python

运行

# 统计每类用户均值与数量
group_mean = merge_data.groupby('Cluster_Id')[['L','R','F','M']].mean().reset_index()
group_count = merge_data['Cluster_Id'].value_counts().reset_index()
group_count.columns = ['Cluster_Id','count']
group_info = group_mean.merge(group_count,on='Cluster_Id')

# 绘制饼图
pie_data = [(f"人群{i}",group_info.loc[i,'count']) for i in range(3)]
pie = (
    Pie()
    .add("用户群体分布",pie_data,radius=["35%","50%"])
    .set_global_opts(title_opts=opts.TitleOpts(title="三类用户人数占比"))
)
pie.render_notebook()

2. LRFM 雷达图,横向对比人群特征

雷达图是用户分层最直观的可视化方式,一眼看清三类用户在生命周期、活跃度、频次、消费金额上的差异:

python

运行

# 构建雷达图指标
indicators = [
    opts.RadarIndicatorItem(name="生命周期L",max_=group_mean['L'].max()*1.1),
    opts.RadarIndicatorItem(name="间隔R",max_=group_mean['R'].max()*1.1),
    opts.RadarIndicatorItem(name="频次F",max_=group_mean['F'].max()*1.1),
    opts.RadarIndicatorItem(name="消费M",max_=group_mean['M'].max()*1.1),
]

# 提取三类用户指标
c0 = group_mean[group_mean['Cluster_Id']==0][['L','R','F','M']].values[0].tolist()
c1 = group_mean[group_mean['Cluster_Id']==1][['L','R','F','M']].values[0].tolist()
c2 = group_mean[group_mean['Cluster_Id']==2][['L','R','F','M']].values[0].tolist()

radar = (
    Radar(init_opts=opts.InitOpts(width="800px",height="600px"))
    .add_schema(schema=indicators)
    .add("沉睡流失用户",[c0],color="#e63946")
    .add("核心高价值VIP",[c1],color="#457b9d")
    .add("潜力新用户",[c2],color="#2a9d8f")
    .set_global_opts(title_opts=opts.TitleOpts(title="三类用户LRFM特征雷达图"))
)
radar.render("用户分群雷达图.html")

七、三类用户精准运营策略(落地可直接使用)

人群 1:核心高价值 VIP 用户(Cluster1)

特征:L、F、M 四项指标全平台最高,R 数值偏低,用户入驻久、复购稳定、消费能力强,近期仍活跃,平台营收支柱。 运营方案

  1. 专属会员权益:生日大额券、专属客服、新品优先购、限量款定向邀约;
  2. 流失实时预警:一旦 R 值持续变大(长时间不下单),立刻推送一对一福利召回;
  3. 深挖消费潜力:定期推送高端套餐、搭配商品,提升客单价。

人群 2:沉睡流失高风险用户(Cluster0)

特征:R 数值极大,长期无下单;历史消费金额中等,曾经有消费能力,但生命周期短、复购少。 运营方案

  1. 定向召回:发放回归专属大额优惠券、限时满减礼包,唤醒沉睡客户;
  2. 流失调研:抽取样本问卷,明确流失原因(价格、物流、竞品、售后),反向优化平台短板;
  3. 成本分层:对多次召回无响应用户,减少营销投放,把预算倾斜给潜力用户。

人群 3:普通潜力新用户(Cluster2)

特征:L、F、M 全部偏低,R 中等;多为近期注册新用户,仅少量下单,成长空间大。 运营方案

  1. 提升复购:新客二单立减、多件折扣,引导完成第二次、第三次下单;
  2. 增强粘性:引导加入会员社群、关注公众号,推送种草内容;
  3. 交叉推荐:根据首次购买商品推送配套周边,逐步培养消费习惯,向 VIP 用户转化。

八、项目总结与拓展方向

1. 项目价值

这套 LRFM+K-Means 用户分层方案打通了「数据→用户画像→运营动作」完整链路,不再靠经验拍脑袋做营销:

  1. 宏观营收可视化快速定位渠道、时段、月度业务问题;
  2. LRFM 四维指标比传统 RFM 更全面衡量用户忠诚度与价值;
  3. 无监督聚类自动完成用户分群,替代人工筛选,效率更高;
  4. 分层运营能精准分配营销预算,降低获客成本、提升留存与营收。

2. 后续优化拓展

  1. 模型优化:给 L/R/F/M 设置业务权重,贴合平台运营侧重;对比 DBSCAN、层次聚类,择优选择分群算法;
  2. 自动化报表:搭建定时脚本,每月自动更新用户分层数据,输出运营看板;
  3. 场景复用:该逻辑可直接迁移到线下零售、餐饮、线上教育等所有有交易订单的行业。

结尾

在数字化运营时代,数据从来不是一堆冰冷的数字,而是读懂用户、实现增长的核心武器。不管是数据分析新手,还是电商运营从业者,这套完整实战代码和分析思路都可以直接落地复用,真正实现精细化用户运营。

更多推荐