9.5 斯皮尔曼秩相关

如果两组数据的变量分别大致正常,而且两者呈线性关系,那么皮尔逊相关系数可以很好地刻画它们之间的关系。但是皮尔逊相关系数对异常值的影响很敏感。

Anscombe构造的4组数据(Anscombe's quartet)很明显地说明了这个问题。这4个数据集有相同的相关系数:第一个是两组变量呈线性关系,但有随机噪声的影响;第二个是两组变量呈某种非线性的函数关系;第三个是两组变量呈完全的线性关系,但是有一个异常值;最后一个是两组变量并无相关性,但一个异常值除外。读者可以从http://wikipedia.org/wiki/Anscombe's_quartet了解到更具体的信息。

斯皮尔曼秩相关系数(Spearman's Rank Correlation)可以用在存在异常值和变量分布非常不对称的情况。为了计算斯皮尔曼秩相关系数,我们先计算序列中数值的秩(rank),即某个值在序列中按大小排序后的位置。例如在序列{7, 1, 2, 5} 中,值5的秩等于3,因为按从小到大排序,5在这个序列中排第3位。将序列转换成秩之后,再计算皮尔逊相关系数,得到的结果就是斯皮尔曼秩相关系数。

除了斯皮尔曼秩相关系数,另一种方法是对原始的数据做一个变换,使得变换之后的结果接近正态分布,然后再算皮尔逊相关系数。例如,如果数据近似服从对数正态分布,那么我们可以先对数据取对数,然后再算相关系数。

习题9-3

请编写一个计算数据序列的秩的函数。例如,设一个数据序列为{7, 1, 2, 5},做秩转换后结果为{4, 1, 2, 3}。

如果数据序列中出现多个相同的值,那么严格的做法是给这些数值赋予一个秩的平均值。但如果不这么严格,而是随意地给这些值安排个顺序,一般也不会造成什么误差。

请编写一个函数,计算两个数据序列的斯皮尔曼秩相关系数。读者可以从http://thinkstats.com/correlation.py下载本题的答案。

习题9-4

请下载http://thinkstats.com/brfss.pyhttp://thinkstats.com/brfss_scatter.py并运行这些代码。确保你能读懂BFRSS数据,然后生成散点图。

将生成的图与图9-1做比较,你期望这里的皮尔逊相关系数会是多少?计算得到的结果呢?

成人体重大致服从对数正态分布,也有相关的异常值影响。请绘制体重的对数与身高的散点图,并计算变换后的皮尔逊相关系数。

最后,请计算体重和身高的斯皮尔曼秩相关系数。你觉得哪个相关系数能更好地描述这两个变量关系的强度?可从http://thinkstats.com/brfss_corr.py下载到问题的答案。