统计学中各种检验以及python实现

1. T检验

T检验是假设检验的一种,又叫student t检验(Student’s t test),主要用于样本含量较小(例如n<30),总体标准差σ未知的正态分布资料。 
T检验用于检验两个总体的均值差异是否显著。

计算公式:

  t统计量:t=\frac{|\overline{X}-\mu_0|}{S_{\overline{X}}}=\frac{\bar{X}-\mu_0}{s/\sqrt{n}}

  自由度:v=n - 1

  适用条件:

  (1) 已知一个总体均数;

  (2) 可得到一个样本均数及该样本标准误;

  (3) 样本来自正态或近似正态总体。

t检验的分类

t检验分为单总体t检验和双总体t检验

单总体t检验

检验一个样本平均数与一个已知的总体平均数差异是否显著。 
适用条件: 
1.总体服从正态分布 
2.样本量小于30(当样本量大于30时,用Z统计量) 
统计量: 

t=x¯−μS/n−−√∼t(n−1)t=x¯−μS/n∼t(n−1)


x¯x¯——样本均值 
μμ——总体均值 
SS——样本标准差 
nn——样本容量 
例1就是单样本t检验的例子。

双总体t检验

检验两个样本各自所代表的总体的均值差异是否显著,包括独立样本t检验和配对样本t检验

独立样本t检验

检验两个独立样本所代表的总体均值差异是否显著。 
适用条件: 
1.两样本均来自于正态总体 
2.两样本相互独立 
3.满足方差齐性(两总体方差相等) 
统计量: 

t=x¯−y¯Sw1m+1n−−−−−−√∼t(m+n−2)t=x¯−y¯Sw1m+1n∼t(m+n−2)


其中 

Sw=1m+n+1[(m−1)S21+(n−1)S22]Sw=1m+n+1[(m−1)S12+(n−1)S22]


x¯x¯——第一个样本均值 
y¯y¯——第二个样本均值 
mm——第一个样本容量 
nn——第二个样本容量 
S21S12——第一个样本方差 
S22S22——第二个样本方差

配对样本t检验

检验两个配对样本所代表的总体均值差异是否显著。 
配对样本主要包含以下两种情形: 
1.同源配对,也就是同质的对象分别接受两种不同的处理。例如:为了验证某种记忆方法对改善儿童对词汇的记忆是否有效,先随机抽取40名学生,再随机分为两组。一组使用该训练方法,一组不使用,三个月后对这两组的学生进行词汇测验,得到数据。问该训练方法是否对提高词汇记忆量有效? 
2.自身配对 
2.1某组同质对象接受两种不同的处理。例如:某公司推广了一种新的促销方式,实施前和实施后分别统计了员工的业务量,得到数据。试问这种促销方式是否有效? 
适用条件: 
每对数据的差值必须服从正态分布 
统计量: 

t=xd¯Sd/n−−√t=xd¯Sd/n


两配对样本对应元素做差后形成的新样本 
xd¯xd¯——新样本均值 
SdSd——新样本标准差 
nn——新样本容量

python实现

使用scipy直接做假设检验

Scipy提供了两个方法解决双样本同方差的Student t-test问题: 
1. scipy.stats.ttest_ind 
2. scipy.stats.ttest_ind_from_stats 
第一个方法要求输入原始样本数据,第二个方法直接输入样本的描述统计量(均值,标准差,样本数)即可。那么这里我们直接使用第二方法。

import numpy as np from scipy import stats mean1 = 30.97 mean2 = 21.79 std1 = 26.7 std2 = 12.1 nobs1 = 10 nobs2 = 10 modified_std1 = np.sqrt(np.float32(nobs1)/np.float32(nobs1-1)) * std1 modified_std2 = np.sqrt(np.float32(nobs2)/np.float32(nobs2-1)) * std2 (statistic, pvalue) = stats.ttest_ind_from_stats(mean1=mean1, std1=modified_std1, nobs1=10, mean2=mean2, std2=modified_std2, nobs2=10) print "t statistic is: ", statistic print "pvalue is: ", pvalue

t statistic is:  0.939488657335
pvalue is:  0.359917216785

假设我们显著性水平α=0.05α=0.05,pvalue显著的大于0.05,所以我们不能拒绝原假设,也就是认为两种作物的产量没有显著差异。

配对样本的结果证明看

α小于0.05,说明有显著相关

Ttest_1sampResult(statistic=array([ 4.51858295]), pvalue=array([ 8.49191658e-05]))

from scipy import stats import numpy as np

生成50行x2列的数据

np.random.seed(7654567)  # 保证每次运行都会得到相同结果
# 均值为5,方差为10
rvs = stats.norm.rvs(loc=5, scale=10, size=(50,2))
  • 1
  • 2
  • 3

检验两列数的均值与1和2的差异是否显著

stats.ttest_1samp(rvs, [1, 2])
  • 1

返回结果:

Ttest_1sampResult(statistic=array([ 2.0801775 , 2.44893711]), pvalue=array([ 0.04276084, 0.01795186]))

分别显示两列数的t统计量和p值。由p值分别为0.042和0.018,当p值小于0.05时,认为差异显著,即第一列数的均值不等于1,第二列数的均值不等于2。


不拒绝原假设——均值等于5

stats.ttest_1samp(rvs, 5.0)
  • 1

Ttest_1sampResult(statistic=array([-0.68014479, -0.04323899]), pvalue=array([ 0.49961383, 0.96568674]))


拒绝原假设——均值不等于5

