与数据相关的检验很多,本文力求逐渐汇总常用的检验(原理,代码实现),因为一个检验可能应用场景众多,这里只按检验罗列
一、正态性检验
检验一组数据是否服从正态分布。
正态分布的好处(为什么我们总是需要假设正态分布)
- 中心极限定理:大数定理告诉我们一组随机变量的均值依概率收敛于其期望值。中心极限定理则进一步研究均值的分布:当n区域无穷大时,一系列随机变量的均值服从正态分布。我们经常通过一个样本去推断总体,如果我们选择的样本够大,则我们通常会假设它服从正态分布,进而做下一步研究(比如下面的T检验就需要先做正态性检验)
- 均值与方差独立:只有正态分布下,其均值与方差是独立的。这点很多地方谈的比较少,我是从一个统计学家的英文介绍中读到的。均值和方差独立,意味着我们可以分别研究均值或方差而不用管另一个参数的影响
python代码实现
# 此处附带了拟合优度检验方法
from scipy import stats
# 还可以作图检验,如QQ图
stats.skewtest(x) # 偏度
stats.kurtosistest(x) # 峰度
stats.normaltest(x) # 正态性检验
# rvs:给定一维样本数据,或者一个分布名称(此时需要使用args给定该分布参数,以及指定N表示取样大小)
# cdf:与什么分布进行比较。一般rvs与cdf只有一个为字符串,否则两者要相等(无意义)
# args:rvs或cdf为字符串时,args定义对应的参数
# N:取样大小(默认20,rvs为字符串时才使用)
# stats.kstest(rvs=x,cdf='t',args=(10,),N=20)# t分布需要给定自由度(此处N不需要)
stats.kstest(rvs=x,cdf='norm')# 也是正态分布检验
stats.shapiro(data)# 小样本正态检验
# 检验2个样本的分布是否一致
stats.ks_2samp(x,y)
二、T检验
小样本,比较2组数据均值是否存在显著差异
前提条件
- 通过正态性检验
- 对于独立样本T检验,还需要通过方差齐性检验(下面会提到)
单样本T检验
比较一组数据均值与特定值之间差异
配对样本T检验
比较2组关联样本(如实验组和对照组)均值是否存在显著差异
独立样本T检验
比较2组独立样本均值是否存在显著差异,此时2组样本数量可以不相等
python代码实现
from scipy import stats
# 单样本t检验
# x为样本数据,m为比较的均值
t,p=stats.ttest_1samp(x,m)# p值低于相应显著性水平时,拒绝均值相等假设
# 两独立样本的t检验
t,p=stats.ttest_ind(x,y)
# 两配对样本的t检验
stats.ttest_rel(x,y)
# 单样本t检验的另一种实现,较繁琐
tt=(x_mean-m)/np.sqrt(x_var/nobs) # t统计量
p=stats.t.sf(np.abs(tt),n-1)*2 # 两侧检验,sf为1-cdf
三、F检验
用于在众多因素中找出对结果有重要影响的因素。常用于方差分析(定量数据,如检验多个总体均值是否存在显著差异)、方差齐性检验和线性回归模型的显著性检验
零假设:2个或多个组的总体均值相等(方差分析);模型系数全为0(模型显著性检验,注意,有一个系数不为0即通过检验)
线性回归模型显著性
F统计量:
方差分析
分单因素、多因素方差分析
前提条件
- 正态性检验
- 方差齐性检验
F统计量:
from scipy import stats
# 首先进行方差齐性检验
w,p=stats.levene(samples,center='')
# 单因素方差分析:只分析各组样本均值是否具有显著差异
f,p=stats.f_oneway(sample1,sample2,...)
# 多因素方差分析:
from statsmodels.stats.anova import anova_lm
from statsmodels.formula.api import ols
from statsmodels.graphics.api import interaction_plot
from statsmodels.stats.multicomp import pairwise_tukeyhsd# 查看某因素各水平的差异
# 最小二乘线性模型的方差分析
anova_lm(ols(formlula,df).fit(),test='F',typ=2)
# formlula语法:字符串格式
y~A+B # A和B,无交互项
y~A:B # 交互项
y~A*B # A,B以及交互项
y~C(A)+C(B) # C表示先转类别
y~C(A,Sum)+C(B,Sum) # 表示以sum比较而非均值
# 交互作用可视化
# x:表示x轴变量
# trace:表示随x变化的另外因素
# response:表示因变量
interaction_plot(x, trace, response, func=np.mean,xlabel=None, ylabel=None)
# 查看单个因素各水平之间的差异
# endog:因变量
# groups:因素
# alpha:显著性水平
print(pairwise_tukeyhsd(endog, groups, alpha=0.05))
方差齐性检验
检验2组独立、正态分布数据的方差是否存在显著差异
:方差相等
F统计量(将方差大的放在分子):
python实现
# samples:样本列表,每个样本是一维的
# center:有偏分布选择median;对称、轻尾分布选择mean;重尾分布选择trimmed
w,p=stats.levene(samples,center='')# 方差齐性检验
四、卡方检验
用于定性数据。是一种非参数方法,通过与期望值比较,得出是否具有显著差异的结论。
零假设:数据在给定区间内具有与期望一致的频次(对应下面3种情况,分别是服从、独立、无差异)
要求
- 随机样本
- 理论频次不能太小,否则需要修正
修正方法
- 如果总频数>=40,且所有单元格期望频数>5,使用皮尔逊卡方值即可
- 如果总频数>=40,且单元格期望频数小于5大于1,选择连续性修正值
- 如果总频数<40,或单元格期望频数<1,选择费希尔精确检验结果(超几何分布)
卡方统计量:
有3种用途:
- 拟合优度检验:检验给定数据是否服从某个分布。如上面正态性检验提到的kstest就是
- 变量独立性检验:检验2个变量间是否独立。如性别与看直播是否独立。
- 配对卡方:用不同方法作用同一对象,看2个方法的效果是否有显著差异。(注意此时与2计算期望方式不同,记住期望是从假设推导而来就行)
python实现
# f_obs:每个类的观测频次,f_exp:期望频次
val,p=stats.chisquare(f_obs, f_exp=None, ddof=0, axis=0)
# 示例
quantiles = [0.0, 0.01, 0.05, 0.1, 1-0.10, 1-0.05, 1-0.01, 1.0]
crit = stats.t.ppf(quantiles, 10) # 得到t临界值
n_sample = x.size
freqcount = np.histogram(x, bins=crit)[0] # 样本x在给定区间内的频数分布
tprob = np.diff(quantiles) # 差分,t分布每个区间对应的百分比
nprob = np.diff(stats.norm.cdf(crit)) #与t分布相同的区间内,正态分布出现的百分比
# 返回卡方统计量和p值
tch, tpval = stats.chisquare(freqcount, tprob*n_sample) # x样本与t分布比较
nch, npval = stats.chisquare(freqcount, nprob*n_sample) # x样本与正态分布比较
网友评论