【確率①】まずは「数え上げ」から!樹形図で全パターンを網羅する

Python

「確率」の仕組みはシンプルです。
確率を平たく言えば、「起こりうるすべてのパターンのうち、知りたい結果がどれくらい含まれているか」を比べる作業にすぎません。

たとえば、コインを2回投げたときに「表が2回出る確率」を知りたいとしましょう。
その場合、まずは「表・表」「表・裏」「裏・表」「裏・裏」という全パターン4通りだと把握することから始まります。
この「全パターン」のことを、数学では全事象ぜんじしょうと呼びます。

つまり、全部で何通りあるのかを「正しく数える」ことができれば、確率は解けたも同然なのです。

しかし、パターンの数が10通り、20通りと増えていくと、頭の中だけで数えるのは限界がきます。
そこで、人間の代わりに正確に、かつ一瞬で数え上げてくれる強力な道具が、今回から登場する「Python」というプログラミング言語です。

まずは、頭の中を整理するための「樹形図」の考え方を学び、次に「数え上げ」という根気のいる作業をコンピュータに任せる方法を見ていきましょう。

第1章:樹形図とは

確率の計算において最も避けなければならないのは、「数え忘れ」や、同じものを「二重に数えてしまう」ミスです。
これらを防ぎ、思考を整理するために使われるのが樹形図じゅけいずという手法です。

漏れなく・重複なく数えるための地図のようなものである、と言えます。

1.1. 整理のコツは「条件の固定」

樹形図は、一つ一つの選択肢を木の枝が分かれるように描いていきます。

例えば、「コインを3回投げる」という状況を樹形図で整理してみましょう。
(図内の HHeads(表)、TTails(裏)の意味です。)

【1回目】      【2回目】   【3回目】    【結果】
             ┌── 表 (H)  →  H-H-H
       ┌── 表 (H) ┤
       │      └── 裏 (T)  →  H-H-T
─── 表 (H) ──┤
       │      ┌── 表 (H)  →  H-T-H
       └── 裏 (T) ┤
             └── 裏 (T)  →  H-T-T

             ┌── 表 (H)  →  T-H-H
       ┌── 表 (H) ┤
       │      └── 裏 (T)  →  T-H-T
─── 裏 (T) ──┤
       │      ┌── 表 (H)  →  T-T-H
       └── 裏 (T) ┤
             └── 裏 (T)  →  T-T-T

1回目に「表」か「裏」が出るという分岐があり、そこからさらに2回目、3回目……と枝を伸ばしていくことで、すべての組み合わせを視覚的に把握できます。

この図を描く際に意識すべきポイントは一つです。

「もし、1回目が表だったら?」という前提を一つに固定して、その先の可能性をすべて書き出すこと。

このように、一箇所ずつ条件を固定して枝分かれさせていくことで、複雑なパターンも驚くほどスッキリと整理できます。
樹形図の末端(右端)に並んだ結果の数を合計すれば、それがそのまま「全部で何通りあるか(全事象)」という答えになります。

1.2. 確率は「全体 (全事象)」と「一部」を比べること

樹形図で全パターンを網羅できたら、次は「知りたい結果」に注目します。

たとえば先ほどのコインを3回投げる例(全8通り)において、「ちょうど2回だけ表が出る」パターンがいくつあるか、樹形図に印をつけてみましょう。

  • 表・表・裏 (H-H-T)
  • 表・裏・表 (H-T-H)
  • 裏・表・表 (T-H-H)

以上の3通りが見つかるはずです。
これで、確率を求めるための形が見えてきます。

  • 分母 (全事象): 樹形図の末端にあるすべての数 = 8
  • 分子: 印をつけた特定のパターンの数 = 3

この2つの数字を比べることで、確率は \(3/8\) であると導き出されます。
確率は計算技術というよりも、まずは「全体 (全事象)」と「一部 (事象)」を正しく見分ける整理術に近いイメージです。

1.3. 「組み合わせの爆発」とコンピュータの役割

樹形図は思考を整理する上では最強のツールですが、扱う対象が大きくなると、人間にとっては「苦行」に変わってしまいます。

たとえば、コインを投げる回数を少し増やすだけで、状況は一変します。

  • 3回投げる場合: \(2^3 = 8\) 通り\(\quad \rightarrow \quad\) なんとか手書き可能
  • 10回投げる場合: \(2^{10} = 1,024\) 通り\(\quad \rightarrow \quad\) 可能だが手書きは正直遠慮したい
  • 20回投げる場合: \(2^{20} = 1,048,576\) 通り\(\quad \rightarrow \quad\) ライフワークにしても無理でしょ!

