scipy.stats.

ks_2samp#

scipy.stats.ks_2samp(data1, data2, alternative='two-sided', method='auto', *, axis=0, nan_policy='propagate', keepdims=False)[原始碼]#

執行雙樣本 Kolmogorov-Smirnov 適合度檢定。

此檢定比較兩個獨立樣本的底層連續分佈 F(x) 和 G(x)。請參閱「註解」以了解可用的虛無假設和對立假設的描述。

參數:
data1, data2array_like, 1 維

假設從連續分佈中抽取的兩個樣本觀察值陣列,樣本大小可以不同。

alternative{‘two-sided’, ‘less’, ‘greater’}, optional

定義虛無假設和對立假設。預設值為 ‘two-sided’。請參閱下方「註解」中的說明。

method{‘auto’, ‘exact’, ‘asymp’}, optional

定義用於計算 p 值的演算法。以下選項可用 (預設值為 ‘auto’)

  • ‘auto’ : 小尺寸陣列使用 ‘exact’,大尺寸陣列使用 ‘asymp’

  • ‘exact’ : 使用檢定統計量的精確分佈

  • ‘asymp’ : 使用檢定統計量的漸近分佈

axisint 或 None,預設值:0

如果是整數,則為計算統計量的輸入軸。輸入的每個軸切片(例如,行)的統計量將出現在輸出的對應元素中。如果 None,則輸入將在計算統計量之前被展平。

nan_policy{‘propagate’, ‘omit’, ‘raise’}

定義如何處理輸入的 NaN。

  • propagate: 如果 NaN 出現在計算統計量的軸切片(例如,行)中,則輸出的對應條目將為 NaN。

  • omit: 在執行計算時將省略 NaN。如果軸切片中剩餘的資料不足以計算統計量,則輸出的對應條目將為 NaN。

  • raise: 如果存在 NaN,則會引發 ValueError

keepdimsbool,預設值:False

如果設定為 True,則縮減的軸將保留在結果中,作為大小為 1 的維度。使用此選項,結果將針對輸入陣列正確廣播。

返回:
res: KstestResult

包含屬性的物件

statisticfloat

KS 檢定統計量。

pvaluefloat

單尾或雙尾 p 值。

statistic_locationfloat

來自 data1data2 的值,與 KS 統計量對應;也就是說,經驗分佈函數之間的距離是在此觀察值處測量的。

statistic_signint

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

註解

可以使用 alternative 參數選擇虛無假設和對應的對立假設的三個選項。

  • less:虛無假設是對於所有 x,F(x) >= G(x);對立假設是對於至少一個 x,F(x) < G(x)。統計量是樣本的經驗分佈函數之間最小(最負)差異的量值。

  • greater:虛無假設是對於所有 x,F(x) <= G(x);對立假設是對於至少一個 x,F(x) > G(x)。統計量是樣本的經驗分佈函數之間最大(最正)差異。

  • two-sided:虛無假設是兩個分佈相同,對於所有 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 值。

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

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

從 SciPy 1.9 開始,np.matrix 輸入(不建議用於新程式碼)在執行計算之前會轉換為 np.ndarray。在這種情況下,輸出將是純量或形狀適當的 np.ndarray,而不是 2D np.matrix。同樣地,雖然會忽略遮罩陣列的遮罩元素,但輸出將是純量或 np.ndarray,而不是 mask=False 的遮罩陣列。

參考文獻

[1]

Hodges, J.L. Jr., “The Significance Probability of the Smirnov Two-Sample Test,” Arkiv fiur Matematik, 3, No. 43 (1958), 469-486.

範例

假設我們希望檢定兩個樣本是否從相同分佈中抽取的虛無假設。我們選擇 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,
             statistic_location=-0.014071496412861274,
             statistic_sign=-1)

實際上,p 值低於我們的閾值 0.05,因此我們拒絕虛無假設而支持預設的「雙尾」對立假設:資料不是從相同分佈中抽取的。

當兩個樣本都是從相同分佈中抽取時,我們預期資料在大多數時間都與虛無假設一致。

>>> 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,
             statistic_location=-0.1670157701848795,
             statistic_sign=-1)

如預期的,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,
             statistic_location=-0.13249370614972575,
             statistic_sign=-1)

實際上,由於 p 值小於我們的閾值,我們拒絕虛無假設而支持對立假設。