【DS with Python】假设检验、显著性水平、T检验的数学理论 与scipy.stats模块实现


前言

前两章是基于数理统计和多元统计分析对假设检验和T检验的理论进行简述,第三章和第四章是实际Python应用中的方法与实际案例。


一、假设检验(hypothesis testing)与显著性水平 α \alpha α

  真实的世界中,规律与事物间的关联往往不像想象中那么直观,为了使得出的结论更具有说服性,我们往往会采用假设检验的方法,通过否定一个假设,来接受所否定的假设的完全对立的另一个假设,这就是假设检验的操作步骤概述。

  引用百度百科的介绍:

假设检验是用来判断样本与样本、样本与总体的差异是由抽样误差引起还是本质差别造成的统计推断方法。

  例如,我们需要知道实验中不同的两个变量是否对结果产生了影响,就可以用到假设检验的方法。

  假设检验的核心思想是小概率事件,即如果我们的假设发生的概率非常小,那么就拒绝这个假设,否则,不拒绝这个假设(注意:不拒绝不等同于接受,但在一般简单应用过程中,可以解释为不在拒绝域内即可接受该假设)

  在假设检验中,我们首先给定零假设(Null hypothesis),这个假设往往是我们需要否定的假设,我们计算出这个假设的概率小于一定的阈值后,就会拒绝这个假设,于此同时,我们给定一个与零假设完全相反的另一个假设,即备择假设(Alternative hypothesis),当拒绝了零假设,我们就会接受备择假设。

  这时候我们发现,尽管我们有再大的把握来拒绝零假设,仍旧不妨碍零假设可能是对的(例如:火鸡困境和明天太阳不会升起),如果零假设是对的,但我们拒绝了这个假设,那我们就犯了错,这就是第一类错误;也有可能我们的决定拒绝零假设的理由不充分,反而接受了零假设,但实际上零假设是错误的,这样我们就又犯了错,这就是第二类错误,很明显,降低了第一类错误的概率就会提升第二类错误的概率,在现实中,我们更倾向于控制第一类错误,这就是为什么我们要把"准备拒绝的假设"当作零假设。而为了控制第一类错误,我们设计了显著性水平 α \alpha α,可以先理解为零假设成立的概率阈值,我们再去估算零假设成立的概率 p − v a l u e p-value pvalue,如果这个概率在我们设定的概率阈值之下,那我们就拒绝零假设,反之,则说在当前显著性水平下不拒绝零假设。我们发现,这个阈值越低,犯第一类错误的概率就越低。


二、T检验简介

  常用T检验大致分为三类:

  1. 单样本均值检验(One-sample t-test)
  2. 两个独立样本均值检验(Independent two-sample t-test)
  3. 配对样本均值检验(Dependent t-test for paired samples)

  本文主要介绍第一类和第二类的第一种情况,其他的可能日后补充,贴上了相关链接,如果感兴趣可以自行翻阅。

2.1 单样本均值检验

  作用:检验单样本的均值是否和总体的均值相等。

  比如,检验某批灯泡能正常使用的时长是否大于规定的时长,或某批零件的尺寸是否符合规定的尺寸。

  常用在总体均值已知(例如规定灯泡正常使用的时长),但总体方差未知的情况,记总体均值为 μ \mu μ,总体方差为 σ 2 \sigma^2 σ2(未知),样本的无偏估计为

  • 均值:

X ˉ = 1 n ∑ i = 1 n X i \bar{X}=\frac{1}{n}\sum_{i=1}^nX_i Xˉ=n1i=1nXi

  • 方差:

s 2 = 1 n − 1 ∑ i = 1 n ( X i − X ˉ ) 2 s^2=\frac{1}{n-1}\sum_{i=1}^n(X_i-\bar{X})^2 s2=n11i=1n(XiXˉ)2

  假设样本 X i X_i Xi和总体符合正态分布,此时,
X i ∼ N ( μ , σ 2 ) X ˉ = 1 n ∑ i = 1 n X i ∼ N ( μ , σ 2 n ) X_i \sim N(\mu,\sigma^2)\\ \bar{X}=\frac{1}{n}\sum_{i=1}^nX_i \sim N(\mu,\frac{\sigma^2}{n}) XiN(μ,σ2)Xˉ=n1i=1nXiN(μ,nσ2)
  由此可得
X ˉ − μ σ n = n ( X ˉ − μ ) σ ∼ N ( 0 , 1 ) (1) \frac{\bar{X}-\mu}{\frac{\sigma} {\sqrt{n}}}=\frac{\sqrt{n}(\bar{X}-\mu)}{\sigma}\sim N(0,1) \tag{1} n σXˉμ=σn (Xˉμ)N(0,1)(1)

  由卡方分布的定义:
χ 2 = Z 1 2 + Z 2 2 + . . . + Z n 2 ∼ χ 2 ( n ) ∑ i = 1 n Z i 2 ∼ χ 2 ( n ) \chi^2=Z_1^2+Z_2^2+...+Z_n^2\sim \chi^2(n)\\ \sum_{i=1}^n Z_i^2\sim \chi^2(n) χ2=Z12+Z22+...+Zn2χ2(n)i=1nZi2χ2(n)
  由样本的方差 s 2 s^2 s2与总体 σ 2 \sigma^2 σ2的方差的关系可以得到
( n − 1 ) s 2 σ 2 = ∑ i = 1 n ( X i − X ˉ ) 2 σ 2 = ∑ i = 1 n ( Z i − Z ˉ ) 2 = ∑ i = 1 n Z i − n Z ˉ ∼ χ 2 ( n − 1 ) (2) \frac{(n-1)s^2}{\sigma^2}=\sum_{i=1}^n\frac{(X_i-\bar{X})^2}{\sigma^2}\\ =\sum_{i=1}^n(Z_i-\bar{Z})^2=\sum_{i=1}^nZ_i-n\bar{Z} \sim \chi^2(n-1) \tag{2} σ2(n1)s2=i=1nσ2(XiXˉ)2=i=1n(ZiZˉ)2=i=1nZinZˉχ2(n1)(2)

  (注:此处 σ 2 \sigma^2 σ2未知,不能理解为 σ = ∑ i = 1 n ( X i − X ˉ ) 2 \sigma=\sum_{i=1}^n(X_i-\bar{X})^2 σ=i=1n(XiXˉ)2)

  结合 T T T分布的定义:

  变量 X ∼ N ( 0 , 1 ) X \sim N(0,1) XN(0,1) Y ∼ χ 2 ( n ) Y\sim \chi^2(n) Yχ2(n) X X X Y Y Y相互独立,则
T = X Y N ∼ t ( n ) T=\frac{X}{\sqrt{\frac{Y}{N}}}\sim t(n) T=NY Xt(n)

  结合(1)(2)式子,可以消去 σ \sigma σ,得到样本均值、样本标准差与 T T T分布的关系

( 1 ) ( 2 ) / ( n − 1 ) = n ( X ˉ − μ ) s ∼ t ( n − 1 ) \frac{(1)}{\sqrt{(2)/(n-1)}} =\frac{\sqrt{n}(\bar{X}-\mu)}{s} \sim t(n-1) (2)/(n1) (1)=sn (Xˉμ)t(n1)

  (我们发现该式子与 Z Z Z检验时的 u = n ( x ˉ − μ ) σ ∼ N ( 0 , 1 ) u=\frac{\sqrt{n}(\bar{x}-\mu)}{\sigma} \sim N(0,1) u=σn (xˉμ)N(0,1),此处 μ \mu μ σ \sigma σ已知,是很相似的)

  之后对于计算出来的值进行双侧检验或者单侧检验

  1. 样本均值等于总体均值,用双侧检验
    拒绝域为: ∣ n ( X ˉ − μ ) s ∣ > t α 2 , n − 1 |\frac{\sqrt{n}(\bar{X}-\mu)}{s}|>t_{\frac{\alpha}{2},n-1} sn (Xˉμ)>t2α,n1

  2. 样本均值大于总体均值,用单侧检验:
    拒绝域为: ∣ n ( X ˉ − μ ) s ∣ < t α , n − 1 |\frac{\sqrt{n}(\bar{X}-\mu)}{s}|<t_{\alpha,n-1} sn (Xˉμ)<tα,n1

  3. 样本均值小于总体均值,用单侧检验:
    拒绝域为: ∣ n ( X ˉ − μ ) s ∣ > t α , n − 1 |\frac{\sqrt{n}(\bar{X}-\mu)}{s}|>t_{\alpha,n-1} sn (Xˉμ)>tα,n1

