用 python 做 z 检验,t 检验

文章目录


Python 中的假设检验一般用到 scipy 或 statsmodels 包,需要注意的是,这两个包里面各种检验的置信度都是 0.05。

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 统计量值
pvalue p 值

假设有下面表格的数据:

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

检测其均值是否为 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 时,由于 p 值大于 α \alpha ,接受原假设,认为该样本的均值是 39。

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

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

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

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

检测两个样本的均值是否相等,因为两个样本都是大样本,使用 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 中样本的期望值
输出参数:
tstats 统计量值
pvalue p 值

下面是一个样本的数据:
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

检测样本均值是否等于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 ,若是右侧检验,则 p 值为 1 0.957 / 2 = 0.5215 1-0.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

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

ttest_ind 函数的语法为:

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

假设两个样本的方差不同,则独立双样本的 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,拒绝原假设,认为这两个匹配样本的均值不同。

发布了280 篇原创文章 · 获赞 496 · 访问量 146万+

猜你喜欢

转载自blog.csdn.net/robert_chen1988/article/details/103378351