其他分享
首页 > 其他分享> > A/B测试--假设检验实例

A/B测试--假设检验实例

作者:互联网

本文目录

一、假设检验的步骤

1.提出问题?

  1. 根据实际问题,建立零假设、备选假设分别为H0和H1。H0和H1互为相反,不可能同时满足。
  2. 检验类型:单样本检验、相关配对检验、独立双样本检验
  3. 抽样分布类型(正态分布、t分布、其他分布)
    当样本容量n>=30,无论总体为何分布,均值的抽样分布均为正态分布,即中心极限定理。
    当样本容量n<30,总体近似服从正态分布,则均值的抽样分布为t分布。
    4)检验方向
    单尾检验:检测的判断标准在抽样分布的左侧或右侧
    单尾检验:左尾:备选假设H1中包含"<",则为左尾;
    单尾检验:右尾 :备选假设H1中包含">",则为右尾;
    双尾检验:备选假设H1中包含"≠",则为双尾。

2.找到证据

假设检验最核心的步骤就是计算 p 值,p值是假定零假设成立的前提下,得到样本平均值的概率。

当样本数据的描述统计信息,先计算出SE(标准误差)SE=S(样本标准差)/sqrt(n)
然后计算t检验 t=(样本平均值-总体平均值)/标准误差
最后根据t值,查找t表格得到p值。
使用也可以用Python的科学计算包scipy自动计算。

3.判定标准

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

4.得出结论

用最终的p值与α值做比较:当p<=α时,拒绝零假设,接受备选假设;
当p>α时,接受零假设,拒绝备选假设。

5.置信区间

置信区间用来估计总体的均值范围。在不同的置信水平下有不同的“宽度”,一般查询置信水平为95%,自由度是n-1对应的t值:

1)置信水平对应的t值(t_ci)

查t表格可以得到,95%的置信水平,自由度是n-1对应的t值

2)计算上下限

置信区间上限a=样本平均值 - t_ci ×标准误差
置信区间下限b=样本平均值 - t_ci ×标准误差

6.效应量

效应量是指处理效应的大小,例如药物A比药物B效果显著。度量效应量有很多种,但大多数都属于两大主要类别。

1)第一种叫做差异度量

例如在对比平均值时,衡量效应大小的常见标准之一是Cohen’s d
Cohen's d 除以的是标准差,也就是以标准差为单位,样本平均值和总体平均值之间相差多少。

2)第二种叫做相关度度量

例如R平方,表示某个变量的变化比例与另一变量的关系。可以用t检验的信息推出R平方的公式,这里的t值从t检验中获得的值,df是自由度。
在这里插入图片描述
如果r平方等于20%,表示我们可以说通过知道另一个变量能够接受相关变量20%的变化情况

二、单样本检验:汽车引擎排放量实例

案例介绍:
一家专门生产汽车引擎的公司,根据政府最新发布排放要求,引擎排放平均值要低于20ppm。现从公司抽取10台引擎供测试使用,每一台的排放水平如下:15.6 16.2 22.5 20.5 16.4 19.4 16.6 17.9 12.7 13.9,判断该公司汽车是否符合新排放标准?

1、首先查看样本的描述统计信息。

#导入包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#样本数据集
dataSer=pd.Series([15.6,16.2,22.5,20.5,16.4,
                   19.4,16.6,17.9,12.7,13.9])
#样本平均值
sample_mean=dataSer.mean()
#样本标准差
sample_std=dataSer.std()
print('样本平均值=',sample_mean,'单位:ppm')
print('样本标准差=',sample_std,'单位:ppm')

在这里插入图片描述

2、问题:如何知道汽车引擎排放量是否符合新标准?

1)零假设HO:公司的汽车引擎排放不符合最新排放指标>=20ppm;
备选假设H1:公司的汽车引擎排放符合最新排放指标<20ppm。
2)检验类型:只有1个样本,所以是单样本检验。
3)抽样分布类型:样本大小<30,属于小样本,总体近似服从正态分布,则均值的抽样分布为t分布,也可利用seaborn包来查看数据集的分布图来确定分布类型。
4)检验方向:由于备选假设H1中包含小于号‘<’,故我们使用单尾检验中的左尾检验。

import seaborn as sns

#查看数据集分布
sns.distplot(dataSer)
plt.title('数据集分布')
plt.show()

在这里插入图片描述

3.假设验证(证据是什么)?

证据就是计算p值,即求出零假设成立时,得到样本平均值的概率p值。
计算标准误差的方法有两种:

1):用公式手动计算

#样本大小
n = 10
#标准误差=样本标准差/(n的开方)
se =sample_std / (np.sqrt(n))
2)手动计算t值
t=(样本平均值-总体平均值)/标准误差
#总体平均值:就是政府发布的标准20
pop_mean=20
#t值
t=(sample_mean-pop_mean) / se
#计算出t值=-3
print('标准误差se=',se)
print('t=',t)

