数据分析如何做EDA

探索性数据分析(EDA,Exploratory Data Analysis)是数据分析过程中至关重要的一步,其目的是通过统计和可视化技术对数据进行初步分析,从而揭示数据的潜在模式、特征和异常值,并为后续的数据预处理、特征工程和模型构建奠定基础。以下是关于如何进行EDA的详细步骤和方法:
1. 理解数据背景与问题
在开始EDA之前,需要明确数据的来源、业务背景以及研究目标。例如,数据是否经过人工处理?是原始数据还是二次加工的数据?理解这些问题有助于确定分析的方向和重点。
2. 数据加载与预览
使用Python中的pandas库加载数据,并通过head()、tail()、describe()等方法对数据进行初步观察。这一步可以了解数据的结构、统计量(如平均值、中位数、标准差等)以及缺失值情况。

import pandas as pd# 加载数据
df = pd.read_csv('data.csv')# 查看前几行数据
print(df.head())# 统计描述
print(df.describe())
3. 数据清洗与预处理
EDA的一个重要环节是数据清洗,包括处理缺失值、异常值和重复值。具体方法如下:
- 缺失值处理:使用
isnull()检测缺失值,通过填充(如用均值、中位数或众数)或删除缺失值来处理。 - 异常值检测:通过计算四分位数(IQR)或绘制箱线图来识别异常值。


- 重复值处理:使用
duplicated()检测并删除重复值。
# 检测并处理缺失值
missing_data = df.isnull().sum()
print(missing_data)# 填充缺失值
df.fillna(df.mean(), inplace=True)# 删除重复值
df.drop_duplicates(inplace=True)
4. 单变量分析
单变量分析旨在研究每个变量的分布特征,包括中心趋势(均值、中位数)、离散程度(方差、标准差)、偏度和峰度等。常用图表包括直方图、箱线图和小提琴图。
import matplotlib.pyplot as plt# 绘制直方图
df['age'].hist(bins=20)
plt.show()# 绘制箱线图
df.boxplot(column='income')
plt.show()
5. 双变量分析
双变量分析用于研究两个变量之间的关系,包括线性相关性、分类关系等。常用方法有:
- 散点图:用于观察两个数值型变量之间的关系。
- 相关性矩阵:计算变量间的皮尔逊相关系数,评估线性关系。

# 绘制散点图
plt.scatter(df['age'], df['income'])
plt.xlabel('Age')
plt.ylabel('Income')
plt.show()# 计算相关性矩阵
corr_matrix = df.corr()
print(corr_matrix)
6. 多变量分析
多变量分析涉及多个变量之间的复杂关系,通常使用热力图或降维技术(如主成分分析PCA)来展示变量间的交互关系。

import seaborn as sns# 绘制热力图
sns.heatmap(corr_matrix, annot=True)
plt.show()
7. 假设检验与验证
根据研究目标,提出假设并通过统计方法验证。例如,可以使用t检验、卡方检验等方法来判断变量间是否存在显著关系。
from scipy import stats# 进行t检验
t_statistic, p_value = stats.ttest_ind(df['group1'], df['group2'])
print(f'T-statistic: {t_statistic}, P-value: {p_value}')
8. 可视化与报告
EDA的结果需要通过可视化工具展示,以便更直观地理解数据。常用的可视化库包括matplotlib、seaborn和plotly等。

