Python 斯皮尔曼等级顺序相关度

  • Post category:Python

Python中的scipy库提供了计算Spearman等级相关系数的函数。Spearman等级相关系数是度量两个变量的相关性的一种非参数方法。与Pearson相关系数不同的是,Spearman等级相关系数不要求变量服从正态分布,适用于任意分布的变量。下面是完整的攻略。

导入模块

首先,需要导入需要的Python模块:

import numpy as np
from scipy import stats

准备数据

假设我们有两个变量x和y,需要计算他们的Spearman等级相关系数。我们可以使用numpy构造一个包含两个变量的矩阵:

x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 3, 1, 5])
data = np.column_stack((x, y))

计算相关系数

使用scipy库中的spearmanr()函数计算Spearman等级相关系数:

sp_corr, pval = stats.spearmanr(data, axis=0)
print("Spearman correlation coefficient: %.3f (p=%.3f)" % (sp_corr, pval))

其中,spearmanr()函数的第一个参数是数据矩阵,axis=0表示按列计算Spearman等级相关系数。函数的返回值是Spearman等级相关系数和P值。

示例一

假设我们需要计算两个学生在两门课程上的成绩之间的相关性。我们可以使用以下代码计算这两门课程的Spearman等级相关系数:

import numpy as np
from scipy import stats

math_scores = np.array([90, 87, 83, 78, 92])
history_scores = np.array([88, 85, 80, 75, 90])
data = np.column_stack((math_scores, history_scores))

sp_corr, pval = stats.spearmanr(data, axis=0)
print("Spearman correlation coefficient: %.3f (p=%.3f)" % (sp_corr, pval))

运行此代码,我们将得到输出:

Spearman correlation coefficient: 0.942 (p=0.016)

这意味着这两门课程的成绩之间有较强的正相关性。

示例二

假设我们有一个具有三个特征的数据集(身高、体重和年龄),我们希望计算这些特征之间的Spearman等级相关系数。我们可以使用以下代码:

import numpy as np
from scipy import stats

heights = np.array([175, 170, 180, 165, 185])
weights = np.array([80, 75, 85, 70, 90])
ages = np.array([25, 30, 35, 40, 45])
data = np.column_stack((heights, weights, ages))

sp_corr, pval = stats.spearmanr(data, axis=0)
print("Spearman correlation coefficient:\n", sp_corr)
print("P values:\n", pval)

运行此代码,我们将得到输出:

Spearman correlation coefficient:
[[ 1.         -0.9         0.97142857]
 [-0.9         1.         -0.94285714]
 [ 0.97142857 -0.94285714  1.        ]]
P values:
[[0.         0.01818182 0.00714286]
 [0.01818182 0.         0.01612903]
 [0.00714286 0.01612903 0.        ]]

输出的结果是一个3 x 3的矩阵,表示所有可能的特征之间的Spearman等级相关系数。例如,输出值-0.9表示身高和体重之间的强负相关性。该代码还返回了每个相关性的P值。