Python 統計

【Python】ベイズの定理を実際に試行して確認

投稿日:

ベイズの定理とは

ある事象について、その原因となる候補(互いに独立)がいくつかあり、それぞれの原因は発生確率を持っているとする。
この時、ある事象が発生したときに、その原因である確率がいくらか、という問題に使用できるのがベイズの定理です。

式としては以下のようになります。

$$P(B \backslash A)=\frac {P(A \backslash B)P(B)} {P(A)}$$

\( P(B \backslash A) \):事象Aの発生後の事象Bの事後確率
\( P(B)\):事象Bの事前確率
\(P(A)\):事象Aの発生する確率
\( P(A \backslash B) \):事象Bが発生するという条件下での事象Aの発生確率

具体的な問題

次のような例題を考えてみます。

例題
ある大学の学部における科の割合はA科30%、B科50%、C科20%とする。
この3科の学生がIT系企業に就職する確率はそれぞれ60%、30%、10%である。
ある学生がIT系企業に就職したとき、その学生がB科を専攻していた確率はいくらか。

ベイズの式に当てはめると以下のようになります。

$$P(B \backslash I) = \frac {P(I \backslash B)P(B)} {P(I)}$$

$$ =\frac{0.5\times 0.3}{0.3\times 0.6 + 0.5\times 0.3 +0.2\times 0.1}$$

=0.4285714285714286

Pythonで実際に確認

上記の問題をpythonの中で実際に試行して数字が上記の計算結果になるのか試してみます。

まず、テストデータを作ります。以下のようなダミーデータを作りました。

data.csv

連番,氏名(カタカナ),科,就職先
1,タカシマシホ,A,IT
2,オカベケンゾウ,A,IT
3,ウメハラノリコ,A,IT
4,ナカオカハナ,A,IT
5,ミタリオ,A,IT
6,モリイキヨコ,A,IT
7,ハナイシノ,A,IT
8,オオワダケンスケ,A,IT
9,スガノリナ,A,IT
10,ホンゴウツキト,A,IT
11,ヤナギハラヒデヨ,A,IT
12,ヤマモトシンヤ,A,IT
13,ヨシザワアオ,A,IT
14,ヒラバヤシチエ,A,IT
15,フジカワエイジ,A,IT
16,モチヅキトモユキ,A,IT
17,キタアイコ,A,IT
18,クマガヤアキオ,A,IT
19,イシザキカリン,A,その他
20,トミナガテル,A,その他
21,モリシマタロウ,A,その他
22,モリナガマナ,A,その他
23,センダサオリ,A,その他
24,ヤマザキユウゾウ,A,その他
25,ノロユウヘイ,A,その他
26,ヤマウチカンナ,A,その他
27,ヒビノタカフミ,A,その他
28,ミズタニトシヒコ,A,その他
29,シガシゲユキ,A,その他
30,ミカミマリ,A,その他
31,フカイユミ,B,IT
32,ムラオカリエコ,B,IT
33,ハラダアキコ,B,IT
34,イイダキヨコ,B,IT
35,キハラチヒロ,B,IT
36,タキケンジ,B,IT
37,イクタフブキ,B,IT
38,ハマダヤスユキ,B,IT
39,ジンボタイジ,B,IT
40,ヨネクラカツミ,B,IT
41,カワモトアユ,B,IT
42,イマイズミカズユキ,B,IT
43,ハットリマサアキ,B,IT
44,ナガヤハルカ,B,IT
45,エガワカレン,B,IT
46,オオイシエイジ,B,その他
47,ウエムラムツオ,B,その他
48,カゲヤマカズヒコ,B,その他
49,ホリエカズヒサ,B,その他
50,マツダミチオ,B,その他
51,カワサキメイ,B,その他
52,タドコロサヤカ,B,その他
53,キクチブンイチ,B,その他
54,イチハラアヤネ,B,その他
55,タナベコトコ,B,その他
56,サカモトモミジ,B,その他
57,ダイワキヨコ,B,その他
58,アオヤギハルヒコ,B,その他
59,ミズタニトシオ,B,その他
60,クロキアキコ,B,その他
61,ツカモトカツオ,B,その他
62,トミタユナ,B,その他
63,ヒラガユカ,B,その他
64,イナバケイジ,B,その他
65,シノザキケンスケ,B,その他
66,ヨシダノノカ,B,その他
67,カワナユキ,B,その他
68,オオモリユヅキ,B,その他
69,ハシモトミズキ,B,その他
70,ヤツタリンタロウ,B,その他
71,カミヤマスズネ,B,その他
72,オガタカツイチ,B,その他
73,シラカワヤスユキ,B,その他
74,シマヅユウジ,B,その他
75,マキタイゾウ,B,その他
76,イデツネアキ,B,その他
77,フジムラトシユキ,B,その他
78,オオイシタケシ,B,その他
79,オオバカズマ,B,その他
80,ウメハラタカフミ,B,その他
81,アガツマケンゾウ,C,IT
82,カワハラヨシオ,C,IT
83,ヤマナカショウイチロウ,C,その他
84,スドウマサキ,C,その他
85,ツムラワタル,C,その他
86,エノモトリカ,C,その他
87,ムカイヒデ,C,その他
88,ヒビノカホ,C,その他
89,イクタトミコ,C,その他
90,オオサワスミト,C,その他
91,カネコマサコ,C,その他
92,アラカワロクロウ,C,その他
93,ナカヤマチュウゾウ,C,その他
94,カワベヨシカズ,C,その他
95,テラウチカズヒト,C,その他
96,マツモトアイキ,C,その他
97,オオヒラリッカ,C,その他
98,ヤマガタヒナノ,C,その他
99,ミヤノヤスヒロ,C,その他
100,イシザカサナ,C,その他

