Python电商数据分析实战
一、数据加载:先把数据读进来
1.1 导入必备库
import pandas as pd # 数据处理神器
import numpy as np # 数值计算库
1.2 读取数据
# 读取CSV文件,encoding='gbk'是因为数据文件是中文编码
data = pd.read_csv(r'C:\Users\EDY\Desktop\dataset.csv', encoding='gbk')
data.head() # 看前5行,了解数据结构
1.3 数据概览
data.shape # 看数据有多少行多少列
data.columns # 看所有列名
|
字段 |
说明 |
|---|---|
|
订单ID |
订单的唯一标识 |
|
订单日期 / 发货日期 |
时间相关 |
|
发货模式 |
Standard Class / Second Class / Same Day / First Class |
|
客户ID / 客户姓名 |
客户信息 |
|
客户类别 |
Consumer(消费者)/ Corporate(企业)/ Home Office(家庭办公) |
|
商店所属区域 |
APAC / EU / US / Africa / LATAM / Canada / EMEA |
|
产品类别 |
Office Supplies / Furniture / Technology |
|
售价 / 销售数量 / 折扣 / 利润 |
销售相关 |
|
发货成本 |
发货费用 |
|
订单优先级 |
Low / Medium / High / Critical |
二、数据清洗:脏数据得收拾干净
2.1 查看数据基本信息
data.info() # 查看每列有多少空值、是什么数据类型
2.2 日期处理
# 把字符串格式的日期转成真正的日期格式
data['订单日期'] = pd.to_datetime(data['订单日期'])
data['发货日期'] = pd.to_datetime(data['发货日期'])
# 计算发货用了多少秒(发货日期 - 订单日期)
data['发货秒数'] = (data['发货日期'] - data['订单日期']).dt.total_seconds()
# 检查有没有异常(发货秒数<0就是发货日期早于订单日期)
(data['发货秒数'] < 0).sum() # 查出来有4条异常
2.3 删除异常数据
# 删除发货日期早于订单日期的异常记录
data.drop(index=data[data['发货秒数'] < 0].index, inplace=True)
2.4 检查数值字段异常
# 检查售价、销售数量、发货成本有没有负数(异常)
data[data['售价'] < 0] # 没发现异常
data[data['销售数量'] < 0] # 没发现异常
data[data['发货成本'] < 0] # 没发现异常
2.5 处理折扣异常值
# 折扣>1是异常(正常折扣应该在0~1之间),查出13条
data[data['折扣'] > 1]
# 用mask把异常值标记为空
data['折扣'] = data['折扣'].mask(data['折扣'] > 1, None)
# 用平均值填充空值
data['折扣'] = data['折扣'].fillna(value=round(data['折扣'].mean(), 2))
2.6 处理发货模式的空值
# 发货模式有空值,看最常见的值是什么
data['发货模式'].mode() # 结果:Standard Class
# 用众数(出现最多的值)填充空值
data['发货模式'] = data['发货模式'].fillna(value=data['发货模式'].mode()[0])
2.7 删除无用列和处理重复值
# 邮编这列没什么用,删掉
data.drop(columns=['邮编'], inplace=True)
# 删除行编号的重复值
data.drop_duplicates('行编号', inplace=True)
2.8 从日期中提取年月日
# 从订单日期里提取年、月、季度
data['下订单年'] = data['订单日期'].dt.year
data['下订单月'] = data['订单日期'].dt.month
data['下订单季度'] = data['订单日期'].dt.to_period('Q')
data.head()
三、销售额分析:算算每年卖了多少
3.1 计算销售额
# 销售额 = 销售数量 × 售价
data['销售额'] = data['销售数量'] * data['售价']
3.2 按年汇总销售额
sales_year = data.groupby(by='下订单年')['销售额'].sum()
sales_year
|
年份 |
年销售额 |
|---|---|
|
2021 |
11,104,350 |
|
2022 |
12,883,920 |
|
2023 |
16,626,810 |
|
2024 |
20,886,140 |
3.3 计算年增长率
# 计算每年的增长率
sale_rate_22 = (sales_year[2022] / sales_year[2021] - 1)
sale_rate_23 = (sales_year[2023] / sales_year[2022] - 1)
sale_rate_24 = (sales_year[2024] / sales_year[2023] - 1)
# 整理成表格
sales_rate = pd.DataFrame({
"年销售额": sales_year.values.tolist(),
"年订单增长率": [0, sale_rate_22, sale_rate_23, sale_rate_24]
}, index=sales_year.index.tolist())
sales_rate
|
年份 |
年销售额 |
年订单增长率 |
|---|---|---|
|
2021 |
11,104,350 |
0% |
|
2022 |
12,883,920 |
16.03% |
|
2023 |
16,626,810 |
29.05% |
|
2024 |
20,886,140 |
25.62% |
3.4 柱状图+折线图可视化
from pyecharts.charts import *
import pyecharts.options as opts
x = [str(value) for value in sales_rate.index.tolist()]
y1 = [round(value, 2) for value in sales_rate['年销售额'].tolist()]
y2 = [round(value * 100, 2) for value in sales_rate['年订单增长率'].tolist()]
# 柱状图
bar = (
Bar()
.add_xaxis(x)
.add_yaxis("年销售额", y1)
.extend_axis(
yaxis=opts.AxisOpts(
name='增长率',
axislabel_opts=opts.LabelOpts(formatter="{value}%")
)
)
)
# 折线图
line = (
Line()
.add_xaxis(x)
.add_yaxis(
"年增长率", y2,
yaxis_index=1, # 使用右侧轴
linestyle_opts=opts.LineStyleOpts(width=3),
label_opts=opts.LabelOpts(formatter="{c}%"),
is_smooth=True # 平滑曲线
)
)
# 层叠在一起
bar.overlap(line).render_notebook()
结论: 2021-2023年增长率持续上升,2023-2024年略有下降,但整体销售额呈上升趋势!
四、地区分析:哪个地区卖得好
4.1 各地区总销售额
import plotly.express as px
sales_area = data.groupby('商店所属区域')['销售额'].sum().reset_index()
sales_area
|
地区 |
销售额 |
|---|---|
|
APAC |
18,227,620 |
|
EU |
14,698,560 |
|
US |
11,460,020 |
|
LATAM |
10,436,680 |
|
EMEA |
3,314,867 |
|
Africa |
3,126,195 |
|
Canada |
237,269 |
4.2 圆环图可视化
fig = px.pie(
sales_area,
values='销售额',
names='商店所属区域',
title='各分店总销售额情况',
hole=0.5, # 中间挖个洞变成圆环图
height=500
)
fig.show()
结论: APAC(亚太)销售额占比最大,其次是EU(欧洲)!
4.3 各地区历年销售额对比
# 透视表:按地区分组,按年份统计
sales_area2 = pd.pivot_table(
data,
index='商店所属区域',
columns='下订单年',
values='销售额',
aggfunc='sum'
)
# 把宽格式转成长格式(方便绑定不同颜色)
sales_area2 = sales_area2.reset_index().melt(
id_vars='商店所属区域',
var_name='年份',
value_name='销售额'
)
# 分组柱状图
fig = px.bar(
sales_area2,
x='商店所属区域',
y='销售额',
color='年份',
title='2021年-2024年不同地区的销售额情况',
barmode='group',
height=500
)
fig.show()
五、季节性分析:什么时候卖得好
5.1 按月汇总销售额
# 透视表:按月份分组,按年份统计
sales_year_month = pd.pivot_table(
data,
index='下订单月',
columns='下订单年',
values='销售额',
aggfunc='sum'
)
# 转成宽格式
sales_year_month = sales_year_month.reset_index().melt(
id_vars='下订单月',
var_name='年份',
value_name='销售额'
)
5.2 折线图看趋势
fig = px.line(
sales_year_month,
x='下订单月',
y='销售额',
color='年份',
title='2021年-2024年不同月份的销售额情况',
height=500
)
fig.show()
结论: 存在明显季节性规律!
旺季: 6月、9月、11月(销售额高)
淡季: 2月、4月(销售额低)
11月最高是因为双十一促销!
六、新增客户分析:每个月拉新多少
6.1 准备客户数据
data_customer = data.copy()
# 去重:同一个客户有多条记录,只保留第一条(最早购买记录)
data_customer = data_customer.drop_duplicates(subset=['客户ID'])
6.2 按月统计新增客户
customer_year_month = pd.pivot_table(
data_customer,
index='下订单月',
columns='下订单年',
values='客户ID',
aggfunc='count',
fill_value=0
)
|
月份 |
2021 |
2022 |
2023 |
2024 |
|---|---|---|---|---|
|
1月 |
197 |
25 |
5 |
3 |
|
2月 |
139 |
14 |
6 |
3 |
|
... |
... |
... |
... |
... |
七、总结
7.1 分析流程回顾
加载数据 → 数据清洗 → 销售额分析 → 地区分析 → 季节性分析 → 客户分析
7.2 关键发现
|
分析维度 |
关键发现 |
|---|---|
|
年度趋势 |
销售额持续增长,4年增长88% |
|
地区分布 |
亚太APAC占比最大,EU第二 |
|
季节性 |
6/9/11月是旺季,2/4月是淡季 |
|
客户 |
2021年新客户最多,之后逐渐减少 |
7.3 分析方法总结
|
技能 |
方法 |
|---|---|
|
数据清洗 |
异常值处理、空值填充、去重、日期提取 |
|
数据聚合 |
|
|
数据透视 |
|
|
宽转长 |
|
|
可视化 |
pyecharts做交互式图表,Plotly做快速探索 |
一句话总结: 电商数据分析的核心就是——搞清楚"什么时候"、"在哪里"、"卖给谁"卖了多少钱!
更多推荐



所有评论(0)