t分布
当总体符合正态分布,
σ
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))
t检验
统计分析常采用抽样研究的方法,那么抽取的2个样本是否来自相同的总体?或者抽取的2个样本能否说明其总体存在差异?于是我们把总体的研究问题转化成样本的均值比较问题。
普遍存在三种应用场景
- 单样本t检验
- 配对样本t检验
- 独立样本t检验
单样本t检验
单样本t检验是样本均值与总体均值的比较问题。其中总体服从正态分布,从正态总体中抽样得到n个个体组成抽样样本,计算抽样样本均值和标准差,判断总体均值与抽样样本均值是否相同。
针对这个问题:
- 首先建立假设,确定检验水准
H0:μ=μ0 H1:μ≠μ0 α=0.05 - 然后选择检验方法为t检验,计算统计量t
t = ∣ x − μ ∣ / ( s / s q r t ( n ) ) t=|x-μ|/(s/sqrt(n)) t=∣x−μ∣/(s/sqrt(n))
其中x为样本均值,μ为总体均值,n为样本量,s为样本标准差。 - 自由度v=n-1,查t表得到对应的 t α , v t_{\alpha,v} tα,v值,确定p值,按照α水准,做出推论。
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.")
配对样本t检验
配对样本主要是同一实验前后效果的比较,或者同一样品用两种方法检验结果的比较。可以把配对样本的差作为变量,差值的总体均数为0,服从正态分布
- 首先建立假设:两种处理效果相同,样本差值均值=0
- 然后选择检验方法为t检验,类似上个问题的流程完成检验做出推论。
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检验
对于第三个问题独立样本t检验,比较两个样本所代表的两个总体均值是否存在显著差异。除了要求样本来自正态分布,还要求两个样本的总体方差相等“方差齐性”。
- 首先F检验样本总体方差相等
H0:两总体方差相等,H1:两总体方差不相等 α=0.1
选择F检验方法,计算统计量
F = s 1 2 / s 2 2 【 F > 1 】 F=s_1^2/s_2^2【F>1】 F=s12/s22【F>1】
由自由度v=n-1查表得到 F α , ( v 1 , v 2 ) F_{\alpha,(v_1,v_2)} Fα,(v1,v2),确定P值做出方差齐性推论; - 在总体方差齐性条件下,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)
《python科学计算第二版》
使用Python进行机器学习的假设检验