在数据驱动的商业决策时代,​​掌握数据清洗与可视化技能​​已成为数据分析师的核心竞争力。本文将基于模拟电商销售数据集,完整还原从数据清洗到可视化分析的全流程,并分享实战中遇到的典型问题与解决方案。


一、问题背景与数据集说明

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 关键收获

  1. ​数据清洗占70%工作量​​:真实项目中数据清洗耗时远超分析本身
  2. ​可视化设计原则​​:
    • 清晰性:避免过度装饰
    • 准确性:坐标轴应从零开始
    • 一致性:相同变量保持统一编码
  3. ​交互式可视化价值​​:Plotly等工具可实现下钻分析,提升洞察深度

5.2 推荐学习路径

  1. ​Pandas核心技能​​:数据IO、分组聚合、时间序列
  2. ​Matplotlib/Seaborn基础​​:静态图表绘制
  3. ​Plotly交互可视化​​:动态图表与仪表板开发
  4. ​大数据可视化工具​​:Datashader、Vaex处理百万级数据集

​技术文档最佳实践​​:优质技术文档应包含可复现代码、清晰图表和常见问题解答


六、完整代码获取

访问项目仓库获取完整代码与数据集:

# 安装依赖
!pip install pandas matplotlib seaborn plotly datashader

# 克隆项目
!git clone https://github.com/example/ecommerce-sales-analysis.git

​推荐阅读​​:

  1. Pandas官方文档:数据清洗最佳实践
  2. Matplotlib可视化图库
  3. Plotly交互式可视化案例

通过本实战项目,我们不仅掌握了数据处理与可视化的核心技术,更培养了​​数据思维​​——从混杂数据中提取商业洞察的能力。在数据驱动的时代,这项技能将成为您的核心竞争力。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