は、あることがどれくらい起こりやすいかを 0 から 1 の数で表したものです。単純な考え方ですが、人間の直感とよく食い違います。
この回では、直感が外れる代表的な場面を2つ取り上げ、実際に計算して確かめます。手を動かすと、なぜ外れるのかが腑に落ちます。
1. 誕生日の問題
教室に何人いれば、同じ誕生日の人が2人以上いる確率が 50% を超えるでしょうか。
365日あるのだから、100人くらい必要だと感じませんか。実際には 23人 で 50% を超えます。40人のクラスなら、約89% の確率で同じ誕生日の組がいます。
def same_birthday_prob(n: int) -> float: """n 人いるとき、誕生日が同じ組が1つ以上ある確率。""" # 「全員が違う誕生日」の確率を先に求め、1 から引く all_different = 1.0 for i in range(n): all_different *= (365 - i) / 365 return 1 - all_different
for n in [10, 20, 23, 30, 40, 50, 70]: p = same_birthday_prob(n) print(f"{n:3d}人: {p:6.1%}")実行すると、23人で 50.7%、40人で 89.1%、70人では 99.9% を超えます。思っていたよりずっと少ない人数で起きることが分かります。
なぜ直感が外れるのか。「自分と同じ誕生日の人」を探していると思い込むからです。実際に探しているのは「誰かと誰かが同じ」という組み合わせです。23人なら、組み合わせは 253通り もあります。
for n in [10, 23, 40]: pairs = n * (n - 1) // 2 # 2人の組み合わせの数 print(f"{n:3d}人 → 組み合わせ {pairs:4d} 通り")
# 自分と同じ誕生日の人がいる確率(比較のため)for n in [10, 23, 40]: p = 1 - (364 / 365) ** (n - 1) print(f"{n:3d}人中、自分と同じ誕生日の人がいる確率: {p:5.1%}")「自分と同じ」なら 23人でも 6% 程度です。問いが違うと答えが桁で変わるわけです。直感が外れたのは、確率の計算を間違えたからではなく、別の問いに答えていたからでした。
人数が2倍になると、組み合わせは約4倍になります。10人なら45通り、20人なら190通り、40人なら780通り。人数の増え方より、はるかに速く増える。これが直感を裏切る正体です。
2. 検査の問題
もう1つ、もっと実生活に関わる例です。ある病気の検査で陽性と出ました。実際にその病気である確率はどれくらいでしょうか。
条件を決めます。この病気にかかっているのは1万人に1人。検査の精度は99%(病気の人は99%が陽性、病気でない人は99%が陰性)とします。
「精度99%なんだから、99%くらいでは」と感じませんか。実際には 約1% です。100倍近く違います。
population = 1_000_000rate = 1 / 10_000 # 1万人に1人accuracy = 0.99 # 検査の精度
sick = population * rate # 本当に病気の人healthy = population - sick # 病気でない人
# 陽性になる人を数えるtrue_positive = sick * accuracy # 病気で、正しく陽性false_positive = healthy * (1 - accuracy) # 病気でないのに陽性
print(f"100万人のうち")print(f" 本当に病気 : {sick:>10,.0f} 人")print(f" 病気でない : {healthy:>10,.0f} 人")print()print(f"陽性と出る人")print(f" 病気で陽性 : {true_positive:>10,.0f} 人")print(f" 病気でないのに陽性: {false_positive:>10,.0f} 人")print()prob = true_positive / (true_positive + false_positive)print(f"陽性のとき、本当に病気である確率 = {prob:.2%}")計算すると、100万人のうち病気なのは100人。そのうち99人が陽性になります。一方、病気でない999,900人のうち1%、約9,999人も陽性になってしまいます。
つまり陽性と出た約1万人のうち、本当に病気なのは99人だけ。約1%です。病気でない人の数が圧倒的に多いため、たった1%の間違いでも、人数にすると病気の人を大きく上回ります。
これを といいます。間違いの原因はそもそも何人が病気なのか(元の割合)を無視することです。珍しい病気ほど、陽性でも病気でない人が多くなります。検査の精度が同じでも、対象が変われば答えは変わります。
実際の医療では、症状のある人だけに検査をすることでこの問題を減らしています。症状がある人の中では病気の割合が高いので、陽性の意味が強くなります。誰に検査するかが、結果の意味を決めるわけです。
3. 少ない回数は当てにならない
3つ目は、EP.07 でも触れた話です。 は「回数を増やせば本来の確率に近づく」という法則ですが、裏を返せば少ないうちは大きく外れるということです。
import numpy as np
rng = np.random.default_rng(3)
print("表が出る割合(本来は 50%)")for n in [10, 100, 1_000, 10_000, 100_000]: # 5回ずつ試して、ばらつきを見る results = [rng.integers(0, 2, n).mean() for _ in range(5)] lo, hi = min(results), max(results) print(f"{n:7,d}回: {lo:.1%} 〜 {hi:.1%} (幅 {hi - lo:.1%})")10回では 20% から 80% くらいまで揺れます。10万回では 49% から 51% の範囲に収まります。「10回投げて7回表が出た。このコインは偏っている」とは言えない理由がここにあります。
4. 直感が外れる場面のパターン
3つの例に共通するものを整理します。直感が外れやすい場面には型があります。
| 場面 | 直感のずれ方 | 対処 |
|---|---|---|
| 組み合わせが関わる | 少なく見積もる | 組み合わせの数を数える |
| 珍しいことが関わる | 元の割合を忘れる | 実際の人数に直す |
| 回数が少ない | 偶然を意味だと思う | 回数を確認する |
| 続けて起きたことを見る | 「そろそろ来る」と思う | 前回と今回は無関係 |
4行目にも触れておきます。コインで表が5回続いても、次に裏が出やすくなることはありません。コインは前の結果を覚えていないからです。これは「そろそろ来るはず」という感覚として、非常に強く働きます。
5. どう身につけるか
確率の直感は、訓練でしか身につきません。おすすめの方法は2つです。
- 1人数に直して考える — 「1%」ではなく「100万人のうち1万人」と考える
- 2実際に計算してみる — 上のコードのように、手を動かして確かめる
1番目は特に効きます。検査の例で、パーセントのまま考えると混乱しますが、100万人で考えると一目で分かりました。割合は直感が働きにくく、実数は働きやすい。この変換を癖にしておくと役立ちます。
6. まとめ
確率は、計算は単純なのに直感が働かないという珍しい分野です。だからこそ、計算する価値があります。
ここまで、代表値・散らばり・分布・相関・因果・標本・グラフ・確率と進んできました。共通していたのは、数字をそのまま信じず、どう作られたかを確かめるという姿勢です。これは統計だけでなく、情報を扱うすべての場面で使えます。
23人で誕生日が重なる確率は50%超(組み合わせは急激に増える)。精度99%の検査で陽性でも、珍しい病気なら約1%(条件付き確率 — 元の割合を無視しない)。少ない回数の結果は当てにならない。直感を鍛えるには、割合を人数に直すのが有効です。続編は読者からの反応に応じて随時追加していきます。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。