前言:
目前 假设检验 主要 讨论的服从正态分布的对象
均值 和方差的情况。
分为 单个总体 和 两个总体的情况
例子 来自 《概率论与数理统计》第八章
目录:
一 单个总体方差的情况
二 两个总体的情况
三 代码 以及 例子
一 单个总体方差的情况
单个总体 均值 未知
1.1 原假设假设:
右边检验
左边检验
双边检验
1.2 统计量
应用见例8
二 两个总体的情况
来自总体的样本
来自总体的样本
样本方差,且总体均值,方差未知
则统计量为
见例9
三 例子
# -*- coding: utf-8 -*-
"""
Created on Fri Aug 6 17:37:24 2021
@author: chengxf2
假设检验
"""
import numpy as np
from scipy.stats import chi2 # 卡方分布
from scipy.stats import norm
from scipy.stats import t
from scipy.stats import f
import matplotlib.pyplot as plt
class hypothesis :
def Draw(self):
fig, ax = plt.subplots(1, 1)
x = np.linspace(norm.ppf(0.01), norm.ppf(0.99), 100)
ax.plot(x, norm.pdf(x), 'r-', lw=5, alpha=0.6, label='norm pdf')
'''
随机变量服从正太分布,方差均值已知情况
Args
H0 假设样本均值和总体无偏差
已知参数:
总体均值,总体方差,
样本均值,样本个数
return
样本均值和总体均值的拟合情况
'''
def example_1(self):
u = 0.5
sigma = 0.015
alpha = 0.05
x = [0.497, 0.506, 0.518, 0.524, 0.498, 0.511, 0.520, 0.515, 0.512]
x_bar = np.mean(x)
n = len(x)
print("\n step1 H0 假设样本均值和总体无偏差")
z = (x_bar-u)/(sigma/np.sqrt(n))
print("\n step2 统计量 %5.2f"%z,"\t 样本个数 ",n)
w = norm.ppf(alpha/2) #
w1 = norm.ppf(1-alpha/2)
print("\n step3 : 拒绝区域 [-, %5.2f] [ %5.2f ,+]"%(w,w1))
if z> w and z<w1:
print("\n step4: 结论: 假设H0 成立")
else:
print("\n step4: 结论 假设H1 成立")
'''
右边检验:
Args
牛奶的例子
return
'''
def example_2(self):
#已知条件
u = -0.545 #总体均值
sigma = 0.008 #总体方差
n = 5 #样本个数
x_bar = -0.535 #样本均值
alpha = 0.05 #置信度
print("\n step1 H0 牛奶无掺水 u<u0 ")
z = (x_bar-u)/(sigma/np.sqrt(n))
print("\n step2 统计量 %5.2f"%z,"\t 样本个数 ",n)
w = norm.ppf(1-alpha)
print("\n step3 : 拒绝区域 [ %5.2f ,+]"%w)
if z>w:
print("\n step1 4 拒绝H0 牛奶掺水 ")
else:
print("\n step1 4 接受H0 牛奶无掺水 ")
'''
总体服从正态分布,均值方差未知,样本均值,方差已知
Args
样本的均值
return
'''
def example_3(self):
#已知条件
u = -0.545 #总体均值
sigma = 0.008 #总体方差
n = 5 #样本个数
x_bar = -0.535 #样本均值
alpha = 0.05 #置信度
print("\n step1 H0 牛奶无掺水 u<u0 ")
z = (x_bar-u)/(sigma/np.sqrt(n))
print("\n step2 统计量 %5.2f"%z,"\t 样本个数 ",n)
w = norm.ppf(1-alpha)
print("\n step3 : 拒绝区域 [ %5.2f ,+]"%w)
if z>w:
print("\n step1 4 拒绝H0 牛奶掺水 ")
else:
print("\n step1 4 接受H0 牛奶无掺水 ")
'''
原件寿命的例子,右边检验
单个总体服从标准正态分布,方差,均值未知
样本均值,方差已知,统计量服从t分布
'''
def example_4(self):
X = np.array([159, 280, 101, 212, 224, 379, 179 ,264,
222, 362, 168, 250, 149, 260, 485, 170 ])
alpha = 0.05
x_bar = np.mean(X)
s = np.std(X,ddof=1)#样本差,必须使ddof=1:
n = len(X)
z =(x_bar-225)/(s/np.sqrt(n))
print("\n step2: 统计量 %5.2f 样本方差 %5.2f"%(z,s))
w = t.ppf(1-alpha,df=n-1)
print("\n step3 : 拒绝区域 [ %5.2f ,+]"%w)
if z>w:
print("\n step1 4 拒绝H0 寿命大于225h ")
else:
print("\n step1 4 接受H0 寿命小于等于225h ")
'''
两个正态分布差值的检验,方差相等符合t分布。如果方差不等,但是已知,符合正太分布
测定冰的例子,右边检验
Args
方差相等
样本方差,均值已知
跟例题结果有点偏差是因为 小数点精度不一致导致的。
'''
def example_5(self):
x_A = np.array([79.98, 80.04, 80.02, 80.04, 80.03, 80.03, 80.04,
79.97, 80.05, 80.03, 80.02, 80.00, 80.02])
x_B = np.array([80.02, 79.94, 79.98, 79.97, 79.97, 80.03, 79.95, 79.97])
x_barA = np.mean(x_A)
x_barB = np.mean(x_B)
print("\n xa %5.2f xb %5.2f"%(x_barA,x_barB))
x_bar = x_barA-x_barB
n1 = len(x_A)
n2 = len(x_B)
sa = np.std(x_A,ddof=1)
sb = np.std(x_B,ddof=1)
saa = np.power(sa,2)
sbb = np.power(sb,2)
s = (n1-1)*saa+(n2-1)*sbb
print("\n sa %8.7f sb: %8.7f"%(sa,sb))
print("\n n1 %d n2 %d"%(n1,n2))
sww= s/(n1+n2-2)
#sww = 0.0007178
print("\n sww %8.7f "%sww)
z = (x_bar)/(np.sqrt(sww)*np.sqrt(1/n1+1/n2))
print("\n step2: 统计量: %5.3f "%z)
df = n1+n2-2
alpha = 0.05 #置信度
w = t.ppf(1-alpha,df)
print("\n step3 : 拒绝区域 [ %5.3f ,+]"%w)
if z>w:
print("\n step1 4 拒绝H0 方法A 比方法B测得的融化热要大 ")
else:
print("\n step1 4 接受H0 方法A 测得的温度小于等于方法B ")
'''
成对数据的检验,逐对比较法, t 分布,双边检验
Args
在同样的方法下得到成对数的观测值
其差值假设服从正太分布
样本的均值,方差已知
'''
def example_6(self):
x = np.array([0.20, 0.30, 0.40, 0.50, 0.60, 0.70, 0.80, 0.90, 1.00])
y = np.array([0.10, 0.21, 0.52, 0.32, 0.78, 0.59, 0.68, 0.77, 0.89])
d = x-y
n = len(d)
x_bar = np.mean(d)
sd = np.std(d, ddof=1)
z = x_bar/(sd/np.sqrt(n))
print("\n 统计量 %5.3f"%z)
alpha = 0.01
df = n-1
w = t.ppf(alpha/2, df)
print("\n step3 : 拒绝区域 [ %5.3f ,+]"%w)
if np.abs(z)>np.abs(w):
print("\n step1 4 拒绝H0 两台仪器测量有差异 ")
else:
print("\n step1 4 接受H0 两台仪器测量无差异 ")
'''
成对数据的检验,逐对比较法, t 分布,左边检验
Args
在同样的方法下得到成对数的观测值
其差值假设服从正太分布
样本的均值,方差已知
'''
def example_7(self):
x = np.array([0.30, 0.23, 0.41, 0.53, 0.24, 0.36, 0.38, 0.51])
y = np.array([0.43, 0.32, 0.58, 0.46, 0.27, 0.41, 0.38, 0.61])
d = x-y
n = len(d)
x_bar = np.mean(d)
sd = np.std(d, ddof=1)
z = x_bar/(sd/np.sqrt(n))
print("\n 统计量 %5.3f"%z)
alpha = 0.05
df = n-1
w = t.ppf(alpha, df)
print("\n step3 : 拒绝区域 [-, %5.3f]"%w)
if z<w:
print("\n step1 4 拒绝H0 红光反应时间小于绿光 ")
else:
print("\n step1 4 接受H0 红绿光反应的时间相等 ")
'''
单个总体情况
样本服从标准正太分布,均值未知
Args
统计量服从卡方分布
'''
def example_8(self):
sigma = 5000
n = 26
alpha = 0.02
s= 9200
z = (n-1)*s/sigma
print("\n 统计量 %5.3f"%z)
df = n-1
wLeft = chi2.ppf(alpha/2,df)
wRight = chi2.ppf(1-alpha/2,df)
print("\n step3 : 拒绝区域 [-, %5.3f] [%5.3f +]"%(wLeft,wRight))
if z<wLeft or z>wRight:
print("\n 拒绝H0 有显著的波动")
else:
print("\n 接受H0 无显著差异")
'''
单个总体情况
样本服从标准正太分布,均值未知
Args
统计量服从卡方分布
'''
def example_9(self):
n1 = 13
n2 = 8
alpha = 0.01
s1 = 0.024**2
s2 = 0.031**2
z= s1/s2
print("\n 统计量 %5.3f"%z)
df1 = n1-1
df2 = n2-1
wLeft = f.ppf(alpha/2,df1,df2)
wRight = f.ppf(1-alpha/2,df1,df2)
print("\n step3 : 拒绝区域 [-, %5.3f] [%5.3f +]"%(wLeft,wRight))
if z<wLeft or z>wRight:
print("\n 拒绝H0 有显著的波动")
else:
print("\n 接受H0 无显著差异")
def __init__(self):
pass
if __name__ =="__main__":
hy =hypothesis()
hy.example_9()