写在前边:
本文会根据置信区间和假设检验的知识来展开项目实战。所以文章分为两大部分:基础知识篇,介绍置信区间、置信水平、假设检验;实战篇,根据假设检验的三种类型展开项目实战。你可以选择感兴趣的部分进行阅读哟~
目录
【Part1】基础篇置信区间
假设检验
【Part2】实战篇单样本检验
相关配对检验
独立双样本检验(A/B测试)
【Part1】基础篇
置信区间
我们在浅析统计概率中,提出了为什么样本可以来估计整体?是因为“中心极限定理”说“样本的平均值,约等于总体的平均值;不管总体是什么分布,任意一个总体的样本平均值都会围绕在总体的平均值周围,并且呈正态分布”。
样本又能在多大程度上代表整体呢?翻译大白话,就是说用样本来估计总体,它的误差范围是多少?比如,我们估计了公司里同事们的平均体重是60kg,可是当你换个时间点或者换一部分样本,估计平均体重是62.5kg,那你能说我测量的平均体重是错的么?
因为我们没有办法知道整体平均值的真实数值,所以需要给出一个误差范围来估计这个样本的准确程度。点估计和区间估计就是解释这个问题的。点估计是在抽样推断中不考虑抽样误差,直接以抽样指标代替全体指标的一种推断方法。因为个别样本的抽样指标不等于全体指标,所以,用抽样指标直接代替全体指标,不可避免的会有误差。
区间估计是抽样推断中根据抽样指标和抽样误差去估计全体指标的可能范围的一种推断方法。在从抽样指标推断全体指标时,用一定概率保证误差不超出某一给定范围。
简单来说。我们多次抽样,每个样本的平均值,可以视为点估计;因为我们无法判断,哪个点估计对总体平均值的估计的误差范围最小,于是就使用区间估计。比如我们说,公司员工的平均体重是60-63kg,那[60,63]这个区间就是置信区间。
那我们的置信区间包含总体员工的平均体重(总体平均值)的概率是p,我们用Y%来表示,这个概率值呢就是置信水平。
比如说,我们有100个样本,每一个样本都有一个置信区间,那么我们就有100个置信区间。置信水平95%就表示,这100个置信区间中,有95个区间是包含了这个平均值。所以,如果我们只做一次抽样,那这个样本置信区间包含平均值的概率就是95%。
常见的置信水平,有90%,95%和99%。
我们知道了置信区间和置信水平是什么后,接下来我们看,如何求不同样本大小的置信区间呢?
我们按照样本大小,是否超过30,把他们分为“大样本”和“小样本”;顾名思义,“大样本”就是样本大小超过30的样本;“小样本”就是样本小于30的样本。为啥要以30为界呢?不是40、不是50呢?这是因为我们区分大、小样本,也是为了判断属于那种抽样分布类型,是正态分布还是t分布?一般而言n=30的时候,已经很接近正态分布了。所以一般认为30就是大样本。
那也就是需要解决正态分布的置信区间和t分布的置信区间如何求~
我们可以按照以下思路:
① 确定要求的问题是什么
② 求样本的平均值和标准误差
③ 确定置信水平:
如果是大样本的正态分布:根据置信水平,比如说置信水平是95%,α = 0.25(也就是(1-0.95)/2得出)查找Z表格,求z值;
如果是小样本的t分布:根据自由度和置信水平来查找t表格,求t值;我们可以看一下t表格:
④ 得出置信区间
置信区间是一个有着上限和下限的区间[a , b],那么:a = 样本平均值 - z*标准误差 或者 样本平均值 - t*标准误差
b = 样本平均值 + z*标准误差 或者 样本平均值 + t*标准误差
假设检验
“当你排除了所有可能性,还剩下一个时,不管有多么的不可能,那就是真相”
假设检验,就是这个道理,当我们排出了一个假设,那剩下的一个就是true。假设检验的基本思想是“小概率事件”原理,其统计推断方法是带有某种概率性质的反证法。小概率思想是指小概率事件在一次试验中基本上不会发生。反证法思想是先提出检验假设,再用适当的统计方法,利用小概率原理,确定假设是否成立。即为了检验一个假设H0是否正确,首先假定该假设H0正确,然后根据样本对假设H0做出接受或拒绝的决策。如果样本观察值导致了“小概率事件”发生,就应拒绝假设H0,否则应接受假设H0。
根据这个定义,我们就知道,当我们在提出问题的时候,需要定义一个“零假设”,和一个反命题作为“备选假设”;就比如我们把“A九是胖妞”作为零假设,呃,换一个吧,“A九是美妞”作为零假设,那么“A九不是美妞”就是备选假设(-_- 什么举例),不管怎样还是比较好理解是吧~
接下来,我们需要根据我们的问题和抽样情况,来判断属于什么检验类型。这里需要介绍一下假设检验的检验类型:
① 单样本检验:就是单个样本的检验,检验单个样本的平均值是否等于目标值,比如公司员工的平均体重是不是等于60kg;
② 相关配对检验:检验相关或配对观测之差的平均值是否等于目标值;比如检验减肥药是否起作用,对每个人服药前后进行体重测量;
③ 独立双样本检验:检验两个独立样本的平均值之差是否等于目标值;比如常见的A/B测试,两个版本的产品对不同的用户进行测试,记录两个版本用户的使用数据,比较各个版本对于改进目标的效果;
接下来按照我们的抽样的样本大小,就可以判断是什么抽样分布类型;如果样本大于30就是大样本的正态分布;如果小于30就是小样本的t分布;
当然还有注意的是,根据我们的问题,判断是什么检验方向?左尾检验?右尾检验?还是双尾检验?
以上,我们就完整的提出了问题:定义零假设、备选假设
什么检验类型
什么抽样类型
什么检验方向
接下来,我们想知道,在假定零假设成立的前提下,得到样本平均值的概率是多少?这个概率就是p值;在求p值之前,我们需要确定用于做决策的拒绝域,也就是决定显著性水平α;最后我们需要比较p和α的大小来做决策。(常用的显著性水平α = 5%)
我们来说一下p值是如何计算的(以t分布为例),之前也有介绍:
s为样本标准差,表示样本偏离样本均值的程度,用来衡量数组的离散程度;标准误差是所有样本平均值
的标准差;计算对象是所有的样本的平均值
:
标准误差
;t = (样本平均值 - 总体平均值)/标准误差;
下一步,就是根据p值大小和α的大小,来做决策:当p<=α时,拒绝零假设,接受备选假设;
当p>α时,接受零假设。
思路见下图:
做完了假设检验,我们还需要计算效应量。效应量是指由于因素引起的差别,是衡量处理效应大小的指标。与显著性检验不同,这些指标不受样本容量影响。它表示不同处理下的总体均值之间差异的大小,可以在不同研究之间进行比较。
很懵,对不对?简单说,效应量是指处理效应的大小,例如药物A比药物B效果显著。在判断某个研究的结果,是否有意义或者重要时,要考虑的另一项指标就是效应量。效应量太小,意味着处理即使达到了显著水平,也缺乏实用价值。
度量效应量有很多种,但大多数都属于两大主要类别:
① 差异度量:例如在对比平均值时,衡量效应大小的常见标准之一是Cohen's d
Cohen's d = (样本平均值1-样本平均值2) / 标准差
Cohen's d 除以的是标准差,也就是以标准差为单位,样本平均值和总体平均值之间相差多少;
② 相关度度量:例如R平方,表示某个变量的变化比例与另一变量的关系。可以用t检验的信息推出R平方的公式,这里的t值从t检验中获得的值,df是自由度;
如果r² 等于20%,表示我们可以说通过知道另一个变量能够接受相关变量20%的变化情况。
以上,就完成了我们基础部分内容。
【Part2】实战篇
接下来,我们根据假设检验的三种类型:单样本检验、相关匹配样本检验、独立双样本检验展开实战:
1.单样本检验 —— 矿泉水的净含量是否达到550ml
工商局在检验某厂商生成的矿泉水时,需要验证矿泉水的净含量是否如厂商所说的550ml?
于是,抽取16瓶矿泉水进行检测;发现抽样后得到的实际净含量数据(饮料净含量的总体均值为550ml)为558,551,542,557,552,547,551,549,548,551,553,557,548,550,546,552;
怎么知道,工程生产的矿泉书净产量是否达到550ml呢?
1)描述统计分析
我们先导入包:
import numpy as np
import pandas as pd
import scipy.stats as ss
import matplotlib.pyplot as plt
import seaborn as sns
根据样本数据集,建立样本数据框:
# 样本数据集
data_df = pd.DataFrame()
data_df['净含量'] = [558,551,542,557,552,547,551,549,548,551,553,557,548,550,546,552]
我们使用describe看一下描述统计信息:
data_df.describe()
我们得出:样本矿泉水净含量平均值为550.75ml,标准差为4.25ml;
2)推论统计分析
推论统计分析报告中包括:假设检验,置信区间,效应量;
① 问题是什么?
定义零假设和备选假设:零假设H0为“矿泉水的净含量未达到(
备选假设H1为“矿泉水的净含量达到(≥)550ml”;
什么检验类型?
这里只有1个样本,所以选择单样本检验;
什么抽样分布?
我们里利用Python可视化看一下:
# 查看数据集分布
sns.distplot(data_df)
通过观察上面数据集分布图,数据集近似正态分布,满足t分布的使用条件,所以抽样分布是t分布,自由度df= 16 - 1 = 15;
什么检验方向?
我们 备选假设为“矿泉水净含量≥550ml”,也就是平均值≥550;我们使用右尾检验。
综合以上分析,本次假设检验是单样本t检验,单尾检验中的右尾。
② 确定用于做决策的拒绝域,也就是决定显著性水平α:
显著性水平α = 5%。
③ 证据是什么?
我们需要求出,在零假设成立的条件下得到样本平均值的概率p;
因为是单样本t检验,我们使用scipy包中ttest_1samp来计算p值:
# 总体平均值 = 550
pop_mean = 550
'''ttest_1samp:单独样本t检验返回的第1个值t是假设检验计算出的(t值),第2个值p是双尾检验的p值'''
t , p_two = ss.ttest_1samp(data_df , pop_mean)
print('t值=',t,'双尾检验的p值=',p_two)
t = 0.706 >0 ; p = 0.49
这里,我们得到的p值是双尾检验的p值,我们需要得到单尾检验的p值:
#单尾检验的p值
p_one=p_two/2
print('单尾检验的p值=',p_one)
④ 做出决策:左尾判断条件:t < 0 and p_one < 判断标准(显著水平)alpha
右尾判断条件:t > 0 and p_one < 判断标准(显著水平)alpha
#做出结论
if(t > 0 and p_one< alpha):
#左尾判断条件
print('拒绝零假设,有统计显著,矿泉水净含量符合标准')
else:
print('接受零假设,没有统计显著,也就是矿泉水净含量不符合标准')
如此看来,我们的零假设成立了。
⑤ 置信区间
根据上述分析,我们查找t表格,95%的置信水平,自由度是15,t = 2.131;
根据t值,我们可得出置信区间:
# 计算置信区间
t = 2.131
# 计算标准误差
se=ss.sem(data_df)
#置信区间上限
a=data_df['净含量'].mean() - t * se
#置信区间下限
b=data_df['净含量'].mean() + t * se
print('单个平均值的置信区间,95置信水平 CI=(%f,%f)' % (a,b))
⑥ 效应量
# 效应量
'''效应量:差异指标Cohen's d'''
d = (data_df['净含量'].mean() - pop_mean)/data_df['净含量'].std()
print('d=',d)
'''效应量:相关度指标R2'''
#样本大小
n=16
#自由度
df=n-1
R2=(t*t)/(t*t+df)
print('R2=',R2)
综上,我们的推论统计报告见下:1.描述统计分析
样本矿泉水净含量平均值为550.75ml,标准差为4.25ml;
2.推论统计分析
1)假设检验
独立样本(15)=0.706,p = 0.2456,单尾检验(右尾);
矿泉水净含量不符合标准;
2)置信区间
平均值的置信区间,95%,CI = [548.49,553.01]
3)效应量
d = 0.18
相关配对检验
我们以学生月考成绩来作为案例研究:
某班级20个学生,第一次月考英语成绩和第二次月考的英语成绩如下:判断两次月考成绩是否有显著性差异?
1)描述统计分析
我们先导入包:
import numpy as np
import pandas as pd
import scipy.stats as ss
import matplotlib.pyplot as plt
import seaborn as sns
根据样本数据集,建立样本数据框:
# 样本数据集
score_df = pd.DataFrame()
score_df['No_1'] = [60,78,28,83,60,87,90,73,70,82,69,86,68,68,76,84,83,87,60,78]
score_df['No_2'] = [67,79,60,85,66,87,86,74,74,81,79,80,82,70,82,86,85,84,62,77]
我们使用describe看一下描述统计信息:
我们使用柱状图对两个样本数据进行比较:
# 使用柱状图对两个样本数据进行比较
#两个样本数据集对比
#画板
fg = plt.figure(figsize = (20,10))
#画纸
ax = fg.add_subplot(1,1,1)
#绘制柱状图
score_df.plot(kind = 'bar',ax = ax)
sns.set_palette('summer')
描述统计分析结果:第一次月考,学生成绩的平均值是73.50分,标准差是14.35分;
第二次月考,学生成绩的平均值是77.30分,标准差是8.34分;
第二次月考成绩大部分的学生成绩高于第一次月考成绩;
2)推论统计分析
① 问题是什么?
定义零假设和备选假设:零假设H0为“学生的第二次月考成绩不受第一次考试成绩影响”;
备选假设H1为“学生的第二次月考成绩受第一次考试成绩影响”;
什么检验类型?
因为该使用两组数据是相关样本,所以选择相关配对检验;
相关配对检验只关注每对相关数据的差值,避免得到的结论受到参加考试的学生独立性的影响。在只关注差值集的情况下,样本集处理后只有一组(差值集)。下面我们先对样本数据进行处理,得到差值集:
# 获取差值集
score_df['No_sub'] = score_df['No_2'] - score_df['No_1']
看下结果:
什么抽样分布?
案例中,样本大小是20,属于小样本,小样本的抽样分布是否满足t分布呢?因为t分布还要求数据集近似正态分布,所以下面我们里利用Python可视化看一下差值数据集的分布什么样:
#查看数据集分布
#画板
fg = plt.figure(figsize = (20,10))
#画纸
ax = fg.add_subplot(1,1,1)
sns.distplot(score_df['No_sub'])
sns.set_palette('summer')
通过观察上面差值数据集分布图,数据集近似正态分布,所以满足t分布的使用条件,我们可以使用相关样本t检验。
什么检验方向?
因为备选假设是:"学生的第二次月考成绩受第一次考试成绩影响",就是第二次月考均值s2>第一次月考均值s1(s1
综合以上分析,本次假设检验是相关样本t检验,单尾检验中的左尾。
② 确定用于做决策的拒绝域,也就是决定显著性水平α:
显著性水平α = 5%。
③ 证据是什么?
我们需要求出,在零假设成立的条件下得到样本平均值的概率p;
'''ttest_rel:相关配对检验返回的第1个值t是假设检验计算出的(t值),第2个值p是双尾检验的p值'''
t,p_two = ss.ttest_rel(score_df['No_1'] , score_df['No_2'])
print('t值=',t,'双尾检验的p值=',p_two)
#单尾检验的p值
p_one=p_two/2
print('单尾检验的p值=',p_one)
④ 做出决策:左尾判断条件:t < 0 and p_one < 判断标准(显著水平)alpha
右尾判断条件:t > 0 and p_one < 判断标准(显著水平)alpha
#显著水平使用alpha=5%
alpha=0.05
'''左尾判断条件:t < 0 and p_one < 判断标准(显著水平)alpha右尾判断条件:t > 0 and p_one < 判断标准(显著水平)alpha'''
#做出结论
if(t<0 and p_one< alpha):
print('拒绝零假设,有统计显著')
print('也就是接受备选假设:学生的第二次月考成绩受第一次考试成绩影响')
else:
print('接受备选假设,没有统计显著,也就是学生的第二次月考成绩不受第一次考试成绩影响')
如此看来,我们的备选假设成立了,学生的第二次月考成绩受第一次考试成绩影响。
⑤ 置信区间
根据上述分析,我们查找t表格,95%的置信水平,自由度是19,t = 2.093;
根据t值,我们可得出置信区间:
# 计算置信区间
t = 2.093
# 计算标准误差
se=ss.sem(score_df['No_sub'])
#置信区间上限
a=score_df['No_sub'].mean() - t * se
#置信区间下限
b=score_df['No_sub'].mean() + t * se
print('两个平均值差值的置信区间,95置信水平 CI=[%f,%f]' % (a,b))
⑥ 效应量
'''效应量:差异指标Cohen's d'''
#差值数据集对应的总体平均值是0
pop_mean= 0
#差值数据集的标准差
d=(score_df['No_sub'].mean() - pop_mean) / score_df['No_sub'].std()
print('d=',d)
综上,我们的推论统计报告见下:1.描述统计分析
第一次月考,学生成绩的平均值是73.50分,标准差是14.35分;
第二次月考,学生成绩的平均值是77.30分,标准差是8.34分;
第二次月考成绩大部分的学生成绩高于第一次月考成绩;
2.推论统计分析
1)假设检验
独立样本(19)=-2.09,p = 0.025,相关匹配t检验(左尾);
学生第二次月考成绩受第一次月考成绩影响;
2)置信区间
平均值的置信区间,95%,CI = [-0.00,7.60]
3)效应量
d = 0.47
独立双样本检验
案例:在体育课上记录14名学生乒乓球得分数据,男女生各7名,数据如下:
男生:82,80,85,85,78,87,82;
女生:75,76,80,77,80,77,73;
假设,男女得分相互独立,且均服从正态分布。比较在置信水平95%情况下男女生得分是否有显著差异。
1)描述统计分析
我们先导入包:
import numpy as np
import pandas as pd
import scipy.stats as ss
import matplotlib.pyplot as plt
import seaborn as sns
根据样本数据集,建立样本数据框:
# 建立样本数据集
pp_df = pd.DataFrame()
pp_df['Boy'] = [82,80,85,85,78,87,82]
pp_df['Girl'] = [75,76,80,77,80,77,73]
我们使用describe看一下描述统计信息:
我们得出:男生的得分平均值82.71分,标准差3.15分;女生得分平均值76.86分,标准差2.54分。
2)推论统计分析
① 问题是什么?
定义零假设和备选假设:零假设H0:男生女生得分没有显著差异;也就是男生平均得分= 女生平均得分;
备选假设H1:男生女生得分有显著差异;也就是男生平均得分≠ 女生平均得分;
什么检验类型?
这里有两组样本,是不同的人,所以选择双独立样本检验。
什么抽样分布?
这个AB测试中,样本大小是14属于小样本。那小样本的抽样分布是否满足t分布呢?因为t分布还要求总体分布近似正态分布,我们通过样本数据集的分布来推断总体分布。
# 查看数据分布
f = plt.figure(figsize=(20,10))
f.add_subplot(2,1,1)
sns.distplot(pp_df['Boy'])
plt.title('Boys Score')
f.add_subplot(2,1,2)
sns.distplot(pp_df['Girl'])
plt.title('Girls Score')
sns.set_palette('summer')
通过观察上面数据集分布图,两个样本数据集都近似正态分布,满足t分布的使用条件,所以抽样分布是t分布。
什么检验方向?
我们备选假设为男生女生得分有显著差异;也就是男生平均得分≠ 女生平均得分;所以我们使用双尾检验。
综合以上分析,本次假设检验是双独立样本t检验,双尾检验。
② 确定用于做决策的拒绝域,也就是决定显著性水平α:
显著性水平α = 5%。
③ 证据是什么?
我们需要求出,在零假设成立的条件下得到样本平均值的概率p;
Scipy的双独立样本t检验不能返回自由度,对于后面计算置信区间不方便。所以我们使用另一个统计包(statsmodels)。
import statsmodels.stats.weightstats as ssw
'''ttest_ind:独立双样本t检验,usevar='unequal'两个总体方差不一样返回的第1个值t是假设检验计算出的(t值),第2个p_two是双尾检验的p值第3个df是独立双样本的自由度'''
t,p_two,df=ssw.ttest_ind(pp_df['Boy'] ,pp_df['Girl'] , usevar='unequal')
#自由度一般只保留整数部分
print('t=',t,'p_two=',p_two,',df=',int(df))
t = 3.8388 ; p = 0.0026 ; df = 11。
④ 做出决策:双尾检验判断条件:p_two(双尾检验的p值) < 判断标准(显著水平)α 时,拒绝零假设,有统计显著,也就是有显著差异。
#显著水平使用alpha=5%
alpha=0.05
#做出结论
if (p_two < alpha) :
print('拒绝零假设,有统计显著,也就是接受备选假设:男生女生得分有显著差异')
else:
print('接受零假设,没有统计显著,也就是男生女生得分没有显著差异')
⑤ 置信区间
根据上述分析,我们查找t表格,95%的置信水平,自由度是11,t =2.201;
根据t值,我们可得出置信区间:
t=2.201
#样本大小n
Boy_n = 7
Girl_n = 7
se=np.sqrt( np.square(pp_df['Boy'].std())/Boy_n + np.square(pp_df['Girl'].std())/Girl_n )
'''对于双独立样本检验置信区间的样本平均值=男生得分平均值 - 女生得分平均值'''
sample_mean=pp_df['Boy'].mean() - pp_df['Girl'].mean()
#置信区间上限
a = sample_mean - t * se
#置信区间下限
b = sample_mean + t * se
print('两个平均值差值的置信区间,95置信水平 CI=[%f,%f]' % (a,b))
⑥ 效应量
'''效应量:差异指标Cohen's d这里的标准差,因为是双独立样本,需要用合并标准差(pooled standard deviations)代替'''
#合并标准差
sp=np.sqrt(((pp_df['Boy'].size-1)*np.square(pp_df['Boy'].std()) + (pp_df['Girl'].size-1)* np.square(pp_df['Girl'].std()) ) / (pp_df.size-2))
#效应量Cohen's d
d=(pp_df['Boy'].mean() - pp_df['Girl'].mean()) / sp
print('d=',d)
综上,我们的推论统计报告见下:1.描述统计分析
男生的得分平均值82.71分,标准差3.15分;女生得分平均值76.86分,标准差2.54分;
2.推论统计分析
1)假设检验
独立样本(11)=3.8388,p = 0.0026,双尾检验;
男生女生得分有显著差异;
2)置信区间
平均值的置信区间,95%,CI = [2.49,9.22]
3)效应量
d = 2.05
以上内容,就是对置信区间和假设检验的全部介绍啦~
感谢阅读!