统计中的假设检验介绍-t检验-A/B测试及python示例

写在前面:

  • 假设检验,是根据一定的假设条件,由样本推断总体的一种方法。

  • 标准差和标准误的区别:
    1)标准差: 一次抽样样本的标准差,反应这些样本的离散程度,用于描述统计;
    2)标准误 :多次抽样中先计算每一次抽样样本的平均值,然后计算这些均值的标准差,反应的是这些均值之间的离散程度,用于推论统计。

  • 我以前常分不清楚如何定义原假设和备择假设,后来用一个例子才记得比较深刻:就像法庭审判犯人,会首先假设他是一个好人(备择假设),然后提交证据证明他是有罪的(原假设)。

    所以假设检验选择原假设和备择假设的原则如下:
    1)原假设:想要证明其不好的方向(证明有罪);
    2)备择假设:是想要证明其好的方向(若原假设发生概率比较低,也就是没有充分的理由证明有罪,那就是无罪的);

以下大部分内容转载:https://zhuanlan.zhihu.com/p/37265478
在此基础上,根据自己的理解思路在结构上略有调整,记录下来以供学习,感谢原作者。

一、假设检验的一般步骤

1、问题是什么

①根据实际问题,确定出零假设H0和备择假设H1。H0和H1互为相反,非此即彼,不可能同时满足。

②确定检验类型。检验类型包括:单样本t检验、相关配对t检验、独立双样本t检验。

③均值的抽样分布。

  • 当小样本时,即样本容量n<30,假如总体近似服从正态分布,则均值的抽样分布为t分布;

  • 当大样本时,即样本容量n>=30,无论总体为何分布,均值的抽样分布均为正态分布。(中心极限定理)

④确定检验方向。看备择假设H1的描述:

  • 如果H1中包含小于号"<",则为左尾;

  • 如果H1中包含大于号">",则为右尾;

  • 如果H1中包含不等号"≠",则为双尾。

检验类型及检验方向的判定,总结为下表:
检验类型和检验方向

2、证据是什么

有一种说法:假设检验就是个p(不是拍马屁的屁哦)

没错,假设检验最核心的步骤就是计算p值,什么是p值呢?

p值就是:在零假设H0成立的条件下,出现样本均值的概率是多少。

t检验的p值计算过程:

方法一:根据样本均值和标准误,结合抽样分布类型,先计算出检验统计量和自由度,手动查表计算p值;

方法二:使用Python的科学计算包scipy自动计算检验统计量和p值。

3、判断标准是什么

显著性水平α,由人为根据实际情况主观指定,常用的显著性水平α=0.05。

4、得出结论

根据检验是单尾还是双尾,用最终的p值与α值做比较:

  • 当p<=α时,拒绝零假设H0,接受备择假设H1;

  • 当p>α时,没有充分的证据拒绝零假设(倾向于接受H0,但需要进一步证据)。

二、假设检验报告的一般格式简介

1、描述统计分析

对样本数据进行描述统计,报告平均值和标准差。

2、推论统计分析

  • 报告假设检验结果:采用APA格式,需要报告检验类型、抽样分布类型、检验方向、检验统计量、p值、显著性水平α;

  • 报告置信区间:根据APA格式,需要报告置信区间的类型、置信水平、区间上下限;

  • 报告效应量:效应量代表实际效果是否显著,包含两种度量方法:
    ①差异度量Cohen’s d = (样本均值1-样本均值2)/标准差;
    ②相关度r^2 = t2/(t2+df),df是自由度

示例:
在这里插入图片描述

三、单样本t检验

以一个示例来了解:汽车引擎排放标准

汽车引擎是否满足排放标准?
“Super Engine”是一家专门生产汽车引擎的公司,根据政府发布的新排放要求,引擎排放平均值要低于20ppm。公司制造出10台引擎供测试使用,每一台的排放水平如下:
15.6 16.2 22.5 20.5 16.4 19.4 16.6 17.9 12.7 13.9
问题:公司生产的引擎是否符合政府规定呢?

