中心極限定理は何がすごいのか?

 中心極限定理(central limit theorem、略称:CLT)のすごさについて説明します。

要約

(1)問い

 中心極限定理は、すごいのでしょうか?

(2)結論

 中心極限定理は

  • 一定の条件下で「Xの母集団分布が何であっても」Xの平均は正規分布に従う

という定理です。ゆるい条件で成り立つので、すごいです。

(3)意義

 中心極限定理を根拠に、仮説検定の設計ができます。

前提

 問いを「中心極限定理はすごいのか?」とします。

 これに際して、次の定義・仮定を用います。

(1)定義

中心極限定理

 中心極限定理とは、簡単に言えば「平均は正規分布に従う」です。詳しくは

$$母平均\mu、母分散\sigma^2(有限)の$$

$$同一の母集団分布に独立に従う$$

$$n個の確率変数Xの平均\overline{X}=\frac{1}{n}\sum_{i=1}^n X_i$$

$$の分布は、母平均μ、母分散\frac{\sigma^2}{n}の大略正規分布$$

$$N \left(\mu, \frac{\sigma^2}{n} \right)に従う$$

$$ただし、nは十分に大きい$$

です。

すごい

 ゆるい条件で主張が成り立つことを「すごい」と定義します。

(2)仮定する条件

 中心極限定理の仮定を整理すると

  • 母平均と母分散は有限
  • 同一の母集団分布
  • 独立
  • nは十分に大きい

です。

(3)仮定しない条件

 さきほどの中心極限定理は、確率変数Xの母集団分布を指定していませんから

  • 確率変数Xの母集団分布はなんでもよい

と言えます。これはゆるい条件です。

方法

(1)問題の構造

 問いは「中心極限定理の何がすごいのか?」ですが、すごいの定義はいろいろあります。その中でも、この記事では「ゆるい条件で成り立つ」をすごいと定義しています。

(2)論点と判断基準

 中心極限定理のゆるい条件は

・確率変数Xの母集団分布はなんでもよい

です。このようなゆるい条件で「Xの平均は正規分布に従う」のでしょうか?

 論点を「シミュレーションして、母集団分布が正規分布、カイ二乗分布、二峰分布、三峰分布であっても、平均は正規分布に従うか」と設定します。そして、もし平均が正規分布に従う場合は、中心極限定理はすごいでしょう。

 シミュレーションの手順は、次のとおりです。

 第一に、母集団サイズ10万個の母集団を生成します。母平均と母分散が確定します。

 第二に、サンプル・サイズ5000の標本を無作為抽出します。

 第三に、標本から標本平均を計算します。

 第四に、第二と第三を1万回繰り返して、標本平均の分布を作ります。

 第五に、標本平均の分布を正規分布と比較します。

結果

(1)正規分布

 まず最初に、正規分布に従う確率変数Xの平均の分布を調べます。もちろん、正規分布の平均は、正規分布だと思いますが、念の為に調べます。

 母平均100、母分散100の正規分布に従うデータを10万個生成し、母集団としました。↓

 母集団からサンプル・サイズ5000の標本を1万回抽出し、標本平均を1万回計算しました。

 得られた標本平均の1万個の分布がピンクです。黒は、中心極限定理が予測する正規分布です。両者は重なっているといえるでしょう。↓

(2)カイ二乗分布

 次に、カイ二乗分布に従う確率変数Xの平均の分布を調べます。カイ二乗分布は、右側の裾が広い分布です。このような場合でも、平均の分布は正規分布に従うのでしょうか?

 そこで、カイ二乗分布(自由度5)に従うデータを10万個生成し、母集団としました。この母集団は正規分布と異なり、右の裾が長くなっています。↓

 母集団からサンプル・サイズ5000の標本を1万回抽出し、標本平均を1万回計算しました。

 得られた標本平均の1万個の分布がピンクです。黒は、中心極限定理が予測する正規分布です。両者は重なっているといえるでしょう。むむむ。↓

(3)二峰型の分布

 第三に、二峰型の正規分布に従う確率変数Xの平均の分布を調べます。正規分布もカイ二乗分布も、峰が一つしかありません。もしかしたら、二峰型の場合、正規分布に従わないかもしれません。確かめてみましょう。

 そこで、二峰型の分布に従うデータを10万個生成し、母集団としました。↓

 得られた標本平均の分布が下図です。これは正規分布ですね…↓

