当前位置: 首页 > news >正文

探索性数据分析(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 report

2.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是数据科学的关键环节:

  1. 数据概览:了解数据基本情况
  2. 单变量分析:分析每个变量
  3. 多变量分析:探索变量关系
  4. 假设检验:验证假设

对比数据如下:

  • seaborn绘制图表最美观
  • Pearson相关最常用
  • 多变量分析占时间最多(40%)
  • 推荐使用plotly进行交互探索

EDA质量直接影响后续建模效果,必须认真对待。

http://www.gsyq.cn/news/1362073.html

相关文章:

  • 【MATLAB源码-第446期】基于MATLAB的水声时变多径信道OFDM系统仿真对比:LS、LMMSE、LMS与RLS
  • 嵌入音频和视频:让网页“活”起来
  • 【电子通识】贴片电阻上的丝印332、5R6、1502、01C怎么读出阻值?
  • 双栈秒杀表达式的生成方式
  • Go Modules 基础命令速查
  • Keil C51中RTX51 Tiny任务列表显示异常的解决方案
  • 【v2026.5.9新版】OpenClaw(原Clawdbot/Moltbot)部署指南,无需命令一键配置详细教程
  • Omni-Flash引擎及组件库技术解析与中转站接入实践
  • 2026屠宰厂臭气处理厂家综合实力深度解析:养殖场臭气处理/屠宰厂污水处理/搪瓷厌氧钢罐/有机肥建设技术/污水处理工程/选择指南 - 优质品牌商家
  • 学习c语言第21天 循环语句for 2
  • HS2-HF Patch:5步打造完美HoneySelect2游戏体验的终极指南
  • Win11Debloat:让Windows 11重获流畅体验的系统优化利器
  • 昇腾CANN skills:社区技能与开发工具集的实战解读
  • 2026年5月济南装修采购,为何山东山高照明成为马桶供应商优选? - 2026年企业推荐榜
  • AI 时代的普通人生存指南
  • MacBook网络已连接却上不了网
  • 超星***滑块逆向分析
  • 为什么Bebas Neue能成为设计师的免费首选?解决标题排版问题的3步方案
  • LangChain学习笔记(一)
  • Coilcraft变压器 HPH6-2400L国产兼容方案评估:与同于科技 Tonevee 同规格型号测评
  • 04-系统技术架构师必备——设计模式在系统架构中的应用
  • Spring Boot 技术知识概要
  • 1. NLP课程大纲
  • Claude API文档不是说明书,而是契约:用Swagger UI+Postman Collection+TypeScript SDK三件套构建零歧义协作协议
  • 小白必看!轻松搞懂ChatGPT背后的Transformer,附收藏版深度解析
  • 2026年当前浙江省单位食堂承包深度选型:为何食润康餐饮成为全链条服务标杆? - 2026年企业推荐榜
  • 五轴联动机床:什么叫真正做出来了,什么叫组装贴牌
  • boss app sig/sp/响应体 unidbg分析
  • 根据lab1.pdf总结的知识点
  • 、Codex(OpenAI)在旅行社网站的应用与前途(2026)