用python动手学统计学_3-5样本统计量的性质

本文通过Python探讨了统计学中的样本均值、样本分布、标准误差等概念。使用numpy和scipy库进行多次模拟实验,证明了样本容量增大时,样本均值更接近总体均值,并且样本均值的标准差减小,符合大数定律。此外,还讨论了无偏估计和一致性在参数估计中的重要性,并展示了中心极限定理的应用。
摘要由CSDN通过智能技术生成

样本统计量的性质

3-5-1整洁数据

试验可以在完全相同地条件下进行多次,这叫重复试验
在能够重复试验的前提下进行重复进行试验的次数叫作试验次数

3-5-2样本分布

样本分布是样本的统计量所服从的概率分布
样本分布就是反复进行相同调查得到的结果。

3-5-3、导入所需要的库

# 用于数值计算的库
import numpy as np
import pandas as pd
import scipy as sp
from scipy import stats

# 用于绘图的库
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()

# 设置浮点数打印精度
%precision 3
# 在 Jupyter Notebook 里显示图形
%matplotlib inline
# 总体服从均值为 4 标准差为 0.8 的正态分布
population = stats.norm(loc = 4, scale = 0.8)

3-5-4多次计算样本均值

把试验次数定为一万次,计算1万个样本的均值。

# 存放均值的容器
sample_mean_array = np.zeros(10000)
# 抽取 10 个数据并计算均值, 此操作重复 10,000 次
np.random.seed(1)
#随机种子
for i in range(0, 10000):
	#population.rvs()和stats.norm.rvs(loc=4,scale=0.8,size = 10)
	#rvs:产生服从指定分布的随机数
    sample = population.rvs(size = 10)
    sample_mean_array[i] = sp.mean(sample)

均值如下:

sample_mean_array
# array([3.922, 3.864, 4.07 , ..., 4.136, 4.575, 4.099])

3-5-5样本均值的均值与总体样本的均值相近

计算sample_mean_array的均值

# 样本均值的均值
sp.mean(sample_mean_array)
#4.004

计算样本均值的标准差

# 样本均值的标准差
sp.std(sample_mean_array, ddof = 1)
#0.251

绘制样本均值的概率分布图:

# 样本均值的样本分布
sns.distplot(sample_mean_array, color = 'black')

在这里插入图片描述

3-5-6样本容量越大,样本均值越接近总体均值¶

对象:样本均值
变量:样本容量
求证:样本容量越大,样本均值越接近总体均值

# 公差是 100 的样本容量, 范围是 10 到 100,010
size_array =  np.arange(
    start = 10, stop = 100100, step = 100)
size_array
#array([    10,    110,    210, ...,  99810,  99910, 100010])

存放均值容器

# 存放样本均值的容器
sample_mean_array_size = np.zeros(len(size_array))

改变样本容量的同时反复计算样本均值

# 改变样本容量的同时计算样本均值
np.random.seed(1)
for i in range(0, len(size_array)):
    sample = population.rvs(size = size_array[i])
    sample_mean_array_size[i] = sp.mean(sample)

以横轴为样本容量、纵轴为样本均值,绘制出折线图:

plt.plot(size_array, sample_mean_array_size, 
         color = 'black')
plt.xlabel("sample size")
plt.ylabel("sample mean")

在这里插入图片描述
由图像可知,总体上,样本容量越大,样本均值越接近总体均值

3-5-7定义用于计算样本均值的函数

反复计算样本均值的函数,封装起来为 calc_sample_mean

# 用于计算样本均值的函数
def calc_sample_mean(size, n_trial):
#	准备存放的空间
    sample_mean_array = np.zeros(n_trial)
    for i in range(0, n_trial):
        sample = population.rvs(size = size)
        sample_mean_array[i] = sp.mean(sample)
    return(sample_mean_array)

n_trial是试验次数

# 验证函数功能
# 抽取 10 个数据并计算均值, 此操作重复 10,000 次, 再求这 10,000 个结果的均值
np.random.seed(1)
sp.mean(calc_sample_mean(size = 10, n_trial = 10000))
#4.004