(4)三峰型の分布

 最後に、三峰型の正規分布に従う確率変数Xの平均の分布を調べます。

 三峰型の分布に従うデータを10万個生成し、母集団としました。↓

 得られた標本平均の分布が下図です。正規分布です!↓

考察

(1)結論

 Xの母集団分布が

  • 正規分布
  • カイ二乗分布
  • 二峰型分布
  • 三峰型分布

でも、Xの平均は正規分布に従いました。少々論理的に飛躍しますが

  • 一定の条件下で「Xの母集団分布が何であっても」Xの平均は正規分布に従う

と言ってよいでしょう。

 ゆるい条件で成り立つので、中心極限定理はすごいです。

(2)前提評価

 中心極限定理は母集団分布について仮定のない定理です。ただし、さきほどのシミュレーションでは「一定の条件」

  • 母平均と母分散は有限
  • 同一の母集団分布
  • 独立
  • nは十分に大きい

が、暗黙のうちに仮定されていました。この条件に違反した場合にどうなるかは「付録1」に載せました。

(3)意義

 統計学では、正規分布を基礎にしている手法(t検定、カイ二乗検定など)が多いです。

 中心極限定理があれば、Xの母集団分布が不明でも「平均は正規分布に従う」と言えますから、これらの検定が使えるわけです。

付録1:平均が正規分布しない場合

(1)有限の違反

 確率変数Xが有限の母平均、母分散ではない場合、中心極限定理は使えません。

 ベキ分布など、有限の母平均、母分散がない分布は存在します。

(2)同一性の違反

 確率変数Xが従う分布は、同じでないといけません。同一でない場合には

  • 標本抽出に偏りがある
  • 標本抽出が非復元抽出

の2パターンがあります。

標本抽出に偏り

 標本抽出に偏りがあるのなら、中心極限定理は使えません。例えば

  • 母集団が10万人(男5万人、女5万人)
  • 身長の母平均165cm

のときを考えましょう。

 何を間違ったのか男性からしか標本抽出できなかったとします。このとき、平均の分布(ピンク)と中心極限定理が導く正規分布には大きな差が生まれてしまいます。↓

標本抽出が非復元抽出

 標本抽出が非復元抽出の場合、つまり

  • 取った標本を母集団に戻さない抽出方法

のとき、母集団の同一性が保たれません。なぜなら、標本抽出する度に、母集団が変わっていってしまうからです。

 例えば、母集団がA、B、C、D、Eさんだとします。ここからのランダムに選び、Aさんの身長を測ったとします。非復元抽出の場合、2人目の母集団はB、C、D、Eになり、もともとの母集団と異なります。

 最初と同じように、母平均100、母分散100の正規分布に従うデータを10万個生成し、母集団としました。↓

 母集団からサンプル・サイズ9万個を1万回非復元抽出し、標本平均を1万回計算しました。

 その結果が下図です。中心極限定理が導く分布より、標本平均の分散が小さくなっています。

※母集団サイズが大きく、サンプル・サイズが小さいときは、非復元抽出でも実質的には問題ないです。母集団サイズが大きくても、サンプル・サイズも大きいときは、問題が生まれます。その例が上です。

(3)独立性の違反

 中心極限定理は、互いの確率変数Xが独立であることも必要です。独立とは

$$P(X_iかつX_j)=P(X_i) \times P(X_j) $$

$$iとj:1〜nから得られる全ての組み合わせ ただしi≠j$$

という意味で、Xiがなんであっても、Xjが起きる確率は変わらないという意味です。

 これが違反されると、中心極限定理は使えません。

(4)十分なnの違反

 nが小さい場合、平均の分布は正規分布に従いません。サンプル・サイズが1から4のときでシミュレーションした結果が下です。↓

 n=4になるとだいぶ正規分布に従ってしまいますけどね!笑

付録2:Rコード

 ①母集団サイズ10万の母集団を作成します。↓

#母集団の作成 正規分布
population_size <- 100000
x <- rep(NA, population_size)
 
for(i in 1:population_size){
  x[i] <- rnorm(1, 100, 10)
}
data0 <- data.frame(x)

 ②標本を1万回生成し、標本平均を1万回計算します↓

