scipy.stats.

pearsonr#

scipy.stats.pearsonr(x, y, *, alternative='two-sided', method=None, axis=0)[原始碼]#

皮爾森相關係數與用於檢定無相關性的 p 值。

皮爾森相關係數 [1] 衡量兩個資料集之間的線性關係。如同其他相關係數,此係數值介於 -1 和 +1 之間,0 代表無相關性。相關性為 -1 或 +1 代表精確的線性關係。正相關性代表當 x 增加時,y 也會增加。負相關性代表當 x 增加時,y 會減少。

此函數也會執行虛無假設檢定,檢定樣本的底層分布是否為無相關且常態分布。(請參閱 Kowalski [3],以了解輸入的非常態性對相關係數分布的影響的討論。)p 值大致上指出一個無相關的系統產生資料集的機率,而這些資料集具有至少與從這些資料集計算出的皮爾森相關性一樣極端的相關性。

參數:
xarray_like

輸入陣列。

yarray_like

輸入陣列。

axisint 或 None,預設值

執行計算的軸。預設值為 0。若為 None,則在執行計算前將兩個陣列展平。

版本 1.13.0 新增。

alternative{‘two-sided’, ‘greater’, ‘less’}, 選項性

定義對立假設。預設值為 ‘two-sided’。以下選項可用

  • ‘two-sided’:相關性為非零

  • ‘less’:相關性為負(小於零)

  • ‘greater’:相關性為正(大於零)

版本 1.9.0 新增。

methodResamplingMethod,選項性

定義用於計算 p 值的方法。若 methodPermutationMethod/MonteCarloMethod 的實例,則 p 值會使用 scipy.stats.permutation_test/scipy.stats.monte_carlo_test 以及提供的組態選項和其他適當設定來計算。否則,p 值會如附註中所述計算。

版本 1.11.0 新增。

返回:
resultPearsonRResult

具有以下屬性的物件

statisticfloat

皮爾森積差相關係數。

pvaluefloat

與所選對立假設相關聯的 p 值。

此物件具有以下方法

confidence_interval(confidence_level, method)

此方法計算給定信賴水準的相關係數 statistic 的信賴區間。信賴區間以具有欄位 lowhighnamedtuple 傳回。若未提供 method,則信賴區間會使用費雪轉換 [1] 計算。若 methodBootstrapMethod 的實例,則信賴區間會使用 scipy.stats.bootstrap 以及提供的組態選項和其他適當設定來計算。在某些情況下,由於退化的重新取樣,信賴界限可能為 NaN,這在非常小的樣本(約 6 個觀察值)中很常見。

引發:
ValueError

xy 的長度皆未達至少 2。

警告:
ConstantInputWarning

若輸入為常數陣列時引發。在此情況下未定義相關係數,因此會返回 np.nan

NearConstantInputWarning

若輸入為「幾乎」常數時引發。若 norm(x - mean(x)) < 1e-13 * abs(mean(x)),則陣列 x 會被視為幾乎常數。在此情況下,x - mean(x) 計算中的數值誤差可能會導致 r 的計算不準確。

另請參閱

spearmanr

Spearman 等級順序相關係數。

kendalltau

Kendall’s tau,一種用於序數資料的相關性度量。

附註

相關係數計算如下

\[r = \frac{\sum (x - m_x) (y - m_y)} {\sqrt{\sum (x - m_x)^2 \sum (y - m_y)^2}}\]

其中 \(m_x\) 是向量 x 的平均值,而 \(m_y\) 是向量 y 的平均值。

在假設 x 和 y 是從獨立常態分布中抽取的(因此母體相關係數為 0)情況下,樣本相關係數 r 的機率密度函數為 ([1][2])

\[f(r) = \frac{{(1-r^2)}^{n/2-2}}{\mathrm{B}(\frac{1}{2},\frac{n}{2}-1)}\]

其中 n 是樣本數,而 B 是 beta 函數。這有時稱為 r 的精確分布。這是當 method 參數保留為預設值 (None) 時,pearsonr 中用於計算 p 值的分布。此分布是區間 [-1, 1] 上的 beta 分布,具有相等的形狀參數 a = b = n/2 - 1。就 SciPy 的 beta 分布實作而言,r 的分布為

dist = scipy.stats.beta(n/2 - 1, n/2 - 1, loc=-1, scale=2)

pearsonr 返回的預設 p 值為雙尾 p 值。對於具有相關係數 r 的給定樣本,p 值是從零相關性的母體中抽取的隨機樣本 x’ 和 y’ 的 abs(r’) 大於或等於 abs(r) 的機率。就上面顯示的物件 dist 而言,給定 r 和長度 n 的 p 值可以計算為

p = 2*dist.cdf(-abs(r))

當 n 為 2 時,上述連續分布未明確定義。人們可以將 beta 分布的極限解釋為當形狀參數 a 和 b 接近 a = b = 0 時,作為在 r = 1 和 r = -1 處具有相等機率質量的離散分布。更直接地說,人們可以觀察到,給定資料 x = [x1, x2] 和 y = [y1, y2],並假設 x1 != x2 且 y1 != y2,則 r 的唯一可能值為 1 和 -1。由於長度為 2 的任何樣本 x’ 和 y’ 的 abs(r’) 都將為 1,因此長度為 2 的樣本的雙尾 p 值始終為 1。

為了向後相容性,傳回的物件的行為也類似於長度為 2 的元組,其中包含統計量和 p 值。

參考文獻

[1] (1,2,3)

“皮爾森相關係數”,維基百科,https://en.wikipedia.org/wiki/Pearson_correlation_coefficient

[2]

Student,“相關係數的可能誤差”,Biometrika,第 6 卷,第 2-3 期,1908 年 9 月 1 日,第 302-310 頁。

[3]

C. J. Kowalski,“關於非常態性對樣本積差相關係數分布的影響”,皇家統計學會期刊。C 系列(應用統計學),第 21 卷,第 1 期 (1972),第 1-12 頁。

範例

>>> import numpy as np
>>> from scipy import stats
>>> x, y = [1, 2, 3, 4, 5, 6, 7], [10, 9, 2.5, 6, 4, 3, 2]
>>> res = stats.pearsonr(x, y)
>>> res
PearsonRResult(statistic=-0.828503883588428, pvalue=0.021280260007523286)

執行精確的排列檢定版本

>>> rng = np.random.default_rng()
>>> method = stats.PermutationMethod(n_resamples=np.inf, random_state=rng)
>>> stats.pearsonr(x, y, method=method)
PearsonRResult(statistic=-0.828503883588428, pvalue=0.028174603174603175)

在資料是從均勻分布中抽取的虛無假設下執行檢定

>>> method = stats.MonteCarloMethod(rvs=(rng.uniform, rng.uniform))
>>> stats.pearsonr(x, y, method=method)
PearsonRResult(statistic=-0.828503883588428, pvalue=0.0188)

產生漸近 90% 信賴區間

>>> res.confidence_interval(confidence_level=0.9)
ConfidenceInterval(low=-0.9644331982722841, high=-0.3460237473272273)

以及用於 bootstrap 信賴區間

>>> method = stats.BootstrapMethod(method='BCa', rng=rng)
>>> res.confidence_interval(confidence_level=0.9, method=method)
ConfidenceInterval(low=-0.9983163756488651, high=-0.22771001702132443)  # may vary

若提供 N 維陣列,則會在單次呼叫中執行多個檢定,其依據與大多數 scipy.stats 函數相同的慣例

>>> rng = np.random.default_rng()
>>> x = rng.standard_normal((8, 15))
>>> y = rng.standard_normal((8, 15))
>>> stats.pearsonr(x, y, axis=0).statistic.shape  # between corresponding columns
(15,)
>>> stats.pearsonr(x, y, axis=1).statistic.shape  # between corresponding rows
(8,)

若要執行陣列切片之間的所有成對比較,請使用標準 NumPy 廣播技術。例如,若要計算所有列對之間的相關性

>>> stats.pearsonr(x[:, np.newaxis, :], y, axis=-1).statistic.shape
(8, 8)

若 y = a + b*x + e,其中 a、b 是常數,而 e 是隨機誤差項(假設與 x 獨立),則 x 和 y 之間存在線性依賴性。為了簡化起見,假設 x 是標準常態分布,a=0,b=1,並讓 e 遵循平均值為零且標準差 s>0 的常態分布。

>>> rng = np.random.default_rng()
>>> s = 0.5
>>> x = stats.norm.rvs(size=500, random_state=rng)
>>> e = stats.norm.rvs(scale=s, size=500, random_state=rng)
>>> y = x + e
>>> stats.pearsonr(x, y).statistic
0.9001942438244763

這應該接近以下給出的精確值

>>> 1/np.sqrt(1 + s**2)
0.8944271909999159

對於 s=0.5,我們觀察到高度相關性。一般而言,雜訊的大變異數會降低相關性,而當誤差的變異數趨於零時,相關性會接近 1。

務必記住,除非 (x, y) 是聯合常態分布,否則無相關性並不表示獨立性。當存在非常簡單的依賴結構時,相關性甚至可能為零:若 X 遵循標準常態分布,則令 y = abs(x)。請注意,x 和 y 之間的相關性為零。實際上,由於 x 的期望值為零,因此 cov(x, y) = E[x*y]。根據定義,這等於 E[x*abs(x)],根據對稱性,其為零。以下程式碼行說明了此觀察結果

>>> y = np.abs(x)
>>> stats.pearsonr(x, y)
PearsonRResult(statistic=-0.05444919272687482, pvalue=0.22422294836207743)

非零相關係數可能會產生誤導。例如,若 X 具有標準常態分布,則定義 y = x(若 x < 0)且 y = 0(否則)。簡單的計算顯示 corr(x, y) = sqrt(2/Pi) = 0.797…,表示高度相關性

>>> y = np.where(x < 0, x, 0)
>>> stats.pearsonr(x, y)
PearsonRResult(statistic=0.861985781588, pvalue=4.813432002751103e-149)

這是違反直覺的,因為若 x 大於零(在我們取樣 x 和 y 的情況下,大約一半的情況會發生這種情況),則 x 和 y 之間沒有依賴性。