case-kの備忘録

日々の備忘録です。データ分析とか基盤系に興味あります。

書籍メモ:効果検証入門 5章 回帰不連続デザイン(RDD)

効果検証入門 5章 回帰不連続デザイン(RDD)の備忘録と所感になります。

概要

回帰不連続デザイン(RDD)とは

介入有無の閾値(カットオフ)付近のデータに着目することで効果を検証できる手法となります。カットオフ近辺のデータは過去の購買量は介入グループと非介入グループで似た値となっているので、同質なユーザが集まっていると考えられます。RDDは介入の閾値前後の同質なユーザを抽出して介入効果を検証する方法となります。これは同質なユーザであれば介入グループと非介入グループのバイアスも小さいであろうというアイデアに基づいています。
f:id:casekblog:20200510125737p:plain

活用用途について

介入有無がルールで決められている場合(傾向スコアを使えない場合)

介入が明確なルールで決められている場合に活用します。介入は都度行なわれる意思決定ではなく、割り振る条件が記載されたルールによって決まることあります。
例えばルールにしたがって、年齢が30歳以上といった条件に該当するユーザに対して広告の配信をするような施策です。
このような場合、ルールの条件を満たすサンプルは全て介入がおこなわれ、満たさないサンプルは介入が行なわれないということになります。傾向スコアの観点でみるとルールを満たす場合は傾向スコアが常に1であり、満たさない場合は常に0となるため、傾向スコアマッチングやIPWも使えなくなります。
(例えば野球の送りバントによる得点率など、明確なルールはなく複数の選択肢の中で行なわれる介入には傾向スコアを適用することができると思います。)

時系列で介入の変化が起きていない場合(DIDを使えない場合)

割り当てのルールが過去にも使われており、時系列で介入有無の変化が起きてない場合有効です。例えばキャンペーン施策ではなく、レコメンドエンジンのように過去すでに適用されてる介入が該当するんじゃないかと思います。広告のキャンペーン施策など時系列で変化があるようであれば、DIDを適用して介入前後の効果を見ることは可能だと思います。

実践

セレクションバイアスが発生していることを、「集計」「線形回帰」「」確認してみたいと思います。

データを準備する

ライブラリを追加。

library("tidyverse")
library("broom")

該当データを取得します。

email_data <- read_csv("http://www.minethatdata.com/Kevin_Hillstrom_MineThatData_E-MailAnalytics_DataMiningChallenge_2008.03.20.csv")

介入の有無をラベリング

male_data <- email_data %>%
  filter(segment%in% c("Mens E-Mail", "No E-Mail")) %>%
  mutate(treatment=if_else(segment == "Mens E-Mail", 1, 0),
  history_log=log(history))

RDDでサンプリングします。カットオフは5.5とします。

threshold_value <- 5.5
rdd_data <- male_data %>%
  mutate(history_log_grp=round(history_log/0.1,0)*0.1) %>%
  filter(
    ((history_log > threshold_value) & (segment == "Mens E-Mail"))|
      (history_log <= threshold_value) & (segment == "No E-Mail"))

集計による分析

まずは単純に集計して比較してみます。

rdd_data_table <- rdd_data %>%
  group_by(treatment) %>%
  summarise(count=n(),
            visit_rate=mean(visit))

確認。

 rdd_data_table
# A tibble: 2 x 3
  treatment count visit_rate
      <dbl> <int>      <dbl>
1         0 13926     0.0907
2         1  7366     0.224 

カットオフ以下の来訪率は9%であり、カットオフ以上の来訪率は22.4%となったため、この集計上での効果は13.4%だと言うことになります。
RCTのデータにおいて介入効果は8% 程度であったため、この結果は想定どおり乖離しています。
RCT
www.case-k.jp

回帰分析

回帰分析でも確認してみます。

rdd_lm_reg <- rdd_data %>%
  mutate(treatment=if_else(segment== "Mens E-Mail",1 ,0)) %>%
  lm(data=., formula=visit ~ treatment + history_log) %>%
  tidy() %>%
  filter(term == "treatment")

介入の説明力を確認してみます。

 rdd_lm_reg
# A tibble: 1 x 5
  term      estimate std.error statistic  p.value
  <chr>        <dbl>     <dbl>     <dbl>    <dbl>
1 treatment    0.114   0.00798      14.2 8.40e-46

回帰分析では介入効果は11%となりました。集計よりもRCTの効果に近くなっていることがわかります。

その他のRDD手法

RDDを使ったその他の手法を紹介します。

nonparametric RDD

介入を決定する変数と目的変数の関係が非線形の場合に利用できる手法として、nonparametric RDDと言う方法が有ります。利用するデータを閾値の前後に限定することでセレクションバイアスを小さくすると言う考え方です。
Rで試してみます。まずはライブラリを追加します。