准备基础数据:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
from scipy import stats #科学计算包

#样本数据集
sample=pd.Series([15.6,16.2,22.5,20.5,16.4,19.4,16.6,17.9,12.7,13.9])

1、描述统计分析

#描述统计分析
sample_mean=sample.mean()#样本均值
sample_std=sample.std()#样本标准差
print('样本均值:%.2f' %sample_mean, '单位:ppm')
print('样本标准差:%.2f' %sample_std, '单位:ppm')

输出:
在这里插入图片描述
2、推论统计分析

A、假设检验:

1)问题是什么?
在这里插入图片描述

小样本的抽样分布是否满足t分布使用条件(总体近似正态)?因总体未知,此处只能通过样本数据的可视化分布,大致推断总体是否服从单峰的正态分布。

'''
唯一需要确定的问题:总体分布是未知的,要通过样本数据估计总体的分布,采用可视化方法粗略查看;
通过sns.distplot方法绘制直方图和核密度(kde)曲线图
'''
sns.set(font='SimHei')  # 解决Seaborn中文显示问题
sns.distplot(sample)
plt.title('样本集分布')

在这里插入图片描述
通过观察样本集分布,可以看出总体近似服从正态分布。

总结:定义了零假设和备择假设,确定了检验类型为单样本t检验中的左尾检验,自由度df=9。

2)证据是什么?

证据就是计算p值(零假设成立的前提下,出现样本均值的概率。

#计算P值
'''
stats.ttest_1samp(),第一个参数:样本数据;第二个参数:总体均值
计算结果:第一个值表示t值,第二个值表示双尾的p值
'''
pop_mean=20
t, p_2tailed=stats.ttest_1samp(sample, pop_mean)

print('t值:t=%.2f,\n双尾p值:p_2tailed=%f' %(t, p_2tailed))

输出:
在这里插入图片描述
由于该例属于单尾检验,所以最终的p值需要双尾p值除以2:

#因为此处为单位(左尾)检验,最终的p值为双尾p值的一半
p_1tail=p_2tailed/2
print('左尾检验的p值是:%f' %p_1tail)

输出:
在这里插入图片描述
3)判断标准是什么?

常用的显著性水平α=5%

alpha=0.05

4)结论是什么?

单尾p值与显著性水平α作比较:当p<=α时,拒绝零假设H0,接受备择假设H1;当p>α时,没有充分的证据拒绝零假设(倾向于接受H0,但需要进一步证据)。

'''
左尾判断条件:t<0,且单位p值<alpha
右尾判断条件:t>0, 且单尾p值<alpha
'''
if(t<0 and p_1tail<alpha):
    print('统计显著,拒绝零假设,接受备择假设。即:汽车引擎排放<20ppm,满足标准。')
else:
    print('没有充分的证据证明汽车引擎满足排放标准。')

输出:
在这里插入图片描述
B、置信区间:

置信区间在不同的置信水平下有不同的“宽度”,此处置信水平为95%。

#置信区间,在不同的置信水平下有不同的“宽度”,取置信水平为95%
'''
第一个参数代表置信水平:1-0.05=0.95
第二个参数代表自由度:df=n-1=9
第三个参数代表样本均值sample_mean
第四个参数代表样本标准误:se
'''
confidence=1-alpha
df=9
loc=sample_mean
scale=stats.sem(sample)
CI=stats.t.interval(confidence,df,loc,scale)
print('95%置信区间CI=',CI)

输出:
在这里插入图片描述
C、效应量:

当假设检验具有统计显著的结论时,需要进一步研究是否具有实际意义,即实验结果是否“效果显著”?衡量效果显著用Cohen’s d指标,它表示:样本均值1与样本均值2,差异有几个标准差。差异大小的衡量标准如下:
在这里插入图片描述

#效应量:当假设检验具有统计显著的结论时,需要进一步研究是否具有实际有意义,即实验结果是否“效果显著”,衡量效果显著用Cohen's d指标。
#它表示:样本均值1和样本均值2差距了几个标准差,差距的大小衡量标准是:0.2以内为小;0.5以内为中;0.8以内为大。
Cohen=(sample_mean-20)/sample_std
print('Cohen\'s值=',Cohen,',效果显著。')

输出:
在这里插入图片描述
3、关于“汽车引擎是否满足排放标准”的整体数据分析报告如下:

(说明:以下截图中的数值跟文中代码运行出来的结果略不同,这是因为我用的数据略有不同,此处只要了解下面的报告形式中包含哪些内容即可)
在这里插入图片描述

四、相关配对t检验

同样的,以一个示例来了解:斯特鲁普效应验证

验证斯特鲁普效应是否存在?
斯特鲁普效应是著名的心理学现象,展示了人们对事物的认知过程是一个自动化的历程。当有一个新的刺激出现时,如果它的特征和原先的刺激相似或符合一致,便会加速人们的认知;反之,若新的刺激特征与原先的刺激不相同,则会干扰人们的认知,使人们的反映时间变长。
通过网上的stroop实验做测试人的反应时间斯特鲁普效应,每名参与者得到两组有颜色的文字,第一组数据是字体内容和字体颜色一致,第二组数据是字体内容和字体颜色不一致。每名参与者对每组文字说出文字的颜色,并分别统计完成每组的时间。
问题:验证斯特鲁普效应的存在(不一致组反应时间均值比一致组反应时间均值长)

准备基础数据:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
from scipy import stats #科学计算包

#导入数据
data=pd.read_csv('./stroop.csv',encoding='GBK')

#再拼接补充两次实验数据上去
mytest=pd.DataFrame({'Congruent':[20.158,17.189,10.279],'Incongruent':[22.279,19.299,11.192]})
data=data.append(mytest,ignore_index=True)

data.head()

在这里插入图片描述

1、描述统计分析

#第一组均值和标准差:
con_mean=data['Congruent'].mean()
con_std=data['Congruent'].std()

#第二组均值和标准差:
incon_mean=data['Incongruent'].mean()
incon_std=data['Incongruent'].std()

print('第一组的均值是:%.2f, 标准差是: %.2f' %(con_mean, con_std))
print('第二组的均值是:%.2f, 标准差是: %.2f' %(incon_mean, incon_std))

输出:
在这里插入图片描述
2、推论统计分析

A、假设检验:

1)问题是什么?
在这里插入图片描述
相关配对检验关心的是两组成对数据的差值,因此需先构造出差值数据:

#相关配对检验的套路,先计算差值列
data['difference']=data['Congruent']-data['Incongruent']
data.head()

在这里插入图片描述
假设检验中的t检验,需要总体满足近似正态分布的条件,但总体未知,可以从样本数据的核密度图粗略估计:

'''
唯一需要确定的问题:
总体分布位置,通过样本数据估计总体分布
采用可视化方法粗略查看
通过sns.distplot方法绘制直方图和核密度(kde)曲线图
'''
sns.set(font='SimHei')
plt.rcParams['axes.unicode_minus']=False 

sns.distplot(data['difference'])
plt.title('配对差值数据分布')

在这里插入图片描述

通过观察样本集配对差值数据的分布,可以看出总体近似服从正态分布。

总结:定义了零假设和备择假设,确定了检验类型为相关配对t检验中的左尾检验,自由度df=n-1=9。

2)证据是什么?

证据就是计算p值(零假设成立的前提下,出现样本均值的概率)。

#计算检验统计量和p值
#使用scipy包自动计算,结果输出2个值:t和双尾的p值
t, p_2tailed= stats.ttest_rel(data['Congruent'], data['Incongruent'])
print('t值:t=%.2f, 双尾p值:p_2tailed=%.5f' %(t, p_2tailed))

