R数据科学|5.5.1 习题解答
.5.1 习题解答
问题一
前面对比了已取消航班和未取消航班的出发时间,使用学习到的知识对这个对比的可视化结果进行改善。
解答
可以绘制箱线图进行比较
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() +
geom_boxplot(mapping = aes(y = sched_dep_time, x = cancelled))
问题二
在钻石数据集中,哪个变量对于预测钻石的价格最重要?这个变量与切割质量的关系是怎样的?为什么这两个变量的关系组合会导致质量更差的钻石价格更高呢?
解答
我会先从如下几个变量考虑:carat、clarity、color和cut。我忽略了刻画砖石维度的变量,因为carat测量的是钻石的大小,因此包含了这些变量中的大部分信息。因为price和carat都是连续型变量,可以通过绘制散点图来寻找它们之间的关系:
ggplot(diamonds, aes(x = carat, y = price)) +
geom_point()
ggplot(data = diamonds, mapping = aes(x = carat, y = price)) +
geom_boxplot(mapping = aes(group = cut_width(carat, 0.1)), orientation = "x")
ggplot(data = diamonds, mapping = aes(x = carat, y = price)) +
geom_boxplot(mapping = aes(group = cut_width(carat, 0.1)), orientation = "x")
```diamonds %>%
mutate(color = fct_rev(color)) %>%
ggplot(aes(x = color, y = price)) +
geom_boxplot()diamonds %>%
mutate(color = fct_rev(color)) %>%
ggplot(aes(x = color, y = price)) +
geom_boxplot()
ggplot(data = diamonds) +
geom_boxplot(mapping = aes(x = clarity, y = price))
ggplot(diamonds, aes(x = cut, y = carat)) +
geom_boxplot()
问题三
安装ggstance
包,并创建一个横向箱线图。这种方法与使用coord_flip()
函数有何区别?
解答
使用 coord_flip()
函数
ggplot(data = mpg) +
geom_boxplot(mapping = aes(x = reorder(class, hwy, FUN = median), y = hwy)) +
coord_flip()
安装 ggstance
包
library("ggstance")
ggplot(data = mpg) +
geom_boxploth(mapping = aes(y = reorder(class, hwy, FUN = median), x = hwy))
orientation
来改变图形朝向。
ggplot(data = mpg) +
geom_boxplot(mapping = aes(y = reorder(class, hwy, FUN = median), x = hwy), orientation = "y")
问题四
箱线图存在的问题是,在小数据集时代开发而成,对于现在的大数据集会显示出数量极其庞大的异常值。解决这个问题的一种方法是使用字母价值图。安装lvplot
包,并尝试使用geom_lv()
函数来显示价格基于切割质量的分布。你能发现什么问题?如何解释这种图形?
解答
像箱形图一样,字母值图的箱形图对应于分位数。然而,它们包含的分位数远比箱形图多。它们对于大型数据集非常有用,因为, 更大的数据集可以给出超过四分位数的精确估计。并且更大的数据集应该有更多的异常值(以绝对值计算)。
ggplot(diamonds, aes(x = cut, y = price)) +
geom_lv()
问题五
比较并对比geom_violin()
、分面的geom_histogram()
和着色的geom_freqploy()
。每种方法的优缺点是什么?
解答
geom_freqpoly()
更适合查找:这意味着给定价格,很容易知道哪个切割密度最高。然而,重叠的线使得区分总体分布如何相互关联变得困难。geom_violin()
和geom_histogram()
有相似的优点和缺点。很容易从视觉上区分分布整体形状的差异(偏斜度、中心值、方差等)。然而,由于我们不能轻易地比较分布的垂直值,因此很难查找给定价格下哪一类别的密度最高。所有这些方法都依赖于调整参数来确定分布的平滑程度。
ggplot(data = diamonds, mapping = aes(x = price, y = ..density..)) +
geom_freqpoly(mapping = aes(color = cut), binwidth = 500)
ggplot(data = diamonds, mapping = aes(x = price)) +
geom_histogram() +
facet_wrap(~cut, ncol = 1, scales = "free_y")
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ggplot(data = diamonds, mapping = aes(x = cut, y = price)) +
geom_violin() +
coord_flip()
问题六
对于小数据集,如果要观察连续变量和分类变量间的关系,有时使用 geom_jitter() 函数是特别有用的。ggbeeswarm 包提供了和 geom_jitter() 相似的一些方法。列出这些方法 并简单描述每种方法的作用。
解答
有两种方法:
geom_quasirandom()生成混合了抖动和小提琴图像的图像。有几种不同的方法可以精确地确定点的随机位置是如何生成的。 geom_beeswarm()生成一个类似于小提琴绘图的绘图,但是通过抵消这些点。我将使用mpg盒图示例,因为这些方法显示单独的点,它们更适合于较小的数据集。
ggplot(data = mpg) +
geom_quasirandom(mapping = aes(
x = reorder(class, hwy, FUN = median),
y = hwy
))
ggplot(data = mpg) +
geom_quasirandom(
mapping = aes(
x = reorder(class, hwy, FUN = median),
y = hwy
),
method = "tukey"
)
ggplot(data = mpg) +
geom_quasirandom(
mapping = aes(
x = reorder(class, hwy, FUN = median),
y = hwy
),
method = "tukeyDense"
)
ggplot(data = mpg) +
geom_quasirandom(
mapping = aes(
x = reorder(class, hwy, FUN = median),
y = hwy
),
method = "frowney"
)
ggplot(data = mpg) +
geom_quasirandom(
mapping = aes(
x = reorder(class, hwy, FUN = median),
y = hwy
),
method = "smiley"
)
ggplot(data = mpg) +
geom_beeswarm(mapping = aes(
x = reorder(class, hwy, FUN = median),
y = hwy
))
往期推荐