斯皮尔曼相关性分析由英国心理学家查尔斯·斯皮尔曼(Charles Spearman)于1904年提出。他在研究智力测验时发现,智力测验的结果往往存在一定的相关性,但这些相关性并不总是线性的。因此,斯皮尔曼提出了一种基于排名的非参数方法,以更好地评估变量间的相关性。
斯皮尔曼相关系数(Spearman’s rho)通过计算变量排名之间的相关性来评估变量间的关系。其计算公式为:
ρ = 1 − 6 ∑ d i 2 n ( n 2 − 1 ) \rho = 1 - \frac{6 \sum d_i^2}{n(n^2 - 1)} ρ=1−n(n2−1)6∑di2
其中, d i d_i di 是每对变量排名差值, n n n 是样本数量。
斯皮尔曼相关性分析广泛应用于各种场景,特别是在以下情况下:
假设我们有一组数据,包含若干人的身高、体重、和每周运动时间,我们希望通过斯皮尔曼相关性分析来评估这些变量之间的关系。数据如下:
人 身高(cm) 体重(kg) 每周运动时间(小时)
A 175 70 7
B 160 60 3
C 180 80 5
D 170 75 6
E 165 65 2
数据准备:
人 身高(cm) 体重(kg) 每周运动时间(小时)
A 175 70 7
B 160 60 3
C 180 80 5
D 170 75 6
E 165 65 2
排名转换:
人 身高排名 体重排名 每周运动时间排名
A 2 3 1
B 5 5 4
C 1 1 3
D 3 2 2
E 4 4 5
计算排名差值和平方差:
人 身高排名差值 体重排名差值 每周运动时间排名差值 差值平方和
A 2-1=1 3-1=2 1-1=0 1^2 + 2^2 + 0^2 = 5
B 5-5=0 5-5=0 4-4=0 0^2 + 0^2 + 0^2 = 0
C 1-2=-1 1-3=-2 3-1=2 (-1)^2 + (-2)^2 + 2^2 = 9
D 3-3=0 2-2=0 2-1=1 0^2 + 0^2 + 1^2 = 1
E 4-4=0 4-4=0 5-5=0 0^2 + 0^2 + 0^2 = 0
计算斯皮尔曼相关系数:
对于每对变量,我们分别计算相关系数。例如,身高与体重的斯皮尔曼相关系数:
ρ 身高 , 体重 = 1 − 6 × 5 5 ( 25 − 1 ) = 0.75 \rho_{身高,体重} = 1 - \frac{6 \times 5}{5(25 - 1)} = 0.75 ρ身高,体重=1−5(25−1)6×5=0.75
类似地,我们可以计算其他变量对之间的斯皮尔曼相关系数。
使用Python进行斯皮尔曼相关性分析,我们可以借助scipy
库中的spearmanr
函数:
import numpy as np
from scipy.stats import spearmanr
# 数据准备
height = [175, 160, 180, 170, 165]
weight = [70, 60, 80, 75, 65]
exercise_time = [7, 3, 5, 6, 2]
# 计算斯皮尔曼相关系数
corr_height_weight, _ = spearmanr(height, weight)
corr_height_exercise, _ = spearmanr(height, exercise_time)
corr_weight_exercise, _ = spearmanr(weight, exercise_time)
print(f"身高与体重的斯皮尔曼相关系数: {corr_height_weight}")
print(f"身高与每周运动时间的斯皮尔曼相关系数: {corr_height_exercise}")
print(f"体重与每周运动时间的斯皮尔曼相关系数: {corr_weight_exercise}")
使用R进行斯皮尔曼相关性分析,可以使用cor
函数并指定方法为spearman
:
# 数据准备
height <- c(175, 160, 180, 170, 165)
weight <- c(70, 60, 80, 75, 65)
exercise_time <- c(7, 3, 5, 6, 2)
# 计算斯皮尔曼相关系数
corr_height_weight <- cor(height, weight, method = "spearman")
corr_height_exercise <- cor(height, exercise_time, method = "spearman")
corr_weight_exercise <- cor(weight, exercise_time, method = "spearman")
print(paste("身高与体重的斯皮尔曼相关系数:", corr_height_weight))
print(paste("身高与每周运动时间的斯皮尔曼相关系数:", corr_height_exercise))
print(paste("体重与每周运动时间的斯皮尔曼相关系数:", corr_weight_exercise))
斯皮尔曼相关性分析是一种灵活且有效的统计方法,特别适用于非正态分布或存在异常值的数据。通过对排名的分析,它能有效揭示变量间的相关关系,为研究和决策提供有力支持。