关键词: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
在数据栏目中可以查看全部数据情况,数据集中共有3个变量和39个观察数据,3个变量分别代表被调查者的编号(ID)、组别(group)及其对应的生化指标(X)。
(二) 适用条件判断
1. 条件4判断(异常值检测)
(1)软件操作
#查看最大值最小值#
round(df2.groupby("组别").describe(),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
(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
#正态性检验#
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)
(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) #显示检验结果
(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
#计算均值差#
aa = np.mean(df2.loc[df2.loc[:,'组别']=='正常组','生化指标']) print('正常组均值:',aa) bb = np.mean(df2.loc[df2.loc[:,'组别']=='乙肝组','生化指标']) print('乙肝组均值:',bb) junzhicha = aa - bb print('均值差:',junzhicha)
#计算置信区间#
#标准误计算#
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
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类错误的概率更低,结果更为可信。
因此,选择分析方法时应综合考虑具体样本量和方差。