scipy.stats.

ks_1samp#

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

执行一样本 Kolmogorov-Smirnov 拟合优度检验。

此检验比较样本的底层分布 F(x) 与给定连续分布 G(x)。有关可用零假设和备择假设的说明,请参见备注。

参数:
xarray_like

iid 随机变量观测值的 1-D 数组。

cdfcallable

用于计算 cdf 的 callable。

args元组,序列,可选

分布参数,与 cdf 一起使用。

备用{‘双边’,‘小于’,‘大于’},可选

定义无效假设和备择假设。默认值为“双边”。请参阅以下说明中的解释。

方法{‘auto’, ‘exact’, ‘approx’, ‘asymp’},可选

定义用于计算 p 值的分布。可用选项如下(默认值为‘auto’)

  • ‘auto’:选择其他某个选项。

  • ‘exact’:使用检验统计量的精确分布。

  • ‘approx’:用两倍的单边概率近似双边概率

  • ‘asymp’:使用检验统计量的渐近分布

int 或 None,默认值:0

如果为 int,则沿着该轴计算输入的统计量。输入的每个 axis 切片(例如行)的统计量将出现在输出的对应要素中。如果 None,则在计算统计量之前将对输入进行展开。

nan 策略{‘传播’,‘遗漏’,‘引发’}

定义如何处理输入的 NaN。

  • 传播:如果在计算统计量的轴切片(例如行)中存在 NaN,则输出的对应条目将为 NaN。

  • 遗漏:执行计算时,NaN 将被遗漏。如果在计算统计量的轴切片中没有足够的数据,则输出的对应条目将为 NaN。

  • 引发:如果存在 NaN,则引发 ValueError

保留度量布尔值,默认值:False

如果将其设置为 True,则返回的结果中会将减少的轴保留为大小为 1 的维度。使用此选项,结果将针对输入数组正确地广播。

返回:
res: KstestResult

包含以下属性的对象

统计量浮点数

KS 检验统计量,可以是 D+、D- 或 D(两者的最大值)

p 值浮点数

单尾或双尾 p 值。

statistic_location浮点数

与 KS 统计量对应的 x 的值;也就是说,经验分布函数和假设累积分布函数之间的距离在该观察值处测量。

statistic_signint

如果 KS 统计量是经验分布函数和假设累积分布函数之间的最大正差(D+),则为 +1;如果 KS 统计量是最大负差(D-),则为 -1。

另请参阅

ks_2sampkstest

说明

可以使用 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,而不是二维 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)

正如预期的那样,p 值 0.92 不低于我们的阈值 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 值小于我们的阈值,我们会根据备择假设拒绝原假设。