Unboundedly

日々大学院で学んだこと、考えたことを更新

統計的因果推論のためのPythonライブラリDoWhyについて解説:なにができて、なにに注意すべきか

機械学習など主に予測を目的とした統計手法に強いイメージのPythonでしたが、統計的因果推論を行うためのライブラリ、“DoWhy”がついにリリースされました。

DoWhy | Making causal inference easy — DoWhy | Making Causal Inference Easy documentation

これまで因果推論があまり浸透してこなかった*1データサイエンス界に新しい風が吹くのではと期待が高まります。

一方でこのパッケージが何を可能にし、逆に何ができないのかを理解しなければ、雑なデータ分析が増えて逆に有害なのではと思い、今回ブログを書くことにしました。

先に言っておくと、私自身はPythonをメインに使っているわけではありません(使ったことはあるので一応コードを読んで何が起こっているかくらいはわかります)。したがって本記事の目的は、DoWhyライブラリを一行ずつ解説するのではなく、あくまで背景にある統計的因果推論の考え方と合わせながらライブラリでできることできないことを説明することです。少し専門用語が多いですが、すべて過去のブログ記事で説明済ですので、途中で詰まってしまう場合は適宜読み返してみてください。

なぜ因果推論なのか

予測ではなく、因果推論を目的としたデータ分析がなぜ必要とされるのかについて、DoWhyの開発者らは以下のように述べています

f:id:KRSK_phs:20180822031022p:plain

要するに、データ分析から得られた知見を使ってなんらかのアクションをしたい場合は予測だけでは不十分だろうということです。

考えてみれば多くのデータ分析は、究極のゴール(例えばビジネスなら利益最大化など)を達成するためにどのような行動(新しいマーケティング戦略など)をとればいいのかを知るのが目的であるように思えます。

このような目的のためには統計的因果推論というフレームに基づきデータ分析を行う必要があります。

統計的因果推論の流れ

統計的因果推論では反事実モデルという考え方を使います。  詳しくは、以下の記事をご参照ください。

反事実モデルに基づいて定義された因果効果は、現実には観測不可能な架空の値なのですが、一定の仮定をおく(そしてその仮定がもっともらしいような状況を作り出す)ことで実世界のデータを用いて計算することが可能になります。厳密な因果推論のためには、この仮定を理解し、その妥当性を検討することが重要です。

つまり統計的因果推論のフレーム下で、データ分析は次のような流れで行われます。

①反事実モデルに基づき因果効果を定義する

②仮定をおく (Assumptions)

③定義された因果効果(観測不可能)を、2の仮定下で現実世界のデータから求めるための数式を導く (Identification)

④3で得られた値を実際に計算する (Estimation)

⑤2で置いた仮定がどの程度妥当なのか、仮定の違反に対して結果がどの程度頑健(Robust)なのかを検討する、感度分析 (Sensitivity Analysis / Robustness Check)

横に青文字で示したのが、各ステップを英語で呼ぶときの名称です。DoWhyのマニュアルを読むのに必要になるので、以下対応する英単語をできるだけ書くようにします。

DoWhy、なにができる?

結論からいうと、DoWhyの魅力は上記のプロセスを一つ一つを明確に可視化してくれるところです。*2

言い換えると、DoWhyがないと因果推論ができないわけでも、なにか特別なことをやってくれるわけでも、因果推論が手軽に自動化されるわけでもありません。

ただこれらのプロセスのうちどれかがいい加減に行われていたり、そもそもそのような手順を踏んでいることを分析者が無自覚にデータを扱っている場合が多いので、それを可視化してくれるという意味で丁寧な因果推論を行う癖をつけることができる、学習ツールとして優秀だと思いました。

f:id:KRSK_phs:20180822035351p:plain

仮定をおく(Assumptions)

反事実モデルで定義された因果効果を現実世界のデータから導くための条件の一つに、Exchangeabilityがあります。このような仮定が成立するための条件を考えるのに有効なツールとして因果ダイアグラム(DAG)があります。詳しくは過去記事を参照ください。

具体的には、以下のステップです。

1.考えたい因果関係(例:AがYに与える因果効果は?)について、自分の持っている知識を総動員してDAGを書く
2.DAGのルールにのっとり、Backdoor pathを閉じるために必要な(最低限の)共変量を特定する
3.その共変量を条件づけると理論上Conditional Exchangeabilityが得られる