このように、選択肢が積み重なるとパターン数は爆発的に増加します。
この現象を数学では「組み合わせの爆発」と呼び、これが「確率の計算は面倒だ」と感じさせてしまう要因のひとつでしょう。

そこで必要になるのが、ロジック(仕組み)は人間が作り計算はコンピュータに任せるという役割分担です。

第2章:準備:自分に合ったPython環境を選ぶ

プログラミングを始める際、最初の壁になるのが「環境構築」です。
しかし現在は、難しい設定を抜きにして、今すぐコードを書き始められる便利なツールや、次世代のAI機能を備えた環境が揃っています。
自分のスタイルに合ったものを選んでみましょう。

2.1. AIエージェントと共に開発する:Antigravity

現在、開発者の間で大きな注目を集めているのが Antigravity です。
これはGoogleが提供する、AI(エージェント)との協働を前提とした最新の開発環境です。

  • 最大の魅力: AIサポートの充実です。単なる入力補完ではなく、AIエージェントが「計画を立て、コードを書き、実行してテストする」という一連の流れを自律的に行います。
  • 利用方法: 公式サイト(antigravity.google)から、お使いのOS(Windows / Mac / Linux)に合わせたアプリをダウンロードしてインストールします。
  • 特徴: VS Codeをベースに作られているため操作感は馴染みやすく、それでいてAI専用の「エージェント・マネージャー」という強力な画面が統合されています。

個人的には、Antigravity の利用がおススメです。
AIと一緒にPythonの世界へ踏み出すのが、最もスムーズなスタートになるでしょう。

2.2. 定番の選択肢

多くのユーザーに支持されている、安定感のある選択肢です。

  • Google Colab
    • ブラウザ上で動作する、Googleの定番環境です。自分の学習過程を「ノート」のように保存でき、後から見返すのに非常に便利です。
  • Visual Studio Code (VS Code)
    • プロも愛用する高機能エディタです。Antigravityのベースとなったツールであり、自分で一つずつ拡張機能を追加して、自分好みの城を築き上げたい玄人向けの選択肢です。

第3章:Pythonによる「全網羅」の自動化

樹形図を描くときに私たちが行った「条件を一つずつ固定して、枝分かれを書き出す」という作業は、コンピューターが最も得意とする分野です。
Pythonを使えば、手書きでは不可能な膨大なパターンも、正確にリストアップすることができます。

3.1. itertools:組み合わせの専門家を呼び出す

Pythonには、こうした数え上げを専門に扱う itertools(イテレーター・ツールズ) という便利なライブラリが標準で用意されています。
itertools を使えば、複雑に分岐する樹形図の最終結果を、ほんの数行の「コード」で表現できます。

まずは、第1章の「コインを3回投げる」例をPythonで再現してみましょう。
環境が整っている方は、以下のプログラムをコーディング(コピー&ペーストでもOK)して実行してみてください。

sample1.py
import itertools

# 1回の試行で起こりうるパターン(表をH、裏をTとする)
coin = ['H', 'T']

# コインを3回投げる「全パターン」を生成する
# itertools.product が樹形図の枝分かれを代行してくれる
results = list(itertools.product(coin, repeat=3))

# すべての結果を表示
for pattern in results:
    print(pattern)

# 全部で何通りあるか(全事象の数)を確認
print(f"全事象の数: {len(results)}")

実行すると、コンソールには次の結果が表示されるはずです。

実行結果
('H', 'H', 'H')
('H', 'H', 'T')
('H', 'T', 'H')
('H', 'T', 'T')
('T', 'H', 'H')
('T', 'H', 'T')
('T', 'T', 'H')
('T', 'T', 'T')
全事象の数: 8

3.2. 「ロジック」を渡せば、全事象は一瞬でリスト化される

このプログラムのポイントは、itertools.product(coin, repeat=3) という一部分にあります。

これは、coin(表か裏)という選択肢を、repeat=3(3回分)繰り返して掛け合わせるという命令です。
私たち人間なら樹形図の枝を1本ずつ描いて「全パターン」を導き出す作業になるのを、Pythonが内部で代行しているわけです。

