コイントスとサイコロ投げ
コイントス
- 100回のコイントスを実行します
- 乱数は
sample()
で生成します
- シミュレーションなので、結果は各自で異なります
# コイントス回数
N <- 100
# 確率0.5で表と裏がでる確率をN回ランダムに行う
cointoss1 <- sample(x=c(0,1), prob=c(0.5,0.5), size=N, replace=TRUE)
# 全てのデータを見てみる
cointoss1
## [1] 1 1 1 0 1 1 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 1
## [36] 0 1 1 1 0 0 1 0 0 1 0 1 0 0 1 0 1 1 0 1 0 1 1 0 0 0 0 1 1 0 1 0 0 0 0
## [71] 1 0 1 0 0 0 0 1 1 1 1 1 0 0 1 0 1 1 1 1 1 0 0 0 1 0 1 0 0 0
# 最初の20回分をみてみる
head(cointoss1, 20)
## [1] 1 1 1 0 1 1 1 1 1 0 1 0 0 0 0 1 0 0 1 0
# 最後の20回分をみてみる
tail(cointoss1, 20)
## [1] 1 1 0 0 1 0 1 1 1 1 1 0 0 0 1 0 1 0 0 0
# 図をプロットする際の日本語フォントを指定
par(family="HiraMaruProN-W4")
# plot(x, y, ...):図をプロット
# cumsum():累積和
plot((1:N), cumsum(cointoss1)/(1:N) ,
# 点をoで描画
type="o",
# x軸とy軸の範囲
xlim=c(1,N) , ylim=c(0.0,1.0),
# 図タイトルおよびx軸とy軸の名前
main="コイントスで表が出る確率 (N=100)" , xlab="コイントス回数" , ylab="表が出る確率",
# xy軸、xy軸名前、図タイトルの大きさの指定
cex.axis=1.2, cex.lab=1.2, cex.main=1.5)
# 確率0.5の線の描画
# col="":色を指定
lines(c(1,N),c(0.5,0.5), col="red", cex=1.2)
# 最初の20回の結果を表示
head(cumsum(cointoss1)/(1:N), 20)
## [1] 1.0000000 1.0000000 1.0000000 0.7500000 0.8000000 0.8333333 0.8571429
## [8] 0.8750000 0.8888889 0.8000000 0.8181818 0.7500000 0.6923077 0.6428571
## [15] 0.6000000 0.6250000 0.5882353 0.5555556 0.5789474 0.5500000
# 最後の20回の結果を表示
tail(cumsum(cointoss1)/(1:N), 20)
## [1] 0.4691358 0.4756098 0.4698795 0.4642857 0.4705882 0.4651163 0.4712644
## [8] 0.4772727 0.4831461 0.4888889 0.4945055 0.4891304 0.4838710 0.4787234
## [15] 0.4842105 0.4791667 0.4845361 0.4795918 0.4747475 0.4700000
N <- 10000
cointoss2 <- sample(x=c(0,1), prob=c(0.5,0.5), size=N, replace=TRUE)
par(family="HiraMaruProN-W4")
plot((1:N), cumsum(cointoss2)/(1:N) , type="o", log="x", xlim=c(1,N) , ylim=c(0.0,1.0),
main="コイントスで表が出る確率 (N=10000)" , xlab="コイントス回数" , ylab="表が出る確率",
cex.axis=1.2, cex.lab=1.2, cex.main=1.5)
lines(c(1,N),c(0.5,0.5), col="red", cex=1.2)
# 最初の20回の結果を表示
head(cumsum(cointoss2)/(1:N), 20)
## [1] 1.0000000 1.0000000 0.6666667 0.5000000 0.4000000 0.3333333 0.2857143
## [8] 0.2500000 0.3333333 0.4000000 0.3636364 0.4166667 0.4615385 0.5000000
## [15] 0.5333333 0.5000000 0.5294118 0.5000000 0.4736842 0.4500000
# 最後の20回の結果を表示
tail(cumsum(cointoss2)/(1:N), 20)
## [1] 0.5017533 0.5018032 0.5017530 0.5018029 0.5018528 0.5018025 0.5017523
## [8] 0.5017020 0.5017519 0.5018018 0.5018517 0.5019015 0.5019514 0.5020012
## [15] 0.5019510 0.5019008 0.5019506 0.5020004 0.5019502 0.5020000
N <- 10000
cointoss2 <- sample(x=c(0,1), prob=c(0.5,0.5), size=N, replace=TRUE)
par(family="HiraMaruProN-W4")
plot((1:N), cumsum(cointoss2)/(1:N) , type="l", xlim=c(1,N) , ylim=c(0.0,1.0),
main="コイントスで表が出る確率 (N=10000)" , xlab="コイントス回数" , ylab="表が出る確率",
cex.axis=1.2, cex.lab=1.2, cex.main=1.5, col=1, lwd=5)
cointoss2 <- sample(x=c(0,1), prob=c(0.5,0.5), size=N, replace=TRUE)
lines((1:N), (cumsum(cointoss2)/(1:N)), col=2, lwd=3)
cointoss2 <- sample(x=c(0,1), prob=c(0.5,0.5), size=N, replace=TRUE)
lines((1:N), (cumsum(cointoss2)/(1:N)), col=3, lwd=1.5)
cointoss2 <- sample(x=c(0,1), prob=c(0.5,0.5), size=N, replace=TRUE)
lines((1:N), (cumsum(cointoss2)/(1:N)), col=4, lwd=1)
cointoss2 <- sample(x=c(0,1), prob=c(0.5,0.5), size=N, replace=TRUE)
lines((1:N), (cumsum(cointoss2)/(1:N)), col=5, lwd=1)
サイコロ投げ
N=100
# seq():連続した整数
# rep(x,n): xをn回繰り返す
diceroll <- sample(x=seq(1,6),prob=rep(1/6,6),size=N,replace=TRUE)
head(diceroll,20) # 最初の20個を表示する
## [1] 3 1 2 2 4 3 6 3 2 2 1 5 4 2 2 5 2 2 5 3
diceroll1 <- diceroll[diceroll==1] # 1の目が出たものを取り出す
diceroll1 # すべて表示してみる
## [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
length(diceroll1) # 個数を数える
## [1] 15
table(diceroll) # クロス集計
## diceroll
## 1 2 3 4 5 6
## 15 20 15 16 17 17
prop.table(table(diceroll)) # 割合を計算
## diceroll
## 1 2 3 4 5 6
## 0.15 0.20 0.15 0.16 0.17 0.17
# ヒストグラムで度数を表示
par(family="HiraMaruProN-W4")
hist(diceroll, breaks=seq(0,6), freq=TRUE, ylim=c(0,50),
main="サイコロ投げ 100回", xlab="サイコロの目", ylab="度数")
lines(c(0,6),c(1/6*N,1/6*N), col="red", cex=1.2)
text(5.5,1/6*N+1, "理論確率", col="red")
# ヒストグラムで確率を表示
par(family="HiraMaruProN-W4")
hist(diceroll, breaks=seq(0,6), freq=FALSE, ylim=c(0,0.4),
main="サイコロ投げ 100回", xlab="サイコロの目", ylab="確率")
lines(c(0,6),c(1/6,1/6), col="red", cex=1.2)
text(5.5,0.18, "理論確率", col="red")
N=10000
diceroll <- sample(x=seq(1,6),prob=rep(1/6,6),size=N,replace=TRUE)
# head(diceroll,20) # 最初の20個を表示する
table(diceroll) # クロス集計
## diceroll
## 1 2 3 4 5 6
## 1662 1621 1661 1658 1725 1673
prop.table(table(diceroll)) # 割合を計算
## diceroll
## 1 2 3 4 5 6
## 0.1662 0.1621 0.1661 0.1658 0.1725 0.1673
# ヒストグラムで度数を表示
par(family="HiraMaruProN-W4")
hist(diceroll, breaks=seq(0,6), freq=TRUE, ylim=c(0,(1/6*N+1000)),
main="サイコロ投げ 10000回", xlab="サイコロの目", ylab="度数")
lines(c(0,6),c(1/6*N,1/6*N), col="red", cex=1.2)
# ヒストグラムで確率を表示
par(family="HiraMaruProN-W4")
hist(diceroll, breaks=seq(0,6), freq=FALSE, ylim=c(0,0.3),
main="サイコロ投げ 10000回", xlab="サイコロの目", ylab="確率")
lines(c(0,6),c(1/6,1/6), col="red", cex=1.2)
text(5.5,0.18, "理論確率", col="red")
- ガリレオのサイコロ問題をシミュレーションで確かめてみる
N=10000
dice.G <- matrix(0, ncol=4, nrow=N)
colnames(dice.G)=c("dice1", "dice2", "dice3", "Total")
dice.G[,1] <- sample(x=seq(1,6),prob=rep(1/6,6),size=N,replace=TRUE) #1個目のサイコロ
dice.G[,2] <- sample(x=seq(1,6),prob=rep(1/6,6),size=N,replace=TRUE) #2個目のサイコロ
dice.G[,3] <- sample(x=seq(1,6),prob=rep(1/6,6),size=N,replace=TRUE) #3個目のサイコロ
dice.G[,4] <- rowSums(dice.G[,1:3]) # 行和
table(dice.G[,4]) # クロス集計
##
## 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
## 45 167 260 468 640 992 1120 1255 1217 1236 996 652 468 290 141
## 18
## 53
prop.table(table(dice.G[,4])) # 割合を計算
##
## 3 4 5 6 7 8 9 10 11 12
## 0.0045 0.0167 0.0260 0.0468 0.0640 0.0992 0.1120 0.1255 0.1217 0.1236
## 13 14 15 16 17 18
## 0.0996 0.0652 0.0468 0.0290 0.0141 0.0053
基本的な確率分布
一様分布
- 区間[0, 1]で1となる一様分布を描画する
- 一様分布の確率密度関数は
dunif()
で計算できます
x <- seq(-1,2,length.out=1000)
par(family="HiraMaruProN-W4")
plot(x, dunif(x, min=0,max=1), xlim=c(-1,2), ylim=c(0,2), type="l", main="一様分布")
x <- seq(-1,2,length.out=1000)
par(family="HiraMaruProN-W4")
plot(x, dunif(x, min=0,max=0.5), xlim=c(-1,2), ylim=c(0,2), type="l", main="一様分布")
二項分布
- n=10回の試行でs=1 (r=0.1)となるベルヌーイ試行を描画する
- 二項分布の確率密度関数は
dbinom()
で計算できます
par(family="HiraMaruProN-W4")
plot(dbinom(seq(0,10,1), 10, 0.1), type="l", ylab="確率")
text(3, 0.37, labels="B(10,0.1)")
- n=10回の試行でs=3 (r=0.3)となるベルヌーイ試行
par(family="HiraMaruProN-W4")
plot(dbinom(seq(0,10,1), 10, 0.3), type="l", ylab="確率")
# lines(dbinom(seq(0,10,1), 10, 0.3))
text(6, 0.2, labels="B(10,0.3)")
- n=10回の試行でs=5 (r=0.5)となるベルヌーイ試行
par(family="HiraMaruProN-W4")
plot(dbinom(seq(0,10,1), 10, 0.5), type="l", ylab="確率")
# lines(dbinom(seq(0,10,1), 10, 0.5))
text(8, 0.2, labels="B(10,0.5)")
- n=10回の試行でs=7 (r=0.7)となるベルヌーイ試行
par(family="HiraMaruProN-W4")
plot(dbinom(seq(0,10,1), 10, 0.7), type="l", ylab="確率")
# lines(dbinom(seq(0,10,1), 10, 0.7))
text(6, 0.2, labels="B(10,0.7)")
ベータ分布
- 様々なベータ分布を描画する
- ベータ分布の確率密度関数は
dbeta()
で計算できます
# ベータ分布Β(0.5, 0.5)
x <- seq(0,1,length=100)
par(family="HiraMaruProN-W4")
curve(dbeta(x, 0.5,0.5), type="l", xlim=c(0,1), ylim=c(0, 8), ylab="確率", lwd=2)
# Β(0.5, 1) ⇒ 単調減少分布となる
curve(dbeta(x, 0.5, 1), type="l", xlim=c(0,1), col="black", add=TRUE, lty=2, lwd=2)
# Β(1, 2) ⇒ 単調増加分布となる
curve(dbeta(x, 1, 2), type="l", xlim=c(0,1), col="grey", add=TRUE, lwd=2)
# Β(1, 1) ⇒ 一様分布となる
curve(dbeta(x, 1, 1), type="l", xlim=c(0,1), col="red", add=TRUE, lwd=2)
# Β(5, 5) ⇒ 0.5をピークとする釣鐘型の分布となる
curve(dbeta(x, 5, 5), type="l", xlim=c(0,1), col="blue", add=TRUE, lwd=2)
# Β(10, 2)
curve(dbeta(x, 10, 2), type="l", xlim=c(0,1), col="green", add=TRUE, lwd=2)
# Β(10, 12)
curve(dbeta(x, 10, 12), type="l", xlim=c(0,1), col="yellow", add=TRUE, lwd=2)
# 凡例
legend(.5,8,c("Β(0.5, 0.5)","Β(0.5, 1)","Β(1, 2)","Β(1, 1)","Β(5, 5)","Β(10, 2)","Β(10, 12)"),
col=c("black","black","grey","red","blue","green","yellow"),lwd=c(2,2,2,2,2,2,2), lty=c(1,2,1,1,1,1,1))
ポアソン分布
- ポアソン分布Po(1), Po(3), Po(5), Po(10)を描画する
- ポアソン分布の確率密度関数は
dpois()
で計算できます
# ポアソン分布Po(1)
par(family="HiraMaruProN-W4")
plot(dpois(0:50, lambda=1), type="b", xlim=c(0,20), lwd=2, ylab="確率", xlab="x")
text(3.5, 0.35, "Po(1)")
# Po(3)
lines(dpois(0:50, lambda=3), type="b", lwd=2, col=2)
text(5, 0.24, "Po(3)", col=2)
# Po(5)
lines(dpois(0:50, lambda=5), type="b", lwd=2, col=3)
text(7, 0.19, "Po(5)", col=3)
# Po(10)
lines(dpois(0:50, lambda=10), type="b", lwd=2, col=4)
text(11, 0.14, "Po(10)", col=4)
正規分布
- 様々な正規分布を描画する
- 正規分布の確率密度関数は
dnorm()
で計算できます
# 区間[-100, 100]で平均0, 標準偏差20の正規分布
x <- seq(-100,100,length=2000)
plot(x, dnorm(x, 0,20), type="l", ylim=c(0,0.02), xlim=c(-100,100), lwd=2)
# 平均10, 標準偏差20の正規分布
curve(dnorm(x, 10,20), type="l", ylim=c(0,0.02), xlim=c(-100,100), lwd=2, col="red", add=TRUE)
# 平均0, 標準偏差40の正規分布
curve(dnorm(x, 0,40), type="l", ylim=c(0,0.02), xlim=c(-100,100), lwd=2, col="blue", add=TRUE)
# 凡例
legend(30,0.02,c("N(0,20^2)","N(10,20^2)","N(0,40^2)"), col=c("black","red","blue"),lwd=c(2,2,2))
ガンマ分布
- Ga(1, 1)とGa(1, 3)を描画する
- ガンマ分布の確率密度分布は
dgamma()
で計算できます
# Ga(1, 1)
# Ga(α, λ) ⇒ dgamma(x, shape, rate, scale=1/rate)
# α⇒shape, λ=rate
x <- seq(0,10,by=0.01)
# α=1, λ=1⇒指数関数と同じになる
par(family="HiraMaruProN-W4")
plot(x, dgamma(x, 1, 1), type="l", lwd=2, ylab="確率")
# Ga(1, 3)
curve(dgamma(x, 1, 3), type="l", lwd=2)
x <- seq(0,20,by=0.01)
plot(x, dgamma(x, 5, 1), type="l", lwd=2)
plot(x, dgamma(x, 40,1), type="l", lwd=2)
x <- seq(0,20,by=0.01)
plot(x, dgamma(x, 2, 0.5), type="l", lwd=2)