pythonで因果分析:pgmpy,causalnex

Graph Statistics Network Technology  - geralt / PixabayIT全般

因果分析について、pgmpyやcausalnexなどパッケージが公開されています。

今回は、各パッケージの使い方の紹介とその比較を行います。

pgmpyとcausalnex

pgmpy

ベイジアンネットワークなど複数のアルゴリズムで因果分析が可能なライブラリです。

Supported Data Types — pgmpy 0.1.23 documentation

causalnex

DAG with NOTEARSという新しめのアルゴリズムが使えるライブラリです。

Welcome to CausalNex’s API docs and tutorials! — causalnex 0.12.1 documentation

データの準備

今回は、以下の書籍で検討されたモデルデータを基に検討します。

つくりながら学ぶ! Pythonによる因果分析: 因果推論・因果探索の実践入門 Compass Booksシリーズ
Amazon.co.jp: つくりながら学ぶ! Pythonによる因果分析: 因果推論・因果探索の実践入門 Compass Booksシリーズ eBook : 小川雄太郎: Kindleストア
causal_book/7_5_bayesian_network_pc_algorithm.ipynb at master · YutaroOgawa/causal_book
書籍「作りながら学ぶ! PyTorchによる因果推論・因果探索」の実装コードのリポジトリです. Contribute to YutaroOgawa/causal_book development by creating an account on GitHub.

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(データを離散値化して分析)が最も期待通りの因果関係を示しました。

因果分析の全体感については以下の書籍を参照ください。

つくりながら学ぶ! Pythonによる因果分析: 因果推論・因果探索の実践入門 Compass Booksシリーズ
Amazon.co.jp: つくりながら学ぶ! Pythonによる因果分析: 因果推論・因果探索の実践入門 Compass Booksシリーズ eBook : 小川雄太郎: Kindleストア

コメント

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