機器學習動手做Lesson 8 — 與職場息息相關的Pearson、 Spearman、Kendall相關係數(上篇)

施威銘研究室
16 min readJul 30, 2021

--

在讀這篇文章的你們是否還記得高中課上的相關係數嗎?它在你們走出校園中後,仍持續應用在我們在生活中,不論是在研究領域,如:生物統計、數理統計,還是運用在職場上,如:產品定價分析、消費者行為分析,甚至在機器學習與深度學習過程,使用相關係數選擇特徵,都是其應用範圍。

本篇會先介紹 Pearson 和 Spearman相關係數,Kendall相關係數將留到下篇講解。

一、皮爾森積動差相關係數(Pearson product-moment correlation coefficient)

相關係數這名稱一般是指皮爾森積動差相關係數(Pearson product-moment correlation coefficient),又稱為皮爾森相關係數,它代表著兩個變數(X 和Y)之間的線性關係程度,其公式如下:

我們在之前文章有講過共變異數cov(X , Y),它代表兩個隨機變數的聯合變化程度,而相關係數就是它的標準化,例如:X 單位是公尺,Y 單位是公分,先得到共變異數cov(X , Y),再透過除以 X 標準差和 Y 標準差把公尺和公分除去,因剩下比例,而無單位問題。

再回到公式,因為標準差是變異數再開根號,可得知標準差不為負數。

此外,數學上規定分母不能是0(如果資料的標準差是0,就不能帶入公式,此時資料的相關係數為無定義),所以公式中的分母都恆為正值 ,因此相關係數r的成長方向由共變異數cov(X , Y)正負決定。

若 Xi 越大,Yi 越大(or Xi 越小,Yi 越小),r > 0稱為正相關,

而若 Xi 越大,Yi 越小(or Xi 越小,Yi 越大),r < 0稱為負相關。

另外-1<= r <=1。透過數據的分布,能知道X和Y是否為高度相關,要是數據分布越趨近於一條線,就越高度相關,相關係數數值越趨近於 1 or -1。

使用Python程式

# -*- coding: UTF-8 -*-%matplotlib inlineimport pandas as pdimport matplotlib.pyplot as pltX=pd.Series([1, 2, 3, 4, 5])
Y=pd.Series([6, 7, 10, 13, 21])
plt.plot(X,Y)
plt.show()
print(“Pearson套件相關係數:”+str(round(X.corr(Y,method=’pearson’),2)))print(“==========================================================”)print(“使用Pearson公式”)print(“X的平均數:”+str(round(X.mean(),2))+” , “+”Y的平均數:”+str(round(Y.mean(),2)))print(“X的變異數:”+str(round(X.var(),2))+” , “+”Y的變異數:”+str(round(Y.var(),2)))print(“X的標準差:”+str(round(X.std(),2))+” , “+”Y的標準差:”+str(round(X.std(),2)))print(“X和Y的共變異數:”+str(round(X.cov(Y),2)))print(“Pearson公式相關係數:”+str(round(X.cov(Y)/(X.std()*Y.std()),2)))

結果

從程式碼中,我們可以看到運用pandas套件算出來的數值,與我們自行使用公式計算得出結果相同。

雖然皮爾森相關係數運用廣泛,但它有一個缺點,即無法計算呈現線性分布以外的數據,像數據呈現拋物線,它的計算就會失準,為了解決這個問題,有人提出其他計算相關係數的方法,像:斯皮爾曼相關係數(Spearman correlation coefficient)、肯德爾相關係數(Kendall correlation coefficient)等。

二、斯皮爾曼等級相關係數(Spearman’s rank correlation coefficient)

斯皮爾曼等級相關係數常以 ρ(rho)或 rss 代表Spearman)表示,它與皮爾森相關係數的差異在於它 X 和 Y 的關係呈現單調關係(monotonic relationship)。

所謂的單調關係,即 Xi 和 Yi 呈現正相關,但數據不一定是線性分布,其曲線根據斜率大小可能不一,線條有時急遽,有時趨緩,呈現S曲線,卻一定往同一個方向前進,線性關係包含在單調關係中,但單調關係不包含在線性關係裡。

斯皮爾曼等級相關係數計算需要先是把 Xi 和 Yi 數值,各別從小至大依1、2、…、n 排序成為 xi 和 yi,排序方法如圖一所示,先排 Xi,再排 Yi,若有重複數值,請和其他重複值用同一個排名,這個排名為重複值排名的平均,如圖二。

圖一
圖二

