ゴールデンウィークの握手会が延期になり気力が完全に尽きてしまい(そもそも2020年のほとんどのイベントが延期または中止になっているわけですが),同じく握手会が延期になった友人と「アイドルとシロクマのことを考えないでください状態になっていてつらい」「何か没頭できる事は無いの」という話になった結果,「効果検証入門」を読んだ.
「どうせ読むのならば短期集中で」ということで,一日目午後に1章と2章,二日目午前に3章,午後に4章,三日目午前に5章のペースで Zoom で交互に節単位を音読しながら進めた.2020年,30歳を過ぎて音読.
感想
数学力が低い自分でわかった気分になれる,非常に参考になった.明日からでも試したい.随所に「実際のビジネスの現場ではこんな滅茶苦茶なことが行われている」という記述が出てくるので考えさせられてしまう.「正しい効果を知るインセンティブとは何か?」に最後の章で触れていたのも良かった.耳が痛い.
脱落変数バイアスの概念はとても面白かったし,Difference-in-Differences はシンプルながら (その分平行トレンド仮定が強力ですが) 試したいと思えた.反対に causalimpact についてはそこまでモチベーションが湧かなかった.十分に学習された予測器にもとづいて何かをする,というのがどうにも受け入れにくい.回帰不連続デザインは話としては面白そうに見えたものの,「単に回帰をする」という話になっていて肩透かしを感じた.
そもそもが本書で紹介されているテクニックはどれも比較的シンプルでありながら多くの仮定のもとに成り立っており, AUC や Prec/Recall のようになんらかの定量的な「確からしさ」が出るわけでなく,セレクションバイアスは正負どちらにも発生するため,非常に扱いが難しいように思う.「今回の施策による効果量は『〜〜〜』という仮定が成立すると考えて計算していますが,『〜〜〜』というバイアスが排除しきれていない事は念頭に置かねばなりません.ですが,何も考えずに推定するよりは確からしいと考えられます」といったように,多くの留保にもとづいて説明するのが因果推論を用いた分析において取るべき態度なのでしょう.
いくつかのトピック,たとえば Conditional Independence Assumption や Post treatment bias や Bayesian Structual Time Series Model や合成コントロールについてはより詳しく知りたくなりました.また,因果ダイヤグラムやバックドア基準という単語も本文には登場しなかったので次はそのあたりを知っていきたい.
次は星野崇宏「調査観察データの統計科学」やPearl「入門 統計的因果推論」や岩波データサイエンス Vol.3や宮川雅巳「統計的因果推論」を読むべきなのでしょうが全部会社に置いたままです.
Python による実装
ybenjo/cibook_by_python にアップロードしました.注意点を書きます.
- タイトルに「ほぼ」と入れたのは以下の実装を行っていないため
- 各種図表の描画
- 4章の
causalimpact
を用いた実験 - 5章の Nonparametric RDD の実験
- セレクションバイアスを発生させたメールデータの値が本文と一致せず,かつ,乱数の seed によっては本来の値とは逆のセレクションバイアスが発生してしまう
RData
の読み込みは ofajardo/pyreadr が良かった3.4.4
の傾向スコアの推定において本文ではre74
とre75
の二乗を共変量に追加しているが,実験したところ傾向スコアが著しく悪化したために除外した- 「効果検証入門」をPythonで書いた - Qiitaの人の実装でも含まれていない
- 傾向スコアマッチングは greedy にやってしまった
- 本来ならば二部グラフの最大重みマッチングで解けると思うのですが,Google の OR-Tools の LinearSumAssignmentではなぜか左右の node 数が異なると
INFEASIBLE
しか返さなくなり, NetworkX の Hopcroft–Karp も SciPy の maximum_bipartite_matching も上手く動かずに諦めた
- 本来ならば二部グラフの最大重みマッチングで解けると思うのですが,Google の OR-Tools の LinearSumAssignmentではなぜか左右の node 数が異なると
- pandas の使い方が全く分からなくて途中で挫折した.
groupby()
してsum()
した結果の加工が本当に分かっていない - R と違って欠損のある行を明示的に除外している
誤植・不明点
他の人も指摘しているかも知れないけれどネタバレが怖くて他人のエントリを読んでいない.自分の勘違いも多く含んでいると思う.
- 著者の実装は R を用いているわけですが,目的変数または説明変数に
NA
を含んだ場合,その行を除外して推定を行うのがデフォルトの挙動だと思うが,欠損値のある行を消してしまうのは新たなバイアスを産むのではないか - p31
recencyが3より小さい場合
は6より小さい場合
の誤り - p55 は の誤り
- 関連して p57 の はすべて
- p87
相関が強いと分子は0に近づき
は相関が強いと分母は0に近づき
の誤り - p108
共変量のバランス
における平均の差をその標準偏差で割った
のその
がよくわからない.検索したところこの値は Cohen の d と呼ばれているらしい- 自分の実装では一部の共変量がバランスしないままだった.そういうこともあると思いたい
- p141
よって,この分析の結果による効果量はそれらの差分をとって-1,554若しくは-43%ということになり
は何に対して-43%
なのか,分母は何なのかが明示されていないために分からない p1421853年の〜
という記述は全て1854年
- 水源の変化が発生したのはやはり1853年なのでこの指摘は誤りと思うが,とはいえ死者数は1854年のものを用いているように思う
- 正確には下記論文にて1853年1854年両方の死者数が記載されている
- 本文中の
D53
という変数が誤りなのでは - ここ適切な訂正が欲しいですね
- ジョン・スノウ John Snow 水上茂樹訳 コレラの伝染様式について ON THE MODE OF COMMUNICATION OF CHOLERA (1854),青空文庫にありましたがこの時代にこういう調査をやろうとした John Snow 氏は凄い
- p151
Cigar
データセットの導入が面倒だったので github の著者レポジトリで配布して欲しいと思いましたがライセンスが GPL2 だから無理なのでしょうか- なぜか自分が構築したさまざまな R の環境では
Ecdat
パッケージのインストールに失敗し続けた - 最終的に RStudio Cloud 上でデータを抽出
- なぜか自分が構築したさまざまな R の環境では
- p156 著者実装
ch4_did.R
のcausalimpact
のselect
はdplyr::
で名前空間を指定しないとエラーが出る - p176 nonparametric RDD の説明がされておらず,このモデルは一体何を行っているのかが全くわからない
- p180
5.4.1
- 二つの施策を行う状況はそもそも RDD と関係無いのでは
- では施策以外で非連続になる状況は何か