探索性数据分析(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(deepTrue).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(includeall) 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, ascendingFalse) 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(normalizeTrue) * 100 return pd.DataFrame({ count: freq, percent: freq_percent }) def plot_histogram(self, column, bins30): plt.figure(figsize(10, 6)) sns.histplot(dataself.df, xcolumn, binsbins, kdeTrue) plt.title(fDistribution of {column}) plt.xlabel(column) plt.ylabel(Frequency) plt.show() def plot_bar(self, column, top_n10): plt.figure(figsize(10, 6)) top_categories self.df[column].value_counts().head(top_n) sns.barplot(xtop_categories.index, ytop_categories.values) plt.title(fTop {top_n} Categories of {column}) plt.xlabel(column) plt.ylabel(Count) plt.xticks(rotation45) plt.show()2.3 多变量分析class MultivariateAnalyzer: def __init__(self, df): self.df df def correlation_matrix(self, methodpearson): numeric_df self.df.select_dtypes(include[np.number]) return numeric_df.corr(methodmethod) def plot_correlation_heatmap(self): corr_matrix self.correlation_matrix() plt.figure(figsize(12, 10)) sns.heatmap(corr_matrix, annotTrue, cmapcoolwarm, vmin-1, vmax1) plt.title(Correlation Heatmap) plt.show() def plot_scatter(self, x, y, hueNone): plt.figure(figsize(10, 6)) sns.scatterplot(dataself.df, xx, yy, huehue) plt.title(f{x} vs {y}) plt.show() def plot_pairplot(self, columnsNone): 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_funcmean): return self.df.groupby(group_col)[agg_col].agg(agg_func).sort_values(ascendingFalse)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质量直接影响后续建模效果必须认真对待。