stats.ttest_1samp(rvs, 0.0)
  • 1

Ttest_1sampResult(statistic=array([ 2.77025808, 4.11038784]), pvalue=array([ 0.00789095, 0.00014999]))


第一列数均值等于5,第二列数均值不等于0

stats.ttest_1samp(rvs,[5.0,0.0])
  • 1

Ttest_1sampResult(statistic=array([-0.68014479, 4.11038784]), pvalue=array([ 4.99613833e-01, 1.49986458e-04]))


第一行数均值等于5,第二行数均值不等于0

#axis=0按列运算,axis=1按行运算
stats.ttest_1samp(rvs.T,[5.0,0.0],axis=1) 
  • 1
  • 2

Ttest_1sampResult(statistic=array([-0.68014479, 4.11038784]), pvalue=array([ 4.99613833e-01, 1.49986458e-04]))


将两列数据均值分别与5.0和0.0比较,得到4个t统计量和p值

stats.ttest_1samp(rvs,[[5.0],[0.0]])
  • 1

Ttest_1sampResult(statistic=array([[-0.68014479, -0.04323899], 
[ 2.77025808, 4.11038784]]), pvalue=array([[ 4.99613833e-01, 9.65686743e-01], 
[ 7.89094663e-03, 1.49986458e-04]]))

两独立样本t检验-ttest_ind

ttest_ind官方文档 
生成数据

np.random.seed(12345678)
#loc:平均值  scale:方差
rvs1 = stats.norm.rvs(loc=5,scale=10,size=500)  
rvs2 = stats.norm.rvs(loc=5,scale=10,size=500)
  • 1
  • 2
  • 3
  • 4

当两总体方差相等时,即具有“方差齐性”,可以直接检验 
不拒绝原假设——两总体均值相等

stats.ttest_ind(rvs1,rvs2)
  • 1

Ttest_indResult(statistic=0.26833823296238857, pvalue=0.78849443369565098)


当不确定两总体方差是否相等时,应先利用levene检验,检验两总体是否具有方差齐性。

stats.levene(rvs1, rvs2)
  • 1

LeveneResult(statistic=1.0117186648494396, pvalue=0.31473525853990908)

p值远大于0.05,认为两总体具有方差齐性。

如果两总体不具有方差齐性,需要将equal_val参数设定为“False”。


需注意的情况:

如果两总体具有方差齐性,错将equal_var设为False,p值变大

stats.ttest_ind(rvs1,rvs2, equal_var = False)
  • 1

Ttest_indResult(statistic=0.26833823296238857, pvalue=0.78849452749501059)


两总体方差不等时,若没有将equal_var参数设定为False,则函数会默认equal_var为True,这样会低估p值

rvs3 = stats.norm.rvs(loc=5, scale=20, size=500)
stats.ttest_ind(rvs1, rvs3, equal_var = False)
  • 1
  • 2

正确的p值 
Ttest_indResult(statistic=-0.46580283298287956, pvalue=0.64149646246568737)


stats.ttest_ind(rvs1, rvs3)
  • 1

被低估的p值 
Ttest_indResult(statistic=-0.46580283298287956, pvalue=0.64145827413435608)


当两样本数量不等时,equal_val的变化会导致t统计量变化 
rvs1:来自总体——均值5,方差10,样本数500 
rvs2:来自总体——均值5,方差20,样本数100 
两总体不具有方差齐性,应设定equal_var=False

rvs4 = stats.norm.rvs(loc=5, scale=20, size=100)
stats.ttest_ind(rvs1, rvs4)
  • 1
  • 2

错误的t统计量 
Ttest_indResult(statistic=-0.99882539442782847, pvalue=0.31828327091038783)


stats.ttest_ind(rvs1, rvs4, equal_var = False)
  • 1

正确的t统计量 
Ttest_indResult(statistic=-0.69712570584654354, pvalue=0.48716927725401871)


不同均值,不同方差,不同样本量的t检验 
错误的检验:未将equal_var设定为False

rvs5 = stats.norm.rvs(loc=8, scale=20, size=100)
stats.ttest_ind(rvs1, rvs5)
  • 1
  • 2

Ttest_indResult(statistic=-1.4679669854490669, pvalue=0.14263895620529113)


正确的检验:

stats.ttest_ind(rvs1, rvs5, equal_var = False)
  • 1

Ttest_indResult(statistic=-0.94365973617133081, pvalue=0.34744170334794089)


配对样本t检验

ttest_rel官方文档

np.random.seed(12345678)
  • 1

不拒绝原假设,认为rvs1 与 rvs2 所代表的总体均值相等

rvs1 = stats.norm.rvs(loc=5,scale=10,size=500)
rvs2 = (stats.norm.rvs(loc=5,scale=10,size=500) + stats.norm.rvs(scale=0.2,size=500))
stats.ttest_rel(rvs1,rvs2)
  • 1
  • 2
  • 3

Ttest_relResult(statistic=0.24101764965300979, pvalue=0.80964043445811551)


拒绝原假设,认为rvs1 与 rvs3所代表的总体均值不相等

rvs3 = (stats.norm.rvs(loc=8,scale=10,size=500) + stats.norm.rvs(scale=0.2,size=500))
stats.ttest_rel(rvs1,rvs3)
  • 1
  • 2

Ttest_relResult(statistic=-3.9995108708727924, pvalue=7.3082402191661285e-05)

2.卡方检验

3.F检验

猜你喜欢

转载自blog.csdn.net/bxy5511/article/details/81508262