R数据科学-第3章探索性数据分析-1
EDA:探索性数据分析,需要使用的工具有:可视化、数据转换和建模。
进行EDA最简单的方式是将问题作为指导调查研究的工具。提出问题后,这个问题就使你将注意力集中在数据集特定的部分,并帮助你进行有关图形、模型和数据转换的决定。
对于该提出什么样的问题来指导研究,还没有确定的规则。但有两类问题总是有助于我们在数据中发现知识:
1.变量本身会发生何种变动?
2.不同变量之间会发生何种相关变动?
一、变动
1.对分布进行可视化表示
选择可视化变量分布的方法依据的是这个变量是分类变量还是连续变量。分类变量在R中通常保存为因子或字符向量。
1)检查分类变量的分布,可以使用条形图:
ggplot(data=diamonds)+geom_bar(aes(x=cut))
可以使用dplyr::count()手动计算这些值:
diamonds %>% count(cut)
# A tibble: 5 x 2
cut n
<ord> <int>
1 Fair 1610
2 Good 4906
3 Very Good 12082
4 Premium 13791
5 Ideal 21551
2)检查连续变量的分布,可以使用条形图:
ggplot(data=diamonds)+geom_histogram(aes(x=carat),binwidth = 0.5)
可以通过dplyr::count和ggplot2::cut_width函数的组合来手动计算结果:
diamonds %>% count(cut_width(carat,0.5))
A tibble: 11 x 2
`cut_width(carat, 0.5)` n
<fct> <int>
1 [-0.25,0.25] 785
2 (0.25,0.75] 29498
3 (0.75,1.25] 15977
4 (1.25,1.75] 5313
5 (1.75,2.25] 2002
6 (2.25,2.75] 322
7 (2.75,3.25] 32
8 (3.25,3.75] 5
9 (3.75,4.25] 4
10 (4.25,4.75] 1
11 (4.75,5.25] 1
如果想在一张图上叠加多个直方图,可以用geom_freqploy函数。它可以执行与geom_histogram一样的计算过程,但不使用条形图来展示计数,而是使用折线图。
ggplot(data=diamonds,aes(x=carat,color=cut))+geom_freqpoly(binwidth=0.5)
2.典型值
为了发现有用的问题,我们常常看是否具有意料之外的情况:
1)哪些值是最常见的,为什么?
2)哪些值是非常罕见的,为什么?和你的预期相符吗?
3)能发现任何异乎寻常的模式吗?如何解释?
我们对重量小于3的钻石重新绘制更为精确的直方图:
smaller<-diamonds %>% filter(carat<3)
ggplot(smaller,aes(x=carat))+geom_histogram(binwidth=0.01)
我们根据以上问题对此问题提出更具有针对性的问题:
1)为什么重量为整数克拉和常见分数(0.25,0.5,0.75,1.25,1.5...)克拉的钻石更多 ?
2)为什么位于每个峰值稍偏右的钻石比位于稍偏左的钻石更多?
3)为什么没有重量超过3克拉的钻石?
一般来说,相似值聚集形成的簇表示数据中存在子组。我们可以提出以下问题以便更好的理解子组:
1)每个簇中的观测是如何相似的?
2)不同簇之间的观测如何不相似?
3)如何解释或藐视各个簇?
4)为什么有些簇的外观具有误导作用?
3.异常值
异常值是与众不同的观测或者模式之外的数据点。如果数据量比较大,有时很难在直方图上发现异常值,唯一能表示存在异常值的证据是:y轴的取值范围出奇的宽。
为了能够更容易的发现异常值,可以使用coord_cartesian()函数将y轴靠近0的部分放大:
ggplot(diamonds)+geom_histogram(aes(x=y),binwidth=0.5)+coord_cartesian(ylim=c(0,50))
我们观察到3个异常值大概在0、30、60左右。接着,使用dplyr将它们找出来:
diamonds %>% filter(y<3|y>20) %>% arrange(y)
钻石的宽度不可能是0毫米,这些观测值肯定是错误的;而钻石宽度为32毫米和59毫米也令人震惊,它们简直是无价之宝!
使用带有异常值和不带异常值的数据进行分析,如果两次分析结果差别不大,而又无法说明为什么会有异常值,那么完全可以用缺失值代替异常值,然年继续分析。但是如果两次分析结果有显著差别,那么就不能在没有正当理由的情况下丢弃它们。要弄清楚出现异常值的原因。
4.缺失值
如果在数据集中发现异常值,但只想继续其余的分析工作时,有两种选择:
1)将带有可疑值得行全部丢弃:
diamonds%>%filter(between(y,3,20))
2)用缺失值来代替异常值(推荐使用)
最简单的做法是使用mutate函数创建一个新变量来代替原来的变量。
diamonds2<-diamonds %>% mutate(y=ifelse(y<3|y>20,NA,y))
ifelse函数有三个参数,第一个参数为逻辑向量,如果结果为TRUE,函数的结果就是第二个参数的值,否则就是第三个参数的值。