版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiaoyangdetian/article/details/82884217
应用场景:美国联邦贸易委员会(FTC)定期设计统计调查,用以检验制造商的说明。例如:大号听装Hilltop咖啡的标签上标明装有3磅咖啡,FTC知道
HillTop的生产线不可能精确的在每罐中放入3磅咖啡,甚至无法保证所有听装咖啡重量的总体均值为3磅/听。当然,只要听装总体重量的均值至少为3磅/听
消费者的权益将得到保障
假设检验-p临界值法:
第一步,为检验提供原假设和备择假设:如果罐内装入咖啡重量的总体均值至少为3磅/听,那么Hilltop遵守了产品的承诺。
原假设:H: u >= 3 备择假设:H: u < 3 我们设定:使得当u = 3,犯第一类错误的概率为0.1
import numpy as np
import scipy.stats
def DataBox():
n = 10000
root_means = np.random.randint(low=29.28, high=32.21, size=n)
# 生成50组咖啡,每组500瓶,50组的数据组成为咖啡的总体,服从正态分布,且均值在 29 ~ 33 之间的数值
coffe_all = list([]) # 生成的咖啡总体,数据服从正态分布
for i in range(n):
group_coffe = np.random.normal(root_means[i], 0.1, 3)
group_coffe = group_coffe.tolist()
coffe_all = coffe_all + group_coffe
coffe_all = np.array(coffe_all)
print('生成的咖啡总体:', coffe_all.shape)
return coffe_all
def ChoiceWork(data_root):
n = 4600 # 进行抽样4600次,每组30瓶咖啡
choice_data = list([])
for i in range(n):
one_data = np.random.choice(data_root, 30)
choice_data.append(one_data)
choice_data = np.array(choice_data)
print('抽取的20个样本数值:', choice_data.shape)
return choice_data
def AnalyzeWork(data_root, choice_data):
n = 4600 # 样本容量
u0 = 30 # 因为我们要检验的是咖啡重量总体均值是否大于等于 3磅/瓶, 这里把数据放大了10倍,因此设置 u0 = 30
mean_all = np.mean(data_root) # 先看下总体的均值:30.00020560461706
print('mean_all=', mean_all)
result_s = np.std(data_root, ddof=1) # 咖啡总体的标准差
# 注:这里的总体标准差,在遇到的实际问题中一般不知道,可以通过经验值或者以往的数据值,设置一个值作为总体的标准差
print('总体的标准差=', result_s) # 0.8192319880925505
data_mean = np.mean(choice_data, axis=1) # 每个样本的均值
print('每个样本的均值=', data_mean)
u = np.mean(data_mean) # 抽样分布的均值
print('抽样分布的均值u=', u) # u= 29.99837011304956
std_samples = result_s / (np.sqrt(n)) # 抽样分布的标准差
# 抽样分布的标准差 = 总体的标准差 / 根号下样本容量的值
print('抽样分布的标准差=', std_samples) # 0.012078916686903104
z = (u - u0) # 抽样分布的 Z 值
z = z / std_samples
# z = (样本抽样分布的均值 - 假设中的假定值u0) / 样本抽样分布的标准差
print('抽样分布的 Z 值=', z) # -0.13493651729603287,这个值表示,预测总体均值 = u0 - 0.012 * 0.13 = 30 - 0.00156 = 29.9984
# z值的下侧面积,即概率值
p = scipy.stats.norm.cdf(u0, u, std_samples)
print('下侧面积,累积该路的值=', p) # 下侧面积,概率密度函数的值= 0.5536689665264356
a = 0
if p > 0.5:
a = p - 0.5 # 因为如果 p > 0.5,那么30这个值位于y轴的右边,因此要减去左半边0.5的面积
else:
a = 0.5 - p # 因为p < 0.5, 那么30这个值位于y轴的左边,越往左越小,要想大于30这个值,应该在30这个点的右边,y轴左边,所以0.5 - p
print('显著性水平: a = ', a) # p = 0.05
# 这里求得的是通过4600个样本的统计值,可以预测总体的均值为30的累积概率为0.55,总体均值大于30的概率为1 - p = 0.45,比30小的概率为0.55
# 则:犯第一类错误,即原假设总体均值大于30为真,而我们拒绝了原假设的概率为0.05,即犯第一类错误的概率为0.05
# 我们预先设定的显著性水平为a = 0.1,而现在为0.05, 小于设定的显著性水平 a = 0.1,因此我们拒绝原假设,认为咖啡的含量是不合理的
return
def WorkSpace():
coffe_all = DataBox()
choice_data = ChoiceWork(coffe_all)
AnalyzeWork(coffe_all, choice_data)
return
WorkSpace()