目录
[1 进行多次抽样,样本的分布参数和总体的分布参数的关系](#1 进行多次抽样,样本的分布参数和总体的分布参数的关系)
[2 样本容量越大,多次抽样的样本的分布参数和总体的分布参数的关系](#2 样本容量越大,多次抽样的样本的分布参数和总体的分布参数的关系)
[2.1 如果进行多次抽样,样本的均值将趋向总体的均值](#2.1 如果进行多次抽样,样本的均值将趋向总体的均值)
[2.2 换句话说:样本的均值将趋向总体的均值就是,mean(样本均值) = 总体均值](#2.2 换句话说:样本的均值将趋向总体的均值就是,mean(样本均值) = 总体均值)
[2.3 下面的图能说明很多信息](#2.3 下面的图能说明很多信息)
[2.4 下面是具体的代码](#2.4 下面是具体的代码)
[2.4.1 代码里发现的一个随机问题](#2.4.1 代码里发现的一个随机问题)
[3 随着样本容量增大,多次抽样de均值de→平均值和std的变化](#3 随着样本容量增大,多次抽样de均值de→平均值和std的变化)
[3.1 直接看(样本容量变化时)多次取样de样本的均值趋向总体均值的过程](#3.1 直接看(样本容量变化时)多次取样de样本的均值趋向总体均值的过程)
[3. 2 有意义的多次取样时,标准差std随着样本规模的变化趋势](#3. 2 有意义的多次取样时,标准差std随着样本规模的变化趋势)
[3.3 继续改进,全部都修改为,相同样本规模下多次试验,然后根据多次试验结果得出均值和均值的std](#3.3 继续改进,全部都修改为,相同样本规模下多次试验,然后根据多次试验结果得出均值和均值的std)
[4 随着样本容量增大,多次抽样de标准差de→平均值和std的变化(也需要像第3部分一样改进)](#4 随着样本容量增大,多次抽样de标准差de→平均值和std的变化(也需要像第3部分一样改进))
[4.1 也是趋向总体的std](#4.1 也是趋向总体的std)
[4.2 一般情况下,样本的方差<=总体方差](#4.2 一般情况下,样本的方差<=总体方差)
[4.3 用样本方差直接去估计总体方差是有偏估计](#4.3 用样本方差直接去估计总体方差是有偏估计)
进行多次抽样,样本的分布参数和总体的分布参数的关系
1 进行多次抽样,样本的分布参数和总体的分布参数的关系
-
每次抽样都会得到1个均值,1个方差
-
多次抽样会得到多个均值,多个方差
-
可以把多次抽样得到的均值,方差再进行平均,看下多次抽样的平均值和总体参数的关系
-
多次抽样会得到多个均值→也就是均值数组,这个均值数组的平均值,接近总体的均值
-
多次抽样会得到多个方差→也就是方差数组,这个方差数组的平均值,会远小于总体的均值,这就是样本方差对总体方差的有偏估计。
-
std的情况类方差。
import numpy as np
import pandas as pd
import scipy as sp
from matplotlib import pyplot as plt
import seaborn as sns
%precision 3population1=sp.stats.norm(loc=4,scale=0.8) #不设置size,可以认为是一个无限的总体?
samples_mean_array1=np.zeros(1000)
np.random.seed(1)
for i in range(0,1000):
sample1=population1.rvs(size=10)
samples_mean_array1[i]=np.mean(sample1)#print(samples_mean_array1)
sns.distplot(samples_mean_array1)
#sns.histplot(samples_mean_array1)
#sns.kdeplot(samples_mean_array1, fill=True)
plt.show()print(f"设置的总体的均值 =4")
print(f"设置的总体的方差 ={0.8*0.8}")
print(f"设置的总体的标准差 =0.8")
print()print(f"多次抽样的样本均值的均值 = {np.mean(samples_mean_array1)}")
print(f"多次抽样的样本方差的均值 = {np.var(samples_mean_array1)}")
print(f"多次抽样的样本标准差的均值 = {np.std(samples_mean_array1)}")
print()print("多次抽样的样本的均值的均值,接近总体的均值")
print("多次抽样的样本的方差的均值,远远小于总体的方差")
print("多次抽样的样本的标准差的均值,远远小于总体的标准差")
print()
2 样本容量越大,多次抽样的样本的分布参数和总体的分布参数的关系
2.1 如果进行多次抽样,样本的均值将趋向总体的均值
- 首先,还是基于,多次抽样
- 因为单次抽样的随机性比较大
- 样本容量越大,多次抽样的样本的分布参数和总体的分布参数的关系会发现
- 样本容量越大,多次抽样的样本的平均值的均值,会收敛,越来越接近总体的平均值
- 样本容量越大,多次抽样的样本的方差的均值,会收敛,越来越接近总体的方差
2.2 换句话说:样本的均值将趋向总体的均值就是,mean(样本均值) = 总体均值
- 样本的均值将趋向总体的均值
- → 样本均值的均值 = 总体均值
- → mean(样本均值) = 总体均值
2.3 下面的图能说明很多信息
- 大数定律:简单理解,就是多次试验,样本的均值会接近总体的均值
- 基本可以反应在下面的图里
- 下面2张图
- plot折线图,可以看出随着sample_size增加,样本均值向总体均值靠拢的趋势,过程
- hist频度图更清晰的反应,样本均值的均值,集中靠近总体均值的程度。
- hist图可以理解为,plot折线图,转过来,然后数据往下掉下来集中形成的!
hist图就像把plot给旋转****竖过来了+ 下沉相同的归类后统计成次数!!
hist图就像把plot给旋转****竖过来了+ 下沉相同的归类后统计成次数!!
hist图就像把plot给旋转****竖过来了+ 下沉相同的归类后统计成次数!!
2.4 下面是具体的代码
2.4.1 代码里发现的一个随机问题
- ramdon.seed(100) 计算出来的,均值的均值=4.34
- 碰巧代码里整行用的是ramdon.seed(100),否则还发现不了这么奇怪的事情。。。
- ramdon.seed(1) 或者ramdon.seed() 计算出来的,均值的均值=0.00099
- 暂时不知道原因,很奇怪。。。。小心吧
3 随着样本容量增大,多次抽样de均值de→平均值和std的变化
3.1 直接看(样本容量变化时)多次取样de样本的均值趋向总体均值的过程
-
多次抽样的样本均值的均值趋向总体的均值,我这因为总体loc=0, 样本均值的均值也接近0
-
但是,这样求出的std 没意义
-
错误:多次抽样的样本均值的 方差很小,说明很稳定
-
因为,这个方差/ 标准差,是把不同取样规模的样本的均值,加一起再平均算的方差/ 标准差,本身没有意义
-
有意义的方差/ 标准差,是在相同的 样本规模时,多次取样(循环里的循环),得出的多次取样的方差/ 标准差,才有比较的意义!这个一定要注意!
为什么呢,因为我们必须再相同的标准下计算均值和方差
相同的标准:取样的样本规模 sample_size
相同的sample_size下,取样一次,均值基本比较稳定,勉强可用
相同的sample_size下,取样一次,方差会相差很大,不能这么用
其实严格的说
无论,均值还是std,都需要再相同的sample_size下,多试验多次,计算这个相同条件:比如sample_size=50下的多次取样的均值和std
相同的sample_size下,取样多次得到的mean,再计算np.mean(mean)
相同的sample_size下,取样多次得到的mean,再计算np.std(mean)
python
import numpy as np
import pandas as pd
import scipy as sp
from matplotlib import pyplot as plt
import seaborn as sns
%precision 3
np.random.seed(1)
count1=999
#生成一个总体的正态分布,先不生成数量
population1=sp.stats.norm(loc=0,scale=1)
sample_mean_array1=np.zeros(count1)
sample_mean_std_array2=np.zeros(count1)
for i in range(0,count1,1):
#每次循环时,取1次数量,作为样本
array1=population1.rvs(size=10+i*10)
sample_mean_array1[i]=np.mean(array1)
sample_mean_std_array2[i]=np.std(array1)
#下面展示的是每次取样/试验得到的 均值和std随着 取样数量的增加 的变化趋势
fig1=plt.figure(num=1,figsize=(5, 5))
plt.plot(sample_mean_array1)
plt.title("随着抽样规模的变大,多次抽样的样本均值的变化",fontsize=16)
plt.xlabel("sample_size",fontsize=16)
plt.ylabel("sample_mean",fontsize=16)
fig2=plt.figure(num=2,figsize=(5, 5))
plt.plot(sample_mean_std_array2)
plt.title("随着抽样规模的变大,多次抽样的样本std的变化---这个std无意义!",fontsize=16)
plt.xlabel("sample_size",fontsize=16)
plt.ylabel("sample_std",fontsize=16)
#print(sample_mean_array1)
print(f"取样{count1}次的均值的均值={np.mean(sample_mean_array1)}")
print(f"取样{count1}次的均值的std={np.std(sample_mean_array2)}")
3. 2 有意义的多次取样时,标准差std随着样本规模的变化趋势
- 下图可见,
- 在不同的抽样规模下,标准差,是明显随着取样规模的变大而变小的
python
import numpy as np
import pandas as pd
import scipy as sp
from matplotlib import pyplot as plt
import seaborn as sns
%precision 3
np.random.seed(1)
count1=999
#生成一个总体的正态分布,先不生成数量
population1=sp.stats.norm(loc=0,scale=1)
sample_mean_array1=np.zeros(count1)
sample_mean_std_array2=np.zeros(count1)
for i in range(0,count1,1):
#每次循环时,取1次数量,作为样本
array1=population1.rvs(size=10+i*10)
sample_mean_array1[i]=np.mean(array1)
sample_mean_std_array2[i]=np.std(array1)
#下面展示的是每次取样/试验得到的 均值和std随着 取样数量的增加 的变化趋势
fig1=plt.figure(num=1,figsize=(5, 5))
plt.plot(sample_mean_array1)
plt.title("随着抽样规模的变大,多次抽样的样本均值的变化",fontsize=16)
plt.xlabel("sample_size",fontsize=16)
plt.ylabel("sample_mean",fontsize=16)
fig2=plt.figure(num=2,figsize=(5, 5))
plt.plot(sample_mean_std_array2)
plt.title("随着抽样规模的变大,多次抽样的样本std的变化",fontsize=16)
plt.xlabel("sample_size",fontsize=16)
plt.ylabel("sample_std",fontsize=16)
#print(sample_mean_array1)
print(f"取样{count1}次的均值的均值={np.mean(sample_mean_array1)}")
print(f"取样{count1}次的均值的std={np.std(sample_mean_array2)}")
#下面展示的是每次取样/试验得到的 均值和std随着 取样数量的增加 的变化趋势
#这个 std是均值的std, 也就是在每个样本容量规模处,做多次试验(嵌套循环),所得到的std,
#而不是不同规模下的取样样本,得到的多个样本的均值的标准差,那个没啥意义!
sample_mean_array11=np.zeros(count1)
sample_mean_std_array21=np.zeros(count1)
for i in range(0,count1,1):
#每次循环时,取1次数量,作为样本
for j in range(0,10,1):
array11=population1.rvs(size=10+i*10)
sample_mean_array11[j]=np.mean(array11)
#sample_mean11[i]=np.mean(sample_mean_array11)
#sample_mean_std_array21[i]=np.std(sample_mean11)
sample_mean_std_array21[i]=np.std(sample_mean_array11)
fig3=plt.figure(num=3,figsize=(5, 5))
plt.plot(sample_mean_std_array21)
plt.title("随着抽样规模的变大,多次抽样的样本std的变化",fontsize=16)
plt.xlabel("sample_size",fontsize=16)
plt.ylabel("sample_std",fontsize=16)
3.3 继续改进,全部都修改为,相同样本规模下多次试验,然后根据多次试验结果得出均值和均值的std
- 都是需要先内部循环多次,
- 得到平均值的数组
- 然后再求这个数组 平均值和std
- sample_mean_std_array21[i]=np.std(sample_mean_array11)
- sample_mean_mean_array20[i]=np.mean(sample_mean_array11)
结论
- 随着取样规模变大,样本的均值的均值的绝对值趋向总体均值。图形上表现为,正负区间震荡着接近总体均值
- 随着取样规模变大,样本的均值的的std越来越小,趋向总体均值。图形上表现为,都是正数,但是数值越来越小,趋向0
python
import numpy as np
import pandas as pd
import scipy as sp
from matplotlib import pyplot as plt
import seaborn as sns
%precision 3
np.random.seed(1)
count1=999
#生成一个总体的正态分布,先不生成数量
population1=sp.stats.norm(loc=0,scale=1)
sample_mean_array1=np.zeros(count1)
sample_mean_std_array2=np.zeros(count1)
#下面展示的是每次取样/试验得到的 均值和std随着 取样数量的增加 的变化趋势
#这个 std是均值的std, 也就是在每个样本容量规模处,做多次试验(嵌套循环),所得到的std,
#而不是不同规模下的取样样本,得到的多个样本的均值的标准差,那个没啥意义!
sample_mean_array11=np.zeros(count1)
sample_mean_std_array21=np.zeros(count1)
sample_mean_mean_array20=np.zeros(count1)
for i in range(0,count1,1):
#每次循环时,取1次数量,作为样本
for j in range(0,10,1):
array11=population1.rvs(size=10+i*10)
sample_mean_array11[j]=np.mean(array11)
sample_mean_std_array21[i]=np.std(sample_mean_array11)
sample_mean_mean_array20[i]=np.mean(sample_mean_array11)
fig3=plt.figure(num=3,figsize=(5, 5))
plt.plot(sample_mean_mean_array20)
plt.title("随着抽样规模的变大,多次抽样的样本mean的变化",fontsize=16)
plt.xlabel("sample_size",fontsize=16)
plt.ylabel("sample_std",fontsize=16)
fig4=plt.figure(num=4,figsize=(5, 5))
plt.plot(sample_mean_std_array21)
plt.title("随着抽样规模的变大,多次抽样的样本std的变化",fontsize=16)
plt.xlabel("sample_size",fontsize=16)
plt.ylabel("sample_std",fontsize=16)
4 随着样本容量增大,多次抽样de标准差de→平均值和std的变化(也需要像第3部分一样改进)
4.1 也是趋向总体的std
- 多次抽样的样本std的均值趋向总体的std,我这因为总体scale=1, 样本std的均值的也接近1
- 多次抽样的样本均值的 方差很小,说明很稳定
4.2 一般情况下,样本的方差<=总体方差
- 一般情况下,样本的方差<=总体方差
- 因为,总体里包括各个极值,极大极小值,这些值对方差的贡献影响最大
- 而样本里经常是部分数据,最大取值在极值范围内,所以样本方差<=总体方差
4.3 用样本方差直接去估计总体方差是有偏估计
- 多次抽样的样本方差的均值,应该还是小于总体的方差,因为是有偏估计
- 比如针对方差
- Σ(xi-u)^2/n 用样本方差去直接估计总体方差
- Σ(xi-u)^2/(n-1) 才是无偏估计
python
import numpy as np
import pandas as pd
import scipy as sp
from matplotlib import pyplot as plt
import seaborn as sns
%precision 3
np.random.seed(1)
count1=999
#生成一个总体的正态分布,先不生成数量
population1=sp.stats.norm(loc=0,scale=1)
sample_std_array1=np.zeros(count1)
for i in range(0,count1,1):
#每次循环时,取1次数量,作为样本
array1=population1.rvs(size=10+i*10)
sample_std_array1[i]=np.std(array1) #只看std就够了,var不看了
fig1=plt.figure(num=1,figsize=(5, 5))
plt.plot(sample_std_array1)
plt.title("随着抽样规模的变大,多次抽样的样本std的变化",fontsize=16)
plt.xlabel("sample_size",fontsize=16)
plt.ylabel("sample_std",fontsize=16)
"""
plt.hist(sample_mean_array1)
plt.title("随着抽样规模的变大,多次抽样的样本std的变化",fontsize=16)
plt.xlabel("sample_size",fontsize=16)
plt.ylabel("频数",fontsize=16)
"""
#print(sample_mean_array1)
print(f"取样{count1}次的std的均值={np.mean(sample_mean_array1)}")
print(f"取样{count1}次的std的std={np.std(sample_mean_array2)}")