独立样本t检验(Independent-Samples t-test)——Python软件实现

发布于 2022年4月20日 星期三 21:08:57 浏览:4860
原创不易,转载请注明来源,感谢!

在前面文章中介绍了独立样本t检验(Independent Samples t-test)的假设检验理论,本篇文章将实例演示在python软件中实现独立样本t检验的操作步骤。

关键词:Python; t检验; 独立样本t检验; 成组t检验; 两样本均数比较; 近似t检验; 韦尔奇t检验; Welch近似t检验

一、案例介绍

某医生研究某生化指标(X)对病毒性肝炎诊断的临床意义,测得20名正常人和19名病毒性肝炎患者某生化指标(X)含量(μg/dl),问病毒性肝炎患者和正常人生化指标(X)含量是否存在差异?

二、问题分析

研究者拟分析两组数据均值是否有差异,即判断正常人和病毒性肝炎患者生化指标(X)含量是否有差异。针对这种情况,可以使用独立样本t检验。但需要满足以下6个条件:

条件1:观察变量为连续变量。本研究中的生化指标含量为连续变量,该条件满足。

条件2: 观测值相互独立。本研究中各研究对象的信息都是独立的,不存在互相干扰,该条件满足。

条件3:观察变量可分为2组。本研究中分为正常人和病毒性肝炎患者,该条件满足。

条件4:观察变量不存在显著的异常值,该条件需要通过软件分析后判断。

条件5:各组观测值为正态或近似正态分布,该条件需要通过软件分析后判断。

条件6:两组观测值的方差齐,该条件需要通过软件分析后判断。

三、软件操作及结果解读

(一) 导入数据

import pandas as pd #导入pandas包
import numpy as np #导入numpy包
df = pd.read_csv(r'独立样本t检验.csv',index_col=0) #导入数据
df.info() #查看数据结构图-图1
df2 = df.rename(columns={'X':'生化指标' ,'group':'组别'}) #对变量重新赋值 
df2.loc[df['group']=='Normal','组别']='正常组'
df2.loc[df['group']=='Hepatitis','组别']='乙肝组'
df2
图1
图2

在数据栏目中可以查看全部数据情况,数据集中共有3个变量和39个观察数据,3个变量分别代表被调查者的编号(ID)、组别(group)及其对应的生化指标(X)。

() 适用条件判断

1. 条件4判断(异常值检测)

(1)软件操作

#查看最大值最小值#

round(df2.groupby("组别").describe(),3)  #查看基本统计量-图3
图3

#绘制箱线图#

import matplotlib.pyplot as plt
plt.figure(figsize = (5,3),dpi = 120,facecolor = "white",edgecolor = "red") #建立画布
plt.rcParams['font.family'] = 'SimSun'
plt.boxplot([df2.loc[df2.loc[:,'组别']=='正常组','生化指标'],
                     df2.loc[df2.loc[:,'组别']=='乙肝组','生化指标']],
                    labels=["正常组","乙肝组"])
plt.savefig("boxplot.tif",dpi = 300,bbox_inches = "tight")
plt.show() #展示箱线图-图4
图4
(2) 结果解读

图3运行结果,列出了观察变量的“mean (平均值)”、“std (标准差)”、“min (最小值)”、“25% (下四分位)”、“50% (中位数)”、“75% (上四分位)”和“max (最大值)”,依据专业可判断人体生化指标含量均可能存在215.4μg/dl和292.7μg/dl的情况;此外,图4中的箱线图也未提示任何异常值。综上,本案例未发现需要处理的异常值,满足条件4。

2. 条件5判断(正态性检验)

(1) 软件操作

#绘制QQ图#

import statsmodels.api as sm #导入statsmodels.api包
import pylab
sm.qqplot(df2.loc[df2.loc[:,'组别']=='正常组','生化指标'], line='s') #选取第一组数据
pylab.show() #显示第一组QQ图-图5
sm.qqplot(df2.loc[df2.loc[:,'组别']=='乙肝组','生化指标'], line='s') #选取第二组数据
pylab.show() #显示第二组QQ图-图6
图5
图6

#正态性检验#

from scipy import stats #导入scipy包
shapiro_test1 = stats.shapiro(df2.loc[df2.loc[:,'组别']=='正常组','生化指标']) 
print(shapiro_test1)
shapiro_test2 = stats.shapiro(df2.loc[df2.loc[:,'组别']=='乙肝组','生化指标'])
print(shapiro_test2)
图7
(2) 结果解读

图5和图6 Q-Q图上两组散点基本围绕对角线分布,提示两组数据均呈正态分布;图7的“Shapiro_ test (S-W正态性检验)”表格结果显示P≈0.8129和0.1918,均>0.1,也提示两组数据均服从正态分布。综上,本案例满足条件5。

3. 条件6判断(方差齐性检验)

(1) 软件操作

#levene法方差齐性检验#