これをpandasで読み込みます。

import pandas as pd
data = pd.read_csv('data.csv')

全体の中からIT企業に就職した人を抽出します。35人います。

data_it = data[data["就職先"]=='IT']
len(data_it)
***
35

この中からランダムに一人選び、その人の科を調べます。

import random
num = random.randint(0, 34)
data_it_ri = data_it.reset_index(drop='true')
data_it_ri['科'][num]
***
'A'

これを何度も繰り返し行い、Bが出る回数を全体の試行回数で割ってやれば最初のベイズの定理で求めた結果(0.4285714285714286)に近づくはずです。

やってみます。

100回試行

count = 0
iternum = 100
for i in range(0,iternum):
    num = random.randint(0, 34)
    result = data_it_ri['科'][num]
    if result == 'B':
        count += 1
print(count/iternum)
***
0.45

1000回試行

count = 0
iternum = 1000
略
***
0.443

10000回試行

count = 0
iternum = 10000
略
***
0.4333

100万回試行

count = 0
iternum = 1000000
略
***
0.428449

100万回試行したらかなり近しい数字が出ました。当たり前ですが、ベイズの定理の計算は正しいことが実感できました。

-Python, 統計

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

【Python】cx_Oracleでデータを一括挿入する方法

Contents1 概要2 環境3 Step1 : Oracle側テーブル作成4 Step2 : Pythonによる一括挿入コード5 まとめ 概要 pythonからOracleデータベースを操作するラ …

WindowsのJupyterに外部からアクセスする

Contents1 目的2 環境3 Step1 : パスワードのハッシュ化4 Step 2 : configファイルの設定5 Step3 : Jupyter Notebookの起動6 Step4 : …

Pythonの文字列操作

Contents1 目的2 文字列の連結3 文字列の抽出4 文字列の抽出(スライス)5 文字列の繰り返し6 文字数取得7 文字列の分割8 文字列の結合9 文字列の置換 目的 pythonの文字列操作に …

Python formatの基本的な使い方

Contents1 目的2 文字列整形3 型指定 目的 python3系の文字列操作のメソッドであるformatの基本的な使い方について勉強する。 文字列整形 formatの引数に文字列等(intやf …

【Python】PaSoRiでカードを読み取ったら音を鳴らす

Contents1 目的2 音源3 音を鳴らすためのライブラリ4 コード5 結論 目的 前回、PaSoRiの上にICカードを置いた状態からカードの中の情報を読み取る、というものをPythonで試しまし …

言語切り替え

カテゴリー