因果推論グラフを表示する(Python for Spark拡張ノード)
PythonのCausalNexとpgmpyをつかって因果推論のグラフを書いてみます。
(この記事は2023年秋のSPSSユーザーイベント「ものづくり領域で活かされる SPSS Modelerの今とこれから」でご紹介したデモの内容を少し深く説明しています。)
1.想定される利用目的
- フィールド間の因果関係の把握
- 原因、要因分析
2.サンプルストリームのダウンロード
- サンプルデータ
- サンプルストリーム
- テスト環境
- Modeler 18.5
- Windows 11 64bit
- causalnex-0.12.1
- pgmpy-0.1.25
- pyvis-0.3.2
3.サンプルストリームの説明
3.1. データ
3.2. CausalNex
以下の記事のコードを使ってCausalNexの因果推論のグラフを書いてみます。
CausalNexは名義型の変数を使えないので、必要な変数はダミー変数化しています。
「データ型」ノードで「値の読み込み」を行い、フラグ設定ノードで「鋳型条件」を「1」「0」のダミー変数に変換しています。
カテゴリ型である「鋳型条件」「砂条件」は除外します。また、項目数が多いとグラフ見づらいので、NG判定に効果の大きそうな項目のみを「フィルター」ノードで絞りました。
「拡張の出力」ノードで「Python for Spark」を選びシンタックスに入力します。
ほぼ、引用した記事そのままのコードなのでコードの内容はそちらをご覧ください。
ポイントはgetSparkInputDataで取ってきたデータをpandasのDataFrameに変換してfrom_pandasでDAG推定をしているところです。
ascontext = spss.pyspark.runtime.getContext()
indf = ascontext.getSparkInputData()
df=indf.toPandas()
SM = from_pandas(df)
後は最後にグラフをshowしています。
plt.show()
実行して、以下のように「グラフ出力」を開くとDAGのグラフが表示されています。
「鋳造条件_A」が「温度」や「電圧」に影響を与えています。
ただ、「NG判定」が「電圧」などに影響を与えているグラフになっているので、今回のグラフでは「NG判定」に影響を与える要因を特定することができませんでした。
3.3. pgmpy
以下の記事のコードを使ってpgmpyのBayesian Network(PCアルゴリズム)で因果推論のグラフを書いてみます。
PCアルゴリズムは、逆にカテゴリ型データの利用が基本なので、連続型変数はビニングして離散値化しています。
「データ分割」ノードで「ビンフィールド」に「温度」「圧力」「電圧」「速度」「回転数」の連続型変数をいれて、ここでは「4分位」でビニングしました。
連続型である「温度」「圧力」「電圧」「速度」「回転数」は除外します。また、項目数が多いとグラフ見づらいので、NG判定に効果の大きそうな項目のみを「フィルター」ノードで絞りました。
「拡張の出力」ノードで「Python for Spark」を選びシンタックスに入力します。
ほぼ、引用した記事そのままのコードなのでコードの内容はそちらをご覧ください。
第一のポイントはgetSparkInputDataで取ってきたデータをpandasのDataFrameに変換してfrom_pandasでBayesian Network(PCアルゴリズム)のestimatorにセットをしているところです。
ascontext = spss.pyspark.runtime.getContext()
indf = ascontext.getSparkInputData()
df=indf.toPandas()
pc = PC(df) # 離散値化後のデータセット
次に、Notebookには出力しないので、directed='True'のみを指定しています。
#got_net = net.Network(notebook=True,directed=True)
got_net = net.Network(directed='True')
最後にhtmlで出力しています。"c:/temp2/pgmpy/example.html"というファイル名で出力しています。
#got_net.show('gameofthrones.html')
#HTMLファイルの出力
html_filename="c:/temp2/pgmpy/example.html"
from IPython.display import display, HTML
html =got_net.generate_html()
with open(html_filename, mode='w', encoding='utf-8') as fp:
fp.write(html)
print("'"+html_filename+"' was output.")
以下のように「グラフ出力」を開くとベイジアンネットワークのグラフが表示されます。
以下のような因果が見えてきます。
「スイッチ2」→「砂条件」→「スイッチ1」→「鋳造条件」→「NG」
「スイッチ2」→「圧力_TILE4」→「鋳造条件」→「NG」
「スイッチ3」→「NG」
注意事項
管理者権限でコマンドプロンプトを立ち上げて、pipでcausalnex、pgmpy、pyvisのパッケージをあらかじめ導入しておく必要があります。
"C:\Program Files\IBM\SPSS\Modeler\18.5\python_venv\Scripts\python.exe" -m pip install causalnex
"C:\Program Files\IBM\SPSS\Modeler\18.5\python_venv\Scripts\python.exe" -m pip install pgmpy
"C:\Program Files\IBM\SPSS\Modeler\18.5\python_venv\Scripts\python.exe" -m pip install pyvis
4.参考情報
【構造学習】CausalNexで有向非循環グラフ(DAG)推定 -説明変数(テーブルデータ)の因果推論に挑戦-|はやぶさの技術ノート
pythonで因果分析:pgmpy,causalnex | kiseno-log
ワインのデータを用いて各種ベイジアンネットワークの推論を比較した #Python - Qiita
SPSS Modeler ノードリファレンス目次
SPSS Modeler 逆引きストリーム集(データ加工)