mcpField
E
Exploratory Data Analysis

Exploratory Data Analysis

github.com/aj-geddes数据与数据库374515 次安装34 周前更新
代码仓库

关于 Exploratory Data Analysis

面向数据科学家和分析人员的探索性数据分析技能,用于建模前检查数据集。内容涵盖数据概况、分布、变量关系、异常和质量,并指导记录发现与后续假设。

主要功能

  1. 01检查数据类型与汇总统计
  2. 02分析变量分布
  3. 03探索变量间关系
  4. 04识别异常与数据质量问题
  5. 05记录发现和假设

适用场景

  1. 01分析前检查新数据集
  2. 02建模前检查数据质量
  3. 03生成待验证的假设

安装

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

$npx skills add https://github.com/aj-geddes/useful-ai-prompts --skill exploratory-data-analysis

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

附带文件templates/notebook-template.pyscripts/scaffold-analysis.sh

详细介绍

探索性数据分析(EDA)

概述

探索性数据分析(EDA)是数据科学项目的关键第一步,通过系统地检查数据集,了解其特征、识别模式,并在正式建模前评估数据质量。

核心概念

  • 数据概况分析:了解基本统计信息和数据类型
  • 分布分析:检查变量的分布情况
  • 关系发现:识别变量之间的模式
  • 异常检测:发现离群值和异常模式
  • 数据质量评估:评估数据的完整性和一致性

适用场景

  • 开始分析新的数据集
  • 在建模前了解数据
  • 识别数据质量问题
  • 生成待检验的假设
  • 向利益相关者传达洞察

使用 Python 实现

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# Load and explore data
df = pd.read_csv('customer_data.csv')

# Basic profiling
print(f"Shape: {df.shape}")
print(f"Data types:\n{df.dtypes}")
print(f"Missing values:\n{df.isnull().sum()}")
print(f"Duplicates: {df.duplicated().sum()}")

# Statistical summary
print(df.describe())
print(df.describe(include='object'))

# Distribution analysis - numerical columns
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
df['age'].hist(bins=30, ax=axes[0, 0])
axes[0, 0].set_title('Age Distribution')

df['income'].hist(bins=30, ax=axes[0, 1])
axes[0, 1].set_title('Income Distribution')

# Box plots for outlier detection
df.boxplot(column='age', by='region', ax=axes[1, 0])
axes[1, 0].set_title('Age by Region')

# Categorical analysis
df['category'].value_counts().plot(kind='bar', ax=axes[1, 1])
axes[1, 1].set_title('Category Distribution')
plt.tight_layout()
plt.show()

# Correlation analysis
numeric_df = df.select_dtypes(include=[np.number])
correlation_matrix = numeric_df.corr()

plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0)
plt.title('Correlation Matrix')
plt.show()

# Multivariate relationships
sns.pairplot(df[['age', 'income', 'education_years']], diag_kind='hist')
plt.show()

# Skewness and kurtosis
print("\nSkewness:")
print(numeric_df.skew())
print("\nKurtosis:")
print(numeric_df.kurtosis())

# Percentile analysis
print("\nPercentiles for Age:")
print(df['age'].quantile([0.25, 0.5, 0.75, 0.95, 0.99]))

# Missing data patterns
missing_pct = (df.isnull().sum() / len(df) * 100)
missing_pct[missing_pct > 0].sort_values(ascending=False)

# Value count analysis
print("\nCustomer Types Distribution:")
print(df['customer_type'].value_counts(normalize=True))

# Advanced EDA: Groupby analysis
print("\nGroupBy Analysis:")
print(df.groupby('region')[['age', 'income']].agg(['mean', 'median', 'std']))

# Correlation with target variable
if 'target' in df.columns:
    target_corr = df.corr()['target'].sort_values(ascending=False)
    print("\nFeature Correlation with Target:")
    print(target_corr)

# Data type breakdown
print("\nData Type Summary:")
print(df.dtypes.value_counts())

