scipy.stats.

ks_1samp#

scipy.stats.ks_1samp(x, cdf, args=(), alternative='two-sided', method='auto', *, axis=0, nan_policy='propagate', keepdims=False)[原始碼]#

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

此檢定將樣本的底層分佈 F(x) 與給定的連續分佈 G(x) 進行比較。 有關可用的虛無假設和對立假設的描述,請參閱「註解」。

參數:
xarray_like

iid 隨機變數的 1-D 觀察值陣列。

cdfcallable

用於計算 cdf 的可呼叫物件。

argstuple, sequence, optional

分佈參數,與 cdf 一起使用。

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 統計量對應的 x 值; 即,經驗分佈函數與假設的累積分布函數之間的距離是在此觀察值處測量的。

statistic_signint

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

另請參閱

ks_2samp, kstest

註解

虛無假設和對應的對立假設有三個選項,可以使用 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.ks_1samp(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.ks_1samp(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.ks_1samp(x, stats.norm.cdf, alternative='less')
KstestResult(statistic=0.17482387821055168,
             pvalue=0.001913921057766743,
             statistic_location=0.3713830565352756,
             statistic_sign=-1)

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