在这里插入图片描述

2):用python中的stats自动计算

#导入统计模块(stats)
from scipy import stats
#总体平均值
pop_mean=20
'''
ttest_1samp:单独样本t检验
返回的第1个值t是假设检验计算出的(t值),
第2个值p是双尾检验的p值
'''
t,p_two =stats.ttest_1samp(dataSer,pop_mean)
print('t值=',t,'双尾检验的p值=',p_two) 

在这里插入图片描述

#单尾检验的p值
p_one=p_two/2
print('单尾检验的p值=',p_one)

在这里插入图片描述

4.判定是什么?

即常用的显著水平[公式]的取值,本案例取显著水平[公式]=5%

5.得出结论

由以上可判断,该公司的汽车引擎排符合新的标准。但还需要计算效应量来判断有多大差异。同时需要求得置信区间来估计总体的均值范围。

#做出结论
if(t<0 and p_one< alpha): 
    #左尾判断条件
    print('拒绝零假设,有统计显著,也就是汽车引擎排放满足标准')
else: 
    print('接受零假设,没有统计显著,也就是汽车引擎排放不满足标准')

在这里插入图片描述

6、置信区间

此处置信水平为95%,自由度是n-1(9)对应的t值:为0.0645

t_ci=2.262
#使用scipy计算标准误差
se=stats.sem(dataSer)
#置信区间上限
a=sample_mean - t_ci * se
#置信区间下限
b=sample_mean + t_ci * se
print('单个平均值的置信区间,95置信水平 CI=(%f,%f)' % (a,b))

在这里插入图片描述

7.效应量

当假设检验具有统计显著的结论时,需要进一步研究是否具有实际意义。量化显著差异,即得出差异大小,使做出的决策更具目的性。

d=(sample_mean - pop_mean) / sample_std
#效应量:相关度指标R2
#样本大小
n=10
#自由度
df=n-1
R2=(t*t)/(t*t+df)
print('d=',d)
print('R2=',R2)

在这里插入图片描述
由以上判断标准,效果显著(差异大)。

8.分析报告

1、描述统计分析

样本平均值17.17ppm,样本标准差2.98ppm

2、推论统计分析

1)假设检验:独立样本t(9)=-3.00, p=.0074(a=5%),单位检验(左尾),公司的汽车引擎排符合新的标准。
2)置信区间:单个平均值的置信区间 95%置信书评 [17.11,17.23]

3)效应量:d=-0.94,效果显著。

三、相关配对检验:斯特鲁普效应实例

案例介绍:
斯特鲁普效应是是一种干涉效应,当有一个新的刺激出现时,如果它的特征和原先的刺激相似或符合一致,便会加速人们的认知;反之,若新的刺激特征与原先的刺激不相同,则会干扰人们的认知,使人们的所需的反映数据变长。
简单来说,斯特鲁普效应是当有与原有认知不同的情况出现时,人们的反应时间会较长。
接下来我们要验证斯特普鲁效应。
我们可以通过网上的stroop实验来测试人的反应时间,每名参与者得到两组有颜色的文字,第一组数据是字体内容和字体颜色一致,第二组数据是字体内容和字体颜色不一致。每名参与者对着每组文字说出文字的颜色,并分别统计每名参与者所完成每组的时间。
问题描述:

第一组数据:颜色和文字一致;第二组数据:颜色和文字不一致。
验证特鲁普效应存在,即验证字体内容和颜色一致和不一致时的反应时间不相同。
相关配对检验目的:检验相关或配对观测之差的平均值是否等于目标值。

1.提出问题?

首先查看样本的描述统计信息

data = pd.read_csv('C:\\houzi\\test\\data.csv', encoding = 'GBK')
data.head()

在这里插入图片描述

描述统计信息
data.describe()

在这里插入图片描述

#第一组数据均值
con1_mean = data['一致'].mean()
# 第一组数据标准差
con1_std = data['一致'].std()
第一组数据:字体内容和字体颜色一致情况下,实验者的反应时间
# 第二组数据均值
con2_mean = data['不一致'].mean()
# 第二组数据标准差
con2_std = data['不一致'].std()
#两个样本数据集对比
#画板
fg = plt.figure(figsize = (20,10))
#画纸
ax = fg.add_subplot(1,1,1)
#绘制柱状图
data.plot(kind = 'bar',ax = ax)
#显示图形
plt.show()

在这里插入图片描述

1)建立假设

零假设Ho:斯特鲁普效应不存在,即两组试验者反应时间均值相同。
备选假设H1:斯特鲁普效应存在,即在字体颜色和文字不同的情况下,试验者的反应时间会变长。