install.packages("rdd")
library("rdd")
rdd_result <- RDestimate(data=rdd_data,
                         formula=visit ~ history_log,
                         cutpoint=5.5)

確認してみます。

summary(rdd_result)

Call:
RDestimate(formula = visit ~ history_log, data = rdd_data, cutpoint = 5.5)

Type:
sharp 

Estimates:
           Bandwidth  Observations  Estimate  Std. Error  z value  Pr(>|z|)      
LATE       0.6943      9596         0.08155   0.01630     5.002    5.677e-07  ***
Half-BW    0.3471      5043         0.08216   0.02288     3.590    3.301e-04  ***
Double-BW  1.3885     15779         0.10038   0.01195     8.399    4.514e-17  ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

F-statistics:
           F       Num. DoF  Denom. DoF  p
LATE        75.87  3          9592       0
Half-BW     29.87  3          5039       0
Double-BW  152.90  3         15775       0

Estimatesが効果量を表しています。標準誤差やP値も確認することができます。LATEの推定値は8%となっており、カットオフ付近ではメールによって8%程度サイト来訪率を向上させていることを示しています。LATEの下にレポートされているHalf-BWとDouble-BWは利用するデータをそれぞれ半分にした場合と倍にした場合の効果です。基本的にカットオフからの幅を小さくするとバイアスは小さくなる一方で、標準誤差は大きくなってしまいます。Half-BWとDouble-BWを確認して乖離が大きくないか目安にします。

plot(rdd_result)
f:id:casekblog:20200514092539p:plain

RDDの前提条件

すでに気づいたかもしれませんがRDDを適用するにあたり必要な前提条件があります。

Continuity of Conditional Regression Functions

RDDでは推定された結果が正しいと考えるために、Continuity of Conditional Regression Functionsと呼ばれる仮定を満たす必要があります。これは介入を受けた場合と受けなかった場合における条件付き期待値が連続であることを仮定してます。連続でない状態は別の介入があるときに発生しやすいです。例えばメールマーケティング以外にも広告配信施策を行っていた場合、カットオフ付近で推定される効果はメールマーケティング以外の効果も含まれています。

Continuity of Conditional Regression Functionsの検証

上記の場合だと仮にメールマーケティングの施策効果がない場合にも効果があるように見えてしまいます。このような疑わしい変数がある場合はその変数を目的変数としてRDDを実行することでその変数がContinuous Assumptionを満たしているか確認できます。

nnon-manipulation

non-manipulationと呼ばれる分析の対象が自身の介入に関するステータスを調整できない仮定があります。例えばあるユーザーが一定以上の金額を購入すると知っていた場合、意図して追加購入しようとします。このような場合カットオフをわずかに下回るユーザが、わずかに上回るユーザーに変化してるのでカットオフ付近のデータの分布が大きく異なります。

nnon-manipulationの検証

このような状態が発生しているか否かはカットオフ付近でのデータ量(密度)に着目することで判定できます。

DCdensity(runvar=rdd_data %>% pull(history_log),
          cutpoint=5.5,
           plot=FALSE)

[1] 0.6302935

ここでは0.63と言うP値が得られているため、ユーザが自分の石で介入グループに入るような状況は起きていないことが確認できます。

LATEの妥当性

カットオフ付近のデータに絞って効果の介入を推定することを Local Average Treatment Effect(LATE)いいます。RDDの分析手法によって得られるデータは全てカットオフ付近のデータとなります。この結果はあくまでカットオフ周辺における効果を表しているので、LATEを推定する物です。データ全体における平均的な効果と考えるためには行なわれた介入の効果がrunning variableの値によって変化しないと仮定を置く必要があります。

LATEの妥当性の検証方法

残念ながらこの仮定の妥当性をデータから検証する方法はないため、分析者の解釈に依存する。

所感

明確なルールベースで介入が行なわれることは実際によくあると思うのでどこかで試してみたいと思います。ただ、この手法も平行トレンドと同じように仮定(カットオフ付近は同質なユーザが集る)を満たしている必要があるので、手法を試す前に事前にどうゆう性質のデータなのかを見る必要がありそうだと思いました。また本章を読んでビジネスに置いて傾向スコアを使うのはなかなか難しいような気もしました。一方でキャンペーンなど時系列で介入変化がおきてないケースはそれほど多くないと思うのでDIDは実務でも使える印象を受けました。過去に介入を行い常時適用してる機能(レコメンドエンジン)などにはRDDを使えるんじゃないかなあと書籍を読んでて思いました。また、全体を通してベンチマークとしてRCTを基準にしてる印象があるため、RCTを適用できない状況下に置いてはあくまでもベストエフォートな印象を受けました。常時適用してる介入の効果を調べる場合、RDDの前提条件として必要なContinuity of Conditional Regression Functionsを満たしてない場合も多いような気がしており、前提として満たす仮定が非常に多いように思います。なので全体を通して、現実的にはDIDによる介入前後の検証が良い印象を受けました。