用 python 做 z 检验,t 检验

文章目录


Python 中的假设检验一般用到 scipy 或 statsmodels 包。

1. z 检验

对于大样本数据(样本量 ≥ \geq 30),或者即使是小样本,但是知道其服从正态分布,并且知道总体分布的方差时,需要用 z 检验。在 python 中,由于 scipy 包没有 z 检验,我们只能用 statsmodels 包中的 ztest 函数。ztest 函数的一般用法如下:

ztest(x1, x2=None, value=0, alternative=`two-sided’)
输入参数:
x1数组,第一个样本的数据值
x2数组,第二个样本的数据值,默认没有值
value浮点型数值,若是单样本,则 value 是样本假设的均值
若是双样本,则 value是两个样本均值的差值
alternative若为 `larger’,备选假设 H1 大于 value 值
若为 `smaller’,备选假设 H1 小于 value 值
输出参数:
tstats统计量值
pvaluep 值

假设有下面表格的数据:

233642343934354253284939
464539384527435436344836
474448454433244050323931

检测其均值是否为 39, 该问题显然是一个双侧检验,由于样本个数大于 30,则使用 z 检验,python 代码如下:

 >>> import statsmodels.stats.weightstats as sw
 >>> arr=[23,36,42,34,39,34,35,42,53,28,49,39,
 ... 46,45,39,38,45,27,43,54,36,34,48,36,
 ... 47,44,48,45,44,33,24,40,50,32,39,31]
 >>> sw.ztest(arr, value=39)
 (0.3859224924939799, 0.6995540720244979)

从 ztest 的运行结果可以看出,统计量值为 0.385,而 p 值是 0.699,在置信度 α = 0.05 \alpha=0.05 α=0.05 时,由于 p 值大于 α \alpha α,接受原假设,认为该样本的均值是 39。

若要检测该样本均值是否大于 39,即原假设 H0: μ ≥ 39 \mu\geq 39 μ39,备选假设为: μ < 39 \mu< 39 μ<39,则我们需要在代码中增加一个参数 alternative=``smaller”:

>>> sw.ztest(arr, value=39, alternative="smaller")
(0.3859224924939799, 0.650222963987751)

检测结果的 p 值为 0.650,大于置信度 0.05,则接受原假设,认为样本均值大于39。假设另外一个样本 2 的数据:

41343632323533313534
37343136373433373338
38373436363133363735
33343335343434353534

检测两个样本的均值是否相等,因为两个样本都是大样本,使用 z 检验, python 代码如下:

>>> arr2 = [41, 34, 36, 32, 32, 35, 33, 31, 35, 34,
... 37, 34, 31, 36, 37, 34, 33, 37, 33, 38,
... 38, 37, 34, 36, 36, 31, 33, 36, 37, 35,
... 33, 34, 33, 35, 34, 34, 34, 35, 35, 34]
>>> sw.ztest(arr, arr2, value=0)
(3.775645601380307, 0.0001595937672736755)

从 ztest 的检验结果可以看出,p 值小于 0.05, 则拒绝原假设,认为两个样本的均值不相等。

2. t 检验

小样本(样本量小于30个),一般用 t 检验。对于 t 检验,可以根据样本特点,用 scipy 包中的 ttest_1sample(单样本 t检验函数),ttest_ind(两个独立样本的 t 检验),ttest_rel (两个匹配样本的 t 检验)。但这些函数得到都是双侧 t 检验的 p 值。如果是单侧检验,我们还要进行一些换算,得到单侧检验的 p 值。

ttest_1sample 函数的语法为:

ttest_1samp(a, popmean)
输入参数:
a数组,样本的数据值
popmean原假设 H 0 H_0 H0 中样本的期望值
输出参数:
tstats统计量值
pvaluep 值

下面是一个样本的数据:
99.3 98.7 100.5 101.2 98.3 99.7 99.5 102.1 100.5 99.3\quad 98.7\quad 100.5\quad 101.2\quad 98.3\quad 99.7\quad 99.5\quad 102.1\quad 100.5 99.398.7100.5101.298.399.799.5102.1100.5

检测样本均值是否等于100,对其进行双侧 t 检验的语法为:

>>> import scipy.stats as st
>>> a = [99.3, 98.7, 100.5, 101.2, 98.3, 99.7, 99.5, 102.1, 100.5]
>>> st.ttest_1samp(a, 100)
Ttest_1sampResult(statistic=-0.054996133220328265, pvalue=0.9574902045208937)

从结果可以看出,双侧检验的 p 值为 0.95, 大于置信度 0.05,因此接受原假设,认为样本的均值是100。若是单侧检验中的左侧检验,则 p 值为 0.957 / 2 = 0.4785 0.957/2=0.4785 0.957/2=0.4785,若是右侧检验,则 p 值为 1 − 0.957 / 2 = 0.5215 1-0.957/2=0.5215 10.957/2=0.5215

假设有另外一个样本的数据:
91.1 93.7 93.6 96.1 94.3 92.2 94.0 95.7 97.1 91.1\quad 93.7\quad 93.6\quad 96.1\quad 94.3\quad 92.2\quad 94.0\quad 95.7\quad 97.1 91.193.793.696.194.392.294.095.797.1

若两个样本相互独立,检测两个样本的均值是否相等,使用 ttest_ind 函数。

ttest_ind 函数的语法为:

ttest_ind(a, b, axis=0, equal_var=True)
输入参数:
a数组,样本的数据值
b数组,样本2的数据值
axis一般为 0
equal_var若为 true,表示两个样本由相同的方差
若为 false,表示两个样本的方差不同,使用合并方差
输出参数:
tstats统计量值
pvaluep 值

假设两个样本的方差不同,则独立双样本的 t 检验 python 代码为:

\begin{lstlisting}[Language=Python]

>>> a = [99.3, 98.7, 100.5, 101.2, 98.3, 99.7, 99.5, 102.1, 100.5]
>>> b = [91.1, 93.7, 93.6, 96.1, 94.3, 92.2, 94.0, 95.7, 97.1]
>>> st.ttest_ind(a, b, equal_var = False)
Ttest_indResult(statistic=7.723221821038956, pvalue=2.4331092243754622e-06)

从上面结果可以看出,p 值小于置信度 0.05,拒绝原假设,认为两个两个样本的均值不同。

若两个样本是匹配样本,使用函数 ttest_rel,它的语法更简单,只需在函数里输入两个样本的数组即可。假设上面两个样本为匹配样本,python 代码为:

>>> import scipy.stats as st
>>> a = [99.3, 98.7, 100.5, 101.2, 98.3, 99.7, 99.5, 102.1, 100.5]
>>> b = [91.1, 93.7, 93.6, 96.1, 94.3, 92.2, 94.0, 95.7, 97.1]
>>> st.ttest_rel(a, b)
Ttest_relResult(statistic=10.845107419335658, pvalue=4.617509769582176e-06)

结果显示,p 值小于置信度 0.05,拒绝原假设,认为这两个匹配样本的均值不同。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心态与习惯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值