3-5-8不同样本容量所得的样本均值的分布

np.tile(a,(x,y,z))
表示将数组a在行上重复x次,在列上重复y次,在第三维度重复z次(假设数组a是一维的)

np.random.seed(1)
# 样本容量 10
size_10 = calc_sample_mean(size = 10, n_trial = 10000)
size_10_df = pd.DataFrame({
    "sample_mean":size_10,
    "size"       :np.tile("size 10", 10000)
})
# 样本容量 20
size_20 = calc_sample_mean(size = 20, n_trial = 10000)
size_20_df = pd.DataFrame({
    "sample_mean":size_20,
    "size"       :np.tile("size 20", 10000)
})
# 样本容量 30
size_30 = calc_sample_mean(size = 30, n_trial = 10000)
size_30_df = pd.DataFrame({
    "sample_mean":size_30,
    "size"       :np.tile("size 30", 10000)
})

# 拼接表格
sim_result = pd.concat(
    [size_10_df, size_20_df, size_30_df])

# 打印结果
print(sim_result.head())
#只是显示了size 10的均值,总共3万行数据
#    sample_mean     size
# 0     3.922287  size 10
# 1     3.864329  size 10
# 2     4.069530  size 10
# 3     3.857140  size 10
# 4     4.184654  size 10

小提琴图

sns.violinplot(x = "size", y = "sample_mean", 
               data = sim_result, color = 'gray')

在这里插入图片描述
样本容量越大,越集中在4

3-5-9样本均值的标准差小于总体标准差

对象:样本均值的标准差
变量:样本变量
求证:样本容量越大,样本均值的标准差越小,即样本容量越大,样本均值越有说服力。
准备公差为2的样本容量,范围2-100.

# 公差为 2 的样本容量, 范围是 2 到 100
size_array =  np.arange(
    start = 2, stop = 102, step = 2)
size_array
# array([  2,   4,   6,   8,  10,  12,  14,  16,  18,  20,  22,  24,  26,
#         28,  30,  32,  34,  36,  38,  40,  42,  44,  46,  48,  50,  52,
#         54,  56,  58,  60,  62,  64,  66,  68,  70,  72,  74,  76,  78,
#         80,  82,  84,  86,  88,  90,  92,  94,  96,  98, 100])

#存放样本均值的标准差的容器
sample_mean_std_array = np.zeros(len(size_array))
# 改变样本容量的同时计算样本均值的标准差
np.random.seed(1)
for i in range(0, len(size_array)):
    sample_mean = calc_sample_mean(size =size_array[i], 
                                   n_trial = 100)
    sample_mean_std_array[i] = sp.std(sample_mean, 
                                      ddof = 1)

横轴样本变量,纵轴样本均值的标准差

plt.plot(size_array, sample_mean_std_array, 
         color = 'black')
plt.xlabel("sample size")
plt.ylabel("mean_std value")

在这里插入图片描述
可以看出来,样本容量越大,样本均值的标准差越小。

3-5-10标准误差(Standard Error,SE)

样本均值的标准差的理论值可以通过数学式计算得到,这个值也叫标准误差
计算公式如下:
在这里插入图片描述
就σ是总体标准误差,N是样本容量。样本容量越大,标准误差越小。
计算标准误差:

# 样本均值的标准差的理论值:标准误差
standard_error = 0.8 / np.sqrt(size_array)
standard_error
# array([0.566, 0.4  , 0.327, 0.283, 0.253, 0.231, 0.214, 0.2  , 0.189,
#        0.179, 0.171, 0.163, 0.157, 0.151, 0.146, 0.141, 0.137, 0.133,
#        0.13 , 0.126, 0.123, 0.121, 0.118, 0.115, 0.113, 0.111, 0.109,
#        0.107, 0.105, 0.103, 0.102, 0.1  , 0.098, 0.097, 0.096, 0.094,
#        0.093, 0.092, 0.091, 0.089, 0.088, 0.087, 0.086, 0.085, 0.084,
#        0.083, 0.083, 0.082, 0.081, 0.08 ])

