DoWhyによる因果推論を実施してみた

今回は因果推論ライブラリであるDoWhyを実施してみました。コードはDoWhyのドキュメントから引用しています。

※このブログの内容は個人の意見・見解となります。また、記事の内容の正確性については保証いたしません。本ブログの目的は分析結果をアウトプットしていくことによる自身のデータ分析力向上を主としています。誤りや違うアプローチの方が良いという事も多分にあると思います。後学のため、「もっとこうしたらいい」や誤りを見つけた場合はコメント欄などでお知らせいただけると有難いです。

○参考サイト
・DoWhyドキュメント:https://www.pywhy.org/dowhy/v0.9.1/getting_started/index.html
・DoWhyで因果推論やってみた:https://speakerdeck.com/s1ok69oo/pythonraiburari-dowhy-woyong-itayin-guo-tui-lun
・DoWhyによる統計的因果推論:https://qiita.com/kumalpha/items/a1177eb5af6168e8113d
・【因果推論】バックドア基準とフロントドア基準:https://hiramekun.hatenablog.com/entry/2021/12/26/122014#%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%83%89%E3%82%A2%E5%9F%BA%E6%BA%96
・つくりながら学び!pythonによる因果分析(本)

○因果推論とは
因果推論とは「変数Zの値を大きくしたときに対応する変数Yが大きくなる傾向にある」と因果関係があることを推論することです。
下記の図は「自社アプリ(利用)頻度が高い(Z)」に伴う各変数の関係を示したものになります。
・来店頻度が高いと自社アプリを利用する頻度が高い
・自社アプリを利用する頻度が高い人は売上(Y)が高い
自社アプリを活用してくれている人は興味を持ってくれている人達なので自社アプリを利用する頻度が高い人の売上が高いという事実はありそうです。しかし、下記の関係もありそうです。
・来店頻度が高い人は売上が高い
そもそも、利用意向が高く、アプリを活用せずとも売上が高い人がアプリを活用しているだけ、という可能性もありそうです。
そのため、来店頻度高い→売上を考慮しつつ、自社アプリ頻度高→売上を推定しないとアプリ活用頻度による効果を正しく推定ができなそうです。

「自社アプリ(利用)頻度が高い」に伴う各変数の関係(DAG)

○DoWhyとは
Microsoftがリリースした因果推論ライブラリになります。
反事実モデルに基づき因果効果を定義→仮定をおく→データから計算するための数式を作成→計算→妥当性の検証
この一連の流れを可視化してくれるライブラリになります。

○DoWhyを使用してみよう

まずはライブラリを読み込みます。dowayは!pipでinstallしてからライブラリを読み込んでください。
今回はDoWhyで用意されているサンプルデータを今回は使用します。
引数のbeta=10で因果効果の大きさを設定できます。今回はドキュメントに記載されているコードのまま10とします。
原因はv0、結果はy、観測されている共通因子はW0~W4、操作変数はZ0~Z1、結果のみに影響する変数X0(効果修飾子)を表しています。これらはそれぞれnum_common_causesで共通因子の数を、num_instrumentsで操作変数、num_effect_modifiersで効果修飾子の数を設定できます。
グラフ(DAG)を描画。
DAGとは因果ダイアグラムといい、変数同士を矢線で結ぶことで、変数間の因果関係に関する仮説を可視化します。これにより因果の逆転が起こらないようにしています。
今回、libgraphviz-dev,pygraphvizをインストールしていないためグラフが不恰好ですがご了承いただければと思います。上記2つをインストールすることでもう少し見た目の良いグラフを描画できます。
データから因果効果を推定するために必要な過程や推定方法を出力します
proceed_when_unidentifiableでは観測されていない交絡因子の存在下で識別を実行するかを示す引数になります。今回はTrueにしています。
上から順に、Estimand1ではバックドア基準を満たすための仮定をしており、条件付き確率の式を仮定しています。Estimand2では操作変数の条件を満たす仮定と因果効果の推定式、Estimand3ではフロントドア基準を満たす仮定があるかを出力しています。今回、フロントドア基準に該当する変数はありませんでした。
●バックドア基準:ZからYへの矢印が成り立っているとした場合に、以下を満たす場合はバックドア基準を満たすと言います。
・ZからXの要素に矢印が向いていない
・ZとYを結ぶすべての矢印でZへ向かう道を全てXがブロックできる
バックドア基準を満たす場合、すべての集合において、条件付き確率の値が同じになるため、別の集合において等しいか確認することで因果グラフが正しい条件で作ることができているのか検証ができる。
●フロントドア基準 ※下記フロントドアDAGを確認
バックドア基準を満たさないグラフでも因果関係を計算できる方法の1つです。
・ZはXからYへの矢印をすべてブロックする
・XからZへのバックドアパスは存在しない
・XからYへの全てのバックドアはXによってブロックされている
例)DAG
例)フロントドアDAG
数式を用いて先ほどのバックドア基準を採用し、層別の手法で因果効果を推定します。
今回の場合、推定値が13.48と真の効果が10なので結構離れています。
refute_estimateで手持ちのデータにはない変数がバイアスとなる可能性を確認することができます。
こちらでは重要だと思われる共通因子以外の変数を変更するなどを行い、因果効果の推定値が変化するか確認することで手持ちのデータにはない変数がバイアスとなる可能性を確認します。
New effectが変更後の数値であり今回の場合は0.7くらいの変動があります。

○まとめ
 今回はDoWhyを使ってみるという内容で因果推論に初めて触れてみました。分析を行うときに、「相関関係が見られたからといって、因果関係があるとは限らない」という話がよくあります。今回、記事を書く上で学んだことは初歩の初歩と感じているためしっかり理解して実務でも活用できるようになりたいと思います。

○最後に

このような形で分析した結果や試してみたことを週に1回(目標)ペースで掲載しています。データ分析のキャリアを歩み始めたのですが、データの解釈、分析力が低いと感じ今回、このような形でアウトプットをしていくことにしたため、ぜひ、アドバイスやご指摘をいただけると幸いです。