【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万回試行したらかなり近しい数字が出ました。当たり前ですが、ベイズの定理の計算は正しいことが実感できました。

おすすめ

コメントを残す

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