引言
从最大笨蛋理论而来的假设问题:
一种人对生活中的信息理性分析和判断和能力
一、假设检验的套路:
1、问题是什么?
零假设、备选假设
2、证据是什么?
零假设成立时,得到样本平均值的概率:p值
3、判断标准是什么?
显著水平α(0.1%,1%,5%)
4、做出结论
p<=α时,拒绝零假设也就是备选假设成立
p>α时,接受零假设
二、做好假设检验所需要的知识
1、关于如何判断抽样分布的类型:
2、关于t检验:
又称为学生t检验,T检验,亦称student t检验(Students t test),主要用于样本含量较小(例如n<30),总体标准差σ未知的正态分布。
t检验是用t分布理论来推论差异发生的概率,从而比较两个平均数的差异是否显著。它与f检验、卡方检验并列。t检验是戈斯特为了观测酿酒质量而发明的。戈斯特在位于都柏林的健力士酿酒厂担任统计学家,基于Claude Guinness聘用从牛津大学和剑桥大学出来的最好的毕业生以将生物化学及统计学应用到健力士工业程序的创新政策。戈斯特于1908年在Biometrika上公布t检验,但因其老板认为其为商业机密而被迫使用笔名(学生)。实际上,跟他合作过的统计学家是知道「学生」的真实身份是戈斯特的。
3、假设检验的类型:
4、推论统计分析报告:
内容分为
1)描述统计分析
2)推论统计分析:假设检验(统计是否显著即是否有差异)、置信区间、效应量(效果是否显著即差异大小)
5、关于p值:
假设检验的关键
1)、得到标准误差:
2).t=样本值-总体均值/标准误差
3)、根据t值,查看t表格,得到p值。
假设检验APA格式:
6、关于置信区间:
图片里是APA格式的置信区间:平均值的置信区间,95% CI=(a,b)
在报告告置信区间时,提供了这样几个信息: 1)开头会说是哪种类型的置信区间 例如在单样本检验中是单个平均值的置信区间,但是在我们后面要讲到的相关样本检验是两个平均值之间差异的置信区间。 在这个案例里,我们是单个平均值的置信区间 2)置信水平和区间的上下限。 置信水平(简写为CI),括弧里写上下限。这里是955的置信水平
7、关于效应量:
效应量是指处理效应的大小,例如药物A比药物B效果显著。度量效应量有很多种,但大多数都属于两大主要类别。
1)第一种叫做差异度量
例如在对比平均值时,衡量效应大小的常见标准之一是Cohens d
Cohens d = (样本平均值1-样本平均值2) / 标准差
Cohens d 除以的是标准差,也就是以标准差为单位,样本平均值和总体平均值之间相差多少。
2)第二种叫做相关度度量
例如R平方,表示某个变数的变化比例与另一变数的关系。可以用t检验的信息推出R平方的公式,这里的t值从t检验中获得的值,df是自由度。
r2=t2 / (t2+df),其中r2是指r的平方,t2是t的平方
如果r平方等于20%,表示我们可以说通过知道另一个变数能够接受相关变数20%的变化情况
三、单样本检验:
案例背景:
「超级引擎」是一家专门生产汽车引擎的公司,根据政府发布的新排放要求,引擎排放平均值要低于20ppm, (ppm是英文百万分之一的缩写,这里我们只要理解为是按照环保要求汽车尾气中碳氢化合物要低于20ppm)。
公司制造出10台引擎供测试使用,每一台的排放水平如下:
15.6 16.2 22.5 20.5 16.4 19.4 16.6 17.9 12.7 13.9
怎么知道,公司生产的引擎是否符合政府规定呢?
如果你是这家公司的数据分析师,该怎么办呢?
本次假设检验是单样本t检验,单尾检验中的左尾。
#导入包 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()
这里要区别:数据集的标准差,和样本标准差 数据集的标准差公式除以的是n,样本标准差公式除以的是n-1。 样本标准差,用途是用样本标准差估计出总体标准差 pandas计算的标准差,默认除以的是n-1,也就是计算出的是样本标准差 pandas标准差官网地址:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.std.html
#样本标准差 sample_std=dataSer.std() print(样本平均值=,sample_mean,单位:ppm) print(样本标准差=,sample_std,单位:ppm)
import seaborn as sns
#查看数据集分布(通过观察数据集分布图,数据集近似正态分布,满足t分布的使用条件,所以抽样分布是t分布,自由度df=n-1=10-1=9。) sns.distplot(dataSer) plt.title(数据集分布) plt.show()
#导入统计模块(stats) from scipy import stats
#总体平均值 pop_mean=20
ttest_1samp:单独样本t检验 返回的第1个值t是假设检验计算出的(t值), 第2个值p是双尾检验的p值
t,p_twoTail =stats.ttest_1samp(dataSer,pop_mean)
print(t值=,t,双尾检验的p值=,p_twoTail)
#单尾检验的p值 p_oneTail=p_twoTail/2
print(单尾检验的p值=,p_oneTail)
#判断标准(显著水平)使用alpha=5% alpha=0.05
左尾判断条件:t < 0 and p < 判断标准(显著水平)alpha 右尾判断条件:t > 0 and p < 判断标准(显著水平)alpha
#做出结论 if(t<0 and p_oneTail< alpha): #左尾判断条件 print(拒绝零假设,有统计显著,也就是汽车引擎排放满足标准) else: print(接受零假设,没有统计显著,也就是汽车引擎排放不满足标准)
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))
效应量:差异指标Cohens d
d=(sample_mean - pop_mean) / sample_std
效应量:相关度指标R2
#样本大小 n=10 #自由度 df=n-1 R2=(t*t)/(t*t+df)
print(d=,d) print(R2=,R2)
最终得到的数据分析报告如下:
1、描述统计分析
样本平均值17.17ppm,样本标准差2.98ppm
2、推论统计分析
1)假设检验
独立样本t(9)=-3.00,p=.0074(α=5%),单尾检验(左尾)
公司引擎排放满足标准
2)置信区间
平均值的置信区间,95% CI=(17.11,17.23)
3)效应量
d=-0.94
四、相关配对检验
案例背景:特鲁普效应是著名的心理学现象,展示了人们对事物的认知过程已是一个自动化的历程。当有一个新的刺激出现时,如果它的特征和原先的刺激相似或符合一致,便会加速人们的认知;反之,若新的刺激特征与原先的刺激不相同,则会干扰人们的认知,使人们的所需的反映数据变长。
简单来说,斯特鲁普效应是当有与原有认知不同的情况出现时,人们的反应时间会较长。
我们想要验证斯特鲁普效应。
通过网上的stroop实验做测试人的反应时间(https://faculty.washington.edu/chudler/java/ready.html)。 每名参与者得到两组有颜色的文字,第一组数据是字体内容和字体颜色一致,第二组数据是字体内容和字体颜色不一致。每名参与者对每组文字说出文字的颜色,并分别统计完成每组的时间。
此次实验共记录25组数据(样本量),并汇总到Excel表格中。
#导入包 import numpy as np import pandas as pd import matplotlib.pyplot as plt
data = pd.read_csv(C:\hmy\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()
print(描述统计分析结果:) print(第一组数据:字体内容和字体颜色一致情况下,实验者的平均反应时间是:,con1_mean,秒,标准差是,con1_std,秒) print(第二组数据:字体内容和字体颜色不一致情况下,实验者的平均反应时间是:,con2_mean,秒,标准差是,con2_std,秒) print(「不一致」情况下所用时间均大于「一致」情况,也就是当字体内容和字体验证不一致时,实验者的平均反应时间变长)
#差值数据集 data[差值] =data[一致] -data[不一致] data.head()
#导入绘图包 import seaborn as sns #查看数据集分布 sns.distplot(data[差值]) plt.title(差值数据集分布) plt.show()
from scipy import stats
ttest_rel:相关配对检验 返回的第1个值t是假设检验计算出的(t值), 第2个值p是双尾检验的p值
t,p_twoTail = stats.ttest_rel(data[一致],data[不一致]) print(t值=,t,双尾检验的p值=,p_twoTail)
因为scipy计算出的是双尾检验的t值和p值,但是我们这里是左尾检验。 根据对称性,双尾的p值是对应单尾p值的2倍
#单尾检验的p值 p_oneTail=p_twoTail/2 print(单尾检验的p值=,p_oneTail)
#显著水平使用alpha=5% alpha=0.05 #单尾检验的p值 p_oneTail=p_twoTail/2 #显著水平 a=0.05 #决策 if(t<0 and p_oneTail< a): print(拒绝零假设,有统计显著) print(也就是接受备选假设:特鲁普效应存在) else: print(接受备选假设,没有统计显著,也就是特鲁普效应不存在)
#置信区间 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))
#差值数据集对应的总体平均值是0 pop_mean=0 #差值数据集的标准差 sample_std=data[差值].std() d=(sample_mean - pop_mean) / sample_std
print(d=,d)
数据分析报告:
第一组样本数据:字体内容和字体颜色一致情况下,平均反应时间是: 13.89 秒,标准差是 3.47 秒
第二组样本数据:字体内容和字体颜色不一致情况下,平均反应时间是: 22.62 秒,标准差是 5.09 秒
「不一致」情况下所用时间均大于「一致」情况,也就是当字体内容和字体验证不一致时,实验者的平均反应时间变长
相关配对检验t(24)=-8.35,p=7.32e-09 (α=5%),左尾检验
统计上存在显著差异,拒绝零假设,从而验证斯特鲁普效应存在。
两个平均值差值的置信区间,95%置信水平 CI=[-8.80,-8.67]
d= - 1.67
五、独立双样本检验
案例背景:A/B测试
这是两款键盘布局不一样的手机(A版本,B版本),你作为公司的产品经理,想在正式发布产品之前知道,哪个键盘布局对用户体验更好呢?
首先,我们需要设置目标,用来衡量各个版本的优劣,如果是电商网站,目标可以是点击率,注册率,页面停留时间等。
在这个键盘布局案例里,如果一个键盘布局对用户打字时拼错产生的影响较小,那么这个布局是符合用户体验习惯的。所以我们将目标定为用户打字时拼错字产生的影响。
有了目标以后,下一步就是采集数据。在这一部分,用户会随机分配到不同版本中,通过他们的交互行为会被直接检测,并收集起来作为以后分析的重要数据。
我们随机抽取实验者,将实验者分成2组,每组25人,A组使用键盘布局A,B组使用键盘布局B。让他们在30秒内打出标准的20个单词文字消息,然后记录打错字的数量。
我们将数据记录在Excel中,A列是使用键盘布局A打错字的数量,B列是使用键盘布局B打错字的数量。
import pandas as pd import numpy as np import matplotlib.pyplot as plt
#文件路径 fileNameStr=C:\hmy\键盘AB测试.xlsx #读取Ecxcel数据,统一先按照字元串读入,之后转换 xls = pd.ExcelFile(fileNameStr, dtype=object) data = xls.parse(Sheet1,dtype=object)
data.head()
#查看每一列的数据类型 data.dtypes
#字元串转换为数值(浮点型) data[A] = data[A].astype(int) data[B] = data[B].astype(int) print(转换后的数据类型: ,data.dtypes) #描述统计信息 data.describe()
#样本平均值 a_mean=data[A].mean() b_mean=data[B].mean()
print(A版本平均值=,a_mean,单位:打错字数量) print(B版本平均值=,b_mean,单位:打错字数量)
#样本标准差 a_std=data[A].std() b_std=data[B].std()
print(A版本样本大小25,样本标准差=,a_std,单位:打错字数量) print(B版本样本大小25,样本标准差=,b_std,单位:打错字数量)
我们还要判断抽样分布是哪种?因为抽样分布的类型,决定了后面计算p值的不同。
在我们这个AB测试案例中,样本大小是25(小于30),属于小样本。那小样本的抽样分布是否满足t分布呢?因为t分布还要求总体分布近似正态分布,但是总体分布我们是不知道的,我们可以通过样本数据集的分布来推断总体分布。
#查看数据集分布 sns.distplot(data[A]) plt.title(A版本数据集分布) plt.show()
sns.distplot(data[B]) plt.title(B版本数据集分布) plt.show() #假设检验 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_two,,df=,df) #判断标准(显著水平)使用alpha=5% alpha=0.05
双尾判断条件:p < 判断标准(显著水平)alpha/2 时,拒绝零假设,有统计显著,也就是有显著差异
#做出结论 if(p_two< alpha/2): print(拒绝零假设,有统计显著,也就是接受备选假设) print(备选假设:A版本和B版本有差异) else: print(接受零假设,没有统计显著) print(零假设:A版本和B版本没有差异)
#置信区间 t_ci=2.0141
#样本大小n a_n = 25 b_n = 25
numpy.square 平方 numpy.sqrt开方 标准误差计算公式: https://en.wikipedia.org/wiki/Student%27s_t-test#Independent_two-sample_t-test
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))
#效应量
效应量:差异指标Cohens d 这里的标准差,因为是双独立样本,需要用合并标准差(pooled standard deviations)代替
#合并标准差 sp=np.sqrt(((a_n-1)*np.square(a_std) + (b_n-1)* np.square(a_std) ) / (a_n+b_n-2)) #效应量Cohens d d=(a_mean - b_mean) / sp
A版本打错字数量 平均是5.08个,标准差是2.06个
B版本打错字数量 平均是7.8个,标准差是2.65个
2、推论统计分析 1)假设检验 独立双样本t(45)=-4.05 , p=.00019 (α=5%) , 双尾检验
拒绝零假设,统计显著。
2)置信区间 两个平均值差值的置信区间, 95%置信水平 CI=[-2.76,-2.68]
3)效应量 d= - 1.32,效果显著