2)检验类型:因为使用的两组数据是相关样本,所以是相关配对检验。

相关配对检验只关注每对相关数据的差值,在只关注差值集的情况下,样本集处理后只有一组差值集。需要对样本数据进行处理,从而得到差值集。

'''
获取差值数据集,也就是“一致”这一列数据,对应减去“不一致”这一列的数据
'''
#差值数据集
data['差值'] =data['一致'] -data['不一致']
data.head()

3)抽样分布类型

可通过观测数据值的抽样分布来查看类型

#导入绘图包
import seaborn as sns
#查看数据集分布
sns.distplot(data['差值'])
plt.title('差值数据集分布')
plt.show()

在这里插入图片描述
本案例样本大小为n=24,上图数据集近似正态分布,所以案例分布类型为t分布。

4)检验方向

备选假设为在字体颜色和文字不同的情况下,试验者的反应时间会变长,即第一组平均值<第二组平均值,所以选择单尾检验中的左尾检验,即备选假设(<)单尾检验,左尾

2.找到证据

即求出零假设成立时,得到样本平均值的概率p值。
相关(related)配对t检验(ttest_rel)

t,p_two = stats.ttest_rel(data['一致'],data['不一致'])
print('t值=',t,'双尾检验的p值=',p_two) 

在这里插入图片描述

#单尾检验的p值
p_one=p_two/2
print('单尾检验的p值=',p_one)

在这里插入图片描述

3.判定标准

本案例取显著水平依然取 [公式]=5%

左尾判断条件:t < 0 and p_one < 判断标准(显著水平)alpha

右尾判断条件:t > 0 and p_one < 判断标准(显著水平)alpha

#做出结论
if(t<0 and p_oneTail< alpha):
    print('拒绝零假设,有统计显著')
    print('也就是接受备选假设:特鲁普效应存在')
else:
    print('接受备选假设,没有统计显著,也就是特鲁普效应不存在')

4.得出结论

相关配对检验t(24)=-8.35,p=7.32e-09 (α=5%),左尾检验

统计上存在显著差异,拒绝零假设,从而验证斯特鲁普效应存在。

5.置信区间

置信水平为95%,查t表格得到自由度df=23时, t=2.064。

t_ci=2.064
#差值数据集平均值
sample_mean=data['差值'].mean()
#使用scipy计算标准误差
se=stats.sem(data['差值'])
#置信区间上限
a=sample_mean - t_ci * se
#置信区间下限
b=sample_mean + t_ci * se
print('两个平均值差值的置信区间,95置信水平 CI=[%f,%f]' % (a,b))

在这里插入图片描述

6.效应量

即求显著差异大小

#差值数据集对应的总体平均值是0
pop_mean=0
#差值数据集的标准差
sample_std=data['差值'].std()
d=(sample_mean - pop_mean) / sample_std
print('d=',d)

在这里插入图片描述

7.分析报告

1.描述统计分析

第一组数据平均反应时间是:13.93 秒,标准差是:3.54 秒
第二组数据平均反应时间是:22.35 秒,标准差是:5.01 秒
第二组明显比第一组反应时间长。

2.推论统计分析

1)假设检验
相关配对检验 t(23)=-8.08, p=1.77e-08( [公式] =5%),单尾检验(左尾)
拒绝零假设,斯特鲁普效应存在。
2)置信区间两个平均值差值的置信区间,95%的置信水平 CI=[-10.58,-6.27]

3)效应量 d=-1.65,效果显著。

四、独立双样本检验

AB测试:简单来说,就是为同一个目标制定两个方案,让一部分用户使用 A 方案,另一部分用户使用 B 方案,记录下用户的使用情况,看哪个方案更符合设计。可以看出AB测试对于产品优化有很大的帮助。

案例介绍:有两款键盘布局不一样的手机应用(A版本,B版本),你作为公司的产品经理,想在正式发布产品之前,知道哪个键盘布局对用户体验更好?
首先,我们需要设置目标,用来衡量各个版本的优劣,如果一个键盘布局对用户打字时拼错产生的影响较小,那么这个布局是符合用户体验习惯的。所以我们将目标定为用户打字时拼错字产生的影响。随机抽取实验者,将实验者分成2组,每组25人,A组使用键盘布局A,B组使用键盘布局B。让他们在30秒内打出标准的20个单词文字消息,然后记录打错字的数量。

问题:两种版本布局是否用户体验显著不同,哪种更好?

1、查看样本数据集的描述统计信息

#文件路径
fileNameStr='..\\键盘AB测试.xlsx'
#读取Ecxcel数据,统一先按照字符串读入,之后转换
xls = pd.ExcelFile(fileNameStr, dtype='object')
data = xls.parse('Sheet1',dtype='object')
data.head()

