一、EDA 是什么
EDA 全称 Exploratory Data Analysis,探索性数据分析 ,是数据挖掘、机器学习建模前必须做的前置流程 。 核心目的:不靠复杂模型,只用统计、图表、简单运算,看懂数据本身,摸清数据规律、问题、特征关系,为后续清洗、特征工程、建模铺路。
EDA 核心 4 大目标
-
了解数据结构:行列、字段类型、缺失值、异常值
-
单变量分布:每个特征自身的取值分布、集中趋势、离散程度
-
多变量关系:特征与特征、特征与标签的相关性
-
发现数据问题:缺失、重复、离群、偏态、多重共线性等隐患
EDA 在数据挖掘里的实际价值
- 提前规避建模翻车 不做 EDA 很容易踩坑:大量缺失数据、极端异常值、高度相关特征导致模型过拟合。
- 指导数据清洗策略 根据缺失率决定填充 / 删除;根据箱线图识别并处理离群点。
- 指导特征工程 分布偏态数据做 log 变换;强相关特征考虑降维;类别不均衡决定采样策略。
二、EDA 两大分类
- 单变量分析(Univariate)
只看单个字段,不考虑其他变量
-
数值型:均值、中位数、方差、四分位数、直方图、箱线图
-
分类型:计数、频次、饼图、柱状图
- 多变量分析(Multivariate)
同时看两个及以上字段,挖掘关联
-
数值 × 数值:相关系数、散点图、热力图
-
数值 × 分类:分组均值、小提琴图、箱线分组对比
-
分类 × 分类:交叉表、堆叠柱状图
三、Python 做 EDA 常用工具栈
- pandas:数据读取、基础统计、缺失值、交叉表
- matplotlib / seaborn:绘图可视化(EDA 主力)
- plotly:交互式图表(可选)
- sweetviz / pandas-profiling:一键自动生成完整 EDA 报告
四、标准 EDA 完整步骤(Python 实操流程)
步骤 1:加载数据,查看基础信息
import pandas as pd
df = pd.read_csv("data.csv")
# 基础信息
print(df.shape) # 样本数、特征数
print(df.info()) # 字段类型、缺失值统计
print(df.head()) # 前5行
print(df.describe()) # 数值字段统计量
print(df.duplicated().sum()) # 重复行数量
步骤 2:缺失值分析(数据挖掘高频问题)
# 缺失值数量+占比
miss = df.isnull().sum()
miss_rate = miss / len(df)
print(pd.DataFrame({"缺失数量":miss, "缺失占比":miss_rate}))
步骤 3:单变量分布分析
import seaborn as sns
import matplotlib.pyplot as plt
# 直方图+核密度图
sns.histplot(df["price"], kde=True)
plt.show()
# 箱线图,查看异常值
sns.boxplot(x=df["price"])
plt.show()
分类特征
# 类别计数
print(df["gender"].value_counts())
# 柱状图
sns.countplot(x="gender", data=df)
plt.show()
步骤 4:多变量相关性分析
# 1. 相关系数矩阵
corr = df.corr(numeric_only=True)
# 热力图
sns.heatmap(corr, annot=True, cmap="coolwarm")
plt.show()
# 2. 特征与标签散点关系
sns.scatterplot(x="age", y="income", hue="label", data=df)
plt.show()
# 3. 分类分组对比
sns.boxplot(x="category", y="target", data=df)
plt.show()
五、自动一键 EDA(懒人工具)
主流两套工业级一键 EDA 工具:ydata-profiling(原 pandas-profiling)、sweetviz,还有轻量替代dtale。
一、ydata-profiling(最常用,报告最全)
- 简介
前身 pandas-profiling,改名后为 ydata-profiling,生成独立 HTML 完整分析报告,覆盖 EDA 全部维度,企业数据分析、竞赛标配。 自动输出内容:
-
数据集概览:行数、列数、缺失、重复、内存占用、变量类型统计
-
单变量分析:
-
数值型:均值、中位数、标准差、四分位数、直方图、偏度、峰度、极值、零值数量
-
分类型:类别计数、占比、条形图、唯一值数量
-
文本 / 日期:字符长度分布、时间趋势
-
-
缺失值专项:缺失数量、缺失热力图、缺失相关性
-
相关性矩阵:皮尔逊、斯皮尔曼、肯德尔相关系数 + 热力图,标注高相关特征(多重共线性预警)
-
交互变量:两两散点图
-
样本预览:前 10 行、后 10 行数据
-
安装
新版包名 ydata-profiling
pip install ydata-profiling
-
基础完整代码
import pandas as pd
from ydata_profiling import ProfileReport读取数据
df = pd.read_csv("data.csv")
生成报告对象
profile = ProfileReport(
df,
title="数据集EDA分析报告", # 网页标题
explorative=True, # 探索模式,展示更多图表
minimal=False, # False=完整报告;True=轻量化快速报告
correlations={ # 自定义相关系数计算
"pearson": {"calculate": True},
"spearman": {"calculate": True},
},
missing_diagrams={"heatmap": True} # 开启缺失热力图
)导出HTML文件(本地打开)
profile.to_file("eda完整报告.html")
jupyter notebook 内直接嵌入展示
profile.to_notebook_iframe()
-
进阶实用参数
-
大数据加速(样本量上万会卡)
minimal=True 关闭大量图表,极速生成
profile = ProfileReport(df, title="轻量化报告", minimal=True)
-
分类任务:传入标签列,自动对比特征与目标关系
profile = ProfileReport(df, title="分类EDA", target_name="label")
-
分对比两份数据集(训练集 vs 测试集)
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
train_report = ProfileReport(train)
test_report = ProfileReport(test)对比两份数据分布差异
compare_report = train_report.compare(test_report)
compare_report.to_file("train_test对比报告.html") -
优缺点
优点:报告信息最全、可视化丰富、支持训练 / 测试集对比、可自定义配置 .
缺点:大数据(10w 行 +、50 特征以上)生成速度慢、HTML 文件体积大、占用内存高
二、Sweetviz(速度更快,对比功能更强)
- 简介
轻量型 EDA 工具,生成简洁 HTML,数据集对比功能碾压 profiling,速度更快,适合大数据快速筛查。 自动输出模块:
-
整体摘要:缺失、重复、数值 / 分类字段统计
-
每个特征独立面板:分布、最大值最小值、缺失率
-
目标变量关联分析:自动计算特征与标签的关联强度
-
两组数据分布差异对比(训练 / 测试、正负样本)
-
安装
pip install sweetviz
-
三种使用场景代码
场景 1:单数据集 EDA
import sweetviz as sv
import pandas as pd
df = pd.read_csv("data.csv")
# 分析整张表
report = sv.analyze(df)
# 输出html
report.show_html("sweetviz单数据集报告.html")
场景 2:指定目标变量(分类 / 回归都支持)
# target参数填写标签列名,自动计算特征与标签相关性
report = sv.analyze(df, target_feat="y")
report.show_html("带目标分析.html")
场景 3:两组数据对比(最核心优势)
常用于:训练集 vs 测试集、正常样本 vs 异常样本
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
# compare([数据集A, 名称A], [数据集B, 名称B])
compare_report = sv.compare([train, "训练集"], [test, "测试集"], target_feat="label")
compare_report.show_html("训练测试分布对比.html")
- 优缺点
优点:运行速度快、HTML 体积小、对比功能强大、内存占用低、适合大数据粗筛
缺点:图表种类少于 ydata-profiling,无详细相关系数热力图
六、常见踩坑解决
-
数据集过大,生成报告卡死
-
用
sweetviz或profiling(minimal=True) -
抽样后再生成报告
df.sample(10000)
-
-
中文乱码 绘图前设置全局字体:
import matplotlib.pyplot as plt plt.rcParams["font.sans-serif"] = ["SimHei"] plt.rcParams["axes.unicode_minus"] = False