2.2 两个独立样本均值检验

  作用:检验两个独立样本的均值是否相等

  设两个相互独立的总体都服从正态分布, X 1 ∼ N ( μ 1 , σ 1 2 ) , X 2 ∼ N ( μ 2 , σ 2 2 ) X_1 \sim N(\mu_1,\sigma_1^2), X_2 \sim N(\mu_2,\sigma_2^2) X1N(μ1,σ12),X2N(μ2,σ22),假设两个总体方差 σ 1 2 \sigma_1^2 σ12 σ 2 2 \sigma_2^2 σ22都未知。

  同上,可得 X 1 X_1 X1 X 2 X_2 X2的无偏估计为:

  • 均值
    X ˉ 1 = 1 n 1 ∑ i = 1 n 1 X 1 i X ˉ 2 = 1 n 2 ∑ i = 1 n 2 X 2 i \bar{X}_1=\frac{1}{n_1}\sum_{i=1}^{n_1}X_{1i}\\ \bar{X}_2=\frac{1}{n_2}\sum_{i=1}^{n_2}X_{2i} Xˉ1=n11i=1n1X1iXˉ2=n21i=1n2X2i

  • 方差

s 1 2 = 1 n 1 − 1 ∑ i = 1 n 1 ( X i − X 1 ˉ ) 2 s 2 2 = 1 n 2 − 1 ∑ i = 1 n 1 ( X i − X 2 ˉ ) 2 s_1^2=\frac{1}{n_1-1}\sum_{i=1}^{n_1}(X_i-\bar{X_1})^2 \\s_2^2=\frac{1}{n_2-1}\sum_{i=1}^{n_1}(X_i-\bar{X_2})^2 s12=n111i=1n1(XiX1ˉ)2s22=n211i=1n1(XiX2ˉ)2

  根据两个样本的方差是否相等我们分成两种情况:

2.2.1总体方差相等 σ 1 2 \sigma_1^2 σ12= σ 1 2 \sigma_1^2 σ12= σ 2 \sigma^2 σ2

  参考教材《应用多元统计分析》北京大学出版社 高惠璇 编著,可以得到
X ˉ 1 − X ˉ 2 ∼ ( μ 1 − μ 2 , ( 1 n 1 + 1 n 2 ) σ 2 ) \bar{X}_1-\bar{X}_2 \sim (\mu_1-\mu_2,(\frac{1}{n_1}+\frac{1}{n_2})\sigma^2) Xˉ1Xˉ2(μ1μ2,(n11+n21)σ2)
  得
( X ˉ 1 − X ˉ 2 ) − ( μ 1 − μ 2 ) σ 1 n 1 + 1 n 2 ∼ N ( 0 , 1 ) \frac{(\bar{X}_1-\bar{X}_2)-(\mu_1-\mu_2)}{\sigma\sqrt{\frac{1}{n_1}+\frac{1}{n_2}}}\sim N(0,1) σn11+n21 (Xˉ1Xˉ2)(μ1μ2)N(0,1)

  由卡方分布可加性得

( n 1 − 1 ) s 1 2 σ 2 + ( n 2 − 1 ) s 2 2 σ 2 ∼ χ 2 ( n 1 + n 2 − 2 ) \frac{\left(n_{1}-1\right) s_{1}^{2}}{\sigma^{2}}+\frac{\left(n_{2}-1\right) s_{2}^{2}}{\sigma^{2}} \sim \chi^{2}\left(n_{1}+n_{2}-2\right) σ2(n11)s12+σ2(n21)s22χ2(n1+n22)

  由 t t t 分布的构造定义
( X ˉ 1 − X ˉ 2 ) − ( μ 1 − μ 2 ) s p 1 n 1 + 1 n 2 ∼ t ( n 1 + n 2 − 2 ) \frac{\left(\bar{X}_{1}-\bar{X}_{2}\right)-\left(\mu_{1}-\mu_{2}\right)}{s_{p} \sqrt{\frac{1}{n_{1}}+\frac{1}{n_{2}}}} \sim t\left(n_{1}+n_{2}-2\right) spn11+n21 (Xˉ1Xˉ2)(μ1μ2)t(n1+n22)
  其中
