因果推論の構造化 実践編

このページの目的

前回は因果推論の構造化を試みました。今回は実際のデータに適用する際にどのようになるかを確かめてみたいと思います。 コード全文はこちらに上げておきます。

データの準備

今回のデータは効果検証入門で紹介されていたこちらを使います。*1このデータで興味のあることは、「広告メールを打つことによりその顧客の購入額が増加するか」という因果です。 まずは、カラムの確認をします。

カラム名 説明
recency 最後の購入からの経過日数
history_segment 昨年の購入額の階層
history 昨年の購入額
women 顧客が女性か
zipcode zipcodeをもとに地区を分類したもの
newbie 過去12か月以内に新しく追加されたユーザーか
channel 昨年においてどのチャネルから購入したか
visit メールが配信されてから2週間以内にサイトへ来訪したか
conversion メールが配信されてから2週間以内に購入したか
spend 購入した際の購入額
treatment メールを配信したか

では、このデータの背景にある因果ダイアグラムから考えていきましょう。なお、このデータはRCTデータを加工して非データを作成しているので、推定した因果効果がどれだけ真の因果効果と近かったかを測ることができます。

因果ダイアグラムの構築

専門家の知識による構築

この方法は人間の頭で考えて因果ダイアグラムを構築します。本来なら、広告マーケティングの知識を背景に変数間の因果関係を考えていかなければなりません。しかし、今回はデータが生成された過程(真の生成過程)を知っているのでそれを因果ダイアグラムに反映します。今回のメール配信戦略はrecency・channel ・history に基づいて優良顧客を判断しています。詳しくは冒頭で紹介した本をご覧ください。*2   f:id:wata101wata:20200913220431p:plain

因果効果の推定

前回紹介した傾向スコアマッチングを用いて因果効果を推定します。[dowhy]https://github.com/microsoft/dowhy)を用いると、フレームワークの力で簡潔なコードにできます!基本的にはdowhyのチュートリアルに沿って動かしているのでぜひそちらをご覧ください。

推定の部分だけ転載すると、

causal_estimate = model.estimate_effect(identified_estimand,
                                            method_name="backdoor.propensity_score_weighting",
                                            target_units = "ate",
                                            method_params={"weighting_scheme":"ips_weight"})
print(causal_estimate)
print("Causal Estimate is " + str(causal_estimate.value))

INFO:dowhy.causal_estimator:INFO: Using Propensity Score Weighting Estimator
INFO:dowhy.causal_estimator:b: spend~treatment+channel+history
*** Causal Estimate ***

## Identified estimand
Estimand type: nonparametric-ate
### Estimand : 1
Estimand name: backdoor
Estimand expression:
     d                                          
────────────(Expectation(spend|channel,history))
d[treatment]                                    
Estimand assumption 1, Unconfoundedness: If U→{treatment} and U→spend then P(spend|treatment,channel,history,U) = P(spend|treatment,channel,history)
### Estimand : 2
Estimand name: iv
No such variable found!

## Realized estimand
b: spend~treatment+channel+history
Target units: ate

## Estimate
Mean value: 0.8234131441089386

Causal Estimate is 0.8234131441089386

となり約0.823の因果効果があると推定されました。真の効果は0.77でした。

まとめ

因果ダイアグラムを構築して、因果効果を推定する方法を紹介しました。次のステップとしては、この分析の評価を行いどれほど信頼できるかを考えていきたいと思います。

*1:一部データ変形をして、説明のため解釈を変えています。

*2:正確に言えば、recency・channel ・historyからspendに矢印が伸びるかは不明ですが、今回はとりあえず引いています。