最近遇到需要用统计学知识衡量两个变量的相关程度,于是用了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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
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为显著性 |
输出结果为:
1 2 3 4 5 6 7 8 9 10 11 |
----------------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 |