输出:
在这里插入图片描述
由于该例属于单尾检验,所以最终的p值需要双尾p值除以2:

#此处为单尾(左尾)检验,最终的p值为双尾p值的一半
p_1tail=p_2tailed/2
print('左尾检验的p值:p_1tail=',p_1tail)

输出:
在这里插入图片描述
3)判断标准是什么?

常用的显著性水平α=5%

alpha=0.05

4)结论是什么?

单尾p值与显著性水平α作比较:当p<=α时,拒绝零假设H0,接受备择假设H1;当p>α时,没有充分的证据拒绝零假设(倾向于接受H0,但需要进一步证据)。

'''
左尾判断条件:t<0,且单位p值<alpha
右尾判断条件:t>0, 且单尾p值<alpha
'''
alpha=0.05
if(t<0 and p_1tail<alpha):
    print('统计显著,拒绝零假设,接受备择假设。即:u1<u2,斯特鲁普效应存在。')
else:
    print('没有充分的证据证明汽车引擎满足排放标准。')

输出:
在这里插入图片描述
B、置信区间:

置信区间在不同的置信水平下有不同的“宽度”,此处置信水平为95%。

'''
第一个参数代表置信水平:1-0.05=0.95
第二个参数代表自由度:df=n-1=9
第三个参数代表样本均值sample_mean
第四个参数代表样本标准误:se
'''
confidence=1-alpha
df=data.shape[0]-1
sample_mean=data['difference'].mean()
se=stats.sem(data['difference'])
CI=stats.t.interval(confidence,df,sample_mean,se)
print('95%置信区间CI=',CI)

输出:
在这里插入图片描述
C、效应量:

当假设检验具有统计显著的结论时,需要进一步研究是否具有实际意义,即实验结果是否“效果显著”?衡量效果显著用Cohen’s d指标,它表示:样本均值距总体均值几个标准差,代表差异是否显著:

#用Cohen's d指标:样本均值距离总体均值几个标准差,代表差异是否显著
#总体均值
pop_mean=0
#样本标准差
sample_std=data['difference'].std()
d=(sample_mean-pop_mean)/sample_std
print('效应量 d=%.2f' %d)

输出:
在这里插入图片描述
效果显著。

3、关于“验证斯特鲁普效应存在性”的整体数据分析报告如下:

(说明:以下截图中的数值跟文中代码运行出来的结果略不同,这是因为我用的数据略有不同,此处只要了解下面的报告形式中包含哪些内容即可)
在这里插入图片描述

五、独立双样本t检验(A/B测试)

同样的,以一个示例来了解:

验证两款键盘布局对用户体验性是否有差别?
两款键盘布局不一样的手机应用(A版本,B版本),你作为公司的产品经理,想在正式发布产品之前,知道哪个键盘布局对用户体验更好?
随机抽取实验者,将实验者分成2组,每组25人,A组使用键盘布局A,B组使用键盘布局B。让他们在30秒内打出标准的20个单词文字消息,然后记录打错字的数量。
问题:两种版本布局是否用户体验显著不同,哪种更好?
在这里插入图片描述
准备基础数据:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
from scipy import stats #科学计算包

#导入excel数据
data=pd.read_excel('./键盘AB测试.xlsx','Sheet1')
#data.dtypes
data.head()

在这里插入图片描述
1、描述统计分析

#A组平均值和标准差
a_mean=data['A'].mean()
a_std=data['A'].std()

#B组平均值和标注差
b_mean=data['B'].mean()
b_std=data['B'].std()

print('A组受试者使用A版本打错字个数的平均值=%.2f个,标准差=%.2f个。' %(a_mean, a_std))
print('B组受试者使用B版本打错字个数的平均值=%.2f个,标准差=%.2f个。' %(b_mean, b_std))

