这里会罗列一些统计学中的检验方法,当然顺序以笔者遇到的为准。
1.方差分析
1.1 概述
对于均值的检验,一般分为以下几种情况:
- 某样本均值与常数的比较
- 两个样本均值的比较
- 两个以上样本均值的比较
对于前两种检验,用t检验和z检验完全可以handle,第三种也可以用t/z检验两两进行,但是毕竟耗时,用方差分析就可以解决这个问题了。
这个问题面试滴滴的时候有被问到,立志做数据科学家的朋友们,还是学习一下。
比较常用的方差分析方法包括:单因素方差分析、多因素方差分析、协方差分析、多元方差分析、重复测量方差分析、方差成分分析等。
1.2 常用术语
- 因素
因素是方差分析的研究对象,是一个独立的变量,比如饮料的不用颜色就是因素。 - 水平
因素的取值就是水平,比如饮料颜色的红、黄、蓝、绿就是水平。 - 控制变量
方差分析中可以人为控制的变量,比如饮料的颜色。 - 随机变量
与控制变量相对应就是不可以人为控制的变量。 - 观察变量与观察值
方差分析中受控制变量和随机变量影响下观察的目标成为观察变量,观测得到的数值就是观察值。饮料再不同颜色的销售额就是观测变量,具体的取值就是观察值。
1.3 单因素方差分析原理
进行方差分析的要满足两个前提:
- 总体服从正态分布
- 样本满足方差齐性
方差分析的目的是检验各个样本的均值是否相等,原假设是样本均值相等,备择假设是样本均值不相等。一般来说造成均值差异的原因有两个: - 因素水平不同造成的差异,成为系统性误差。
承接饮料这个案例,饮料颜色就是系统性误差。系统性误差用组间方差来衡量,当然组间方差有可以衡量随机性误差,但主要是为了衡量系统性误差。 - 样本抽样随机性造成的误差,成为随机性误差。
同样,饮料在不同商场的销售额也不同,这是随机性误差。随机性误差用组内方差来衡量。
如果因素水平对观察变量影响不大,那么组间方差只有随机性误差的影响,组间方差和组内方差的比接近于1,相反则大于1,当这个比值大于某个值的时候我们就可以得到显著性差异的结论。方差分析就是通过比较方差做出接受或拒绝原假设的结论。
1.4 单因素方差分析案例
饮料案例,我们要观察饮料的不同颜色对销售额是不是有显著的影响,基础数据如下:
- 建立假设
原假设:饮料颜色对销售额没有显著影响。
备择假设:饮料颜色对销售额有显著影响。 - 计算样本均值和总体均值
- 计算组间方差和和组内方差和
-
构造F检验统计量
这里注意自由度的问题:
- 确定检验规则,做出决策
1)P值检验
根据F检验统计量计算P值,此处计算的P值为0.000466,小于显著性水平0.05,拒绝原假设,接受备择假设,即饮料颜色对销售额有显著影响。
P值是根据概率密度函数求的。
2)临界值
临界值是根据假设检验类型查表得到的,比如显著性水平α=0.05,是双侧检验,F检验的临界值是3.24,那么计算值F=10.486>3.24,是拒绝原假设,所以认为不同颜色是有显著差异的。
1.5 python实现方差检验
很遗憾,python里没有包直接做方差分析,但是自己实现一个类应该是很简单的。
python里有方差齐性检验的包叫levene,在scipy里,直接调用scipy.stats.levene(rvs1, rvs2)
-- 2020.4.13更新
笔者原来说python里没有方差检验的包,笔者说错了,今天无意中发现
statsmodels.stats.power.FTestAnovaPower是可以进行方差检验的。
2.t检验
t检验的概念是通过比较不同数据之间的差值,以观察数据之间有没有显著差异。适用于小样本(30个以下),总体方差未知的情况。
t检验有几个假设条件:
- 总体分布服从正态或近似服从正态分布。
- 检验定量数据,即数据大小是有意义的,对于分类数据的检验请移步卡方检验。
t检验有以下三种: -
单样本t检验,检验单个样本数据与某一个数据是否有显著差异。比如检验灯泡平均寿命是不是等于3000小时。来看一下公式:
这个很简单了,使用python的包就可以求解:
scipy.stats.ttest_1samp(data,pop_mean)其中,data是样本数据,pop_mean是总体均值。一个小demo如下:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
data = pd.Series([15.6,16.2 ,22.5 ,20.5 ,16.4 ,19.4 ,16.6, 17.9 ,12.7, 13.9])
data_mean = data.mean()
data_std = data.std()
pop_mean=20
t,p_towTail = stats.ttest_1samp(data,pop_mean)
-
独立样本t检验
用于分析定类数据与定量数据之间的关系,如男女生的身高是否有显著差异。独立样本t检验假设样本来自于两个不同的独立总体,但方差相同,除了要求单样本t检验的那些条件,还要求两个样本之间具有方差,需要进行方差齐性检验,参考方差分析。
计算方法我在网上找了一个ppt讲解的很好:
python实现用的是scipy.stats.ttest_ind,来看一个小demo:
from scipy.stats import ttest_ind, levene
import pandas as pd
x = [20.5, 19.8, 19.7, 20.4, 20.1, 20.0, 19.0, 19.9]
y = [20.7, 19.8, 19.5, 20.8, 20.4, 19.6, 20.2]
print(levene(x,y))
print(ttest_ind(x, y))
#levene检验p值大于0.05认为是满足方差齐性的,如果不满足则加一个参数equal_var=False
print(ttest_ind(x,y,equal_var=False))
-
配对样本t检验
配对样本T检验用于分析配对定量数据之间的差异对比关系,这个就和独立样本t检验区分开了,要求样本量相同且前后顺序要一一对应。比如通过两组数据的对比分析,判断背景音乐是否会影响消费行为。配对样本t检验可以通过差值转化为单样本t检验:
python实现用的是scipy.stats.ttest_rel(data1,data2),来看一个小demo:
from scipy.stats import ttest_rel
import pandas as pd
x = [20.5, 18.8, 19.8, 20.9, 21.5, 19.5, 21.0, 21.2]
y = [17.7, 20.3, 20.0, 18.8, 19.0, 20.1, 20.0, 19.1]
# 配对样本t检验
print(ttest_rel(x, y))
3.Z检验
Z检验和t检验其实一样,都是对均值进行检验,但是不一样的地方在于Z检验要求样本量比较大,并且总体方差已知。由于t检验不要求总体方差已知,所以t检验的应用范围比较广。Z检验其实和t检验有相同的计算形式:
python实现用的是scipy.stats.weightstats.ztest(data1,data2),来看一个小demo:
import statsmodels.stats.weightstats as sw
arr=[23,36,42,34,39,34,35,42,53,28,49,39,\
46,45,39,38,45,27,43,54,36,34,48,36,\
47,44,48,45,44,33,24,40,50,32,39,31]
sw.ztest(arr, value=39)
当然了单样本和双样本都可以做。Z检验就不过多介绍了。
4.F检验
如果大家还有印象,我们之前用F检验做过方差齐性分析。F检验还有一个广为人知的名字叫联合假设检验,主要用在方差分析中。
怎么实现我们之前已经讲过了,用scipy.stats.levene这个准没错。
5.卡方检验
卡方检验是用于检验样本实际值与理论值之间是否存在显著差异,原假设是没有显著差异的。举两个好理解的例子:卡方检验可以检验男性或者女性对线上买生鲜食品有没有区别;也可以检验不同城市级别的消费者对买SUV车有没有什么区别。
具体计算过程可以看这篇文章,讲的很好:卡方检验的实际应用
python实现用的是scipy.stats.chisquare,来看一个小demo:
import scipy.stats as ss
obs=[107,198,192,125,132,248]
exp=[167]*6
#拒绝域 1%的显著水平,自由度5
#jjy=ss.chi2.isf(0.01,5)
#卡方
kf=ss.chisquare(obs,f_exp=exp).statistic
6.比率检验
这个真的是太神奇了,通常用在互联网中,用来比较两个比率有没有显著差异。
使用A方案的付费转化率为30%,使用B方案的付费转化率为34%,可以检验这两个转化率之间是否有显著不同。本质和z检验一样,把标准差换成了比例而已,可以用单样本也可以用双样本。
其中π0是总体比率,p是样本比率。
比率检验的演化
用python的话调用statsmodels.stats里的相关函数,来看个小demo:
from statsmodels.stats.proportion import proportion_effectsize
from statsmodels.stats.power import zt_ind_solve_power
effect_size=proportion_effectsize(prop1=0.3, prop2=0.4, method=‘normal‘)
sample_size=zt_ind_solve_power(effect_size=effect_size, nobs1=None, alpha=0.05, power=0.8, ratio=1.0, alternative=‘two-sided‘)
这个包可以推广到以上的F检验,t检验和Z检验。
基本上检验的方法和用途都说完了,希望起到启发的作用,大家如有需要可以探索更多假设检验的方法。