本ページのソースコードについて

本シミュレーションのコードはGitHub[Link]からも閲覧可能です。

Publicに設定しておいたので、ご自由にどうぞ。

ゲームの説明

統計学の教科書でしばしば紹介される例の一つがモンティ・ホール問題である。これはアメリカのテレビ番組の中のゲームであり、様々な論争まで行われてきた。

ゲームのルールは簡単

  • 3つのドアがあり、1つのドアの後ろに商品がある。
  • 参加者はドアを選択する。
  • 司会者(モンティ)が残りのドア2つの中で商品がないドアを開けて中身を見せる。
  • ここで参加者はドアの選択を変える機会が与えられる。

直観的に考えて、司会者が外れのドアを1つ教えてくれたなら、残りの2つのドアの1つに絶対に商品がある。そのうち一つは自分が既に選んだドア。どう見ても当たる確率は半々であって、変えても、変えなくても当たる確率は同じだと思われる。

しかし、結果からいうと選択を変えた方が変えなかった場合より当たる確率が2倍である。これは条件付き確率とベイズの定理を用いることで数学的に説明できる。興味のある人はウィキペディアの項目を参照。この問題を巡る論争とかも紹介されていてなかなか面白い。


シミュレーションの設定

  • 商品があるドアを決める(atari)
  • 参加者が選択するドアを決める(selection)
    • もし、atariとselectionが一致すると
      • 既に参加者は当たりを選んでいるので、選択を変えると商品がもらえなくなる(if.switch = 0)
      • 既に参加者は当たりを選んでいるので、選択を変えなかったら商品がもらえる(if.not.switch = 1)
    • 一方、atariとselectionが不一致すると
      • 司会者は参加者が選んだドア(ハズレ)を除く二つのドアの中でハズレのドアを教えてくれる。つまり、残りの一つのドアに商品がある。
      • この場合、選択を変えると商品がもらえる(if.switch = 1)
      • もし、選択を変えなかったら商品はもらえない(if.not.switch = 0)
  • これをN回やってみて、選択を変えた場合の当たり率を確認する。

シミュレーションのRコード

#シミュレーションの関数の定義
MH.sim <- function(trials = 1000){
  #結果を返す空のデータフレームの作成
  result.df <- data.frame(id = NA,
                          atari = NA,
                          selection = NA,
                          if.switch = NA,
                          if.not.switch = NA)
  
  for(i in 1:trials){
    atari <- sample(1:3, 1) #当たりのドア番号
    selection <- sample(1:3, 1) #参加者が選んだドア番号
    
    if(atari == selection){ #もし参加者が当たりのドアを選んでいたら
      if.switch <- 0 #選択を変えると商品がもらえない
      if.not.switch <- 1 #選択を変えないなら商品がもらえる
    }else{ #参加者がハズレのドアを選んでいたら
      if.switch <- 1 #選択を変えたら商品がもらえる
      if.not.switch <- 0 #選択を変えないと商品がもらえない
    }
    
    #結果をデータフレームに保存する
    result.df[i,] <- c(i,
                       atari,
                       selection,
                       if.switch,
                       if.not.switch)
  }

  return(result.df)  #結果を返す
}

シミュレーションの実行

> table(MH.sim(trials = 10000)$if.switch)
  0    1
3284 6716

1万回のシミュレーションの結果、選択肢を変えた場合の当たり率は67.16%、変えなかった場合は32.84%であり、ほぼ2倍になることが分かる。