読者です 読者をやめる 読者になる 読者になる

Mukku John Blog

取り組んでいること を つらつら と

Rプログラミング入門 17回目

Rプログラミング入門

このサイコロの期待値を考えながら、ループを学ぶ下準備をします。

> die <- c(1,2,3,4,5,6)
> die
[1] 1 2 3 4 5 6

期待値

個々の可能な事象が持つ値にその事象が発生する確率を掛けたものの合計。
これ。
{ \displaystyle
E(x) = \sum_{i=1}^{n} (x_i\ \cdot\ P(x_i))
}

なので、上のdieオブジェクトの期待値はこうです。
{ \displaystyle
E(die) = \sum_{i=1}^{n} (die_i\ \cdot\ P(die_i)) \\
\ \ \ \ \ \ \ \ \ \ \ = 1\cdot\frac{1}{6} + 2\cdot\frac{1}{6} + 3\cdot\frac{1}{6} + 4\cdot\frac{1}{6} + 5\cdot\frac{1}{6} + 6\cdot\frac{1}{6} \\
\ \ \ \ \ \ \ \ \ \ \ = 3.5
}


この記事でサイコロの出る目を変更しました。
mukkujohn.hatenablog.com

変更されたサイコロの期待値はこちらです。
{ \displaystyle
E(die) = \sum_{i=1}^{n} (die_i\ \cdot\ P(die_i)) \\
\ \ \ \ \ \ \ \ \ \ \ = 1\cdot\frac{1}{8} + 2\cdot\frac{1}{8} + 3\cdot\frac{1}{8} + 4\cdot\frac{1}{8} + 5\cdot\frac{1}{8} + 6\cdot\frac{3}{8} \\
\ \ \ \ \ \ \ \ \ \ \ = 4.125
}

この期待値を求めるステップはこちらです。

  1. 出る可能性のあるすべての結果を書き出す
  2. 個々の結果の値をはっきりさせる(サイコロの出目の値)
  3. 個々の結果が発生する確率を計算する

このステップを踏めば、
期待値はステップ2.の個々の値にステップ3.の対応する確率を掛けた合計
になります。

ただ、サイコロ1個くらいなら良いのですが、サイコロ2個とか
サイコロではなく、スロットマシーンのシンボルの組み合わせとか
手で書き出すなんて、ぞっとします。

そこで、expand.grid

expand.grid

説明するより、使った方が早い。

> rolls <- expand.grid(die,die)
> rolls
   Var1 Var2
1     1    1
2     2    1
3     3    1
4     4    1
5     5    1
6     6    1
7     1    2
・
・
・
30    6    5
31    1    6
32    2    6
33    3    6
34    4    6
35    5    6
36    6    6

全部の組み合わせを出してくれます。便利。

組み合わせを出してしまえば、上述のステップ2.の値を算出するのも
あっという間です。

> rolls$value <- rolls$Var1 + rolls$Var2
> head(rolls,3)
  Var1 Var2 value
1    1    1     2
2    2    1     3
3    3    1     4

次に、個々の組み合わせが発生する確率を求めます。
独立している事象がすべて発生する確率は、個々の事象が発生する確率の積です。
{ \displaystyle
P(AかつBかつCかつ...)\ =\ P(A)\ \cdot\ P(B)\ \cdot\ P(C)
}

サイコロを2個振って、(1,1)*1がでる確率はこうなります。
{ \displaystyle
P(1かつ1)\ =\ P(1)\ \cdot\ P(1) \\
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\ \frac{1}{8}\cdot\frac{1}{8} \\
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\ \frac{1}{64} 
}

(1,2)がでる確率はこちら。
{ \displaystyle
P(1かつ2)\ =\ P(1)\ \cdot\ P(2) \\
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\ \frac{1}{8}\cdot\frac{1}{8} \\
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\ \frac{1}{64} 
}

まぁ、上記を踏まえつつ、まずは確率のルックアップテーブルを作ります。

> prob <- c("1" = 1/8, "2" = 1/8, "3" = 1/8, "4" = 1/8, "5" = 1/8, "6" = 3/8)
> prob
    1     2     3     4     5     6 
0.125 0.125 0.125 0.125 0.125 0.375

で、ここからrolls$Var1を使ってルックアップするとそれぞれの確率が得られます。

> prob[rolls$Var1]
    1     2     3     4     5     6     1     2     3     4     5     6     1     2 
0.125 0.125 0.125 0.125 0.125 0.375 0.125 0.125 0.125 0.125 0.125 0.375 0.125 0.125 
    3     4     5     6     1     2     3     4     5     6     1     2     3     4 
0.125 0.125 0.125 0.375 0.125 0.125 0.125 0.125 0.125 0.375 0.125 0.125 0.125 0.125 
    5     6     1     2     3     4     5     6 
0.125 0.375 0.125 0.125 0.125 0.125 0.125 0.375 

これを使って、rollsオブジェクトに確率に該当する列を追加します。

> rolls$prob1 <- prob[rolls$Var1]
> rolls$prob2 <- prob[rolls$Var2]
> rolls$prob <- rolls$prob1 * rolls$prob2
> head(rolls,3)
  Var1 Var2 value prob1 prob2     prob
1    1    1     2 0.125 0.125 0.015625
2    2    1     3 0.125 0.125 0.015625
3    3    1     4 0.125 0.125 0.015625

で、rollsオブジェクトのvalue列とprob列を使うと期待値が求まります。

> sum(rolls$value * rolls$prob)
[1] 8.25

次回は、これらの手順を使って、この記事で作成した
スロットマシーンの期待値を算出する過程でループを学んでいきます。
mukkujohn.hatenablog.com

*1:1と1が出ることを表す。(1,2)であれば1と2が出ること。