scipy.stats.

kurtosistest#

scipy.stats.kurtosistest(a, axis=0, nan_policy='propagate', alternative='two-sided', *, keepdims=False)[源代码][源代码]#

测试数据集是否具有正态峰度。

此函数测试零假设,即从中抽取样本的总体的峰度与正态分布的峰度相同。

参数:
a数组

样本数据的数组。必须包含至少五个观测值。

int 或 None, 默认值: 0

如果是一个整数,表示输入数据中要计算统计量的轴。输入数据的每个轴切片(例如行)的统计量将出现在输出的相应元素中。如果为 None,则在计算统计量之前会将输入数据展平。

nan_policy{‘propagate’, ‘omit’, ‘raise’}

定义如何处理输入的 NaN。

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

  • omit: 在执行计算时,NaN 将被省略。如果在计算统计量的轴切片中剩余的数据不足,则输出的相应条目将为 NaN。

  • raise: 如果存在 NaN,将引发 ValueError

替代方案{‘双侧’, ‘小于’, ‘大于’}, 可选

定义备择假设。以下选项可用(默认是’双侧’):

  • ‘双侧’: 样本基础分布的峰度与正态分布的峰度不同

  • ‘less’: 样本基础分布的峰度小于正态分布的峰度

  • ‘greater’: 样本基础分布的峰度大于正态分布的峰度

Added in version 1.7.0.

keepdimsbool, 默认值: False

如果设置为True,被减少的轴将作为尺寸为1的维度保留在结果中。通过此选项,结果将正确地与输入数组进行广播。

返回:
统计浮动

此测试的计算z分数。

p值浮动

假设检验的p值。

注释

仅对 n>20 有效。此函数使用 [1] 中描述的方法。

从 SciPy 1.9 开始,np.matrix 输入(不推荐用于新代码)在计算执行前被转换为 np.ndarray。在这种情况下,输出将是一个标量或适当形状的 np.ndarray,而不是一个 2D 的 np.matrix。同样,虽然掩码数组的掩码元素被忽略,但输出将是一个标量或 np.ndarray,而不是一个 mask=False 的掩码数组。

参考文献

[1] (1,2)

参见例如 F. J. Anscombe, W. J. Glynn, “正态样本的峰度统计量 b2 的分布”, Biometrika, 第70卷, 第227-234页, 1983年。

[2]

Shapiro, S. S., & Wilk, M. B. (1965). 正态性的方差分析检验(完整样本)。《生物统计学》, 52(3/4), 591-611.

[3]

B. Phipson and G. K. Smyth. “Permutation P-values Should Never Be Zero: Calculating Exact P-values When Permutations Are Randomly Drawn.” Statistical Applications in Genetics and Molecular Biology 9.1 (2010).

[4]

Panagiotakos, D. B. (2008). p值在生物医学研究中的价值。《开放心血管医学杂志》, 2, 97.

示例

假设我们希望从测量结果推断,医学研究中成年男性体重的分布是否不是正态分布 [2]。体重(磅)记录在下面的数组 x 中。

>>> import numpy as np
>>> x = np.array([148, 154, 158, 160, 161, 162, 166, 170, 182, 195, 236])

来自 [1] 的峰度检验首先基于样本(超额/Fisher)峰度计算一个统计量。

>>> from scipy import stats
>>> res = stats.kurtosistest(x)
>>> res.statistic
2.3048235214240873

(测试警告称,我们的样本观测值太少,无法进行测试。我们将在示例结束时回到这一点。)由于正态分布的超峰度为零(根据定义),因此从正态分布中抽取的样本的这一统计量的值往往较低。

测试是通过将统计量的观测值与零分布进行比较来进行的:零分布是指在权重是从正态分布中抽取的零假设下得出的统计量值的分布。

在这个测试中,对于非常大的样本,统计量的零分布是标准正态分布。

>>> import matplotlib.pyplot as plt
>>> dist = stats.norm()
>>> kt_val = np.linspace(-5, 5, 100)
>>> pdf = dist.pdf(kt_val)
>>> fig, ax = plt.subplots(figsize=(8, 5))
>>> def kt_plot(ax):  # we'll reuse this
...     ax.plot(kt_val, pdf)
...     ax.set_title("Kurtosis Test Null Distribution")
...     ax.set_xlabel("statistic")
...     ax.set_ylabel("probability density")
>>> kt_plot(ax)
>>> plt.show()
../../_images/scipy-stats-kurtosistest-1_00_00.png

比较通过p值量化:零分布中与统计量的观测值同样极端或更极端的值的比例。在统计量为正的双侧检验中,零分布中大于观测统计量的元素和零分布中小于观测统计量负值的元素都被视为“更极端”。

>>> fig, ax = plt.subplots(figsize=(8, 5))
>>> kt_plot(ax)
>>> pvalue = dist.cdf(-res.statistic) + dist.sf(res.statistic)
>>> annotation = (f'p-value={pvalue:.3f}\n(shaded area)')
>>> props = dict(facecolor='black', width=1, headwidth=5, headlength=8)
>>> _ = ax.annotate(annotation, (3, 0.005), (3.25, 0.02), arrowprops=props)
>>> i = kt_val >= res.statistic
>>> ax.fill_between(kt_val[i], y1=0, y2=pdf[i], color='C0')
>>> i = kt_val <= -res.statistic
>>> ax.fill_between(kt_val[i], y1=0, y2=pdf[i], color='C0')
>>> ax.set_xlim(-5, 5)
>>> ax.set_ylim(0, 0.1)
>>> plt.show()
../../_images/scipy-stats-kurtosistest-1_01_00.png
>>> res.pvalue
0.0211764592113868

如果 p 值是“小”的——也就是说,如果从正态分布的总体中抽取数据产生如此极端的统计值的概率很低——这可能被视为反对零假设而支持备择假设的证据:权重并非来自正态分布。请注意:

  • 反之则不然;也就是说,测试并不用于为零假设提供证据。

  • 被认为是“小”的值的阈值是一个选择,应在分析数据之前做出 [3] ,同时考虑到假阳性(错误地拒绝零假设)和假阴性(未能拒绝错误的零假设)的风险。

请注意,标准正态分布提供了零分布的渐近近似;它仅对具有大量观测值的样本准确。这就是我们在示例开始时收到警告的原因;我们的样本相当小。在这种情况下,scipy.stats.monte_carlo_test 可能提供更准确(尽管是随机的)的精确 p 值近似。

>>> def statistic(x, axis):
...     # get just the skewtest statistic; ignore the p-value
...     return stats.kurtosistest(x, axis=axis).statistic
>>> res = stats.monte_carlo_test(x, stats.norm.rvs, statistic)
>>> fig, ax = plt.subplots(figsize=(8, 5))
>>> kt_plot(ax)
>>> ax.hist(res.null_distribution, np.linspace(-5, 5, 50),
...         density=True)
>>> ax.legend(['aymptotic approximation\n(many observations)',
...            'Monte Carlo approximation\n(11 observations)'])
>>> plt.show()
../../_images/scipy-stats-kurtosistest-1_02_00.png
>>> res.pvalue
0.0272  # may vary

此外,尽管它们具有随机性,但通过这种方式计算的p值可以用于精确控制零假设被错误拒绝的比率 [4]