scipy.stats.

kstest#

scipy.stats.kstest(rvs, cdf, args=(), N=20, alternative='two-sided', method='auto', *, axis=0, nan_policy='propagate', keepdims=False)[來源]#

執行 (單樣本或雙樣本) Kolmogorov-Smirnov 適合度檢定。

單樣本檢定將樣本的基礎分佈 F(x) 與給定的分佈 G(x) 進行比較。雙樣本檢定比較兩個獨立樣本的基礎分佈。兩種檢定僅對連續分佈有效。

參數:
rvs字串 (str)、類陣列 (array_like) 或可呼叫 (callable) 物件

如果為陣列,則應為隨機變數觀測值的一維陣列。如果為可呼叫物件,則應為產生隨機變數的函數;它必須具有關鍵字引數 size。如果為字串,則應為 scipy.stats 中分佈的名稱,將用於產生隨機變數。

cdf字串 (str)、類陣列 (array_like) 或可呼叫 (callable) 物件

如果為類陣列,則應為隨機變數觀測值的一維陣列,並執行雙樣本檢定(且 rvs 必須為類陣列)。如果為可呼叫物件,則該可呼叫物件用於計算 cdf。如果為字串,則應為 scipy.stats 中分佈的名稱,將用作 cdf 函數。

argstuple、sequence、optional

分佈參數,如果 rvscdf 是字串或可呼叫物件,則使用。

Nint, optional

樣本大小,如果 rvs 是字串或可呼叫物件。預設值為 20。

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

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

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

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

  • ‘auto’:選擇其他選項之一。

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

  • ‘approx’:使用單側機率的兩倍來近似雙側機率

  • ‘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 檢定統計量,D+、D- 或 D(兩者中的最大值)

pvaluefloat

單尾或雙尾 p 值。

statistic_locationfloat

在單樣本檢定中,這是與 KS 統計量對應的 rvs 值;也就是說,經驗分佈函數與假設的累積分布函數之間的距離是在此觀測值處測量的。

在雙樣本檢定中,這是與 KS 統計量對應的 rvscdf 值;也就是說,經驗分佈函數之間的距離是在此觀測值處測量的。

statistic_signint

在單樣本檢定中,如果 KS 統計量是經驗分佈函數與假設的累積分布函數之間的最大正差 (D+),則為 +1;如果 KS 統計量是最大負差 (D-),則為 -1。

在雙樣本檢定中,如果在 statistic_locationrvs 的經驗分佈函數超過 cdf 的經驗分佈函數,則為 +1,否則為 -1。

另請參閱

ks_1samp, ks_2samp

註解

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

  • two-sided:虛無假設是兩個分佈相同,對於所有 x,F(x)=G(x);對立假設是它們不相同。

  • less:虛無假設是對於所有 x,F(x) >= G(x);對立假設是對於至少一個 x,F(x) < G(x)。

  • greater:虛無假設是對於所有 x,F(x) <= G(x);對立假設是對於至少一個 x,F(x) > G(x)。

請注意,對立假設描述的是基礎分佈的CDF,而不是觀測值。例如,假設 x1 ~ F 且 x2 ~ G。如果對於所有 x,F(x) > G(x),則 x1 中的值往往小於 x2 中的值。

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

範例

假設我們希望檢定樣本是否根據標準常態分佈分佈的虛無假設。我們選擇 95% 的信賴水準;也就是說,如果 p 值小於 0.05,我們將拒絕虛無假設,而支持對立假設。

當檢定均勻分佈的資料時,我們預期虛無假設會被拒絕。

>>> import numpy as np
>>> from scipy import stats
>>> rng = np.random.default_rng()
>>> stats.kstest(stats.uniform.rvs(size=100, random_state=rng),
...              stats.norm.cdf)
KstestResult(statistic=0.5001899973268688,
             pvalue=1.1616392184763533e-23,
             statistic_location=0.00047625268963724654,
             statistic_sign=-1)

實際上,p 值低於我們的 0.05 閾值,因此我們拒絕虛無假設,而支持預設的「雙尾」對立假設:資料並非根據標準常態分佈分佈。

當從標準常態分佈檢定隨機變數時,我們預期資料在大多數情況下與虛無假設一致。

>>> x = stats.norm.rvs(size=100, random_state=rng)
>>> stats.kstest(x, stats.norm.cdf)
KstestResult(statistic=0.05345882212970396,
             pvalue=0.9227159037744717,
             statistic_location=-1.2451343873745018,
             statistic_sign=1)

正如預期的,0.92 的 p 值不低於我們的 0.05 閾值,因此我們無法拒絕虛無假設。

但是,假設隨機變數根據向較大值移動的常態分佈分佈。在這種情況下,基礎分佈的累積密度函數 (CDF) 往往小於標準常態分佈的 CDF。因此,我們預期虛無假設會被 alternative='less' 拒絕

>>> x = stats.norm.rvs(size=100, loc=0.5, random_state=rng)
>>> stats.kstest(x, stats.norm.cdf, alternative='less')
KstestResult(statistic=0.17482387821055168,
             pvalue=0.001913921057766743,
             statistic_location=0.3713830565352756,
             statistic_sign=-1)

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

為了方便起見,可以使用分佈的名稱作為第二個引數來執行先前的檢定。

>>> stats.kstest(x, "norm", alternative='less')
KstestResult(statistic=0.17482387821055168,
             pvalue=0.001913921057766743,
             statistic_location=0.3713830565352756,
             statistic_sign=-1)

以上範例都是單樣本檢定,與 ks_1samp 執行的檢定相同。請注意,kstest 也可以執行雙樣本檢定,與 ks_2samp 執行的檢定相同。例如,當從同一個分佈中抽取兩個樣本時,我們預期資料在大多數情況下與虛無假設一致。

>>> sample1 = stats.laplace.rvs(size=105, random_state=rng)
>>> sample2 = stats.laplace.rvs(size=95, random_state=rng)
>>> stats.kstest(sample1, sample2)
KstestResult(statistic=0.11779448621553884,
             pvalue=0.4494256912629795,
             statistic_location=0.6138814275424155,
             statistic_sign=1)

正如預期的,0.45 的 p 值不低於我們的 0.05 閾值,因此我們無法拒絕虛無假設。