探索性数据分析(EDA)
探索性数据分析(EDA)
1. 技术分析
1.1 EDA概述
探索性数据分析是理解数据的关键步骤:
EDA目标 理解数据结构 发现数据模式 识别异常值 验证假设 EDA步骤: 数据概览 单变量分析 多变量分析 可视化探索1.2 EDA方法
EDA技术 描述统计: 均值、中位数、标准差 可视化: 直方图、散点图、箱线图 相关性分析: 相关系数 假设检验: t检验、卡方检验 EDA原则: 从整体到局部 定量与定性结合 可视化优先1.3 EDA工具
| 工具 | 功能 | 适用场景 |
|---|---|---|
| pandas | 数据处理 | 数据操作 |
| matplotlib | 基础绘图 | 快速可视化 |
| seaborn | 统计绘图 | 美观图表 |
| plotly | 交互可视化 | 探索性分析 |
2. 核心功能实现
2.1 数据概览
import pandas as pd import numpy as np class DataOverview: def __init__(self, df): self.df = df def basic_info(self): info = {} info['rows'] = len(self.df) info['columns'] = len(self.df.columns) info['memory_usage'] = self.df.memory_usage(deep=True).sum() / (1024 ** 2) numeric_cols = self.df.select_dtypes(include=[np.number]).columns categorical_cols = self.df.select_dtypes(include=['object']).columns info['numeric_columns'] = list(numeric_cols) info['categorical_columns'] = list(categorical_cols) return info def summary_statistics(self): return self.df.describe(include='all') def missing_value_summary(self): missing = self.df.isnull().sum() missing_percent = (missing / len(self.df)) * 100 return pd.DataFrame({ 'missing_count': missing, 'missing_percent': missing_percent }).sort_values('missing_percent', ascending=False) def generate_report(self): report = "# 数据概览报告\n\n" info = self.basic_info() report += "## 1. 基本信息\n" report += f"- 数据集大小: {info['rows']}行 × {info['columns']}列\n" report += f"- 内存占用: {info['memory_usage']:.2f} MB\n" report += f"- 数值列: {len(info['numeric_columns'])}个\n" report += f"- 类别列: {len(info['categorical_columns'])}个\n\n" report += "## 2. 缺失值统计\n" report += self.missing_value_summary().to_markdown() + "\n\n" report += "## 3. 描述统计\n" report += self.summary_statistics().to_markdown() return report2.2 单变量分析
import matplotlib.pyplot as plt import seaborn as sns class UnivariateAnalyzer: def __init__(self, df): self.df = df def analyze_numeric(self, column): stats = { 'mean': self.df[column].mean(), 'median': self.df[column].median(), 'std': self.df[column].std(), 'min': self.df[column].min(), 'max': self.df[column].max(), 'skew': self.df[column].skew(), 'kurtosis': self.df[column].kurtosis() } return stats def analyze_categorical(self, column): freq = self.df[column].value_counts() freq_percent = self.df[column].value_counts(normalize=True) * 100 return pd.DataFrame({ 'count': freq, 'percent': freq_percent }) def plot_histogram(self, column, bins=30): plt.figure(figsize=(10, 6)) sns.histplot(data=self.df, x=column, bins=bins, kde=True) plt.title(f'Distribution of {column}') plt.xlabel(column) plt.ylabel('Frequency') plt.show() def plot_bar(self, column, top_n=10): plt.figure(figsize=(10, 6)) top_categories = self.df[column].value_counts().head(top_n) sns.barplot(x=top_categories.index, y=top_categories.values) plt.title(f'Top {top_n} Categories of {column}') plt.xlabel(column) plt.ylabel('Count') plt.xticks(rotation=45) plt.show()2.3 多变量分析
class MultivariateAnalyzer: def __init__(self, df): self.df = df def correlation_matrix(self, method='pearson'): numeric_df = self.df.select_dtypes(include=[np.number]) return numeric_df.corr(method=method) def plot_correlation_heatmap(self): corr_matrix = self.correlation_matrix() plt.figure(figsize=(12, 10)) sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1) plt.title('Correlation Heatmap') plt.show() def plot_scatter(self, x, y, hue=None): plt.figure(figsize=(10, 6)) sns.scatterplot(data=self.df, x=x, y=y, hue=hue) plt.title(f'{x} vs {y}') plt.show() def plot_pairplot(self, columns=None): if columns is None: columns = self.df.select_dtypes(include=[np.number]).columns[:5] sns.pairplot(self.df[columns]) plt.show() def analyze_groupby(self, group_col, agg_col, agg_func='mean'): return self.df.groupby(group_col)[agg_col].agg(agg_func).sort_values(ascending=False)2.4 假设检验
from scipy import stats class HypothesisTester: def __init__(self, df): self.df = df def t_test(self, group1, group2, column): group1_data = self.df[self.df[group1][column]] group2_data = self.df[self.df[group2][column]] t_stat, p_value = stats.ttest_ind(group1_data, group2_data) return { 't_statistic': t_stat, 'p_value': p_value, 'significant': p_value < 0.05 } def chi_square_test(self, column1, column2): contingency_table = pd.crosstab(self.df[column1], self.df[column2]) chi2, p_value, dof, expected = stats.chi2_contingency(contingency_table) return { 'chi2_statistic': chi2, 'p_value': p_value, 'degrees_of_freedom': dof, 'significant': p_value < 0.05 } def correlation_test(self, column1, column2): corr, p_value = stats.pearsonr(self.df[column1], self.df[column2]) return { 'correlation': corr, 'p_value': p_value, 'significant': p_value < 0.05 }3. 性能对比
3.1 可视化工具对比
| 工具 | 美观度 | 交互性 | 复杂度 |
|---|---|---|---|
| matplotlib | 中 | 低 | 低 |
| seaborn | 高 | 低 | 中 |
| plotly | 很高 | 高 | 中 |
3.2 相关分析方法对比
| 方法 | 适用数据 | 度量范围 | 特点 |
|---|---|---|---|
| Pearson | 连续数据 | [-1, 1] | 线性相关 |
| Spearman | 有序数据 | [-1, 1] | 秩相关 |
| Kendall | 分类数据 | [-1, 1] | 一致性 |
3.3 EDA步骤对比
| 步骤 | 时间占比 | 重要性 |
|---|---|---|
| 数据概览 | 10% | 高 |
| 单变量分析 | 30% | 高 |
| 多变量分析 | 40% | 很高 |
| 假设检验 | 20% | 中 |
4. 最佳实践
4.1 EDA流程
def eda_pipeline(df): # 1. 数据概览 overview = DataOverview(df) print("=== 数据概览 ===") print(overview.basic_info()) # 2. 单变量分析 analyzer = UnivariateAnalyzer(df) for col in df.select_dtypes(include=[np.number]).columns[:3]: analyzer.plot_histogram(col) for col in df.select_dtypes(include=['object']).columns[:2]: analyzer.plot_bar(col) # 3. 多变量分析 multi_analyzer = MultivariateAnalyzer(df) multi_analyzer.plot_correlation_heatmap() # 4. 假设检验 tester = HypothesisTester(df) numeric_cols = df.select_dtypes(include=[np.number]).columns if len(numeric_cols) >= 2: result = tester.correlation_test(numeric_cols[0], numeric_cols[1]) print(f"相关性检验结果: {result}")4.2 EDA检查清单
class EDAChecklist: def __init__(self): self.checks = [ '检查数据类型是否正确', '识别缺失值模式', '分析数值列的分布', '分析类别列的频率', '检查变量间的相关性', '识别异常值', '验证关键假设' ] def run(self, df): print("=== EDA检查清单 ===") for i, check in enumerate(self.checks, 1): status = input(f"{i}. {check}? (y/n): ").lower() print(f" {'✓' if status == 'y' else '✗'} 完成")5. 总结
EDA是数据科学的关键环节:
- 数据概览:了解数据基本情况
- 单变量分析:分析每个变量
- 多变量分析:探索变量关系
- 假设检验:验证假设
对比数据如下:
- seaborn绘制图表最美观
- Pearson相关最常用
- 多变量分析占时间最多(40%)
- 推荐使用plotly进行交互探索
EDA质量直接影响后续建模效果,必须认真对待。