Badckdoor criterionと呼ばれる考え方で、DoWhyのマニュアル中にも”backdoor"という単語が頻出します。要するにDAGを使ってConditional Exchangeabilityを考えていることを意味するのだと思ってください。

DoWhyではDAGを自分で書いて、読み込ませる必要があります。

f:id:KRSK_phs:20180822042156p:plain

あくまでDAGは自分の知識を使って書かないといけないわけで、完璧なDAGが書けるとも限りません。

すなわち、DoWhyを使えばコンピュータが勝手に因果推論を行ってくれるなんて代物ではありません。これはとても重要なポイントです。人間の頭を使う必要があります。だからこそ仮定(Assumption)なのであって、その仮定が成り立たない場合になにが起こりうるのかをあとで検討(Sensitivity Analysis)を行う必要があります。

データから因果効果を導く数式を見つける(Identification)

f:id:KRSK_phs:20180822043454p:plain

 正しいDAGが書けていて、共変量の条件付けによりConditional Exchangeabilityが得られる場合(上のコード中、赤線で示した部分はこれを意味します)には、反事実モデルに基づく因果効果を条件付き期待値で表現できます。d/dv (上のPythonコードでは因果効果を求めたい要因Aをvと表記しています)は、要するにvが一単位変化したときにその右側の値がどう変化するかということです。こちらにも書いていますが、Aが0または1の二値の場合、

Consistencyより

E[Y|A=1, C=c] - E[Y|A=0, C=c]=E[Ya=1|A=1, C=c]-E[Ya=0|A=0, C=c]

Conditional ExchangeabilityよりE[Ya│A=1, C=c] = E[Ya│A=0, C=c]=E[Ya|C=c]なので

E[Ya=1|A=1, C=c]-E[Ya=0|A=0, C=c] = E[Ya=1|C=c]-E[Ya=0|C=c] (C=cの人たちにおける平均因果効果)

を計算することができます。

E[Y|A=1, C=c] - E[Y|A=0, C=c]がデータから計算可能なもの。E[Ya=1|C=c]-E[Ya=0|C=c]が求めたい因果効果です。

このように、データから何を計算すれば仮定の下で因果効果が分かるのか、その数式を考えるのがIdentificationです。

ちなみに上記のコードの下の方に「### Estimand : 2」とあります。これは操作変数法(Instrumental Variable: IV)に基づく因果効果の推定で、backdoor criterionに基づくConditional Exchangeabilityとはまた異なる仮定をおいています。操作変数法についてはこのブログでまとめたことはありませんが、気になる人は調べれば詳しい情報が出てくると思います。

データを使って推定をする(Estimation)

さて計算すべき値がわかったので、あとは実際にデータを用いてそれを求めるだけです。このステップを推定(Estimation)と呼びます。要するにどうやって条件付き期待値をデータから計算するかという問題で、DoWhyはいくつかの方法をサポートしています。

http://causalinference.gitlab.io/dowhy/do_why_estimation_methods.html#

DAGを書くことでおかれた、Conditional Exchangeabilityの仮定下では

線形回帰(Regression)

傾向スコア層別分析(Stratification)

傾向スコアマッチング(Matching)

傾向スコア重みづけ(Weighting) 

がDoWhyでは使えるようです。

例えば、線形回帰では

f:id:KRSK_phs:20180822051255p:plain

 Y = v (因果効果を求めたい説明変数A) + C(DAGから特定した共変量たち)というシンプルな回帰モデルを使っていることになります。

あとはIVとRegression Discontinuityと呼ばれる手法もカバーしています。これらは異なる仮定をおくことで反事実モデルに基づく因果効果の推定を目指していきます。が、今回は詳しい説明は割愛します。

結果の頑健性を検討(Robustness check)

さて、これまでは自分の書いたDAGが正しい、かつBackdoorを閉じるのに足る共変量のデータが手元にある(すなわちConditional Exchangeabilityが成立している)という仮定のもとで因果推論をおこなってきました。

しかし、この仮定が正しいという保証はどこにもありません。そこで仮定の違反(violation)があった場合に、どのくらい結果が変わるのかを検討する作業が必要になります。これを感度分析(Sensitivity Analysis)と呼びます。結果のRobustnessを確認する作業とも言えます。感度分析については以下の記事も一緒に読んでみてください。

DoWhyでは"refute_estimate”という機能を使うことで少しだけ感度分析を行うことができます。ただ後で書くように、DoWhyがカバーしているものだけでは感度分析として全く不十分なように思えます。

