全ての確率は
コイン投げに通ず
2015/12/5 JapanR 発表資料
2015/12/15 基礎からのベイズ統計学輪読会 LT資料
Ken ichi Matsui (@kenmatsu4)
自己紹介: @kenmatsu4
・Facebookページ
  https://www.facebook.com/matsukenbook
・Twitterアカウント
  @kenmatsu4
・Qiitaでブログを書いています(統計、機械学習、Python等)
   http://qiita.com/kenmatsu4
   (4600 contributionを超えました!)
・趣味
   - バンドでベースを弾いたりしています。
   - 主に東南アジアへバックパック旅行に行ったりします
   (カンボジア、ミャンマー、バングラデシュ、新疆ウイグル自治区 etc)
旅行の写真 : http://matsu-ken.jimdo.com
Twitterアイコン
Pythonタグで1位に
なりました!(> <人)
http://goo.gl/yxNJgQ
http://goo.gl/JNPfv3
http://goo.gl/0Tqgrd
http://www.slideshare.net/matsukenbook
本題です。
http://nbviewer.ipython.org/github/bakfoo/pyconjp/blob/master/probprog3.ipynb
結局,確率的プログラミングにおいて,プログラマがやることは,
 • データを用意する
 • パラメータの種類を決め,確率分布を決める
 • パラメータ込みで事前分布を数式で表す
 • パラメータ込みで尤度を数式で表す
 • MCMCサンプリング法を選ぶ
