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值。