Python 电商订单全流程数据分析:营收洞察 + 退款分析 + RFM+K-Means 用户分群实战
哈喽各位数据爱好者、Python 学习者!今天分享一套完整的电商订单数据分析综合实战项目,基于 10 万 + 真实订单数据,从数据加载、清洗、多维度营收可视化、退款分析,到经典LRFM 用户模型搭配K-Means 聚类完成用户分层,一站式走完商业数据分析全流程。新手可跟着代码复现,职场人也能借鉴思路落地业务分析,干货满满👇
一、项目背景与所用工具
本次分析依托电商订单数据集order2021kmeans.xlsx,数据集包含订单信息、用户、渠道、平台、时间、付款金额、是否退款等 11 个字段,总计 104557 条原始订单记录,覆盖全时段用户消费行为。
核心工具库
- 数据处理:
pandas、numpy - 可视化绘图:
matplotlib、pyecharts(交互式图表) - 机器学习聚类:
sklearn(K-Means、数据标准化) - 环境适配:统一中文显示、屏蔽运行警告
环境初始化代码
python
运行
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from pyecharts.charts import *
from pyecharts import options as opts
import warnings
warnings.filterwarnings('ignore') # 忽略警告信息
mpl.rcParams['font.sans-serif']=['SimHei'] # 解决matplotlib中文乱码
mpl.rcParams['axes.unicode_minus']=False # 解决负号显示异常
二、数据加载与预处理(数据分析基石)
原始数据存在空值、负金额异常值等问题,先完成数据探查与清洗,保障后续分析结果准确。
1. 加载数据并初步探查
python
运行
# 读取Excel订单数据
df=pd.read_excel('order2021kmeans.xlsx')
df.head()
# 查看数据基本信息:字段、数据类型、缺失值
df.info()
# 查看数值型字段统计描述(均值、极值、分位数)
df.describe()
数据概况:数据集共 104557 条记录,包含订单号、用户名、渠道编号、付款时间、付款金额、是否退款等字段;渠道编号存在少量缺失值,付款金额存在负数异常数据。
2. 数据清洗(去重、异常值、缺失值)
python
运行
# 1. 检查并去除重复值
df.duplicated().sum()
# df.drop_duplicates(inplace=True) # 本数据集无重复,无需执行
# 2. 处理付款金额负数异常值(取绝对值)
df['付款金额']=df['付款金额'].abs()
# 3. 删除缺失值
df.isnull().sum()
df.dropna(inplace=True)
清洗后数据规整,消除脏数据对分析结果的干扰。
三、多维度营收可视化分析
围绕渠道、月份、每日时段三大核心维度拆解营收分布,直观定位营收主力、消费高峰,为运营策略提供数据支撑。
1. 按渠道分析整体收益
渠道是电商流量与营收的核心入口,先统计各渠道总收益,分别用柱状图、饼图展示。
python
运行
# 按渠道分组汇总付款金额,并降序排序
channel_revenue=df.groupby('渠道编号')['付款金额'].sum().sort_values(ascending=False).reset_index()
# Matplotlib柱状图
plt.figure(figsize=(10,8))
plt.bar(channel_revenue['渠道编号'],channel_revenue['付款金额'])
plt.xticks(rotation=45)
plt.title('按渠道划分的收益')
plt.xlabel('渠道编号')
plt.ylabel('收益')
plt.show()
# Pyecharts玫瑰饼图(交互式)
data=[list(z) for z in zip(channel_revenue['渠道编号'],channel_revenue['付款金额'])]
pie=(
Pie()
.add('渠道收益',data,rosetype='radius',radius=["20%","60%"])
.set_global_opts(title_opts=opts.TitleOpts(title='按渠道划分的收益'))
)
pie.render_notebook()
分析结论:从图表可清晰看出各渠道营收差距,部分头部渠道贡献了主要营收,可针对性加大优质渠道投放,缩减低效渠道成本。
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
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=hourly_sales['付款天数名称'].unique()
line=(
Line()
.add_xaxis(split_dfs[0]['付款小时'].astype(str).tolist())
.set_global_opts(
title_opts={"text":"每日每小时收益总额"},
legend_opts=opts.LegendOpts(
is_show=True,
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()
四、月度退款数据分析
退款率是电商风控、商品品控的核心指标,单独提取退款订单,分析全年月度退款金额走势。
python
运行
# 提取月份
df['月份']=df['付款时间'].dt.month
# 筛选退款订单
data=df.loc[df['是否退款']=='是']
# 按月汇总退款金额
refund=data.groupby('月份')['付款金额'].sum()
# 绘制退款金额折线图
refund.plot(kind='line',title='每个月份退款金额')
plt.show()
业务参考:结合月度营收与月度退款数据,可对比 “高营收月份是否伴随高退款”,排查是否为活动促销引发售后问题,针对性优化商品与服务。
五、LRFM 模型 + K-Means 聚类:用户分层实战
营收分析完成后,进阶做用户画像与分群。本次采用LRFM 模型(延伸经典 RFM 模型)结合 K-Means 聚类算法,将用户划分为不同群体,实现精细化运营。
1. 概念科普
- L (最近消费间隔):用户两次消费的时间间隔;
- R (最近消费距今天数):用户最后一次消费距离数据截止日的天数;
- F (消费频率):用户总下单次数;
- M (消费总额):用户累计付款金额;
- K-Means 聚类:无监督机器学习算法,根据用户四维度特征自动分群,摆脱人工划分的主观性。
2. 构建 LRFM 指标表
python
运行
# 统一时间格式
data['付款时间']=pd.to_datetime(data['付款时间'])
max_date = max(data['付款时间'])
# 计算R指标:最近消费距今天数
data['diff']= max_date - data['付款时间']
data['diff']=data['diff'].dt.days
R = data.groupby('用户名')['diff'].min().reset_index()
# 计算F指标:消费频率(订单数)
F = data.groupby('用户名')['订单号'].count().reset_index()
# 计算M指标:累计消费金额
M = data.groupby('用户名')['付款金额'].sum().reset_index()
# 合并LRFM四大指标
LRFMdata = L.merge(R).merge(F).merge(M)
# 重命名列名
LRFMdata.columns=['用户名','L','R','F','M']
LRFMdata.head()
3. 数据标准化
LRFM 各指标数值量级差异大,需标准化处理,避免影响聚类效果:
python
运行
# 备份数据
model_data = LRFMdata.copy()
# 提取特征字段
sacle_matrix = model_data.iloc[:, 1:5]
# 最大最小值标准化
from sklearn.preprocessing import MinMaxScaler
model_scaler = MinMaxScaler()
data_scaled = model_scaler.fit_transform(sacle_matrix)
print(data_scaled.round(3))
4. 手肘法确定最佳聚类数
通过SSE 误差平方和(手肘法)判断最优 K 值:
python
运行
from sklearn.cluster import KMeans
SSE = []
# 遍历1-9个聚类,计算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.show()
根据手肘图拐点,本次确定聚类数 K=3。
5. 训练 K-Means 模型并完成用户分群
python
运行
# 训练聚类模型
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)
merge_data.head()
6. 聚类结果可视化与解读
(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
# 绘制人数占比饼图
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()
(2)用户特征雷达图(多维度对比群体差异)
python
运行
from pyecharts.charts import Radar
# 定义指标维度
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")
群体业务解读
结合 LRFM 均值与雷达图特征,可将三类用户定义为:
- 0 类群体:近期活跃、消费金额中等,平台核心普通用户,重点做留存运营;
- 1 类群体:消费距今时间久、活跃度低,属于沉睡用户,需策划召回活动;
- 2 类群体:消费频次高、客单价高,是平台高价值核心用户,可推出专属权益、会员体系深度维护。
六、项目总结与拓展方向
1. 项目整体复盘
本项目完整实现电商订单数据分析闭环:
- 数据层:完成 10 万 + 级订单数据清洗,处理空值、异常值,保证数据质量;
- 运营层:从渠道、月份、时段、退款四大维度拆解营收与售后问题,输出可落地的运营建议;
- 用户层:结合 LRFM 模型与 K-Means 机器学习算法完成用户分层,实现从 “整体营收” 到 “单个用户” 的精细化分析。
整套代码适配 Jupyter Notebook,交互式图表(pyecharts)支持鼠标悬浮查看详情,适合课程作业、企业数据分析复盘。
2. 进阶拓展方向
- 结合渠道 + 月份交叉分析,查看不同渠道在淡旺季的表现;
- 计算各渠道、各月份退款率(退款金额 / 总营收),定位高售后风险场景;
- 对分群用户做精准营销模拟,比如为高价值用户推送专属活动,为沉睡用户发放优惠券;
- 引入决策树、逻辑回归等算法,预测用户流失概率。
以上就是本次电商订单综合数据分析全流程啦!代码可直接复刻运行,无论是学习 Python 数据分析、可视化,还是入门用户分群、机器学习聚类,都是非常优质的实战案例。如果在复现过程中有代码报错、逻辑疑问,欢迎留言交流~
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)