「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。データ分析・語学に力点を置いています。 →現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年1月21日改訂)。

MENU

効果検証入門(05/08)

 計量経済学の知見をより深めるべく

を基に因果推論と計量経済学を学んでいく。

4. 傾向スコアを用いた分析

 回帰分析では共変量の選定が重要だが、それは同時に難しい過程である。実際の分析では目的変数Yがどのような仕組みで決定されているかについて不充分な情報しか得られない場合がある。また目的変数と説明変数との関係として線形・非線形の決定も同様に難しい。推定される効果も標本の特徴で介入変数の効果が変わり得る場合に推定される効果の性質が異なるという問題がある。
 これから議論する傾向スコアは各標本において介入が行われる確率を表す。傾向スコアを用いた分析は介入が行われた仕組みに注目し、介入グループと非介入グループのデータの性質を似せる操作を行うことで、上記問題点を回避させるような方法である。
 CIAではモデルに利用されている共変量\boldsymbol{X}_iの値が同じ標本の中で介入がY^{(0)}とは独立に割り振られていることを示していた。このとき 共変量\boldsymbol{X}_iの値が同じ標本の間において介入はランダムに割り振られている状態に等しいため、効果を推定可能であった。これに対して傾向スコアは介入が割り振られる確率である。傾向スコアP(X_i)が同一になるような標本の中では介入がY^{(0)}とは独立に割り振られているという仮定に基づいている。したがって共変量から算出した介入の割り振り確率で条件づけた標本の中で介入の割り振りが独立だと考える点が、傾向スコアと回帰分析による推定との差異である。

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) 回帰分析 無作為抽出した

学習データ
0.764
3.68
2.32\times10^{-4}
    ロジスティック回帰

による確率で施策を

決めたデータ
1.08
3.61
3.09\times10^{-4}
  (2) 傾向スコア ロジスティック回帰

による確率で施策を

決めたデータ
1.35
4.12
3.87\times10^{-5}

今回のまとめ

  • 機械学習を用いて施策を行うべき対象を選んだ場合、そもそも施策に対してより強く影響を受けやすい(選択バイアスが発生する)対象を選定しており、推定結果がゆがむ可能性がある。
プライバシーポリシー お問い合わせ