假设检验---p临界值法

版权声明:本文为博主原创文章,未经博主允许不得转载。 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()
 

猜你喜欢

转载自blog.csdn.net/jiaoyangdetian/article/details/82884217