题目
电商销售数据清洗与分析
信息
- 类型:问答
- 难度:⭐⭐
考点
缺失值处理,异常值检测,分组聚合,条件筛选,数据可视化
快速回答
解决该问题的核心步骤:
- 使用
pd.read_csv()加载数据并检查缺失值 - 对
category列缺失值用'Unknown'填充 - 通过分位数法检测
sales_amount异常值:Q1 = df['sales_amount'].quantile(0.25),Q3 = df['sales_amount'].quantile(0.75) - 用中位数替换异常值:
df.loc[outliers, 'sales_amount'] = median_val - 分组计算平均销售额:
df.groupby('category')['sales_amount'].mean() - 使用
matplotlib绘制柱状图展示结果
问题场景
给定电商销售数据(sales_data.csv),包含字段:order_id, product_name, category, sales_amount, order_date。数据存在以下问题:
1. category列有缺失值
2. sales_amount存在异常负值和极大值
需要:
• 清洗数据并处理异常
• 计算各产品类别的平均销售额
• 可视化展示结果
解决方案
1. 数据加载与探索
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv('sales_data.csv')
print(df.info()) # 检查缺失值和数据类型
print(df.describe()) # 数值分布统计2. 缺失值处理
原理:分类变量缺失适合用占位符填充
代码:
df['category'] = df['category'].fillna('Unknown') # 保留记录不删除3. 异常值检测与处理
原理:使用IQR(四分位距)法识别异常值
计算逻辑:
• Q1 = 25%分位数, Q3 = 75%分位数
• IQR = Q3 - Q1
• 异常值边界: [Q1 - 1.5*IQR, Q3 + 1.5*IQR]
代码:
q1 = df['sales_amount'].quantile(0.25)
q3 = df['sales_amount'].quantile(0.75)
iqr = q3 - q1
lower_bound = q1 - 1.5*iqr
upper_bound = q3 + 1.5*iqr
# 标识异常值
outliers = (df['sales_amount'] < lower_bound) | (df['sales_amount'] > upper_bound)
# 用中位数替换(避免均值受异常值影响)
median_val = df['sales_amount'].median()
df.loc[outliers, 'sales_amount'] = median_val4. 分组聚合分析
category_sales = df.groupby('category')['sales_amount'].mean().sort_values(ascending=False)
print(category_sales)5. 数据可视化
plt.figure(figsize=(10,6))
category_sales.plot(kind='bar', color='skyblue')
plt.title('Average Sales by Category')
plt.xlabel('Product Category')
plt.ylabel('Average Sales Amount')
plt.xticks(rotation=45)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()最佳实践
- 异常值处理:优先业务判断,技术手段需结合领域知识
- 缺失值填充:分类变量用占位符,连续变量考虑中位数/众数
- 内存优化:大数据集使用
category数据类型:df['category'] = df['category'].astype('category')
常见错误
- 直接删除缺失值导致样本偏差
- 用均值替换异常值(易被极端值扭曲)
- 未排序直接可视化(降低可读性)
- 忽略负销售额的业务含义(可能是退货)
扩展知识
- 高级异常检测:Z-score方法、孤立森林算法
- 缺失值处理:多重插补法(
IterativeImputer) - 分组增强:
groupby+agg多指标计算:df.groupby('category').agg( avg_sales=('sales_amount','mean'), total_orders=('order_id','count') ) - 可视化优化:使用
seaborn库增强图表专业性