相关性检验函数
series.corr(other[, method, min_periods])
参数method:
pearson, spearman, kendall 相关性检验方法;
用途:
检查两个变量之间变化趋势的方向以及程度,值范围-1到+1,0表示两个变量不相关,正值表示正相关,负值表示负相关,值越大相关性越强。
1. person correlation coefficient(皮尔森相关性系数)
1.1.说明:
皮尔逊相关系数通常用r或ρ表示,度量两变量X和Y之间相互关系(线性相关)
r=1时X与Y关系可以表示为Y=aX+b,a>0;r=-1时X与Y关系表示Y=aX+b,a<0。如X与Y相互独立相关性为0
1.2.计算公式:
两变量ρ(X, Y)皮尔森相关性系数= 协方差cov(X,Y)/标准差的乘积(σX, σY)。< /FONT>
1.3.数据要求:
成对数据、连续 符合正态分布;数据间差异不能太大;变量准差不能为0即两变量中任何一个值不能都是相同。
1.4.用途:
1.连续数据,正态分布,线性关系,用pearson相关系数是最恰当,用spearman相关系数也可以,效率没有
pearson相关系数高。
2.上述任一条件不满足,就用spearman相关系数,不能用pearson相关系数。
3.两个定序测量数据之间也用spearman相关系数,不能用pearson相关系数。
其实, Spearman 和Pearson相关系数在算法上完全相同. 只是PEARSON相关系数是用原来的数值计算积差
相关系数, 而SPEARMAN是用原来数值的秩次计算积差相关系数.
示例:
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])
X1.mean() #平均值# 3.5
Y1.mean() #2.4
X1.var() #方差#3.5
Y1.var() #2.9760000000000004
X1.std() #标准差不能为0# 1.8708286933869707
Y1.std() #标准差不能为0#1.725108692227826
X1.cov(Y1) #协方差#3.0600000000000005
X1.corr(Y1,method="pearson") #皮尔森相关性系数 #0.9481366640102855
X1.cov(Y1)/(X1.std()*Y1.std()) #皮尔森相关性系数 # 0.9481366640102856
X1.corr(Y1,method='spearman') #0.942857142857143
X1.corr(Y1,method='kendall') #0.8666666666666666
在求皮尔森相关性系数以后,还会用t检验之类的方法来进行皮尔森相关性系数检验
2. spearman correlation coefficient(斯皮尔曼相关性系数)
秩: 可以理解成就是一种顺序或者排序,那么它就是根据原始数据的排序位置进行求解
用途:用于解决称名数据和顺序数据相关的问题。适用于两列变量,而且具有等级变量性质具有线性关系的资料。
能够很哈处理序列中相同值和异常值。
公式:
n为等级个数
d为二列成对变量的等级差数
计算过程:
先对两变量(X, Y)排序,记下排序以后位置(X’, Y’),(X’, Y’)值称为秩次,秩次差值就是上面公式中的di,n就是变量中数据的个数,最后带入公式就可求解结果。
斯皮尔曼相关性系数:ρs= 1-6*(1+1+1+9)/6*35=0.657
示例
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
x1=X1.dropna()
y1=Y1.dropna()
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
显示:
def show(x1,y1):
print('原始位置x 原x 秩次x 排序x 原始位置y 原y 秩次y 排序y 秩次差的平方')
for i in range(len(x1)):
xx1=x1.sort_values();yy1=y1.sort_values()
ix=x1.index[i]
ixx=xx1.index[i]
iy=y1.index[i]
iyy=yy1.index[i]
d_2=(ixx-iyy)**2
print(' {:5} {:10} {:5} {:5} {:10} {:10} {:5} {:5} {:10.2f}'.format(
ix,x1[i],ixx,xx1[i],iy,y1[i],iyy,yy1[i],d_2) )
show(x1,y1)
原始位置x 原x 秩次x 排序x 原始位置y 原y 秩次y 排序y 秩次差的平方
0 1 0 1 0 0.3 0 0.3 0.00
1 2 1 2 1 0.9 1 0.9 0.00
2 3 2 3 2 2.7 3 2.7 1.00
3 4 3 4 3 2.0 2 2.0 1.00
4 5 4 5 4 3.5 4 3.5 0.00
5 6 5 6 5 5.0 5 5.0 0.00
3. kendall correlation coefficient(肯德尔相关性系数)
kendalltau:等级相关系数,适用于两个变量均为有序分类的情况
用途:
肯德尔相关性系数,它也是一种秩相关系数,不过它所计算的对象是分类变量。
分类变量可以理解成有类别的变量,可以分
无序的,比如性别(男、女)、血型(A、B、O、AB);
有序的,比如肥胖等级(重度肥胖,中度肥胖、轻度肥胖、不肥胖)。
通常需要求相关性系数的都是有序分类变量。
计算公式:
R=(P-(n*(n-1)/2-P))/(n*(n-1)/2)=(4P/(n*(n-1)))-1,见附录
举例说明:
评委对选手评分(优、中、差等),想看两个(或者多个)评委对几位选手评价标准是否一致;
医院尿糖化验报告,想检验各个医院对尿糖的化验结果是否一致,可以使用肯德尔相关性系数进行衡量。
用corr函数求解method=“kendall”,假设老师对选手的评价等级---3表示优,2表示中,1表示差:
X= pd.Series([3,1,2,2,1,3])
Y= pd.Series([1,2,3,2,1,1])
Xcorr(Y,method="kendall") #-0.2611165
这时候就可以理解为两位老师对选手们的看法是呈相反趋势的,不过这种相反的程度不很大。
scipy.stats.
pointbiserialr
(x,y )
计算点双线相关系数及其p值。
点双相关用于测量二元变量x和连续变量y之间的关系。与其他相关系数一样,这个相关系数在-1和+1之间变化,0表示没有相关性。-1或+1的相关性意味着确定性关系。
此函数使用快捷方式,但产生的结果相同 pearsonr
。
参数: | x : array_like bools 输入数组。 y : array_like输入数组。 |
---|---|
返回: | 相关性 : 浮动 R值 pvalue : 浮动双尾p值 |
笔记
参考
[1] | J. Lev,“The Point Biserial Coefficient of Correlation”,Ann。数学。Statist。,Vol。20,no.1,pp.125-126,1949。 |
[2] | RF Tate,“离散变量与连续变量之间的相关性”。Point-Biserial Correlation。“,Ann。数学。Statist。,Vol。25,np。3,pp.603-607,1954。 |
[3] | http://onlinelibrary.wiley.com/doi/10.1002/9781118445112.stat06227/full |
例子
>>> from scipy import stats
>>> a = np.array([0, 0, 0, 1, 1, 1, 1])
>>> b = np.arange(7)
>>> stats.pointbiserialr(a, b)
(0.8660254037844386, 0.011724811003954652)
>>> stats.pearsonr(a, b)
(0.86602540378443871, 0.011724811003954626)
>>> np.corrcoef(a, b)
array([[ 1. , 0.8660254],
[ 0.8660254, 1. ]])
kendall秩相关系数(R)。设有n个统计对象,每个对象有两个属性。将所有统计对象按属性1取值排列,不失一般性,
设此时属性2取值的排列是乱序的。设P为两个属性值排列大小关系一致的统计对象对数。则:
R=(P-(n*(n-1)/2-P))/(n*(n-1)/2)=(4P/(n*(n-1)))-1
Kendall(肯德尔)系数的定义:n个同类的统计对象按特定属性排序,其他属性通常是乱序的。同序对(
concordant pairs)和异序对(discordant pairs)之差与总对数(n*(n-1)/2)的比值定义为Kendall(肯德尔)系数。
属性:
1)如果两个属性排名是相同的,系数为1 ,两个属性正相关。
2)如果两个属性排名完全相反,系数为-1 ,两个属性负相关。
3)如果排名是完全独立的,系数为0。
举例:
假如我们设一组8人的身高和体重在那里A的人是最高的,第三重,等等:
李四 | 王五 | 汤姆 | 姚明 | 巩俐 | 蔡琴 | 曹操 | 张飞 | |
身高 | 180 | 170 | 160 | 150 | 140 | 130 | 120 | 110 |
体重 | 80 | 75 | 90 | 85 | 70 | 60 | 55 | 65 |
我们看到,有一些相关的两个排名之间的相关性,可以使用肯德尔头系数,客观地衡量对应。
注意,A最高,但体重排名为 3 ,比体重排名为 4,5,6,7,8 的重,贡献5个同序对,即AB,AE,AF,AG,AH。
同理,我们发现B、C、D、E、F、G、H分别贡献4、5、4、3、1、0、0个同序对,因此,
P = 5 + 4 + 5 + 4 + 3 + 1 + 0 + 0 = 22.
因而R=(88/56)-1=0.57。这一结果显示出强大的排名之间的规律,符合预期。
程序如下:
import pandas as pd
import numpy as np
#原始数据
height=pd.Series([180,170,160,150,140,130,120,110])
weight=pd.Series([80,75,90,85,70,60,55,65])
# 处理数据
n=weight.count()
df=pd.DataFrame({'a':height,'b':weight})
df1=df.sort_values('b',ascending=False)
df1.index=np.arange(1,df.a.count()+1)
df2=df1.sort_values('a',ascending=False)
s=pd.Series(df2.index)
P=0
for i in s.index:
P=P+s[s > s[i]].count()
s=s.drop(i)
#方法1 R=(P-(n*(n-1)/2-P))/(n*(n-1)/2)=(4P/(n*(n-1)))-1
R1 =(P - (n * (n - 1) / 2 - P)) / (n * (n - 1) / 2)#0.5714285714285714
print('R1=',R1)
R2= (4*P / (n * (n-1)))-1 #0.5714285714285714
print('R2=',R2)
#方法2corr函数计算
r1=height.corr(weight,method='kendall') #0.5714285714285714
print('r1=',r1)
r2=weight.corr(height,method='kendall') #0.5714285714285714
print('r2=',r2)