接著判斷排名是否有重複,若沒有重複,能使用簡化的皮爾森相關係數公式。這公式需先算出 di = xi -yi 得到兩個變數之間的等級差,再代入簡化公式:

========================================

<額外補充>簡化皮爾森相關係數原理:

當Xi和Yi排名都沒有重複,σ(x)=σ(y),

========================================

在沒有重複值排序的範例下,使用Python計算Spearman簡化公式

使用Python程式

# -*- coding: UTF-8 -*-%matplotlib inlineimport pandas as pd
import matplotlib.pyplot as plt
X_value=pd.Series([1,3,5,7,9])
Y_value=pd.Series([5, 25, 125, 625, 3125])
plt.plot(X_value,Y_value)
plt.show()
print("Spearman套件相關係數:"+str(round(X_value.corr(Y_value,method='spearman'),2)))print(“=========================================================”)
print(“使用Spearman公式”)
#dic{key:value}
X_value={1:1,3:2,5:3,7:4,9:5}
Y_value={5:1,25:2,125:3,625:4,3125:5}
print(“X的原有值:”+str(sorted(X_value)))
print(“Y的原有值:”+str(sorted(Y_value)))
#sorted()使用 key排序
print(“X的原有值:”+str(sorted(X_value)))
print(“Y的原有值:”+str(sorted(Y_value)))
#得出排序值
X=[]
Y=[]
for i in sorted(X_value):
X.append(X_value[i])
for j in sorted(Y_value):
Y.append(Y_value[j])
print(“X 排序值:”+str(X))
print(“Y 排序值:”+str(Y))
#算出兩個變數排序值之間的等級差di的平方總和
d=[]
for i in range(len(X)):
for j in range(len(Y)):
if i==j:
d.append((X[i]-Y[j])*(X[i]-Y[j]))
n=len(X)
di_square_sum=sum(d)
print(“兩個變數排序值之間的等級差di的平方總和:”+str(di_square_sum))
print(“Spearman公式相關係數:”+str(round(1-(6*di_square_sum/(n*(n*n-1))),2)))

結果

從程式中可以得知pandas套件結果與自行計算結果相同。

若有重複數值,排名重複,不能用 Spearman 簡化公式進行計算,只能套回原來皮爾森相關係數公式計算。

其計算方式是先讓所有有重複值的排序取平均作為一致排序,取平均的目的是為了不讓重複值排序後有不同數值,不再有重複特性,導致結果偏差,之後代入皮爾森相關係數公式計算:

接下來我們用Python比較一下 Spearman 沒簡化和簡化的區別

使用Python程式

import numpy as np
from scipy.stats import spearmanr
def func_pearson_correlation(x, y):
x_avg = np.mean(x)
y_avg = np.mean(y)
xy = np.sum([(x[index] — x_avg) * (y[index] — y_avg) for index in range(len(x))])
xx = np.sum([(x[index] — x_avg) * (x[index] — x_avg) for index in range(len(x))])
yy = np.sum([(y[index] — y_avg) * (y[index] — y_avg) for index in range(len(x))])
r = xy / (np.sqrt(xx * yy))
return r
def func_rank_correlation(x, y, x_rank, y_rank):
r, p = spearmanr(x, y)
print(“Spearman套件:”, round(r, 4))
r = func_pearson_correlation(x_rank, y_rank)
print(“Spearman公式-Pearson:”, round(r, 4))
d_rank = np.sum([(x_rank[index] — y_rank[index]) * (x_rank[index] — y_rank[index]) for index in range(len(x))])
r = 1 — (6 * d_rank) / (len(x) * (len(x) * len(x) — 1))
print(“Spearman公式-簡化:”, round(r, 4))
print()
print(“===========沒有重複的值===============”)x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [1, 2, 3, 4, 5, 6, 7, 8, 10, 9]
x_rank = np.array(x).argsort().argsort()
y_rank = np.array(y).argsort().argsort()
func_rank_correlation(x, y, x_rank, y_rank)print(“===========有重複的值,套件排序===============”)x = [1, 20, 30, 400, 500, 6000, 6001, 8000, 9000, 9000]
y = [1, 2, 3, 4, 5, 8, 7, 8, 10, 10]
x_rank = np.array(x).argsort().argsort()
y_rank = np.array(y).argsort().argsort()
func_rank_correlation(x, y, x_rank, y_rank)print(“===========有重複的值,自行排序===============”)x = [1, 20, 30, 400, 500, 6000, 6001, 8000, 9000, 9000]
y = [1, 2, 3, 4, 5, 8, 7, 8, 10, 10]
x_rank = [1, 2, 3, 4, 5, 6, 7, 8, 9.5, 9.5]
y_rank = [1, 2, 3, 4, 5, 7.5, 6, 7.5, 9.5, 9.5]
func_rank_correlation(x, y, x_rank, y_rank)

