详解《R数据科学》--第五章 EDA

中文版第5章对应英文版第七章。讲的是探索性数据分析,结合了dplyr和ggplot2。


1.简介

提出问题→通过可视化,转换和建模来解决问题→优化并提出新问题

2.提出问题

变量自身会发生何种变动?
变量之间会发生何种相关变动?
术语:在tidydata(整洁的数据)中,行是观测,列是变量。

3.变动

3.1对分布进行可视化表示

分类变量--例如diamonds中的cut
View(diamonds)

第一件事还是端详数据:

#复习一下如何查看每列的非重复值
distinct(diamonds,cut)
#如何查看每个非重复值出现的次数
count(diamonds,cut)

cut仅有5个固定的取值,是分类变量,可以用条形图进行可视化。

library(tidyverse)
ggplot(data = diamonds) +
  geom_bar(mapping = aes(x = cut))
连续变量-例如diamonds中的carat

用直方图进行可视化

ggplot(data = diamonds) +
  geom_histogram(mapping = aes(x = carat), binwidth = 0.5)

其中,binwidth是定义等宽分箱的宽度,也可以用bins定义分箱数。
在同一张图中叠加多个直方图,用geom_freqpoly()代替。
统计每个区间的观测数量

diamonds %>% 
  count(cut_width(carat, 0.5))

3.3.典型值

直方图或条形图较高的读数,表示常见值。聚集成簇成为子组。

3.3.异常值

以diamonds中的y列为例作直方图,发现x轴取值范围出气地宽。(此处翻译有误,原文是x轴)



为了便于查看异常值,用coord_cartesian(ylim())将y轴靠近0地部分放大。

ggplot(diamonds) + 
  geom_histogram(mapping = aes(x = y), binwidth = 0.5)
ggplot(diamonds) + 
  geom_histogram(mapping = aes(x = y), binwidth = 0.5) +
  coord_cartesian(ylim = c(0, 50))

找出异常值

filter(diamonds,y < 3 | y > 20) %>% 
  select(price, x, y, z) %>%
  arrange(y)

在异常值中,有7个是缺失值,长宽高都是零蛋。

4.缺失值

#异常值的处理方法:
#(1)丢弃
diamonds2 <- diamonds %>% 
  filter(between(y, 3, 20))
#(2)用缺失值代替异常值
diamonds2 <- diamonds %>% 
  mutate(y = ifelse(y < 3 | y > 20, NA, y))#表示如果符合要求,就替换为NA
#ggplot中明确移除缺失值的命令:na.rm=TRUE
ggplot(data = diamonds2, mapping = aes(x = x, y = y)) + 
  geom_point(na.rm = TRUE)

flights中取消的航班:

nycflights13::flights %>% 
  mutate(
    cancelled = is.na(dep_time),
    sched_hour = sched_dep_time %/% 100,
    sched_min = sched_dep_time %% 100,
    sched_dep_time = sched_hour + sched_min / 60
  ) %>% 
  ggplot(mapping = aes(sched_dep_time)) + 
    geom_freqpoly(mapping = aes(colour = cancelled), binwidth = 1/4)

新加的cancelled变量是逻辑值,TRUE和FALSE,所以将颜色映射给它,就自然分成了两组,变成了两条曲线。
练习(1):直方图会丢弃缺失值,条形图则会将NA单列为一个分类,统计其数目。

5.相关变动

(1)分类变量与连续变量

其实钻石质量、钻石切割水平都不是决定价格的决定性因素,因此出现负相关很正常,可以不理他。
reorder函数对变量进行重排序:
(请注意例子是根据hwy来对class进行重排序)

ggplot(data = mpg) +
  geom_boxplot(mapping = aes(x = reorder(class, hwy, FUN = median), y = hwy)) #FUN是分类依据

翻转在ggplot2中讲过,用coord_flip()

(2)两个分类变量

geom_count和geom_tile
例子是diamonds中cut和color的相关变动,统计每个组合的观测数量:

count(diamonds,color,cut) 
ggplot(data = diamonds) +
  geom_count(mapping = aes(x = cut, y = color)) #count的可视化表示
diamonds %>% 
  count(color, cut) %>%  
  ggplot(mapping = aes(x = color, y = cut)) +
    geom_tile(mapping = aes(fill = n)) #geom_tile更好看

(3)两个连续变量

