样本统计量的性质
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