输出:
在这里插入图片描述
2、推论统计分析

A、假设检验:

1)问题是什么?
在这里插入图片描述
假设检验中的t检验,需要总体满足近似正态分布的条件,但总体未知,可以从样本数据的核密度图粗略估计:

'''
唯一需要确定的问题:
总体分布未知,通过样本数据估计总体分布
采用可视化方法粗略查看
通过sns.distplot()查看直方图和和密度曲线
'''
sns.set(font='SimHei')
#plt.rcParams['axes.unicode_minus']=False 

fig=plt.figure(figsize=(10,4))#画布大小

ax1=fig.add_subplot(121)#图标位置1
ax2=fig.add_subplot(122)#图表位置2

sns.distplot(data['A'], ax=ax1)
sns.distplot(data['B'], ax=ax2)
ax1.set_title('A组数据分布')
ax2.set_title('B组数据分布')

在这里插入图片描述
由两样本数据集的分布情况可粗略估计,其所在的总体也近似服从正态分布,故抽样分布满足t分布使用条件。

在做独立双样本t检验之前,需要先做方差分析(F检验),判断两总体方差是否显著不同,我们称该操作为:方差齐性检验。方差相同情况为“等方差”,方差不同情况为“异方差”。两种情况下,计算的检验统计量t值和自由度df会存在差异。

'''
F检验也是假设检验,一般步骤相同,此处省略介绍:
H0:两总体方差相同,即var1=var2
H1:两总体方差不同,即var1≠var2
显著性水平alpha=0.05
'''
#样本方差
a_var=data['A'].var()
b_var=data['B'].var()

#样本大小
n1=data['A'].shape[0]
n2=data['B'].shape[0]

#两样本的自由度
df_a=n1-1
df_b=n2-1

#计算F值,保证分母>分子
if a_var>b_var:
    F=a_var/b_var
else:
    F=b_var/a_var

print('A组方差:%f, B组方差:%f' %(a_var, b_var))
print('F值为%.2f' %F)

输出:
在这里插入图片描述

'''
计算F检验的p值,函数参数(F值,分母自由度,分子自由度)
'''
p_value=stats.f.sf(F, df_b, df_a)
print('F检验的p值为:p_value=%f' %p_value)

输出:
在这里插入图片描述

'''
判断统计显著性
p值和alpha值比较
'''
alpha=0.05
if p_value<alpha:
    print('统计显著,两总体方差显著不同:a_var≠b_var')
else:
    print('统计显著,两总体方差显著不同:a_var=b_var')

在这里插入图片描述
补充:单纯的方差齐性检验也可通过下面3种方法 得到结果:

'''
下面是集中更加简便的F检验方法,还可以处理样本容量不同的情况:
'''
# 1、bartlett检验,单纯检验方差齐性
stats.bartlett(data['A'], data['B'])
#Out[171]:BartlettResult(statistic=1.4790938519123384, pvalue=0.22391635140432728)

# 2、非参数方法,检验方差齐性
stats.fligner(data['A'], data['B'])
#Out[172]:FlignerResult(statistic=2.3360209546187556, pvalue=0.12641208637572499)

# 3、levene检验,比bartlett方法更加鲁棒
stats.levene(data['A'], data['B'])
#Out[173]:LeveneResult(statistic=2.417040358744396, pvalue=0.1342905006532883)

# 4、或者通过可视化的方法粗略估计:
'''
此处还可通过可视化的方法,粗略判断方差齐性
查看箱线图盒子的宽度
此处盒子宽度近似相等
'''
sns.boxplot(data=data)
plt.title('A、B两组样本数据箱线图')

在这里插入图片描述

无论以上哪种方法做方差齐性检验,均得到p值大于显著性水平α的结果,证明两总体等方差a_var = b_var。

总结:定义了零假设和备择假设,确定了检验类型为独立双样本t检验,双尾检验,经方差齐性检验,两总体方差相同,自由度df=n1+n2-2=22

