适合读者: 有 Python 基础,了解基本数据结构,想系统掌握数据分析流程的开发者。
前言
数据分析不只是”跑几行代码出个图”——它是一套有章可循的工作流。本文以一个真实场景为例:分析某电商平台的销售数据,带你走完从原始数据到洞察结论的完整链路。
涉及工具:
pandas—— 数据清洗与处理matplotlib/seaborn—— 数据可视化numpy—— 数值计算辅助
一、环境准备
pip install pandas matplotlib seaborn numpy
建议使用 Jupyter Notebook 或 VS Code + Jupyter 插件,方便逐步查看输出。
二、加载数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文字体(macOS 用 'Arial Unicode MS',Windows 用 'SimHei')
plt.rcParams['font.sans-serif'] = ['PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_csv('sales_data.csv')
print(df.shape) # 查看行列数
df.head() # 预览前5行
第一步永远是了解数据的”形状”,包括:
df.info() # 字段类型、非空数量
df.describe() # 数值列的统计摘要
三、数据清洗
真实数据往往存在缺失值、重复记录、异常值等问题,这一步至关重要。
3.1 处理缺失值
# 查看各列缺失情况
print(df.isnull().sum())
# 策略一:删除缺失超过 30% 的列
threshold = len(df) * 0.7
df = df.dropna(thresh=threshold, axis=1)
# 策略二:用中位数填充数值列
df['sales_amount'].fillna(df['sales_amount'].median(), inplace=True)
# 策略三:用众数填充分类列
df['category'].fillna(df['category'].mode()[0], inplace=True)
💡 Tips: 不要无脑
dropna(),先判断缺失的原因——是随机缺失还是系统性缺失,处理策略大不相同。
3.2 去重
print(f"重复行数:{df.duplicated().sum()}")
df = df.drop_duplicates()
3.3 处理异常值
# 用 IQR 方法识别异常值
Q1 = df['sales_amount'].quantile(0.25)
Q3 = df['sales_amount'].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outliers = df[(df['sales_amount'] < lower) | (df['sales_amount'] > upper)]
print(f"异常值数量:{len(outliers)}")
# 裁剪到合理范围
df['sales_amount'] = df['sales_amount'].clip(lower, upper)
四、数据转换与特征工程
# 转换日期类型
df['order_date'] = pd.to_datetime(df['order_date'])
# 提取时间特征
df['year'] = df['order_date'].dt.year
df['month'] = df['order_date'].dt.month
df['weekday'] = df['order_date'].dt.day_name()
df['quarter'] = df['order_date'].dt.quarter
# 新增派生字段:客单价
df['unit_price'] = df['sales_amount'] / df['quantity']
五、探索性数据分析(EDA)
5.1 月度销售趋势
monthly = df.groupby(['year', 'month'])['sales_amount'].sum().reset_index()
monthly['date'] = pd.to_datetime(monthly[['year', 'month']].assign(day=1))
fig, ax = plt.subplots(figsize=(12, 5))
ax.plot(monthly['date'], monthly['sales_amount'], marker='o', linewidth=2, color='steelblue')
ax.fill_between(monthly['date'], monthly['sales_amount'], alpha=0.1, color='steelblue')
ax.set_title('月度销售额趋势', fontsize=16)
ax.set_xlabel('时间')
ax.set_ylabel('销售额(元)')
ax.grid(axis='y', linestyle='--', alpha=0.5)
plt.tight_layout()
plt.show()
5.2 品类销售分布
category_sales = df.groupby('category')['sales_amount'].sum().sort_values(ascending=False)
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# 柱状图
category_sales.plot(kind='bar', ax=axes[0], color='coral', edgecolor='white')
axes[0].set_title('各品类总销售额')
axes[0].set_xticklabels(axes[0].get_xticklabels(), rotation=45, ha='right')
# 饼图
axes[1].pie(category_sales, labels=category_sales.index, autopct='%1.1f%%',
startangle=90, colors=sns.color_palette('pastel'))
axes[1].set_title('品类销售占比')
plt.tight_layout()
plt.show()
5.3 相关性热力图
numeric_cols = df.select_dtypes(include=[np.number]).columns
corr_matrix = df[numeric_cols].corr()
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, fmt='.2f', cmap='coolwarm',
center=0, square=True, linewidths=0.5)
plt.title('数值特征相关性热力图')
plt.tight_layout()
plt.show()
六、关键指标汇总
summary = {
'总销售额': f"¥{df['sales_amount'].sum():,.0f}",
'订单总数': f"{len(df):,}",
'平均客单价': f"¥{df['unit_price'].mean():.2f}",
'最畅销品类': df.groupby('category')['quantity'].sum().idxmax(),
'销售峰值月份': monthly.loc[monthly['sales_amount'].idxmax(), 'date'].strftime('%Y年%m月'),
}
for k, v in summary.items():
print(f"{k}:{v}")
七、导出分析结果
# 导出清洗后的数据
df.to_csv('cleaned_sales_data.csv', index=False, encoding='utf-8-sig')
# 导出月度汇总
monthly.to_excel('monthly_report.xlsx', index=False)
print("✅ 数据已导出")
总结
本文覆盖了数据分析的完整链路:
| 阶段 | 核心操作 | 关键函数 |
|---|---|---|
| 数据加载 | 读取、预览结构 | read_csv, info, describe |
| 数据清洗 | 缺失值、重复、异常值 | fillna, drop_duplicates, clip |
| 特征工程 | 时间提取、派生字段 | dt.month, 列运算 |
| EDA | 趋势、分布、相关性 | groupby, plot, heatmap |
| 导出 | CSV / Excel | to_csv, to_excel |
数据分析的核心不是工具,而是提出正确的问题。工具只是帮你回答它。
延伸阅读
- Pandas 官方文档
- Seaborn 图表库
- 下一篇:用 Scikit-learn 构建你的第一个预测模型
本文代码已在 Python 3.11 + pandas 2.x 环境下验证。如有问题欢迎留言交流。
不错不错