相关系数与python实现


文章目录

  • 1. 皮尔逊相关系数
  • 2. 斯皮尔曼相关系数
  • 3. kendall 系数
  • 参考资料


1. 皮尔逊相关系数

适用数据:用于横向两个连续性随机变量间的相关系数。
数据要求:实验数据之间的差距不能太大
好比:研究人跑步的速度与心脏跳动的相关性,若是人突发心脏病,心跳为0(或者过快与过慢),那这时候咱们会测到一个偏离正常值的心跳,若是咱们把这个值也放进去进行相关性分析,它的存在会大大干扰计算的结果的 [1]。
相关系数与python实现_第1张图片

  1. numpy 中的代码
import numpy as np
x=np.array([1,3,5])
y=np.array([1,3,4])
pc=np.corrcoef(x,y)
print(f"皮尔森相关系数:{pc}")
  1. 调用scipy.stats中的pearsonr方法,能够附加输出显著性水平
    输出值:
    r : float,皮尔逊相关系数,[-1,1]之间。
    p-value : float,Two-tailed p-value(双尾P值); p值越小,表示相关系数越显著,一般p值在500个样本以上时有较高的可靠性。
from scipy.stats import pearsonr
import numpy as np
# 待测的两个序列
x=np.array([1,3,5])
y=np.array([1,3,4])
pc = pearsonr(x,y)
print(f"相关系数:{pc[0]}; 显著性水平:{pc[1]}")
  1. pandas包
import pandas as pd
data=pd.DataFrame({"x":[1,3,5],"y":[1,3,4]})
pc = data.corr("pearson")
print(f"皮尔森相关系数:{pc}")

注意事项:在求皮尔森相关性系数之后,一般还会用t检验之类的方法来进行皮尔森相关性系数检验,而t检验是基于数据呈正态分布的假设的。

2. 斯皮尔曼相关系数

适用数据: 用于衡量分类定序变量间的相关程度。斯皮尔曼相关性系数,一般也叫斯皮尔曼秩相关系数。“秩”,能够理解成就是一种顺序或者排序,那么它就是根据原始数据的排序位置进行求解 [2]

2.1 首先对两个变量(X, Y)的数据进行排序,而后记下排序之后的位置(X’, Y’),(X’, Y’)的值就称为秩次,秩次的差值就是上面公式中的di,n就是变量中数据的个数,最后带入公式就可求解结果。
2.2数据要求
由于是定序,因此咱们不用管X和Y这两个变量具体的值到底差了多少,只须要算一下它们每一个值所处的排列位置的差值,就能够求出相关性系数了.

相关系数与python实现_第2张图片

  1. pandas包
import pandas as pd
import numpy as np
 
#原始数据
x1=pd.Series([1, 2, 3, 4, 5, 6])
y1=pd.Series([0.3, 0.9, 2.7, 2, 3.5, 5])
 
#处理数据删除Nan
n=x1.count()
x1.index=np.arange(n)
y1.index=np.arange(n)
 
#分部计算
d=(x1.sort_values().index-y1.sort_values().index)**2
dd=d.to_series().sum()
p=1-n*dd/(n*(n**2-1))
 
#s.corr()函数计算
r=x1.corr(y1,method='spearman')
print(r,p) #0.942857142857143 0.9428571428571428
  1. scipy
    相关系数与python实现_第3张图片
    相关系数与python实现_第4张图片
from scipy import stats
stats.spearmanr([1,2,3,4,5], [5,6,7,8,7])
x2n = rng.standard_normal((100, 2))
y2n = rng.standard_normal((100, 2))
rho, pval = stats.spearmanr(x2n, y2n)

3. kendall 系数

在这里插入图片描述

肯德尔相关性系数,又称肯德尔秩相关系数,它也是一种秩相关系数,不过它所计算的对象是分类变量。
分类变量能够理解成有类别的变量,能够分为:
(1) 无序的,好比性别(男、女)、血型(A、B、O、AB);
(2) 有序的,好比肥胖等级(重度肥胖,中度肥胖、轻度肥胖、不肥胖)。
一般须要求相关性系数的都是有序分类变量。

import pandas as pd
import numpy as np
 
#原始数据
x=pd.Series([1, 2, 3, 4, 5, 6])
y=pd.Series([0.3, 0.9, 2.7, 2, 3.5, 5])
r = x.corr(y,method="kendall") #-0.2611165

参考资料

[1] https://blog.csdn.net/weixin_43876625/article/details/123919665
[2] http://www.javashuo.com/article/p-waavfymd-cx.html
[3] https://www.jianshu.com/p/652dcde6aa43

你可能感兴趣的:(python,机器学习,numpy)