mcpField
E
exploratory-data-analysis

exploratory-data-analysis

github.com/seb1n数据与数据库236127 次安装12 周前更新
代码仓库

关于 exploratory-data-analysis

这项技能引导 AI Agent 对表格数据进行结构化探索分析,从质量检查到整理发现。涵盖统计摘要、可视化、变量关系分析和异常检测。

主要功能

  1. 01检查数据集规模与类型
  2. 02评估缺失值和重复行
  3. 03汇总分布与类别
  4. 04分析相关性和变量关系
  5. 05检测离群值与异常
  6. 06生成结构化 EDA 报告

适用场景

  1. 01建模前检查数据
  2. 02查找缺失值和可疑类型
  3. 03探索变量间关系
  4. 04以报告分享分析结果

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/seb1n/awesome-ai-agent-skills --skill exploratory-data-analysis

安装后在 Claude Code 中输入/exploratory-data-analysis确认已加载。

详细介绍

探索性数据分析

此技能可让 AI Agent 对任何表格数据集执行结构化的探索性数据分析(EDA)。Agent 会系统地分析数据的形状和类型,检查分布,计算相关性,检测离群值,并汇总分析结果。EDA 是建模或报告之前至关重要的第一步——它能揭示数据实际包含的内容,以及人们假设它包含的内容。

工作流

  1. 加载并检查基本结构。 读取数据集后,立即报告其形状(行数、列数)、列名、数据类型和内存占用。显示前 5 行和最后 5 行,以发现表头问题、末尾的垃圾行或编码异常。这不到一秒即可完成,却能避免后续数小时的困惑。

  2. 评估数据质量。 以绝对值和百分比两种方式统计每列的空值。识别零方差列(常量值)、高基数类别列(例如每行的 "notes" 字段都具有唯一值)以及混合类型列。构建简明的质量评分卡:缺失值超过 5% 的列、类型可疑的列,以及重复行数。

  3. 分析各变量的分布。 对数值列计算均值、中位数、标准差、偏度和峰度。绘制直方图或 KDE 图。对类别列,显示排名前 10 的类别的值计数和占比。标记高度不平衡的分布(例如二元目标变量中某个类别占比低于 5%)。

  4. 探索变量之间的关系。 计算数值列的完整相关矩阵,并用热力图将其可视化。对于类别变量与数值变量之间的关系,使用分组箱线图或小提琴图。对于类别变量之间的关系,使用列联表或马赛克图。突出显示相关性高于 0.7 或低于 -0.7 的变量对。

  5. 检测离群值和异常情况。 对每个数值列应用 IQR 方法,并报告离群值的数量和占比。用箱线图可视化离群值。交叉检查各列中的离群值——如果某一行在多个列中同时是离群值,通常意味着存在数据录入错误,或该观测确实异乎寻常。

  6. 汇总结果并撰写 EDA 报告。 撰写结构化摘要,涵盖:数据集概览、发现的质量问题、关键分布特征、显著相关性、离群值摘要,以及建议的后续步骤(例如应删除的列、应应用的转换,以及可能具有预测能力的特征)。

支持的技术

  • pandas — 数据加载和分析
  • matplotlib / seaborn — 分布和相关性的可视化
  • ydata-profiling(以前称为 pandas-profiling)— 自动生成 EDA 报告
  • scipy.stats — 用于分布分析的统计检验

用法

向 Agent 提供数据集文件路径。也可选择指定感兴趣的目标列、类别变量要显示的最大类别数,以及是否生成自动化 HTML 报告。Agent 将返回可视化结果和文字摘要。

示例

示例 1:对数据集进行完整 EDA
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv("employee_attrition.csv")

# Step 1: Structure
print(f"Shape: {df.shape}")               # Shape: (1470, 35)
print(f"Dtypes:\n{df.dtypes.value_counts()}")
# int64      26
# object      9

# Step 2: Data quality
print(f"\nNull counts:\n{df.isnull().sum().loc[lambda x: x > 0]}")
# monthly_income    12
# years_at_company   8
print(f"Duplicates: {df.duplicated().sum()}")  # Duplicates: 3

