前言
发现python里面假设检验的轮子并不多,自己就把统计中常用的几种分布都实现了一下,用的库如下
import pandas as pd
import math
import numpy as np
from scipy.stats import norm, t, chi2, f
检验均值
u检验
u检验又称z检验
理论
代码
def one_ucheck(data, mu,sigma,alpha=0.05,tail=0):
'''
:param data: 样本数据可以是list也有是DataFrame
:param mu: 原假设的均值
:param sigma: 分布的方差
:param alpha: 检验水平
:param tail: 0表示双边,-1表示拒绝域在左边,1表示拒绝域在右边
:return: 是否通过检验
'''
if type(data) != type(pd.DataFrame([])):
data=pd.DataFrame(data)
dataMean = data.mean()[0]
u = math.sqrt(data.count()) * (dataMean - mu) / sigma
flag = False
if tail == 0:
flag = abs(u) <= norm.ppf(1-alpha/2)
elif tail == -1:
flag = u >= norm.ppf(alpha)
else:
flag = u <= norm.ppf(1-alpha)
return flag
例题
问机器是否正常?
总体σ 已知, x ~ N(μ,0.0152 ) , μ 未知。 于是提出假设 H 0 : μ = μ0 = 0.5和H1 : μ ≠ 0.5
默认α = 0.05,这里传入的是DataFrame对象,也可直接传入list
结果为False未通过检验
t检验
理论
代码
def one_tcheck(data, mu,alpha=0.05,tail=0):
'''
:param data: 样本数据可以是list也有是DataFrame
:param mu: 原假设的均值
:param alpha: 检验水平
:param tail: 0表示双边,-1表示拒绝域在左边,1表示拒绝域在右边
:return: 是否通过检验
'''
if type(data) != type(pd.DataFrame([])):
data=pd.DataFrame(data)
dataMean = data.mean()[0]
n = data.count()[0]
sigma = n*data.var()[0]/(n-1)
T = math.sqrt(n) * (dataMean - mu) / sigma
flag = False
if tail == 0:
flag = abs(T) <= t.isf(alpha/2, n-1)
elif tail == -1:
flag = T >= t.isf(alpha, n-1)
else:
flag = T <= t.isf(alpha, n-1)
return flag
例题
默认α = 0.05,这里直接传入列list
结果为True通过检验
检验方差
理论
均值已知
均值未知
代码
def one_ccheck(data, mu, sigma, alpha=0.05, tail=0):
if type(data) != type(pd.DataFrame([])):
data = pd.DataFrame(data)
n = data.count()[0]
matrix = np.array(data)
if mu != None: # mu未知
Chi2 = sum((matrix - mu)**2) / sigma
else: # mu已知
dataMean = data.mean()[0]
Chi2 = sum((matrix - dataMean)**2)[0] / sigma
n = n-1
print(Chi2)
if tail == 0:
return Chi2 >= chi2.ppf(alpha/2, n) and Chi2 <= chi2.ppf(1-alpha/2, n)
elif tail == -1:
return Chi2 >= chi2.ppf(alpha, n)
else:
print(chi2.ppf(1 - alpha, n))
return Chi2 <= chi2.ppf(1-alpha, n)
例题
注意此题非双边检验,需要制定tail参数