皮爾森系數
重點關注第一個等號后面的公式,最后面的是推導計算,暫時不用管它們。看到沒有,兩個變量(X, Y)的皮爾森相關性系數(ρX,Y)等於它們之間的協方差cov(X,Y)除以它們各自標准差的乘積(σX, σY)。
公式的分母是變量的標准差,這就意味着計算皮爾森相關性系數時,變量的標准差不能為0(分母不能為0),也就是說你的兩個變量中任何一個的值不能都是相同的。如果沒有變化,用皮爾森相關系數是沒辦法算出這個變量與另一個變量之間是不是有相關性的。
皮爾森相關系數(Pearson correlation coefficient)也稱皮爾森積矩相關系數(Pearson product-moment correlation coefficient) ,是一種線性相關系數。皮爾森相關系數是用來反映兩個變量線性相關程度的統計量。相關系數用r表示,其中n為樣本量,分別為兩個變量的觀測值和均值。r描述的是兩個變量間線性相關強弱的程度。r的絕對值越大表明相關性越強。
簡單的相關系數的分類
0.8-1.0 極強相關
0.6-0.8 強相關
0.4-0.6 中等程度相關
0.2-0.4 弱相關
0.0-0.2 極弱相關或無相關
r描述的是兩個變量間線性相關強弱的程度。r的取值在-1與+1之間,若r>0,表明兩個變量是正相關,即一個變量的值越大,另一個變量的值也會越大;若r<0,表明兩個變量是負相關,即一個變量的值越大另一個變量的值反而會越小。r 的絕對值越大表明相關性越強,要注意的是這里並不存在因果關系。
spearman correlation coefficient(斯皮爾曼秩相關性系數)
斯皮爾曼相關性系數,通常也叫斯皮爾曼秩相關系數。“秩”,可以理解成就是一種順序或者排序,那么它就是根據原始數據的排序位置進行求解,這種表征形式就沒有了求皮爾森相關性系數時那些限制。斯皮爾曼相關系數的計算采用的是取值的等級,而不是取值本身。例如,給定三個值:33,21,44,它們的等級就分別是2,1,3. 計算斯皮爾曼相關系數的公式與計算皮爾森相關系數的類似,但用等級代替了各自的取值。下面來看一下它的計算公式:
相對於皮爾森相關系數,斯皮爾曼相關系數對於數據錯誤和極端值的反應不敏感。
斯皮爾曼相關系數的另一種公式表示如下:
計算過程就是:首先對兩個變量(X, Y)的數據進行排序,然后記下排序以后的位置(X’, Y’),(X’, Y’)的值就稱為秩次,秩次的差值就是上面公式中的di,n就是變量中數據的個數,最后帶入公式就可求解結果
帶入公式,求得斯皮爾曼相關性系數:ρs= 1-6*(1+1+1+9)/6*35=0.657
而且,即便在變量值沒有變化的情況下,也不會出現像皮爾森系數那樣分母為0而無法計算的情況。另外,即使出現異常值,由於異常值的秩次通常不會有明顯的變化(比如過大或者過小,那要么排第一,要么排最后),所以對斯皮爾曼相關性系數的影響也非常小!
由於斯皮爾曼相關性系數沒有那些數據條件要求,適用的范圍就廣多了。
kendall(肯德爾和諧相關系數)
肯德爾相關性系數,又稱肯德爾秩相關系數,它也是一種秩相關系數,不過它所計算的對象是分類變量。
以下用W表示肯德爾和諧系數
(1)同一評價者無相同等級評定時,W的計算公式:

(1)式中:N—被評的對象數; K—評分者人數或評分所依據的標准數;S—每個被評對象所評等級之和Ri與所有這些和的平均數的離差平方和,即當評分者意見完全一致時,S取得最大值可見,和諧系數是實際求得的S與其最大可能取值的比值,故0≤W≤1。
(2)同一評價者有相同等級評定時,W的計算公式:


2)式中K、N、S的意義同(1)式,這里為第i個評價者的評定結果中有重復等級的個數,
為第i個評價者的評定結果中第j個重復等級的相同等級數。對於評定結果無相同等級的評價者,
= 0,因此只須對評定結果有相同等級的評價者計算Ti。
分類變量可以理解成有類別的變量,可以分為
無序的,比如性別(男、女)、血型(A、B、O、AB);
有序的,比如肥胖等級(重度肥胖,中度肥胖、輕度肥胖、不肥胖)。
通常需要求相關性系數的都是有序分類變量。
Nc表示主客觀評價值中一致的值的個數,Nd則表示了主觀評估值和客觀評估值不一樣的個數
舉個例子。比如評委對選手的評分(優、中、差等),我們想看兩個(或者多個)評委對幾位選手的評價標准是否一致;或者醫院的尿糖化驗報告,想檢驗各個醫院對尿糖的化驗結果是否一致,這時候就可以使用肯德爾相關性系數進行衡量。
代碼實現
import pandas as pd df = pd.DataFrame({'A':[5,91,3],'B':[90,15,66],'C':[93,27,3]}) print(df.corr()) print(df.corr('spearman')) print(df.corr('kendall')) df2 = pd.DataFrame({'A':[7,93,5],'B':[88,13,64],'C':[93,27,3]}) print(df2.corr()) print(df2.corr('spearman')) print(df2.corr('kendall'))
import numpy as np vc=[1,2,39,0,8] vb=[1,2,38,0,8] print(np.mean(np.multiply((vc-np.mean(vc)),(vb-np.mean(vb))))/(np.std(vb)*np.std(vc))) #corrcoef得到相關系數矩陣(向量的相似程度) print(np.corrcoef(vc,vb))
from scipy.stats import pearsonr, kendalltau, spearmanr import numpy as np vc=[1,2,39,0,8] vb=[1,2,38,0,8] print(spearmanr(vc,vb)) print() print(kendalltau(vc,vb)) print() print(pearsonr(vc,vb))