[6] 母集団と標本


  [6.1] ランダム抽出
  [6.2] シミュレーション

[6.1] ランダム抽出

(有限)母集団から指定された個数のデータをランダムに抽出するには、sample( )関数を用います。一方、(標準)正規分布から指定された個数のデータをランダム抽出する場合は、rnorm( )関数を使います。

R の関数を使いこなそう
sample( 母集団ベクトル, 抽出データ数 )母集団から指定個データをランダム抽出する
replace=T一度抽出されたデータを復元してからデータ抽出する
(省略時は非復元抽出)
rnorm( 抽出データ数 )正規分布から指定された個数のデータを抽出する
mean = 値正規分布の平均値を指定、省略時は0
sd = 値正規分布の標準偏差を指定、省略時は1

sample( 1:10, 8 ) # 非復元で抽出(同じデータは選ばれない) [1] 3 5 10 7 9 8 6 2 sample( 1:10, 8, replace=T ) # 復元で抽出(同じデータが抽出されることがある) [1] 9 2 5 4 4 3 1 5

 朝日新聞投書データセット(asahi.df)の中に文長(slength)データがあります。この文長データを有限母集団とし、10個のデータをランダムに抽出してみます。

attach( asahi.df )
sample( slength, 10 ) # 文長データから10個ランダム抽出
[1] 29.24 45.27 37.25 50.30 34.29 30.50 30.53 43.64 31.80 34.13
sample( slength, 10 ) # 再度抽出(同じ結果にはならない)
[1] 35.07 32.77 34.46 51.56 33.92 38.92 33.93 26.94 39.92 34.79


[6.2] シミュレーション

6.2.1 大数の法則

大数の法則(the law of large number)とは、ある試行を何回も行えば、確率は一定値に近づくという法則です。たとえば、ある母集団から標本を抽出を繰り返し行い、抽出された標本の平均値の平均を求めると、母平均に近づいていきます。
 朝日新聞投書データセット中の文長(slength)データを有限母集団として使って、大数の法則が当てはまるか、シミュレーションで確認してみましょう。

mean(slength)
[1] 38.55756
sd(slength)
[1] 9.379022

この母集団はμ=38.56(文字)、σ=9.38です。今、この母集団から標本サイズN=5の標本を、1個から1000個まで取り出します。そして、抽出標本の平均値の平均を計算して、ベクトル変数Smeanに格納します。変数Smeanの値が、母平均38.56に近づいていくかどうかを観察しましょう。

R の関数を使いこなそう
mtext( message )文字列変数messageをグラフ枠の外marginに出力
side=値出力位置(1:下、2:左 3:上 4:右)、省略時は上
cex=値文字拡大比率(char expansion)、省略時は1.0
font="フォント名"使用フォントを指定
paste( a, "string", c )文字列変数や文字列定数を順番につなぎ合わせる

times <- 1000
Smean <- vector(length=times)
sum <- 0
for ( i in 1:times ) {
data <- mean( sample( slength, 5 ) )
sum <- sum + data
Smean[i] <- sum / i
}
plot( 1:times, Smean, xlab="times", ylab="sample mean" )
myu <- round( mean( slength ), 3 )
mtext( paste( "μ=", myu ) )
abline( h=mean(slength), col="red", lwd=2, lty=2 )

上の図では平均値が理論値に近づいていく様子を確認できますが、必ずしもそうはならないこともあります。ここでは1000回の標本抽出を行いましたが、回数を増やすと理論値に近づいていき、大数の法則が成り立つことが確認できます。

6.2.2 標準誤差

標本抽出分布の標準偏差を標準誤差(standard error, SE)といい、統計分析において重要な役割を果たします。標準誤差の大きさは標本サイズNが大きくなるほど小さくなり、SE=σ/sqrt(N)という理論値に近づくとされます。ここでは、抽出回数を20回で固定しておき、標本サイズだけを1〜200まで大きくしていきます。そのとき、20個の平均値データの標準偏差(標準誤差)がどのように推移するか、シミュレーションしてみましょう。

size <- 200
times <- 20
y <- vector(length=size)
data <- vector(length=times)
for ( i in 1:size ) {
  for( j in 1:times ) {
    data[j] <- mean( sample( slength, i ) )
  }
  y[i] <- sd( data )
}
x <- 1:size
plot( x, y, xlab="sample size(N)", ylab="Standard Error", axes=F )

y <- sd(slength)/sqrt(x) # 理論値を代入
par( new=T ) # 理論値曲線を追加
plot( x, y, type="l", col="red", ylab="", xlab="", lwd=2 )

赤い曲線は理論値です。シミュレーションの結果、ほぼ理論の予測通り、標準誤差の大きさは標本サイズが大きくなるにつれて急速に小さくなる様子が観察されます。

6.2.3 中心極限定理

最後のシミュレーションは、中心極限定理(the central limit theorem)です。この定理は、たとえ母集団が正規分布でなくても、標本サイズが大きくなると、標本平均値の分布は正規分布に近づいていく、というものです。理論的には、その正規分布の平均は母平均μ、標準偏差はσ/√Nとなります。

ここでは、母集団としてカタカナ語使用回数データを使うことにします。このデータは離散変数で、ヒストグラムや Q-Qプロットが示すように、明らかに、正規分布ではありません。

par( mfrow=c(1, 2) )
hist( katakana, right=F )
result <- qqnorm( katakana )
qqline( katakana, col="red", lwd=2 )
r <- round( cor( result$x, result$y ), 3 )
mtext( paste( "r=" r ) )
par( mfrow=c(1, 1) )

このカタカナ使用回数の母集団の平均は4.583、標準偏差は4.073です。この母集団から、標本サイズを1〜100まで徐々に大きくしながら、毎回100個ずつ標本抽出を行います。100個の標本平均データに対して、正規性の尺度として相関係数を計算し、ベクトル変数に格納していきます。中心極限定理は、標本サイズが大きくなるにつれて標本抽出分布が正規分布に近づくと予測しますので、計算した相関係数が1に近づくと予測します。

R の関数を使いこなそう
変数 <- qqnorm( ベクトル変数 )QQプロットを描く、戻り値を格納
plot.it=FQQプロットを描画しない
cor( ret$x, ret$y )理論値xと元データyの相関を求める
mtext( message )文字列変数messageをグラフ枠の外marginに出力
side=1,2,3,4出力位置(1:下、2:左 3:上 4:右)、省略時は上
cex=値文字拡大比率(char expansion)、省略時トは1.0
font="フォント名"使用フォントを指定
paste( a, "string", c )文字列変数や文字列定数を順番につなぎ合わせる

size <- 1:100 # 標本サイズ
n <- 100 # 抽出する標本数
r <- vector( length=size ) # 相関係数データを格納するベクトル
for ( i in size ) {
mean.data <- vector( length=n )
for ( j in 1:n ) {
mean.data[j] <- mean( sample( katakana, i ) )
}
ret <- qqnorm( mean.data, plot.it=F ) # QQプロットを描画せず
r[i] <- cor( ret$x, ret$y ) # 相関係数を格納
}
plot( size, r[size], ylim=c(0.90, 1 ), xlab="標本サイズ",
ylab="正規分布との相関係数", main="中心極限定理のシミュレーション" )

[6.3] シミュレーションの関数化

一連の計算処理をひとまとめにして、関数化すると便利です。計算に必要な変数は、引数で指定します。ここでは、6.2節で行った3つのシミュレーションを行う関数を作成します。

6.3.1 large.number( )

最初は、標本サイズと標本抽出分布の平均の推移です。必要な引数は、母集団データpop、標本サイズsize、抽出回数timesの3つです。

l arge.number <- function( pop, size, times ) {
Smean<-vector(length=times)
sum <- 0
for ( i in 1:times ) {
xbar <- mean( sample( pop, size ) )
sum <- sum + xbar
Smean[i] <- sum / i
}
plot( Smean, main="標本抽出回数と抽出分布平均", xlab="抽出回数",
ylab="標本抽出分布の平均" )
myu <- mean( pop )
pop.str <- deparse( substitute( pop ) )
mtext( paste( "population=", pop.str, ", μ=", round(myu, 3),
", sample size=", size ) )
abline( h=myu, col="red", lwd=2, lty=2 )
}

large.number( noun, 10, 500 )

6.3.2 stderr( )

stderr <- function( pop, size, times ) {
y <- vector(length=size)
data <- vector(length=times)
for ( i in 1:size ) {
for( j in 1:times ) {
data[j] <- mean( sample( pop, i ) )
}
y[i] <- sd( data )
}
x <- 1:size
plot( x, y, xlab="sample size(N)", ylab="Standard Error", axes=F )

y <- sd(slength)/sqrt(x) # 理論値を代入
par( new=T ) # 理論値曲線を追加
plot( x, y, type="l", col="red", ylab="", xlab="", lwd=2 )
}

stderr( slength, 200, 50 )

6.3.3 central.limit( )

central.limit <- function( pop, size, times ) {
r <- vector( length=size ) # 相関係数データを格納するベクトル
for ( i in 1:size ) {
mean.data <- vector( length=times )
for ( j in 1:times ) {
mean.data[j] <- mean( sample( pop, i ) )
}
ret <- qqnorm( mean.data, plot.it=F ) # QQプロットを描画せず
r[i] <- cor( ret$x, ret$y ) # 相関係数を格納
}
plot( 1:size, r, ylim=c(0.90, 1 ), xlab="標本サイズ",
ylab="正規分布との相関係数", main="中心極限定理のシミュレーション" )
}

central.limit( katakana, 100, 50 )

標本抽出分布の平均値シミュレーションlarge.number.R
標準誤差のシミュレーションstderr.R
中心極限定理のシミュレーションcentral.limit.R