问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

AB测试(双独立样本检验)

创作时间:
作者:
@小白创作中心

AB测试(双独立样本检验)

引用
CSDN
1.
https://blog.csdn.net/m0_73519831/article/details/139202843

AB测试是一种常见的实验设计方法,用于比较两个或多个版本在特定指标上的表现差异。本文通过一个键盘布局实验案例,详细介绍了AB测试的整个流程,包括实验设计、描述统计分析、推论统计分析(假设检验、置信区间、效应量)等。

实验设计

这是两款键盘布局不一样的手机(A版本,B版本),作为产品经理,想在正式发布产品之前知道,哪个键盘布局对用户体验更好。

首先,我们需要设置目标,用来衡量各个版本的优劣。在这个键盘布局案例里,如果一个键盘布局对用户打字时拼错产生的影响较小,那么这个布局是符合用户体验习惯的。所以我们将目标定为不同布局的打错字数

有了目标以后,下一步就是采集数据。我们随机抽取实验者,将实验者分成2组,每组25人,A组使用键盘布局A,B组使用键盘布局B。让他们在30秒内打出标准的20个单词文字消息,然后记录打错字的数量。

我们将数据记录在Excel中,A列是使用键盘A打错字的数量,B列是使用键盘B打错字的数量。

现在我们开始A/B测试

一、描述统计分析

进行统计分析时,第一步必须先计算出描述统计分析的特征,以便后期进一步分析结果。

# 导入包
import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt
'''
路径和文件名中不要用中文,不然会报错
encoding用于指定文件的编码,因为读取的csv中有中文,所以指定文件编码为中文编码“GBK”
'''
xls = pd.ExcelFile(r'E:\Jupyter\键盘AB测试.xlsx')
data=xls.parse('Sheet1',dtype='int') #这里转换的数据类型应该写成int,而不是object,否则数据进行描述的时候不会统计均值和方差
data.head()
A
B
6
6
6
11
2
8
7
5
8
11
data.describe()
A
B
count
25.000000
25.000000
mean
5.080000
7.800000
std
2.059935
2.645751
min
2.000000
3.000000
25%
4.000000
6.000000
50%
5.000000
8.000000
75%
7.000000
10.000000
max
10.000000
13.000000
'''
第一组数据:A键盘的平均出错数和方差
'''
# 第一组数据均值
A_mean = data['A'].mean()
# 第一组数据标准差
A_std = data['A'].std()
'''
第二组数据:B键盘的平均出错数和方差
'''
# 第二组数据均值
B_mean = data['B'].mean()
# 第二组数据标准差
B_std = data['B'].std()

使用柱状图对两个样本数据进行比较

# 两个样本数据集对比
# 画板
fg = plt.figure(figsize = (20,10))
# 画纸
ax = fg.add_subplot(1,1,1)
# 绘制柱状图
data.plot(kind = 'bar',ax = ax)
# 显示图形
plt.show()

print('描述统计分析结果:')
print('第一组数据:A键盘,实验者的打字平均出错数是:',A_mean,'个,标准差是',A_std,'个')
print('第二组数据:B键盘,实验者的打字平均出错数是:',B_mean,'个,标准差是',B_std,'个')
print('可见,A键盘的出错均值小于于B键盘')
描述统计分析结果:
第一组数据:A键盘,实验者的打字平均出错数是: 5.08 个,标准差是 2.05993527406405 个
第二组数据:B键盘,实验者的打字平均出错数是: 7.8 个,标准差是 2.6457513110645903 个
可见,A键盘的出错均值小于于B键盘

二、推论统计分析

推论统计分析报告中包括:假设检验,置信区间,效应量

1.问题是什么?

零假设和备选假设

本次统计主要是为了确定A,B两种键盘的出错率,因此作出以下假设

零假设H0:A,B两种键盘打字出错率没有明显区别;

备选假设H1:A,B两种键盘的打字出错率存在明显区别。

检验类型

检验类型有很多种,因为该使用两组数据是独立的样本,所以为双样本独立检验。

检验类型参考资料:http://support.minitab.com/zh-cn/minitab/17/topic-library/basic-statistics-and-graphs/hypothesis-tests/tests-of-means/types-of-t-tests/

抽样分布类型

我们还要判断抽样分布是哪种?因为抽样分布的类型,决定了后面计算p值的不同。

在我们这个案例中,样本大小是25(小于30),属于小样本。那小样本的抽样分布是否满足t分布呢?因为t分布还要求数据集近似正态分布,所以下面图片我们看下差值数据集的分布长什么样。

'''
直方图能够粗略估计数据密度,如果想给数据一个更精确的拟合曲线(专业术语叫:核密度估计kernel density estimate (KDE)),
Seaborn 可以很方便的画出直方图和拟合曲线。
查看数据集分布官网教程地址:https://seaborn.pydata.org/tutorial/distributions.html
安装绘图包seaborn:
conda install seaborn
'''
# 导入绘图包
import seaborn as sns
# 查看数据集分布
sns.distplot(data['A'])
plt.title('A键盘出错字数分布')
plt.show()
sns.distplot(data['B'])
plt.title('B键盘出错字数分布')
plt.show()

