<<目次へ


大数の法則と中心極限定理


 大数の法則(law of great number)と中心極限定理(central limiting theorem)は統計学の中でも非常に重要かつ基本的な考え方です。この2つの性質を証明しようとするとかなりの数学的知識を要するのですが、現在ではコンピュータがあるのでシュミレーションを行うことによってこれらの性質を実感することができます。


大数の法則
母平均μの母集団から大きさnの標本を無作為抽出するとき、その標本平均Xはnが大きくなるにつれて母平均μに近づく。
中心極限定理
平均μ、分散σ2の母集団から復元抽出*1によって得られた大きさnの標本の標本平均をXとするとき、母集団分布がどのような分布であってもnを無限に大きくしていけばXの分布は正規分布に近づく。つまり母集団の分布がどのような形であってもnを無限に大きくすれば正規分布になってしまうのである。

*1復元抽出とは1度取り出した要素を元に戻してから再び取り出す方法です。



1.大数の法則をシュミレーションしてみる

 もう少し大数の法則を分かりやすく説明すると、例えばコインの裏表が出る確率はそれぞれ1/2であることはご存知ですね?しかしコインを5・6回投げただけでは表(あるいは裏)が出る確率のほうが大きくなってしまうかもしれません。これを100回、200回、・・・とたくさん投げ続ければ次第に表裏の出る確率は均等(つまり1/2)になっていくはずです。

Rによるシュミレーションの手順

  1. 乱数を10000個発生させる。
  2. 発生させた乱数から大きさNの標本平均を求める。このときN=4,9,16,25,100,400,1000の7通りを試してみる。
  3. 横軸にN、縦軸に平均値をとって棒グラフを描いてみる。
  4. 2で行った「大きさNの標本平均を求める」という行為を10回繰り返し、その平均値の標準偏差を求めてみる。
  5. 横軸にN、縦軸に標準偏差の値をとって棒グラフを描いてみる。

シュミレーションをもっとカンタンに実行できるような関数も作れますが、面倒でも1つ1つ手順どおりにしていった方が理解しやすいので...

x<-runif(10000) #10000個の乱数を発生させて変数xに代入(つまりこれが母集団)
sampling<-function(x,n){
return(x[order(runif(length(x)))][1:n])
}

N4<-mean(sampling(x,4)) 
#xから4個のデータを取り出し、その平均値をN4に代入
N9<-mean(sampling(x,9)) 
#xから9個のデータを取り出し、その平均値をN9に代入
N16<-mean(sampling(x,16)) 
#xから16個のデータを取り出し、その平均値をN16に代入
N25<-mean(sampling(x,25))
#xから25個のデータを取り出し、その平均値をN25に代入
N100<-mean(sampling(x,100))
#xから100個のデータを取り出し、その平均値をN100に代入
N400<-mean(sampling(x,400))
#xから400個のデータを取り出し、その平均値をN400に代入
N1000<-mean(sampling(x,1000))
#xから1000個のデータを取り出し、その平均値をN1000に代入
dat1<-c(N4,N9,N16,N25,N100,N400,N1000)
#N4〜N1000までの平均値をdat1に代入
names(dat1)<-c("N4","N9","N16","N25","N100","N400","N1000")
barplot(dat1,col="blue",xlab="サンプルサイズ",ylab="平均値")
abline(h=0)
myprog <- function(a)
{
g<-apply(sapply(1:10, function(i) sampling(x,a)), 2, mean)
return(g)
}

M4<-sd(myprog(4))
M9<-sd(myprog(9))
M16<-sd(myprog(16))
M25<-sd(myprog(25))
M100<-sd(myprog(100))
M400<-sd(myprog(400))
M1000<-sd(myprog(1000))
dat2<-c(M4,M9,M16,M25,M100,M400,M1000)
names(dat2)<-c("M4","M9","M16","M25","M100","M400","M1000")
barplot(dat2,col="red",xlab="サンプルサイズ",ylab="標準偏差値")
abline(h=0)

x(母集団)からn個のデータを抽出するための関数
「xからa個のデータを抽出し平均を求める」という行為を10回繰り返した結果を返す関数
緑色はコメントです



2.中心極限定理をシュミレーションしてみる

 標本の大きさを無限に大きくすれば母集団の平均に近づくということは考えてみれば当然といえば当然です。例えば母集団を構成する人数が1000人だった場合、990人とかをサンプリングすればほとんど母集団の平均と同じになるわけですからね。

Rによるシュミレーションの手順

  1. 10000個の乱数を発生させる
  2. 乱数からN個のデータを取り出しその平均を求める(N=4,9,16,25,100,400,1000)。これを100回繰り返す。つまり最終的に100個のデータができる。
  3. 上で作った100個のデータをもとにヒストグラムを作成する。ヒストグラムは0から1の区間で20等分する。

 sampling()は大数の法則で使用したものと同じでxからn個のデータをサンプリングするための関数です。myprog()は手順2・3をまとめて実行するためのものです。
 myprog(a)・・・aにはサンプルの大きさを指定してください。実行するとヒストグラムができあがるのでサンプルサイズが大きくなるにつれてどのように平均値が変わるかを見てください。ちなみにwindows()は新しいグラフウィンドウを開くための関数です。

x<-runif(10000)
sampling<-function(x,n){
return(x[order(runif(length(x)))][1:n])
}
myprog <- function(a)
{
v1<-sapply(1:100, function(i) sampling(x,a))
v2<-apply(v1,2,mean)
hist(v2,breaks=seq(0,1,0.05))
}
myprog(4)
windows()
myprog(9)
windows()
#以下は省略