scipy.stats.

skewtest#

scipy.stats.skewtest(a, axis=0, nan_policy='propagate', alternative='two-sided', *, keepdims=False)[sources]#

检验偏度是否不同于正态分布。

此函数检验零假设,即抽样所得样本种群的偏度与其对应的正态分布的偏度相同。

参数:
aarray

待检验的数据。必须包含至少八个观测值。

axisint 或 None,默认: 0

如果是 int,则沿此输入轴计算统计数据。将输入的每个轴片(例如行)的统计数据显示在输出的相应元素中。如果是 None,则计算统计数据之前将对输入进行展开。

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

定义如何处理输入的 NaN。

  • 向外传播:如果在沿着统计数据计算的轴切片(例如行)中出现无效数字,则输出的对应条目将是无效数字。

  • 省略:在执行计算时将省略无效数字。如果沿着统计数据计算的轴切片中剩余数据不足,则输出的对应条目将是无效数字。

  • 提出:如果出现无效数字,则会提出ValueError

替代{'双边'、'更小'、'更大'},可选

定义替代假设。默认值为‘双边’。以下选项可用

  • ‘双边’:样本底层分布的偏度与正态分布的偏度不同(即 0)

  • ‘更小’:样本底层分布的偏度小于正态分布的偏度

  • ‘更大’:样本底层分布的偏度大于正态分布的偏度

在版本 1.7.0 中添加。

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

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

返回:
统计浮点数

此测试的计算 z 得分。

p 值浮点数

假设检验的 p 值。

备注

样本量至少为 8。

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

参考

[1]

R. B. D’Agostino、A. J. Belanger 和 R. B. D’Agostino Jr.,“使用强大且信息丰富的正态性检验的一个建议”,《美国统计学家》44,第 316-321 页,1990 年。

[2]

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

[3]

B. Phipson 和 G. K. Smyth.“置换 P 值绝不能为零:在置换随机抽取时计算精确 P 值。”统计学在遗传学和分子生物学中的应用 9.1 (2010)。

示例

假设我们希望通过测量推断医学研究中成年男性体重是否服从正态分布 [2]。体重(磅)记录在数组 x 中,如下所示。

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

来自 [1] 的偏度测试首先基于样本偏度计算统计量。

>>> from scipy import stats
>>> res = stats.skewtest(x)
>>> res.statistic
2.7788579769903414

由于正态分布的偏度为零,对于从正态分布中抽取的样本,此统计量的绝对值往往较低。

测试通过比较统计量的观察值与零分布(即在这样的零假设下推导的统计量值分布:权重是从正态分布中抽取的)来执行。

对于此测试,非常大样本的统计量的零分布即标准正态分布。

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

此比较由 p 值量化:零分布中与统计量的观察值一样极端或比统计量的观察值更极端的值的比例。在双边测试中,大于观察统计量的零分布元素和小于观察统计量负值的零分布元素都被认为是“更极端”。

>>> fig, ax = plt.subplots(figsize=(8, 5))
>>> st_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 = st_val >= res.statistic
>>> ax.fill_between(st_val[i], y1=0, y2=pdf[i], color='C0')
>>> i = st_val <= -res.statistic
>>> ax.fill_between(st_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-skewtest-1_01_00.png
>>> res.pvalue
0.005455036974740185

如果 p 值“小”,即,从正态分布总体中抽样数据并产生非常极端的统计量值的概率很低,这可能会被视为证据,表明备择假设(权重不是从正态分布抽取的)反对零假设。注意

  • 反之则不成立;即,此测试不用于提供零假设的证据。

  • 将被视为“小”的阈值是在分析数据之前 [3] 通过考虑假阳性(错误地拒绝零假设)和假阴性(未能拒绝错误的零假设)的风险而做出的选择。

注意,标准正态分布提供的是零分布的渐近估计;它仅对具有众多观测值的样本是准确的。对于诸如我们的小样本,scipy.stats.monte_carlo_test 可能提供精确 p 值的更准确(尽管是随机)的估计。

>>> def statistic(x, axis):
...     # get just the skewtest statistic; ignore the p-value
...     return stats.skewtest(x, axis=axis).statistic
>>> res = stats.monte_carlo_test(x, stats.norm.rvs, statistic)
>>> fig, ax = plt.subplots(figsize=(8, 5))
>>> st_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-skewtest-1_02_00.png
>>> res.pvalue
0.0062  # may vary

在这种情况下,渐近逼近和蒙特卡罗逼近非常紧密,即使对于我们的较小样本也是如此。