🦁

事例と実装で学ぶ因果推論〜ダイエットアプリの効果を検証するには?(第2回:ポテンシャルアウトカムフレームワーク)

2023/04/09に公開

こんにちは、Ubie Discoveryのmatsu-ryuです。

「事例と実装で学ぶ因果推論〜ダイエットアプリの効果を検証するには?」シリーズ2回目の記事になります。

1回目は、仮想のダイエットアプリの疑似データを生成し、「アプリ利用者」と「アプリ比較利用者」の1年後の体重増減を比較した場合の問題点について述べました。
https://zenn.dev/matsu_ryu/articles/c4c5f804fbae8d

第2回は、この問題点に対応するための「ポテンシャルアウトカムフレームワーク」について解説していきます。

前回のおさらい

前回生成したデータ例

  • age:年齢
  • gender:性別
  • weight:体重
  • treatment:アプリ利用有無
  • outcome_0:アプリ利用無しの場合の体重増減
  • outcome_1:アプリ利用有りの場合の体重増減
  • outcome:実際に観測されたの体重増減
age gender weight diet treatment outcome_0 outcome_1 outcome
50 Female 77 2 1 4 2 2
34 Male 57 2 0 3 5 3

上記のようにデータ生成のモデルがわかっている場合、outcom_0とoutcome_1が観測できるため、個人レベルで、
「アプリ利用した場合の体重増減」ー「アプリ利用しない場合の体重増減」
が算出でき、個人レベルのアプリ利用効果が測定できます。

しかし、現実世界において、観測できるデータは

age gender weight diet treatment outcome_0 outcome_1 outcome
50 Female 77 2 1 2 2
34 Male 57 2 0 3 3

なので、

個人レベルで、
「アプリ利用した場合の体重増減」ー「アプリ利用しない場合の体重増減」
で算出することは、できません。

集団レベルで
「アプリ利用した場合の体重増減」ー「アプリ利用しない場合の体重増減」
は、算出可能ですが、前回解説したとおり、アプリ利用者はもともと体重が減りやすい集団なので、単純比較することはできません。

どうしたらよいでしょうか?

RCTによる検証

1つめのアプローチは、アプリ利用をランダムに割り当てることです。
このようなアプローチを、RCT(Randomized Controlled Trial)と言います。
(Webサイト改善でよく行われているABテストも同様の考え方です。)

アプリ利用をランダムに割り当てることで、
アプリ利用者とアプリ非利用者の、背景因子(性別、年代、体重、食習慣)の分布をそろえることができます。
このように生成されたデータを実験データと言います。

試しに、前回の擬似コードにおいて、アプリ利用者の割当をランダムにするとどうなるでしょう?

generate_treatment <- function(covariate, a) {
  treatment <- rbinom(nrow(covariate), 1, 0.5) #ランダムに割当
  tibble(treatment)
}

tableoneによる比較

                    Stratified by treatment
                      0             1             p      test
  n                     508           492                    
  age (mean (SD))     44.20 (13.94) 44.37 (14.23)  0.849     
  gender = Male (%)     262 (51.6)    238 (48.4)   0.343     
  weight (mean (SD))  59.40 (11.36) 59.08 (10.95)  0.647     
  diet (%)                                         0.957     
     0                  207 (40.7)    196 (39.8)             
     1                  146 (28.7)    144 (29.3)             
     2                  155 (30.5)    152 (30.9)             
  outcome (mean (SD))  0.99 (0.99)  -0.99 (1.01)  <0.001  

前回と比較すると、アプリ利用群とアプリ非利用群の、性別、年齢、体重、健康意識の分布がそろい、
「アプリ利用した場合の体重増減」(-0.99)ー「アプリ利用しない場合の体重増減」(0.99)=-1.98
となり、真の効果の「-2」に近い値が推定できています。

ただし、ダイエットアプリの運用において、利用者をランダムに割り当てることは、現実的ではありません。通常のアプリ運用で発生したデータにおいて、効果検証を実現したい! というモチベーションが出てきます。
このような検証を観察データにおける因果推論と言います。ヘルスケア業界でよく語られるリアルワールドデータ(RWD)も観察データに分類されます。

これを実現するには、どうしたらよいでしょうか?

ポテンシャルアウトカムフレームワークによる因果推論

〜観察データの効果検証の考え方〜

以下の疑似データで考えてみましょう

ID age gender weight diet treatment outcome_0 outcome_1 outcome
A 50 Female 77 2 1 3 3
B 51 Female 76 2 0 5 5
C 33 Male 55 1 0 2 2
D 34 Male 57 1 1 0 0