# 使用seaborn绘制分布图
sns.histplot(df['age'], kde=True)
plt.show()
9. 迭代与优化
EDA是一个动态过程,需要根据初步结果不断调整分析方向。例如,可能需要重新定义问题、调整数据清洗策略或尝试不同的可视化方法。
总结
探索性数据分析是数据分析流程中的关键步骤,它帮助分析师快速了解数据的结构和特征,发现潜在的模式和异常值,并为后续的数据处理和建模提供指导。通过结合统计分析和可视化技术,EDA能够有效支持数据驱动的决策制定。
如何确定数据是否需要进行二次加工?
确定数据是否需要进行二次加工,可以从以下几个方面进行评估:
-
数据质量:首先,需要检查数据的完整性和准确性。如果数据中存在大量缺失值、异常值或重复数据,可能需要进行数据清洗和处理。例如,通过统计方法或机器学习方法填充缺失值,检测和修正异常值,以及去除重复数据。
-
数据一致性:确保数据在不同来源之间的一致性。如果数据来自多个不同的系统或平台,可能需要进行数据合并和标准化处理,以确保数据的一致性和可比性。
-
数据格式:检查数据的格式是否适合后续的分析和可视化需求。如果数据格式不一致或不规范,可能需要进行数据转换,例如日期格式化或数据标准化。
-
数据量:评估数据的规模是否足够支持分析需求。如果数据量较小,可能需要进行数据抽样,以确保分析结果的可靠性和代表性。
-
数据相关性:检查数据是否与研究问题或分析目标相关。如果数据与研究问题不相关,可能需要进行数据筛选,去除无关的数据,以提高分析的效率和准确性。
-
数据更新性:评估数据的时效性。如果数据已经过时,可能需要进行数据更新,以确保分析结果的时效性和准确性。
-
数据保护和安全:确保数据的处理符合相关的法律法规和安全标准。如果数据涉及敏感信息,可能需要进行额外的数据保护措施,如匿名化处理。
-
数据分析需求:根据具体的研究或分析需求,评估数据是否需要进一步加工。例如,如果需要进行复杂的统计分析或机器学习建模,可能需要对数据进行更深层次的处理。
在多变量分析中,除了热力图和降维技术,还有哪些方法可以展示变量间的交互关系?
在多变量分析中,除了热力图和降维技术,还有多种方法可以展示变量间的交互关系。以下是一些常见的方法:
-
散点图矩阵(Pairplot) :使用seaborn库的pairplot函数可以生成散点图矩阵,展示多个变量之间的关系。对角线显示每个变量的分布,非对角线部分展示不同变量之间的关系。
-
三维图:通过三维图可以展示三个变量之间的关系及其相互作用。例如,可以使用等高线图来表示变量之间的关系。
-
热力图:虽然热力图主要用于展示两个变量之间的关系,但也可以通过颜色的变化来表示多个变量之间的复杂关系。
-
多重回归分析:通过多重回归分析,可以展示变量之间的中介效应。如果先前输入的变量在添加另一个变量后变得不显著,那么这个变量的贡献将完全由第二个变量承担。
-
探索性因子分析:这种方法可以帮助识别变量之间的潜在结构,从而揭示变量之间的复杂关系。
-
加法模型:通过定义变量间的交互作用,可以将联合分布分解为层次模型。这种方法特别适用于多分类数据的分析。
-
高维模型表示(HDMR) :通过构建逼近目标函数的层阶模型,可以推导出代理模型或元模型中的交互信息。
-
广义搜索算法:在多维变量优化问题中,可以使用广义搜索算法来寻找最优解,并通过最大信息系数检查目标函数与问题关于某个维度的偏导数之间的功能关系。
-
链接预测性检测(LIMD) :通过检测变量之间的链接预测性,可以识别出具有显著交互作用的变量。
-
CC with variable interaction learning(CCVIL) :这是一种基于连续优化问题的多变量连续优化方法,可以用于识别和学习变量之间的交互作用。
假设检验的具体步骤是什么?
假设检验的具体步骤如下:
-
提出假设:首先,需要明确研究问题,并根据研究问题提出原假设(H0)和备择假设(H1)。原假设通常是研究者想要反驳的假设,而备择假设则是研究者想要证明的假设。例如,如果研究的是工厂生产线改造后每小时的生产数是否有所提高,那么原假设可以是“改造后的每小时生产数不高于改进前的水平”,备择假设则是“改造后的每小时生产数高于改进前的水平”。
-
建立假设:在提出假设后,需要建立假设检验的框架。这包括明确原假设和备择假设的具体形式。例如,原假设可以表示为θ=θ0,备择假设则表示为θ≠θ0或θ>θ0或θ<θ0。
-
确定显著性水平α:显著性水平α是评价假设检验结果的重要指标,通常取值为0.01、0.05或0.1。显著性水平表示在原假设为真的情况下,拒绝原假设的概率。例如,如果α=0.05,意味着在原假设为真的情况下,有5%的概率会错误地拒绝原假设。
-
验证前提条件:在进行假设检验时,需要验证前提条件是否满足。例如,对于t检验,需要验证数据是否服从正态分布、方差是否齐等。这些前提条件的验证可以通过绘制直方图、计算偏度和峰度等方法进行。
-
确定检验统计量:根据研究问题和数据类型,选择适当的检验统计量。常用的检验统计量包括t统计量、χ²统计量、F统计量等。例如,对于单样本均值的检验,可以使用t统计量;对于两个独立样本均值的检验,可以使用t统计量或F统计量。
-
计算检验统计量的值并判断:根据样本数据计算检验统计量的值。然后,根据显著性水平α和检验统计量的分布,确定拒绝域。如果计算出的检验统计量值落在拒绝域内,则拒绝原假设;否则,接受原假设。
-
将统计检验结果转换成实际结果:将统计结论转化为实际结论。例如,如果拒绝了原假设,可以得出“改造后的每小时生产数显著高于改进前的水平”的结论。如果接受了原假设,则得出“没有足够的证据表明改造后的每小时生产数显著高于改进前的水平”的结论。
通过以上步骤,可以系统地进行假设检验,从而得出科学合理的结论。
如何选择合适的统计方法进行假设检验?
选择合适的统计方法进行假设检验需要考虑多个因素,包括研究问题的性质、数据的类型和分布、样本大小等。以下是一些常见的假设检验方法及其适用场景:
-
t检验:用于比较两组平均值的差异,适用于小样本计量数据。具体包括:
- 单样本t检验:比较样本平均值与已知总体平均值的差异。
- 独立样本t检验:比较两个独立样本的平均值差异。
- 配对样本t检验:比较两个相关样本或重复测量的平均值差异。
-
U检验(Z检验) :用于比较样本平均值与已知总体平均值的差异,适用于大样本计量数据。当总体标准差已知且样本量大于30时使用。
-
方差分析(ANOVA) :用于比较三个或更多组的平均值差异,适用于正态分布、方差齐性的多组间计量比较。具体包括:
- 单因素方差分析:比较多个组的平均值差异。
- 两因素方差分析:比较多个组在两个因素下的平均值差异。
-
Wilcoxon符号秩检验:用于非参数检验,适用于不满足正态性假设条件的样本。
-
K-S检验:用于检验样本是否符合已知分布,评估拟合程度。
-
卡方检验:用于观察频数与期望频数之间的显著差异,适用于分类变量。
-
曼-惠特尼检验:用于比较两个独立样本的中位数是否相等,适用于小样本数据。
-
Friedman检验:用于多个相关样本或重复测量的中位数差异,适用于小样本数据或不满足正态性假设条件。
在选择统计方法时,还需要遵循以下步骤:
- 建立原假设和备择假设:根据具体问题确定零假设(H0)和备择假设(H1)。
- 选择合适的统计量:根据数据类型和分布选择适当的统计量,如t值、卡方值等。
- 确定显著性水平:通常选择α=0.05或α=0.01,表示拒绝原假设的概率。
- 计算统计量的数值:根据样本数据计算统计量的值。
- 判断统计量是否落在拒绝域中:如果统计量的值落在拒绝域中,则拒绝原假设;否则,接受原假设。
数据清洗与预处理中,有哪些高级技术可以处理复杂的数据问题?
在数据清洗与预处理中,处理复杂的数据问题需要采用多种高级技术。以下是一些常见的高级技术及其应用:
-
机器学习和深度学习:
- 异常检测:使用机器学习算法(如Isolation Forest、Local Outlier Factor等)来识别和处理异常值。
- 数据插补方法:利用机器学习模型(如KNN、决策树等)进行缺失值的插补。
- 时间序列数据处理:使用深度学习模型(如LSTM、GRU等)来处理时间序列数据中的缺失值和异常值。
-
数据转换和规范化:
- 数据类型转换:将数据转换为适合分析的格式,例如将文本数据转换为数值数据。
- 数据标准化:使用Z-score标准化、小数定标规范化等方法来处理不同量纲的数据。
- 特征工程:通过特征选择、特征构造等方法来提高数据的质量和模型的性能。
-
数据融合和集成:
- 数据融合:将来自不同来源的数据整合到一个统一的视角中,确保数据的一致性和完整性。
- 数据集成:通过数据映射和API等方式,将不同数据源的数据整合到一起。
-
数据降维和采样:
- 主成分分析(PCA) :通过降维技术减少数据的维度,同时保留最重要的信息。
- 随机采样:从原始数据集中随机选择子集,以减少计算复杂度。
-
自动化工具和平台:
- SPSS:使用SPSS等自动化工具进行数据清洗、转换和探索性分析。
- Tushare平台:利用Tushare平台进行金融数据分析中的数据去重和类型转换。
-
数据质量控制:
- 质量检查和验证:通过检查和验证数据的一致性和准确性,确保数据的可靠性。
- 数据质量评估:使用适当的指标(如准确率、召回率等)来评估数据清洗的效果。
-
可视化和解释:
- 数据可视化:通过图表、图形和地图等可视化手段解释数据分析结果。
- 统计分析:使用统计方法(如皮尔逊相关系数、正态分布检验等)来分析数据的分布和关系。
相关文章:
数据分析如何做EDA
探索性数据分析(EDA,Exploratory Data Analysis)是数据分析过程中至关重要的一步,其目的是通过统计和可视化技术对数据进行初步分析,从而揭示数据的潜在模式、特征和异常值,并为后续的数据预处理、特征工程…...
AD域控粗略了解
一、前提 转眼大四,目前已入职上饶一公司从事运维工程师,这与我之前干的开发有着很大的差异,也学习到了许多新的知识。今天就写下我对于运维工作中常用的功能——域控的理解。 二、为什么要有域控,即域控的作用 首先我们必须要…...
【计算机网络】TCP/IP 网络模型有哪几层?
目录 应用层 传输层 网络层 网络接口层 总结 为什么要有 TCP/IP 网络模型? 对于同一台设备上的进程间通信,有很多种方式,比如有管道、消息队列、共享内存、信号等方式,而对于不同设备上的进程间通信,就需要网络通…...
使用 Typora 编写 MD 文档:从入门到精通(附赠百度网盘下载地址)
引言 Markdown(简称 MD)是一种轻量级标记语言,广泛应用于技术写作、博客撰写、文档管理等领域。Typora 是一款功能强大且易于使用的 Markdown 编辑器,支持实时预览、语法高亮、主题切换等功能,深受开发者和写作者的喜…...
Spring统一修改RequestBody
我们编写RestController时,有可能多个接口使用了相同的RequestBody,在一些场景下需求修改传入的RequestBody的值,如果是每个controller中都去修改,代码会比较繁琐,最好的方式是在一个地方统一修改,比如将he…...
【Flink实战】Flink -C实现类路径配置与实现UDF Jar
文章目录 1. 描述2. 使用语法3. -C 适用的 Flink 运行模式4. USING JAR 不可用 1. 描述 Flink 中的 -C 选项用于将 URL 添加到作业的类加载器中。URL可以指向本地、HTTP 服务器或 HDFS 等资源的Jar文件。 注意: 此处的classpath的url必须是一个能够在client&…...
DevOps的个人学习
一、DevOps介绍 软件开发最初是由两个团队组成: 开发团队:负责设计和构建系统。运维团队:负责测试代码后部署上线,确保系统稳定安全运行。 这两个看似目标不同的团队需要协同完成一个软件的开发。DevOps整合了开发与运维团队&a…...
【东莞常平】戴尔R710服务器不开机维修分享
1:2025-02-06一位老客户的朋友刚开工公司ERP服务器一台戴尔老服务器故障无法开机,于是经老客户介绍找到我们。 2:服务器型号是DELL PowerEdge R710 这个服务器至少也有15年以上的使用年限了。 3:客户反馈的故障问题为:…...
STM32自学记录(八)
STM32自学记录 文章目录 STM32自学记录前言一、ADC杂记二、实验1.学习视频2.复现代码 总结 前言 ADC 一、ADC杂记 ADC其实就是一个电压表,把引脚的电压值测出来,放在一个变量里。 ADC:模拟——数字转换器。 ADC可以将引脚上连续变化的模拟电…...
【Java八股】JVM
JVM 1. jvm内存区域分为哪些部分 线程私有的:程序计数器、虚拟机栈、本地方法栈 程序计数器:指示当前线程执行到的字节码文件的行号,是线程切换后保证线程能恢复到正确的执行位置的关键 虚拟机栈:用于存储方法调用的数据&…...
Citespace之关键词爆发检测分析(进阶分析)
在开始citespace进行关键词爆发检测分析之前,如果不会使用citespace的,可以参考我之前这一篇博客: https://blog.csdn.net/m0_56184997/article/details/145536095?spm1001.2014.3001.5501 一、创建工程后进行设置 在创建好工程后…...
解锁 DeepSeek 模型高效部署密码:蓝耘平台深度剖析与实战应用
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
一周发生AI事件总结(02.08)
本周人工智能领域发生的所有事件: Ilya Sutskever的初创公司正洽谈以约200亿美元估值进行融资:据路透社报道,由前OpenAI首席科学家Ilya Sutskever创立的人工智能初创公司Safe Superintelligence正洽谈以“至少”200亿美元的估值进行融资。该…...
NIO——网络编程
文章目录 非阻塞 vs 阻塞阻塞非阻塞多路复用 Selector好处创建绑定 Channel 事件监听 Channel 事件select 何时不阻塞 💡处理 accept 事件事件发生后能否不处理💡 处理 read 事件为何要 iter.remove()💡cancel 的作用💡不处理边界…...
IDEA关联Tomcat,部署JavaWeb项目
将IDEA与Tomcat关联 创建JavaWeb项目 创建Demo项目 将Tomcat作为依赖引入到Demo中 添加 Web Application 编写前端和后端代码 配置Tomcat server,并运行...
12. k8s二进制集群之kubelet部署
什么是kubelet准备事项创建kubelet-bootstrap.kubeconfig文件创建kubelet配置文件创建kubelet服务配置文件(将kubelet配置成系统服务)分发CA证书及Kubelet-bootstrap.kubeconfig到所有工作节点最后启动工作节点的kubelet服务总结什么是kubelet Kubelet 是 Kubernetes 的核心…...
【5】阿里面试题整理
[1]. 介绍一下ZooKeeper ZooKeeper是一个开源的分布式协调服务,核心功能是通过树形数据模型(ZNode)和Watch机制,解决分布式系统的一致性问题。 它使用ZAB协议保障数据一致性,典型场景包括分布式锁、配置管理和服务注…...
android的DataBinding的使用
参考: Android基础入门:dataBinding的简单使用 Android DataBinding的使用...
ChatGPT搜索免费开放:AI搜索引擎挑战谷歌霸主地位全面分析
引言 2025年2月6日,OpenAI宣布ChatGPT搜索功能向所有用户免费开放,且无需注册登录。这一重大举措在搜索引擎行业引发巨大反响,有观点认为"谷歌搜索时代即将结束"。本文将深入分析ChatGPT生成式AI搜索对谷歌搜索业务及全球搜索市场…...
从0开始掌握Java开发框架:学习路线与系统指南
目录 1. Java 开发框架的分类1. Web 开发框架2. 持久层框架3. 依赖注入框架4. 微服务框架5. 测试框架 2. 主要框架的作用及关系(1)Spring Framework(2)Spring MVC(3)Spring Boot(4)M…...
边缘计算网关驱动智慧煤矿智能升级——实时预警、低延时决策与数字孪生护航矿山安全高效运营
迈向智能化煤矿管理新时代 工业物联网和边缘计算技术的迅猛发展,煤矿安全生产与高效运营正迎来全新变革。传统煤矿监控模式由于现场环境复杂、数据采集和传输延时较高,已难以满足当下高标准的安全管理要求。为此,借助边缘计算网关的实时数据…...
每日一题--数组中只出现一次的两个数字
数组中只出现一次的两个数字 题目描述数据范围提示 示例示例1示例2 题解解题思路位运算方法步骤: 代码实现代码解析时间与空间复杂度按位与操作获取最小位1的原理为什么选择最低有效的 1 位而不是其他位? 题目描述 一个整型数组里除了两个数字只出现一次…...
React Hooks 与 Class 组件相比有何优势
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
浏览器的缓存方式几种
浏览器的缓存方式主要分为以下几种: 1. 强制缓存(强缓存 / Memory Cache & Disk Cache) 通过 Expires 或 Cache-Control 头部控制。在缓存有效期内,浏览器直接使用缓存,不发起请求。 关键HTTP头: Ex…...
新装windows系统配置
安装windows 将windows镜像iso工具刻录到u盘里。开机选择u盘启动&安装激活。Win10专业版用户请在命令提示符窗口中依次输入:slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GXslmgr /skms kms.03k.orgslmgr /ato系统安装完成后,可以到https://www.microsof…...
Racecar Gym 总结
1.Racecar Gym 简介 Racecar Gym 是一个基于 PyBullet 物理引擎 的自动驾驶仿真平台,提供 Gymnasium(OpenAI Gym) 接口,主要用于强化学习(Reinforcement Learning, RL)、多智能体竞速(Multi-Ag…...
活动预告 |【Part1】 Azure 在线技术公开课:迁移和保护 Windows Server 和 SQL Server 工作负载
课程介绍 通过 Microsoft Learn 免费参加 Microsoft Azure 在线技术公开课,掌握创造新机遇所需的技能,加快对 Microsoft 云技术的了解。参加我们举办的“迁移和保护 Windows Server 和 SQL Server 工作负载”活动,了解 Azure 如何为将工作负…...
可视化大屏的热力图,显示热点事件最直观。
可视化大屏的热力图在显示热点事件方面之所以直观,主要有以下原因: 视觉呈现特点 颜色直观表意:热力图通过不同的颜色来表示数据的密度或强度。通常情况下,红色等暖色调表示高密度或高热度区域,代表热点事件发生较为…...
认识Electron 开启新的探索世界一
一、Electron轻松入门 1.搭建开发环境: 一般情况下开发者会使用node.js来创建electron项目,node.js是一个基于Chrome V8引擎的javascript运行环境,所以首先需要到官网去下载安装node.js 下载链接:https://nodejs.org/enhttps://no…...
每日一题洛谷P5733 【深基6.例1】自动修正c++
#include<iostream> #include<string> using namespace std; int main() {string t;cin >> t;for (int i 0; i < t.length(); i){if (t[i] > a && t[i] < z){t[i] A - a;}cout << t[i];}return 0; }...