# Step 3: Distributions
print(f"\nNumeric summary:\n{df[['age', 'monthly_income', 'years_at_company']].describe()}")
#        age  monthly_income  years_at_company
# mean  36.9         6502.93              7.01
# std    9.1         4707.96              6.13
# min   18.0         1009.00              0.00
# 50%   36.0         4919.00              5.00
# max   60.0        19999.00             40.00

print(f"\nAttrition distribution:\n{df['attrition'].value_counts(normalize=True)}")
# No     0.839
# Yes    0.161    <-- imbalanced target

# Step 4: Correlations
corr = df.select_dtypes(include="number").corr()
high_corr = corr.where(
    (corr.abs() > 0.7) & (corr != 1.0)
).stack().dropna()
print(f"\nHigh correlations:\n{high_corr}")
# monthly_income  job_level           0.95
# total_working_years  job_level      0.78
# years_at_company  years_in_role     0.76

# Step 5: Outlier summary
for col in ["monthly_income", "years_at_company"]:
    Q1, Q3 = df[col].quantile(0.25), df[col].quantile(0.75)
    IQR = Q3 - Q1
    outliers = ((df[col] < Q1 - 1.5 * IQR) | (df[col] > Q3 + 1.5 * IQR)).sum()
    print(f"{col}: {outliers} outliers ({outliers/len(df)*100:.1f}%)")
# monthly_income: 0 outliers (0.0%)
# years_at_company: 47 outliers (3.2%)

# Visualization: correlation heatmap
plt.figure(figsize=(12, 10))
sns.heatmap(corr, cmap="coolwarm", center=0, annot=False, square=True)
plt.title("Feature Correlation Matrix")
plt.tight_layout()
plt.savefig("eda_correlation_heatmap.png", dpi=150)
示例 2:自动生成 EDA 报告
from ydata_profiling import ProfileReport
import pandas as pd

df = pd.read_csv("employee_attrition.csv")

# Generate a comprehensive HTML report
profile = ProfileReport(
    df,
    title="Employee Attrition EDA Report",
    explorative=True,
    correlations={
        "pearson": {"calculate": True},
        "spearman": {"calculate": True},
        "phi_k": {"calculate": True}
    },
    missing_diagrams={
        "bar": True,
        "matrix": True,
        "heatmap": True
    }
)

profile.to_file("eda_report.html")
# Generates a full interactive report including:
# - Dataset overview (size, types, missing cells, duplicates)
# - Per-variable analysis (stats, histogram, common/extreme values)
# - Correlation matrices (Pearson, Spearman, Phi-K)
# - Missing value patterns (bar chart, matrix, nullity heatmap)
# - Sample rows and duplicate detection
print("Report saved to eda_report.html")

最佳实践

  • 在进行任何特征工程或建模之前先执行 EDA——在验证之前,对数据质量的假设几乎总是错误的。
  • 将分布可视化,不要只查看汇总统计数据;双峰分布和正态分布可能具有相同的均值和标准差。
  • 在 EDA 期间检查数据泄漏——如果某个特征与目标变量完全或近乎完全相关,它可能包含未来信息。
  • 始终检查分布的尾部;最有趣、最棘手的数据往往藏在极端值中。
  • 以便于分享的格式(HTML 报告或笔记本)记录 EDA 结果,让协作者能够审阅你的分析过程。
  • 在完成重大清理步骤后重新运行 EDA,以验证转换是否达到了预期效果。

边缘情况

  • 包含数百列的数据集。 跳过逐列可视化,重点使用 ydata-profiling 进行自动化分析。使用相关性阈值,仅展示最值得关注的列对。
  • 目标变量高度不平衡。 明确标注这一情况(例如,“正类仅占 2.3%”),并建议在后续建模中使用分层抽样或重平衡技术。
  • 全为空值列或零方差列。 在 EDA 期间自动删除这些列,并在分析结果中记录,因为它们不具备分析价值。
  • 实际为数值的字符串列。 检测数值解析成功率超过 90% 的列,并建议在进行统计分析前转换数据类型。
  • 需要考虑时区的日期时间列。 如果数据集包含来自多个地区的记录,则标记不带时区的日期时间列,以防止出现静默聚合错误。

评论

支持 Markdown