搜索
查看: 590|回复: 0

[R] <R for Data Science> 读书笔记5 | 第七章: 探索性数据分析EDA

[复制链接]

12

主题

18

帖子

155

积分

注册会员

Rank: 2

积分
155
发表于 2018-11-3 13:44:03 | 显示全部楼层 |阅读模式
本帖最后由 冒刷 于 2018-11-3 13:49 编辑

7  探索性数据分析 - Exploratory Data Analysis, 结合dplyr和ggplot2, library(tidyverse)加载包。
术语:Tabular data,tidy tabular data表示整齐的排放,列对应排放变量,而行对应排放变量的观测值。

7.1 简介  针对数据提出问题 -> 通过可视化、数据转换和建模(tools of EDA)来解决问题 -> 提炼和/或提出新问题

7.2 提出问题
我们很难在一开始就提出直入主题的问题,而问题的答案又对应有意义的发现,往往是通过不断地回答问题-解决问题-提出新问题-回答并解决新问题-甚至提出新的问题,一系列的问题引导我们深入接近发现的关键。
两类问题对于有趣的发现会有用:
  • 变量会发生怎样的变化?
  • 变量之间会发生怎样的共变/相关变动(covariation)?

7.3 Variation - describes the behaviour within a variable.
7.3.1 可视化变量分布
数据集:library(tidyverse)

