最終更新日 : 2008.2.6
nで割るの?それともn-1で割るの?
方々の掲示板などでで分散(あるいは標準偏差)を求めるときに「なぜnではなくn-1で割るのか」という質問を見かけます。こういうことは、もちろん統計学の教科書にある数式による説明を見て理解できれば一番よいでしょう。しかし、コンピュータを利用して確かめるという手もありますから、数式による理解が不十分であっても何とかなることもけっこう多いものです。
まず、結論からいうと、サンプルサイズが大きいときはnで割っても、n-1で割ってもそう大差はありませんが、サンプルサイズが小さいときはnで割ってしまうと、その値は随分と小さめに出てしまうのです。n-1で割ることによって得られる不偏推定量(不偏分散、不偏標準偏差)ではサンプルサイズが小さい場合でも特に問題なく使えるのです。
これを実際にRでシミュレーションしてみましょう。手順としては、
ということをする。
■ Rでの実行例(サンプルサイズが100の場合)
# サンプルサイズが100の場合 a <- c() for(i in 1:100) a[i] <- sd(rnorm(100, mean=10, sd=2)) #不偏標準偏差 plot(a, ylim=c(1,3), main="サンプルサイズが100の場合", ylab="標準偏差値", xlab="計算回数") abline(h=mean(a)) b <- c() for(i in 1:100) b[i] <- sd2(rnorm(100, mean=10, sd=2)) #標準偏差 points(1:100, b, col="red") abline(h=mean(b), col="red") abline(h=2, col="blue")
■ Rでの実行例(サンプルサイズが50の場合)
# サンプルサイズが50の場合 a <- c() for(i in 1:100) a[i] <- sd(rnorm(50, mean=10, sd=2)) #不偏標準偏差 plot(a, ylim=c(1,3), main="サンプルサイズが50の場合", ylab="標準偏差値", xlab="計算回数") abline(h=mean(a)) b <- c() for(i in 1:100) b[i] <- sd2(rnorm(50, mean=10, sd=2)) #標準偏差 points(1:100, b, col="red") abline(h=mean(b), col="red") abline(h=2, col="blue")
■ Rでの実行例(サンプルサイズが10の場合)
# サンプルサイズが10の場合 windows() a <- c() for(i in 1:100) a[i] <- sd(rnorm(10, mean=10, sd=2)) #不偏標準偏差 plot(a, ylim=c(1,3), main="サンプルサイズが10の場合", ylab="標準偏差値", xlab="計算回数") abline(h=mean(a)) b <- c() for(i in 1:100) b[i] <- sd2(rnorm(10, mean=10, sd=2)) #標準偏差 points(1:100, b, col="red") abline(h=mean(b), col="red") abline(h=2, col="blue")
黒いラインは不偏標準偏差、赤いラインは標準偏差、そして青いラインは母標準偏差です。サンプルサイズが100のときは不偏標準偏差と母標準偏差はほぼ一致しているが、標準偏差はやや低めであることが分かります。サンプルサイズが50のときもほぼ似たようなもの。サンプルサイズが10のときになると母標準偏差から大分離れているのが見て取れる。
いずれにしても、標準偏差は低めにでて、母標準偏差との差も不偏標準偏差に比べて大きい。ただし、今回提示したコードを走らせても、このページのグラフ(結果)とピッタリ一致することはないので注意。自分で何回か同じコードを繰り返し実行してみるとよい。