美文网首页
统计学之检验

统计学之检验

作者: 米斯特芳 | 来源:发表于2021-07-28 12:12 被阅读0次

与数据相关的检验很多,本文力求逐渐汇总常用的检验(原理,代码实现),因为一个检验可能应用场景众多,这里只按检验罗列

一、正态性检验

检验一组数据是否服从正态分布。

正态分布的好处(为什么我们总是需要假设正态分布)

  1. 中心极限定理大数定理告诉我们一组随机变量的均值依概率收敛于其期望值。中心极限定理则进一步研究均值的分布:当n区域无穷大时,一系列随机变量的均值服从正态分布。我们经常通过一个样本去推断总体,如果我们选择的样本够大,则我们通常会假设它服从正态分布,进而做下一步研究(比如下面的T检验就需要先做正态性检验)
  2. 均值与方差独立:只有正态分布下,其均值与方差是独立的。这点很多地方谈的比较少,我是从一个统计学家的英文介绍中读到的。均值和方差独立,意味着我们可以分别研究均值或方差而不用管另一个参数的影响

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组数据均值是否存在显著差异

前提条件

  1. 通过正态性检验
  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检验

用于在众多因素中找出对结果有重要影响的因素。常用于方差分析(定量数据,如检验多个总体均值是否存在显著差异)、方差齐性检验线性回归模型的显著性检验
零假设H_0:2个或多个组的总体均值相等(方差分析);模型系数全为0(模型显著性检验,注意,有一个系数不为0即通过检验)

线性回归模型显著性

F统计量:F=\frac{SSR/k}{SSE/(n-k-1)},SSR为回归离差平方和,SSE为误差平方和\\ =\frac{R^2/k}{(1-R^2)/(n-k-1)},R为相关系数,k为变量个数

方差分析

分单因素、多因素方差分析
前提条件

  1. 正态性检验
  2. 方差齐性检验

F统计量F=\frac{SSA/(r-1)}{SSE/(n-r)},SSA为组间离差平方和,SSE为组内离差平方和,r为组个数

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组独立、正态分布数据的方差是否存在显著差异
H_0:方差相等
F统计量(将方差大的放在分子):F=\frac{s_1^2}{s_2^2},自由度为n_1-1,n_2-1

python实现

# samples:样本列表,每个样本是一维的
# center:有偏分布选择median;对称、轻尾分布选择mean;重尾分布选择trimmed
w,p=stats.levene(samples,center='')# 方差齐性检验

四、卡方检验

用于定性数据。是一种非参数方法,通过与期望值比较,得出是否具有显著差异的结论。
零假设H_0:数据在给定区间内具有与期望一致的频次(对应下面3种情况,分别是服从、独立、无差异)

要求

  1. 随机样本
  2. 理论频次不能太小,否则需要修正

修正方法

  1. 如果总频数>=40,且所有单元格期望频数>5,使用皮尔逊卡方值即可
  2. 如果总频数>=40,且单元格期望频数小于5大于1,选择连续性修正值
  3. 如果总频数<40,或单元格期望频数<1,选择费希尔精确检验结果(超几何分布)

卡方统计量\chi^2=\sum_i \frac{(O_i-E_i)^2}{E_i} \\ 连续性修正:\chi^2=\sum_i \frac{(|O_i-E_i|-0.5)^2}{E_i}
有3种用途:

  1. 拟合优度检验:检验给定数据是否服从某个分布。如上面正态性检验提到的kstest就是
  2. 变量独立性检验:检验2个变量间是否独立。如性别与看直播是否独立。
  3. 配对卡方:用不同方法作用同一对象,看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样本与正态分布比较

相关文章

网友评论

      本文标题:统计学之检验

      本文链接:https://www.haomeiwen.com/subject/suczmltx.html