group0 = df2.loc[df2.loc[:,'组别']=='正常组']['生化指标'] #选取第一组数据
group1 = df2.loc[df2.loc[:,'组别']=='乙肝组']['生化指标'] #选取第二组数据
leveneTestRes = stats.levene(group0, group1, center='mean') #levene法齐性检验
print(leveneTestRes) #显示检验结果
图8
(2) 结果解读

图8 “LeveneTestRes (Levene检验)”结果显示,F=3.8828,P≈0.0563<0.1,提示两组数据的方差不齐,不满足条件6。

(三) 统计描述及推断

1. 软件操作

#校正t检验#

from scipy import stats
tind = stats.ttest_ind(a = group0,b = group1,equal_var=False)
print(tind.statistic)
print(tind.pvalue)  #校正t检验-图9
图9

#计算均值差#

aa = np.mean(df2.loc[df2.loc[:,'组别']=='正常组','生化指标'])  
print('正常组均值:',aa)
bb = np.mean(df2.loc[df2.loc[:,'组别']=='乙肝组','生化指标'])  
print('乙肝组均值:',bb) 
junzhicha = aa - bb  
print('均值差:',junzhicha)
图10

#计算置信区间#

#标准误计算#

nx = len(df2.loc[df2.loc[:,'组别']=='正常组',:])
ny = len(df2.loc[df2.loc[:,'组别']=='乙肝组',:])
stdx = df2.loc[df2.loc[:,'组别']=='正常组','生化指标'].std()
stdy = df2.loc[df2.loc[:,'组别']=='乙肝组','生化指标'].std()
stderrx = stdx/(np.sqrt(nx))
stderry = stdy/(np.sqrt(ny))
stderr = np.sqrt(stderrx**2 + stderry**2)

#自由度计算#

df = stderr**4/((stderrx**4/(nx-1)) + (stderry**4/(ny-1)))
# 计算给定概率t分布百分数
cint = stats.t(df).ppf(1 - (0.05/2))

#计算置信区间#

np.array([tind.statistic-cint,tind.statistic+cint])*stderr
图11

2. 结果解读

(1) 统计描述

图3运行结果提供了研究案例的“group (组别)”、“count (样本量)”、“mean (均数)”、“median (中位数)”和“std(标准差)”。可知,正常人群的生化指标含量为271.300±9.168μg/dl,肝炎患者的生化指标含量为236.216±13.695μg/dl。

(2) 统计学推断

由于本案例满足正态性要求,但不满足方差齐性要求,所以采用校正t检验(Welch Two Sample t-test)分析结果。由图9、图10、图11可知肝炎患者的生化指标含量平均值比正常人群低35.084μg/dl,95%CI为27.435~42.733;差异有统计学意义[statistic (t')=9.3518,P<0.001]。

四、结论

本研究采用独立样本t检验判断病毒性肝炎患者和正常人生化指标含量是否存在差异。通过专业知识判断,两组数据不存在需要处理的异常值;通过绘制Q-Q图和Shapiro-Wilk检验,提示两组数据服从正态分布;通过Levene检验,提示两组数据间方差不齐,采用Welch’s t检验对数据进行分析。

结果显示,正常人群和肝炎患者的生化指标含量分别为271.300±9.168μg/dl和236.216±13.695μg/dl;肝炎患者的生化指标含量平均值比正常人群低35.084μg/dl (95%CI:27.435~42.733),差异有统计学意义[statistic (t')=9.3518,P <0.001]。因此,可以认为该生化指标含量对病毒性肝炎的临床诊断具有价值。

五、分析小技巧

(一) 正态性检验

  • 在进行独立样本t检验时,正态性检验应分组进行,而不是对全部数据进行一次正态性检验。
  • t检验对数据的非正态性有一定的耐受能力,如果资料只是稍微偏态,结果仍然稳健。

(二) 方差齐性检验

  • 独立样本t检验时对两组数据之间的方差齐性要求较为严格,与数据违反正态性相比,方差不齐对结论的影响较大。
  • “Homogeneity of Variances Test (Levene’s) (Levene’s方差齐性检验)”的结果易受到样本量的影响,并不是很稳定。当样本量较大时,倾向于得出P值低于检验水准的结论,尽管可能组别之间的方差差异并不大;反之,当样本量较小时,尽管组别之间的方差差异可能较大,但倾向于得出P值高于检验水准的结论。
  • 如果数据对条件1—条件5都满足,仅不满足方差齐性,此时可使用校正t检验(Welch’s t检验)。但如果数据的方差相差太大,建议使用非参数检验(Mann-Whitney U检验)。如果数据正态性和方差齐性都不满足,同样建议使用非参数检验(Mann-Whitney U检验)。
  • 如果两组数据之间方差的差异无统计学意义,此时student’s t检验比Welch’s t检验具有更高的统计学检验效能(发生第II类错误的概率更低),如果两组数据方差差异较大,此时Welch’s t检验发生第II类错误的概率更低,结果更为可信。

因此,选择分析方法时应综合考虑具体样本量和方差。

End
文章目录 沉浸式阅读