Playground 11:ターゲティングの実験室

計量経済学II(ブラウザ上でRが動きます)

作者

Kei Ikegami

重要このページの使い方
  • このページのRコードは、あなたのブラウザの中で動いている(WebAssembly + webR)。インストールは一切不要。
  • 初回だけ、ページ読み込みに30秒〜1分かかる(R本体とパッケージのダウンロード)。2回目以降はキャッシュで速くなる。
  • 各セルのコードは自由に書き換えて「Run Code」で実行できる。何をどう壊しても誰にも迷惑はかからない。おかしくなったらページを再読み込みすれば元に戻る。
  • 元ネタは講義ノート(lecture11.html)。ここでは「数値をいじって挙動を体感する」ことに集中する。
  • 講義ノートのCATE推定はcausal forest(grf)を使ったが、webRで読み込むには重すぎるため、このページではT-learner(lmを2本推定して差を取る)で代用する。考え方は同じである。

実験1:「解約しそうな人に施策」は正しいか

「解約しそうな顧客にこそ引き留めクーポンを配るべきだ」。誰もが思いつくこの方針が失敗しうることを、Ascarza (2018) は実際のRCTで示した。鍵は、解約リスクの高さと、施策への感応度(CATE)

\[ \tau(x) = E[Y(1) - Y(0) \mid X = x] \]

まったく別の量だという点にある。ここでは通信キャリアのクーポンRCTをシミュレートし、60%を学習、40%を独立評価に使う。risk_slope が「リスクが高い人ほど効果が下がる」構造の強さを決める。true_total_effectest_incremental_staysはどちらも学習に使っていない評価標本で計算する。

このDGPではリスク上位を狙う (a) がランダムに負けうる。ただし、表が示す通り負のCATE層にも4類型が混在する。principal stratumは個人の \((Y(0),Y(1))\)、CATEは条件付き平均であり、負のCATEは「その人がsleeping dog」という意味ではない。

ノートやってみよう
  • risk_slope <- -0.4(CATEとリスクが正相関する世界)にすると、(a)と(b)の差はどうなるか。予想してから実行しよう。このときリスクスコアはupliftの良い代理変数になる。
  • budget_frac を0.05と0.5に変えて、(b)と(c)の差(ターゲティングの賢さの価値)が予算のどの水準で最も大きく出るか確かめよう。
  • risk_slope <- 0(効果が誰でもほぼ同じ世界)でも、(b)が(c)に少し勝ったり負けたりする。これは本物の差か、推定ノイズか。set.seed を変えて何度か回すとどう確かめられるか。

実験2:Qini曲線 — 膨らみの源泉は効果の異質性

ターゲティングの良し悪しを1枚で見る道具がQini曲線である。横軸は「上位何%に配ったか」、縦軸は「累積の増分継続者数」。並べ方が賢いほど曲線は上に膨らみ、ランダムに配ればほぼ直線(対角線)になる。膨らみを生むのは効果の異質性そのものだ。異質性の強さ hetero をいじって、uplift順・リスクスコア順・ランダムの3本の形がどう変わるかを見よう。

ノートやってみよう
  • hetero <- 0 にして、3本の線がほぼ1本の直線に重なることを確かめよう。効果が誰でも同じなら、賢く並べても意味がない。ターゲティングの価値は異質性の強さで決まる。
  • hetero <- 2 にすると、uplift順の膨らみと、リスクスコア順の「谷」(途中でマイナスに沈む区間)はどれだけ極端になるか。
  • 配布割合1.0(右端)では、どの並べ方でも3本の線が同じ点に戻る。なぜか。

実験3:IPWで施策ルールをオフライン評価する

新しい配分ルールを思いつくたびにA/Bテストをやり直すのはコストが高い。ただし、一つのRCTログで閾値を探し、同じログで最良値を報告すると評価に過適合する。そこでここでは、trainでCATEを学習 → validationで閾値を選択 → testで固定ルールを1回評価という3ステップを実装する。

\[ \hat{V}(\pi) = \frac{1}{n} \sum_{i=1}^{n} \frac{\mathrm{1}\{D_i = \pi(X_i)\} \, Y_i}{P(D_i \mid X_i)} \]

ログの中で「たまたまルールと同じ割り当てを受けた人」だけを取り出し、割り当て確率(ここでは0.5)の逆数で重み付けする。validationでは、平均継続率からクーポンコストを引いたnet_valueを最大化する閾値を選ぶ。

最後の表は、validationで一度固定した閾値を、手を触れていないtestで評価したものだ。通常のSE・CIは、このように政策がtestから独立に固定され、i.i.d.・overlap・有限分散などが成り立つ場合の近似である。

ノートやってみよう
  • threshold_gridの間隔を0.02、0.005に変えると、validationの最良値とtestの値はどう変わるか。候補が多いほどvalidationに過適合しやすいことも確認しよう。
  • coupon_cost を0、0.01、0.04に変えると、選ばれる閾値と配布割合はどう動くか。
  • test結果を見た後にグリッドやコストを変え続ければ、testもvalidation化する。最終testは一度だけ使う。限られたデータをより効率的に使う方法がnested cross-fittingである。

次に読むもの

  • 講義ノート本体:lecture11.html(顧客の4類型、causal forest、Qini曲線、IPW、policy learningの完全版)
  • coding課題:assignment11.qmd(動画サブスクリプションの解約引き留めクーポンRCTを題材に、今日の手順をゼロから自分で実装する)