独立双样本检验
AB测试:为同一目标制定两个案例,测试出效果最好的案例,得出最后结果。
例子:假设有AB两个键盘设计案例,测试同一时间打相同单词错误数量结果如下图,由于同一行是不同两个对象的测试结果,因此为独立双样本检验。
描述统计分析:
#读入数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
fileNameStr = 'E:\\DATA\\datatest.xlsx'
xls = pd.ExcelFile(fileNameStr,dtype = 'object')
data = xls.parse('Sheet1',dtype = 'object')
data.head()
#字符串转换为数值(浮点型)
data['A'] = data['A'].astype('int')
data['B'] = data['B'].astype('int')
data.describe()
#样本平均值
a_mean = data['A'].mean()
b_mean = data['B'].mean()
#样本标准差
a_std = data['A'].std()
b_std = data['B'].std()
如果单看平均打错字的数量来看A小于B,但是A版本和B版本存在统计显著吗?可以通过以下假设检验。
一、问题是什么: 哪个键盘布局用户体验更好
1、零假设:A版本与B版本没有差别,A版本平均值 = B版本平均值
备选假设: A版本与B版本有差别,A版本平均值 != B版本平均值
2、判断检验类型:因为两组样本是不同人测出来的数据,选择独立双样本检验
3、确定抽样分布:
由于本次案例中的样本为25小于30,因此是小样本。
再根据画图看出其分布近似与正态分布,因此可以推断总体样本近似与正态分布,因此该抽样为t分布。
import seaborn as sns
plt.rc('font',family=['Microsoft YaHei'])
sns.distplot(data['A'],color="g")
plt.title('A版本数据集分布')
plt.show()
sns.distplot(data['B'])
plt.title('B版本数据集分布')
plt.show()
4、检验方向:由于备选假设是A版本平均值不等于B版本,因此检验方向为双尾检验
二、证据是什么:计算p值
在零假设成立的前提下,得到样本平均值的概率是多少
由于scipy在计算独立双样本t检验时无法返回自由度,因此选用另一个统计包:statsmodels
import statsmodels.stats.weightstats as st
'''
ttest_ind:独立双样本检验
usevar = 'unequal':两个总体方差不一样
t:假设检验计算出的t值
p_two:双尾检验的p值
df:自由度
'''
t,p_two,df = st.ttest_ind(data['A'],data['B'],usevar = 'unequal')
print('t=',t,'p_two=',p_two,'df=',df)
t= -4.05593853685732
p_two= 0.0001945745530721613
df= 45.27813331135628
三、判断标准是什么
判断标准使用常用的显著水平5%,即alpha = 5%,双尾检验中图片显示的黄色部分的面积,计算比较的时候则是alpha/2,当t<0时,则和左边的alpha/2进行比较。
alpha = 0.05
if(p_two
print('拒绝零假设,有统计显著,接受备选假设')
print('备选假设:A版本与B版本有差异')
else:
print('接受零假设,无统计显著')
print('零假设:A版本与B版本无差异')
四、做出结论
拒绝零假设,有统计显著,接受备选假设 备选假设:A版本与B版本有差异
独立双样本检验的置信区间:
对于独立双样本检验的置信区间关心两个样本之间的差异,因此不会计算单个样本,而是两个样本平均值的差值。
因此公式中的样本平均值=样本1平均值-样本2平均值
标准误差:
,其中s1,s2为样本1和2的标准差,n1,n2为样本1和2的样本大小。
t_ci = 0.0631 #95%的置信水平,自由度df对应的t值
a_n = 25 #样本大小
b_n = 25
se = np.sqrt(np.square(a_std)/a_n +np.square(b_std)/b_n) #计算标准误差
sample_mean = a_mean - b_mean
a = sample_mean - t_ci*se #置信区间上限
b = sample_mean + t_ci*se #置信区间下限
print('a=',a,'b=',b)
a= -2.7623162230986336
b= -2.677683776901366
95%置信水平 CI = (-2.76,-2.68)
独立双样本检验的效应量:
在独立双样本检验中,计算效应量的标准差为合并标准差,公式如下:
#合并标准差
sp = np.sqrt(((a_n-1)*np.square(a_std)+(b_n-1)*np.square(b_std))/(a_n+b_n-2))
#效应量
d=(a_mean - b_mean)/sp
print('d=',d)
d= -1.1471926573950622
d的绝对值大于0.8因此效果显著大,即A版本与B版本效果差异较大。