本文通过一个实际案例介绍假设检验的一种类型:双独立样本检验。
一、案例
测试背景:
两款布局不一样的手机键盘(A版本,B版本),想知道哪种键盘布局的用户体验更好。
衡量目标:
用户打错字的数量。
数据采集:
随机抽取实验者并将其分成2组,每组25人,A组使用键盘布局A,B组使用键盘布局B。让他们在30秒内打出标准的20个单词文字消息,然后记录打错字的数量。
数据集说明:
数据记录在CSV文件中,A列是使用键盘布局A打错字的数量,B列是使用键盘布局B打错字的数量。
二、分析过程
1.描述统计分析
- 导入相关库
#导入相关库
import numpy as np #科学计算工具包
import pandas as pd #数据分析工具包
import matplotlib.pyplot as plt #图表绘制工具包
import seaborn as sns # 基于 matplot, 导入 seaborn 会修改默认的 matplotlib 配色方案和绘图样
#式,这会提高图表的可读性和美观
plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文字体设置-黑体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
sns.set(font='SimHei') # 解决Seaborn中文显示问题
# 在 jupyter notebook 里面显示图表
%matplotlib inline
- 导入CSV文件
#导入CSV文件
data = pd.read_csv("D:\盐小鱼\课堂笔记\数据分析项目实战\Python项目实战\AB测试\键盘AB测试.csv")
- 读取前五行数据
#读取前五行数据
data.head()
- 查看数据集各列数据类型
#查看数据集各列数据类型
data.dtypes
- 描述统计信息
#描述统计信息
data.describe()
- 样本平均值
#样本平均值
a_mean=data['A'].mean()
b_mean=data['B'].mean()
print('A版本平均值',a_mean,'单位:个')
print('B版本平均值',b_mean,'单位:个')
- 样本标准差
#样本标准差(总体/n,样本/n-1,pandas默认/n-1)
a_std=data['A'].std()
b_std=data['B'].std()
print('A版本样本大小为25,样本标准差为',round(a_std,2),'单位:个')
print('B版本样本大小为25,样本标准差为',round(b_std,2),'单位:个')
#结果保留两位小数
2.推论统计分析
1)明确问题
问题:哪种键盘布局的用户体验更好?
- 提出零假设和备选假设
零假设总是表现为研究没有改变,没有效果,不起作用等,这里就是不满足标准。
零假设:两种键盘布局的用户体验没有差异,即A版本平均值=B版本平均值。
备选假设:两种键盘布局的用户体验有差异,即A版本平均值 ≠ B版本平均值。
- 确定检验类型
因为测试的两组实验者为两个独立样本,所以这里选择双独立样本检验。
- 确定抽样分布类型
样本大小为25小于30,属于小样本。
观察样本数据集分布
- 查看A版本数据集分布情况
#查看A版本数据集分布情况
sns.distplot(data['A'])
plt.title('A版本数据集分布情况')
plt.show()
- 查看B版本数据集分布情况
#查看B版本数据集分布情况
sns.distplot(data['B'])
plt.title('B版本数据集分布情况')
plt.show()
观察两个版本的数据集分布情况图可知两个样本数据集都近似正态分布,满足t分布的使用条件,所以抽样分布是t分布。
- 确定检验方向
零假设与备选假设讨论的是两个版本是否存在差异,因此为双尾检验。
总结:双样本独立双尾t检验。
2)提供证据
在零假设成立前提下,得到样本平均值的概率p:
#计算P值
import statsmodels.stats.weightstats as st#统计包
#ttest_ind:双独立样本t检验
#usevar='unequal'两个总体方差不同
t,p_two,df=st.ttest_ind(data['A'],data['B'],usevar='unequal')
#t:假设检验计算出的t值
#p_two:双尾检验p值
#df:自由度
print('t=',t,'p_two=',p_two,'df=',df)
3)判断标准
#判断标准(显著水平)使用alpha=5%
alpha=0.05
4)得出结论
#得出结论
if(p_two<alpha):
print('拒绝零假设,有统计显著,即接受备选假设')
print('备选假设:A版本和B版本有差异')
else:
print('接受零假设,没有统计显著')
print('零假设:A版本和B版本没有差异')
双独立样本t(45)=-4.05,p=.00019 (α=5%),双尾检验。(这里的t(45),里面的45是前面计算出的t分布的自由度df)
统计上存在显著差异,拒绝零假设,从而验证A版本和B版本存在显著差异。
5)置信区间
标准误差计算公式:
SE=s12n1+s22n2
#t_ci:置信水平对应t值(查t表格中95%的置信水平,自由度n-1对应的t值)
#置信区间下限:a=样本平均值-t_ci*标准误差
#置信区间上限:b=样本平均值+t_ci*标准误差
t_ci=2.014
#样本大小n
a_n=25
b_n=25
#numpy.square 平方
#numpy.sqrt 开方
#标准误差se
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))
两组样本所代表的总体平均值差值置信区间,95%置信水平为 CI=[-4.07,-1.37],即使用A键盘的错字数量比使用B键盘平均约少2-4个。
6)效应量
如果效应量太小,意味着处理即使达到了显著水平,也缺乏实用价值。
合并标准差计算公式:
Sp=(n1−1)s12+(n2−1)s22n1+n2−2
#效应量:Cohen's d
#标准差:双独立样本,采用合并标准差
#合并标准差
sp=np.sqrt(((a_n-1)*np.square(a_std)+(b_n-1)*np.square(b_std))/(a_n+b_n-2))
#效应量Cohen's d
d=(a_mean-b_mean)/sp
print('d=',d)
三、检验报告
1.描述统计分析
A版本打错字数量平均是5.08个,标准差是2.06个。
B版本打错字数量平均是7.8个,标准差是2.65个。
2.推论统计分析
1)假设检验:独立双样本t(45)=-4.06 , p=.00019 (α=5%) , 双尾检验,拒绝零假设,统计显著。
2)置信区间:两个平均值差值的置信区间, 95%置信水平 CI=[-4.07,-1.37]。
3)效应量:d= - 1.15,效果很显著。
综上,备选假设成立即两种键盘布局的用户体验有差异,且A版本键盘布局的用户体验更好。
统计学知识笔记: