bnlearnライブラリを使用して、ベイジアンネットワーク(Bayesian Network)の構造を定義し、DAG(Directed Acyclic Graph:有向非巡回グラフ)を構築して可視化

このコード例では、bnlearnライブラリを使用して、ベイジアンネットワーク(Bayesian Network)の構造を定義し、DAGDirected Acyclic Graph:有向非巡回グラフ)を構築して可視化しています。

#!pip install bnlearn networkx matplotlib pandas numpy --upgrade

 

import numpy as np

import pandas as pd

import bnlearn as bn

import networkx as nx

import matplotlib.pyplot as plt

 

# ベイジアンネットワーク構造を定義

edges = [

    ('Temperature', 'IceCreamSales'),

    ('Temperature', 'SwimmingAccidents')

]

 

# DAGを生成

DAG = bn.make_DAG(edges)

 

# DAGNetworkXグラフに変換

nx_graph = nx.DiGraph(DAG['adjmat'].values)

nx_graph = nx.relabel_nodes(nx_graph, {i: node for i, node in enumerate(DAG['adjmat'].columns)})

 

# グラフの描画

plt.figure(figsize=(8, 6))

pos = nx.spring_layout(nx_graph, seed=42)

nx.draw(nx_graph, pos, with_labels=True, node_color='lightblue', node_size=2000, font_size=10, font_weight='bold', arrowsize=20)

 

plt.title("Causal DAG using bnlearn")

plt.show()

出力結果

[bnlearn]> Auto generate placeholders for the CPTs.

[bnlearn] >CPT for IceCreamSales :

+-----------------------+-------------------+-------------------+

| Temperature       | Temperature(0) | Temperature(1) |

+-----------------------+-------------------+-------------------+

| IceCreamSales (0)  | 0.5             | 0.5            |

+-----------------------+-------------------+-------------------+

| IceCreamSales (1)  | 0.5             | 0.5            |

+-----------------------+-------------------+-------------------+

[bnlearn] >CPT for    SwimmingAccidents:

+-----------------------+-------------------+-------------------+

| Temperature       | Temperature(0) | Temperature(1) |

+-----------------------+-------------------+-------------------+

| SwimmingAccidents(0)  | 0.5            | 0.5            |

+-----------------------+-------------------+-------------------+

| SwimmingAccidents(1)  | 0.5            | 0.5            |

+-----------------------+-------------------+-------------------+

[bnlearn] >CPT for Temperature:

+----------------+------+

| Temperature(0) | 0.5  |

+----------------+------+

| Temperature(1) | 0.5  |

+----------------+------+

[bnlearn] >bayes DAG created.

[bnlearn] >[Conditional Probability Table (CPT)] >[Update Probabilities] >[Node IceCreamSales ]

[bnlearn] >[Conditional Probability Table (CPT)] >[Update Probabilities] >[Node    SwimmingAccidents]

[bnlearn] >[Conditional Probability Table (CPT)] >[Update Probabilities] >[Node Temperature]

[bnlearn] >[Conditional Probability Table (CPT)] >[Check Probabilities] >[Node IceCreamSales ] >OK

[bnlearn] >[Conditional Probability Table (CPT)] >[Check Probabilities] >[Node    SwimmingAccidents] >OK

[bnlearn] >[Conditional Probability Table (CPT)] >[Check Probabilities] >[Node Temperature] >OK


このコードでは、bnlearnライブラリを使用して、ベイジアンネットワーク(Bayesian Network)の構造を定義し、DAGDirected Acyclic Graph:有向非巡回グラフ)を構築して可視化しています。それぞれのステップを詳細に解説します。

1. ベイジアンネットワーク構造の定義

python

edges = [

    ('Temperature', 'IceCreamSales'),

    ('Temperature', 'SwimmingAccidents')

]

  • エッジ定義: Temperature」を共通原因とし、「IceCreamSales」と「SwimmingAccidents」の両方に影響を与える構造を手動で指定しています。
  • これにより、ベイジアンネットワークの因果関係が明確に設定されます。

2. DAGの生成

python

DAG = bn.make_DAG(edges)

  • DAG生成: bnlearnmake_DAG関数を使用して、エッジ構造に基づいたDAGを作成します。
  • Conditional Probability Table (CPT):
    • 各ノード(変数)に対するCPTが自動生成されます。
    • 出力されたCPTには、「Temperature」の各状態に対する「IceCreamSales」や「SwimmingAccidents」の確率が示されています(0.5: 0.5の均等分布)。

3. DAGNetworkXへの変換

python

nx_graph = nx.DiGraph(DAG['adjmat'].values)

nx_graph = nx.relabel_nodes(nx_graph, {i: node for i, node in enumerate(DAG['adjmat'].columns)})

  • ベイジアンネットワークの隣接行列をNetworkXグラフに変換します。
    • DAG['adjmat']DAGの隣接行列を返します。
    • 隣接行列を用いてグラフを構築し、変数名でノードをラベル付けします。

4. グラフの可視化

python

plt.figure(figsize=(8, 6))

pos = nx.spring_layout(nx_graph, seed=42)

nx.draw(nx_graph, pos, with_labels=True, node_color='lightblue', node_size=2000, font_size=10, font_weight='bold', arrowsize=20)

plt.title("Causal DAG using bnlearn")

plt.show()

  • NetworkXを利用してDAGを描画。
    • ノード: Temperature」、「IceCreamSales」、「SwimmingAccidents」が表示されています。
    • エッジ: 矢印の方向が因果関係の向きを表しています(例: Temperature → IceCreamSales)。
    • グラフの構造はコードで指定した因果関係を正しく反映しています。

5. 出力結果の解釈

bnlearnの出力:

  • CPTConditional Probability Table:
    • 各ノード(変数)の状態に応じて生成される確率分布を示しています。
    • 例えば、「Temperature」の状態がTemperature(0)またはTemperature(1)の場合、IceCreamSalesSwimmingAccidentsの状態が均等(0.5: 0.5)になるように設定されています。

重要なポイント:

  1. 自動生成のCPT:
    • 簡易的な設定であるため、実際のデータに基づいてCPTを手動で更新する必要があります。
    • 現在は均等分布の仮定ですが、実際のデータを用いることでより現実的なモデルを構築できます。
  2. DAGの構造:
    • ベイジアンネットワークとして「Temperature」が共通原因となる構造を明確に表示。
    • グラフのノードとエッジは因果関係を視覚的に理解するために最適化されています。

このモデルの強み

  • 簡易な構造定義: 手動で因果構造を設定しつつ、自動でベイジアンネットワークモデルを構築。
  • グラフ可視化: DAGが分かりやすく描画され、因果関係が直観的に理解可能。

このコードは、簡易な因果モデル構築から可視化までを行う良い例です。さらにCPTを現実のデータで詳細に設定することで、モデルの精度が向上します。

このブログの人気の投稿

小論文 統計的因果推論の現場適用による排泄ケアの展望

排泄ケア相談支援員の育成に向けて

解説 排泄ケアの相談支援計画書作成のためのチェックリスト