ggplot(data = diamonds) +
  geom_point(mapping = aes(x = carat, y = price)) #散点图
ggplot(data = diamonds) + 
  geom_point(mapping = aes(x = carat, y = price), alpha = 1 / 100)#设置透明度更美观的散点图
smaller <- diamonds %>% 
  filter(carat < 3)
ggplot(data = smaller) +
  geom_bin2d(mapping = aes(x = carat, y = price))#矩形分箱
# install.packages("hexbin")
ggplot(data = smaller) +
  geom_hex(mapping = aes(x = carat, y = price))#六边形分箱

将其中一个连续变量分箱,使其相当于分类变量,每组生成一个箱线图。其缺点是不体现每个分箱的观测数量。
设置var.width=TRUE使箱线图的宽度与观测数量成正比,或用cut_number设置箱线图分组的数目。

ggplot(data = smaller, mapping = aes(x = carat, y = price)) + 
  geom_boxplot(mapping = aes(group = cut_width(carat, 0.1)))

6.模式和模型

模式是两个变量之间存在的系统性关系,可以揭示相关变动。
如果说变动会生成不确定性,那么相关变动就会减少不确定性。
如果两个变量共同变化,可以根据一个预测另一个
如果相关变动归因于因果关系,可以使用一个控制另一个。
“模型是用于从数据中抽取模式的一种工具”

library(modelr)

mod <- lm(log(price) ~ log(carat), data = diamonds)

diamonds2 <- diamonds %>% 
  add_residuals(mod) %>% 
  mutate(resid = exp(resid))

ggplot(data = diamonds2) + 
  geom_point(mapping = aes(x = carat, y = resid))

对于残差反应价格,我是非常不理解的,怎么预测一个值的误差,能反映这个值本身的大小呢?看到这段代码一脸懵逼。
于是进行了一些探索
注意:以下探索并非标准答案,如有谬误敬请指出。

?lm
?add_residuals

lm的帮助文档看完还是懵逼,在add_residuals中找到了一段有用的说明和一个例子:
model,add_residuals takes a single model; the output column will be called resid
这个函数为数据框添加新列resid,即残差。

df <- tibble::data_frame(
  x = sort(runif(100)),
  y = 5 * x + 0.5 * x ^ 2 + 3 + rnorm(length(x))
)
plot(df)
m1 <- lm(y ~ x, data = df)
df %>% add_residuals(m1)
m2 <- lm(y ~ poly(x, 2), data = df)
df %>% spread_residuals(m1, m2)
df %>% gather_residuals(m1, m2)

示例代码中有m1 <- lm(y ~ x, data = df)以及df %>% add_residuals(m1),与书中的代码比较相似了。
由此得知,lm是一个创建模型的命令,add_residuals则是增加残差列。书中的代码增加了log和exp,数量级差异很大的数字,被log函数改造成了一组同一数量级、差别很小的数字,残差都在3以内,约等于没有啊,这就是做到了消除价格和克拉数的强关系,好烧脑。。
--此处感谢刘靖涛师兄帮我理清思路。


微信公众号生信星球同步更新我的文章,欢迎大家扫码关注!


我们有为生信初学者准备的学习小组,点击查看◀️
想要参加我的线上线下课程,也可加好友咨询🔼
如果需要提问,请先看生信星球答疑公告

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 刘小泽开始写于18.9.4晚,这必定是一个持续性更新的过程昨天jimmy一发朋友圈,单篇阅读量很快超过了我们的关注...
    刘小泽阅读 1,179评论 0 12
  • 写在前面 ggplot2 是一个功能强大且灵活的R包 ,由Hadley Wickham 编写,其用于生成优雅的图...
    Boer223阅读 27,910评论 0 67
  • 该部分学习内容来自《R for Data Science》。 这次我们学习可视化与处理数据来系统地探索数据——统计...
    王诗翔阅读 7,998评论 4 12
  • 简介 文章较长,点击直达我的博客,浏览效果更好。本文内容基本是来源于STHDA,这是一份十分详细的ggplot2使...
    taoyan阅读 50,884评论 7 159
  • 此时此刻,我回忆起今晚和分公司同行们的聚餐过程,又是陷入深深的后悔之中。因为,我八卦的嘴又打开了,又和同行们说我们...
    珍珠相思阅读 546评论 0 2