確率変数は値を出力する機械であり、その出力値は固有の分布を持つ。
当サイト確率変数と確率分布 では確率変数を連続量から導入している。
一方、数Bの教科書では離散量から導入されている。ここでは教科書に従い離散量から導入する。
当サイトでは「確率変数は自販機に喩えられる」と説明している。
( 確率変数と自販機
参照)
自販機は値を出力する乱数という関数である。 実際にRで自販機をつくり、シミュレーションしてみよう。
母集団から1つの標本Xを抽出するとき、Xは母集団と同じ分布を持つ確率変数である。
Rでは関数sampleを用いて標本を抽出する。
母集団と抽出による確率変数を構成し、確率変数の出力が母集団分布に一致することを確かめよう。
A=c(rep(10000,5),rep(1000,20),rep(200,75),rep(0,900))#母集団
table(A)#度数表示
## A
## 0 200 1000 10000
## 900 75 20 5
prop.table(table(A))#確率表示
## A
## 0 200 1000 10000
## 0.900 0.075 0.020 0.005
X <- sample(A, size = 1, replace = TRUE)#標本
Xは1000本のクジから1本を引くときの出力値であり、このXが確率変数の働きをする。 prop.table を用いると確率表示され、これが母集団の確率分布となる。
自販機から多くのデータを出力し集計すれば、母集団の確率分布に近くなる。
sizeを400とする。
X400 <- sample(A, size = 400, replace = TRUE)#標本
prop.table(table(X400))
## X400
## 0 200 1000 10000
## 0.9050 0.0625 0.0200 0.0125
barplot(prop.table(table(X400)))
plot(prop.table(table(X400)))
plotを用いると、横軸は間隔尺度になる。(barplotの横軸は順序尺度)
[参考サイト]
sizeを4000とする。
X4000 <- sample(A, size = 4000, replace = TRUE)#標本
round(prop.table(table(X4000)),3)
## X4000
## 0 200 1000 10000
## 0.907 0.072 0.016 0.006
barplot(prop.table(table(X4000)))
plot(prop.table(table(X4000)))
大標本でも完全に母集団分布と一致することはないことに注意。
A=c(rep(1,3),rep(2,6),rep(3,1))#母集団
A
## [1] 1 1 1 2 2 2 2 2 2 3
table(A)#度数表示
## A
## 1 2 3
## 3 6 1
prop.table(table(A))#確率表示
## A
## 1 2 3
## 0.3 0.6 0.1
X <- sample(A, size = 1, replace = TRUE)#標本
sizeを400とする。
X400 <- sample(A, size = 400, replace = T)#標本
prop.table(table(X400))
## X400
## 1 2 3
## 0.2950 0.6075 0.0975
mean(X400)
## [1] 1.8025
mean(A)
## [1] 1.8
期待値と400個の平均はほぼ一致している。
確率分布の表のように、各値の出現頻度を指定して抽出することもできる。
A=c(1,2,3)
X400 <- sample(A, size = 4000, replace = TRUE,prob=c(3,6,1))#標本
prop.table(table(X400))
## X400
## 1 2 3
## 0.28850 0.60525 0.10625
mean(X400)
## [1] 1.81775
Rの超幾何分布乱数を用いて出力してみよう。
X <- rhyper(1000, 3, 2, 3)
prop.table(table(X))
## X
## 1 2 3
## 0.310 0.585 0.105
hist(X,prob=T,xlim=c(0,4))
\(E(X)=n\frac{M}{N}\)
\(V(X)=n\left(\frac{M}{N}\right)\left(1-\frac{M}{N}\right)\left(\frac{N-n}{N-1}\right)\)
期待値は二項分布と同じ、分散は二項分布の分散に有限修正を施したものになる。
結果の出力回数に注目したのが多項分布である。
100回の多項分布の回数分布と超幾何分布をtableで整理したものはほぼ一致している。
#多項分布
d <- rmultinom(n=1, size = 100, prob = c(0.3, 0.6, 0.1)) # 乱数を発生
print(t(d))
## [,1] [,2] [,3]
## [1,] 33 59 8
#超幾何分布
X <- rhyper(100, 3, 2, 3)
table(X)
## X
## 1 2 3
## 29 58 13
当りを1、はずれを0で表す。
母集団の度数分布はtableで、確率分布はprop.tableを用いる。
U=c(rep(1,2),rep(0,8))#母集団
U
## [1] 1 1 0 0 0 0 0 0 0 0
table(U)#度数表示
## U
## 0 1
## 8 2
prop.table(table(U))#確率表示
## U
## 0 1
## 0.8 0.2
Aさん、Bさんの抽出を非復元にするには、replace = FALSEとする。
抽出を45回行い、当たりくじの数を調べる。
当たりくじの数は、1の数をsumで合計すればよい。
X=c()
Y=c()
for (i in 1:1000){
s <- sample(U, size = 3, replace = FALSE)
X <- c(X,sum(s[1:2]))
Y <- c(Y,sum(s[3]))
}
head(X)
## [1] 0 1 0 1 2 1
head(Y)
## [1] 0 1 0 0 0 0
data01 <- data.frame(X, Y)
head(data01)
X | Y |
---|---|
0 | 0 |
1 | 1 |
0 | 0 |
1 | 0 |
2 | 0 |
1 | 0 |
#t01 <- table(data01$X, data01$Y)
#t01
t01 <- table(data01)
t01
## Y
## X 0 1
## 0 475 152
## 1 307 38
## 2 28 0
pt01 <- prop.table(t01)
pt01
## Y
## X 0 1
## 0 0.475 0.152
## 1 0.307 0.038
## 2 0.028 0.000
このようにRを用いた思考実験によるシミュレーションが可能になる。
シミュレーションが威力を発揮するのは近似や収束についてである。
「2.3_研究」で行ったように、各セルの出現頻度を指定して抽出することもできる。
この場合“dplyr”というパッケージが必要になる。
library(dplyr)
##
## 次のパッケージを付け加えます: 'dplyr'
## 以下のオブジェクトは 'package:stats' からマスクされています:
##
## filter, lag
## 以下のオブジェクトは 'package:base' からマスクされています:
##
## intersect, setdiff, setequal, union
data <- data.frame(X=c(0,0,0,1,1,1),Y=c(0,1,2,0,1,2))
data
X | Y |
---|---|
0 | 0 |
0 | 1 |
0 | 2 |
1 | 0 |
1 | 1 |
1 | 2 |
s <- sample_n(tbl = data, size = 1000,replace=T,weight=c(21,14,1,7,2,0))
table(s)
## Y
## X 0 1 2
## 0 497 299 16
## 1 144 44 0
比率をweightで指定している。
点をずらして散布図をかくと
plot(jitter(X),jitter(Y))
サイコロを720回投げて1の目が出る回数を調べるという試行を10000セット繰り返し、10000個のデータでヒストグラムを作る。
X <- rbinom(10000, 720, 1/6)
hist(X,prob=T)
curve(dnorm(x,120,10),add=TRUE,col="blue")
理論上、
期待値 \(m=\dfrac{720}{6}=120\)
、分散 \(\sigma^2=720\dfrac{1}{6}\cdot
\dfrac{5}{6}=100\)、 標準偏差 \(\sigma=10\)
であり、青のグラフは正規分布 \(N(120,10^2)\) である。
標準化すると標準正規分布にほぼ一致する。
hist(scale(X),prob=T,xlim=c(-5,5))
curve(dnorm(x,0,1),add=TRUE,col="blue")
Z値に変換するにはscale関数を用いる。
青は標準正規分布のグラフである。
720回のうち1が出る回数の確率分布は次のようになる。
x<-0:720
prob<-dbinom(x,720, 1/6)
plot(prob,col=1,type="l")