在电商行业中,订单数据蕴含着丰富的业务信息,通过科学的分析方法可以帮助企业了解经营状况、优化运营策略。本文将以某电商平台订单数据为例,详细介绍从数据读取、预处理到多维度统计分析的完整流程,使用 Python 的 Pandas 和 Pyecharts 工具实现数据可视化,为业务决策提供数据支持。
一、案例背景与环境准备
1. 分析目标
本次分析旨在通过对电商订单数据的深度挖掘,实现以下目标:
- 掌握订单整体情况(订单量、成交额、退款率等核心指标)
- 分析不同订单类型的占比分布
- 了解各区域的订单分布特征
- 挖掘订单量随时间(日、小时)的变化规律
2. 环境配置
- 操作系统:Windows 10
- Python 版本:3.9 及以上
- 开发工具:Anaconda3、Jupyter Notebook
- 核心库:
- Pandas:数据读取与处理
- NumPy:数值计算支持
- Pyecharts:交互式数据可视化
3. 数据准备
本次分析使用的数据集为电商平台导出的订单数据(模拟数据,已脱敏),包含订单编号、买家信息、支付金额、订单时间、收货地址等 19 个字段。数据以 Excel 格式存储(文件名为TB_data.xlsx)。
安装必要库:
pip install pandas numpy openpyxl pyecharts |
二、数据读取与初步探查
1. 数据读取
使用 Pandas 的read_excel()函数读取数据,并查看前 5 条记录:
import pandas as pd import numpy as np from pyecharts import options as opts from pyecharts.charts import Pie, Line, Bar, Table # 读取数据 df = pd.read_excel('TB_data.xlsx') # 查看前5条数据,高亮缺失值 df.head(5).style.highlight_null() |
通过初步查看可以发现,数据中存在部分缺失值(如宝贝标题、订单付款时间等字段),后续需要进行处理。
2. 数据结构探查
使用info()方法查看数据类型和非空值情况:
df.info() |
输出结果显示:
- 数据集共 2660 条记录,19 个字段
- 存在缺失值的字段:宝贝标题、收货地址、是否手机订单、确认收货时间、订单付款时间
- 日期型字段(如订单创建时间)已正确识别为datetime64类型
三、数据预处理
数据预处理是保证分析结果准确性的关键步骤,主要包括缺失值处理和异常值清洗。
1. 缺失值分析
# 检查各字段是否存在缺失值 df.isnull().any() |
2. 异常值处理
根据业务逻辑,筛选有效订单数据:
- 排除订单付款时间为空的记录(未付款订单无分析意义)
- 排除宝贝标题为空的记录(商品信息缺失)
- 排除买家实际支付金额为 0 的记录(无效交易)
# 数据清洗 df1 = df[ df['订单付款时间'].notnull() & df['宝贝标题'].notnull() & (df['买家实际支付金额'] != 0) ] print(f"清洗后有效订单数:{df1.shape[0]}") |
3. 描述性统计分析
通过describe()函数获取数值型字段的统计特征:
df1.describe() |
关键结论:
- 买家实际支付金额均值为 155.11 元,中位数 62.86 元,说明订单金额分布偏右(存在大额订单)
- 宝贝总数量均值 1.48,中位数 1,表明多数订单为单件购买
- 退款金额均值 10.44 元,远低于支付金额,整体退款规模较小
四、多维度订单分析与可视化
1. 整体情况分析
统计核心经营指标,包括总订单数、成交额、退款率等:
# 计算核心指标 total_orders = df1['订单编号'].count() # 总订单数 total_amount = df1['总金额'].sum() # 总订单金额 completed_orders = df1[df1['订单状态'] == '交易成功']['订单编号'].count() # 已完成订单数 actual_revenue = df1['买家实际支付金额'].sum() # 实际收入 refund_orders = df1[df1['订单关闭原因'] == '退款']['订单编号'].count() # 退款订单数 refund_amount = df1['退款金额'].sum() # 总退款金额 unpaid_orders = df1[df1['订单关闭原因'] == '买家未付款']['订单编号'].count() # 未付款订单数 conversion_rate = completed_orders / total_orders # 成交率 refund_rate = refund_orders / total_orders # 退款率 # 可视化表格 table = Table() headers = ['总订单数', '总订单金额', '已完成订单数', '实际收入', '退款订单数', '总退款金额', '未付款订单数', '成交率', '退款率'] rows = [[ total_orders, f"{total_amount:.2f}", completed_orders, f"{actual_revenue:.2f}", refund_orders, f"{refund_amount:.2f}", unpaid_orders, f"{conversion_rate:.2%}", f"{refund_rate:.2%}" ]] table.add(headers, rows) table.set_global_opts(title_opts=opts.ComponentTitleOpts(title='整体情况分析')) table.render_notebook() |
分析结论:
- 成交率达 92.30%,运营效率较高
- 退款率 1.80%,处于健康水平
- 未付款订单 36 单,占比 1.77%,需优化支付流程减少流失
2. 按订单类型分析
统计手机订单与非手机订单的占比:
# 计算订单类型数量 mobile_orders = df1[df1['是否手机订单'] == '手机订单']['订单编号'].count() non_mobile_orders = total_orders - mobile_orders # 绘制饼图 pie = Pie() data = [('手机订单', mobile_orders), ('非手机订单', non_mobile_orders)] pie.add(series_name="订单类型", data_pair=data) pie.set_global_opts(title_opts=opts.TitleOpts(title="按订单类型分析", pos_left="center")) pie.set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:{d}%')) pie.render_notebook() |
分析结论:手机订单占比 68.77%,是非手机订单的 2.2 倍,表明移动端是主要交易渠道,需重点优化手机端用户体验。
3. 按区域分析订单分布
从收货地址中提取省份信息,统计各区域订单占比:
# 拆分收货地址提取省份 df2 = df1.copy() df2[['省', '市', '区']] = df2['收货地址'].str.split(' ', expand=True) region_orders = df2.groupby('省')['订单编号'].count().sort_values(ascending=False) # 绘制饼图 pie = Pie() data = [(k, v) for k, v in zip(region_orders.index, region_orders.values)] pie.add(series_name="区域订单量", data_pair=data) pie.set_global_opts(title_opts=opts.TitleOpts(title="按区域分析订单量", pos_left="center")) pie.set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:{d}%')) pie.render_notebook() |
分析结论:
- 广东省订单占比 15.53%,位居第一,是核心市场
- 江苏(8.45%)、浙江(6.16%)、上海(5.91%)等沿海省份订单占比高,与经济发达程度正相关
- 西藏、青海等偏远地区订单占比不足 0.5%,需评估物流成本与市场潜力
4. 每日订单量趋势分析
按日期统计订单量,观察时间分布规律:
# 提取日期并统计订单量 df3 = df1.copy() df3['日期'] = df3['订单付款时间'].dt.strftime('%Y-%m-%d') daily_orders = df3.groupby('日期')['订单编号'].count() # 绘制折线图 line = Line() line.add_xaxis(list(daily_orders.index)) line.add_yaxis("订单量", list(daily_orders.values)) line.set_global_opts( title_opts=opts.TitleOpts(title="每日订单量分析", pos_left="center"), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)) ) line.render_notebook() |
分析结论:订单量存在明显波动,2022-12-12(双十二)达到峰值,表明促销活动对订单量拉动显著。
5. 小时订单量分布分析
按小时统计订单量,挖掘用户活跃时段:
# 提取小时并统计订单量 df4 = df1.copy() df4['小时'] = df4['订单付款时间'].dt.strftime('%H') hourly_orders = df4.groupby('小时')['订单编号'].count() # 绘制柱状图 bar = Bar() bar.add_xaxis(list(hourly_orders.index)) bar.add_yaxis("订单量", list(hourly_orders.values)) bar.set_global_opts( title_opts=opts.TitleOpts(title="小时订单量分析", pos_left="center") ) bar.render_notebook() |
分析结论:
- 订单量在 19:00-21:00 达到高峰(180-210 单),是用户购物活跃时段
- 凌晨 00:00-06:00 订单量极少(不足 30 单),符合用户作息规律
- 可根据时段分布优化客服排班和活动推送时间
五、总结与建议
通过对电商订单数据的全流程分析,我们可以得出以下结论和业务建议:
- 渠道优化:移动端订单占比近 70%,需优先保障手机端页面加载速度和支付流程流畅性。
- 区域运营:重点维护广东、江苏等核心市场,针对低订单地区可尝试定向优惠券刺激消费。
- 促销策略:大促活动(如双十二)对订单量拉动显著,可规划更多节点促销,同时优化库存准备。
- 时段运营:晚间 19:00-21:00 是下单高峰,可在该时段加大广告投放和客服人力投入。
- 退款管理:整体退款率较低(1.8%),但需关注退款原因,针对性改进商品质量或物流服务。
通过持续的订单数据分析,企业可以动态调整运营策略,提升用户体验和经营效率。