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=(tt)/(tt+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,效果显著

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值