Llama-2が登場!8bit+LoRAでRLHFファインチューニングを試す方法はこちら

Pythonでモンティホール問題を再現してみた!本当にドアを変更すべきなのか!おまけとして仮説検定を用いて結果を検証!

モンティホール問題をご存じでしょうか。

この問題は直感と現実の乖離が起きやすいことで有名です。ご存じでない方に説明すると次のような問題です。

プレーヤーの前に閉じた3つのドアがあって、1つのドアの後ろには景品の新車が、2つのドアの後ろには、はずれを意味するヤギがいる。プレーヤーは新車のドアを当てると新車がもらえる。プレーヤーが1つのドアを選択した後、司会のモンティが残りのドアのうちヤギがいるドアを開けてヤギを見せる。ここでプレーヤーは、最初に選んだドアを、残っている開けられていないドアに変更してもよいと言われる。ここでプレーヤーはドアを変更すべきだろうか?

今回は、こちらの問題をpythonを使って検証してみたいと思います。

目次

Pythonでモンティホール問題を再現しよう

では、pythonで検証していきます。

3つのドアを用意しよう

まず、必要なことは何でしょうか。そうです、3つのドアを用意することですね。ついでにヤギと新車も用意しましょう。

doors = ["ヤギ", "ヤギ", "新車"]

簡単ですね。ヤギ、ヤギ、新車が揃いました。

playerがドアを選択する

ドアを選択します。3つのドアをランダムに選んでほしいので次のようにします。

import random
player_choice = random.choice(doors)

これで3つのドアから1つ選ぶことができました。

司会のモンティが残りのドアのうちヤギがいるドアを開ける

司会者はヤギのいるドアを知っているので、ヤギのいるドアを開けることができます。

では、残りのドアの中からヤギのいるドアを開けます。

# playerがドアを開いたのでそのドアは司会者が開くことができないようにする
doors.remove(player_choice)
# 司会者がplayer_choiceを除いた残りのヤギのいるドアを開く
doors.remove("ヤギ")

司会者が残りのドアからヤギのいるドアを開けました。

playerが残っている開けられていないドアを選択する

残っているドアに変更します。ドアは残りは1つなので次のようにできます。

player_choice = doors[0]

最初の選択したドアから変更したドアを開けました。

ドアの向こうが新車の場合はカウントする

さて、このドアの向こうには新車があるのか。あるならば、player_choiceが新車になっているので、条件式を書いてカウントします。

cnt = 0
if player_choice == "新車":
    cnt += 1

これで何回、新車があるドアを開けたのか分かるようになりました。

pythonでモンティホール問題を繰り返し再現しよう

まずこの一連の流れを100回繰り返してどれくらい新車が選ばれるのか調べてみます。

100回実験してみた結果

では、モンティホール問題の再現はできたのでそれらをまとめます。

cnt = 0
for _ in range(100):
    doors = ["ヤギ", "ヤギ", "新車"]
    player_choice = random.choice(doors)
    doors.remove(player_choice)
    doors.remove("ヤギ")
    player_choice = doors[0]
    if player_choice == "新車":
        cnt += 1
print(cnt)

100回セットを10回やってみた結果がこちらです。

実行回数新車があるドアを開いた回数
165
267
365
467
569
662
767
872
966
1074

モンティホール問題においてはじめの選択から変更すると新車が当たる確率は2/3なので正しそうですね。

1000回実行してみた結果

では、1000回繰り返してみるとどうなるのか調べてみます。

cnt = 0
for _ in range(1000):
    doors = ["ヤギ", "ヤギ", "新車"]
    player_choice = random.choice(doors)
    doors.remove(player_choice)
    doors.remove("ヤギ")
    player_choice = doors[0]
    if player_choice == "新車":
        cnt += 1
print(cnt)

1000回セットを10回やってみた結果がこちらです。

実行回数新車があるドアを開いた回数
1673
2655
3664
4662
5680
6668
7667
8647
9683
10701

選択は変更した方が良い?統計的手法で検証してみよう

標本はいくらでも作れるので、おまけとして仮説検定を行います。仮説検定とは、仮説に基づき理論的に導かれた結果と観測結果を比較し,予測が正しいと言えるか否かを判断することを言います。

今回の仮説検定でいうと選択を変更した方が良いと述べたいので、帰無仮説を「選択を変更してもしなくとも確率は変わらず1/2である」とします。

この時、母平均1/2、母集団の標準偏差も1/2なので、モンティホール問題において選択を変更する試行10000回の標本平均の確率分布の標準偏差は0.5/100=0.005になります。有意水準を上側5%とすると1.645×0.005=0.008225なので5%の確率でX ≥ μ+0.008225になります。母平均は1/2なので5%の確率で X ≥ 0.508225になることが分かります。

では標本を用意します。新たに10000回実行したところ6633回新車を当てることができました。この時の確率を考えると、6633/10000=0.6633と分かります。0.6633 ≥ 0.508225であるので帰無仮説は棄却され、選択を変更した方が良いと言えます。

最後に

今回はpythonを用いてモンティホール問題を再現してみました。

統計的手法に関してもpythonのライブラリが存在するので調べてみることをお勧めします。

ここまで読んでいただきありがとうございました。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次