PythonのDoWhyライブラリを用いた因果探索の実装コード例を示します!
DoWhy
- 概要 DoWhyは、因果グラフィカルモデルと潜在的結果フレームワークを統合し、因果仮定の明示的なモデリングとテストをサポートするライブラリです。PyWhyプロジェクトの一環として開発されています。
- 特徴
- 効果推定 因果効果の特定、平均因果効果(ACE)、条件付き平均因果効果(CACE)の推定、計器変数(instrumental variables)の使用。
- 因果影響の定量化 メディエーション分析(媒介効果の評価)、直接的な矢印の強度、内在的な因果影響の分析。
- What-if分析 介入分布からのサンプルの生成、反事実(counterfactuals)の推定。
- 根本原因分析と説明 異常の原因特定、分布変化の原因探索、特徴の関連性の評価。
- 適用例: ビジネスメトリクスの改善や異常検知、因果関係の可視化に適しており、MicrosoftやAmazonなどの企業で利用されています。詳細はDoWhyのドキュメントで確認できます。
PythonのDoWhyライブラリを用いた因果探索の実装コード例を示します。
このコードでは、シンプルなデータセットを使って因果DoWhyはPythonの因果推論ライブラリであり、統計的因果推論のためのフレームワークを提供しています。
DoWhy因果グラフの構築、傾向スコアの推定、因果効果の推定などの機能を備えている。グラフを構築し、因果効果を推定します。
DoWhyによる因果探索コード
!pip install dowhy
import numpy as np
import pandas as pd
from dowhy import CausalModel
# サンプルデータ生成
np.random.seed(42)
n_samples = 500
# データフレーム作成
data = pd.DataFrame({
"Treatment": np.random.choice([0, 1], size=n_samples), # 介入変数
"Outcome": lambda x: 2 * x["Treatment"] +
np.random.normal(size=n_samples),
"Confounder": np.random.normal(size=n_samples)
# 交絡因子
})
data["Outcome"] =
data.apply(lambda x: 2 * x["Treatment"] + 0.5 *
x["Confounder"] + np.random.normal(size=n_samples), axis=1)
# 因果モデルの定義
model = CausalModel(
data=data,
treatment="Treatment",
outcome="Outcome",
common_causes=["Confounder"]
)
# 因果グラフの表示
model.view_model()
出力結果
WARNING:dowhy.causal_model:Causal Graph not provided. DoWhy will
construct a graph based on data inputs.
警告:dowhy.causal_model:因果グラフが指定されていません。DoWhyはデータ入力に基づいてグラフを構築します。
コードの流れ
1.
データ生成:
o 交絡因子Confounderと介入変数Treatmentから結果変数Outcomeを生成。
o シンプルな因果関係を仮定。
2.
因果モデルの構築:
o CausalModelを用いて因果関係をモデル化。
o 交絡因子や介入効果を指定。
3.
因果効果の推定:
o 回帰分析(backdoor
criterion)を使用して、介入変数が結果変数に与える影響を推定。
4.
モデルの検証:
o プラセボ法を用いて因果推定結果を検証。
結果と応用
- このコードでは、介入の因果効果を数値で確認することができます。
- さらに複雑なデータや因果関係を検討する際に、DoWhyライブラリを活用することで拡張可能です。
※コードを走らせたらDoWhyの警告が出ました。しかし、DAGは描画されましたので理由について考えてみました。
WARNING:dowhy.causal_model:Causal
Graph not provided. DoWhy will construct a graph based on data inputs.
警告:dowhy.causal_model:因果グラフが指定されていません。DoWhyはデータ入力に基づいてグラフを構築します。
DoWhyから出た警告、Causal
Graph not provided. DoWhy will construct a graph based on data inputs. は、「ユーザーが因果グラフを明示的に提供していないため、DoWhyが自動的にデータ入力に基づいてグラフを構築した」という内容を意味します。以下に、この警告が出た理由とDAGが描画された理由を説明します!
警告が出る理由
- 因果グラフを明示的に定義していない: DoWhyでは、CausalModelを作成する際に、因果グラフ(DAG)を手動で指定することができます。しかし、コードでは因果グラフが提供されていないため、DoWhyが「common_causes」の情報を基に自動生成しています。
- 自動グラフ生成: DoWhyは、ユーザーが指定した「介入変数(Treatment)」「結果変数(Outcome)」「交絡因子(Confounder)」を基に、デフォルトの因果グラフを推定します。この推定を行う際に、警告を表示して知らせています。
DAGが描画された理由
DoWhyが以下の流れでDAGを生成・描画しているためです。
1.
入力データからDAGを自動生成:
o treatment(Treatment)とoutcome(Outcome)の間に直接的な矢印を追加。
o common_causes(Confounder)として指定された変数を、TreatmentおよびOutcomeの両方に影響を与えるノードとして追加。
2.
既定の描画機能:
o DoWhyにはview_model()というビルトインのDAG描画機能があり、内部的にpygraphvizやpydotを利用してグラフを描画します。
o 必要な情報(Treatment,
Outcome, Confounder)が指定されていれば、DoWhyは自動生成したグラフを正しく描画します。
背景 DoWhyの自動DAG生成
- DoWhyは因果探索の基礎ツールとして、データの因果構造が完全に指定されていない場合でも自動的にDAGを構築する機能を持っています。
- このため、ユーザーが因果構造の詳細を指定しない場合でも、必要最小限の情報を使って作業を進めることが可能です。
解決策または応用
1.
明示的にグラフを指定する グラフ構造をより詳細に制御したい場合は、以下のようにDAGを明示的に定義します。
model = CausalModel(
data=data,
treatment="Treatment",
outcome="Outcome",
graph="graph[Treatment -> Outcome;
Confounder -> Treatment; Confounder -> Outcome]"
)
2.
警告を無視: 上記のケースでは、警告は問題なくスクリプトが動作していることを意味するので、実際の処理に影響はありません。このまま実行しても問題ない場合もあります。
まとめ
警告は単に因果グラフがユーザーから指定されていないことを知らせているだけであり、DoWhyが入力に基づいて自動的に構築したため、DAGが描画されています。必要に応じて、グラフ構造を手動で指定することでより細かい制御が可能になります。