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。
说明
可以使用 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 值小于我们的阈值,我们会根据备择假设拒绝原假设。