探索性数据分析
(EDA)完整指南
从数据到洞察的系统方法
lightbulb 什么是探索性数据分析(EDA)?
探索性数据分析(Exploratory Data Analysis, EDA)是数据分析项目的第一步,旨在理解数据的结构、分布和质量,并发现潜在的规律或问题。与传统统计分析不同,EDA更注重数据的真实分布和可视化,帮助分析者发现数据中隐含的模式。
stars EDA的核心目标
search 步骤一:数据概览与质量检查
1. 查看数据形状
- 行数:代表有多少个观测样本
- 列数:代表有多少个特征/变量
- 在Python中,使用 df.shape;在R中,使用 dim(df)
2. 查看列名和数据类型
- 了解每个变量代表什么
- 区分数值型变量(连续型如年龄、收入;离散型如孩子数量)和类别型变量(如性别、国家)
- 在Python中,使用 df.info() 或 df.dtypes;在R中,使用 str(df)
3. 查看头尾数据
- 直观地感受数据的样子
- 在Python中,使用 df.head() 和 df.tail()
4. 检查缺失值
- 这是数据质量的关键。缺失值会严重影响后续分析
- 方法:计算每列缺失值的数量和比例
- 在Python中,使用 df.isnull().sum()
5. 检查重复值
- 检查是否有完全重复的行
- 在Python中,使用 df.duplicated().sum()
analytics 步骤二:数值型变量的统计分析
1. 描述性统计汇总
- 这是最常用的一步,可以一键生成多个关键统计量
- 在Python中,使用 df.describe(),输出:
- count:非空值的数量
- mean:平均值,衡量中心趋势
- std:标准差,衡量数据波动大小
- min:最小值
- 25%:第一四分位数
- 50%:中位数,对异常值不敏感
- 75%:第三四分位数
- max:最大值
2. 深入分析(超越.describe())
- 偏度:衡量数据分布的不对称性
- 正偏(右偏):均值 > 中位数,数据集中在左侧,右侧有长尾
- 负偏(左偏):均值 < 中位数,数据集中在右侧,左侧有长尾
- 峰度:衡量数据分布的陡峭程度。与正态分布相比,高峰度意味着数据有更重的尾巴和更尖的峰值
category 步骤三:类别型变量的统计分析
1. 频数统计
- 计算每个类别出现的次数
- 在Python中,使用 df['column_name'].value_counts()
2. 比例/百分比
- 查看每个类别占总数的百分比,更能直观反映分布
- 使用 df['column_name'].value_counts(normalize=True) * 100
bar_chart 步骤四:数据可视化
show_chart 数值型变量
- 直方图:查看单个变量的分布形状
- 箱线图:展示数据的五数概括,快速识别异常值
- 小提琴图:结合箱线图和核密度图,显示分布的具体形状
pie_chart 类别型变量
- 条形图:展示每个类别的频数或比例
- 饼图:显示各类别占比(适用于类别较少的情况)
scatter_plot 关系探索
- 散点图:探索两个数值型变量之间的关系
- 热力图:以颜色深浅展示多个变量之间的相关系数矩阵
insights 高级可视化
- 平行坐标图:多维数据可视化
- 3D散点图:三维数据关系探索
- 交互式图表:使用Plotly或Bokeh创建
auto_awesome 自动化EDA工具
1. Pandas Profiling (ydata-profiling)
- 一键生成全面的数据分析报告
- 包含变量统计、相关性分析、缺失值分析等
- 安装:pip install ydata-profiling
- 使用:from ydata_profiling import ProfileReport; ProfileReport(df)
2. Sweetviz
- 专注于比较数据集和变量
- 生成美观的HTML报告
- 安装:pip install sweetviz
- 使用:import sweetviz as sv; report = sv.analyze(df); report.show_html()
code 实践示例(修正后的Python代码)
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 1. 数据概览
print("数据形状:", df.shape)
print("\n数据类型和信息:")
print(df.info())
print("\n前5行数据:")
print(df.head())
# 2. 数据质量
print("\n缺失值统计:")
print(df.isnull().sum())
print("\n重复值统计:")
print(df.duplicated().sum())
# 3. 数值型变量描述
print("\n数值型变量描述性统计:")
print(df.describe())
# 4. 类别型变量描述
categorical_columns = df.select_dtypes(include=['object']).columns
for col in categorical_columns:
print(f"\n变量 '{col}' 的分布:")
print(df[col].value_counts())
# 5. 可视化
sns.set(style="whitegrid")
# 绘制数值变量的直方图和箱线图
numerical_columns = df.select_dtypes(include=[np.number]).columns
for col in numerical_columns:
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
# 直方图
sns.histplot(df[col], kde=True, ax=axes[0])
axes[0].set_title(f'Distribution of {col}')
# 箱线图
sns.boxplot(x=df[col], ax=axes[1])
axes[1].set_title(f'Boxplot of {col}')
plt.show()
# 绘制类别变量的条形图
for col in categorical_columns:
plt.figure(figsize=(10, 5))
df[col].value_counts().plot(kind='bar')
plt.title(f'Bar Chart of {col}')
plt.xticks(rotation=45)
plt.show()
# 绘制数值变量之间的相关热力图
plt.figure(figsize=(10, 8))
correlation_matrix = df.corr()
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f")
plt.title('Correlation Heatmap')
plt.show()
build 数据预处理建议
1. 缺失值处理
- 删除:缺失值比例较小(<5%)时,可直接删除
- 插补:使用均值、中位数、众数或预测模型填充
- 标记:创建新变量标记缺失值,保留信息
2. 异常值处理
- 识别:使用箱线图、Z-score或IQR方法
- 处理:删除、替换或转换异常值
- 鲁棒统计:使用中位数、四分位数等对异常值不敏感的统计量
3. 数据转换
- 标准化/归一化:消除量纲影响
- 对数转换:处理右偏分布
- 分类编码:将类别变量转换为数值
summarize 总结
分析数据集的基本统计信息是一个系统性工程,遵循 "从整体到局部,从数字到图形" 的原则:
完成这些步骤后,你将对数据集有一个全面而扎实的理解,为后续的数据清洗、特征工程和建模打下坚实的基础。