标准误差和均值的标准差,图像
linestyle = ‘dotted’,标准误差为虚线,样本均差为实线

plt.plot(size_array, sample_mean_std_array, 
         color = 'black')
plt.plot(size_array, standard_error, 
         color = 'black', linestyle = 'dotted')
plt.xlabel("sample size")
plt.ylabel("mean_std value")

3-5-11标准误差的直观解释

样本均差的标准差必然小于总体的标准差,例如坐电梯
假如电梯能在10人且不限制乘客的身材,每个人的身材不同。很少出现,全是高大或者小巧,那么10名乘客既有高大又有小巧,体重均值集中,不会太大或太小。

3-5-12样本方差的均值偏离总体方差

# 存放方差值的容器
sample_var_array = np.zeros(10000)
# 取出 10 个数据并求其方差, 执行 10,000 次
np.random.seed(1)
for i in range(0, 10000):
    sample = population.rvs(size = 10)
    sample_var_array[i] = sp.var(sample, ddof = 0)
# 样本方差的均值
sp.mean(sample_var_array)
#0.575

总体方差为0.64,样本方差的均值是0.575

3-5-13采用无偏方差消除偏离

加入ddof=1

# 存放无偏方差的空间
unbias_var_array = np.zeros(10000)
# 进行 10,000 次计算10个数据的无偏方差操作
# 
np.random.seed(1)
for i in range(0, 10000):
    sample = population.rvs(size = 10)
    unbias_var_array[i] = sp.var(sample, ddof = 1)
# 无偏方差的均值
sp.mean(unbias_var_array)
#0.639

3-5-14样本容量越大,其无偏方差越接近总体方差

# 公差为 100 的样本容量, 范围是 10 到 100,010
size_array =  np.arange(
    start = 10, stop = 100100, step = 100)
size_array
#array([    10,    110,    210, ...,  99810,  99910, 100010])

# 存放无偏方差的容器
unbias_var_array_size = np.zeros(len(size_array))
# 在样本容量变化的同时反复计算样本的无偏方差
np.random.seed(1)
for i in range(0, len(size_array)):
    sample = population.rvs(size = size_array[i])
    unbias_var_array_size[i] = sp.var(sample, ddof = 1)
#画图
plt.plot(size_array, unbias_var_array_size, 
         color = 'black')
plt.xlabel("sample size")
plt.ylabel("unbias var")

在这里插入图片描述

3-5-15无偏性

估计的期望值相当于真正的参数的特性叫做无偏性
说估计量具有无偏性,就是说他没有偏离,他的均值不会太大也不会过小

3-5-16一致性

样本容量越大,估计量越接近真正的参数的特性称为一致性

3-5-17较好的参数估计量

分析数据的目的就是估计总体分布,进而推测未知的数据。
假设总体服从正态分布,那么只要估计出正态分布的参数就能得知总体分布,那么参数估计是核心。参数为均差和方差。

3-5-18大数定律

样本容量越大,样本均值越接近总体均值

3-5-19中心极限定理

对任意总体分布,样本容量越大,随机变量的和的分布越接近正态分布。
以投掷硬币为例:

# 样本容量与试验次数
n_size  = 10000
n_trial = 50000
# 正面为 1, 背面为 0
coin = np.array([0,1])
# 出现正面的次数
count_coin = np.zeros(n_trial)
# 投 n_size 次硬币, 此实验进行 n_trial 次
np.random.seed(1)
for i in range(0, n_trial):
    count_coin[i] = sp.sum(
        np.random.choice(coin, size = n_size, 
                         replace = True))
# 绘出直方图
sns.distplot(count_coin, color = 'black')

在这里插入图片描述

参考资料

[日] 马场真哉 著, 吴昊天 译. 用Python动手学统计学[M]. 1. 人民邮电出版社, 2021-06-01.
菜鸟网站python3

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值