結果

從結果可知,若套件排序,因電腦索引值只會依序排列,不會因有重複值而排名並列,最終結果與自行排序不同。

自行排序Spearman公式-Pearson和Spearman-簡化結果不同,代表重複值不適用已簡化公式的Spearman。

斯皮爾曼等級相關係數因為是用等級計算,所以不論是樣本大小,還是任何數據分布,都能適用,不需要先假設母體資料,所以是無母數計算。

而皮爾森相關係數需先假設母體資料為線性分布,是有母數計算 。

所以相對皮爾森相關係數,斯皮爾曼等級相關係數更適合使用在非線性分布,但也因此對於離群值不敏感,整體精確度不高,所以一般使用上建議大家使用皮爾森相關係數。

重點整理

(1) Pearson為共變異數的標準化

(2) Pearson需要事先假設資料為線性分布

(3) Spearman資料若有重複值,排名必須要取平均計算

(4) Spearman簡化公式只能用於沒重複值的情形

(5) Pearson需事先假設資料分布,為有母數計算; Spearman為不須事先假設資料分布,為無母數計算

參考資料

1. ‘皮爾森積動差相關係數’ (2021) . Wikipedia. [Accessed: 12 July 2021]. Available from: https://zh.wikipedia.org/wiki/%E7%9A%AE%E5%B0%94%E9%80%8A%E7%A7%AF%E7%9F%A9%E7%9B%B8%E5%85%B3%E7%B3%BB%E6%95%B0

2. ‘共變異數及相關係數’ (2008) . 國立高雄大學應用數學系. [Accessed: 12 July 2021]. Available from: http://www.stat.nuk.edu.tw/cbme/math/statistic/sta2/s3_5/bud.html

3. Tommy Huang., (2018). ‘相關係數與共變異數(Correlation Coefficient and Covariance)’. Medium. [Accessed: 12 July 2021] . Available from: https://chih-sheng-huang821.medium.com/%E7%9B%B8%E9%97%9C%E4%BF%82%E6%95%B8%E8%88%87%E5%85%B1%E8%AE%8A%E7%95%B0%E6%95%B8-correlation-coefficient-and-covariance-c9324c5cf679

4. ‘斯皮爾曼等級相關係數’ (2021) . Wikipedia. [Accessed: 12 July 2021]. Available from: https://zh.wikipedia.org/wiki/%E6%96%AF%E7%9A%AE%E5%B0%94%E6%9B%BC%E7%AD%89%E7%BA%A7%E7%9B%B8%E5%85%B3%E7%B3%BB%E6%95%B0

5. ‘线性、非线性和单调关系’(2019) . Minitab. [Accessed: 12 July 2021]. Available from: https://support.minitab.com/zh-cn/minitab/18/help-and-how-to/statistics/basic-statistics/supporting-topics/basics/linear-nonlinear-and-monotonic-relationships/

6. ‘Spearman’s Rank-Order Correlation’(2018). Laerd Statistics. [Accessed: 12 July 2021]. Available from: https://statistics.laerd.com/statistical-guides/spearmans-rank-order-correlation-statistical-guide.php

7. Peter, Y. Chen. and Puala, M. Popovich. (2002) .’Quantitative applications in the social science’. SAGE Publications. [Accessed: 15 July 2021]. Available from: https://rufiismada.files.wordpress.com/2012/02/correlation__parametric_and_nonparametric_measures__quantitative_applications_in_the_social_sciences_.pdf

8. ‘Prove the equivalence of the following two formulas for Spearman correlation’(2016). Cross Validated. [Accessed: 18 July 2021]. Available from: https://stats.stackexchange.com/questions/89121/prove-the-equivalence-of-the-following-two-formulas-for-spearman-correlation

關於作者

施威銘研究室。致力開發AI領域的圖書、創客、教具,希望培養更多的AI人才。整合各種人才,投入創客產品的開發,推廣「實作學習」,希望實踐學以致用的理想。

--

--

施威銘研究室

致力開發AI領域的圖書、創客、教具,希望培養更多的AI人才。整合各種人才,投入創客產品的開發,推廣「實作學習」,希望實踐學以致用的理想。