py-why/dowhy
DoWhy is a Python library for causal inference that supports explicit modeling and testing of causal assumptions. DoWhy is based on a unified language for causal inference, combining causal graphical models and potential outcomes frameworks.
DoWhy – Pythonにおけるエンドツーエンド因果推論
何であるか
- 因果的な質問(「もし介入したらどうなるか?」「この結果の原因は何か?」「異常の根本原因は何か?」)に答えることができるPythonライブラリ。
- 2つの主要な因果推論フレームワークを統合:グラフィカル因果モデル(Pearlのdo計算)と潜在結果アプローチ。
- PyWhyエコシステムの一部であり、因果に関するツールに焦点を当てています。
主な機能
| 機能 | 実現可能なこと |
|---|---|
| 効果推定 | 因果効果の特定、平均または条件付き処置効果の計算、インストルメント変数の使用など |
| 因果的影響の定量化 | メディエーション分析、直接/間接効果の強さ、内在的影響測度 |
| 仮想/反事実分析 | 介入分布からのサンプル生成、個々の人の反事実結果の計算 |
| 根本原因分析と説明 | 異常を特定の変数に帰属、分布の変化を説明、特徴量の重要度を順位付け |
| 反証/偽証 | ランダムな共通原因、プラセボテストなどの堅牢性チェックを実行し、仮定が異なる場合に因果主張が成り立つか確認 |
一般的なワークフロー(4ステップ)
- モデル – データ、処置/アウトカム名、因果グラフ(NetworkX、DOTなど)を提供。
- 識別 – DoWhyがdo計算を適用し、推定量(因果効果の数学的表現)を導出。
- 推定 – 統計的推定器(傾向スコアマッチング、線形回帰、EconMLのDMLなど)を適用して効果を計算。
- 反証 – 自動的に1つ以上の偽証テストを実行し、堅牢性を評価。
クイックスタート
# 最新安定版をインストール
pip install dowhy # または `conda install -c conda-forge dowhy`
from dowhy import CausalModel
import dowhy.datasets as ds
# 合成データセットを読み込み
data = ds.linear_dataset(beta=10, num_common_causes=5,
num_instruments=2, num_samples=10000,
treatment_is_binary=True)
model = CausalModel(data=data["df"],
treatment=data["treatment_name"],
outcome=data["outcome_name"],
graph=data["gml_graph"]) # graphはNetworkX DiGraphでも可
identified_estimand = model.identify_effect()
estimate = model.estimate_effect(identified_estimand,
method_name="backdoor.propensity_score_matching")
refute_res = model.refute_estimate(identified_estimand, estimate,
method_name="random_common_cause")
print(estimate)
print(refute_res)
ライブラリは仮定の要約、識別された推定量、数値的推定値、反証結果を読みやすい形式で出力します。
グラフィカル因果モデル(GCM)拡張
- 効果推定を超えて、DoWhy-GCMでは各ノードに明示的な関数的メカニズムを持つ構造的因果モデル(SCM)を定義できます。
- これらのSCMをデータに適合させ、適合度を評価した後、以下のタスクを実行できます:
- 根本原因の帰属 (
gcm.attribute_anomalies) - 介入サンプリング (
gcm.interventional_samples) - 反事実クエリ
- 根本原因の帰属 (
- 例(X → Y → Z):
import networkx as nx, pandas as pd, numpy as np
from dowhy import gcm
# 合成データ
X = np.random.normal(size=1000)
Y = 2*X + np.random.normal(size=1000)
Z = 3*Y + np.random.normal(size=1000)
df = pd.DataFrame(dict(X=X, Y=Y, Z=Z))
scm = gcm.StructuralCausalModel(nx.DiGraph([('X','Y'),('Y','Z')]))
gcm.auto.assign_causal_mechanisms(scm, df)
gcm.fit(scm, df)
# 異常なZ値の根本原因
anomaly = pd.DataFrame(dict(X=[0.1], Y=[6.2], Z=[19]))
print(gcm.attribute_anomalies(scm, "Z", anomaly))
学習の場所
- 完全なドキュメントとチュートリアル: https://py-why.github.io/dowhy/
- 例のノートブック(効果推定、根本原因分析、EconMLによるCATEなど)
- Microsoft ResearchとPyConの動画ウェビナー(READMEにリンクあり)
- 学術論文:arXiv 2020(コアDoWhy)、JMLR 2024(DoWhy-GCM)
コミュニティと貢献
- 質問用Discordチャット: https://discord.gg/cSBGb3vsZb
- GitHubでイシューを報告;通常のプルリクエストワークフローで貢献を歓迎します。
まとめ DoWhyは、因果推論の重い数学を隠しつつ、グラフ、推定器、堅牢性チェックの完全な制御を提供する洗練された高レベルAPIを提供します。相関を超えて因果に基づいた意思決定が必要なデータサイエンティスト、研究者、エンジニアに適しています。
関連
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト