From 13350b684061f69177034118dae2de3a7db4cf39 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 18 Oct 2026 16:59:03 +0000 Subject: [PATCH 1/7] Make the docked sidebar resizable --- book/_quarto.yml | 1 + book/sidebar-resize.html | 44 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 book/sidebar-resize.html diff --git a/book/_quarto.yml b/book/_quarto.yml index c2dfeb9..cc4c66c 100644 --- a/book/_quarto.yml +++ b/book/_quarto.yml @@ -110,6 +110,7 @@ format: html-math-method: mathjax df-print: default link-external-newwindow: true + include-after-body: sidebar-resize.html include-in-header: - text: | diff --git a/book/sidebar-resize.html b/book/sidebar-resize.html new file mode 100644 index 0000000..d3ddf3d --- /dev/null +++ b/book/sidebar-resize.html @@ -0,0 +1,44 @@ + From 2c7879d8114cbc7a97282997429628b272c95328 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 18 Oct 2026 16:59:03 +0000 Subject: [PATCH 2/7] Rework landing hero layout and add a further reading section --- book/index.qmd | 48 +++++++--- book/styles-dark.scss | 19 ++++ book/styles.scss | 202 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 255 insertions(+), 14 deletions(-) diff --git a/book/index.qmd b/book/index.qmd index 72e7376..772cf5a 100644 --- a/book/index.qmd +++ b/book/index.qmd @@ -6,18 +6,26 @@ aliases: ```{=html}
- 가짜연구소 인과추론팀 로고 -
- 가짜연구소 Pseudo Lab - - 인과추론팀 Causal-Lab +
+
+ 가짜연구소 Pseudo Lab + + 인과추론팀 Causal-Lab +
+

Python으로 하는
인과추론

+

Causal Inference for The Brave and True 한국어판. 인과추론의 기초부터 실무 응용까지, 모든 실습을 파이썬으로.

+
-

Python으로 하는
인과추론

-

Causal Inference for The Brave and True 한국어판. 인과추론의 기초부터 실무 응용까지, 모든 실습을 파이썬으로.

- ``` @@ -30,6 +38,24 @@ aliases: 원서는 가볍지만 엄밀하게 효과 추정을 배우는 책입니다. 모든 실습을 파이썬으로 하고, 저자가 찾을 수 있는 밈은 최대한 넣었습니다. 딱딱한 교과서보다는 옆자리 동료가 설명해 주는 느낌으로 읽어 주세요. +```{=html} + +``` + ## 이 책의 구성 원서의 25개 장과 부록 5편을 모두 옮겼습니다. diff --git a/book/styles-dark.scss b/book/styles-dark.scss index ebcf6fa..2ce1863 100644 --- a/book/styles-dark.scss +++ b/book/styles-dark.scss @@ -78,3 +78,22 @@ body { .page-navigation .nav-page a:hover { background: rgba(180, 165, 234, 0.12); } + +.further { + background: rgba(169, 150, 214, 0.08); + border-color: rgba(169, 150, 214, 0.25); +} + +.further .further-lead, +.further .further-title { + color: #eceaff; +} + +.further .further-card { + background: #1b1d2a; + border-color: #2b2e40; +} + +.further .further-tag { + color: #b4a5ea; +} diff --git a/book/styles.scss b/book/styles.scss index d4d6bd1..72617ee 100644 --- a/book/styles.scss +++ b/book/styles.scss @@ -157,15 +157,132 @@ details.code-fold > summary { linear-gradient(135deg, $navy 0%, $indigo 60%, #5a4fb0 100%); } +.hero { + display: flex; + align-items: flex-start; + gap: 2rem; +} + +.hero .hero-main { + flex: 1 1 auto; + min-width: 0; +} + +.hero .hero-aside { + flex: 0 0 200px; + display: flex; + flex-direction: column; + align-items: center; + gap: 1.1rem; +} + .hero .hero-mark { - position: absolute; - right: 1.6rem; - top: 1.4rem; width: 130px; opacity: 0.95; filter: drop-shadow(0 12px 24px rgba(0, 0, 0, 0.25)); } +.hero .hero-links { + display: flex; + flex-direction: column; + gap: 0.5rem; + width: 100%; +} + +.hero .hero-links a { + display: flex; + align-items: center; + gap: 0.55rem; + padding: 0.5rem 0.75rem; + border-radius: 12px; + background: rgba(255, 255, 255, 0.1); + border: 1px solid rgba(255, 255, 255, 0.22); + color: #fff; + font-size: 0.84rem; + font-weight: 600; + text-decoration: none; + backdrop-filter: blur(4px); + transition: background 0.15s ease, transform 0.15s ease; +} + +.hero .hero-links a:hover { + background: rgba(255, 255, 255, 0.2); + transform: translateY(-1px); +} + +.hero .hero-links .tag { + flex: none; + padding: 0.1rem 0.45rem; + border-radius: 6px; + background: rgba(255, 255, 255, 0.9); + color: $navy; + font-size: 0.72rem; + font-weight: 750; +} + +.hero .hero-links .name { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +// 들어가며: 함께 보면 좋은 자료 +.further { + margin: 1.6rem 0 2.2rem; + padding: 1.3rem 1.4rem 1.4rem; + border-radius: 16px; + background: $lavender-soft; + border: 1px solid rgba($lavender, 0.45); +} + +.further .further-lead { + margin: 0 0 1rem; + font-weight: 600; + color: $navy; +} + +.further .further-cards { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); + gap: 0.8rem; +} + +.further .further-card { + display: flex; + flex-direction: column; + gap: 0.35rem; + padding: 1rem 1.1rem; + border-radius: 12px; + background: $body-bg; + border: 1px solid rgba($indigo, 0.15); + text-decoration: none; + transition: border-color 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease; +} + +.further .further-card:hover { + border-color: $indigo; + box-shadow: 0 8px 22px rgba($navy, 0.12); + transform: translateY(-2px); +} + +.further .further-tag { + font-size: 0.78rem; + font-weight: 700; + color: $indigo; +} + +.further .further-title { + font-weight: 750; + color: $navy; + line-height: 1.4; +} + +.further .further-desc { + font-size: 0.9rem; + line-height: 1.65; + color: $body-color; +} + .hero .hero-title { margin: 0; @@ -250,9 +367,24 @@ details.code-fold > summary { .hero { padding: 1.8rem 1.4rem; } + .hero { + flex-direction: column; + gap: 1.2rem; + } + .hero .hero-aside { + flex: none; + width: 100%; + } .hero .hero-mark { display: none; } + .hero .hero-links { + flex-direction: row; + flex-wrap: wrap; + } + .hero .hero-links a { + flex: 1 1 180px; + } .hero .hero-title { font-size: 1.8rem; } @@ -486,3 +618,67 @@ main.content .quarto-figure img, margin-left: auto; margin-right: auto; } + +// 목차 너비 조절: 넓은 화면에서만, 손잡이를 끌어 바꾸고 브라우저에 기억 +@media (min-width: 992px) { + body.docked #quarto-content.page-columns { + grid-template-columns: + [screen-start] var(--sidebar-w, 290px) + [screen-start-inset page-start page-start-inset body-start-outset] 1.5em + [body-start] 1.5em + [body-content-start] minmax(500px, calc(1000px - 3em)) + [body-content-end] 1.5em + [body-end] 50px + [body-end-outset] minmax(50px, 100px) + [page-end-inset] 50px + [page-end] 5fr + [screen-end-inset] 1.5em + [screen-end]; + } + body.docked .sidebar.sidebar-navigation { + grid-column: screen-start / screen-start-inset; + } + #quarto-sidebar .sidebar-menu-container { + min-width: 0; + white-space: normal; + } + .sidebar-resizer { + position: fixed; + top: 0; + bottom: 0; + left: calc(var(--sidebar-w, 290px) - 4px); + width: 8px; + cursor: col-resize; + z-index: 1040; + } + .sidebar-resizer::after { + content: ""; + position: absolute; + top: 0; + bottom: 0; + left: 3px; + width: 2px; + background: transparent; + transition: background 0.15s ease; + } + .sidebar-resizer:hover::after, + body.sidebar-resizing .sidebar-resizer::after { + background: $lavender; + } + body.sidebar-resizing { + cursor: col-resize; + user-select: none; + } +} +@media (max-width: 991.98px) { + .sidebar-resizer { + display: none; + } +} + +// 폭이 넓은 수식은 본문 밖으로 넘치지 않고 가로로 스크롤 +mjx-container[display="true"] { + overflow-x: auto; + overflow-y: hidden; + max-width: 100%; +} From b142aa104c86d20101739cddb1e59664b9cb2149 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 18 Oct 2026 16:59:03 +0000 Subject: [PATCH 3/7] Add banner to README --- README.md | 2 ++ book/assets/readme-banner.png | Bin 0 -> 47700 bytes 2 files changed, 2 insertions(+) create mode 100644 book/assets/readme-banner.png diff --git a/README.md b/README.md index 0d5c68b..d252491 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ Matheus Facure의 [Causal Inference for The Brave and True](https://matheusfacure.github.io/python-causality-handbook/landing-page.html) 한국어판입니다. +Python으로 하는 인과추론 웹북 + [![DOI](https://zenodo.org/badge/255903310.svg)](https://zenodo.org/badge/latestdoi/255903310) **[웹북으로 읽기](https://causalinferencelab.github.io/Causal-Inference-with-Python/)** · [번역 가이드](TRANSLATION_GUIDE.md) · [오류 제보](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/issues) diff --git a/book/assets/readme-banner.png b/book/assets/readme-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..08e9a887c303d592a602fa92a98ad73c28b2fe01 GIT binary patch literal 47700 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

{rq65LO=?<;B3Rf69GlHl>o>Y0L}e8AM^# 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 literal 0 HcmV?d00001 From b33536fa3793a4c39bafd62dbb723b4283982dfc Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 18 Oct 2026 17:03:17 +0000 Subject: [PATCH 4/7] Polish translation for readability across all chapters Split overlong sentences, remove literal phrasing carried over from English, and fix a few subject-predicate mismatches. Meaning, terms and math are unchanged. --- .../01-Introduction-To-Causality.ipynb | 18 ++++++------- .../02-Randomised-Experiments.ipynb | 14 +++++----- ...s-Review-The-Most-Dangerous-Equation.ipynb | 14 +++++----- .../04-Graphical-Causal-Models.ipynb | 20 +++++++------- ...e-Effectiveness-of-Linear-Regression.ipynb | 14 +++++----- .../06-Grouped-and-Dummy-Regression.ipynb | 12 ++++----- .../07-Beyond-Confounders.ipynb | 18 ++++++------- .../08-Instrumental-Variables.ipynb | 26 +++++++++---------- .../09-Non-Compliance-and-LATE.ipynb | 20 +++++++------- .../10-Matching.ipynb | 18 ++++++------- .../11-Propensity-Score.ipynb | 10 +++---- .../12-Doubly-Robust-Estimation.ipynb | 4 +-- .../13-Difference-in-Differences.ipynb | 10 +++---- .../14-Panel-Data-and-Fixed-Effects.ipynb | 16 ++++++------ .../15-Synthetic-Control.ipynb | 8 +++--- .../16-Regression-Discontinuity-Design.ipynb | 10 +++---- .../17-Predictive-Models-101.ipynb | 8 +++--- ...reatment-Effects-and-Personalization.ipynb | 8 +++--- .../19-Evaluating-Causal-Models.ipynb | 20 +++++++------- .../20-Plug-and-Play-Estimators.ipynb | 16 ++++++------ .../21-Meta-Learners.ipynb | 10 +++---- ...Debiased-Orthogonal-Machine-Learning.ipynb | 20 +++++++------- ...ffect-Heterogeneity-and-Nonlinearity.ipynb | 18 ++++++------- .../24-The-Diff-in-Diff-Saga.ipynb | 12 ++++----- .../25-Synthetic-Diff-in-Diff.ipynb | 18 ++++++------- ...rmal-Inference-for-Synthetic-Control.ipynb | 16 ++++++------ .../Debiasing-with-Orthogonalization.ipynb | 18 ++++++------- .../Debiasing-with-Propensity-Score.ipynb | 18 ++++++------- ...Prediction-Metrics-For-Causal-Models.ipynb | 2 +- .../When-Prediction-Fails.ipynb | 26 +++++++++---------- 30 files changed, 221 insertions(+), 221 deletions(-) diff --git a/causal-inference-for-the-brave-and-true/01-Introduction-To-Causality.ipynb b/causal-inference-for-the-brave-and-true/01-Introduction-To-Causality.ipynb index 6371882..6a0a6dd 100644 --- a/causal-inference-for-the-brave-and-true/01-Introduction-To-Causality.ipynb +++ b/causal-inference-for-the-brave-and-true/01-Introduction-To-Causality.ipynb @@ -15,11 +15,11 @@ "\n", "하버드 비즈니스 리뷰(Harvard Business Review)는 데이터 과학자를 [21세기 가장 섹시한 직업](https://hbr.org/2012/10/data-scientist-the-sexiest-job-of-the-21st-century)이라고 불렀습니다. 빈말이 아니었습니다. 지난 10년 동안 데이터 과학자는 줄곧 스포트라이트를 받았습니다. AI 전문가들은 [스포츠 슈퍼스타에 버금가는 연봉](https://www.economist.com/business/2016/04/02/million-dollar-babies)을 받았습니다. 명성과 부를 좇아 수많은 젊은 인재가 데이터 과학자라는 직함을 하루라도 빨리 얻으려고 광풍 같은 골드러시에 뛰어들었습니다. 이 열풍을 타고 완전히 새로운 산업들이 생겨났습니다. 수학 공식 하나 보여주지 않고도 데이터 과학자로 만들어 주겠다는 기적의 교수법이 등장했고, 컨설팅 전문가들은 회사가 데이터의 잠재력을 끌어내기만 하면 수백만 달러를 벌 수 있다고 약속했습니다. AI, 즉 머신러닝은 새로운 전기로, 데이터는 새로운 석유로 불렸습니다.\n", "\n", - "그동안 경제학자들은 교육이 소득에 미치는 진짜 영향이 무엇인지 답하려 했고, 생물통계학자들은 포화지방이 심장마비 위험을 높이는지 알아내려 했으며, 심리학자들은 다정한 말 한마디가 정말로 결혼 생활을 더 행복하게 만드는지 밝히려 했습니다. 그런데 정작 처음부터 줄곧 데이터로 '구식' 과학을 해 온 이들은 잊고 있었습니다. 솔직히 말하면 데이터 과학은 새로 생긴 분야가 아닙니다. 언론이 엄청난 공짜 홍보를 쏟아부은 덕분에 이제야 사람들이 알아보게 되었을 뿐입니다.\n", + "그동안 경제학자들은 교육이 소득에 미치는 진짜 영향이 무엇인지 답하려 했고, 생물통계학자들은 포화지방이 심장마비 위험을 높이는지 알아내려 했으며, 심리학자들은 다정한 말 한마디가 정말로 결혼 생활을 더 행복하게 만드는지 밝히려 했습니다. 그런데 정작 우리는 처음부터 줄곧 데이터로 '구식' 과학을 해 온 이들을 잊고 있었습니다. 솔직히 말하면 데이터 과학은 새로 생긴 분야가 아닙니다. 언론이 엄청난 공짜 홍보를 쏟아부은 덕분에 이제야 사람들이 알아보게 되었을 뿐입니다.\n", "\n", "Jim Collins의 비유를 빌려 보겠습니다. 가장 좋아하는 맥주를 얼음처럼 차갑게 한 잔 따른다고 상상해 보세요. 제대로 따르면 잔은 대부분 맥주로 채워지고, 맨 위에는 손가락 하나 두께의 거품이 덮입니다. 이 잔이 바로 데이터 과학입니다.\n", "\n", - "1. 맥주. 통계적 기초, 과학적 호기심, 복잡한 문제를 향한 열정입니다. 이 모든 것은 수백 년에 걸쳐 그 가치를 증명해 왔습니다.\n", + "1. 맥주. 통계적 기초, 과학적 호기심, 복잡한 문제를 향한 열정입니다. 모두 수백 년에 걸쳐 가치를 증명해 온 것들입니다.\n", "2. 거품. 이 폭신한 부분은 결국 사라질 비현실적인 기대 위에 쌓여 있습니다.\n", "\n", "이 거품은 생각보다 훨씬 빨리 꺼질지도 모릅니다. 『이코노미스트(The Economist)』는 이렇게 말합니다.\n", @@ -28,7 +28,7 @@ "\n", "이 모든 광풍 속에서 데이터 과학자로서, 아니 더 나아가 '그냥' 과학자로서 무엇을 해야 할까요? 현명하다면 우선 거품을 무시하는 법부터 배울 겁니다. 우리가 원하는 건 맥주입니다. 수학과 통계학은 언제나 쓸모가 있었고, 이제 와서 그 쓸모가 사라질 리도 없습니다. 둘째, 아무도 제대로 쓸 줄 모르는 반짝이는 최신 도구 말고, 여러분의 일을 가치 있게 만드는 것이 무엇인지 배우세요.\n", "\n", - "마지막으로 중요한 것은, 지름길은 없다는 사실입니다. 수학과 통계학 지식이 가치 있는 이유는 바로 익히기 어렵기 때문입니다. 누구나 할 수 있다면 공급이 넘쳐서 그 값어치가 떨어질 테니까요. 그러니 **독하게 마음먹으세요**! 할 수 있는 한 제대로 배우세요. 그리고 기왕 하는 거, 즐기지 못할 이유도 없지 않을까요? 오직 **용감하고 진실한 자들을 위한** 이 모험에 함께 나서며 재미도 놓치지 맙시다.\n", + "마지막으로 꼭 기억할 점은 지름길이 없다는 사실입니다. 수학과 통계학 지식이 가치 있는 이유는 바로 익히기 어렵기 때문입니다. 누구나 할 수 있다면 공급이 넘쳐서 그 값어치가 떨어질 테니까요. 그러니 **독하게 마음먹으세요**! 할 수 있는 한 제대로 배우세요. 그리고 기왕 하는 거, 즐기지 못할 이유도 없지 않을까요? 오직 **용감하고 진실한 자들을 위한** 이 모험에 함께 나서며 재미도 놓치지 맙시다.\n", "\n", "![img](./data/img/intro/tougher-up-cupcake1.jpg)\n", "\n", @@ -38,7 +38,7 @@ "\n", "하지만 ML은 만병통치약이 아닙니다. 엄격한 경계 안에서는 놀라운 성능을 내다가도, 데이터가 모델이 익숙한 범위에서 조금만 벗어나면 처참하게 실패할 수 있습니다. 『예측 기계』에 나오는 다른 예를 들어 보겠습니다. \"많은 산업에서 낮은 가격은 낮은 판매량과 연관되어 있습니다. 예를 들어 호텔 업계에서는 관광 비수기에는 가격이 낮고, 수요가 가장 많아 호텔이 꽉 차는 시기에는 가격이 높습니다. 이런 데이터만 주어지면 순진한 예측은 가격을 올릴수록 객실이 더 많이 팔린다고 말할지도 모릅니다.\"\n", "\n", - "ML은 이처럼 인과의 방향을 거꾸로 읽게 되는 문제에 약하기로 악명이 높습니다. 이런 문제는 경제학자들이 반사실(counterfactual)이라고 부르는 '만약에' 질문에 답하기를 요구합니다. 지금 내 상품에 매긴 가격 대신 다른 가격을 매기면 어떻게 될까요? 지금 하고 있는 저지방 식단 대신 저당 식단을 하면 어떻게 될까요? 은행에서 대출 업무를 한다면, 고객의 신용 한도를 바꿨을 때 수익이 어떻게 달라지는지 알아내야 합니다. 지방자치단체에서 일한다면 학교 교육을 개선할 방법을 찾아 달라는 요청을 받을 수도 있습니다. 디지털 지식의 시대라고들 하니 모든 아이에게 태블릿을 나눠 줘야 할까요? 아니면 옛날식 도서관을 지어야 할까요?\n", + "ML은 이처럼 인과의 방향을 거꾸로 읽게 되는 문제에 약하기로 악명이 높습니다. 이런 문제를 풀려면 경제학자들이 반사실(counterfactual)이라고 부르는 '만약에' 질문에 답해야 합니다. 지금 내 상품에 매긴 가격 대신 다른 가격을 매기면 어떻게 될까요? 지금 하고 있는 저지방 식단 대신 저당 식단을 하면 어떻게 될까요? 은행에서 대출 업무를 한다면, 고객의 신용 한도를 바꿨을 때 수익이 어떻게 달라지는지 알아내야 합니다. 지방자치단체에서 일한다면 학교 교육을 개선할 방법을 찾아 달라는 요청을 받을 수도 있습니다. 디지털 지식의 시대라고들 하니 모든 아이에게 태블릿을 나눠 줘야 할까요? 아니면 옛날식 도서관을 지어야 할까요?\n", "\n", "이런 질문의 핵심에는 우리가 답을 알고 싶은 인과적 물음이 있습니다. 인과적 질문은 매출을 올리는 방법을 찾는 것처럼 일상적인 문제 곳곳에 스며 있습니다. 그리고 아주 개인적이고 소중한 고민에서도 중요한 역할을 합니다. 인생에서 성공하려면 비싼 학교에 가야 할까요(교육이 소득을 높일까요)? 이민자가 늘면 내가 일자리를 구할 가능성이 낮아질까요(이민이 실업률을 높일까요)? 가난한 사람들에게 현금을 지원하면 범죄율이 낮아질까요? 어떤 분야에 있든 상관없습니다. 어떤 형태로든 인과적 질문에 답해야 했거나 앞으로 답해야 할 가능성이 매우 큽니다. ML에게는 안타까운 일이지만, 이런 질문을 풀 때는 상관관계에 기반한 예측에 기댈 수 없습니다.\n", "\n", @@ -149,7 +149,7 @@ "멀리멀리 바라보았습니다. \n", "\n", "\n", - "이 문제를 이해하기 위해 앞으로 **잠재적 결과**(potential outcome)라는 관점에서 많이 이야기할 것입니다. '잠재적'이라고 부르는 이유는 실제로 일어나지 않았기 때문입니다. 잠재적 결과는 어떤 처치를 받았다면 **일어났을 일**을 나타냅니다. 잠재적 결과 가운데 실제로 일어난 것을 사실적 결과(factual outcome), 일어나지 않은 것을 반사실적 결과라고 부르기도 합니다.\n", + "이 문제를 이해하기 위해 앞으로 **잠재적 결과**(potential outcome)라는 관점으로 자주 이야기하겠습니다. '잠재적'이라고 부르는 이유는 실제로 일어나지 않았기 때문입니다. 잠재적 결과는 어떤 처치를 받았다면 **일어났을 일**을 나타냅니다. 잠재적 결과 가운데 실제로 일어난 것을 사실적 결과(factual outcome), 일어나지 않은 것을 반사실적 결과라고 부르기도 합니다.\n", "\n", "표기법으로는 아래첨자를 하나 더 붙입니다.\n", "\n", @@ -417,7 +417,7 @@ "\n", "편향(bias)은 연관관계와 인과관계를 다르게 만드는 요소입니다. 다행히 편향은 직관으로 쉽게 이해할 수 있습니다. 교실의 태블릿 예시를 다시 떠올려 봅시다. 학생들에게 태블릿을 주는 학교의 시험 점수가 더 높다는 주장을 들으면, 그런 학교는 태블릿이 없어도 어차피 점수가 높았을 것이라고 반박할 수 있습니다. 그런 학교는 다른 학교보다 돈이 많을 가능성이 크고, 그래서 더 좋은 교사를 채용하고 더 좋은 교실을 갖출 수 있기 때문입니다. 결국 처치를 받은 학교(태블릿이 있는 학교)와 처치를 받지 않은 학교는 비교할 수 없습니다.\n", "\n", - "잠재적 결과 표기법으로 말하면, 실험군의 $Y_0$가 대조군의 $Y_0$와 다르다는 뜻입니다. 실험군의 $Y_0$는 **반사실**이라는 점을 기억하세요. 관측할 수는 없지만 추론할 수는 있습니다. 이 경우에는 세상이 돌아가는 방식에 대한 이해를 활용해 한 걸음 더 나아갈 수도 있습니다. 아마도 실험군의 $Y_0$가 대조군 학교의 $Y_0$보다 클 것이라고 말할 수 있습니다. 아이들에게 태블릿을 줄 여유가 있는 학교라면 시험 점수를 높이는 다른 요소에도 돈을 쓸 여유가 있을 테니까요. 잠시 이 내용을 곱씹어 보세요. 잠재적 결과로 이야기하는 데 익숙해지려면 시간이 좀 걸립니다. 이 문단을 다시 읽고 확실히 이해했는지 확인하세요.\n", + "잠재적 결과 표기법으로 말하면, 실험군의 $Y_0$가 대조군의 $Y_0$와 다르다는 뜻입니다. 실험군의 $Y_0$는 **반사실**이라는 점을 기억하세요. 관측할 수는 없지만 추론할 수는 있습니다. 이 경우에는 세상이 돌아가는 방식을 알고 있으니 한 걸음 더 나아갈 수도 있습니다. 아마도 실험군의 $Y_0$가 대조군 학교의 $Y_0$보다 클 것이라고 말할 수 있습니다. 아이들에게 태블릿을 줄 여유가 있는 학교라면 시험 점수를 높이는 다른 요소에도 돈을 쓸 여유가 있을 테니까요. 잠시 이 내용을 곱씹어 보세요. 잠재적 결과로 이야기하는 데 익숙해지려면 시간이 좀 걸립니다. 이 문단을 다시 읽고 확실히 이해했는지 확인하세요.\n", "\n", "이를 염두에 두면 연관관계가 인과관계가 아닌 이유를 간단한 수학으로 보일 수 있습니다. 연관관계는 $E[Y|T=1] - E[Y|T=0]$로 측정합니다. 이 예시에서는 태블릿이 있는 학교의 평균 시험 점수에서 태블릿이 없는 학교의 평균 시험 점수를 뺀 값입니다. 반면 인과관계는 $E[Y_1 - Y_0]$로 측정합니다.\n", "\n", @@ -481,7 +481,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "문제를 이해했으니 이제 해결책을 살펴봅시다. 연관관계가 인과관계와 같아지려면 무엇이 필요한지도 말할 수 있습니다. **$E[Y_0|T=0] = E[Y_0|T=1]$이면, 연관관계가 곧 인과관계입니다!** 이를 이해한다는 것은 단순히 식을 외우는 것이 아닙니다. 여기에는 강력한 직관이 담겨 있습니다. $E[Y_0|T=0] = E[Y_0|T=1]$이라는 말은 처치 이전에 실험군과 대조군을 비교할 수 있다는 뜻입니다. 달리 말하면, 실험군이 처치를 받지 않았을 때의 $Y_0$를 관측할 수 있다면 그 결과는 대조군과 같을 것이라는 뜻입니다. 수학적으로는 편향 항이 사라집니다.\n", + "문제를 이해했으니 이제 해결책을 살펴봅시다. 연관관계가 인과관계와 같아지려면 무엇이 필요한지도 말할 수 있습니다. **$E[Y_0|T=0] = E[Y_0|T=1]$이면, 연관관계가 곧 인과관계입니다!** 이 식은 외우고 끝낼 대상이 아닙니다. 여기에는 강력한 직관이 담겨 있습니다. $E[Y_0|T=0] = E[Y_0|T=1]$이라는 말은 처치 이전에 실험군과 대조군을 비교할 수 있다는 뜻입니다. 달리 말하면, 실험군이 처치를 받지 않았을 때의 $Y_0$를 관측할 수 있다면 그 결과는 대조군과 같을 것이라는 뜻입니다. 수학적으로는 편향 항이 사라집니다.\n", "\n", "$\n", "E[Y|T=1] - E[Y|T=0] = E[Y_1 - Y_0|T=1] = ATT\n", @@ -516,7 +516,7 @@ "두 그룹 간 결과 차이에는 두 가지 원인이 있을 수 있다는 점에 주목하세요.\n", "\n", "1. 처치효과. 아이들에게 태블릿을 주어서 시험 점수가 오른 부분입니다.\n", - "2. 시험 점수 차이의 일부는 더 나은 교육을 위한 등록금 차이 때문일 수 있습니다. 이 경우 실험군의 등록금이 훨씬 비싸기 때문에 실험군과 대조군이 다릅니다. 실험군과 대조군 사이의 이런 다른 차이들은 처치 그 자체가 아닙니다.\n", + "2. 시험 점수 차이의 일부는 더 나은 교육을 위한 등록금 차이 때문일 수 있습니다. 이 경우 실험군의 등록금이 훨씬 비싸기 때문에 실험군과 대조군이 다릅니다. 실험군과 대조군 사이에는 이처럼 처치 그 자체가 아닌 다른 차이도 있습니다.\n", "\n", "개별 처치효과는 대상의 결과와, 같은 대상이 다른 처치를 받았다면 얻었을 이론적 결과 사이의 차이입니다. 진짜 처치효과는 아래 왼쪽 그림처럼 잠재적 결과를 관측할 수 있는 신과 같은 능력이 있어야만 구할 수 있습니다. 연한 색으로 표시한 점들이 반사실적 결과입니다.\n", "\n", @@ -536,7 +536,7 @@ "\n", "모든 대상이 처치를 받지 않도록 설정해 $Y_0$만 관측한다면, 실험군과 대조군 사이에서 아무런 차이도 발견되지 않을 것입니다.\n", "\n", - "인과추론이 다루는 일이 바로 이 헤라클레스급 과업입니다. 편향을 제거하고 실험군과 대조군을 비교 가능하게 만들어서, 관측되는 차이가 오직 평균 처치효과뿐이도록 하는 영리한 방법을 찾는 일입니다. 궁극적으로 인과추론은 모든 착각과 오해를 걷어 내고 세상이 실제로 어떻게 돌아가는지 알아내는 학문입니다. 이 점을 이해했으니, 이제 편향을 제거하고 인과효과를 식별하는 가장 강력한 방법들, 즉 용감하고 진실한 자들의 무기를 익히러 나아가 봅시다.\n", + "인과추론이 다루는 일이 바로 이 헤라클레스급 과업입니다. 편향을 제거하고 실험군과 대조군을 비교 가능하게 만들어서, 관측되는 차이에 평균 처치효과만 남도록 하는 영리한 방법을 찾는 일입니다. 궁극적으로 인과추론은 모든 착각과 오해를 걷어 내고 세상이 실제로 어떻게 돌아가는지 알아내는 학문입니다. 이 점을 이해했으니, 이제 편향을 제거하고 인과효과를 식별하는 가장 강력한 방법들, 즉 용감하고 진실한 자들의 무기를 익히러 나아가 봅시다.\n", "\n", "## 핵심 요약\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/02-Randomised-Experiments.ipynb b/causal-inference-for-the-brave-and-true/02-Randomised-Experiments.ipynb index 0453637..850d2a0 100644 --- a/causal-inference-for-the-brave-and-true/02-Randomised-Experiments.ipynb +++ b/causal-inference-for-the-brave-and-true/02-Randomised-Experiments.ipynb @@ -30,7 +30,7 @@ "\n", "![img](./data/img/rct/indep.png)\n", "\n", - "잠재적 결과가 처치와 독립이라는 말은 실험군에서든 대조군에서든 잠재적 결과의 기댓값이 같다는 뜻입니다. 더 쉽게 말하면 실험군과 대조군을 비교할 수 있다는 뜻입니다. 또는 누가 어떤 처치를 받았는지 알아도 처치 전 결과가 어땠는지에 관해서는 아무 정보도 얻을 수 없다는 뜻이기도 합니다. 따라서 $(Y_0, Y_1)\\perp T$는 실험군과 대조군의 결과 차이를 만드는 요인이 처치 하나뿐이라는 의미입니다. 이를 확인하려면 독립성이 바로 다음을 뜻한다는 점에 주목하세요.\n", + "잠재적 결과가 처치와 독립이라는 말은 실험군에서든 대조군에서든 잠재적 결과의 기댓값이 같다는 뜻입니다. 더 쉽게 말하면 실험군과 대조군을 비교할 수 있다는 뜻입니다. 또는 누가 어떤 처치를 받았는지 알아도 처치 전 결과가 어땠는지는 전혀 알 수 없다는 뜻이기도 합니다. 따라서 $(Y_0, Y_1)\\perp T$는 실험군과 대조군의 결과 차이를 만드는 요인이 처치 하나뿐이라는 의미입니다. 이를 확인하려면 독립성이 바로 다음을 뜻한다는 점에 주목하세요.\n", "\n", "$\n", "E[Y_0|T=0]=E[Y_0|T=1]=E[Y_0]\n", @@ -42,7 +42,7 @@ "E[Y|T=1] - E[Y|T=0] = E[Y_1 - Y_0]=ATE\n", "$\n", "\n", - "결국 랜덤화 덕분에 실험군과 대조군의 단순한 평균 차이를 구해 그것을 처치효과(treatment effect)라고 부를 수 있습니다.\n", + "결국 랜덤화 덕분에 실험군과 대조군의 단순한 평균 차이를 그대로 처치효과(treatment effect)라고 부를 수 있습니다.\n", "\n", "\n", "## 멀고 먼 학교에서\n", @@ -51,9 +51,9 @@ "\n", "위기가 시작되고 넉 달이 지나자, 많은 사람이 이런 변화를 계속 유지할 수 있을지 궁금해하기 시작했습니다. 온라인 수업에 장점이 있다는 데는 의문의 여지가 없습니다. 건물과 교통에 드는 비용을 아낄 수 있으니 더 저렴합니다. 또 디지털 환경을 십분 활용해 정해진 교사진에만 기대지 않고 전 세계의 일류 콘텐츠를 쓸 수 있습니다. 그런데도 온라인 수업이 학생들의 학업 성취도에 나쁜 영향을 주는지 좋은 영향을 주는지는 여전히 답해야 할 문제로 남아 있습니다.\n", "\n", - "이 질문에 답하는 한 가지 방법은 주로 온라인 수업을 하는 학교의 학생들과 전통적인 교실 수업을 하는 학교의 학생들을 비교하는 것입니다. 이제 다들 알다시피 이는 좋은 방법이 아닙니다. 온라인 학교에는 대면 수업을 듣더라도 평균보다 잘했을 자기 관리가 뛰어난 학생들만 모였을 수도 있습니다. 그렇다면 실험군이 대조군보다 학업 능력이 원래 더 뛰어난 양의 편향이 생깁니다. 즉, $E[Y_0|T=1] > E[Y_0|T=0]$입니다.\n", + "이 질문에 답하는 한 가지 방법은 주로 온라인 수업을 하는 학교의 학생들과 전통적인 교실 수업을 하는 학교의 학생들을 비교하는 것입니다. 이제 다들 알다시피 이는 좋은 방법이 아닙니다. 온라인 학교에는 자기 관리가 뛰어나서 대면 수업을 듣더라도 평균보다 잘했을 학생들만 모였을 수도 있습니다. 그렇다면 실험군의 학업 능력이 원래 대조군보다 뛰어나서 양의 편향이 생깁니다. 즉, $E[Y_0|T=1] > E[Y_0|T=0]$입니다.\n", "\n", - "반대로 온라인 수업은 값이 더 싸기 때문에 공부하면서 일도 해야 하는 형편이 넉넉지 않은 학생들이 주로 들을 수도 있습니다. 이 경우 이 학생들은 대면 수업을 듣더라도 대면 수업 학교의 학생들보다 성적이 낮을 것입니다. 그렇다면 실험군이 대조군보다 학업 능력이 원래 더 떨어지는, 반대 방향의 편향이 생깁니다. 즉, $E[Y_0|T=1] < E[Y_0|T=0]$입니다.\n", + "반대로 온라인 수업은 값이 더 싸기 때문에 공부하면서 일도 해야 하는 형편이 넉넉지 않은 학생들이 주로 들을 수도 있습니다. 이 경우 이 학생들은 대면 수업을 듣더라도 대면 수업 학교의 학생들보다 성적이 낮을 것입니다. 그렇다면 실험군의 학업 능력이 원래 대조군보다 떨어져서 반대 방향의 편향이 생깁니다. 즉, $E[Y_0|T=1] < E[Y_0|T=0]$입니다.\n", "\n", "그러니 단순 비교를 할 수는 있어도 설득력은 없습니다. 어느 쪽이든 편향이 숨어서 인과효과를 가리고 있지 않다고 확신할 수 없기 때문입니다.\n", "\n", @@ -355,7 +355,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "네, 정말 이게 다입니다. 대면 수업의 평균 점수는 78.54점, 온라인 수업은 73.63점입니다. 온라인 수업을 지지하는 사람들에게는 그리 반가운 소식이 아닙니다. 따라서 온라인 수업의 $ATE$는 -4.91입니다. **온라인 수업 때문에 학생들의 점수가 평균 5점 정도 낮아진다**는 뜻입니다. 더 할 일은 없습니다. 대면 수업을 들을 형편이 안 되는 가난한 학생들이 온라인 수업에 몰렸을까 봐 걱정할 필요가 없습니다. 더 나아가 처치 유형이 다른 학생들이 받은 처치 말고 다른 면에서 다를까 봐 걱정할 필요도 없습니다. 무작위 실험은 애초에 그런 차이를 없애도록 설계되어 있습니다.\n", + "네, 정말 이게 다입니다. 대면 수업의 평균 점수는 78.54점, 온라인 수업은 73.63점입니다. 온라인 수업을 지지하는 사람들에게는 그리 반가운 소식이 아닙니다. 따라서 온라인 수업의 $ATE$는 -4.91입니다. **온라인 수업 때문에 학생들의 점수가 평균 5점 정도 낮아진다**는 뜻입니다. 더 할 일은 없습니다. 대면 수업을 들을 형편이 안 되는 가난한 학생들이 온라인 수업에 몰렸을까 봐 걱정할 필요가 없습니다. 더 나아가 처치 유형이 다른 학생들끼리 받은 처치 말고 다른 면에서도 다를까 봐 걱정할 필요도 없습니다. 무작위 실험은 애초에 그런 차이를 없애도록 설계되어 있습니다.\n", "\n", "그래서 랜덤화가 제대로 이루어졌는지(또는 올바른 데이터를 보고 있는지) 점검하는 좋은 방법은 처치 전 변수에서 실험군과 대조군이 같은지 확인하는 것입니다. 이 데이터에는 성별과 인종 정보가 있어서 그룹 간에 비슷한지 확인할 수 있습니다. `gender`, `asian`, `hispanic`, `white` 변수는 꽤 비슷해 보입니다. 하지만 `black` 변수는 조금 차이가 나 보입니다. 데이터셋이 작을 때 이런 일이 생긴다는 점을 잘 보여 주는 사례입니다. 무작위로 배정하더라도 우연히 한 그룹이 다른 그룹과 다를 수 있습니다. 표본이 크면 이런 차이는 사라지는 경향이 있습니다.\n", "\n", @@ -367,14 +367,14 @@ "\n", "안타깝게도 RCT는 비용이 매우 많이 들거나 아예 비윤리적인 경우가 많습니다. 처치 배정 메커니즘을 아예 통제할 수 없을 때도 있습니다. 임신 중 흡연이 신생아 출생 체중에 미치는 영향을 추정하려는 의사라고 상상해 보세요. 임산부 일부를 무작위로 골라 임신 중에 담배를 피우라고 강요할 수는 없습니다. 또는 큰 은행에서 일하면서 신용 한도가 고객 이탈에 미치는 영향을 추정해야 한다고 해 봅시다. 고객들에게 신용 한도를 무작위로 주기에는 비용이 너무 큽니다. 최저임금 인상이 실업률에 미치는 영향을 알고 싶을 때도 마찬가지입니다. 나라마다 최저임금을 이렇게 저렇게 정하라고 배정할 수는 없습니다. 무슨 말인지 아실 겁니다.\n", "\n", - "나중에 조건부 랜덤화로 랜덤화 비용을 낮추는 방법을 살펴보겠지만, 비윤리적이거나 실행할 수 없는 실험은 어떻게 할 도리가 없습니다. 그래도 인과적 질문을 다룰 때는 언제나 **이상적인 실험**을 떠올려 볼 가치가 있습니다. 항상 스스로에게 물어보세요. **할 수만 있다면 이 인과효과를 밝히기 위해 어떤 완벽한 실험을 하겠는가?** 이렇게 생각해 보면 이상적인 실험 없이도 인과효과를 찾아낼 방법에 관한 실마리를 얻는 경우가 많습니다.\n", + "나중에 조건부 랜덤화로 랜덤화 비용을 낮추는 방법을 살펴보겠지만, 비윤리적이거나 실행할 수 없는 실험은 어떻게 할 도리가 없습니다. 그래도 인과적 질문을 다룰 때는 언제나 **이상적인 실험**을 떠올려 볼 가치가 있습니다. 항상 스스로에게 물어보세요. **할 수만 있다면 이 인과효과를 밝히기 위해 어떤 완벽한 실험을 하겠는가?** 이렇게 생각하다 보면 이상적인 실험 없이도 인과효과를 찾아낼 실마리가 보일 때가 많습니다.\n", "\n", "\n", "## 처치 배정 메커니즘\n", "\n", "무작위 실험에서 분석단위(unit)를 이 처치 또는 저 처치에 배정하는 메커니즘은, 뭐, 무작위입니다. 앞으로 보겠지만 모든 인과추론(causal inference) 기법은 어떤 식으로든 처치 배정 메커니즘(assignment mechanism)을 파악하려고 합니다. 이 메커니즘이 어떻게 작동하는지 확실히 알면, 배정이 무작위가 아니더라도 인과추론 결과를 훨씬 더 확신할 수 있습니다.\n", "\n", - "아쉽게도 처치 배정 메커니즘은 데이터만 들여다봐서는 알아낼 수 없습니다. 예를 들어 고학력일수록 부유하다는 데이터가 있어도, 데이터만 봐서는 무엇이 무엇의 원인인지 확실히 알 수 없습니다. 세상이 어떻게 돌아가는지에 관한 지식을 동원해서 그럴듯한 배정 메커니즘을 주장해야 합니다. 학교가 사람을 교육해서 생산성을 높이고, 그래서 보수가 더 높은 일자리를 얻게 되는 걸까요? 아니면 교육에 비관적이라면, 학교는 생산성을 높이는 데 아무 역할도 하지 않으며 이 관계는 부유한 집안만 자녀에게 높은 학위를 받게 할 여유가 있어서 생긴 허구적 상관관계(spurious correlation)일 뿐이라고 말할 수도 있습니다.\n", + "아쉽게도 처치 배정 메커니즘은 데이터만 들여다봐서는 알아낼 수 없습니다. 예를 들어 고학력일수록 부유하다는 데이터가 있어도, 데이터만 봐서는 무엇이 무엇의 원인인지 확실히 알 수 없습니다. 세상이 어떻게 돌아가는지에 관한 지식을 동원해서 그럴듯한 배정 메커니즘을 주장해야 합니다. 학교가 사람을 교육해서 생산성을 높이고, 그래서 보수가 더 높은 일자리를 얻게 되는 걸까요? 아니면 교육을 비관적으로 본다면 학교는 생산성을 높이는 데 아무 역할도 하지 않는다고 말할 수도 있습니다. 부유한 집안만 자녀에게 높은 학위를 받게 할 여유가 있어서 생긴 허구적 상관관계(spurious correlation)일 뿐이라는 것입니다.\n", "\n", "인과적 질문에서는 대개 양쪽 모두 주장할 수 있습니다. X가 Y의 원인이라고 할 수도 있고, 제3의 변수 Z가 X와 Y 모두의 원인이어서 X와 Y의 상관관계는 허구일 뿐이라고 할 수도 있습니다. 그래서 처치 배정 메커니즘을 알면 훨씬 설득력 있는 인과적 답을 낼 수 있습니다. 인과추론이 흥미진진한 이유도 바로 여기에 있습니다. 응용 머신러닝은 대개 버튼 몇 개를 순서대로 누르면 끝나지만, 응용 인과추론에서는 데이터를 만들어 낸 메커니즘을 진지하게 고민해야 합니다.\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/03-Stats-Review-The-Most-Dangerous-Equation.ipynb b/causal-inference-for-the-brave-and-true/03-Stats-Review-The-Most-Dangerous-Equation.ipynb index 4416027..62c9007 100644 --- a/causal-inference-for-the-brave-and-true/03-Stats-Review-The-Most-Dangerous-Equation.ipynb +++ b/causal-inference-for-the-brave-and-true/03-Stats-Review-The-Most-Dangerous-Equation.ipynb @@ -8,7 +8,7 @@ "\n", "Howard Wainer는 2007년에 발표한 유명한 글에서 아주 위험한 공식들에 관해 이렇게 이야기합니다.\n", "\n", - "\"어떤 공식은 알면 위험하고, 어떤 공식은 모르면 위험합니다. 첫 번째 부류가 위험할 수 있는 까닭은 그 안에 담긴 비밀이 끔찍한 위험이 도사린 문을 열어 주기 때문입니다. 이 부류에서 단연 으뜸은 아인슈타인의 상징적인 공식 $E = mc^2$입니다. 평범한 물질 속에 숨은 엄청난 에너지를 가늠하게 해 주니까요. \\[...\\] 하지만 제가 관심을 두는 것은 알 때가 아니라 모를 때 위험을 드러내는 공식입니다. 곁에 두면 세상을 명확하게 이해하게 해 주지만, 없으면 우리를 위험할 만큼 무지하게 만드는 공식들이죠.\"\n", + "\"어떤 공식은 알면 위험하고, 어떤 공식은 모르면 위험합니다. 첫 번째 부류가 위험할 수 있는 까닭은 그 안에 담긴 비밀이 무시무시한 재앙이 도사린 문을 열어 주기 때문입니다. 이 부류에서 단연 으뜸은 아인슈타인의 상징적인 공식 $E = mc^2$입니다. 평범한 물질 속에 숨은 엄청난 에너지를 가늠하게 해 주니까요. \\[...\\] 하지만 제가 관심을 두는 것은 알 때가 아니라 모를 때 위험을 드러내는 공식입니다. 곁에 두면 세상을 명확하게 이해하게 해 주지만, 없으면 우리를 위험할 만큼 무지하게 만드는 공식들입니다.\"\n", "\n", "그가 말하는 공식은 바로 드무아브르의 공식(Moivre's equation)입니다.\n", "\n", @@ -270,13 +270,13 @@ "source": [ "위 그림은 드무아브르의 공식이 예측하는 모습을 그대로 보여 줍니다. 학생 수가 늘어날수록 평균 점수는 점점 더 정밀해집니다. 표본이 아주 적은 학교는 순전히 우연 때문에 점수가 아주 높게도, 아주 낮게도 나올 수 있습니다. 큰 학교에서는 이런 일이 일어날 가능성이 낮습니다. 드무아브르의 공식은 데이터라는 형태로 기록된 정보에 관한 근본적인 사실 하나를 알려 줍니다. 데이터는 언제나 부정확하다는 것입니다. 그렇다면 남는 질문은 얼마나 부정확하냐는 것입니다.\n", "\n", - "통계학은 이런 부정확성이 우리 허를 찌르지 못하도록 다루는 학문입니다. Taleb은 『행운에 속지 마라(Fooled by Randomness)』에서 이렇게 말합니다.\n", + "통계학은 이런 부정확성을 다뤄서 우리가 허를 찔리지 않게 해 주는 학문입니다. Taleb은 『행운에 속지 마라(Fooled by Randomness)』에서 이렇게 말합니다.\n", "\n", "> 확률은 단순히 주사위의 승산이나 그보다 복잡한 변형을 계산하는 일이 아니다. 확률이란 우리 지식에 확실성이 없음을 받아들이고, 우리의 무지를 다루는 방법을 개발하는 것이다.\n", "\n", "불확실성을 수치로 나타내는 한 가지 방법은 **추정값의 분산**입니다. 분산은 관측값이 중심값, 즉 가장 그럴듯한 값에서 얼마나 벗어나는지 알려 줍니다. 드무아브르의 공식이 보여 주듯이, 이 불확실성은 관측하는 데이터의 양이 늘어날수록 줄어듭니다. 말이 되죠? 어떤 학교에서 많은 학생이 뛰어난 성적을 낸다면 그 학교가 정말 좋은 학교라고 더 확신할 수 있습니다. 하지만 학생이 10명뿐인 학교에서 8명이 좋은 성적을 냈다면 좀 더 의심해 봐야 합니다. 어쩌다 평균 이상인 학생들이 그 학교에 모였을 수도 있으니까요.\n", "\n", - "위에서 본 아름다운 삼각형 그래프가 바로 이 이야기를 들려줍니다. 표본 크기가 작을 때는 학교 성적에 대한 추정값의 분산이 아주 크고, 표본 크기가 커질수록 분산이 줄어든다는 것을 보여 줍니다. 학교의 평균 점수만 그런 것이 아닙니다. 우리가 자주 추정하려는 평균 처치효과(ATE)를 포함해 모든 요약 통계량이 마찬가지입니다.\n", + "위에서 본 아름다운 삼각형 그래프가 바로 이 이야기를 들려줍니다. 표본 크기가 작을 때는 학교 성적 추정값의 분산이 아주 크고, 표본 크기가 커질수록 분산이 줄어든다는 것을 보여 줍니다. 학교의 평균 점수만 그런 것이 아닙니다. 우리가 자주 추정하려는 평균 처치효과(ATE)를 포함해 모든 요약 통계량이 마찬가지입니다.\n", "\n", "## 추정값의 표준오차\n", "\n", @@ -556,20 +556,20 @@ "source": [ "두 집단의 95% 신뢰구간이 겹치지 않습니다. 대면 수업 신뢰구간의 하한이 온라인 수업 신뢰구간의 상한보다 위에 있습니다. 이 결과가 우연이 아니며, 대면 수업 학생들의 참 평균이 온라인 수업 학생들의 참 평균보다 높다는 증거입니다. 다시 말해 대면 수업에서 온라인 수업으로 바꾸면 학업 성취도가 인과적으로, 그리고 유의하게 떨어집니다.\n", "\n", - "정리하면, 신뢰구간은 추정값에 불확실성을 덧붙이는 방법입니다. 표본 크기가 작을수록 표준오차가 커지고 신뢰구간도 넓어집니다. 신뢰구간은 아주 쉽게 계산할 수 있으므로, 신뢰구간이 빠져 있다면 나쁜 의도가 있거나 그저 지식이 부족하다는 신호이고, 어느 쪽이든 똑같이 걱정스럽습니다. 그리고 불확실성 지표가 하나도 없는 측정값은 늘 의심해야 합니다.\n", + "정리하면, 신뢰구간은 추정값에 불확실성을 덧붙이는 방법입니다. 표본 크기가 작을수록 표준오차가 커지고 신뢰구간도 넓어집니다. 신뢰구간은 아주 쉽게 계산할 수 있습니다. 그러니 신뢰구간이 빠져 있다면 나쁜 의도가 있거나 그저 지식이 부족하다는 신호이고, 어느 쪽이든 똑같이 걱정스럽습니다. 그리고 불확실성 지표가 하나도 없는 측정값은 늘 의심해야 합니다.\n", "\n", "![img](data/img/stats-review/ci_xkcd.png)\n", "\n", "마지막으로 한 가지 주의할 점이 있습니다. 신뢰구간은 언뜻 보기보다 해석하기 까다롭습니다. 예를 들어 이 특정 95% 신뢰구간이 95% 확률로 참 모평균을 포함한다고 말해서는 **안 됩니다**. 신뢰구간을 쓰는 빈도주의 통계학에서는 모평균을 참된 모집단 상수로 봅니다. 그러니 모평균은 우리가 구한 특정 신뢰구간 안에 있거나 없거나 둘 중 하나입니다. 즉, 특정 신뢰구간은 참 평균을 포함하거나 포함하지 않습니다. 포함한다면 포함할 확률은 95%가 아니라 100%이고, 포함하지 않는다면 0%입니다. 신뢰구간에서 95%는 여러 연구에서 계산한 그런 신뢰구간들이 참 평균을 포함하는 빈도를 가리킵니다. 95%는 95% 신뢰구간을 계산하는 알고리즘에 대한 신뢰이지, 특정 구간 자체에 대한 신뢰가 아닙니다.\n", "\n", - "그렇긴 하지만, 경제학자로서(통계학자 여러분은 잠시 눈을 돌려 주세요) 저는 이런 순수주의가 그다지 쓸모 있다고 생각하지 않습니다. 실무에서는 특정 신뢰구간이 95%의 확률로 참 평균을 포함한다고 말하는 사람을 자주 봅니다. 틀린 말이긴 해도 크게 해롭지는 않습니다. 여전히 추정값에 정확한 수준의 불확실성을 부여하기 때문입니다. 게다가 베이지안 통계학으로 넘어가 신뢰구간 대신 확률 구간을 쓰면, 그 구간이 95%의 확률로 분포의 평균을 포함한다고 말할 수 있습니다. 또 제가 실무에서 본 바로는, 표본 크기가 적당히 크면 베이지안 확률 구간은 베이지안도 빈도주의자도 인정하고 싶어 하는 것보다 신뢰구간과 더 비슷합니다. 그러니 제 말에 조금이라도 무게가 있다면, 신뢰구간에 대해 마음대로 말해도 좋습니다. 신뢰구간이 95%의 확률로 참 평균을 포함한다고 말해도 저는 상관하지 않습니다. 다만 추정값에 신뢰구간을 붙이는 일만은 절대 잊지 마세요. 그러지 않으면 우스워 보일 테니까요.\n", + "그렇긴 하지만, 경제학자로서(통계학자 여러분은 잠시 눈을 돌려 주세요) 저는 이런 순수주의가 그다지 쓸모 있다고 생각하지 않습니다. 실무에서는 특정 신뢰구간이 95%의 확률로 참 평균을 포함한다고 말하는 사람을 자주 봅니다. 틀린 말이긴 해도 크게 해롭지는 않습니다. 여전히 추정값에 정확한 수준의 불확실성을 부여하기 때문입니다. 게다가 베이지안 통계학으로 넘어가 신뢰구간 대신 확률 구간을 쓰면, 그 구간이 95%의 확률로 분포의 평균을 포함한다고 말할 수 있습니다. 또 제가 실무에서 본 바로는, 표본 크기가 적당히 크면 베이지안 확률 구간은 베이지안도 빈도주의자도 인정하고 싶어 하는 것보다 신뢰구간과 더 비슷합니다. 그러니 제 말에 조금이라도 무게가 있다면, 신뢰구간을 두고 마음대로 말해도 좋습니다. 신뢰구간이 95%의 확률로 참 평균을 포함한다고 말해도 저는 상관하지 않습니다. 다만 추정값에 신뢰구간을 붙이는 일만은 절대 잊지 마세요. 그러지 않으면 우스워 보일 테니까요.\n", "\n", "> 옮긴이: 위 문단에 나오는 베이지안의 '확률 구간'은 보통 신용구간(credible interval)이라고 부릅니다.\n", "\n", "\n", "## 가설검정\n", "\n", - "불확실성을 반영하는 또 다른 방법은 가설검정(hypothesis test)을 세우는 것입니다. 평균의 차이가 0(또는 다른 어떤 값)과 통계적으로 다른지를 묻는 것입니다. 서로 독립인 정규분포 2개의 합이나 차도 정규분포라는 사실을 떠올려 봅시다. 그 결과로 나오는 분포의 평균은 두 분포 평균의 합이나 차가 되고, 분산은 언제나 두 분산의 합이 됩니다.\n", + "불확실성을 반영하는 또 다른 방법은 가설검정(hypothesis test)을 하는 것입니다. 평균의 차이가 0(또는 다른 어떤 값)과 통계적으로 다른지를 묻는 것입니다. 서로 독립인 정규분포 2개의 합이나 차도 정규분포라는 사실을 떠올려 봅시다. 그 결과로 나오는 분포의 평균은 두 분포 평균의 합이나 차가 되고, 분산은 언제나 두 분산의 합이 됩니다.\n", "\n", "$\n", "N(\\mu_1, \\sigma_1^2) - N(\\mu_2, \\sigma_2^2) = N(\\mu_1 - \\mu_2, \\sigma_1^2 + \\sigma_2^2)\n", @@ -881,7 +881,7 @@ "source": [ "## 핵심 요약\n", "\n", - "드무아브르의 공식을 아는 것이 얼마나 중요한지 살펴보았고, 이 공식을 이용해 추정값에 확실성의 정도를 부여했습니다. 구체적으로는 온라인 수업이 대면 수업보다 학업 성취도를 떨어뜨린다는 것을 알아냈고, 이 결과가 통계적으로 유의하다는 것도 확인했습니다. 이를 위해 두 집단 평균의 신뢰구간을 비교하고, 차이에 대한 신뢰구간을 살펴보고, 가설검정을 하고, p 값을 확인했습니다. 끝으로 위에서 한 것과 같은 A/B 테스트 비교를 해 주는 함수 하나로 모든 과정을 정리해 보겠습니다." + "드무아브르의 공식을 아는 것이 얼마나 중요한지 살펴보았고, 이 공식을 이용해 추정값이 얼마나 확실한지 나타냈습니다. 구체적으로는 온라인 수업이 대면 수업보다 학업 성취도를 떨어뜨린다는 것을 알아냈고, 이 결과가 통계적으로 유의하다는 것도 확인했습니다. 이를 위해 두 집단 평균의 신뢰구간을 비교하고, 차이에 대한 신뢰구간을 살펴보고, 가설검정을 하고, p 값을 확인했습니다. 끝으로 위에서 한 것과 같은 A/B 테스트 비교를 해 주는 함수 하나로 모든 과정을 정리해 보겠습니다." ] }, { diff --git a/causal-inference-for-the-brave-and-true/04-Graphical-Causal-Models.ipynb b/causal-inference-for-the-brave-and-true/04-Graphical-Causal-Models.ipynb index c6f6285..2ef5f0a 100644 --- a/causal-inference-for-the-brave-and-true/04-Graphical-Causal-Models.ipynb +++ b/causal-inference-for-the-brave-and-true/04-Graphical-Causal-Models.ipynb @@ -9,7 +9,7 @@ "\n", "## 인과관계에 대해 생각하기\n", "\n", - "유튜브 요리 영상에 나오는 요리사들이 음식을 얼마나 그럴듯하게 묘사하는지 눈여겨본 적이 있나요? \"소스가 벨벳처럼 부드러워질 때까지 졸이세요.\" 이제 막 요리를 배우는 사람이라면 이게 대체 무슨 뜻인지 감도 오지 않습니다. 그냥 불에 몇 분 올려 두면 되는지만 알려 주세요! 인과관계도 마찬가지입니다. 어느 술집에 들어갔는데 사람들이 인과관계를 두고 이야기하고 있다고 해 봅시다(아마 경제학과 건물 옆 술집이겠죠). 그러면 소득이 교란을 일으키는 바람에 그 동네에 이민이 미친 효과를 식별하기 어려웠고, 그래서 도구변수를 써야 했다는 이야기가 들려올 겁니다. 지금은 무슨 말인지 잘 모를 수 있지만, 이 문제를 적어도 일부는 지금 바로 해결해 드리겠습니다.\n", + "유튜브 요리 영상에 나오는 요리사들이 음식을 얼마나 그럴듯하게 묘사하는지 눈여겨본 적이 있나요? \"소스가 벨벳처럼 부드러워질 때까지 졸이세요.\" 이제 막 요리를 배우는 사람이라면 이게 대체 무슨 뜻인지 감도 오지 않습니다. 그냥 불에 몇 분 올려 두면 되는지만 알려 주세요! 인과관계도 마찬가지입니다. 어느 술집에 들어갔는데 사람들이 인과관계를 두고 이야기하고 있다고 해 봅시다(아마 경제학과 건물 옆 술집일 겁니다). 그러면 소득이 교란을 일으키는 바람에 그 동네에 이민이 미친 효과를 식별하기 어려웠고, 그래서 도구변수를 써야 했다는 이야기가 들려올 겁니다. 지금은 무슨 말인지 잘 모를 수 있지만, 이 문제를 적어도 일부는 지금 바로 해결해 드리겠습니다.\n", "\n", "그래프 모델(graphical model)은 인과관계의 언어입니다. 다른 용감하고 진실한 인과관계 애호가들과 대화할 때 쓰는 언어일 뿐 아니라, 자기 생각을 더 투명하게 정리할 때도 쓰는 도구입니다.\n", "\n", @@ -21,7 +21,7 @@ "\n", "조건부 독립 덕분에 주변에 숨어 있는 다른 변수가 아니라 오로지 처치 때문에 생긴 결과의 변화를 측정할 수 있습니다. 대표적인 예가 아픈 환자에게 약이 미치는 효과입니다. 상태가 아주 심각한 환자만 약을 받는다면, 약을 주는 것이 오히려 환자의 건강을 해치는 것처럼 보일 수도 있습니다. 병의 심각도가 미치는 영향이 약의 효과와 뒤섞이기 때문입니다. 환자를 중증과 경증으로 나누고 각 하위 집단에서 약의 효과를 분석하면 실제 효과를 더 분명하게 볼 수 있습니다. 이렇게 모집단을 특성에 따라 나누는 것을 X를 통제한다(controlling for) 또는 X를 조건부로 둔다(conditioning on)고 합니다. 중증 환자를 조건부로 두면 처치가 배정되는 방식은 무작위나 다름없어집니다. 중증 집단 안의 환자들은 심각도라는 차원에서 모두 같으므로, 이제 약을 받을지 말지는 높은 심각도가 아니라 순전히 우연으로 정해집니다. 그리고 집단 안에서 처치가 무작위로 배정된다면, 처치는 잠재적 결과와 조건부 독립이 됩니다.\n", "\n", - "독립과 조건부 독립은 인과추론의 핵심입니다. 그런데 이 개념을 머릿속에 제대로 담기란 꽤 어렵습니다. 하지만 문제를 설명할 올바른 언어를 쓰면 이야기가 달라집니다. 바로 여기서 **그래프 인과 모델**(causal graphical model)이 등장합니다. 그래프 인과 모델은 무엇이 무엇의 원인이 되는지를 바탕으로 인과관계가 어떻게 작동하는지 표현하는 방법입니다.\n", + "독립과 조건부 독립은 인과추론의 핵심입니다. 그런데 이 개념을 머릿속에 제대로 담기란 꽤 어렵습니다. 다만 문제를 설명할 올바른 언어를 쓰면 이야기가 달라집니다. 바로 여기서 **그래프 인과 모델**(causal graphical model)이 등장합니다. 그래프 인과 모델은 무엇이 무엇의 원인이 되는지를 바탕으로 인과관계가 어떻게 작동하는지 표현하는 방법입니다.\n", "\n", "그래프 모델은 다음과 같이 생겼습니다." ] @@ -185,7 +185,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "각 노드는 확률변수입니다. 화살표, 즉 엣지(edge)로 한 변수가 다른 변수의 원인인지를 나타냅니다. 위의 첫 번째 그래프 모델은 Z가 X의 원인이고, U가 X와 Y의 원인이라는 뜻입니다. 좀 더 구체적인 예로, 약이 환자의 생존에 미치는 영향에 대한 생각을 위의 두 번째 그래프로 옮겨 볼 수 있습니다. 심각도는 약과 생존 모두의 원인이고, 약 역시 생존의 원인입니다. 앞으로 보겠지만, 그래프 인과 모델이라는 언어는 세상이 어떻게 돌아가는지에 대한 믿음을 분명히 드러내 주기 때문에 인과관계를 더 명확하게 생각하는 데 도움이 됩니다.\n", + "각 노드는 확률변수입니다. 화살표, 즉 엣지(edge)로 한 변수가 다른 변수의 원인인지를 나타냅니다. 위의 첫 번째 그래프 모델은 Z가 X의 원인이고, U가 X와 Y의 원인이라는 뜻입니다. 좀 더 구체적인 예로, 약이 환자의 생존에 미치는 영향을 어떻게 보는지 위의 두 번째 그래프로 옮겨 볼 수 있습니다. 심각도는 약과 생존 모두의 원인이고, 약 역시 생존의 원인입니다. 앞으로 보겠지만, 그래프 인과 모델이라는 언어는 세상이 어떻게 돌아가는지에 대한 믿음을 분명히 드러내 주기 때문에 인과관계를 더 명확하게 생각하는 데 도움이 됩니다.\n", "\n", "## 그래프 모델 속성 강의\n", "\n", @@ -515,7 +515,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "예를 들어, 통계학을 알면 인과추론과 머신러닝도 더 잘 알게 된다고 해 봅시다. 제가 여러분의 통계 지식수준을 모른다면, 여러분이 인과추론을 잘한다는 사실을 알았을 때 머신러닝도 잘할 가능성이 높다고 판단하게 됩니다. 통계 지식수준을 모르더라도 인과추론 지식으로 그것을 짐작할 수 있기 때문입니다. 인과추론을 잘한다면 아마 통계도 잘할 것이고, 그렇다면 머신러닝도 잘할 가능성이 높습니다.\n", + "예를 들어, 통계학을 알면 인과추론과 머신러닝도 더 잘 알게 된다고 해 봅시다. 제가 여러분의 통계 지식수준을 모른다면, 인과추론을 잘한다는 사실을 알았을 때 머신러닝도 잘할 가능성이 높다고 판단하게 됩니다. 통계 지식수준을 모르더라도 인과추론 지식으로 짐작할 수 있기 때문입니다. 인과추론을 잘한다면 아마 통계도 잘할 것이고, 그렇다면 머신러닝도 잘할 가능성이 높습니다.\n", "\n", "이제 여러분의 통계 지식을 조건부로 두면, 머신러닝을 얼마나 아는지는 인과추론을 얼마나 아는지와 독립이 됩니다. 통계 수준만 알면 머신러닝 실력을 짐작하는 데 필요한 정보는 이미 다 얻은 셈입니다. 이 경우 인과추론 수준을 알아도 더 얻을 정보는 없습니다.\n", "\n", @@ -681,7 +681,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "예를 들어, 승진하는 방법이 두 가지 있다고 해 봅시다. 통계를 잘하거나 상사에게 아부를 잘하면 됩니다. 승진을 조건부로 두지 않는다면, 즉 승진할지 말지 전혀 모른다면, 통계 실력과 아부 실력은 독립입니다. 다시 말해 통계를 얼마나 잘하는지 알아도 상사에게 얼마나 아부를 잘하는지는 알 수 없습니다. 반면에 승진했다면, 갑자기 통계 실력이 아부 실력에 대해 무언가를 말해 주기 시작합니다. 통계는 못하는데 승진했다면 아부에 능할 가능성이 큽니다. 그렇지 않았다면 승진하지 못했을 테니까요. 반대로 아부를 못한다면 통계를 잘하는 사람임이 틀림없습니다. 이런 현상을 종종 **다른 원인으로 설명되어 버리는(explaining away)** 현상이라고 부릅니다. 한 원인이 이미 효과를 설명해 버리므로 다른 원인일 가능성이 낮아지기 때문입니다.\n", + "예를 들어, 승진하는 방법이 두 가지 있다고 해 봅시다. 통계를 잘하거나 상사에게 아부를 잘하면 됩니다. 승진을 조건부로 두지 않는다면, 즉 승진할지 말지 전혀 모른다면, 통계 실력과 아부 실력은 독립입니다. 다시 말해 통계를 얼마나 잘하는지 알아도 상사에게 얼마나 아부를 잘하는지는 알 수 없습니다. 반면에 승진했다면, 갑자기 통계 실력만 알아도 아부 실력을 짐작할 수 있게 됩니다. 통계는 못하는데 승진했다면 아부에 능할 가능성이 큽니다. 그렇지 않았다면 승진하지 못했을 테니까요. 반대로 아부를 못한다면 통계를 잘하는 사람임이 틀림없습니다. 이런 현상을 종종 **다른 원인으로 설명되어 버리는(explaining away)** 현상이라고 부릅니다. 한 원인이 이미 효과를 설명해 버리므로 다른 원인일 가능성이 낮아지기 때문입니다.\n", "\n", "일반적으로 충돌부를 조건부로 두면 종속 경로가 열립니다. 조건부로 두지 않으면 경로는 닫힌 채로 남습니다. 즉,\n", "\n", @@ -1529,7 +1529,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "왜 그런지 보여 주기 위해 투자와 교육이 두 가지 값만 가진다고 해 봅시다. 사람들은 투자를 하거나 하지 않습니다. 교육을 받았거나 받지 않았습니다. 처음에 투자를 통제하지 않았을 때는 교육을 무작위로 배정했으므로 편향 항이 0입니다: $E[Y_0|T=1] - E[Y_0|T=0] = 0$. 즉, 교육을 받지 않았다면 받았을 임금 $Wage_0$는 실제로 교육이라는 처치를 받았든 받지 않았든 같습니다. 그런데 투자를 조건부로 두면 어떻게 될까요?\n", + "왜 그런지 보여 주기 위해 투자와 교육이 두 가지 값만 가진다고 해 봅시다. 사람들은 투자를 하거나 하지 않습니다. 교육을 받았거나 받지 않았습니다. 처음에 투자를 통제하지 않았을 때는 교육을 무작위로 배정했으므로 편향 항이 0, 즉 $E[Y_0|T=1] - E[Y_0|T=0] = 0$입니다. 즉, 교육을 받지 않았다면 받았을 임금 $Wage_0$는 실제로 교육이라는 처치를 받았든 받지 않았든 같습니다. 그런데 투자를 조건부로 두면 어떻게 될까요?\n", "\n", "투자하는 사람들을 보면 아마 $E[Y_0|T=0, I=1] > E[Y_0|T=1, I=1]$일 것입니다. 말로 풀면, 투자하는 사람 중에서 교육을 받지 않고도 투자할 수 있었던 사람은 교육 수준과 관계없이 높은 소득을 올릴 가능성이 큽니다. 그래서 이들이 받는 임금 $Wage_0|T=0$은 교육받은 집단이 교육을 받지 않았다면 받았을 임금 $Wage_0|T=1$보다 높을 가능성이 큽니다. 투자하지 않는 사람들에게도 비슷한 논리를 적용할 수 있고, 여기서도 아마 $E[Y_0|T=0, I=0] > E[Y_0|T=1, I=0]$일 것입니다. 교육을 받고도 투자하지 않은 사람은, 만약 교육을 받지 않았다면 교육도 받지 않고 투자도 하지 않은 사람보다 임금이 낮았을 가능성이 큽니다.\n", "\n", @@ -1634,7 +1634,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "처치의 매개자(mediator)를 조건부로 둘 때도 비슷한 일이 생깁니다. 매개자는 처치와 결과 사이에 있는 변수입니다. 이름 그대로 인과효과를 매개하는 변수입니다. 예를 들어 이번에도 교육을 무작위로 배정할 수 있다고 해 봅시다. 그런데 혹시 몰라서 그 사람이 사무직인지 여부를 통제하기로 합니다. 이번에도 이 조건부는 인과효과 추정을 편향시킵니다. 다만 이번에는 충돌부 때문에 앞문 경로가 열려서가 아니라, 처치가 작용하는 통로 중 하나를 닫아 버리기 때문입니다. 이 예에서 사무직 일자리를 얻는 것은 교육을 많이 받으면 임금이 높아지는 통로 중 하나입니다. 이것을 통제하면 이 통로가 닫히고, 교육이 임금에 미치는 직접 효과만 열린 채로 남습니다." + "처치의 매개자(mediator)를 조건부로 둘 때도 비슷한 일이 생깁니다. 매개자는 처치와 결과 사이에 있는 변수입니다. 이름 그대로 인과효과를 매개하는 변수입니다. 예를 들어 이번에도 교육을 무작위로 배정할 수 있다고 해 봅시다. 그런데 혹시 몰라서 그 사람이 사무직인지 여부를 통제하기로 합니다. 이번에도 이렇게 조건부로 두면 인과효과 추정값이 편향됩니다. 다만 이번에는 충돌부 때문에 앞문 경로가 열려서가 아니라, 처치가 작용하는 통로 중 하나를 닫아 버리기 때문입니다. 이 예에서 사무직 일자리를 얻는 것은 교육을 많이 받으면 임금이 높아지는 통로 중 하나입니다. 이것을 통제하면 이 통로가 닫히고, 교육이 임금에 미치는 직접 효과만 열린 채로 남습니다." ] }, { @@ -1765,9 +1765,9 @@ ] }, "source": [ - "잠재적 결과로 설명해 보겠습니다. 무작위 배정 덕분에 편향은 0입니다: $E[Y_0|T=0] - E[Y_0|T=1] = 0$. 하지만 사무직인 사람들을 조건부로 두면 $E[Y_0|T=0, WC=1] > E[Y_0|T=1, WC=1]$이 됩니다. 교육 없이도 사무직 일자리를 얻은 사람은 같은 직업을 얻는 데 교육의 도움이 필요했던 사람보다 아마 더 성실할 것이기 때문입니다. 같은 논리로 $E[Y_0|T=0, WC=0] > E[Y_0|T=1, WC=0]$입니다. 교육을 받고도 사무직 일자리를 얻지 못한 사람은 교육을 받지 않았고 사무직 일자리도 얻지 못한 사람보다 아마 덜 성실할 것이기 때문입니다.\n", + "잠재적 결과로 설명해 보겠습니다. 무작위 배정 덕분에 편향은 0, 즉 $E[Y_0|T=0] - E[Y_0|T=1] = 0$입니다. 하지만 사무직인 사람들을 조건부로 두면 $E[Y_0|T=0, WC=1] > E[Y_0|T=1, WC=1]$이 됩니다. 교육 없이도 사무직 일자리를 얻은 사람은 같은 직업을 얻는 데 교육의 도움이 필요했던 사람보다 아마 더 성실할 것이기 때문입니다. 같은 논리로 $E[Y_0|T=0, WC=0] > E[Y_0|T=1, WC=0]$입니다. 교육을 받고도 사무직 일자리를 얻지 못한 사람은 교육을 받지 않았고 사무직 일자리도 얻지 못한 사람보다 아마 덜 성실할 것이기 때문입니다.\n", "\n", - "이 경우 매개자를 조건부로 두면 음의 편향이 생깁니다. 교육의 효과가 실제보다 작아 보이게 됩니다. 인과효과가 양수이기 때문에 이렇게 됩니다. 효과가 음수였다면 매개자를 조건부로 둘 때 양의 편향이 생겼을 것입니다. 어느 경우든 이런 조건부는 효과를 실제보다 약해 보이게 만듭니다.\n", + "이 경우 매개자를 조건부로 두면 음의 편향이 생깁니다. 교육의 효과가 실제보다 작아 보이게 됩니다. 인과효과가 양수이기 때문에 이렇게 됩니다. 효과가 음수였다면 매개자를 조건부로 둘 때 양의 편향이 생겼을 것입니다. 어느 경우든 이렇게 조건부로 두면 효과가 실제보다 약해 보입니다.\n", "\n", "좀 더 일상적인 예로 말해 보겠습니다. 회사에서 두 지원자 중 한 명을 뽑아야 한다고 해 봅시다. 두 사람의 경력상 성과는 똑같이 인상적인데, 한 사람은 고등교육 학위가 없습니다. 누구를 뽑아야 할까요? 당연히 고등교육을 받지 않은 사람입니다. 불리한 조건을 딛고 다른 사람과 같은 성과를 냈으니까요.\n", "\n", @@ -1777,7 +1777,7 @@ "\n", "인과관계에 관한 생각을 더 잘 이해하고 표현하는 언어로서 그래프 모델을 공부했습니다. 그래프에서 조건부 독립이 성립하는 규칙을 빠르게 정리했고, 이를 바탕으로 편향을 일으킬 수 있는 세 가지 구조를 살펴보았습니다.\n", "\n", - "첫 번째는 교란으로, 처치와 결과에 공통 원인이 있는데 이를 고려하거나 통제하지 않을 때 생깁니다. 두 번째는 공통 효과를 조건부로 두어서 생기는 선택편향입니다. 세 번째 구조도 선택편향의 한 형태인데, 이번에는 매개자를 지나치게 통제해서 생깁니다. 이런 과잉 통제는 처치를 무작위로 배정했더라도 편향을 일으킬 수 있습니다. 선택편향은 그냥 아무것도 하지 않으면 해결되는 경우가 많은데, 바로 그래서 위험합니다. 우리는 뭔가 행동하는 쪽으로 편향되어 있다 보니, 무언가를 통제하자는 아이디어가 득보다 실이 클 때도 영리한 생각처럼 보기 쉽습니다.\n", + "첫 번째는 교란으로, 처치와 결과에 공통 원인이 있는데 이를 고려하거나 통제하지 않을 때 생깁니다. 두 번째는 공통 효과를 조건부로 두어서 생기는 선택편향입니다. 세 번째 구조도 선택편향의 한 형태인데, 이번에는 매개자를 지나치게 통제해서 생깁니다. 이런 과잉 통제는 처치를 무작위로 배정했더라도 편향을 일으킬 수 있습니다. 선택편향은 그냥 아무것도 하지 않으면 해결되는 경우가 많은데, 바로 그래서 위험합니다. 우리는 뭔가 행동하는 쪽으로 편향되어 있다 보니, 무언가를 통제하자는 아이디어가 득보다 실이 클 때도 영리한 생각처럼 보이기 쉽습니다.\n", "\n", "## 참고 자료\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb b/causal-inference-for-the-brave-and-true/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb index 3db7f45..38695ab 100644 --- a/causal-inference-for-the-brave-and-true/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb +++ b/causal-inference-for-the-brave-and-true/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb @@ -29,7 +29,7 @@ "E[Y|T=1] - E[Y|T=0] = \\underbrace{E[Y_1 - Y_0|T=1]}_{ATET} + \\underbrace{\\{ E[Y_0|T=1] - E[Y_0|T=0]\\}}_{BIAS}\n", "$\n", "\n", - "앞에서 무작위 실험, 다른 말로 **무작위 통제 실험**(RCT)으로 편향을 없앨 수 있다는 것을 보았습니다. RCT는 실험군과 대조군을 같게 만들기 때문에 편향이 사라집니다. 처치효과 추정값에 불확실성의 범위를 두는 방법도 살펴보았습니다. 온라인 수업과 대면 수업을 비교한 사례였는데, $T=0$은 대면 수업, $T=1$은 온라인 수업을 나타냈습니다. 학생들을 두 수업 방식 중 하나에 무작위로 배정한 뒤 시험 성적을 평가했습니다. 그리고 두 그룹을 비교해 평균 처치효과(ATE)를 구하고 신뢰구간까지 계산해 주는 A/B 테스트 함수를 만들었습니다.\n", + "앞에서 무작위 실험, 다른 말로 **무작위 통제 실험**(RCT)으로 편향을 없앨 수 있다는 것을 보았습니다. RCT는 실험군과 대조군을 같게 만들기 때문에 편향이 사라집니다. 처치효과 추정값에 불확실성의 범위를 붙이는 방법도 살펴보았습니다. 온라인 수업과 대면 수업을 비교한 사례였는데, $T=0$은 대면 수업, $T=1$은 온라인 수업을 나타냈습니다. 학생들을 두 수업 방식 중 하나에 무작위로 배정한 뒤 시험 성적을 평가했습니다. 그리고 두 그룹을 비교해 평균 처치효과(ATE)를 구하고 신뢰구간까지 계산해 주는 A/B 테스트 함수를 만들었습니다.\n", "\n", "이제 이 모든 일을 인과추론의 든든한 일꾼인 **선형회귀**(linear regression)로 할 수 있다는 것을 보여 드릴 차례입니다! 이렇게 생각해 보세요. 실험군과 대조군의 평균을 비교하는 것이 디저트로 나온 사과 한 알이라면, 선형회귀는 차갑고 부드러운 티라미수입니다. 실험군과 대조군을 비교하는 것이 오래되어 처량한 원더 브레드 흰 식빵이라면, 선형회귀는 채드 로버트슨이 직접 구운, 껍질은 바삭하고 속은 촉촉한 시골풍 사워도우입니다.\n", "\n", @@ -265,7 +265,7 @@ "\n", "여기서 $\\tilde{T_i}$는 $T_i$를 다른 모든 공변량(covariate) $X_{1i}, ..., X_{ki}$에 회귀해서 얻은 잔차(residual)입니다. 이게 얼마나 멋진 일인지 잠시 음미해 봅시다. 다중회귀의 계수가 **모델에 있는 다른 변수들의 영향을 고려한 뒤** 같은 설명변수로 구한 이변량(bivariate) 계수와 같다는 뜻이니까요. 인과추론의 언어로 말하면, $\\kappa$는 다른 모든 변수로 처치를 예측하고 난 뒤에 구한 $T$의 이변량 계수입니다.\n", "\n", - "여기에는 좋은 직관이 담겨 있습니다. 다른 변수로 $T$를 예측할 수 있다면 처치가 무작위가 아니라는 뜻입니다. 하지만 사용할 수 있는 다른 변수들을 통제하고 나면 $T$를 무작위나 다름없게 만들 수 있습니다. 그러려면 선형회귀로 다른 변수들에서 처치를 예측한 다음, 그 회귀의 잔차 $\\tilde{T}$를 구하면 됩니다. 정의상 $\\tilde{T}$는 $T$를 예측하는 데 이미 쓴 다른 변수 $X$로는 예측할 수 없습니다. 아주 깔끔하게도, $\\tilde{T}$는 $X$의 어떤 변수와도 연관되지 않은 버전의 처치입니다.\n", + "여기에는 좋은 직관이 담겨 있습니다. 다른 변수로 $T$를 예측할 수 있다면 처치가 무작위가 아니라는 뜻입니다. 하지만 사용할 수 있는 다른 변수들을 통제하고 나면 $T$를 무작위나 다름없게 만들 수 있습니다. 그러려면 선형회귀로 다른 변수들에서 처치를 예측한 다음, 그 회귀의 잔차 $\\tilde{T}$를 구하면 됩니다. 정의상 $\\tilde{T}$는 $T$를 예측하는 데 이미 쓴 다른 변수 $X$로는 예측할 수 없습니다. 아주 깔끔하게도, $\\tilde{T}$는 $X$의 어떤 변수와도 연관되지 않도록 걸러 낸 처치입니다.\n", "\n", "덧붙이면 이것 역시 선형회귀의 성질입니다. 잔차는 그 잔차를 만든 모델의 어떤 변수와도 항상 직교합니다. 다시 말해 상관관계가 없습니다." ] @@ -447,7 +447,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "물론 이 단순한 모델을 추정할 수 있다고 해서 그 모델이 옳은 것은 아닙니다. 제가 교육으로 임금을 **예측한다**고 조심스럽게 표현한 것에 주목하세요. 이 예측이 인과적이라고는 한 번도 말하지 않았습니다. 사실 지금쯤이면 이 모델이 편향되었다고 믿을 만한 아주 중대한 이유가 떠오를 겁니다. 데이터가 무작위 실험에서 나온 것이 아니므로, 교육을 더 받은 사람과 덜 받은 사람을 비교할 수 있는지 알 수 없습니다. 한 걸음 더 나아가, 세상이 돌아가는 방식을 생각해 보면 둘은 비교할 수 없다고 거의 확신할 수 있습니다. 예를 들어 교육을 더 오래 받은 사람은 부모가 더 부유할 가능성이 높고, 교육 연수가 늘수록 임금이 오르는 것처럼 보이는 것은 집안의 재산이 교육 연수와 연관되어 있다는 사실이 반영된 것일 뿐이라고 주장할 수 있습니다. 이를 수식으로 쓰면 $E[Y_0|T=0] < E[Y_0|T=1]$입니다. 교육을 더 받은 사람은 그만큼 교육을 받지 않았더라도 어차피 소득이 더 높았으리라는 뜻입니다. 교육을 정말 비관적으로 보는 사람이라면, 교육이 사람들을 노동시장 밖에 붙잡아 두어 경력을 쌓지 못하게 하므로 오히려 임금을 *낮춘다*고 주장할 수도 있습니다.\n", + "물론 이 단순한 모델을 추정할 수 있다고 해서 그 모델이 옳은 것은 아닙니다. 제가 교육으로 임금을 **예측한다**고 조심스럽게 표현한 것에 주목하세요. 이 예측이 인과적이라고는 한 번도 말하지 않았습니다. 사실 지금쯤이면 이 모델이 편향되었다고 믿을 만한 아주 중대한 이유가 떠오를 겁니다. 데이터가 무작위 실험에서 나온 것이 아니므로, 교육을 더 받은 사람과 덜 받은 사람을 비교할 수 있는지 알 수 없습니다. 한 걸음 더 나아가, 세상이 돌아가는 방식을 생각해 보면 둘은 비교할 수 없다고 거의 확신할 수 있습니다. 예를 들어 교육을 더 오래 받은 사람은 부모가 더 부유할 가능성이 높습니다. 그렇다면 교육 연수가 늘수록 임금이 오르는 것처럼 보이는 것도 집안의 재산이 교육 연수와 연관되어 있다는 사실이 반영된 것일 뿐이라고 주장할 수 있습니다. 이를 수식으로 쓰면 $E[Y_0|T=0] < E[Y_0|T=1]$입니다. 교육을 더 받은 사람은 그만큼 교육을 받지 않았더라도 어차피 소득이 더 높았으리라는 뜻입니다. 교육을 정말 비관적으로 보는 사람이라면, 교육이 사람들을 노동시장 밖에 붙잡아 두어 경력을 쌓지 못하게 하므로 오히려 임금을 *낮춘다*고 주장할 수도 있습니다.\n", "\n", "다행히 데이터에는 다른 변수가 많이 있습니다. 부모의 교육 연수 `meduc`, `feduc`, 본인의 `IQ` 점수, 경력 연수 `exper`, 현재 회사 근속 연수 `tenure`를 볼 수 있습니다. 결혼 여부와 흑인 여부를 나타내는 더미변수도 있습니다." ] @@ -641,7 +641,7 @@ "\\kappa = \\dfrac{Cov(Y_i, \\tilde{T_i})}{Var(\\tilde{T_i})} \n", "$\n", "\n", - "이 공식에 따르면 부모의 교육 연수, IQ, 경력 등으로 `educ`를 예측할 수 있습니다. 그렇게 하고 나면 앞에서 넣은 모든 변수와 상관관계가 없는 버전의 `educ`, 즉 $\\tilde{educ}$가 남습니다. 덕분에 \"교육을 더 오래 받은 사람은 IQ가 높아서 그만큼 교육을 받은 것이다. 교육이 임금을 높이는 것이 아니다. 교육은 IQ와 상관관계가 있을 뿐이고, 임금을 결정하는 것은 IQ다\" 같은 주장을 반박할 수 있습니다. 모델에 IQ를 넣으면 $\\kappa$는 IQ를 고정한 상태에서 교육을 1년 더 받았을 때의 수익이 되기 때문입니다. 잠시 멈추고 이것이 무엇을 뜻하는지 생각해 보세요. 무작위 통제 실험으로 실험군과 대조군의 다른 요인을 똑같이 맞출 수 없더라도, 회귀분석은 그 요인들을 모델에 넣는 것만으로 같은 일을 해냅니다. 데이터가 무작위가 아니어도 말이죠!" + "이 공식에 따르면 부모의 교육 연수, IQ, 경력 등으로 `educ`를 예측할 수 있습니다. 그렇게 하고 나면 앞에서 넣은 모든 변수와 상관관계가 없도록 걸러 낸 `educ`, 즉 $\\tilde{educ}$가 남습니다. 덕분에 \"교육을 더 오래 받은 사람은 IQ가 높아서 그만큼 교육을 받은 것이다. 교육이 임금을 높이는 것이 아니다. 교육은 IQ와 상관관계가 있을 뿐이고, 임금을 결정하는 것은 IQ다\" 같은 주장을 반박할 수 있습니다. 모델에 IQ를 넣으면 $\\kappa$는 IQ를 고정한 상태에서 교육을 1년 더 받았을 때의 수익이 되기 때문입니다. 잠시 멈추고 이것이 무엇을 뜻하는지 생각해 보세요. 무작위 통제 실험으로 실험군과 대조군의 다른 요인을 똑같이 맞출 수 없더라도, 회귀분석은 그 요인들을 모델에 넣는 것만으로 같은 일을 해냅니다. 데이터가 무작위가 아니어도 말입니다!" ] }, { @@ -683,7 +683,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "방금 추정한 계수는 IQ, 경력, 근속 연수, 나이 등이 같은 사람들 사이에서 교육을 1년 더 받는 것이 시간당 임금 4.11% 상승과 연관되어 있으리라고 기대할 수 있다는 뜻입니다. `educ`만 넣은 첫 번째 단순 모델이 편향되었을 것이라는 의심이 맞았던 셈입니다. 그 편향이 교육의 영향을 과대평가하고 있었다는 것도 확인됩니다. 다른 요인을 통제하자 추정된 교육의 영향이 줄어들었으니까요.\n", + "방금 추정한 계수에 따르면, IQ, 경력, 근속 연수, 나이 등이 같은 사람들 사이에서는 교육을 1년 더 받는 것이 시간당 임금 4.11% 상승과 연관되어 있다고 기대할 수 있습니다. `educ`만 넣은 첫 번째 단순 모델이 편향되었을 것이라는 의심이 맞았던 셈입니다. 그 편향이 교육의 영향을 과대평가하고 있었다는 것도 확인됩니다. 다른 요인을 통제하자 추정된 교육의 영향이 줄어들었으니까요.\n", "\n", "모든 것을 직접 코딩하는 대신 다른 사람이 만든 소프트웨어를 쓰는 현명함을 발휘하면, 이 추정값에 신뢰구간까지 붙일 수 있습니다." ] @@ -796,7 +796,7 @@ "\n", "![img](data/img/linear-regression/confused_cat.png)\n", "\n", - "좀 더 간결하게 말하면, **모든 교란 요인(confounder)을 모델에서 고려했다면 누락 변수 편향(OVB)은 없습니다**. 여기서 인과 그래프에 관한 지식도 활용할 수 있습니다. 교란 요인은 **처치와 결과 모두의 원인이 되는** 변수입니다. 임금 예제에서는 IQ가 교란 요인입니다. IQ가 높은 사람은 공부가 더 쉬우니 교육을 더 오래 받는 경향이 있으므로, IQ가 교육의 원인이라고 말할 수 있습니다. 또 IQ가 높은 사람은 타고난 생산성도 높아서 임금이 더 높은 경향이 있으므로, IQ는 임금의 원인이기도 합니다. 교란 요인은 처치와 결과 모두에 영향을 주는 변수이므로 T와 Y로 향하는 화살표로 표시합니다. 여기서는 교란 요인을 $W$로 나타냈습니다. 그리고 양의 인과관계는 빨간색, 음의 인과관계는 파란색으로 표시했습니다.\n", + "좀 더 간결하게 말하면, **모든 교란 요인(confounder)을 모델에서 고려했다면 누락 변수 편향(OVB)은 없습니다**. 여기서 인과 그래프에 관한 지식도 활용할 수 있습니다. 교란 요인은 **처치와 결과 모두의 원인이 되는** 변수입니다. 임금 예제에서는 IQ가 교란 요인입니다. IQ가 높은 사람은 공부가 더 쉬워서 교육을 더 오래 받는 경향이 있으니, IQ가 교육의 원인이라고 말할 수 있습니다. 또 IQ가 높은 사람은 타고난 생산성도 높아서 임금이 더 높은 경향이 있으므로, IQ는 임금의 원인이기도 합니다. 교란 요인은 처치와 결과 모두에 영향을 주는 변수이므로 T와 Y로 향하는 화살표로 표시합니다. 여기서는 교란 요인을 $W$로 나타냈습니다. 그리고 양의 인과관계는 빨간색, 음의 인과관계는 파란색으로 표시했습니다.\n", "\n", "> 옮긴이: 앵그리스트의 주문을 우리말로 옮기면 \"짧은 회귀의 계수는 긴 회귀의 계수에, 누락 변수의 효과와 누락 변수를 포함된 변수에 회귀한 계수의 곱을 더한 것과 같다\"입니다. 『실무로 통하는 인과추론 with 파이썬』에서는 짧은 회귀를 '축소모델(short model)'이라고 부릅니다." ] @@ -1173,7 +1173,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "이제 원래 질문으로 돌아갑시다. `educ`가 임금에 미치는 영향으로 추정한 매개변수는 인과적일까요? 이런 말씀을 드려서 죄송하지만, 그것은 모든 교란 요인을 모델에 포함했다는 주장을 얼마나 설득력 있게 펼치거나 반박할 수 있느냐에 달려 있습니다. 개인적으로는 다 포함하지 못했다고 생각합니다. 예를 들어 집안의 재산은 넣지 않았습니다. 부모의 교육 수준을 넣었다고 해도 그것은 재산을 대신 보여 주는 대리변수에 불과합니다. 개인의 야망 같은 요인도 고려하지 않았습니다. 야망이 더 긴 교육 연수와 더 높은 임금을 모두 불러오는 원인일 수 있으니, 야망은 교란 요인입니다. 이 예시가 보여 주려는 것은 **무작위가 아닌 데이터, 즉 관측 데이터로 하는 인과추론은 언제나 어느 정도 의심하며 신중하게 받아들여야 한다**는 점입니다. 모든 교란 요인을 고려했다고 확신할 수는 결코 없습니다.\n", + "이제 원래 질문으로 돌아갑시다. `educ`가 임금에 미치는 영향으로 추정한 매개변수는 인과적일까요? 이런 말씀을 드려서 죄송하지만, 답은 모든 교란 요인을 모델에 포함했다는 주장을 얼마나 설득력 있게 펼치거나 반박할 수 있느냐에 달려 있습니다. 개인적으로는 다 포함하지 못했다고 생각합니다. 예를 들어 집안의 재산은 넣지 않았습니다. 부모의 교육 수준을 넣긴 했지만, 재산을 대신 보여 주는 대리변수에 불과합니다. 개인의 야망 같은 요인도 고려하지 않았습니다. 야망이 더 긴 교육 연수와 더 높은 임금을 모두 불러오는 원인일 수 있으니, 야망은 교란 요인입니다. 이 예시가 보여 주려는 것은 **무작위가 아닌 데이터, 즉 관측 데이터로 하는 인과추론은 언제나 어느 정도 의심하며 신중하게 받아들여야 한다**는 점입니다. 모든 교란 요인을 고려했다고 확신할 수는 결코 없습니다.\n", "\n", "## 핵심 요약\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/06-Grouped-and-Dummy-Regression.ipynb b/causal-inference-for-the-brave-and-true/06-Grouped-and-Dummy-Regression.ipynb index a91c6d7..c377217 100644 --- a/causal-inference-for-the-brave-and-true/06-Grouped-and-Dummy-Regression.ipynb +++ b/causal-inference-for-the-brave-and-true/06-Grouped-and-Dummy-Regression.ipynb @@ -362,7 +362,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "걱정하지 마세요! 회귀분석은 빅데이터가 있어야만 작동하는 게 아닙니다! 선형회귀모델에 가중치를 주면 됩니다. 이렇게 하면 모델이 작은 그룹보다 표본 크기가 큰 그룹을 더 많이 고려합니다. `smf.ols`를 가중 최소제곱법(weighted least squares)을 뜻하는 `smf.wls`로 바꾼 것을 눈여겨보세요. 알아채기 어려울 만큼 작은 차이지만, 이것이 결과를 완전히 바꿉니다." + "걱정하지 마세요! 회귀분석은 빅데이터가 있어야만 작동하는 게 아닙니다! 선형회귀모델에 가중치를 주면 됩니다. 이렇게 하면 모델이 작은 그룹보다 표본 크기가 큰 그룹을 더 많이 고려합니다. `smf.ols`를 가중 최소제곱법(weighted least squares)을 뜻하는 `smf.wls`로 바꾼 것을 눈여겨보세요. 알아채기 어려울 만큼 작은 차이지만, 결과는 완전히 달라집니다." ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "요점은, 회귀분석은 개인 단위 데이터든 집계된 데이터든 모두 다룰 수 있는 놀라운 도구이지만, 집계된 데이터라면 가중치를 써야 한다는 것입니다. 가중 회귀분석을 하려면 평균 통계량이 필요합니다. 합계도, 표준편차도, 중앙값도 아닌 평균입니다! 공변량과 종속변수 모두 평균이어야 합니다. 그룹화된 데이터에 가중 회귀분석을 한 결과가 그룹화하지 않은 데이터의 회귀분석 결과와 정확히 일치하지는 않는다는 점만 기억하세요. 그래도 꽤 비슷하게 나옵니다.\n", + "요점은 이렇습니다. 회귀분석은 개인 단위 데이터든 집계된 데이터든 모두 다룰 수 있는 놀라운 도구이지만, 집계된 데이터라면 가중치를 써야 합니다. 가중 회귀분석을 하려면 평균 통계량이 필요합니다. 합계도, 표준편차도, 중앙값도 아닌 평균입니다! 공변량과 종속변수 모두 평균이어야 합니다. 그룹화된 데이터에 가중 회귀분석을 한 결과가 그룹화하지 않은 데이터의 회귀분석 결과와 정확히 일치하지는 않는다는 점만 기억하세요. 그래도 꽤 비슷하게 나옵니다.\n", "\n", "![img](./data/img/dummy/heterosk.png)\n", "\n", @@ -798,7 +798,7 @@ "\n", "조금 복잡해졌으니 이 모델에서 각 매개변수가 무엇을 뜻하는지 하나씩 살펴보겠습니다. 먼저 절편 $\\beta_0$입니다. 이 녀석은 딱히 흥미로운 해석이 없습니다. 처치가 0(12학년을 졸업하지 않음)이고 IQ도 0일 때의 기대 임금입니다. IQ가 0인 사람은 없을 테니 이 매개변수는 별 의미가 없습니다. $\\beta_1$도 사정이 비슷합니다. 이 매개변수는 **IQ가 0일 때** 12학년을 마치면 기대할 수 있는 임금 증가분입니다. 역시 IQ가 0일 리는 없으니 특별히 흥미로운 의미는 없습니다. 이제 $\\beta_2$는 조금 더 흥미롭습니다. **처치받지 않은 사람에게서** IQ가 임금을 얼마나 올리는지 알려 줍니다. 이 예에서는 0.11 정도입니다. 12학년을 마치지 않은 사람은 IQ가 1점 오를 때마다 시간당 11센트를 더 벌 것으로 기대할 수 있다는 뜻입니다. 마지막으로 가장 흥미로운 매개변수는 $\\beta_3$입니다. IQ가 12학년 졸업의 효과를 얼마나 키우는지 알려 줍니다. 이 예에서는 0.024인데, IQ가 1점 오를 때마다 12학년 졸업으로 얻는 이득이 2센트씩 늘어난다는 뜻입니다. 대단치 않아 보일 수 있지만, IQ가 60인 사람과 140인 사람을 비교해 보세요. 12학년을 졸업하면 앞사람은 임금이 1.44달러(60 * 0.024) 오르지만, IQ가 140인 사람은 3.36달러(140 * 0.024)를 더 벌게 됩니다.\n", "\n", - "간단히 모델링 용어로 말하면, 이 상호작용 항 덕분에 처치효과가 특성 수준(이 예에서는 IQ뿐)에 따라 달라질 수 있습니다. 그 결과 예측선을 그려 보면 두 직선이 더는 평행하지 않고, 12학년을 졸업한 사람들(T=1)의 직선이 IQ에 대해 더 가파릅니다. IQ가 높은 사람일수록 졸업으로 얻는 이득이 더 크다는 뜻입니다. 이를 효과 수정(effect modification) 또는 이질적 처치효과(heterogeneous treatment effect)라고 부르기도 합니다." + "간단히 모델링 용어로 말하면, 이 상호작용 항 덕분에 처치효과가 특성 수준(이 예에서는 IQ뿐)에 따라 달라질 수 있습니다. 그 결과 예측선을 그려 보면 두 직선이 더는 평행하지 않고, 12학년을 졸업한 사람들(T=1)의 직선이 IQ에 따른 기울기가 더 가파릅니다. IQ가 높은 사람일수록 졸업으로 얻는 이득이 더 크다는 뜻입니다. 이를 효과 수정(effect modification) 또는 이질적 처치효과(heterogeneous treatment effect)라고 부르기도 합니다." ] }, { @@ -936,7 +936,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "교육 연수를 범주로 다루면 교육의 효과를 더는 매개변수 하나로 제한하지 않습니다. 대신 교육 연수마다 고유한 효과를 갖도록 허용합니다. 이렇게 하면 교육의 효과가 더는 모수적이지 않으므로 유연성이 생깁니다. 이 모델은 그저 교육 연수별 평균 임금을 계산할 뿐입니다." + "교육 연수를 범주로 다루면 교육의 효과를 더는 매개변수 하나로 제한하지 않습니다. 대신 교육 연수마다 고유한 효과를 갖도록 허용합니다. 이렇게 하면 교육의 효과가 이제 모수적이지 않으므로 유연성이 생깁니다. 이 모델은 그저 교육 연수별 평균 임금을 계산할 뿐입니다." ] }, { @@ -1076,7 +1076,7 @@ "E\\{ \\ (E[Y_i|T=1, Group_i] - E[Y_i|T=0, Group_i])w(Group_i) \\ \\}\n", "$\n", "\n", - "$w(Group_i)$는 그룹 내 처치의 분산 $Var(T_i|Group_i)$와 정확히 같지는 않지만 비례합니다. 여기서 자연스럽게 떠오르는 질문이 있습니다. 그룹 가중치로 표본 크기를 쓰는 완전한 비모수 추정량을 쓰면 되지 않을까요? 그것도 타당한 추정량이지만, 회귀분석이 하는 방식은 아닙니다. 회귀분석은 처치의 분산을 가중치로 쓰기 때문에 처치가 많이 변하는 그룹에 더 큰 가중치를 둡니다. 직관적으로도 말이 됩니다. 처치가 거의 일정하다면(예를 들어 한 명만 처치받고 나머지는 모두 처치받지 않았다면) 표본 크기가 아무리 커도 소용없습니다. 처치효과에 대해 알려 주는 정보가 별로 없기 때문입니다." + "$w(Group_i)$는 그룹 내 처치의 분산 $Var(T_i|Group_i)$와 정확히 같지는 않지만 비례합니다. 여기서 자연스럽게 떠오르는 질문이 있습니다. 그룹 가중치로 표본 크기를 쓰는 완전한 비모수 추정량을 쓰면 되지 않을까요? 그것도 타당한 추정량이지만, 회귀분석이 하는 방식은 아닙니다. 회귀분석은 처치의 분산을 가중치로 쓰기 때문에 처치가 많이 변하는 그룹에 더 큰 가중치를 둡니다. 직관적으로도 말이 됩니다. 처치가 거의 일정하다면(예를 들어 한 명만 처치받고 나머지는 모두 처치받지 않았다면) 표본 크기가 아무리 커도 소용없습니다. 처치효과를 알려 주는 정보가 별로 없기 때문입니다." ] }, { @@ -1160,7 +1160,7 @@ "\n", "이 장은 어떤 데이터 포인트가 다른 데이터 포인트보다 더 중요하다는 이야기로 시작했습니다. 선형모델을 추정할 때는 표본 크기가 크고 분산이 작은 데이터 포인트에 더 큰 가중치를 줘야 합니다. 이어서 모델에 표본 가중치를 쓰기만 하면 선형회귀가 그룹화되고 익명화된 데이터도 우아하게 다룰 수 있다는 것을 보았습니다.\n", "\n", - "다음으로 더미 회귀분석으로 넘어갔습니다. 더미 회귀분석을 처치가 결과에 영향을 미치는 함수 형태에 대해 아무런 가정도 두지 않는 비모수 모델로 만들 수 있다는 것을 보았습니다. 그리고 더미 회귀분석에 담긴 직관을 살펴보았습니다.\n", + "다음으로 더미 회귀분석으로 넘어갔습니다. 더미 회귀분석을 쓰면 처치가 결과에 영향을 미치는 함수 형태를 전혀 가정하지 않는 비모수 모델을 만들 수 있다는 것을 보았습니다. 그리고 더미 회귀분석에 담긴 직관을 살펴보았습니다.\n", "\n", "## 참고 자료\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/07-Beyond-Confounders.ipynb b/causal-inference-for-the-brave-and-true/07-Beyond-Confounders.ipynb index 38ffa59..087edb7 100644 --- a/causal-inference-for-the-brave-and-true/07-Beyond-Confounders.ipynb +++ b/causal-inference-for-the-brave-and-true/07-Beyond-Confounders.ipynb @@ -9,7 +9,7 @@ "\n", "## 좋은 통제변수\n", "\n", - "회귀 모델에 통제변수(control)를 추가하면 인과효과를 식별하는 데 도움이 된다는 것을 앞에서 살펴봤습니다. 통제변수가 교란 요인(confounder)이라면 모델에 넣는 것은 있으면 좋은 정도가 아니라 반드시 필요한 일입니다. 이를 본 부주의한 사람은 측정할 수 있는 것이라면 무엇이든 모델에 집어넣으려 하기 쉽습니다. 빅데이터 시대인 요즘에는 그런 변수가 1000개를 훌쩍 넘기도 합니다. 그런데 알고 보면 이렇게 하는 것은 불필요할 뿐 아니라 인과효과 식별(identification)을 오히려 해칠 수 있습니다. 이제 교란 요인이 아닌 통제변수로 눈을 돌려 보겠습니다. 먼저 좋은 통제변수를 살펴본 다음, 해로운 통제변수를 자세히 알아보겠습니다.\n", + "회귀 모델에 통제변수(control)를 추가하면 인과효과를 식별하는 데 도움이 된다는 것을 앞에서 살펴봤습니다. 통제변수가 교란 요인(confounder)이라면 모델에 넣는 것은 있으면 좋은 정도가 아니라 반드시 필요한 일입니다. 이 말만 듣고 섣불리 움직이는 사람은 측정할 수 있는 것이라면 무엇이든 모델에 집어넣으려 하기 쉽습니다. 빅데이터 시대인 요즘에는 그런 변수가 1000개를 훌쩍 넘기도 합니다. 그런데 알고 보면 이는 불필요할 뿐 아니라 인과효과 식별(identification)을 오히려 해칠 수 있습니다. 이제 교란 요인이 아닌 통제변수로 눈을 돌려 보겠습니다. 먼저 좋은 통제변수를 살펴본 다음, 해로운 통제변수를 자세히 알아보겠습니다.\n", "\n", "문제를 실감 나게 이해하기 위해 예를 하나 들어 보겠습니다. 여러분이 한 핀테크 회사의 채권 추심팀에서 일하는 데이터 과학자라고 해 봅시다. 이번 과제는 연체 고객에게 채무 조정 협상을 제안하는 이메일을 보내면 어떤 효과가 있는지 알아내는 것입니다. 결과변수는 연체 고객의 상환액입니다.\n", "\n", @@ -231,7 +231,7 @@ "\n", "먼저 처치효과가 실제로 있는데도 통계적 유의성을 찾지 못하는 이유부터 이해해 봅시다. 이번 경우처럼 처치가 결과에 미치는 영향이 아주 작을 수 있습니다. 생각해 보면 사람들이 빚을 갚게 만드는 요인은 대부분 추심 부서가 통제할 수 없는 것들입니다. 사람들은 새 직장을 구하거나, 재정과 소득을 잘 관리하는 등의 이유로 빚을 갚습니다. 통계 용어로 말하면 **상환액의 변동성은 이메일보다 다른 요인으로 훨씬 더 많이 설명된다**고 할 수 있습니다.\n", "\n", - "이를 눈으로 확인하기 위해 처치변수인 이메일에 대해 상환액을 그려 보겠습니다. 위 모델의 적합선도 빨간색으로 함께 그렸습니다. 보기 편하도록 이메일 변수에 약간의 잡음을 더해 점들이 0이나 1에 몰려 겹치지 않게 했습니다." + "이를 눈으로 확인하려고 처치변수인 이메일을 가로축에, 상환액을 세로축에 놓고 그려 보겠습니다. 위 모델의 적합선도 빨간색으로 함께 그렸습니다. 보기 편하도록 이메일 변수에 약간의 잡음을 더해 점들이 0이나 1에 몰려 겹치지 않게 했습니다." ] }, { @@ -310,7 +310,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "이렇게 하면 종속변수의 분산이 줄어듭니다. 상환액을 신용 한도와 위험 점수에 회귀하고 그 잔차를 구하면, 원래 변수보다 변동성이 훨씬 작은 새로운 종속변수가 만들어집니다. 마지막 모델은 유효한 표준오차 추정값과 함께 `ATE`도 찾아냅니다.\n", + "이렇게 하면 종속변수의 분산이 줄어듭니다. 상환액을 신용 한도와 위험 점수에 회귀하고 그 잔차를 구하면, 원래 변수보다 변동성이 훨씬 작은 새로운 종속변수가 만들어집니다. 마지막 모델로 `ATE`와 함께 유효한 표준오차 추정값도 얻을 수 있습니다.\n", "\n", "호기심 삼아, 처치를 예측하는 모델로는 처치의 분산을 줄일 수 없다는 것도 확인해 볼 수 있습니다. 이메일은 설계상 무작위로 배정되었으므로 어떤 변수로도 예측할 수 없기 때문입니다." ] @@ -855,7 +855,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "이번에는 직관에 맞는 ATE가 나왔습니다. 이제는 신약이 실제로 입원 일수를 줄이는 것으로 보입니다. 하지만 병원을 하나씩 따로 보고 있어서 데이터가 충분하지 않습니다. 그 결과 통계적으로 유의한 결과를 얻지 못했습니다.\n", + "이번에는 직관에 맞는 ATE가 나왔습니다. 이제는 신약이 실제로 입원 일수를 줄이는 것으로 보입니다. 하지만 병원을 하나씩 따로 보고 있어서 데이터가 충분하지 않고, 그래서 통계적 유의성도 확보하지 못했습니다.\n", "\n", "회귀분석의 힘을 활용하는 다른 방법은 중증도를 모델에 넣어 통제하는 것입니다." ] @@ -1530,7 +1530,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "이메일은 설계상 무작위이므로 이메일의 원인은 없습니다. 그리고 신용 한도와 위험 점수가 상환액의 원인이라는 것도 알고 있습니다(적어도 그렇게 믿을 만한 강한 근거가 있습니다). 이메일도 상환액의 원인이라고 생각합니다. `opened` 역시 상환액의 원인이라고 봅니다. 직관적으로 추심 이메일을 열어 본 사람은 채무 조정에 응하고 빚을 갚을 의향이 더 클 것입니다. 같은 이유로 `opened`는 합의의 원인이기도 합니다. 또한 `opened`의 원인은 이메일이며, 위험 점수와 신용 한도에 따라 이메일 열람률이 다를 것이라고 볼 근거도 있으므로 신용 한도와 위험 점수도 `opened`의 원인입니다. 합의 역시 `opened`의 영향을 받는다고 봅니다. 결과변수인 상환액은 다음과 같은 퍼널의 결과로 볼 수 있습니다.\n", + "이메일은 설계상 무작위이므로 이메일의 원인은 없습니다. 그리고 신용 한도와 위험 점수가 상환액의 원인이라는 것도 알고 있습니다(적어도 그렇게 믿을 만한 강한 근거가 있습니다). 이메일도 상환액의 원인이라고 생각합니다. `opened` 역시 상환액의 원인이라고 봅니다. 직관적으로 추심 이메일을 열어 본 사람은 채무 조정에 응하고 빚을 갚을 의향이 더 클 것입니다. 같은 이유로 `opened`는 합의의 원인이기도 합니다. 또한 `opened`의 원인은 이메일입니다. 위험 점수와 신용 한도에 따라 이메일 열람률이 다를 것이라고 볼 근거도 있으므로, 신용 한도와 위험 점수도 `opened`의 원인입니다. 합의 역시 `opened`의 영향을 받는다고 봅니다. 결과변수인 상환액은 다음과 같은 퍼널의 결과로 볼 수 있습니다.\n", "\n", "$\n", "email -> opened -> agreement -> payment \n", @@ -1567,7 +1567,7 @@ "4. 자녀가 혼외 관계에 미치는 영향을 추정하면서 결혼 생활의 행복도를 통제하는 경우\n", "5. 상환액 $E[Payments]$를 모델링할 때, 상환이 일어날지 예측하는 이진 모델과 상환이 일어난다는 조건에서 얼마를 상환할지 예측하는 모델로 나누는 경우: $E[Payments|Payments>0]*P(Payments>0)$\n", " \n", - "이 아이디어들에서 눈여겨볼 점은 모두 꽤 합리적으로 들린다는 것입니다. 선택편향은 대개 그렇습니다. 경고로 받아들이세요. 사실 저도 이것들이 얼마나 나쁜지 깨닫기 전까지 위의 함정에 수도 없이 빠졌습니다. 그중에서도 마지막 사례는 무척 영리해 보이는 탓에 많은 데이터 과학자가 허를 찔리므로 좀 더 설명할 가치가 있습니다. 워낙 흔해서 별명까지 있을 정도입니다. 바로 **나쁜 COP**(The Bad COP)입니다!\n", + "이 아이디어들에서 눈여겨볼 점은 모두 꽤 합리적으로 들린다는 것입니다. 선택편향은 대개 그렇습니다. 경고로 받아들이세요. 사실 저도 이것들이 얼마나 나쁜지 깨닫기 전까지 위의 함정에 수도 없이 빠졌습니다. 그중에서도 마지막 사례는 좀 더 설명할 가치가 있습니다. 무척 영리해 보여서 많은 데이터 과학자가 허를 찔리기 때문입니다. 워낙 흔해서 별명까지 있을 정도입니다. 바로 **나쁜 COP**(The Bad COP)입니다!\n", "\n", "### 나쁜 COP\n", "\n", @@ -1649,11 +1649,11 @@ "\\end{align*} \n", "$$\n", "\n", - "두 번째 등식은 $E[Y_{i0}|Y_{i1}>0]$를 더하고 빼서 얻습니다. COP 효과를 분해하면 먼저 참여자 하위 집단에 대한 인과효과가 나옵니다. 이 예시에서는 조금이라도 지출하기로 한 사람들에 대한 인과효과입니다. 다음으로 편향 항이 나오는데, 처치에 배정되었을 때 참여하는 사람들($E[Y_{i0}|Y_{i1}>0]$)과 처치 없이도 참여하는 사람들($E[Y_{i0}|Y_{i0}>0]$)의 $Y_0$ 차이입니다. 이 예시에서는 이 편향이 음수일 가능성이 큽니다. 처치에 배정되었을 때 지출하는 사람들은 처치를 받지 않았다면, 처치 없이도 지출하는 사람들보다 덜 썼을 가능성이 크기 때문입니다. 즉, $E[Y_{i0}|Y_{i1}>0] < E[Y_{i0}|Y_{i0}>0]$입니다.\n", + "두 번째 등식은 $E[Y_{i0}|Y_{i1}>0]$를 더하고 빼서 얻습니다. COP 효과를 분해하면 먼저 참여자 하위 집단에 대한 인과효과가 나옵니다. 이 예시에서는 조금이라도 지출하기로 한 사람들에 대한 인과효과입니다. 다음으로 편향 항이 나오는데, 처치에 배정되었을 때 참여하는 사람들($E[Y_{i0}|Y_{i1}>0]$)과 처치 없이도 참여하는 사람들($E[Y_{i0}|Y_{i0}>0]$)의 $Y_0$ 차이입니다. 이 예시에서는 이 편향이 음수일 가능성이 큽니다. 처치에 배정되었을 때 지출하는 사람들은, 처치를 받지 않았다면 처치 없이도 지출하는 사람들보다 덜 썼을 가능성이 크기 때문입니다. 즉, $E[Y_{i0}|Y_{i1}>0] < E[Y_{i0}|Y_{i0}>0]$입니다.\n", "\n", "![img](./data/img/beyond-conf/cop.png)\n", "\n", - "COP 편향이 처음에는 굉장히 직관에 어긋난다는 것을 알기에, 시각적인 예를 하나 살펴보면 좋겠습니다. 마케팅 캠페인이 우리 제품에 대한 고객 지출을 얼마나 늘리는지 추정하고 싶다고 해 봅시다. 캠페인은 무작위로 배정되었으므로 교란은 걱정하지 않아도 됩니다. 이 예시에서는 고객을 두 세그먼트로 나눌 수 있습니다. 첫째, 마케팅 캠페인을 봐야만 우리 제품을 사는 고객이 있습니다. 이들을 알뜰 고객(frugal)이라고 부르겠습니다. 누군가 등을 한 번 더 떠밀어 주지 않으면 지갑을 열지 않는 사람들입니다. 다음으로 캠페인이 없어도 지출하는 고객이 있습니다. 캠페인을 보면 더 많이 쓰지만, 캠페인을 보지 않았더라도 어차피 지출했을 사람들입니다. 이들을 부자 고객(rich)이라고 부르겠습니다. 그림에서 반사실(counterfactual)은 연한 색과 점선으로 표시했습니다. \n", + "COP 편향은 처음 접하면 굉장히 직관에 어긋나 보이므로, 그림으로 예를 하나 살펴보는 게 좋겠습니다. 마케팅 캠페인이 우리 제품에 대한 고객 지출을 얼마나 늘리는지 추정하고 싶다고 해 봅시다. 캠페인은 무작위로 배정되었으므로 교란은 걱정하지 않아도 됩니다. 이 예시에서는 고객을 두 세그먼트로 나눌 수 있습니다. 첫째, 마케팅 캠페인을 봐야만 우리 제품을 사는 고객이 있습니다. 이들을 알뜰 고객(frugal)이라고 부르겠습니다. 누군가 등을 한 번 더 떠밀어 주지 않으면 지갑을 열지 않는 사람들입니다. 다음으로 캠페인이 없어도 지출하는 고객이 있습니다. 캠페인을 보면 더 많이 쓰지만, 캠페인을 보지 않았더라도 어차피 지출했을 사람들입니다. 이들을 부자 고객(rich)이라고 부르겠습니다. 그림에서 반사실(counterfactual)은 연한 색과 점선으로 표시했습니다. \n", "\n", "![img](./data/img/beyond-conf/cop-ex1.png)\n", "\n", @@ -1772,7 +1772,7 @@ "source": [ "## 핵심 요약\n", "\n", - "이 장에서는 교란 요인이 아닌 변수를 살펴보고, 인과효과를 식별할 때 이런 변수를 모델에 넣어야 하는지 알아봤습니다. 결과 $y$를 잘 예측하는 변수는 $T$를 예측하지 않더라도(교란 요인이 아니더라도) 모델에 넣어야 한다는 것을 확인했습니다. $Y$를 예측하면 그 분산이 줄어들어, 인과효과를 추정할 때 통계적으로 유의한 결과를 얻을 가능성이 커지기 때문입니다. 다음으로 처치는 예측하지만 결과는 예측하지 않는 변수를 넣는 것은 좋지 않다는 것을 알아봤습니다. 이런 변수는 처치의 변동성을 줄여 인과효과를 찾기 어렵게 만듭니다. 마지막으로 선택편향을 살펴봤습니다. 선택편향은 처치에서 결과로 가는 인과 경로 위의 변수나 처치와 결과의 공통 효과인 변수를 통제할 때 생기는 편향입니다.\n", + "이 장에서는 교란 요인이 아닌 변수를 살펴보고, 인과효과를 식별할 때 이런 변수를 모델에 넣어야 하는지 알아봤습니다. 결과 $y$를 잘 예측하는 변수는 $T$를 예측하지 않더라도(교란 요인이 아니더라도) 모델에 넣어야 한다는 것을 확인했습니다. 이런 변수는 $Y$의 분산을 줄여 주므로 인과효과를 추정할 때 통계적으로 유의한 결과를 얻을 가능성이 커지기 때문입니다. 다음으로 처치는 예측하지만 결과는 예측하지 않는 변수를 넣는 것은 좋지 않다는 것을 알아봤습니다. 이런 변수는 처치의 변동성을 줄여 인과효과를 찾기 어렵게 만듭니다. 마지막으로 선택편향을 살펴봤습니다. 선택편향은 처치에서 결과로 가는 인과 경로 위의 변수나 처치와 결과의 공통 효과인 변수를 통제할 때 생기는 편향입니다.\n", "\n", "## 참고 자료\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/08-Instrumental-Variables.ipynb b/causal-inference-for-the-brave-and-true/08-Instrumental-Variables.ipynb index e88b6c3..c5974e2 100644 --- a/causal-inference-for-the-brave-and-true/08-Instrumental-Variables.ipynb +++ b/causal-inference-for-the-brave-and-true/08-Instrumental-Variables.ipynb @@ -8,7 +8,7 @@ "\n", "## 누락 변수 편향 우회하기\n", "\n", - "누락 변수 편향(OVB)을 통제하는 한 가지 방법은, 뭐, 빠뜨린 변수를 모델에 넣는 것입니다. 하지만 늘 그렇게 할 수 있는 것은 아닙니다. 대개는 누락된 변수에 대한 데이터가 아예 없기 때문입니다. 예를 들어 교육이 임금에 미치는 효과를 다룬 모델로 돌아가 보겠습니다.\n", + "누락 변수 편향(OVB)을 통제하는 한 가지 방법은, 뭐, 빠뜨린 변수를 모델에 넣는 것입니다. 하지만 늘 그렇게 할 수 있는 것은 아닙니다. 누락된 변수의 데이터가 아예 없을 때가 많기 때문입니다. 예를 들어 교육이 임금에 미치는 효과를 다룬 모델로 돌아가 보겠습니다.\n", "\n", "$\n", "\\log(\\mathrm{wage})_i = \\beta_0 + \\kappa \\ \\mathrm{educ}_i + \\pmb{\\beta}\\mathrm{Ability}_i + u_i\n", @@ -236,7 +236,7 @@ "Y_i = \\beta_0 + \\kappa \\ T_i + \\pmb{\\beta}W_i + u_i\n", "$\n", "\n", - "하지만 $W$에 대한 데이터가 없으므로 돌릴 수 있는 식은 이것뿐입니다.\n", + "하지만 $W$의 데이터가 없으므로 돌릴 수 있는 식은 이것뿐입니다.\n", "\n", "$\n", "Y_i = \\beta_0 + \\kappa\\ T_i + v_i\n", @@ -246,7 +246,7 @@ "v_i = \\pmb{\\beta}W_i + u_i\n", "$\n", "\n", - "$W$는 교란 요인이므로 $\\mathrm{Cov}(T, v) \\neq 0$입니다. 지금 가진 것은 긴 식이 아니라 짧은 식입니다. 앞의 예로 말하면 능력이 교육과 상관관계가 있다는 뜻입니다. 이 경우 짧은 회귀식을 돌리면 누락 변수 때문에 $\\kappa$에 대한 편향된 추정량을 얻게 됩니다.\n", + "$W$는 교란 요인이므로 $\\mathrm{Cov}(T, v) \\neq 0$입니다. 지금 가진 것은 긴 식이 아니라 짧은 식입니다. 앞의 예로 말하면 능력이 교육과 상관관계가 있다는 뜻입니다. 이 경우 짧은 회귀식을 돌리면 누락 변수 때문에 $\\kappa$의 추정량이 편향됩니다.\n", "\n", "이제 도구변수의 마법을 감상할 차례입니다! 도구변수 Z는 T를 거쳐서만 결과와 상관관계를 가지므로 $\\mathrm{Cov}(Z,v) = 0$입니다. 그렇지 않다면 Z에서 W를 거쳐 Y로 가는 두 번째 경로가 있다는 뜻이 되니까요. 이 점을 염두에 두면 다음과 같이 쓸 수 있습니다.\n", "\n", @@ -270,7 +270,7 @@ "\\kappa = \\dfrac{\\frac{\\partial y}{\\partial z}}{\\frac{\\partial T}{\\partial z}} = \\dfrac{\\partial y}{\\partial z} * \\dfrac{\\partial z}{\\partial T} = \\dfrac{\\partial y}{\\partial T}\n", "$\n", "\n", - "이 식이 보여 주는 바는 대부분의 사람이 생각하는 것보다 미묘하고, 또 생각보다 훨씬 멋집니다. 도구변수를 이렇게 쓰면 이런 말을 하는 셈입니다. \"봐, 교란 요인 때문에 T가 Y에 미치는 영향은 알아내기 어려워. 그런데 Z가 Y에 미치는 영향은 쉽게 구할 수 있지. Z와 Y에 함께 영향을 주는 건 아무것도 없으니까(배제 제약). 하지만 내가 궁금한 건 Z가 Y에 미치는 영향이 아니라 T가 Y에 미치는 영향이야. 그러니 구하기 쉬운 Z의 Y에 대한 효과를 먼저 추정하고, 그 값을 **Z가 T에 미치는 효과로 환산해서** Z 단위가 아닌 T 단위의 효과로 바꾸면 돼.\"\n", + "이 식에 담긴 뜻은 사람들이 흔히 생각하는 것보다 미묘하고, 또 훨씬 멋집니다. 도구변수를 이렇게 쓰면 이런 말을 하는 셈입니다. \"봐, 교란 요인 때문에 T가 Y에 미치는 영향은 알아내기 어려워. 그런데 Z가 Y에 미치는 영향은 쉽게 구할 수 있지. Z와 Y에 함께 영향을 주는 건 아무것도 없으니까(배제 제약). 하지만 내가 궁금한 건 Z가 Y에 미치는 영향이 아니라 T가 Y에 미치는 영향이야. 그러니 구하기 쉬운 쪽, 즉 Z가 Y에 미치는 효과를 먼저 추정하고, 그 값을 **Z가 T에 미치는 효과로 환산해서** Z 단위가 아닌 T 단위의 효과로 바꾸면 돼.\"\n", "\n", "도구변수가 더미변수인 단순한 경우에서도 이를 확인할 수 있습니다. 이때 도구변수 추정량은 두 평균 차이의 비율로 더 간단해집니다.\n", "\n", @@ -278,11 +278,11 @@ "\\kappa = \\dfrac{E[Y|Z=1]-E[Y|Z=0]}{E[T|Z=1]-E[T|Z=0]}\n", "$\n", "\n", - "이 비율을 **왈드 추정량**(Wald estimator)이라고 부르기도 합니다. 여기서도 같은 도구변수 이야기를 할 수 있습니다. 알고 싶은 것은 T가 Y에 미치는 효과인데, 이는 구하기 어렵습니다. 그래서 구하기 쉬운 Z의 Y에 대한 효과에 집중합니다. 정의상 Z는 T를 통해서만 Y에 영향을 주므로, Z가 Y에 미치는 영향을 T가 Y에 미치는 영향으로 바꿀 수 있습니다. Z의 Y에 대한 효과를 Z의 T에 대한 효과로 나누어 환산하면 됩니다.\n", + "이 비율을 **왈드 추정량**(Wald estimator)이라고 부르기도 합니다. 여기서도 같은 도구변수 이야기를 할 수 있습니다. 알고 싶은 것은 T가 Y에 미치는 효과인데, 이는 구하기 어렵습니다. 그래서 구하기 쉬운 쪽, 즉 Z가 Y에 미치는 효과에 집중합니다. 정의상 Z는 T를 통해서만 Y에 영향을 주므로, Z가 Y에 미치는 영향을 T가 Y에 미치는 영향으로 바꿀 수 있습니다. Z가 Y에 미치는 효과를 Z가 T에 미치는 효과로 나누어 환산하면 됩니다.\n", "\n", "## 출생 분기와 교육이 임금에 미치는 효과\n", "\n", - "지금까지는 도구변수를 처치를 통해서만 결과에 영향을 주는 기적 같은 성질을 지닌 마법의 변수 $Z$로 다뤄 왔습니다. 솔직히 말해 좋은 도구변수는 너무 찾기 어려워서 기적이라고 불러도 과언이 아닙니다. 마음 약한 사람이 할 일은 아니라고만 해 두겠습니다. 소문에 따르면 시카고학파의 잘나가는 친구들은 술집에서 자기가 이런저런 도구변수를 어떻게 생각해 냈는지 떠든다고 합니다.\n", + "지금까지는 도구변수를 마법의 변수 $Z$처럼 다뤄 왔습니다. 처치를 통해서만 결과에 영향을 준다는 기적 같은 성질을 지닌 변수 말입니다. 솔직히 말해 좋은 도구변수는 너무 찾기 어려워서 기적이라고 불러도 과언이 아닙니다. 마음 약한 사람이 할 일은 아니라고만 해 두겠습니다. 소문에 따르면 시카고학파의 잘나가는 친구들은 술집에서 자기가 이런저런 도구변수를 어떻게 생각해 냈는지 떠든다고 합니다.\n", "\n", "![img](./data/img/iv/good-iv.png)\n", "\n", @@ -510,7 +510,7 @@ "\n", "출생 분기를 도구변수로 쓰기 전에 이것이 타당한 도구변수인지 확인해야 합니다. 즉, 도구변수의 두 가지 가정이 성립한다고 주장할 수 있어야 합니다.\n", "\n", - "1. $\\mathrm{Cov}(Z, T) \\neq 0$. 1단계가 강해야 한다는 것, 다시 말해 도구변수가 실제로 처치변수에 영향을 주어야 한다는 뜻입니다.\n", + "1. $\\mathrm{Cov}(Z, T) \\neq 0$. 강한 1단계가 있어야 한다는 조건입니다. 다시 말해 도구변수가 실제로 처치변수에 영향을 주어야 합니다.\n", "2. $Y \\perp Z | T $. 배제 제약으로, 도구변수 Z가 처치 T를 통해서만 결과 Y에 영향을 준다는 뜻입니다.\n", "\n", "다행히 첫 번째 가정은 검증할 수 있습니다. $\\mathrm{Cov}(Z, T)$가 0이 아님을 데이터로 확인할 수 있으니까요. 이 예에서 출생 분기가 앞서 말한 대로 도구변수 역할을 한다면, 그해 마지막 분기에 태어난 사람이 연초에 태어난 사람보다 교육을 조금 더 오래 받았어야 합니다. 이를 확인하는 통계 검정을 돌리기 전에 먼저 데이터를 그려서 직접 눈으로 보겠습니다." @@ -719,7 +719,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "그해 마지막 분기에 태어난 사람은 다른 분기에 태어난 사람보다 평균적으로 교육 연수가 0.1년 더 긴 것으로 보입니다. p 값은 0에 가깝습니다. 출생 분기가 교육 연수를 늘리거나 줄이는지에 대한 수사는 이것으로 종결입니다.\n", + "그해 마지막 분기에 태어난 사람은 다른 분기에 태어난 사람보다 평균적으로 교육 연수가 0.1년 더 긴 것으로 보입니다. p 값은 0에 가깝습니다. 출생 분기가 교육 연수를 늘리느냐 줄이느냐를 둘러싼 수사는 이것으로 종결입니다.\n", "\n", "![img](./data/img/iv/incomplete-files.png)\n", "\n", @@ -804,7 +804,7 @@ "\n", "## 도구변수를 직접 계산하기\n", "\n", - "축약형과 1단계를 모두 구했으니, 이제 1단계의 효과로 축약형을 환산할 수 있습니다. 1단계 계수가 대략 0.1이었으므로, 축약형 계수에 거의 10을 곱하는 셈이 됩니다. 이렇게 하면 평균 인과효과에 대한 편향 없는 도구변수 추정값을 얻습니다.\n", + "축약형과 1단계를 모두 구했으니, 이제 1단계의 효과로 축약형을 환산할 수 있습니다. 1단계 계수가 대략 0.1이었으므로, 축약형 계수에 거의 10을 곱하는 셈이 됩니다. 이렇게 하면 평균 인과효과의 편향 없는 도구변수 추정값을 얻습니다.\n", "\n", "$\n", "\\mathrm{ATE}_{IV} = \\dfrac{\\text{Reduced Form}}{\\text{1st Stage}} \n", @@ -893,7 +893,7 @@ "source": [ "보다시피 매개변수가 정확히 같습니다. 도구변수를 이렇게 두 번째 방식으로 보면 직관을 얻는 데 도움이 됩니다. 2SLS에서 1단계는 누락 변수 편향을 걷어 낸 새로운 버전의 처치를 만듭니다. 그런 다음 이 정제된 처치, 즉 1단계의 적합값을 선형회귀에 사용합니다.\n", "\n", - "하지만 실무에서는 도구변수를 손으로 계산하지 않습니다. 번거로워서가 아니라, 이렇게 돌린 2단계에서 얻는 표준오차가 조금 어긋나기 때문입니다. 대신 늘 컴퓨터가 일을 하도록 맡겨야 합니다. 파이썬에서는 [linearmodels](https://bashtage.github.io/linearmodels/) 라이브러리를 쓰면 2SLS를 올바르게 돌릴 수 있습니다.\n", + "하지만 실무에서는 도구변수를 손으로 계산하지 않습니다. 번거로워서가 아니라, 이렇게 돌린 2단계에서 얻는 표준오차가 조금 어긋나기 때문입니다. 대신 언제나 컴퓨터에 맡겨야 합니다. 파이썬에서는 [linearmodels](https://bashtage.github.io/linearmodels/) 라이브러리를 쓰면 2SLS를 올바르게 돌릴 수 있습니다.\n", "\n", "2SLS의 공식 표기는 조금 다릅니다. 공식 안에 1단계를 \\[ \\] 사이에 넣어야 합니다. 이 예에서는 `years_of_schooling ~ q4`를 넣습니다. 추가 통제변수는 1단계에 넣을 필요가 없습니다. 2단계에 넣으면 컴퓨터가 알아서 1단계에도 넣어 주기 때문입니다. 그래서 `year_of_birth`와 `state_of_birth`는 1단계 공식 바깥에 넣습니다." ] @@ -1013,7 +1013,7 @@ "\n", "![img](./data/img/iv/weak-iv.png)\n", "\n", - "도구변수를 다룰 때는 평균 처치효과(ATE)를 간접적으로 추정하고 있다는 사실을 기억해야 합니다. 추정값은 1단계와 2단계 모두에 좌우됩니다. 처치가 결과에 미치는 영향이 정말 강하다면 2단계도 강할 것입니다. 하지만 1단계가 약하면 2단계가 아무리 강해도 소용이 없습니다. 1단계가 약하다는 것은 도구변수와 처치의 상관관계가 아주 작다는 뜻입니다. 그러니 도구변수로부터 처치에 대해 알아낼 수 있는 것이 별로 없습니다.\n", + "도구변수를 다룰 때는 평균 처치효과(ATE)를 간접적으로 추정하고 있다는 사실을 기억해야 합니다. 추정값은 1단계와 2단계 모두에 좌우됩니다. 처치가 결과에 미치는 영향이 정말 강하다면 2단계도 강할 것입니다. 하지만 1단계가 약하면 2단계가 아무리 강해도 소용이 없습니다. 1단계가 약하다는 것은 도구변수와 처치의 상관관계가 아주 작다는 뜻입니다. 그러니 도구변수에서 처치에 관해 얻을 수 있는 정보가 별로 없습니다.\n", "\n", "도구변수 표준오차 공식은 조금 복잡하고 직관적이지 않으므로, 이 문제를 이해하기 위해 다른 방법을 써 보겠습니다. 결과 Y에 2.0의 효과를 주는 처치 T, 관측되지 않은 교란 요인 U, 추가 통제변수 X가 있는 데이터를 시뮬레이션합니다. 또 1단계의 강도가 서로 다른 도구변수도 여러 개 만듭니다.\n", "\n", @@ -1271,11 +1271,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "위 그래프에서 보듯이 T와 Z의 상관관계가 약하면 추정값이 크게 요동칩니다. 상관관계가 낮을수록 표준오차도 크게 커지기 때문입니다.\n", + "위 그래프에서 보듯이 T와 Z의 상관관계가 약하면 추정값이 크게 요동칩니다. 상관관계가 낮을수록 표준오차가 훨씬 커지기 때문입니다.\n", "\n", "또 하나 주목할 점은 **2SLS가 편향되어 있다**는 것입니다! 상관관계가 높아도 매개변수 추정값은 실제 ATE인 2.0에 이르지 못합니다. 심지어 2.0은 95% 신뢰구간 안에 들지도 않습니다! 2SLS는 일치성(consistency)만 갖습니다. 표본 크기가 충분히 크면 실제 매개변수 값에 가까워진다는 뜻입니다. 하지만 얼마나 커야 충분한지는 알 수 없습니다. 이 편향이 어떻게 움직이는지 이해하려면 몇 가지 경험칙에 기댈 수밖에 없습니다.\n", "\n", - "1. 2SLS는 OLS 쪽으로 편향됩니다. OLS에 음의 편향이나 양의 편향이 있으면 2SLS에도 같은 편향이 있다는 뜻입니다. 누락 변수가 있을 때 OLS는 일치성이 없지만 2SLS는 적어도 일치성이 있다는 것이 2SLS의 장점입니다. 위 예에서 관측되지 않은 U는 결과에 음의 영향을 주지만 처치와는 양의 상관관계가 있으므로 음의 편향이 생깁니다. 그래서 ATE 추정값이 실제 값보다 낮게 나오는 것입니다(음의 편향).\n", + "1. 2SLS는 OLS 쪽으로 편향됩니다. OLS에 음의 편향이나 양의 편향이 있으면 2SLS에도 같은 편향이 있다는 뜻입니다. 2SLS의 장점은 누락 변수가 있을 때 OLS와 달리 적어도 일치성은 있다는 것입니다. 위 예에서 관측되지 않은 U는 결과에 음의 영향을 주지만 처치와는 양의 상관관계가 있으므로 음의 편향이 생깁니다. 그래서 ATE 추정값이 실제 값보다 낮게 나오는 것입니다(음의 편향).\n", "\n", "2. 도구변수를 많이 넣을수록 편향이 커집니다. 도구변수를 너무 많이 넣으면 2SLS는 점점 OLS와 비슷해집니다.\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/09-Non-Compliance-and-LATE.ipynb b/causal-inference-for-the-brave-and-true/09-Non-Compliance-and-LATE.ipynb index 51cc7cb..07f3df1 100644 --- a/causal-inference-for-the-brave-and-true/09-Non-Compliance-and-LATE.ipynb +++ b/causal-inference-for-the-brave-and-true/09-Non-Compliance-and-LATE.ipynb @@ -15,11 +15,11 @@ "3. 항시 참여자(Always Takers)\n", "4. 반항자(Defiers)\n", "\n", - "이 명칭은 약학에서 왔습니다. 어떤 질병에 대한 신약의 효과를 확인하는 실험을 한다고 해 봅시다. 피험자는 각각 신약이나 위약 중 한 가지 처치에 배정됩니다. 순응자는 배정받은 대로 따르는 피험자입니다. 위약을 받으면 위약을 먹고, 신약을 받으면 신약을 먹습니다. 항시 불참자는 약 먹기를 거부하는 피험자입니다. 신약에 배정되더라도 먹지 않습니다. 반대로 항시 참여자는 위약에 배정되더라도 어떻게든 신약을 구해 먹는 사람들입니다. 마지막으로 반항자는 대조군에 배정되면 처치를 받고, 처치에 배정되면 대조 조건을 택하는 사람들입니다. 시키는 것과 반대로만 하는 얄미운 청개구리 같은 아이를 떠올리면 됩니다. 실제로는 그리 흔하지 않아서(아이들 말고 반항자가 말입니다) 보통은 무시하고 넘어갑니다.\n", + "이 명칭은 약학에서 왔습니다. 어떤 질병에 신약이 효과가 있는지 확인하는 실험을 한다고 해 봅시다. 피험자는 각각 신약이나 위약 중 한 가지 처치에 배정됩니다. 순응자는 배정받은 대로 따르는 피험자입니다. 위약을 받으면 위약을 먹고, 신약을 받으면 신약을 먹습니다. 항시 불참자는 약 먹기를 거부하는 피험자입니다. 신약에 배정되더라도 먹지 않습니다. 반대로 항시 참여자는 위약에 배정되더라도 어떻게든 신약을 구해 먹는 사람들입니다. 마지막으로 반항자는 대조군에 배정되면 처치를 받고, 처치에 배정되면 대조 조건을 택하는 사람들입니다. 시키는 것과 반대로만 하는 얄미운 청개구리 같은 아이를 떠올리면 됩니다. 실제로는 그리 흔하지 않아서(아이들 말고 반항자가 말입니다) 보통은 무시하고 넘어갑니다.\n", "\n", "![img](./data/img/late/defiers.png)\n", "\n", - "현대의 도구변수 분석은 도구를 순응이 완벽하지 않은 준실험 설계로 다룹니다. 그렇게 함으로써 내적으로 타당한 인과효과와 외적으로 타당한 인과효과를 구분합니다. 다시 짚어 보면, 내적으로 타당한 효과는 식별할 수 있는 효과입니다. 그 특정한 상황, 그 특정한 데이터 안에서 타당합니다. 도구변수 분석에서는 도구가 처치를 바꾸는 사람들에 대한 처치효과가 여기에 해당합니다. 반면 외적 타당성은 그 인과효과의 예측력과 관련이 있습니다. 이 표본에서 찾은 효과를 다른 모집단에도 일반화할 수 있느냐는 질문입니다. 예를 들어, 기부할 유인을 주었을 때 사람들이 너그럽게 행동하는지 알아보려고 여러분의 대학교에서 무작위 통제 실험(RCT)을 했다고 해 봅시다. 실험은 잘 설계했지만 참가자로 경제학과 학생들만 불렀습니다. 그랬더니 모두 이기적인 얌체라는 결과가 나왔습니다. 내적으로는 타당한 결론입니다. 이 데이터 포인트들에 대해서는 맞는 말입니다. 하지만 이 실험으로부터 인류가 이기적이라고 추론할 수 있을까요? 그렇다고 보기는 어렵습니다. 그래서 이 실험에 그 결과를 일반화할 만한 외적 타당성이 있는지 의문을 품게 됩니다. 아무튼 다시 도구변수로 돌아가겠습니다.\n", + "현대의 도구변수 분석은 도구를 순응이 완벽하지 않은 준실험 설계로 다룹니다. 그렇게 해서 내적으로 타당한 인과효과와 외적으로 타당한 인과효과를 구분합니다. 다시 짚어 보면, 내적으로 타당한 효과는 식별할 수 있는 효과입니다. 그 특정한 상황, 그 특정한 데이터 안에서 타당합니다. 도구변수 분석에서는 도구 때문에 처치가 바뀌는 사람들의 처치효과가 여기에 해당합니다. 반면 외적 타당성은 그 인과효과의 예측력과 관련이 있습니다. 이 표본에서 찾은 효과를 다른 모집단에도 일반화할 수 있느냐는 질문입니다. 예를 들어, 기부할 유인을 주었을 때 사람들이 너그럽게 행동하는지 알아보려고 여러분의 대학교에서 무작위 통제 실험(RCT)을 했다고 해 봅시다. 실험은 잘 설계했지만 참가자로 경제학과 학생들만 불렀습니다. 그랬더니 모두 이기적인 얌체라는 결과가 나왔습니다. 내적으로는 타당한 결론입니다. 이 데이터 포인트들만 놓고 보면 맞는 말입니다. 하지만 이 실험만으로 인류가 이기적이라고 추론할 수 있을까요? 그렇다고 보기는 어렵습니다. 그래서 이 실험에 그 결과를 일반화할 만한 외적 타당성이 있는지 의문을 품게 됩니다. 아무튼 다시 도구변수로 돌아가겠습니다.\n", "\n", "좀 더 구체적으로, 인앱 구매로 측정하는 사용자 참여를 높이고 싶은 상황을 생각해 봅시다. 한 가지 방법은 마케팅 부서에 사용자 참여를 끌어올릴 푸시 알림을 만들어 달라고 요청하는 것입니다. 마케팅 부서는 멋진 디자인과 아주 화려한 사용자 인터랙션을 갖춘 푸시를 만들어 옵니다. 이 푸시를 가지고 무작위 실험을 설계합니다. 고객 10000명을 무작위로 뽑고, 각 고객에게 50% 확률로 푸시를 배정합니다. 그런데 테스트를 실행해 보니, 푸시를 받도록 배정된 고객 중 일부가 푸시를 받지 못하고 있습니다. 엔지니어에게 물어보니, 아마 그 고객들의 휴대전화가 오래되어서 마케팅팀이 디자인한 형태의 푸시를 지원하지 않기 때문일 거라고 합니다.\n", "\n", @@ -162,13 +162,13 @@ "\n", "이제는 잘 알고 있듯이, 이 값은 편향 $E[Y_0|pushAssigned=0] - E[Y_0|pushAssigned=1]$이 0일 때만 $E[Y_1] - E[Y_0]$의 편향되지 않은 추정값입니다. `pushAssigned`는 무작위이므로 편향은 0입니다. 그럼 이걸로 해결된 걸까요? 꼭 그렇지는 않습니다. 이렇게 하면 사실 원래 묻고 싶던 것과는 다른 질문에 답하게 됩니다. 처치 자체의 효과가 아니라 **처치 배정의 인과효과**를 구하게 됩니다. 그렇다면 둘은 다른 것일까요, 아니면 처치 배정의 인과효과를 평균 처치효과(ATE)로 확장해서 볼 수 있을까요? 다시 말해, 처치 배정의 인과효과는 ATE의 편향되지 않은 추정값일까요?\n", "\n", - "결론부터 말하면 아닙니다. 불응 때문에 처치에 배정된 사람들의 결과가 대조군에 배정된 사람들의 결과 쪽으로 끌려갑니다. 불응은 의도치 않게 처치를 뒤집어서, 실험군과 대조군의 결과를 서로 비슷하게 만듭니다. 이것을 변수에서의 유사성과 혼동하지 마세요. 실험군과 대조군은 변수 면에서는 비슷하길 바랍니다. 그래야 둘을 비교할 수 있으니까요. 바라지 않는 것은, 실제로 처치효과가 있는데도 두 그룹의 결과가 비슷해지는 것입니다.\n", + "결론부터 말하면 아닙니다. 불응 때문에 처치에 배정된 사람들의 결과가 대조군에 배정된 사람들의 결과 쪽으로 끌려갑니다. 불응은 의도치 않게 처치를 뒤집어서, 실험군과 대조군의 결과를 서로 비슷하게 만듭니다. 이것을 변수가 비슷한 것과 혼동하지 마세요. 실험군과 대조군은 변수 면에서는 비슷하길 바랍니다. 그래야 둘을 비교할 수 있으니까요. 바라지 않는 것은, 실제로 처치효과가 있는데도 두 그룹의 결과가 비슷해지는 것입니다.\n", "\n", "이를 이해하기 위해 먼저 항시 참여자가 있다고 해 봅시다. 이들 중 일부는 우연히 대조군에 배정됩니다. 하지만 대조군에 배정된 사람들도 어차피 처치를 받습니다. 그러면 이들은 사실상 대조군에 섞여 든 실험군이 됩니다. 이렇게 섞이기 때문에, 불응이 있으면 인과효과를 찾아내기가 더 어려워집니다.\n", "\n", "![img](./data/img/late/always_takers.png)\n", "\n", - "같은 논리로, 항시 불참자는 처치에 배정되어도 처치를 받지 않으므로 처치에 배정된 사람들을 처치받지 않은 사람들과 조금 닮아 보이게 만듭니다. 이런 의미에서 불응이 감지할 수 있는 효과를 줄이기 때문에 **처치 배정의 인과효과는 0 쪽으로 편향됩니다**. 극단적인 경우를 상상해 보면 이를 다른 방식으로 이해할 수 있습니다. 불응이 정말 심하다고 해 봅시다. 처치 배정이 실제로 받은 처치에 대해 아무것도 알려 주지 못합니다. 이 경우 실제로 받은 처치는 순전히 무작위입니다. 도구변수 용어로 말하면 1단계(first stage)가 아주 약하다는 뜻입니다. 처치 배정을 `Z`로 나타내면 다음과 같습니다.\n", + "같은 논리로, 항시 불참자는 처치에 배정되어도 처치를 받지 않으므로 처치에 배정된 사람들을 처치받지 않은 사람들과 조금 닮아 보이게 만듭니다. 이런 의미에서 불응은 감지할 수 있는 효과를 줄이므로 **처치 배정의 인과효과는 0 쪽으로 편향됩니다**. 극단적인 경우를 상상해 보면 이를 다른 방식으로 이해할 수 있습니다. 불응이 정말 심하다고 해 봅시다. 처치 배정을 봐서는 실제로 받은 처치를 전혀 알 수 없습니다. 이 경우 실제로 받은 처치는 순전히 무작위입니다. 도구변수 용어로 말하면 1단계(first stage)가 아주 약하다는 뜻입니다. 처치 배정을 `Z`로 나타내면 다음과 같습니다.\n", "\n", "$\n", "E[Y|Z=1] - E[Y|Z=0] = 0\n", @@ -275,7 +275,7 @@ "\\mathrm{ATE} = E[Y | \\mathrm{push}=1] - E[Y | \\mathrm{push}=0]\n", "$\n", "\n", - "이번에도 이 값에 편향이 없는지, 즉 $E[Y_0|\\mathrm{push}=0] = E[Y_0|\\mathrm{push}=1]$인지 따져 봐야 합니다. 위 인과 그래프만 봐도 그렇지 않다는 것을 알 수 있습니다. 측정되지 않은 교란 요인인 소득이 도사리고 있으니, 분명 일을 망쳐 놓을 겁니다. 앞서 말했듯이 이 사례에서 푸시 전달이 실패하는 원인은 고객의 휴대전화가 오래되었기 때문입니다. 그렇다면 아마도 $E[Y_0|\\mathrm{push}=0] < E[Y_0|\\mathrm{push}=1]$일 것입니다. 돈이 적은 고객일수록 오래된 휴대전화를 가지고 있어서 $\\mathrm{push}=0$이 되기 쉽고, 동시에 잠재적 인앱 구매액 $Y_0$도 낮을 것이기 때문입니다.\n", + "이번에도 이 값에 편향이 없는지, 즉 $E[Y_0|\\mathrm{push}=0] = E[Y_0|\\mathrm{push}=1]$인지 따져 봐야 합니다. 위 인과 그래프만 봐도 그렇지 않다는 것을 알 수 있습니다. 측정되지 않은 교란 요인인 소득이 도사리고 있으니, 분명 일을 망쳐 놓을 겁니다. 앞서 말했듯이 이 사례에서는 고객의 휴대전화가 오래되어서 푸시 전달이 실패합니다. 그렇다면 아마도 $E[Y_0|\\mathrm{push}=0] < E[Y_0|\\mathrm{push}=1]$일 것입니다. 돈이 적은 고객일수록 오래된 휴대전화를 가지고 있어서 $\\mathrm{push}=0$이 되기 쉽고, 동시에 잠재적 인앱 구매액 $Y_0$도 낮을 것이기 때문입니다.\n", "\n", "아쉽게도 배정된 처치로도, 실제로 받은 처치로도 ATE를 추정할 수 없습니다. 하지만 다행히 쓸 수 있는 도구가 있습니다. 바로 도구변수입니다. 여기서 배정된 처치는 처치에 대한 완벽한 도구입니다. 무작위 배정이나 다름없고, 오직 처치를 거쳐서만 인앱 구매에 영향을 줍니다.\n", "\n", @@ -294,7 +294,7 @@ "\\end{cases}\n", "$\n", "\n", - "어떤 의미에서는 적어도 1단계에서는 처치가 결과가 됩니다. 따라서 처치도 잠재적 결과 표기법으로 쓸 수 있습니다.\n", + "어떤 의미에서, 적어도 1단계에서는 처치가 결과변수가 됩니다. 따라서 처치도 잠재적 결과 표기법으로 쓸 수 있습니다.\n", "\n", "$\n", "\\text{Potential Treatment}=\\begin{cases}\n", @@ -309,7 +309,7 @@ "\n", "1. $T_{0i}, T_{1i} \\perp Z_i $ 그리고 $Y_i(T_{1i},1), Y_i(T_{0i},0) \\perp Z_i $. 독립성 가정(independence assumption)입니다. 도구가 무작위로 배정된 것이나 다름없다는 뜻입니다. 다시 말해 도구 Z는 잠재적 처치와 상관관계가 없으며, 이는 도구 값이 다른 그룹에 속한 사람들끼리 비교할 수 있다는 말과 같습니다.\n", "\n", - "2. $Y_i(1, 0)=Y_i(1, 1)=Y_{i1}$ 그리고 $Y_i(0, 0)=Y_i(0, 1)=Y_{i0}$. 배제 제약입니다. 처치를 받은 경우의 잠재적 결과를 보면, 도구 값이 어느 쪽이든 똑같다는 뜻입니다. 도구는 잠재적 결과에 영향을 주지 않는다는 것, 곧 오직 처치를 거쳐서만 결과에 영향을 준다는 것입니다.\n", + "2. $Y_i(1, 0)=Y_i(1, 1)=Y_{i1}$ 그리고 $Y_i(0, 0)=Y_i(0, 1)=Y_{i0}$. 배제 제약입니다. 처치를 받은 경우의 잠재적 결과를 보면, 도구 값이 어느 쪽이든 똑같다는 뜻입니다. 즉, 도구는 잠재적 결과에 영향을 주지 않고 오직 처치를 거쳐서만 결과에 영향을 줍니다.\n", "\n", "3. $E[T_{1i}-T_{0i}] \\neq 0$. 1단계가 존재한다는 가정입니다. 1단계의 잠재적 결과, 즉 잠재적 처치가 서로 같지 **않다**는 뜻입니다. 달리 말하면 도구가 실제로 처치에 영향을 준다는 것입니다.\n", "\n", @@ -327,7 +327,7 @@ "E[Y_i|Z_i=1]=E[Y_{i0} + T_{i1}(Y_{i1} - Y_{i0})|Z_i=1]\n", "$\n", "\n", - "독립성을 이용하면 Z에 대한 조건을 없앨 수 있습니다.\n", + "독립성을 이용하면 Z에 걸린 조건을 없앨 수 있습니다.\n", "\n", "$\n", "E[Y_i|Z_i=1]=E[Y_{i0} + T_{i1}(Y_{i1} - Y_{i0})]\n", @@ -617,7 +617,7 @@ "source": [ "축약형을 보면 처치 배정의 인과효과는 2.36입니다. 누군가를 푸시 수신 대상으로 배정하면 인앱 구매가 2.36헤알 늘어난다는 뜻입니다.\n", "\n", - "축약형을 1단계로 나누면 도구의 효과를 처치 단위로 환산하게 되며, $2.3636/0.7176=3.29$를 얻습니다. 2단계 최소제곱법(2SLS)을 돌리면 같은 추정값을 얻을 뿐 아니라, 올바른 표준오차까지 덤으로 얻습니다." + "축약형을 1단계로 나누어 도구의 효과를 처치 단위로 환산하면 $2.3636/0.7176=3.29$를 얻습니다. 2단계 최소제곱법(2SLS)을 돌리면 같은 추정값을 얻을 뿐 아니라, 올바른 표준오차까지 덤으로 얻습니다." ] }, { @@ -663,7 +663,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "2SLS 결과는 OLS 결과보다 훨씬 작습니다. 3.29 대 27.60입니다. OLS로 추정한 인과효과가 양의 방향으로 편향되어 있으니 이치에 맞습니다. LATE도 잊지 말아야 합니다. 3.29는 순응자에 대한 평균 인과효과입니다. 안타깝게도 항시 불참자에 대해서는 아무것도 말할 수 없습니다. 즉, 새 휴대전화를 가진, 모집단 중 더 부유한 층에 대한 효과를 추정하고 있는 셈입니다.\n", + "2SLS 결과는 OLS 결과보다 훨씬 작습니다. 3.29 대 27.60입니다. OLS로 추정한 인과효과가 양의 방향으로 편향되어 있으니 이치에 맞습니다. LATE도 잊지 말아야 합니다. 3.29는 순응자에 대한 평균 인과효과입니다. 안타깝게도 항시 불참자에 대해서는 아무것도 말할 수 없습니다. 즉, 모집단 가운데 새 휴대전화를 가진 더 부유한 층의 효과를 추정하고 있는 셈입니다.\n", "\n", "## 핵심 요약\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/10-Matching.ipynb b/causal-inference-for-the-brave-and-true/10-Matching.ipynb index d1afb8f..bbbea24 100644 --- a/causal-inference-for-the-brave-and-true/10-Matching.ipynb +++ b/causal-inference-for-the-brave-and-true/10-Matching.ipynb @@ -102,7 +102,7 @@ "ATE=\\dfrac{(-3*6) + (-2*4)}{10}=-2.6\n", "$\n", "\n", - "이 추정값은 1) 데이터를 교란 요인 셀(여기서는 남성과 여성)로 나누고, 2) 셀마다 효과를 추정한 뒤, 3) 셀, 즉 공변량 그룹의 표본 크기를 가중치로 삼아 추정값을 가중 평균해서 구합니다. 데이터에 남성과 여성이 정확히 같은 수만큼 있었다면 ATE 추정값은 두 그룹 ATE의 한가운데인 -2.5가 됐을 것입니다. 이 데이터셋에는 남성이 여성보다 많으므로 ATE 추정값이 남성의 ATE 쪽에 조금 더 가깝습니다. 데이터가 어떻게 생성되었는지에 대해 아무런 가정도 두지 않으므로 이를 비모수 추정값(non-parametric estimate)이라고 합니다.\n", + "이 추정값은 1) 데이터를 교란 요인 셀(여기서는 남성과 여성)로 나누고, 2) 셀마다 효과를 추정한 뒤, 3) 셀, 즉 공변량 그룹의 표본 크기를 가중치로 삼아 추정값을 가중 평균해서 구합니다. 데이터에 남성과 여성이 정확히 같은 수만큼 있었다면 ATE 추정값은 두 그룹 ATE의 한가운데인 -2.5가 됐을 것입니다. 이 데이터셋에는 남성이 여성보다 많으므로 ATE 추정값이 남성의 ATE 쪽에 조금 더 가깝습니다. 데이터 생성 과정에 아무런 가정도 두지 않으므로 이를 비모수 추정값(non-parametric estimate)이라고 합니다.\n", "\n", "회귀분석으로 성별을 통제하면 선형성 가정이 더해집니다. 회귀분석도 데이터를 남성과 여성으로 나누고 두 그룹 각각에서 효과를 추정합니다. 여기까지는 좋습니다. 하지만 그룹별 효과를 합칠 때는 표본 크기만으로 가중치를 주지 않습니다. 대신 그룹 안에서 처치가 갖는 분산에도 비례하는 가중치를 씁니다. 이 예에서는 대조군에 속한 남성이 한 명뿐이므로 남성의 처치 분산이 여성보다 작습니다. 정확히는 남성의 T 분산이 $0.139=1/6*(1 - 1/6)$이고 여성은 $0.25=2/4*(1 - 2/4)$입니다. 따라서 이 예에서 회귀분석은 여성에게 더 큰 가중치를 주고, ATE는 여성의 ATE인 -2에 조금 더 가까워집니다." ] @@ -168,7 +168,7 @@ "ATE = \\int(E[Y|X, T=1] - E[Y|X, T=0])dP(x)\n", "$\n", "\n", - "이 적분은 특성 X의 분포 공간 전체를 훑으면서 아주 작은 공간마다 평균 차이를 계산하고, 이를 모두 합쳐 ATE를 만듭니다. 이산적인 특성 집합을 떠올리면 다른 방식으로도 볼 수 있습니다. 이 경우 특성 X가 K개의 서로 다른 셀 $\\{X_1, X_2, ..., X_k\\}$ 중 하나의 값을 가진다고 할 수 있고, 하는 일은 셀마다 처치효과를 계산해 ATE로 합치는 것입니다. 이 이산적인 경우에 적분을 합으로 바꾸면 층화 추정량을 유도할 수 있습니다.\n", + "이 적분은 특성 X의 분포 공간 전체를 훑으면서 아주 작은 공간마다 평균 차이를 계산하고, 이를 모두 합쳐 ATE를 만듭니다. 이산적인 특성 집합을 떠올리면 다른 방식으로도 볼 수 있습니다. 이 경우 특성 X가 K개의 서로 다른 셀 $\\{X_1, X_2, ..., X_k\\}$ 중 하나의 값을 가진다고 할 수 있습니다. 그러면 할 일은 셀마다 처치효과를 계산해 ATE로 합치는 것입니다. 이 이산적인 경우에 적분을 합으로 바꾸면 층화 추정량을 유도할 수 있습니다.\n", "\n", "\n", "$\n", @@ -181,7 +181,7 @@ "\n", "![img](./data/img/matching/its-a-match.png)\n", "\n", - "층화 추정량은 실무에서 잘 쓰이지 않습니다(이유는 곧 보겠지만 차원의 저주 때문입니다). 그래도 인과추론 추정량이 무엇을 해야 하는지, 교란 요인을 어떻게 통제해야 하는지에 대해 좋은 직관을 줍니다. 덕분에 매칭 추정량(Matching Estimator) 같은 다른 추정량도 살펴볼 수 있습니다.\n", + "층화 추정량은 실무에서 잘 쓰이지 않습니다(이유는 곧 보겠지만 차원의 저주 때문입니다). 그래도 인과추론 추정량이 무엇을 해야 하고 교란 요인을 어떻게 통제해야 하는지 직관을 얻기에는 좋습니다. 덕분에 매칭 추정량(Matching Estimator) 같은 다른 추정량도 살펴볼 수 있습니다.\n", "\n", "아이디어는 아주 비슷합니다. 어떤 교란 요인 X 때문에 실험군과 대조군을 처음부터 비교할 수 없다면, **각 실험군 대상을 비슷한 대조군 대상과 짝지어** 비교할 수 있게 만들면 됩니다. 실험군 대상마다 처치받지 않은 쌍둥이를 찾아 주는 셈입니다. 이렇게 짝을 지어 놓으면 실험군과 대조군을 다시 견줄 수 있게 됩니다.\n", "\n", @@ -872,7 +872,7 @@ "\n", "여기서 $Y_{jm}(i)$는 반대쪽 그룹에서 $Y_i$와 가장 비슷한 표본입니다. $2T_i - 1$을 곱하는 것은 양방향으로 매칭하기 위해서입니다. 실험군은 대조군과, 대조군은 실험군과 짝짓습니다.\n", "\n", - "이 추정량을 시험해 보기 위해 의약품 예를 살펴보겠습니다. 이번에도 약물이 회복까지 걸리는 일수에 미치는 효과를 알고 싶습니다. 아쉽게도 이 효과는 중증도, 성별, 나이에 의해 교란되어 있습니다. 상태가 심각한 환자일수록 약을 받을 확률이 더 높다고 볼 만한 이유가 있습니다." + "이 추정량을 시험해 보기 위해 의약품 예를 살펴보겠습니다. 이번에도 약물이 회복까지 걸리는 일수에 미치는 효과를 알고 싶습니다. 아쉽게도 중증도, 성별, 나이가 이 효과를 교란합니다. 상태가 심각한 환자일수록 약을 받을 확률이 더 높다고 볼 만한 이유가 있습니다." ] }, { @@ -1470,7 +1470,7 @@ "\n", "![img](./data/img/matching/ubiquitous-ols.png)\n", "\n", - "첫째, 여기서 적합하는 선형회귀는 처치효과를 구하려고 처치 차원으로 외삽하지 않습니다. 이 회귀의 목적은 편향을 바로잡는 것뿐입니다. 이 선형회귀는 실험군이 대조군처럼 생겼다면 어땠을지 알아내려 하지 않는다는 의미에서 국지적입니다. 그런 외삽은 전혀 하지 않고 매칭에 맡깁니다. 추정량의 핵심은 여전히 매칭 부분입니다. 여기서 말하고 싶은 요점은, 이 추정량에서 OLS는 부차적이라는 것입니다.\n", + "첫째, 여기서 적합하는 선형회귀는 처치효과를 구하려고 처치 차원으로 외삽하지 않습니다. 이 회귀의 목적은 편향을 바로잡는 것뿐입니다. 실험군이 대조군처럼 생겼다면 어땠을지 알아내려 하지 않는다는 의미에서, 이 선형회귀는 국지적입니다. 그런 외삽은 전혀 하지 않고 매칭에 맡깁니다. 추정량의 핵심은 여전히 매칭 부분입니다. 여기서 말하고 싶은 요점은, 이 추정량에서 OLS는 부차적이라는 것입니다.\n", "\n", "둘째, 매칭은 비모수 추정량입니다. 선형성이나 어떤 모수적 모델도 가정하지 않습니다. 그래서 선형회귀보다 유연하고, 선형회귀가 통하지 않는 상황, 즉 비선형성이 아주 강한 상황에서도 쓸 수 있습니다.\n", "\n", @@ -1553,7 +1553,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "마침내 이 약이 실제로 입원 기간을 줄인다고 자신 있게 말할 수 있습니다. ATE 추정값이 제가 직접 구한 값보다 조금 낮은데, 이는 sklearn의 KNN 구현과 causalinference 파이썬 패키지가 거리가 같은 짝을 고르는 방식이 다르기 때문입니다.\n", + "마침내 이 약이 실제로 입원 기간을 줄인다고 자신 있게 말할 수 있습니다. ATE 추정값이 제가 직접 구한 값보다 조금 낮은데, 이는 sklearn의 KNN 구현과 causalinference 파이썬 패키지가 거리가 같은 후보가 여럿일 때 짝을 고르는 방식이 서로 다르기 때문입니다.\n", "\n", "이 주제를 마무리하기 전에 매칭에서 편향이 생기는 원인을 조금 더 짚고 넘어가겠습니다. 앞에서 대상과 그 짝이 별로 비슷하지 않으면 매칭에 편향이 생긴다는 것을 보았습니다. 그렇다면 무엇 때문에 둘이 그렇게 달라질까요?\n", "\n", @@ -1572,7 +1572,7 @@ "\n", "층화 추정량의 맥락에서 차원의 저주는 특성이 많으면 추정량이 제 역할을 못 한다는 뜻입니다. 특성이 많으면 X의 셀도 많아집니다. 셀이 많으면 그중 일부에는 데이터가 아주 적습니다. 실험군만 있거나 대조군만 있는 셀도 생길 수 있는데, 그런 셀에서는 ATE를 추정할 수 없으니 추정량이 망가집니다. 매칭의 맥락에서는 특성 공간이 매우 희소해져 대상끼리 서로 아주 멀리 떨어진다는 뜻입니다. 그러면 짝 사이의 거리가 멀어지고 편향 문제가 생깁니다.\n", "\n", - "선형회귀는 오히려 이 문제를 꽤 잘 다룹니다. 선형회귀는 모든 특성 X를 하나의 차원, 즉 Y 차원으로 투영한 뒤 그 투영 위에서 실험군과 대조군을 비교합니다. 어떤 의미에서 선형회귀는 ATE를 추정하려고 일종의 차원 축소를 하는 셈입니다. 꽤 우아한 방식입니다.\n", + "선형회귀는 오히려 이 문제를 꽤 잘 다룹니다. 모든 특성 X를 하나의 차원, 즉 Y 차원으로 투영한 뒤 그 투영 위에서 실험군과 대조군을 비교합니다. 어떤 의미에서 선형회귀는 ATE를 추정하려고 일종의 차원 축소를 하는 셈입니다. 꽤 우아한 방식입니다.\n", "\n", "대부분의 인과 모델에도 차원의 저주에 대처하는 나름의 방법이 있습니다. 매번 반복해서 말하지는 않겠지만, 이런 모델을 볼 때 염두에 두면 좋습니다. 예를 들어 다음 장에서 성향점수를 다룰 때, 성향점수가 이 문제를 어떻게 해결하는지 살펴보세요.\n", "\n", @@ -1580,9 +1580,9 @@ "\n", "이 장은 선형회귀가 무엇을 하는지, 그리고 인과관계를 식별하는 데 어떻게 도움이 되는지 이해하는 데서 출발했습니다. 정리하면, 회귀분석은 데이터셋을 셀로 나누고 셀마다 ATE를 계산한 다음, 셀별 ATE를 합쳐 데이터셋 전체의 ATE 하나를 만드는 과정으로 볼 수 있습니다.\n", "\n", - "여기서 출발해 층화를 이용한 아주 일반적인 인과추론 추정량을 유도했습니다. 이 추정량은 실무에서 그다지 쓸모가 없지만, 인과추론 추정 문제에 접근하는 방법에 대해 흥미로운 통찰을 주었습니다. 그 덕분에 매칭 추정량을 이야기할 기회도 생겼습니다.\n", + "여기서 출발해 층화를 이용한 아주 일반적인 인과추론 추정량을 유도했습니다. 이 추정량은 실무에서 그다지 쓸모가 없지만, 인과추론 추정 문제에 어떻게 접근할지 흥미로운 통찰을 주었습니다. 그 덕분에 매칭 추정량을 이야기할 기회도 생겼습니다.\n", "\n", - "매칭은 실험군 대상마다 아주 비슷한 대조군 짝을 찾고, 대조군 대상에도 같은 방식으로 짝을 찾아 교란 요인을 통제합니다. 이 방법을 KNN 알고리즘으로 구현하는 방법과 회귀분석으로 편향을 제거하는 방법을 살펴보았습니다. 이어서 매칭과 선형회귀의 차이를 논의했습니다. 매칭은 선형회귀와 달리 선형성에 기대지 않는 비모수 추정량이라는 점을 확인했습니다.\n", + "매칭은 실험군 대상마다 아주 비슷한 대조군 짝을 찾고, 대조군 대상에도 같은 방식으로 짝을 찾아 교란 요인을 통제합니다. 이를 KNN 알고리즘으로 구현하는 법과 회귀분석으로 편향을 제거하는 법을 살펴보았습니다. 이어서 매칭과 선형회귀의 차이를 논의했습니다. 매칭은 선형회귀와 달리 선형성에 기대지 않는 비모수 추정량이라는 점을 확인했습니다.\n", "\n", "마지막으로 고차원 데이터셋의 문제를 깊이 살펴보고, 인과추론 방법들이 이 문제로 어떤 어려움을 겪는지 보았습니다.\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/11-Propensity-Score.ipynb b/causal-inference-for-the-brave-and-true/11-Propensity-Score.ipynb index f152282..1c4d321 100644 --- a/causal-inference-for-the-brave-and-true/11-Propensity-Score.ipynb +++ b/causal-inference-for-the-brave-and-true/11-Propensity-Score.ipynb @@ -447,7 +447,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "e(x)가 무엇인지 안다면, T가 어떻게 될지 알아내는 데 X가 더 알려 줄 정보는 없습니다. 즉, e(x)를 통제하는 것은 X를 직접 통제하는 것과 같은 효과를 냅니다. 마인드셋 프로그램에 대입해 생각해 봅시다. 처음에는 실험군과 대조군을 비교할 수 없습니다. 야심이 큰 사람일수록 처치를 받을 가능성도, 인생에서 더 많이 성취할 가능성도 높기 때문입니다. 하지만 실험군에서 한 명, 대조군에서 한 명을 뽑되 두 사람의 처치받을 확률이 같다면 둘은 비교할 수 있습니다. 생각해 보세요. 두 사람의 처치받을 확률이 정확히 같다면, 한 사람은 처치를 받고 다른 사람은 받지 않은 이유는 순전히 우연뿐입니다. 성향점수를 고정하면 데이터가 무작위 배정이나 다름없어 보이게 됩니다.\n", + "e(x)가 무엇인지 안다면, T가 어떻게 될지 알아내는 데 X가 더 알려 줄 정보는 없습니다. 즉, e(x)를 통제하는 것은 X를 직접 통제하는 것과 같은 효과를 냅니다. 마인드셋 프로그램에 대입해 생각해 봅시다. 처음에는 실험군과 대조군을 비교할 수 없습니다. 야심이 큰 사람일수록 처치를 받을 가능성도, 인생에서 더 많이 성취할 가능성도 높기 때문입니다. 하지만 실험군에서 한 명, 대조군에서 한 명을 뽑되 두 사람의 처치받을 확률이 같다면 둘은 비교할 수 있습니다. 생각해 보세요. 두 사람의 처치받을 확률이 정확히 같다면, 한 사람은 처치를 받고 다른 사람은 받지 않은 이유는 순전히 우연입니다. 성향점수를 고정하면 데이터가 무작위 배정이나 다름없어 보이게 됩니다.\n", "\n", "직관을 얻었으니 이제 수학적 증명을 살펴봅시다. 보이려는 것은 $(Y_1, Y_0) \\perp T | e(x)$가 다음 식과 같다는 것입니다.\n", "\n", @@ -455,7 +455,7 @@ "E[T|e(x), X] = E[T|e(x)] \n", "$\n", "\n", - "이 식은 일단 $e(x)$를 조건부로 두면 X가 $T$에 대해 추가 정보를 줄 수 없다는 뜻입니다. 이 증명은 조금 묘합니다. 위 식을 자명한 명제로 바꿔서 참임을 보이겠습니다. 먼저 좌변 $E[T|e(x), X]$를 봅시다.\n", + "이 식은 일단 $e(x)$를 조건부로 두면 X가 $T$에 관해 더 알려 줄 정보가 없다는 뜻입니다. 이 증명은 조금 묘합니다. 위 식을 자명한 명제로 바꿔서 참임을 보이겠습니다. 먼저 좌변 $E[T|e(x), X]$를 봅시다.\n", "\n", "$\n", "E[T|e(x), X] = E[T|X] = e(x)\n", @@ -1154,7 +1154,7 @@ "source": [ "이런 경우는 양수성이 그리 강하지 않다는 뜻입니다. 예를 들어 실험군의 어떤 사람은 성향점수가 0.9인데 대조군의 최대 성향점수가 0.7이라면, 성향점수가 0.9인 사람과 비교할 대조군이 하나도 없습니다. 이렇게 균형이 맞지 않으면 처치효과를 데이터가 없는 영역으로 외삽해야 하므로 편향이 생길 수 있습니다. 그뿐 아니라 성향점수가 아주 높거나 아주 낮은 대상은 가중치가 매우 커지고, 그만큼 분산이 커집니다. 일반적인 경험칙으로는 가중치가 20을 넘는 대상이 하나라도 있으면 문제가 있다고 보면 됩니다(성향점수가 0.95인 대조군이나 0.05인 실험군이 이런 경우입니다).\n", "\n", - "대안으로 가중치가 최대 20을 넘지 않도록 잘라내는(clipping) 방법이 있습니다. 이렇게 하면 분산은 줄지만 편향은 오히려 커집니다. 솔직히 말하면, 분산을 줄이려고 흔히 쓰는 방법이긴 해도 저는 별로 좋아하지 않습니다. 잘라내기로 생긴 편향이 지나친지 아닌지 결코 알 수 없기 때문입니다. 게다가 분포가 겹치지 않는다면 애초에 데이터가 인과적 결론을 내리기에 충분하지 않을 가능성이 큽니다. 이 문제를 좀 더 직관적으로 이해하기 위해 성향점수와 매칭을 결합한 기법을 살펴보겠습니다.\n", + "대안으로 가중치를 최대 20으로 잘라내는(clipping) 방법이 있습니다. 이렇게 하면 분산은 줄지만 편향은 오히려 커집니다. 솔직히 말하면, 분산을 줄이려고 흔히 쓰는 방법이긴 해도 저는 별로 좋아하지 않습니다. 잘라내기로 생긴 편향이 지나친지 아닌지 결코 알 수 없기 때문입니다. 게다가 분포가 겹치지 않는다면 애초에 데이터가 인과적 결론을 내리기에 충분하지 않을 가능성이 큽니다. 이 문제를 좀 더 직관적으로 이해하기 위해 성향점수와 매칭을 결합한 기법을 살펴보겠습니다.\n", "\n", "## 성향점수 매칭\n", "\n", @@ -1211,7 +1211,7 @@ "source": [ "성향점수를 통제하면 ATE 추정값은 0.39로, 앞에서 성향점수를 통제하지 않은 회귀 모델로 얻은 0.47보다 낮습니다. 성향점수로 매칭을 할 수도 있습니다. 이번에는 모든 X 특성이 비슷한 짝을 찾는 대신, 성향점수만 같은 짝을 찾으면 됩니다.\n", "\n", - "차원의 저주 문제를 해결해 주므로 기존 매칭 추정량보다 크게 나아진 방법입니다. 또 어떤 특성이 처치 배정에 중요하지 않다면, 성향점수 모델은 처치 메커니즘을 적합하는 과정에서 이를 학습해 그 특성의 중요도를 낮춥니다. 반면 특성으로 직접 매칭하면 이렇게 중요하지 않은 특성까지 비슷한 짝을 찾으려 할 것입니다." + "이 방법은 차원의 저주 문제를 해결해 주므로 기존 매칭 추정량보다 크게 나아졌습니다. 또 어떤 특성이 처치 배정에 중요하지 않다면, 성향점수 모델은 처치 메커니즘을 적합하는 과정에서 이를 학습해 그 특성의 중요도를 낮춥니다. 반면 특성으로 직접 매칭하면 이렇게 중요하지 않은 특성까지 비슷한 짝을 찾으려 할 것입니다." ] }, { @@ -1258,7 +1258,7 @@ "source": [ "보다시피 ATE도 0.38로, 앞에서 성향점수 가중치로 얻은 결과와 더 잘 맞습니다. 성향점수 매칭을 보면 실험군과 대조군의 성향점수가 조금밖에 겹치지 않을 때 왜 위험한지도 직관적으로 알 수 있습니다. 이런 경우 성향점수 매칭에서 짝 사이의 차이가 커지고, 매칭 장에서 보았듯이 이는 편향으로 이어집니다.\n", "\n", - "마지막으로 주의할 점은 위 표준오차가 성향점수 추정의 불확실성을 반영하지 않으므로 틀렸다는 것입니다. 안타깝게도 [매칭에는 부트스트랩이 통하지 않습니다](https://economics.mit.edu/sites/default/files/publications/ON%20THE%20FAILURE%20OF%20THE%20BOOTSTRAP%20FOR.pdf). 게다가 이 이론은 아주 최근에 나와서, 올바른 표준오차를 제공하는 성향점수 방법의 파이썬 구현이 아직 없습니다. 그래서 파이썬에서는 성향점수 매칭을 자주 보기 어렵습니다.\n", + "마지막으로 주의할 점이 있습니다. 위 표준오차는 성향점수 추정의 불확실성을 반영하지 않으므로 틀렸습니다. 안타깝게도 [매칭에는 부트스트랩이 통하지 않습니다](https://economics.mit.edu/sites/default/files/publications/ON%20THE%20FAILURE%20OF%20THE%20BOOTSTRAP%20FOR.pdf). 게다가 이 이론은 아주 최근에 나와서, 올바른 표준오차를 제공하는 성향점수 방법의 파이썬 구현이 아직 없습니다. 그래서 파이썬에서는 성향점수 매칭을 자주 보기 어렵습니다.\n", "\n", "## 핵심 요약\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/12-Doubly-Robust-Estimation.ipynb b/causal-inference-for-the-brave-and-true/12-Doubly-Robust-Estimation.ipynb index e61207b..5e44cd0 100644 --- a/causal-inference-for-the-brave-and-true/12-Doubly-Robust-Estimation.ipynb +++ b/causal-inference-for-the-brave-and-true/12-Doubly-Robust-Estimation.ipynb @@ -264,7 +264,7 @@ "\n", "![img](./data/img/doubly-robust/double.png)\n", "\n", - "추정량을 유도하는 대신, 먼저 추정량을 보여 드리고 그다음에 왜 이 추정량이 멋진지 설명하겠습니다.\n", + "추정량을 유도하는 대신, 먼저 식부터 보여 드리고 그다음에 왜 멋진지 설명하겠습니다.\n", "\n", "$\n", "\\hat{ATE} = \\frac{1}{N}\\sum \\bigg( \\dfrac{T_i(Y_i - \\hat{\\mu_1}(X_i))}{\\hat{P}(X_i)} + \\hat{\\mu_1}(X_i) \\bigg) - \\frac{1}{N}\\sum \\bigg( \\dfrac{(1-T_i)(Y_i - \\hat{\\mu_0}(X_i))}{1-\\hat{P}(X_i)} + \\hat{\\mu_0}(X_i) \\bigg)\n", @@ -692,7 +692,7 @@ "source": [ "다시 한번, 조건부 평균 모델만 엉망으로 만들었을 때도 ATE는 조금 달라질 뿐입니다. 이 정도면 이중 강건 추정의 위력이 충분히 와닿았기를 바랍니다. 이런 마법이 일어나는 이유는 인과추론에서 인과 추정값의 편향을 없애는 방법이 두 가지이기 때문입니다. 처치 메커니즘을 모델링하거나 결과 메커니즘을 모델링하는 것입니다. 둘 중 하나만 맞으면 됩니다.\n", "\n", - "다만 한 가지 주의할 점이 있습니다. 실무에서는 둘 중 어느 쪽도 정확하게 모델링하기가 매우 어렵습니다. 실제로는 성향점수 모델도 결과 모델도 100% 맞지 않는 경우가 더 흔합니다. 둘 다 틀리되, 서로 다른 방식으로 틀립니다. 이럴 때는 단일 모델을 쓰는 편이 나은지 이중 강건 추정을 쓰는 편이 나은지 아직 명확하게 결론 나지 않았습니다 [\\[1\\]](https://www.stat.cmu.edu/~ryantibs/journalclub/kang_2007.pdf) [\\[2\\]](https://arxiv.org/pdf/0804.2969.pdf) [\\[3\\]](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2798744/). 저는 그래도 이중 강건 추정을 즐겨 씁니다. 적어도 맞힐 기회가 두 번은 생기니까요.\n", + "다만 한 가지 주의할 점이 있습니다. 실무에서는 둘 중 어느 쪽도 정확하게 모델링하기가 매우 어렵습니다. 실제로는 성향점수 모델도 결과 모델도 100% 맞지 않는 경우가 더 흔합니다. 둘 다 틀리는데, 틀리는 방식이 서로 다릅니다. 이럴 때는 단일 모델을 쓰는 편이 나은지 이중 강건 추정을 쓰는 편이 나은지 아직 명확하게 결론 나지 않았습니다 [\\[1\\]](https://www.stat.cmu.edu/~ryantibs/journalclub/kang_2007.pdf) [\\[2\\]](https://arxiv.org/pdf/0804.2969.pdf) [\\[3\\]](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2798744/). 저는 그래도 이중 강건 추정을 즐겨 씁니다. 적어도 맞힐 기회가 두 번은 생기니까요.\n", "\n", "> 옮긴이: 이 추정량은 역확률 가중치(IPW) 추정량에 결과 모델로 만든 보정 항을 덧붙인 형태라서 Augmented IPW(AIPW)라고도 부릅니다.\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/13-Difference-in-Differences.ipynb b/causal-inference-for-the-brave-and-true/13-Difference-in-Differences.ipynb index 12dcb4e..bad0fdd 100644 --- a/causal-inference-for-the-brave-and-true/13-Difference-in-Differences.ipynb +++ b/causal-inference-for-the-brave-and-true/13-Difference-in-Differences.ipynb @@ -10,13 +10,13 @@ "\n", "마케팅 일을 하던 시절, 인터넷 광고는 아주 좋은 수단이었습니다. 효율이 높아서가 아니라(물론 효율도 좋습니다), 효과가 있는지 없는지 알기가 아주 쉬웠기 때문입니다. 온라인 마케팅에서는 어떤 고객이 광고를 봤는지 알 수 있고, 쿠키로 그 고객을 추적해서 랜딩 페이지에 들어왔는지, 다운로드 버튼을 눌렀는지도 확인할 수 있습니다. 머신러닝으로 기존 고객과 아주 비슷한 잠재 고객을 찾아서 그 사람들에게만 광고를 보여 줄 수도 있습니다. 이런 의미에서 온라인 마케팅은 매우 정밀합니다. 원하는 사람만 골라서 광고할 수 있고, 그 사람들이 기대한 대로 반응하는지도 지켜볼 수 있습니다.\n", "\n", - "하지만 온라인 마케팅이 모든 사람에게 닿지는 않습니다. 때로는 TV 캠페인이나 길가의 광고판처럼 덜 정밀한 방법에 기대야 합니다. 마케팅 부서는 대개 채널 다양화를 추구합니다. 온라인 마케팅이 특정 종류의 참치만 노리는 전문가용 낚싯대라면, 광고판과 TV는 물고기 떼를 향해 던져 놓고 큰 놈 몇 마리라도 걸리기를 바라는 거대한 그물입니다. 광고판과 TV 광고의 또 다른 문제는 효과가 얼마나 되는지 알기가 훨씬 어렵다는 점입니다. 물론 광고판을 어딘가에 세우기 전과 후의 구매량을, 혹은 무엇이든 끌어올리고 싶은 지표를 측정해 볼 수는 있습니다. 지표가 늘었다면 마케팅이 효과가 있었다는 증거가 어느 정도는 됩니다. 하지만 그 증가가 제품 인지도가 원래부터 높아지던 자연스러운 추세가 아니라는 것은 어떻게 알 수 있을까요? 다시 말해, 애초에 광고판을 세우지 않았다면 어떻게 되었을지, 즉 반사실(counterfactual) $Y_0$는 어떻게 알 수 있을까요?\n", + "하지만 온라인 마케팅이 모든 사람에게 닿지는 않습니다. 때로는 TV 캠페인이나 길가의 광고판처럼 덜 정밀한 방법에 기대야 합니다. 마케팅 부서는 대개 채널 다양화를 추구합니다. 온라인 마케팅이 특정 종류의 참치만 노리는 전문가용 낚싯대라면, 광고판과 TV는 물고기 떼를 향해 던져 놓고 큰 놈 몇 마리라도 걸리기를 바라는 거대한 그물입니다. 광고판과 TV 광고의 또 다른 문제는 효과가 얼마나 되는지 알기가 훨씬 어렵다는 점입니다. 물론 광고판을 어딘가에 세우기 전과 후로 구매량이든, 끌어올리고 싶은 다른 어떤 지표든 측정해 볼 수는 있습니다. 지표가 늘었다면 마케팅이 효과가 있었다는 증거가 어느 정도는 됩니다. 하지만 그 증가가 제품 인지도가 원래 높아지던 흐름에서 저절로 생긴 것이 아니라는 점은 어떻게 알 수 있을까요? 다시 말해, 애초에 광고판을 세우지 않았다면 어떻게 되었을지, 즉 반사실(counterfactual) $Y_0$는 어떻게 알 수 있을까요?\n", "\n", "![img](./data/img/diff-in-diff/secrets.png)\n", "\n", - "이런 질문에 답하는 기법 중 하나가 이중차분법(Difference-in-Differences, DID)입니다. 친한 사이에서는 diff-in-diff라고 줄여 부르기도 합니다. 이중차분법은 거시적인 개입의 효과를 평가할 때 흔히 쓰입니다. 이민이 실업에 미치는 효과, 총기 관련 법 개정이 범죄율에 미치는 효과, 아니면 단순히 마케팅 캠페인 때문에 생긴 사용자 참여도의 차이 같은 것들입니다. 이런 경우에는 모두 개입 전 기간과 개입 후 기간이 있고, 개입의 효과를 전반적인 추세와 분리해 내고 싶어 합니다. 이해를 돕기 위해, 제가 실제로 답해야 했던 것과 비슷한 질문을 하나 살펴보겠습니다.\n", + "이런 질문에 답하는 기법 중 하나가 이중차분법(Difference-in-Differences, DID)입니다. 친한 사이에서는 diff-in-diff라고 줄여 부르기도 합니다. 이중차분법은 거시적인 개입의 효과를 평가할 때 흔히 쓰입니다. 이민이 실업에 미치는 효과, 총기 관련 법 개정이 범죄율에 미치는 효과, 아니면 단순히 마케팅 캠페인 때문에 생긴 사용자 참여도의 차이 같은 것들입니다. 이런 경우에는 모두 개입 전과 개입 후 기간이 있고, 전반적인 추세에서 개입의 효과만 떼어 내고 싶어 합니다. 이해를 돕기 위해, 제가 실제로 답해야 했던 것과 비슷한 질문을 하나 살펴보겠습니다.\n", "\n", - "광고판이 마케팅 채널로서 얼마나 쓸모 있는지 알아보려고, 히우그란지두술(Rio Grande do Sul)주의 주도인 포르투알레그리(Porto Alegre)에 광고판 3개를 세웠습니다. 광고판 덕분에 저축 계좌 예금이 늘어나는지 보고 싶었습니다. 브라질 지리에 익숙하지 않은 분들을 위해 덧붙이면, 히우그란지두술은 브라질 남부에 있으며 남부는 브라질에서 가장 발전한 지역 중 하나입니다.\n", + "광고판이 마케팅 채널로서 얼마나 쓸모 있는지 알아보려고, 히우그란지두술(Rio Grande do Sul)주의 주도인 포르투알레그리(Porto Alegre)에 광고판 3개를 세웠습니다. 광고판 덕분에 저축 계좌 예금이 늘어나는지 보고 싶었습니다. 브라질 지리에 익숙하지 않은 분들을 위해 덧붙이면, 히우그란지두술은 브라질에서 가장 발전한 지역 중 하나인 남부에 있습니다.\n", "\n", "이 점을 고려해서 남부의 또 다른 주도인 플로리아노폴리스(Florianopolis)의 데이터도 함께 보기로 했습니다. 플로리아노폴리스는 산타카타리나(Santa Catarina)주의 주도입니다. 플로리아노폴리스를 대조군(control) 표본으로 삼아 포르투알레그리와 비교하면 반사실 $Y_0$를 추정할 수 있다는 생각이었습니다(참고로 이것은 실제 실험이 아닙니다. 실제 실험은 기밀이지만 아이디어는 아주 비슷합니다). 광고판은 6월 한 달 내내 포르투알레그리에 걸어 두었습니다. 데이터는 다음과 같습니다." ] @@ -247,7 +247,7 @@ "E[Y_0(1)|D=1] = E[Y_0(0)|D=1] + (E[Y_0(1)|D=0] - E[Y_0(0)|D=0])\n", "$\n", "\n", - "이 식은 **개입 전** 실험군에 추세 성분을 더합니다. 추세 성분은 대조군으로 추정하며, $E[Y_0(1)|D=0] - E[Y_0(0)|D=0]$입니다. 풀어 말하면, **개입 후** 실험군이 처치를 받지 않았다면 **처치 전** 실험군에 대조군의 증가분과 같은 크기의 증가분을 더한 모습이었을 것이라는 뜻입니다.\n", + "이 식은 **개입 전** 실험군에 추세 성분을 더합니다. 추세 성분은 대조군으로 추정하며, $E[Y_0(1)|D=0] - E[Y_0(0)|D=0]$입니다. 풀어 말하면, 처치를 받지 않았다면 **개입 후** 실험군은 **처치 전** 실험군에 대조군만큼의 증가분을 더한 모습이었을 것이라는 뜻입니다.\n", "\n", "여기서 실험군과 대조군의 추세가 같다고 가정한다는 점이 중요합니다.\n", "\n", @@ -457,7 +457,7 @@ "\n", "![img](./data/img/diff-in-diff/non-parallel.png)\n", "\n", - "마지막으로 짚어 둘 문제는 집계된 데이터만 있으면 DID 추정량의 신뢰구간(confidence interval)을 구할 수 없다는 점입니다. 예를 들어 플로리아노폴리스나 포르투알레그리 고객 한 사람 한 사람이 어떻게 행동했는지에 대한 데이터는 없고, 두 도시의 개입 전후 평균 예금액만 있다고 해 봅시다. 이 경우에도 이중차분법으로 인과효과를 추정할 수는 있지만 그 분산은 알 수 없습니다. 데이터의 변동성이 집계 과정에서 모두 뭉개져 사라졌기 때문입니다.\n", + "마지막으로 짚어 둘 문제는 집계된 데이터만 있으면 DID 추정량의 신뢰구간(confidence interval)을 구할 수 없다는 점입니다. 예를 들어 플로리아노폴리스나 포르투알레그리 고객 한 사람 한 사람의 행동 데이터는 없고, 두 도시의 개입 전후 평균 예금액만 있다고 해 봅시다. 이 경우에도 이중차분법으로 인과효과를 추정할 수는 있지만 그 분산은 알 수 없습니다. 데이터의 변동성이 집계 과정에서 모두 뭉개져 사라졌기 때문입니다.\n", "\n", "## 핵심 요약\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/14-Panel-Data-and-Fixed-Effects.ipynb b/causal-inference-for-the-brave-and-true/14-Panel-Data-and-Fixed-Effects.ipynb index dc822f7..a4b5339 100644 --- a/causal-inference-for-the-brave-and-true/14-Panel-Data-and-Fixed-Effects.ipynb +++ b/causal-inference-for-the-brave-and-true/14-Panel-Data-and-Fixed-Effects.ipynb @@ -50,13 +50,13 @@ "- \\underbrace{Y_0(0)|D=0}_{\\substack{\\text{FLN outcome before}} \\\\ \\substack{\\text{intervention in POA}}} \\big)\n", "$$\n", " \n", - "여기서 $t$는 시간을, $D$는 처치를 나타내며(시간에 $t$를 이미 썼기 때문입니다), $Y_D(t)$는 기간 $t$에서 처치 $D$에 대한 잠재적 결과(potential outcome)입니다. 예를 들어 $Y_0(1)$은 기간 1에서 처치를 받지 않았을 때의 결과입니다. 이렇게 대체한 잠재적 결과를 이용하면 POA에 대한 처치효과, 즉 실험군에 대한 평균 처치효과(ATT)를 다음과 같이 구할 수 있습니다.\n", + "여기서 $t$는 시간을, $D$는 처치를 나타내며($t$는 이미 시간을 가리키므로 처치에는 다른 글자를 씁니다), $Y_D(t)$는 기간 $t$에서 처치 $D$에 대한 잠재적 결과(potential outcome)입니다. 예를 들어 $Y_0(1)$은 기간 1에서 처치를 받지 않았을 때의 결과입니다. 이렇게 대체한 잠재적 결과를 이용하면 POA에 대한 처치효과, 즉 실험군에 대한 평균 처치효과(ATT)를 다음과 같이 구할 수 있습니다.\n", " \n", "$$\n", "\\widehat{ATT} = \\underbrace{Y_1(1)|D=1}_{\\substack{\\text{POA outcome} \\\\ \\text{after intervention}}} - \\widehat{Y_0(1)|D=1}\n", "$$\n", " \n", - "다시 말해, POA에 광고판을 설치한 효과는 광고판을 설치한 뒤 POA에서 관측한 결과에서, 광고판을 설치하지 않았다면 어땠을지에 대한 추정값을 뺀 것입니다. 또한 DID의 힘은 이 반사실을 추정하는 데 필요한 조건이 POA의 예금 증가가 FLN의 예금 증가와 같아야 한다는 것 하나뿐이라는 데서 나온다는 점도 떠올려 보세요. 이것이 핵심인 평행 추세(parallel trends) 가정입니다. 이 가정은 뒤에서 아주 중요해지니 꼭 시간을 들여 살펴봐야 합니다.\n", + "다시 말해, POA에 광고판을 설치한 효과는 광고판을 설치한 뒤 POA에서 관측한 결과에서, 광고판을 설치하지 않았다면 어땠을지에 대한 추정값을 뺀 것입니다. DID가 강력한 이유도 떠올려 보세요. 이 반사실을 추정하는 데 필요한 조건은 POA의 예금 증가가 FLN의 예금 증가와 같아야 한다는 것 하나뿐입니다. 이것이 핵심인 평행 추세(parallel trends) 가정입니다. 이 가정은 뒤에서 아주 중요해지니 꼭 시간을 들여 살펴봐야 합니다.\n", " \n", " \n", "## 평행 추세\n", @@ -96,7 +96,7 @@ "(Y_0, Y_1) \\perp T | X\n", "$\n", " \n", - "말로 풀면, 이 방법들을 쓰려면 모든 교란 요인을 알고 있고 측정할 수 있어서, 그 교란 요인으로 조건화하면 처치를 무작위 배정이나 다름없게 만들 수 있어야 합니다. 큰 문제는 교란 요인을 아예 측정할 수 없을 때가 있다는 점입니다. 예를 들어 결혼이 남성의 소득에 미치는 영향을 알아내는, 노동경제학의 고전적인 문제를 생각해 봅시다. 기혼 남성이 미혼 남성보다 돈을 더 많이 번다는 것은 경제학에서 잘 알려진 사실입니다. 하지만 이 관계가 인과관계인지는 분명하지 않습니다. 교육 수준이 높은 남성일수록 결혼할 가능성도 높고 소득이 높은 직업을 가질 가능성도 높을 수 있습니다. 그렇다면 교육은 결혼이 소득에 미치는 효과의 교란 요인이 됩니다. 이런 교란 요인이라면 연구 대상자의 교육 수준을 측정해 회귀분석에서 통제하면 됩니다. 하지만 외모라는 또 다른 교란 요인이 있을 수 있습니다. 잘생긴 남성일수록 결혼할 가능성도 높고 보수가 높은 직업을 가질 가능성도 높을 수 있습니다. 안타깝게도 외모는 지능처럼 제대로 측정하기 어려운 특성입니다.\n", + "말로 풀면, 이 방법들을 쓰려면 모든 교란 요인을 알고 있고 측정할 수 있어서, 그 교란 요인으로 조건화하면 처치를 무작위 배정이나 다름없게 만들 수 있어야 합니다. 큰 문제는 교란 요인을 아예 측정할 수 없을 때가 있다는 점입니다. 예를 들어 노동경제학의 고전적인 문제인, 결혼이 남성의 소득에 미치는 영향을 생각해 봅시다. 기혼 남성이 미혼 남성보다 돈을 더 많이 번다는 것은 경제학에서 잘 알려진 사실입니다. 하지만 이 관계가 인과관계인지는 분명하지 않습니다. 교육 수준이 높은 남성일수록 결혼할 가능성도 높고 소득이 높은 직업을 가질 가능성도 높을 수 있습니다. 그렇다면 교육은 결혼이 소득에 미치는 효과의 교란 요인이 됩니다. 이런 교란 요인이라면 연구 대상자의 교육 수준을 측정해 회귀분석에서 통제하면 됩니다. 하지만 외모라는 또 다른 교란 요인이 있을 수 있습니다. 잘생긴 남성일수록 결혼할 가능성도 높고 보수가 높은 직업을 가질 가능성도 높을 수 있습니다. 안타깝게도 외모는 지능처럼 제대로 측정하기 어려운 특성입니다.\n", " \n", "측정되지 않은 교란 요인이 있으면 편향이 생기므로 난처한 상황에 놓입니다. 이 문제를 다루는 한 가지 방법은 앞에서 본 도구변수(instrumental variable)입니다. 하지만 좋은 도구변수를 찾기란 쉽지 않고 창의력도 많이 필요합니다. 그래서 여기서는 도구변수 대신 패널데이터의 구조를 활용해 보겠습니다.\n", " \n", @@ -104,9 +104,9 @@ " \n", "![img](./data/img/fixed-effects/fe-graph.png)\n", " \n", - "요령은 한 대상을 가까이 들여다보며 시간에 따라 어떻게 변하는지 추적하면, 시간에 따라 변하지 않는 것은 이미 모두 통제하고 있다는 사실을 알아차리는 것입니다. 시간에 따라 변하지 않으면서 측정되지 않은 교란 요인도 여기에 포함됩니다. 예를 들어 위 그래프에서 시간에 따라 소득이 늘어난 것이 외모가 나아졌기 때문일 수는 없다는 것을 이미 알 수 있습니다. 외모는 그대로이기 때문입니다(애초에 시간에 따라 고정된 변수니까요). 결론적으로, 외모는 측정할 수 없으니 통제할 수도 없지만, 패널 구조를 이용하면 더 이상 문제가 되지 않습니다.\n", + "요령은 이렇습니다. 한 대상을 가까이 들여다보며 시간에 따라 어떻게 변하는지 추적하면, 시간에 따라 변하지 않는 것은 이미 모두 통제하고 있는 셈입니다. 시간에 따라 변하지 않으면서 측정되지 않은 교란 요인도 여기에 포함됩니다. 예를 들어 위 그래프에서 시간에 따라 소득이 늘어난 것이 외모가 나아졌기 때문일 수는 없다는 것을 이미 알 수 있습니다. 외모는 그대로이기 때문입니다(애초에 시간에 따라 고정된 변수니까요). 결론적으로, 외모는 측정할 수 없으니 통제할 수도 없지만, 패널 구조를 이용하면 더 이상 문제가 되지 않습니다.\n", " \n", - "이를 바라보는 또 다른 방법은 시간에 따라 변하지 않는 교란 요인을 각 대상에 고유한 속성으로 생각하는 것입니다. 이는 인과 그래프에 대상을 나타내는 중간 노드를 추가하는 것과 같습니다. 이제 대상 자체를 통제하면 결과와, 관측되지 않았지만 시간에 따라 변하지 않는 교란 요인 사이의 뒷문 경로(backdoor path)가 이미 막힌다는 점에 주목하세요.\n", + "이를 바라보는 또 다른 방법은 시간에 따라 변하지 않는 교란 요인을 각 대상에 고유한 속성으로 생각하는 것입니다. 이는 인과 그래프에 대상을 나타내는 중간 노드를 추가하는 것과 같습니다. 이제 대상 자체를 통제하면, 관측되지 않았지만 시간에 따라 변하지 않는 교란 요인과 결과 사이의 뒷문 경로(backdoor path)가 이미 막힌다는 점에 주목하세요.\n", " \n", "![img](./data/img/fixed-effects/control-unit.png)\n", " \n", @@ -119,7 +119,7 @@ "source": [ "## 고정효과\n", "\n", - "좀 더 엄밀하게 다루기 위해 먼저 가지고 있는 데이터부터 살펴보겠습니다. 앞의 예제를 이어서 결혼이 소득에 미치는 효과를 추정해 보겠습니다. 데이터에는 여러 개인(`nr`)에 대해 여러 해에 걸쳐 측정한 `married`와 `lwage` 두 변수가 들어 있습니다. 임금은 로그를 취한 값이라는 점에 주의하세요. 이 밖에도 그해 일한 시간, 교육 연수 같은 다른 통제 변수가 있습니다." + "좀 더 엄밀하게 다루기 위해 먼저 가지고 있는 데이터부터 살펴보겠습니다. 앞의 예제를 이어서 결혼이 소득에 미치는 효과를 추정해 보겠습니다. 데이터에는 여러 개인(`nr`)을 여러 해에 걸쳐 측정한 `married`와 `lwage` 두 변수가 들어 있습니다. 임금은 로그를 취한 값이라는 점에 주의하세요. 이 밖에도 그해 일한 시간, 교육 연수 같은 다른 통제 변수가 있습니다." ] }, { @@ -251,7 +251,7 @@ "여기서 $y_{it}$는 시점 $t$에서 개인 $i$의 결과이고, $X_{it}$는 시점 $t$에서 개인 $i$의 변수 벡터입니다. $U_i$는 개인 $i$의 관측되지 않는 변수들의 집합입니다. 이 관측되지 않는 변수들은 시간에 따라 변하지 않으므로 시간 첨자가 없다는 점에 주목하세요. 마지막으로 $e_{it}$는 오차항입니다. 이 장의 예제라면 $y_{it}$는 로그 임금, $X_{it}$는 결혼이나 경력처럼 시간에 따라 변하는 관측 변수, $U_i$는 외모나 지능처럼 관측되지 않지만 개인마다 일정한 변수입니다.\n", "\n", "\n", - "앞에서 패널데이터로 고정효과모델을 쓰는 것은 대상별 더미를 추가하는 것만큼 간단하다고 했던 것을 기억하나요? 사실이지만, 실제로는 그렇게 하지 않습니다. 고객이 100만 명인 데이터셋을 떠올려 보세요. 고객마다 더미를 하나씩 추가하면 열이 100만 개가 되는데, 아마 좋은 생각은 아닐 겁니다. 대신 선형회귀를 두 개의 모델로 나누는 요령을 씁니다. 앞에서도 본 내용이지만, 지금 다시 정리해 두면 좋겠습니다. 특성 집합 $X_1$과 또 다른 특성 집합 $X_2$가 있는 선형회귀 모델이 있다고 해 봅시다.\n", + "앞에서 패널데이터로 고정효과모델을 쓰는 것은 대상별 더미를 추가하는 것만큼 간단하다고 했던 것을 기억하나요? 맞는 말이지만, 실무에서는 그렇게 하지 않습니다. 고객이 100만 명인 데이터셋을 떠올려 보세요. 고객마다 더미를 하나씩 추가하면 열이 100만 개가 되는데, 아마 좋은 생각은 아닐 겁니다. 대신 선형회귀를 두 개의 모델로 나누는 요령을 씁니다. 앞에서도 본 내용이지만, 지금 다시 정리해 두면 좋겠습니다. 특성 집합 $X_1$과 또 다른 특성 집합 $X_2$가 있는 선형회귀 모델이 있다고 해 봅시다.\n", "\n", "$\n", "\\hat{Y} = \\hat{\\beta_1} X_1 + \\hat{\\beta_2} X_2\n", @@ -954,7 +954,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "위 그림이 고정효과가 하는 일을 어떻게 보여 주는지 잠시 음미해 보세요. 고정효과가 **도시마다 회귀선을 하나씩** 적합한다는 점에 주목하세요. 그리고 그 선들이 평행하다는 점도요. 선의 기울기는 마케팅 비용이 인앱 구매에 미치는 효과입니다. 즉, **고정효과는 인과효과가 모든 대상에서 일정하다고 가정합니다.** 여기서 대상은 도시입니다. 이 가정은 보기에 따라 약점이 될 수도 있고 장점이 될 수도 있습니다. 도시별 인과효과를 알고 싶다면 약점입니다. 고정효과모델은 효과가 대상마다 같다고 가정하므로 인과효과의 차이를 전혀 찾을 수 없습니다. 하지만 마케팅이 인앱 구매에 미치는 전반적인 효과를 알고 싶다면, 데이터의 패널 구조는 고정효과가 활용할 수 있는 아주 유용한 지렛대가 됩니다.\n", + "위 그림이 고정효과가 하는 일을 어떻게 보여 주는지 잠시 음미해 보세요. 고정효과가 **도시마다 회귀선을 하나씩** 적합하고, 그 선들이 서로 평행하다는 점에 주목하세요. 선의 기울기는 마케팅 비용이 인앱 구매에 미치는 효과입니다. 즉, **고정효과는 인과효과가 모든 대상에서 일정하다고 가정합니다.** 여기서 대상은 도시입니다. 이 가정은 보기에 따라 약점이 될 수도 있고 장점이 될 수도 있습니다. 도시별 인과효과를 알고 싶다면 약점입니다. 고정효과모델은 효과가 대상마다 같다고 가정하므로 인과효과의 차이를 전혀 찾을 수 없습니다. 하지만 마케팅이 인앱 구매에 미치는 전반적인 효과를 알고 싶다면, 데이터의 패널 구조는 고정효과가 활용할 수 있는 아주 유용한 지렛대가 됩니다.\n", "\n", "## 시간 효과\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/15-Synthetic-Control.ipynb b/causal-inference-for-the-brave-and-true/15-Synthetic-Control.ipynb index 01c2229..f69e059 100644 --- a/causal-inference-for-the-brave-and-true/15-Synthetic-Control.ipynb +++ b/causal-inference-for-the-brave-and-true/15-Synthetic-Control.ipynb @@ -230,7 +230,7 @@ "\n", "## 우리에겐 시간이 있다\n", "\n", - "조금 더 엄밀하게 정리해 보겠습니다. $J+1$개의 대상이 있다고 합시다. 일반성을 잃지 않고 대상 1이 개입의 영향을 받는 대상이라고 가정합니다. 대상 $j=2,...,J+1$은 처치받지 않은 대상들의 모음이고, 이를 \"도너 풀(donor pool)\"이라고 부르겠습니다. 또 데이터는 T개 기간에 걸쳐 있고, 그중 $T_0$개 기간이 개입 전이라고 가정합니다. 각 대상 j와 각 시점 t마다 결과 $Y_{jt}$를 관측합니다. 각 대상 j와 기간 t에 대해 개입이 없을 때의 잠재적 결과(potential outcome)를 $Y^N_{jt}$, 개입이 있을 때의 잠재적 결과를 $Y^I_{jt}$로 정의합니다. 그러면 처치받은 대상 $j=1$의 시점 t($t>T_0$)에서의 효과는 다음과 같이 정의됩니다.\n", + "조금 더 엄밀하게 정리해 보겠습니다. $J+1$개의 대상이 있다고 합시다. 일반성을 잃지 않고 대상 1이 개입의 영향을 받는 대상이라고 가정합니다. 대상 $j=2,...,J+1$은 처치받지 않은 대상들의 모음이고, 이를 \"도너 풀(donor pool)\"이라고 부르겠습니다. 또 데이터는 T개 기간에 걸쳐 있고, 그중 $T_0$개 기간이 개입 전이라고 가정합니다. 각 대상 j와 각 시점 t마다 결과 $Y_{jt}$를 관측합니다. 각 대상 j와 기간 t에 대해 개입이 없을 때의 잠재적 결과(potential outcome)를 $Y^N_{jt}$, 개입이 있을 때의 잠재적 결과를 $Y^I_{jt}$로 정의합니다. 그러면 시점 t($t>T_0$)에서 처치받은 대상 $j=1$의 효과는 다음과 같이 정의합니다.\n", "\n", "$\n", "\\tau_{1t} = Y^I_{1t} - Y^N_{1t}\n", @@ -240,7 +240,7 @@ "\n", "![img](data/img/synth-control/synth_img.png)\n", "\n", - "$Y^N_{1t}$를 추정할 때는 도너 풀의 대상들을 조합하면 처치받지 않은 대상 하나만 쓸 때보다 처치받은 대상의 특성을 훨씬 잘 근사할 수 있다는 점을 떠올리면 됩니다. 그래서 가상의 대조군은 대조군 풀(control pool)에 속한 대상들의 가중평균으로 정의합니다. 가중치 $\\pmb{W}=(w_2, ..., w_{J+1})$가 주어지면 $Y^N_{1t}$에 대한 가상의 대조군 추정값은 다음과 같습니다.\n", + "$Y^N_{1t}$를 추정할 때 떠올릴 점은, 처치받지 않은 대상 하나만 쓰기보다 도너 풀의 대상들을 조합하는 편이 처치받은 대상의 특성을 훨씬 잘 근사한다는 것입니다. 그래서 가상의 대조군은 대조군 풀(control pool)에 속한 대상들의 가중평균으로 정의합니다. 가중치 $\\pmb{W}=(w_2, ..., w_{J+1})$가 주어지면 $Y^N_{1t}$에 대한 가상의 대조군 추정값은 다음과 같습니다.\n", "\n", "$\n", "\\hat{Y}^N_{1t} = \\sum^{J+1}_{j=2} w_j Y_{jt}\n", @@ -535,11 +535,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "음… 뭔가 이상합니다. 이 그림에서 무엇이 눈에 띄나요? 첫째, 개입 이후에는 가상의 대조군이 캘리포니아보다 담배 판매량이 많습니다. 개입이 담배 수요를 줄이는 데 성공했다는 신호입니다. 둘째, 개입 전 기간이 완벽하게 들어맞는다는 점을 보세요. 가상의 대조군이 캘리포니아 주와 정확히 일치합니다. 이는 통제집단합성법 모델이 데이터에 과적합(overfitting)되었을 가능성이 높다는 신호입니다. 개입 이후 가상의 대조군 결과변수의 분산이 아주 크다는 점도 또 다른 신호입니다. 매끄러운 패턴을 따르지 않고 오르락내리락을 반복하는 모습을 보세요.\n", + "음… 뭔가 이상합니다. 이 그림에서 무엇이 눈에 띄나요? 첫째, 개입 이후에는 가상의 대조군이 캘리포니아보다 담배 판매량이 많습니다. 개입이 담배 수요를 줄이는 데 성공했다는 신호입니다. 둘째, 개입 전 기간이 완벽하게 들어맞는다는 점을 보세요. 가상의 대조군이 캘리포니아 주와 정확히 일치합니다. 이는 통제집단합성법 모델이 데이터에 과적합(overfitting)되었을 가능성이 높다는 신호입니다. 개입 이후 가상의 대조군에서 결과변수의 분산이 아주 크다는 점도 또 다른 신호입니다. 매끄러운 패턴을 따르지 않고 오르락내리락을 반복하는 모습을 보세요.\n", "\n", "![img](./data/img/synth-control/out-of-sample.png)\n", "\n", - "왜 이런 일이 생기는지 생각해 보려면 도너 풀에 주가 38개나 있다는 점을 떠올려 보세요. 즉, 선형회귀는 처치 전 기간에 도너 풀을 처치받은 대상에 최대한 가깝게 맞추는 데 쓸 수 있는 매개변수가 38개나 됩니다. T가 크더라도 N 역시 큰 경우라서, 선형회귀 모델에 지나치게 많은 자유가 주어지는 셈입니다. 정규화 모델에 익숙하다면 릿지(Ridge)나 라쏘(Lasso) 회귀로 이 문제를 해결할 수 있다는 점을 알아 두세요. 여기서는 과적합을 피하는 좀 더 전통적인 다른 방법을 살펴보겠습니다.\n", + "왜 이런 일이 생기는지 생각해 보려면 도너 풀에 주가 38개나 있다는 점을 떠올려 보세요. 즉, 선형회귀에는 처치 전 기간의 도너 풀을 처치받은 대상에 최대한 가깝게 맞추려고 마음껏 주무를 수 있는 매개변수가 38개나 있습니다. T가 크더라도 N 역시 큰 경우라서, 선형회귀 모델에 지나치게 많은 자유가 주어지는 셈입니다. 정규화 모델에 익숙하다면 릿지(Ridge)나 라쏘(Lasso) 회귀로 이 문제를 해결할 수 있다는 점을 알아 두세요. 여기서는 과적합을 피하는 좀 더 전통적인 다른 방법을 살펴보겠습니다.\n", "\n", "## 외삽하지 마라\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/16-Regression-Discontinuity-Design.ipynb b/causal-inference-for-the-brave-and-true/16-Regression-Discontinuity-Design.ipynb index 8f05f3d..cbaa638 100644 --- a/causal-inference-for-the-brave-and-true/16-Regression-Discontinuity-Design.ipynb +++ b/causal-inference-for-the-brave-and-true/16-Regression-Discontinuity-Design.ipynb @@ -14,7 +14,7 @@ "\n", "\\- 도덕경, 노자.\n", "\n", - "다시 말해 **도약이나 급등이 보인다면 그것은 아마 인위적인 것이고**, 사람이 만든 상황인 경우가 많습니다. 이런 사건에는 보통 평소의 흐름에 대한 반사실(counterfactual)이 따라옵니다. 이상한 일이 일어나면, 자연이 다른 방식으로 움직였다면 어떤 일이 일어났을지 엿볼 수 있게 됩니다. 이런 인위적인 도약을 파고드는 것이 회귀 불연속 설계(Regression Discontinuity Design, RDD)의 핵심입니다.\n", + "다시 말해 **도약이나 급등이 보인다면 그것은 아마 인위적인 것이고**, 사람이 만든 상황인 경우가 많습니다. 이런 사건에는 보통 평소의 흐름에 대한 반사실(counterfactual)이 따라옵니다. 이상한 일이 일어나면, 자연이 다르게 움직였을 때 어떤 일이 벌어졌을지 엿볼 수 있습니다. 이런 인위적인 도약을 파고드는 것이 회귀 불연속 설계(Regression Discontinuity Design, RDD)의 핵심입니다.\n", "\n", "![img](./data/img/rdd/smooth.png)\n", "\n", @@ -24,7 +24,7 @@ "D_i = \\mathcal{1}\\{R_i>c\\}\n", "$\n", "\n", - "즉 $R$이 임곗값(threshold) $c$보다 작으면 처치는 0이고, 그렇지 않으면 1입니다. 따라서 $R>c$일 때는 $Y_1$을, $Rc$일 때는 $Y_1$을, $R 옮긴이: 그림의 'SNEAK 100'은 게임 『엘더스크롤 5: 스카이림』에서 은신 기술을 최고 단계까지 올렸다는 표시입니다. 각 점의 기울기가 그만큼 감쪽같이 숨어 있어서 관측할 수 없다는 농담입니다." ] @@ -422,14 +422,14 @@ "\n", "처치 민감도(treatment sensitivity) 모델을 만들자는 생각은 어떤 대상이 처치에 더 민감하고 어떤 대상이 덜 민감한지 찾아야 할 필요에서 나왔습니다. 개인화(personalisation)하고 싶다는 바람이 그 출발점입니다. 어떤 마케팅 캠페인은 인구 중 한 세그먼트에서만 효과가 클 수도 있습니다. 할인이 특정 유형의 고객에게만 먹힐 수도 있습니다. 좋은 인과 모델이라면 제안한 처치에 어떤 고객이 더 잘 반응하고 어떤 고객이 덜 반응할지 찾는 데 도움이 되어야 합니다. 처치에 얼마나 탄력적인지, 즉 얼마나 민감한지에 따라 대상을 나눌 수 있어야 합니다. 아이스크림 예제라면 사람들이 아이스크림에 돈을 더 쓸 의향이 있는 날, 다시 말해 가격 민감도가 덜 음수인 날을 모델이 찾아낼 수 있어야 합니다.\n", "\n", - "목표가 그렇다면 대상을 민감도가 높은 순서부터 낮은 순서로 정렬할 수 있을 때 아주 유용할 것입니다. 민감도 예측값이 있으니 그 값으로 대상을 정렬하고, 그 순서가 실제 민감도 순서와도 맞기를 기대할 수 있습니다. 안타깝게도 그 순서를 개별 대상 수준에서 평가할 수는 없습니다. 하지만 꼭 개별 수준에서 평가해야 할까요? 대신 그 순서로 정의한 그룹을 평가하면 어떨까요? 처치가 무작위로 배정되어 있다면(무작위성은 바로 여기서 등장합니다) 대상 그룹의 민감도를 추정하기는 쉽습니다. 실험군과 대조군의 결과를 비교하기만 하면 됩니다.\n", + "목표가 그렇다면 대상을 민감도가 높은 순서대로 정렬할 수 있으면 아주 유용할 것입니다. 민감도 예측값이 있으니 그 값으로 대상을 정렬하고, 그 순서가 실제 민감도 순서와도 맞기를 기대할 수 있습니다. 안타깝게도 그 순서를 개별 대상 수준에서 평가할 수는 없습니다. 하지만 꼭 개별 수준에서 평가해야 할까요? 대신 그 순서로 정의한 그룹을 평가하면 어떨까요? 처치가 무작위로 배정되어 있다면(무작위성은 바로 여기서 등장합니다) 대상 그룹의 민감도를 추정하기는 쉽습니다. 실험군과 대조군의 결과를 비교하기만 하면 됩니다.\n", "\n", "이를 더 잘 이해하려면 이진 처치를 떠올려 보는 게 좋습니다. 가격 예제를 그대로 쓰되, 이번에는 처치가 할인이라고 합시다. 다시 말해 가격은 높거나(대조군) 낮을(실험군) 수 있습니다. Y축에 판매량, X축에 각 모델의 예측값을 두고 가격을 색으로 표시해 보겠습니다. 그런 다음 모델 축을 기준으로 데이터를 같은 크기의 세 그룹으로 나눌 수 있습니다. **처치가 무작위로 배정되었다면** 각 그룹의 평균 처치효과(ATE) $E[Y|T=1] - E[Y|T=0]\n", "$를 쉽게 추정할 수 있습니다.\n", "\n", "![img](./data/img/evaluate-causal-models/ate_bins.png)\n", "\n", - "그림을 보면 첫 번째 모델은 판매량을 꽤 잘 예측하지만(판매량과 상관관계가 높음), 아래쪽 그래프에서 보듯이 이 모델이 만든 그룹들의 처치효과는 거의 같습니다. 세 구간 중 두 구간은 민감도가 같고, 마지막 구간만 그보다 낮은 다른 민감도를 보입니다.\n", + "그림을 보면 첫 번째 모델은 판매량을 꽤 잘 예측하지만(판매량과 상관관계가 높음), 아래쪽 그래프에서 보듯이 이 모델이 만든 그룹들의 처치효과는 거의 같습니다. 세 구간 중 두 구간은 민감도가 같고, 마지막 구간만 민감도가 달라서 더 낮습니다.\n", "\n", "반면 두 번째 모델이 만든 그룹은 저마다 인과효과가 다릅니다. 이 모델이 개인화에 실제로 쓸모 있을 수 있다는 신호입니다. 마지막으로 무작위 모델이 만든 그룹은 민감도가 모두 똑같습니다. 그다지 유용하지는 않지만 예상한 결과입니다. 모델이 무작위라면 그 모델이 만든 각 구간은 데이터에서 무작위로 뽑은 대표 표본이 됩니다. 따라서 각 그룹의 민감도는 전체 데이터셋의 ATE와 거의 같아야 합니다.\n", "\n", @@ -608,7 +608,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "이 함수에 대해 몇 가지 짚고 넘어가겠습니다. 이 함수는 민감도 순서를 정하는 값이 `prediction` 인수로 넘긴 열에 들어 있다고 가정합니다. 또 첫 번째 그룹에는 대상이 `min_periods`개 들어가므로 다른 그룹과 크기가 다를 수 있습니다. 곡선 초반에는 표본 크기가 작아서 민감도에 잡음이 너무 많이 낄 수 있기 때문입니다. 이를 해결하려고 처음부터 충분히 큰 첫 그룹을 넘겨 주는 것입니다. 마지막으로 `steps` 인수는 이후 그룹마다 대상을 몇 개씩 더 넣을지 정합니다.\n", + "이 함수에서 몇 가지 짚고 넘어가겠습니다. 이 함수는 민감도 순서를 정하는 값이 `prediction` 인수로 넘긴 열에 들어 있다고 가정합니다. 또 첫 번째 그룹에는 대상이 `min_periods`개 들어가므로 다른 그룹과 크기가 다를 수 있습니다. 곡선 초반에는 표본 크기가 작아서 민감도에 잡음이 너무 많이 낄 수 있기 때문입니다. 이를 해결하려고 처음부터 충분히 큰 첫 그룹을 넘겨 주는 것입니다. 마지막으로 `steps` 인수는 이후 그룹마다 대상을 몇 개씩 더 넣을지 정합니다.\n", "\n", "이 함수로 이제 각 모델이 만든 순서에 따라 누적 민감도 곡선을 그릴 수 있습니다." ] @@ -658,9 +658,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "누적 민감도 곡선은 해석하기가 조금 까다로울 수 있는데, 저는 이렇게 봅니다. 이번에도 이진 처치로 생각하면 더 쉬울 것입니다. 곡선의 X축은 표본을 얼마나 처치하는지를 나타냅니다. 여기서는 축을 데이터셋 대비 비율로 정규화했으니 0.4는 표본의 40%를 처치한다는 뜻입니다. Y축은 그만큼 처치할 때 기대할 수 있는 민감도입니다. 따라서 곡선 값이 40%에서 -1이라면 상위 40% 대상의 민감도가 -1이라는 뜻입니다. 이 사례에서 이상적인 것은 가능한 한 큰 표본에서 가장 덜 음수인 민감도를 얻는 것입니다. 그러니 이상적인 곡선은 Y축 높은 곳에서 출발해 평균 민감도까지 아주 천천히 내려옵니다. 민감도의 크기를 작게 유지하면서도 대상의 높은 비율을 처치할 수 있다는 뜻입니다.\n", + "누적 민감도 곡선은 해석하기가 조금 까다로울 수 있는데, 저는 이렇게 봅니다. 이번에도 이진 처치로 생각하면 더 쉬울 것입니다. 곡선의 X축은 표본을 얼마나 처치하는지를 나타냅니다. 여기서는 축을 데이터셋 대비 비율로 정규화했으니 0.4는 표본의 40%를 처치한다는 뜻입니다. Y축은 그만큼 처치할 때 기대할 수 있는 민감도입니다. 따라서 곡선 값이 40%에서 -1이라면 상위 40% 대상의 민감도가 -1이라는 뜻입니다. 이 사례에서 이상적인 것은 가능한 한 큰 표본에서 가장 덜 음수인 민감도를 얻는 것입니다. 그러니 이상적인 곡선은 Y축 높은 곳에서 출발해 평균 민감도까지 아주 천천히 내려옵니다. 대상을 많이 처치하면서도 민감도의 크기를 작게 유지할 수 있다는 뜻입니다.\n", "\n", - "굳이 말할 필요도 없지만, 이상적인 민감도 곡선에 근접한 모델은 하나도 없습니다. 무작위 모델 `rand_m`은 평균 민감도 주변에서 오르내릴 뿐 그리 멀리 벗어나지 않습니다. 평균과 민감도가 다른 그룹을 찾아내지 못한다는 뜻입니다. 예측 모델 `pred_m`은 곡선이 평균 민감도보다 아래에서 시작하므로 민감도를 거꾸로 정렬하는 것으로 보입니다. 게다가 표본의 50% 정도에서 꽤 빨리 평균 민감도로 수렴합니다. 마지막으로 인과 모델 `sensitivity_m`이 더 흥미롭습니다. 처음에는 누적 민감도가 평균에서 멀어지며 올라가는 이상한 모습을 보이지만, 이후 거의 0에 가까운 꽤 괜찮은 민감도를 유지하면서 대상의 약 75%를 처치할 수 있는 지점에 이릅니다. 아마 이 모델이 민감도가 아주 낮은(가격 민감도가 높은) 날을 찾아낼 수 있어서일 것입니다. 그러니 그런 날만 가격을 올리지 않는다면, 표본 대부분(약 75%)에서는 가격을 올려도 가격 민감도를 낮게 유지할 수 있습니다.\n", + "굳이 말할 필요도 없지만, 이상적인 민감도 곡선에 근접한 모델은 하나도 없습니다. 무작위 모델 `rand_m`은 평균 민감도 주변에서 오르내릴 뿐 그리 멀리 벗어나지 않습니다. 평균과 민감도가 다른 그룹을 찾아내지 못한다는 뜻입니다. 예측 모델 `pred_m`은 곡선이 평균 민감도보다 아래에서 시작하므로 민감도를 거꾸로 정렬하는 것으로 보입니다. 게다가 표본의 50% 정도에서 꽤 빨리 평균 민감도로 수렴합니다. 마지막으로 인과 모델 `sensitivity_m`이 더 흥미롭습니다. 처음에는 누적 민감도가 평균에서 멀어지며 올라가는 이상한 모습을 보입니다. 하지만 그 뒤로는 0에 가까운 꽤 괜찮은 민감도를 유지한 채 대상의 약 75%까지 처치할 수 있습니다. 아마 이 모델이 민감도가 아주 낮은(가격 민감도가 높은) 날을 찾아낼 수 있어서일 것입니다. 그러니 그런 날만 가격을 올리지 않는다면, 표본 대부분(약 75%)에서는 가격을 올려도 가격 민감도를 낮게 유지할 수 있습니다.\n", "\n", "모델 평가 측면에서 누적 민감도 곡선은 구간별 민감도라는 단순한 아이디어보다 이미 훨씬 낫습니다. 이 곡선 덕분에 모델의 우열을 훨씬 정밀하게 가릴 수 있었습니다. 그래도 여전히 이해하기 복잡한 곡선입니다. 그래서 한 단계 더 개선해 보겠습니다." ] @@ -907,7 +907,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "인과 모델에 대해 그려 보면 다음과 같습니다. 이번에는 곡선 초반의 표본 크기가 더 작은데도 신뢰구간이 좁게 시작한다는 점에 주목하세요. 정규화 계수 $\\frac{k}{N}$이 ATE 추정값을 축소하면서 그 신뢰구간도 함께 축소하기 때문입니다. 이 곡선은 모델을 비교하는 데 쓰는 것이므로 문제가 되지 않습니다. 평가하는 모든 모델에 이 축소 계수가 똑같이 적용되니까요." + "인과 모델로 그려 보면 다음과 같습니다. 이번에는 곡선 초반의 표본 크기가 더 작은데도 신뢰구간이 좁게 시작한다는 점에 주목하세요. 정규화 계수 $\\frac{k}{N}$이 ATE 추정값을 축소하면서 그 신뢰구간도 함께 축소하기 때문입니다. 이 곡선은 모델을 비교하는 데 쓰는 것이므로 문제가 되지 않습니다. 평가하는 모든 모델에 이 축소 계수가 똑같이 적용되니까요." ] }, { @@ -957,13 +957,13 @@ "source": [ "## 핵심 요약\n", "\n", - "이 장에서는 모델이 민감도를 얼마나 잘 정렬하는지 확인하는 세 가지 방법을 살펴봤습니다. 이 방법들을 인과적 목적을 가진 모델들을 비교하고 그중 하나를 고르는 수단으로 썼습니다. 정말 대단한 일입니다. 민감도를 볼 수 없는데도 모델이 민감도가 서로 다른 그룹을 잘 찾아내는지 확인해 냈으니까요!\n", + "이 장에서는 모델이 민감도를 얼마나 잘 정렬하는지 확인하는 세 가지 방법을 살펴봤습니다. 그리고 이 방법들로 인과적 목적을 가진 모델들을 비교해 그중 하나를 골랐습니다. 정말 대단한 일입니다. 민감도를 볼 수 없는데도 모델이 민감도가 서로 다른 그룹을 잘 찾아내는지 확인해 냈으니까요!\n", "\n", "여기서는 무작위 데이터에 크게 기댔습니다. 모델은 비무작위 데이터로 학습했지만, 평가는 모두 처치가 무작위로 배정된 표본에서 했습니다. 민감도를 믿을 만하게 추정할 방법이 필요했기 때문입니다. 무작위 데이터가 없으면 여기서 쓴 간단한 공식들은 통하지 않습니다. 이제는 잘 알다시피, 교란 요인이 있으면 단순선형회귀에는 누락 변수 편향(omitted variable bias)이 생깁니다.\n", "\n", "그래도 무작위 데이터를 조금이라도 손에 넣을 수 있다면, 그 데이터로 모델을 비교하는 방법은 이미 알고 있습니다. 다음 장에서는 비무작위 데이터 문제를 다루겠지만, 넘어가기 전에 모델 평가에 대해 마지막으로 몇 마디 하고 싶습니다.\n", "\n", - "신뢰할 수 있는 모델 평가가 얼마나 중요한지 다시 강조하겠습니다. 누적 이득 곡선 덕분에 드디어 인과추론에 쓰는 모델을 비교할 좋은 방법이 생겼습니다. 이제 처치 개인화에 어떤 모델이 더 적합한지 결정할 수 있습니다. 이건 큰 진전입니다. 인과추론 자료 대부분은 모델을 평가할 좋은 방법을 알려 주지 않습니다. 제 생각에는 이것이야말로 인과추론이 머신러닝만큼 대중화되는 데 필요한 빠진 퍼즐 조각입니다. 좋은 평가 방법이 있으면 예측 모델에서 이미 큰 효과를 본 훈련-테스트 패러다임에 인과추론을 더 가까이 가져갈 수 있습니다. 대담한 주장이라는 건 압니다. 그래서 조심스럽게 말하지만, 아직까지 이 주장에 대한 좋은 반론은 찾지 못했습니다. 반론이 있다면 꼭 알려 주세요.\n", + "신뢰할 수 있는 모델 평가가 얼마나 중요한지 다시 강조하겠습니다. 누적 이득 곡선 덕분에 드디어 인과추론에 쓰는 모델을 비교할 좋은 방법이 생겼습니다. 이제 처치 개인화에 어떤 모델이 더 적합한지 결정할 수 있습니다. 이건 큰 진전입니다. 인과추론 자료 대부분은 모델을 평가할 좋은 방법을 알려 주지 않습니다. 제 생각에는 이것이야말로 인과추론이 머신러닝만큼 대중화되는 데 필요한 빠진 퍼즐 조각입니다. 좋은 평가 방법이 있으면 예측 모델에서 이미 큰 효과를 본 훈련-테스트 패러다임에 인과추론을 더 가까이 가져갈 수 있습니다. 대담한 주장이라는 건 압니다. 그래서 조심스럽게 말하지만, 이 주장을 뒤집을 만한 좋은 반론은 아직 찾지 못했습니다. 반론이 있다면 꼭 알려 주세요.\n", "\n", "## 참고 자료\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/20-Plug-and-Play-Estimators.ipynb b/causal-inference-for-the-brave-and-true/20-Plug-and-Play-Estimators.ipynb index 68c6b81..e450c9b 100644 --- a/causal-inference-for-the-brave-and-true/20-Plug-and-Play-Estimators.ipynb +++ b/causal-inference-for-the-brave-and-true/20-Plug-and-Play-Estimators.ipynb @@ -496,7 +496,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "이 모델이 얼마나 좋은지 평가하려면 훈련 셋과 테스트 셋 각각에 대해 누적 이득 곡선(cumulative gain curve)을 그려 보면 됩니다." + "이 모델이 얼마나 좋은지 평가하려면 훈련 셋과 테스트 셋에서 각각 누적 이득 곡선(cumulative gain curve)을 그려 보면 됩니다." ] }, { @@ -536,7 +536,7 @@ "source": [ "보다시피 이 플러그 앤 플레이 추정량은 테스트 셋에서 무작위보다 낫습니다. 그래도 훈련 셋의 성능이 테스트 셋보다 훨씬 좋은 것으로 보아 과적합이 꽤 심한 듯합니다.\n", "\n", - "사실 이것이 목표 변환 기법의 가장 큰 단점 가운데 하나입니다. 목표 변환을 쓰면 목표만 변환한 뒤 아무 머신러닝 추정량으로 이질적 처치효과를 예측할 수 있으니 무척 간단합니다. 그 대가로 분산이 크게 늘어납니다. 변환된 목표는 개별 처치효과의 추정값으로서 잡음이 매우 심하고, 그 분산이 그대로 추정에 옮겨 가기 때문입니다. 데이터가 많지 않다면 큰 문제지만, 표본이 100만 개를 넘는 빅데이터 환경에서는 문제가 덜할 것입니다." + "사실 이것이 목표 변환 기법의 가장 큰 단점 가운데 하나입니다. 목표 변환을 쓰면 목표만 변환한 뒤 아무 머신러닝 추정량으로 이질적 처치효과를 예측할 수 있으니 무척 간단합니다. 하지만 그 대가로 분산이 크게 늘어납니다. 변환된 목표는 개별 처치효과의 추정값으로서 잡음이 매우 심하고, 그 분산이 그대로 추정에 옮겨 가기 때문입니다. 데이터가 많지 않다면 큰 문제지만, 표본이 100만 개를 넘는 빅데이터 환경에서는 문제가 덜할 것입니다." ] }, { @@ -547,9 +547,9 @@ "\n", "![img](./data/img/plug-and-play-estimators/second-estimator.png)\n", "\n", - "목표 변환 방법의 또 다른 뚜렷한 단점은 이산형이나 이진 처치에서만 작동한다는 점입니다. 인과추론 문헌에서 흔히 볼 수 있는 상황입니다. 연구 대부분이 이진 처치를 다루고, 연속형 처치에 관한 내용은 찾기 어렵습니다. 이 점이 저를 무척 괴롭혔습니다. 산업 현장에는 연속형 처치가 어디에나 있고, 대부분은 최적화해야 하는 가격의 형태이기 때문입니다. 그래서 연속형 처치를 위한 목표 변환은 찾지 못했지만, 실무에서 통하는 방법을 직접 고안해 냈습니다. 다만 이 방법을 뒷받침하는 탄탄한 계량경제학 연구는 없다는 점을 염두에 두세요.\n", + "목표 변환 방법의 또 다른 뚜렷한 단점은 이산형이나 이진 처치에서만 작동한다는 점입니다. 인과추론 문헌에서 흔히 볼 수 있는 상황입니다. 연구 대부분이 이진 처치를 다루고, 연속형 처치에 관한 내용은 찾기 어렵습니다. 저는 이 점이 무척 답답했습니다. 산업 현장에는 연속형 처치가 어디에나 있고, 대부분은 최적화해야 하는 가격의 형태이기 때문입니다. 결국 연속형 처치를 위한 목표 변환은 찾지 못했지만, 실무에서 통하는 방법을 직접 고안해 냈습니다. 다만 이 방법을 뒷받침하는 탄탄한 계량경제학 연구는 없다는 점을 염두에 두세요.\n", "\n", - "이 방법을 소개하기 위해 아이스크림 판매 예제로 돌아가 보겠습니다. 그 예제에서는 수익을 최적화하도록 아이스크림 가격을 더 잘 정하기 위해 가격에 대한 수요의 탄력성(elasticity)을 추정하는 과제를 맡았습니다. 데이터셋의 각 표본은 하루이고, 사람들이 가격 인상에 덜 민감한 때가 언제인지 알고 싶었다는 점을 떠올려 보세요. 또한 이 데이터셋에서는 가격이 무작위로 배정됐으므로 교란편향을 걱정할 필요가 없다는 점도 기억하실 것입니다." + "이 방법을 소개하기 위해 아이스크림 판매 예제로 돌아가 보겠습니다. 그 예제에서 맡은 과제는 가격에 대한 수요의 탄력성(elasticity)을 추정하는 것이었습니다. 그래야 아이스크림 가격을 더 잘 정해 수익을 최적화할 수 있습니다. 데이터셋의 각 표본은 하루이고, 사람들이 가격 인상에 덜 민감한 때가 언제인지 알고 싶었다는 점을 떠올려 보세요. 또한 이 데이터셋에서는 가격이 무작위로 배정됐으므로 교란편향을 걱정할 필요가 없다는 점도 기억하실 것입니다." ] }, { @@ -727,7 +727,7 @@ "\n", "무작위 배정에서는 $E[T_i|X_i=x]=\\bar{T}$이므로 $E[V_i|X_i=x]=0$이라는 점에 주목하세요. 다시 말해, X의 모든 영역에서 $E[T_i]=\\bar{T}$입니다. 또한 $E[T_i(T_i - \\bar{T})|X_i=x] = E[(T_i - \\bar{T})^2|X_i=x]$이고 이는 처치의 분산이므로 $E[T_i V_i | X_i=x]=1$입니다. 마지막으로, 조건부 독립성(무작위 처치 배정이라면 저절로 얻는 성질) 아래에서 $E[T_i e_i | X_i=x] = E[T_i | X_i=x] E[e_i | X_i=x]$입니다.\n", "\n", - "이 목표 변환이 통한다는 것을 보이려면, 우리가 추정하는 것이 다음과 같은 국소 선형 모델의 매개변수라는 점을 기억해야 합니다.\n", + "이 목표 변환이 통한다는 것을 보이려면, 지금 추정하는 것이 다음과 같은 국소 선형 모델의 매개변수라는 점을 기억해야 합니다.\n", "\n", "$\n", "Y_i = \\alpha + \\beta T_i + e_i | X_i=x\n", @@ -941,7 +941,7 @@ "\n", "![img](./data/img/plug-and-play-estimators/non-linear-case.png)\n", "\n", - "문제는 **탄력성 또는 처치효과가 처치 자체에 따라 변한다**는 점입니다. 이 예제에서 처치효과는 곡선의 앞부분에서 더 강하고 가격이 높아질수록 작아집니다. 다시 더운 날(노란색)과 추운 날(파란색), 두 종류의 날이 있고 인과 모델로 둘을 구분하고 싶다고 해 봅시다. 그런데 인과 모델은 탄력성을 예측해야 하는데, 비선형인 경우에는 곡선에서 서로 다른 가격 지점을 보면 더운 날과 추운 날의 탄력성이 같게 나올 수 있습니다(오른쪽 그림).\n", + "문제는 **탄력성 또는 처치효과가 처치 자체에 따라 변한다**는 점입니다. 이 예제에서 처치효과는 곡선의 앞부분에서 더 강하고 가격이 높아질수록 작아집니다. 다시 더운 날(노란색)과 추운 날(파란색), 두 종류의 날이 있고 인과 모델로 둘을 구분하고 싶다고 해 봅시다. 그런데 인과 모델이 예측하는 것은 탄력성입니다. 비선형인 경우에는 곡선에서 서로 다른 가격 지점을 보면 더운 날과 추운 날의 탄력성이 같게 나올 수 있습니다(오른쪽 그림).\n", "\n", "이 문제를 쉽게 빠져나갈 방법은 없고, 고백하자면 저도 무엇이 가장 잘 통하는지 아직 연구하고 있습니다. 지금으로서는 처치효과의 함수 형태를 생각해 보고 이를 어떻게든 선형화하는 방식을 씁니다. 예를 들어 수요는 보통 다음과 같은 함수 형태를 띠는데, $\\alpha$가 클수록 가격을 올릴 때마다 수요가 더 빠르게 줄어듭니다.\n", "\n", @@ -968,9 +968,9 @@ "\n", "이 장에서는 목표 변환이라는 아주 간단한 기법을 살펴봤습니다. 원래 목표 Y와 처치 T를 결합해, 기댓값이 CATE와 같은 변환된 목표를 만드는 것이 핵심 아이디어입니다. 이 새 목표가 있으면 어떤 머신러닝 예측 모델이든 끼워 넣어 추정할 수 있고, 그 모델의 예측값이 곧 CATE의 추정값이 됩니다. 덧붙이면, 이 방법은 목표 변환 말고 **F 러너**라는 이름으로도 불립니다.\n", "\n", - "이렇게 간단한 만큼 치러야 할 대가도 있습니다. 변환된 목표는 개별 처치효과의 추정값으로서 잡음이 매우 심하고, 그 잡음은 분산의 형태로 모델 추정값에 옮겨 갑니다. 그래서 목표 변환은 표본 크기 자체가 커서 분산이 덜 문제 되는 빅데이터 환경에 더 잘 맞습니다. 목표 변환 방법의 또 다른 단점은 이진 처치나 범주형 처치에 대해서만 정의된다는 점입니다. 최선을 다해 연속형 버전을 고안했고 그럭저럭 통하는 듯한 방법까지 얻었지만, 아직까지는 이를 뒷받침할 탄탄한 이론적 틀이 없습니다.\n", + "이렇게 간단한 만큼 치러야 할 대가도 있습니다. 변환된 목표는 개별 처치효과의 추정값으로서 잡음이 매우 심하고, 그 잡음은 분산의 형태로 모델 추정값에 옮겨 갑니다. 그래서 목표 변환은 표본 크기 자체가 커서 분산이 덜 문제 되는 빅데이터 환경에 더 잘 맞습니다. 목표 변환 방법의 또 다른 단점은 이진 처치나 범주형 처치에만 정의된다는 점입니다. 최선을 다해 연속형 버전을 고안했고 그럭저럭 통하는 듯한 방법까지 얻었지만, 아직까지는 이를 뒷받침할 탄탄한 이론적 틀이 없습니다.\n", "\n", - "마지막으로 비선형 처치효과와 그에 따르는 어려움을 논의했습니다. 처치효과가 처치 자체에 따라 변하면, 실제로는 분석단위들이 서로 다른 양의 처치를 받고 있을 뿐인데도 처치에 대한 반응도가 같다는 이유로 처치 반응 곡선이 같다고 잘못 생각할 수 있습니다.\n", + "마지막으로 비선형 처치효과와 그에 따르는 어려움을 논의했습니다. 처치효과가 처치 자체에 따라 변하면 착각하기 쉽습니다. 처치에 대한 반응도가 같다는 이유로 분석단위들의 처치 반응 곡선이 같다고 생각할 수 있는데, 실제로는 서로 다른 양의 처치를 받고 있을 뿐입니다.\n", "\n", "\n", "## 참고 자료\n", diff --git a/causal-inference-for-the-brave-and-true/21-Meta-Learners.ipynb b/causal-inference-for-the-brave-and-true/21-Meta-Learners.ipynb index e20a338..7bdd2ae 100644 --- a/causal-inference-for-the-brave-and-true/21-Meta-Learners.ipynb +++ b/causal-inference-for-the-brave-and-true/21-Meta-Learners.ipynb @@ -15,7 +15,7 @@ "\n", "처치가 연속형이라면 $E[\\delta Y_i(t)|X]$입니다. 다시 말해 각 대상이 처치에 얼마나 민감한지 알고 싶은 것입니다. 이런 정보는 모두에게 처치를 줄 수 없어서 우선순위를 정해야 할 때 아주 유용합니다. 할인을 주고 싶은데 예산이 한정된 경우가 좋은 예입니다.\n", "\n", - "앞 장에서는 결과변수 $Y$를 변환해서 예측 모델에 그대로 넣고 조건부 평균 처치효과(CATE) 추정값을 얻는 방법을 살펴봤습니다. 그 대가로 분산이 커지는 것을 감수해야 했습니다. 데이터 과학에서는 이런 일이 흔합니다. 방법마다 장단점이 있어서 하나만 고를 수 있는 최선의 방법은 없습니다. 그래서 여러 기법을 알아 두고 상황에 따라 하나를 내주고 다른 하나를 얻는 식으로 골라 쓰는 것이 좋습니다. 이 장도 그런 취지로, 손에 쥘 수 있는 도구를 더 늘리는 데 집중합니다.\n", + "앞 장에서는 결과변수 $Y$를 변환해서 예측 모델에 그대로 넣고 조건부 평균 처치효과(CATE) 추정값을 얻는 방법을 살펴봤습니다. 그 대가로 분산이 커지는 것을 감수해야 했습니다. 데이터 과학에서는 이런 일이 흔합니다. 방법마다 장단점이 있어서 하나만 고를 수 있는 최선의 방법은 없습니다. 그래서 여러 기법을 알아 두었다가 상황에 따라 장단점을 따져 골라 쓰는 것이 좋습니다. 이 장도 그런 취지로, 손에 쥘 수 있는 도구를 더 늘리는 데 집중합니다.\n", "\n", "![img](data/img/meta-learners/learned-new-move.png)\n", "\n", @@ -433,7 +433,7 @@ "\n", "실험군의 관측값이 아주 적으므로 $M_1$은 과적합을 피하려고 아주 단순한 모델(여기서는 선형)이 됩니다. $M_0$는 더 복잡해지지만, 데이터가 풍부해서 과적합을 막아 주니 문제가 없습니다. 머신러닝 관점에서는 모두 타당한 결과입니다. 그런데 이 두 모델로 CATE $\\hat{\\tau}=M_1(X) - M_0(X)$를 계산하면, 선형인 $M_1(X)$에서 비선형인 $M_0(X)$를 빼게 되므로 CATE도 비선형이 됩니다(파란 선에서 빨간 선을 뺀 값). 이 예에서 CATE는 1로 일정하므로 틀린 결과입니다.\n", "\n", - "대조군 모델은 비선형성을 잡아낼 수 있지만, 실험군 모델은 표본 크기가 작아서 정규화를 걸었기 때문에 비선형성을 잡아내지 못한 것입니다. 물론 실험군 모델의 정규화를 줄일 수도 있지만, 그러면 작은 표본 크기 탓에 과적합이 일어납니다. 진퇴양난에 빠진 셈입니다. 이 문제를 풀기 위해 Kunzela 등이 같은 논문에서 제안한 X 러너를 쓸 수 있습니다." + "대조군 모델은 비선형성을 잡아낼 수 있지만, 실험군 모델은 표본이 작아서 정규화를 걸었고, 그 탓에 비선형성을 잡아내지 못했습니다. 물론 실험군 모델의 정규화를 줄일 수도 있지만, 그러면 작은 표본 크기 탓에 과적합이 일어납니다. 진퇴양난에 빠진 셈입니다. 이 문제를 풀기 위해 Kunzela 등이 같은 논문에서 제안한 X 러너를 쓸 수 있습니다." ] }, { @@ -472,9 +472,9 @@ "\\hat{M}_{\\tau 1}(X) \\approx E[\\hat{\\tau}(X)|T=1]\n", "$\n", "\n", - "앞에서 본 그림에 이 과정을 적용하면, 대조군에 대해 대체한 처치효과 $\\hat{\\tau}(X, T=0)$이 빨간 십자 표시이고 빨간 점선이 $\\hat{M}_{\\tau 0}(X)$입니다. 이 모델은 틀렸습니다. $\\hat{\\tau}(X, T=0)$을 실험군에서 추정한 단순하고 정규화된 모델 $\\hat{M}_1$로 만들었기 때문입니다. 그 모델은 Y 변수의 비선형성을 잡아내지 **못하므로**, 그 모델로 대체한 처치효과는 비선형이 됩니다.\n", + "앞에서 본 그림에 이 과정을 적용하면, 대조군에서 대체한 처치효과 $\\hat{\\tau}(X, T=0)$이 빨간 십자 표시이고 빨간 점선이 $\\hat{M}_{\\tau 0}(X)$입니다. 이 모델은 틀렸습니다. $\\hat{\\tau}(X, T=0)$을 실험군에서 추정한 단순하고 정규화된 모델 $\\hat{M}_1$로 만들었기 때문입니다. 그 모델은 Y 변수의 비선형성을 잡아내지 **못하므로**, 그 모델로 대체한 처치효과는 비선형이 됩니다.\n", "\n", - "반면 파란 점은 실험군에 대해 대체한 처치효과 $\\hat{\\tau}(X, T=1)$입니다. 이 효과는 처치를 받지 않은 큰 표본으로 학습한 올바른 모델 $M_0$로 추정했습니다. 대체한 처치효과가 올바르므로, 파란 선으로 나타낸 두 번째 단계 모델 $\\hat{M}_{\\tau 1}(X)$도 올바르게 학습할 수 있습니다.\n", + "반면 파란 점은 실험군에서 대체한 처치효과 $\\hat{\\tau}(X, T=1)$입니다. 이 효과는 처치를 받지 않은 큰 표본으로 학습한 올바른 모델 $M_0$로 추정했습니다. 대체한 처치효과가 올바르므로, 파란 선으로 나타낸 두 번째 단계 모델 $\\hat{M}_{\\tau 1}(X)$도 올바르게 학습할 수 있습니다.\n", "\n", "![img](data/img/meta-learners/second-stage-x.png)\n", "\n", @@ -641,7 +641,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "이번에도 이 데이터셋에서 괜찮은 성능이 나옵니다. 여기서는 S, T, X 러너의 성능이 꽤 비슷해 보입니다. 그래도 이 메타러너들을 모두 알아 두면 그때그때 가장 잘 맞는 것을 골라 쓸 수 있으니 알아 둘 가치가 있습니다. 성능은 바탕이 되는 머신러닝 모델을 무엇으로 고르느냐에도 크게 달려 있다는 점을 기억하세요. 여기서는 모두 그레이디언트 부스팅 트리를 썼지만, 다른 모델을 쓰거나 같은 모델이라도 하이퍼파라미터를 바꾸면 더 나을 수도 있습니다.\n", + "이번에도 이 데이터셋에서 괜찮은 성능이 나옵니다. 여기서는 S, T, X 러너의 성능이 꽤 비슷해 보입니다. 그래도 이 메타러너들을 모두 알아 둘 가치는 있습니다. 그래야 그때그때 가장 잘 맞는 것을 골라 쓸 수 있습니다. 성능은 바탕이 되는 머신러닝 모델을 무엇으로 고르느냐에도 크게 달려 있다는 점을 기억하세요. 여기서는 모두 그레이디언트 부스팅 트리를 썼지만, 다른 모델을 쓰거나 같은 모델이라도 하이퍼파라미터를 바꾸면 더 나을 수도 있습니다.\n", "\n", "## 핵심 요약\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/22-Debiased-Orthogonal-Machine-Learning.ipynb b/causal-inference-for-the-brave-and-true/22-Debiased-Orthogonal-Machine-Learning.ipynb index 3f92be4..bcb4df6 100644 --- a/causal-inference-for-the-brave-and-true/22-Debiased-Orthogonal-Machine-Learning.ipynb +++ b/causal-inference-for-the-brave-and-true/22-Debiased-Orthogonal-Machine-Learning.ipynb @@ -6,15 +6,15 @@ "source": [ "# 22 - Debiased/Orthogonal Machine Learning\n", " \n", - "다음으로 살펴볼 메타러너(meta-learner)는 사실 '메타러너'라는 이름이 붙기도 전에 나왔습니다. 제가 아는 한, 출발점은 인과추론 문헌에 풍성한 연구 흐름을 열어 준 2016년의 멋진 논문입니다. 논문 제목은 *Double Machine Learning for Treatment and Causal Parameters*이고, 저자도 무척 많습니다. Victor Chernozhukov, Denis Chetverikov, Mert Demirer, Esther Duflo(덧붙이자면 Abhijit Banerjee, Michael Kremer와 함께 \"세계 빈곤을 줄이기 위한 실험적 접근\"으로 2019년 노벨 경제학상을 받았습니다), Christian Hansen, Whitney Newey, James Robins까지요. 이런 사람들이 썼으니 좋은 논문일 수밖에 없었고, 저는 별 이유 없이 저자들을 어벤져스로 그려 보기까지 했습니다(이 아이디어는 Paul Goldsmith-Pinkham이 먼저 냈으니 공은 그에게 돌립니다).\n", + "다음으로 살펴볼 메타러너(meta-learner)는 사실 '메타러너'라는 이름이 붙기도 전에 나왔습니다. 제가 아는 한, 출발점은 인과추론 문헌에 풍성한 연구 흐름을 열어 준 2016년의 멋진 논문입니다. 논문 제목은 *Double Machine Learning for Treatment and Causal Parameters*이고, 저자도 무척 많습니다. Victor Chernozhukov, Denis Chetverikov, Mert Demirer, Esther Duflo(덧붙이자면 Abhijit Banerjee, Michael Kremer와 함께 \"세계 빈곤을 줄이기 위한 실험적 접근\"으로 2019년 노벨 경제학상을 받았습니다), Christian Hansen, Whitney Newey, James Robins가 함께 썼습니다. 이런 사람들이 썼으니 좋은 논문일 수밖에 없었고, 저는 별 이유 없이 저자들을 어벤져스로 그려 보기까지 했습니다(이 아이디어는 Paul Goldsmith-Pinkham이 먼저 냈으니 공은 그에게 돌립니다).\n", " \n", "![img](./data/img/debiased-ml/avengers.png)\n", " \n", "이 논문의 문제는 딱 하나, 읽기가 엄청나게 어렵다는 점입니다(계량경제학 논문이니 놀랄 일은 아닙니다). 이 책의 목표는 인과추론을 누구나 쓰는 도구로 만드는 것이니, 여기서는 편향 제거/직교화 머신러닝(Debiased/Orthogonal Machine Learning)을 직관적으로 풀어 보려 합니다.\n", " \n", - "그런데 다른 메타러너와 따로 떼어 한 장을 통째로 내줄 만큼 특별한 이유가 뭘까요? 제 눈길을 끈 것은 편향 제거/직교화 머신러닝이 이론적으로 아주 탄탄하게 뒷받침된다는 점이었습니다. 지금까지 본 T 러너, S 러너, X 러너는 모두 어딘가 임시방편 같은 느낌이 있었습니다. 왜 작동하는지 직관적으로 설명할 수는 있어도 일반적인 방법처럼 보이지는 않았습니다. 반면 편향 제거/직교화 머신러닝에는 매우 직관적이면서도 아주 엄밀한, 범용으로 적용할 수 있는 틀이 있습니다. 게다가 연속형 처치와 이산형 처치 모두에 쓸 수 있는데, T 러너도 X 러너도 하지 못하는 일입니다. 이 방법을 다룬 논문들이 추정량의 점근적 성질을 훌륭하게 분석해 두었다는 점은 말할 것도 없고요. 그럼 더 뜸 들이지 말고 바로 시작하겠습니다.\n", + "그런데 다른 메타러너와 따로 떼어 한 장을 통째로 내줄 만큼 특별한 이유가 뭘까요? 제 눈길을 끈 것은 편향 제거/직교화 머신러닝이 이론적으로 아주 탄탄하게 뒷받침된다는 점이었습니다. 지금까지 본 T 러너, S 러너, X 러너는 모두 어딘가 임시방편 같은 느낌이 있었습니다. 왜 작동하는지 직관적으로 설명할 수는 있어도 일반적인 방법처럼 보이지는 않았습니다. 반면 편향 제거/직교화 머신러닝에는 매우 직관적이면서도 아주 엄밀한, 범용으로 적용할 수 있는 틀이 있습니다. 게다가 연속형 처치와 이산형 처치 모두에 쓸 수 있는데, T 러너도 X 러너도 하지 못하는 일입니다. 이 방법을 다룬 논문들이 추정량의 점근적 성질까지 훌륭하게 분석해 두었다는 점은 말할 것도 없습니다. 그럼 더 뜸 들이지 말고 바로 시작하겠습니다.\n", " \n", - "이번에도 동기를 부여할 예시로 아이스크림 판매 데이터셋을 쓰겠습니다. 다시 짚자면, 여기서 찾으려는 것은 가격이 판매량에 미치는 효과의 이질성입니다. 테스트 데이터의 가격은 무작위로 배정되었지만, 훈련 데이터에는 관측된 가격만 있어서 편향되어 있을 수 있습니다." + "이번에도 아이스크림 판매 데이터셋을 예시로 쓰겠습니다. 다시 짚자면, 여기서 찾으려는 것은 가격이 판매량에 미치는 효과의 이질성입니다. 테스트 데이터의 가격은 무작위로 배정되었지만, 훈련 데이터에는 관측된 가격만 있어서 편향되어 있을 수 있습니다." ] }, { @@ -431,7 +431,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "$M_t$ 모델을 편향 제거 모델(debias model)이라고 부른 점에 주목하세요. 이중/편향 제거 머신러닝에서 이 모델이 맡은 역할이 처치의 편향을 제거하는 것이기 때문입니다. 잔차 $\\tilde{T} = T - M_t(X)$는 $X$에서 오는 교란편향을 모델이 모두 걷어 낸 처치라고 볼 수 있습니다. 즉, $\\tilde{T}$는 $X$와 직교합니다. 직관적으로 보면, 설명될 수 있는 부분은 이미 모두 설명되었으니 $\\tilde{T}$는 더 이상 $X$로 설명되지 않습니다.\n", + "$M_t$ 모델을 편향 제거 모델(debias model)이라고 부른 점에 주목하세요. 이중/편향 제거 머신러닝에서 이 모델이 맡은 역할이 처치의 편향을 제거하는 것이기 때문입니다. 잔차 $\\tilde{T} = T - M_t(X)$는 $X$에서 오는 교란편향을 모델이 모두 걷어 낸 처치라고 볼 수 있습니다. 즉, $\\tilde{T}$는 $X$와 직교합니다. 직관적으로 보면, 설명할 수 있는 부분은 이미 모두 설명했으니 $\\tilde{T}$는 더 이상 $X$로 설명되지 않습니다.\n", " \n", "이를 확인하기 위해 앞에서 본 그래프를 다시 그리되, 가격 대신 가격의 잔차를 넣어 보겠습니다. 앞에서는 주말 가격이 더 높았던 것을 기억하나요? 이제 그 편향은 사라졌습니다. 모든 요일에서 가격 잔차의 분포가 같습니다." ] @@ -632,7 +632,7 @@ "source": [ "### 이중 머신러닝으로 CATE 추정하기\n", " \n", - "지금까지 이중/편향 제거 머신러닝으로 평균 처치효과(ATE) 추정에 집중하는 방법을 봤습니다. 하지만 이 방법은 처치효과의 이질성, 즉 조건부 평균 처치효과(CATE)를 추정하는 데도 쓸 수 있습니다. 쉽게 말해, 이제는 인과 매개변수 $\\tau$가 분석단위의 공변량에 따라 달라진다고 보는 것입니다.\n", + "지금까지는 이중/편향 제거 머신러닝으로 평균 처치효과(ATE)를 추정하는 데 집중했습니다. 하지만 이 방법은 처치효과의 이질성, 즉 조건부 평균 처치효과(CATE)를 추정하는 데도 쓸 수 있습니다. 쉽게 말해, 이제는 인과 매개변수 $\\tau$가 분석단위의 공변량에 따라 달라진다고 보는 것입니다.\n", " \n", "$\n", "Y_i - {M}_y(X_i)\n", @@ -718,7 +718,7 @@ "source": [ "위 곡선에서 보듯이, 최종 모델을 선형으로 둔 이중/편향 제거 머신러닝 절차만으로도 이미 성능이 아주 좋습니다. 하지만 더 잘할 수도 있습니다. 사실 이 절차는 아주 일반적이어서 하나의 메타러너처럼 이해할 수 있습니다. Nie와 Wager는 Robinson(1988)의 업적을 기리고 잔차화의 역할을 강조하는 의미에서 이를 R 러너(R-Learner)라고 불렀습니다.\n", " \n", - "이 일반화는 이중/편향 제거 머신러닝 절차가 새로운 손실 함수를 정의하며, 그 손실 함수를 원하는 방식으로 최소화할 수 있다는 사실을 깨닫는 데서 나옵니다. 이어서 앞에서 목표 변환(target transformation) 방법, 즉 F 러너를 다룰 때와 아주 비슷한 방식으로 이를 수행하는 법을 보겠습니다.\n", + "이렇게 일반화할 수 있는 것은 이중/편향 제거 머신러닝 절차가 새로운 손실 함수를 정의한다는 사실 덕분입니다. 이 손실 함수는 원하는 방식으로 최소화할 수 있습니다. 이어서 앞에서 목표 변환(target transformation) 방법, 즉 F 러너를 다룰 때와 아주 비슷한 방식으로 이 손실을 최소화하는 법을 보겠습니다.\n", "\n", "\n", "## 비모수 이중/편향 제거 머신러닝\n", @@ -1005,7 +1005,7 @@ "source": [ "위 모델로 CATE 추정값을 얻을 수 있습니다. 문제는 CATE가 선형이 아니라는 점입니다. 처치가 커질수록 CATE는 작아져야 합니다. 여기서 답하려는 질문은 비모수 모델이 이 비선형성을 잡아낼 수 있느냐는 것입니다.\n", " \n", - "제대로 답하려면 이중/편향 제거 머신러닝이 데이터 생성 과정에 대해 어떤 가정을 깔고 있는지 떠올려야 합니다. 이 가정은 앞에서 세운 식에 드러나 있습니다.\n", + "제대로 답하려면 이중/편향 제거 머신러닝이 데이터 생성 과정에 어떤 가정을 깔고 있는지 떠올려야 합니다. 이 가정은 앞에서 세운 식에 드러나 있습니다.\n", " \n", "$\n", "\\tilde{Y}_i = \\tau(X_i) \\tilde{T}_i + e_i\n", @@ -1017,7 +1017,7 @@ " \n", "![img](./data/img/debiased-ml/linear-aprox.png)\n", " \n", - "그러니까 비모수 이중 머신러닝은 처치를 늘릴수록 처치효과가 작아진다는 사실은 알아냅니다. 하지만 비선형 처치효과 자체를 찾지는 못하고, 국소 선형 처치효과를 찾을 뿐입니다. 이 선형 근사들을 실제 비선형 인과효과와 함께 그려 볼 수도 있는데, 실제로 꽤 좋은 근사입니다." + "그러니까 비모수 이중 머신러닝은 처치를 늘릴수록 처치효과가 작아진다는 사실은 알아냅니다. 하지만 비선형 처치효과 자체를 찾지는 못하고, 국소 선형 처치효과를 찾을 뿐입니다. 이 선형 근사들을 실제 비선형 인과효과와 함께 그려 보면 꽤 좋은 근사라는 것을 알 수 있습니다." ] }, { @@ -1083,7 +1083,7 @@ " \n", "![img](./data/img/debiased-ml/cf-pred.png)\n", " \n", - "CATE는 데이터 지점에서 결과 함수의 기울기입니다. 처치를 아주 조금 늘렸을 때 결과가 얼마나 바뀔지를 나타냅니다. 좀 더 기술적으로 말하면 그 지점에서의 미분계수입니다. 반면 반사실 예측은 데이터 지점 하나로 결과 곡선 전체를 재구성하려는 시도입니다. 처치가 지금과 다른 수준이었다면 결과가 어땠을지 예측하는 것이니, 그래서 반사실 예측입니다.\n", + "CATE는 데이터 지점에서 결과 함수의 기울기입니다. 처치를 아주 조금 늘렸을 때 결과가 얼마나 바뀔지를 나타냅니다. 좀 더 기술적으로 말하면 그 지점에서의 미분계수입니다. 반면 반사실 예측은 데이터 지점 하나로 결과 곡선 전체를 재구성하려는 시도입니다. 처치가 지금과 다른 수준이었다면 결과가 어땠을지 예측하므로 반사실 예측이라고 부릅니다.\n", " \n", "이렇게 할 수 있다면 한 분석단위에 여러 처치를 시뮬레이션해 보고, 처치 수준마다 그 분석단위가 어떻게 반응할지 예측할 수 있습니다. 점 하나에서 곡선 전체를 외삽하는 것이니 아주 위험한 일입니다. 게다가 저는 이 기법을 실무에서 많이 써 왔지만, 이 기법이 어떻게, 왜 통하는지 보여 주는 과학 논문은 한 편도 찾지 못했습니다. 그래서 비과학적 이중 머신러닝이라고 부르는 것입니다. 한마디로, 조심하세요!\n", " \n", @@ -1836,7 +1836,7 @@ " \n", "무엇보다도, 머신러닝 기법을 인과추론에 아무 고민 없이 적용할 때 늘 생기는 문제, 즉 편향을 이 방법도 똑같이 안고 있습니다. 최종 모델이 정규화된 머신러닝 모델이므로, 그 정규화 때문에 인과 추정값이 0 쪽으로 편향될 수 있습니다.\n", " \n", - "두 번째 문제는 어떤 머신러닝 알고리즘을 고르느냐와 관련이 있습니다. 여기서는 부스팅 트리를 골랐습니다. 트리는 매끄러운 예측에 그리 능하지 않습니다. 그 결과 예측 곡선에 불연속 구간이 생길 수 있습니다. 위 그래프에서도 군데군데 계단처럼 꺾이는 모습이 보입니다. 또 트리는 외삽에도 그리 능하지 않아서, 이 모델은 한 번도 본 적 없는 가격에 대해 이상한 예측값을 내놓을 수 있습니다." + "두 번째 문제는 어떤 머신러닝 알고리즘을 고르느냐와 관련이 있습니다. 여기서는 부스팅 트리를 골랐습니다. 트리는 매끄러운 예측에 그리 능하지 않습니다. 그 결과 예측 곡선에 불연속 구간이 생길 수 있습니다. 위 그래프에서도 군데군데 계단처럼 꺾이는 모습이 보입니다. 또 트리는 외삽에도 그리 능하지 않아서, 이 모델은 한 번도 본 적 없는 가격에서는 이상한 예측값을 내놓을 수 있습니다." ] }, { diff --git a/causal-inference-for-the-brave-and-true/23-Challenges-with-Effect-Heterogeneity-and-Nonlinearity.ipynb b/causal-inference-for-the-brave-and-true/23-Challenges-with-Effect-Heterogeneity-and-Nonlinearity.ipynb index e449c32..2e3ee27 100644 --- a/causal-inference-for-the-brave-and-true/23-Challenges-with-Effect-Heterogeneity-and-Nonlinearity.ipynb +++ b/causal-inference-for-the-brave-and-true/23-Challenges-with-Effect-Heterogeneity-and-Nonlinearity.ipynb @@ -8,7 +8,7 @@ "\n", "개별 대상 수준에서 처치효과를 예측하기란 무척 어렵습니다. 참값(ground truth)이 없기 때문입니다. 잠재적 결과 $T(t)$ 중 하나만 관측할 수 있으니 처치효과를 직접 추정할 수는 없습니다. 그 대신 목표 변환(target transformation)에 기대야 하고(목표 변환은 영리하게 설계한 손실 함수로 볼 수도 있습니다), 그마저도 조건부 처치효과를 기댓값으로만 추정할 수 있습니다. 어려움은 이것만이 아닙니다. 처치효과는 워낙 종잡을 수 없어서 그 추정량에 잡음이 상당히 많이 끼곤 합니다. 개인화된 처치 배정처럼 처치효과에 따라 대상을 나누려는 응용 분야에서는 이 점이 실무적으로 아주 큰 문제가 됩니다.\n", "\n", - "이번 장에서는 조건부 평균 처치효과(CATE)를 직접 추정하려 하지 않고 대개 분산이 더 작은 다른 대리 목표에 집중할 때, 오히려 처치효과에 따른 세분화가 더 잘되는 경우가 있다는 것을 살펴봅니다. 관심 있는 결과변수 $Y$가 이진(binary)일 때 이런 일이 흔히 일어납니다.\n", + "이번 장에서는 이런 경우를 살펴봅니다. 조건부 평균 처치효과(CATE)를 직접 추정하지 않고 대개 분산이 더 작은 다른 대리 목표에 집중하면, 오히려 처치효과에 따라 대상을 더 잘 나눌 수 있는 경우입니다. 관심 있는 결과변수 $Y$가 이진(binary)일 때 이런 일이 흔히 일어납니다.\n", "\n", "## 이진 결과에서의 처치효과" ] @@ -92,11 +92,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "테크 기업에서 일하다 보면 정말 흔하게 마주치는 문제가 있습니다. 경영진이 일종의 넛지(nudge)를 써서 제품으로의 고객 전환(conversion)을 끌어올리고 싶어 하는 경우입니다. 예를 들어 인앱 구매에 쓸 수 있는 10헤알(BRL)짜리 바우처를 주어 앱 설치 수를 늘리려 할 수 있습니다. 차량 공유 앱을 처음 쓸 때 한 번 무료로 태워 줄 수도 있고, 투자 플랫폼에서 첫 3개월 동안 거래 수수료를 깎아 줄 수도 있습니다. 넛지에는 대개 돈이 많이 들기 때문에 경영진은 모든 고객에게 넛지를 주지 않아도 되기를 바랍니다. 전환을 끌어올리는 넛지를 거기에 가장 민감하게 반응하는 고객에게만 줄 수 있다면 더할 나위 없을 것입니다.\n", + "테크 기업에서 일하다 보면 정말 흔하게 마주치는 문제가 있습니다. 경영진이 일종의 넛지(nudge)를 써서 제품의 고객 전환(conversion)을 끌어올리고 싶어 하는 경우입니다. 예를 들어 인앱 구매에 쓸 수 있는 10헤알(BRL)짜리 바우처를 주어 앱 설치 수를 늘리려 할 수 있습니다. 차량 공유 앱을 처음 쓸 때 한 번 무료로 태워 줄 수도 있고, 투자 플랫폼에서 첫 3개월 동안 거래 수수료를 깎아 줄 수도 있습니다. 넛지에는 대개 돈이 많이 들기 때문에 경영진은 모든 고객에게 넛지를 주지 않아도 되기를 바랍니다. 전환을 끌어올리는 넛지를 거기에 가장 민감하게 반응하는 고객에게만 줄 수 있다면 더할 나위 없을 것입니다.\n", "\n", "지금쯤이면 짐작하겠지만, 인과추론의 관점에서 이런 비즈니스 문제는 처치효과 이질성(treatment effect heterogeneity, TEH)이라는 큰 범주에 속합니다. 구체적으로 말하면 비용이 드는 넛지가 처치 $T$, 전환이 이진 결과 $Y$, 처치 전에 측정한 고객별 특성이 $X$입니다. 그러면 이중/편향 제거 머신러닝(Double/Debiased ML) 같은 방법으로 조건부 평균 처치효과 $E[Y_1 - Y_0|X]$(처치가 연속형이라면 $E[Y'(T)|X]$)를 추정하고, 추정된 처치효과가 가장 높은 고객에게만 넛지를 주면 됩니다. 비즈니스 용어로 말하면 전환 전략을 개인화하는 것입니다. 넛지를 주었을 때 전환이 크게 늘어나는(증분이 큰) 고객 세그먼트를 찾아 그 고객에게만 넛지를 쓰는 셈입니다.\n", "\n", - "그런데 TEH 접근법을 그리 간단하지 않게 만드는 문제가 하나 있습니다. 결과가 이진이라는 사실이 일을 상당히 복잡하게 만듭니다. 다소 직관에 어긋나는 내용이라서, 무슨 일이 일어나는지 먼저 보여 드리고 왜 그런지는 나중에 설명하겠습니다.\n", + "그런데 TEH 접근법이 생각만큼 간단하지 않은 이유가 하나 있습니다. 결과가 이진이면 일이 상당히 복잡해집니다. 다소 직관에 어긋나는 내용이라서, 무슨 일이 일어나는지 먼저 보여 드리고 왜 그런지는 나중에 설명하겠습니다.\n", "\n", "## 데이터 시뮬레이션하기\n", "\n", @@ -104,7 +104,7 @@ "\n", "$ nudge \\sim \\mathcal{B}(0.5) $\n", "\n", - "다음으로 고객의 공변량인 `age`(나이)와 `income`(소득)을 감마 분포에서 시뮬레이션합니다. 이 두 변수는 고객에 대해 알고 있는 정보이므로 이를 바탕으로 개인화하려고 합니다. 다시 말해 나이와 소득으로 고객 그룹을 나누되, 그중 한 그룹이 `nudge` 처치에 크게 반응하도록 나누는 방법을 찾으려는 것입니다.\n", + "다음으로 고객의 공변량인 `age`(나이)와 `income`(소득)을 감마 분포에서 시뮬레이션합니다. 이 두 변수는 고객에 관해 알고 있는 정보이므로 이를 바탕으로 개인화하려고 합니다. 다시 말해 나이와 소득으로 고객 그룹을 나누되, 그중 한 그룹이 `nudge` 처치에 크게 반응하도록 나누는 방법을 찾으려는 것입니다.\n", "\n", "$ age \\sim G(10, 4) $\n", "\n", @@ -379,7 +379,7 @@ "source": [ "그런데 `estimated_income`에 따른 처치효과 이질성도 엄청나게 큽니다. `estimated_income`이 높은 고객은 처치효과가 훨씬 낮습니다. 그 때문에 누적 효과 곡선이 0에서 출발해 ATE를 훌쩍 넘어섰다가 그제야 ATE로 수렴합니다. 이는 개인화 관점에서 `estimated_income`으로 나눈 세그먼트가 `age`로 나눈 세그먼트보다 처치효과 이질성(TEH)이 더 크다는 뜻입니다.\n", "\n", - "곤란하지 않나요? 효과 이질성을 만든다고 알고 있는 특성인 `age`가, 처치효과를 바꾸지 않는다고 알고 있는 특성(`estimated_income`)보다 개인화에는 오히려 더 못하다니 어떻게 된 일일까요? 답은 **결과 함수의 비선형성**에 있습니다. `estimated_income`은 넛지가 잠재 결과에 미치는 효과를 바꾸지 않지만, 잠재 결과를 전환으로 변환하고 나면 (적어도 간접적으로는) 효과를 바꿉니다. 전환은 선형이 아닙니다. 즉, **곡선 위 어디에 있느냐에 따라 도함수가 달라집니다**. 전환은 최대 1까지만 올라갈 수 있으므로, 이미 아주 높다면 더 끌어올리기 어렵습니다. 즉, 전환이 높은 곳에서는 도함수가 매우 작습니다. 반대쪽 끝도 마찬가지입니다. 전환은 아래로도 0에서 막혀 있으므로, 이미 아주 낮을 때도 도함수가 작습니다. 전환은 양 끝에서 도함수가 작은 S자 모양을 따릅니다. `estimated_income` 구간(폭 100)별 평균 전환을 그려 보면 이 모양을 확인할 수 있습니다." + "곤란하지 않나요? 효과 이질성을 만든다고 알고 있는 특성인 `age`가, 처치효과를 바꾸지 않는다고 알고 있는 특성(`estimated_income`)보다 개인화에는 오히려 더 못하다니 어떻게 된 일일까요? 답은 **결과 함수의 비선형성**에 있습니다. `estimated_income`은 넛지가 잠재 결과에 미치는 효과를 바꾸지 않지만, 잠재 결과를 전환으로 변환하고 나면 (적어도 간접적으로는) 효과를 바꿉니다. 전환은 선형이 아닙니다. 즉, **곡선 위 어디에 있느냐에 따라 도함수가 달라집니다**. 전환은 최대 1까지만 올라갈 수 있으므로, 이미 아주 높다면 더 끌어올리기 어렵습니다. 다시 말해 전환이 높은 곳에서는 도함수가 매우 작습니다. 반대쪽 끝도 마찬가지입니다. 전환은 아래로도 0에서 막혀 있으므로, 이미 아주 낮을 때도 도함수가 작습니다. 전환은 양 끝에서 도함수가 작은 S자 모양을 따릅니다. `estimated_income` 구간(폭 100)별 평균 전환을 그려 보면 이 모양을 확인할 수 있습니다." ] }, { @@ -467,7 +467,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "전환의 비선형성에 대해 알고 있는 내용을 바탕으로 무슨 일이 일어날지 미리 예측할 수 있습니다. 전환율이 낮은 상황에서는 기준 전환율이 높은 고객(`estimated_income`이 높은 고객)을 겨냥하는 편이 훨씬 효과적일 것입니다. S자 전환 곡선의 왼쪽에 있기 때문입니다. 이 구간에서는 기준 전환율이 낮을수록 도함수가 작습니다. 즉, 이 구간에서는 **기준 전환율이 높으면 처치효과도 큽니다**. 따라서 기준 전환율이 높은 고객, 곧 `estimated_income`이 높은 고객에게 넛지를 주어야 합니다." + "전환이 비선형이라는 사실을 바탕으로 무슨 일이 일어날지 미리 예측할 수 있습니다. 전환율이 낮은 상황에서는 기준 전환율이 높은 고객(`estimated_income`이 높은 고객)을 겨냥하는 편이 훨씬 효과적일 것입니다. S자 전환 곡선의 왼쪽에 있기 때문입니다. 이 구간에서는 기준 전환율이 낮을수록 도함수가 작습니다. 즉, 이 구간에서는 **기준 전환율이 높으면 처치효과도 큽니다**. 따라서 기준 전환율이 높은 고객, 곧 `estimated_income`이 높은 고객에게 넛지를 주어야 합니다." ] }, { @@ -656,7 +656,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "결과가 이진이었던 경우와 마찬가지로 이 예에서도 **처치효과가 결과와 상관관계를 가집니다**. 판매량이 많을수록(가격이 낮을수록) 처치효과의 절댓값이 작고, 판매량이 적을수록(가격이 높을수록) 처치효과의 절댓값이 큽니다. 하지만 이번에는 **효과가 결과뿐 아니라 처치 수준과도 상관관계를 가지기** 때문에 상황이 더 복잡합니다. 그래서 반사실적 질문에 답하기가 더 까다롭습니다. 예를 들어 실제 실험 데이터가 다음 그래프와 같다고 잠시 상상해 봅시다. 세그먼트 `A`(부유한 집단)에는 높은 가격을 시험하고 `B` 집단에는 낮은 가격만 시험한 경우입니다. 기업은 자신들이 더 합리적이라고 생각하는 처치 수준 주변에서 실험하고 싶어 하는 경우가 많으므로 이런 상황은 아주 흔합니다.\n", + "결과가 이진이었던 경우와 마찬가지로 이 예에서도 **처치효과와 결과 사이에 상관관계가 있습니다**. 판매량이 많을수록(가격이 낮을수록) 처치효과의 절댓값이 작고, 판매량이 적을수록(가격이 높을수록) 처치효과의 절댓값이 큽니다. 하지만 이번에는 **효과가 결과뿐 아니라 처치 수준과도 상관관계가 있기** 때문에 상황이 더 복잡합니다. 그래서 반사실적 질문에 답하기가 더 까다롭습니다. 예를 들어 실제 실험 데이터가 다음 그래프와 같다고 잠시 상상해 봅시다. 세그먼트 `A`(부유한 집단)에는 높은 가격을 시험하고 `B` 집단에는 낮은 가격만 시험한 경우입니다. 기업은 자신들이 더 합리적이라고 생각하는 처치 수준 주변에서 실험하고 싶어 하는 경우가 많으므로 이런 상황은 아주 흔합니다.\n", "\n", "> 옮긴이: 원문은 '판매량이 적을수록(가격이 높을수록) 처치효과의 절댓값이 작다'로 되어 있지만, 그래프와 앞뒤 맥락상 '절댓값이 크다'의 오기로 보여 바로잡았습니다. 낮은 가격만 시험한 집단도 원문에는 `A`로 되어 있으나 그래프와 다음 셀의 설명상 `B`를 가리키므로 바로잡았습니다." ] @@ -699,7 +699,7 @@ "source": [ "이제 처치효과 결과를 별생각 없이 합쳐 보면, 세그먼트 `A`가 세그먼트 `B`보다 가격 인상에 훨씬 더 탄력적인(처치효과의 절댓값이 더 큰) 것처럼 보일 것입니다. 하지만 이는 세그먼트 `B`에서는 처치효과가 작은 구간만 살펴보았기 때문일 뿐입니다.\n", "\n", - "그렇다면 처치와 결과 양쪽에서 어디에 있느냐에 따라 처치효과가 달라질 때는 어떻게 해야 할까요? 솔직히 말하면 아직 활발히 연구 중인 분야입니다. 실무에서 할 수 있는 최선은 어떤 유형의 고객이 처치에 더 민감한지 답하려 할 때 **아주 조심하는** 것입니다. 비교하는 고객 유형들이 모두 같은 처치 분포를 받았는지 확인하세요. 그렇지 않다면 처치효과를 외삽하는 데 아주 회의적이어야 합니다. 예를 들어 위의 예에서 `B` 고객은 가격 인상에 덜 민감해 보이지만, 이 세그먼트에 10헤알을 넘는 더 높은 가격을 매겨도 여전히 그럴지는 알 수 없습니다.\n", + "그렇다면 처치와 결과 양쪽에서 어디에 있느냐에 따라 처치효과가 달라질 때는 어떻게 해야 할까요? 솔직히 말하면 아직 활발히 연구 중인 분야입니다. 실무에서 할 수 있는 최선은 어떤 유형의 고객이 처치에 더 민감한지 답하려 할 때 **아주 조심하는** 것입니다. 비교하는 고객 유형들이 모두 같은 처치 분포를 받았는지 확인하세요. 그렇지 않다면 외삽한 처치효과는 크게 의심해야 합니다. 예를 들어 위의 예에서 `B` 고객은 가격 인상에 덜 민감해 보이지만, 이 세그먼트에 10헤알을 넘는 더 높은 가격을 매겨도 여전히 그럴지는 알 수 없습니다.\n", "\n", "반응 곡선을 선형화해 볼 수도 있습니다. 처치나 결과(또는 둘 다)를 변환해 둘의 관계가 직선처럼 보이게 만들어 곡률을 없애자는 아이디어입니다. 직선은 도함수가 일정하므로, 곡선 위 어디에 있느냐에 따라 처치효과가 달라지는 문제가 사라집니다. 예를 들어 가격 변수를 음수로 바꾸고 4제곱한 뒤 다시 부호를 뒤집으면 어느 정도 선형에 가까운 관계를 얻을 수 있습니다. 이렇게 변환한 데이터에서는 `A`가 `B`보다 가격 인상에 덜 민감하다는 말이 훨씬 설득력을 얻습니다. 이제 곡선 위 어디에 있느냐에 좌우되지 않기 때문입니다." ] @@ -741,7 +741,7 @@ "source": [ "## 핵심 요약\n", "\n", - "답을 드리기보다 질문을 더 많이 던진 것 같습니다. 아쉽지만 어떤 문제는 그 문제를 잘 알고 있는 것이 할 수 있는 최선일 때도 있습니다. 이 장에서 관심 있는 결과가 비선형일 때 생기는 복잡한 문제들에 눈뜰 수 있었기를 바랍니다.\n", + "답을 드리기보다 질문을 더 많이 던진 것 같습니다. 아쉽지만 어떤 문제는 그런 문제가 있다는 사실을 똑똑히 알아 두는 것이 할 수 있는 최선일 때도 있습니다. 이 장에서 관심 있는 결과가 비선형일 때 생기는 복잡한 문제들에 눈뜰 수 있었기를 바랍니다.\n", "\n", "이진 결과에서는 흔하고 연구도 더 많이 된 문제입니다. 이 경우 평균 결과가 0.5에 가까울수록 처치효과가 커지는 경향이 있습니다. 결과가 0과 1 사이로 제한되므로 0이나 1에 너무 가까우면 효과가 아주 작아지는 경향이 있습니다.\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/24-The-Diff-in-Diff-Saga.ipynb b/causal-inference-for-the-brave-and-true/24-The-Diff-in-Diff-Saga.ipynb index 66d6de8..bdf41b9 100644 --- a/causal-inference-for-the-brave-and-true/24-The-Diff-in-Diff-Saga.ipynb +++ b/causal-inference-for-the-brave-and-true/24-The-Diff-in-Diff-Saga.ipynb @@ -56,7 +56,7 @@ "\n", "앞서 말했듯이 패널데이터는 여러 대상 `i`를 여러 기간 `t`에 걸쳐 관측한 데이터입니다. 미국에서 대마초 합법화가 범죄율에 미치는 영향을 평가하는 정책 평가 상황을 생각해 봅시다. 여러 주 `i`의 범죄율 데이터가 여러 기간 `t`에 걸쳐 있습니다. 또 각 주가 언제 대마초 합법화 쪽으로 법을 바꿨는지도 알고 있습니다. 이것이 인과추론에 얼마나 강력한지 감이 오실 겁니다. 대마초 합법화를 처치 `D`라고 부르겠습니다(`T`는 이미 시간을 나타내는 데 쓰고 있으니까요). 결국 처치를 받게 되는 어떤 주의 범죄율 추세를 따라가다가 처치 시점에 추세가 꺾이는지 볼 수 있습니다. 어떤 의미에서는 처치 전후 비교에서 그 주가 자기 자신의 대조군 역할을 하는 셈입니다. 게다가 주가 여러 개이므로 처치받은 주와 대조군 주를 비교할 수도 있습니다. 실험군 대 대조군, 처치 전 대 처치 후라는 두 비교를 합치면 반사실(counterfactual), 나아가 인과효과를 추론하는 매우 강력한 도구가 됩니다.\n", "\n", - "패널데이터 방법은 정부 정책 평가에 자주 쓰이지만, IT 업계에서도 아주 유용하다는 점은 쉽게 보일 수 있습니다. 기업은 사용자 데이터를 여러 기간에 걸쳐 추적하는 경우가 많아서 풍부한 패널데이터를 갖게 됩니다. 그뿐 아니라 실험이 불가능할 때가 있어서 다른 식별 전략에 기대야 하는 경우도 있습니다. 이 생각을 더 구체적으로 살펴보기 위해, 여러 도시에서 자사 앱을 설치한 사람 수를 추적하는 신생 IT 기업의 가상 사례를 생각해 봅시다. 이 회사는 2021년 어느 시점에 앱에 새 기능을 출시했습니다. 이제 회사는 그 기능 덕분에 신규 사용자가 얼마나 늘었는지 알고 싶어 합니다. 출시는 점진적으로 이루어졌습니다. 일부 도시는 `2021-06-01`에, 다른 도시는 `2021-07-15`에 기능을 받았습니다. 나머지 도시에 대한 전체 출시는 2022년에야 이루어집니다. 데이터가 `2021-07-31`까지만 있으므로 이 마지막 그룹을 대조군으로 볼 수 있습니다. 인과추론의 용어로 말하면 이 기능의 출시는 처치, 설치 수는 결과입니다. 알고 싶은 것은 결과에 대한 처치효과, 즉 새 기능이 설치 수에 미치는 효과입니다.\n", + "패널데이터 방법은 정부 정책 평가에 자주 쓰이지만, IT 업계에서도 아주 유용하다는 점은 쉽게 알 수 있습니다. 기업은 사용자 데이터를 여러 기간에 걸쳐 추적하는 경우가 많아서 풍부한 패널데이터를 갖게 됩니다. 그뿐 아니라 실험이 불가능해서 다른 식별 전략에 기대야 할 때도 있습니다. 이 생각을 더 구체적으로 살펴보기 위해, 여러 도시에서 자사 앱을 설치한 사람 수를 추적하는 신생 IT 기업의 가상 사례를 생각해 봅시다. 이 회사는 2021년 어느 시점에 앱에 새 기능을 출시했습니다. 이제 회사는 그 기능 덕분에 신규 사용자가 얼마나 늘었는지 알고 싶어 합니다. 출시는 점진적으로 이루어졌습니다. 일부 도시는 `2021-06-01`에, 다른 도시는 `2021-07-15`에 기능을 받았습니다. 나머지 도시에는 2022년에야 전면 출시됩니다. 데이터가 `2021-07-31`까지만 있으므로 이 마지막 그룹을 대조군으로 볼 수 있습니다. 인과추론의 용어로 말하면 이 기능의 출시는 처치, 설치 수는 결과입니다. 알고 싶은 것은 결과에 대한 처치효과, 즉 새 기능이 설치 수에 미치는 효과입니다.\n", "\n", "이 회사가 왜 실험을 할 수 없는지 짚어 볼 필요가 있습니다. 누가 새 기능의 존재를 알게 될지 통제할 수 없기 때문입니다. 이럴 때 처치 배정을 제한적으로만 통제할 수 있다고 말합니다. 분석단위가 **아직 고객이 아닌 사람들**이기 때문입니다. 회사는 그중 몇 명을 앱 설치로 이끌어 고객으로 전환할 수 있는지 알고 싶어 합니다. 당연히 이 사람들을 대상으로는 아무것도 무작위로 배정할 수 없습니다. 그래서 분석단위를 도시로 바꿨습니다. 어떤 도시에는 출시하고 다른 도시에는 출시하지 않는 것은 회사가 통제할 수 있지만, 사람마다 출시 여부를 정하는 것은 그렇지 않습니다.\n", "\n", @@ -146,7 +146,7 @@ "\n", "시간 이야기가 나왔으니, 전체적으로 우상향 추세가 있고 그 위에 약간의 출렁임(주간 계절성처럼 보입니다)이 있다는 점도 보세요. 대조군 코호트만 보면 일 설치 수가 5월 약 10건에서 6월 약 11건으로 1건 정도 늘었습니다. 기술적으로 말하면 뒤쪽 기간의 $Y_{0}$가 앞쪽 기간보다 높습니다. 따라서 같은 도시를 시간에 걸쳐 단순 비교해도 편향된 결과가 나옵니다. 이번에도 다행히 패널데이터 구조 덕분에 시간 간 비교뿐 아니라 도시 간 비교도 할 수 있어서 추세를 보정할 수 있습니다.\n", "\n", - "새 기능 출시가 설치 수에 미친 효과를 추론하려면, 이상적으로는 기능을 받은 코호트가 기능을 받지 않았다면 어떻게 됐을지 알아야 합니다. 실험군 코호트의 처치 후 기간에 대한 반사실적 결과 $Y(0)$를 추정하고 싶은 것입니다. 각 코호트를 처치받은 시점 `g`로 나타내면(코호트는 같은 시점에 처치받은 도시들의 묶음일 뿐이라는 점을 기억하세요), 이 반사실을 $E[Y_0|t\\geq g]$로 쓸 수 있습니다. 그러면 코호트 `g`의 실험군에 대한 평균 처치효과(ATT)를 다음과 같이 정의할 수 있습니다.\n", + "새 기능 출시가 설치 수에 미친 효과를 추론하려면, 이상적으로는 기능을 받은 코호트가 기능을 받지 않았다면 어떻게 됐을지 알아야 합니다. 실험군 코호트의 처치 후 기간의 반사실적 결과 $Y(0)$를 추정하고 싶은 것입니다. 각 코호트를 처치받은 시점 `g`로 나타내면(코호트는 같은 시점에 처치받은 도시들의 묶음일 뿐이라는 점을 기억하세요), 이 반사실을 $E[Y_0|t\\geq g]$로 쓸 수 있습니다. 그러면 코호트 `g`의 실험군에 대한 평균 처치효과(ATT)를 다음과 같이 정의할 수 있습니다.\n", "\n", "$$\n", "E[Y_1|t \\geq g] - E[Y_0|t\\geq g]\n", @@ -380,7 +380,7 @@ "source": [ "## 2) 죽음: 효과 이질성 앞에서 무너지다\n", "\n", - "방금 본 것처럼 DID와 TWFE에는 장점이 있습니다. 시간별 변동과 대상별 변동을 모두 반영하면서 반사실을 꽤 잘 추정합니다. 그래서 강력한 인과추론 기법입니다. 하지만 이게 전부였다면 이 장은 필요 없었을 것입니다. 이 책의 1부에서 충분히 다뤘으니까요. 최근에 일어난 일은 많은 학자가 2×2 DID를 TWFE로 여러 기간에 확장하는 일이 처음 생각만큼 간단하지 않다는 것을 알아챘다는 것입니다. 실제로 **흔히 쓰는 형태의 TWFE는 현실의 많은 응용에서 편향된 것으로 드러났습니다**. 이 일로 이 기법에 기댄 경제학 연구 여러 편이 줄줄이 재검토되었습니다. 이 모든 것을 이해하려면 밑에 깔린 가정부터 짚는 것이 가장 좋습니다.\n", + "방금 본 것처럼 DID와 TWFE에는 장점이 있습니다. 시간별 변동과 대상별 변동을 모두 반영하면서 반사실을 꽤 잘 추정합니다. 그래서 강력한 인과추론 기법입니다. 하지만 이게 전부였다면 이 장은 필요 없었을 것입니다. 이 책의 1부에서 충분히 다뤘으니까요. 그런데 최근 많은 학자가 2×2 DID를 TWFE로 여러 기간에 확장하는 일이 처음 생각만큼 간단하지 않다는 것을 알아챘습니다. 실제로 **흔히 쓰는 형태의 TWFE는 현실의 많은 응용에서 편향된 것으로 드러났습니다**. 이 일로 이 기법에 기댄 경제학 연구 여러 편이 줄줄이 재검토되었습니다. 이 모든 것을 이해하려면 밑에 깔린 가정부터 짚는 것이 가장 좋습니다.\n", "\n", "![img](data/img/did-saga/death.png)\n", "\n", @@ -669,7 +669,7 @@ "id": "bff9cde7", "metadata": {}, "source": [ - "말한 대로 반사실의 추세가 마땅히 그래야 할 것보다 훨씬 가파릅니다. 조기 처치 코호트의 초반 급상승을 포착해서 그 추세를 후기 처치 코호트에 투영하고 있습니다.\n", + "말한 대로 반사실의 추세가 있어야 할 기울기보다 훨씬 가파릅니다. 조기 처치 코호트의 초반 급상승을 포착해서 그 추세를 후기 처치 코호트에 투영하고 있습니다.\n", "\n", "좀 더 기술적으로 말하면, 강외생성(평행 추세, 비기대 등)이 성립하더라도 코호트 크기가 같다면 TWFE 추정량은 다음 값으로 수렴한다는 것을 보일 수 있습니다(Goodman-Bacon, 2019).\n", "\n", @@ -679,7 +679,7 @@ "\n", "첫 번째 항은 앞에서 본 것과 같은 여러 DID 비교의 분산 가중 ATT(variance weighted ATT)입니다. 이것이 바로 원하는 값입니다. 그런데 $\\Delta ATT$라는 항이 하나 더 붙어 있습니다. 이 항은 ATT가 시간에 따라 얼마나 변하는지를 나타내며, 추정값을 편향시키는 주범입니다. 이 항을 보면 효과의 크기가 시간이 지나며 커지면(이 예처럼) 하향 편향이, 시간이 지나며 작아지면 상향 편향이 생긴다는 것을 알 수 있습니다.\n", "\n", - "위 예에서는 TWFE로 구한 효과가 실제 ATT보다 작았습니다. 하지만 상황은 훨씬 더 극단적일 수도 있습니다. 이 편향이 실제 ATT의 부호를 뒤집을 만큼 강할 수 있다는 것을 보여 주는 마지막 예를 살펴볼 가치가 있다고 생각합니다. 코호트가 두 개뿐인 아주 단순한 과정을 생각해 봅시다. 여기서는 처치효과가 음수이고 매일 0.1씩 줄어듭니다. 무슨 일이 일어나는지 제대로 보이도록 시간 고정효과와 추세도 모두 없앴습니다." + "위 예에서는 TWFE로 구한 효과가 실제 ATT보다 작았습니다. 하지만 상황은 훨씬 더 극단적일 수도 있습니다. 마지막으로 예를 하나 더 보겠습니다. 이 편향이 실제 ATT의 부호를 뒤집을 만큼 강할 수 있다는 것을 보여 주는 예입니다. 코호트가 두 개뿐인 아주 단순한 과정을 생각해 봅시다. 여기서는 처치효과가 음수이고 매일 0.1씩 줄어듭니다. 무슨 일이 일어나는지 제대로 보이도록 시간 고정효과와 추세도 모두 없앴습니다." ] }, { @@ -1100,7 +1100,7 @@ "source": [ "![img](data/img/did-saga/awful.jpeg)\n", "\n", - "그래도 이 반사실은 조금 나아졌습니다. 실제로 관측된 결과 $Y_1$보다 위에 있으니까요. 그 덕분에 적어도 마땅히 그래야 하듯 음의 효과는 추정하게 됩니다. 이를 확인하기 위해 각 더미에 해당하는 매개변수를 뽑은 다음, 상대 일수 -1(기준점)에 해당하는 매개변수를 빼서 추정된 효과를 그려 보겠습니다." + "그래도 이 반사실은 조금 나아졌습니다. 실제로 관측된 결과 $Y_1$보다 위에 있으니까요. 그 덕분에 적어도 효과를 제대로 음수로 추정하기는 합니다. 이를 확인하기 위해 각 더미에 해당하는 매개변수를 뽑은 다음, 상대 일수 -1(기준점)에 해당하는 매개변수를 빼서 추정된 효과를 그려 보겠습니다." ] }, { diff --git a/causal-inference-for-the-brave-and-true/25-Synthetic-Diff-in-Diff.ipynb b/causal-inference-for-the-brave-and-true/25-Synthetic-Diff-in-Diff.ipynb index 9fe9b7f..41c294d 100644 --- a/causal-inference-for-the-brave-and-true/25-Synthetic-Diff-in-Diff.ipynb +++ b/causal-inference-for-the-brave-and-true/25-Synthetic-Diff-in-Diff.ipynb @@ -459,7 +459,7 @@ "Y_{it} = \\beta_0 + \\beta_1 Post_t + \\beta_2 Treated_i + \\beta_3 Treated_i Post_t + e_{it}\n", "$$\n", "\n", - "여기서 `post`는 처치 이후 기간임을 나타내는 시간 더미이고, `treated`는 실험군에 속한 대상임을 표시하는 대상 더미입니다. 캘리포니아 예제에서 이 모델을 추정하면 $ATT$ 추정값으로 -27.34가 나오는데, 발의안 99호의 효과가 강한 음수라는 뜻입니다. 발의안 99호 때문에 1인당 담배 소비량이 27갑 줄었다는 의미입니다." + "여기서 `post`는 처치 이후 기간임을 나타내는 시간 더미이고, `treated`는 실험군에 속한 대상임을 표시하는 대상 더미입니다. 캘리포니아 예제에서 이 모델을 추정하면 $ATT$ 추정값으로 -27.34가 나옵니다. 발의안 99호의 효과가 강한 음수, 즉 발의안 99호 때문에 1인당 담배 소비량이 27갑 줄었다는 뜻입니다." ] }, { @@ -882,7 +882,7 @@ "\\hat{\\tau}^{sdid} = \\underset{\\mu, \\alpha, \\beta, \\tau}{argmin} \\bigg\\{ \\sum_{i=1}^N \\sum_{t=1}^T \\big(Y_{it} - (\\mu + \\alpha_i + \\beta_t + \\tau D_{it})^2 \\hat{w}^{sdid}_i \\hat{\\lambda}^{sdid}_t \\big) \\bigg\\}\n", "$$\n", "\n", - "보다시피 대상 고정효과 $\\alpha_i$를 다시 넣었고, 대상 가중치 $\\hat{w}_i$도 그대로 두었습니다. 그런데 새로운 것이 하나 있습니다. 바로 시간 가중치(time weights) $\\hat{\\lambda}_t$입니다. 걱정하지 마세요. 대단한 것은 아닙니다. 대상 가중치 $w_i$가 대조군과 실험군 평균 사이의 차이를 최소화했던 것을 떠올려 보세요. 다시 말해 대상 가중치는 실험군과 대조군의 처치 전 추세를 맞추는 데 쓰였습니다. 시간 가중치는 같은 일을 기간에 대해 합니다. 즉, 대조군에서 처치 전 기간과 처치 후 기간 사이의 차이를 최소화합니다.\n", + "보다시피 대상 고정효과 $\\alpha_i$를 다시 넣었고, 대상 가중치 $\\hat{w}_i$도 그대로 두었습니다. 그런데 새로운 것이 하나 있습니다. 바로 시간 가중치(time weights) $\\hat{\\lambda}_t$입니다. 걱정하지 마세요. 대단한 것은 아닙니다. 대상 가중치 $w_i$가 대조군과 실험군 평균 사이의 차이를 최소화했던 것을 떠올려 보세요. 다시 말해 대상 가중치는 실험군과 대조군의 처치 전 추세를 맞추는 데 쓰였습니다. 시간 가중치는 같은 일을 기간 쪽에서 합니다. 즉, 대조군에서 처치 전 기간과 처치 후 기간 사이의 차이를 최소화합니다.\n", "\n", "$$\n", "\\hat{\\lambda}^{sdid} = \\underset{\\lambda}{\\mathrm{argmin}} \\ ||\\bar{\\pmb{y}}_{post, co} - (\\pmb{\\lambda}_{pre} \\pmb{Y}_{pre, co} + \\lambda_0)||^2_2 \\\\\n", @@ -1065,7 +1065,7 @@ "$$\n", "\n", "\n", - "$\\zeta^2$라는 항도 있는데, 이론적인 근거가 있지만 설명하기가 너무 복잡해서 아쉽지만 약간의 수수께끼로 남겨 두겠습니다. 참고 자료에 있는 원 논문에 설명이 나와 있으니 확인해 보세요. 이 항은 다음과 같이 정의합니다.\n", + "$\\zeta^2$라는 항도 있습니다. 이론적인 근거가 있는 항이지만 설명하기가 너무 복잡해서, 아쉽게도 약간의 수수께끼로 남겨 두겠습니다. 참고 자료에 있는 원 논문에 설명이 나와 있으니 확인해 보세요. 이 항은 다음과 같이 정의합니다.\n", "\n", "$$\n", "\\zeta = (N_{tr}* T_{post})^{1/4}\\sigma(\\Delta_{it})\n", @@ -1162,9 +1162,9 @@ "id": "8e8750fa", "metadata": {}, "source": [ - "먼저 앞에서 정의한 함수로 $\\zeta$를 계산하고 처치 후 기간을 걸러 냅니다. 그다음 처치 전 데이터를 피벗해 결과 행렬 $\\bar{\\pmb{y}}_{pre, tr}$을 만듭니다. 이어서 $\\bar{\\pmb{y}}_{pre, tr}$ 행렬의 맨 앞에 1로 채운 열을 추가합니다. 이 열로 절편을 추정할 수 있습니다. 이렇게 준비를 마치면 가중치에 대한 $L_2$ 페널티를 포함한 최적화 목적함수를 정의합니다. 마지막으로 절편은 버리고 추정한 가중치를 시리즈에 저장합니다.\n", + "먼저 앞에서 정의한 함수로 $\\zeta$를 계산하고 처치 후 기간을 걸러 냅니다. 그다음 처치 전 데이터를 피벗해 결과 행렬 $\\bar{\\pmb{y}}_{pre, tr}$을 만듭니다. 이어서 $\\bar{\\pmb{y}}_{pre, tr}$ 행렬의 맨 앞에 1로 채운 열을 추가합니다. 이 열로 절편을 추정할 수 있습니다. 이렇게 준비를 마치면 가중치에 거는 $L_2$ 페널티를 포함한 최적화 목적함수를 정의합니다. 마지막으로 절편은 버리고 추정한 가중치를 시리즈에 저장합니다.\n", "\n", - "이 코드로 발의안 99호 문제의 대상 가중치를 추정하면 처음 5개 주에 대해 다음과 같은 결과가 나옵니다.\n", + "이 코드로 발의안 99호 문제의 대상 가중치를 추정하면 처음 5개 주의 결과가 다음과 같이 나옵니다.\n", "\n", "> 옮긴이: 코드에서 피벗해 만들고 맨 앞에 1로 채운 열을 붙이는 행렬은 대조군의 처치 전 결과 행렬(`y_pre_control`)이고, 실험군의 처치 전 평균 결과(`y_pre_treat_mean`)는 따로 그룹화해서 구합니다. 본문의 기호는 원문 표기를 그대로 옮겼습니다." ] @@ -1528,7 +1528,7 @@ "id": "0d7dc7f5", "metadata": {}, "source": [ - "이제 남은 일은 방금 정의한 가중치로 이중차분법 모델을 추정하는 것뿐입니다. 처치 후 기간 더미와 실험군 더미의 상호작용 항에 대한 매개변수 추정값이 $ATT$에 대한 합성 이중차분법 추정값입니다." + "이제 남은 일은 방금 정의한 가중치로 이중차분법 모델을 추정하는 것뿐입니다. 처치 후 기간 더미와 실험군 더미의 상호작용 항의 매개변수 추정값이 $ATT$의 합성 이중차분법 추정값입니다." ] }, { @@ -1585,7 +1585,7 @@ "id": "8bd680e1", "metadata": {}, "source": [ - "이 추정값은 이중차분법으로 얻은 값보다 훨씬 작지만 놀랄 일은 아닙니다. 앞서 이야기했듯이 이 예제에서는 평행 추세 가정을 의심할 만한 이유가 충분하므로 이중차분법 추정량은 아마 편향되어 있을 것입니다. 덜 분명한 것은 SDID 추정값이 왜 기존 통제집단합성법 추정값보다도 작은가 하는 점입니다. 앞의 통제집단합성법 그래프를 다시 보면, 캘리포니아의 담배 판매량이 발의안 99호 이전부터 가상의 대조군보다 낮아지기 시작했습니다. 기존 통제집단합성법은 처치 전 기간 전체에 걸쳐 실험군과 대조군을 맞춰야 하므로 이 연도 저 연도에서 조금씩 빗나가기 때문일 것입니다. SDID에서는 시간 가중치 덕분에 개입 후 기간과 더 비슷한 기간에만 집중할 수 있으므로 이 문제가 덜합니다. 이 예제에서는 그 기간이 바로 발의안 99호 직전 3년이었습니다.\n", + "이 추정값은 이중차분법으로 얻은 값보다 훨씬 작지만 놀랄 일은 아닙니다. 앞서 이야기했듯이 이 예제에서는 평행 추세 가정을 의심할 만한 이유가 충분하므로 이중차분법 추정량은 아마 편향되어 있을 것입니다. 덜 분명한 것은 SDID 추정값이 왜 기존 통제집단합성법 추정값보다도 작은가 하는 점입니다. 앞의 통제집단합성법 그래프를 다시 보면, 캘리포니아의 담배 판매량이 발의안 99호 이전부터 가상의 대조군보다 낮아지기 시작했습니다. 이는 기존 통제집단합성법이 처치 전 기간 전체에 걸쳐 실험군과 대조군을 맞춰야 해서 이 연도 저 연도에서 조금씩 빗나가기 때문일 것입니다. SDID에서는 시간 가중치 덕분에 개입 후 기간과 더 비슷한 기간에만 집중할 수 있으므로 이 문제가 덜합니다. 이 예제에서는 그 기간이 바로 발의안 99호 직전 3년이었습니다.\n", "\n", "SDID가 하는 일을 이해하기 위해 실험군(캘리포니아)과 SDID 가상의 대조군의 이중차분 선을 그려 보겠습니다. 가상의 대조군에서 보이는 추세를 실험군에 투영해서 반사실(counterfactual) $Y(0)_{tr, post}$를 얻는다는 점에 주목하세요. 보라색 점선과 아래쪽 보라색 실선 사이의 차이가 $ATT$입니다. 시간 가중치가 1986, 87, 88년을 제외한 모든 기간을 0으로 만든다는 점을 보여 주려고 선을 1987년에서 시작했습니다. 시간 가중치는 아래쪽의 작은 그래프에도 나타냈습니다." ] @@ -1658,7 +1658,7 @@ "id": "6140f080", "metadata": {}, "source": [ - "위의 추정량은 처치 후 모든 기간에 걸쳐 평균한, 캘리포니아에 대한 발의안 99호의 효과인 $ATT$를 추정합니다. 그런데 위 그래프를 보면 효과가 시간이 지날수록 커지는 것 같습니다. 이 점을 반영하고 싶다면 어떻게 해야 할까요? 다행히 아주 간단합니다.\n", + "위의 추정량이 추정하는 $ATT$는 캘리포니아에 미친 발의안 99호의 효과를 처치 후 모든 기간에 걸쳐 평균한 값입니다. 그런데 위 그래프를 보면 효과가 시간이 지날수록 커지는 것 같습니다. 이 점을 반영하고 싶다면 어떻게 해야 할까요? 다행히 아주 간단합니다.\n", "\n", "넘어가기 전에 위의 추정량과 관련해 주의할 점을 하나 말씀드리겠습니다. 방금 실행한 회귀분석이 보고하는 표준오차나 신뢰구간은 믿으면 **안 됩니다**. 가중치를 추정하면서 생기는 분산이 반영되어 있지 않기 때문입니다. 올바르게 추론하는 방법은 잠시 후에 살펴보고, 그 전에 시간에 따른 효과의 이질성을 다루는 방법부터 보겠습니다.\n", "\n", @@ -2013,7 +2013,7 @@ "id": "089c7d1f", "metadata": {}, "source": [ - "보다시피 주 그룹이 두 개 있습니다. 하나는 1989년부터 처치를 받은 캘리포니아만 있는 그룹이고, 다른 하나는 새로 만든 주 3개로 이루어진 그룹으로 모두 1993년부터 처치를 받았습니다. 이제 각 그룹에 대해 SDID를 실행해야 합니다. 대조군 대상에 그룹 하나만 더해서 남기면 쉽게 할 수 있습니다. 다만 함정이 하나 있습니다. `after_treatment` 열은 어떤 그룹을 보느냐에 따라 의미가 달라집니다. 캘리포니아만 있는 그룹을 볼 때는 `after_treatment`가 `year >= 1989`여야 하고, 새 주들로 이루어진 그룹을 볼 때는 `year >= 1993`이어야 합니다. 다행히 이 점은 아주 쉽게 반영할 수 있습니다. 반복할 때마다 `after_treatment`를 다시 만들기만 하면 됩니다." + "보다시피 주 그룹이 두 개 있습니다. 하나는 1989년부터 처치를 받은 캘리포니아만 있는 그룹이고, 다른 하나는 새로 만든 주 3개로 이루어진 그룹으로 모두 1993년부터 처치를 받았습니다. 이제 그룹마다 SDID를 실행해야 합니다. 대조군 대상에 그룹 하나만 더해서 남기면 쉽게 할 수 있습니다. 다만 함정이 하나 있습니다. `after_treatment` 열은 어떤 그룹을 보느냐에 따라 의미가 달라집니다. 캘리포니아만 있는 그룹을 볼 때는 `after_treatment`가 `year >= 1989`여야 하고, 새 주들로 이루어진 그룹을 볼 때는 `year >= 1993`이어야 합니다. 다행히 이 점은 아주 쉽게 반영할 수 있습니다. 반복할 때마다 `after_treatment`를 다시 만들기만 하면 됩니다." ] }, { diff --git a/causal-inference-for-the-brave-and-true/Conformal-Inference-for-Synthetic-Control.ipynb b/causal-inference-for-the-brave-and-true/Conformal-Inference-for-Synthetic-Control.ipynb index b2d0edd..3b1b584 100644 --- a/causal-inference-for-the-brave-and-true/Conformal-Inference-for-Synthetic-Control.ipynb +++ b/causal-inference-for-the-brave-and-true/Conformal-Inference-for-Synthetic-Control.ipynb @@ -38,7 +38,7 @@ "\n", "## 통제집단합성법 복습\n", "\n", - "통제집단합성법(synthetic control, SC)은 실험군이 하나뿐이고 대조군도 아주 적지만, 각 대상을 시간에 걸쳐 반복해서 관측한 데이터가 있을 때 특히 유용한 인과추론 기법입니다(빅데이터 환경에 맞춘 확장 기법도 많이 있습니다). 대표적인 사용 사례는 한 지역(예를 들어 한 주)에 가한 처치의 효과를 알고 싶을 때 처치를 받지 않은 다른 주들을 대조군으로 쓰는 경우입니다. 통제집단합성법 장에서는 발의안 99호(1988년 캘리포니아에서 통과된, 담배세를 올린 법안)가 담배 판매량에 미친 효과를 추정하는 문제로 이 기법을 소개했습니다.\n", + "통제집단합성법(synthetic control, SC)은 실험군이 하나뿐이고 대조군도 아주 적을 때 특히 유용한 인과추론 기법입니다. 대신 각 대상을 시간에 걸쳐 반복해서 관측한 데이터가 있어야 합니다(빅데이터 환경에 맞춘 확장 기법도 많이 있습니다). 대표적인 사용 사례는 한 지역(예를 들어 한 주)에 가한 처치의 효과를 알고 싶을 때 처치를 받지 않은 다른 주들을 대조군으로 쓰는 경우입니다. 통제집단합성법 장에서는 발의안 99호(1988년 캘리포니아에서 통과된, 담배세를 올린 법안)가 담배 판매량에 미친 효과를 추정하는 문제로 이 기법을 소개했습니다.\n", "\n", "이 효과를 추정하려면 캘리포니아가 발의안 99호를 통과시키지 않았다면 어떻게 됐을지 추정해야 합니다. 결국 반사실(counterfactual) $Y_{t}(0)$를 추정해서 개입 이후 기간에 관측된 결과와 비교하는 문제로 귀결됩니다.\n", "\n", @@ -46,7 +46,7 @@ "ATT = Y_{t}(1) - Y_{t}(0) = Y_{t} - Y_{t}(0) \\text{ for } t \\geq 1988\n", "$$\n", "\n", - "이를 위한 방법은 여러 가지인데, 그중 하나가 통제집단합성법입니다. 통제집단합성법은 여러 대조군 대상을 조합해 실험군 대상의 처치 전 움직임을 흉내 내도록 만들어서 실험군의 $Y(0)$를 모델링합니다. 이 예에서는 여러 주를 조합해 발의안 99호 이전 캘리포니아의 담배 판매 추세를 근사하는 조합을 찾는다는 뜻입니다. 이렇게 하는 이유는 실험군과 같은 패턴을 따르는 대조군 대상이 거의 없기 때문입니다. 여러 주의 담배 판매 추세를 그려 보면 바로 알 수 있습니다. 캘리포니아와 추세가 비슷한 주가 하나도 없습니다." + "이를 위한 방법은 여러 가지인데, 그중 하나가 통제집단합성법입니다. 통제집단합성법은 여러 대조군 대상을 조합해 실험군 대상의 처치 전 움직임을 흉내 내도록 만들어서 실험군의 $Y(0)$를 모델링합니다. 이 예에서는 발의안 99호 이전 캘리포니아의 담배 판매 추세를 함께 근사하는 주들의 조합을 찾는다는 뜻입니다. 이렇게 하는 이유는 실험군과 같은 패턴을 따르는 대조군 대상이 거의 없기 때문입니다. 여러 주의 담배 판매 추세를 그려 보면 바로 알 수 있습니다. 캘리포니아와 추세가 비슷한 주가 하나도 없습니다." ] }, { @@ -139,7 +139,7 @@ "\\text{s.t } \\ \\sum w_j = 1 \\text{ and } \\ w_j > 0 \\ \\forall \\ j\n", "$$\n", "\n", - "이 두 제약을 합치면 가상의 대조군을 대조군 대상들의 볼록 조합(convex combination)으로 정의하는 셈입니다. 또한 위험한 외삽(extrapolation)을 전혀 하지 않으며, 가상의 대조군이 소수의 대조군 대상만 쓴다는 뜻이기도 합니다.\n", + "이 두 제약을 합치면 가상의 대조군을 대조군 대상들의 볼록 조합(convex combination)으로 정의하는 셈입니다. 위험한 외삽(extrapolation)을 전혀 하지 않는다는 뜻이자, 가상의 대조군이 소수의 대조군 대상만 쓴다는 뜻이기도 합니다.\n", "\n", "![img](data/img/synth-control/extrapolation.png)\n", "\n", @@ -423,9 +423,9 @@ "source": [ "효과가 없다는 귀무가설을 가정하면, 그 귀무가설 아래의 데이터는 $Y(0) = Y(1) = Y$입니다. 즉 실험군인 캘리포니아에서 관측한 결과의 궤적 그대로입니다. 이번에는 귀무가설을 -4, 즉 발의안 99호가 담배 판매량을 4갑 줄인다고 가정하면 $Y(0) = Y(1) - (-4)$가 되어 처치 후 결과의 궤적이 +4만큼 위로 이동합니다. 아주 직관적입니다. 법안이 담배 판매량을 줄인다고 생각한다면, 법안이 없었을 때는 관측 데이터보다 담배 판매량이 더 높아야 하니까요.\n", "\n", - "추론 절차의 다음 단계는 방금 만든 함수로 얻은 반사실 $Y(0)$에 대한 모델을 처치 전**과** 처치 후 기간을 아우르는 전체 데이터로 적합하는 것입니다. 보통 가상의 대조군을 적합하는 방식과 크게 다른 점입니다. 개입 이후 잔차가 지나치게 커지지 않도록, 가정한 귀무가설 아래에서 전체 데이터로 모델을 추정해야 한다는 것이 이 방법의 아이디어입니다. 그다음 이 모델로 모든 기간 $t$에 대해 잔차 $\\hat{u_t} = Y_t - \\hat{Y}_t(0)$를 계산합니다.\n", + "추론 절차의 다음 단계는 방금 만든 함수로 얻은 반사실 $Y(0)$에 대한 모델을 처치 전**과** 처치 후 기간을 아우르는 전체 데이터로 적합하는 것입니다. 평소 가상의 대조군을 적합할 때와 크게 다른 점입니다. 개입 이후 잔차가 지나치게 커지지 않도록, 가정한 귀무가설 아래에서 전체 데이터로 모델을 추정해야 한다는 것이 이 방법의 아이디어입니다. 그다음 이 모델로 모든 기간 $t$에 대해 잔차 $\\hat{u_t} = Y_t - \\hat{Y}_t(0)$를 계산합니다.\n", "\n", - "이를 수행하는 함수는 먼저 앞에서 만든 `with_effect` 함수로 귀무가설 아래의 데이터를 만듭니다. 그다음 이 데이터로 모델을 적합합니다. 이어서 방금 적합한 모델로 예측해서 $Y(0)$를 추정합니다. 마지막으로 잔차 $\\hat{u}_t$를 계산하고 모든 결과를 데이터프레임에 담습니다." + "이 일을 하는 함수는 먼저 앞에서 만든 `with_effect` 함수로 귀무가설 아래의 데이터를 만듭니다. 그다음 이 데이터로 모델을 적합합니다. 이어서 방금 적합한 모델로 예측해서 $Y(0)$를 추정합니다. 마지막으로 잔차 $\\hat{u}_t$를 계산하고 모든 결과를 데이터프레임에 담습니다." ] }, { @@ -614,7 +614,7 @@ "id": "afc2bf17", "metadata": {}, "source": [ - "$H_0: 0$ 아래에서 적합한 모델의 잔차가 꽤 크고 음수라는 것을 벌써 알 수 있습니다. 효과가 없다는 귀무가설을 기각해야 할 수도 있다는 증거입니다." + "$H_0: 0$ 아래에서 적합한 모델의 잔차가 음수 쪽으로 꽤 크다는 것이 벌써 보입니다. 효과가 없다는 귀무가설을 기각해야 할 수도 있다는 증거입니다." ] }, { @@ -624,7 +624,7 @@ "source": [ "#### 검정통계량\n", "\n", - "이런 시각적 증거는 직관적으로 이해하는 데는 도움이 되지만, 조금 더 정확해야 합니다. 그래서 **검정통계량(test statistic) S**를 정의합니다. 검정통계량은 잔차가 얼마나 큰지, 따라서 귀무가설 아래에서 관측한 데이터가 나올 가능성이 얼마나 낮은지를 요약합니다.\n", + "이런 시각적 증거는 직관적으로 이해하는 데는 도움이 되지만, 조금 더 엄밀하게 따질 필요가 있습니다. 그래서 **검정통계량(test statistic) S**를 정의합니다. 검정통계량은 잔차가 얼마나 큰지, 따라서 귀무가설 아래에서 관측한 데이터가 나올 가능성이 얼마나 낮은지를 요약합니다.\n", "\n", "$$\n", "S(\\hat{u})_q = \\bigg(\\sum_{t=T0 + 1}^{T} |u_t|^q \\bigg) ^{1/q}\n", @@ -632,7 +632,7 @@ "\n", "여기서는 $q=1$인 경우에 집중합니다. 그러면 $S(\\hat{u}) = \\sum_{t=T0 + 1}^{T} |u_t|$가 됩니다.\n", "\n", - "이 통계량은 $t \\geq T0 + 1$인 개입 이후 기간만으로 계산한다는 점에 주목하세요. 반사실 $Y(0)$ 모델은 전체 데이터로 적합하지만, 잔차는 세운 귀무가설과 관련된 결과, 즉 개입 이후 기간에 대해서만 확인합니다." + "이 통계량은 $t \\geq T0 + 1$인 개입 이후 기간만으로 계산한다는 점에 주목하세요. 반사실 $Y(0)$ 모델은 전체 데이터로 적합하지만, 잔차는 귀무가설이 다루는 결과, 즉 개입 이후 기간에서만 확인합니다." ] }, { diff --git a/causal-inference-for-the-brave-and-true/Debiasing-with-Orthogonalization.ipynb b/causal-inference-for-the-brave-and-true/Debiasing-with-Orthogonalization.ipynb index 536084e..255ec33 100644 --- a/causal-inference-for-the-brave-and-true/Debiasing-with-Orthogonalization.ipynb +++ b/causal-inference-for-the-brave-and-true/Debiasing-with-Orthogonalization.ipynb @@ -59,11 +59,11 @@ "\n", "자, 조금 더 풀어 보겠습니다. 회귀분석은 아주 특별한 모델입니다. 각 매개변수는 편미분으로 해석할 수 있습니다. 즉 **다른 모든 특성을 고정한 채로** 특성 하나를 늘리면 $Y$가 얼마나 늘어나는지를 뜻합니다. 인과추론에는 정말 반가운 성질입니다. 데이터를 수집할 때 고정해 두지 않은 변수라도 분석 단계에서 통제할 수 있다는 뜻이기 때문입니다.\n", "\n", - "회귀에서 변수를 빠뜨리면 편향이 생긴다는 것도 알고 있습니다. 구체적으로는 누락 변수 편향(또는 교란편향)입니다. 그런데 프리슈-워-로벨 정리는 회귀 모델을 두 부분으로 쪼개고, 어느 쪽에도 전체 특성 집합이 들어 있지 않은데도 전체 회귀를 돌렸을 때와 똑같은 추정값을 얻을 수 있다고 말합니다. 그뿐이 아닙니다. 이 정리는 선형회귀가 실제로 무슨 일을 하는지도 보여 줍니다. 회귀는 변수 $X_k$의 계수를 구하기 위해 먼저 나머지 모든 변수로 $X_k$를 예측하고 잔차를 구합니다. 이렇게 하면 $X_k$에서 그 변수들의 영향이 '씻겨' 나갑니다. 그래서 $X_k$가 $Y$에 미치는 영향을 살펴볼 때 누락 변수 편향이 없습니다. 다음으로 회귀는 나머지 모든 변수로 $Y$를 예측하고 잔차를 구합니다. 이렇게 하면 $Y$에서 그 변수들의 영향이 '씻겨' 나가고 $Y$의 분산이 줄어들어, $X_k$가 $Y$에 어떤 영향을 주는지 더 쉽게 볼 수 있습니다.\n", + "회귀에서 변수를 빠뜨리면 편향이 생긴다는 것도 알고 있습니다. 구체적으로는 누락 변수 편향(또는 교란편향)입니다. 그런데 프리슈-워-로벨 정리에 따르면 회귀 모델을 두 부분으로 쪼갤 수 있습니다. 어느 쪽에도 전체 특성 집합이 들어 있지 않은데도, 전체 회귀를 돌렸을 때와 똑같은 추정값이 나옵니다. 그뿐이 아닙니다. 이 정리는 선형회귀가 실제로 무슨 일을 하는지도 보여 줍니다. 회귀는 변수 $X_k$의 계수를 구하기 위해 먼저 나머지 모든 변수로 $X_k$를 예측하고 잔차를 구합니다. 이렇게 하면 $X_k$에서 그 변수들의 영향이 '씻겨' 나갑니다. 그래서 $X_k$가 $Y$에 미치는 영향을 살펴볼 때 누락 변수 편향이 없습니다. 다음으로 회귀는 나머지 모든 변수로 $Y$를 예측하고 잔차를 구합니다. 이렇게 하면 $Y$에서 그 변수들의 영향이 '씻겨' 나가고 $Y$의 분산이 줄어들어, $X_k$가 $Y$에 어떤 영향을 주는지 더 쉽게 볼 수 있습니다.\n", "\n", - "이게 얼마나 멋진 일인지 와닿지 않을 수도 있습니다. 하지만 선형회귀가 무엇을 하는지 떠올려 보세요. $X_1$을 고려하면서 $X_2$가 $y$에 미치는 영향을 추정합니다. 인과추론에서는 엄청나게 강력한 성질입니다. 특성 $X$로 처치 $t$를 예측하는 모델과, 같은 특성으로 결과 $y$를 예측하는 모델을 만들고, 두 모델의 잔차를 구한 뒤, $t$의 잔차가 $y$의 잔차에 어떤 영향을 주는지 추정하는 모델을 돌리면 된다는 뜻입니다. 이 마지막 모델은 $X$를 통제한 상태에서 $t$가 $y$에 미치는 영향을 알려 줍니다. 앞의 두 모델이 교란 요인을 통제해 주는 셈입니다. 두 모델은 무작위나 다름없는 데이터를 만들어 냅니다. 이것이 데이터의 편향을 제거하는 과정입니다. 그리고 마지막 모델에서 탄력성을 추정할 때 쓰는 데이터가 바로 이것입니다.\n", + "이게 얼마나 멋진 일인지 와닿지 않을 수도 있습니다. 하지만 선형회귀가 무엇을 하는지 떠올려 보세요. $X_1$을 고려하면서 $X_2$가 $y$에 미치는 영향을 추정합니다. 인과추론에서는 엄청나게 강력한 성질입니다. 이 정리대로라면 이렇게 해도 됩니다. 특성 $X$로 처치 $t$를 예측하는 모델과, 같은 특성으로 결과 $y$를 예측하는 모델을 만듭니다. 두 모델의 잔차를 구한 뒤, $t$의 잔차가 $y$의 잔차에 어떤 영향을 주는지 추정하는 모델을 돌립니다. 이 마지막 모델은 $X$를 통제한 상태에서 $t$가 $y$에 미치는 영향을 알려 줍니다. 앞의 두 모델이 교란 요인을 통제해 주는 셈입니다. 두 모델은 무작위나 다름없는 데이터를 만들어 냅니다. 이것이 바로 데이터의 편향을 제거하는 과정이고, 이렇게 얻은 데이터로 마지막 모델에서 탄력성을 추정합니다.\n", "\n", - "왜 그런지에 대한 수학적 증명이 있지만(그렇게 복잡하지는 않습니다), 이 정리의 직관은 아주 명쾌하므로 바로 직관으로 넘어가겠습니다.\n", + "왜 그런지 보여 주는 수학적 증명도 있지만(그렇게 복잡하지는 않습니다), 이 정리는 직관이 워낙 명쾌하니 바로 직관으로 넘어가겠습니다.\n", "\n", "## 직교화의 직관" ] @@ -124,7 +124,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "테스트 셋에서 상관관계를 살펴보면 가격과 판매량이 양의 상관관계를 보입니다. 가격을 올리면 판매량이 늘어나야 한다는 뜻입니다. 말이 안 되는 결과입니다. 아이스크림이 비싸다고 더 사 먹는 사람은 없습니다. 여기에는 아마 어떤 편향이 숨어 있을 것입니다." + "테스트 셋에서 상관계수를 확인해 보면 가격과 판매량이 양의 상관관계를 보입니다. 가격을 올리면 판매량이 늘어나야 한다는 뜻입니다. 말이 안 되는 결과입니다. 아이스크림이 비싸다고 더 사 먹는 사람은 없습니다. 여기에는 아마 어떤 편향이 숨어 있을 것입니다." ] }, { @@ -325,13 +325,13 @@ "source": [ "주말이 더 이상 오른쪽 위에 몰려 있지 않습니다. 가운데로 밀려났습니다. 게다가 요일로는 가격 수준(처치)을 더 이상 구분할 수 없습니다. x축에 그린 잔차 $price-M_t(X)$는 원래 처치를 '무작위'로 만든, 즉 편향을 제거한 버전이라고 할 수 있습니다.\n", "\n", - "데이터셋의 편향을 제거하는 데는 이것만으로 충분합니다. 새로 만든 처치는 무작위 배정이나 다름없습니다. 하지만 편향을 제거한 데이터셋을 더 낫게 만들 방법이 하나 더 있습니다. 바로 결과에 대해서도 잔차를 구하는 것입니다.\n", + "데이터셋의 편향을 제거하는 데는 이것만으로 충분합니다. 새로 만든 처치는 무작위 배정이나 다름없습니다. 하지만 편향을 제거한 데이터셋을 더 낫게 만들 방법이 하나 더 있습니다. 바로 결과의 잔차도 구하는 것입니다.\n", "\n", "$$\n", "\\hat{y}_i = y_i - M_y(X_i)\n", "$$\n", "\n", - "이것이 프리슈-워-로벨 정리의 또 다른 단계입니다. 이 단계가 데이터의 편향을 더 줄이지는 않지만, $y$의 분산을 줄여서 탄력성을 추정하기 쉽게 만들어 줍니다. 이번에도 $\\hat{y}_i$는 $X$로 예측할 수 없는 $y_i$, 또는 $X$로 생긴 분산을 모두 설명해서 걷어 낸 버전이라고 생각할 수 있습니다. 잘 생각해 보세요. $M_y(X_i)$로 $X$를 써서 이미 $y$를 예측했습니다. 그리고 $\\hat{y}_i$는 그 예측의 오차입니다. 그러니 정의상 $X$로는 이 오차를 예측할 수 없습니다. $y$를 예측하는 데 쓸 수 있는 $X$의 정보는 이미 다 썼습니다. 그렇다면 $\\hat{y}_i$를 설명할 수 있는 것은 이를 만들 때 쓰지 않은 것(즉 $X$에 들어 있지 않은 것)뿐이고, 그것은 처치밖에 없습니다(다시 말하지만, 측정되지 않은 교란 요인이 없다는 가정 아래에서입니다)." + "이것이 프리슈-워-로벨 정리의 또 다른 단계입니다. 이 단계가 데이터의 편향을 더 줄이지는 않지만, $y$의 분산을 줄여서 탄력성을 추정하기 쉽게 만들어 줍니다. 이번에도 $\\hat{y}_i$는 $X$로 예측할 수 없는 $y_i$, 또는 $X$로 생긴 분산을 모두 설명해서 걷어 낸 버전이라고 생각할 수 있습니다. 잘 생각해 보세요. $M_y(X_i)$로 $X$를 써서 이미 $y$를 예측했습니다. 그리고 $\\hat{y}_i$는 그 예측의 오차입니다. 그러니 정의상 $X$로는 이 오차를 예측할 수 없습니다. $y$를 예측하는 데 쓸 수 있는 $X$의 정보는 이미 다 썼습니다. 그렇다면 $\\hat{y}_i$를 설명할 수 있는 것은 이를 만들 때 쓰지 않은 것(즉 $X$에 들어 있지 않은 것)뿐이고, 그런 것은 처치밖에 없습니다(다시 말하지만, 측정되지 않은 교란 요인이 없다는 가정 아래에서입니다)." ] }, { @@ -538,7 +538,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "이제 누적 탄력성을 그릴 때도 예측 탄력성을 기준으로 데이터셋을 정렬하는 것은 같습니다. 다만 이번에는 편향을 제거한 처치와 결과로 탄력성을 구합니다. 이는 다음 회귀 모델에서 $\\beta_1$을 추정하는 것과 같습니다.\n", + "누적 탄력성을 그릴 때 예측 탄력성을 기준으로 데이터셋을 정렬하는 것은 전과 같습니다. 다만 이번에는 편향을 제거한 처치와 결과로 탄력성을 구합니다. 이는 다음 회귀 모델에서 $\\beta_1$을 추정하는 것과 같습니다.\n", "\n", "$$\n", "\\hat{y}_i = \\beta_0 + \\beta_1 \\hat{t}_i + e_i\n", @@ -891,13 +891,13 @@ "source": [ "이번에도 가격이 판매량에 미치는 음의 탄력성을 찾아냈습니다. 사실 이 그래프는 단순 선형회귀를 썼을 때 얻은 그래프와 놀라울 만큼 비슷합니다. 하지만 이는 아마 데이터셋이 아주 단순하기 때문일 것입니다. 머신러닝 직교화의 장점은 더 복잡한 함수를 추정할 수 있다는 데 있습니다. 선형회귀로는 표현하기 어려운 상호작용과 비선형성을 학습할 수 있습니다. 또 일부 머신러닝 모델(결정 트리 기반 모델)은 선형회귀보다 훨씬 간편하게 돌릴 수 있다는 장점도 있습니다. 범주형 데이터, 이상치, 심지어 결측값까지 처리할 수 있는데, 선형회귀만 쓴다면 이런 것들은 따로 신경을 써야 합니다.\n", "\n", - "마지막으로, 마무리하기 전에 데이터 과학자들이 이 아이디어를 처음 접할 때 흔히 저지르는 실수 하나를 짚고 넘어가겠습니다(저도 해 봤습니다). 처치나 결과가 이진 변수라면 머신러닝 회귀 모델을 분류 모델로 바꾸는 편이 낫다고 생각할 수 있습니다. 하지만 그렇게 하면 안 됩니다. 직교화 이론은 회귀 모델에서만 성립합니다. 오래전에 도구변수(instrumental variable)를 다룰 때 본 것과 비슷합니다. 솔직히 말하면 회귀를 분류로 바꾼다고 모델이 처참하게 실패하지는 않겠지만, 저라면 권하지 않겠습니다. 이론이 뒷받침하지 않는데 굳이 위험을 감수할 이유가 있을까요?\n", + "마무리하기 전에, 데이터 과학자들이 이 아이디어를 처음 접할 때 흔히 저지르는 실수 하나만 짚고 넘어가겠습니다(저도 해 봤습니다). 처치나 결과가 이진 변수라면 머신러닝 회귀 모델을 분류 모델로 바꾸는 편이 낫다고 생각할 수 있습니다. 하지만 그렇게 하면 안 됩니다. 직교화 이론은 회귀 모델에서만 성립합니다. 오래전에 도구변수(instrumental variable)를 다룰 때 본 것과 비슷합니다. 솔직히 말하면 회귀를 분류로 바꾼다고 모델이 처참하게 실패하지는 않겠지만, 저라면 권하지 않겠습니다. 이론이 뒷받침하지 않는데 굳이 위험을 감수할 이유가 있을까요?\n", "\n", "## 핵심 요약\n", "\n", "이번 장은 인과 모델 평가 방법이 제대로 작동하려면 처치가 무작위로 배정되어야 한다는 점을 강조하면서 시작했습니다. 무작위 데이터가 없으면 이것이 문제가 됩니다. 분명히 해 두자면, 이럴 때 가장 안전한 해법은 실험을 해서 무작위 데이터를 얻는 것입니다. 그럴 수 없을 때에야 비로소 기발한 대안에 기댈 수 있습니다. 바로 처치가 무작위로 배정된 것처럼 보이도록 데이터를 변환하는 것입니다.\n", "\n", - "이번 장에서는 직교화의 원리로 이를 해내는 방법을 다뤘습니다. 먼저 특성 $X$로 처치 $t$를 예측하는 모델을 만들고 그 잔차를 구했습니다. 처치 잔차는 정의상 그것을 만드는 데 쓴 특성과 독립이라는 것이 핵심입니다. 다시 말해 처치 잔차는 특성과 직교합니다. 이 잔차는 $X$로 생긴 교란편향을 모두 걷어 낸 처치라고 볼 수 있습니다.\n", + "이번 장에서는 직교화의 원리로 이를 해내는 방법을 다뤘습니다. 먼저 특성 $X$로 처치 $t$를 예측하는 모델을 만들고 그 잔차를 구했습니다. 처치 잔차는 정의상 자신을 만드는 데 쓴 특성과 독립이라는 것이 핵심입니다. 다시 말해 처치 잔차는 특성과 직교합니다. 이 잔차는 $X$로 생긴 교란편향을 모두 걷어 낸 처치라고 볼 수 있습니다.\n", "\n", "데이터를 무작위나 다름없게 만드는 데는 이것만으로 충분합니다. 하지만 한 걸음 더 나아갈 수 있습니다. 처치는 빼고 특성 $X$만으로 결과 $y$를 예측하는 모델을 만들고, 마찬가지로 그 잔차를 구하는 것입니다. 이번에도 직관은 아주 비슷합니다. 결과 잔차는 특성으로 생긴 분산을 모두 설명해서 걷어 낸 결과입니다. 이 과정에서 분산이 많이 설명되면 처치효과를 보기가 더 쉬워집니다.\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/Debiasing-with-Propensity-Score.ipynb b/causal-inference-for-the-brave-and-true/Debiasing-with-Propensity-Score.ipynb index 4549c06..b489276 100644 --- a/causal-inference-for-the-brave-and-true/Debiasing-with-Propensity-Score.ipynb +++ b/causal-inference-for-the-brave-and-true/Debiasing-with-Propensity-Score.ipynb @@ -6,7 +6,7 @@ "source": [ "# Debiasing with Propensity Score\n", " \n", - "앞 장에서는 편향된 데이터셋을 처치가 무작위 배정이나 다름없어 보이는 데이터셋으로 바꾸는 방법을 살펴봤습니다. 이때 직교화(orthogonalization)를 썼습니다. 처치와 결과를 각각 예측한 다음, 둘 다 예측의 잔차로 바꾸는 기법이었습니다.\n", + "앞 장에서는 직교화(orthogonalization)로 편향된 데이터셋을 처치가 무작위 배정이나 다름없어 보이는 데이터셋으로 바꾸는 방법을 살펴봤습니다. 처치와 결과를 각각 예측한 다음, 둘 다 예측의 잔차로 바꾸는 기법이었습니다.\n", " \n", "$\n", "t^* = t - M_t(X)\n", @@ -20,9 +20,9 @@ " \n", "그 전에 맥락을 조금 바꿔야 합니다. 지금까지는 연속형 처치인 아이스크림 가격을 이야기했습니다. 이번에는 이진 처치인 마케팅 이메일을 살펴보겠습니다. 덧붙이자면, 연속형 처치를 구간으로 나눠 범주형처럼 만드는 것도 얼마든지 괜찮습니다(예를 들어 연속형인 가격을 2.00헤알(BRL) 간격으로 [2.00, 4.00, 6.00, 8.00]처럼 나눌 수 있습니다). 다시 이메일 이야기로 돌아가겠습니다.\n", " \n", - "상황은 이렇습니다. 여러분은 금융 회사에서 일합니다(예시를 짜내는 데 영 소질이 없네요, 죄송합니다). 이 회사는 당연하게도 생명보험, 예금 계좌, 투자 계좌 같은 금융 상품을 판매합니다. 회사는 새로운 금융 자문 서비스를 출시하면서 고객에게 홍보하려 합니다. 이를 위해 마케팅팀은 `em1`, `em2`, `em3` 세 가지 이메일을 시험해 봤습니다.\n", + "상황은 이렇습니다. 여러분은 금융 회사에서 일합니다(제가 예시를 지어내는 재주가 영 없습니다. 죄송합니다). 이 회사는 당연하게도 생명보험, 예금 계좌, 투자 계좌 같은 금융 상품을 판매합니다. 회사는 새로운 금융 자문 서비스를 출시하면서 고객에게 홍보하려 합니다. 이를 위해 마케팅팀은 `em1`, `em2`, `em3` 세 가지 이메일을 시험해 봤습니다.\n", " \n", - "마케팅팀은 통계와 실험 설계를 잘 아는 사람들이라, 그냥 모두에게 이메일을 보내고 어떻게 되는지 지켜보지 않았습니다. 대신 고객마다 이메일을 받을 확률을 정하는 실험을 설계했습니다. 이 확률은 누가 이메일에 더 잘 반응할지에 대한 팀의 비즈니스 직관을 바탕으로 정했습니다. 예를 들어 `em1`은 투자를 많이 하지 않고 소득이 높지 않은 대중 시장 고객을 겨냥한 이메일입니다. 이런 고객은 `em1`을 받을 확률이 더 높습니다. 끝으로 이렇게 확률을 정한 뒤에는 처치 배정을 무작위로 해서, 고객이 각자 배정된 확률에 따라 이메일을 받게 했습니다.\n", + "마케팅팀은 통계와 실험 설계를 잘 아는 사람들이라, 그냥 모두에게 이메일을 보내고 어떻게 되는지 지켜보지 않았습니다. 대신 고객마다 이메일을 받을 확률을 정하는 실험을 설계했습니다. 이 확률은 누가 이메일에 더 잘 반응할지 가늠하는 팀의 비즈니스 직관을 바탕으로 정했습니다. 예를 들어 `em1`은 투자를 많이 하지 않고 소득이 높지 않은 대중 시장 고객을 겨냥한 이메일입니다. 이런 고객은 `em1`을 받을 확률이 더 높습니다. 끝으로 이렇게 확률을 정한 뒤에는 처치 배정을 무작위로 해서, 고객이 각자 배정된 확률에 따라 이메일을 받게 했습니다.\n", " \n", "![img](./data/img/debias-ps/ps-experiment.png)\n", " \n", @@ -329,7 +329,7 @@ " \n", "성향점수를 이용한 편향 제거의 아이디어를 다시 정리해 보겠습니다(성향점수 장에서 이미 본 내용입니다). 바로 위와 같은 고객들이 무척 흥미롭습니다. 이들은 `em1`을 받은 고객과 아주 비슷합니다. 어쨌든 이메일을 받을 확률이 높았으니까요. 그런데도 이메일을 받지 않았습니다. 그래서 반사실적 결과(counterfactual outcome) $Y_0|em1=1$을 추정하는 데 안성맞춤인 후보입니다.\n", " \n", - "성향점수 편향 제거는 실험군(treated)처럼 보이지만 처치를 받지 않은 고객에게 주고 싶은 이 직관적인 중요도를 수치로 반영합니다. 마찬가지로 대조군(untreated)처럼 보이지만 처치를 받은 고객에게도 높은 중요도를 줍니다. 아이디어는 아주 간단합니다. **각 대상에 그 대상이 실제로 받은 처치의 확률의 역수로 가중치를 주면 됩니다**. 즉, 처치를 받은 대상에는 $1/P(treatment=1)$로 가중치를 줍니다. 처치를 받지 않은 대상에는 $1/P(treatment=0)$, 즉 $1/P(control)$로 가중치를 줍니다. 처치가 이진형이라면 간단히 다음과 같습니다.\n", + "실험군(treated)처럼 보이지만 처치를 받지 않은 고객은 직관적으로 중요하게 다루고 싶습니다. 성향점수 편향 제거는 이 중요도를 수치로 반영합니다. 마찬가지로 대조군(untreated)처럼 보이지만 처치를 받은 고객에게도 높은 중요도를 줍니다. 아이디어는 아주 간단합니다. **각 대상에, 그 대상이 실제로 받은 처치 확률의 역수를 가중치로 주면 됩니다**. 즉, 처치를 받은 대상에는 $1/P(treatment=1)$로 가중치를 줍니다. 처치를 받지 않은 대상에는 $1/P(treatment=0)$, 즉 $1/P(control)$로 가중치를 줍니다. 처치가 이진형이라면 간단히 다음과 같습니다.\n", " \n", "$$\n", "W_i = \\dfrac{T}{P(T=1|X)} + \\dfrac{1-T}{1-P(T=1|X)}\n", @@ -497,7 +497,7 @@ " \n", "### 저장된 성향점수\n", " \n", - "`em1` 배정이 실제로 편향되어 있다는 것을 확인했으니, 이제 성향점수로 편향을 제거해 보겠습니다. 마침 머릿속에 떠올랐을 법한 질문에 답하기 좋은 때입니다. 왜 그냥 직교화를 쓰면 안 될까요? 좀 더 점잖게 묻자면, 언제 직교화 대신 성향점수를 써야 할까요? 좋은 질문이고, 솔직히 말해 저도 모든 답을 알지는 못합니다. 하지만 성향점수를 써야 할 강력한 근거가 있는 분명한 경우가 하나 있습니다.\n", + "`em1` 배정이 실제로 편향되어 있다는 것을 확인했으니, 이제 성향점수로 편향을 제거해 보겠습니다. 마침 머릿속에 떠올랐을 법한 질문에 답하기 좋은 때입니다. 왜 그냥 직교화를 쓰면 안 될까요? 좀 더 점잖게 묻자면, 언제 직교화 대신 성향점수를 써야 할까요? 좋은 질문이고, 솔직히 말해 저도 모든 답을 알지는 못합니다. 하지만 성향점수를 써야 한다고 자신 있게 말할 수 있는 경우가 분명히 하나 있습니다.\n", " \n", "실험을 진행하면서 처치를 받을 확률을 저장해 두었다면 **모델을 추정하지 않고도 성향점수로 편향을 제거할 수 있습니다**. 이메일을 확률적으로 배정했고 그 확률을 저장해 두었다면 모델에 기댈 필요가 없습니다. 엄청난 장점입니다. 모델은 결코 완벽하지 않고, 따라서 모델로 하는 편향 제거도 결코 완벽할 수 없기 때문입니다. 지금이 바로 그런 상황입니다. 처치 확률이 `em1_ps`, `em2_ps`, `em3_ps` 열에 저장되어 있습니다.\n", " \n", @@ -1278,9 +1278,9 @@ "source": [ "지나치게 중요한 대상이 생기지 않도록 가중치를 잘라내서(clip), 예컨대 최대 20을 넘지 않게 하는 과학자들도 있습니다. 이 기법이 분산을 일부 줄여 주는 것은 사실이지만, 그 대신 편향을 다시 끌어들입니다. 애초에 편향을 없애려고 한 일이니, 가중치를 잘라내는 것은 좋은 생각이 아니라고 봅니다.\n", " \n", - "제 생각에 할 수 있는 최선은 분석 단계가 아니라 실험 단계에 있습니다. 가중치가 지나치게 큰 대상이 하나도 없도록 해야 합니다. 다시 말해 가능한 한 모두에게 같은 확률로 처치를 주도록 해 보세요.\n", + "제 생각에 가장 좋은 방법은 분석 단계가 아니라 실험 단계에서 손을 쓰는 것입니다. 가중치가 지나치게 큰 대상이 하나도 없도록 해야 합니다. 다시 말해 가능한 한 모두에게 같은 확률로 처치를 주도록 해 보세요.\n", " \n", - "성향점수 가중치 방법을 위해 공정하게 말하자면, 전체 표본이든 일부 하위 집단이든 처치를 받을 확률이나 받지 않을 확률이 너무 낮으면 어떤 인과추론 방법이든 어려움을 겪습니다. 직관적으로 말하면, 어떤 대상은 처치를 거의 받지 못하거나 반대로 거의 언제나 받으므로, 그 대상의 반사실을 추정하기 어렵다는 뜻입니다. 이 문제는 공통 지지 가정을 거의 위반하는 것으로 볼 수 있는데, 바로 다음에서 살펴보겠습니다." + "성향점수 가중치 방법의 편을 조금 들어 주자면, 전체 표본이든 일부 하위 집단이든 처치를 받을 확률이나 받지 않을 확률이 너무 낮으면 어떤 인과추론 방법이든 어려움을 겪습니다. 직관적으로 말하면, 어떤 대상은 처치를 거의 받지 못하거나 반대로 거의 언제나 받으므로, 그 대상의 반사실을 추정하기 어렵다는 뜻입니다. 이 문제는 공통 지지 가정을 거의 위반하는 것으로 볼 수 있는데, 바로 다음에서 살펴보겠습니다." ] }, { @@ -1594,7 +1594,7 @@ " \n", "요점은 직관을 활용해 모집단의 일부를 처치(또는 대조군 배정)에서 빼도 되고, 아마 그렇게 하는 편이 낫다는 것입니다. 무작위 실험은 비용이 많이 들므로 유망한 곳에 노력을 집중해야 합니다.\n", " \n", - "이메일 예시에서는 아마 마케팅팀이 이메일 3을 젊은 사람에게는 절대 보내지 않아야 한다고 생각했을 것입니다. 나이 든 사람만 공감할 수 있는 내용을 대놓고 다루는 이메일일 수도 있습니다. 이유가 무엇이든 이메일 3의 효과는 40세보다 나이가 많은 모집단에 대해서만 추정할 수 있습니다. 그리고 그래도 전혀 문제없습니다. 그저 찾아낸 결과를 젊은 모집단으로 일반화하리라 기대하지만 않으면 됩니다.\n", + "이메일 예시에서는 아마 마케팅팀이 이메일 3을 젊은 사람에게는 절대 보내지 않아야 한다고 생각했을 것입니다. 나이 든 사람만 공감할 수 있는 내용을 대놓고 다루는 이메일일 수도 있습니다. 이유가 무엇이든 이메일 3의 효과는 40세보다 나이가 많은 모집단에 대해서만 추정할 수 있습니다. 그래도 전혀 문제없습니다. 그저 찾아낸 결과를 젊은 모집단으로 일반화하리라 기대하지만 않으면 됩니다.\n", " \n", "이 점을 염두에 두고 이메일 3의 편향을 제거해 보겠습니다. 물론 표본에서 젊은 모집단은 빼겠습니다." ] @@ -1677,7 +1677,7 @@ " \n", "성향점수 편향 제거의 가장 큰 장점은 실험 중에 처치 확률을 저장해 두었다면 모델을 추정할 필요가 없다는 점입니다. 그렇다고 확률이 없으면 성향점수 재가중을 쓸 수 없다는 뜻은 아닙니다. 다만 확률을 추정해야 하므로 편향 제거 과정에 오차가 더해집니다.\n", " \n", - "단점으로는, 성향점수가 지나치게 높거나 낮으면 가중치가 엄청나게 커져서 성향점수 재가중의 분산이 매우 커질 수 있습니다. 직관적으로 말하면, 실험군과 비슷한 대조군 대상이 거의 없고 대조군과 비슷한 실험군 대상도 거의 없을 때 이런 일이 생깁니다. 성향점수 가중치를 위해 공정하게 말하자면 이는 모든 인과추론 방법에 해당하는 문제입니다. 다만 성향점수 가중치는 양수성 가정을 거의 위반하는 이런 상황을 더 분명하게 드러냅니다.\n", + "단점도 있습니다. 성향점수가 지나치게 높거나 낮으면 가중치가 엄청나게 커져서 성향점수 재가중의 분산이 매우 커질 수 있습니다. 직관적으로 말하면, 실험군과 비슷한 대조군 대상이 거의 없고 대조군과 비슷한 실험군 대상도 거의 없을 때 이런 일이 생깁니다. 성향점수 가중치의 편을 들어 주자면, 이는 모든 인과추론 방법에 해당하는 문제입니다. 다만 성향점수 가중치는 양수성 가정을 거의 위반하는 이런 상황을 더 분명하게 드러냅니다.\n", " \n", "끝으로 양수성 가정 위반이 얼마나 큰 문제인지 간단히 논의했습니다. 결론은 **양수성이 성립하지 않는 모집단 부분으로까지 결론을 일반화하려 하지만 않는다면** 문제가 아니라는 것이었습니다.\n", " \n", diff --git a/causal-inference-for-the-brave-and-true/Prediction-Metrics-For-Causal-Models.ipynb b/causal-inference-for-the-brave-and-true/Prediction-Metrics-For-Causal-Models.ipynb index 5dbded2..77777ec 100644 --- a/causal-inference-for-the-brave-and-true/Prediction-Metrics-For-Causal-Models.ipynb +++ b/causal-inference-for-the-brave-and-true/Prediction-Metrics-For-Causal-Models.ipynb @@ -35,7 +35,7 @@ "Y = g(x) + f(t,x)\n", "$$\n", " \n", - "이런 덧셈 구조는 함수 형태에 제약을 걸기는 하지만 그리 크지 않습니다. 그래서 데이터 생성 과정(Data Generating Process, DGP)을 꽤 일반적으로 표현하는 방식이라고 볼 수 있습니다.\n", + "이런 덧셈 구조가 함수 형태를 어느 정도 제약하기는 하지만, 그 제약이 크지는 않습니다. 그래서 데이터 생성 과정(Data Generating Process, DGP)을 꽤 일반적으로 표현하는 방식이라고 볼 수 있습니다.\n", " \n", "핵심은 처치효과가 공변량의 효과보다 약하면, **무작위 데이터가 있더라도** 예측력은 더 높으면서 인과추론에는 형편없는 모델이 나올 수 있다는 점입니다. 그런 모델은 $f(t,x)$는 무시하고 $g(x)$만 근사하면 됩니다.\n", " \n", diff --git a/causal-inference-for-the-brave-and-true/When-Prediction-Fails.ipynb b/causal-inference-for-the-brave-and-true/When-Prediction-Fails.ipynb index 63d5e81..e019c66 100644 --- a/causal-inference-for-the-brave-and-true/When-Prediction-Fails.ipynb +++ b/causal-inference-for-the-brave-and-true/When-Prediction-Fails.ipynb @@ -33,9 +33,9 @@ " \n", "제 경험상 경영진이 가장 신경 쓰는 쪽은 대개 이 두 번째 유형의 문제입니다. 경영진은 매출을 늘리고, 비용을 줄이고, 고객을 더 끌어오는 방법을 알고 싶어 합니다. 데이터 과학자가 매출을 늘리는 방법이 아니라 매출을 예측하는 방법을 답이라고 들고 오면 경영진이 별로 반기지 않으리라는 건 말할 필요도 없습니다. 안타깝게도 데이터 과학자가 아는 것이 예측 모델뿐이면 이런 일이 자주 벌어집니다. 예전 상사가 제게 이런 말을 한 적이 있습니다. \"가진 게 망치뿐이면 모든 게 엄지손가락으로 보이기 시작한다.\"\n", " \n", - "앞서 말했듯 저는 지식의 문턱을 낮추는 데 전적으로 찬성하지만, 지금의 데이터 과학자 교육 과정에는 큰 구멍이 있습니다. 그 구멍을 메우는 것이 이 책에서 제가 할 일이라고 생각합니다. 본질적으로 인과적인 이 다른 부류의 문제를 풀 도구를 손에 쥐여 드리려는 것입니다.\n", + "앞서 말했듯 저는 지식의 문턱을 낮추는 데 전적으로 찬성하지만, 지금의 데이터 과학자 교육 과정에는 큰 구멍이 있습니다. 그 구멍을 메우는 것이 이 책에서 제가 할 일이라고 생각합니다. 이 다른 부류의 문제, 즉 본질적으로 인과적인 문제를 풀 도구를 손에 쥐여 드리려는 것입니다.\n", "\n", - "여기서 하려는 일은 내가 통제할 수 있는 것(광고, 가격, 고객 서비스)이 바꾸고 싶지만 직접 통제할 수는 없는 것(매출, 고객 수, 손익)에 어떤 영향을 미치는지, 다시 말해 그 변화를 어떻게 일으키는지 추정하는 것입니다. 하지만 이런 문제를 푸는 방법을 보여 드리기 전에, 이 문제를 예측 과제처럼 다뤄 전통적인 머신러닝 도구로 풀려고 하면 어떤 일이 벌어지는지 먼저 보여 드리려 합니다. 데이터 과학자들이 종종 저를 찾아와 이렇게 말하기 때문입니다. \"네, 인과 문제를 예측 도구로 푸는 게 최선이 아니라는 건 알겠어요. 그래도 어느 정도는 도움이 되지 않나요? 그러니까, 손해 볼 건 없잖아요...\" 그런데 알고 보면 손해를 볼 수 있습니다. 그러니 계속 자기 엄지를 망치로 내리치기 전에 이 점을 제대로 이해해 두는 편이 좋습니다.\n", + "여기서 하려는 일은 내가 통제할 수 있는 것(광고, 가격, 고객 서비스)이, 바꾸고 싶지만 직접 통제할 수는 없는 것(매출, 고객 수, 손익)에 어떤 영향을 미치는지, 즉 어떤 변화를 일으키는지 추정하는 것입니다. 하지만 이런 문제를 푸는 방법을 보여 드리기 전에, 이 문제를 예측 과제처럼 다뤄 전통적인 머신러닝 도구로 풀려고 하면 어떤 일이 벌어지는지 먼저 보여 드리려 합니다. 데이터 과학자들이 종종 저를 찾아와 이렇게 말하기 때문입니다. \"네, 인과 문제를 예측 도구로 푸는 게 최선이 아니라는 건 알겠어요. 그래도 어느 정도는 도움이 되지 않나요? 그러니까, 손해 볼 건 없잖아요...\" 그런데 알고 보면 손해를 볼 수 있습니다. 그러니 계속 자기 엄지를 망치로 내리치기 전에 이 점을 제대로 이해해 두는 편이 좋습니다.\n", "\n", "![img](./data/img/when-prediction-fails/horse-meme.png)\n", "\n", @@ -73,7 +73,7 @@ "source": [ "## 쿠폰 받으실 분?\n", " \n", - "조금 더 와닿게 하려고 앞 장에서 쓴 예제를 이어 가되, 살짝 비틀어 보겠습니다. 앞 장에서는 수익이 나는 고객과 그렇지 않은 고객을 구별하려 했습니다. 이를 고객 수익성을 예측하는 예측 문제로 정의했습니다. 그러고 나서 이 과제를 위한 머신러닝 모델을 만들고, 그 모델로 거래할 고객, 즉 수익이 날 것으로 예측된 고객만 골라낼 수 있었습니다. 다시 말해 목표는 수익이 나는 고객과 나지 않는 고객을 가르는 것이었고, 예측 모델로 그 일을 해낼 수 있었습니다.\n", + "조금 더 와닿게 하려고 앞 장에서 쓴 예제를 이어 가되, 살짝 비틀어 보겠습니다. 앞 장에서는 수익이 나는 고객과 그렇지 않은 고객을 구별하려 했습니다. 이를 고객 수익성 예측 문제로 정의했습니다. 그러고 나서 이 과제를 위한 머신러닝 모델을 만들고, 그 모델로 거래할 고객, 즉 수익이 날 것으로 예측된 고객만 골라낼 수 있었습니다. 다시 말해 목표는 수익이 나는 고객과 나지 않는 고객을 가르는 것이었고, 예측 모델로 그 일을 해낼 수 있었습니다.\n", " \n", "이번에는 새 과제가 주어졌습니다. 신규 고객에게 쿠폰을 주면 고객의 참여가 늘고 장기적으로 수익성이 높아질 것 같다는 생각이 듭니다. 고객이 돈을 더 많이, 더 오래 쓴다는 뜻입니다. 새로 맡은 일은 쿠폰 금액을 얼마로 할지(0 포함) 정하는 것입니다. 쿠폰을 준다는 건 사실상 고객이 우리 비즈니스에서 쓸 돈을 공짜로 나눠 주는 셈이라는 점에 주목하세요. 그래서 쿠폰은 장부에 비용으로 잡힙니다. 쿠폰 금액이 너무 크면 고객이 필요한 것을 전부 쿠폰만으로 사 버릴 테니 아마 손해를 볼 것입니다. 제품을 공짜로 가져간다는 말을 달리 한 것뿐입니다. 반대로 쿠폰 금액이 너무 작으면(또는 0이면) 쿠폰을 아예 주지 않는 것과 같습니다. 이것도 정답일 수 있지만, 처음에 쿠폰 형태로 약간 할인해 주는 편이 장기적으로 더 이익일 수도 있습니다.\n", " \n", @@ -655,7 +655,7 @@ "source": [ "흥미롭습니다. 나이가 많을수록 쿠폰을 받을 확률이 높은 것 같습니다. 데이터에 편향(bias)이 있다는 신호입니다. 쿠폰과 `net_value` 사이에는 음의 상관관계도 보입니다. 쿠폰을 많이 줄수록 net_value가 작습니다. 쿠폰이 무작위로 지급되지 않았다는 걸 이미 알고 있으니 이 관계를 인과관계로 보기는 어렵습니다. 예를 들어 나이 든 고객이 우리 제품에 돈을 덜 쓰면서 동시에 더 큰 쿠폰을 받는다면, 이 교란(confounding) 때문에 쿠폰과 `net_value`의 관계가 음수로 보일 정도로 왜곡될 수 있습니다.\n", "\n", - "요점은 편향이 있다는 걸 우리가 안다는 것입니다. 다만 이 장에는 이미 담을 내용이 너무 많으니 지금은 무시하겠습니다(사실은 곧 보게 될 장치를 써서 이 문제를 비켜 가겠습니다). 언젠가는 해결해야 할 문제라는 점만 기억해 두세요.\n", + "요점은 편향이 있다는 사실을 이미 알고 있다는 것입니다. 다만 이 장에는 이미 담을 내용이 너무 많으니 지금은 무시하겠습니다(사실은 곧 보게 될 장치를 써서 이 문제를 비켜 가겠습니다). 언젠가는 해결해야 할 문제라는 점만 기억해 두세요.\n", "\n", "분석이 이 단계에 이르렀을 때 **예측 문제라면** 데이터셋을 훈련 셋과 테스트 셋으로 나눠 각각 정책(policy)을 만들고 평가할 것입니다. 하지만 이건 예측 문제가 아닙니다. 최종 목표는 고객 수익성을 잘 예측하는 것이 아니라 최적의 쿠폰 전략을 찾는 것입니다. 이 최적화를 평가하려면 실제로 준 쿠폰과 다른 쿠폰을 주었다면 어떻게 되었을지 알아야 합니다. 지금까지 인과관계를 다루며 공부해 온 '만약 ~였다면'이라는 반사실(counterfactual) 질문이 바로 이런 것입니다. 반사실은 아예 관측할 수 없으니 교차 검증(cross validation)도 여기서는 도움이 되지 않습니다. 실제로 준 쿠폰에 대해 일어난 일만 볼 수 있을 뿐, 고객이 다른 금액의 쿠폰을 받았다면 어떻게 되었을지는 알 수 없습니다. 시뮬레이션 데이터가 아니라면 말입니다!\n", "\n", @@ -696,7 +696,7 @@ "source": [ "분석해 보면 쿠폰 금액이 0이나 15일 때는 평균적으로 손해를 보고, 5헤알과 10헤알일 때는 이익을 냅니다. 평균 `net_income`이 가장 높은 것은 5헤알 쿠폰으로, 고객당 약 250헤알의 `net_value`를 냅니다. 그러니 자연스럽게 떠오르는 가장 단순한 시도는 모든 고객에게 5헤알 쿠폰을 주고 결과를 지켜보는 것입니다. 편향 가능성은 완전히 무시하는 셈이지만, 뭐 어떻습니까. 지금은 단순함이 우선입니다!\n", "\n", - "이 정책을 평가할 수 있도록 `ltv_with_coupons` 함수는 데이터베이스에 있는 고객 10,000명 각각에게 줄 쿠폰 금액을 담은 길이 10,000짜리 배열을 인수로 받습니다. 이 배열을 만들려면 `np.ones`로 `coupons` 배열과 같은 크기(10,000)의 1로 채운 배열을 만들고 5를 곱합니다. 그다음 이 배열을 `ltv_with_coupons`에 넘기면, 앞서 본 데이터와 똑같되 모든 쿠폰 금액이 5인 새 데이터셋이 생성됩니다. 이 데이터를 정리하면 새로 제안한 정책에서의 순가치를 구할 수 있습니다." + "이 정책을 평가할 수 있도록 `ltv_with_coupons` 함수는 데이터베이스에 있는 고객 10,000명 각각에게 줄 쿠폰 금액을 담은 길이 10,000짜리 배열을 인수로 받습니다. 이 배열은 `coupons` 배열과 같은 크기(10,000)로 1을 채운 배열을 `np.ones`로 만든 뒤 5를 곱해서 얻습니다. 그다음 이 배열을 `ltv_with_coupons`에 넘기면, 앞서 본 데이터와 똑같되 모든 쿠폰 금액이 5인 새 데이터셋이 생성됩니다. 이 데이터를 정리하면 새로 제안한 정책에서의 순가치를 구할 수 있습니다." ] }, { @@ -1746,11 +1746,11 @@ "\n", "## 예측이라는 망치로 자기 엄지 내리치기\n", "\n", - "짧게 말하면, 답은 이 정책으로 무엇을 원하는지 이해하는 데 있습니다. 바로 쿠폰 금액을 조정해 `net_value`를 최적화하는 것입니다. 그림으로 나타내 보면, `net_value`가 쿠폰에 대해 이차 함수 모양을 띤다고 생각해도 무리는 아닙니다. 쿠폰 금액을 늘리면 `net_value`는 처음에는 증가하다가 최고점에 이릅니다. 그 뒤로는 쿠폰 금액을 더 늘릴수록 그 금액이 가져오는 가치보다 비용이 더 커집니다.\n", + "짧게 말하면, 답은 이 정책으로 무엇을 원하는지 이해하는 데 있습니다. 바로 쿠폰 금액을 조정해 `net_value`를 최적화하는 것입니다. 그림으로 나타내 보면, `net_value`가 쿠폰 금액에 따라 이차 함수 모양을 그린다고 생각해도 무리는 아닙니다. 쿠폰 금액을 늘리면 `net_value`는 처음에는 증가하다가 최고점에 이릅니다. 그 뒤로는 쿠폰 금액을 더 늘릴수록 그 금액이 가져오는 가치보다 비용이 더 커집니다.\n", "\n", "![img](./data/img/when-prediction-fails/opt-deriv.png)\n", "\n", - "그러면 최적의 쿠폰 금액을 찾는 것은 `net_value` 함수의 최댓값을 찾는 것과 같습니다. 함수를 미분하고 그 값을 0으로 두면 됩니다(두 번째 그래프). 경제학자라면 가격 책정 문제임을 알아볼 것입니다. 경제학자들(저를 포함해서)이라면 `net_value`의 함수 형태를 가정하고, 그 함수를 미분해 최적화하는 식으로 이 문제에 접근할 것입니다.\n", + "그러면 최적의 쿠폰 금액을 찾는 것은 `net_value` 함수의 최댓값을 찾는 것과 같습니다. 함수를 미분하고 그 값을 0으로 두면 됩니다(두 번째 그래프). 경제학자라면 가격 책정 문제임을 바로 알아볼 것입니다. (저를 포함한) 경제학자들은 `net_value`의 함수 형태를 가정하고, 그 함수를 미분해 최적화하는 식으로 이 문제에 접근할 것입니다.\n", "\n", "이 접근법에는 큰 장점들이 있지만, 그리 일반적이지 않고 가정을 아주 많이 세워야 한다는 게 제 생각입니다. 안타깝게도 현실 데이터는 미분할 수 있는 함수를 품고 오지 않으니, 대개 어느 정도 짐작이 끼어들 수밖에 없습니다. 더 실용적인(어쩌면 덜 우아한) 방법은 여러 쿠폰 금액을 시험해 보고 어떤 금액이 가장 좋은 `net_value`를 내는지 보는 것입니다. 단순한 정책이 하는 일이 정확히 이것입니다. 과거에 일어난 일을 살펴보고, 가장 유망하다고 드러난 처치를 반복합니다.\n", "\n", @@ -1760,7 +1760,7 @@ "\n", "예측이 좋을수록 이 공간 분할은 목표 변수 `net_income`으로 분할하는 것에 가까워집니다. 그렇게 할 때 무슨 일이 일어나는지 아주 주의 깊게 보세요. 본질적으로 고객을, 예측 대상인 `net_value`가 변하지 않는 집합들로 나누는 셈입니다! 예측 관점에서는 완벽하게 말이 됩니다. 모델이 예측을 잘한다면, 예측값이 같은 점들의 그룹은 `net_value`도 같을 테니까요.\n", "\n", - "여기까지는 좋습니다. 하지만 이렇게 하면 쿠폰에 따른 `net_value` 함수가 어떻게 보이게 되는지(초록색 선) 살펴보세요. 기울기가 전혀 없도록 납작해집니다. 예측 관점에서는 훌륭한 일입니다. 모델이 `net_income`의 변동을 모두 잡아냈다는 뜻이니까요. 하지만 정책 관점에서는 끔찍한 일입니다. 쿠폰 금액에 따라 `net_income`이 어떻게 달라질지 볼 수 있을 만한 변동이 하나도 남지 않기 때문입니다. `net_income`에 이런 변동이 없으면 쿠폰 금액을 바꿔도 `net_income`에 아무 효과가 없는 것처럼 보이고, 최적화할 여지가 사라집니다. 덧붙이자면 이건 여기서 쓰는 특정한 이차 함수 모양과는 상관없는 일반적인 현상입니다. 좀 더 구체적으로 보여 드리려고 예를 든 것뿐입니다.\n", + "여기까지는 좋습니다. 하지만 이렇게 하면 쿠폰에 따른 `net_value` 함수가 어떻게 보이게 되는지(초록색 선) 살펴보세요. 기울기가 하나도 없이 납작해집니다. 예측 관점에서는 훌륭한 일입니다. 모델이 `net_income`의 변동을 모두 잡아냈다는 뜻이니까요. 하지만 정책 관점에서는 끔찍한 일입니다. 쿠폰 금액에 따라 `net_income`이 어떻게 달라질지 볼 수 있을 만한 변동이 하나도 남지 않기 때문입니다. `net_income`에 이런 변동이 없으면 쿠폰 금액을 바꿔도 `net_income`에 아무 효과가 없는 것처럼 보이고, 최적화할 여지가 사라집니다. 덧붙이자면 이건 여기서 쓰는 특정한 이차 함수 모양과는 상관없는 일반적인 현상입니다. 좀 더 구체적으로 보여 드리려고 예를 든 것뿐입니다.\n", "\n", "![img](./data/img/when-prediction-fails/flat-curves.png)\n", "\n", @@ -1786,13 +1786,13 @@ "\n", "![img](./data/img/when-prediction-fails/slice-1.png)\n", "\n", - "이번에는 고객 센터 상담원과 연결되기까지 줄을 서서 기다리는 시간이 고객 만족도에 어떤 영향을 미치는지 알고 싶은 두 번째 경우를 생각해 봅시다. 이 경우 고객 만족도는 대기 시간의 처음 몇 분 동안 꽤 빠르게 떨어집니다. 거의 기다리지 않다가 조금이라도 기다려야 하게 되면 고객은 정말 화가 납니다. 하지만 대기 시간이 길어지면 만족도가 이미 너무 낮아서 그 뒤로는 크게 떨어지지 않습니다. 낮은 수준에서 일종의 포화 상태에 이르는 셈입니다.\n", + "이번에는 두 번째 경우를 생각해 봅시다. 고객 센터 상담원과 연결되기까지 줄을 서서 기다리는 시간이 고객 만족도에 어떤 영향을 미치는지 알고 싶다고 합시다. 이 경우 고객 만족도는 대기 시간의 처음 몇 분 동안 꽤 빠르게 떨어집니다. 거의 기다리지 않다가 조금이라도 기다려야 하게 되면 고객은 정말 화가 납니다. 하지만 대기 시간이 길어지면 만족도가 이미 너무 낮아서 그 뒤로는 크게 떨어지지 않습니다. 낮은 수준에서 일종의 포화 상태에 이르는 셈입니다.\n", "\n", "이 경우가 흥미로운 이유는 $\\frac{\\delta Y}{\\delta T} $와 $Y$의 관계가 크게 바뀌지 않기 때문입니다. 둘은 언제나 음의 상관관계입니다. 대기 시간이 길어지면 만족도는 낮아지고 만족도의 탄력성은 커집니다. 바꿔 말하면 $T$가 커질수록 $\\frac{\\delta Y}{\\delta T} $는 커지고 $Y$는 작아집니다. 이런 경우에는 예측 모델이 쓸모 있을 수 있습니다. 이제는 $Y$축 방향으로 자르면 탄력성이 비슷한 분석단위끼리 묶이기 때문입니다.\n", "\n", "![img](./data/img/when-prediction-fails/slice-2.png)\n", "\n", - "좀 더 일반적으로 말하면, 탄력성이 결과와 대략 같은 방향으로 변하는 함수 형태라면 예측 모델로도 그럭저럭 넘어갈 수 있습니다. 하지만 여기서 조심하세요. 그렇다고 예측 모델이 최선의 선택이라거나 인과 문제에 예측 모델을 써야 한다는 뜻은 아닙니다. 인과적 목표에 통하는 예측 모델을 보게 되었을 때 무슨 일이 일어나고 있는지 이해할 수 있도록 짚어 둘 뿐입니다." + "좀 더 일반적으로 말하면, 탄력성이 결과와 대략 같은 방향으로 변하는 함수 형태라면 예측 모델로도 그럭저럭 넘어갈 수 있습니다. 하지만 여기서 조심하세요. 그렇다고 예측 모델이 최선의 선택이라거나 인과 문제에 예측 모델을 써야 한다는 뜻은 아닙니다. 인과적 목표에 통하는 예측 모델을 만났을 때 무슨 일이 일어나는지 이해할 수 있도록 짚어 둘 뿐입니다." ] }, { @@ -1815,9 +1815,9 @@ "\n", "![img](./data/img/when-prediction-fails/graph-2.png)\n", "\n", - "모델 $M(X)$에서 처치 $T$를 빼는 것만으로는 모델이 $T$와 $Y$의 관계를 무시하게 만들 수 없습니다. $X$가 $T$를 일으키므로 모델은 $X$를 통해 $T$를 간접적으로 학습할 수 있습니다. 모델이 왜 그렇게 할까요? $T$가 $Y$를 일으키고 $M$은 $Y$를 최대한 잘 예측하려 하므로, $T$를 $Y$와 이어 주는 $X$ 속 패턴을 어떻게든 활용할 수밖에 없기 때문입니다. 다시 말해 처치가 결과에 어떻게 영향을 미치는지에 관한 정보가 특성을 거쳐 거꾸로 모델로 흘러 들어갑니다. 예를 들어 도시의 특정 지역($X$)에 사는 고객에게만 할인($T$)을 준다고 해 봅시다. 논의를 위해 지역 자체는 매출($Y$)에 아무 영향도 주지 않는다고 가정하겠습니다. 그렇더라도 지역이 $T$를 일으키고, 그 할인이 다시 $Y$를 일으키므로 여전히 예측력을 가집니다. 따라서 모델은 $Y$를 예측하려고 이 사실을 활용할 것입니다.\n", + "모델 $M(X)$에서 처치 $T$를 빼는 것만으로는 모델이 $T$와 $Y$의 관계를 무시하게 만들 수 없습니다. $X$가 $T$를 일으키므로 모델은 $X$를 통해 $T$를 간접적으로 학습할 수 있습니다. 모델이 왜 그렇게 할까요? $T$가 $Y$를 일으키고 $M$은 $Y$를 최대한 잘 예측하려 하므로, $T$를 $Y$와 이어 주는 $X$ 속 패턴을 어떻게든 활용할 수밖에 없기 때문입니다. 다시 말해 처치가 결과에 어떻게 영향을 미치는지에 관한 정보가 특성을 거쳐 거꾸로 모델로 흘러 들어갑니다. 예를 들어 도시의 특정 지역($X$)에 사는 고객에게만 할인($T$)을 준다고 해 봅시다. 논의를 위해 지역 자체는 매출($Y$)에 아무 영향도 주지 않는다고 가정하겠습니다. 그렇더라도 지역은 $T$를 일으키고 그 할인이 다시 $Y$를 일으키므로, 여전히 예측력을 가집니다. 따라서 모델은 $Y$를 예측하려고 이 사실을 활용할 것입니다.\n", "\n", - "이 주장을 공정하게 평가하자면, $T$를 주지 않는 것으로 모델을 조금은 속일 수 있습니다. 직접 확인하고 싶다면 예제 코드를 다시 실행하되 이번에는 예측 모델의 특성 목록에 `coupons`를 넣어 보세요. 모델 정책의 성과가 더 나빠질 것입니다. 즉, 모델에 $T$를 주지 않는 것이 많지는 않아도 어느 정도 도움이 된다는 뜻입니다.\n", + "이 주장의 편을 조금 들어 주자면, $T$를 주지 않는 것으로 모델을 조금은 속일 수 있습니다. 직접 확인하고 싶다면 예제 코드를 다시 실행하되 이번에는 예측 모델의 특성 목록에 `coupons`를 넣어 보세요. 모델 정책의 성과가 더 나빠질 것입니다. 즉, 모델에 $T$를 주지 않는 것이 많지는 않아도 어느 정도 도움이 된다는 뜻입니다.\n", "\n", "마지막으로, 여기서 빠져나갈 방법이 하나 있습니다. $T$가 무작위일 때입니다. 그 아주 특별한 경우에는 예측 모델이 실제로 인과추론에 도움이 될 수 있습니다. 하지만 먼저 왜 해가 되지 않는지부터 이해해 봅시다. $T$가 무작위라면 $X$에서 오는 교란이 모두 배제됩니다. 이 경우 $X$에는 $T$가 어떻게 정해지는지에 관한 정보가 전혀 없습니다.\n", "\n", @@ -1846,7 +1846,7 @@ "\n", "여기 쓴 내용은 대부분 제 머릿속에서 나온 것입니다. 경험으로 배운 것들입니다. 그래서 직접 소개할 참고 문헌이 없습니다. 이는 좋은 과학이라면 보통 거치는 학계의 엄밀한 검증을 이 내용이 통과하지 **않았다**는 뜻이기도 합니다. 대신 실무에서 통하는 것들을 이야기하면서도 왜 그런지 설명하는 데는 시간을 많이 들이지 않았다는 점을 눈여겨보세요. 말하자면 길거리 과학인 셈입니다. 하지만 이 내용을 공개해 누구나 검토할 수 있게 해 두었으니, 터무니없는 내용을 발견하면 주저하지 말고 이슈를 열어 주세요. 최선을 다해 답하겠습니다.\n", "\n", - "이 장에 대해서는 알려 드릴 자료가 많지 않습니다. 인과추론으로 풀려는 개인화 문제를 정식화한 훌륭한 논문 하나가 있을 뿐입니다. *Recursive Partitioning for Heterogeneous Causal Effects, Susan Athey and Guido Imbens, 2016*. 그리고 첫 번째 이미지는 Siraj Raval의 유튜브 영상에서 가져왔습니다.\n", + "이 장과 관련해 소개할 자료는 많지 않습니다. 인과추론으로 풀려는 개인화 문제를 정식화한 훌륭한 논문 하나가 있을 뿐입니다. *Recursive Partitioning for Heterogeneous Causal Effects, Susan Athey and Guido Imbens, 2016*. 그리고 첫 번째 이미지는 Siraj Raval의 유튜브 영상에서 가져왔습니다.\n", "\n", "## 기여하기\n", "\n", From 38eaf3ee465cb90726fb14a5f0f8cb38a71c75b7 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 18 Oct 2026 17:12:45 +0000 Subject: [PATCH 5/7] Smooth two long sentence endings in chapter 5 --- ...-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/causal-inference-for-the-brave-and-true/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb b/causal-inference-for-the-brave-and-true/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb index 38695ab..5667fcd 100644 --- a/causal-inference-for-the-brave-and-true/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb +++ b/causal-inference-for-the-brave-and-true/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb @@ -263,7 +263,7 @@ "\\kappa = \\dfrac{Cov(Y_i, \\tilde{T_i})}{Var(\\tilde{T_i})} \n", "$\n", "\n", - "여기서 $\\tilde{T_i}$는 $T_i$를 다른 모든 공변량(covariate) $X_{1i}, ..., X_{ki}$에 회귀해서 얻은 잔차(residual)입니다. 이게 얼마나 멋진 일인지 잠시 음미해 봅시다. 다중회귀의 계수가 **모델에 있는 다른 변수들의 영향을 고려한 뒤** 같은 설명변수로 구한 이변량(bivariate) 계수와 같다는 뜻이니까요. 인과추론의 언어로 말하면, $\\kappa$는 다른 모든 변수로 처치를 예측하고 난 뒤에 구한 $T$의 이변량 계수입니다.\n", + "여기서 $\\tilde{T_i}$는 $T_i$를 다른 모든 공변량(covariate) $X_{1i}, ..., X_{ki}$에 회귀해서 얻은 잔차(residual)입니다. 이게 얼마나 멋진 일인지 잠시 음미해 봅시다. 다중회귀의 계수가 **모델에 있는 다른 변수들의 영향을 고려한 뒤** 같은 설명변수로 구한 이변량(bivariate) 계수와 같다는 뜻이기 때문입니다. 인과추론의 언어로 말하면, $\\kappa$는 다른 모든 변수로 처치를 예측하고 난 뒤에 구한 $T$의 이변량 계수입니다.\n", "\n", "여기에는 좋은 직관이 담겨 있습니다. 다른 변수로 $T$를 예측할 수 있다면 처치가 무작위가 아니라는 뜻입니다. 하지만 사용할 수 있는 다른 변수들을 통제하고 나면 $T$를 무작위나 다름없게 만들 수 있습니다. 그러려면 선형회귀로 다른 변수들에서 처치를 예측한 다음, 그 회귀의 잔차 $\\tilde{T}$를 구하면 됩니다. 정의상 $\\tilde{T}$는 $T$를 예측하는 데 이미 쓴 다른 변수 $X$로는 예측할 수 없습니다. 아주 깔끔하게도, $\\tilde{T}$는 $X$의 어떤 변수와도 연관되지 않도록 걸러 낸 처치입니다.\n", "\n", @@ -407,7 +407,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "$\\beta_1$의 추정값은 0.0536이고, 95% 신뢰구간은 (0.039, 0.068)입니다. 이 모델은 교육 연수가 1년 늘 때마다 임금이 약 5.3% 오른다고 예측합니다. 이렇게 비율로 늘어난다는 점은 교육이 임금에 지수적으로 영향을 준다는 믿음과도 맞아떨어집니다. 교육 연수가 11년에서 12년이 될 때(보통 고등학교를 졸업하는 시점)보다 14년에서 16년이 될 때(보통 대학교를 졸업하는 시점) 얻는 보상이 더 크리라고 예상하니까요." + "$\\beta_1$의 추정값은 0.0536이고, 95% 신뢰구간은 (0.039, 0.068)입니다. 이 모델은 교육 연수가 1년 늘 때마다 임금이 약 5.3% 오른다고 예측합니다. 이렇게 비율로 늘어난다는 점은 교육이 임금에 지수적으로 영향을 준다는 믿음과도 맞아떨어집니다. 교육 연수가 11년에서 12년이 될 때(보통 고등학교를 졸업하는 시점)보다 14년에서 16년이 될 때(보통 대학교를 졸업하는 시점) 얻는 보상이 더 크리라고 예상하기 때문입니다." ] }, { From bb7b99c6a69dd2c747f83326f3b44e034f79867e Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 18 Oct 2026 17:12:45 +0000 Subject: [PATCH 6/7] Tighten chapter title spacing, shorten mobile breadcrumb, add back-to-top link --- book/_quarto.yml | 1 + book/styles.scss | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/book/_quarto.yml b/book/_quarto.yml index cc4c66c..a0704aa 100644 --- a/book/_quarto.yml +++ b/book/_quarto.yml @@ -110,6 +110,7 @@ format: html-math-method: mathjax df-print: default link-external-newwindow: true + back-to-top-navigation: true include-after-body: sidebar-resize.html include-in-header: - text: | diff --git a/book/styles.scss b/book/styles.scss index 72617ee..d70bbd7 100644 --- a/book/styles.scss +++ b/book/styles.scss @@ -682,3 +682,36 @@ mjx-container[display="true"] { overflow-y: hidden; max-width: 100%; } + +// 장 제목: 번호 배지와 제목 사이 간격을 줄이고 배지를 제목 크기에 맞춤 +h1.title { + display: flex; + align-items: center; + flex-wrap: wrap; + column-gap: 0.15em; +} + +h1.title .chapter-number { + margin-right: 0.2em; + font-size: 0.8em; +} + +// 모바일 상단 경로: 부 이름은 숨기고 장 제목만 한 줄로 +@media (max-width: 991.98px) { + .quarto-secondary-nav .breadcrumb { + flex-wrap: nowrap; + overflow: hidden; + } + .quarto-secondary-nav .breadcrumb-item:not(:last-child) { + display: none; + } + .quarto-secondary-nav .breadcrumb-item:last-child { + padding-left: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + .quarto-secondary-nav .breadcrumb-item:last-child::before { + display: none; + } +} From 8f6143faf6455d0ec67bceb91c58afc620e856e1 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 18 Oct 2026 17:16:41 +0000 Subject: [PATCH 7/7] Link README chapter table to web book pages only --- README.md | 74 +++++++++++++++++++++++++++---------------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index d252491..f404c20 100644 --- a/README.md +++ b/README.md @@ -22,52 +22,52 @@ Matheus Facure의 [Causal Inference for The Brave and True](https://matheusfacur ## 목차 -원서 1부와 2부의 25개 장, 부록 5편을 모두 옮겼습니다. 제목을 누르면 웹북으로, '노트북'을 누르면 원고 파일로 이동합니다. +원서 1부와 2부의 25개 장, 부록 5편을 모두 옮겼습니다. 제목을 누르면 웹북의 해당 장으로 바로 이동합니다. ### 1부 인과추론의 기초 -| 장 | 제목 | 원고 | 최초 번역 | 번역 담당자 | -|:-:|---|:-:|:-:|---| -| 1 | [인과추론 소개](https://causalinferencelab.github.io/Causal-Inference-with-Python/01-Introduction-To-Causality.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/01-Introduction-To-Causality.ipynb) | 2022-08-20 | [신진수](https://github.com/jsshin2022) | -| 2 | [무작위 실험](https://causalinferencelab.github.io/Causal-Inference-with-Python/02-Randomised-Experiments.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/02-Randomised-Experiments.ipynb) | 2022-12-04 | [최은희](https://github.com/EunHuiChoi) | -| 3 | [통계 복습: 가장 위험한 수식](https://causalinferencelab.github.io/Causal-Inference-with-Python/03-Stats-Review-The-Most-Dangerous-Equation.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/03-Stats-Review-The-Most-Dangerous-Equation.ipynb) | 2022-11-10 | [김준영](https://github.com/CptAswadu) | -| 4 | [그래프 인과 모델](https://causalinferencelab.github.io/Causal-Inference-with-Python/04-Graphical-Causal-Models.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/04-Graphical-Causal-Models.ipynb) | 2022-11-23 | [김소희](https://github.com/soheekim911) | -| 5 | [선형회귀의 터무니없는 효과](https://causalinferencelab.github.io/Causal-Inference-with-Python/05-The-Unreasonable-Effectiveness-of-Linear-Regression.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb) | 2022-11-23 | [남궁민상](https://github.com/wholmesian) | -| 6 | [그룹 회귀와 더미 회귀](https://causalinferencelab.github.io/Causal-Inference-with-Python/06-Grouped-and-Dummy-Regression.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/06-Grouped-and-Dummy-Regression.ipynb) | 2022-11-05 | [정호재](https://github.com/wjdghwo) | -| 7 | [교란 요인을 넘어서](https://causalinferencelab.github.io/Causal-Inference-with-Python/07-Beyond-Confounders.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/07-Beyond-Confounders.ipynb) | 2022-11-26 | [김상돈](https://github.com/SANGDONKIM) | -| 8 | [도구변수](https://causalinferencelab.github.io/Causal-Inference-with-Python/08-Instrumental-Variables.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/08-Instrumental-Variables.ipynb) | 2022-12-04 | [최은희](https://github.com/EunHuiChoi) | -| 9 | [불응과 LATE](https://causalinferencelab.github.io/Causal-Inference-with-Python/09-Non-Compliance-and-LATE.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/09-Non-Compliance-and-LATE.ipynb) | 2022-11-19 | [김성수](https://github.com/fenzhantw) | -| 10 | [매칭](https://causalinferencelab.github.io/Causal-Inference-with-Python/10-Matching.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/10-Matching.ipynb) | 2022-11-04 | [김상돈](https://github.com/SANGDONKIM) | -| 11 | [성향점수](https://causalinferencelab.github.io/Causal-Inference-with-Python/11-Propensity-Score.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/11-Propensity-Score.ipynb) | 2022-11-11 | [김성수](https://github.com/fenzhantw) | -| 12 | [이중 강건 추정](https://causalinferencelab.github.io/Causal-Inference-with-Python/12-Doubly-Robust-Estimation.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/12-Doubly-Robust-Estimation.ipynb) | 2022-10-28 | [홍성철](https://github.com/chulhongsung) | -| 13 | [이중차분법](https://causalinferencelab.github.io/Causal-Inference-with-Python/13-Difference-in-Differences.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/13-Difference-in-Differences.ipynb) | 2022-08-27 | [신진수](https://github.com/jsshin2022) | -| 14 | [패널데이터와 고정효과](https://causalinferencelab.github.io/Causal-Inference-with-Python/14-Panel-Data-and-Fixed-Effects.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/14-Panel-Data-and-Fixed-Effects.ipynb) | 2022-11-26 | [신진수](https://github.com/jsshin2022) | -| 15 | [통제집단합성법](https://causalinferencelab.github.io/Causal-Inference-with-Python/15-Synthetic-Control.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/15-Synthetic-Control.ipynb) | 2022-09-03 | [정호재](https://github.com/wjdghwo) | -| 16 | [회귀 불연속 설계](https://causalinferencelab.github.io/Causal-Inference-with-Python/16-Regression-Discontinuity-Design.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/16-Regression-Discontinuity-Design.ipynb) | 2022-11-22 | [남궁민상](https://github.com/wholmesian) | +| 장 | 제목 | 최초 번역 | 번역 담당자 | +|:-:|---|:-:|---| +| 1 | [인과추론 소개](https://causalinferencelab.github.io/Causal-Inference-with-Python/01-Introduction-To-Causality.html) | 2022-08-20 | [신진수](https://github.com/jsshin2022) | +| 2 | [무작위 실험](https://causalinferencelab.github.io/Causal-Inference-with-Python/02-Randomised-Experiments.html) | 2022-12-04 | [최은희](https://github.com/EunHuiChoi) | +| 3 | [통계 복습: 가장 위험한 수식](https://causalinferencelab.github.io/Causal-Inference-with-Python/03-Stats-Review-The-Most-Dangerous-Equation.html) | 2022-11-10 | [김준영](https://github.com/CptAswadu) | +| 4 | [그래프 인과 모델](https://causalinferencelab.github.io/Causal-Inference-with-Python/04-Graphical-Causal-Models.html) | 2022-11-23 | [김소희](https://github.com/soheekim911) | +| 5 | [선형회귀의 터무니없는 효과](https://causalinferencelab.github.io/Causal-Inference-with-Python/05-The-Unreasonable-Effectiveness-of-Linear-Regression.html) | 2022-11-23 | [남궁민상](https://github.com/wholmesian) | +| 6 | [그룹 회귀와 더미 회귀](https://causalinferencelab.github.io/Causal-Inference-with-Python/06-Grouped-and-Dummy-Regression.html) | 2022-11-05 | [정호재](https://github.com/wjdghwo) | +| 7 | [교란 요인을 넘어서](https://causalinferencelab.github.io/Causal-Inference-with-Python/07-Beyond-Confounders.html) | 2022-11-26 | [김상돈](https://github.com/SANGDONKIM) | +| 8 | [도구변수](https://causalinferencelab.github.io/Causal-Inference-with-Python/08-Instrumental-Variables.html) | 2022-12-04 | [최은희](https://github.com/EunHuiChoi) | +| 9 | [불응과 LATE](https://causalinferencelab.github.io/Causal-Inference-with-Python/09-Non-Compliance-and-LATE.html) | 2022-11-19 | [김성수](https://github.com/fenzhantw) | +| 10 | [매칭](https://causalinferencelab.github.io/Causal-Inference-with-Python/10-Matching.html) | 2022-11-04 | [김상돈](https://github.com/SANGDONKIM) | +| 11 | [성향점수](https://causalinferencelab.github.io/Causal-Inference-with-Python/11-Propensity-Score.html) | 2022-11-11 | [김성수](https://github.com/fenzhantw) | +| 12 | [이중 강건 추정](https://causalinferencelab.github.io/Causal-Inference-with-Python/12-Doubly-Robust-Estimation.html) | 2022-10-28 | [홍성철](https://github.com/chulhongsung) | +| 13 | [이중차분법](https://causalinferencelab.github.io/Causal-Inference-with-Python/13-Difference-in-Differences.html) | 2022-08-27 | [신진수](https://github.com/jsshin2022) | +| 14 | [패널데이터와 고정효과](https://causalinferencelab.github.io/Causal-Inference-with-Python/14-Panel-Data-and-Fixed-Effects.html) | 2022-11-26 | [신진수](https://github.com/jsshin2022) | +| 15 | [통제집단합성법](https://causalinferencelab.github.io/Causal-Inference-with-Python/15-Synthetic-Control.html) | 2022-09-03 | [정호재](https://github.com/wjdghwo) | +| 16 | [회귀 불연속 설계](https://causalinferencelab.github.io/Causal-Inference-with-Python/16-Regression-Discontinuity-Design.html) | 2022-11-22 | [남궁민상](https://github.com/wholmesian) | ### 2부 인과추론의 실무 응용 -| 장 | 제목 | 원고 | 최초 번역 | 번역 담당자 | -|:-:|---|:-:|:-:|---| -| 17 | [예측 모델 101](https://causalinferencelab.github.io/Causal-Inference-with-Python/17-Predictive-Models-101.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/17-Predictive-Models-101.ipynb) | 2023-02-13 | [최은희](https://github.com/EunHuiChoi) | -| 18 | [이질적 처치효과와 개인화](https://causalinferencelab.github.io/Causal-Inference-with-Python/18-Heterogeneous-Treatment-Effects-and-Personalization.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/18-Heterogeneous-Treatment-Effects-and-Personalization.ipynb) | 2023-02-20 | [김소희](https://github.com/soheekim911) | -| 19 | [인과 모델 평가](https://causalinferencelab.github.io/Causal-Inference-with-Python/19-Evaluating-Causal-Models.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/19-Evaluating-Causal-Models.ipynb) | 2023-08-13 | [김성수](https://github.com/fenzhantw) | -| 20 | [플러그 앤 플레이 추정량](https://causalinferencelab.github.io/Causal-Inference-with-Python/20-Plug-and-Play-Estimators.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/20-Plug-and-Play-Estimators.ipynb) | 2023-06-22 | [남궁민상](https://github.com/wholmesian) | -| 21 | [메타러너](https://causalinferencelab.github.io/Causal-Inference-with-Python/21-Meta-Learners.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/21-Meta-Learners.ipynb) | 2023-12-31 | [박병수](https://github.com/Hinterhalter) | -| 22 | [편향 제거/직교화 머신러닝](https://causalinferencelab.github.io/Causal-Inference-with-Python/22-Debiased-Orthogonal-Machine-Learning.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/22-Debiased-Orthogonal-Machine-Learning.ipynb) | 2023-11-03 | [홍성철](https://github.com/chulhongsung) | -| 23 | [효과 이질성과 비선형성](https://causalinferencelab.github.io/Causal-Inference-with-Python/23-Challenges-with-Effect-Heterogeneity-and-Nonlinearity.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/23-Challenges-with-Effect-Heterogeneity-and-Nonlinearity.ipynb) | 2024-01-10 | [임종언](https://github.com/limjongun95) | -| 24 | [이중차분법 사가](https://causalinferencelab.github.io/Causal-Inference-with-Python/24-The-Diff-in-Diff-Saga.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/24-The-Diff-in-Diff-Saga.ipynb) | 2023-06-26 | [박시온](https://github.com/rockgoat95) | -| 25 | [합성 이중차분법](https://causalinferencelab.github.io/Causal-Inference-with-Python/25-Synthetic-Diff-in-Diff.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/25-Synthetic-Diff-in-Diff.ipynb) | 2026-10-18 | [신진수](https://github.com/jsshin2022) | +| 장 | 제목 | 최초 번역 | 번역 담당자 | +|:-:|---|:-:|---| +| 17 | [예측 모델 101](https://causalinferencelab.github.io/Causal-Inference-with-Python/17-Predictive-Models-101.html) | 2023-02-13 | [최은희](https://github.com/EunHuiChoi) | +| 18 | [이질적 처치효과와 개인화](https://causalinferencelab.github.io/Causal-Inference-with-Python/18-Heterogeneous-Treatment-Effects-and-Personalization.html) | 2023-02-20 | [김소희](https://github.com/soheekim911) | +| 19 | [인과 모델 평가](https://causalinferencelab.github.io/Causal-Inference-with-Python/19-Evaluating-Causal-Models.html) | 2023-08-13 | [김성수](https://github.com/fenzhantw) | +| 20 | [플러그 앤 플레이 추정량](https://causalinferencelab.github.io/Causal-Inference-with-Python/20-Plug-and-Play-Estimators.html) | 2023-06-22 | [남궁민상](https://github.com/wholmesian) | +| 21 | [메타러너](https://causalinferencelab.github.io/Causal-Inference-with-Python/21-Meta-Learners.html) | 2023-12-31 | [박병수](https://github.com/Hinterhalter) | +| 22 | [편향 제거/직교화 머신러닝](https://causalinferencelab.github.io/Causal-Inference-with-Python/22-Debiased-Orthogonal-Machine-Learning.html) | 2023-11-03 | [홍성철](https://github.com/chulhongsung) | +| 23 | [효과 이질성과 비선형성](https://causalinferencelab.github.io/Causal-Inference-with-Python/23-Challenges-with-Effect-Heterogeneity-and-Nonlinearity.html) | 2024-01-10 | [임종언](https://github.com/limjongun95) | +| 24 | [이중차분법 사가](https://causalinferencelab.github.io/Causal-Inference-with-Python/24-The-Diff-in-Diff-Saga.html) | 2023-06-26 | [박시온](https://github.com/rockgoat95) | +| 25 | [합성 이중차분법](https://causalinferencelab.github.io/Causal-Inference-with-Python/25-Synthetic-Diff-in-Diff.html) | 2026-10-18 | [신진수](https://github.com/jsshin2022) | ### 부록 -| 장 | 제목 | 원고 | 최초 번역 | 번역 담당자 | -|:-:|---|:-:|:-:|---| -| A | [직교화로 편향 제거하기](https://causalinferencelab.github.io/Causal-Inference-with-Python/Debiasing-with-Orthogonalization.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/Debiasing-with-Orthogonalization.ipynb) | 2026-10-18 | [신진수](https://github.com/jsshin2022) | -| B | [성향점수로 편향 제거하기](https://causalinferencelab.github.io/Causal-Inference-with-Python/Debiasing-with-Propensity-Score.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/Debiasing-with-Propensity-Score.ipynb) | 2026-10-18 | [신진수](https://github.com/jsshin2022) | -| C | [예측이 실패할 때](https://causalinferencelab.github.io/Causal-Inference-with-Python/When-Prediction-Fails.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/When-Prediction-Fails.ipynb) | 2026-10-18 | [신진수](https://github.com/jsshin2022) | -| D | [예측 지표가 인과 모델에 위험한 이유](https://causalinferencelab.github.io/Causal-Inference-with-Python/Prediction-Metrics-For-Causal-Models.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/Prediction-Metrics-For-Causal-Models.ipynb) | 2026-10-18 | [신진수](https://github.com/jsshin2022) | -| E | [통제집단합성법의 컨포멀 추론](https://causalinferencelab.github.io/Causal-Inference-with-Python/Conformal-Inference-for-Synthetic-Control.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/Conformal-Inference-for-Synthetic-Control.ipynb) | 2026-10-18 | [신진수](https://github.com/jsshin2022) | +| 장 | 제목 | 최초 번역 | 번역 담당자 | +|:-:|---|:-:|---| +| A | [직교화로 편향 제거하기](https://causalinferencelab.github.io/Causal-Inference-with-Python/Debiasing-with-Orthogonalization.html) | 2026-10-18 | [신진수](https://github.com/jsshin2022) | +| B | [성향점수로 편향 제거하기](https://causalinferencelab.github.io/Causal-Inference-with-Python/Debiasing-with-Propensity-Score.html) | 2026-10-18 | [신진수](https://github.com/jsshin2022) | +| C | [예측이 실패할 때](https://causalinferencelab.github.io/Causal-Inference-with-Python/When-Prediction-Fails.html) | 2026-10-18 | [신진수](https://github.com/jsshin2022) | +| D | [예측 지표가 인과 모델에 위험한 이유](https://causalinferencelab.github.io/Causal-Inference-with-Python/Prediction-Metrics-For-Causal-Models.html) | 2026-10-18 | [신진수](https://github.com/jsshin2022) | +| E | [통제집단합성법의 컨포멀 추론](https://causalinferencelab.github.io/Causal-Inference-with-Python/Conformal-Inference-for-Synthetic-Control.html) | 2026-10-18 | [신진수](https://github.com/jsshin2022) |