中心極限定理とは
中心極限定理とは、平均
この定理の注目すべき点は、母集団の分布によらず、正規分布で近似できるという点です。もとの確率分布がどんな分布であっても、その標本平均は
注意点として、正規分布に近似できるのは標本平均の分布であり、母集団から抽出した標本自体の分布を正規分布に近似できるということではありません。標本平均の分布とは、母集団から標本を抽出してその平均を求めるという作業を何度も繰り返したときにその平均値が成す分布です。
Python で中心極限定理を確認
サイコロの例
サイコロをN(1、2、5、10、50、100)回投げて出る目の合計値の分布を実験してみます。サイコロは1から6までの目が出る確率は全て
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
#%matplotlib inline
sns.set()
sns.set_context(rc = {'patch.linewidth': 0.2})
sns.set_style('dark')
numIterations = np.asarray([1,2,5,10,50,100]); #number of i.i.d RVs
experiment = 'dice' #valid values: 'dice', 'coins'
maxNumForExperiment = {'dice':6,'coins':2} #max numbers represented on dice or coins
nSamp=100000
k = maxNumForExperiment[experiment]
fig, fig_axes = plt.subplots(ncols=3, nrows=2, constrained_layout=True, figsize=(12,8))
for i,N in enumerate(numIterations):
y = np.random.randint(low=1,high=k+1,size=(N,nSamp)).sum(axis=0)
row = i//3;col=i%3;
bins=np.arange(start=min(y),stop=max(y)+2,step=1)
fig_axes[row,col].hist(y,bins=bins,density=True)
fig_axes[row,col].set_title('N={} {}'.format(N,experiment))
plt.show()
Nが大きくなる(つまり抽出するサンプルサイズが大きくなる)につれて、サイコロの目の合計値の分布(標本平均の分布)は正規分布に近づいていることが分かります。
次にサイコロをN(1、2、5、10、50、100)回投げて出る目の平均値の分布を実験してみます。
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
#%matplotlib inline
sns.set()
sns.set_context(rc = {'patch.linewidth': 0.2})
sns.set_style('dark')
numIterations = np.asarray([1,2,5,10,50,100]); #number of i.i.d RVs
experiment = 'coins' #valid values: 'dice', 'coins'
maxNumForExperiment = {'dice':6,'coins':2} #max numbers represented on dice or coins
nSamp=100000
k = maxNumForExperiment[experiment]
for i,N in enumerate(numIterations):
y = np.random.randint(low=1,high=k +1,size=(N,nSamp)).sum(axis=0)/N
row = i//3;col=i%3;
bins=np.arange(start=1,stop=7,step=0.1)
fig_axes[row,col].hist(y,bins=bins,density=True)
fig_axes[row,col].set_title('N={} {}'.format(N,experiment))
plt.show()
Nが大きくなるにつれて、サイコロの目の平均値の分布は正規分布に近づいていることが分かります。また、標本平均の分散は
コインの例
コインをN(1、2、5、10、50、100)回投げて表が出たら1、裏が出たら2としてその合計値の分布を実験してみます。コインは表と裏が出る確率はどちらも
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
#%matplotlib inline
sns.set()
sns.set_context(rc = {'patch.linewidth': 0.2})
sns.set_style('dark')
numIterations = np.asarray([1,2,5,10,50,100]); #number of i.i.d RVs
experiment = 'coins' #valid values: 'dice', 'coins'
maxNumForExperiment = {'dice':6,'coins':2} #max numbers represented on dice or coins
nSamp=100000
k = maxNumForExperiment[experiment]
fig, fig_axes = plt.subplots(ncols=3, nrows=2, constrained_layout=True, figsize=(12,8))
for i,N in enumerate(numIterations):
y = np.random.randint(low=1,high=k+1,size=(N,nSamp)).sum(axis=0)
row = i//3;col=i%3;
bins=np.arange(start=min(y),stop=max(y)+2,step=1)
fig_axes[row,col].hist(y,bins=bins,density=True)
fig_axes[row,col].set_title('N={} {}'.format(N,experiment))
plt.show()
Nが大きくなる(つまり抽出するサンプルサイズが大きくなる)につれて、コインの値の合計値の分布(標本平均の分布)は正規分布に近づいていることが分かります。
次にコインをN(1、2、5、10、50、100)回投げて出る目の平均値の分布を実験してみます。
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
#%matplotlib inline
sns.set()
sns.set_context(rc = {'patch.linewidth': 0.2})
sns.set_style('dark')
numIterations = np.asarray([1,2,5,10,50,100]); #number of i.i.d RVs
experiment = 'coins' #valid values: 'dice', 'coins'
maxNumForExperiment = {'dice':6,'coins':2} #max numbers represented on dice or coins
nSamp=100000
k = maxNumForExperiment[experiment]
for i,N in enumerate(numIterations):
y = np.random.randint(low=1,high=k +1,size=(N,nSamp)).sum(axis=0)/N
row = i//3;col=i%3;
bins=np.arange(start=1,stop=3,step=0.1)
fig_axes[row,col].hist(y,bins=bins,density=True)
fig_axes[row,col].set_title('N={} {}'.format(N,experiment))
plt.show()
Nが大きくなるにつれて、コインの値の平均値の分布は正規分布に近づいていることが分かります。また、標本平均の分散は
参考