
在本教程中,您将探索多种数据可视化方法及其背后的统计学原理。尤其关注如何在数据框中识别变量之间的趋势与关系。
没错,您将重点学习相关性与回归等概念!首先,您会在 R 中了解相关性。随后,您将学习如何使用 ggplot2 和 GGally 等包在 R 中绘制相关矩阵。最后,您将了解有哪些类型的相关性,以及它们对后续分析意味着什么。
如果您希望更深入学习,建议考虑 DataCamp 的相关与回归课程。
背景
在今天的教程中,您将使用从 Kaggle 获取的电影数据集,来学习如何更好地理解变量之间的关系。
我对数据做了少量整理,以确保分析可“同类对比”,例如统一货币单位。否则,对 gross、budget 和 profit 等变量进行统计分析将会产生误导。您可以访问原始数据集。
导入数据
要使用 movies 数据集并投入分析,您可以用 read.csv() 函数将数据导入数据框,并存到名为 movies 的变量中!
movies <- read.csv(url("http://s3.amazonaws.com/dcwoods2717/movies.csv"))
就这么简单,马上开始吧!
数据的基本检查
导入数据框后,先对数据有个基本认识是个好主意。首先,查看所分析数据的结构。下面是使用这个非常简单且有用的函数 str() 的结果:
str(movies)
## 'data.frame': 2961 obs. of 11 variables:
## $ title : Factor w/ 2907 levels "10 Cloverfield Lane",..: 1560 2143 34 2687 1405 1896 2633 894 1604 665 ...
## $ genre : Factor w/ 17 levels "Action","Adventure",..: 6 12 5 5 5 3 2 8 3 8 ...
## $ director : Factor w/ 1366 levels "Aaron Schneider",..: 474 472 781 828 175 1355 1328 1328 968 747 ...
## $ year : int 1920 1929 1933 1935 1936 1937 1939 1939 1940 1946 ...
## $ duration : int 110 100 89 81 87 83 102 226 88 144 ...
## $ gross : int 3000000 2808000 2300000 3000000 163245 184925485 22202612 198655278 84300000 20400000 ...
## $ budget : int 100000 379000 439000 609000 1500000 2000000 2800000 3977000 2600000 8000000 ...
## $ cast_facebook_likes: int 4 109 995 824 352 229 2509 1862 1178 2037 ...
## $ votes : int 5 4546 7921 13269 143086 133348 291875 215340 90360 6304 ...
## $ reviews : int 2 107 162 164 331 349 746 863 252 119 ...
## $ rating : num 4.8 6.3 7.7 7.8 8.6 7.7 8.1 8.2 7.5 6.9 ...
从控制台可以看到,该数据框包含 2961 条观测与 11 个变量。
顺便说一句,即使每部电影只有一小时,您也需要连续看四个多月才能全部看完!
控制台还列出了每个变量的名称、变量类型以及部分取值。这让我们对数据框的内容有了不错的了解,而这种了解对后续分析至关重要。
另一个有助于快速高层概览数据框的好函数是 summary()。请注意它与运行 str() 所产出结果的异同。
summary(movies)
## title genre
## Home : 3 Comedy :848
## A Nightmare on Elm Street : 2 Action :738
## Across the Universe : 2 Drama :498
## Alice in Wonderland : 2 Adventure:288
## Aloha : 2 Crime :202
## Around the World in 80 Days: 2 Biography:135
## (Other) :2948 (Other) :252
## director year duration
## Steven Spielberg : 23 Min. :1920 Min. : 37.0
## Clint Eastwood : 19 1st Qu.:1999 1st Qu.: 95.0
## Martin Scorsese : 16 Median :2004 Median :106.0
## Tim Burton : 16 Mean :2003 Mean :109.6
## Spike Lee : 15 3rd Qu.:2010 3rd Qu.:119.0
## Steven Soderbergh: 15 Max. :2016 Max. :330.0
## (Other) :2857
## gross budget cast_facebook_likes
## Min. : 703 Min. : 218 Min. : 0
## 1st Qu.: 12276810 1st Qu.: 11000000 1st Qu.: 2241
## Median : 34703228 Median : 26000000 Median : 4604
## Mean : 58090401 Mean : 40619384 Mean : 12394
## 3rd Qu.: 75590286 3rd Qu.: 55000000 3rd Qu.: 16926
## Max. :760505847 Max. :300000000 Max. :656730
##
## votes reviews rating
## Min. : 5 Min. : 2.0 Min. :1.600
## 1st Qu.: 19918 1st Qu.: 199.0 1st Qu.:5.800
## Median : 55749 Median : 364.0 Median :6.500
## Mean : 109308 Mean : 503.3 Mean :6.389
## 3rd Qu.: 133348 3rd Qu.: 631.0 3rd Qu.:7.100
## Max. :1689764 Max. :5312.0 Max. :9.300
##
只需一条命令,R 就能返回数据框中每个变量的一些关键统计信息。现在您已了解手头的数据了,让我们更深入地探索吧!
特征工程:计算利润
回看现有变量,似乎有些数值变量可以加以运算,从而为数据框提供新的洞见。
例如,您有 gross 和 budget 变量,何不稍作子集运算,计算每部电影的利润呢?
您可以用公式 profit = gross - budget 来计算利润。请在下方的 DataCamp Light 代码块中试一试!
太棒了!
您会看到我们的数据框中既有“赚钱机器”,也有“吞金黑洞”。
profit 这个变量很可能在后续分析中派上用场,所以让我们把 profit 作为新列添加到数据框中。
相关性
现在已将 profit 作为新列加入数据框,是时候更仔细地考察数据集中变量之间的关系了。
让我们看看 profit 相对每部电影的 rating 是如何波动的。
为此,您可以使用 R 内置的 plot 和 abline 函数,其中 plot 会生成散点图,abline 会加上一条回归线或“最佳拟合线”,这是因为我们包含了线性模型参数,稍后您会看到。
输出结果是否如您所料?