人間が担当するのは、「コインには表(H)と裏(T)があり、それを3回繰り返す」というロジック(仕組み)を考えるところまででOKです。
そして、指示を受けたPythonは、樹形図の末端にあるすべての組み合わせを瞬時に、かつ1つの漏れもなくリスト化してくれます。

たとえコインを20回投げるようなケース(1,048,576通り!)であっても、人間側は repeat=20 と数字を書き換えるだけで、一瞬にして全事象のリストを手にすることができるのです。

第4章:確率を導き出す

すべてのパターン(全事象)を書き出すことができれば、確率はもう目の前です。
あとはそのリストの中から、自分が調べたい「特定のケース」だけを抽出して、全体との比率を見るだけです。

4.1. 「リスト内包表記」でスマートに抽出する

Pythonには、リストの中から特定の条件を満たすものだけを取り出す「リスト内包表記」という非常に便利な構文があります。

先ほどの「コインを3回投げる」全事象の中から、「表(H)がちょうど2回出る」ケースが何通りあるか探してみましょう。

以下のプログラムを、3.1. で作成した sample.py の続きに追加してください。

sample1.py
# コイン投げ3回の内、「Hが2回」含まれるパターンだけを新しいリストに抽出
target_cases = [p for p in results if p.count('H') == 2]

# 条件を満たすパターンを表示
print(f"条件を満たすパターン: {target_cases}")

# 条件を満たすパターン数を表示
print(f"条件を満たすパターン数: {len(target_cases)}")

実行すると、コンソールには次の結果が表示されるはずです。

実行結果
# 全事象の数は省略

条件を満たすパターン: [('H', 'H', 'T'), ('H', 'T', 'H'), ('T', 'H', 'H')]
条件を満たすパターン数: 3

4.2. 確率の計算

ここまでで、確率の計算に必要な2つの数字が揃いました。

  • 分母: 全事象の数(len(results))= 8通り
  • 分子: 特定の事象の数(len(target_cases))= 3通り

これらを割り算すれば、求めたい確率が算出されますね。

以下のプログラムを、sample.py の続きに追加してください。

sample1.py
# 確率の計算
probability = len(target_cases) / len(results)

print(f"表が2回出る確率: {probability}")

実行すると、コンソールには次の結果が表示されるはずです。

実行結果
# これより上の結果は省略

表が2回出る確率: 0.375

4.3. コード解説:Python特有の「リスト内包表記」を解剖する

4.1.で使用した [p for p in results if p.count('H') == 2] という処理は、Python特有の「リスト内包表記」と呼ばれる書き方です。
Javaなど他のプログラミング言語経験者でも戸惑うことがあるこの構文を、左から順番に分解して解説します。

# [ ①取り出す要素  ②繰り返しのルール  ③絞り込みの条件 ]
target_cases = [p for p in results if p.count('H') == 2]
  • ① 取り出す要素 (p):
    • for の左側に最初に現れる p は、最終的に新しいリスト(target_cases)に格納される値を格納する変数です。ここでは、条件に一致した要素 p そのものが target_cases に代入される指示しています。
  • ② 繰り返しのルール (for p in results):
    • 全事象のリスト results から、要素を一つずつ取り出し、一時的に変数 p に代入してループ(繰り返し)を回すという「範囲」を指定しています。
  • ③ 絞り込みの条件 (if p.count('H') == 2):
    • ここがフィルターの役割です。取り出した要素 p の中に ‘H’ がちょうど2個含まれるかを判定します。この条件が「真(True)」のときだけ、①の処理が行われます。

まとめ

確率・統計をPythonで攻略するという本シリーズにおいて、今回はその出発点として、最も基礎となる「数え上げ」の自動化にフォーカスしました。

  1. 全事象を網羅する: 樹形図を手書きする代わりに、itertools.product を使って全パターンを瞬時にリストアップする仕組みを学びました。
  2. 正確にカウントする: 人間の目視による数え間違いを防ぐため、Pythonの「リスト内包表記」という強力なフィルタリング構文を使い、条件を満たすケースだけを確実に抽出する方法を実践しました。

「すべてを網羅し、論理的に抽出する」。
このシンプルな2ステップは、今後、より複雑な確率の問題に挑む際にも、揺るぎない土台となります。
まずは今回作成したシンプルなプログラムを手元で動かし、コンピュータが導き出す「正確な数え上げ」を体感してみてください。

コメント

タイトルとURLをコピーしました