错位的梦寐

基于T 检验的 AB 测试

2020-05-16


基于 T 检验的 AB 测试。 双侧 T 检验,方差未知。

一、实验设计

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

首先,我们需要设置目标,用来衡量各个版本的优劣,如果是电商网站,目标可以是点击率,注册率,页面停留时间等。

在这个键盘布局案例里,如果一个键盘布局在用户打字时拼错的概率小,那这个布局就是符合用户体验习惯的。

所以我们将目标定为不同布局的打错字数。

有了目标以后,下一步就是采集数据。

通过随机抽取实验者,将实验者分成2组,每组25人,A组使用键盘布局A,B组使用键盘布局B。让他们在30秒内打出标准的20个单词文字消息,然后记录打错字的数量。

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

二、描述统计分析

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

导入模块

from warnings import simplefilter
simplefilter(action='ignore',category=FutureWarning)
import pandas as pd
import numpy as npm
import matplotlib.pyplot as plt
from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False

导入数据集

data = pd.read_excel('键盘AB测试.xlsx')
data.head()
"""

	A	B
0	6	6
1	6	11
2	2	8
3	7	5
4	8	11
"""

计算A、B两组数据的平均出错数和方差

# 第一组数据:A键盘的平均出错数和方差
A_mean = data['A'].mean()
A_std = data['A'].std()

第二组数据:B键盘的平均出错数和方差

# 第二组数据均值
B_mean = data['B'].mean()
# 第二组数据标准差
B_std = data['B'].std()

可以用data.describe()直接看出来的, 但是不方便后面调用

使用柱状图进行数据比较

data.plot(kind='bar')

结合上述计算结果,可以初步看出:

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

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

可见,A键盘的出错均值小于B键盘

三、推论统计分析

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

1.问题是什么?

零假设和备选假设

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

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

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

检验类型

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

抽样分布类型

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

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

#导入绘图包
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两键盘打字出错数是否存在明显区别。

所以我们使用双独立样本t检验,双尾检验。显著水平为5%

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_ind:相关配对检验
返回值
第1个值t是假设检验计算出的(t值),
第2个值p是双尾检验的p值
'''
t,p_twoTail = stats.ttest_ind(data['A'],data['B'])

print('t值=',t,'双尾检验的p值=',p_twoTail) 
t值= -4.055938536857321 双尾检验的p值= 0.0001825606172014822

上述分析结果可见,基于 scipy 的双样本独立t检验无法返回自由度 t,对于后期计算置信区间不变,因此建议使用 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.055938536857321 p_two= 0.0001825606172014822 ,df= 45.27813331135627

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%),双尾检验

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

5.置信区间

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

查 t 表格可以得到,95%的置信水平对应的 t值=2.0141 (此处用的自由度是 statsmodels 计算出来的自由度 45,)

95%的置信水平,自由度是 n-1 对应的 t 值

查找t表格获取,也可以通过这个工具获取:graphpad

2)计算上下限

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

置信区间下限b=样本平均值 - 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

print('两个平均值差值的置信区间,95置信水平 CI=[%f,%f]' % (a,b))
两个平均值差值的置信区间,95置信水平 CI=[-4.070699,-1.369301]

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

6.效应量

一般需要在报告中给出效应量(effect size)。

什么是效应量呢?

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

1)第一种叫做差异度量

例如在对比平均值时,衡量效应大小的常见标准之一是Cohen’s d

Cohen’s d = (样本平均值1-样本平均值2) / 标准差

Cohen’s d 除以的是标准差,也就是以标准差为单位,样本平均值和总体平均值之间相差多少。

Cohen’s d的评价标准为:

小效应(≥0.2且<0.5);中等效应(≥0.5且<0.8);大效应(≥0.8)。

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

例如R平方,表示某个变量的变化比例与另一变量的关系。可以用t检验的信息推出R平方的公式,这里的t值从t检验中获得的值,df 是自由度。

$ r^2 = t_2 / (t_2 + df)$

如果 $r^2$ 等于20%,表示我们可以说通过知道另一个变量能够接受相关变量20%的变化情况

相关度指标的评价标准为:

小效应(≥0.01且<0.09);中等效应(≥0.09且<0.25);大效应(≥0.25)。

'''
效应量:差异指标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
d= -1.147192657395062

四、数据分析报告总结

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

参考

  1. 假设检验(单样本检验、配对检验、独立双样本检验)
  2. AB测试到底是什么?

下一篇 Python 装饰器

Comments

Content