已经重新研读了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, 拒绝原假设
这次先做到这里吧。 再往下,大脑要爆啦
疑问:
- bootstrap 为什么要设置平移数据呢?
- p值为什么是抽样的均值大于原样本均值的部分来除以总数量呢?
网友评论