Pearson、Spearman秩相關系數、kendall等級相關系數 (附python實現)


目錄:

相關系數

Pearson

Spearman

Kendall

 

相關系數

 

相關系數:考察兩個事物(在數據里我們稱之為變量)之間的相關程度。

 

如果有兩個變量:X、Y,最終計算出的相關系數的含義可以有如下理解:

(1)、當相關系數為0時,X和Y兩變量無關系。

(2)、當X的值增大(減小),Y值增大(減小),兩個變量為正相關,相關系數在0.00與1.00之間。

(3)、當X的值增大(減小),Y值減小(增大),兩個變量為負相關,相關系數在-1.00與0.00之間。

 

相關系數的絕對值越大,相關性越強,相關系數越接近於1或-1,相關度越強,相關系數越接近於0,相關度越弱

 

通常情況下通過以下取值范圍判斷變量的相關強度:

相關系數     0.8-1.0     極強相關
                 0.6-0.8     強相關
                 0.4-0.6     中等程度相關
                 0.2-0.4     弱相關
                 0.0-0.2     極弱相關或無相關

 

Pearson(皮爾遜)相關系數

皮爾遜相關也稱為積差相關(或積矩相關)是英國統計學家皮爾遜於20世紀提出的一種計算直線相關的方法。

 

假設有兩個變量X、Y,那么兩變量間的皮爾遜相關系數可通過以下公式計算:

 以上列出的四個公式等價,其中E是數學期望,cov表示協方差,N表示變量取值的個數。

 

適用范圍

當兩個變量的標准差都不為零時,相關系數才有定義,皮爾遜相關系數適用於:

(1)、兩個變量之間是線性關系,都是連續數據

(2)、兩個變量的總體是正態分布,或接近正態的單峰分布。

(3)、兩個變量的觀測值是成對的,每對觀測值之間相互獨立。

 

pearson 描述的是線性相關關系,取值[-1, 1]。負數表示負相關,正數表示正相關。在顯著性的前提下,絕對值越大,相關性越強。絕對值為0, 無線性關系;絕對值為1表示完全線性相關。

 

Python 實現

DataFrame.corr(method='pearson', min_periods=1)

參數說明:

method:可選值為{‘pearson’, ‘kendall’, ‘spearman’}       

min_periods:樣本最少的數據量

返回值:各類型之間的相關系數DataFrame表格。

a) Dataframe.corr(method='pearson'), 返回相關關系矩陣
b)
from scipy.stats import normaltest, probplot normaltest(a)返回統計數和檢驗P值, 樣本要求>20。 probplot(np.array(x,y), dist="norm", plot=pylab) 化PP圖,若在對角線,則相關性強。

  

example:

import pandas as pd
df = pd.read_csv('demo.csv')
 
 
## 計算相關度系數 ##
df.corr() #計算pearson相關系數
#df.corr('kendall')  #計算kendall相關系數
#df.corr('spearman')  #計算spearman相關系數

 

                 funded_amnt  funded_amnt_inv
funded_amnt          1.00000          0.92876
funded_amnt_inv      0.92876          1.00000

 

Spearman Rank(斯皮爾曼等級)相關系數

在統計學中,斯皮爾曼等級相關系數以Charles Spearman命名,並經常用希臘字母ρ(rho)表示其值。斯皮爾曼等級相關系數用來估計兩個變量X、Y之間的相關性,其中變量間的相關性可以使用單調函數來描述。如果兩個變量取值的兩個集合中均不存在相同的兩個元素,那么,當其中一個變量可以表示為另一個變量的很好的單調函數時(即兩個變量的變化趨勢相同),兩個變量之間的ρ可以達到+1或-1。

 

假設兩個隨機變量分別為X、Y(也可以看做兩個集合),它們的元素個數均為N,兩個隨即變量取的第i(1<=i<=N)個值分別用Xi、Yi表示。對X、Y進行排序(同時為升序或降序),得到兩個元素排行集合x、y,其中元素xi、yi分別為Xi在X中的排行以及Yi在Y中的排行。將集合x、y中的元素對應相減得到一個排行差分集合d,其中di=xi-yi,1<=i<=N。隨機變量X、Y之間的斯皮爾曼等級相關系數可以由x、y或者d計算得到,其計算方式如下所示:

 以下是一個計算集合中元素排行的例子(僅適用於斯皮爾曼等級相關系數的計算)

 這里需要注意:當變量的兩個值相同時,它們的排行是通過對它們位置進行平均而得到的。

 

適用范圍

斯皮爾曼等級相關系數對數據條件的要求沒有皮爾遜相關系數嚴格,只要兩個變量的觀測值是成對的等級評定資料,或者是由連續變量觀測資料轉化得到的等級資料,不論兩個變量的總體分布形態、樣本容量的大小如何,都可以用斯皮爾曼等級相關系數來進行研究。

 

a) Dataframe.corr(method='spearman'), 返回相關關系矩陣

b) from scipy.stats import spearmanr

spearmanr(array)返回 Pearson 系數和檢驗P值, 樣本要求>20。

 