查看每一列的数据类型
data.dtypes
#描述统计信息
data.describe()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

字符串转换为数值(浮点型)
data['A'] = data['A'].astype('int')
data['B'] = data['B'].astype('int')
#样本平均值
a_mean=data['A'].mean()
b_mean=data['B'].mean()
#样本标准差
a_std=data['A'].std()
b_std=data['B'].std()
print('A版本样本大小25,样本标准差=',a_std,'单位:打错字数量')
print('B版本样本大小25,样本标准差=',b_std,'单位:打错字数量')

在这里插入图片描述

得到两个版本的主要参数信息,可以看到,A版本的平均打错字数为5.08 ,低于 B版本的平均打错字数为7.80,B版本比A版本打错字数多。

2、提出问题:哪个版本的键盘布局对用户的体验更好?

零假设:A版本和B版本没有差别,即A版本平均值=B版本平均值
备选假设:A版本和B版本有差别,即A版本平均值≠B版本平均值

1)检验类型

本次案例是两组不同的人来测试2组独立版本,所以是双独立样本检验。

2)抽样分布类型

两个数据集的样本大小为25,都小于30,不属于中心极限定理,所以查看两个数据集的分布判断符合哪种分布:

import seaborn as sns
#查看数据集分布
sns.distplot(data['A'])
plt.title('A版本数据集分布')
plt.show()
sns.distplot(data['B'])
plt.title('B版本数据集分布')
plt.show()

在这里插入图片描述
通过观察上面数据集分布图,两个样本数据集都近似正态分布,满足t分布的使用条件,所以抽样分布是t分布

3)检验方向

因备选假设是A版本和B版本有差别,即A版本平均值[公式]B版本平均值,所以我们用双尾检验。

3、找到证据

即在零假设成立前提下,我们需要得到样本平均值的概率p值。

双独立(independent)样本t检验(ttest_ind)

import statsmodels.stats.weightstats as st
  #  usevar='unequal'两个总体方差不一样
t,p_two,df=st.ttest_ind(data['A'],data['B'],
                        usevar='unequal')

#自由度一般只保留整数部分
print('t=',t,'p_two=',p_two,',df=',df)

在这里插入图片描述

4、判定标准

即显著水平,本案例依然取显著水平[公式]=5%。

5、得出结论

#判断标准(显著水平)使用alpha=5%
alpha=0.05
#做出结论
if(p_two< alpha): 
    print('拒绝零假设,有统计显著,也就是接受备选假设')
    print('备选假设:A版本和B版本有差异')
else: 
    print('接受零假设,没有统计显著')
    print('零假设:A版本和B版本没有差异')

在这里插入图片描述

6、置信区间

1)置信水平对应的t值(t_ci)

查t表格可以得到95%的置信水平,自由度是n-1对应的t值。

2)计算上下限,

置信区间上限a=样本平均值 - t_ci ×标准误差
置信区间下限b=样本平均值 - t_ci ×标准误差

t_ci=2.0141
#样本大小n
a_n = 25
b_n = 25
se=np.sqrt( np.square(a_std)/a_n + np.square(b_std)/b_n )
#对于双独立样本检验
#置信区间的样本平均值=A版本平均值 - B版本平均值
sample_mean=a_mean - b_mean
#置信区间上限
a=sample_mean - t_ci * se
#置信区间下限
b=sample_mean + t_ci * se
print('两个平均值差值的置信区间,95置信水平 CI=[%f,%f]' % (a,b))

在这里插入图片描述
置信区间是[-2.76,-2.68],平均下来使用A键盘的错误数量要比B键盘的要少大约3到2个

7、效应量

Cohen’s d= 在这里插入图片描述
本案例需合并标准差,其公式为:
[公式]

#合并标准差
sp=np.sqrt(((a_n-1)*np.square(a_std) + (b_n-1)* np.square(a_std)) / (a_n+b_n-2))
#效应量Cohen's d
d=(a_mean - b_mean) / sp
print('d=',d)

在这里插入图片描述

8、分析报告

1、描述统计分析

A版本打错字数量 平均是5.08个,标准差是2.06个

B版本打错字数量 平均是7.8个,标准差是2.65个

2、推论统计分析

1)假设检验

独立双样本t(45)=-4.05 , p=0.00019 (α=5%) , 双尾检验

拒绝零假设,统计显著。

2)置信区间

两个平均值差值的置信区间, 95%置信水平 CI=[-2.76,-2.68]

3)效应量

d= - 1.32,效果显著

标签:置信区间,假设检验,平均值,--,样本,检验,实例,data,mean
来源: https://blog.csdn.net/sun18696427935/article/details/114785202