Pearson相關系數和Spearman相關系數的區別


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。

結論

皮爾森評估的是兩個變量的線性關系,而斯皮爾曼評估的兩變量的單調關系。
因此,斯皮爾曼相關系數對於數據錯誤和極端值的反應不敏感。

 


免責聲明!

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



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