通过观察上面差值数据集分布图,数据集近似正态分布,所以满足t分布的使用条件,我们可以使用双样本独立t检验。

检验方向

单尾检验(左尾,右尾),还是双尾检验?

因为备选假设是:A,B两键盘打字出错数是否存在明显区别。

所以我们使用单尾检验中的双尾检验,显著水平为5%,t检验的自由度df=n-1=25-1=24

2.证据是什么?

在零假设成立前提下,得到样本平均值的概率p是多少?

'''
用python统计包scipy自动计算
用scipy计算出的是:双尾检验
单(1samp)样本t检验(ttest_1samp):https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_1samp.html
相关(related)配对t检验(ttest_rel):https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_rel.html
双独立(independent)样本t检验(ttest_ind):https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html
'''
# 导入统计模块(stats)
from scipy import stats
'''
ttest_rel:相关配对检验
返回的第1个值t是假设检验计算出的(t值),
第2个值p是双尾检验的p值
'''
t,p_twoTail = stats.ttest_ind(data['A'],data['B'])
print('t值=',t,'双尾检验的p值=',p_twoTail) 
t值= -4.05593853686 双尾检验的p值= 0.000182560617201
'''
上述分析可见Scipy的双独立样本t检验不能返回自由度,对于后面计算置信区间不方便。所以我们使用另一个统计包(statsmodels)
需要在conda中当前notebook文件所在的python环境下安装统计包(statsmodels),安装命令:
conda install statsmodels
双独立(independent)样本t检验(ttest_ind)
statsmodels.stats.weightstats.ttest_ind
官网使用文档http://www.statsmodels.org/dev/generated/statsmodels.stats.weightstats.ttest_ind.html
'''
import statsmodels.stats.weightstats as st
'''
ttest_ind:独立双样本t检验,
usevar='unequal'两个总体方差不一样
返回的第1个值t是假设检验计算出的(t值),
第2个p_two是双尾检验的p值
第3个df是独立双样本的自由度
'''
t,p_two,df=st.ttest_ind(data['A'],data['B'],
                        usevar='unequal')
# 自由度一般只保留整数部分
print('t=',t,'p_two=',p_twoTail,',df=',df)
t= -4.05593853686 p_two= 0.000182560617201 ,df= 45.2781333114

3.判断标准是什么?

# 显著水平使用alpha=5%
alpha=0.05

4.做出结论

'''
本次分析的直接是双尾检验,因此p直接与alpha进行对比
'''
# 显著水平
a=0.05
# 决策
if(p_twoTail< a):
    print('拒绝零假设,有统计显著')
    print('也就是接受备选假设:AB键盘打字出错数存在明显差异')
else:
    print('接受备选假设,没有统计显著,也就是AB键盘不存在明显差异')
拒绝零假设,有统计显著
也就是接受备选假设:AB键盘打字出错数存在明显差异

假设检验报告:

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

统计上存在显著差异,拒绝零假设,说明AB键盘存在明显差异。

5. 置信区间

'''
1)置信水平对应的t值(t_ci)
查t表格可以得到,95%的置信水平对应的t值=2.0141
2)计算上下限
置信区间上限a=样本平均值 - t_ci ×标准误差
置信区间下限b=样本平均值 - t_ci ×标准误差
'''
'''
95%的置信水平,自由度是n-1对应的t值
查找t表格获取,
也可以通过这个工具获取:https://www.graphpad.com/quickcalcs/statratio1/(利用这个工具获取t值,需要注意输入的概率值是1-95%=0.05)
注意:课程中这里对应的下面t_ci值有误,以下面的值为准
'''
t_ci=2.0141
# 差值数据集平均值
sample_mean=A_mean-B_mean
# 使用双样本独立假设的标准差计算公式
se=np.sqrt(np.square(A_std)/25+np.square(B_std)/25)
# 置信区间上限
a=sample_mean - t_ci * se
# 置信区间下限
b=sample_mean + t_ci * se
# 标准误差:https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.stats.sem.html
两个平均值差值的置信区间,95置信水平 CI=[%f,%f]' % (a,b)
两个平均值差值的置信区间,95%置信水平 CI=[-4.070699,-1.369301]

可见,A键盘相对B键盘的出错数要小1-4个左右。

6.效应量

'''
效应量:差异指标Cohen's d
'''
# 差值数据集的合并标准差
sample_std=np.sqrt((24*np.square(A_std)+24*np.square(B_std))/48)
# 计算效应量
d1=(A_mean - B_mean) / sample_std
print('d=',d1)
d= -1.1471926574

三、数据分析报告总结

1、描述统计分析

第一组数据:A键盘,实验者的打字平均出错数是: 5.08 个,标准差是 2.05993527406405 个

第二组数据:B键盘,实验者的打字平均出错数是: 7.8 个,标准差是 2.6457513110645903 个

可见,A键盘的打字出错数小于B键盘

2、推论统计分析

1)假设检验

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

统计上存在显著差异,拒绝零假设,从而验证AB键盘存在显著差异。

2)置信区间

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

3)效应量

d= - 1.147

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号