重新研读fish千聊课06

作者: Bog5d | 来源:发表于2017-10-20 20:27 被阅读14次

    已经重新研读了6节课了,感觉fish的课程,真的有很多高质量内容,这种感觉就像,你希望去提高自己到厨艺,于是自己去搜集食谱啦,看视频啦。 但是,遇到一个朋友,本来就是大厨,他直接告诉你中国有多少菜系,每种菜系最精髓的菜是什么,更重要的是,他还告诉了你这些菜在哪个菜市场买,又好又便宜。
    简单来说,就是

    为我们省去了大量试错成本。

    这也是,我为什么要重新研读fish课程的原因,我觉得她的课,已经把最需要的统计学基础常识给端上来了,我也不用挖空心思想,我入门的话要学统计学的是哪些东西.所以,希望fish后面继续推这么高质量的课程哦。

    import numpy as np
    import scipy.stats
    

    一个样本的均值

    例1:某工厂的苯含量检测

    给出某钢铁厂20分空气样本的苯含量检测数据(单位ppm),判断该工厂空气是否达标(苯含量小于百万分之1,即 1ppm)。 (数据来自 Mendenhall所著的《统计学》)

    data = [0.21, 1.44, 2.54, 2.97, 0.00, 3.91, 2.24, 2.41, 4.50, 0.15,
            0.30, 0.36, 4.50, 5.03, 0.00, 2.89, 4.71, 0.85, 2.60, 1.26]
    
    print (data)
    
    [0.21, 1.44, 2.54, 2.97, 0.0, 3.91, 2.24, 2.41, 4.5, 0.15, 0.3, 0.36, 4.5, 5.03, 0.0, 2.89, 4.71, 0.85, 2.6, 1.26]
    

    原假设空气质量达标,即苯含量小于1ppm。那么,我需要计算95%的情况下,苯含量的均值是小于1ppm的,是这意思吗?

    #原假设就是≤1,备择假设假设就是>1.  
    #先求t吧
    mean = np.mean(data)
    n = len(data)
    mean,n
    
    (2.1435000000000004, 20)
    
    t_score = (mean - 1)/(np.std(data,ddof=1)/np.sqrt(n))
    t_score
    #? z这里在计算标准差时,为什么加入了一个ddof参数呢,这个参数是干嘛的呢?
    #错误记录: 1.分数线下方应该加上括号,我并没有加括号,所以计算顺序是错误的。
    
    2.9457560457212408
    
    t_critical = scipy.stats.t.isf(0.05,df=n-1)
    t_critical
    
    
    1.7291328115213678
    

    所以,用样本数据求出来的t_score和直接用标准t分布,带入阿尔法,求出来的t_critical相比较,还是tscore 大于t critical,那么落在了拒绝域中,拒绝原假设。 还可以直接求出p值哦。

    p_value = scipy.stats.t.sf(t_score,df=n-1)
    p_value
    
    0.0041496038528359043
    

    我的理解是当t值为2.945的时候,其对应的面积只有0.00419,比给定的阿尔法0.05还要小,那么肯定是在拒绝域内的啊。那么

    用公式直接求t 和p

    #scipy.stats.t.ttest(data,df=n-1)
    #错误记录: 1.直接用ttest,不需要t.ttest 2.test方法的全名是ttest_1samp(data,popmean) 我写作ttest就完了。3ttest()中的参数,一个是
    #一个是data,另一个是总体均值。  data是样本,popmean则是总体均值。  当我们假设是达标的时候,则默认总体均值是小于等于1的。
    scipy.stats.ttest_1samp(data,1)
    
    Ttest_1sampResult(statistic=2.9457560457212408, pvalue=0.0082992077056718086)
    

    只是这种计算采用的是双边验证,左右两边同样大的区域面积家还是那个来等于0.00829,所以除以二的话,就等于0.004149603852835904

    pvalue=0.0082992077056718086
    pvalue/2
    
    0.004149603852835904
    

    两个配对的样本的均值比较

    例2:水的金属含量

    饮用水中的金属会影响水的口感,如果浓度过高甚至会对健康产生危害。这里有10份饮用水,分别测量它们底部的水与表面水中的含锌的浓度。判断底部的水中锌的浓度是否和表面水的浓度一样?(数据来源 https://onlinecourses.science.psu.edu/stat500/node/51

    bottom = [0.430, 0.266, 0.567, 0.531, 0.707, 0.716, 0.651, 0.589, 0.469, 0.723]
    surface = [0.415, 0.238, 0.390, 0.410, 0.605, 0.609, 0.632, 0.523, 0.411, 0.612]
    scipy.stats.ttest_rel(bottom,surface)
    # 配对样本. 这可是只有在配对样本的前提下,才能实现哦。 也就是A样本中的两个参数,
    
    Ttest_relResult(statistic=4.8638127451351831, pvalue=0.00089111545782254793)
    

    其实到这一步,就已经可以得出结论了,因为我们通常会有一个置信水平也就是α。 当我们的α取值0.05的时候,p_value/2 = 0.0045,完全落在拒绝域中。
    当然,也可以通过t_critical来判断,下面就算一下t_critical吧

    t_critical = scipy.stats.t.isf(0.05/2,df=9)
    t_critical 
    
    2.262157162740992
    

    t_critical 是标准值,在这种情况下相当于是在x轴的值,如果样本的t值大于它的话,直接跑到右边的拒绝域中去了。

    两个独立的样本的均值比较

    例3 :自动打包机器

    某打包工厂,用机器来包装纸箱。给出新、老机器的打包时间数据(单位:秒),判断新机器是否比旧机器打包得更快?
    (数据来源 https://onlinecourses.science.psu.edu/stat500/node/50

    old = [42.7, 43.8, 42.5, 43.1, 44.0, 43.6, 43.3, 43.5, 41.7, 44.1]
    new = [42.1, 41.3, 42.4, 43.2, 41.8, 41.0, 41.8, 42.8, 42.3, 42.7]
    

    假设检验,第一步是先做出原假设和备择假设。 原假设就是新机器比老机器更快,那么新机器的均值应该小于老机器。 对了,为什么不能直接用两者的均值来比较呢?

    假设新机器更快,那就μold > μnew。
    备择假设则是: μold ≤ μnew

    mean_o = np.mean(old)
    mean_n = np.mean(new)
    mean_o>mean_n
    ## 我觉得已经可以判断出来,老机器比新机器慢了啊。
    
    True
    
    scipy.stats.ttest_ind(old,new)
    ## 两组数据的顺序会影响结果吗?
    
    
    
    Ttest_indResult(statistic=3.3972307061176026, pvalue=0.0032111425007745158)
    
    scipy.stats.ttest_ind(new,old)
    #两组数据的不同排序,只是影响正负的结果
    
    Ttest_indResult(statistic=-3.3972307061176026, pvalue=0.0032111425007745158)
    
    scipy.stats.t.ppf(0.05,df=len(old)+len(new)-2)
    
    -1.7340636066175359
    
    ##好吧,没有完全吃透。 关于独立的这个。
    

    计算机模拟之 bootstrap 方法

    某工厂的苯含量检测

    $ H_0 : \mu <= 1 $

    $ H_A : \mu > 1 $

    data = [0.21, 1.44, 2.54, 2.97, 0.00, 3.91, 2.24, 2.41, 4.50, 0.15,
            0.30, 0.36, 4.50, 5.03, 0.00, 2.89, 4.71, 0.85, 2.60, 1.26]
    
    def bootstrap_replicate_ld (data,func):
        return func(np.random.choice(data,size=len(data)))
                    #错误记录:1.random.choice的参数是(data,size=len(data) ),我是直接输入的len(data)
                    #错误记录2.少写了括号,原来要三层括号,我没有第三层的那个括号
            #这一步总体说,就死抽样出来秋均值。
    
    def draw_bs_reps(data, func, size=1):
        bs_replicates = np.empty(size)  # 初始一个空数组
        for i in range(size):   # 进行多次重新抽样
            bs_replicates[i] = bootstrap_replicate_1d(data, func)  
        return bs_replicates  # 返回多次抽样的检验统计量数组
    
    
    def bs_p(data,pop_stats,func,size=1):
        samp_stats = func(data)  # 求出样本的均值
        trans_data = data - samp_stats+pop_stats# 这已不是hi数据平移,??????可是为什么要做数据平移呢? 待会打印一下
        bs_rep = draw_bs_rep(trans_data,func,size) # 对新的样本进行抽样。
        p =np.sum(bs_rep> samp_stats)/size # 错误记录,是用抽样统计量大于元样本统计量的部分,我则是用的pop——stats。
        return p,trans_data
        
        
    
    bootstrap_pvalue_1samp(data, 1, np.mean, size=10000)
    
    (0.0011999999999999999,
    

    array([-0.9335, 0.2965, 1.3965, 1.8265, -1.1435, 2.7665, 1.0965,
    1.2665, 3.3565, -0.9935, -0.8435, -0.7835, 3.3565, 3.8865,
    -1.1435, 1.7465, 3.5665, -0.2935, 1.4565, 0.1165]))

    P值小于0.05, 拒绝原假设

    这次先做到这里吧。 再往下,大脑要爆啦

    
    

    疑问:

    1. bootstrap 为什么要设置平移数据呢?
    2. p值为什么是抽样的均值大于原样本均值的部分来除以总数量呢?

    相关文章

      网友评论

        本文标题:重新研读fish千聊课06

        本文链接:https://www.haomeiwen.com/subject/mvxbuxtx.html