如有疑问请至英文原文处自行查阅,本文内容不保证完全还原原文内容,仅作为学习中的记录。
探索性数据分析(Exploratory Data Analysis)EDA,是在没有明确问题的前提下以特定方法分析数据,在数据分析过程中找到新的问题并使用数据分析方法解决问题的循环探索过程。在探索过程中,探索者可以处在一种随心所欲的状态,但是需要在探索过程中找到感兴趣的问题,并将其付诸于实践进行解决。
EDA是任何数据分析的重要组成部分,即使我们对数据分析已经有了明确的需求。试想一下,在具有数据与明确的问题后,第一步仍然需要探索当前的数据是否符合分析的标准,是否具备解决问题的能力。在此基础上,EDA可以成为数据清洗的一种方法,EDA的过程中需要进行可视化、数据转换和建模。
本文中使用R语言进行探索性数据分析,在进行数据分析前需要安装“tidyverse”程辑包:
install.packages("tidyverse")
变差
变差(Variation)是指一个变量值随测量而变化的趋势。生活中很容易发现变差的存在,比如对同一对象进行多次测量时,每次的读数都可能是不同的。将变量的分布可视化是用于理解变量的变化模式的有效方法。变量在存储过程中可以是连续的也可以是离散的,比如性别、职位等变量在数值上是离散分布的,相对而言身高、体重等数值型变量则是连续分布的。对于离散分布的变量我们可以使用柱状图对其进行分布统计,每一个bar代表一类,y轴的高度为出现的次数。
library("tidyverse")
ggplot(data=diamonds) + geom_bar(mapping=aes(x=cut))
这里我们使用diamonds数据集进行分析,该数据集在“tidyverse”程辑包安装完毕后可直接使用。以上代码初始化了plot并以柱状图(geom_bar)绘制了cut(切割程度)列的分布统计结果。

对于连续的变量,则可以使用直方图的方式按特定的数值间隔,对落在指定区间内的记录数量进行统计。这里我们以0.5的间隔统计diamonds数据集中carat列(克拉)的数值分布,并使用直方图(geom_histogram)进行绘制。
ggplot(data=diamonds) + geom_histogram(mapping=aes(x=carat), binwidth=0.5)

我们发现绝大多数钻石的克拉数均处于0-3克拉之间,因此我们可以绘制更加细粒度的直方图查看更加精确的克拉数值分布。此处我们仅保留原始数据集中克拉数小于3的钻石记录,并将数值间隔缩小至0.1。
smaller <- filter(diamonds, carat < 3)
ggplot(data=smaller) + geom_histogram(mapping=aes(x=carat), binwidth=0.1)

若要在一张图内绘制多个直方图,可以用折线的方式替代原始直方图中的条带,此处我们分别统计各个切割级别的钻石对应克拉数的数值分布,采用geom_frepoly方法进行绘制。
ggplot(data=smaller) + geom_freqpoly(mapping=aes(x=carat, colour=cut), binwidth = 0.1)

在得到了上述图表后,通过观察图表我们需要在图表中找到我们感兴趣的问题,并进行新的数据探索与分析。比如:为什么各个切割级别的钻石会存在5个峰值,且多个峰值处在1,1.5,2这样的整数区间内?切割方式与克拉数是否存在一定的相关关系?是否克拉数越高的钻石越不容易切割为理想状态?
典型值 Typical Value
在上述柱状图和直方图中,较高长度的柱子表明对应的数值为变量的通用值,而其余的则是非通用值。下面我们提出了几个问题:1. 为什么整克拉和普通克拉的钻石更多? 2. 为什么在每个峰的右边的钻石要比左边的多? 3. 为什么没有比3克拉大的钻石?
在上述问题的基础上,我们对钻石克拉数分布进行更细粒度的划分(0.01),发现了更有意思的问题,为什么在峰值左侧存在显著的断层,而峰值右侧则是缓慢下降的。具有相似特性的数值区间可以看作是一个集群(cluster),又出现了以下问题:
1. 每个集群中的观测值彼此之间存在什么样的相似性?
2. 每个单独集群中的观测值有何不同?
3. 我们如何解释或描述每个集群?
4. 为什么集群的外观会产生误导?
ggplot(data=smaller) + geom_histogram(mapping=aes(x=carat), binwidth = 0.01)

下面的直方图显示了黄石国家公园中272个间歇泉喷发的时长(以分钟为单位)。 爆发时间似乎分为两类:短暂的爆发(大约2分钟)和长时间的爆发(4-5分钟),但两者之间几乎没有。上面的诸多问题都引导我们趋向于思考变量之间是否存在关系。
ggplot(data = faithful, mapping = aes(x = eruptions)) + geom_histogram(binwidth = 0.25)

异常值 Unusual Values
异常值是数据集中不寻常的观测值,异常值偏离与正常情况下数值的分布模式。有时异常值是数据输入错误,非输入错误的异常值则可能代表了重要的新科学。当拥有大量数据时,我们有时很难在柱状图中看到异常值。例如,从diamonds数据集中获取y变量的分布。异常值存在的唯一证据是x轴具有极高的数值上限,说明数据集中确实存在异于常值的y值。
ggplot(diamonds) + geom_histogram(mapping = aes(x = y), binwidth = 0.5)

由于异常值的存在通常是小概率事件,因此它在正常的分布图中被缩小弱化了,以至于我们无法用肉眼看出哪里存在问题。此时我们需要使用coord_cartesian()函数对y轴的小数值进行放大,即将图中y轴的值域修改为[0,50]。此时从图中可以发现存在3个异常值,分别处于0,30和60附近。
ggplot(diamonds) + geom_histogram(mapping = aes(x = y), binwidth = 0.5) + coord_cartesian(ylim = c(0, 50))

使用以下代码在数据集中提取小于3或大于20的异常值:
unusual <- diamonds %>%
filter(y < 3 | y > 20) %>%
select(price, x, y, z) %>%
arrange(y)
price x y z
<int> <dbl> <dbl> <dbl>
1 5139 0 0 0
2 6381 0 0 0
3 12800 0 0 0
4 15686 0 0 0
5 18034 0 0 0
6 2130 0 0 0
7 2130 0 0 0
8 2075 5.15 31.8 5.12
9 12210 8.09 58.9 8.06
本文介绍了探索性数据分析(EDA)的概念和重要性,使用R语言进行实战演示,包括变差的理解、典型值的探讨和异常值的检测。通过分析diamonds数据集,展示了如何利用柱状图、直方图进行数据可视化,发现数据中的模式和潜在问题,为后续深入分析提供方向。
&spm=1001.2101.3001.5002&articleId=106236366&d=1&t=3&u=0815d0c348be454fbf1caea865a4d89d)
2万+

被折叠的 条评论
为什么被折叠?



