重新研读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

    已经重新研读了6节课了,感觉fish的课程,真的有很多高质量内容,这种感觉就像,你希望去提高自己到厨艺,于是自己去...

  • 重新研读fish千聊课05

  • 重新研读fish千聊课05

    中心极限定理 & 区间估计 matplotlib inline这句,可以不用plt.show出图 ​ 标准正态分布...

  • 重新研读fish千聊课04

    计算机模拟 生成随机数 疑惑: 为什么要有种子呢? 小疑惑,random()生成的随机数,是默认为0-1之间的吗?...

  • 重新研读fish千聊课07

    这次开始之前,我自己有必要先分析一下思路,再开始研读,到目前为止,我研读这些东西,都没有跟实际工作生活像结合起来,...

  • fish千聊课重新研读03

    本课主要是统计学常识。 很多概念都值得背诵下来。 描述统计量 集中趋势均值中位数众数 离散程度全距四分位距方差、...

  • 重新研读fish千聊课代码02

    自己每次研读完代码,就是直接把notebook文件copy到简书,使得排版特别杂乱,而且自己散乱的个人感悟,和代码...

  • 重新研读fish千聊课07 (上)

    这次开始之前,我自己有必要先分析一下思路,再开始研读,到目前为止,我研读这些东西,都没有跟实际工作生活像结合起来,...

  • 重新研读fish课代码 01

    前言: fish在千聊的课已经收尾了。 她的课备得特别好,尤其是代码的注释做得特别好。 是很好的学习材料,我决...

  • 微课平谷的思考

    今天市场部开微课,我很久没在千聊开课了,这次重新来思考怎么做好这次课。在千聊看了下,现在千聊也着重自己在开亲子微课...

网友评论

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

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