首页 > 编程知识 正文

pandas统计学差异分析,pandas怎么计算每一列的相关系数

时间:2023-05-05 14:05:48 阅读:231699 作者:4210

pandas统计学-相关性系数(pearson、spearman、kendall,pointbiserialr)

相关性检验函数

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 pdimport 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.5Y1.mean() #2.4X1.var() #方差#3.5Y1.var() #2.9760000000000004X1.std() #标准差不能为0# 1.8708286933869707Y1.std() #标准差不能为0#1.725108692227826X1.cov(Y1) #协方差#3.0600000000000005X1.corr(Y1,method="pearson") #皮尔森相关性系数 #0.9481366640102855X1.cov(Y1)/(X1.std()*Y1.std()) #皮尔森相关性系数 # 0.9481366640102856X1.corr(Y1,method='spearman') #0.942857142857143X1.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 pdimport 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])#处理数据删除Nanx1=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)**2dd=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)**2print(' {: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

     这时候就可以理解为两位老师对选手们的看法是呈相反趋势的,不过这种相反的程度不很大。

4.scipy.stats.pointbiserialr 

scipy.stats.pointbiserialr(x,y )

计算点双线相关系数及其p值。

点双相关用于测量二元变量x和连续变量y之间的关系。与其他相关系数一样,这个相关系数在-1和+1之间变化,0表示没有相关性。-1或+1的相关性意味着确定性关系。

此函数使用快捷方式,但产生的结果相同 pearsonr。

参数:: array_like bools

输入数组。

: 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秩相关系数

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的人是最高的,第三重,等等:

 lcdc王五cqdsnldbd巩俐蔡琴kndzsbzdxyz身高180170160150140130120110体重8075908570605565

我们看到,有一些相关的两个排名之间的相关性,可以使用肯德尔头系数,客观地衡量对应。

注意,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 pdimport 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=0for 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)))-1R1 =(P - (n * (n - 1) / 2 - P)) / (n * (n - 1) / 2)#0.5714285714285714print('R1=',R1)R2= (4*P / (n * (n-1)))-1 #0.5714285714285714print('R2=',R2) #方法2corr函数计算r1=height.corr(weight,method='kendall') #0.5714285714285714print('r1=',r1)r2=weight.corr(height,method='kendall') #0.5714285714285714print('r2=',r2)

 

  

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。