利用Python进行t检验

t检验主要用于检验计量资料(连续变量)的两组均值是否存在差异

一、t检验介绍

无论是哪种t检验,都有以下的基本前提条件:

  • 样本数据服从正态分布
  • 样本数据之间互相独立

检验步骤:

  • 提出原假设和备择假设
  • 构造t统计量
  • 计算t统计量
  • 对得到的P值进行分析,P>0.05则接受原假设,否则拒绝原假设(P值是指在原假设成立的条件下,观察到的试验差别是由于机遇所致的概率)

各t检验的应用场景

名称 应用场景
单样本t检验 检验单组样本均数与已知总体均数之间有无差异
独立样本t检验 检验两组不相关样本之间的均数有无差异
配对样本t检验 检验两组相关样本之间的均数有无差异

二、单样本t检验

  • 应用场景

    比较单组样本均值与已知总体均值之间是否存在差异。已知总体均数一般为标准值、理论值和经过大量观察后得到的比较稳定的指标值

  • 原假设与备择假设

    • H0: 样本均数与已知总体均数相等
    • H1: 样本均数与已知总体均数不相等
  • 例子

    1. 以往通过大规模调查已知某地新生儿的平均出生体重为3.30kg。从该地难产儿中随机抽取35名新生儿作为研究样本,平均出生体重为3.42kg,标准差为0.40kg,问该地难产儿出生体重与一般新生儿体重有无差异

      # 已知:总体均值3.30kg,样本数量35,样本均值3.42kg,标准差0.40kg。问:样本均值与总体均值是否有差异?
      # 
      # 提出原假设和备择假设:
      # H0: 样本均值与总体均值相等,无差异
      # H1: 样本均值与总体均值不相等,存在差异
      from scipy.stats import ttest_1samp
      from scipy import stats
      
      # 1. 生成均值为3.42,标准差为0.40的样本
      samp = stats.norm.rvs(loc=3.42, scale=0.40, size=35)
      print(f"samp's type is {type(samp)}, size = {len(samp)}, mean = {samp.mean()}, std = {samp.std()}")
      # out: samp's type is <class 'numpy.ndarray'>, size = 35, mean = 3.3751406109024398, std = 0.3993899466032266
      
      # 2. 第一个参数是样本数据,第二个参数是已知总体均数
      t, p = ttest_1samp(samp, 3.42)
      print(f"t = {t}, p = {p}")
      # t = -1.2655105930679713, p = 0.21429231177437397
      
      # 结论:p = 0.214 > 0.05,表明差异无统计学意义,按 α = 0.05的水准接受H0,
      # 即根据现有的样本信息,尚不能认为样本均值与总体均值存在差异
      

三、独立样本t检验

  • 应用场景

    比较两不相关的样本之间的均数是否存在差异。若两总体的方差相等,即方差齐性,则进行独立样本t检验,否则进行近似t检验

  • 原假设与备择假设

    • H0: 两组样本之间的均数相等
    • H1: 两组样本之间的均数不相等
  • 例子

    1. 某项研究评估低氧环境(模拟高原环境)对运动者心肌血流量的影响,将17名男性志愿者随机分成两组,分别在正常含氧环境(正常组)和低氧环境(低氧组)中测定运动后的心肌血流量。问两种环境中运动者的心肌血流量是否有差异

      # 原假设与备择假设
      # H0: 两种环境中运动者的心肌血流量的总体均数相同
      # H1: 两种环境中运动者的心肌血流量的总体均数不同
      from scipy import stats
      from scipy.stats import ttest_ind
      import numpy as np
      
      normal_group = np.array([3.5, 3.1, 3.1, 2.7, 2.5, 2.3, 2.3, 2.2, 2.2])
      hypoxia_group = np.array([6.4, 5.7, 5.6, 5.3, 5.1, 4.9, 4.7, 3.5])
      
      # 进行levene检验(检验方差齐性)
      _, levene_p = stats.levene(normal_group, hypoxia_group)
      print(f"levene_p = {levene_p}")
      # levene_p = 0.31920582497946387
      
      if levene_p > 0.05: 
          t, p = ttest_ind(normal_group, hypoxia_group, equal_var=true)
      else:
          t, p = ttest_ind(normal_group, hypoxia_group, equal_var=False)
      
      print(f"t = {t}, p = {p}")
      # t = -7.578738236840621, p = 1.6655366374516882e-06
      
      # 结论:p = 1.665e-06 < 0.05, 说明差异具有统计学意义,按 α = 0.05 的水准拒绝H0,
      # 即认为两种环境中运动者的心肌血流量存在差异
      
      

四、 配对样本t检验

  • 应用场景

    检验两相关样本的均数所代表的未知总体均数是否有差异

  • 原假设与备择假设

    • H0: 两组样本之间的均数相等
    • H1: 两组样本之间的均数不相等
  • 例子

    1. 某项研究评估咖啡因对运动者的心肌血流量的影响,先后测定了12名男性志愿者饮用咖啡前后运动状态下的心肌血流量。问饮用前后运动者的心肌血流量有无差异

      # 原假设与备择假设
      # H0: 饮用前后运动者的心肌血流量无差异
      # H1: 饮用前后运动者的心肌血流量有差异
      from scipy.stats import ttest_rel
      import numpy as np
      
      before = np.array([4.8, 5.1, 6.4, 5.7, 5.6, 5.3, 5.1, 4.9, 4.7, 3.5, 5.2, 5.3])
      after = np.array([4.8, 4.9, 4.5, 5.4, 4.7, 3.8, 4.1, 3.2, 3.0, 3.2, 5.3, 5.1])
      
      t, p = ttest_rel(before, after)
      print(f"t = {t}, p = {p}")
      # t = 3.7398870259524446, p = 0.0032668229904865296
      
      # 结论:p = 0.003< 0.05, 说明差异具有统计学意义,按 α = 0.05 的水准拒绝H0,
      # 即认为饮用前后运动者的心肌血流量有差异
      
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容