R パッケージ一覧library(tidyverse)
library(patchwork)統計学は記述統計学 (descriptive statistics) と推測統計学 (inferential statistics) の二つに分類できる
記述統計学では、平均や分散(データの散らばり)などを使って、データの特徴を整理したり記述する
推測統計学では、母集団 (population) から標本 (sample) を無作為に抽出し、その標本によって得られた標本平均や不偏分散などの統計量を使って、母集団の母数(母平均や母分散)を検定し推定する
母集団の全てを調査すること・・・全数調査(センサスまたは悉皆 [しっかい] 調査)
しかし、現実的に全数調査を行うことが出来ないことが多い → 母集団の一部を切り取る(標本:サンプル)
推測統計学の基本的な考えは、母集団からランダムに抽出した標本を増やし、無限に試行を繰り返せば、全体の一部である標本から、巨大で未知の母集団を推測できる、ということ(= 統計的推論)
推測統計学では、分析対象が確率分布すると考える
ここでは推測統計学の基礎を演習する
estimation)・・・具体的な値を用いて「母集団の平均値は○○くらいだろう」と予想すること test)・・・母集団について述べた異なる 2 つの「仮説」のうちどちらかを採用すること推測統計学においては、標本サイズ (sample size) と標本数 (the number of samples) が混同されがちなので、十分注意が必要
標本サイズ (sample size)・・・・・・・n で表す抽出した観測数のこと
標本数 (the number of samples) ・・・ n 個の観測数で抽出した標本セット数
例:
→ 標本数は 2(標本 A と標本 B)であり、標本サイズはそれぞれ 2,000 と 1,000 である
母数と統計量:
推測統統計学では、母数 (parameter) と統計量 (statistic) とを明確に区別しているので注意が必要
母数
population meanpopulation ratiopopulation variancepopulation standard deviation標本統計量
sample meansample ratiosample varianceunbiased variancesample varianceunbiased standard deviationRandom Sampling)(1) 単純ランダム・サンプリング法 (simple random sampling):
(2) 多段抽出法:
【母平均 \((μ)\) と標本平均 \(\bar{x}\) の関係】
母集団に関する母数は未知のことが多いが、ここでは R を使って人工的に母集団を作成してみる
作成する母集団は、母平均 10、母標準偏差 5(母分散 = 25)
dnorm()関数を使うと、母集団を人工的に作成でき、その分布密度を表示できる
# 母平均 10、母標準偏差 5 と指定
# -10 から 30 の範囲を指定
curve(dnorm(x, 10, 5), from = -10, to = 30) この母集団からランダムに標本を抽出する
抽出する標本サイズは 20 (N = 20)で、その標本に \((x1)\) と名前を付ける
ここで人工的に作成した母集団からランダムサンプリングする時は rnorm() 関数を使う
# 平均10、標準偏差 5 (sd = 5) の母集団から 20 個の数字を無作為抽出して x1 と名付け、データとヒストグラムを表示する
x1 <- rnorm(20, mean = 10, sd =5)
x1 [1] 7.191427 17.707697 9.749040 12.720787 15.094785 15.396032 10.072061
[8] 6.798442 8.820112 6.858025 10.179139 3.921366 4.517479 13.924562
[15] 10.191817 4.302003 18.414976 9.708356 7.567451 6.455296
round() 関数を使って指定できる 例えば、整数を表示したければ、小数点以下の表示桁数 (digits) を 0 と指定すればよい round(x1, digits = 0) # 小数点以下表示したい桁数を指定 [1] 7 18 10 13 15 15 10 7 9 7 10 4 5 14 10 4 18 10 8 6
hist(x1) # 取り出したサンプルをヒストグラムで表す
標本 \((x)\) の標本平均 \(\bar{x}\) は次の式で求めることができる: \[\bar{x} = \frac{\sum_{i=1}^n x_i}{n}\]
・R では mean( ) を使えば標本平均を求めることができる
mean(x1) # 取り出したサンプル x1 の平均値[1] 9.979543
\[\bar{x} = \frac{\sum_{i=1}^n x_i}{n}\]
推定量 (estimator) :
母数の推定のために利用され、標本の関数として表現される・・・ここでは上記 \(\bar{x}\) の式
推定値 (estimate) :
実際に標本の数値を代入して計算した結果の数値・・・ここでは上記 \(\bar{x}\) の 値
標本サイズ 20 の標本を無作為抽出して x2 と名付け、標本平均を求めてみる
母集団の平均は 10 (mean = 10)、標準偏差は 5 (sd = 5) と指定
x2 <- rnorm(20, mean = 10, sd =5)
x2 [1] 2.2102410 5.6472328 18.7305019 16.6984417 4.6051185 8.3373866
[7] 10.1534012 10.3106054 8.3268239 12.1513965 4.8177404 6.1054748
[13] 13.6114709 10.4737223 -0.6118851 12.5638541 6.2480742 10.8739064
[19] 1.1506101 20.2324380
round(x2, digits = 0) # 小数点以下表示したい桁数を指定 [1] 2 6 19 17 5 8 10 10 8 12 5 6 14 10 -1 13 6 11 1 20
hist(x2) # 抽出したサンプルをヒストグラムで表すmean(x2) # 取り出したサンプル x2 の平均値[1] 9.131828
x1, x2, ..... xn)、母平均より大きかったり小さかったりする標本平均が得られ、それらの値を平均すると母平均に一致する min( ), median( ), max( )などのコードを使うと最小値、中央値、最大値などの記述統計が簡単に得られる min(x2) # min = 最小値[1] -0.6118851
median(x2) # median = 中央値[1] 9.245394
max(x2) # max = 最大値[1] 20.23244
quantile(x2, c(0, .25, .5, .75, 1)) 0% 25% 50% 75% 100%
-0.6118851 5.4398597 9.2453939 12.2545109 20.2324380
CLT: Central Limit Theorem) とは、母集団が正規分布していなくても「標本サイズ(サンプルサイズ)が大きくなれば、標本平均は正規分布で近似できる」という定理正規分布 (Normal Distribution)
「平均値の付近に集積するようなデータの分布を表した連続的な変数に関する確率分布」
様々な分布を正規分布に見立てると、その内容の範囲を確率的に予想することが可能になる
例えば、95%の信頼区間が \(([\bar{x} - 1.96\mathrm{SE}, \bar{x} + 1.96\mathrm{SE}])\) (SEは標準誤差で、標本平均の標準偏差のこと)の間に存在することを推定するために「正規分布では母平均 \((\mu)\) を中心に±1.96標準偏差の中に全体の 95% が収まる(\((\mu \pm 1.96 \sigma)\))」という事実を使えるのは中心極限定理の裏付けがあるから
ここでは R を使ってシミュレーションを実行し、中心極限定理の信憑性を「実感」することが目的
標本サイズが大きくなると、標本平均は近似的に正規分布に従うのか?
バックに入れた10枚のカードを使ったシミュレーション
bag <- 0:9 # 人工的に 0 から 9 までのカードを作成
exp_1 <- sample(bag, # カードが入っている bag を使う
size = 2, # 引くカードは 2 枚と指定(標本サイズ N = 2)
replace = TRUE) # 取り出したカードは元に戻すと指定
mean(exp_1) # 平均値を計算して表示 [1] 8.5
実験をやる度に異なる平均値が得られる(何回か試して下さい)
この実験を 1,000 回繰り返してみよう
「それぞれの回で得られた平均値の分布」はどんな形か確かめる
R で同じ作業を繰り返し行う簡単な方法は、for ループを使う
for ループの使い方:
例えば、0 からスタートして「10を足す」という作業を 5 回繰り返すには、次のようにする
まず、スタート時の数である 0 を作成し、保存する
A <- 0 # スタート時の数である A を 0 と指定し保存 result という名前の入れ物を用意するresult <- rep(NA, # NA は「中身が空」であることを表す
length.out = 5) # 保存場所として何カ所必要かを指定 result の中身を確認してみるresult[1] NA NA NA NA NA
forループを使って、数を 10 だけ加える作業を 5 回繰り返してみるfor の直後の丸カッコ ( ) の中に繰り返し回数を指定し、ループさせる内容を中括弧 \(\{ \}\) で囲むfor(i in 1:5){ # i が 1 から 5 まで繰り返すという意味
A <- A + 10 # A に 10 を足す
result[i] <- A # i 番目の作業(=足し算)の結果を result[i] に入れる
}
result # 入れ物の中身を確認[1] 10 20 30 40 50
→入れ物 (result) の中に想定どおりの数値 (0 からスタートして 10ずつ足した数) が入っていることがわかる
for ループの使った中心極限定理のシミュレーション:
sim1: 標本サイズ = 2, 繰り返し回数 = 10
for ループを利用して、皆さんが授業の実習で実施したように、カードを 2 回引く作業を 10 回繰り返してみるN <- 2 # 標本サイズ(カードを 2 枚選ぶ)
trials <- 10 # 実験の繰り返し回数 = 10
sim1 <- rep(NA, length.out = trials) # 結果の保存容器
for (i in 1:trials) {
experiment <- sample(bag,
size = N,
replace = TRUE) # 復元抽出
sim1[i] <- mean(experiment) # i 回目の平均値を保存
}文字化けしないためのコマンド(マックユーザのみ)
theme_set(theme_bw(base_size = 14,base_family = "HiraKakuPro-W3"))df_sim1 <- tibble(avg = sim1)
h_sim1 <- ggplot(df_sim1, aes(x = avg)) +
geom_histogram(binwidth = 1,
boundary = 0.5,
color = "black") +
labs(x = "2枚のカードの平均値",
y = "度数") +
ggtitle("SIM1: N = 2, 繰返回数 = 10") +
scale_x_continuous(breaks = 0:9) +
geom_vline(xintercept = mean(df_sim1$avg), # 平均値に縦線を引く
col = "lightgreen")
plot(h_sim1)df_sim1# A tibble: 10 x 1
avg
<dbl>
1 7.5
2 1.5
3 4
4 5.5
5 9
6 7
7 1.5
8 1.5
9 7
10 3
mean(df_sim1$avg)[1] 4.75
sim2: 標本サイズ = 5, 繰り返し回数 = 100
N <- 5 # 標本サイズ(カードを 5 枚選ぶ)
trials <- 100 # 実験の繰り返し回数 = 100
sim2 <- rep(NA, length.out = trials) # 結果の保存容器
for (i in 1:trials) {
experiment <- sample(bag,
size = N,
replace = TRUE) # 復元抽出
sim2[i] <- mean(experiment) # i 回目の平均値を保存
}文字化けしないためのコマンド(マックユーザのみ)
theme_set(theme_bw(base_size = 14,base_family = "HiraKakuPro-W3"))df_sim2 <- tibble(avg = sim2)
h_sim2 <- ggplot(df_sim2, aes(x = avg)) +
geom_histogram(binwidth = 1,
boundary = 0.5,
color = "black") +
labs(x = "5 枚のカードの平均値",
y = "度数") +
ggtitle("SIM2: N = 5, 繰返回数 = 100") +
scale_x_continuous(breaks = 0:9) +
geom_vline(xintercept = mean(df_sim2$avg), # 平均値に縦線を引く
col = "lightgreen")
plot(h_sim2)df_sim2# A tibble: 100 x 1
avg
<dbl>
1 5.8
2 5.2
3 3.8
4 6
5 2.6
6 3
7 5.2
8 4.2
9 6.2
10 3.2
# … with 90 more rows
mean(df_sim2$avg)[1] 4.602
sim3: 標本サイズ = 100, 繰り返し回数 = 1000
N <- 100 # 標本サイズ(カードを 100 枚選ぶ)
trials <- 1000 # 実験の繰り返し回数
sim3 <- rep(NA, length.out = trials) # 結果の保存容器
for (i in 1:trials) {
experiment <- sample(bag, size = N, replace = TRUE) # 復元抽出
sim3[i] <- mean(experiment) # i 回目の平均値を保存
}df_sim3 <- tibble(avg = sim3)
h_sim3 <- ggplot(df_sim3, aes(x = avg)) +
geom_histogram(binwidth = 0.125,
color = "black") +
labs(x = "100枚のカードの平均値", y = "度数")+
ggtitle("SIM3: N = 100, 繰返回数 = 1000") +
scale_x_continuous(breaks = 0:9) +
geom_vline(xintercept = mean(df_sim3$avg), # 平均値に縦線を引く
col = "lightgreen")
plot(h_sim3)df_sim3# A tibble: 1,000 x 1
avg
<dbl>
1 4.72
2 4.94
3 4
4 4.83
5 4.85
6 4.59
7 4.87
8 4.23
9 4.99
10 4.26
# … with 990 more rows
mean(df_sim3$avg)[1] 4.51027
library(patchwork)h_sim1 + h_sim2 + h_sim3まとめ ・元になる母集の分布は一様分布でも、サンプルサイズ N を増やすと「平均値の分布」は正規分布に近づく
→サンプルサイズ N が十分大きい(大まかな目安はN >100)とき、正規分布を使って統計的推定や検定を行うことが許される
sampling distribution) : - ある標本サイズで標本を抽出したとき、そこで得られる統計量の分布choose( ) コードを使って次のように計算できる choose(10, 3) # 10 人から 3 人を選ぶ組み合わせ[1] 120
choose(100000000, 10)[1] 2.755731e+73
・当選回数 3, 6, 12回の母集団を作成し、母平均と母標準偏差を計算する
win <- c(3, 6, 12) # 当選回数 3, 6, 12回の母集団を作成
mean(win) # 当選回数の母平均[1] 7
var1 <- ((7-3)^2 +(7-6)^2 + (7-12)^2)/3
var1[1] 14
sqrt(var1)[1] 3.741657
平均当選回数は 7 回、当選回数の標準偏差は 3.7
従って、母平均 \((μ = 7)\)、母標準偏差 \((σ = 3.7)\)
この母集団からサイズ = 2 の標本を全て選ぶ
A, B, C の 3 人から 2 人が選ばれるのは次の 3 通り:「A と B」、「A と C」、「B と C」
例えば「選ばれる人物」が「A と B」の当選回数に関する標本平均と標本標準偏差を R で計算してみると、
ab <- c(3, 6) # A と B が選ばれたサンプルを ab と名付ける
mean(ab) # サンプル ab の標本平均[1] 4.5
var2 <- ((4.5-3)^2 + (4.5-6)^2)/2
var2[1] 2.25
sqrt(var2)[1] 1.5
\[{μ} = \frac{4.5+7.5+9}{3} = 7\]
\[\frac{1.5+4.5+3}{3} = 3 < {3.7}.\]
sd( ) 関数 を使って推定する sd(win) # win の不偏標準偏差を求める[1] 4.582576
母分散 \((\sigma^2)\) を求める式・・・(母標準偏差 \((σ)\) は \((σ^2)\) の平方根)
\[\sigma^2 = \frac{\sum_{i=1}^N (x_i - \mu)^2}{N}\]
不偏分散 \((u_x^2)\) を求める式・・・(不偏標準偏差 \((u_x)\) は \((u_x^2)\) の平方根)
\[u_x^2 = \frac{\sum_{i=1}^n (x_i - \bar{x})^2}{N-1}\]
母分散 \((\sigma^2)\) ・・・var(x) - (length(x) - 1) / length(x)
母標準偏差 \((\sigma)\) ・・・sqrt(var(x) - (length(x) - 1) / length(x))
不偏分散 \((u_x^2)\) ・・・var(x)
不偏標準偏差 \((u_x)\) ・・・sd(x)
height <- rnorm(100000, 170, 6)
hist(height)choose(100000, 10)[1] 2.754492e+43
sample1 と名付け、標本平均を求め、ヒストグラムで示す sample1 <- sample(height, 10, replace = FALSE) # 標本サイズ 10 で無作為抽出する
hist(sample1) # ヒストグラムで表すmean(sample1) # sample1 の平均値を表示する[1] 164.0849
アニメーションを使ったシミュレーション (n = 10, 90)
height <- rnorm(100000, 170, 6)
## Parameters: n = 標本サイズ
## T = 標本数
height_experiment <- function(n = 10, T = 500, seed = 2016-01-24) {
means <- rep(NA, T)
s_mat <- matrix(NA, ncol = n, nrow = T)
set.seed(seed)
height <- rnorm(100000, 170, 6)
for (i in 1:T) {
s <- sample(height, n, replace = TRUE)
s_mat[i,] <- s
means[i] <- mean(s)
par(family = "HiraKakuPro-W3", cex.lab = 1.4, cex.axis = 1.2, cex.main = 1.6, mex = 1.4)
hist(means[1:i], axes = FALSE, freq = FALSE, col = "gray",
xlim = c(min(height), max(height)),
xlab = "sample mean", ylab = "probability density",
main = paste0("sample size = ", n, ", sample id = ", i))
axis(1, min(height):max(height))
abline(v = 170, lwd = 2, col = "red")
}
axis(2)
return(s_mat)
}source("<path-of-the-directory>/height_sim.R")
sim_1 <- height_experiment(n = 10) # サイズ 10 の標本を 500 個抽出
sim_2 <- height_experiment(n = 90) # サイズ 90 の標本を 500 個抽出\[SD (\bar{x})= \frac{\sigma}{\sqrt{n}}\]
\[SD (\bar{x})= \frac{\sigma}{\sqrt{n}}\]
\[= \frac{6}{\sqrt{10}}\] \[= 1.9\]
\[SD (\bar{x})= \frac{\sigma}{\sqrt{n}}\]
\[= \frac{6}{\sqrt{90}}\] \[= 0.63\]
点推定 (point estimation): 例)「母平均は 45 点」
区間推定 (interval estimation): 例)「母平均は 43 点以上、47 点以下」
信頼区間 (confidence interval: CI)・・・推定に伴う不確実性を表すために利用される
標本平均の標準偏差 \(({SD (\bar{x}})\))がわかる
→ 標本平均の不確実性を捉えることができる
→ 推定の不確実性を明らかにできる
標本平均の標準偏差 \(({SD (\bar{x}})\))を求める式は、
\[SD (\bar{x})= \frac{\sigma}{\sqrt{n}}\]
母標準偏差 \({\sigma}\) と 標本サイズ \(n\) の値がわかれば、標本平均の標準偏差 \(({SD (\bar{x}})\))がわかる
標本サイズ \(n\) はわかるが、母標準偏差 \({\sigma}\) は通常わからない → 母標準偏差 \({\sigma}\) の代わりに不偏標準偏差 \(u_x\) を使って、標本平均の標準偏差 \(({SD (\bar{x}})\))を推定
→ このページの「標本分布」の項目を参照
\[SE = \frac{u_x}{\sqrt{n}}\]
この \(SE\) が標準誤差 (standard Error: Std. Errとも書く)
母標準偏差 \({\sigma}\) の値がわからない時には、標本平均の標準偏差 \({SD (\bar{x}})\)の推定値として標準誤差 \(SE\) を使う
\(t\) 値は、標本平均のバラツキを表す標準誤差 \(SE\) を使って、次の式で求めることができる
\[t = \frac{\bar{x} - μ}{SE} = \frac{\bar{x} - μ}{u_x / \sqrt{n}} \]
・ \(\bar{x}\) : 標本平均
・ \(μ\) : 母平均
・ \(n\) : 標本サイズ
・ \(u_x\) : 不偏標準偏差(= 標本標準偏差)
・ \(SE\) : 標準誤差 (standard Error)
参考
\[Z = \frac{\bar{x} - μ_0}{σ / \sqrt{n}} \]
\(z\) 値は、\({\sigma}\) を使って\(\bar{x}\) を変形(=標準化)した値
しかし現実のデータ分析で母集団の標準偏差 \({\sigma}\) が既知であることはほとんどない
実際には \(t\) 値を使って分析する
自由度 (df: degree of freedom) の大きさごとに 4 種類の \(t\) 分布図を描いてみる
x <- seq(-4, 4, length=100)
hx <- dnorm(x)
df <- c(1, 3, 8, 30)
colors <- c("blue", "red", "green", "gold", "black")
labels <- c("df=1", "df=3", "df=8", "df=30", "正規分布")
plot(x, hx, type="l", lty=2, xlab="t value",
ylab="Density", main="t Distribution and degree of freedom")
for (i in 1:4){
lines(x, dt(x,df[i]), lwd=2, col=colors[i])
}
legend("topright", inset=.05, title="Degree of Freedom",
labels, lwd=2, lty=c(1, 1, 1, 1, 2), col=colors)degree of freedom: df) の数値によって分布の形が変わる robability density curve)自由度99の \(t\) 分布の確率密度曲線
確率密度曲線と横軸(確率密度 = 0)に囲まれる部分の面積が確率を表す
自由度 \(({n - 1 = 99})\) のとき、\(t\) の95%は \(({-1.98})\) 以上、\(({1.98})\) 以下の範囲に収まる(この範囲を\(({[-1.98, 1.98]})\) と表す)
\(t\) 分布の形は自由度によって変わる
→ 自由度が変われば、\(({-1.98})\) や \(({1.98})\) 以外の値を使う
一般的に、\(t\) が自由度 \(({n - 1})\) の自由度 \(t\) 分布に従うとき
→ \(t\) の 95% は区間を\(({[-t_{n-1,0.025}, t_{n-1,0.025}]})\) に収まる
→ 曲線左右両端の空白部分の面積はそれぞれ \(({0.025 (0.025*2=0.05: 有意水準(α)= 0.05) })\)
→ \(t\) の 90% は区間を\(({[-t_{n-1,0.05}, t_{n-1,0.05}]})\) に収まる
→ 曲線左右両端の空白部分の面積はそれぞれ \(({0.05 (0.05*2=0.10: 有意水準(α)= 0.10) })\)
有意水準 (\(α\): level of significance)
どれくらい低い確率であれば「現実には起こりえない」と言えるのかという基準
\(α = 0.05 (5 パーセント)\)を使うのが一般的
qt( ) 関数を使うと、有意水準を指定して棄却域を求めることができる
自由度が 99 で、有意水準 5%、両側検定の時の棄却域は、
qt(0.025, 99) # t分布で下側確率が0.025、自由度99のt値[1] -1.984217
qt(0.975, 99) # t分布で下側確率が0.975、自由度99のt値[1] 1.984217
Q1: 自由度が 99 で、有意水準 10%、両側検定の時の棄却域を R を使って求めなさい
Q2: 自由度が 99 で、有意水準 1%、両側検定の時の棄却域を R を使って求めなさい
標本平均 \(\bar{x}\)、 標準誤差 \((SE = \frac{u_x}{\sqrt{n}})\) の時、母平均 \((μ)\) の 95%信頼区間は次の式で求められる
\(({[\bar{x}-t_{n-1,0.025} - SE, \bar{x} + t_{n-1,0.025} - SE]})\)
\[SE = \frac{u_x}{\sqrt{n}}= \frac{21.36}{\sqrt{100}} = 2.136\]
\(({[\bar{x}-t_{n-1,0.025} - SE < μ < \bar{x} + t_{n-1,0.025} - SE]})\)
55.13 - 1.98 - 2.136 ≦ \((μ)\) ≦ 55.13 + 1.98 - 2.136 :::
50.9 ≦ \((μ)\) ≦ 59.4
結論 ・有権者全体の民主党に対する感情温度の 95% 信頼区間は 50.9度から 59.4度
→ 「50度」は感情温度の 95% 信頼区間に含まれない
→ 母集団での感情温度の平均は 50度だとはいえない
信頼区間のまとめ
\[t = \frac{\bar{x} - μ}{SE} = \frac{\bar{x} - μ}{u_x / \sqrt{n}} \]
\[-t_{n-1,0.025} ≦ \frac{\bar{x} - μ}{SE} ≦ t_{n-1,0.025}\]
\(({[\bar{x}-t_{n-1,0.025} - SE < μ < \bar{x} + t_{n-1,0.025} - SE]})\)
得られた標本数全体の 95% については \(({[\bar{x}-t_{n-1,0.025} - SE]})\) と \(({[\bar{x}+t_{n-1,0.025} - SE]})\) の区間に、真の母平均 \((μ)\) の値が含まれるということ
こうして求められた区間を「95%信頼区間」と呼ぶ
「95%信頼区間」の意味:
「母数の値がこの区間に含まれている確率が95%」は間違い
それぞれの標本から得られた95%信頼区間に母数が含まれている確率は 0% か 100%のどちらか
→ 上から1 番目のサンプルの95%信頼区間に母数\((μ = 45)\) が含まれる確率・・・100%
→ 上から11番目のサンプルの95%信頼区間に母数\((μ = 45)\)が含まれる確率・・・ 0%
標本サイズ100で、標本数20個をとり、20個の「95%信頼区間」が得られたとする
そのうちの95%(つまり19個)は母数をとらえるが、5%(つまり1個)は母数を捉え損ねる
R を使って感情温度の問題を確かめてみる
日本の有権者の民主党に対する感情温度を調査
単純無作為抽出によって n = 100人の標本を入手
不偏標準偏差 \(u_x\) = 21.36
民主党に対する感情温度: 平均感情温度 \(\bar{x}\) = 55.13 度
有権者全体における母平均感情温度は 50 度だといえるのか?
・母集団における平均感情温度を 55 度、標準偏差を 20 と想定し、100人の標本をランダムに抽出し、記述統計を表示
set.seed(2017)
emotion <- rnorm(100, mean=55, sd=20)
summary(emotion) Min. 1st Qu. Median Mean 3rd Qu. Max.
3.14 39.56 55.20 55.13 69.00 117.75
hist(emotion)sd(emotion)[1] 21.36289
t.test(emotion, mu=50)
One Sample t-test
data: emotion
t = 2.4016, df = 99, p-value = 0.01819
alternative hypothesis: true mean is not equal to 50
95 percent confidence interval:
50.89171 59.36943
sample estimates:
mean of x
55.13057
50.89171 − 59.36943」に注目Q1: R を使って、母平均 50、母標準偏差 10 の母集団から sample size 5 の sample を 3 つ (number of samples = 3) 無作為抽出し、3つの sample それぞれのヒストグラム、平均、標準偏差を示しなさい
Q2: Rを使って、母平均 50、母標準偏差 10 の母集団からsample size500 の sample を 3 つ (number of samples = 3`) 無作為抽出し、3つの sample それぞれのヒストグラム、平均、標準偏差を示しなさい
Q3: 上の二種類のシミュレーションからどのようなことが言えるか
\[P(X = Head) = p\] \[P(X = Tail) = 1 - p\]
dbinom( ) を備えているdbinom(5, 10, 0.5) # dbinom(x, size, probability)[1] 0.2460938
dbinom(0:10, 10, 0.5) [1] 0.0009765625 0.0097656250 0.0439453125 0.1171875000 0.2050781250
[6] 0.2460937500 0.2050781250 0.1171875000 0.0439453125 0.0097656250
[11] 0.0009765625
# コインが出る回数を 0 から 10 まで指定、試行は 10 回、表が出る確率は 0.5と指定
coin10 <- dbinom(0:10, 10, 0.5)
plot(0:10, coin10, type = "h", lwd = 5) # "h"は図に垂直な線を指定、lwd では線の太さを指定\[f(X) = _NC_XP^X{(1 - P)^{N-X}}\]
choose( ) コードを使って計算できる choose(10, 5) # 10回中 5 回表が出る組み合わせ[1] 252
(0.5)^5*(1-0.5)^5[1] 0.0009765625
(252)*(0.0009765625)[1] 0.2460938
この値は上記ヒストグラムの縦棒の高さ(確率密度=確率)
この確率密度(=確率)は R では次のように求めることができる
dbinom(5, 10, 0.5) # dbinom(x, size, probability)[1] 0.2460938
前節のシミュレーションでは、コインを 10 回投げて表が出た回数(0 から 10 までの整数)を数えた (=離散値)
ここでは連続量を使ったシミュレーションを行う
連続量のデータの確率は、ある特定の値ではなく、その値を含むある「区間」を取り、その面積で表す
一例として、最小値が 140、最大値が 185 で一様分布している連続変数(早稲田大学の学生の身長)から 10 人の身長を無作為抽出してみる
ここで使うコードはrunif(n, a, b)で \((a)\) が最小値、\((b)\) が最大値、そして \((n)\) が抽出数である
runif(10, 140, 185) [1] 162.8133 170.4660 181.2077 177.7272 161.2677 171.0087 176.0036 156.1114
[9] 147.5133 150.7378
runifの r は random(無作為)、unif は uniform(一様分布)を表している runif(10, 140, 185) [1] 141.0996 142.8775 171.5061 140.8381 167.1321 170.8180 177.8217 150.8456
[9] 151.2468 175.7331
set.seed( ) を使って seed を設定できる set.seed(2016-01-09)
runif(10, 140, 185) [1] 179.9503 179.6794 149.5198 162.7430 148.9673 175.3110 171.7291 168.4825
[9] 154.0057 140.8939
seed 設定すると、実行する度に、同一の数値が抽出されるset.seed(2016-01-09)
runif(10, 140, 185) [1] 179.9503 179.6794 149.5198 162.7430 148.9673 175.3110 171.7291 168.4825
[9] 154.0057 140.8939
set.seed(2016-01-09)
hist(runif(10, 140, 185))set.seed(2016-01-09)
hist(runif(100, 140, 185))set.seed(2016-01-09)
hist(runif(1000, 140, 185))rnorm() |
: 正規分布 |
rt() |
: \(t\) 分布 |
rchisq() |
: \((\chi^2)\)(カイ二乗)分布 |
それぞれの分布から無作為抽出する際、それぞれ特有の引数 (arguments) があるため注意が必要
例えば、正規分布では rnorm() のカッコの中に平均値 (mean) と標準偏差 (sd) を、\(t\) 分布と \((\chi^2)\)分布ではカッコの中に自由度 (df) を指定しなければならない
rnorm() を使って無作為抽出してみる
正規分布する母集団 N \((\mu)\), \((\sigma^2)\) から n 個の数値を無作為抽出する時:
→ rnorm(n, mean = mu, sd = sigma) に必要な情報を入力
母平均 (mu) 160、母分散 16 (sigma = 4) で正規分布する母集団から n = 100 個 の数値を無作為抽出する場合、次のように入力すればよい
rnorm(100, 160, 4) [1] 159.3848 159.4990 164.7559 155.6251 153.1917 158.3015 163.9680 153.7831
[9] 158.1598 160.8625 161.2840 161.1273 164.9580 164.3071 157.1850 152.9570
[17] 157.9721 165.1655 161.9859 157.9363 159.3190 153.6560 160.8890 160.0436
[25] 152.7490 156.1923 166.4202 159.1252 161.6708 158.8871 158.8819 163.8937
[33] 154.8815 163.1115 159.2016 152.5330 157.0690 152.9178 158.2415 162.3454
[41] 160.8212 160.1693 162.7420 157.0018 162.6093 156.4365 163.4589 157.0134
[49] 161.0999 163.0928 154.6236 167.2826 165.1174 152.7759 156.5711 156.8450
[57] 160.3522 162.3860 159.9502 162.2307 159.0250 163.0924 164.7416 161.5864
[65] 157.7696 167.6563 159.5414 163.9407 164.6144 156.0849 156.9475 164.7797
[73] 156.1790 157.2057 157.2734 159.0295 157.1015 157.6920 159.8148 160.7410
[81] 164.8714 157.5850 160.9043 163.3799 157.6321 156.9417 154.8651 154.0923
[89] 161.5911 163.2804 165.0042 159.4423 163.6247 161.3810 159.2093 160.0146
[97] 153.1990 164.3284 150.2262 158.1045
# ヒストグラムを描くと
hist(rnorm(100, 160, 4))# 5数は
quantile(rnorm(100, 160, 4), c(0, .25, .5, .75, 1)) 0% 25% 50% 75% 100%
150.0572 157.2044 159.8816 163.0106 168.9840
# boxplotを描くと
boxplot(rnorm(100, 160, 4))\[E(X) = \frac{\sum_{i=1}^N p(X_i)X_i}{N}\]
\[E(X) = \frac{\sum_{i=1}^N p(X_i)X_i}{N}\]
\[= \frac{(1/6)*1 + (1/6)*2 + (1/6)*3 + (1/6)*4 + (1/6)*5 + (1/6)*6}{N}\]
\[= 3.5\]
x <- 1:6
y <- sample(x, 10, replace = TRUE)
mean(y)[1] 2.7
y <- sample(x, 10, replace = TRUE)
mean(y)[1] 4.3
y <- sample(x, 10000, replace = TRUE)
mean(y)[1] 3.5204
確率分布・・・データの出現状況を確率に置き換えること
ex) ①サイコロを振る、②コインを投げる、etc
ある確率である事象が起こる時、その事柄を「事象」(event)という
R には一定の確率で分布する母集団から無作為に標本を抽出する機能が備えられている 【二項分布のシミュレーション】
R を使ってコインを 10 回投げるシミュレーションをしてみる
まず、コインの表を “H”、裏を “T” と定義して架空のコイン (coin) を作る
コインを 10 回投げて、表と裏が出た回数(整数)をそれぞれ記録する
このような整数を離散値と呼ぶ
coin <- c("H", "T")
flip <- sample(coin, 10, replace = TRUE) # 10回コインを投げる
table(flip) # 結果をテーブルに表すflip
H T
2 8
コインの表 (“H”) がでる確率は理論的には 50 % のはずだが、実際に10 回コインを投げると、ぴったり 5 回表が出るとは限らない
コインを 10 回投げる試みを 20 回やってみて、その結果をヒストグラムで表してみる
x <- numeric(20) # ベクトル x を作り、そこに 20 個の 0 を入れる
for(i in 1:20) { # コインを 10 回投げる度、変数iを 1 から 20 まで増やす
flip <- sample(coin, 10, rep = TRUE) # コインを 10 回投げるコマンド
x[i] <- sum(flip == "H") # 右側の結果"H"を左の x に代入するコマンド
}
table(x) # 結果 x を表にするコマンドx
4 5 6 7 8
2 5 9 3 1
hist(x, breaks = 0:10) # ヒストグラムの区間を 0 から 10 に限定 x <- numeric(10000) # ベクトル x を作り、そこに 10000 個の 0 を入れる
for(i in 1:10000) { # コインを 10 回投げる度、変数iを 1 から 10000 まで増やす
flip <- sample(coin, 10, rep = TRUE) # コインを 10 回投げるコマンド
x[i] <- sum(flip == "H") # 右側の結果"H"を左の x に代入するコマンド
}
table(x) # 結果 x を表にするコマンドx
0 1 2 3 4 5 6 7 8 9 10
13 110 427 1213 2021 2429 2072 1139 454 114 8
hist(x, breaks = 0:10) # ヒストグラムの区間を 0 から 10 に限定
abline(v = mean(x), col = "red") # 平均値に赤い縦線を引くmean(x)[1] 4.9975