#標本平均の分布
trial_number <- 10000 
sample_size <- 5000
mean_0 <- rep(0, trial_number)
 
for(i in 1:trial_number){
  s <- sample(data0$x, sample_size, replace = FALSE) #無作為抽出
  mean_0[i] <- mean(s) #平均の計算
}
data00 <- data.frame(mean_0) 

 ③作図します↓

#パッケージの呼び出し。
library(ggplot2)
 
#母集団の分布
ggplot(data0, aes( x = x )) + 
  geom_histogram(bins=80,colour="white", fill = "skyblue2")+
  xlab("変数X") + 
  ylab ("度数") +
  ggtitle ("変数Xのヒストグラム") +
  theme_grey(base_family = "HiraKakuPro-W3")
 
#標本平均の分布
ggplot(data00, aes( x = mean_0)) + 
  geom_histogram( bins=80,aes( y = ..density.. ),colour="white", fill = "pink2")+
  stat_function(fun = dnorm, args=list(mean=mean(data0$x), sd=sqrt((var(data0$x))/sample_size)))+
  xlab("変数Xの平均") + 
  ylab ("確率密度") +
  ggtitle ("平均のヒストグラムと正規分布") +
  theme_grey(base_family = "HiraKakuPro-W3")

 他の母集団分布はこちらを使ってください。②と③は同じコードでいけます。↓

#母集団の作成 一様分布
population_size <- 100000
x <- rep(NA, population_size)
 
for(i in 1:population_size){
  x[i] <- runif(1,20,80) 
}
data0 <- data.frame(x)
#母集団の作成 カイ二乗分布df=5
population_size <- 100000
x <- rep(NA, population_size)
 
for(i in 1:population_size){
  x[i] <- rchisq(1, 5)
}
data0 <- data.frame(x)
#母集団の作成 二峰型
population_size <- 100000
x <- rep(NA, population_size)
 
for(i in 1:population_size){
  x[i] <- ifelse(i < 40000,rnorm(1,40,6) , rnorm(1,60,6))
}
data0 <- data.frame(x)
#母集団の作成 三峰分布
population_size <- 100000
x <- rep(NA, population_size)
for(i in 1:population_size){
  x[i] <- ifelse(i < 10000,rnorm(1,30,6) , 
                 ifelse(i < 50000, rnorm(1,50,3),rnorm(1,70,6)))
}
data0 <- data.frame(x)

 付録1の身長シミュレーションについて↓

#身長データの作成
population_size <- 100000
x <- rep(NA, population_size)
male_d <- rep(NA, population_size)
for(i in 1:population_size){
  x[i] <- ifelse(i < 50000,rnorm(1,158,5) , rnorm(1,172,6))
  male_d[i] <- ifelse(i < 50000,"女", "男")
}
data0 <- data.frame(x,male_d)
 
#男のみデータの作成
x_male <- data0[data0$male_d=="男" ,]$x
data00 <- data.frame(x_male)
 
#身長のヒストグラム作成
ggplot(data0, aes( x = x ,fill=male_d)) + 
  geom_histogram(bins=40,position = "stack",colour="white",alpha=0.8)+
  xlab("身長") + 
  ylab ("度数") +
  ggtitle ("身長のヒストグラム") +
  theme_grey(base_family = "HiraKakuPro-W3")
 
#標本抽出
trial_number <- 10000 
sample_size <- 50
mean_0 <- rep(0, trial_number)
for(i in 1:trial_number){
  s <- sample(data00$x_male, sample_size, replace = FALSE) #無作為抽出
  mean_0[i] <- mean(s) #平均の計算
}
 
#平均の分布
data00 <- data.frame(mean_0)
ggplot(data00, aes( x = mean_0)) + 
  geom_histogram( bins=80,aes( y = ..density.. ),colour="white", fill = "pink2")+
  stat_function(fun = dnorm, args=list(mean=mean(data0$x), sd=sqrt((var(data0$x))/sample_size)))+
  scale_x_continuous(limits = c(160, 175))+
  xlab("身長の平均") + 
  ylab ("確率密度") +
  ggtitle ("標本平均と正規分布") +
  theme_grey(base_family = "HiraKakuPro-W3")

コメント欄 お気軽にコメントをお寄せください!

タイトルとURLをコピーしました