Python,数据挖掘之EDA(Exploratory Data Analysis)及EDA懒人工具

一、EDA 是什么

EDA 全称 Exploratory Data Analysis,探索性数据分析 ,是数据挖掘、机器学习建模前必须做的前置流程 。 核心目的:不靠复杂模型,只用统计、图表、简单运算,看懂数据本身,摸清数据规律、问题、特征关系,为后续清洗、特征工程、建模铺路。

EDA 核心 4 大目标

  1. 了解数据结构:行列、字段类型、缺失值、异常值

  2. 单变量分布:每个特征自身的取值分布、集中趋势、离散程度

  3. 多变量关系:特征与特征、特征与标签的相关性

  4. 发现数据问题:缺失、重复、离群、偏态、多重共线性等隐患

EDA 在数据挖掘里的实际价值

  1. 提前规避建模翻车 不做 EDA 很容易踩坑:大量缺失数据、极端异常值、高度相关特征导致模型过拟合。
  2. 指导数据清洗策略 根据缺失率决定填充 / 删除;根据箱线图识别并处理离群点。
  3. 指导特征工程 分布偏态数据做 log 变换;强相关特征考虑降维;类别不均衡决定采样策略。

二、EDA 两大分类

  1. 单变量分析(Univariate)

只看单个字段,不考虑其他变量

  • 数值型:均值、中位数、方差、四分位数、直方图、箱线图

  • 分类型:计数、频次、饼图、柱状图

  1. 多变量分析(Multivariate)

同时看两个及以上字段,挖掘关联

  • 数值 × 数值:相关系数、散点图、热力图

  • 数值 × 分类:分组均值、小提琴图、箱线分组对比

  • 分类 × 分类:交叉表、堆叠柱状图

三、Python 做 EDA 常用工具栈

  1. pandas:数据读取、基础统计、缺失值、交叉表
  2. matplotlib / seaborn:绘图可视化(EDA 主力)
  3. plotly:交互式图表(可选)
  4. 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(最常用,报告最全)

  1. 简介

前身 pandas-profiling,改名后为 ydata-profiling,生成独立 HTML 完整分析报告,覆盖 EDA 全部维度,企业数据分析、竞赛标配。 自动输出内容:

  1. 数据集概览:行数、列数、缺失、重复、内存占用、变量类型统计

  2. 单变量分析:

    • 数值型:均值、中位数、标准差、四分位数、直方图、偏度、峰度、极值、零值数量

    • 分类型:类别计数、占比、条形图、唯一值数量

    • 文本 / 日期:字符长度分布、时间趋势

  3. 缺失值专项:缺失数量、缺失热力图、缺失相关性

  4. 相关性矩阵:皮尔逊、斯皮尔曼、肯德尔相关系数 + 热力图,标注高相关特征(多重共线性预警)

  5. 交互变量:两两散点图

  6. 样本预览:前 10 行、后 10 行数据

  7. 安装

    新版包名 ydata-profiling

    pip install ydata-profiling

  8. 基础完整代码

    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()

  9. 进阶实用参数

  10. 大数据加速(样本量上万会卡)

    minimal=True 关闭大量图表,极速生成

    profile = ProfileReport(df, title="轻量化报告", minimal=True)

  11. 分类任务:传入标签列,自动对比特征与目标关系

    profile = ProfileReport(df, title="分类EDA", target_name="label")

  12. 分对比两份数据集(训练集 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")

  13. 优缺点

优点:报告信息最全、可视化丰富、支持训练 / 测试集对比、可自定义配置 .

缺点:大数据(10w 行 +、50 特征以上)生成速度慢、HTML 文件体积大、占用内存高

二、Sweetviz(速度更快,对比功能更强)

  1. 简介

轻量型 EDA 工具,生成简洁 HTML,数据集对比功能碾压 profiling,速度更快,适合大数据快速筛查。 自动输出模块:

  1. 整体摘要:缺失、重复、数值 / 分类字段统计

  2. 每个特征独立面板:分布、最大值最小值、缺失率

  3. 目标变量关联分析:自动计算特征与标签的关联强度

  4. 两组数据分布差异对比(训练 / 测试、正负样本)

  5. 安装

    pip install sweetviz

  6. 三种使用场景代码

场景 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")
  1. 优缺点

优点:运行速度快、HTML 体积小、对比功能强大、内存占用低、适合大数据粗筛

缺点:图表种类少于 ydata-profiling,无详细相关系数热力图

六、常见踩坑解决

  1. 数据集过大,生成报告卡死

    • sweetvizprofiling(minimal=True)

    • 抽样后再生成报告 df.sample(10000)

  2. 中文乱码 绘图前设置全局字体:

    复制代码
    import matplotlib.pyplot as plt
    plt.rcParams["font.sans-serif"] = ["SimHei"]
    plt.rcParams["axes.unicode_minus"] = False