当总体符合正态分布, σ 2 σ^2 σ2未知,且可供支配的样本很小(n≤30)时,样本符合t分布。【因为仅从样本无法精确反映总体方差的真实值】
t分布形状取决于样本大小,当样本很大时,t分布外形接近正态分布,当样本很小时,曲线较为扁平。t分布只有一个参数→自由度v=n-1.
标准分 T = ( x − μ ) / ( s / s q r t ( n ) ) T=(x-μ)/(s/sqrt(n)) T=(x−μ)/(s/sqrt(n))
统计分析常采用抽样研究的方法,那么抽取的2个样本是否来自相同的总体?或者抽取的2个样本能否说明其总体存在差异?于是我们把总体的研究问题转化成样本的均值比较问题。
普遍存在三种应用场景
单样本t检验是样本均值与总体均值的比较问题。其中总体服从正态分布,从正态总体中抽样得到n个个体组成抽样样本,计算抽样样本均值和标准差,判断总体均值与抽样样本均值是否相同。
针对这个问题:
from scipy.stats import ttest_1samp
import numpy as np
print("Null Hypothesis:μ=μ0=30,α=0.05")
ages = [25,36,15,40,28,31,32,30,29,28,27,33,35]
t = (np.mean(ages)-30)/(np.std(ages,ddof=1)/np.sqrt(len(ages)))
ttest,pval = ttest_1samp(ages,30)
print(t,ttest)
if pval < 0.05:
print("Reject the Null Hypothesis.")
else:
print("Accept the Null Hypothesis.")
配对样本主要是同一实验前后效果的比较,或者同一样品用两种方法检验结果的比较。可以把配对样本的差作为变量,差值的总体均数为0,服从正态分布
from scipy.stats import ttest_rel
s1 = [620.16,866.50,641.22,812.91,738.96,899.38,760.78,694.95,749.92,793.94]
s2 = [958.47,838.42,788.90,815.20,783.17,910.92,758.49,870.80,826.26,805.48]
print("Null Hypothesis:mean(s1)=mean(s2),α=0.05")
ttest,pval = ttest_rel(s1,s2)
if pval < 0.05:
print("Reject the Null Hypothesis.")
else:
print("Accept the Null Hypothesis.")
对于第三个问题独立样本t检验,比较两个样本所代表的两个总体均值是否存在显著差异。除了要求样本来自正态分布,还要求两个样本的总体方差相等“方差齐性”。
from scipy.stats import ttest_ind,norm,f
import numpy as np
def ftest(s1,s2):
'''F检验样本总体方差是否相等'''
print("Null Hypothesis:var(s1)=var(s2),α=0.05")
F = np.var(s1)/np.var(s2)
v1 = len(s1) - 1
v2 = len(s2) - 1
p_val = 1 - 2*abs(0.5-f.cdf(F,v1,v2))
print(p_val)
if p_val < 0.05:
print("Reject the Null Hypothesis.")
equal_var=False
else:
print("Accept the Null Hypothesis.")
equal_var=True
return equal_var
def ttest_ind_fun(s1,s2):
'''t检验独立样本所代表的两个总体均值是否存在差异'''
equal_var = ftest(s1,s2)
print("Null Hypothesis:mean(s1)=mean(s2),α=0.05")
ttest,pval = ttest_ind(s1,s2,equal_var=equal_var)
if pval < 0.05:
print("Reject the Null Hypothesis.")
else:
print("Accept the Null Hypothesis.")
return pval
np.random.seed(42)
s1 = norm.rvs(loc=1,scale=1.0,size=20)
s2 = norm.rvs(loc=1.5,scale=0.5,size=20)
s3 = norm.rvs(loc=1.5,scale=0.5,size=25)
ttest_ind_fun(s1,s2)
ttest_ind_fun(s2,s3)
t检验
t检验2
《python科学计算第二版》
使用Python进行机器学习的假设检验