感覚的には、
「AさんてBさんにの属性ってほぼほぼ、一緒だから、Aさんのアプリ非利用時の体重増減ってBさんの結果に置き換えて考えられないかな?」
というお気持ちです。
同じように
「CさんとDさんは似てるから、未観測の体重増減を置き換えられないかな?」
のような感じで考えます。(似ている人の結果を交換して利用できないかな?)

では、改めて数式を導入して状況を整理していきましょう。

個人レベルで考える

本当に知りたいのは、個人のアプリ利用した場合の体重増減と、アプリ利用しない場合の体重増減です。それは、

outcom_{treatment = 1} - outcom_{treatment=0}

と表記します。Aさんの場合は、アプリ利用していて、非利用時のoutcom_{treat=0}は観測できません。なので、現実世界において、この値は、算出することはできません。

outcom_{treat=1}outcom_{treat=0}のことをポテンシャルアウトカム(潜在的結果変数)と言います。(outcomは実際に観測した変数)

集団レベルで考える。

個人レベルでのアプリの利用効果は算出できないので、集団レベルでの平均効果を考えます。

E[outcom_{treatment = 1}] - E[outcom_{treatment = 0}]

が算出できないか?を考えます。
この数式の意味合いは
全員がアプリを利用した場合-全員がアプリを利用しなかった場合の平均的なアプリの利用効果です。
ただし、これも、人によってoutcom_{treat = 0},outcom_{treat = 1}が観測できないので算出できません。

E[outcom_{treat = 1}]およびE[outcom_{treat = 0}]を算出する方法は、ないものか?
を考えていくことになります。

集団レベルで考える。(交換可能性を検討する。)

ここで、このセクションの冒頭で述べた
「Aさんのアプリ非利用時の体重増減ってBさんの結果に置き換えて考えられないかな?」
の考えがヒントになってきます。
AさんとBさんのポテンシャルアウトカムが交換可能なのは、どういった場合でしょういか?
それは、ざっくりいうと
1.体重増減は、アプリ利用有無、性別、体重、体重、食習慣によって推定可能
2.性別、体重、体重、食習慣の背景因子が同じで、唯一異なるのは、アプリ利用有無
というような状況です。

以降、age,gender,weight,dietはまとめて「L」と表現します。

数式で表現すると、

E[outcom|treatment=1,L]=E[outcom_{treatment = 1}|L]
E[outcom|treatment=0,L]=E[outcom_{treatment = 0}|L]

となります。
ポイントは、左辺は実データから算出可能 なことです。

本来知りたいのは、E[outcom_{treatment = 1}|L]ですが、観測データからは算出できない。しかし、ある前提条件を満たせば E[outcom|treatment=1,L]に置き換え可能となります。

つまり

E[outcom_{treat = 1}|L]-E[outcom_{treat = 0}|L]=E[outcom|treat=1,L]-E[outcom | treat=0,L]

となり、求めたい真の集団にける、ダイエットアプリの効果が算出可能となりました。

ここからは、その3つの前提条件について、見ていきましょう。

因果推論の必要な3つの前提条件

  • 交換可能性:Exchangebility
  • 正値性:Positivity
  • 一貫性:Consistency

上記3条件をまとめて、識別可能性(Identifiavility)といいます。
では、1つずつ見ていきましょう

疑似データを再掲します

ID age gender weight diet treatment outcome_0 outcome_1 outcome
A 50 Female 77 2 1 3 3
B 50 Female 77 2 0 5 5
C 34 Male 57 1 0 2 2
D 34 Male 57 1 1 0 0

交換可能性:Exchangebility

数式で表現すると
E[outcom_{treatment=0}|treatment=1,L]=E[outcom|treatment=0,L]
となります。

疑似データの例でいうと、Aさんがアプリ利用しない場合のポテンシャルアウトカムの体重増減(outcom_0)は、
Bさんをはじめとする、Lの条件が同一な人の観測値の体重増減(outcom)で交換可能だよね。という感じです。

ちなみに、RCTの場合は、アプリ利用群とアプリ非利用群において、Lの分布が調整されるため
E[outcom_{treatment=0}|treatment=1]=E[outcom|treatment=0]
となります。(※Lによる条件付は不要)
なので、Lを条件づけせずに群間で単純比較しても問題にならなかったのです。

正値性:Positivity

数式で表現すると
0<P(treatment=0|L)<1
0<P(treatment=1|L)<1
となります。

疑似データの例でいうと、アプリ利用しているAさんがアプリ利用しない場合の体重増減(outcom_0)を推定しようとしたとき、アプリ利用無しの集団にAさん同様のLを保持している人が1人以上は必要、ということを言っています。