# Unique value count
print("\nUnique Value Counts:")
print(df.nunique().sort_values(ascending=False))

# Variance analysis
print("\nVariance per Feature:")
numeric_cols = df.select_dtypes(include=[np.number]).columns
for col in numeric_cols:
    variance = df[col].var()
    print(f"  {col}: {variance:.2f}")

# Distribution patterns
for col in df.select_dtypes(include=[np.number]).columns:
    skew = df[col].skew()
    kurt = df[col].kurtosis()
    print(f"{col} - Skew: {skew:.2f}, Kurtosis: {kurt:.2f}")

# Bivariate analysis
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
df.groupby('region')['income'].mean().plot(kind='bar', ax=axes[0])
axes[0].set_title('Average Income by Region')
df.groupby('category')['age'].mean().plot(kind='bar', ax=axes[1])
axes[1].set_title('Average Age by Category')
plt.tight_layout()
plt.show()

# Summary statistics profile
print("\nComprehensive Data Profile:")
profile = {
    'Variable': df.columns,
    'Type': df.dtypes,
    'Non-Null Count': df.count(),
    'Null Count': df.isnull().sum(),
    'Unique Values': df.nunique(),
}
profile_df = pd.DataFrame(profile)
print(profile_df)

高级 EDA 技术

# Step 15: Interaction analysis
import itertools

numeric_cols = df.select_dtypes(include=[np.number]).columns
interaction_strengths = []

for col1, col2 in itertools.combinations(numeric_cols[:5], 2):
    interaction_score = abs(df[col1].corr(df[col2]))
    interaction_strengths.append({
        'Pair': f"{col1} × {col2}",
        'Correlation': interaction_score,
    })

interaction_df = pd.DataFrame(interaction_strengths).sort_values('Correlation', ascending=False)
print("\nTop Interactions:")
print(interaction_df.head())

# Step 16: Outlier summary
for col in numeric_cols:
    Q1, Q3 = df[col].quantile([0.25, 0.75])
    IQR = Q3 - Q1
    outliers = df[(df[col] < Q1 - 1.5*IQR) | (df[col] > Q3 + 1.5*IQR)]
    if len(outliers) > 0:
        print(f"\n{col}: {len(outliers)} outliers detected ({len(outliers)/len(df)*100:.1f}%)")

# Step 17: Generate automated insights
print("\n" + "="*60)
print("AUTOMATED DATA INSIGHTS")
print("="*60)

for col in numeric_cols:
    skewness = df[col].skew()
    mean_val = df[col].mean()
    median_val = df[col].median()

    if abs(skewness) > 1:
        direction = "right" if skewness > 0 else "left"
        print(f"{col}: Highly {direction}-skewed distribution")

    if abs(mean_val - median_val) > 0.1 * median_val:
        print(f"{col}: Mean and median differ significantly")

print("="*60)

需要提出的关键问题

  1. 数据的维度和类型是什么?
  2. 关键变量的分布情况如何?
  3. 变量之间存在什么模式?
  4. 是否存在明显的数据质量问题?
  5. 存在哪些离群值或异常?
  6. 我们可以提出哪些假设?

最佳实践

  • 先进行数据概况分析,再进行可视化
  • 尽早检查数据类型和缺失值
  • 先可视化分布,再开始分析
  • 记录有趣的发现和异常
  • 创建摘要,以便与利益相关者沟通
  • 运用领域知识解读模式

常见陷阱

  • 跳过数据质量检查
  • 过度解读小型数据集中的模式
  • 忽视领域背景
  • 数据可视化不足
  • 未系统地记录发现

交付成果

  • 数据质量报告,包含缺失值和重复项
  • 汇总统计信息和分布图表
  • 相关性和关系可视化图表
  • 值得关注的模式和异常清单
  • 供进一步调查的假设
  • 数据清理建议

评论

支持 Markdown