DoWhyを使ううえで注意すべきポイント

注意点1:必要な仮定の一つしか考えていない

DoWhyはDAGを分析者に書かせ、それをインプットすることから因果推論を分析はじめるので、仮定を明確(Explicit)にするという意味で因果推論をサポートしています。

しかし、DAGのインプットおよびそれに基づいたBackdoor criterionから仮定されるのはConditional Exchangeabilityのみです。実際にはその他多くの仮定が必要になります。

ConsistencyやPositivityといった基本の仮定に加えて、例えばデータが正確に測定されているか、Estimationで使用するモデルは正しいのか、選択バイアスはないか、諸々考える必要があるのですが、DoWhyはこれらの仮定が正しいことを暗黙の了解としています

仮定を明示してから分析を始めるというアイデアは素晴らしいのですが、明示すべき仮定が不十分である点に注意です。

注意点2:必要以上の条件付けをしている可能性

Identificationのステップで、因果効果を計算するのに必要な計算式(Estimand)を求めていますが、このときに使われている条件付けが必要以上に多いように思えます。以下の例だとZ0やZ1も条件付けていますが、少なくともマニュアルから推測されるDAGではZ0やZ1の条件付けは必要ではありません。X0~X4の条件付けで充分です。

f:id:KRSK_phs:20180822043454p:plain

といっても全くの間違いというわけではありません。X0~X4の条件付けでConditional Exchangeabilityが得られるのであれば、Z0やZ1をさらに条件付けたとしても同じようにConditional Exchangeabilityが得られます。

問題は、過剰な条件付けによって、Estimationのステップで不必要な仮定(Modeling assumption)をおいてしまうことです。間違いではありませんが、避けたほうがいいでしょう。

注意点3:モデルの仮定が無視されている

注意点1と共通する問題ですが、特に重要なDoWhyの弱点だと思います。

Estimationステップで、Regressionの使用を指定するとDoWhyが勝手に使用する統計モデルを選んでしまいます。統計モデルを使用するということは、説明変数と被説明変数の間に一定の関係性を仮定することになるのですが、DoWhyはこれを完全に無視してしまっています。例えば、交互作用が存在する場合などDoWhyがフィットするモデルでは誤設定が生じることになります。

付随する問題として、結果の解釈に注意が必要です。計算された条件付き期待値はConditional Exchangeabilityのもとで因果効果と解釈できるわけですが、これはあくまでConditionalな因果効果になります。

どういうことかというと、「条件付けに使った共変量Cの値が同じ人たちでの」因果効果なのであって、対象集団全体での(Marginal)因果効果ではない、ということです。

これらが一致しない(すなわち交互作用がある)場合には、Conditionalに得られた因果効果に対して、各Cのパターンをとる確率を使って重みづけ平均をとる必要があります

注意点4:Estimationの方法が少ない

DoWhyではいくつか推定(Estimation)の方法をサポートしていますが、完全に網羅しているわけではありません。分析の目的やデータの性質によっては他の方法のほうが適切な場合もありますが、DoWhyではこのあたり柔軟に対応できません。

まとめ

  • DoWhyは統計的因果推論のプロセスを可視化してくれる
  • DoWhyはあくまで因果推論をサポートするだけ。自動化してくれるわけではなく、自分の頭を使う必要あり。
  • いくつか課題があり、実際の因果推論に使うというよりはトイデータを使った練習向けの学習ツールととらえるほうがいいか。

参考資料

統計的因果推論について基本的な考え方は、ハーバード大学の研究者らがまとめた以下の教科書にまとめてあります(無料公開中)。なんとRやPythonのコードもついてきます。

https://www.hsph.harvard.edu/miguel-hernan/causal-inference-book/

Rですが、手を動かしながら統計的因果推論を学ぶには以下の本がいいと思いました。

Rによる実証分析 ―回帰分析から因果分析へ―

Rによる実証分析 ―回帰分析から因果分析へ―

 

DAGの生みの親でありAI研究者のJudea Pearlが一般向けに出した以下の本では、Computer Scientistである彼がなぜ因果推論に興味を持ち、どう分野を発展させてきたのかが書かれてあります。

The Book of Why: The New Science of Cause and Effect

The Book of Why: The New Science of Cause and Effect

 

*1:個人的な印象です。間違ってたらすいません。

*2:Step①がありませんが、単なる因果効果の定義です。Step③でIdentifyされるものが定義された因果効果を求めるための計算式です。