計量経済学の知見をより深めるべく
を基に因果推論と計量経済学を学んでいく。
4. 傾向スコアを用いた分析
回帰分析では共変量の選定が重要だが、それは同時に難しい過程である。実際の分析では目的変数がどのような仕組みで決定されているかについて不充分な情報しか得られない場合がある。また目的変数と説明変数との関係として線形・非線形の決定も同様に難しい。推定される効果も標本の特徴で介入変数の効果が変わり得る場合に推定される効果の性質が異なるという問題がある。
これから議論する傾向スコアは各標本において介入が行われる確率を表す。傾向スコアを用いた分析は介入が行われた仕組みに注目し、介入グループと非介入グループのデータの性質を似せる操作を行うことで、上記問題点を回避させるような方法である。
CIAではモデルに利用されている共変量の値が同じ標本の中で介入がとは独立に割り振られていることを示していた。このとき 共変量の値が同じ標本の間において介入はランダムに割り振られている状態に等しいため、効果を推定可能であった。これに対して傾向スコアは介入が割り振られる確率である。傾向スコアが同一になるような標本の中では介入がとは独立に割り振られているという仮定に基づいている。したがって共変量から算出した介入の割り振り確率で条件づけた標本の中で介入の割り振りが独立だと考える点が、傾向スコアと回帰分析による推定との差異である。
4.4 機械学習を利用した施策の効果推定
ここではロジスティック回帰を用いてデータを作り、対象変数に与える影響を分析する。が、Verの問題でパッケージが使えず、一部は断念。
逆確率重み付き推定では効果が大きくなっているため、過少方向に選択バイアスが発生していた様子であった。
################################ ### 機械学習を用いた効果推定 ### ################################ ### ここではロジスティック回帰を用いる library("tidyverse") set.seed(1) # 非復元抽出で学習データとサンプルデータをつくるためのデータに分割 train_flg <- sample(nrow(male_df), nrow(male_df) * 0.5, replace = F) male_df_train <- male_df[train_flg,] %>% filter(treatment==0) male_df_test <- male_df[-train_flg,] # 目的変数が発生する確率を予測するモデルの作成 # -> 施策を行わない場合に目的変数としてある値が発生する確率の予測値 predict_model <- glm(data = male_df_train, formula = formula(conversion ~ recency + history_segment + channel + zip_code), family = binomial) # 予測値のパーセンタイルを取得:これを用いて施策を行う対象を無作為に定める pred_cv <- predict(predict_model, newdata = male_df_test, type ="response") pred_cv_rank <- percent_rank(pred_cv) # 施策の実施有無を割付 action_assign <- sapply(pred_cv_rank, rbinom, n=1, size=1) # サンプルデータセットを作成 act_male_df <- male_df_test %>% mutate(action_assign = action_assign, ps = pred_cv_rank) %>% filter((treatment == 1 & action_assign == 1)| (treatment == 0 & action_assign == 0)) ### これは選択バイアスにより、過剰の結果をもたらし得る # まずは回帰で効果測定: # もともと施策で売上を発生させやすいユーザーに偏って # 配信されており、推定値に選択バイアイスが発生 rct_male_lm <- lm(data = male_df_test,formula = formula(spend ~ treatment)) %>% tidy() # 平均の比較 act_male_lm <- lm(data = act_male_df,formula = formula(spend ~ treatment)) %>% tidy() print(paste0("学習データの推定値:",round(rct_male_lm[2,2],digits = 4), "/作成データの推定値:",round(act_male_lm[2,2],digits = 4))) ## 傾向スコアを用いた効果測定 library("WeightIt") # このRのVer.ではMatcingライブラリが利用できない # 傾向スコアを利用したマッチング W_out <- weightit(formula = formula(treatment ~ recency + history_segment + channel + zip_code), data = act_male_df, ps = act_male_df$ps, method = "ps", estimand = "ATE") love.plot(W_out,thresholds = .1) # マッチング後のデータで効果を推定 IPW_result <- act_male_df %>% lm(data = .,spend ~ treatment, weights = W_out$weights) %>% tidy() IPW_result
測定方法 |
データセット |
推定値 |
t値 |
p値 |
||
(1) | 回帰分析 | 無作為抽出した学習データ | ||||
ロジスティック回帰による確率で施策を決めたデータ | ||||||
(2) | 傾向スコア | ロジスティック回帰による確率で施策を決めたデータ |
今回のまとめ
- 機械学習を用いて施策を行うべき対象を選んだ場合、そもそも施策に対してより強く影響を受けやすい(選択バイアスが発生する)対象を選定しており、推定結果がゆがむ可能性がある。