あとは計算機がMCMCサンプリングをして,パラメータの推定値を返す.
結局,事前分布や尤度の確率分布を上手にモデリングするには,
確率分布とその確率分布の関係をよく知っていなければならない.
柏野さん@PyconJP
なるほど!
そこで紹介されていたのが、
これ!
http://www.math.wm.edu/~leemis/2008amstat.pdf
これ!
http://www.math.wm.edu/~leemis/2008amstat.pdf
多いな! ((((;゚Д゚)))))))
これ!
http://www.math.wm.edu/~leemis/2008amstat.pdf
多いな! ((((;゚Д゚)))))))
76個あります
5分間で出来る限り
説明してみます!(`・ω・́)
今日はそのうち12個!
Let’s Start!!!
1/76
ベルヌーイ分布
Bernoulli Distribution
01: ベルヌーイ分布
表は1 裏は0
試行を1度行い、成功か失敗など2値
例:コイン投げ
確率関数
P(X = x) = px
(1 p)1 x
(x = 0, 1)
パラメーター
p:1 (表) が出る確率
01: ベルヌーイ分布
#	
  ベルヌーイ分布からのサンプリングを実行	
  
#	
  パラメーター	
  
p	
  =	
  0.7	
  
trial_size	
  =	
  10000	
  
set.seed(71)	
  
#	
  ベルヌーイ分布に従う乱数生成	
  
data	
  <-­‐	
  rbern(trial_size,	
  p)	
  
#	
  ベルヌーイ分布の確率分布	
  
dens	
  <-­‐	
  data.frame(y=c((1-­‐p),p)*trial_size,	
  x=c(0,	
  1))	
  
#	
  グラフ描画	
  
ggplot()	
  +	
  
	
  	
  	
  	
  layer(data=data.frame(x=data),	
  mapping=aes(x=x),	
  geom="bar",	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  stat="bin",	
  bandwidth=0.1	
  
)	
  +	
  layer(data=dens,	
  mapping=aes(x=x,	
  y=y),	
  geom="bar",	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  stat="identity",	
  width=0.05,	
  fill="#777799",	
  alpha=0.7)	
  
Rコード
紫:理論的な確率
黒:乱数から生成したヒストグラム
ここで、
もう一度タイトルを
全ての確率は
コイン投げに通ず
2015/12/5
JapanR 発表資料
Ken ichi Matsui (@kenmatsu4)
全ての確率は
コイン投げに通ず
2015/12/5
JapanR 発表資料
Ken ichi Matsui (@kenmatsu4)
これから、このコイン投げ
(ベルヌーイ分布)を起点として
様々な確率分布に従う
乱数を作っていきます。
2/76
二項分布
Binomial Distribution
02: 二項分布
ベルヌーイ試行をn回実施し、何回成功したかの回数
を確率変数とした分布。
例:フリースロー 1セット30回実施。
  1回あたりの成功率70%で計何回入ったか
確率関数
パラメーター
p:1 (表) が出る確率 [フリースローの成功確率]
P(X = x) = nCrpx
(1 p)n x
n:1セットあたりの回数
(x = 1, 2, · · · , n)
02: 二項分布
n回実施
表の出た回数 x
コイン投げ
(表の確率: p)
02: 二項分布
#	
  パラメーター	
  
p	
  =	
  0.7	
  
trial_size	
  =	
  10000	
  
sample_size	
  =	
  30	
  
set.seed(71)	
  
#	
  ベルヌーイ分布に従う乱数生成	
  
gen_binom_var	
  <-­‐	
  function()	
  {	
  
	
  	
  return(sum(rbern(sample_size,	
  p)))	
  
}	
  
result	
  <-­‐	
  rdply(trial_size,	
  gen_binom_var())	
  
#	
  二項分布の密度関数	
  
dens	
  <-­‐	
  data.frame(y=dbinom(seq(sample_size),	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  sample_size,	
  0.7))*trial_size	
  
#	
  グラフ描画	
  
ggplot()	
  +	
  
	
  	
  layer(data=resuylt,	
  mapping=aes(x=V1),	
  geom="bar",	
  stat	
  =	
  "bin",	
  
	
  	
  binwidth=1,	
  fill="#6666ee",	
  color="gray"	
  
)	
  +	
  layer(data=dens,	
  mapping=aes(x=seq(sample_size)+.5,	
  y=y),	
  	
  
	
  	
  	
  	
  geom="line",	
  stat="identity",	
  position="identity",colour="red"	
  
	
  	
  )	
  +	
  ggtitle("Bernoulli	
  to	
  Binomial.")	
  
赤の曲線:理論的な確率
ヒストグラム:乱数から生成
Rコード
3/76
ポワソン分布
Poisson Distribution
03: ポワソン分布
1セット回数 n→ 、1回あたり成功率 p→ 0
npを一定とした時の分布
例:棒の傷のチェックを考える。1cm幅で傷の有無を
を調べる。ベルヌーイ試行の繰り返し → 二項分布
→ 無限に分割してポアソン分布。
1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm
10cm 全部で傷が7つ
0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm
に分割
確率関数
パラメーター
この例の場合、棒一本あたりの傷の平均的な数
λ:平均生起回数
P(X = x) =
e x
x!
(x = 1, 2, · · · , 1)
( λ = np の関係が保たれている)
棒1本あたりの傷の数
の分布→ポアソン分布
上限がなくなった!
03: ポアソン分布
n回実施
03: ポアソン分布
コイン投げ
(表の確率: p)
np一定で n→
03: ポアソン分布
trial_size	
  =	
  5000;	
  width	
  <-­‐	
  1;	
  
#	
  もともとの問題設定	
  
p	
  =	
  0.7;	
  n	
  =	
  10;	
  
np	
  <-­‐	
  p*n	
  
#	
  n→∞、p→0、np=一定	
  	
  
n	
  =	
  100000;	
  p	
  <-­‐	
  np/n	
  
#	
  ベルヌーイ分布に従う乱数生成	
  
gen_binom_var	
  <-­‐	
  function()	
  {	
  
	
  	
  return(sum(rbern(n,	
  p)))	
  
}	
  
result	
  <-­‐	
  rdply(trial_size,	
  gen_binom_var())	
  
#	
  ポアソン分布の密度関数	
  
dens	
  <-­‐	
  data.frame(y=dpois(seq(20),	
  np))*trial_size	
  
#	
  グラフ描画	
  
ggplot()	
  +	
  
	
  	
  layer(data=result,	
  mapping=aes(x=V1),	
  geom="bar",	
  stat	
  =	
  "bin",	
  
	
  	
  	
  	
  	
  	
  	
  	
  binwidth=width,	
  fill="#6666ee",	
  color="gray"	
  
	
  	
  )	
  +	
  layer(data=dens,	
  mapping=aes(x=seq(20)+.5,	
  y=y),	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  geom="line",	
  stat="identity",	
  position="identity",	
  
colour="red"	
  
	
  	
  )	
  +	
  ggtitle("Bernoulli	
  to	
  Poisson.")	
  
赤の曲線:理論的な確率
ヒストグラム:乱数から生成
Rコード
4/76
正規分布
Normal Distribution
04: 正規分布
二項分布のnを大きくすると正規分布で近似できる。
確率密度関数
パラメーター
σ:標準的偏差
μ:平均値
f(x) =
1
p
2⇡ 2
exp
⇢
1
2
(x µ)2
2
( 1 < x < 1)
例:死ぬまでフリースロー投げて計何回入ったか
04: 正規分布 (ポアソン分布との違い)
1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm
10cm
1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm
20cm
1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm
…
1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm
→ cm
1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm
延々と伸ばす
n回実施コイン投げ
(表の確率: p)
n →
04: 正規分布
04: 正規分布
#	
  パラメーター	
  
n	
  <-­‐	
  10000;	
  p	
  <-­‐	
  0.7;	
  
trial_size	
  =	
  10000	
  
width=10	
  
#	
  ベルヌーイ分布に従う乱数生成	
  
gen_binom_var	
  <-­‐	
  function()	
  {	
  
	
  	
  return(sum(rbern(n,	
  p)))	
  
}	
  
result	
  <-­‐	
  rdply(trial_size,	
  gen_binom_var())	
  
#	
  正規分布の密度関数	
  
dens	
  <-­‐	
  data.frame(y=dnorm(seq(6800,7200),	
  mean=n*p,	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  sd=sqrt(n*p*(1-­‐p)))*trial_size*width)	
  
#	
  グラフ描画	
  
ggplot()	
  +	
  
	
  	
  layer(data=result,	
  mapping=aes(x=V1),	
  geom="bar",	
  stat	
  =	
  "bin",	
  
	
  	
  	
  	
  	
  	
  	
  	
  binwidth=width,	
  fill="#6666ee",	
  color="gray"	
  
	
  	
  )	
  +	
  layer(data=dens,	
  mapping=aes(x=seq(6800,7200),	
  y=y),	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  geom="line",	
  stat="identity",	
  position="identity",	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  colour="red")	
  +	
  ggtitle("Bernoulli	
  to	
  Normal.")	
  
Rコード
赤の曲線:理論的な確率
ヒストグラム:乱数から生成
5/76
標準正規分布
Standard Normal Distribution
05: 標準正規分布
正規分布を平均0、標準偏差1にしたもの
確率密度関数
パラメーター
なし
( 1 < x < 1)
f(x) =
1
p
2⇡
exp
⇢
1
2
x2
n回実施コイン投げ
(表の確率: p)
n →
05: 標準正規分布
平均を0にずらす
標準偏差を1に
縮める
05: 標準正規分布
#	
  パラメーター	
  
n	
  <-­‐	
  10000;	
  p	
  <-­‐	
  0.7	
  
trial_size	
  =	
  30000	
  
width=0.18	
  
#	
  ベルヌーイ分布に従う乱数生成	
  
gen_binom_var	
  <-­‐	
  function()	
  {	
  
	
  	
  return(sum(rbern(n,	
  p)))	
  
}	
  
result	
  <-­‐	
  rdply(trial_size,	
  gen_binom_var())	
  
m	
  <-­‐	
  mean(result$V1);	
  sd	
  <-­‐	
  sd(result$V1);	
  
result	
  <-­‐	
  (result	
  -­‐	
  m)/sd	
  
#	
  標準正規分布の密度関数	
  
dens	
  <-­‐	
  data.frame(y=dnorm(seq(-­‐4,4,0.05),	
  mean=0,	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  sd=1)*trial_size*width)	
  
#	
  グラフ描画	
  
ggplot()	
  +	
  
	
  	
  layer(data=result,	
  mapping=aes(x=V1),	
  geom="bar",	
  stat	
  =	
  "bin",	
  
	
  	
  	
  	
  	
  	
  	
  	
  binwidth=width,	
  fill="#6666ee",	
  color="gray"	
  
	
  	
  )	
  +	
  layer(data=dens,	
  mapping=aes(x=seq(-­‐4,4,0.05),	
  y=y),	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  geom="line",	
  stat="identity",	
  position=“identity",	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  colour="red"	
  
	
  	
  )	
  +	
  ggtitle("Bernoulli	
  to	
  Standard	
  Normal.")	
  
Rコード
赤の曲線:理論的な確率
ヒストグラム:乱数から生成
6/76
カイ二乗分布
Chi Square Distribution
06: カイ二乗分布
標準正規分布に従う確率変数 を2乗してk個
足し合わせた
                 が従う分布
確率密度関数
パラメーター
k:自由度 (2乗した標準正規分布の確率変数の
      足し合わせた数)
f(x, k) =
(1/2)k/2
(k/2)
xk/2 1
e x/2
(0  x)
Xi
Z = X2
1 + · · · + X2
k
平均を0にずらす
n回実施
コイン投げ
(表の確率: p)
n →
06: カイ二乗分布
平均を0にずらす
標準偏差を1に
縮める
平均を0にずらす
k=1のとき
二乗したところ
に積んでいく
k=3のとき
k=3つ
サンプリングする
k=3つの長さを
足したものを
プロットする
05: カイ二乗分布
#	
  パラメーター	
  
p	
  <-­‐	
  0.7;	
  n	
  <-­‐	
  1000;	
  
trial_size	
  <-­‐	
  100000;	
  width	
  <-­‐	
  0.3;	
  
df	
  <-­‐	
  3	
  
#	
  ベルヌーイ分布に従う乱数生成(3まわし)	
  
gen_binom_var	
  <-­‐	
  function()	
  {	
  
	
  	
  return(sum(rbern(n,	
  p)))	
  
}	
  
gen_chisq_var	
  <-­‐	
  function()	
  {	
  
	
  	
  result	
  <-­‐	
  rdply(trial_size,	
  gen_binom_var())	
  
	
  	
  return(((result$V1	
  -­‐	
  mean(result$V1))/sd(result$V1))**2)	
  
}	
  
#	
  自由度dfの分だけ生成する	
  
result	
  <-­‐	
  rlply(df,	
  gen_chisq_var(),.progress	
  =	
  "text")	
  
res	
  <-­‐	
  data.frame(x=result[[1]]	
  +	
  result[[2]]	
  +	
  result[[3]])	
  
#	
  カイ二乗分布の密度関数(自由度=3)	
  
xx	
  <-­‐	
  seq(0,20,0.1)	
  
dens	
  <-­‐	
  data.frame(y=dchisq(x=xx,	
  df=df)*trial_size*width)	
  
#	
  グラフ描画	
  
ggplot()	
  +	
  layer(data=data,	
  mapping=aes(x=x),	
  geom="bar",	
  stat	
  =	
  "bin",	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  binwidth=width,	
  fill="#6666ee",	
  color="gray"	
  
	
  	
  )	
  +	
  layer(data=dens,	
  mapping=aes(x=xx,	
  y=y),	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  geom="line",	
  stat="identity",	
  position="identity",	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  colour="blue"	
  	
  )	
  +	
  ggtitle("Bernoulli	
  to	
  Chisquare")	
  
Rコード
赤の曲線:理論的な確率
ヒストグラム:乱数から生成
7/76
指数分布
Exponential Distribution
07: 指数分布
ポアソン分布が単位長(もしくは単位時間)に平均
何回生起するか、を表す分布であったが、同じ事象
を違う角度で捉え直したのが指数分布。
1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm
10cm 全部で傷が7つ
ポアソン分布的考え方
指数分布的考え方
次発生するまでに、どのくらいの距離(時間)か
07: 指数分布
確率密度関数
パラメーター
λ:単位長(時間)に平均的に生起する回数
f(x, ) =
⇢
e x
(x 0)
0 (x < 0)
n回実施
コイン投げ
(表の確率: p)
np一定で n→
07: 指数分布
平均を0にずらす
間隔の長さをプロット
trial_size	
  =	
  7000;	
  width	
  <-­‐	
  .01;	
  
#	
  もともとの問題設定	
  
p	
  =	
  0.7;	
  n	
  =	
  10;	
  np	
  <-­‐	
  p*n;	
  	
  
#	
  n→∞、p→0、np=一定	
  	
  
n	
  =	
  10000;	
  p	
  <-­‐	
  np/n	
  
#	
  ベルヌーイ分布に従う乱数生成	
  
gen_exp_var	
  <-­‐	
  function()	
  {	
  
	
  	
  cnt	
  <-­‐	
  0	
  
	
  	
  while	
  (TRUE)	
  {	
  
	
  	
  	
  	
  cnt	
  <-­‐	
  cnt	
  +	
  1	
  
	
  	
  	
  	
  if	
  (rbern(1,	
  p)==1){	
  
	
  	
  	
  	
  	
  	
  return(cnt)	
  	
  #	
  1が出たらそれが何回目かを返す	
  
	
  	
  	
  	
  }	
  
	
  	
  }	
  
}	
  
data	
  <-­‐	
  data.frame(x=rdply(trial_size,	
  gen_exp_var())/n)	
  
names(data)	
  <-­‐	
  c("n",	
  "x")	
  
#	
  指数分布の密度関数	
  
dens	
  <-­‐	
  data.frame(y=dexp(seq(0,	
  1.5,	
  0.1),	
  np)*trial_size*width)	
  
ggplot()	
  +	
  
	
  	
  layer(data=data,	
  mapping=aes(x=x),	
  geom="bar",	
  stat	
  =	
  "bin",	
  
	
  	
  	
  	
  	
  	
  	
  	
  binwidth=width,	
  fill="#6666ee",	
  color="gray"	
  
	
  	
  )	
  	
  +	
  layer(data=dens,	
  mapping=aes(x=seq(0,	
  1.5,	
  0.1),	
  y=y),	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  geom="line",	
  stat="identity",	
  position="identity",	
  colour="red"	
  
	
  )	
  +	
  ggtitle("Bernoulli	
  to	
  Exponential.")
Rコード
赤の曲線:理論的な確率
ヒストグラム:乱数から生成
07: 指数分布
8/76
ガンマ分布
Gamma Distribution
08: ガンマ分布
確率密度関数
パラメーター
単位長(時間)あたりβ回発生する指数分布の
α個の和の確率分布を考えた時、ガンマ分布となる
f(x, ↵, ) =
↵
(↵)
x↵ 1
exp( x)
(0  x < 1)
↵X
i=1
Xi ⇠ (↵, )Xi ⇠ Exp( )
n回実施
コイン投げ
(表の確率: p)
np一定で n→
平均を0にずらす
08: ガンマ分布
間隔の長さをプロット
k=5つの長さを
足したものを
プロットする
k=5つサンプリング
trial_size	
  =	
  7000;	
  width	
  <-­‐	
  .035;	
  
#	
  もともとの問題設定	
  
p	
  =	
  0.7;	
  n	
  =	
  10;	
  np	
  <-­‐	
  p*n;	
  
#	
  n→∞、p→0、np=一定	
  	
  
n	
  =	
  10000;	
  p	
  <-­‐	
  np/n;	
  alpha	
  <-­‐	
  5	
  
#	
  ベルヌーイ分布に従う乱数生成	
  
get_interval	
  <-­‐	
  function(){	
  
	
  	
  cnt	
  <-­‐	
  0	
  
	
  	
  while	
  (TRUE)	
  {	
  
	
  	
  	
  	
  cnt	
  <-­‐	
  cnt	
  +	
  1	
  
	
  	
  	
  	
  if	
  (rbern(1,	
  p)==1){	
  return(cnt)	
  }	
  
	
  	
  }	
  
}	
  
gen_exp_var	
  <-­‐	
  function()	
  {	
  
	
  	
  data	
  <-­‐	
  data.frame(x=rdply(trial_size,	
  get_interval())/n)	
  
	
  	
  names(data)	
  <-­‐	
  c("n",	
  "x")	
  
	
  	
  return(data)	
  
}	
  
result	
  <-­‐	
  rlply(alpha,	
  gen_exp_var())	
  
data	
  <-­‐	
  data.frame(x=result[[1]]$x	
  +	
  result[[2]]$x	
  +	
  result[[3]]$x	
  +	
  result[[4]]$x	
  +	
  
result[[5]]$x)	
  
#	
  ガンマ分布の密度関数	
  
dens	
  <-­‐	
  data.frame(y=dgamma(seq(0,	
  3,.01),	
  shape=alpha,	
  rate=np)*trial_size*width)	
  
ggplot()	
  +	
  
	
  	
  layer(data=data,	
  mapping=aes(x=x),	
  geom="bar",	
  stat	
  =	
  "bin",	
  
	
  	
  	
  	
  	
  	
  	
  	
  binwidth=width,	
  fill="#6666ee",	
  color="gray"	
  
	
  	
  )	
  +	
  layer(data=dens,	
  mapping=aes(x=seq(0,3,.01),	
  y=y),	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  geom="line",	
  stat="identity",	
  position="identity",	
  colour="red"	
  
	
  	
  )	
  +	
  ggtitle("Bernoulli	
  to	
  Gamma") Rコード
赤の曲線:理論的な確率
ヒストグラム:乱数から生成
08: ガンマ分布
9/76
逆ガンマ分布
Inverse Gamma Distribution
09: 逆ガンマ分布
確率密度関数
パラメーター
f(x, ↵, ) =
↵
(↵)
x (↵+1)
exp
✓
x
◆
(0  x < 1)
単位長(時間)あたりβ回発生する指数分布のα個の和の
確率分布を考えた時、ガンマ分布となる
Xi ⇠ Exp( ) Z =
↵X
i=1
Xi ⇠ (↵, )
1/Z ⇠ IG(↵, )
この時、Zの逆数が従う分布を逆ガンマ分布と言う。
平均を0にずらす
n回実施
コイン投げ
(表の確率: p)
np一定で n→
平均を0にずらす
間隔の長さをプロット
09: 逆ガンマ分布
k=5つの長さを
足したものを
プロットする
k=5つ
サンプリング
全てのデータを
y=1/x で変換
z
z
w
w
trial_size	
  =	
  7000;	
  width	
  <-­‐	
  .;	
  
#	
  もともとの問題設定	
  
p	
  =	
  0.7;	
  n	
  =	
  10;	
  np	
  <-­‐	
  p*n;	
  
#	
  n→∞、p→0、np=一定	
  	
  
n	
  =	
  10000;	
  p	
  <-­‐	
  np/n;	
  alpha	
  <-­‐	
  5	
  
#	
  ベルヌーイ分布に従う乱数生成	
  
get_interval	
  <-­‐	
  function(){	
  
	
  	
  cnt	
  <-­‐	
  0	
  
	
  	
  while	
  (TRUE)	
  {	
  
	
  	
  	
  	
  cnt	
  <-­‐	
  cnt	
  +	
  1	
  
	
  	
  	
  	
  if	
  (rbern(1,	
  p)==1){	
  return(cnt)	
  }	
  
	
  	
  }	
  
}	
  
gen_exp_var	
  <-­‐	
  function()	
  {	
  
	
  	
  data	
  <-­‐	
  data.frame(x=rdply(trial_size,	
  get_interval())/n)	
  
	
  	
  names(data)	
  <-­‐	
  c("n",	
  "x")	
  
	
  	
  return(data)	
  
}	
  
result	
  <-­‐	
  rlply(alpha,	
  gen_exp_var())	
  
data	
  <-­‐	
  data.frame(x=1/(result[[1]]$x	
  +	
  result[[2]]$x	
  +	
  result[[3]]$x	
  +	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  result[[4]]$x	
  +	
  result[[5]]$x))	
  
#	
  逆ガンマ分布の密度関数	
  
dens	
  <-­‐	
  data.frame(y=dinvgamma(seq(0,	
  23,.01),	
  shape=5,	
  rate=1/np)*trial_size*width)	
  
ggplot()	
  +	
  
	
  	
  layer(data=data,	
  mapping=aes(x=x),	
  geom="bar",	
  stat	
  =	
  "bin",	
  
	
  	
  	
  	
  	
  	
  	
  	
  binwidth=width,	
  fill="#6666ee",	
  color="gray"	
  
	
  	
  )	
  +	
  layer(data=dens,	
  mapping=aes(x=seq(0,3,.01),	
  y=y),	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  geom="line",	
  stat="identity",	
  position="identity",	
  colour="red"	
  
	
  	
  )	
  +	
  ggtitle("Bernoulli	
  to	
  Inversegamma") Rコード
赤の曲線:理論的な確率
ヒストグラム:乱数から生成
09: 逆ガンマ分布
10/76
標準一様分布
Standard Uniform Distribution
10: 標準一様分布
確率密度関数
パラメーター
なし
0から1の間で等確率で発生するような現象を
表す分布
f(x) =
⇢
1 (0  x  1)
0 (otherwise)
10: 標準一様分布
コイン投げ
(表の確率: p) q回実施
試行結果を各桁に割り当て
表=1 裏=0 表=1 裏=0 表=1 裏=0
1回目 2回目 q回目
※ もっと効率の良いやり方もあると思いますが分かりやすさのため…
Z = x1(1/2)1
+ x2(1/2)2
+ · · · + xq(1/2)q
width	
  <-­‐	
  0.02	
  
p	
  <-­‐	
  0.5;	
  
sample_size	
  <-­‐	
  1000	
  
trial_size	
  <-­‐	
  100000	
  
gen_unif_rand	
  <-­‐	
  function()	
  {	
  
	
  	
  #	
  sample_size桁の2進少数をベルヌーイ分布に	
  
	
  	
  #	
  従う乱数から生成	
  
	
  	
  return	
  (sum(rbern(sample_size,	
  p)	
  *	
  (rep(1/2,	
  sample_size)	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  **	
  seq(sample_size))))	
  
}	
  
gen_rand	
  <-­‐	
  function(){	
  	
  	
  
	
  	
  return(	
  rdply(trial_size,	
  gen_unif_rand())	
  )	
  
}	
  
system.time(res	
  <-­‐	
  gen_rand())	
  
ggplot()	
  +	
  
	
  	
  layer(data=res,	
  mapping=aes(x=V1),	
  geom="bar",	
  stat	
  =	
  "bin",	
  
	
  	
  	
  	
  	
  	
  	
  	
  binwidth=width,	
  fill="#6666ee",	
  color="gray"	
  
	
  	
  )	
  +	
  ggtitle("Bernoulli	
  to	
  Standard	
  Uniform")	
  
Rコード
赤の曲線:理論的な確率
ヒストグラム:乱数から生成
10: 標準一様分布
11/76
一様分布
Standard Uniform Distribution
確率密度関数
パラメーター
a:下限
b:上限
f(x, a, b) =
⇢
(b a) 1
(a  x  b)
0 (otherwise)
aからbの間では等確率で発生するような現象を
表す分布
11: 一様分布
コイン投げ
(表の確率: p)
q回実施
11: 一様分布
平行移動と引き延ばし
a	
  <-­‐	
  5	
  
b	
  <-­‐	
  8;	
  
width	
  <-­‐	
  0.05	
  
p	
  <-­‐	
  0.5	
  
sample_size	
  <-­‐	
  1000	
  
trial_size	
  <-­‐	
  500000	
  
gen_unif_rand	
  <-­‐	
  function()	
  {	
  
	
  	
  #	
  sample_size桁の2進少数をベルヌーイ分布に	
  
	
  	
  #	
  従う乱数から生成	
  
	
  	
  return	
  (sum(rbern(sample_size,	
  p)	
  *	
  (rep(1/2,	
  sample_size)	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  **	
  seq(sample_size))))	
  
}	
  
gen_rand	
  <-­‐	
  function(){	
  	
  	
  
	
  	
  return(	
  rdply(trial_size,	
  gen_unif_rand())	
  )	
  
}	
  
system.time(res	
  <-­‐	
  gen_rand())	
  
res$V1	
  <-­‐	
  res$V1	
  *	
  (b-­‐a)	
  +	
  a	
  
ggplot()	
  +	
  
	
  layer(data=res,	
  mapping=aes(x=V1),	
  geom="bar",	
  stat	
  =	
  "bin",	
  
	
  	
  	
  	
  	
  	
  	
  	
  binwidth=width,	
  fill="#6666ee",	
  color="gray"	
  
	
  	
  )	
  +	
  ggtitle("Bernoulli	
  to	
  Uniform")	
  +	
  xlim(4,9)
Rコード
赤の曲線:理論的な確率
ヒストグラム:乱数から生成
11: 一様分布
12/76
ベータ分布
Beta Distribution
12: ベータ分布
確率密度関数
パラメーター
α:並べ替えたあとのサンプリングするポジション
β:同じくポジションだが、後ろから数えたときのもの
f(x, ↵, ) =
1
B(↵, )
x↵ 1
(1 x) 1
(0 < x < 1)
独立に標準一様分布に従う (α+β-1) 個の確率変数
を大きさの順に並べ替えたとき、小さい方から
α番め(大きい方からは β番目)の確率変数 X の分布が
ベータ分布 B(α,β) となる。
→ B(・)はベータ関数
Xi ⇠ U(0, 1)iid
(i = 1, 2, · · · , ↵ + 1)
… …
α個
β個
コイン投げ
(表の確率: p)
q回実施
12: ベータ分布
大きさの順に並べて
2つめの値をプロット
3つサンプリング
width	
  <-­‐	
  0.03;	
  p	
  <-­‐	
  0.5	
  
digits_length	
  <-­‐	
  30;	
  set_size	
  <-­‐	
  3	
  
trial_size	
  	
  	
  	
  <-­‐	
  30000	
  
gen_unif_rand	
  <-­‐	
  function()	
  {	
  
	
  	
  #	
  digits_length桁の2進少数をベルヌーイ分布	
  
	
  	
  #	
  に従う乱数から生成	
  
	
  	
  return	
  (sum(rbern(digits_length,	
  p)	
  *	
  	
  
	
  	
  (rep(1/2,	
  digits_length)	
  **	
  	
  
	
  	
  	
  seq(digits_length))))	
  
}	
  
gen_rand	
  <-­‐	
  function(){	
  	
  	
  
	
  	
  return(	
  rdply(set_size,	
  gen_unif_rand())$V1	
  )	
  
}	
  
unif_dataset	
  <-­‐	
  rlply(trial_size,	
  gen_rand,	
  .progress='text')	
  
p	
  <-­‐	
  ceiling(set_size	
  *	
  0.5);	
  q	
  <-­‐	
  set_size	
  -­‐	
  p	
  +	
  1	
  
get_nth_data	
  <-­‐	
  function(a){	
  return(a[order(a)][p])	
  }	
  
disp_data	
  <-­‐	
  data.frame(lapply(unif_dataset,	
  get_nth_data))	
  
names(disp_data)	
  <-­‐	
  seq(length(disp_data));	
  disp_data	
  <-­‐	
  data.frame(t(disp_data))	
  
names(disp_data)	
  <-­‐	
  "V1"	
  
x_range	
  <-­‐	
  seq(0,	
  1,	
  0.001)	
  
dens	
  <-­‐	
  data.frame(y=dbeta(x_range,	
  p,	
  q)*trial_size*width)	
  
ggplot()	
  +	
  
	
  	
  layer(data=disp_data,	
  mapping=aes(x=V1),	
  geom="bar",	
  stat	
  =	
  "bin",	
  
	
  	
  	
  	
  	
  	
  	
  	
  binwidth=width,	
  fill="#6666ee",	
  color="gray"	
  
	
  	
  )	
  +	
  layer(data=dens,	
  mapping=aes(x=x_range,	
  y=y),	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  geom="line",	
  stat="identity",	
  position="identity",	
  colour="red"	
  
	
  	
  )	
  +	
  ggtitle("Bernoulli	
  to	
  Beta")	
  
Rコード
赤の曲線:理論的な確率
ヒストグラム:乱数から生成
12: ベータ分布
To be continued…
参考
このスライドのRのコード
https://gist.github.com/matsuken92/671ae282429d6ad97aec
工科系のための統計概論
http://www.amazon.co.jp/dp/4563008168
指数分布とポアソン分布のいけない関係
http://www.slideshare.net/teramonagi/ss-11296227
ベータ分布の性質
http://www.kwansei.ac.jp/hs/z90010/sugakuc/toukei/beta/
beta.htm

「全ての確率はコイン投げに通ず」 Japan.R 発表資料