ggplot2-为可视化建模1

简介

建模是可视化的必备的工具,这一章,将探索以下两个建模和可视化之间的紧密联系

  • 将模型当成工具,用于去除图像中的明显模式。这种方法很有用,因为明显的模式会掩盖掉微小的效应。通常来说,最强的效应都是已知和可预计的,所以移除这些明显效应有助于观察数据不同寻常的部分
  • 其余情形下,数据太多,不能用顺手的图像来展示它们。模型有助于汇总数据,从而获得更高层次的观察

本章将着重于线性模型来达成以上目标。线性模型是基础但强大的统计工具,强烈推荐Julian J. Faraway的两本书
Linear Models with R, Extending the Linear Model with R
这两本书涵盖了线性模型的一些理论,但是更注重实用性,以及在R中使用线性模型(和它们的扩展)的方法

除了线性模型,还有很多其余的建模工具,但是这里不做介绍。一旦明白了如何使用线性模型来优化可视化成果,就应该知道如何把基本的思想转化到其它模型族上面。本章知识简单地介绍了可以做什么,但是,希望这一章能揭示出可视化是怎样使用建模技术来帮助创造强大地数据分析工具的

这一章知识简单地展现了可视化和建模之间地交叉知识点。掌握好可视化和建模这一组合是成为高效率数据科学家的关键之处。不幸的是,大部分书籍只侧重于可视化或只侧重于建模,而不是侧重于两者的结合

1. 移除趋势

到现在为止,对于钻石数据集的分析都受限于大小和价格之间的强相关性。这使得观察切工、颜色和净度的影响更加困难,因为更优质的钻石往往更小,因而更便宜。这种问题通常被称为“干扰(confounding)”。可以用线性模型来移除钻石大小对价格的影响。可以关注相对价格,而不是真正的绝对价格:这一钻石在相同大小的钻石之中的相对价值
为了上手,只关注两克拉或以下的钻石的数据(数据集的96%)。这样处理的化可以避免一些奇怪的问题,如果感兴趣的话可以在练习题中继续探索。将会创建两个新的变量:价格取对数后的值和克拉数取对数后的值。这两个变量很有用,因为它们的图像显示出强线性趋势

diamonds2 <- diamonds %>%
	filter(carat <= 2) %>%
	mutate(lcarat = log2(carat), lprice = log2(price))
diamonds2
ggplot(diamonds2, aes(lcarat, lprice)) +
	geom_bin2d() + geom_smooth(method = "lm", se = FALSE,
	size = 2, color = "yellow") 

ggplot2-为可视化建模1

图形中使用geom_smooth()把拟合得最好的线覆盖在数据上面。重复地,可以在ggplot2外部使用lim()来拟合线性模型。这有助于获取直线的斜率和截距

mod <- lm(lprice ~ lcarat, data = diamonds2)
coef(summary(mod))
#> 	Estimate	Std.	Error	t value	Pr(>|t|)
#>(Intercept)	12.2	0.00211	5789	0
#>lcarat	1.7	0.00208	816	0

如果比较熟悉线性模型,也许会这样解读以上系数:log2(price) = 12.2 + 1.7 * log2(carat)。等价地,有price = 4900 * carat1.7。当然,能够解读那些系数是很有用的,但是即使不理解它们,这个模型依然是有用的。可以使用模型中的残差来移除趋势:每一粒钻石的价格减去它的预测价格,从而变得只依赖于重量。从几何意义上说,残差是每一数据点到拟合线之间的垂直距离。对于每粒钻石,残差告诉了它和相同大小的“平均”钻石的相对价格

diamonds2 <- diamonds2 %>% mutate(rel_price = resid(mod))
ggplot(diamonds2, aes(carat, rel_price)) + geom_bin2d()

ggplot2-为可视化建模1

值为0的相对价格意味着对应钻石的售价是平均值;正数意味着钻石比意料中要贵(对它的大小来说),负数则意味着它比意料中的要便宜
这里,精确地解读值得含义是有些刁钻的,因为这里的价格是log变换后的。残差提供的是绝对差值(x - expected),但是这里的式子是log2(price) - log2(expected price),或等价地log2(price/expected price)。如果“反变换”回原来的标度(2x),会有price/expected price。这样的话,数值的含义变得更加清晰,代价是丧失了log变换后的数据的良好对称性(例如,相对便宜和相对昂贵的钻石数据有相同的区间)。可以创建以下表格来帮助解读那些数据

xgrid <- seq(-2, 1, by = 1/3)
data.frame(logx = xgrid, x = round(2 ^ xgrid, 2))

这个表格展示了使用log2()而不是log()的理由:对数变换后数据变化1个单位对应着原有数据变化2倍。比如,rel_price的值减去1,意味着预测价格变成一半;而前者的值加上1则意味着后者的值变成两倍
接下来,通过使用价格和相对价格来观察颜色和切工是如何影响钻石价值的。对每一个颜色和切工的组合来计算平均价格和相对平均价格

color_cut <- diamonds2 %>% group_by(color, cut) %>%
	summarise(price = mean(price), rel_price = mean(rel_price))
color_cut

如果只看价格,则很难搞清楚钻石品质是如何影响价格的。最低品质的钻石(颜色为J,切工为fair)有着最高的平均价值!这是因为这些钻石也倾向于更大:大小和品质互相干扰了

ggplot(color_cut, aes(color, price)) +
	geom_line(aes(group = cut), color = "grey80") +
	geom_point(aes(color = cut))

ggplot2-为可视化建模1

然而,如果绘制出相对价格,会见到所预测的模式:钻石品质降低的时候,相对价格也会降低。最差品质钻石的价格是“平均”钻石价格的0.61倍(2-0.7

ggplot(color_cut, aes(color, rel_price)) +
	geom_line(aes(group = cut), color = "grey80") +
	geom_point(aes(color = cut))

ggplot2-为可视化建模1

这一技术适用于广泛的情形。每当可以显式地对图像中给的明显模式进行建模,就值得用一个移除了那个模式地模型,从而可以更清晰地观察到剩下来还有什么有趣地趋势

上一篇:5. Android MultiMedia框架完全解析 - 再谈Playback框架及一些学习方法的讨论


下一篇:Qt录制音频为pcm并进行ffmpeg aac编码