python 利用Scipy计算person 和spearman相关系数
python 利用Scipy计算person 和spearman相关系数
觉得有用的话,欢迎一起讨论相互学习~
- 学习以下两位大佬的讲解
(Pearson)皮尔逊相关系数和spearman相关系数(附python实现)
皮尔逊相关系数
- 下面是皮尔逊相关系数的计算公式,只需要将(X和Y的协方差)/(X的标准差*Y的标准差)
spearman相关系数
简单的相关系数的分类
那么对于这两个系数,怎样的值才是好的呢,遵循下面的关系
0.8-1.0:极强相关
0.6-0.8:强相关
0.4-0.6:中等强度相关
0.2-0.4:弱相关
0.0-0.2:极弱或者无相关
区别
- 那么有个问题,是所有的变量都可以用这两个系数吗,这两个变量当然是有区别的,区别如下。
- 连续数据,正态分布,线性关系,用pearson相关系数是最恰当,当然用spearman相关系数也可以,效率没有pearson相关系数高。
- 上述任一条件不满足,就用spearman相关系数,不能用pearson相关系数。
- 两个定序测量数据(顺序变量)之间也用spearman相关系数,不能用pearson相关系数。
- Pearson相关系数的一个明显缺陷是,作为特征排序机制,他只对线性关系敏感。如果关系是非线性的,即便两个变量具有一一对应的关系,Pearson相关性也可能会接近0。
Code
import scipy.stats
# Create two lists of random values
x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y = [2, 1, 2, 4.5, 7, 6.5, 6, 9, 9.5]
print(scipy.stats.pearsonr(x, y)[0])
# 0.9412443251336238
print(scipy.stats.spearmanr(x, y)[0])
# 0.903773601456181
Code-检验spearman和pearson之间的关系
# Create two lists of random values
x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y = [2, 1, 2, 4.5, 7, 6.5, 6, 9, 9.5]
# Calculate Spearman’s Rank Correlation
# Spearman’s rank correlation is the Pearson’s correlation coefficient of the ranked version of the variables.
# Create a function that takes in x's and y's
def spearmans_rank_correlation(xs, ys):
# Calculate the rank of x's
xranks = pd.Series(xs).rank()
# Caclulate the ranking of the y's
yranks = pd.Series(ys).rank()
# Calculate Pearson's correlation coefficient on the ranked versions of the data
return scipy.stats.pearsonr(xranks, yranks) # 计算pearson系数
print(spearmans_rank_correlation(x, y)[0])
# 0.9037736014561808
# Calculate Spearman’s Correlation Using SciPy
# 计算spearman秩相关系数
# Just to check our results, here it Spearman's using Scipy
print(scipy.stats.spearmanr(x, y)[0])
# 0.903773601456181