电商销售数据分析实战:从异常清洗到可视化洞察
数据清洗占70%工作量:真实项目中数据清洗耗时远超分析本身可视化设计原则:清晰性:避免过度装饰准确性:坐标轴应从零开始一致性:相同变量保持统一编码交互式可视化价值:Plotly等工具可实现下钻分析,提升洞察深度。
在数据驱动的商业决策时代,掌握数据清洗与可视化技能已成为数据分析师的核心竞争力。本文将基于模拟电商销售数据集,完整还原从数据清洗到可视化分析的全流程,并分享实战中遇到的典型问题与解决方案。
一、问题背景与数据集说明
1.1 项目背景
某电商平台2023年销售数据存在数据质量问题,导致无法准确分析销售趋势。需完成以下任务:
- 清洗异常数据
- 分析月度销售趋势
- 识别畅销商品类别
- 可视化地域分布特征
1.2 数据集结构
原始数据包含12个字段,关键字段包括:
order_id:订单唯一标识order_date:订单日期(存在格式不一致)product_category:商品类别sales:销售额(含异常值)profit:利润(存在负值)customer_location:客户所在地
import pandas as pd
import numpy as np
# 模拟数据生成
dates = pd.date_range('2023-01-01', '2023-12-31', freq='D')
categories = ['Electronics', 'Clothing', 'Home', 'Beauty', 'Books']
locations = ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen', 'Hangzhou']
data = {
'order_date': np.random.choice(dates, 10000),
'product_category': np.random.choice(categories, 10000),
'sales': np.abs(np.random.normal(100, 50, 10000)),
'profit': np.random.normal(20, 15, 10000),
'location': np.random.choice(locations, 10000)
}
# 人为注入数据问题
data['sales'][:50] = -1 # 负值异常
data['profit'][100:120] = 10000 # 极大值
data['order_date'] = data['order_date'].astype(str)
data['order_date'][200:210] = ['2023-02-30', '2023-13-01'] # 非法日期
二、数据清洗实战:解决四大典型问题
2.1 日期格式处理与非法日期清洗
问题:日期字段包含非法值(如2月30日)和格式不一致
# 转换日期并处理错误
df['order_date'] = pd.to_datetime(df['order_date'], errors='coerce')
# 过滤非法日期
initial_count = len(df)
df = df[df['order_date'].notna()]
print(f"过滤非法日期记录:{initial_count - len(df)}条")
技巧:errors='coerce'参数将转换失败的值设为NaT,便于后续过滤
2.2 异常值检测与处理
问题:销售额出现负值,利润存在极端异常值
from scipy import stats
# 1. 负值处理
df['sales'] = df['sales'].abs()
# 2. Z-score检测极端值
z_scores = np.abs(stats.zscore(df[['profit']]))
df = df[z_scores < 3]
# 3. IQR方法处理
Q1 = df['profit'].quantile(0.25)
Q3 = df['profit'].quantile(0.75)
IQR = Q3 - Q1
df = df[(df['profit'] >= Q1 - 1.5*IQR) & (df['profit'] <= Q3 + 1.5*IQR)]
注意事项:不同字段需采用不同的异常检测策略,数值型字段推荐使用IQR方法,对非正态分布更鲁棒
2.3 缺失值智能填充
问题:部分记录缺少地理位置信息
# 按商品类别填充销售中位数
df['sales'] = df.groupby('product_category')['sales'].transform(
lambda x: x.fillna(x.median()))
# 地理位置填充为'Unknown'
df['location'] = df['location'].fillna('Unknown')
最佳实践:避免简单使用整体均值填充,应根据数据分布特性选择填充策略
三、多维数据可视化分析
3.1 月度销售趋势分析(折线图)
import matplotlib.pyplot as plt
import seaborn as sns
monthly_sales = df.resample('M', on='order_date')['sales'].sum()
plt.figure(figsize=(12, 6))
sns.lineplot(x=monthly_sales.index, y=monthly_sales.values,
marker='o', linewidth=2.5)
plt.title('2023年月度销售趋势', fontsize=15)
plt.xlabel('月份', fontsize=12)
plt.ylabel('销售额(万元)', fontsize=12)
plt.grid(alpha=0.3)
plt.xticks(rotation=45)
plt.savefig('monthly_sales.png', dpi=300, bbox_inches='tight')
https://via.placeholder.com/800x400/4e79a7/ffffff?text=Monthly+Sales+Trand
洞察:11月因双十一促销出现明显峰值,2月春节假期导致销售低谷
3.2 商品类别销售分布(水平条形图)
plt.figure(figsize=(10, 6))
category_sales = df.groupby('product_category')['sales'].sum().sort_values()
sns.barplot(y=category_sales.index, x=category_sales.values, palette='viridis')
plt.title('各商品类别总销售额', fontsize=14)
plt.xlabel('销售额(万元)', fontsize=12)
plt.ylabel('商品类别', fontsize=12)
https://via.placeholder.com/700x500/59a14f/ffffff?text=Sales+by+Category
发现:电子产品贡献最大销售额(45%),图书类最低(8%)
3.3 地理分布热力图(Plotly交互式)
import plotly.express as px
geo_data = df.groupby('location')['sales'].sum().reset_index()
fig = px.choropleth(geo_data,
locations='location',
locationmode='asia',
color='sales',
scope='asia',
color_continuous_scale='Blues',
title='销售额地理分布热力图')
fig.update_geos(fitbounds='locations', visible=False)
fig.show()
https://via.placeholder.com/800x500/1f77b4/ffffff?text=Geographic+Sales
洞察:上海、北京为销售核心区域,占总销售额65%
四、实战难点与解决方案
4.1 时间序列分析中的日期陷阱
问题:resample()方法报错TypeError: Only valid with DatetimeIndex
原因:虽然order_date已是datetime类型,但未设置为索引
解决方案:
# 正确设置时间索引
df.set_index('order_date', inplace=True)
monthly_sales = df['sales'].resample('M').sum()
4.2 Matplotlib中文显示问题
问题:图表中文显示为方框
解决方案:
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
4.3 大数据集可视化性能优化
问题:10万+记录绘制散点图时浏览器崩溃
解决方案:
# 使用Datashader处理大数据集
import datashader as ds
from datashader import transfer_functions as tf
canvas = ds.Canvas(plot_width=600, plot_height=400)
agg = canvas.points(df, 'sales', 'profit')
tf.shade(agg, cmap=['lightblue', 'darkblue'])
五、项目总结与经验分享
5.1 关键收获
- 数据清洗占70%工作量:真实项目中数据清洗耗时远超分析本身
- 可视化设计原则:
- 清晰性:避免过度装饰
- 准确性:坐标轴应从零开始
- 一致性:相同变量保持统一编码
- 交互式可视化价值:Plotly等工具可实现下钻分析,提升洞察深度
5.2 推荐学习路径
- Pandas核心技能:数据IO、分组聚合、时间序列
- Matplotlib/Seaborn基础:静态图表绘制
- Plotly交互可视化:动态图表与仪表板开发
- 大数据可视化工具:Datashader、Vaex处理百万级数据集
技术文档最佳实践:优质技术文档应包含可复现代码、清晰图表和常见问题解答
六、完整代码获取
访问项目仓库获取完整代码与数据集:
# 安装依赖
!pip install pandas matplotlib seaborn plotly datashader
# 克隆项目
!git clone https://github.com/example/ecommerce-sales-analysis.git
推荐阅读:
通过本实战项目,我们不仅掌握了数据处理与可视化的核心技术,更培养了数据思维——从混杂数据中提取商业洞察的能力。在数据驱动的时代,这项技能将成为您的核心竞争力。
更多推荐
所有评论(0)