■ はじめに
確率的に起きる事象に関して、限られた情報から正しく意思決定するためにはベイジアンネットワークは非常に強力なツールになる。ここでは、ベイジアンネットワークとは何か?pythonで実装するにはどうすれば良いか?を解説したい。また実際のデータを用いてベイジアンネットワークの計算結果から意思決定を行う例も示す。
■ ベイジアンネットワークとは?
ベイジアンネットワークは確率モデルの一種で、複数の事象の関連性を有向非巡回グラフ(Diredted Acyclic Graph: DAG)を用いて表現しようとするモデルだ。ここでDAGとは、ノードとそれらを繋ぐ有向エッジから構成され、ループ構造が存在しないグラフ構造のことをいう。
下の図のようにベイジアンネットワークでは、DAGの各ノードを確率変数とし、ノード間が有向エッジで繋がれている場合は子の確率変数を親の確率変数の「条件付き確率」で表せると考える。
■ 同時確率と条件付き確率
ここで同時確率と条件付き確率について復習しておきたい。
複数の事象を考えるときに、それらが同時に起きる確率を「同時確率」という。2つの確率的に起きる事象を確率変数AとBとすると、AとBがそれぞれaとbの値となる場合の確率をP(A=a, B=b)というように表す。
一方で「条件付き確率」とは、「既にある事象が起きたと確定した条件下で」他の事象が起きる確率を示す。確率変数Aがaの値をとった「条件下」でBがbの値をとる確率を示しP(B=b|A=a)と表す。
また、確率の連鎖律(Chain Rule)より下式が成り立つ。
P(A=a, B=b)=P(B=b|A=a)P(A=a)
※以降、簡略化のためP(A=a)などはP(A)のように確率変数の実現値は省略して表記する。
■ベイジアンネットワークでの同時確率
上記の連鎖律を用いると上図のネットワークで確率変数X_1〜X_5の同時確率は
P(X_1, X_2, X_3, X_4, X_5)=P(X_5| X_3)P(X_4| X_3)P(X_3|X_1, X_2)P(X_1)P(X_2)
となる。
ここで、
- P(X_3 | X_1, X_2)は、親であるX_1とX_2がそれぞれ X_1=x_1、X_2=x_2と確定した時のX_3の条件付き確率。
- P(X_1)、P(X_2)はそれぞれ、X_1=x_1、X_2=x_2の実現値をとる確率。
- P(X_5 | X_3)やP(X_4 | X_3)は、親であるX_3が(X_3=x_3と)確定した時のX_4、X_5の条件付き確率。
を示している。この式を注意深く見るとベイジアンネットワークの同時確率は一般的に各ノードの親ノードに関する条件付き確率の積、つまり
P(X_1, ..., X_n)=\prod_{i=1}^n P(X_i| Parents(X_i)) \tag{1}
の形に書けることが容易に想像がつく。ここでParents(X_i)は確率変数X_iの親ノードを表している。
■ 具体例
簡単なベイジアンネットワークの具体例で同時確率を求めることをしていこう。
ここでは下図のような仮想的なシチュエーションの因果関係の例として考えていく。
ある家に警報システムが導入されており、家に異常(強盗 or 火事)が発生すると警報サイレンが鳴り、それを聞いた近所の人が警察もしくは消防に連絡することになるという因果関係を示している。
それぞれの事象の確率変数は事象が発生(1)するか否(0)かの2値をとる。幸い強盗や火事が発生する可能性は極めて低いが、若干火事の発生確率の方が大きい。また強盗や火事が発生すると高確率でサイレンが鳴るようになっているが、強盗や火事以外の異常でなる可能性もある。またサイレンが鳴るとそれを聞いた近所の人が警察もしくは消防に連絡をする確率が高まる。
この時、何も起きない、すなわち
B=F=S=P=D=0となる確率はいくらだろうか?先ほどのベイジアンネットワークの同時確率である(1)式に当てはめ表から実際の数値をとると、
P(B=0, F=0, S=0, P=0,D=0)\\\\=P(P=0|S=0)(D=0|S=0)P(S=0|B=0, F=0)P(B=0)P(F=0) \\\\=0.99*0.96*0.9*0.99*0.98=0.83
と計算ができる。
ここまででベイジアンネットワークでの同時確率を求めることまでできた。ベイジアンネットワークの強力なところは、このモデルを用いると、ある事象が発生した場合に、その要因の分析が可能であることである。例えば上の例では警察に通報が行き(P=1)消防に通知が行かない(D=0)という事象が発生したときにその要因が火事である確率、もしくは強盗である確率を求めることができる(要因推定)。
次回は、要因推定について詳しく見ていきたい。