1.皮爾森相關系數(Pearson)評估兩個連續變量之間的線性關系


-1 ≤ p ≤ 1
p接近0代表無相關性
p接近1或-1代表強相關性
代碼:
#相關系數顯著性檢驗 import numpy as np import scipy.stats as stats import scipy x=np.array([10.35,6.24,3.18,8.46,3.21,7.65,4.32,8.66,9.12,10.31]) y=np.array([5.1,3.15,1.67,4.33,1.76,4.11,2.11,4.88,4.99,5.12]) correlation,pvalue = stats.stats.pearsonr(x,y) print("correlation:",correlation) #correlation: 0.9891763198690562 print("pvalue:",pvalue) #5.926875946481136e-08 x1=x-x.mean() y1=y-y.mean() y2=x1*y1 fenzi=y2.sum() #35.0235 x_sum=(x1*x1).sum() #68.4742 y_sum1=(y1*y1).sum() #18.30816 fenmu=np.power(x_sum*y_sum1,1/2) corr_pearson=fenzi/fenmu #根據上面可以編寫函數 def corr_pearson(x,y): x=np.array(x) y=np.array(y) x1=x-x.mean() y1=y-y.mean() y2=x1*y1 fenzi=y2.sum() #35.0235 x_sum=(x1*x1).sum() #68.4742 y_sum1=(y1*y1).sum() #18.30816 fenmu=np.power(x_sum*y_sum1,1/2) return(fenzi/fenmu) x=[10.35,6.24,3.18,8.46,3.21,7.65,4.32,8.66,9.12,10.31] y=[5.1,3.15,1.67,4.33,1.76,4.11,2.11,4.88,4.99,5.12] corr_pearson(x,y)
添加一個scipy,numpy,pandas 計算皮爾斯系數的方法:
import scipy.stats as stats import numpy as np import pandas as pd a = [1.2, 1.5, 1.9] b = [2.2, 2.5, 3.1] print(stats.pearsonr(a, b)) ''' 使用scipy庫來進行計算,返回兩個值,第一個是相關系數,第二個是在不相關假設情況下的p值。 (0.9941916256019201, 0.0686487855020298) ''' print(np.corrcoef([a, b])) ''' 使用numpy庫來計算相關系數,返回一個數組的形式,為第i行第j行的相關系數 [[1. 0.99419163] [0.99419163 1. ]] ''' df = pd.DataFrame() df['a'] = a df['b'] = b print(df.corr()) ''' 使用pandas庫來進行計算,計算第i列和第j列(每一列都是一個Series)的相關系數。返回的結果為一個DataFrame。注:pandas是計算列的相關系數,numpy是計算行的相關系數。假如有一個df,那么如果用numpy來進行計算?使用的方法是 np.corrcoef(df.values.T),要進行轉置一下。 a b a 1.000000 0.994192 b 0.994192 1.000000 '''
2.斯皮爾曼相關系數評估兩個連續變量之間的單調關系。在單調關系中,變量趨於一起變化,但不一定以恆定速率變化


N是觀測值的總數量
斯皮爾曼另一種表達公式:


表示二列成對變量的等級差數
#spearman相關系數,方式一 x=[10.35,6.24,3.18,8.46,3.21,7.65,4.32,8.66,9.12,10.31] y=[5.1,3.15,1.67,4.33,1.76,4.11,2.11,4.88,4.99,5.12] correlation,pvalue = stats.spearmanr(x,y) print("correlation:",correlation) print("pvalue:",pvalue) #spearman相關系數,方式二 x = scipy.stats.stats.rankdata(x) y = scipy.stats.stats.rankdata(y) print(x,y) correlation,pvalue = scipy.stats.spearmanr(x,y) print("correlation:",correlation) print("pvalue:",pvalue)
詳細過程:
也就是說,原來的數據(不經過排序),原來這兩個變量就是有序的,則斯皮爾曼系數等於1或者-1
d其實就是兩個變量對應的值的index的差
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
區別:
(1)Pearson和Spearman相關系數的范圍可以從-1到+1。當Pearson相關系數為+1時,意味着,當一個變量增加時,另一個變量增加一致量。這形成了一種遞增的直線。在這種情況下,Spearman相關系數也是+1。

(2)如果關系是一個變量在另一個變量增加時增加,但數量不一致,則Pearson相關系數為正但小於+1。在這種情況下,斯皮爾曼系數仍然等於+1。

(3)當關系是隨機的或不存在時,則兩個相關系數幾乎為零。

(4)如果關系遞減的直線,那么兩個相關系數都是-1。

(5)如果關系是一個變量在另一個變量增加時減少,但數量不一致,則Pearson相關系數為負但大於-1。在這種情況下,斯皮爾曼系數仍然等於-1

相關值-1或1意味着精確的線性關系,如圓的半徑和圓周之間的關系。然而,相關值的實際價值在於量化不完美的關系。發現兩個變量是相關的經常通知回歸分析,該分析試圖更多地描述這種類型的關系。
其他非線性關系
Pearson相關系數僅評估線性關系。Spearman相關系數僅評估單調關系。因此,即使相關系數為0,也可以存在有意義的關系。檢查散點圖以確定關系的形式。

該圖顯示了非常強的關系。Pearson系數和Spearman系數均約為0。
結論
皮爾森評估的是兩個變量的線性關系,而斯皮爾曼評估的兩變量的單調關系。
因此,斯皮爾曼相關系數對於數據錯誤和極端值的反應不敏感。