分类变量:变量值是有限的取值i集合,通常使用条形图bar进行可视化
[AppleScript] 纯文本查看 复制代码
ggplot(data = diamonds) + geom_bar(mapping = aes(x =(cut))
# categorical variable - cut

连续变量:变量值是无限的取值集合,通常用直方图histogram进行可视化
[AppleScript] 纯文本查看 复制代码
ggplot(data = diamonds) + geom_histogram(mapping = aes(x = carat), binwidth = 0.5)
# continuous variable - carat

binwidth用于设置直方图中间隔的宽度,探索并设置不同的宽度对不同角度的数据可视化很有用, binwidth数值设置得越低,对数据展示得越细。例如上述对连续变量carat(克拉)的展示,当我们仅展示< 3克拉的钻石并选择以更窄的binwidth展示时,效果如下:
[AppleScript] 纯文本查看 复制代码
smaller <- diamonds %>% filter(carat < 3)
ggplot(data = smaller, mapping = aes(x = carat)) + geom_histogram(binwidth = 0.1)
[AppleScript] 纯文本查看 复制代码
ggplot(data = smaller, mapping = aes(x = carat)) + geom_histogram(binwidth = 0.01)

geom_freqpoly()用于将多个直方图叠加在同一张图中。
[AppleScript] 纯文本查看 复制代码
ggplot(data = smaller, mapping = aes(x = carat, colour = cut)) + geom_freqpoly(binwidth = 0.2)

7.3.2 典型值
条形图/直方图的柱子越高表示数值聚集越多,越普遍;越短表示越稀少。

7.3.3 异常值
异常值 - 数据集中散在的点。
[AppleScript] 纯文本查看 复制代码
ggplot(diamonds) + geom_histogram(mapping = aes(x = y), binwidth = 0.5)


图示x轴取值范围极大。
为了便于找到异常值,需要用coord_cartesian()找出y轴的极小值。
[AppleScript] 纯文本查看 复制代码
ggplot(diamonds) + geom_histogram(mapping = aes(x = y), binwidth = 0.5) + coord_cartesian(ylim = c(0, 50))

找出异常值
[AppleScript] 纯文本查看 复制代码
diamonds %>% filter(y < 3 | y > 20) %>% select(price, x, y, z) %>% arrange(y)

7.4 缺失值 - 当数据集中有异常值时,建议以缺失值替代异常值。
[AppleScript] 纯文本查看 复制代码
diamonds2 <- diamonds %>% mutate(y = ifelse(y < 3 | y > 20, NA, y))
#表示如果符合要求,就替换为NA


7.5 Covariation - describes the behaviour between variables.
7.5.1 分类变量与连续变量
[AppleScript] 纯文本查看 复制代码
ggplot(data = diamonds, mapping = aes(x = price)) + geom_freqpoly(mapping = aes(colour = cut), binwidth = 500)
# 默认y轴是符合条件的样本计数count,在这里不易看出组间差别
[AppleScript] 纯文本查看 复制代码
ggplot(data = diamonds, mapping = aes(x = price, y = ..density..)) + geom_freqpoly(mapping = aes(colour = cut), binwidth = 500)
# density, which is the count standardised so that the area under each freq polygon is one.

箱线图能更好展示组间分布差异。
[AppleScript] 纯文本查看 复制代码
ggplot(data = mpg, mapping = aes(x = class, y = hwy)) + geom_boxplot()

使用reorder()函数对变量进行排序展示
[AppleScript] 纯文本查看 复制代码
ggplot(data = mpg) + geom_boxplot(mapping = aes(x = reorder(class, hwy, FUN = median), y =hwy))
[AppleScript] 纯文本查看 复制代码
ggplot(data = mpg) + geom_boxplot(mapping = aes(x = reorder(class, hwy, FUN = median), y = hwy)) + coord_flip()
# coord_flip() 翻转坐标系

7.5.2 两个分类变量
通过对不同分类变量的两两组合进行计数,可视化分类变量间的covariation。可调用的函数:geom_count()和geom_tile()。
[AppleScript] 纯文本查看 复制代码
ggplot(data = diamonds) + geom_count(mapping = aes(x = cut, y = color))
[AppleScript] 纯文本查看 复制代码
diamonds %>% count(cut, color) %>% ggplot(mapping = aes(x = color, y = cut)) + geom_tile(mapping = aes(fill = n))

7.5.3 两个连续变量
[AppleScript] 纯文本查看 复制代码
ggplot(data = diamonds) + geom_point(mapping = aes(x = carat, y = price))[/color]
# 散点图scatterplots在数据量变大时数据点易在同一处覆盖而变得不适用。
[AppleScript] 纯文本查看 复制代码
ggplot(data = diamonds) + geom_point(mapping = aes(x = carat, y = price), alpha = 0.05)
[/size][/font]# alpha参数调整散点图的透明度,数值越低越透明
[AppleScript] 纯文本查看 复制代码
smaller <- diamonds %>% filter(carat < 3)
ggplot(data = smaller) + geom_bin2d(mapping = aes(x = carat, y = price))
#矩形分箱
ggplot(data = smaller) + geom_hex(mapping = aes(x = carat, y = price))
#六边形分箱
也可以将一个连续变量视作分类变量, 每组生成一个箱线图,组合可视化该分类变量和连续变量。
[AppleScript] 纯文本查看 复制代码
ggplot(data = smaller, mapping = aes(x = carat, y = price)) + geom_boxplot(mapping = aes(group = cut_width(carat, 0.1)))
#cut_width(x, width)将x轴按width长度进行箱线图分割
ggplot(data = smaller, mapping = aes(x = carat, y = price)) + geom_boxplot(mapping = aes(group = cut_number(carat, 10)))
#cut_number设置箱线图分组的数目

7.6 模式和模型
7.6.1 模式:patterns, 反映变量间的关系,可以揭示变量间的covariation。
  • 如果说变动会有不确定性,那么covariation会减少不确定性。
  • 如果两个变量covary,可以根据其中一个变量预测另一个变量。
  • 如果covariation归因于因果关系,可以使用其中一个变量控制另一个变量。

7.6.2 模型:models,从数据中提取patterns的一种工具。
如:cut和price的关系难以从图中得到理解,因为图中表现出切割质量一般的价格反而贵,这是因为cut和carat,以及carat和price的关系都密切,通过模型去除price和carat之间的紧密关系,从而使得探索price和cut的关系变得容易。
[AppleScript] 纯文本查看 复制代码
library(modelr)
# modelr: Modelling functions
mod <- lm(log(price) ~ log(carat), data = diamonds)
# lm is used to fit linear models. It can be used to carry out regression, single stratum analysis of variance and analysis of covariance.
diamonds2 <- diamonds %>% add_residuals(mod) %>% mutate(resid = exp(resid))
#add_residuals to a data frame. 为数据集增加残差列,残差指实际观测值与估计值(拟合值)之间的差,蕴含了有关模型基本假设的重要信息。若回归模型正确,可将残差看作误差的观测值。
ggplot(data = diamonds2) + geom_point(mapping = aes(x = carat, y = resid))
# 通过log和exp将数量级差别很大的变量降至了差别很小的范围,残差大都落在纵轴2以内,去除了price和carat的关系。
[AppleScript] 纯文本查看 复制代码
ggplot(data = diamonds2) + geom_boxplot(mapping = aes(x = cut, y = resid))




现在的切割质量和价格的关系符合逻辑关系。


7.7 other R resources
http://www.cookbook-r.com/Graphs/




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x



上一篇:慧美——R for data science前奏
下一篇:R for data science 第一章-使用ggplot2进行数据可视化
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|生信技能树 ( 粤ICP备15016384号  

GMT+8, 2019-10-22 23:04 , Processed in 0.041396 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.