python 利用Scipy计算person 和spearman相关系数

python 利用Scipy计算person 和spearman相关系数

觉得有用的话,欢迎一起讨论相互学习~

我的微博我的github我的B站

  • 学习以下两位大佬的讲解

(Pearson)皮尔逊相关系数和spearman相关系数(附python实现)

相关性系数及其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:极弱或者无相关

区别

  • 那么有个问题,是所有的变量都可以用这两个系数吗,这两个变量当然是有区别的,区别如下。
  1. 连续数据,正态分布,线性关系,用pearson相关系数是最恰当,当然用spearman相关系数也可以,效率没有pearson相关系数高。
  2. 上述任一条件不满足,就用spearman相关系数,不能用pearson相关系数。
  3. 两个定序测量数据(顺序变量)之间也用spearman相关系数,不能用pearson相关系数。
  4. 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

posted @ 2021-11-06 16:44  WUST许志伟  阅读(2862)  评论(0编辑  收藏  举报