因果分析について、pgmpyやcausalnexなどパッケージが公開されています。
今回は、各パッケージの使い方の紹介とその比較を行います。
pgmpyとcausalnex
pgmpy
ベイジアンネットワークなど複数のアルゴリズムで因果分析が可能なライブラリです。
causalnex
DAG with NOTEARSという新しめのアルゴリズムが使えるライブラリです。
データの準備
今回は、以下の書籍で検討されたモデルデータを基に検討します。


pgmpyの使い方
インストール
pip install pgmpy
分析
pgmpyでの分析は以下の数行です。
上記書籍で示されている例でもpgmpyを使用した分析が示されていますが、バージョンは古いもので最新バージョンのpgmpyを使用した場合、エラーが発生するようです。
2021/7/9時点の最新バージョンでは、以下のような形に変更されているようです。
from pgmpy.estimators import PC
pc = PC(df_bin)# df_bin離散値化後のデータセット
model = pc.estimate()
可視化
可視化は、別のパッケージをpyvisを使用しました。
from pyvis import network as net
import networkx as nx
edge_list = list(model.edges())
edge_list = [i + tuple([0.1]) for i in edge_list]#ウェイトの値を適当に追加
#jupyter中に表示させる場合、notebook=True, →にする場合directed=True
got_net = net.Network(notebook=True,directed=True)
for e in edge_list:
src = e[0]
dst = e[1]
w = e[2]
got_net.add_node(src, src, title=src)
got_net.add_node(dst, dst, title=dst)
got_net.add_edge(src, dst, value=w)
neighbor_map = got_net.get_adj_list()
for node in got_net.nodes:
node['title'] += ' Neighbors:<br>' + '<br>'.join(neighbor_map[node['id']])
node['value'] = len(neighbor_map[node['id']])
got_net.show_buttons(True)
got_net.show('gameofthrones.html')
データの詳細は書籍参照ですが、想定通りのネットワークが分析されています。

ちなみに、連続値のまま分析する手法もpgmpyに実装されているようですが、モデルデータでは一部の関係が欠損した分析結果となりました。
from pgmpy.estimators import PC
pc = PC(df)
model = pc.estimate(ci_test='pearsonr') # 連続値の場合 ci_test='pearsonr'

causalnexの使い方
インストール
pip install causalnex
分析
causalnexも数行のコードで分析可能です。
causalnexにはかっこいい可視化機能が実装されていますが、エラーを解決できず使用できなかったため、こちらもpyvisで可視化しています。
from causalnex.structure.notears import from_pandas
from pyvis import network as net
import networkx as nx
SM = from_pandas(df_bin)
SM.remove_edges_below_threshold(0.7) # 関係の強さが閾値以上のものだけ残す
g = net.Network(notebook=True,directed=True)
g.from_nx(SM)
g.show_buttons(True)
g.show('gameofthrones2.html')
ある程度は、期待通りの分析結果となっているようですが、一部そうでない部分もあるようです。

まとめ
pythonの因果分析パッケージであるpgmpyとcausalnexの紹介を行いました。
pgmpyを使用した書籍でのモデルデータを使用して検討したため、pgmpyに有利な条件ですが、pgmpy(データを離散値化して分析)、pgmpy(データを連続値として分析)、causalnex(データを離散値として分析)では、pgmpy(データを離散値化して分析)が最も期待通りの因果関係を示しました。
因果分析の全体感については以下の書籍を参照ください。

コメント