总体来看,rating 越高的电影往往有更高的 profit。换句话说,至少在我们的数据框中,rating 与 profit 之间存在正相关。
话虽如此,即便粗看这张图也会发现,仍有不少高评分但并非大片的电影,同时也有不少非常赚钱但评分相对较低的电影。
相关性并不意味着因果关系!
下面有个小例子帮助理解相关与因果的区别:我在海滩边卖冰淇淋。城市里闯红灯的人数通常会随着我的冰淇淋销量增加而上升,但我的冰淇淋会导致人们无视交通法规吗?还是有其他因素在起作用?我的冰淇淋确实很棒,但晴朗的天气大概更能解释为何人们想吃冰淇淋,也不想在斑马线旁晒太阳。冰淇淋销量和闯红灯人数之间确实存在一种关系(相关),但您无法明确断言它是因果关系。
在继续本教程时,请牢记这条思路!
在 R 中计算相关性
那么,在 movies 中,变量之间存在哪些关系?您又如何定量评估这些关系?
第一种方式是使用 cor() 计算相关性与相关矩阵:
注意,您还可以指定方法,以表明要计算哪种相关系数。需要小心,因为这些相关方法都有各自的假设:Kendall 和 Spearman 方法只适用于有序输入。这意味着您需要先对数据排序,再计算相关系数。
此外,默认方法 Pearson 相关假设您的变量服从正态分布,变量之间存在线性关系,并且数据围绕回归线近似正态分布。
另外,您也可以使用 Hmisc 包中的 rcorr() 来计算 Pearson 和 Spearman 相关的显著性水平。
您还会注意到,相关矩阵本质上是一张表,用来显示一组变量之间的相关系数。这已经是了解数据集中变量关系的很好起点了,但我们在下一节里再更深入一些。
可视化探索相关性:R 相关矩阵
接下来,您将使用 movies 数据框中的变量来绘制一张相关矩阵。这张简单的图能让您快速看出哪些变量对其他变量呈现负相关、正相关、弱相关或强相关。
为实现这一点,您将使用一个很实用的包 GGally 和其中的 ggcorr() 函数。
函数调用形式为 ggcorr(df),其中 df 是您要调用的那个数据框。该函数的输出是一个三角形配色矩阵,标有变量名。每个变量相对于其他变量的相关系数,可以通过在矩阵中按行和/或按列读取对应单元格来获取,具体取决于该变量在矩阵中的位置。
听起来可能有点绕,但实际操作非常简单,试试下面的代码块吧!

在您刚创建的相关矩阵中(顺便说一句,做得很好!),您可以找到与某个变量(如 year)对应的行或列,并通过与另一个变量对应单元格的颜色来查看它们的相关系数。
以 year 为例,您会看到它与 budget 呈弱正相关,与 rating 呈类似的弱负相关。
相关系数总是介于 -1 到 1 之间(包含端点)。相关系数为 -1 表示完美的负向拟合,此时 y 值的下降速率与 x 值的上升速率相同。相关系数为 1 表示完美的正向拟合,此时 y 值的上升速率与 x 值的上升速率相同。
在大多数情况下,如上面的 year 示例,相关系数会落在 -1 与 1 之间的某个位置。
您是否注意到相关矩阵中显示的变量有点不对劲?
movies 中并非所有变量都出现了!
这是因为 movies 中并非所有变量都是数值型的。ggcorr 会自动忽略非数值变量,这省去了用户在创建矩阵前手动“剔除”这类变量的时间。
如果您希望相关矩阵更醒目(或者像我一样有点色弱),可以做一些简单调整,生成更具视觉吸引力、信息量更大的矩阵。
在接下来的代码中,您会用到 label 参数,它可以设为 TRUE 或 FALSE。默认是 FALSE,但如果添加 label = TRUE,每个关系的相关系数就会显示在相应单元格中。这样您就不用再根据颜色刻度去“猜”每个系数的大小了。
label_alpha 参数允许您根据相关系数的强弱来调整每个标签的不透明度。这对快速的可视化分析非常有帮助。
别只听我说,亲自试试吧!
现在我们来绘制一张更好的相关矩阵:

