最近遇到需要用统计学知识衡量两个变量的相关程度,于是用了scipy中的工具中Pearson相关与Spearman相关系数。
它俩的关系,下面这篇文章说的非常好:Pearson 相关方法和Spearman相关方法的比较
Pearson和Spearman在衡量两个量没有关系上都很给力。如果绝对值接近于0,那么差不多就是没关系了。其中,Pearson在0.8-1.0,为极强相关,0.6-0.8为强相关,0.4-0.6为中等程度相关,0.2-0.4为弱相关,0-0.2为极弱相关或无关。
附上一个小Demo:
import numpy as np
from scipy.stats import pearsonr
from scipy.stats import spearmanr
from scipy.stats import ttest_ind
x = np.random.normal(0,1,500) # 从-1到1生成随机数
y1 = np.random.normal(0,1,500) # 均值为0,方差为1的一组数
y2 = np.random.normal(0,100,500) # 均值为0,方差为10的一组数
print("----------------pearson----------------")
r1, p1 = pearsonr(x,y1)
print("r1 = ",r1)
print("p1 = ",p1)
#y2相比于y1,方差更大,混乱程度更高,与相x1的相关性越差
r2, p2 = pearsonr(x,y2)
print("r2 = ",r2) #[-1,1],绝对值约大越相关,正为正相关,负为负相关,为0时不相关
print("p2 = ",p2) #恒为非负,越大越相关,500个样本以上有较高可靠性
print("----------------spearman---------------")
c1, pv1 = spearmanr(x,y1)
print("c1 = ",c1)
print("pv1 = ",pv1)
#y2相比于y1,方差更大,混乱程度更高,与相x1的相关性越差
c2, pv2 = spearmanr(x,y2)
print("c2 = ",c2) #[-1,1],绝对值约大越相关,正为正相关,负为负相关,为0时不相关
print("pv2 = ",pv2) #恒为非负,越大越相关,500个样本以上有较高可靠性
#显著性检验
stat_val, p_val = ttest_ind(x, y1, equal_var=False)
print("----------------P-----------------------")
print("stat_val = ",stat_val) #相关性
print("p_val = ",p_val) #是否显著 <0.05为显著性
输出结果为:
----------------pearson----------------
r1 = 0.0001927775402233908
p1 = 0.9965692283410943
r2 = -0.04099559625239573
p2 = 0.3603073242705398
----------------spearman---------------
c1 = 0.011400429601718408
pv1 = 0.7992703026447947
c2 = -0.03298323593294373
pv2 = 0.4618025913714844