参考资料:用python动手学统计学
1、导入库
import numpy as np
import pandas as pd
import scipy as sp
from scipy import statsfrom matplotlib import pyplot as plt
import seaborn as sns
2、设置总体
本次研究总体是均值为4、标准差为0.8的正态总体。
pop=stats.norm(loc=4,scale=0.8) # stats.norm()表示正态分布,其中loc参数表示均值,scale参数表示标准差
3、样本均值分布
这里需要明确:一次抽样完成,只能获得一个样本(无论样本容量是10还是100,样本都是一个),从而可以获得这个样本的均值。如果试验或抽样重复3次,则可以获得3个样本,对应有3个样本均值。
现实中无法帆布进行条件完全相同的抽样,但借助程序模拟可以轻松实验。在模拟的过程中,也可以研究样本的统计量的分布情况。
3.1 现在模拟抽样10000次,将会获得10000个样本均值。具体如下:
# 专本一个大小为10000的数组来存放样本均值
sample_mean_array=np.zeros(10000)
# 设置随机种子用于复现统计结果
np.random.seed(1)
# 利用for循环对总体进行抽样,设置样本容量为10,抽取一万个样本并存储样本均值(注意样本和样本容量的区别)
for i in range(0,10000):# 对样本进行抽样sample=pop.rvs(size=10)# 计算样本均值并存至smple_mean_array中sample_mean_array[i]=np.mean(sample)
上段代码中,注意pop.rvs(size=10)和stats.norm.rvs(loc=4,scale=0.8,size=10)是等价的。
stats.norm.rvs()的用法参考:python统计分析——生成正态分布随机数-CSDN博客
3.2 检验样本均值的均值和标准差
我们知道根据正态分布的样本均值服从均值为μ,标准差为σ/sqrt(n)的正态分布。
# 计算样本均值的均值和样本均值的标准差
print('样本均值的均值实际值',np.mean(sample_mean_array))
print('样本均值的均值理论值','4')
print('样本均值的标准差实际值',np.std(sample_mean_array,ddof=1))
print('样本均值的标准差理论值',0.8/np.sqrt(10))
结果如下:
可以看到样本均值分布的实际值与理论值非常接近,随着样本量,以及抽样次数的增加,实际值会无限接近于理论值。
4、绘制样本均值分布的直方图
sns.set()
# 绘制直方图,并显示核密度曲线
sns.histplot(sample_mean_array,kde=True)
可以看到直方图和核密度曲线都十分趋近于正态分布。
5、验证样本容量与样本均值分布间的关系
5.1 设置样本容量从10变化至100010
# 准备公差是100,范围是10-100010的样本容量
size_array=np.arange(start=10,stop=100100,step=100)
# 准备存放样本均值的容器
sample_mean_array_size=np.zeros(len(size_array))
5.2 利用程序模拟,在改变样本容量的同时反复计算样本均值。
# 设置随机种子,确保结果的可复现
np.random.seed(1)
# 按不同的样本容量进行抽样,并将样本均值存至sample_mean_array_size
for i in range(0,len(size_array)):sample=pop.rvs(size=size_array[i])sample_mean_array_size[i]=np.mean(sample)
5.3 作图显示样本容量与样本均值之间的关系
plt.plot(size_array,sample_mean_array_size)
plt.xlabel('sample size')
plt.ylabel('sample mean')
由图可知样本容量越大,样本均值就越接近总体均值4。