在接下来的图中,您会看到当出现“强”相关时,其回归线(x/y)的斜率更接近 1/1 或 -1/1;而“弱”相关的图,其回归线的斜率可能非常小。斜率越接近 1/1 或 -1/1,意味着两变量的关系越密切。
对我们的 movies 数据框来说,这样的回归线能对变量关系给出有力洞见,也可能暗示变量之间的相互依赖。
例如,在之前 profit 相对于 rating 的图中,回归线呈中等强度的正斜率。回看相关矩阵,这两个变量的相关系数为 0.3。
合情合理,对吧?
相关性的类型
现在我们再通过更多图例来看看上一节中出现的不同相关类型!
强相关:绘制投票数与评论数
我们先绘制两组呈强正相关的变量。
查看相关矩阵,votes 与 reviews 符合条件,相关值为 0.8。这意味着回归线的斜率应较接近 1/1。
在本练习及后续练习中,您将使用 ggplot2 包。ggplot2 是一套强大的工具,可用于创建具有说服力的数据可视化。
在这里,您将使用 ggplot2 包中的 qplot 函数。根据传给 geom(几何图层)参数的图形类型不同,qplot 可以生成多种图。
在下方代码中,geom 被设为包含两种几何类型的向量:point 和 smooth。point 生成散点图,smooth 生成趋势线。您还会注意到 method 被设为 lm,这表示趋势线将是我们在之前“profit 随 years 变化”图中所见的那条熟悉的线性回归直线。
总之,您将看到快速生成高质量数据可视化有多么简单!

您可能注意到在上面的 qplot 中包含了 alpha 参数。qplot 中的 alpha 会对散点图中的点应用不透明度梯度,这与它在 ggcorr 中改变相关系数标签不透明度的方式类似。
在当前设置下,只有当一个点被另外 5 个点重叠时才会达到完全不透明。增减 alpha 分母中的数字会影响改变一个点不透明度所需的重叠点数量。使用这种美学映射的一个原因是,它可以帮助用户快速识别图中数据点的密集区域,从而一眼之间便能获得新的洞见。
动手调整一下代码,看看效果吧!
弱相关:绘制利润随年份变化
现在我们通过绘制 profit 相对 years 的图,来看看“弱”负相关是什么样子。这次我们没有指定 method,因此趋势线将根据数据以曲线方式变化(拟合曲线),这是该函数的默认行为。您会注意到,在趋势线的某些部分,浅灰色区域的大小会随趋势线置信区间而增大或缩小。
如果您对置信区间的概念还不熟悉,不必担心!R 会帮您完成计算,练习之后我们再做更好的解释。
现在,请先填好必要的代码并观察结果!

现在您已经看到置信区间与平滑曲线的实际效果了,可以做出哪些观察?
- 首先,在图的起始部分,
profit似乎随着year的增加而上升。 - 其次,您会注意到在平滑曲线的初期,灰色区域(置信区间)较大,而数据点(或观测值)较少。
- 第三,随着曲线进入观测值更为密集的区间,灰色区域缩小并几乎贴合曲线,而曲线在后期
year开始下降。
总之,将置信区间与平滑曲线一起绘制,可以让我们看到与回归线相关的不确定性。观测值越少,不确定性越大;观测值越多,不确定性越小。
这对于可视化变量关系在整个数据框中的变化非常有用,也揭示了观测值的密集程度是如何改变拟合曲线的。
但需要注意的是,该图可能有些误导,因为仅从视觉上并不容易判断变量之间是正相关还是负相关。
现在,让我们用与“votes 对 reviews”相同的方式来绘制“profit 随 year 变化”的图:只需将每个参数中的“…….”替换为合适的代码,使年份绘制在 x 轴上,profit 在 y 轴上。别忘了指定 “data” 所对应的数据框!

回看相关矩阵,您会看到 profit 与 year 的相关系数为 -0.1,在带有最佳拟合线的图中也许比在采用拟合曲线的图中更易于观察。
融会贯通
现在我们再来看 GGally 中另一个强大的函数 ggpairs。该函数的优势在于,它能创建一个矩阵,将多个变量之间的相关系数、散点图(包含带置信区间的最佳拟合线)以及密度图组合展示。
只用这一函数,您就能把本教程所覆盖的要点有效地整合在一起,并以简明易懂的方式呈现。
在下面的代码块中,从数据框中挑选您最喜欢的三个变量(无需手动取子集!),填进去并运行!

如您所料,很多情境下都会有一种更合适的图表类型——关键在于了解可用的可视化技术、如何使用它们,以及最终结果所代表的含义!