scipy.stats.

ttest_1samp#

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

计算一组分数的均值的 t 检验。

这是一个零假设检验,即独立观测样本 a 的期望值(均值)等于给定的总体均值 popmean

参数:
a序列

样本观察值。

popmean浮点值或序列

零假设中的期望值。如果是序列,则其沿着 axis 的长度必须等于 1,且必须可以广播为 a

axis整数或 None,默认值:0

如果是一个整数,则指定输入中沿其计算统计量。输入的每一片段(例如行)的统计量将显示在输出的对应元素中。如果为 None,则在计算统计量前输入将被扁平化。

nan_policy{‘传播’, ‘忽略’, ‘引发’}

定义如何处理输入 NaN。

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

  • 忽略:在执行计算时将忽略 NaN。如果沿着其计算统计数据的轴片中没有足够的数据,则输出的对应条目将为 NaN。

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

alternative{‘双侧’, ‘小于’, ‘大于’},可选

定义备择假设。可用的选项如下(默认值为 ‘双侧’)

  • ‘双侧’: 样本的底层分布的平均值与给定的总体平均值(popmean)不同

  • ‘小于’: 样本的底层分布的平均值小于给定的总体平均值(popmean

  • ‘大于’: 样本的底层分布的平均值大于给定的总体平均值(popmean

keepdimsbool,默认值:False

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

返回:
resultTtestResult

具有以下属性的对象

statistic浮点数或数组

t 统计量。

pvalue浮点数或数组

与给定备择假设关联的 p 值。

df浮点数或数组

t 统计量计算中使用的自由度数;这比样本大小(a.shape[axis])少一个。

在版本 1.10.0 中添加。

该对象还有以下方法

confidence_interval(confidence_level=0.95)

针对给定的置信度为总体平均值计算一个置信区间。置信区间以 namedtuple 返回,字段分别为 lowhigh

在版本 1.10.0 中添加。

备注

统计量的计算方式为 (np.mean(a) - popmean)/se,其中 se 是标准误差。因此,当样本平均值大于总体平均值时,统计量将为正数,而当样本平均值小于总体平均值时,统计量将为负数。

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

示例

假设我们希望检验均值为 0.5 的总体均值无差异性假设。我们选择 99% 的置信水平;即,如果 p 值小于 0.01,我们将拒绝原假设赞同备择假设。

在检验均值为 0.5 的标准均匀分布的随机变量时,我们希望数据大部分时间与原假设一致。

>>> import numpy as np
>>> from scipy import stats
>>> rng = np.random.default_rng()
>>> rvs = stats.uniform.rvs(size=50, random_state=rng)
>>> stats.ttest_1samp(rvs, popmean=0.5)
TtestResult(statistic=2.456308468440, pvalue=0.017628209047638, df=49)

正如预期的那样,p 值 0.017 低于我们的阈值 0.01,因此我们不能拒绝原假设。

在检验均值为 0 的标准正态分布的数据时,我们希望拒绝原假设。

>>> rvs = stats.norm.rvs(size=50, random_state=rng)
>>> stats.ttest_1samp(rvs, popmean=0.5)
TtestResult(statistic=-7.433605518875, pvalue=1.416760157221e-09, df=49)

确实,p 值低于我们的阈值 0.01,因此我们拒绝原假设赞同默认“两侧”备择假设:总体均值等于 0.5。

但是,假设我们检验原假设与单侧备择假设,即总体均值大于 0.5。由于标准正态的均值小于 0.5,因此我们不希望拒绝原假设。

>>> stats.ttest_1samp(rvs, popmean=0.5, alternative='greater')
TtestResult(statistic=-7.433605518875, pvalue=0.99999999929, df=49)

毫不奇怪,由于 p 值大于我们的阈值,我们不拒绝原假设。

请注意,当使用 99% 的置信水平时,大约有 1% 的时间会拒绝真正的原假设。

>>> rvs = stats.uniform.rvs(size=(100, 50), random_state=rng)
>>> res = stats.ttest_1samp(rvs, popmean=0.5, axis=1)
>>> np.sum(res.pvalue < 0.01)
1

确实,尽管所有 100 个样本均从均值确实为 0.5 的标准均匀分布中抽取,但我们会错误地拒绝其中一个的原假设。

ttest_1samp 还可以计算总体均值周围的置信区间。

>>> rvs = stats.norm.rvs(size=50, random_state=rng)
>>> res = stats.ttest_1samp(rvs, popmean=0)
>>> ci = res.confidence_interval(confidence_level=0.95)
>>> ci
ConfidenceInterval(low=-0.3193887540880017, high=0.2898583388980972)

95% 置信区间的上限和下限是参数 popmean 的最小值和最大值,测试的 p 值为 0.05。

>>> res = stats.ttest_1samp(rvs, popmean=ci.low)
>>> np.testing.assert_allclose(res.pvalue, 0.05)
>>> res = stats.ttest_1samp(rvs, popmean=ci.high)
>>> np.testing.assert_allclose(res.pvalue, 0.05)

在对抽取样本的总体做出某些假设的条件下,置信水平为 95% 的置信区间预计在 95% 的样本复制中包含真正的总体均值。

>>> rvs = stats.norm.rvs(size=(50, 1000), loc=1, random_state=rng)
>>> res = stats.ttest_1samp(rvs, popmean=0)
>>> ci = res.confidence_interval()
>>> contains_pop_mean = (ci.low < 1) & (ci.high > 1)
>>> contains_pop_mean.sum()
953