的中確率pでnレースに賭けてxレースで当たる確率は?2項分布の問題

例えば、

  • 買った馬券が当たる確率(的中確率)が0.2で、
  • 10個のレースでそれぞれ1馬券ずつ買って、
  • 7個のレース

で馬券が当たる確率はいくらか?

という問題は2項分布の問題です。

的中確率を\(p\)、賭けるレース数を\(n\)、馬券が当たるレース数を\(x\)とすると、確率\(p(x)\)は、

\[
p(x) = \left(
\begin{array}{c}
n\\
x
\end{array}
\right)
p^x
(1-p)^{n-x}
\]

の2項分布で表せます。

先の例の値、

  • \(p = 0.2\)、
  • \(n = 10\)、
  • \(x = 7\)

を代入すると、

確率\(p(7)\)は、

\[
p(7) = \left(
\begin{array}{c}
10\\
7
\end{array}
\right)
0.2^7
0.8^3
= 0.00079
\]

と求まります。

計算はRで次のようにしました。

bidist <- function(p, n, x) {
  (factorial(n) / (factorial(n-x) * factorial(x))) * p^x * (1-p)^(n-x)
}
bidist(0.2, 10, 7)
## [1] 0.000786432

とりうる全ての\(x\)の値\(x = 0, 1, 2, ..., 10\)の確率\(p(x)\)は、\(p(7)\)と同様に2項分布の公式で求めることができます。

p_x <- sapply(0:10, bidist, p=0.2, n=10)
p_x
## [1] 0.1073741824 0.2684354560 0.3019898880 0.2013265920 0.0880803840 0.0264241152 0.0055050240 0.0007864320 0.0000737280
## [10] 0.0000040960 0.0000001024

この2項分布\(p(x)\)をプロットすると次のようになりました。

2項分布プロット

この図は次のようにRでプロットしました。

# Install ggplot2
if (!require("ggplot2")) {
  install.packages("ggplot2", repos = "https://cloud.r-project.org/")
}
library(ggplot2)
# Make data frame
df <- data.frame(x=0:10,p_x=p_x)
# Add plot layers
g <- ggplot(df, aes(x = x, y = p_x))
g <- g + geom_point() # set scatter diagram
g <- g + xlab("x") # x label
g <- g + ylab("p(x)") # y label
g <- g + ggtitle("Binomial distribution: p = 0.2, n = 10") # title
# Plot
plot(g)

この図を見ると、\(x = 3\)のときに確率は最大で、\(x \geq 6\)ではほとんど0だとわかります。的中確率0.2だと、10回馬券を買って10回全て外れる確率\(p(0)\)は約0.1で、逆に10回全て当たる確率はほとんどありません。

Kosuke Maeda / まえだこうすけ

「機械学習で競馬予想して勝てるのか?」をテーマに活動中! QiitaにはR、VBAなどのTipsを投稿しています。