大数の法則と中心極限定理
大数の法則(law of great number)と中心極限定理(central limiting theorem)は統計学の中でも非常に重要かつ基本的な考え方です。この2つの性質を証明しようとするとかなりの数学的知識を要するのですが、現在ではコンピュータがあるのでシュミレーションを行うことによってこれらの性質を実感することができます。
*1復元抽出とは1度取り出した要素を元に戻してから再び取り出す方法です。
1.大数の法則をシュミレーションしてみる
もう少し大数の法則を分かりやすく説明すると、例えばコインの裏表が出る確率はそれぞれ1/2であることはご存知ですね?しかしコインを5・6回投げただけでは表(あるいは裏)が出る確率のほうが大きくなってしまうかもしれません。これを100回、200回、・・・とたくさん投げ続ければ次第に表裏の出る確率は均等(つまり1/2)になっていくはずです。
Rによるシュミレーションの手順
シュミレーションをもっとカンタンに実行できるような関数も作れますが、面倒でも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によるシュミレーションの手順
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() #以下は省略 |