s p = ( n 1 − 1 ) s 1 2 + ( n 2 − 1 ) s 2 2 n 1 + n 2 − 2 = ∑ i = 1 n 1 ( X 1 i − X ˉ 1 ) 2 + ∑ i = 1 n 2 ( X 2 i − X ˉ 2 ) 2 n 1 + n 2 − 2 s_{p}=\sqrt{\frac{\left(n_{1}-1\right) s_{1}^{2}+\left(n_{2}-1\right) s_{2}^{2}}{n_{1}+n_{2}-2}}=\sqrt{\frac{\sum_{i=1}^{n_{1}}\left(X_{1 i}-\bar{X}_{1}\right)^{2}+\sum_{i=1}^{n_{2}}\left(X_{2 i}-\bar{X}_{2}\right)^{2}}{n_{1}+n_{2}-2}} sp=n1+n22(n11)s12+(n21)s22 =n1+n22i=1n1(X1iXˉ1)2+i=1n2(X2iXˉ2)2

  之后对于计算出来的值进行双侧检验或者单侧检验:

  1. 检验均值相等,用双侧检验,
    拒绝域为 ∣ X ˉ 1 − X ˉ 2 s p 1 n 1 + 1 n 2 ∣ > t α 2 , n − 1 \left|\frac{\bar{X}_{1}-\bar{X}_{2}}{s_{p} \sqrt{\frac{1}{n_{1}}+\frac{1}{n_{2}}}}\right|>t_{\frac{\alpha}{2}, n-1} spn11+n21 Xˉ1Xˉ2>t2α,n1
  2. 检验 X ˉ 1 > X ˉ 2 {\bar{X}_{1}}>{\bar{X}_{2}} Xˉ1>Xˉ2,用单侧检验,
    拒绝域为 ∣ X ˉ 1 − X ˉ 2 s p 1 n 1 + 1 n 2 ∣ < t α , n − 1 \left|\frac{\bar{X}_{1}-\bar{X}_{2}}{s_{p} \sqrt{\frac{1}{n_{1}}+\frac{1}{n_{2}}}}\right|<t_{\alpha, n-1} spn11+n21 Xˉ1Xˉ2<tα,n1
  3. 检验 X ˉ 1 < X ˉ 2 {\bar{X}_{1}}<{\bar{X}_{2}} Xˉ1<Xˉ2,用单侧检验,
    拒绝域为 ∣ X ˉ 1 − X ˉ 2 s p 1 n 1 + 1 n 2 ∣ > t α , n − 1 \left|\frac{\bar{X}_{1}-\bar{X}_{2}}{s_{p} \sqrt{\frac{1}{n_{1}}+\frac{1}{n_{2}}}}\right|>t_{\alpha, n-1} spn11+n21 Xˉ1Xˉ2>tα,n1

2.2.2 总体方差不相等

  可以参考Welch’s t-test

2.3 配对样本均值检验

  可以参考Paired difference test

三、Python中的T检验的使用

  需要在Python中利用T检验,可以用scipy.stats模块中的ttest_ind()或者ttest_rel():


3.1 单样本T检验(ttest_1samp)

  使用ttest_1samp()函数可以进行单样本T检验


3.2 双独立样本T检验,用ttest_ind,

  这里的零假设多是两个样本具有相同的均值。如果两个样本独立,需要检验样本的均值是否相等,可以用.ttest_ind(), ind即independent。独立样本的特性包含期望和方差,在多元统计分析中,方差是否相同将很大程度上影响我们的计算方式,在Python的ttest_ind参数中也有这个条件,即equal_var,以下是官方给出的变量的解释

equal_var:bool, optional
If True (default), perform a standard independent 2 sample test that assumes equal population variances [1]. If False, perform Welch’s t-test, which does not assume equal population variance [2].
如果为真,假设两个例子具有相同的方差,否则,假设其布局有相同的方差,利用Welch’s t-test检验。

  当两总体方差相等时,即具有方差齐性,可以直接检验,equal_var默认值即为True。

The Levene test tests the null hypothesis that all input samples are from populations with equal variances.
当不确定两总体方差是否相等时,应先利用levene检验,Levene检验检验来自零假设的所有输入样本是否具有相同的方差。

stats.levene(data1,data2)

  如果返回结果的p值远大于0.05,那么我们认为两总体具有方差齐性。如果两总体不具有方差齐性,需要加上参数equal_var并设定为False。


3.3 配对样本T检验,用.ttest_rel()

  这里的零假设多是两个样本具有相同的均值。如果同一受试对象接受了两种不同的处理(可以是自身前后对照,也可以是控制环境变量),这样的样本往往总体方差相等,研究数据符合或者近似正态分布,就可以使用.ttest_rel(), rel即related,官网给出的定义是
scipy.stats.ttest_rel(a, b, axis=0, nan_policy='propagate', alternative='two-sided')

Calculate the t-test on TWO RELATED samples of scores, a and b.


  这两者T检验的结果都是返回一个statistic和一个pvalue,前者代表T统计量,可以通过查阅t分布表,找到对应的自由度(样本数-1)和当前显著性水平 α \alpha α来找到对应的值,如果给出的t-statistics比查到的值大,则拒绝零假设;也可以看pvalue,如过pvalue小于显著性水平,则可以拒绝零假设。


