关于 Exploratory Data Analysis
面向数据科学家和分析人员的探索性数据分析技能,用于建模前检查数据集。内容涵盖数据概况、分布、变量关系、异常和质量,并指导记录发现与后续假设。
主要功能
- 01检查数据类型与汇总统计
- 02分析变量分布
- 03探索变量间关系
- 04识别异常与数据质量问题
- 05记录发现和假设
适用场景
- 01分析前检查新数据集
- 02建模前检查数据质量
- 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)
需要提出的关键问题
- 数据的维度和类型是什么?
- 关键变量的分布情况如何?
- 变量之间存在什么模式?
- 是否存在明显的数据质量问题?
- 存在哪些离群值或异常?
- 我们可以提出哪些假设?
最佳实践
- 先进行数据概况分析,再进行可视化
- 尽早检查数据类型和缺失值
- 先可视化分布,再开始分析
- 记录有趣的发现和异常
- 创建摘要,以便与利益相关者沟通
- 运用领域知识解读模式
常见陷阱
- 跳过数据质量检查
- 过度解读小型数据集中的模式
- 忽视领域背景
- 数据可视化不足
- 未系统地记录发现
交付成果
- 数据质量报告,包含缺失值和重复项
- 汇总统计信息和分布图表
- 相关性和关系可视化图表
- 值得关注的模式和异常清单
- 供进一步调查的假设
- 数据清理建议
评论
支持 Markdown