2)证据是什么?

计算检验统计量和p值.

'''
独立双样本t检验stats.ttest_ind()无法返回自由度数值
这里用一个进化版的统计报,可以返回更多有用信息
'''
import statsmodels.stats.weightstats as st
'''
函数参数usevar=‘unequal’异方差;usevar='pooled'等方差
返回值:
第一个值:假设检验的t值
第二个值:双尾的p值
第三个值:整体自由度
'''
t,p_2tailed,df=st.ttest_ind(data['A'], data['B'],usevar='pooled')

print('检验统计量t值=%f,双尾p值=%f,整体自由度=%.1f'%(t, p_2tailed, df))

输出:
在这里插入图片描述
3)判断标准是什么?

常用的显著性水平α=5%

alpha=0.05

4)结论是什么?

'''
双尾判断条件:p<alpha,统计显著,拒绝零假设,接受备择假设
'''
alpha=0.05
if p_2tailed<alpha :
    print('统计显著,拒绝零假设,接受备择假设。即:A版本和B版本打错字的均值不相同,两种布局有显著差别。')
else:
    print('统计不限制,不能拒绝零假设,即:A版本和B版本打错字的均值相同,两种布局无显著差别。')

输出:
在这里插入图片描述
B、置信区间:

置信区间在不同的置信水平下有不同的“宽度”,此处置信水平为95%。

#置信区间
confidence=1-alpha
df=data['A'].shape[0]+data['B'].shape[0]-2
sample_mean=a_mean-b_mean
se=np.sqrt(a_std**2/np.sqrt(n1) + b_std**2/np.sqrt(n2))
CI=stats.t.interval(confidence, df, sample_mean, se)
print('置信水平95%CI=',CI)

输出:
在这里插入图片描述
通过读取置信区间的数值,区间边界值均为负值,证明A版本打错字数量均值显著小于B版本,即A布局版本更符合用户体验。

C、效应量:

#效应量
#Cohen's d指标:均值1距均值2几个标准差,代表差异是否显著
'''
d=(样本均值1-样本均值2)/(样本标准差)
由于是独立双样本t检验,样本标准差需要计算出混合标准差:
sp=(((n1-1)*a_std^2+(n2-1)*b_std^2)/(n1+n2-2))^0.5
'''
#混合标准差
sp=np.sqrt(((n1-1)*np.square(a_std)+(n2-1)*np.square(b_std))/(n1+n2-2))

#计算Chohen's d
d=(a_mean-b_mean)/sp

print('效应量:d=%.2f' %d)

输出:
在这里插入图片描述
效果显著。

独立双样本的混合标准差sp的计算公式可参考统计书籍《商务与经济统计第12版》275页最下面;样本均值=样本均值1-样本均值2。

3、关于“两款键盘布局对用户体验性是否有差别”的整体数据分析报告如下:
在这里插入图片描述

六、总结

本文介绍了统计学的重头戏:假设检验的实现方法,重点介绍t检验

1、推论统计分析报告:描述统计+推论统计
2、推论统计分析内容:假设检验+置信区间+效应量
3、假设检验步骤:①问题是什么;②证据是什么;③判断标准是什么;④得出结论
4、确定问题首先根据实际情况,定义互为相反的零假设和备择假设
5、根据数据情况,判定属于哪种检验类型,见下图
检验类型的样本数据集特点
6、判断均值的抽样分布为哪种分布(大样本n>30正态分布;小样本n<30且总体正态,t分布)
7、确定检验方向:左尾?右尾?双尾?
8、计算零假设成立时,出现样本均值的概率:p值
9、p值与显著性水平 α作比较,得出统计显著性结论
10、计算置信度95%的置信区间
11、通过效应量判断效果显著性(有实际意义)
12、来自两个独立总体的样本,在t检验之前,先进行方差齐性检验。

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页