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,则减小的轴将作为一维尺寸保留在结果中。使用此选项,结果将针对输入数组正确广播。
- 返回:
- result
TtestResult
具有以下属性的对象
- statistic浮点数或数组
t 统计量。
- pvalue浮点数或数组
与给定备择假设关联的 p 值。
- df浮点数或数组
t 统计量计算中使用的自由度数;这比样本大小(
a.shape[axis]
)少一个。在版本 1.10.0 中添加。
该对象还有以下方法
- confidence_interval(confidence_level=0.95)
针对给定的置信度为总体平均值计算一个置信区间。置信区间以
namedtuple
返回,字段分别为 low 和 high。在版本 1.10.0 中添加。
- result
备注
统计量的计算方式为
(np.mean(a) - popmean)/se
,其中se
是标准误差。因此,当样本平均值大于总体平均值时,统计量将为正数,而当样本平均值小于总体平均值时,统计量将为负数。从 SciPy 1.9 开始,
np.matrix
输入(不建议新代码使用)在计算执行之前转换为np.ndarray
。在这种情况下,输出将是标量或形状合适的np.ndarray
,而不是 2Dnp.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