3.4 示例

  假设有一门考试,我们想看看在2016年前递交的和在2016年后递交的成绩是否在统计意义上均值相等,我们首先得到两个对应的时间,命名为early_finishers和late_finishers,并查看他们的平均值:

import numpy as np
import pandas as pd
from scipy import stats
df=pd.read_csv ('datasets/grades.csv')
print("There are {} rows and {} columns".format(df.shape[0], df.shape[1]))
early_finishers=df[pd.to_datetime(df['assignment1_submission']) < '2016']
late_finishers=df[~df.index.isin(early_finishers.index)]

print(early_finishers['assignment1_grade'].mean())
print(late_finishers['assignment1_grade'].mean())


--Outputs:
There are 2315 rows and 13 columns
74.94728457024303
74.0450648477065

  我们看到,早于2016年的平均分是74.95分,2016年及以后的平均分是74.05分,非常相似,接下来我们用.ttest_ind()来查看是否具有统计意义上的均值相等,数据中共有6个作业,分别是assignment1~assignment6:

from scipy.stats import ttest_ind
print(ttest_ind(early_finishers['assignment1_grade']), late_finishers['assignment1_grade'])
print(ttest_ind(early_finishers['assignment2_grade'], late_finishers['assignment2_grade']))
print(ttest_ind(early_finishers['assignment3_grade'], late_finishers['assignment3_grade']))
print(ttest_ind(early_finishers['assignment4_grade'], late_finishers['assignment4_grade']))
print(ttest_ind(early_finishers['assignment5_grade'], late_finishers['assignment5_grade']))
print(ttest_ind(early_finishers['assignment6_grade'], late_finishers['assignment6_grade']))

--Outputs:
Ttest_indResult(statistic=1.322354085372139, pvalue=0.1861810110171455)
Ttest_indResult(statistic=1.2514717608216366, pvalue=0.2108889627004424)
Ttest_indResult(statistic=1.6133726558705392, pvalue=0.10679998102227865)
Ttest_indResult(statistic=0.049671157386456125, pvalue=0.960388729789337)
Ttest_indResult(statistic=-0.05279315545404755, pvalue=0.9579012739746492)
Ttest_indResult(statistic=-0.11609743352612056, pvalue=0.9075854011989656)

  我们发现,在第一份作业中,认为零假设(16年前和16年提交的作业均值是一样的)成立的概率有18.6%以上,如果我们的显著性水平 α \alpha α设置为0.05,那很明显,我们不能拒绝零假设,这就说明零假设不在我们设置的拒绝域内
在第三分作业中,我们发现pvalue的值只有0.11,意思是如果我们接受显著性水平 α \alpha α为0.11,那么这就被认为是具有统计学意义的,换言之,我们会拒绝零假设,认为两份作业均值不一样。


3.5 p值的局限性

  事实上,我们不能过度的依赖p值来解决问题,得到的p值很可能是处于某个巧合使得结果看起来零假设成立,或者不成立。

  我们来看一个例子:我生成两个包含10000个0-1内的随机数的数据矩阵(100 × \times × 100):

df1=pd.DataFrame([np.random.random(100) for x in range(100)])
df2=pd.DataFrame([np.random.random(100) for x in range(100)])

  这两个矩阵在统计意义上是一样的吗?我们设计一个函数用来改变显著性水平,并将不符合统显著性水平的T检验值和pvalue值输出:

def test_columns(alpha=0.1):
    num_diff=0
    for col in df1.columns:        
    	teststat,pval=ttest_ind(df1[col],df2[col])
        if pval<=alpha:
            print("Col {} is statistically significantly different at alpha={}, pval={}".format(col,alpha,pval))
            num_diff=num_diff+1
    print("Total number different was {}, which is {}%".format(num_diff,float(num_diff)/len(df1.columns)*100))
test_columns()

在这里插入图片描述
  发现共有9条,和显著性水平0.1是比较接近的,如果改成0.05呢?

test_columns(0.05)

在这里插入图片描述

  只有五条数据了。为什么会有这样的结果呢?这就是我们在开头说的,显著性水平就像一个阈值,阈值设的高,对错误的包容性(第一类错误)就高了,犯错的概率就大了。


四、对与显著性水平和p值的总结

  总结两句较为重要的话,可以方便进一步加深对显著性水平的理解:

  1. p值反映了我们在零假设下获得观测数据的概率,因此当p值较大时,我们拒绝零假设的证据较少。
  2. α \alpha α值越大时,我们拒绝零假设就显得越随意。


下节预告

总结quiz,开始分析Assignment1-4

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值