必要なパッケージを読み込む。
library(tidyverse)
次に、日本語が正しく表示されるようにする。
## 図のなかで日本語を使えるようにする
if (.Platform$OS.type == "windows") {
# Window
if (require(fontregisterer)) {
<- "Yu Gothic"
my_font else {
} <- "Japan1"
my_font
}else if (capabilities("aqua")) {
} # macOS
<- "HiraginoSans-W3"
my_font else {
} # Unix/Linux
<- "IPAexGothic"
my_font
}
theme_set(theme_gray(base_size = 9,
base_family = my_font))
例として、女性4,600人、男性5,400人から成る母集団を考える。合計10,000人で、女性比率が0.46、男性比率は0.54である。これらは母集団の比率なので、母比率と呼ばれる。
この母集団 (population) をRで定義しよう。
<- rep(c("female", "male"), c(4600, 5400)) pop
総人口を確認する。
length(pop)
## [1] 10000
男女の数を確認する。
table(pop)
## pop
## female male
## 4600 5400
例題どおりの母集団が定義できた。
ここで、私たちは母比率を知らないと仮定しよう。 正しい母比率を調べるもっとも単純な方法は、1万人全員の性別を調べることである。しかし、1万人を調査するのは大変なので、1万人から100人だけを無作為に(ランダムに)選んで、100人の性別を調べ、母比率を推定することにする。
上で定義した母集団から、ランダムに100人を抜き出してみよう。
sample()
でランダムに100人抽出すればよい。同じ人物を2度以上抜き出すことがないよう、replace = FALSE
で非復元抽出を指定する。また、標本サイズ \(N\) は繰り返し使うので、最初に定義しておく。
<- 100
N <- sample(pop, size = N, replace = FALSE) sample_1
取り出した\(N=100\)のサンプルで、男女の比率を調べてみよう。
table(sample_1) / N
## sample_1
## female male
## 0.48 0.52
この比率は標本(サンプル)の比率なので、標本比率と呼ばれる。 女性比率だけを調べる(女性比率がわかれば男性比率もわかるので)には、
sum(sample_1 == "female") / N
## [1] 0.48
または、
mean(sample_1 == "female")
## [1] 0.48
とすればよい。
もう一度、別の100人で調べてみよう(先ほどと同じ人物が選ばれる可能性はある)。
<- sample(pop, size = N, replace = FALSE)
sample_2 mean(sample_2 == "female")
## [1] 0.5
もう一度、別の100人で調べてみよう(先ほどと同じ人物が選ばれる可能性はある)。
<- sample(pop, size = N, replace = FALSE)
sample_3 mean(sample_3 == "female")
## [1] 0.49
このように、毎回異なる標本比率が得られる。標本から得られる統計量は、母数(この例題の場合は母比率)と必ずしも一致しないし、同じ方法を何度も繰り返すと異なる値が得られる。
1万人から100人を選ぶ方法は \(6.5 \times 10^{241}\) 通りあるので、全部の組み合わせを調べるのは不可能である。そこで、Rを使って10,000通りだけ調べてみよう。
まず、1万個の結果(女性の標本比率)を保存する容器(ベクトル, vector)を用意する。
<- rep(NA, 1e4) res_1
NA
は欠測値(値がないこと)を表す。まだ結果を得ていないので、欠測値が1万個ある「空の」容器を用意した。 確認のため、最初の10個分だけ表示してみよう。
1:10] res_1[
## [1] NA NA NA NA NA NA NA NA NA NA
すべて NA である。
次に、forループ を使って標本抽出(サンプリング)と母比率の計算を1万回実行する。\(i\)番目の結果は、res_1 の \(i\)番目の値として保存する。res_1の\(i\) 番目は res_1[i]
と書く。
for (i in 1:1e4) {
<- sample(pop, size = N, replace = FALSE)
x <- mean(x == "female")
res_1[i] }
これで、結果が res_1 に保存された。確認のため、最初の10個の結果を表示してみよう。
1:10] res_1[
## [1] 0.47 0.54 0.50 0.44 0.47 0.59 0.53 0.49 0.47 0.45
さきほどは NA
だったところに数値(標本比率)が保存されたことがわかる。
結果をヒストグラムにしてみよう。私たちは母比率を知っているので、母比率である0.46を赤い線で示す。
<- tibble(sample = res_1)
df1 <- ggplot(df1, aes(x = sample)) +
hist1 geom_histogram(binwidth = 0.02,
color = "black",
fill = "dodgerblue") +
geom_vline(xintercept = 0.46,
color = "red",
size = 1.5) +
labs(x = "女性の標本比率",
y = "度数")
plot(hist1)
ヒストグラムを見ると、一つひとつの標本比率は母比率よりも大きかったり、墓碑率よりも小さかったりすることがわかる。しかし、平均すると母比率に近い値を得ることができそうだ。
このヒストグラムからわかる通り、統計量は標本ごとに分布する。このような標本ごとの分布を 標本分布 (sampling distribution) と呼ぶ(標本分布については、次のトピックで説明する)。
標準誤差は、標本分布に現れる標準偏差(統計量のばらつき)なので、このシミュレーションで得られる標準誤差は、
sd(res_1)
## [1] 0.04930977
である。
詳しくは次のトピックで説明するが、理論的には \[\mbox{SE} = \frac{母標準偏差}{\sqrt{標本サイズ}}\] なので、
<- 0.46
pi <- sqrt(pi * (1 - pi))
pop_sd / sqrt(100) pop_sd
## [1] 0.04983974
になるはずであるが、シミュレーションなので実行する度に値が変わり、理論値に近づいたり離れたりする。
標本サイズ \(N\) の値を変えて (N = 25, N = 400)、同様のシミュレーションを実行してみよう。