(AI编写测试)用 Pandas + Matplotlib 做数据分析:从清洗到可视化的完整流程

 

适合读者: 有 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

数据分析的核心不是工具,而是提出正确的问题。工具只是帮你回答它。


延伸阅读


本文代码已在 Python 3.11 + pandas 2.x 环境下验证。如有问题欢迎留言交流。

One comment

Leave a Reply

Your email address will not be published. Required fields are marked *