ks_1samp#
- scipy.stats.ks_1samp(x, cdf, args=(), alternative='two-sided', method='auto', *, axis=0, nan_policy='propagate', keepdims=False)[源代码]#
执行单样本柯尔莫哥洛夫-斯米尔诺夫拟合优度检验。
此检验将样本的潜在分布 F(x) 与给定的连续分布 G(x) 进行比较。有关可用零假设和备择假设的描述,请参阅“注释”。
- 参数:
- xarray_like
iid 随机变量观测值的 1-D 数组。
- cdf可调用对象
用于计算 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
如果为 int,则输入轴,沿该轴计算统计量。输入的每个轴切片(例如,行)的统计量将出现在输出的相应元素中。如果为
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。
注释
可以使用 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
,而不是 2Dnp.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 值小于我们的阈值,我们拒绝零假设,转而支持备择假设。