import scipy.stats
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%config InlineBackend.figure_format = 'retina'
# 我在这里面就有两个错误啦,"pyplot"少写了一个“p”,".figure"少加了个点
画一个标准正态分布
standard_norm = scipy.stats.norm
x = np.arange(-4,4,0.00001)
plt.plot(x,standard_norm.pdf(x))
plt.show()
##才发现自己小错误不断啊。 英文单词老输入错误、
output_2_0.png
t分布
t_dist = scipy.stats.t
plt.plot(x,standard_norm.pdf(x),label='standard norm')
x = np.arange(-4,4,0.01)
plt.plot(x,t_dist.pdf(x,df=0.1),label='t distribution')
plt.legend()
plt.show()
##为什么legend放前面就显示label呢? 反正我知道,legend和label有关系
##t分布跟钟型曲线很接近,这意味着什么呢? 可以用来干嘛呢,这个性质。
output_4_0.png
置信区间
$$ \bar{x} - |z_{\alpha/2}|\frac{\sigma}{\sqrt{n}} < \mu < \bar{x} + |z_{\alpha/2}|\frac{\sigma}{\sqrt{n}}$$
house = pd.read_csv("house_size.csv",header =None)
house.head()
house_size= house.iloc[:,0]
print(list(house_size))
[314, 119, 217, 326, 342, 318, 130, 465, 383, 396, 507, 283, 250, 326, 279, 363, 229, 303, 367, 246, 247, 262, 209, 294, 112, 249, 354, 355, 272, 277, 377, 411, 223, 232, 445, 333, 336, 349, 611, 516, 233, 275, 395, 241, 127, 228, 305, 321, 235, 226, 288, 503, 305, 280, 318, 281, 227, 279, 171, 290, 336, 284, 380, 314, 316, 476, 309, 293, 160, 300, 319, 396, 275, 212, 344, 305, 280, 331, 359, 283, 136, 322, 359, 202, 188, 187, 457, 340, 262, 288, 318, 381, 289, 205, 373, 200, 320, 213, 261, 357]
有100个房屋面积的样本,均值300.85平
米,并已知总体标准差为86平米,求置信区间
pop_std = 86
sample_mean =house_size.mean()
sample_mean
300.85
相当于求到了均值$$ \bar{x}$$
sample_size =len(house_size)
sample_size
100
这一步相当于求到了样本数量 “n”,并且
$${\sigma}$$
是知道的,86。
此时,就只差z和
$$|z_{\alpha/2}|$$
z_score =scipy.stats.norm.isf(0.025)
z_score
## z score是一个固定值吗?
1.9599639845400545
##接下来计算ME
margin_error = z_score*pop_std/np.sqrt(sample_size)
margin_error
16.855690267044469
lower_limit =sample_mean-margin_error
upper_limit = sample_mean+margin_error
print('95%% 置信区间下总体均值范围为: ( %.1f, %.1f)' % (lower_limit, upper_limit))
95% 置信区间下总体均值范围为: ( 284.0, 317.7)
定义置信区间的计算函数
def ci_z(data,pop_std,confidence):
sample_mean =np.mean(data)
sample_size =len(data)
alpha = (1-confidence)/2
z_score =scipy.stats.norm.isf(alpha)
ME =z_score*pop_std/np.sqrt(sample_size)
lower_limit =sample_mean-ME
upper_limit =sample_mean+ME
return(lower_limit,upper_limit)
ci_z(house_size,pop_std,0.9)
(286.70425880821733, 314.99574119178271)
ci_z(house_size,pop_std,0.95)
(283.99430973295557, 317.70569026704447)
ci_z(house_size,pop_std,0.85)
(288.47002934992929, 313.22997065007075)
ci_z(house_size,pop_std,0.99)
(278.69786798947951, 323.00213201052054)
ci_z(house_size,pop_std,1)
(-inf, inf)
#### 函数太有用了吧,哈哈哈哈。
关于bootstrap的信息
如果进行方差分析,首先就要求正态分布,如果不是正态分布,就要有补救措施,这个补救措施就是bootstrap。
np.random.choice(house_size,size=10)# 在总体数据中随机抽样10个
array([275, 383, 318, 381, 290, 209, 314, 303, 340, 381], dtype=int64)
def bootstrap_mean(data):
## 看来参数,和变量都是在括号中。
return np.mean(np.random.choice(data,size=len(data)))
def draw_bootstrap(data,times):#总觉得这个等于1不应该设置好,而是应该空起啊,这是个变量参数的嘛
bs_mean =np.empty(times)
for i in range (times):
bs_mean[i]=bootstrap_mean(data)
return bs_meaniopop
bs_mean =draw_bootstrap(house_size,10000)
plt.hist(bs_mean, bins=50, normed=True, rwidth=0.9)
plt.show()
output_29_0.png
np.percentile(bs_mean,[2.5,97.5])
array([ 283.7795 , 318.56025])
###这种方式也太厉害了吧。
作业
用t分布求上述置信区间
$$ \bar{x} - |t_{\alpha/2}|\frac{s}{\sqrt{n}} < \mu < \bar{x} + |t_{\alpha/2}|\frac{s}{\sqrt{n}}$$
#借用前面已经有的数据,比如sample_mean,sample_size这时候自己只需要计算出,t——score,s(样本标准差),就可以啦。
t_score =scipy.stats.t.isf(0.025,df=sample_size-1)
t_score
1.9842169515086832
sample_std=np.std(house_size)
sample_std
88.51230140494599
ME_t=t_score*sample_std/np.sqrt(sample_size)
ME_t
17.562760886473967
t_max = sample_mean+ME_t
t_min =sample_mean-ME_t
print('95%置信区间下,总体均值范围:',(t_min,t_max))
95%置信区间下,总体均值范围: (283.28723911352608, 318.41276088647396)
网友评论