統計検定２級の問題をプログラムで検証してみた（２）

# 背景

統計検定２級の問題で、２人の対戦相手（T君、U君）と合計３回対戦をして、２連勝する確率を問う問題がありました。
（統計検定２級受験予定で、この問題を解いてない方は、答えを見ないでくださいね。）

T君に勝つ確率がp、U君に勝つ確率がq、0<p<q<1 とすると、２連勝する確率は、
1. T君→U君→T君 が高い
1. U君→T君→U君 が高い
1. どの順番でも関係ない
1. 具体的なp,qによる、

のどれが正しいか、という問題です。

これを、プログラムで検証してみました

# 準備
まず、以下の準備。
* ２連勝する確率を求める関数の定義
* どの順番で対戦したほうが確率が高いかを出力する関数の定義

```python
# ２連勝する確率を求める
def calc_probability_2_wins_in_a_low( p1, p2, p3 ):
  # 勝ち、勝ち（２戦で終了）
  p_win_win = p1 * p2
  # 負け、勝ち、勝ち
  p_lose_win_win = (1-p1) * p2 * p3

  # ２連勝
  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君ではわかりにくいので、のひたくんとしゃいあんと対戦するように考えました。
```python
p_nohita = 0.8  # のひたくんに勝つ確率
p_shian  = 0.2  # しゃいあんに勝つ確率
```

# どの順番が２連勝する確率が高いか検証
```python
# どの順番で対戦したほうが確率が高いかを出力する
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 より高い
```
なので、答えは、しゃいあん（勝つ確率の低い相手）と２回対戦するのが、２連勝する確率が高い、という結果になりました。
しゃいあんと２回対戦して、１回でも勝てたら、２連勝する確率が高まる、ということなので、しゃいあんと２回対戦がよいという結果になります。（冷静に考えると当然な結果です。）
これは、のひたくんに勝つ確率を1とするとわかりやすいです。
```python
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)は、しゃいあんと１回対戦して、１勝つ確率そのもの(0.2)です。
また、しゃいあん→のひたくん(1)→しゃいあんは、しゃいあんと２回対戦して、１回でも勝つ確率そのもの(0.36)です。
```python
# １回目で勝つ確率
p_shian_1 = p_shian
# ２回目で勝つ確率（１回目で負けて、２回目で勝つ）
p_shian_2 = (1-p_shian)*p_shian
# 合計すると
p_shian_1_2 = p_shian_1 + p_shian_2

print(f'１回目で勝つ確率{p_shian_1:.2f}')
print(f'２回目で勝つ確率{p_shian_2:.2f}')
print(f'２回対戦して、１回でも勝つ確率{p_shian_1_2:.2f}')
```

```
１回目で勝つ確率0.20
２回目で勝つ確率0.16
２回対戦して、１回でも勝つ確率0.36
```
なので、しゃいあん→のひたくん→しゃいあんのほうが、２連勝する確率が高くなる、ということになります。

冷静に考えれば簡単な問題ですが、限られた時間内で解く問題では誤解しやすいです。
しかも、このプログラムでは、わかりやすいように、のひたくんとしゃいあんとしているので、直観的に理解しやすいですが、**T君に勝つ確率がp、U君に勝つ確率がq、0<p<q<1** と問題設定されると、どっちが強いんだっけ、を理解するまでに時間がかかるし、間違いやすいです。

問題をよく読まずに回答してしまうと、３回対戦して２回勝てば、と勘違いしやすいです。

# 単純に２勝すればよいという条件の場合
ちなみに、３回対戦して２回勝てば、という条件なら、

```python
# ３回対戦して２回勝てば、という条件なら
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

  # ２勝
  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 より高い
```

当然の結果として、のひたくんと２回対戦するほうが確率が高いですが、この条件として解答してしまうと、間違ってしまいます。

# あとがき

統計学の知識やそれをうまく使いこなせるか、という問題というよりは、どちらかと言うと、ひっかけ問題に近いように思いました。（良問ではあるが、冷静になって考えると簡単にわかる。）大学受験など、順位付けが必要な試験ならともかく、（それ自体もどうかとは思いますが、）資格試験で、このようなひっかけ問題が出題される、というのは、どうなんでしょうかね？今度、統計検定２級を受験する予定ですが、惑わされずに頑張っていきたいです。