Kendall Rank(肯德爾等級)相關系數

在統計學中,肯德爾相關系數是以Maurice Kendall命名的,並經常用希臘字母τ(tau)表示其值。肯德爾相關系數是一個用來測量兩個隨機變量相關性的統計值。一個肯德爾檢驗是一個無參數假設檢驗,它使用計算而得的相關系數去檢驗兩個隨機變量的統計依賴性。肯德爾相關系數的取值范圍在-1到1之間,當τ為1時,表示兩個隨機變量擁有一致的等級相關性;當τ為-1時,表示兩個隨機變量擁有完全相反的等級相關性;當τ為0時,表示兩個隨機變量是相互獨立的。

 

假設兩個隨機變量分別為X、Y(也可以看做兩個集合),它們的元素個數均為N,兩個隨即變量取的第i(1<=i<=N)個值分別用Xi、Yi表示。X與Y中的對應元素組成一個元素對集合XY,其包含的元素為(Xi, Yi)(1<=i<=N)。當集合XY中任意兩個元素(Xi, Yi)與(Xj, Yj)的排行相同時(也就是說當出現情況1或2時;情況1:Xi>Xj且Yi>Yj,情況2:Xi<Xj且Yi<Yj),這兩個元素就被認為是一致的。當出現情況3或4時(情況3:Xi>Xj且Yi<Yj,情況4:Xi<Xj且Yi>Yj),這兩個元素被認為是不一致的。當出現情況5或6時(情況5:Xi=Xj,情況6:Yi=Yj),這兩個元素既不是一致的也不是不一致的。

 

這里有三個公式計算肯德爾相關系數的值:

公式一:

其中C表示XY中擁有一致性的元素對數(兩個元素為一對);D表示XY中擁有不一致性的元素對數。

注意:這一公式僅適用於集合X與Y中均不存在相同元素的情況集合中各個元素唯一)。

 

公式二:

注意:這一公式適用於集合X或Y中存在相同元素的情況(當然,如果X或Y中均不存在相同的元素時,公式二便等同於公式一)。

其中C、D與公式一中相同;

N1、N2分別是針對集合X、Y計算的,現在以計算N1為例(N2的計算可以類推,在集合Y的基礎上計算而得):

X集合中所有重復元素個數:將X中的相同元素分別組合成小集合,s表示集合X中擁有的小集合數(例如X包含元素:1 2 3 4 3 3 2,那么這里得到的s則為2,因為只有2、3有相同元素),Ui表示第i個小集合所包含的元素數。

 

公式三:

注意:這一公式中沒有再考慮集合X、或Y中存在相同元素給最后的統計值帶來的影響。公式三的這一計算形式僅適用於用表格表示的隨機變量X、Y之間相關系數的計算(下面將會介紹)。

參數M稍后會做介紹。

 

通常人們會將兩個隨機變量的取值制作成一個表格,例如有10個樣本,對每個樣本進行兩項指標測試X、Y(指標X、Y的取值均為1到3)。根據樣本的X、Y指標取值,得到以下二維表格(表1):

 

由表1可以得到X及Y的可以以集合的形式表示為:

X={1, 1, 2, 2, 2, 2, 2, 3, 3, 3};

Y={1, 2, 1, 1, 2, 2, 3, 2, 3, 3};

得到X、Y的集合形式后就可以使用以上的公式一或公式二計算X、Y的肯德爾相關系數了(注意公式一、二的適用條件)。

 

這里需要注意的是:公式二也可以用來計算表格形式表示的二維變量的肯德爾相關系數,不過它一般用來計算由正方形表格表示的二維變量的肯德爾相關系數,公式三則只是用來計算由長方形表格表示的二維變量的Kendall相關系數。這里給出公式三中字母M的含義,M表示長方形表格中行數與列數中較小的一個。表1的行數及列數均為三。

 

適用范圍 

肯德爾相關系數與斯皮爾曼相關系數對數據條件的要求相同。

 

a) Dataframe.corr(method='kendall'), 返回相關關系矩陣

b) from scipy.stats import kendalltau

kendalltau(x, y) 返回系數和P值

 

example

from pandas import DataFrame
import pandas as pd
x=[a for a in range(100)]
#構造一元二次方程,非線性關系
def y_x(x):
    return 2*x**2+4
y=[y_x(i) for i in x]
 
data=DataFrame({'x':x,'y':y})
 
#查看data的數據結構
data.head()
Out[34]: 
   x   y
0  0   4
1  1   6
2  2  12
3  3  22
4  4  36
 
data.corr()
Out[35]: 
          x         y
x  1.000000  0.967736
y  0.967736  1.000000
 
data.corr(method='spearman')
Out[36]: 
     x    y
x  1.0  1.0
y  1.0  1.0
 
data.corr(method='kendall')
Out[37]: 
     x    y
x  1.0  1.0
y  1.0  1.0 

因為y經由函數構造出來,x和y的相關系數為1,但從實驗結構可知pearson系數,針對非線性數據有一定的誤差。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM