當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy stats.ks_2samp用法及代碼示例


本文簡要介紹 python 語言中 scipy.stats.ks_2samp 的用法。

用法:

scipy.stats.ks_2samp(data1, data2, alternative='two-sided', method='auto')#

執行兩個樣本 Kolmogorov-Smirnov 擬合優度檢驗。

該測試比較了兩個獨立樣本的基本連續分布 F(x) 和 G(x)。有關可用的無效假設和替代假設的說明,請參見注釋。

參數

data1, data2 數組,一維

假設從連續分布中提取的兩個樣本觀察數組,樣本大小可以不同。

alternative {‘雙麵’,‘less’, ‘greater’},可選

定義原假設和備擇假設。默認為“雙麵”。請參閱下麵注釋中的說明。

method {‘auto’, ‘exact’, ‘asymp’},可選

定義用於計算 p 值的方法。以下選項可用(默認為‘auto’):

  • ‘auto’ : use ‘exact’ for small size arrays, ‘asymp’ for large

  • ‘exact’ : use exact distribution of test statistic

  • ‘asymp’ : use asymptotic distribution of test statistic

返回

資源:KstestResult

包含屬性的對象:

統計 浮點數

KS 檢驗統計量。

p值 浮點數

One-tailed 或 two-tailed p 值。

statistic_location 浮點數

data1 或 data2 中與 KS 統計量對應的值;即,在該觀察中測量經驗分布函數之間的距離。

statistic_sign int

如果 data1 的經驗分布函數超過 statistic_location 處 data2 的經驗分布函數,則 +1,否則 -1。

注意

可以使用替代參數選擇零和相應替代假設的三個選項。

  • less:原假設是對於所有 x,F(x) >= G(x);另一種方法是對於至少一個 x,F(x) < G(x)。該統計量是樣本的經驗分布函數之間的最小(最負)差異的大小。

  • 更大:原假設是對於所有 x,F(x) <= G(x);另一種方法是對於至少一個 x,F(x) > G(x)。該統計量是樣本的經驗分布函數之間的最大(最正)差異。

  • 雙麵:原假設是兩個分布相同,對於所有 x,F(x)=G(x);另一種情況是它們不相同。統計量是樣本的經驗分布函數之間的最大絕對差。

請注意,替代假設說明了CDF基本分布的值,而不是數據的觀測值。例如,假設 x1 ~ F 和 x2 ~ G。如果對於所有 x,F(x) > G(x),則 x1 中的值往往小於 x2 中的值。

如果 KS 統計量很大,則 p 值會很小,這可以作為反對零假設、支持替代方案的證據。

如果 method='exact'ks_2samp 嘗試計算精確的 p 值,即在零假設下獲得與根據數據計算的值一樣極端的檢驗統計值的概率。如果 method='asymp' ,則使用漸近 Kolmogorov-Smirnov 分布來計算近似 p 值。如果 method='auto' ,如果兩個樣本大小都小於 10000,則嘗試精確的 p 值計算;否則,使用漸近方法。在任何情況下,如果嘗試精確的 p 值計算但失敗,則會發出警告,並返回漸近 p 值。

“雙麵”‘exact’ 計算計算互補概率,然後從 1 中減去。因此,它可以返回的最小概率約為 1e-16。雖然算法本身是精確的,但對於大樣本量,數值誤差可能會累積。它最適合其中一個樣本量隻有幾千個的情況。

我們通常遵循 Hodges 對 Drion/Gnedenko/Korolyuk 的治療 [1]。

參考

[1]

Hodges, J.L. Jr.,“Smirnov 雙樣本檢驗的顯著性概率”,Arkiv fiur Matematik,3,第 43 期 (1958),469-86。

例子

假設我們希望檢驗兩個樣本來自同一分布的原假設。我們選擇置信度為95%;也就是說,如果 p 值小於 0.05,我們將拒絕原假設並支持替代假設。

如果第一個樣本來自均勻分布,而第二個樣本來自標準正態分布,我們預計會拒絕原假設。

>>> import numpy as np
>>> from scipy import stats
>>> rng = np.random.default_rng()
>>> sample1 = stats.uniform.rvs(size=100, random_state=rng)
>>> sample2 = stats.norm.rvs(size=110, random_state=rng)
>>> stats.ks_2samp(sample1, sample2)
KstestResult(statistic=0.5454545454545454, pvalue=7.37417839555191e-15)

事實上,p 值低於我們的閾值 0.05,因此我們拒絕原假設,轉而支持默認的 “two-sided” 替代方案:數據並非來自相同的分布。

當兩個樣本都來自相同的分布時,我們期望數據在大多數情況下與原假設一致。

>>> sample1 = stats.norm.rvs(size=105, random_state=rng)
>>> sample2 = stats.norm.rvs(size=95, random_state=rng)
>>> stats.ks_2samp(sample1, sample2)
KstestResult(statistic=0.10927318295739348, pvalue=0.5438289009927495)

正如預期的那樣,p 值 0.54 不低於我們的閾值 0.05,因此我們不能拒絕原假設。

然而,假設第一個樣本是從向更大值移動的正態分布中抽取的。在這種情況下,基礎分布的累積密度函數 (CDF) 往往是較少的比第二個樣本下的 CDF。因此,我們期望原假設被拒絕alternative='less'

>>> sample1 = stats.norm.rvs(size=105, loc=0.5, random_state=rng)
>>> stats.ks_2samp(sample1, sample2, alternative='less')
KstestResult(statistic=0.4055137844611529, pvalue=3.5474563068855554e-08)

事實上,當 p 值小於我們的閾值時,我們拒絕零假設,轉而支持替代方案。

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.stats.ks_2samp。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。