Traffine I/O

日本語

2022-11-22

中心極限定理

中心極限定理とは

中心極限定理とは、平均 \mu、分散 \sigma^2 の母集団から無作為に抽出した標本の標本平均 \overline{X}_n の分布はサンプルサイズ n が十分大きいとき、近似的に平均 \mu、分散 \frac{\sigma^2}{n} の正規分布に従うという定理です。

この定理の注目すべき点は、母集団の分布によらず、正規分布で近似できるという点です。もとの確率分布がどんな分布であっても、その標本平均は n が大きければ必ず正規分布に近づくため、使い勝手の良い定理になります。

注意点として、正規分布に近似できるのは標本平均の分布であり、母集団から抽出した標本自体の分布を正規分布に近似できるということではありません。標本平均の分布とは、母集団から標本を抽出してその平均を求めるという作業を何度も繰り返したときにその平均値が成す分布です。

Python で中心極限定理を確認

サイコロの例

サイコロをN(1、2、5、10、50、100)回投げて出る目の合計値の分布を実験してみます。サイコロは1から6までの目が出る確率は全て \frac{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()

dice

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()

dice mean

Nが大きくなるにつれて、サイコロの目の平均値の分布は正規分布に近づいていることが分かります。また、標本平均の分散は \frac{\sigma^2}{n} ですので、Nが大きくなるにつれて分散が小さくなっていることが分かります。

コインの例

コインをN(1、2、5、10、50、100)回投げて表が出たら1、裏が出たら2としてその合計値の分布を実験してみます。コインは表と裏が出る確率はどちらも \frac{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()

coins

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()

coins mean

Nが大きくなるにつれて、コインの値の平均値の分布は正規分布に近づいていることが分かります。また、標本平均の分散は \frac{\sigma^2}{n} ですので、Nが大きくなるにつれて分散が小さくなっていることが分かります。

参考

https://www.gaussianwaves.com/2010/01/central-limit-theorem-2/

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!