背景
統計検定2級の問題で、2人の対戦相手(T君、U君)と合計3回対戦をして、2連勝する確率を問う問題がありました。
(統計検定2級受験予定で、この問題を解いてない方は、答えを見ないでくださいね。)
T君に勝つ確率がp、U君に勝つ確率がq、0<p<q<1 とすると、2連勝する確率は、
- T君→U君→T君 が高い
- U君→T君→U君 が高い
- どの順番でも関係ない
- 具体的なp,qによる、
のどれが正しいか、という問題です。
これを、プログラムで検証してみました
準備
まず、以下の準備。
- 2連勝する確率を求める関数の定義
- どの順番で対戦したほうが確率が高いかを出力する関数の定義
# 2連勝する確率を求める
def calc_probability_2_wins_in_a_low( p1, p2, p3 ):
# 勝ち、勝ち(2戦で終了)
p_win_win = p1 * p2
# 負け、勝ち、勝ち
p_lose_win_win = (1-p1) * p2 * p3
# 2連勝
return p_win_win + p_lose_win_win
# どの順番で対戦したほうが確率が高いかを出力する
def judge_higher_probabirity(order1,prob1,order2,prob2):
if prob1==prob2:
print(f'{order1}の確率 {prob1:.2f} と、{order2}の確率 {prob2:.2f} は同じ')
elif prob1>prob2:
order_h = order1
prob_h = prob1
order_l = order2
prob_l = prob2
else:
order_h = order2
prob_h = prob2
order_l = order1
prob_l = prob1
print(f'{order_h}の確率 {prob_h:.2f} が、\n{order_l}の確率 {prob_l:.2f} より高い')
T君U君ではわかりにくいので、のひたくんとしゃいあんと対戦するように考えました。
p_nohita = 0.8 # のひたくんに勝つ確率
p_shian = 0.2 # しゃいあんに勝つ確率
どの順番が2連勝する確率が高いか検証
# どの順番で対戦したほうが確率が高いかを出力する
judge_higher_probabirity(
'のひたくん→しゃいあん→のひたくん',
calc_probability_2_wins_in_a_low(p_nohita,p_shian ,p_nohita),
'しゃいあん→のひたくん→しゃいあん',
calc_probability_2_wins_in_a_low(p_shian ,p_nohita,p_shian)
)
しゃいあん→のひたくん→しゃいあんの確率 0.29 が、
のひたくん→しゃいあん→のひたくんの確率 0.19 より高い
なので、答えは、しゃいあん(勝つ確率の低い相手)と2回対戦するのが、2連勝する確率が高い、という結果になりました。
しゃいあんと2回対戦して、1回でも勝てたら、2連勝する確率が高まる、ということなので、しゃいあんと2回対戦がよいという結果になります。(冷静に考えると当然な結果です。)
これは、のひたくんに勝つ確率を1とするとわかりやすいです。
p_nohita = 1.0 # のひたくんに勝つ確率
p_shian = 0.2 # しゃいあんに勝つ確率
# どの順番で対戦したほうが確率が高いかを出力する
judge_higher_probabirity(
'のひたくん→しゃいあん→のひたくん',
calc_probability_2_wins_in_a_low(p_nohita,p_shian ,p_nohita),
'しゃいあん→のひたくん→しゃいあん',
calc_probability_2_wins_in_a_low(p_shian ,p_nohita,p_shian)
)
しゃいあん→のひたくん→しゃいあんの確率 0.36 が、
のひたくん→しゃいあん→のひたくんの確率 0.20 より高い
のひたくんに勝つ確率が1なので、のひたくんとの対戦は確率に影響しないので、
のひたくん(1)→しゃいあん→のひたくん(1)は、しゃいあんと1回対戦して、1勝つ確率そのもの(0.2)です。
また、しゃいあん→のひたくん(1)→しゃいあんは、しゃいあんと2回対戦して、1回でも勝つ確率そのもの(0.36)です。
# 1回目で勝つ確率
p_shian_1 = p_shian
# 2回目で勝つ確率(1回目で負けて、2回目で勝つ)
p_shian_2 = (1-p_shian)*p_shian
# 合計すると
p_shian_1_2 = p_shian_1 + p_shian_2
print(f'1回目で勝つ確率{p_shian_1:.2f}')
print(f'2回目で勝つ確率{p_shian_2:.2f}')
print(f'2回対戦して、1回でも勝つ確率{p_shian_1_2:.2f}')
1回目で勝つ確率0.20
2回目で勝つ確率0.16
2回対戦して、1回でも勝つ確率0.36
なので、しゃいあん→のひたくん→しゃいあんのほうが、2連勝する確率が高くなる、ということになります。
冷静に考えれば簡単な問題ですが、限られた時間内で解く問題では誤解しやすいです。
しかも、このプログラムでは、わかりやすいように、のひたくんとしゃいあんとしているので、直観的に理解しやすいですが、T君に勝つ確率がp、U君に勝つ確率がq、0<p<q<1 と問題設定されると、どっちが強いんだっけ、を理解するまでに時間がかかるし、間違いやすいです。
問題をよく読まずに回答してしまうと、3回対戦して2回勝てば、と勘違いしやすいです。
単純に2勝すればよいという条件の場合
ちなみに、3回対戦して2回勝てば、という条件なら、
# 3回対戦して2回勝てば、という条件なら
def calc_probability_2_wins( p1, p2, p3 ):
p_wins_in_a_low = calc_probability_2_wins_in_a_low( p1, p2, p3 )
# 勝ち、負け、勝ち
p_win_lose_win = p1 * (1-p2) * p3
# 2勝
return p_wins_in_a_low + p_win_lose_win
p_nohita = 0.8 # のひたくんに勝つ確率
p_shian = 0.2 # しゃいあんに勝つ確率
# どの順番で対戦したほうが確率が高いかを出力する
judge_higher_probabirity(
'のひたくん→しゃいあん→のひたくん',
calc_probability_2_wins(p_nohita,p_shian ,p_nohita),
'しゃいあん→のひたくん→しゃいあん',
calc_probability_2_wins(p_shian ,p_nohita,p_shian)
)
のひたくん→しゃいあん→のひたくんの確率 0.70 が、
しゃいあん→のひたくん→しゃいあんの確率 0.30 より高い
当然の結果として、のひたくんと2回対戦するほうが確率が高いですが、この条件として解答してしまうと、間違ってしまいます。
あとがき
統計学の知識やそれをうまく使いこなせるか、という問題というよりは、どちらかと言うと、ひっかけ問題に近いように思いました。(良問ではあるが、冷静になって考えると簡単にわかる。)大学受験など、順位付けが必要な試験ならともかく、(それ自体もどうかとは思いますが、)資格試験で、このようなひっかけ問題が出題される、というのは、どうなんでしょうかね?今度、統計検定2級を受験する予定ですが、惑わされずに頑張っていきたいです。