Python 斯皮尔曼等级顺序相关度,斯皮尔曼等级顺序相关度用于比较两个变量等级的相关性。它巧妙地避免了量级的影响,即使变量关系是非线性的,也能找到二者之间的关联,计算公式如下:
首先计算每对观测值对应的等级值 r_x 和 r_y 差的平方和,对应的Python算法借助sum()
函数和len()
函数实现,如下所示:
def rank_corr(pairs: Sequence[Pair]) -> float:
ranked = rank_xy(pairs)
sum_d_2 = sum((r.r_x -r.r_y) ** 2 for r in ranked)
n = len(pairs)
return 1 - 6 * sum_d_2 / (n * (n ** 2 - 1))
前面用Rank_XY
对象表示数据对,所以这里计算r_x
和r_y
属性的差值,然后取差值的平方和。
相关系数的具体含义请参阅统计学方面的资料。相关系数为0表示没有相关性,在散点图上显示为无规律的随机数据点。值接近1或者-1则表示的相关性很强,散点图上显示为一条清晰的直线或者曲线。
基于安斯库姆四重奏数据序列的示例如下:
>>> data = (Pair(x=10.0, y=8.04), Pair(x=8.0, y=6.95),
... Pair(x=13.0, y=7.58), Pair(x=9.0, y=8.81),
... Pair(x=11.0, y=8.33), Pair(x=14.0, y=9.96),
... Pair(x=6.0, y=7.24), Pair(x=4.0, y=4.26),
... Pair(x=12.0, y=10.84), Pair(x=7.0, y=4.82),
... Pair(x=5.0, y=5.68))
>>> round(pearson_corr( data ), 3)
0.816
可以看出该数据集的相关性很强。
前面讲过如何计算皮尔逊相关系数,其中corr()
函数的输入值是两个无关的数值序列。下面用它来处理Pair
对象序列:
import Chapter_4.ch04_ex4
def pearson_corr(pairs: Sequence[Pair]) -> float:
X = tuple(p.x for p in pairs)
Y = tuple(p.y for p in pairs)
return ch04_ex4.corr(X, Y)
将Pair
对象拆开后,作为输入传给corr()
函数,得到了另外一种相关系数:皮尔逊相关系数,以此比较两个变量的标准值。对于某些数据集来说,皮尔逊相关系数和斯皮尔曼相关系数差别不大,而对另外一些数据集来说,二者的差别会非常大。
在EDA中,同时使用多种统计工具是很重要的。要想知道具体原因,分别计算一下安斯库姆四重奏数据集的斯皮尔曼等级相关系数和皮尔逊相关系数就清楚了。