集団の平均的な効果で推定しようとしたときに、同様のLを持った集団が、アプリ利用有りの集団にしかいない場合、アプリ利用無しのポテンシャルアウトカムが推定できない状況になってしまいます。このような状況では、因果推論することは不可能です。

一貫性:Consistency

数式で表現すると
E[outcom_{treatment=1}|treatment=1,L]=E[outcom|treatment=1,L]
となります。

疑似データの例に言葉で説明すると、
アプリ利用しているAさんの観測された体重増減(outcom)とポテンシャルアウトカム(outcom_1)は常に一致する。ということを言っています。一見当たり前のことを行っているようで、分かりづらいですね。

可能な限り、簡潔に説明すると、アプリ利用有りの場合は、体重増減の効果は一定
ということを条件づけています。
実際にありそうシチュエーションとしては、アプリ利用有りでも毎日利用している人もいれば、月に1回しか利用していない人もいます。この場合、ポテンシャルアウトカムの体重増減は一意に定まらない可能性があります。

つまり、意味のある効果検証を行うためには、ポテンシャルアウトカムが一定に推定できるように、介入変数(アプリ利用)の定義を、しっかり行う必要があるということです。

ダイエットアプリの例で言えば、アプリ利用の有無ではなく、利用頻度等で定義づける必要があるかもしれません。

詳細は、krskさんの記事
https://www.krsk-phs.com/entry/consistency
が参考になります。

DAGと交絡因子

Exchangebility(交換可能性)が必要な条件ということを述べてきましたが、
これがどのような状態のときに成立するでしょうか?

今シリーズで生成されている疑似データについて、変数の関係をダイアグラムで図示してみましょう。(これをDAGといいます。)

問題は、 L((性別,年代,体重,食習慣))がT((アプリ利用))にも、Y((体重増減))にも影響を及ぼしていることです。このような変数を、交絡因子とい言います。
Lを条件づければ、T((アプリ利用))の有無の違いによる、ピュアなY((体重増減))を評価できるようになります。(アプリ利用集団と非利用集団のポテンシャルアウトカムが交換可能になる。)

正しく条件づければ、下記のDAGのイメージのように、Lの影響を排除して、TによるYの効果が測定できます。

交換可能性を成立させるために必要なことは、DAGを記述して条件づけするための因子を特定することです。

疑似データにおいては、背後のデータ生成のモデルがわかっているため、交絡因子の特定が可能です。しかし実務においては、基本的には、システマティックにDAG(モデル)を求めることはできません。私の経験上でいえば、DAGの定義は、扱うドメイン知識の有識者と相談しながら決めていきました。前職においても、ヘルスケアアプリの効果検証の結果を学会発表したり、論文化したりすることがありましたが、その際は、医師に監修をしてもらっていまいした。

次回

観察データによる、因果推論を行うためのポテンシャルアウトカムフレームワークについて説明してきました。必要な前提条件が3つあり、この3つの条件(Exchangebility、Positivity、Consistency)が成立して、初めて因果推論が可能になります。疑似データにおいては、背景のモデルを自分で定義しているので、この3条件は成立していることはわかっています。

次回は疑似データにおいて、交絡因子を調整して、ダイエットアプリの効果を推定する1つ目の方法として「回帰分析」を取り上げます。

引き続き、因果推論の手法について学んでいきましょう!

一緒に働く仲間を探しています!

Ubie Discoveryは、「テクノロジーで適切な医療に導く」ことをミッションとしています。
このミッションをデータドリブンで実現することを目指しています。
そのためには、データアナリスト、アナリティクスエンジニア、データエンジニアの力が必要です。
そこで、私たちは一緒に働く仲間を募集しています!

興味のある方は下記JDから直接応募していただいても良いですし、一度カジュアルにお話したい方はそれぞれのメンバーと話せるカジュアル面談ページがあるのでぜひお気軽にご連絡ください。

https://recruit.ubie.life/jd_dev/eng_analytics
https://recruit.ubie.life/jd_dev/eng_data
https://recruit.ubie.life/jd_dev/eng_dataanalyst
https://youtrust.jp/recruitment_posts/66409c1aa5e042b45e1e581b6357dcd9
https://youtrust.jp/recruitment_posts/c19393ba65b2921c764e35a760269869

最近soの制度もupdateされました。より魅力的なsoに生まれ変わってます!
https://prtimes.jp/main/html/rd/p/000000051.000048083.html

Ubie テックブログ

Discussion