Pythonコードで学ぶ論理演算子と確率

スポンサーリンク
Python
【初心者】Rと統計学をいっぺんに学ぶ最初の5冊
Rとはオープンソースの統計解析用のプログラミング言語です。 誰でも無料で使えます。統計解析にはSPSSやSASなどが有名ですが、いずれも有料です。大学や研究機関でないと使えないですね。個人でも統計解析できた方が、職場に依存せずにス...
【2021年】ゼロから統計学を独学したい人が読むべき書籍10冊
データサイエンスについて興味があり、統計学を学びたいけど、どんな学習方法がいいか分からない 統計学を独学するために必要な書籍が知りたい 統計...

Pythonには理論演算子が用意されている。この理論演算子の使用方法はさまざまあるが、今回は、確率のおける理論演算子をPythonのコードとともにみていきましょう。
簡単な例を使って解説していきます。1つはコインの裏表の確率、もう1つはサイコロの目です。よくある例題ですね。
前提条件として、コインの裏表の確率は1/2、サイコロの目の確率は1/6で、コインとサイコロの結果は互いに干渉しない(独立している)こととします。

Pythonの環境設定はAnacondaをインストールし、Jupyter Labを使っています。過去記事を参照して下さい。

【2021年最新】M1 mac でanacondaをインストールする方法

【2021年最新】WindowsでAnacondaをインストールする方法

必要なライブラリをインポート

import numpy as np
import random

コイン投げ

coin = [0, 1]

for i in range(5):
    print(random.choice(coin)) # ランダムに「coin」から1つ選ぶ

出力:
0
0
0
1
1

この出力は、コインのシミュレーション(0か1)を5回実行した結果です。ランダムなので、コードを実行するたびに結果は変わります。
前提条件でも示しましたが、コインの結果が0になる確率を考えてみましょう。

1/2

出力:
0.5

当然、コインの結果は、0と1の確率は半々、50%です。
では、シミュレーションしてみましょう。

コイン投げのシミュレーション

num_sample = 10000
result = 0

for i in range(num_sample):     # 「num_sample」回数実行する
    if random.choice(coin)==1:  # 「coin」が1であれば
        result+=1               # 「result」に1を加算する

print(result/num_sample)        # 「coin」が1であった確率

出力:
0.4959

ほぼ、0.5ですね。これもランダムなので、0.5にならないですが、近い結果になることが確認できました。
このシミュレーションは、コインの結果が1であった場合は、「result」に1を加算しています。つまり、「result」は10000回コイン投げをしたときに、1が出た回数を表します。なので、コインの結果が1である確率は、「result」にシミュレーション回数である「num_sample」を割ります。

サイコロ投げ

dice = [1, 2, 3, 4, 5, 6]

for i in range(5):
    print(random.choice(dice)) # ランダムに「dice」から1つ選ぶ

出力:
5
1
2
6
2

サイコロは1~6なので、diceを[1, 2, 3, 4, 5, 6]としています。
では、サイコロの結果が1になる確率を計算してみましょう。

1/6

出力:
0.16666666666666666

サイコロ投げのシミュレーション

num_sample = 10000
result = 0

for i in range(num_sample):
    if random.choice(dice)==1:
        result+=1

print(result/num_sample)

出力:
0.1738

少し、計算結果とずれていますが、ほぼ近い数値になっています。ちなみに確率は、シミュレーションの回数を増やせば増やすほど理論値に近くなります。

コイン0かつサイコロ1

1/12

出力:
0.08333333333333333

これは、コインが0である確率 1/2 と、サイコロが1である確率 1/6 を掛けることを同じです。

(1/2)*(1/6)

出力:
0.08333333333333333

シミュレーション(コイン0かつサイコロ1)

num_sample = 10000
result = 0
    
for j in range(num_sample):
    if (random.choice(coin)==0)and(random.choice(dice)==1):  # 条件 and 条件
        result+=1
print(result/num_sample)

出力:
0.0822

ほぼ同じような数値ですね。シミュレーション通りでした。

コイン0かつサイコロ1の否定

では、さきほどの結果の否定をしていきましょう。すべての確率は1なので、1からさきほどの数値を引けば、否定の確率が分かります。

1-(1/2)*(1/6)

出力:
0.9166666666666666

シミュレーション(コイン0かつサイコロ1の否定)

num_sample = 10000
result = 0

for j in range(num_sample):
    if not((random.choice(coin)==0)and(random.choice(dice)==1)):  # not 条件
        result+=1
print(result/num_sample)

出力:
0.9141

計算した理論値を近い数値になりました。

コイン0またはサイコロ1

コイン0かサイコロ1のどちらかが成立していたら条件達成という意味です。
これは、コインが0の確率とサイコロが1の確率を足して、さらに重複した確率(コイン0かつサイコロ1)を引けばいいです。

(1/2)+(1/6)-((1/2)*(1/6))

出力:
0.5833333333333333

シミュレーション(コイン0またはサイコロ1)

上で示した計算は、若干面倒ですが、Pythonのコードでは簡単です。「or」を使います。

num_sample = 10000
result = 0

for j in range(num_sample):
    if (random.choice(coin)==0)or(random.choice(dice)==1):  # 条件 or 条件
        result+=1
print(result/num_sample)

出力:
0.5735

理論値と同じくらいですね。

コイン0かサイコロ1かどちらか片方だけ

コイン0とサイコロ1で、両方成り立つ場合は含みません。どちらか片方だけが成り立つ場合のみです。

(1/2)+(1/6)-((1/2)*(1/6))*2

出力:
0.5

コイン0の確率と、サイコロ1の確率を足して、重複する確率を2回引いています。

シミュレーション(コイン0、サイコロ1どちらか片方)

num_sample = 10000
result = 0

for j in range(num_sample):
    if (random.choice(coin)==0)^(random.choice(dice)==1): # 条件 ^ 条件
        result+=1
print(result/num_sample)

出力:
0.4999

【おすすめ】Pythonの独学で必要な書籍
わたしは、底辺サラリーマンで、Pyhton学習歴は半年、R(フリーの統計解析ソフト)学習歴半年、学習方法は独学です。 ここでの独学とは、体系的な学習カリキュラムがなく、強制力がない学習方法のことを指します。...
Rを使ってデータサイエンスが学べる書籍
データサイエンスといえはPythonですが、Rでもできます。 Rは統計学に特化したプログラミング言語ですが、さまざまなデータ分析ができます。Rを使って、統計学だけでなく、データサイエンスを学びたい初心者におススメな書籍を紹介します...



コメント

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