diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..96e3880
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,31 @@
+# 기여 안내
+
+번역을 고치거나 웹북을 손보려는 분을 위한 안내입니다. 읽기만 하신다면 [웹북](https://causalinferencelab.github.io/Causal-Inference-with-Python/)으로 가시면 됩니다.
+
+## 번역 고치기
+
+1. [번역 가이드](TRANSLATION_GUIDE.md)의 원칙과 용어표를 먼저 읽습니다.
+2. 원고는 `causal-inference-for-the-brave-and-true/` 폴더의 노트북입니다. 마크다운 셀만 고치고, 코드 셀·출력·수식·링크 주소는 그대로 둡니다.
+3. PR을 올리면 GitHub Actions가 웹북을 빌드해 확인합니다. 메인테이너 검토 뒤 머지되면 웹북에 반영됩니다.
+
+용어를 바꾸거나 더하고 싶다면 [용어 제안 이슈](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/issues/new?template=term-proposal.yml)로 먼저 의견을 나눠 주세요.
+
+## 웹북 빌드와 미리 보기
+
+웹북은 [Quarto](https://quarto.org/) Book으로 만듭니다. `main`에 머지되면 GitHub Actions(`.github/workflows/book.yml`)가 빌드해 GitHub Pages에 배포합니다. PR에서는 빌드만 확인하며, 결과물은 Actions의 `book-preview` 아티팩트로 내려받아 볼 수 있습니다.
+
+로컬에서 미리 보려면 Quarto를 설치한 뒤 다음을 실행하세요. 노트북은 다시 실행하지 않고 저장된 출력을 그대로 씁니다.
+
+```bash
+pip install jupyter
+python book/prepare.py
+cd book && quarto preview
+```
+
+`book/prepare.py`는 빌드할 때 [번역 가이드](TRANSLATION_GUIDE.md)의 용어표로 웹북의 '용어집' 페이지를 만들고, `book/postrender.py`는 렌더링이 끝난 뒤 웹북 검색 색인(`search-index.json`)을 만듭니다. `book/prepare.py`는 빌드할 때만 장 제목, 수식 표기, 접힌 코드, 옮긴이 주 상자를 책 형식으로 바꿉니다. 그래서 노트북은 원서와 같은 구조로 두면 됩니다.
+
+읽기 기능(읽은 장 기록, 이어 읽기, 장 끝 평가, 허브로 가는 링크)은 `book/reader.html`, GA4 설정은 `book/analytics.html`에 있습니다. 읽은 장 기록은 독자의 브라우저(`localStorage`의 `cil-book-*`)에만 남고, 같은 도메인의 [Causal Inference Hub](https://causalinferencelab.github.io/)가 이 기록으로 진도와 활동 여권 스탬프를 보여 줍니다.
+
+## 원서 변경 반영 (메인테이너)
+
+원서가 바뀌면 GitHub Actions(`Upstream watch`)가 매월 1일 확인해 바뀐 장과 본문 변경을 정리한 이슈를 메인테이너에게 배정합니다. 번역을 고친 PR이 메인테이너 검토를 거쳐 머지되면 웹북에 반영되고 이슈는 자동으로 닫힙니다. 자세한 절차는 [번역 가이드](TRANSLATION_GUIDE.md#5-원서-변경-반영)에 있습니다.
diff --git a/README.md b/README.md
index 0cc15e7..61c0043 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,6 @@ Matheus Facure의 [Causal Inference for The Brave and True](https://matheusfacur
-
@@ -75,7 +74,7 @@ Matheus Facure의 [Causal Inference for The Brave and True](https://matheusfacur
| 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) |
+| 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) |
### 부록
@@ -100,7 +99,7 @@ Matheus Facure의 [Causal Inference for The Brave and True](https://matheusfacur
- 용어와 문체를 『실무로 통하는 인과추론 with 파이썬』 기준으로 통일했습니다.
- 원문의 오류는 본문과 수식을 고치지 않고 옮긴이 주로 짚었습니다. 뜻이 분명한 오타만 바로잡고 그 사실을 주에 밝혔습니다.
-자세한 원칙과 용어표는 [번역 가이드](TRANSLATION_GUIDE.md)에 있습니다.
+원서가 바뀌면 매달 확인해 한국어판에 반영합니다. 자세한 원칙과 용어표는 [번역 가이드](TRANSLATION_GUIDE.md)에 있습니다.
@@ -108,35 +107,12 @@ Matheus Facure의 [Causal Inference for The Brave and True](https://matheusfacur
- 웹북의 각 장 끝 '의견 나누기'에서 GitHub 계정으로 로그인해 댓글을 남길 수 있습니다. 댓글은 장별로 [GitHub Discussions](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/discussions)에 모입니다.
- 오역, 오탈자, 깨진 수식이나 그림은 [이슈](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/issues)로 알려 주세요.
-- 직접 고치고 싶다면 [번역 가이드](TRANSLATION_GUIDE.md)를 읽고 PR을 보내 주세요. 원고는 `causal-inference-for-the-brave-and-true/` 폴더의 노트북입니다.
+- 직접 고치고 싶다면 [번역 가이드](TRANSLATION_GUIDE.md)와 [기여 안내](CONTRIBUTING.md)를 읽고 PR을 보내 주세요. 원고는 `causal-inference-for-the-brave-and-true/` 폴더의 노트북입니다.
+- 더 나은 번역어가 있다면 [용어 제안](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/issues/new?template=term-proposal.yml)으로 알려 주세요.
- 그 밖의 문의는 메인테이너 [신진수](https://github.com/jsshin2022)에게 부탁드립니다.
-## 웹북 빌드
-
-웹북은 [Quarto](https://quarto.org/) Book으로 만듭니다. `main`에 머지되면 GitHub Actions(`.github/workflows/book.yml`)가 빌드해 GitHub Pages에 배포합니다. PR에서는 빌드만 확인하며, 결과물은 Actions의 `book-preview` 아티팩트로 내려받아 볼 수 있습니다.
-
-로컬에서 미리 보려면 Quarto를 설치한 뒤 다음을 실행하세요. 노트북은 다시 실행하지 않고 저장된 출력을 그대로 씁니다.
-
-```bash
-pip install jupyter
-python book/prepare.py
-cd book && quarto preview
-```
-
-`book/prepare.py`는 빌드할 때 [번역 가이드](TRANSLATION_GUIDE.md)의 용어표로 웹북의 '용어집' 페이지를 만들고, `book/postrender.py`는 렌더링이 끝난 뒤 웹북 검색 색인(`search-index.json`)을 만듭니다. `book/prepare.py`는 빌드할 때만 장 제목, 수식 표기, 접힌 코드, 옮긴이 주 상자를 책 형식으로 바꿉니다. 그래서 노트북은 원서와 같은 구조로 두면 됩니다.
-
-읽기 기능(읽은 장 기록, 이어 읽기, 장 끝 평가, 허브로 가는 링크)은 `book/reader.html`, GA4 설정은 `book/analytics.html`에 있습니다. 읽은 장 기록은 독자의 브라우저(`localStorage`의 `cil-book-*`)에만 남고, 같은 도메인의 [Causal Inference Hub](https://causalinferencelab.github.io/)가 이 기록으로 진도와 활동 여권 스탬프를 보여 줍니다.
-
-
-
-## 원서 변경 반영
-
-원서가 바뀌면 GitHub Actions(`Upstream watch`)가 매월 1일 확인해 바뀐 장과 본문 변경을 정리한 이슈를 메인테이너에게 배정합니다. 번역을 고친 PR이 메인테이너 검토를 거쳐 머지되면 웹북에 반영되고 이슈는 자동으로 닫힙니다. 자세한 절차는 [번역 가이드](TRANSLATION_GUIDE.md#5-원서-변경-반영)에 있습니다.
-
-
-
## 감사의 말
한국어 번역을 흔쾌히 허락해 준 Matheus Facure에게 감사드립니다. 번역과 실습 자료를 함께 만든 인과추론팀 멤버들에게도 고마운 마음을 전합니다.
diff --git a/book/_quarto.yml b/book/_quarto.yml
index ecaa661..210e110 100644
--- a/book/_quarto.yml
+++ b/book/_quarto.yml
@@ -37,7 +37,7 @@ book:
collapse-level: 3
header: |
←Causal Inference Hub인과추론팀 커리큘럼과 오픈소스
-
+
diff --git a/book/index.qmd b/book/index.qmd
index f606431..9a5bb6f 100644
--- a/book/index.qmd
+++ b/book/index.qmd
@@ -7,16 +7,11 @@ aliases:
```{=html}
diff --git a/book/prepare.py b/book/prepare.py
index 15754ac..867fba8 100644
--- a/book/prepare.py
+++ b/book/prepare.py
@@ -48,7 +48,7 @@
"21-Meta-Learners": "메타러너",
"22-Debiased-Orthogonal-Machine-Learning": "편향 제거/직교화 머신러닝",
"23-Challenges-with-Effect-Heterogeneity-and-Nonlinearity": "효과 이질성과 비선형성",
- "24-The-Diff-in-Diff-Saga": "이중차분법 사가",
+ "24-The-Diff-in-Diff-Saga": "이중차분법 시리즈",
"25-Synthetic-Diff-in-Diff": "합성 이중차분법",
"Debiasing-with-Orthogonalization": "직교화로 편향 제거하기",
"Debiasing-with-Propensity-Score": "성향점수로 편향 제거하기",
diff --git a/book/reader.html b/book/reader.html
index 806e3f1..2edbe37 100644
--- a/book/reader.html
+++ b/book/reader.html
@@ -18,7 +18,7 @@
// ---------- 허브(같은 도메인의 팀 사이트)로 가는 링크: 같은 탭, utm_*, 클릭 이벤트 ----------
function placement(a) {
- var spots = [["#quarto-sidebar", "sidebar"], [".quarto-secondary-nav", "topbar"], [".nav-footer", "footer"],
+ var spots = [[".cil-hubbar", "hubbar"], ["#quarto-sidebar", "sidebar"], [".quarto-secondary-nav", "topbar"], [".nav-footer", "footer"],
[".hero", "hero"], [".hub-banner", "intro_banner"], [".cil-end", "chapter_end"], ["main", "content"]];
for (var i = 0; i < spots.length; i++) if (a.closest(spots[i][0])) return spots[i][1];
return "other";
@@ -73,6 +73,20 @@
}
paintSidebar();
+ // 모든 페이지 맨 위: 이 책이 Causal Inference Hub의 자료라는 띠
+ if (main) {
+ var bar0 = document.createElement("div");
+ bar0.className = "cil-hubbar";
+ bar0.innerHTML =
+ '' +
+ 'Causal Inference Hub가짜연구소 인과추론팀' +
+ '이 책은 허브 커리큘럼의 L1 자료입니다' +
+ '";
+ main.insertBefore(bar0, main.firstChild);
+ }
+
// 좁은 화면 상단 막대: 허브 바로가기
var nav = document.querySelector(".quarto-secondary-nav .container-fluid");
if (nav) {
diff --git a/book/styles-dark.scss b/book/styles-dark.scss
index 0dc56ef..3d17162 100644
--- a/book/styles-dark.scss
+++ b/book/styles-dark.scss
@@ -234,3 +234,18 @@ body {
background: rgba(111, 207, 151, 0.1);
border-color: rgba(111, 207, 151, 0.3);
}
+
+.cil-hubbar {
+ border-color: #2b2e40;
+ background: linear-gradient(90deg, rgba(180, 165, 234, 0.12) 0%, rgba(180, 165, 234, 0.04) 100%);
+}
+
+.cil-hubbar-home,
+.cil-hubbar-where b,
+.cil-hubbar-nav a {
+ color: #eceaff;
+}
+
+.cil-hubbar-where {
+ color: #9a9db0;
+}
diff --git a/book/styles.scss b/book/styles.scss
index 6716680..677c379 100644
--- a/book/styles.scss
+++ b/book/styles.scss
@@ -428,6 +428,101 @@ main:has(.hero) #title-block-header {
text-align: center;
}
+// 모든 페이지 맨 위: Causal Inference Hub 띠
+.cil-hubbar {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 0.4rem 1rem;
+ margin: 0 0 1.4rem;
+ padding: 0.55rem 0.9rem;
+ border-radius: 12px;
+ border: 1px solid rgba($indigo, 0.14);
+ background: linear-gradient(90deg, $lavender-soft 0%, rgba($lavender-soft, 0.35) 100%);
+ font-size: 0.84rem;
+}
+
+.cil-hubbar a {
+ text-decoration: none;
+}
+
+.cil-hubbar-home {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.5rem;
+ color: $navy;
+}
+
+.cil-hubbar-home img {
+ width: 22px;
+ height: auto;
+ margin: 0;
+}
+
+.cil-hubbar-home span {
+ display: flex;
+ flex-direction: column;
+ line-height: 1.25;
+}
+
+.cil-hubbar-home b {
+ font-weight: 800;
+}
+
+.cil-hubbar-home small {
+ font-size: 0.72rem;
+ color: $sidebar-fg;
+}
+
+.cil-hubbar-where {
+ color: lighten($body-color, 25%);
+}
+
+.cil-hubbar-where b {
+ color: $indigo;
+}
+
+.cil-hubbar-nav {
+ display: flex;
+ gap: 0.3rem;
+ margin-left: auto;
+}
+
+.cil-hubbar-nav a {
+ padding: 0.25rem 0.65rem;
+ border-radius: 999px;
+ color: $indigo;
+ font-weight: 650;
+}
+
+.cil-hubbar-nav a:hover {
+ background: rgba($indigo, 0.1);
+}
+
+@media (max-width: 767.98px) {
+ .cil-hubbar-where {
+ display: none;
+ }
+ .cil-hubbar-nav {
+ margin-left: 0;
+ width: 100%;
+ }
+ .cil-hubbar-nav a {
+ padding-left: 0;
+ padding-right: 0.8rem;
+ }
+}
+
+a.hero-brand {
+ color: inherit;
+ text-decoration: none;
+}
+
+a.hero-brand:hover .hero-brand-team {
+ text-decoration: underline;
+ text-underline-offset: 3px;
+}
+
// 사이드바 맨 위: Causal Inference Hub로 가는 카드
.hub-card {
display: flex;
@@ -514,28 +609,6 @@ main:has(.hero) #title-block-header {
}
}
-// 첫 화면 위치 표시: 인과추론 허브 › 서가
-.hero .hero-crumb {
- display: flex;
- align-items: center;
- gap: 0.45rem;
- margin-bottom: 1.1rem;
- font-size: 0.82rem;
- color: rgba(255, 255, 255, 0.6);
-}
-
-.hero .hero-crumb a {
- color: rgba(255, 255, 255, 0.88);
- font-weight: 600;
- text-decoration: none;
- border-bottom: 1px solid rgba(255, 255, 255, 0.35);
-}
-
-.hero .hero-crumb a:hover {
- color: #fff;
- border-bottom-color: #fff;
-}
-
// 장 첫머리: 분량, 위치, 노트북
.cil-chapter-meta {
display: flex;
diff --git a/causal-inference-for-the-brave-and-true/17-Predictive-Models-101.ipynb b/causal-inference-for-the-brave-and-true/17-Predictive-Models-101.ipynb
index d4e9f9b..0e90422 100644
--- a/causal-inference-for-the-brave-and-true/17-Predictive-Models-101.ipynb
+++ b/causal-inference-for-the-brave-and-true/17-Predictive-Models-101.ipynb
@@ -6,7 +6,7 @@
"source": [
"# 17 - Predictive Models 101\n",
"\n",
- "이제 이 책의 1부를 마무리합니다. 1부에서는 인과추론의 핵심을 다뤘습니다. 거기서 소개한 기법들은 널리 알려져 있고 확실히 자리를 잡았습니다. 오랜 세월의 검증을 견뎌 낸 방법들입니다. 1부는 믿고 기댈 수 있는 탄탄한 토대를 쌓는 부분이었습니다. 좀 더 전문적으로 말하면, 1부에서는 인과추론이 무엇인지 정의하고 상관관계가 인과관계가 되지 못하게 가로막는 편향(bias)에는 어떤 것이 있는지 살펴봤습니다. 그리고 그 편향을 보정하는 여러 방법(회귀분석, 매칭, 성향점수)과 대표적인 식별 전략(도구변수, 이중차분법, 회귀 불연속 설계)을 다뤘습니다. 요약하면 1부는 평균 처치효과(ATE) $E[Y_1 - Y_0]$를 식별하는 표준 기법에 초점을 맞췄습니다.\n",
+ "이제 이 책의 1부를 마무리합니다. 1부에서는 인과추론의 핵심을 다뤘습니다. 거기서 소개한 기법들은 널리 알려져 있고 확실히 자리를 잡은, 오랜 세월의 검증을 견뎌 낸 방법들입니다. 1부는 믿고 기댈 수 있는 탄탄한 토대를 쌓는 부분이었습니다. 좀 더 전문적으로 말하면, 1부에서는 인과추론이 무엇인지 정의하고 상관관계가 인과관계가 되지 못하게 가로막는 편향(bias)에는 어떤 것이 있는지 살펴봤습니다. 그리고 그 편향을 보정하는 여러 방법(회귀분석, 매칭, 성향점수)과 대표적인 식별 전략(도구변수, 이중차분법, 회귀 불연속 설계)을 다뤘습니다. 요약하면 1부는 평균 처치효과(ATE) $E[Y_1 - Y_0]$를 식별하는 표준 기법에 초점을 맞췄습니다.\n",
" \n",
"2부로 넘어가면 발밑이 조금 흔들리기 시작합니다. 인과추론 문헌의 최근 발전, 머신러닝과의 관계, 그리고 산업 현장에서의 응용을 다루기 때문입니다. 그런 의미에서 2부는 학문적 엄밀함을 조금 내주는 대신 실용성과 경험적 근거를 택합니다. 2부에서 소개하는 방법 가운데 일부는 왜 작동하는지 설명하는 탄탄한 이론이 없습니다. 그래도 막상 써 보면 어쨌든 잘 작동하는 것처럼 보입니다. 그래서 2부는 세상의 근본적인 인과관계를 연구하려는 과학자보다, 일상 업무에서 인과추론을 활용하려는 실무자에게 더 유용할 것입니다.\n",
" \n",
@@ -23,11 +23,11 @@
" \n",
"가장 먼저 짚고 싶은 것은 인과추론 책에서 왜 머신러닝 이야기를 하느냐는 점입니다. 짧게 답하면, 인과관계를 이해하는 가장 좋은 방법 중 하나가 머신러닝이 가져온 예측 모델 접근법과 대비해 보는 것이라고 생각하기 때문입니다. 길게 답하면 이유는 두 가지입니다. 첫째, 이 책을 여기까지 읽었다면 이미 머신러닝에 익숙할 가능성이 높습니다. 둘째, 그렇지 않더라도 요즘 워낙 인기 있는 주제라 머신러닝이 무엇인지 대략은 알고 있을 것입니다. 다만 머신러닝을 둘러싼 과열된 기대 때문에, 독자를 현실로 끌어내려 머신러닝이 실제로 무슨 일을 하는지 아주 실용적인 말로 설명해야 할지도 모릅니다. 마지막으로, 인과추론의 최근 연구가 머신러닝 알고리즘을 적극적으로 활용한다는 점도 있습니다.\n",
" \n",
- "아주 직설적으로 말하면, **머신러닝은 빠르고 자동화된 좋은 예측을 하는 방법**입니다. 이것이 전부는 아니지만 90%는 설명합니다. 컴퓨터 비전, 자율주행 자동차, 언어 번역, 진단처럼 멋진 발전은 대부분 지도 학습 분야에서 나왔습니다. 처음에는 이런 일이 예측 문제처럼 보이지 않을 수도 있습니다. 언어 번역이 어떻게 예측일까요? 바로 이 점이 머신러닝의 매력입니다. 예측으로 풀 수 있는 문제는 처음 생각보다 훨씬 많습니다. 언어 번역이라면, 기계에 문장 하나를 보여 주고 같은 문장을 다른 언어로 예측하게 하는 예측 문제로 정의할 수 있습니다. 여기서 예측이라는 단어를 미래를 내다보거나 점친다는 뜻으로 쓰는 것이 **아니라는** 점에 유의하세요. 예측은 그저 정의된 입력 하나를, 처음에는 알 수 없지만 마찬가지로 잘 정의되어 있고 관측할 수 있는 출력으로 대응시키는 일입니다.\n",
+ "아주 직설적으로 말하면, **머신러닝은 빠르고 자동화된 좋은 예측을 하는 방법**입니다. 이것이 전부는 아니지만 90%는 설명합니다. 컴퓨터 비전, 자율주행 자동차, 언어 번역, 진단처럼 멋진 발전은 대부분 지도 학습 분야에서 나왔습니다. 처음에는 이런 일이 예측 문제처럼 보이지 않을 수도 있습니다. 언어 번역이 어떻게 예측일까요? 바로 이 점이 머신러닝의 매력입니다. 예측으로 풀 수 있는 문제는 처음 생각보다 훨씬 많습니다. 언어 번역이라면, 기계에 문장 하나를 보여 주고 같은 문장을 다른 언어로 예측하게 하는 예측 문제로 정의할 수 있습니다. 여기서 예측이라는 단어를 미래를 내다보거나 점친다는 뜻으로 쓰는 것이 **아니라는** 점에 유의하세요. 예측은 그저 정의된 입력 하나를 출력에 대응시키는 일입니다. 그 출력은 처음에는 알 수 없지만, 입력과 마찬가지로 잘 정의되어 있고 관측할 수 있습니다.\n",
" \n",
"\n",
" \n",
- "머신러닝이 실제로 하는 일은 이 대응 함수를 학습하는 것입니다. 그 함수가 아주 복잡하더라도 학습할 수 있습니다. 결국 핵심은, 어떤 문제를 입력에서 출력으로의 대응으로 정의할 수 있다면 머신러닝이 그 문제를 풀 좋은 후보가 될 수 있다는 것입니다. 자율주행 자동차는 하나가 아니라 여러 개의 복잡한 예측 문제로 볼 수 있습니다. 차 앞쪽 센서 데이터로 바퀴의 올바른 각도를 예측하고, 차 주변 카메라 영상으로 브레이크를 밟을 세기를 예측하고, GPS 데이터로 가속 페달을 밟을 세기를 예측하는 식입니다. 이런 예측 문제(와 그 밖의 수많은 예측 문제)를 풀어내는 것이 곧 자율주행 자동차를 만드는 일입니다.\n",
+ "머신러닝이 실제로 하는 일은 이 대응 함수를 학습하는 것입니다. 함수가 아주 복잡해도 상관없습니다. 결국 핵심은, 어떤 문제를 입력에서 출력으로의 대응으로 정의할 수 있다면 머신러닝이 그 문제를 풀 좋은 후보가 될 수 있다는 것입니다. 자율주행 자동차는 하나가 아니라 여러 개의 복잡한 예측 문제로 볼 수 있습니다. 차 앞쪽 센서 데이터로 바퀴의 올바른 각도를 예측하고, 차 주변 카메라 영상으로 브레이크를 밟을 세기를 예측하고, GPS 데이터로 가속 페달을 밟을 세기를 예측하는 식입니다. 이런 예측 문제(와 그 밖의 수많은 예측 문제)를 풀어내는 것이 곧 자율주행 자동차를 만드는 일입니다.\n",
"\n",
"머신러닝을 좀 더 기술적으로 생각하면, (아주 복잡할 수도 있는) 기댓값 함수를 추정하는 일로 볼 수 있습니다.\n",
" \n",
@@ -40,7 +40,7 @@
"\n",
"좋습니다. 이제 예측이 처음 생각보다 강력할 수 있다는 것을 알았습니다. 자율주행 자동차와 언어 번역은 멋지긴 하지만, 구글이나 우버 같은 대형 테크 기업에서 일하지 않는 한 꽤 먼 이야기입니다. 그러니 좀 더 와닿게, 거의 모든 회사가 안고 있는 문제인 고객 획득(customer acquisition), 즉 새 고객을 확보하는 문제로 이야기해 보겠습니다.\n",
" \n",
- "고객 획득 관점에서 보통 해야 하는 일은 어떤 고객이 수익을 내는지 알아내는 것입니다. 이 문제에서 고객마다 획득 비용(마케팅 비용, 온보딩 비용, 배송비 등)이 들고, 바라건대 고객은 회사에 양의 현금 흐름을 만들어 줍니다. 예를 들어 인터넷 서비스 회사나 가스 회사라고 해 봅시다. 전형적인 고객의 현금 흐름은 대략 다음과 같을 것입니다.\n",
+ "고객 획득 관점에서 보통 해야 하는 일은 어떤 고객이 수익을 내는지 알아내는 것입니다. 이 문제에서는 고객마다 획득 비용(마케팅 비용, 온보딩 비용, 배송비 등)이 들고, 바라건대 고객은 회사에 양의 현금 흐름을 만들어 줍니다. 예를 들어 인터넷 서비스 회사나 가스 회사라고 해 봅시다. 전형적인 고객의 현금 흐름은 대략 다음과 같을 것입니다.\n",
" \n",
"\n",
" \n",
@@ -85,7 +85,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "예를 들어 고객 10,000명의 30일치 거래 데이터가 있다고 해 봅시다. 고객 획득 비용 `cacq`도 알고 있습니다. 온라인 마케팅을 한다면 고객을 잡으려고 거는 입찰가일 수도 있고, 배송비나 고객이 제품을 쓸 수 있도록 해 주는 교육 비용일 수도 있습니다. 또 문제를 단순하게 만들기 위해(이것은 속성 강좌이지 고객 가치 평가를 한 학기 동안 배우는 수업이 아닙니다), 거래할 고객을 완전히 통제할 수 있다고 가정하겠습니다. 다시 말해 고객이 거래를 원하더라도 거절할 권한이 있습니다. 그렇다면 할 일은 누가 수익을 낼지 미리 가려내서 그 고객과만 거래하는 것입니다."
+ "예를 들어 고객 10,000명의 30일치 거래 데이터가 있다고 해 봅시다. 고객 획득 비용 `cacq`도 알고 있습니다. 이 비용은 온라인 마케팅을 한다면 고객을 잡으려고 거는 입찰가일 수도 있고, 배송비나 고객이 제품을 쓸 수 있도록 해 주는 교육 비용일 수도 있습니다. 또 문제를 단순하게 만들기 위해(이 장은 속성 강좌이지 고객 가치 평가를 한 학기 동안 배우는 수업이 아닙니다), 거래할 고객을 완전히 통제할 수 있다고 가정하겠습니다. 다시 말해 고객이 거래를 원하더라도 거절할 권한이 있습니다. 그렇다면 할 일은 누가 수익을 낼지 미리 가려내서 그 고객과만 거래하는 것입니다."
]
},
{
@@ -316,7 +316,7 @@
"source": [
"이제 이 거래 데이터로 좋은 고객과 나쁜 고객을 구분해야 합니다. 간단하게 모든 거래 금액과 CACQ를 더하겠습니다. 다만 이렇게 하면 많은 세부 사항을 덮어 두게 된다는 점을 기억하세요. 예를 들어 이탈한 고객과, 한 번 구매한 뒤 다음 구매까지 잠시 쉬고 있는 고객을 구분하지 못합니다.\n",
" \n",
- "그다음 `net_value`라고 이름 붙인 이 합계를 고객별 특성(feature)과 결합합니다. 목표는 거래를 시작하기로 결정하기 **전에** 어떤 고객이 수익을 낼지 알아내는 것이므로, 고객 획득 이전 시점의 데이터만 쓸 수 있습니다. 여기서는 나이, 지역, 소득이 그런 특성이며, 모두 다른 `csv` 파일에 들어 있습니다."
+ "그다음 `net_value`라고 이름 붙인 이 합계를 고객별 특성(feature)과 결합합니다. 목표는 거래를 시작하기로 결정하기 **전에** 어떤 고객이 수익을 낼지 알아내는 것이므로, 고객 획득 이전 시점의 데이터만 쓸 수 있습니다. 여기서는 나이, 지역, 소득이 그런 특성이며, 모두 별도의 `csv` 파일 하나에 들어 있습니다."
]
},
{
@@ -431,7 +431,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "좋습니다! 과제가 조금 덜 추상적으로 바뀌었습니다. 수익을 내지 못하는 고객과 수익을 내는 고객(`net_value > 0`)을 구분하려고 합니다. 여러 방법을 시도해 보고 어느 것이 더 나은지 보겠습니다. 하지만 그 전에 머신러닝을 빠르게 훑어봐야 합니다(머신러닝이 어떻게 작동하는지 이미 안다면 건너뛰어도 됩니다).\n",
+ "좋습니다! 과제가 조금 더 구체적으로 바뀌었습니다. 수익을 내지 못하는 고객과 수익을 내는 고객(`net_value > 0`)을 구분하려고 합니다. 여러 방법을 시도해 보고 어느 것이 더 나은지 보겠습니다. 하지만 그 전에 머신러닝을 빠르게 훑어봐야 합니다(머신러닝이 어떻게 작동하는지 이미 안다면 건너뛰어도 됩니다).\n",
" \n",
"## 머신러닝 속성 강좌\n",
" \n",
@@ -439,15 +439,15 @@
" \n",
"\n",
" \n",
- "먼저 참값(여기서는 `net_value`)을 아는 데이터가 필요합니다. 그다음 특성(이 예에서는 지역, 소득, 나이)으로 `net_value`를 예측하는 머신러닝 모델을 훈련합니다. 이 훈련 또는 추정 단계를 거치면, 실제 `net_value`를 아직 모를 때 `net_value`를 예측하는 데 쓸 머신러닝 모델이 만들어집니다. 그림의 왼쪽 부분이 이 과정입니다. 특성(지역, 소득, 나이)은 있지만 `net_value`는 아직 모르는 새 데이터가 있습니다. 이 데이터를 모델에 넣으면 모델이 `net_value` 예측값을 내놓습니다.\n",
+ "먼저 참값(여기서는 `net_value`)을 아는 데이터가 필요합니다. 그다음 특성(이 예에서는 지역, 소득, 나이)으로 `net_value`를 예측하는 머신러닝 모델을 훈련합니다. 이 훈련 또는 추정 단계를 거치면, 실제 `net_value`를 아직 모를 때 `net_value`를 예측하는 데 쓸 머신러닝 모델이 만들어집니다. 그림의 왼쪽 부분이 이 과정입니다. 특성(지역, 소득, 나이)은 있지만 `net_value`는 아직 모르는 새 데이터를 모델에 넣으면, 모델이 `net_value` 예측값을 내놓습니다.\n",
" \n",
"기술적인 표기가 더 편하다면, 머신러닝을 조건부 기댓값 $E[Y|X]$를 추정하는 일로 이해할 수도 있습니다. 여기서 $Y$를 목표 변수(target variable) 또는 결과변수라 하고, $X$를 특성 변수라고 합니다. 머신러닝은 보통 어떤 오차 함수나 손실 함수를 최적화해서 $\\hat{E}[Y|X]$를 얻는 강력한 방법일 뿐입니다.\n",
" \n",
- "머신러닝 모델의 까다로운 점 하나는 거의 모든 함수를 근사할 수 있다는 것입니다. 달리 말하면, 모델을 훈련 셋의 데이터에 완벽하게 들어맞을 만큼 강력하게 만들 수 있다는 뜻입니다. 머신러닝 모델에는 보통 복잡도 하이퍼파라미터라는 것이 있습니다. 이 값이 모델이 얼마나 강력하고 복잡해질 수 있는지를 조절합니다. 아래 그림에서 단순한 모델(왼쪽), 중간 모델(가운데), 복잡하고 강력한 모델(오른쪽)의 예를 볼 수 있습니다. 복잡한 모델이 훈련 데이터에 완벽하게 들어맞는다는 점을 눈여겨보세요.\n",
+ "머신러닝 모델의 까다로운 점 하나는 거의 모든 함수를 근사할 수 있다는 것입니다. 달리 말하면, 모델을 훈련 셋의 데이터에 완벽하게 들어맞을 만큼 강력하게 만들 수 있다는 뜻입니다. 머신러닝 모델에는 보통 복잡도 하이퍼파라미터라는 것이 있어서, 모델이 얼마나 강력하고 복잡해질 수 있는지를 조절합니다. 아래 그림에서 단순한 모델(왼쪽), 중간 모델(가운데), 복잡하고 강력한 모델(오른쪽)의 예를 볼 수 있습니다. 복잡한 모델이 훈련 데이터에 완벽하게 들어맞는다는 점을 눈여겨보세요.\n",
" \n",
"\n",
" \n",
- "여기서 몇 가지 문제가 생깁니다. 무엇보다, 현실 세계에서 예측에 쓰기 전에 모델이 쓸 만한지 어떻게 알 수 있을까요? 한 가지 방법은 참값이 있는 데이터셋에서 예측값과 참값을 비교하는 것입니다. $R^2$ 같은 이른바 적합도(goodness of fit) 지표가 이런 방법입니다. 하지만 모델을 데이터에 완벽하게 들어맞을 만큼 강력하게 만들 수 있다는 점을 떠올려 보세요. 그렇게 되면 예측값이 참값과 완벽하게 일치합니다. 이것이 문제인 이유는, 모델을 더 강력하고 복잡하게 만들기만 해도 이 검증을 통과할 수 있으니 검증 결과를 믿을 수 없게 되기 때문입니다.\n",
+ "여기서 몇 가지 문제가 생깁니다. 무엇보다, 현실 세계에서 예측에 쓰기 전에 모델이 쓸 만한지 어떻게 알 수 있을까요? 한 가지 방법은 참값이 있는 데이터셋에서 예측값과 참값을 비교하는 것입니다. $R^2$ 같은 이른바 적합도(goodness of fit) 지표가 이런 방법입니다. 하지만 모델을 데이터에 완벽하게 들어맞을 만큼 강력하게 만들 수 있다는 점을 떠올려 보세요. 그렇게 되면 예측값이 참값과 완벽하게 일치합니다. 그러면 모델을 더 강력하고 복잡하게 만들기만 해도 이 검증을 통과할 수 있으니, 검증 결과를 믿을 수 없게 됩니다.\n",
" \n",
"게다가 아주 복잡한 모델은 일반적으로 좋지 **않습니다**. 왜 그런지는 이미 어느 정도 직감하고 있을 것입니다. 예를 들어 위 그림에서 어떤 모델이 마음에 드나요? 모든 예측을 맞히는 가장 복잡한 모델일까요? 아마 아닐 것입니다. 가운데 모델을 고를 가능성이 큽니다. 데이터에 완벽하게 들어맞지는 않지만, 더 매끄럽고 단순하면서도 여전히 꽤 좋은 예측을 합니다.\n",
" \n",
@@ -468,7 +468,7 @@
"source": [
"## 교차 검증\n",
" \n",
- "교차 검증은 모델 복잡도를 고르는 데 꼭 필요하지만, 그 밖에도 쓸모가 많습니다. 여러 가지를 시도해 보고 각각이 현실 세계에서 어떤 결과를 낼지 가늠하고 싶을 때면 언제든 쓸 수 있습니다. 교차 검증의 기본 아이디어는 현실 세계를 흉내 내는 것입니다. 현실에서는 가진 데이터로 모델을 추정하지만, 예측은 처음 보는 새 데이터에 대해 합니다. 없는 척하는 홀드아웃 데이터는 실전에서 마주칠 데이터의 대리 역할을 합니다.\n",
+ "교차 검증은 모델 복잡도를 고르는 데 꼭 필요하지만, 그 밖에도 쓸모가 많습니다. 여러 가지를 시도해 보고 각각이 현실 세계에서 어떤 결과를 낼지 가늠하고 싶을 때면 언제든 쓸 수 있습니다. 교차 검증의 기본 아이디어는 현실 세계를 흉내 내는 것입니다. 현실에서는 가진 데이터로 모델을 추정하지만, 예측은 처음 보는 새 데이터에서 합니다. 없는 척하는 홀드아웃 데이터는 실전에서 마주칠 데이터의 대리 역할을 합니다.\n",
" \n",
"어떤 고객이 수익을 내는지 알아내는 문제 전체에 교차 검증을 어떻게 적용하는지 보겠습니다. 할 일을 정리하면 다음과 같습니다.\n",
" \n",
@@ -520,7 +520,7 @@
" \n",
"\n",
" \n",
- "지금까지 수익을 내는 고객을 가려내는 방법과 접근법을 이야기했는데, 이제 개념을 좀 더 정확하게 다듬을 때입니다. 새로운 개념 두 가지를 소개하겠습니다. **예측**(prediction)은 무언가를 추정하거나 예측하는 숫자입니다. $\\hat{E}[y_i|X_i]$의 추정값입니다. 예를 들어 고객의 수익성을 예측하면 예측값은 16헤알(BRL) 같은 숫자가 되고, 이 고객이 16헤알의 매출을 낼 것으로 예측한다는 뜻입니다. 요점은 예측이 단순한 숫자라는 것입니다.\n",
+ "지금까지 수익을 내는 고객을 가려내는 방법과 접근법을 이야기했는데, 이제 개념을 좀 더 정확하게 다듬을 때입니다. 새로운 개념 두 가지를 소개하겠습니다. **예측**(prediction)은 무언가를 추정하거나 예측하는 숫자로, $\\hat{E}[y_i|X_i]$의 추정값입니다. 예를 들어 고객의 수익성을 예측하면 예측값은 16헤알(BRL) 같은 숫자가 되고, 이 고객이 16헤알의 매출을 낼 것으로 예측한다는 뜻입니다. 요점은 예측이 단순한 숫자라는 것입니다.\n",
" \n",
"두 번째 개념은 **정책**(policy)입니다. 정책은 자동화된 의사결정 규칙입니다. 예측이 숫자라면 정책은 결정입니다. 예를 들어 소득이 1000보다 큰 고객과는 거래하고 그렇지 않으면 거래하지 않는 정책을 세울 수 있습니다. 정책은 보통 예측 위에 세웁니다. 수익성 예측값이 10을 넘는 모든 고객과 거래하고 그렇지 않으면 거래하지 않는 식입니다($\\hat{E}[y_i|X_i] > 10$). 머신러닝은 보통 첫 번째 개념, 즉 예측을 담당합니다. 하지만 예측만으로는 아무 쓸모가 없다는 점에 주목하세요. 예측에 어떤 결정, 즉 정책을 붙여야 합니다.\n",
" \n",
@@ -563,9 +563,9 @@
"source": [
"아쉽게 됐습니다... 모두와 거래하면 거래하는 고객 한 명당 약 30헤알씩 손해를 봅니다. 아주 단순한 첫 시도는 실패했으니, 문을 닫고 싶지 않다면 더 가능성 있는 방법을 찾아야 합니다. 잠깐 짚고 넘어가자면, 이것은 교육용 예시라는 점을 기억하세요. 여기서는 \"모두를 똑같이 대하는\" 아주 단순한 정책이 통하지 않았지만, 현실에서는 이런 정책이 통하는 경우가 많습니다. 모두에게 마케팅 이메일을 보내는 편이 보내지 않는 편보다 낫거나, 모두에게 할인 쿠폰을 주는 편이 주지 않는 편보다 나은 경우가 흔합니다.\n",
" \n",
- "그럼 그다음으로 단순한 방법은 무엇일까요? 한 가지 아이디어는 특성을 하나씩 살펴보면서 그것만으로 좋은 고객과 나쁜 고객을 구분할 수 있는지 보는 것입니다. `income`을 예로 들어 봅시다. 부유한 고객일수록 수익을 더 많이 낼 것이라는 생각은 직관적입니다. 그렇지 않나요? 가장 부유한 고객들과만 거래하면 어떨까요? 좋은 생각일까요?\n",
+ "그럼 그다음으로 단순한 방법은 무엇일까요? 한 가지 아이디어는 특성을 하나씩 살펴보면서 그것만으로 좋은 고객과 나쁜 고객을 구분할 수 있는지 보는 것입니다. `income`을 예로 들어 봅시다. 부유한 고객일수록 수익도 더 많이 낼 것 같지 않나요? 가장 부유한 고객들과만 거래하면 어떨까요? 좋은 생각일까요?\n",
" \n",
- "이를 알아보려면 데이터를 소득 분위수로 나누면 됩니다(분위수는 데이터를 같은 크기의 구간으로 나눠 준다는 성질이 있어서 제가 좋아합니다). 그다음 소득 분위수마다 평균 순가치를 계산합니다. 전체 평균 순가치는 음수이지만($E[NetValue]<0$), 소득으로 정의되는 어떤 하위 모집단, 아마도 소득이 높은 집단에서는 순가치가 양수일 수 있다($E[NetValue|Income=x]>0$)는 기대를 걸어 봅니다."
+ "이를 알아보려면 데이터를 소득 분위수로 나누면 됩니다(분위수는 데이터를 같은 크기의 구간으로 나눠 준다는 성질이 있어서 제가 좋아합니다). 그다음 소득 분위수마다 평균 순가치를 계산합니다. 기대하는 것은 이렇습니다. 전체 평균 순가치는 음수이지만($E[NetValue]<0$), 소득으로 정의되는 어떤 하위 모집단, 아마도 소득이 높은 집단에서는 순가치가 양수일 수 있습니다($E[NetValue|Income=x]>0$)."
]
},
{
@@ -639,7 +639,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "빙고! 2, 17, 39 지역처럼 수익을 내는 지역도 있고, 0, 9, 29 지역과 특히 나쁜 26 지역처럼 수익을 내지 못하는 지역도 있다는 것이 분명히 보입니다. 아주 유망해 보입니다! 이를 정책으로 바꿀 수 있습니다. *지금 가진 데이터에 따르면* 수익을 내는 것으로 나타난 지역과만 거래하는 것입니다.\n",
+ "빙고! 2, 17, 39 지역처럼 수익을 내는 지역도 있고, 0, 9, 29 지역과 특히 나쁜 26 지역처럼 수익을 내지 못하는 지역도 분명히 있습니다. 아주 유망해 보입니다! 이를 정책으로 바꿀 수 있습니다. *지금 가진 데이터에 따르면* 수익을 내는 것으로 나타난 지역과만 거래하는 것입니다.\n",
" \n",
"눈여겨볼 점은 지금 하는 일이 머신러닝이 하는 일과 같되, 훨씬 단순한 방식이라는 것입니다. 즉, 각 지역의 순가치 기댓값 $E[NetValue|Region]$을 추정하고 있습니다. 이제 이 추정값을 가지고 무언가를 해야 합니다.\n",
" \n",
@@ -708,7 +708,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "`regions_to_invest`에는 거래할 지역이 모두 들어 있습니다. 이제 이 정책이 테스트 셋, 즉 없는 척했던 데이터에서 어떤 성과를 냈을지 보겠습니다. 정책을 평가하는 데 아주 중요한 단계입니다. 훈련 셋에서는 순전히 우연 때문에 어떤 지역이 수익을 내는 것처럼 보일 수 있기 때문입니다. 그것이 우연일 뿐이라면 테스트 셋에서 같은 패턴이 나타날 가능성은 낮습니다.\n",
+ "`regions_to_invest`에는 거래할 지역이 모두 들어 있습니다. 이제 이 정책이 테스트 셋, 즉 없는 척했던 데이터에서 어떤 성과를 냈을지 보겠습니다. 정책을 평가하는 데 아주 중요한 단계입니다. 훈련 셋에서는 순전히 우연 때문에 어떤 지역이 수익을 내는 것처럼 보일 수 있기 때문입니다. 정말 우연일 뿐이라면 테스트 셋에서 같은 패턴이 나타날 가능성은 낮습니다.\n",
" \n",
"이를 위해 테스트 셋에서 (훈련 셋 기준으로) 수익을 낸다고 판단한 지역의 고객만 남깁니다. 그다음 이 고객들의 순이익 분포를 그리고, 정책의 평균 순이익도 함께 표시합니다."
]
@@ -753,7 +753,7 @@
" \n",
"여기서는 그레이디언트 부스팅(gradient boosting) 모델을 쓰겠습니다. 설명하기는 꽤 복잡하지만 쓰기는 아주 간단한 모델입니다. 지금 목적에는 이 모델이 어떻게 작동하는지 자세히 알 필요가 없습니다. 대신 머신러닝 속성 강좌에서 본 내용만 기억하면 됩니다. 머신러닝 모델은 복잡도 매개변수가 있는 아주 강력한 예측 기계이고, $E[Y|X]$를 추정하는 도구입니다. 복잡할수록 모델은 더 강력해집니다. 하지만 복잡도가 너무 높으면 모델이 과적합되어 잡음을 학습하고, 처음 보는 데이터에는 잘 일반화되지 않습니다. 그래서 여기서도 모델의 복잡도가 적절한지 교차 검증으로 확인해야 합니다.\n",
" \n",
- "이제 물어야 할 질문은, 좋은 예측을 어떻게 활용해야 수익을 내는 고객을 가려내 거래하는 단순한 지역 정책을 개선할 수 있느냐입니다. 저는 크게 두 가지를 개선할 수 있다고 봅니다. 첫째, 좋은 고객과 나쁜 고객을 가르는 특성을 찾으려고 모든 특성을 하나하나 살펴보는 일이 번거롭다는 데는 동의할 것입니다. 여기서는 특성이 나이, 소득, 지역 세 개뿐이라 그리 힘들지 않았지만, 100개가 넘는다고 상상해 보세요. 게다가 [다중 검정](https://en.wikipedia.org/wiki/Multiple_comparisons_problem) 문제와 거짓 양성 비율도 조심해야 합니다. 둘째, 고객을 구분하려면 특성 하나로는 부족할 가능성이 큽니다. 이 예에서도 지역 말고 다른 특성 역시 고객 수익성에 관한 정보를 어느 정도 담고 있다고 봅니다. 물론 소득만 따로 봤을 때는 별 도움이 되지 않았지만, 아슬아슬하게 수익을 내지 못하는 지역에서 소득을 함께 보면 어떨까요? 그런 지역에서도 부유한 고객에게만 집중하면 여전히 수익을 낼 수 있을지 모릅니다. 기술적으로 말하면, $E[NetValue|Region, Income, Age]$가 $E[NetValue|Region]$보다 `NetValue`를 더 잘 예측한다는 주장입니다. 충분히 일리 있는 이야기입니다. 지역에 더해 소득과 나이 정보까지 쓰면 순가치를 더 잘 예측할 수 있을 것입니다.\n",
+ "이제 물어야 할 질문은 이것입니다. 좋은 예측을 어떻게 활용하면, 수익을 내는 고객을 가려내 거래하는 단순한 지역 정책을 개선할 수 있을까요? 저는 크게 두 가지를 개선할 수 있다고 봅니다. 첫째, 좋은 고객과 나쁜 고객을 가르는 특성을 찾으려고 모든 특성을 하나하나 살펴보는 일이 번거롭다는 데는 동의할 것입니다. 여기서는 특성이 나이, 소득, 지역 세 개뿐이라 그리 힘들지 않았지만, 100개가 넘는다고 상상해 보세요. 게다가 [다중 검정](https://en.wikipedia.org/wiki/Multiple_comparisons_problem) 문제와 거짓 양성 비율도 조심해야 합니다. 둘째, 고객을 구분하려면 특성 하나로는 부족할 가능성이 큽니다. 이 예에서도 지역 말고 다른 특성 역시 고객 수익성에 관한 정보를 어느 정도 담고 있다고 봅니다. 물론 소득만 따로 봤을 때는 별 도움이 되지 않았지만, 아슬아슬하게 수익을 내지 못하는 지역에서 소득을 함께 보면 어떨까요? 그런 지역에서도 부유한 고객에게만 집중하면 여전히 수익을 낼 수 있을지 모릅니다. 기술적으로 말하면, $E[NetValue|Region, Income, Age]$가 $E[NetValue|Region]$보다 `NetValue`를 더 잘 예측한다는 주장입니다. 충분히 일리 있는 이야기입니다. 지역에 더해 소득과 나이 정보까지 쓰면 순가치를 더 잘 예측할 수 있을 것입니다.\n",
" \n",
"특성 여러 개를 상호작용시키는 복잡한 정책을 직접 고안하는 일은 매우 어려울 수 있습니다. 살펴봐야 할 조합이 특성 개수에 따라 기하급수적으로 늘어나므로 현실적으로 할 수 있는 일이 아닙니다. 대신 특성을 모두 머신러닝 모델에 넣고, 그 상호작용을 모델이 대신 학습하게 할 수 있습니다. 바로 다음에 할 일이 이것입니다.\n",
" \n",
@@ -848,7 +848,7 @@
"source": [
"이 경우 모델은 훈련 셋에서 `net_income` 분산의 약 71%를 설명하지만, 테스트 셋에서는 약 69%만 설명합니다. 예상한 결과입니다. 모델은 훈련 셋을 보고 학습했으므로 훈련 셋에서의 성능은 대개 과대평가됩니다. 재미 삼아(그리고 과적합을 더 잘 이해하기 위해) 모델의 'max_depth'를 14로 바꿔 보고 어떻게 되는지 확인해 보세요. 훈련 셋의 $R^2$는 치솟지만 테스트 셋의 $R^2$는 오히려 낮아질 것입니다. 이것이 과적합의 모습입니다.\n",
" \n",
- "다음으로 정책을 만들기 위해 테스트 셋에 대한 예측값을 `prediction` 열에 저장합니다. 이 예측값은 $E[NetValue|Age, Income, Region ]$의 추정값입니다.\n",
+ "다음으로 정책을 만들기 위해 테스트 셋의 예측값을 `prediction` 열에 저장합니다. 이 예측값은 $E[NetValue|Age, Income, Region ]$의 추정값입니다.\n",
"\n",
"> 옮긴이: 직접 'max_depth'를 14로 바꿔 실행해 보면 훈련 셋에서는 약 0.92, 테스트 셋에서는 약 0.63이 나옵니다."
]
@@ -1049,12 +1049,12 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "보다시피 모델은 `region` 특성만 쓸 때보다 더 나은 정책을 만들어 내지만, 차이가 크지는 않습니다. 테스트 셋에서 모델 정책은 고객 한 명당 약 16.6헤알을 벌어 줬을 텐데, 지역 정책은 고객 한 명당 15.5헤알에 그쳤을 것입니다. 아주 조금 나을 뿐이지만, 고객이 정말 많다면 이 정도만으로도 특성 하나짜리 단순한 정책 대신 모델을 쓸 이유가 충분할 수 있습니다.\n",
+ "보다시피 모델은 `region` 특성만 쓸 때보다 더 나은 정책을 만들어 내지만, 차이가 크지는 않습니다. 테스트 셋에서 모델 정책은 고객 한 명당 약 16.6헤알을 벌어 줬겠지만, 지역 정책은 고객 한 명당 15.5헤알에 그쳤을 것입니다. 아주 조금 나을 뿐이지만, 고객이 정말 많다면 이 정도만으로도 특성 하나짜리 단순한 정책 대신 모델을 쓸 이유가 충분할 수 있습니다.\n",
" \n",
" \n",
"## 더 세밀한 정책\n",
" \n",
- "지금까지를 정리해 보겠습니다. 먼저 모든 정책 중 가장 단순한 정책, 즉 모든 고객과 거래하는 정책을 시험했습니다. 이 정책은 주변 순가치(marginal net value)를 추정하는 것, 즉 $\\hat{E}[NetValue] > 0$으로 볼 수 있습니다. 이 정책이 통하지 않자(고객 한 명당 평균 순이익이 음수였습니다), 지역을 기반으로 한 단일 특성 정책을 만들었습니다. 어떤 지역과는 거래하고 다른 지역과는 거래하지 않는 정책, 즉 $\\hat{E}[NetValue|Region] > 0$입니다. 이것만으로도 이미 아주 좋은 결과를 얻었습니다. 그다음에는 모든 특성을 쓰는 예측 모델로 머신러닝을 본격적으로 활용했습니다. $\\hat{E}[NetValue|Region, Income, Age] > 0$입니다. 그리고 그 모델을 정책의 입력으로 삼아, 순이익 예측값이 0보다 큰 모든 고객과 거래하기로 했습니다.\n",
+ "지금까지를 정리해 보겠습니다. 먼저 모든 정책 중 가장 단순한 정책, 즉 모든 고객과 거래하는 정책을 시험했습니다. 이 정책은 주변 순가치(marginal net value)를 추정하는 것, 즉 $\\hat{E}[NetValue] > 0$으로 볼 수 있습니다. 이 정책이 통하지 않자(고객 한 명당 평균 순이익이 음수였습니다), 지역을 기반으로 한 단일 특성 정책을 만들었습니다. 어떤 지역과는 거래하고 다른 지역과는 거래하지 않는 정책, 즉 $\\hat{E}[NetValue|Region] > 0$입니다. 이것만으로도 이미 아주 좋은 결과를 얻었습니다. 그다음에는 모든 특성을 쓰는 예측 모델, 즉 $\\hat{E}[NetValue|Region, Income, Age] > 0$으로 머신러닝을 본격적으로 활용했습니다. 그리고 그 모델을 정책의 입력으로 삼아, 순이익 예측값이 0보다 큰 모든 고객과 거래하기로 했습니다.\n",
" \n",
"여기서 정책이 내리는 결정은 아주 단순합니다. 고객과 거래하거나, 거래하지 않거나입니다. 지금까지의 정책은 이처럼 이진 결정을 다뤘고, 다음과 같은 형태였습니다.\n",
" \n",
@@ -1070,7 +1070,7 @@
" \n",
"한 가지 방법은 예측값을 여러 구간으로 이산화하는 것입니다. 앞에서 모델 비교를 위해 이미 해 봤지만, 이번에는 의사결정을 위해 합니다. 구간을 20개 만들어 보겠습니다. 각 구간은 분위수, 즉 크기가 같은 그룹으로 생각할 수 있습니다. 첫 번째 구간에는 *예측값 기준으로* 수익성이 가장 낮은 5%의 고객이, 두 번째 구간에는 하위 5%에서 10% 사이의 고객이 들어가는 식입니다. 마지막 20번 구간에는 수익성이 가장 높은 고객이 들어갑니다.\n",
" \n",
- "구간을 나누는 기준 역시 훈련 셋에서 추정하고 테스트 셋에 적용해야 한다는 점에 유의하세요! 그래서 구간 경계는 훈련 셋에서 `pd.qcut`으로 계산합니다. 실제 구간화는 `np.digitize`에 훈련 셋에서 미리 계산한 구간 경계를 넘겨서 수행합니다."
+ "구간을 나누는 기준 역시 훈련 셋에서 추정하고 테스트 셋에 적용해야 한다는 점에 유의하세요! 그래서 구간 경계는 훈련 셋에서 `pd.qcut`으로 계산합니다. 실제로 고객을 구간에 나눠 넣을 때는 `np.digitize`에 훈련 셋에서 미리 계산한 구간 경계를 넘깁니다."
]
},
{
diff --git a/causal-inference-for-the-brave-and-true/18-Heterogeneous-Treatment-Effects-and-Personalization.ipynb b/causal-inference-for-the-brave-and-true/18-Heterogeneous-Treatment-Effects-and-Personalization.ipynb
index 37dc038..b8bdb5f 100644
--- a/causal-inference-for-the-brave-and-true/18-Heterogeneous-Treatment-Effects-and-Personalization.ipynb
+++ b/causal-inference-for-the-brave-and-true/18-Heterogeneous-Treatment-Effects-and-Personalization.ipynb
@@ -8,9 +8,9 @@
" \n",
"## 예측에서 인과추론으로\n",
" \n",
- "지난 장에서는 머신러닝(ML) 모델을 간단히 살펴봤습니다. 머신러닝 모델은 제가 예측이라고 부른 일, 좀 더 기술적으로 말하면 조건부 기댓값 함수 $E[Y|X]$를 추정하는 도구입니다. 다시 말해 머신러닝은 이미 알고 있는 입력 $X$(영어 문장, 이번 달 매출, 뇌 스캔 영상 등)를 처음에는 모르지만 명확하게 정의된 출력 $Y$(일본어 문장, 다음 달 매출, 암 진단 등)로 대응시킬 때 놀라울 만큼 유용합니다. 이처럼 머신러닝이 다루는 것은 예측, 즉 $E[Y|X]$ 추정입니다. 그래서 머신러닝을 쓸모 있게 활용하려면 풀려는 문제가 무엇이든 $E[Y|X]$ 추정이 핵심인 예측 문제로 바꿔 정의해야 합니다. 지난 장에서 바로 그런 예를 살펴봤습니다. 거기서는 고객별 특성으로 고객 수익성, 즉 $E[NetValue|Age, Income, Region]$을 예측해야 했습니다. 이 정보는 아주 유용했습니다. 수익성 없는 고객과는 거래하지 않고, 수익성 있는 고객을 붙잡는 데 노력을 집중할 수 있었기 때문입니다. 이 문제에서는 수익성을 잘 예측하는 것이 관건입니다.\n",
+ "지난 장에서는 머신러닝(ML) 모델을 간단히 살펴봤습니다. 머신러닝 모델은 제가 예측이라고 부른 일, 좀 더 기술적으로 말하면 조건부 기댓값 함수 $E[Y|X]$를 추정하는 도구입니다. 다시 말해 머신러닝은 이미 알고 있는 입력 $X$(영어 문장, 이번 달 매출, 뇌 스캔 영상 등)를 처음에는 모르지만 명확하게 정의된 출력 $Y$(일본어 문장, 다음 달 매출, 암 진단 등)로 대응시킬 때 놀라울 만큼 유용합니다. 이처럼 머신러닝이 다루는 것이 예측, 즉 $E[Y|X]$ 추정이므로 머신러닝을 쓸모 있게 활용하려면 풀려는 문제가 무엇이든 $E[Y|X]$ 추정이 핵심인 예측 문제로 바꿔 정의해야 합니다. 지난 장에서 바로 그런 예를 살펴봤습니다. 거기서는 고객별 특성으로 고객 수익성, 즉 $E[NetValue|Age, Income, Region]$을 예측해야 했습니다. 이 정보는 아주 유용했습니다. 수익성 없는 고객과는 거래하지 않고, 수익성 있는 고객을 붙잡는 데 노력을 집중할 수 있었기 때문입니다. 이 문제에서는 수익성을 잘 예측하는 것이 관건입니다.\n",
" \n",
- "이 방식은 추정하는 사람이 데이터 생성 과정(data generating process) 밖에 머문다는 점에서 수동적인 추정 방식입니다. 앞의 예에서는 고객 수익성 `NetValue`가 주어진 것이라고 가정했습니다. 할 일은 그 값을 추정하는 것뿐이었습니다. 다시 말해 고객 수익성을 두고는 예측 말고 할 수 있는 일이 없다고 가정한 셈입니다. 수익성을 높일 수도, 낮출 수도 없었습니다. 하지만 현실이 늘 그렇지는 않습니다. 사실 기업에는 고객 수익성을 높이는 데 쓸 수 있는 레버가 있는 경우가 많습니다. 이런 레버는 프리미엄 고객 서비스나 더 저렴한 고객 서비스부터 할인, 가격, 마케팅까지 다양합니다. 업계에서는 우리가 데이터 생성 과정 안에 들어가 있는 경우가 흔합니다. 그 과정에 영향을 줄 수 있다는 뜻입니다. 그래서 업계에서 일하는 데이터 과학자는 어떤 비즈니스 지표를 최적화하려면 어떤 조치가 최선인지, 어떤 개입을 해야 하는지에 답해야 할 때가 많습니다. 그 지표는 대개 수익성이고, 전환, 비용, 매출 같은 중간 지표일 때도 있습니다.\n",
+ "이 방식은 추정하는 사람이 데이터 생성 과정(data generating process) 밖에 머문다는 점에서 수동적인 추정 방식입니다. 앞의 예에서는 고객 수익성 `NetValue`가 주어진 것이라고 가정했습니다. 할 일은 그 값을 추정하는 것뿐이었습니다. 다시 말해 고객 수익성을 두고는 예측 말고 할 수 있는 일이 없다고 가정한 셈입니다. 수익성을 높일 수도, 낮출 수도 없었습니다. 하지만 현실이 늘 그렇지는 않습니다. 사실 기업에는 고객 수익성을 높이는 데 쓸 수 있는 레버가 있는 경우가 많습니다. 이런 레버는 프리미엄 고객 서비스나 더 저렴한 고객 서비스부터 할인, 가격, 마케팅까지 다양합니다. 업계에서는 데이터 생성 과정 안에 들어가 그 과정에 영향을 줄 수 있는 경우가 흔합니다. 그래서 업계에서 일하는 데이터 과학자는 어떤 비즈니스 지표를 최적화하려면 어떤 조치가 최선인지, 어떤 개입을 해야 하는지에 답해야 할 때가 많습니다. 그 지표는 대개 수익성이고, 전환, 비용, 매출 같은 중간 지표일 때도 있습니다.\n",
" \n",
"수동적인 관찰자로 머물지 않는 이런 세계에서는 $E[Y|X]$를 추정하는 것만으로 전체 그림을 볼 수 없습니다. 바로 여기서 인과추론(causal inference)이 등장합니다. 조건부 기댓값 함수에 조각 하나를 더 끼워 넣어야 합니다. 데이터 생성 과정에 우리가 참여하는 부분을 모델링하는 조각, 바로 처치(treatment)입니다.\n",
" \n",
@@ -18,7 +18,7 @@
"E[Y|X, T]\n",
"$$\n",
" \n",
- "이제 맥락 특성 또는 외생 특성 $X$와 처치 $T$를 구분해야 합니다. 둘 다 결과(outcome) $Y$에 영향을 주지만, $X$는 우리가 통제할 수 없는 반면 $T$는 어떤 값을 가질지 정하거나 적어도 개입할 수 있습니다. 구체적인 예를 들어 보겠습니다. $Y$는 하루 매출이고, $X$는 직전 며칠의 평균 매출처럼 통제할 수는 없지만 매출에 관한 정보를 주는 맥락 특성이며, $T$는 가격, 재고 수준, 마케팅처럼 매출을 늘리려고 개입할 수 있는 처치변수입니다. 그러면 인과추론은 맥락 $X$ 아래에서 $T$와 $Y$의 인과관계를 추정하는 과정입니다. 그것만 해내면 $Y$를 최적화하는 일은 처치 $T$를 최적의 값으로 정하는 문제일 뿐입니다.\n",
+ "이제 맥락 특성 또는 외생 특성 $X$와 처치 $T$를 구분해야 합니다. 둘 다 결과(outcome) $Y$에 영향을 주지만, $X$는 우리가 통제할 수 없는 반면 $T$는 어떤 값을 가질지 정하거나 적어도 개입할 수 있습니다. 구체적인 예를 들어 보겠습니다. $Y$는 하루 매출이고, $X$는 직전 며칠의 평균 매출처럼 통제할 수는 없지만 매출에 관한 정보를 주는 맥락 특성이며, $T$는 가격, 재고 수준, 마케팅처럼 매출을 늘리려고 개입할 수 있는 처치변수입니다. 그러면 인과추론은 맥락 $X$ 아래에서 $T$와 $Y$의 인과관계를 추정하는 과정입니다. 이 인과관계만 추정해 내면 $Y$를 최적화하는 일은 처치 $T$를 최적의 값으로 정하는 문제일 뿐입니다.\n",
" \n",
" \n",
"$$\n",
@@ -32,7 +32,7 @@
" \n",
"1부는 처치가 전반적으로 긍정적인지, 효과가 강한지, 아니면 효과가 없는지에 답하는 데 집중했습니다. 예를 들어 교육에 투자하는 것이 대체로 좋은 생각인지 알고 싶었습니다. 또 1부에서 $X$는 두 가지 역할을 했습니다. 첫째, $X$에는 교란 요인(confounder)이 들어 있을 수 있고, 이때는 $X$를 고려하거나 보정해야만 인과효과를 식별할 수 있었습니다. 둘째, $X$는 인과효과 추정의 분산을 줄이는 역할을 할 수도 있었습니다. $X$가 $Y$를 잘 예측한다면 이를 이용해 $Y$의 분산을 설명해 덜어 낼 수 있고, 그만큼 인과효과가 더 뚜렷하게 드러납니다. \n",
" \n",
- "이제부터는 흑과 백으로 딱 잘라 말하기 어려워집니다. 평균 처치효과(average treatment effect) 이상의 것을 알고 싶기 때문입니다. 처치가 어떤 사람에게는 긍정적인 영향을 주지만 다른 사람에게는 그렇지 않을 수 있다고 인정할 것입니다. 맥락 특성 $X$는 대상의 서로 다른 유형을 정의하는 역할을 하고, 유형마다 처치에 다르게 반응할 수 있습니다. 이제는 처치를 개인화(personalization)해서 처치에 가장 잘 반응하는 대상에게만 주고 싶습니다. 평균 처치효과만 신경 쓰던 세계에서 이질적 처치효과(heterogeneous treatment effect)를 알고 싶은 세계로 넘어가는 것입니다."
+ "이제부터는 흑과 백으로 딱 잘라 말하기 어려워집니다. 평균 처치효과(average treatment effect) 이상의 것을 알고 싶기 때문입니다. 처치가 어떤 사람에게는 긍정적인 영향을 주지만 다른 사람에게는 그렇지 않을 수 있다고 인정하겠습니다. 맥락 특성 $X$는 대상의 유형을 나누는 역할을 하며, 유형마다 처치에 다르게 반응할 수 있습니다. 이제는 처치를 개인화(personalization)해서 처치에 가장 잘 반응하는 대상에게만 주고 싶습니다. 평균 처치효과만 신경 쓰던 세계에서 이질적 처치효과(heterogeneous treatment effect)를 알고 싶은 세계로 넘어가는 것입니다."
]
},
{
@@ -54,7 +54,7 @@
"E[y'(t)]\n",
"$$\n",
" \n",
- "여기서 $y'(t)$는 반응 함수, 즉 결과를 처치로 미분한 도함수입니다. 지금까지 처치가 전반적으로 얼마나 효과적인지 밝혀내는 기법을 배웠습니다. ATE 추정은 인과추론의 토대입니다. 흔히 프로그램 평가(program evaluation)라고 부르는 의사결정 문제에 아주 유용한 도구이기도 합니다. 처치를 모집단 전체에 시행해야 하는지 알고 싶을 때 쓰는 것입니다. 공공 정책 용어라고 헷갈릴 필요는 없습니다. 국가 교육 프로그램이나 보건 프로그램의 효과를 추정하는 기법은 신제품 출시가 회사 수익에 미치는 영향을 알아보는 데도 똑같이 쓸 수 있습니다. 여기서 눈여겨볼 점은 판단하려는 결정이 처치를 할지 말지라는 것입니다.\n",
+ "여기서 $y'(t)$는 반응 함수, 즉 결과를 처치로 미분한 도함수입니다. 지금까지 처치가 전반적으로 얼마나 효과적인지 밝혀내는 기법을 배웠습니다. ATE 추정은 인과추론의 토대이자, 흔히 프로그램 평가(program evaluation)라고 부르는 의사결정 문제에 아주 유용한 도구입니다. 프로그램 평가에서는 처치를 모집단 전체에 시행해야 하는지를 알고 싶어 합니다. 공공 정책 용어라고 해서 헷갈릴 필요는 없습니다. 국가 교육 프로그램이나 보건 프로그램의 효과를 추정하는 기법은 신제품 출시가 회사 수익에 미치는 영향을 알아보는 데도 똑같이 쓸 수 있습니다. 여기서 눈여겨볼 점은 내리려는 결정이 처치를 할지 말지라는 것입니다.\n",
" \n",
"이번에는 다른 종류의 결정에 필요한 정보를 얻으려 합니다. 바로 **누구에게** 처치할 것인가입니다. 이제 결정이 대상마다 달라질 수 있습니다. 어떤 대상에게는 처치하는 편이 이롭지만 다른 대상에게는 그렇지 않을 수 있습니다. 처치를 개인화하고 싶은 것입니다. 좀 더 기술적으로 말하면 조건부 평균 처치효과(conditional average treatment effect, CATE)를 추정하려 합니다.\n",
" \n",
@@ -62,25 +62,25 @@
"E[Y_1−Y_0 | X] \\ \\text{or} \\ E[y'(t)|X]\n",
"$$\n",
" \n",
- "$X$로 조건을 건다는 것은 처치효과가 각 대상의 특성에 따라 달라질 수 있다고 허용한다는 뜻입니다. 다시 말하지만, 여기서는 모든 개체가 처치에 똑같이 잘 반응하지는 않는다고 봅니다. 이런 이질성을 활용하고 싶습니다. 이진 처치라면 처치할 만한 대상에게만 처치하고, 연속형 처치라면 대상마다 최적의 처치 수준이 얼마인지 알아내고 싶습니다. \n",
+ "$X$로 조건을 건다는 것은 처치효과가 각 대상의 특성에 따라 달라질 수 있다고 허용한다는 뜻입니다. 다시 말하지만, 여기서는 모든 개체가 처치에 똑같이 잘 반응하지는 않는다고 봅니다. 그리고 이 이질성을 활용하려 합니다. 이진 처치라면 처치할 만한 대상에게만 처치하고, 연속형 처치라면 대상마다 최적의 처치 수준이 얼마인지 알아내고 싶습니다. \n",
" \n",
- "예를 들어 고객마다 받을 수 있는 대출 금액을 정해야 하는 은행이라면, 모두에게 돈을 왕창 빌려주는 건 좋은 생각이 아니라고 장담할 수 있습니다. 물론 어떤 고객에게는 그래도 괜찮을 수 있습니다. 처치(대출 금액)를 영리하게 정해야 합니다. 고객의 신용점수($X$)에 따라 적절한 대출 금액을 정할 수 있을지도 모릅니다. 물론 큰 기관만 개인화를 활용할 수 있는 것은 아닙니다. 개인화가 적용되는 예는 차고 넘칩니다. 1년 중 어느 날에 세일을 해야 할까요? 어떤 제품이든 가격을 얼마로 매겨야 할까요? 사람마다 어느 정도부터가 과한 운동일까요?\n",
+ "예를 들어 고객마다 받을 수 있는 대출 금액을 정해야 하는 은행이라면, 모두에게 돈을 왕창 빌려주는 건 좋은 생각이 아니라고 장담할 수 있습니다. 물론 어떤 고객에게는 그래도 괜찮을 수 있습니다. 처치(대출 금액)를 영리하게 정해야 합니다. 고객의 신용점수($X$)를 보고 적절한 대출 금액을 알아낼 수 있을지도 모릅니다. 물론 큰 기관만 개인화를 활용할 수 있는 것은 아닙니다. 개인화가 적용되는 예는 차고 넘칩니다. 1년 중 어느 날에 세일을 해야 할까요? 어떤 제품이든 가격을 얼마로 매겨야 할까요? 사람마다 어느 정도부터가 과한 운동일까요?\n",
" \n",
- "이렇게 생각해 보세요. 고객이 여럿 있고 처치(가격, 할인, 대출 등)가 하나 있습니다. 처치를 개인화하고 싶습니다. 예를 들어 고객마다 다른 할인을 주고 싶습니다.\n",
+ "이렇게 생각해 보세요. 고객이 여럿 있고 처치(가격, 할인, 대출 등)가 하나 있습니다. 이 처치를 개인화해서, 예를 들어 고객마다 할인을 다르게 주고 싶습니다.\n",
" \n",
"\n",
" \n",
- "그러려면 고객을 세분화해야 합니다. 처치에 다르게 반응하는 그룹을 만들어야 합니다. 예를 들어 할인에 잘 반응하는 고객과 잘 반응하지 않는 고객을 찾고 싶을 것입니다. 그런데 처치에 대한 고객의 반응은 조건부 처치효과 $\\frac{\\delta Y}{ \\delta T}$로 나타납니다. 그러니 어떻게든 이 값을 고객마다 추정할 수 있다면, 처치에 아주 잘 반응하는 고객(처치효과가 큰 고객)끼리, 그리고 잘 반응하지 않는 고객끼리 묶을 수 있습니다. 그렇게 하면 고객 공간을 대략 다음 그림처럼 나누게 됩니다.\n",
+ "그러려면 고객을 세분화해서 처치에 다르게 반응하는 그룹을 만들어야 합니다. 예를 들어 할인에 잘 반응하는 고객과 잘 반응하지 않는 고객을 찾고 싶을 것입니다. 그런데 고객이 처치에 어떻게 반응하는지는 조건부 처치효과 $\\frac{\\delta Y}{ \\delta T}$로 나타납니다. 그러니 어떻게든 이 값을 고객마다 추정할 수 있다면, 처치에 아주 잘 반응하는 고객(처치효과가 큰 고객)끼리, 그리고 잘 반응하지 않는 고객끼리 묶을 수 있습니다. 그렇게 하면 고객 공간을 대략 다음 그림처럼 나누게 됩니다.\n",
" \n",
"\n",
" \n",
- "그러면 각 분할마다 서로 다른 처치효과, 즉 민감도(sensitivity)를 추정할 수 있으니 아주 멋진 일입니다. 민감도는 $T$에서 $Y$로 가는 직선이나 함수의 기울기일 뿐이라는 점에 주목하세요. 따라서 기울기, 즉 민감도가 서로 다른 분할을 만들 수 있다면 각 분할에 속한 개체들은 처치에 반응하는 정도가 다르다는 뜻입니다.\n",
+ "그러면 분할마다 처치효과, 즉 민감도(sensitivity)를 따로 추정할 수 있으니 아주 멋진 일입니다. 민감도는 $T$에서 $Y$로 가는 직선이나 함수의 기울기일 뿐이라는 점에 주목하세요. 따라서 기울기, 즉 민감도가 서로 다른 분할을 만들 수 있다면 각 분할에 속한 개체들은 처치에 반응하는 정도가 다르다는 뜻입니다.\n",
" \n",
"\n",
" \n",
"다시 말해 $Y$ 자체를 예측하는 데서 벗어나, 대상마다 $Y$를 $T$로 미분한 값 $\\frac{\\delta Y}{ \\delta T}$를 예측해야 합니다. 예를 들어 $Y$가 아이스크림 판매량이고 $T$가 아이스크림 가격이며 각 대상 $i$가 하루라고 해 봅시다. 논의를 위해 윤리 문제는 잠시 접어 두고, 아이스크림 가격을 매일 바꿀 수 있다고 가정하겠습니다. $\\frac{\\delta Sales}{ \\delta Price}$가 **작은** 날을 어떻게든 찾아낼 수 있다면, 그런 날에는 판매량을 크게 잃지 않고 **가격을 올릴** 수 있습니다. 연휴 시즌에 가격을 올리는 것처럼, 이미 이렇게 하고 있을지도 모릅니다. 요점은 가격 민감도를 기준으로 날을 구분하는 것이 유용하다는 것입니다. 가격을 최적으로 정하는 근거가 되기 때문입니다.\n",
" \n",
- "좋습니다. 그런데 이건 좀 까다롭다고 말할 수도 있습니다. 볼 수도 없는 민감도 $\\frac{\\delta Sales}{ \\delta Price}$를 어떻게 예측하느냐고요. 아주 좋은 지적입니다. 민감도는 본질적으로 개별 대상 수준에서 관측할 수 없습니다. 게다가 낯선 개념이기도 합니다. 사람은 어떤 양의 변화율보다 양 그 자체로 생각하는 데 훨씬 익숙합니다. 그래서 민감도를 더 잘 이해할 수 있도록 작은 요령을 하나 소개하겠습니다. 각 개체에는 $Y_i$ 값(이 예에서는 판매량)뿐만 아니라 개별 민감도 $\\frac{\\delta Y_i}{\\delta T_i}$도 있다고 생각하는 것입니다. 민감도는 $T$에 따라 $Y$가 얼마나 변하는지를 나타내므로, 각 개체마다 기울기 계수 $\\frac{\\delta Y}{ \\delta T}_i$가 하나씩 붙어 있다고 생각할 수도 있습니다. 이 예에서라면 날마다 가격이 판매량에 미치는 기울기 계수가 하나씩 있다고 말할 수 있습니다.\n",
+ "좋습니다. 하지만 이건 좀 까다롭지 않으냐고 반문할 수도 있습니다. 보이지도 않는 민감도 $\\frac{\\delta Sales}{ \\delta Price}$를 어떻게 예측하느냐고요. 아주 좋은 지적입니다. 민감도는 본질적으로 개별 대상 수준에서 관측할 수 없습니다. 게다가 낯선 개념이기도 합니다. 사람은 어떤 양의 변화율보다 양 그 자체로 생각하는 데 훨씬 익숙합니다. 그래서 민감도를 더 잘 이해할 수 있도록 작은 요령을 하나 소개하겠습니다. 각 개체에는 $Y_i$ 값(이 예에서는 판매량)뿐만 아니라 개별 민감도 $\\frac{\\delta Y_i}{\\delta T_i}$도 있다고 생각하는 것입니다. 민감도는 $T$에 따라 $Y$가 얼마나 변하는지를 나타내므로, 각 개체마다 기울기 계수 $\\frac{\\delta Y}{ \\delta T}_i$가 하나씩 붙어 있다고 생각할 수도 있습니다. 이 예에서라면 날마다 가격이 판매량에 미치는 기울기 계수가 하나씩 있다고 말할 수 있습니다.\n",
" \n",
"\n",
" \n",
@@ -90,7 +90,7 @@
"\\frac{\\delta Y_i}{ \\delta T_i} \\approx \\frac{Y(T_i) - Y(T_i + \\epsilon)}{T_i - (T_i + \\epsilon)}\n",
"$$\n",
" \n",
- "다시 인과추론의 근본적인 문제로 돌아왔습니다. 같은 대상을 서로 다른 처치 조건에서 볼 수는 결코 없습니다. 그럼 어떻게 해야 할까요?"
+ "다시 인과추론의 근본적인 문제로 돌아왔습니다. 같은 대상을 서로 다른 처치 조건에서 보는 일은 결코 불가능합니다. 그럼 어떻게 해야 할까요?"
]
},
{
@@ -117,7 +117,7 @@
"\\frac{\\delta y_i}{\\delta t_i} = \\beta_1 \n",
"$$\n",
" \n",
- "위 모델을 추정하면 $\\hat{\\beta_1}$을 얻을 수 있으니, 과감하게 **민감도를 관측할 수 없어도 예측할 수는 있다**고 말할 수도 있겠습니다. 위의 경우는 꽤 단순한 예측입니다. 모든 대상에 대해 같은 상수 $\\hat{\\beta_1}$을 예측하니까요. 그것만으로도 의미는 있지만 아직 원하는 것은 아닙니다. 이건 CATE가 아니라 ATE입니다. 모든 대상이 똑같은 민감도 예측값을 받으므로, 처치에 반응하는 정도에 따라 개체를 묶는 작업에는 도움이 되지 않습니다. 하지만 다음처럼 간단히 바꿔 볼 수 있습니다.\n",
+ "위 모델을 추정하면 $\\hat{\\beta_1}$을 얻을 수 있으니, 과감하게 **민감도를 관측할 수 없어도 예측할 수는 있다**고 말할 수도 있겠습니다. 다만 위의 경우는 꽤 단순한 예측입니다. 모든 대상에게 같은 상수 $\\hat{\\beta_1}$을 예측하니까요. 그것만으로도 의미는 있지만 아직 원하는 것은 아닙니다. 이건 CATE가 아니라 ATE입니다. 모든 대상이 똑같은 민감도 예측값을 받으므로, 처치에 반응하는 정도에 따라 개체를 묶는 작업에는 도움이 되지 않습니다. 하지만 다음처럼 간단히 바꿔 볼 수 있습니다.\n",
" \n",
"$$\n",
"y_i = \\beta_0 + \\beta_1 t_i + \\beta_2 X_i + \\beta_3 t_i X_i + e_i\n",
@@ -129,7 +129,7 @@
"\\widehat{\\frac{\\delta y_i}{\\delta t_i}} = \\hat{\\beta_1} + \\hat{\\beta_3}X_i\n",
"$$\n",
" \n",
- "여기서 $\\beta_3$는 $X$에 담긴 특성들에 대한 계수 벡터입니다. \n",
+ "여기서 $\\beta_3$는 $X$에 담긴 특성들의 계수 벡터입니다. \n",
" \n",
"이제 $X_i$가 다른 개체는 서로 다른 민감도 예측값을 갖습니다. 다시 말해 $X$가 바뀌면 민감도 예측값도 바뀝니다. 이렇게 회귀분석으로 CATE $E[y'(t)|X]$를 추정할 길이 열렸습니다.\n",
" \n",
@@ -294,7 +294,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "훈련 데이터가 준비됐으니, 이제 가격 민감도가 높은 날과 낮은 날을 구분할 수 있는 모델을 만들어야 합니다. 방법은 단순합니다. 가격 민감도를 예측하는 것입니다. 정확히 어떻게 할까요? 먼저 다음 선형 모델을 생각해 봅시다.\n",
+ "훈련 데이터가 준비됐으니, 이제 가격 민감도가 높은 날과 낮은 날을 구분할 수 있는 모델을 만들어야 합니다. 방법은 단순합니다. 가격 민감도를 그대로 예측하면 됩니다. 정확히 어떻게 할까요? 먼저 다음 선형 모델을 생각해 봅시다.\n",
" \n",
"$$\n",
"sales_i = \\beta_0 + \\beta_1 price_i + \\pmb{\\beta_2}X_i + e_i\n",
@@ -621,7 +621,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "$m1$으로 민감도를 예측하는 건 그다지 재미가 없습니다. 모든 날에 똑같은 값을 예측하는 것을 볼 수 있습니다. 이 모델에는 상호작용 항이 없기 때문입니다. 하지만 $m3$로 예측하면 날마다 다른 민감도 예측값이 나옵니다. 이제는 민감도, 즉 처치효과가 그날그날의 특성에 따라 달라지기 때문입니다."
+ "$m1$으로 민감도를 예측하는 건 그다지 재미가 없습니다. 보다시피 모든 날에 똑같은 값을 예측합니다. 이 모델에는 상호작용 항이 없으니까요. 하지만 $m3$로 예측하면 날마다 다른 민감도 예측값이 나옵니다. 이제는 민감도, 즉 처치효과가 그날그날의 특성에 따라 달라지기 때문입니다."
]
},
{
@@ -737,7 +737,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "예측값이 대략 -9에서 1 사이에 있다는 점에 주목하세요. 이 값은 수백 단위인 판매량 열을 예측한 값이 아닙니다. **가격을 1만큼 올리면 판매량이 얼마나 달라질지를 예측한 값**입니다. 그런데 보자마자 이상한 숫자가 눈에 띕니다. 예를 들어 4764번 날을 보세요. 양의 민감도를 예측하고 있습니다. 아이스크림 가격을 올리면 판매량이 늘어난다고 예측하는 것입니다. 경제학적 직관과는 맞지 않습니다. 아마 모델이 이 예측에서 이상한 외삽(extrapolation)을 하고 있을 것입니다. 다행히 이 문제는 크게 걱정하지 않아도 됩니다. 최종 목표는 대상을 처치에 얼마나 민감한지에 따라 나누는 것이지, 세상에서 가장 정확한 민감도 예측값을 내놓는 것이 **아니라는** 점을 기억하세요. 이 목표에는 민감도 예측값이 대상을 민감한 정도에 따라 제대로 줄 세우기만 하면 충분합니다. 다시 말해 1.1이나 0.5 같은 양의 민감도 예측값 자체는 별 의미가 없더라도 순서만 맞으면 됩니다. 즉, 예측값이 1.1인 대상이 예측값이 0.5인 대상보다 가격 인상의 영향을 덜 받기만 하면 됩니다. \n",
+ "예측값이 대략 -9에서 1 사이에 있다는 점에 주목하세요. 이 값은 수백 단위인 판매량 열을 예측한 값이 아닙니다. **가격을 1만큼 올리면 판매량이 얼마나 달라질지를 예측한 값**입니다. 그런데 보자마자 이상한 숫자가 눈에 띕니다. 예를 들어 4764번 날을 보세요. 양의 민감도를 예측하고 있습니다. 아이스크림 가격을 올리면 판매량이 늘어난다고 예측하는 것입니다. 경제학적 직관과는 맞지 않습니다. 아마 모델이 이 예측에서 이상한 외삽(extrapolation)을 하고 있을 것입니다. 다행히 이 문제는 크게 걱정하지 않아도 됩니다. 최종 목표는 대상을 처치에 얼마나 민감한지에 따라 나누는 것이지, 세상에서 가장 정확한 민감도 예측값을 내놓는 것이 **아니라는** 점을 기억하세요. 이 목표에는 민감도 예측값이 대상을 민감한 정도에 따라 제대로 줄 세우기만 하면 충분합니다. 다시 말해 1.1이나 0.5 같은 양의 민감도 예측값 자체는 별 의미가 없더라도 순서만 맞으면 됩니다. 예측값이 1.1인 대상이 0.5인 대상보다 가격 인상의 영향을 덜 받기만 하면 됩니다. \n",
" \n",
"좋습니다. 민감도 모델, 즉 CATE 모델이 생겼습니다. 하지만 아직 궁금한 점이 하나 남아 있습니다. 머신러닝 예측 모델과 비교하면 어떨까요? 지금 바로 해 보겠습니다. 가격, 기온, 요일, 비용을 특성 $X$로 써서 아이스크림 판매량을 예측하는 머신러닝 알고리즘을 쓰겠습니다."
]
@@ -996,7 +996,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "이 그래프는 아주 중요한 점을 짚어 주기 때문에 정말 마음에 듭니다. 보다시피 예측 모델의 분할은 대상을 y축 방향으로 나눕니다. 첫 번째 분할에 속한 날에는 아이스크림이 많이 팔리지 않고, 두 번째 분할에 속한 날에는 더 많이 팔립니다. 저는 이 점이 놀랍다고 생각합니다. 예측 모델이 정확히 제 할 일, 즉 판매량 예측을 해내고 있기 때문입니다. 이 모델은 아이스크림이 적게 팔릴 날과 많이 팔릴 날을 구분할 수 있습니다. \n",
+ "저는 이 그래프가 정말 마음에 듭니다. 아주 중요한 점을 보여 주기 때문입니다. 보다시피 예측 모델의 분할은 대상을 y축 방향으로 나눕니다. 첫 번째 분할에 속한 날에는 아이스크림이 많이 팔리지 않고, 두 번째 분할에 속한 날에는 더 많이 팔립니다. 이 점이 정말 놀랍습니다. 예측 모델이 정확히 제 할 일, 즉 판매량 예측을 해내고 있기 때문입니다. 이 모델은 아이스크림이 적게 팔릴 날과 많이 팔릴 날을 구분할 수 있습니다. \n",
" \n",
"문제는 여기서는 그 예측이 별로 쓸모가 없다는 것입니다. 결국 알고 싶은 것은 언제 가격을 올려도 되고 언제 올리면 안 되는지입니다. 그런데 예측 모델로 나눈 분할에서 직선의 기울기를 보면 별로 다르지 않습니다. 다시 말해 예측 모델이 나눈 두 분할은 가격 인상에 반응하는 정도가 거의 같습니다. 이래서는 가격을 올려도 되는 날이 언제인지 알 수 있는 실마리가 별로 없습니다. 가격이 판매량에 전혀 영향을 주지 않는 것처럼 보이기 때문입니다. \n",
" \n",
diff --git a/causal-inference-for-the-brave-and-true/19-Evaluating-Causal-Models.ipynb b/causal-inference-for-the-brave-and-true/19-Evaluating-Causal-Models.ipynb
index 8d935f6..bdcb201 100644
--- a/causal-inference-for-the-brave-and-true/19-Evaluating-Causal-Models.ipynb
+++ b/causal-inference-for-the-brave-and-true/19-Evaluating-Causal-Models.ipynb
@@ -8,13 +8,13 @@
"\n",
"인과관계를 다루는 자료 대부분에서 연구자들은 자기 방법이 쓸 만한지 확인하려고 합성 데이터를 사용합니다. 부록의 'When Prediction Fails' 장에서 했던 것처럼 $Y_{0i}$와 $Y_{1i}$를 모두 생성해 두고, 모델이 처치효과(treatment effect) $Y_{1i} - Y_{0i}$를 제대로 잡아내는지 확인하는 식입니다. 학술적인 목적이라면 이걸로 충분하지만, 현실에서는 그런 호사를 누릴 수 없습니다. 이런 기법을 업계에 적용하다 보면 우리 모델이 왜 더 나은지, 왜 지금 운영 중인 모델을 대체해야 하는지, 왜 처참하게 실패하지 않을 거라고 장담할 수 있는지 증명하라는 요구를 몇 번이고 받게 됩니다. 이토록 중요한 문제인데도 실제 데이터로 인과추론 모델을 어떻게 평가해야 하는지 설명하는 자료를 도무지 찾아볼 수 없다는 건 제 상식으로는 이해가 되지 않습니다.\n",
"\n",
- "그 결과, 인과추론 모델을 적용하려는 데이터 과학자들은 경영진이 모델을 믿게 만드는 데 무척 애를 먹습니다. 이들이 주로 택하는 방법은 이론이 얼마나 탄탄한지, 모델을 학습할 때 얼마나 신중했는지 보여 주는 것입니다. 안타깝게도 훈련-테스트 분할 패러다임이 표준인 세상에서는 그것만으로 부족합니다. 모델의 품질은 아름다운 이론보다 더 구체적인 무언가에 근거해야 합니다. 생각해 보세요. 머신러닝이 이렇게 크게 성공할 수 있었던 것도 예측 모델을 검증하기가 아주 간단했기 때문입니다. 예측이 실제로 일어난 일과 맞아떨어지는 걸 눈으로 확인하면 어쩐지 안심이 됩니다.\n",
+ "그 결과, 인과추론 모델을 적용하려는 데이터 과학자들은 경영진이 모델을 믿게 만드는 데 무척 애를 먹습니다. 이들이 주로 택하는 방법은 이론이 얼마나 탄탄한지, 모델을 학습할 때 얼마나 신중했는지 보여 주는 것입니다. 안타깝게도 훈련-테스트 분할 패러다임이 표준인 세상에서는 그것만으로는 통하지 않습니다. 모델의 품질은 아름다운 이론보다 더 구체적인 무언가에 근거해야 합니다. 생각해 보세요. 머신러닝이 이렇게 크게 성공할 수 있었던 것도 예측 모델을 검증하기가 아주 간단했기 때문입니다. 예측이 실제로 일어난 일과 맞아떨어지는 걸 눈으로 확인하면 어쩐지 안심이 됩니다.\n",
"\n",
"그런데 인과추론에서 훈련-테스트 패러다임 같은 것을 어떻게 구현할 수 있을지는 전혀 분명하지 않습니다. 인과추론은 관측할 수 없는 양인 $\\frac{\\delta y}{ \\delta t}$를 추정하는 데 관심을 두기 때문입니다. 아니, 볼 수도 없는 걸 모델이 잘 추정하는지 대체 어떻게 안단 말입니까? 기억하세요. 모든 개체에는 저마다 고유한 반응도, 즉 처치에서 결과로 이어지는 직선의 기울기가 있는 셈이지만 그 기울기는 측정할 수 없습니다.\n",
"\n",
"\n",
"\n",
- "정말, 정말, 정말 머리로 받아들이기 어려운 문제라서, 답에 가까운 무언가를 찾기까지 저도 몇 년이 걸렸습니다. 결정적인 답은 아니지만 실무에서 잘 통하고 구체적입니다. 이 방법으로 머신러닝의 훈련-테스트 패러다임과 비슷하게 인과추론에 다가갈 수 있기를 기대합니다. 요령은 민감도(sensitivity)를 집계 수준에서 측정하는 것입니다. 민감도를 대상마다 따로 추정할 수는 없어도 그룹 단위로는 추정할 수 있고, 이 장에서는 바로 그 점을 활용합니다.\n",
+ "정말, 정말, 정말 머리로 받아들이기 어려운 문제라서, 답에 가까운 무언가를 찾기까지 저도 몇 년이 걸렸습니다. 결정적인 답은 아니지만 실무에서 잘 통하고 구체적입니다. 이 방법으로 머신러닝의 훈련-테스트 패러다임과 비슷한 방식으로 인과추론을 다룰 수 있기를 기대합니다. 요령은 민감도(sensitivity)를 집계 수준에서 측정하는 것입니다. 민감도를 대상마다 따로 추정할 수는 없어도 그룹 단위로는 추정할 수 있고, 이 장에서는 바로 그 점을 활용합니다.\n",
"\n",
"> 옮긴이: 그림의 'SNEAK 100'은 게임 『엘더스크롤 5: 스카이림』에서 은신 기술을 최고 단계까지 올렸다는 표시입니다. 각 점의 기울기가 그만큼 감쪽같이 숨어 있어서 관측할 수 없다는 농담입니다."
]
@@ -233,7 +233,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "모델이 심하게 과적합(overfitting)되지 않았는지 확인하려면, 학습에 쓴 데이터와 처음 보는 새 데이터에서 각각 $R^2$를 확인해 보면 됩니다(머신러닝에 익숙한 분이라면, 여기에는 개념 드리프트(concept drift)가 있으므로 성능이 어느 정도 떨어지는 게 당연하다는 점을 알아 두세요. 모델은 가격이 무작위가 아닌 데이터로 학습했지만, 테스트 셋에는 무작위로 정한 가격만 들어 있습니다)."
+ "모델이 심하게 과적합(overfitting)되지 않았는지 확인하려면, 학습에 쓴 데이터와 처음 보는 새 데이터에서 각각 $R^2$를 확인해 보면 됩니다(머신러닝에 익숙한 분을 위해 덧붙이면, 여기에는 개념 드리프트(concept drift)가 있으므로 성능이 어느 정도 떨어지는 게 정상입니다. 모델은 가격이 무작위가 아닌 데이터로 학습했지만, 테스트 셋에는 무작위로 정한 가격만 들어 있습니다)."
]
},
{
@@ -270,7 +270,7 @@
"\\frac{\\delta y(t)}{\\delta t} \\approx \\frac{y(t+h) - y(t)}{h}\n",
"$$\n",
"\n",
- "두 모델은 비무작위 데이터로 학습했습니다. 이제 무작위 데이터로 넘어가 예측을 합니다. 모든 결과를 한곳에 모아 두기 위해, 머신러닝 모델의 예측값과 인과 모델의 민감도 예측값을 `prices_rnd_pred`라는 데이터프레임 하나에 담겠습니다.\n",
+ "두 모델은 비무작위 데이터로 학습했으니, 이제 무작위 데이터로 넘어가 예측하겠습니다. 모든 결과를 한곳에 모아 두기 위해, 머신러닝 모델의 예측값과 인과 모델의 민감도 예측값을 `prices_rnd_pred`라는 데이터프레임 하나에 담겠습니다.\n",
"\n",
"여기에 무작위 모델도 하나 넣겠습니다. 이 모델은 그냥 무작위 숫자를 예측값으로 내놓습니다. 당연히 별 쓸모는 없지만 벤치마크로는 제 몫을 톡톡히 합니다. 새로운 평가 방법을 이야기할 때면 저는 늘 무작위(쓸모없는) 모델이 그 방법으로 어떤 점수를 받을지 생각해 봅니다. 무작위 모델이 그 평가 기준에서 좋은 성적을 낸다면, 그 평가 방법이 실제로 얼마나 좋은지 알려 주는 셈이기 때문입니다."
]
@@ -433,7 +433,7 @@
"\n",
"반면 두 번째 모델이 만든 그룹은 저마다 인과효과가 다릅니다. 이 모델이 개인화에 실제로 쓸모 있을 수 있다는 신호입니다. 마지막으로 무작위 모델이 만든 그룹은 민감도가 모두 똑같습니다. 그다지 유용하지는 않지만 예상한 결과입니다. 모델이 무작위라면 그 모델이 만든 각 구간은 데이터에서 무작위로 뽑은 대표 표본이 됩니다. 따라서 각 그룹의 민감도는 전체 데이터셋의 ATE와 거의 같아야 합니다.\n",
"\n",
- "이 그래프만 봐도 어느 모델이 더 나은지 감을 잡을 수 있습니다. 민감도가 질서 있게 늘어서 보일수록, 구간 사이의 차이가 클수록 좋습니다. 여기서는 모델 2가 아마 모델 1보다 낫고, 모델 1은 아마 무작위 모델보다 나을 것입니다.\n",
+ "이 그래프만 봐도 어느 모델이 더 나은지 감을 잡을 수 있습니다. 민감도가 순서대로 가지런히 늘어설수록, 구간 사이의 차이가 클수록 좋습니다. 여기서는 모델 2가 아마 모델 1보다 낫고, 모델 1은 아마 무작위 모델보다 나을 것입니다.\n",
"\n",
"이를 연속형 처치로 일반화하려면 단일 변수 선형회귀 모델로 민감도를 추정하면 됩니다.\n",
"\n",
@@ -537,7 +537,7 @@
"source": [
"먼저 무작위 모델(`rand_m`)을 봅시다. 모든 구간에서 추정된 민감도가 거의 같습니다. 그래프만 봐도 이 모델은 가격 민감도가 높은 날과 낮은 날을 구분하지 못하니 개인화에 별 도움이 안 되리라는 걸 알 수 있습니다. 다음은 예측 모델 `pred_m`입니다. 이 모델은 의외로 꽤 유망합니다! 민감도가 높은 그룹과 낮은 그룹을 만들어 내는데, 바로 지금 필요한 것입니다.\n",
"\n",
- "마지막으로 인과 모델 `sensitivity_m`은 조금 이상해 보입니다. 이 모델은 민감도가 아주 낮은 그룹을 찾아내는데, 여기서 낮다는 건 사실 가격 민감도가 높다는 뜻입니다(가격을 올리면 판매량이 크게 줄어듭니다). 가격 민감도가 높은 날을 찾아내는 건 아주 유용합니다. 언제가 그런 날인지 알면 그날만큼은 가격을 계속 올리지 않도록 조심할 수 있으니까요. 인과 모델은 덜 민감한 구간도 일부 찾아내므로 민감도가 높은 경우와 낮은 경우를 제대로 구분합니다. 하지만 정렬 순서는 예측 모델만큼 좋지 않습니다.\n",
+ "마지막으로 인과 모델 `sensitivity_m`은 조금 이상해 보입니다. 이 모델은 민감도가 아주 낮은 그룹을 찾아내는데, 여기서 낮다는 건 사실 가격 민감도가 높다는 뜻입니다(가격을 올리면 판매량이 크게 줄어듭니다). 가격 민감도가 높은 날을 찾아내는 건 아주 유용합니다. 언제가 그런 날인지 알면 그날만큼은 가격을 계속 올리지 않도록 조심할 수 있으니까요. 인과 모델은 덜 민감한 영역도 일부 찾아내므로 민감도가 높은 경우와 낮은 경우를 제대로 구분합니다. 하지만 정렬 순서는 예측 모델만큼 좋지 않습니다.\n",
"\n",
"그렇다면 어떻게 결정해야 할까요? 예측 모델과 인과 모델 중 어느 쪽이 더 쓸모 있을까요? 예측 모델은 정렬이 더 낫지만, 인과 모델은 극단을 더 잘 찾아냅니다. 구간별 민감도 그래프는 첫 점검용으로는 좋지만, 어느 모델이 더 나은지 정확히 답해 주지는 못합니다. 좀 더 정교한 방법이 필요합니다.\n",
"\n",
@@ -563,17 +563,17 @@
"(\\widehat{y'(t)}_1, \\widehat{y'(t)}_2, \\widehat{y'(t)}_3,..., \\widehat{y'(t)}_N)\n",
"$$\n",
"\n",
- "이 수열은 모델 평가 측면에서 아주 흥미롭습니다. 이 수열을 두고 모델의 우열을 가리는 기준을 세울 수 있기 때문입니다. 첫째, 다음 조건을 잘 만족할수록 더 좋은 모델입니다.\n",
+ "이 수열은 모델 평가 측면에서 아주 흥미롭습니다. 이 수열을 두고 모델의 우열을 가리는 기준을 세울 수 있기 때문입니다. 첫째, 임의의 $k$와 $a>0$에 대해 다음 조건을 잘 만족할수록 더 좋은 모델입니다.\n",
"\n",
"$\\hat{y}'(t)_k > \\hat{y}'(t)_{k+a}$\n",
"\n",
- "이 조건은 임의의 $k$와 $a>0$에 대한 것입니다. 말로 풀면, 모델이 민감도를 잘 정렬한다면 상위 $k$개 표본에서 관측한 민감도가 상위 $k+a$개 표본에서 관측한 민감도보다 높아야 합니다. 더 간단히 말해, 위쪽에 있는 대상들은 그 아래 대상들보다 민감도가 높아야 합니다.\n",
+ "말로 풀면, 모델이 민감도를 잘 정렬한다면 상위 $k$개 표본에서 관측한 민감도가 상위 $k+a$개 표본에서 관측한 민감도보다 높아야 합니다. 더 간단히 말해, 위쪽에 있는 대상들은 그 아래 대상들보다 민감도가 높아야 합니다.\n",
"\n",
- "둘째, 다음 값이 클수록 더 좋은 모델입니다.\n",
+ "둘째, 임의의 $k$와 $a>0$에 대해 다음 값이 클수록 더 좋은 모델입니다.\n",
"\n",
"$\\hat{y}'(t)_k - \\hat{y}'(t)_{k+a}$\n",
"\n",
- "이 역시 임의의 $k$와 $a>0$에 대한 것입니다. 상위 $k$개 대상의 민감도가 그 아래 대상들보다 높기만 해서는 부족하고, 그 차이가 가능한 한 커야 한다는 직관입니다.\n",
+ "상위 $k$개 대상의 민감도가 그 아래 대상들보다 높기만 해서는 부족하고, 그 차이가 가능한 한 커야 한다는 직관입니다.\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",
"모델 평가 측면에서 누적 민감도 곡선은 구간별 민감도라는 단순한 아이디어보다 이미 훨씬 낫습니다. 이 곡선 덕분에 모델의 우열을 훨씬 정밀하게 가릴 수 있었습니다. 그래도 여전히 이해하기 복잡한 곡선입니다. 그래서 한 단계 더 개선해 보겠습니다."
]
@@ -671,7 +671,7 @@
"source": [
"## 누적 이득 곡선\n",
"\n",
- "다음 아이디어는 누적 민감도를 아주 간단하면서도 강력하게 개선합니다. 바로 누적 민감도에 표본 비율을 곱하는 것입니다. 예를 들어 누적 민감도가 40% 지점에서 -0.5라면 그 지점의 값은 -0.2(-0.5 * 0.4)가 됩니다. 그런 다음 이 값을 무작위 모델이 만드는 이론적 곡선과 비교합니다. 이 곡선은 사실 0에서 평균 처치효과까지 이어지는 직선입니다. 이렇게 생각해 보세요. 무작위 모델은 데이터를 무작위로, 대표성 있게 나눌 뿐이므로 무작위 모델의 누적 민감도는 모든 지점에서 ATE입니다. (0,1) 구간의 각 지점에서 ATE에 그 지점 값을 곱하면 0과 ATE를 잇는 직선이 나옵니다.\n",
+ "다음 아이디어는 누적 민감도를 아주 간단하면서도 강력하게 개선합니다. 바로 누적 민감도에 표본 비율을 곱하는 것입니다. 예를 들어 누적 민감도가 40% 지점에서 -0.5라면 그 지점의 값은 -0.2(-0.5 * 0.4)가 됩니다. 그런 다음 이 값을 무작위 모델이 만드는 이론적 곡선과 비교합니다. 이 곡선은 사실 0에서 평균 처치효과까지 이어지는 직선입니다. 이렇게 생각해 보세요. 무작위 모델은 데이터를 무작위로, 대표성 있게 나눌 뿐이므로 무작위 모델의 누적 민감도는 모든 지점에서 ATE입니다. 0과 1 사이의 각 지점에서 ATE에 그 지점 값을 곱하면 0과 ATE를 잇는 직선이 나옵니다.\n",
"\n",
"\n",
"\n",
@@ -760,7 +760,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "이제 인과 모델(`sensitivity_m`)이 나머지 두 모델보다 훨씬 낫다는 게 분명히 드러납니다. `rand_m`이나 `pred_m`보다 무작위 직선에서 훨씬 크게 벗어납니다. 또 실제 무작위 모델이 이론적 무작위 모델을 아주 가깝게 따라간다는 점에도 주목하세요. 둘의 차이는 아마 무작위 잡음일 뿐일 것입니다.\n",
+ "이제 인과 모델(`sensitivity_m`)이 나머지 두 모델보다 훨씬 낫다는 게 분명히 드러납니다. `rand_m`이나 `pred_m`보다 무작위 직선에서 훨씬 크게 벗어납니다. 또 실제 무작위 모델이 이론적 무작위 모델을 아주 가깝게 따라간다는 점에도 주목하세요. 둘의 차이는 아마 무작위 잡음에 불과할 것입니다.\n",
"\n",
"이렇게 해서 인과 모델을 평가하는 아주 멋진 아이디어 몇 가지를 살펴봤습니다. 이것만으로도 대단한 성과입니다. 비교할 참값이 없는데도 모델이 민감도를 얼마나 잘 정렬하는지 평가해 냈으니까요. 이제 빠진 것은 딱 하나, 이 측정값에 신뢰구간(confidence interval)을 붙이는 일입니다. 우리가 야만인은 아니지 않습니까?\n",
"\n",
@@ -880,7 +880,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "데이터셋을 더 많이 누적할수록 신뢰구간이 점점 좁아지는 것을 볼 수 있습니다. 표본 크기가 커지기 때문입니다.\n",
+ "데이터셋을 더 많이 누적할수록 신뢰구간이 점점 좁아지는 점에 주목하세요. 표본 크기가 커지기 때문입니다.\n",
"\n",
"누적 이득 곡선도 똑같이 간단하게 신뢰구간을 구할 수 있습니다. 이번에도 `sensitivity` 함수를 호출하는 부분을 `sensitivity_ci` 함수 호출로 바꾸기만 하면 됩니다."
]
@@ -961,7 +961,7 @@
"\n",
"여기서는 무작위 데이터에 크게 기댔습니다. 모델은 비무작위 데이터로 학습했지만, 평가는 모두 처치가 무작위로 배정된 표본에서 했습니다. 민감도를 믿을 만하게 추정할 방법이 필요했기 때문입니다. 무작위 데이터가 없으면 여기서 쓴 간단한 공식들은 통하지 않습니다. 이제는 잘 알다시피, 교란 요인이 있으면 단순선형회귀에는 누락 변수 편향(omitted variable bias)이 생깁니다.\n",
"\n",
- "그래도 무작위 데이터를 조금이라도 손에 넣을 수 있다면, 그 데이터로 모델을 비교하는 방법은 이미 알고 있습니다. 다음 장에서는 비무작위 데이터 문제를 다루겠지만, 넘어가기 전에 모델 평가에 대해 마지막으로 몇 마디 하고 싶습니다.\n",
+ "그래도 무작위 데이터를 조금이라도 손에 넣을 수 있다면, 그 데이터로 모델을 비교하는 방법은 이미 알고 있습니다. 다음 장에서는 비무작위 데이터 문제를 다루겠지만, 넘어가기 전에 모델 평가에 관해 마지막으로 몇 마디 하고 싶습니다.\n",
"\n",
"신뢰할 수 있는 모델 평가가 얼마나 중요한지 다시 강조하겠습니다. 누적 이득 곡선 덕분에 드디어 인과추론에 쓰는 모델을 비교할 좋은 방법이 생겼습니다. 이제 처치 개인화에 어떤 모델이 더 적합한지 결정할 수 있습니다. 이건 큰 진전입니다. 인과추론 자료 대부분은 모델을 평가할 좋은 방법을 알려 주지 않습니다. 제 생각에는 이것이야말로 인과추론이 머신러닝만큼 대중화되는 데 필요한 빠진 퍼즐 조각입니다. 좋은 평가 방법이 있으면 예측 모델에서 이미 큰 효과를 본 훈련-테스트 패러다임에 인과추론을 더 가까이 가져갈 수 있습니다. 대담한 주장이라는 건 압니다. 그래서 조심스럽게 말하지만, 이 주장을 뒤집을 만한 좋은 반론은 아직 찾지 못했습니다. 반론이 있다면 꼭 알려 주세요.\n",
"\n",
@@ -969,7 +969,7 @@
"\n",
"여기 쓴 내용은 대부분 제 머릿속에서 나온 것입니다. 경험으로 배운 것들입니다. 즉, 좋은 과학이라면 보통 거치는 학계의 엄밀한 검증을 통과하지 **않았다**는 뜻입니다. 대신 실무에서 통하는 것들을 이야기하면서도 왜 그런지 설명하는 데는 시간을 많이 들이지 않았다는 점을 눈여겨보세요. 말하자면 길거리 과학인 셈입니다. 하지만 이 내용을 공개해 누구나 검토할 수 있게 해 두었으니, 터무니없는 내용을 발견하면 주저하지 말고 이슈를 열어 주세요. 최선을 다해 답하겠습니다.\n",
"\n",
- "이 장의 아이디어는 Pierre Gutierrez와 Jean-Yves G'erardy의 논문 *Causal Inference and Uplift Modeling A review of the literature*에서 얻었습니다. 저자들은 Qini 곡선이라는 개념을 설명합니다. 찾아보면 업리프트 모델링(uplift modeling)에서 쓰는 기법이라는 걸 알 수 있는데, 업리프트 모델링은 처치가 이진일 때의 인과추론이라고 생각하면 됩니다. 여기서는 Qini 곡선의 아이디어를 가져와 연속형 처치로 일반화했습니다. 여기서 소개한 방법이 연속형과 이진형 모두에 통한다고 생각하지만, 그렇긴 해도 다른 곳에서 이런 방법을 본 적은 없으니 그 점은 염두에 두세요.\n",
+ "이 장의 아이디어는 Pierre Gutierrez와 Jean-Yves G'erardy의 논문 *Causal Inference and Uplift Modeling A review of the literature*에서 얻었습니다. 저자들은 Qini 곡선이라는 개념을 설명합니다. 찾아보면 업리프트 모델링(uplift modeling)에서 쓰는 기법이라는 걸 알 수 있는데, 업리프트 모델링은 처치가 이진일 때의 인과추론이라고 생각하면 됩니다. 여기서는 Qini 곡선의 아이디어를 가져와 연속형 처치로 일반화했습니다. 여기서 소개한 방법은 연속형과 이진형 모두에 통한다고 생각합니다. 다만 다른 곳에서 이런 방법을 본 적은 없으니 그 점은 염두에 두세요.\n",
"\n",
"훈련-테스트 패러다임에 관해서는 Leo Breiman(2001)의 논문 Statistical Modeling: The Two Cultures도 꼭 읽어 보길 권합니다. 통계 기법이 무엇 덕분에 성공하는지 이해하고 싶다면 훌륭한 자료입니다.\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 e450c9b..6e3d7c8 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
@@ -6,20 +6,20 @@
"source": [
"# 20 - Plug-and-Play Estimators\n",
"\n",
- "지금까지는 처치가 무작위로 배정되지 않아 교란편향(confounding bias)이 생기는 경우에 데이터에서 편향을 제거하는 방법을 살펴봤습니다. 이 방법들은 인과추론의 식별(identification) 문제를 푸는 데 도움이 됩니다. 다시 말해, 분석단위가 교환 가능(exchangeable)하다면, 즉 $ Y(0), Y(1) \\perp T|X$이면 처치효과를 학습할 수 있습니다. 하지만 아직 갈 길이 멉니다.\n",
+ "지금까지는 처치가 무작위로 배정되지 않아 교란편향(confounding bias)이 생길 때 데이터에서 편향을 제거하는 방법을 살펴봤습니다. 이 방법들은 인과추론의 식별(identification) 문제를 푸는 데 도움이 됩니다. 다시 말해, 분석단위가 교환 가능(exchangeable)하다면, 즉 $ Y(0), Y(1) \\perp T|X$이면 처치효과를 학습할 수 있습니다. 하지만 아직 갈 길이 멉니다.\n",
"\n",
- "식별할 수 있다는 것은 평균 처치효과(ATE)를 구할 수 있다는 뜻입니다. 즉, 처치가 평균적으로 얼마나 효과적인지 알 수 있습니다. 물론 이 정보는 처치를 전면 도입할지 말지 결정하는 데 도움이 되니 유용합니다. 하지만 그 이상을 원합니다. 처치에 더 잘 반응하거나 덜 반응하는 하위 집단이 있는지 알고 싶습니다. 그러면 훨씬 나은 정책, 즉 처치로 이득을 볼 대상에게만 처치하는 정책을 세울 수 있습니다.\n",
+ "식별할 수 있다는 것은 평균 처치효과(ATE)를 구할 수 있다는 뜻입니다. 즉, 처치가 평균적으로 얼마나 효과적인지 알 수 있습니다. 처치를 전면 도입할지 말지 정하는 데 도움이 되니 물론 유용한 정보입니다. 하지만 우리는 그 이상을 원합니다. 처치에 더 잘 반응하거나 덜 반응하는 하위 집단이 있는지 알고 싶습니다. 그러면 훨씬 나은 정책, 즉 처치로 이득을 볼 대상에게만 처치하는 정책을 세울 수 있습니다.\n",
"\n",
"\n",
"## 문제 설정\n",
"\n",
- "관심 있는 설정을 다시 떠올려 봅시다. 잠재적 결과(potential outcome)가 주어지면 개별 처치효과(ITE)를 두 잠재적 결과의 차이로 정의할 수 있습니다.\n",
+ "우리가 다루는 문제 설정을 다시 떠올려 봅시다. 잠재적 결과(potential outcome)가 주어지면 개별 처치효과(ITE)를 두 잠재적 결과의 차이로 정의할 수 있습니다.\n",
"\n",
"$\n",
"\\tau_i = Y_i(1) − Y_i(0),\n",
"$\n",
"\n",
- "처치가 연속형이라면 $t$가 처치변수일 때 $\\tau_i = \\partial Y(t)$로 정의합니다. 물론 개별 처치효과는 결코 관측할 수 없습니다. 잠재적 결과 중 하나만 볼 수 있기 때문입니다.\n",
+ "처치가 연속형이라면 처치변수를 $t$라 할 때 $\\tau_i = \\partial Y(t)$로 정의합니다. 물론 개별 처치효과는 결코 관측할 수 없습니다. 잠재적 결과 중 하나만 볼 수 있기 때문입니다.\n",
"\n",
"$\n",
"Y^{obs}_i(t)= \n",
@@ -41,7 +41,7 @@
"\\tau(x) = E[Y_i(1) − Y_i(0)|X] = E[\\tau_i|X]\n",
"$\n",
"\n",
- "이 책의 1부에서는 주로 ATE에 초점을 맞췄습니다. 이제부터는 CATE를 다룹니다. CATE는 의사결정 과정을 개인화하는 데 유용합니다. 예를 들어 약물이 처치 $t$라면, 어떤 유형의 환자가 약물에 더 잘 반응하는지(CATE가 높은지), 그리고 오히려 역효과가 나는 유형의 환자(CATE < 0)가 있는지 알고 싶을 것입니다.\n",
+ "이 책의 1부에서는 주로 ATE에 초점을 맞췄다면, 이제부터는 CATE를 다룹니다. CATE는 의사결정 과정을 개인화하는 데 유용합니다. 예를 들어 약물이 처치 $t$라면, 어떤 유형의 환자가 약물에 더 잘 반응하는지(CATE가 높은지), 그리고 오히려 역효과가 나는 유형의 환자(CATE < 0)가 있는지 알고 싶을 것입니다.\n",
"\n",
"앞에서 처치와 특성(feature) 사이의 상호작용을 넣은 선형회귀로 CATE를 추정하는 방법을 살펴봤습니다.\n",
"\n",
@@ -55,15 +55,15 @@
"\\hat{\\tau}(x) = \\hat{\\beta}_1 + \\hat{\\beta}_3 X_i\n",
"$\n",
"\n",
- "그래도 선형 모델에는 몇 가지 단점이 있습니다. 가장 큰 단점은 $X$에 대한 선형성 가정입니다. 이 모델에서 $\\beta_2$에는 관심조차 없다는 점에 주목하세요. 하지만 특성 $X$가 결과와 선형 관계가 아니라면 인과 매개변수 $\\beta_1$과 $\\beta_3$의 추정값이 빗나갑니다.\n",
+ "하지만 선형 모델에는 몇 가지 단점이 있습니다. 가장 큰 단점은 $X$에 대한 선형성 가정입니다. 이 모델에서 $\\beta_2$에는 관심조차 없다는 점에 주목하세요. 하지만 특성 $X$가 결과와 선형 관계가 아니라면 인과 매개변수 $\\beta_1$과 $\\beta_3$의 추정값이 빗나갑니다.\n",
"\n",
- "선형 모델을 더 유연한 머신러닝 모델로 바꿀 수 있다면 좋을 것입니다. 부스팅 트리나 신경망 같은 머신러닝 모델에 처치를 특성으로 넣을 수도 있습니다.\n",
+ "선형 모델을 더 유연한 머신러닝 모델로 바꿀 수 있다면 좋겠습니다. 부스팅 트리나 신경망 같은 머신러닝 모델에 처치를 특성으로 넣을 수도 있습니다.\n",
"\n",
"$\n",
"y_i = M(X_i, T_i) + e_i\n",
"$\n",
"\n",
- "하지만 그다음에 처치효과의 추정값을 어떻게 얻을지가 분명하지 않습니다. 이 모델은 $\\hat{\\tau(x)}$가 아니라 $\\hat{y}$를 예측하기 때문입니다. 이상적으로는 머신러닝 회귀 모델이 다음과 같은 결과의 평균제곱오차(MSE)를 최소화하는 대신\n",
+ "하지만 그렇게 해서는 처치효과의 추정값을 어떻게 얻을지 분명하지 않습니다. 이 모델은 $\\hat{\\tau(x)}$가 아니라 $\\hat{y}$를 예측하기 때문입니다. 이상적으로는 머신러닝 회귀 모델이 다음과 같은 결과의 평균제곱오차(MSE)를 최소화하는 대신\n",
"\n",
"$\n",
"E[(Y_i - \\hat{Y}_i)^2]\n",
@@ -88,7 +88,7 @@
"\n",
"처치가 이진이라고 해 봅시다. 투자 회사에서 일하고 있고, 금융 교육 이메일을 보내는 것이 효과가 있는지 실험한다고 가정하겠습니다. 이메일 덕분에 사람들이 투자를 더 많이 하기를 바랍니다. 그리고 고객의 50%는 이메일을 받고 나머지 50%는 받지 않는 무작위 실험을 했다고 하겠습니다.\n",
"\n",
- "여기서 정신 나간 아이디어를 하나 내 보겠습니다. 결과변수에 처치를 곱해서 결과변수를 변환하는 것입니다.\n",
+ "여기서 정신 나간 아이디어를 하나 내 보겠습니다. 결과변수에 처치를 곱해 변환하는 것입니다.\n",
"\n",
"$\n",
"Y^*_i = 2 Y_i * T_i - 2 Y_i*(1-T_i)\n",
@@ -97,7 +97,7 @@
"\n",
"즉, 처치를 받은 분석단위라면 결과에 2를 곱하고, 처치를 받지 않았다면 -2를 곱합니다. 예를 들어 어떤 고객이 이메일을 받고 2,000헤알(BRL)을 투자했다면 변환된 목표는 4,000이 됩니다. 하지만 이메일을 받지 않았다면 -4,000이 됩니다.\n",
"\n",
- "이메일의 효과가 음수일 수도 있다고 말하는 셈이니 무척 이상해 보이겠지만, 조금만 참고 따라와 주세요. 약간의 수학을 거치면 이 변환된 목표가 평균적으로, 즉 기댓값으로 보면 처치효과와 같다는 것을 알 수 있습니다. 놀랍다는 말로도 부족합니다. 조금 엉뚱한 이 변환을 적용하기만 하면 관측할 수조차 없는 값을 추정할 수 있다는 말이니까요.\n",
+ "이메일의 효과가 음수일 수도 있다고 말하는 셈이니 무척 이상해 보이겠지만, 조금만 참고 따라와 주세요. 수학을 조금만 해 보면 이 변환된 목표가 평균적으로, 즉 기댓값으로 보면 처치효과와 같다는 것을 알 수 있습니다. 놀랍다는 말로도 부족합니다. 조금 엉뚱한 이 변환을 적용하기만 하면 관측할 수조차 없는 값을 추정할 수 있다는 말이니까요.\n",
"\n",
"이를 이해하려면 수학이 조금 필요합니다. 무작위 배정 덕분에 $T \\perp Y(0), Y(1)$이 성립합니다. 우리의 오랜 친구인 비교란성(unconfoundedness)입니다. 그리고 독립성에서 바로 $E[T, Y(t)]=E[T]*E[Y(t)]$가 따라 나옵니다.\n",
"\n",
@@ -129,7 +129,7 @@
"\n",
"쉽게 말해, 아무 머신러닝 회귀 모델로 $Y^*_i$를 예측하기만 하면 그 모델이 처치효과의 예측값을 내놓습니다.\n",
"\n",
- "간단한 경우는 해결했으니, 처치가 50 대 50으로 배정되지 않았거나 아예 무작위로 배정되지 않은 더 복잡한 경우는 어떨까요? 알고 보면 답이 조금 더 복잡해지지만, 아주 많이 복잡하지는 않습니다. 먼저 무작위 배정이 아니라면 최소한 조건부 독립성 $T \\perp Y(1), Y(0) | X$가 필요합니다. 즉, $X$를 통제하면 $T$가 무작위 배정이나 다름없어야 합니다. 그러면 변환된 목표를 다음과 같이 일반화할 수 있습니다.\n",
+ "간단한 경우는 해결했으니, 처치가 50 대 50으로 배정되지 않았거나 아예 무작위로 배정되지 않은 더 복잡한 경우는 어떨까요? 알고 보면 답이 조금 더 복잡해지기는 해도 크게 복잡하지는 않습니다. 먼저 무작위 배정이 아니라면 최소한 조건부 독립성 $T \\perp Y(1), Y(0) | X$가 필요합니다. 즉, $X$를 통제하면 $T$가 무작위 배정이나 다름없어야 합니다. 그러면 변환된 목표를 다음과 같이 일반화할 수 있습니다.\n",
"\n",
"$\n",
"Y^*_i = Y_i * \\dfrac{T_i - e(X_i)}{e(X_i)(1-e(X_i))}\n",
@@ -137,7 +137,7 @@
"\n",
"여기서 $e(X_i)$는 성향점수(propensity score)입니다. 따라서 처치가 50 대 50이 아니라 다른 확률 $p$로 무작위 배정됐다면 위 공식의 성향점수를 $p$로 바꾸기만 하면 됩니다. 처치가 무작위가 아니라면 저장해 둔 성향점수나 추정한 성향점수를 써야 합니다.\n",
"\n",
- "이 값의 기댓값을 구해 보면 역시 처치효과와 일치합니다. 증명은 독자 여러분의 연습 문제로 남겨 두겠습니다. 농담입니다, 여기 있습니다. 조금 번거로우니 건너뛰어도 괜찮습니다.\n",
+ "이 값의 기댓값을 구해 보면 역시 처치효과와 일치합니다. 증명은 독자 여러분의 연습 문제로 남겨 두겠습니다. 농담이고, 여기 있습니다. 조금 번거로우니 건너뛰어도 괜찮습니다.\n",
"\n",
"$\n",
"\\begin{align}\n",
@@ -151,7 +151,7 @@
"\\end{align}\n",
"$\n",
"\n",
- "늘 그렇듯 예제를 보면 훨씬 구체적으로 와닿을 것입니다. 이번에도 사람들이 투자를 더 하도록 보낸 투자 이메일을 생각해 봅시다. 결과변수는 이진 변수(투자함 vs 투자하지 않음)인 `converted`입니다."
+ "늘 그렇듯 예제를 보면 훨씬 구체적으로 와닿을 것입니다. 이번에도 투자를 늘리려고 보낸 투자 이메일을 생각해 봅시다. 결과변수는 이진 변수(투자함 vs 투자하지 않음)인 `converted`입니다."
]
},
{
@@ -290,7 +290,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "여기서 목표는 개인화(personalization)입니다. email-1에 집중해 보겠습니다. 이 이메일에 더 잘 반응할 고객에게만 이메일을 보내고 싶습니다. 다시 말해 email-1의 조건부 평균 처치효과를 추정하려고 합니다.\n",
+ "여기서 목표는 개인화(personalization)입니다. email-1에 집중해 보겠습니다. 이 이메일은 더 잘 반응할 고객에게만 보내고 싶습니다. 다시 말해 email-1의 조건부 평균 처치효과를 추정하려고 합니다.\n",
"\n",
"$\n",
"E[Converted(1)_i - Converted(0)_i|X_i=x] = \\tau(x)_i\n",
@@ -298,7 +298,7 @@
"\n",
"그래야 이메일에 가장 잘 반응할(CATE가 높은) 고객을 골라서 보낼 수 있습니다.\n",
"\n",
- "하지만 그 전에 데이터셋을 훈련 셋과 검증 셋으로 나누겠습니다. 한쪽 셋에서 $\\tau(x)_i$를 추정하고 다른 쪽 셋에서 그 추정값을 평가합니다."
+ "그 전에 먼저 데이터셋을 훈련 셋과 검증 셋으로 나누겠습니다. 한쪽 셋에서 $\\tau(x)_i$를 추정하고 다른 쪽 셋에서 그 추정값을 평가합니다."
]
},
{
@@ -326,7 +326,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "이제 방금 배운 목표 변환(target transformation)을 적용해 보겠습니다. 이메일은 (50 대 50은 아니지만) 무작위로 배정됐으므로 성향점수를 신경 쓸 필요가 없습니다. 성향점수는 처치 확률과 같은 상수입니다."
+ "이제 방금 배운 목표 변환(target transformation)을 적용해 보겠습니다. 이메일은 (50 대 50은 아니지만) 무작위로 배정됐으므로 성향점수를 신경 쓸 필요가 없습니다. 성향점수는 처치 확률과 같은 상수일 뿐입니다."
]
},
{
@@ -348,7 +348,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "변환된 목표가 있으면 어떤 머신러닝 회귀 알고리즘으로든 이를 예측할 수 있습니다. 여기서는 부스팅 트리를 쓰겠습니다."
+ "변환된 목표만 있으면 어떤 머신러닝 회귀 알고리즘으로든 예측할 수 있습니다. 여기서는 부스팅 트리를 쓰겠습니다."
]
},
{
@@ -547,9 +547,9 @@
"\n",
"\n",
"\n",
- "목표 변환 방법의 또 다른 뚜렷한 단점은 이산형이나 이진 처치에서만 작동한다는 점입니다. 인과추론 문헌에서 흔히 볼 수 있는 상황입니다. 연구 대부분이 이진 처치를 다루고, 연속형 처치에 관한 내용은 찾기 어렵습니다. 저는 이 점이 무척 답답했습니다. 산업 현장에는 연속형 처치가 어디에나 있고, 대부분은 최적화해야 하는 가격의 형태이기 때문입니다. 결국 연속형 처치를 위한 목표 변환은 찾지 못했지만, 실무에서 통하는 방법을 직접 고안해 냈습니다. 다만 이 방법을 뒷받침하는 탄탄한 계량경제학 연구는 없다는 점을 염두에 두세요.\n",
+ "목표 변환 방법의 또 다른 뚜렷한 단점은 이산형이나 이진 처치에서만 작동한다는 점입니다. 인과추론 문헌에서 흔히 볼 수 있는 상황입니다. 연구 대부분이 이진 처치를 다루고, 연속형 처치에 관한 내용은 찾기 어렵습니다. 저는 이 점이 무척 답답했습니다. 산업 현장에는 연속형 처치가 어디에나 있고, 대부분은 최적화해야 하는 가격의 형태이기 때문입니다. 그래서 연속형 처치를 위한 목표 변환은 찾지 못했지만, 실무에서 통하는 방법을 직접 고안했습니다. 다만 이 방법을 뒷받침하는 탄탄한 계량경제학 연구는 없다는 점을 염두에 두세요.\n",
"\n",
- "이 방법을 소개하기 위해 아이스크림 판매 예제로 돌아가 보겠습니다. 그 예제에서 맡은 과제는 가격에 대한 수요의 탄력성(elasticity)을 추정하는 것이었습니다. 그래야 아이스크림 가격을 더 잘 정해 수익을 최적화할 수 있습니다. 데이터셋의 각 표본은 하루이고, 사람들이 가격 인상에 덜 민감한 때가 언제인지 알고 싶었다는 점을 떠올려 보세요. 또한 이 데이터셋에서는 가격이 무작위로 배정됐으므로 교란편향을 걱정할 필요가 없다는 점도 기억하실 것입니다."
+ "이 방법을 소개하려고 아이스크림 판매 예제로 돌아가 보겠습니다. 그 예제에서 맡은 과제는 가격에 대한 수요의 탄력성(elasticity)을 추정하는 것이었습니다. 그래야 아이스크림 가격을 더 잘 정해 수익을 최적화할 수 있습니다. 데이터셋의 각 표본은 하루이고, 사람들이 가격 인상에 덜 민감한 때가 언제인지 알고 싶었다는 점을 떠올려 보세요. 또한 이 데이터셋에서는 가격이 무작위로 배정됐으므로 교란편향을 걱정할 필요가 없다는 점도 기억하실 것입니다."
]
},
{
@@ -698,7 +698,7 @@
"\n",
"\n",
"\n",
- "이 경우 CATE는 각 수요 직선의 기울기입니다. 이 기울기를 보면 가격을 얼마만큼 올렸을 때 수요가 얼마나 줄어드는지 알 수 있습니다. 이 관계가 정말 선형이라면 더운 날과 추운 날 각각 따로 단순선형회귀를 추정해서, 그 계수로 탄력성을 추정할 수 있습니다.\n",
+ "이 경우 CATE는 각 수요 직선의 기울기입니다. 이 기울기를 보면 가격을 얼마만큼 올렸을 때 수요가 얼마나 줄어드는지 알 수 있습니다. 이 관계가 정말 선형이라면 더운 날과 추운 날에 각각 단순선형회귀를 따로 적합해 그 계수로 탄력성을 추정할 수 있습니다.\n",
"\n",
"$$\n",
"\\hat{\\tau(x)} = Cov(Y_i, T_i)/Var(T_i) = \\dfrac{\\sum(Y_i- \\bar{Y})(T_i - \\bar{T})}{\\sum (T_i - \\bar{T})^2}\n",
@@ -719,7 +719,7 @@
"\n",
"\n",
"\n",
- "이제 남은 질문은 이것이 정말 통하느냐입니다. 실제로 통합니다. 이진 처치에서 했던 것처럼 왜 통하는지 비슷하게 증명해 볼 수도 있습니다. 먼저 다음과 같이 두겠습니다.\n",
+ "이제 남은 질문은 이것이 정말 통하느냐입니다. 실제로 통합니다. 왜 통하는지는 이진 처치에서 했던 것과 비슷하게 증명할 수 있습니다. 먼저 다음과 같이 두겠습니다.\n",
"\n",
"$\n",
"V_i = \\dfrac{(T_i - \\bar{T})}{\\sigma^2_T}\n",
@@ -733,7 +733,7 @@
"Y_i = \\alpha + \\beta T_i + e_i | X_i=x\n",
"$\n",
"\n",
- "이 예제에서는 더운 날과 추운 날 각각의 선형 모델이 여기에 해당합니다. 여기서 관심 있는 것은 $\\beta$ 매개변수이고, 이것이 조건부 탄력성, 즉 CATE입니다. 이 모든 것을 이용하면 다음을 증명할 수 있습니다.\n",
+ "이 예제에서는 더운 날과 추운 날 각각의 선형 모델이 여기에 해당합니다. 여기서 관심 있는 것은 $\\beta$ 매개변수로, 이것이 곧 조건부 탄력성, 즉 CATE입니다. 앞의 성질들을 모두 이용하면 다음을 증명할 수 있습니다.\n",
"\n",
"$\n",
"\\begin{align}\n",
@@ -757,7 +757,7 @@
"Y^*_i = (Y_i- \\bar{Y})(T_i - M(T_i))\n",
"$\n",
"\n",
- "수학이 지루하게 느껴지더라도 걱정하지 마세요. 코드는 정말 간단합니다. 이번에도 위의 공식으로 훈련 데이터의 목표를 변환합니다. 이 데이터는 처치가 무작위로 배정됐으므로 가격을 예측하는 모델을 만들 필요가 없습니다. 또 여기서는 처치효과의 순서만 중요하므로 분모도 생략하겠습니다."
+ "수학이 지루하게 느껴지더라도 걱정하지 마세요. 코드는 정말 간단합니다. 이번에도 위의 공식으로 훈련 데이터의 목표를 변환합니다. 여기서는 처치가 무작위로 배정됐으므로 가격을 예측하는 모델을 만들 필요가 없습니다. 또 여기서는 처치효과의 순서만 중요하므로 분모도 생략하겠습니다."
]
},
{
@@ -890,7 +890,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "이번에는 CATE를 직관적으로 해석하기 어렵습니다. 목표 변환에서 분모를 뺐기 때문에 지금 보이는 CATE는 $Var(X)$만큼 배율이 달라진 값입니다. 그래도 이 예측값은 처치효과의 순서를 꽤 잘 정렬할 것입니다. 이를 확인하려면 앞에서처럼 누적 이득 곡선을 그려 보면 됩니다."
+ "이번에는 CATE를 직관적으로 해석하기 어렵습니다. 목표 변환에서 분모를 뺐기 때문에 지금 보이는 CATE는 $Var(X)$만큼 배율이 달라진 값입니다. 그래도 이 예측값으로 처치효과의 순서는 꽤 잘 매길 수 있을 것입니다. 이를 확인하려면 앞에서처럼 누적 이득 곡선을 그려 보면 됩니다."
]
},
{
@@ -933,11 +933,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "이 데이터에서는 변환된 목표로 학습한 모델이 무작위보다 훨씬 나아 보입니다. 그뿐 아니라 훈련 셋과 테스트 셋의 결과가 꽤 비슷하므로 여기서는 분산이 문제가 되지 않습니다. 하지만 이는 이 데이터셋의 특성일 뿐입니다. 기억하시겠지만 이진 처치를 다룰 때는 그렇지 않았습니다. 그때는 모델 성능이 그리 좋지 않았습니다.\n",
+ "이 데이터에서는 변환된 목표로 학습한 모델이 무작위보다 훨씬 나아 보입니다. 그뿐 아니라 훈련 셋과 테스트 셋의 결과가 꽤 비슷하므로 여기서는 분산이 문제가 되지 않습니다. 하지만 이는 이 데이터셋의 특성일 뿐입니다. 기억하시겠지만 이진 처치를 다룰 때는 그렇지 않았고, 모델 성능도 그리 좋지 않았습니다.\n",
"\n",
"### 비선형 처치효과\n",
"\n",
- "연속형 처치까지 이야기했지만, 아직 외면하고 있던 큰 문제가 하나 남아 있습니다. 지금까지는 처치효과가 선형이라고 가정했습니다. 하지만 이것이 합리적인 가정인 경우는 매우 드뭅니다. 보통 처치효과는 어떤 식으로든 포화됩니다. 이 예제에서는 가격을 처음 몇 단위 올릴 때는 수요가 빠르게 줄다가 그 뒤로는 더 천천히 줄어든다고 보는 것이 합리적입니다.\n",
+ "연속형 처치까지 이야기했지만, 아직 외면하고 있던 큰 문제가 하나 남아 있습니다. 지금까지는 처치효과가 선형이라고 가정했습니다. 하지만 이 가정이 합리적인 경우는 매우 드뭅니다. 보통 처치효과는 어떤 식으로든 포화됩니다. 이 예제에서는 가격을 처음 몇 단위 올릴 때는 수요가 빠르게 줄다가 그 뒤로는 더 천천히 줄어든다고 보는 것이 합리적입니다.\n",
"\n",
"\n",
"\n",
@@ -964,7 +964,7 @@
"\n",
"## 핵심 요약\n",
"\n",
- "이제 머신러닝 모델로 조건부 평균 처치효과를 추정하는 방향으로 나아가고 있습니다. 이때 가장 큰 과제는 예측 모델을 인과효과를 추정하는 모델로 바꾸는 것입니다. 달리 생각해 보면, 예측 모델은 결과 Y를 특성 X와 (경우에 따라) 처치 T의 함수 $Y = M(X, T) $로 추정하는 데 초점을 두지만, 인과 모델은 이 결과 함수를 처치에 대해 편미분한 $ \\partial Y = \\partial M(X, T) $를 추정해야 합니다. 이는 결코 간단하지 않습니다. 결과 Y는 관측할 수 있지만 $\\partial Y$는, 적어도 개별 수준에서는 관측할 수 없기 때문입니다. 그래서 모델의 목적함수를 설계할 때 창의력을 발휘해야 합니다.\n",
+ "이제 머신러닝 모델로 조건부 평균 처치효과를 추정하는 방향으로 나아가고 있습니다. 이때 가장 큰 과제는 예측 모델을 인과효과를 추정하는 모델로 바꾸는 것입니다. 다르게 말하면, 예측 모델은 결과 Y를 특성 X와 (경우에 따라) 처치 T의 함수 $Y = M(X, T) $로 추정하는 데 초점을 두지만, 인과 모델은 이 결과 함수를 처치에 대해 편미분한 $ \\partial Y = \\partial M(X, T) $를 추정해야 합니다. 이는 결코 간단하지 않습니다. 결과 Y는 관측할 수 있어도 $\\partial Y$는 적어도 개별 수준에서는 관측할 수 없기 때문입니다. 그래서 모델의 목적함수를 설계할 때 창의력을 발휘해야 합니다.\n",
"\n",
"이 장에서는 목표 변환이라는 아주 간단한 기법을 살펴봤습니다. 원래 목표 Y와 처치 T를 결합해, 기댓값이 CATE와 같은 변환된 목표를 만드는 것이 핵심 아이디어입니다. 이 새 목표가 있으면 어떤 머신러닝 예측 모델이든 끼워 넣어 추정할 수 있고, 그 모델의 예측값이 곧 CATE의 추정값이 됩니다. 덧붙이면, 이 방법은 목표 변환 말고 **F 러너**라는 이름으로도 불립니다.\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 7bdd2ae..89fad21 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,12 +15,12 @@
"\n",
"처치가 연속형이라면 $E[\\delta Y_i(t)|X]$입니다. 다시 말해 각 대상이 처치에 얼마나 민감한지 알고 싶은 것입니다. 이런 정보는 모두에게 처치를 줄 수 없어서 우선순위를 정해야 할 때 아주 유용합니다. 할인을 주고 싶은데 예산이 한정된 경우가 좋은 예입니다.\n",
"\n",
- "앞 장에서는 결과변수 $Y$를 변환해서 예측 모델에 그대로 넣고 조건부 평균 처치효과(CATE) 추정값을 얻는 방법을 살펴봤습니다. 그 대가로 분산이 커지는 것을 감수해야 했습니다. 데이터 과학에서는 이런 일이 흔합니다. 방법마다 장단점이 있어서 하나만 고를 수 있는 최선의 방법은 없습니다. 그래서 여러 기법을 알아 두었다가 상황에 따라 장단점을 따져 골라 쓰는 것이 좋습니다. 이 장도 그런 취지로, 손에 쥘 수 있는 도구를 더 늘리는 데 집중합니다.\n",
+ "앞 장에서는 결과변수 $Y$를 변환해서 예측 모델에 그대로 넣고 조건부 평균 처치효과(CATE) 추정값을 얻는 방법을 살펴봤습니다. 그 대가로 분산이 커지는 것을 감수해야 했습니다. 데이터 과학에서는 이런 일이 흔합니다. 방법마다 장단점이 있어서 어느 하나가 늘 최선일 수는 없습니다. 그래서 여러 기법을 알아 두었다가 상황에 따라 장단점을 따져 골라 쓰는 것이 좋습니다. 이 장도 그런 취지로, 손에 쥘 수 있는 도구를 더 늘리는 데 집중합니다.\n",
"\n",
"\n",
"\n",
- "메타러너(meta-learner)는 시중에 나와 있는 예측용 머신러닝 기법을 가져다가, 지금까지 다뤄 온 바로 그 문제, 즉 CATE 추정을 푸는 간단한 방법입니다. 이번에도 어느 하나가 최선은 아니며 저마다 약점이 있습니다.\n",
- "하나씩 살펴보겠지만 이 내용은 상황에 크게 좌우된다는 점을 기억해 두세요. 게다가 메타러너는 선형회귀나 부스팅 의사결정 트리부터 신경망, 가우시안 프로세스까지 다양한 예측용 머신러닝 모델을 부품으로 씁니다. 따라서 메타러너의 성패는 어떤 머신러닝 기법을 구성 요소로 쓰느냐에도 크게 달려 있습니다. 결국 여러 가지를 직접 시도해 보고 무엇이 가장 잘 맞는지 확인해야 하는 경우가 많습니다."
+ "메타러너(meta-learner)는 이미 나와 있는 예측용 머신러닝 기법을 그대로 가져다가 지금까지 다뤄 온 문제, 즉 CATE 추정을 푸는 간단한 방법입니다. 이번에도 어느 하나가 최선은 아니며 저마다 약점이 있습니다.\n",
+ "하나씩 살펴보겠지만, 어느 것이 잘 통하는지는 상황에 크게 좌우된다는 점을 기억해 두세요. 게다가 메타러너는 선형회귀나 부스팅 의사결정 트리부터 신경망, 가우시안 프로세스까지 다양한 예측용 머신러닝 모델을 부품으로 씁니다. 따라서 메타러너의 성패는 어떤 머신러닝 기법을 구성 요소로 쓰느냐에도 크게 달려 있습니다. 결국 여러 가지를 직접 시도해 보고 무엇이 가장 잘 맞는지 확인해야 하는 경우가 많습니다."
]
},
{
@@ -201,7 +201,7 @@
"source": [
"## S 러너(일명 '일단 달리고 보는' 러너)\n",
"\n",
- "첫 번째로 쓸 러너는 S 러너(S-learner)입니다. 생각할 수 있는 가장 단순한 러너입니다. 머신러닝 모델 하나(single, 그래서 S입니다) $M_s$로 다음을 추정합니다.\n",
+ "첫 번째로 쓸 러너는 생각할 수 있는 가장 단순한 러너인 S 러너(S-learner)입니다. 머신러닝 모델 하나(single, 그래서 S입니다) $M_s$로 다음을 추정합니다.\n",
"\n",
"$\n",
"\\mu(x) = E[Y| T, X]\n",
@@ -328,7 +328,7 @@
"\n",
"이 그림은 실제 인과효과(빨간 윤곽선)와 S 러너로 추정한 인과효과의 차이 $\\tau - \\hat{\\tau}$를 나타냅니다. 추정된 인과효과가 심하게 편향되어 있습니다.\n",
"\n",
- "더 나쁜 경우도 있습니다. 결과를 설명하는 데 다른 공변량이 하는 역할에 비해 처치의 영향이 아주 약하면, S 러너는 처치변수를 아예 버릴 수도 있습니다. 이 문제는 어떤 머신러닝 모델을 쓰느냐와 밀접하게 관련됩니다. 정규화가 강할수록 문제도 커집니다. 이 문제를 바로잡으려는 시도가 다음에 볼 러너입니다."
+ "더 나쁜 경우도 있습니다. 결과를 설명하는 데 다른 공변량이 하는 역할에 비해 처치의 영향이 아주 약하면, S 러너는 처치변수를 아예 버릴 수도 있습니다. 이는 어떤 머신러닝 모델을 쓰느냐와 밀접하게 관련됩니다. 정규화가 강할수록 문제도 커집니다. 다음에 볼 러너가 이 문제를 바로잡으려는 시도입니다."
]
},
{
@@ -337,7 +337,7 @@
"source": [
"## T 러너\n",
"\n",
- "T 러너(T-learner)는 러너가 처치를 기준으로 먼저 데이터를 나누도록 강제해서 처치를 통째로 버리는 문제를 해결하려고 합니다. 모델 하나를 쓰는 대신 처치변수의 값마다 모델을 하나씩 씁니다. 처치가 이진이면 추정할 모델은 두 개뿐입니다(그래서 이름이 T입니다).\n",
+ "T 러너(T-learner)는 처치를 통째로 버리는 문제를 풀려고, 처치를 기준으로 데이터를 먼저 나누도록 강제합니다. 모델 하나를 쓰는 대신 처치변수의 값마다 모델을 하나씩 씁니다. 처치가 이진이면 추정할 모델은 두 개뿐입니다(그래서 이름이 T입니다).\n",
"\n",
"$\n",
"\\mu_0(x) = E[Y| T=0, X]\n",
@@ -347,7 +347,7 @@
"\\mu_1(x) = E[Y| T=1, X]\n",
"$\n",
"\n",
- "그러고 나서 예측할 때 각 처치 조건에서의 반사실 예측을 구하고, 다음과 같이 CATE를 계산합니다.\n",
+ "예측 단계에서는 처치 조건마다 반사실 예측값을 구하고, 다음과 같이 CATE를 계산합니다.\n",
"\n",
"$\n",
"\\hat{\\tau}(x)_i = M_1(X_i) - M_0(X_i)\n",
@@ -425,7 +425,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "T 러너도 이 데이터셋에서 괜찮은 성능을 보입니다. 테스트 성능은 S 러너와 크게 다르지 않습니다. 처치가 그렇게 약하지 않기 때문일 수 있습니다. 또 훈련 셋 성능이 테스트 셋 성능보다 훨씬 높은데, 모델이 과적합됐다는 신호입니다. 모델마다 데이터의 일부만으로 학습했기 때문에 생길 수 있는 일입니다. 데이터 포인트가 적으니 모델이 잡음까지 학습했을 가능성이 큽니다.\n",
+ "T 러너도 이 데이터셋에서 괜찮은 성능을 보입니다. 테스트 성능은 S 러너와 크게 다르지 않은데, 처치가 그렇게 약하지 않기 때문일 수 있습니다. 또 훈련 셋 성능이 테스트 셋 성능보다 훨씬 높은데, 모델이 과적합됐다는 신호입니다. 모델마다 데이터의 일부만으로 학습했기 때문에 생길 수 있는 일입니다. 데이터 포인트가 적으니 모델이 잡음까지 학습했을 가능성이 큽니다.\n",
"\n",
"T 러너는 약한 처치변수를 놓치는 문제는 피하지만, 여전히 정규화 편향에 시달릴 수 있습니다. Kunzela 등(2019)에서 가져온 다음 상황을 생각해 봅시다. 처치를 받지 않은 대상의 데이터는 아주 많고 처치를 받은 대상의 데이터는 아주 적습니다. 처치에는 대개 비용이 많이 들기 때문에 실제로 꽤 흔한 상황입니다. 이제 결과 Y에는 비선형성이 있지만 **처치효과는 일정하다**고 해 봅시다. 어떤 일이 생기는지 다음 그림에서 볼 수 있습니다.\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 러너로 풀 수 있습니다."
]
},
{
@@ -442,7 +442,7 @@
"source": [
"## X 러너\n",
"\n",
- "X 러너(X-learner)는 앞의 러너들보다 설명하기가 훨씬 복잡하지만 구현은 꽤 간단하니 걱정하지 마세요. X 러너는 두 단계와 성향점수(propensity score) 모델로 이루어집니다. 첫 번째 단계는 T 러너와 똑같습니다. 먼저 표본을 실험군과 대조군으로 나누고, 실험군과 대조군에 각각 머신러닝 모델을 적합합니다.\n",
+ "X 러너(X-learner)는 앞의 러너들보다 설명하기가 훨씬 복잡하지만 구현은 꽤 간단하니 걱정하지 마세요. X 러너는 두 단계와 성향점수(propensity score) 모델로 이루어집니다. 첫 번째 단계는 T 러너와 똑같습니다. 먼저 표본을 실험군과 대조군으로 나누고, 각각에 머신러닝 모델을 적합합니다.\n",
"\n",
"$\n",
"\\hat{M}_0(X) \\approx E[Y| T=0, X]\n",
@@ -472,7 +472,7 @@
"\\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",
"\n",
@@ -492,7 +492,7 @@
"\n",
"보다시피 X 러너는 T 러너보다 비선형 구간에서 잘못 추정된 CATE를 훨씬 잘 바로잡습니다. 일반적으로 X 러너는 한쪽 처치 집단이 다른 쪽보다 훨씬 클 때 더 좋은 성능을 냅니다.\n",
"\n",
- "한 번에 소화하기 벅찰 수 있지만 구현으로 넘어가면 분명해질 것입니다. 전체를 요약한 X 러너의 그림은 다음과 같습니다.\n",
+ "한 번에 소화하기 벅찰 수 있지만 구현을 보고 나면 분명해질 것입니다. 전체를 요약한 X 러너의 그림은 다음과 같습니다.\n",
"\n",
"\n",
"\n",
@@ -645,7 +645,7 @@
"\n",
"## 핵심 요약\n",
"\n",
- "다시 말하지만, 가장 간단한 방법은 처치를 특성으로 넣은 단일 러너, 즉 S 러너를 쓰는 것입니다. 이 방법은 처치가 결과를 약하게 예측하는 변수가 아닐 때 잘 작동하는 편입니다. 그렇지 않다면 S 러너는 처치효과를 0 쪽으로 편향되게 추정하거나 처치를 아예 버리기도 합니다. 조금 더 복잡하게 T 러너를 쓰면 러너가 처치를 반드시 반영하게 만들 수 있습니다. T 러너는 처치 수준마다 머신러닝 모델을 하나씩 적합합니다. 모든 처치 수준에 표본이 충분하면 잘 작동하지만, 어느 한 처치 수준의 표본 크기가 작으면 모델을 강하게 정규화할 수밖에 없어서 실패할 수 있습니다. 이를 바로잡으려면 한 단계 더 복잡한 X 러너를 쓸 수 있습니다. X 러너는 적합을 두 단계로 나누고, 성향점수 모델을 사용해 아주 적은 데이터로 추정한 모델의 실수를 보정합니다.\n",
+ "다시 말하지만, 가장 간단한 방법은 처치를 특성으로 넣은 단일 러너, 즉 S 러너를 쓰는 것입니다. 이 방법은 처치가 결과를 예측하는 힘이 약하지 않을 때 잘 작동하는 편입니다. 그렇지 않다면 S 러너는 처치효과를 0 쪽으로 편향되게 추정하거나 처치를 아예 버리기도 합니다. 조금 더 복잡하게 T 러너를 쓰면 러너가 처치를 반드시 반영하게 만들 수 있습니다. T 러너는 처치 수준마다 머신러닝 모델을 하나씩 적합합니다. 모든 처치 수준에 표본이 충분하면 잘 작동하지만, 어느 한 처치 수준의 표본 크기가 작으면 모델을 강하게 정규화할 수밖에 없어서 실패할 수 있습니다. 이를 바로잡으려면 한 단계 더 복잡한 X 러너를 쓸 수 있습니다. X 러너는 적합을 두 단계로 나누고, 성향점수 모델을 사용해 아주 적은 데이터로 추정한 모델의 실수를 보정합니다.\n",
"\n",
"이 러너들(S 러너 제외)의 큰 문제 하나는 처치가 이진이거나 범주형이라고 가정한다는 점입니다. 아직 다루지 않은, 더 일반적인 러너가 하나 더 있습니다. 바로 R 러너입니다. 하지만 걱정하지 마세요. R 러너만 다루는 장이 따로 있습니다.\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 bcb4df6..85304f7 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,13 +6,13 @@
"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",
"\n",
" \n",
"이 논문의 문제는 딱 하나, 읽기가 엄청나게 어렵다는 점입니다(계량경제학 논문이니 놀랄 일은 아닙니다). 이 책의 목표는 인과추론을 누구나 쓰는 도구로 만드는 것이니, 여기서는 편향 제거/직교화 머신러닝(Debiased/Orthogonal Machine Learning)을 직관적으로 풀어 보려 합니다.\n",
" \n",
- "그런데 다른 메타러너와 따로 떼어 한 장을 통째로 내줄 만큼 특별한 이유가 뭘까요? 제 눈길을 끈 것은 편향 제거/직교화 머신러닝이 이론적으로 아주 탄탄하게 뒷받침된다는 점이었습니다. 지금까지 본 T 러너, S 러너, X 러너는 모두 어딘가 임시방편 같은 느낌이 있었습니다. 왜 작동하는지 직관적으로 설명할 수는 있어도 일반적인 방법처럼 보이지는 않았습니다. 반면 편향 제거/직교화 머신러닝에는 매우 직관적이면서도 아주 엄밀한, 범용으로 적용할 수 있는 틀이 있습니다. 게다가 연속형 처치와 이산형 처치 모두에 쓸 수 있는데, T 러너도 X 러너도 하지 못하는 일입니다. 이 방법을 다룬 논문들이 추정량의 점근적 성질까지 훌륭하게 분석해 두었다는 점은 말할 것도 없습니다. 그럼 더 뜸 들이지 말고 바로 시작하겠습니다.\n",
+ "그런데 다른 메타러너와 따로 떼어 한 장을 통째로 내줄 만큼 특별한 이유가 뭘까요? 제 눈길을 끈 것은 편향 제거/직교화 머신러닝이 이론적으로 아주 탄탄하게 뒷받침된다는 점이었습니다. 지금까지 본 T 러너, S 러너, X 러너는 모두 어딘가 임시방편 같은 느낌이 있었습니다. 왜 작동하는지 직관적으로 설명할 수는 있어도 일반적인 방법처럼 보이지는 않았습니다. 반면 편향 제거/직교화 머신러닝은 매우 직관적이면서도 아주 엄밀한 범용 틀을 갖추고 있습니다. 게다가 연속형 처치와 이산형 처치 모두에 쓸 수 있는데, T 러너도 X 러너도 하지 못하는 일입니다. 이 방법을 다룬 논문들이 추정량의 점근적 성질까지 훌륭하게 분석해 두었다는 점은 말할 것도 없습니다. 그럼 더 뜸 들이지 말고 바로 시작하겠습니다.\n",
" \n",
"이번에도 아이스크림 판매 데이터셋을 예시로 쓰겠습니다. 다시 짚자면, 여기서 찾으려는 것은 가격이 판매량에 미치는 효과의 이질성입니다. 테스트 데이터의 가격은 무작위로 배정되었지만, 훈련 데이터에는 관측된 가격만 있어서 편향되어 있을 수 있습니다."
]
@@ -201,16 +201,14 @@
" \n",
"여기서 $\\pmb{\\beta_3}$는 각 요일 더미에 대응하는 매개변수 벡터입니다.\n",
" \n",
- "관심 있는 것은 처치효과인 $\\tau$ 하나뿐이라는 점에 주목하세요. 나머지 매개변수는 신경 쓰지 않으므로 장애모수(nuisance parameter)라고 부르겠습니다. 그런데 알고 보면 신경 쓰지 않는 매개변수라도 제대로 맞혀야 합니다. 그렇지 않으면 처치효과가 어긋나기 때문입니다. 좀 성가신 일입니다.\n",
+ "관심 있는 것은 처치효과인 $\\tau$ 하나뿐이라는 점에 주목하세요. 나머지 매개변수는 신경 쓰지 않으므로 장애모수(nuisance parameter)라고 부르겠습니다. 그런데 알고 보면 신경 쓰지 않는 매개변수도 제대로 맞혀야 합니다. 그러지 않으면 처치효과 추정값이 어긋납니다. 좀 성가신 일입니다.\n",
" \n",
- "예를 들어 곰곰이 생각해 보면 `temp`와 판매량의 관계는 선형이 아닐 가능성이 큽니다. 처음에는 기온이 오를수록 해변에 가서 아이스크림을 사 먹는 사람이 늘어나니 판매량이 증가합니다. 하지만 어느 순간 너무 더워지면 사람들은 집에 있는 편이 낫다고 판단합니다. 그때부터는 판매량이 줄어듭니다. `temp`와 판매량의 관계는 어딘가에서 정점을 찍은 뒤 감소할 것입니다. 즉, 위 모델은 아마 틀렸습니다. 다음처럼\n",
+ "예를 들어 곰곰이 생각해 보면 `temp`와 판매량의 관계는 선형이 아닐 가능성이 큽니다. 처음에는 기온이 오를수록 해변에 가서 아이스크림을 사 먹는 사람이 늘어나니 판매량이 증가합니다. 하지만 어느 순간 너무 더워지면 사람들은 집에 있는 편이 낫다고 판단합니다. 그때부터는 판매량이 줄어듭니다. `temp`와 판매량의 관계는 어딘가에서 정점을 찍은 뒤 감소할 것입니다. 즉, 위 모델은 아마 틀렸습니다. 다음처럼 제곱항이 들어간 모델이었어야 합니다.\n",
" \n",
"$$\n",
"Sales_i = \\alpha + \\tau price_i + \\beta_1 temp_i + \\beta_2 temp^2_i + \\beta_3 cost_i + \\pmb{\\beta_4} Weekday_i + e_i\n",
"$$\n",
" \n",
- "제곱항이 들어간 모델이었어야 합니다.\n",
- " \n",
"\n",
"\n",
"\n",
@@ -234,7 +232,7 @@
"3. 잔차 $\\tilde{X}_1 = X_1 - \\hat{X_1}$과 $\\tilde{y}_1 = y - \\hat{y^*}$를 구합니다.\n",
"4. 결과의 잔차를 특성의 잔차에 회귀합니다. $\\tilde{y} = \\hat{\\beta_1} \\tilde{X}_1$\n",
" \n",
- "정말 끝내주게 멋진 성질입니다. 여기서는 일반적인 형태로 적었지만, 한쪽 특성 집합이 처치변수 하나일 수도 있다는 점에 주목하세요. 그러면 장애모수를 모두 따로 추정할 수 있습니다. 먼저 결과를 특성에 회귀해 결과의 잔차를 얻습니다. 다음으로 처치를 특성에 회귀해 처치의 잔차를 얻습니다. 마지막으로 결과의 잔차를 특성 잔차에 회귀합니다. 이렇게 하면 결과를 특성과 처치에 한꺼번에 회귀했을 때와 정확히 같은 추정값이 나옵니다.\n",
+ "정말 끝내주게 멋진 성질입니다. 여기서는 일반적인 형태로 적었지만, 한쪽 특성 집합이 처치변수 하나일 수도 있다는 점에 주목하세요. 다시 말해 장애모수를 모두 따로 추정할 수 있다는 뜻입니다. 먼저 결과를 특성에 회귀해 결과의 잔차를 얻습니다. 다음으로 처치를 특성에 회귀해 처치의 잔차를 얻습니다. 마지막으로 결과의 잔차를 특성 잔차에 회귀합니다. 이렇게 하면 결과를 특성과 처치에 한꺼번에 회귀했을 때와 정확히 같은 추정값이 나옵니다.\n",
" \n",
"하지만 제 말만 믿지는 마세요. FWL은 인과추론에 관심 있는 사람이라면 누구나 한 번쯤 직접 해 봐야 합니다. 아래 예시에서는 먼저 공변량이 결과(판매량)와 처치(가격)에 미치는 효과를 추정한 뒤 처치효과를 추정합니다."
]
@@ -340,7 +338,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "보다시피 두 값이 정확히 같습니다! 처치효과를 한 번에 추정하든 FWL 단계로 나눠 추정하든 수학적으로 같다는 사실을 보여 줍니다.\n",
+ "보다시피 두 값이 정확히 같습니다! 처치효과를 한 번에 추정하든 FWL 단계로 나눠 추정하든 수학적으로 같다는 뜻입니다.\n",
" \n",
"달리 말하면, 처치효과는 **잔차에 대한 회귀**로 구할 수 있습니다. $Y$를 $X$에 회귀해 얻은 잔차를, $T$를 $X$에 회귀해 얻은 잔차에 회귀하는 것입니다. $\\sim$를 회귀 연산자라고 하면 FWL 정리를 다음처럼 요약할 수 있습니다.\n",
" \n",
@@ -370,7 +368,7 @@
" \n",
"여기서 $\\hat{M}_y(X_i)$는 $E[Y|X]$를, $\\hat{M}_t(X_i)$는 $E[T|X]$를 추정합니다.\n",
" \n",
- "핵심은 머신러닝 모델이 매우 유연하다는 데 있습니다. 그래서 FWL식 직교화(orthogonalization)를 그대로 유지하면서도 $Y$와 $T$의 잔차를 추정할 때 상호작용과 비선형성을 잡아낼 수 있습니다. 즉, 올바른 처치효과를 얻으려고 공변량 $X$와 결과 $Y$의 관계든 공변량과 처치의 관계든 모수적 가정을 할 필요가 없습니다. 관측되지 않은 교란 요인이 없다면 다음 직교화 절차로 ATE를 구할 수 있습니다.\n",
+ "핵심은 머신러닝 모델이 매우 유연하다는 데 있습니다. 그래서 FWL식 직교화(orthogonalization)를 그대로 유지하면서도 $Y$와 $T$의 잔차를 추정할 때 상호작용과 비선형성을 잡아낼 수 있습니다. 즉, 올바른 처치효과를 얻는 데 공변량 $X$와 결과 $Y$의 관계에도, 공변량과 처치의 관계에도 모수적 가정이 필요 없습니다. 관측되지 않은 교란 요인이 없다면 다음 직교화 절차로 ATE를 구할 수 있습니다.\n",
" \n",
"1. 유연한 머신러닝 회귀 모델 $M_y$로 특성 $X$에서 결과 $Y$를 추정합니다.\n",
"2. 유연한 머신러닝 회귀 모델 $M_t$로 특성 $X$에서 처치 $T$를 추정합니다.\n",
@@ -379,27 +377,27 @@
" \n",
"여기서 $\\tau$는 인과 매개변수인 ATE이며, 예를 들어 OLS로 추정할 수 있습니다.\n",
" \n",
- "머신러닝으로 얻는 힘은 유연성입니다. 머신러닝은 장애모수가 얽힌 관계의 복잡한 함수 형태까지 잡아낼 만큼 강력합니다. 하지만 그 유연성은 골칫거리이기도 합니다. 이제 과적합(overfitting) 가능성을 고려해야 하기 때문입니다.\n",
+ "머신러닝이 주는 힘은 유연성입니다. 머신러닝은 장애모수가 얽힌 관계의 복잡한 함수 형태까지 잡아낼 만큼 강력합니다. 하지만 그 유연성은 골칫거리이기도 합니다. 이제 과적합(overfitting) 가능성을 고려해야 하기 때문입니다.\n",
" \n",
"\n",
" \n",
"과적합이 어떻게 문제를 일으키는지는 Chernozhukov et al (2016)에 훨씬 깊고 엄밀하게 설명되어 있으니 꼭 읽어 보길 권합니다. 여기서는 직관에 기댄 설명으로 이어 가겠습니다.\n",
" \n",
- "문제를 이해하기 위해 $M_y$ 모델이 과적합되었다고 해 봅시다. 그러면 잔차 $\\tilde{Y}$가 원래보다 작아집니다. 이는 $M_y$가 $X$와 $Y$의 관계보다 더 많은 것을 잡아내고 있다는 뜻이기도 합니다. 그 '더 많은 것' 가운데 일부가 $T$와 $Y$의 관계이고, $M_y$가 이를 일부라도 잡아내면 잔차 회귀는 0 쪽으로 편향됩니다. 다시 말해, $M_y$가 인과관계를 가로채서 최종 잔차 회귀에 남겨 두지 않는 것입니다.\n",
+ "무엇이 문제인지 보려고 $M_y$ 모델이 과적합되었다고 해 봅시다. 그러면 잔차 $\\tilde{Y}$가 원래보다 작아집니다. 이는 $M_y$가 $X$와 $Y$의 관계보다 더 많은 것을 잡아내고 있다는 뜻이기도 합니다. 그 '더 많은 것' 가운데 일부가 $T$와 $Y$의 관계이고, $M_y$가 이를 일부라도 잡아내면 잔차 회귀는 0 쪽으로 편향됩니다. 다시 말해, $M_y$가 인과관계를 가로채서 최종 잔차 회귀에 남겨 두지 않는 것입니다.\n",
" \n",
- "이번에는 $M_t$가 과적합될 때의 문제를 보겠습니다. 이 경우 모델은 $T$의 분산을 실제보다 더 많이 설명합니다. 그 결과 처치의 잔차는 분산이 원래보다 작아집니다. 처치의 분산이 작으면 최종 추정량의 분산이 커집니다. 마치 거의 모두가 같은 처치를 받은 것과 같습니다. 모두가 같은 수준의 처치를 받았다면 다른 처치 수준에서 무슨 일이 일어날지 추정하기가 매우 어려워집니다. 덧붙이자면, $T$가 $X$의 결정론적 함수일 때, 즉 양수성(positivity)이 깨질 때도 같은 일이 생깁니다.\n",
+ "이번에는 $M_t$가 과적합될 때의 문제를 보겠습니다. 이 경우 모델은 $T$의 분산을 마땅한 정도보다 더 많이 설명합니다. 그 결과 처치의 잔차는 분산이 원래보다 작아집니다. 처치의 분산이 작으면 최종 추정량의 분산이 커집니다. 마치 거의 모두가 같은 처치를 받은 것과 같습니다. 모두가 같은 수준의 처치를 받았다면 다른 처치 수준에서 무슨 일이 일어날지 추정하기가 매우 어려워집니다. 덧붙이자면, $T$가 $X$의 결정론적 함수일 때, 즉 양수성(positivity)이 깨질 때도 같은 일이 생깁니다.\n",
" \n",
- "머신러닝 모델을 쓰면 이런 문제가 생깁니다. 어떻게 바로잡을 수 있을까요? 답은 교차 예측(cross prediction)과 아웃 오브 폴드(out-of-fold) 잔차에 있습니다.\n",
+ "머신러닝 모델을 쓰면 이런 문제가 생기는데, 어떻게 바로잡을 수 있을까요? 답은 교차 예측(cross prediction)과 아웃 오브 폴드(out-of-fold) 잔차에 있습니다.\n",
" \n",
"\n",
" \n",
- "데이터를 크기가 같은 K개 부분으로 나눕니다. 그런 다음 각 부분 k마다 나머지 K-1개 부분으로 머신러닝 모델을 추정하고, k번째 부분에서 잔차를 만듭니다. 이 잔차는 아웃 오브 폴드 예측으로 만든다는 점에 주목하세요. 모델은 데이터의 한 부분에 적합하고, 예측과 잔차는 다른 부분에서 만듭니다.\n",
+ "데이터를 크기가 같은 K개 부분으로 나눕니다. 그런 다음 각 부분 k마다 나머지 K-1개 부분으로 머신러닝 모델을 추정하고, k번째 부분에서 잔차를 만듭니다. 이 잔차는 아웃 오브 폴드 예측으로 만든다는 점에 주목하세요. 모델은 데이터의 한 부분으로 적합하고, 예측과 잔차는 다른 부분에서 만듭니다.\n",
" \n",
"그래서 모델이 과적합되더라도 잔차를 인위적으로 0으로 몰아가지 않습니다. 마지막으로 K개 부분의 예측을 모두 합쳐 최종 인과 모델 $\\tilde{Y} = \\alpha + \\tau \\tilde{T}$를 추정합니다.\n",
" \n",
"좋습니다. 꽤 많은 내용을 다뤘으니 예시 없이는 따라오기 힘들어질 때가 됐습니다. 지금까지의 이론을 바탕으로 이중/편향 제거 머신러닝을 단계별로 구현해 보겠습니다. 그러면서 단계마다 무엇을 하는지도 설명하겠습니다.\n",
" \n",
- "먼저 머신러닝 모델로 장애모수에 해당하는 관계를 추정합니다. 처치 모델 $M_t$부터 시작하겠습니다. LGBM 모델로 공변량 `temp`, `weekday`, `cost`에서 가격을 예측합니다. 이 예측은 교차 예측으로, `sklearn`의 `cross_val_predict` 함수로 얻을 수 있습니다. 시각화를 위해 잔차에 평균 $\\hat{\\mu_t}$도 더해 두겠습니다."
+ "먼저 머신러닝 모델로 장애모수에 해당하는 관계를 추정합니다. 처치 모델 $M_t$부터 시작하겠습니다. LGBM 모델로 공변량 `temp`, `weekday`, `cost`에서 가격을 예측합니다. 예측은 교차 예측으로 구하며, `sklearn`의 `cross_val_predict` 함수를 쓰면 됩니다. 그래프로 보기 좋게 잔차에 평균 $\\hat{\\mu_t}$도 더해 두겠습니다."
]
},
{
@@ -433,7 +431,7 @@
"source": [
"$M_t$ 모델을 편향 제거 모델(debias model)이라고 부른 점에 주목하세요. 이중/편향 제거 머신러닝에서 이 모델이 맡은 역할이 처치의 편향을 제거하는 것이기 때문입니다. 잔차 $\\tilde{T} = T - M_t(X)$는 $X$에서 오는 교란편향을 모델이 모두 걷어 낸 처치라고 볼 수 있습니다. 즉, $\\tilde{T}$는 $X$와 직교합니다. 직관적으로 보면, 설명할 수 있는 부분은 이미 모두 설명했으니 $\\tilde{T}$는 더 이상 $X$로 설명되지 않습니다.\n",
" \n",
- "이를 확인하기 위해 앞에서 본 그래프를 다시 그리되, 가격 대신 가격의 잔차를 넣어 보겠습니다. 앞에서는 주말 가격이 더 높았던 것을 기억하나요? 이제 그 편향은 사라졌습니다. 모든 요일에서 가격 잔차의 분포가 같습니다."
+ "이를 확인하기 위해 앞에서 본 그래프를 다시 그리되, 가격 대신 가격의 잔차를 넣어 보겠습니다. 앞에서는 주말 가격이 더 높았던 것을 기억하시나요? 이제 그 편향은 사라졌습니다. 모든 요일에서 가격 잔차의 분포가 같습니다."
]
},
{
@@ -471,7 +469,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "$M_t$의 역할이 처치의 편향을 제거하는 것이라면 $M_y$는 무슨 일을 할까요? 이 모델의 역할은 $Y$에서 분산을 덜어 내는 것입니다. 그래서 잡음 제거 모델(denoising model)이라고 부르겠습니다. 직관적으로 $M_y$는 $X$로 생긴 분산을 모두 설명해 없앤 결과를 만들어 냅니다. 그 덕분에 $\\tilde{Y}$에서는 인과 추정이 더 쉬워집니다. 잡음이 줄어드니 인과관계가 더 잘 보입니다."
+ "$M_t$의 역할이 처치의 편향을 제거하는 것이라면 $M_y$는 무슨 일을 할까요? 이 모델의 역할은 $Y$에서 분산을 덜어 내는 것입니다. 그래서 잡음 제거 모델(denoising model)이라고 부르겠습니다. 직관적으로 $M_y$는 $X$로 생긴 분산을 모두 설명해 없앤 결과를 만들어 냅니다. 그 덕분에 $\\tilde{Y}$로는 인과효과를 추정하기가 더 쉽습니다. 잡음이 줄어드니 인과관계가 더 잘 보입니다."
]
},
{
@@ -536,7 +534,7 @@
"source": [
"이제 가격과 판매량의 음의 관계가 한눈에 보입니다.\n",
" \n",
- "마지막으로 이 인과관계를 추정하기 위해 잔차끼리 회귀분석을 합니다."
+ "마지막으로 이 인과관계를 추정하려면 잔차끼리 회귀분석을 하면 됩니다."
]
},
{
@@ -675,7 +673,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "이 모델이 가격 민감도가 높은 분석단위와 낮은 분석단위를 얼마나 잘 구분하는지 확인하기 위해 누적 탄력성 곡선(cumulative elasticity curve)을 쓰겠습니다."
+ "이 모델이 가격 민감도가 높은 분석단위와 낮은 분석단위를 얼마나 잘 구분하는지 보려고 누적 탄력성 곡선(cumulative elasticity curve)을 쓰겠습니다."
]
},
{
@@ -716,9 +714,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "위 곡선에서 보듯이, 최종 모델을 선형으로 둔 이중/편향 제거 머신러닝 절차만으로도 이미 성능이 아주 좋습니다. 하지만 더 잘할 수도 있습니다. 사실 이 절차는 아주 일반적이어서 하나의 메타러너처럼 이해할 수 있습니다. Nie와 Wager는 Robinson(1988)의 업적을 기리고 잔차화의 역할을 강조하는 의미에서 이를 R 러너(R-Learner)라고 불렀습니다.\n",
+ "위 곡선에서 보듯이, 최종 모델을 선형으로 둔 이중/편향 제거 머신러닝 절차만으로도 이미 성능이 아주 좋습니다. 하지만 어쩌면 더 잘할 수도 있습니다. 사실 이 절차는 아주 일반적이어서 하나의 메타러너처럼 이해할 수 있습니다. Nie와 Wager는 Robinson(1988)의 업적을 기리고 잔차화의 역할을 강조하는 의미에서 이를 R 러너(R-Learner)라고 불렀습니다.\n",
" \n",
- "이렇게 일반화할 수 있는 것은 이중/편향 제거 머신러닝 절차가 새로운 손실 함수를 정의한다는 사실 덕분입니다. 이 손실 함수는 원하는 방식으로 최소화할 수 있습니다. 이어서 앞에서 목표 변환(target transformation) 방법, 즉 F 러너를 다룰 때와 아주 비슷한 방식으로 이 손실을 최소화하는 법을 보겠습니다.\n",
+ "이렇게 일반화할 수 있는 것은 이중/편향 제거 머신러닝 절차가 새로운 손실 함수를 정의하고, 그 손실 함수를 원하는 방식으로 최소화할 수 있기 때문입니다. 이어서 앞에서 목표 변환(target transformation) 방법, 즉 F 러너를 다룰 때와 아주 비슷한 방식으로 이 손실을 최소화하는 법을 보겠습니다.\n",
"\n",
"\n",
"## 비모수 이중/편향 제거 머신러닝\n",
@@ -774,7 +772,7 @@
"\\hat{L}_n(\\tau(x)) = \\frac{1}{n} \\sum^n_{i=1}\\bigg(\\big(Y_i - \\hat{M}_y(X_i)\\big) - \\tau(X_i) \\big(T_i - \\hat{M}_t(X)\\big)\\bigg)^2\n",
"$\n",
" \n",
- "이 손실은 R 러너가 최소화하는 손실이라서 **R 손실**(R-Loss)이라고도 부릅니다. 좋습니다. 그런데 이 손실 함수는 어떻게 최소화할까요? 방법은 사실 여러 가지인데, 여기서는 가장 간단한 방법을 다루겠습니다. 먼저 복잡한 표기를 정리하기 위해, 앞의 손실 함수를 잔차화한 처치와 결과로 다시 씁니다.\n",
+ "이 손실은 R 러너가 최소화하는 손실이라서 **R 손실**(R-Loss)이라고도 부릅니다. 좋습니다. 그런데 이 손실 함수는 어떻게 최소화할까요? 방법은 사실 여러 가지인데, 여기서는 가장 간단한 방법을 다루겠습니다. 먼저 표기를 간단히 하려고 앞의 손실 함수를 잔차화한 처치와 결과로 다시 씁니다.\n",
" \n",
"$\n",
"\\hat{L}_n(\\tau(x)) = \\frac{1}{n} \\sum^n_{i=1}\\bigg( \\tilde{Y}_i - \\tau(X_i) \\tilde{T}_i \\bigg)^2\n",
@@ -786,14 +784,14 @@
"\\hat{L}_n(\\tau(x)) = \\frac{1}{n} \\sum^n_{i=1} \\tilde{T}_i^2 \\left(\\frac{\\tilde{Y}_i}{\\tilde{T}_i} - \\tau(X_i)\\right)^2 \n",
"$$\n",
" \n",
- "위 손실을 최소화하는 것은 괄호 안의 항을 최소화하되, 각 항에 $\\tilde{T}_i^2$만큼 가중치를 주는 것과 같습니다. 그리고 괄호 안을 최소화하는 것은 $\\frac{\\tilde{Y}_i}{\\tilde{T}_i}$를 예측하는 것과 같습니다. 이것이 비모수 인과 손실을 얻는 가중치 트릭(weight trick)입니다. 앞에서 본 목표 변환 아이디어와 얼마나 비슷한지 보세요. 실제로 이것은 목표 변환에 가중치 트릭을 더한 것입니다.\n",
+ "위 손실을 최소화하는 것은 괄호 안의 항을 최소화하되, 각 항에 $\\tilde{T}_i^2$만큼 가중치를 주는 것과 같습니다. 그리고 괄호 안을 최소화하는 것은 $\\frac{\\tilde{Y}_i}{\\tilde{T}_i}$를 예측하는 것과 같습니다. 이것이 비모수 인과 손실을 얻는 가중치 트릭(weight trick)입니다. 앞에서 본 목표 변환 아이디어와 얼마나 비슷한지 보세요. 실제로 이 방법은 가중치 트릭을 더한 목표 변환입니다.\n",
" \n",
"코드로 넘어가기 전에 정리하면, 장애모수 모델과 잔차화한 처치·결과가 준비된 지금 할 일은 다음과 같습니다.\n",
"1. 가중치 $\\tilde{T}_i^2$를 만듭니다.\n",
"2. 목표 $\\dfrac{\\tilde{Y}_i}{\\tilde{T}_i}$를 만듭니다.\n",
- "3. 아무 예측 방법이나 써서, 가중치(1)를 적용해 목표(2)를 예측합니다.\n",
+ "3. 아무 예측 방법으로나 가중치(1)를 적용해 목표(2)를 예측합니다.\n",
" \n",
- "코드는 다음과 같습니다. 보다시피 놀라울 만큼 간단합니다."
+ "코드는 다음과 같습니다. 보면 알겠지만 놀라울 만큼 간단합니다."
]
},
{
@@ -823,7 +821,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "위 머신러닝 모델은 그저 기성 예측 모델일 뿐인데도 CATE를 추정하고 있습니다. 이것이 비모수 이중 머신러닝의 힘입니다. 앞에서는 CATE 추정의 최종 모델로 선형회귀를 썼습니다. 이제는 범용 손실을 정의했으니 손에 쥔 어떤 예측 모델이든 최종 모델로 쓸 수 있습니다.\n",
+ "위 머신러닝 모델은 그저 기성 예측 모델일 뿐인데도 CATE를 추정하고 있습니다. 이것이 비모수 이중 머신러닝의 힘입니다. 앞에서는 CATE를 추정하는 최종 모델로 선형회귀를 썼지만, 이제는 범용 손실을 정의했으니 손에 쥔 어떤 예측 모델이든 최종 모델로 쓸 수 있습니다.\n",
" \n",
"이제 테스트 데이터로 이 비모수 버전을 앞의 선형 버전과 비교해 보겠습니다.\n",
" \n",
@@ -895,7 +893,7 @@
"\n",
"### 무엇이 비모수적이라는 걸까?\n",
" \n",
- "넘어가기 전에 흔한 오해 하나를 짚고 싶습니다. 비모수 이중 머신러닝 모델로 CATE를 추정한다고 하면, 비선형 처치효과를 얻을 수 있을 것처럼 보입니다. 예를 들어 할인이 판매량에 비선형으로, 그것도 제곱근 함수를 통해 영향을 주는 아주 간단한 데이터 생성 과정(DGP)을 가정해 봅시다.\n",
+ "넘어가기 전에 흔한 오해 하나를 짚고 싶습니다. 비모수 이중 머신러닝 모델로 CATE를 추정한다고 하면, 비선형 처치효과를 얻을 수 있을 것처럼 보입니다. 예를 들어 할인이 판매량에 비선형으로, 그것도 제곱근 함수의 형태로 영향을 주는 아주 간단한 데이터 생성 과정(DGP)을 가정해 봅시다.\n",
" \n",
"$\n",
"Sales_i = 20 + 10*\\sqrt{Discount_i} + e_i\n",
@@ -907,9 +905,9 @@
"\\dfrac{\\partial Sales_i}{\\partial Discount_i} = \\dfrac{10}{2\\sqrt{Discount_i}}\n",
"$\n",
" \n",
- "보다시피 처치효과는 선형이 **아닙니다**. 처치가 커질수록 오히려 약해집니다. 이 DGP에서는 아주 자연스러운 일입니다. 처음에는 할인을 조금만 해도 판매량이 크게 늘어납니다. 하지만 할인을 너무 많이 하면, 사람들이 한없이 사고 싶어 하지는 않으니 할인을 한 단위 더할 때마다 판매량에 미치는 영향은 점점 줄어듭니다. 따라서 할인은 사람들이 충분히 샀다고 느끼는 지점까지만 효과가 있습니다.\n",
+ "보다시피 처치효과는 선형이 **아닙니다**. 처치가 커질수록 오히려 약해집니다. 이 DGP에서는 아주 자연스러운 일입니다. 처음에는 할인을 조금만 해도 판매량이 크게 늘어납니다. 하지만 사람들이 한없이 사고 싶어 하지는 않으니, 할인이 많아질수록 할인을 한 단위 더할 때 판매량에 미치는 영향은 점점 줄어듭니다. 따라서 할인은 사람들이 충분히 샀다고 느끼는 지점까지만 효과가 있습니다.\n",
" \n",
- "그렇다면 비모수 머신러닝이 처치효과의 이런 포화 현상을 잡아낼 수 있을까요? 할인 수준이 낮은 데이터에서 출발해, 할인이 더 컸다면 처치효과가 더 작았으리라는 것까지 외삽할 수 있을까요? 답은... 어느 정도는 그렇습니다. 더 잘 이해하기 위해 위 DGP대로 데이터를 생성해 보겠습니다."
+ "그렇다면 비모수 머신러닝이 처치효과의 이런 포화 현상을 잡아낼 수 있을까요? 할인 수준이 낮은 데이터에서 출발해, 할인이 더 컸다면 처치효과가 더 작았으리라는 것까지 외삽할 수 있을까요? 답은... 어느 정도는 그렇습니다. 자세히 알아보려고 위 DGP대로 데이터를 생성해 보겠습니다."
]
},
{
@@ -1013,11 +1011,11 @@
" \n",
"말로 풀면, 잔차화한 결과는 잔차화한 처치에 조건부 처치효과를 곱한 값과 같다는 뜻입니다. 즉, **처치가 결과에 선형으로 영향을 준다**는 것입니다. 여기에는 비선형성이 없습니다. 위 모델에 따르면 처치를 1에서 10으로 올리든 100에서 110으로 올리든 결과는 고정된 양 $\\tau(X_i) $만큼 늘어납니다. 단순한 곱셈이니까요.\n",
" \n",
- "그럼 비모수 모델로는 처치효과의 비선형성을 잡아낼 수 없다는 뜻일까요? 이번에도 꼭 그렇지는 않습니다... 실제로 일어나는 일은 이중 머신러닝이 **비선형 CATE의 국소 선형 근사를 찾는다**는 것입니다. 다시 말해 해당 처치 수준에서, 또는 그 근처에서 처치에 대한 결과의 도함수를 찾습니다. 이는 처치 지점에서 결과 함수에 접하는 직선의 기울기를 찾는 것과 같습니다.\n",
+ "그럼 비모수 모델로는 처치효과의 비선형성을 잡아낼 수 없다는 뜻일까요? 이번에도 꼭 그렇지는 않습니다... 실제로는 이중 머신러닝이 **비선형 CATE의 국소 선형 근사를 찾습니다**. 다시 말해 해당 처치 수준에서, 또는 그 근처에서 처치에 대한 결과의 도함수를 찾습니다. 이는 처치 지점에서 결과 함수에 접하는 직선의 기울기를 찾는 것과 같습니다.\n",
" \n",
"\n",
" \n",
- "그러니까 비모수 이중 머신러닝은 처치를 늘릴수록 처치효과가 작아진다는 사실은 알아냅니다. 하지만 비선형 처치효과 자체를 찾지는 못하고, 국소 선형 처치효과를 찾을 뿐입니다. 이 선형 근사들을 실제 비선형 인과효과와 함께 그려 보면 꽤 좋은 근사라는 것을 알 수 있습니다."
+ "그러니까 비모수 이중 머신러닝은 처치를 늘릴수록 처치효과가 작아진다는 사실은 알아냅니다. 하지만 비선형 처치효과 자체를 찾지는 못하고, 국소 선형 처치효과를 찾을 뿐입니다. 이 선형 근사들을 참값인 비선형 인과효과와 함께 그려 보면 꽤 좋은 근사라는 것을 알 수 있습니다."
]
},
{
@@ -1069,11 +1067,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "사소한 기술적 차이처럼 들릴 수 있지만, 실무에서는 아주 중요한 결과로 이어집니다. 예를 들어 위 예시에서 어떤 고객의 처치효과가 2로 나왔다고 합시다. 할인을 1단위 늘리면 그 고객에 대한 판매량이 2단위 늘어난다는 뜻입니다. 이 결과를 보고 이렇게 생각할 수 있습니다. \"좋았어! 이 고객에게 할인을 왕창 줘야지! 할인 1단위마다 판매량이 2단위씩 늘어나니까.\" 하지만 이는 잘못된 결론입니다. 처치효과가 2인 것은 그 할인 수준에서만입니다. 할인을 늘리는 순간 효과는 떨어집니다. 예를 들어 이 가상의 고객이 받은 할인이 5밖에 안 돼서 처치효과가 그렇게 높게 나왔다고 해 봅시다. 그 큰 처치효과를 근거로 이 고객에게 할인을 20이나 주기로 했다고 합시다. 그런데 그렇게 하면 효과가 2에서 0.5 정도로 떨어질 수 있습니다. 처치효과가 2일 때는 타당했던 20의 할인이 처치효과가 0.5일 때는 더 이상 수익이 나지 않을 수도 있습니다.\n",
+ "사소한 기술적 차이처럼 들릴 수 있지만, 실무에서는 아주 중요한 결과로 이어집니다. 예를 들어 위 예시에서 어떤 고객의 처치효과가 2로 나왔다고 합시다. 할인을 1단위 늘리면 그 고객에 대한 판매량이 2단위 늘어난다는 뜻입니다. 이 결과를 보고 이렇게 생각할 수 있습니다. \"좋았어! 이 고객에게 할인을 왕창 줘야지! 할인 1단위마다 판매량이 2단위씩 늘어나니까.\" 하지만 이는 잘못된 결론입니다. 처치효과 2는 딱 그 할인 수준에서만 성립합니다. 할인을 늘리는 순간 효과는 떨어집니다. 예를 들어 이 가상의 고객이 받은 할인이 5밖에 안 돼서 처치효과가 그렇게 높게 나왔다고 해 봅시다. 그런데 그 큰 처치효과를 근거로 이 고객에게 할인을 20이나 주면 효과가 2에서 0.5 정도로 떨어질 수 있습니다. 처치효과가 2일 때는 타당했던 할인 20이 처치효과가 0.5가 되면 더는 수익을 내지 못할 수도 있습니다.\n",
" \n",
"즉, 비선형 처치효과를 새로운 처치 수준으로 외삽할 때는 각별히 조심해야 합니다. 그러지 않으면 수익성이 아주 나쁜 결정을 내릴 수 있습니다. 달리 말하면, 처치효과가 선형이 아닐 때는 비모수 이중/편향 제거 머신러닝조차 **반사실적 결과를 예측하는 데 애를 먹습니다**. 처치효과(TE)를 낮은 처치 수준에서 높은 처치 수준으로, 또는 그 반대로 선형 외삽하려 들기 때문입니다. 그리고 비선형성 때문에 그 외삽은 빗나가기 쉽습니다.\n",
" \n",
- "이를 해결할 마지막 아이디어가 하나 있습니다. 다만 이 아이디어는 지금까지 본 내용보다 훨씬 덜 과학적이라는 점을 염두에 두세요. 요약하면 직교화 절차를 거친 뒤 S 러너를 쓰는 것인데, 이야기가 너무 앞서 나갔습니다. 다음에서 자세히 보겠습니다.\n",
+ "이를 해결할 마지막 아이디어가 하나 있습니다. 다만 이 아이디어는 지금까지 본 내용보다 훨씬 덜 과학적이라는 점을 염두에 두세요. 요약하면 직교화 절차를 거친 뒤 S 러너를 쓰는 것인데, 이야기가 너무 앞서 나갔습니다. 다음 절에서 자세히 보겠습니다.\n",
"\n",
"\n",
"\n",
@@ -1085,7 +1083,7 @@
" \n",
"CATE는 데이터 지점에서 결과 함수의 기울기입니다. 처치를 아주 조금 늘렸을 때 결과가 얼마나 바뀔지를 나타냅니다. 좀 더 기술적으로 말하면 그 지점에서의 미분계수입니다. 반면 반사실 예측은 데이터 지점 하나로 결과 곡선 전체를 재구성하려는 시도입니다. 처치가 지금과 다른 수준이었다면 결과가 어땠을지 예측하므로 반사실 예측이라고 부릅니다.\n",
" \n",
- "이렇게 할 수 있다면 한 분석단위에 여러 처치를 시뮬레이션해 보고, 처치 수준마다 그 분석단위가 어떻게 반응할지 예측할 수 있습니다. 점 하나에서 곡선 전체를 외삽하는 것이니 아주 위험한 일입니다. 게다가 저는 이 기법을 실무에서 많이 써 왔지만, 이 기법이 어떻게, 왜 통하는지 보여 주는 과학 논문은 한 편도 찾지 못했습니다. 그래서 비과학적 이중 머신러닝이라고 부르는 것입니다. 한마디로, 조심하세요!\n",
+ "이렇게 할 수 있다면 한 분석단위에 여러 처치를 시뮬레이션해 보고, 처치 수준마다 그 분석단위가 어떻게 반응할지 예측할 수 있습니다. 점 하나에서 곡선 전체를 외삽하는 것이니 아주 위험한 일입니다. 게다가 저는 이 기법을 실무에서 많이 써 왔지만, 어떻게, 왜 통하는지 보여 주는 과학 논문은 한 편도 찾지 못했습니다. 그래서 비과학적 이중 머신러닝이라고 부르는 것입니다. 한마디로, 조심하세요!\n",
" \n",
"진행 방식은 다음과 같습니다. 먼저 잔차화한 처치와 결과로 쓴 전통적인 이중/편향 제거 머신러닝 식에서 출발합니다.\n",
" \n",
@@ -1099,7 +1097,7 @@
"\\tilde{Y}_i = \\tau(X_i, \\tilde{T}_i) + e_i\n",
"$\n",
" \n",
- "이 처치 함수가 어떻게 생겼는지 전혀 모르니 위험한 일입니다. 어쩌면 아주 이상한 비선형 함수일지도 모릅니다. 하지만 다행히 이상한 함수를 추정하는 방법은 알고 있습니다. 바로 머신러닝입니다. 그러니 그렇게 하겠습니다. 간단히 말해, 잔차화한 처치 $\\tilde{T}$와 특성 $X$를 함께 넣어 잔차화한 결과 $\\tilde{Y}$를 예측하는 머신러닝 모델을 적합합니다. 잔차화가 중요한 이유는 편향과 잡음을 없애야 최종 머신러닝 모델이 처치효과와, 공변량 $X$가 그 처치효과에 미치는 영향만 학습하는 데 집중할 수 있기 때문입니다.\n",
+ "이 처치 함수가 어떻게 생겼는지 전혀 모르니 위험한 일입니다. 어쩌면 아주 이상한 비선형 함수일지도 모릅니다. 하지만 다행히 이상한 함수를 추정하는 방법은 알고 있습니다. 바로 머신러닝입니다. 그러니 머신러닝을 쓰겠습니다. 간단히 말해, 잔차화한 처치 $\\tilde{T}$와 특성 $X$를 함께 넣어 잔차화한 결과 $\\tilde{Y}$를 예측하는 머신러닝 모델을 적합합니다. 잔차화가 중요한 이유는 편향과 잡음을 없애야 최종 머신러닝 모델이 처치효과와, 공변량 $X$가 그 처치효과에 미치는 영향만 학습하는 데 집중할 수 있기 때문입니다.\n",
" \n",
"이 모델이 준비되면 반사실 예측을 두 단계로 합니다. 먼저 처치를 예측해 $\\tilde{T}$를 구하고, 그 예측을 특성과 함께 최종 모델 $\\hat{\\tau}(X_i, \\tilde{T}_i)$에 넣습니다.\n",
" \n",
@@ -1372,7 +1370,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "인덱스 0인 날, 즉 분석단위 하나만 보여 주고 있다는 점에 주목하세요. 그날(분석단위)의 실제 가격, 즉 사실적 처치는 7이었습니다. 하지만 3부터 10까지 여러 반사실적 처치를 시뮬레이션했습니다. 이제 이 반사실적 가격을 모두 인과 모델에 넣으면, 모델이 시뮬레이션한 가격을 바탕으로 반사실적 판매량을 예측합니다.\n",
+ "위 결과는 인덱스 0인 날, 즉 분석단위 하나만 보여 줍니다. 그날(분석단위)의 실제 가격, 즉 사실적 처치는 7이었습니다. 하지만 3부터 10까지 여러 반사실적 처치를 시뮬레이션했습니다. 이제 이 반사실적 가격을 모두 인과 모델에 넣으면, 모델이 시뮬레이션한 가격을 바탕으로 반사실적 판매량을 예측합니다.\n",
" \n",
"모델은 다음과 같은 형태이므로\n",
" \n",
@@ -1563,7 +1561,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "보다시피 이제 시뮬레이션한 가격마다 판매량 예측값이 있습니다. 가격이 낮을수록 판매량이 높습니다. 흥미로운 점은 예측값의 수준이 어긋나 있다는 것입니다. 예를 들어 약 24에서 약 -24까지 걸쳐 있습니다. 모델이 평균이 대략 0인 잔차화한 결과를 예측하기 때문입니다. 가격의 처치효과, 즉 판매량 곡선의 기울기만 알고 싶다면 이대로도 괜찮습니다. 예측값의 수준까지 바로잡고 싶다면 잡음 제거 모델 $M_y$의 예측값을 더하기만 하면 됩니다."
+ "보다시피 이제 시뮬레이션한 가격마다 판매량 예측값이 있습니다. 가격이 낮을수록 판매량이 높습니다. 흥미로운 점은 예측값의 수준이 어긋나 있다는 것입니다. 예를 들어 예측값이 약 24에서 약 -24까지 걸쳐 있습니다. 모델이 예측하는 것이 평균이 대략 0인 잔차화한 결과이기 때문입니다. 가격의 처치효과, 즉 판매량 곡선의 기울기만 알고 싶다면 이대로도 괜찮습니다. 예측값의 수준까지 바로잡고 싶다면 잡음 제거 모델 $M_y$의 예측값을 더하기만 하면 됩니다."
]
},
{
@@ -1782,7 +1780,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "일부 분석단위는 가격 인상에 아주 민감하다는 점이 흥미롭습니다. 어떤 경우에는 가격을 3에서 10으로 올리면 판매량이 250에서 200 가까이 떨어질 것으로 예상됩니다. 반면 가격에 아주 비탄력적인 분석단위도 있습니다. 가격을 3에서 10으로 올려도 판매량은 약 195에서 약 185로 줄어들 뿐입니다.\n",
+ "흥미롭게도 일부 분석단위는 가격 인상에 아주 민감합니다. 어떤 경우에는 가격을 3에서 10으로 올리면 판매량이 250에서 200 가까이 떨어질 것으로 예상됩니다. 반면 가격에 아주 비탄력적인 분석단위도 있습니다. 가격을 3에서 10으로 올려도 판매량은 약 195에서 약 185로 줄어들 뿐입니다.\n",
" \n",
"이런 가격 민감도 차이는 한눈에 보기 어렵습니다. 그래서 저는 모든 곡선이 같은 지점(여기서는 평균 판매량)에서 시작하도록 맞추는 편입니다. 이렇게 하면 가격을 올릴 때 판매량이 가파르게 떨어지는 분석단위와 그렇지 않은 분석단위를 더 쉽게 구분할 수 있습니다."
]
@@ -1834,9 +1832,9 @@
" \n",
"비과학적 이중 머신러닝에 관한 이 절은 주의 사항으로 마무리하겠습니다. 괜히 이 방법을 비과학적이라고 부른 게 아닙니다. 비선형 반사실 예측을 얻기 위한 일종의 편법입니다. 그리고 편법인 만큼 잠재적인 단점을 짚어 둘 필요가 있습니다.\n",
" \n",
- "무엇보다도, 머신러닝 기법을 인과추론에 아무 고민 없이 적용할 때 늘 생기는 문제, 즉 편향을 이 방법도 똑같이 안고 있습니다. 최종 모델이 정규화된 머신러닝 모델이므로, 그 정규화 때문에 인과 추정값이 0 쪽으로 편향될 수 있습니다.\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 2e3ee27..6edeccb 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
@@ -6,9 +6,9 @@
"source": [
"# 23 - Challenges with Effect Heterogeneity and Nonlinearity\n",
"\n",
- "개별 대상 수준에서 처치효과를 예측하기란 무척 어렵습니다. 참값(ground truth)이 없기 때문입니다. 잠재적 결과 $T(t)$ 중 하나만 관측할 수 있으니 처치효과를 직접 추정할 수는 없습니다. 그 대신 목표 변환(target transformation)에 기대야 하고(목표 변환은 영리하게 설계한 손실 함수로 볼 수도 있습니다), 그마저도 조건부 처치효과를 기댓값으로만 추정할 수 있습니다. 어려움은 이것만이 아닙니다. 처치효과는 워낙 종잡을 수 없어서 그 추정량에 잡음이 상당히 많이 끼곤 합니다. 개인화된 처치 배정처럼 처치효과에 따라 대상을 나누려는 응용 분야에서는 이 점이 실무적으로 아주 큰 문제가 됩니다.\n",
+ "개별 대상 수준에서 처치효과를 예측하기란 무척 어렵습니다. 참값(ground truth)이 없기 때문입니다. 잠재적 결과 $T(t)$ 중 하나만 관측할 수 있으니 처치효과를 직접 추정할 수는 없습니다. 그래서 목표 변환(target transformation)에 기대야 하는데(목표 변환은 영리하게 설계한 손실 함수로 볼 수도 있습니다), 이 방법으로도 조건부 처치효과는 기댓값으로만 추정할 수 있습니다. 어려움은 이것만이 아닙니다. 처치효과는 워낙 종잡을 수 없어서 추정량에도 잡음이 많이 끼곤 합니다. 개인화된 처치 배정처럼 처치효과에 따라 대상을 나누려는 응용 분야에서는 이 점이 실무적으로 아주 큰 문제가 됩니다.\n",
"\n",
- "이번 장에서는 이런 경우를 살펴봅니다. 조건부 평균 처치효과(CATE)를 직접 추정하지 않고 대개 분산이 더 작은 다른 대리 목표에 집중하면, 오히려 처치효과에 따라 대상을 더 잘 나눌 수 있는 경우입니다. 관심 있는 결과변수 $Y$가 이진(binary)일 때 이런 일이 흔히 일어납니다.\n",
+ "그런데 때로는 조건부 평균 처치효과(CATE)를 직접 추정하지 않고 대개 분산이 더 작은 다른 대리 목표에 집중할 때, 오히려 처치효과에 따라 대상을 더 잘 나눌 수 있습니다. 이번 장에서는 이런 경우를 살펴봅니다. 관심 있는 결과변수 $Y$가 이진(binary)일 때 이런 일이 흔히 일어납니다.\n",
"\n",
"## 이진 결과에서의 처치효과"
]
@@ -92,25 +92,25 @@
"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",
- "아주 단순하면서도 현실과 동떨어지지 않은 예를 만들어 보겠습니다. 처치인 `nudge`는 $p=0.5$인 베르누이 분포에서 뽑아 완전히 무작위로 배정되도록 시뮬레이션합니다. 공정한 동전을 던져 처치를 배정한다는 뜻입니다. 따라서 신경 써야 할 교란도 없습니다.\n",
+ "아주 단순하면서도 현실과 동떨어지지 않은 예를 만들어 보겠습니다. 처치 `nudge`는 $p=0.5$인 베르누이 분포에서 뽑아 완전히 무작위로 배정합니다. 공정한 동전을 던져 처치를 배정한다는 뜻입니다. 따라서 신경 써야 할 교란도 없습니다.\n",
"\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",
"$ income \\sim G(20, 2) $\n",
"\n",
- "마지막으로 전환을 시뮬레이션합니다. 이를 위해 먼저 무작위 잡음이 섞인 **선형 모델을 따르는 잠재변수(latent variable)를 만듭니다**. 여기서 중요한 점이 있습니다. `income`은 $Y_{latent}$를 아주 잘 예측하지만 **처치효과를 바꾸지는 않습니다**. 쉽게 말해 넛지는 `income` 수준과 관계없이 $Y_{latent}$를 똑같이 올립니다. 반대로 `age`는 `nudge` 처치와의 상호작용을 통해서만 $Y_{latent}$에 영향을 줍니다.\n",
+ "마지막으로 전환을 시뮬레이션합니다. 이를 위해 먼저 무작위 잡음이 섞인 **선형 모델을 따르는 잠재변수(latent variable)를 만듭니다**. 여기서 중요한 점이 있습니다. `income`은 $Y_{latent}$를 아주 잘 예측하지만 **처치효과를 바꾸지는 않습니다**. 쉽게 말해 넛지는 `income` 수준과 관계없이 $Y_{latent}$를 똑같이 올립니다. 반대로 `age`는 `nudge` 처치와 상호작용할 때만 $Y_{latent}$에 영향을 줍니다.\n",
"\n",
"$Y_{latent} \\sim N(-4.5 + 0.001 \\ income + nudge + 0.01 \\ nudge \\ age, 1)$\n",
"\n",
@@ -180,7 +180,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "평균 처치효과는 처치가 무작위로 배정되었으므로 실험군과 대조군의 단순 평균 차이 $E[Y|T=1] - E[Y|T=0]$로 추정할 수 있습니다. 그러면 처치 여부별 평균이 어떻게 나오는지 보겠습니다. 잠재 결과와 전환 두 관점에서 모두 살펴봅니다. 여기서 눈여겨볼 중요한 점이 있습니다."
+ "평균 처치효과부터 보겠습니다. 처치를 무작위로 배정했으므로 실험군과 대조군의 단순 평균 차이 $E[Y|T=1] - E[Y|T=0]$로 추정할 수 있습니다. 처치 여부별 평균을 잠재 결과와 전환 두 관점에서 모두 살펴보겠습니다. 여기에 눈여겨볼 중요한 점이 있습니다."
]
},
{
@@ -293,9 +293,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "잠재 결과에 대한 ATE는 꽤 단순합니다. 데이터 생성 모델을 보면 이 효과는 `1 + avg(age)*0.01`이어야 합니다. 평균 나이가 40 정도이므로 ATE는 약 1.4가 됩니다. 조금 더 흥미로운(그리고 복잡한) 쪽은 전환에 대한 ATE입니다. **전환은 0과 1 사이로 제한되기 때문에 전환에 대한 ATE는 선형이 아닙니다**. 그래서 잠재 결과처럼 간단한 공식으로 이끌어 낼 수 없습니다(공식이 있긴 하지만 꽤 복잡합니다). 일단은 효과가 더 작다고만 해 둡시다. 당연한 일 아닐까요? 전환은 100%를 넘을 수 없으니 처치가 전환을 1.4포인트나 올릴 방법은 없습니다. 이 사실을 꼭 기억해 두세요. 이어서 볼 내용을 이해하는 데 결정적인 역할을 합니다.\n",
+ "잠재 결과에 대한 ATE는 꽤 단순합니다. 데이터 생성 모델을 보면 이 효과는 `1 + avg(age)*0.01`이어야 합니다. 평균 나이가 40 정도이므로 ATE는 약 1.4가 됩니다. 조금 더 흥미로운(그리고 복잡한) 쪽은 전환에 대한 ATE입니다. **전환은 0과 1 사이로 제한되기 때문에 전환에 대한 ATE는 선형이 아닙니다**. 그래서 잠재 결과처럼 간단한 공식으로 이끌어 낼 수 없습니다(공식이 있긴 하지만 꽤 복잡합니다). 일단은 효과가 더 작다고만 해 둡시다. 생각해 보면 당연합니다. 전환은 100%를 넘을 수 없으니, 처치가 전환을 1.4포인트나 올릴 수는 없습니다. 이 사실을 꼭 기억해 두세요. 이어서 볼 내용을 이해하는 데 결정적인 역할을 합니다.\n",
"\n",
- "이제 조건부 평균 처치효과(CATE) 이야기를 해 보겠습니다. 데이터 생성 과정을 보면 `estimated_income`은 전환을 예측하지만 넛지가 전환에 미치는 효과를 바꾸지는 않는다는 사실을 확실히 알고 있습니다. 따라서 `estimated_income`을 기준으로 고객을 나누면 처치효과가 같은 세그먼트들이 만들어질 것입니다. 반면 `age`는 넛지와의 상호작용을 통해서만 전환에 영향을 줍니다. 그러므로 나이 세그먼트마다 처치에 대한 반응이 크게 다르겠지만, 소득 세그먼트끼리는 그렇지 않을 것입니다. 즉, `estimated_income`은 좋은 개인화 변수가 아니어야 하고 `age`는 좋은 개인화 변수여야 합니다.\n",
+ "이제 조건부 평균 처치효과(CATE) 이야기를 해 보겠습니다. 데이터 생성 과정을 알고 있으니, `estimated_income`이 전환을 예측하기는 해도 넛지가 전환에 미치는 효과는 바꾸지 않는다는 것은 확실합니다. 따라서 `estimated_income`을 기준으로 고객을 나누면 처치효과가 같은 세그먼트들이 만들어질 것입니다. 반면 `age`는 넛지와 상호작용할 때만 전환에 영향을 줍니다. 그러므로 나이 세그먼트마다 처치에 대한 반응이 크게 다르겠지만, 소득 세그먼트끼리는 그렇지 않을 것입니다. 즉, `estimated_income`은 좋은 개인화 변수가 아니어야 하고 `age`는 좋은 개인화 변수여야 합니다.\n",
"\n",
"이는 누적 효과 곡선(cumulative effect curve)으로 확인할 수 있습니다. `age`의 곡선은 ATE에서 아주 멀리 떨어진 곳에서 시작해 서서히 ATE로 수렴해야 하고, `estimated_income`의 곡선은 ATE 주변에서 오르내리기만 해야 합니다. 넛지가 잠재 결과에 미치는 효과로 누적 효과 곡선을 그려 보면 정확히 이 모습이 나타납니다."
]
@@ -337,7 +337,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "역시 잠재 결과는 아주 깔끔합니다. 선형이기 때문에 예상과 실제가 꽤 잘 맞아떨어집니다. 하지만 현실에서는 잠재 결과에 관심도 없고, 관측할 수도 없습니다. 가진 것은 전환뿐입니다. 그리고 전환으로 보면 그림이 훨씬 복잡해집니다. 누적 효과 곡선을 그려 보면 `age`는 여전히 어느 정도 처치효과 이질성을 보입니다. ATE보다 위에서 시작해 서서히 ATE로 수렴합니다. 나이가 많을수록 처치효과가 크다는 뜻입니다. 여기까지는 괜찮습니다. 예상한 그대로입니다."
+ "역시 잠재 결과는 아주 깔끔합니다. 선형이기 때문에 예상과 실제가 꽤 잘 맞아떨어집니다. 하지만 현실에서는 잠재 결과에 관심도 없고, 관측할 수도 없습니다. 가진 것은 전환뿐입니다. 그런데 전환으로 보면 그림이 훨씬 복잡해집니다. 누적 효과 곡선을 그려 보면 `age`는 여전히 어느 정도 처치효과 이질성을 보입니다. ATE보다 위에서 시작해 서서히 ATE로 수렴합니다. 나이가 많을수록 처치효과가 크다는 뜻입니다. 여기까지는 괜찮습니다. 예상한 그대로입니다."
]
},
{
@@ -377,9 +377,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "그런데 `estimated_income`에 따른 처치효과 이질성도 엄청나게 큽니다. `estimated_income`이 높은 고객은 처치효과가 훨씬 낮습니다. 그 때문에 누적 효과 곡선이 0에서 출발해 ATE를 훌쩍 넘어섰다가 그제야 ATE로 수렴합니다. 이는 개인화 관점에서 `estimated_income`으로 나눈 세그먼트가 `age`로 나눈 세그먼트보다 처치효과 이질성(TEH)이 더 크다는 뜻입니다.\n",
+ "그런데 `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)별 평균 전환을 그려 보면 이 모양을 확인할 수 있습니다."
]
},
{
@@ -426,11 +426,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "전환이 아주 높을 때 이 곡선의 기울기(도함수)가 무척 작다는 점에 주목하세요. 전환이 아주 낮을 때도 기울기가 작습니다(다만 그 구간은 표본이 적어서 알아보기가 더 어렵습니다). 이 사실로 `estimated_income`이 처치효과 이질성이 큰 세그먼트를 만드는 이유를 설명할 수 있습니다.\n",
+ "전환이 아주 높을 때 이 곡선의 기울기(도함수)가 무척 작다는 점에 주목하세요. 전환이 아주 낮을 때도 기울기가 작습니다(다만 그 구간은 표본이 적어서 알아보기가 더 어렵습니다). 이제 `estimated_income`으로 나눈 세그먼트의 처치효과 이질성이 큰 이유를 설명할 수 있습니다.\n",
"\n",
- "`estimated_income`은 전환을 아주 잘 예측하므로, `estimated_income`이 다른 고객은 S자 전환 곡선 위에서 서로 다른 위치에 있다고 볼 수 있습니다. `estimated_income`이 아주 높거나 아주 낮은 고객은 곡선의 양 끝에 있습니다. 그곳은 도함수가 작아서 전환을 끌어올리기 어렵고, 결국 처치효과도 작을 가능성이 큽니다. 반면 소득이 중간 범위에 있는 고객은 전환 곡선에서도 가운데에 놓입니다. 그곳은 도함수가 커서 처치효과도 클 가능성이 큽니다. '가능성이 크다'고 말한 이유는, 이론적으로는 어떤 변수가 처치효과를 바꾸는 힘이 너무 강해서 전환 곡선을 따라 움직일 때 생기는 도함수 변화를 압도할 수도 있기 때문입니다. 하지만 적어도 제 경험으로는 S자 전환 곡선의 곡률이 다른 모든 효과 수정(effect modification)을 압도하는 경향이 있습니다.\n",
+ "`estimated_income`은 전환을 아주 잘 예측하므로, `estimated_income`이 다른 고객은 S자 전환 곡선 위에서 서로 다른 위치에 있다고 볼 수 있습니다. `estimated_income`이 아주 높거나 아주 낮은 고객은 곡선의 양 끝에 있습니다. 그곳은 도함수가 작아서 전환을 끌어올리기 어렵고, 결국 처치효과도 작을 가능성이 큽니다. 반면 소득이 중간 범위에 있는 고객은 전환 곡선에서도 가운데에 놓입니다. 그곳은 도함수가 커서 처치효과도 클 가능성이 큽니다. '가능성이 크다'고 한 데는 이유가 있습니다. 이론적으로는 어떤 변수가 처치효과를 바꾸는 힘이 아주 강해서, 전환 곡선을 따라 움직일 때 생기는 도함수 변화를 압도할 수도 있습니다. 하지만 적어도 제 경험으로는 S자 전환 곡선의 곡률이 다른 모든 효과 수정(effect modification)을 압도하는 경향이 있습니다.\n",
"\n",
- "저만 이렇게 생각하는 것은 아닙니다. 다음은 Susan Athey가 Columbia Data Science Institute에서 발표한 자료의 슬라이드입니다. 여기서 Athey는 학생들이 대학 학비를 마련하려고 연방 학자금 지원을 신청하도록 유도하는 넛지의 효과를 다룹니다. 이것도 전환 문제입니다. Athey가 발견한 사실은 이미 전환할 가능성이 높은 학생을 겨냥하는 것이 최선의 전략이라는 것입니다. 또 전환 확률이 낮은 학생을 겨냥하는 것은 좋지 않은 생각이라고 말합니다.\n",
+ "저만 이렇게 생각하는 것은 아닙니다. 다음은 Susan Athey가 Columbia Data Science Institute에서 발표한 자료의 슬라이드입니다. 여기서 Athey는 학생들이 대학 학비를 마련하려고 연방 학자금 지원을 신청하도록 유도하는 넛지의 효과를 다룹니다. 이것도 전환 문제입니다. Athey는 이미 전환할 가능성이 높은 학생을 겨냥하는 것이 최선의 전략이라는 사실을 발견했습니다. 전환 확률이 낮은 학생을 겨냥하는 것은 좋지 않다고도 말합니다.\n",
"\n",
"\n",
"\n",
@@ -467,7 +467,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "전환이 비선형이라는 사실을 바탕으로 무슨 일이 일어날지 미리 예측할 수 있습니다. 전환율이 낮은 상황에서는 기준 전환율이 높은 고객(`estimated_income`이 높은 고객)을 겨냥하는 편이 훨씬 효과적일 것입니다. S자 전환 곡선의 왼쪽에 있기 때문입니다. 이 구간에서는 기준 전환율이 낮을수록 도함수가 작습니다. 즉, 이 구간에서는 **기준 전환율이 높으면 처치효과도 큽니다**. 따라서 기준 전환율이 높은 고객, 곧 `estimated_income`이 높은 고객에게 넛지를 주어야 합니다."
+ "전환이 비선형이라는 사실을 알고 있으니 무슨 일이 일어날지 미리 짐작할 수 있습니다. 전환율이 낮은 상황에서는 기준 전환율이 높은 고객(`estimated_income`이 높은 고객)을 겨냥하는 편이 훨씬 효과적일 것입니다. S자 전환 곡선의 왼쪽에 있기 때문입니다. 이 구간에서는 기준 전환율이 낮을수록 도함수가 작습니다. 즉, 여기서는 **기준 전환율이 높으면 처치효과도 큽니다**. 따라서 기준 전환율이 높은 고객, 곧 `estimated_income`이 높은 고객에게 넛지를 주어야 합니다."
]
},
{
@@ -509,7 +509,7 @@
"source": [
"예측한 대로 `estimated_income`이 높은 고객, 즉 기준 전환율이 높은 고객의 처치효과가 훨씬 큽니다.\n",
"\n",
- "이제 평균 전환율이 높은 반대 상황에서는 **기준 전환율이 높은 고객의 처치효과가 더 작을 것입니다**. 그러므로 `estimated_income`이 높은 고객을 겨냥하는 것은 나쁜 생각입니다. 누적 효과 곡선이 뒤집힌 모양으로 나타나는 것을 보면 알 수 있습니다. 이 곡선은 `estimated_income`이 높은 고객일수록 처치효과가 작다는 것을 보여 줍니다."
+ "반대로 평균 전환율이 높은 상황에서는 **기준 전환율이 높은 고객의 처치효과가 더 작을 것입니다**. 그러므로 `estimated_income`이 높은 고객을 겨냥하는 것은 나쁜 생각입니다. 누적 효과 곡선이 뒤집힌 모양인 것을 보면 알 수 있습니다. `estimated_income`이 높은 고객일수록 처치효과가 작게 나타납니다."
]
},
{
@@ -566,11 +566,11 @@
"source": [
"# 연속형 처치와 비선형성\n",
"\n",
- "지금까지 이진 결과가 이질적 처치효과(heterogeneous treatment effect) 분석을 어렵게 만드는 예 하나를 깊이 살펴보았습니다. 하지만 이 현상은 마케팅의 전환 문제에만 국한되지 않습니다. 예를 들어 2021년, 세계는 처음으로 승인된 코로나19 백신을 일반 대중에게 공급했습니다. 당시 핵심 질문은 누가 먼저 백신을 맞아야 하느냐였습니다. 놀랄 것도 없이 이는 이질적 처치효과 문제입니다. 정책 입안자들은 가장 큰 혜택을 볼 사람들에게 먼저 백신을 접종하고 싶어 했습니다. 이 상황에서 처치효과는 사망이나 입원을 막는 것입니다. 그렇다면 백신을 맞았을 때 사망이나 입원 가능성이 가장 많이 줄어드는 사람은 누구일까요? 대부분의 나라에서는 노인과 기저질환(동반 질환)이 있는 사람들이었습니다. 이들은 **코로나19에 감염되면 사망할 가능성이 더 높은 사람들**입니다. 또한 코로나19 치명률은 (다행히도!) 50%보다 훨씬 낮으므로 로지스틱 함수의 왼쪽에 해당합니다. 이 구간에서는 마케팅 사례와 같은 논리로, 코로나19에 걸렸을 때 기준 사망 확률이 높은 사람들에게 처치하는 것이 합리적입니다. 바로 앞에서 말한 그룹들입니다. 이것이 우연일까요? 그럴지도 모릅니다. 저는 보건 전문가가 아니니 완전히 틀렸을 수도 있다는 점은 감안해 주세요. 하지만 제가 보기에는 논리가 아주 그럴듯합니다.\n",
+ "지금까지 이진 결과가 이질적 처치효과(heterogeneous treatment effect) 분석을 어렵게 만드는 예 하나를 깊이 살펴보았습니다. 하지만 이 현상은 마케팅의 전환 문제에만 국한되지 않습니다. 예를 들어 2021년에는 처음 승인된 코로나19 백신이 일반 대중에게 공급되기 시작했습니다. 당시 핵심 질문은 누가 먼저 백신을 맞아야 하느냐였습니다. 놀랄 것도 없이 이는 이질적 처치효과 문제입니다. 정책 입안자들은 가장 큰 혜택을 볼 사람들에게 먼저 백신을 접종하고 싶어 했습니다. 이 상황에서 처치효과는 사망이나 입원을 막는 것입니다. 그렇다면 백신을 맞았을 때 사망이나 입원 가능성이 가장 많이 줄어드는 사람은 누구일까요? 대부분의 나라에서는 노인과 기저질환(동반 질환)이 있는 사람들이었습니다. 이들은 **코로나19에 감염되면 사망할 가능성이 더 높은 사람들**입니다. 또한 코로나19 치명률은 (다행히도!) 50%보다 훨씬 낮으므로 로지스틱 함수의 왼쪽에 해당합니다. 이 구간에서는 마케팅 사례와 같은 논리로, 코로나19에 걸렸을 때 기준 사망 확률이 높은 사람들을 먼저 처치하는 것이 합리적입니다. 바로 앞에서 말한 그룹입니다. 이것이 우연일까요? 그럴지도 모릅니다. 저는 보건 전문가가 아니니 완전히 틀렸을 수도 있다는 점은 감안해 주세요. 하지만 제가 보기에는 논리가 아주 그럴듯합니다.\n",
"\n",
- "마케팅 넛지와 코로나19 백신 두 사례 모두에서 **처치효과 이질성을 복잡하게 만드는 핵심 요인은 결과 함수 $Y(0)$의 비선형성입니다**. 이 비선형성 때문에 $Y(0)$에서 $Y(1)$로 갈 때 결과가 늘어나는 정도가 주로 결과 함수의 곡률에 따라 정해집니다. 앞에서는 $E[Y|X]$가 로지스틱 모양을 따르는 이진 결과에서 이런 일이 어떻게 일어나는지 보았습니다. 하지만 이 현상은 더 일반적입니다. 실제로 비즈니스에서 계속 불거지는 문제이고, 처치가 연속형 변수라면 특히 그렇습니다. 요점을 확실히 짚기 위해 마지막 예를 하나 더 살펴보겠습니다.\n",
+ "마케팅 넛지와 코로나19 백신 두 사례 모두에서 **처치효과 이질성을 복잡하게 만드는 핵심 요인은 결과 함수 $Y(0)$의 비선형성입니다**. 이 비선형성 때문에 $Y(0)$에서 $Y(1)$로 갈 때 결과가 늘어나는 정도가 주로 결과 함수의 곡률에 따라 정해집니다. 앞에서는 $E[Y|X]$가 로지스틱 모양을 따르는 이진 결과에서 이런 일이 어떻게 일어나는지 보았습니다. 하지만 이 현상은 훨씬 더 일반적입니다. 실제로 비즈니스에서 계속 불거지는 문제이고, 처치가 연속형 변수라면 특히 그렇습니다. 요점을 확실히 짚기 위해 마지막 예를 하나 더 살펴보겠습니다.\n",
"\n",
- "전형적인 가격 책정 문제를 생각해 봅시다. 넷플릭스나 HBO 같은 스트리밍 회사에서 일한다고 해 보겠습니다. 회사가 답을 얻고 싶은 핵심 질문은 고객에게 가격을 얼마로 매길지입니다. 이 질문에 답하려고 회사는 고객을 서로 다른 가격의 요금제(월 5헤알, 월 10헤알, 월 15헤알, 월 20헤알)에 무작위로 배정하는 실험을 합니다. 이렇게 해서 고객이 가격 인상에 얼마나 민감한지뿐 아니라, 어떤 유형의 고객이 다른 고객보다 더 민감한지도 알아내려 합니다. 아래 그래프는 이 실험 결과를 두 고객 세그먼트로 나누어 보여 줍니다. `A`는 추정 소득이 높은 고객이고, `B`는 추정 소득이 낮은 고객입니다."
+ "전형적인 가격 책정 문제를 생각해 봅시다. 넷플릭스나 HBO 같은 스트리밍 회사에서 일한다고 해 보겠습니다. 회사가 가장 알고 싶은 것은 고객에게 가격을 얼마로 매길지입니다. 이 질문에 답하려고 회사는 고객을 서로 다른 가격의 요금제(월 5헤알, 월 10헤알, 월 15헤알, 월 20헤알)에 무작위로 배정하는 실험을 합니다. 이렇게 해서 고객이 가격 인상에 얼마나 민감한지뿐 아니라, 어떤 유형의 고객이 다른 고객보다 더 민감한지도 알아내려 합니다. 아래 그래프는 이 실험 결과를 두 고객 세그먼트로 나누어 그린 것입니다. `A`는 추정 소득이 높은 고객이고, `B`는 추정 소득이 낮은 고객입니다."
]
},
{
@@ -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,9 +741,9 @@
"source": [
"## 핵심 요약\n",
"\n",
- "답을 드리기보다 질문을 더 많이 던진 것 같습니다. 아쉽지만 어떤 문제는 그런 문제가 있다는 사실을 똑똑히 알아 두는 것이 할 수 있는 최선일 때도 있습니다. 이 장에서 관심 있는 결과가 비선형일 때 생기는 복잡한 문제들에 눈뜰 수 있었기를 바랍니다.\n",
+ "답을 드리기보다 질문을 더 많이 던진 것 같습니다. 아쉽지만 때로는 문제가 있다는 사실을 똑똑히 알아 두는 것이 할 수 있는 최선입니다. 이 장에서 관심 있는 결과가 비선형일 때 생기는 복잡한 문제들에 눈뜰 수 있었기를 바랍니다.\n",
"\n",
- "이진 결과에서는 흔하고 연구도 더 많이 된 문제입니다. 이 경우 평균 결과가 0.5에 가까울수록 처치효과가 커지는 경향이 있습니다. 결과가 0과 1 사이로 제한되므로 0이나 1에 너무 가까우면 효과가 아주 작아지는 경향이 있습니다.\n",
+ "이 문제는 이진 결과에서 흔하고 연구도 더 많이 되어 있습니다. 이 경우 평균 결과가 0.5에 가까울수록 처치효과가 커지는 경향이 있습니다. 결과가 0과 1 사이로 제한되므로 0이나 1에 너무 가까우면 효과가 아주 작아지기 쉽습니다.\n",
"\n",
"연속형 결과에서 비선형성이 생기면 상황이 더 복잡해집니다. 이때 할 수 있는 최선은 문제를 아주 신중하게 생각하는 것입니다. 처치의 기준 수준과 상관없이 처치효과 자체에 더 관심이 있는지, 아니면 기준 수준이 중요한지 스스로 답해 보세요. 그것만으로도 귀중한 길잡이가 될 것입니다.\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 bdf41b9..ee2c07a 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
@@ -42,10 +42,10 @@
"\n",
"오프라인 마케팅에서는 문제가 더 커집니다. TV 캠페인이 비용보다 큰 가치를 가져왔는지 어떻게 알 수 있을까요? 그래서 마케팅에서는 지역 실험(geo-experiment)을 흔히 활용합니다. 일부 지역에만 마케팅 캠페인을 진행하고 나머지 지역에는 진행하지 않은 뒤 둘을 비교하는 방식입니다. 이런 설계에서는 패널데이터 방법이 특히 유용합니다. 한 지역 전체(대상)의 데이터를 여러 기간에 걸쳐 모을 수 있기 때문입니다. 이러한 데이터를 해석하고 인과효과를 식별하는 데 가장 널리 쓰이는 방법은 아마 이중차분법(DID) 계열일 것입니다.\n",
"\n",
- "2020년과 2021년은 대부분의 사람에게 쉽지 않은 해였습니다. 그런데 DID에게는 유난히 혹독한 시기였습니다. 최근 여러 연구가 이 방법들의 심각한 결함을 짚어 냈는데, 과거에는 잘 알려지지 않았던 결함들입니다. 1부에도 DID를 다룬 장이 있지만 그 내용은 입문 수준이라서, 패널데이터 방법을 둘러싼 새로운 발견과 뜨거운 논의는 담고 있지 않습니다. 이제 DID부터 시작해 이 방법들을 좀 더 깊이 들여다볼 때입니다. 이 장에서는 최근 드러난 DID의 문제를 정리하고 이를 어떻게 고칠 수 있는지 보여 드리겠습니다. 이 장은 세 부분으로 나뉩니다.\n",
+ "2020년과 2021년은 대부분의 사람에게 쉽지 않은 해였습니다. 그런데 DID에게는 유난히 혹독한 시기였습니다. 최근 여러 연구가 과거에는 잘 알려지지 않았던 이 방법들의 심각한 결함을 짚어 냈습니다. 1부에도 DID를 다룬 장이 있지만 그 내용은 입문 수준이라서, 패널데이터 방법을 둘러싼 새로운 발견과 뜨거운 논의는 담고 있지 않습니다. 이제 DID부터 시작해 이 방법들을 좀 더 깊이 들여다볼 때입니다. 이 장에서는 최근 드러난 DID의 문제를 정리하고 고치는 방법도 보여 드리겠습니다. 이 장은 세 부분으로 나뉩니다.\n",
"\n",
"1. **탄생**: 패널데이터가 인과추론에 왜 그렇게 매력적인지, DID와 이원고정효과(TWFE)가 시간 구조를 어떻게 활용하는지 다시 짚어 봅니다.\n",
- "2. **죽음**: DID와 TWFE 모델에 깔려 있지만 그동안 간과된 핵심 가정 하나를 뜯어봅니다. 이 가정이 언제, 어떻게 무너지는지 이해합니다.\n",
+ "2. **죽음**: DID와 TWFE 모델에 깔려 있지만 그동안 간과된 핵심 가정 하나를 뜯어봅니다. 이 가정이 언제, 어떻게 무너지는지 알아봅니다.\n",
"3. **깨달음**: DID와 TWFE의 문제를 알았으니 이제 해결책을 생각해 볼 수 있습니다. 2절에서 살펴본 문제를 간단히 우회하는 방법을 보여 드립니다.\n",
"\n",
"바로 시작해 봅시다!\n",
@@ -54,11 +54,11 @@
"\n",
"\n",
"\n",
- "앞서 말했듯이 패널데이터는 여러 대상 `i`를 여러 기간 `t`에 걸쳐 관측한 데이터입니다. 미국에서 대마초 합법화가 범죄율에 미치는 영향을 평가하는 정책 평가 상황을 생각해 봅시다. 여러 주 `i`의 범죄율 데이터가 여러 기간 `t`에 걸쳐 있습니다. 또 각 주가 언제 대마초 합법화 쪽으로 법을 바꿨는지도 알고 있습니다. 이것이 인과추론에 얼마나 강력한지 감이 오실 겁니다. 대마초 합법화를 처치 `D`라고 부르겠습니다(`T`는 이미 시간을 나타내는 데 쓰고 있으니까요). 결국 처치를 받게 되는 어떤 주의 범죄율 추세를 따라가다가 처치 시점에 추세가 꺾이는지 볼 수 있습니다. 어떤 의미에서는 처치 전후 비교에서 그 주가 자기 자신의 대조군 역할을 하는 셈입니다. 게다가 주가 여러 개이므로 처치받은 주와 대조군 주를 비교할 수도 있습니다. 실험군 대 대조군, 처치 전 대 처치 후라는 두 비교를 합치면 반사실(counterfactual), 나아가 인과효과를 추론하는 매우 강력한 도구가 됩니다.\n",
+ "앞서 말했듯이 패널데이터는 여러 대상 `i`를 여러 기간 `t`에 걸쳐 관측한 데이터입니다. 미국에서 대마초 합법화가 범죄율에 미치는 영향을 알아보는 정책 평가 상황을 생각해 봅시다. 여러 주 `i`의 범죄율 데이터가 여러 기간 `t`에 걸쳐 있습니다. 또 각 주가 언제 대마초 합법화 쪽으로 법을 바꿨는지도 알고 있습니다. 이런 데이터가 인과추론에 얼마나 강력한지 감이 오실 겁니다. 대마초 합법화를 처치 `D`라고 부르겠습니다(`T`는 이미 시간을 나타내는 데 쓰고 있으니까요). 결국 처치를 받게 되는 어떤 주의 범죄율 추세를 따라가다가 처치 시점에 추세가 꺾이는지 볼 수 있습니다. 어떤 의미에서는 처치 전후 비교에서 그 주가 자기 자신의 대조군 역할을 하는 셈입니다. 게다가 주가 여러 개이므로 처치받은 주와 대조군 주를 비교할 수도 있습니다. 실험군 대 대조군, 처치 전 대 처치 후라는 두 비교를 합치면 반사실(counterfactual), 나아가 인과효과를 추론하는 매우 강력한 도구가 됩니다.\n",
"\n",
"패널데이터 방법은 정부 정책 평가에 자주 쓰이지만, IT 업계에서도 아주 유용하다는 점은 쉽게 알 수 있습니다. 기업은 사용자 데이터를 여러 기간에 걸쳐 추적하는 경우가 많아서 풍부한 패널데이터를 갖게 됩니다. 그뿐 아니라 실험이 불가능해서 다른 식별 전략에 기대야 할 때도 있습니다. 이 생각을 더 구체적으로 살펴보기 위해, 여러 도시에서 자사 앱을 설치한 사람 수를 추적하는 신생 IT 기업의 가상 사례를 생각해 봅시다. 이 회사는 2021년 어느 시점에 앱에 새 기능을 출시했습니다. 이제 회사는 그 기능 덕분에 신규 사용자가 얼마나 늘었는지 알고 싶어 합니다. 출시는 점진적으로 이루어졌습니다. 일부 도시는 `2021-06-01`에, 다른 도시는 `2021-07-15`에 기능을 받았습니다. 나머지 도시에는 2022년에야 전면 출시됩니다. 데이터가 `2021-07-31`까지만 있으므로 이 마지막 그룹을 대조군으로 볼 수 있습니다. 인과추론의 용어로 말하면 이 기능의 출시는 처치, 설치 수는 결과입니다. 알고 싶은 것은 결과에 대한 처치효과, 즉 새 기능이 설치 수에 미치는 효과입니다.\n",
"\n",
- "이 회사가 왜 실험을 할 수 없는지 짚어 볼 필요가 있습니다. 누가 새 기능의 존재를 알게 될지 통제할 수 없기 때문입니다. 이럴 때 처치 배정을 제한적으로만 통제할 수 있다고 말합니다. 분석단위가 **아직 고객이 아닌 사람들**이기 때문입니다. 회사는 그중 몇 명을 앱 설치로 이끌어 고객으로 전환할 수 있는지 알고 싶어 합니다. 당연히 이 사람들을 대상으로는 아무것도 무작위로 배정할 수 없습니다. 그래서 분석단위를 도시로 바꿨습니다. 어떤 도시에는 출시하고 다른 도시에는 출시하지 않는 것은 회사가 통제할 수 있지만, 사람마다 출시 여부를 정하는 것은 그렇지 않습니다.\n",
+ "이 회사가 여기서 실험을 할 수 없다는 점에 주목하세요. 누가 새 기능을 알게 될지 통제할 수 없기 때문입니다. 이런 경우를 두고 처치 배정을 제한적으로만 통제할 수 있다고 말합니다. 분석단위가 **아직 고객이 아닌 사람들**이라서 그렇습니다. 회사는 그중 몇 명을 앱 설치로 이끌어 고객으로 전환할 수 있는지 알고 싶어 합니다. 당연히 이 사람들을 대상으로는 아무것도 무작위로 배정할 수 없습니다. 그래서 분석단위를 도시로 바꿨습니다. 어떤 도시에는 출시하고 다른 도시에는 출시하지 않는 것은 회사가 통제할 수 있지만, 사람마다 출시 여부를 정하는 것은 그렇지 않습니다.\n",
"\n",
"특정 시점에 기능을 받은(처치받은) 도시 그룹을 코호트(cohort)라고 합니다. 이 예에는 코호트가 세 개 있습니다. `2021-06-01`에 처치받은 코호트, `2021-07-15`에 처치받은 코호트, 그리고 데이터가 끝난 뒤에야 처치받는 대조군 코호트입니다. 데이터가 어떻게 생겼는지 감을 잡기 위해 코호트별 일평균 설치 수를 그려 보겠습니다."
]
@@ -142,17 +142,17 @@
"id": "923d605f",
"metadata": {},
"source": [
- "점선은 각 코호트가 처치받은(기능이 출시된) 시점을 표시합니다. 위 그래프에 담긴 데이터가 얼마나 풍부한지 잠시 감상해 보세요. 먼저 코호트마다 기준 수준이 다릅니다. 도시마다 인구 규모가 달라서 도시 크기에 따라 설치 수가 많거나 적기 때문입니다. 예를 들어 첫 번째 코호트(06/01에 처치)의 도시들은 다른 코호트의 도시들보다 기준 수준이 높아 보입니다. 또 대조군 코호트는 설치 수의 기준 수준이 더 낮아 보입니다. 따라서 실험군 코호트와 대조군 코호트를 단순 비교하면 편향된 결과가 나옵니다. 대조군의 $Y_{0}$가 실험군의 $Y_{0}$보다 낮기 때문입니다. 즉 $Y_{0}|G=Control < Y_{0}|G=Treated$이며, 여기서 $G$는 코호트를 나타냅니다. 다행히 이는 문제가 되지 않습니다. 패널데이터에서는 도시 간 비교**와** 시간 간 비교를 함께 할 수 있으므로 기준 수준의 차이를 보정할 수 있습니다.\n",
+ "점선은 각 코호트가 처치받은(기능이 출시된) 시점을 표시합니다. 위 그래프에 담긴 데이터가 얼마나 풍부한지 잠시 감상해 보세요. 먼저 코호트마다 기준 수준이 다릅니다. 도시마다 인구 규모가 달라서 설치 수도 많거나 적기 때문입니다. 예를 들어 첫 번째 코호트(06/01에 처치)의 도시들은 다른 코호트의 도시들보다 기준 수준이 높아 보입니다. 또 대조군 코호트는 설치 수의 기준 수준이 더 낮아 보입니다. 따라서 실험군 코호트와 대조군 코호트를 단순 비교하면 편향된 결과가 나옵니다. 대조군의 $Y_{0}$가 실험군의 $Y_{0}$보다 낮기 때문입니다. 즉 $Y_{0}|G=Control < Y_{0}|G=Treated$이며, 여기서 $G$는 코호트를 나타냅니다. 다행히 이는 문제가 되지 않습니다. 패널데이터에서는 도시 간 비교**와** 시간 간 비교를 함께 할 수 있으므로 기준 수준의 차이를 보정할 수 있습니다.\n",
"\n",
- "시간 이야기가 나왔으니, 전체적으로 우상향 추세가 있고 그 위에 약간의 출렁임(주간 계절성처럼 보입니다)이 있다는 점도 보세요. 대조군 코호트만 보면 일 설치 수가 5월 약 10건에서 6월 약 11건으로 1건 정도 늘었습니다. 기술적으로 말하면 뒤쪽 기간의 $Y_{0}$가 앞쪽 기간보다 높습니다. 따라서 같은 도시를 시간에 걸쳐 단순 비교해도 편향된 결과가 나옵니다. 이번에도 다행히 패널데이터 구조 덕분에 시간 간 비교뿐 아니라 도시 간 비교도 할 수 있어서 추세를 보정할 수 있습니다.\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",
"$$\n",
"\n",
- "다음 질문은 가진 데이터로 이 값을 어떻게 추정하느냐입니다. 한 가지 방법은 패널데이터 구조의 힘을 빌려 반사실을 추정하는 것입니다. 예를 들어 선형회귀와 DID 공식을 써서 이원고정효과모델을 만들 수 있습니다. 각 도시 `i`에 기본 설치 수준 $\\gamma_i$가 있다고 해 봅시다. 앞에서 본 내용과 이어지는 이야기입니다. 어떤 도시는 인구가 많아서, 혹은 그 도시의 문화가 회사 제품과 잘 맞아서 설치 수가 많을 수 있습니다. 이유가 무엇이든, 또 이유를 모르더라도, 이런 대상별 고유한 특성은 **시간에 대해 고정된 매개변수** $\\gamma_i$로 포착할 수 있다고 봅니다. 마찬가지로 각 기간 `t`에도 기준 설치 수준이 있고, 이는 **대상에 대해 고정된 매개변수** $\\theta_t$로 포착할 수 있습니다. 그렇다면 설치 수가 도시(대상) 효과 $\\gamma$와 시간 효과 $\\theta$, 그리고 약간의 무작위 잡음으로 정해진다고 모델링하는 것이 좋은 방법입니다.\n",
+ "다음 질문은 가진 데이터로 이 값을 어떻게 추정하느냐입니다. 한 가지 방법은 패널데이터 구조의 힘을 빌려 반사실을 추정하는 것입니다. 예를 들어 선형회귀와 DID 공식을 써서 이원고정효과모델을 만들 수 있습니다. 각 도시 `i`에 기본 설치 수준 $\\gamma_i$가 있다고 해 봅시다. 앞에서 본 내용과 이어지는 이야기입니다. 어떤 도시는 인구가 많아서, 혹은 그 도시의 문화가 회사 제품과 잘 맞아서 설치 수가 많을 수 있습니다. 이유가 무엇이든, 또 이유를 모르더라도, 이런 대상별 고유한 특성은 **시간에 대해 고정된 매개변수** $\\gamma_i$로 포착할 수 있다고 봅니다. 마찬가지로 각 기간 `t`에도 기준 설치 수준이 있고, 이는 **대상에 대해 고정된 매개변수** $\\theta_t$로 포착할 수 있습니다. 그렇다면 설치 수는 도시(대상) 효과 $\\gamma$와 시간 효과 $\\theta$, 그리고 약간의 무작위 잡음으로 정해진다고 모델링하면 좋습니다.\n",
"\n",
"> 옮긴이: 원문의 표현을 그대로 옮겼지만, 이름 때문에 헷갈릴 수 있습니다. γᵢ는 시간이 지나도 변하지 않는 도시별 값이고 θₜ는 모든 도시에 똑같이 적용되는 기간별 값입니다. 보통은 γᵢ를 대상 고정효과(unit fixed effect), θₜ를 시간 고정효과(time fixed effect)라고 부릅니다.\n",
"\n",
@@ -161,15 +161,15 @@
"Installs_{it} = \\gamma_i + \\theta_t + e_{it}\n",
"$$\n",
"\n",
- "처치를 이 그림에 넣기 위해, 대상이 처치받았으면 1이고 아니면 0인 변수 $D_{it}$를 정의합시다. 이 예에서 이 변수는 처치를 전혀 받지 않는 코호트에서는 항상 0입니다. 다른 코호트에서도 처음에는 0이지만, 06/01에 처치받은 코호트에서는 06/01에 1로 바뀌고 그 뒤로 계속 1을 유지합니다. 07/15에 처치받은 코호트에서는 07/15에 1로 바뀝니다. 이 처치 지표를 설치 수 모델에 다음과 같이 넣을 수 있습니다.\n",
+ "처치를 모델에 넣기 위해, 대상이 처치받았으면 1이고 아니면 0인 변수 $D_{it}$를 정의하겠습니다. 이 예에서는 처치를 전혀 받지 않는 코호트라면 이 변수가 항상 0입니다. 다른 코호트에서도 처음에는 0이지만, 06/01에 처치받은 코호트에서는 06/01에 1로 바뀌고 그 뒤로 계속 1을 유지합니다. 07/15에 처치받은 코호트에서는 07/15에 1로 바뀝니다. 이 처치 지표를 설치 수 모델에 다음과 같이 넣을 수 있습니다.\n",
"\n",
"$$\n",
"Installs_{it} = \\tau D_{it} + \\gamma_i + \\theta_t + e_{it}\n",
"$$\n",
"\n",
- "위 모델을 최소제곱법(OLS)으로 추정하는 것을 이원고정효과모델(TWFE)이라고 합니다. 대상이 처치받았을 때 설치 수가 얼마나 변하는지 알려 주므로 $\\tau$가 처치효과가 됩니다.\n",
+ "위 모델을 최소제곱법(OLS)으로 추정하는 것을 이원고정효과모델(TWFE)이라고 합니다. $\\tau$는 대상이 처치받았을 때 설치 수가 얼마나 변하는지 나타내므로 처치효과가 됩니다.\n",
"\n",
- "선형회귀의 '다른 조건을 고정하는' 성질을 떠올려 보는 것도 한 방법입니다. 위 모델을 추정하면 $\\tau$의 추정값은 대상 `i`와 시간 `t`를 고정한 채 처치를 0에서 1로 바꿨을 때 설치 수가 얼마나 변하는지로 읽을 수 있습니다.\n",
+ "선형회귀의 '다른 조건을 고정하는' 성질로 이 모델을 바라볼 수도 있습니다. 위 모델을 추정하면 $\\tau$의 추정값은 대상 `i`와 시간 `t`를 고정한 채 처치를 0에서 1로 바꿨을 때 설치 수가 얼마나 변하는지로 읽을 수 있습니다.\n",
"\n",
"이게 얼마나 대담한 주장인지 보세요! 각 대상을 고정한 채 $D$가 결과를 어떻게 바꾸는지 본다는 말은, 시간에 따라 변하지 않는 대상별 특성을 알려진 것이든 알려지지 않은 것이든 모두 통제한다는 뜻입니다. 예를 들어 측정할 수 있는 도시별 기준 설치 수준뿐 아니라, 도시 문화가 제품과 얼마나 잘 맞는지처럼 짐작조차 할 수 없는 요인까지 통제하게 됩니다. 조건은 단 하나, 그 특성이 분석 기간 동안 변하지 않아야 한다는 것입니다. 또 각 기간을 고정한다는 말은 연도별 특성을 모두 통제한다는 뜻입니다. 예를 들어 $D$의 효과를 보는 동안 연도를 고정하므로 앞에서 본 추세와 계절성이 통제됩니다.\n",
"\n",
@@ -312,7 +312,7 @@
"id": "8748af77",
"metadata": {},
"source": [
- "TWFE 모델이 무엇을 하는지 이해하는 또 다른 방법은 반사실 예측값 $\\hat{Y_0}|t \\geq g$를 그려 보는 것입니다. 모델이 처치효과 $\\hat{\\tau}$로 보는 것은 결국 추정된 차이 $Y_1 - \\hat{Y_0}$이므로 이 그래프가 도움이 됩니다. 이 차이를 직접 보면 모델이 무엇을 하는지 감을 잡을 수 있습니다. 아래 그래프가 바로 그것을 보여 주며, 점선이 $\\hat{Y_0}$입니다."
+ "TWFE 모델이 무엇을 하는지 이해하는 또 다른 방법은 반사실 예측값 $\\hat{Y_0}|t \\geq g$를 그려 보는 것입니다. 모델이 처치효과 $\\hat{\\tau}$로 보는 것은 결국 추정된 차이 $Y_1 - \\hat{Y_0}$이므로 이 그래프가 도움이 됩니다. 이 차이를 직접 보면 모델이 무엇을 하는지 감을 잡을 수 있습니다. 아래 그래프에서 점선이 $\\hat{Y_0}$입니다."
]
},
{
@@ -370,7 +370,7 @@
"id": "d56ff6bd",
"metadata": {},
"source": [
- "이 그래프는 TWFE가 대조군에서 본 추세를 실험군에 투영하면서 수준도 맞추고 있음을 보여 줍니다. 예를 들어 빨간색 코호트를 보면, 반사실 $Y_0$는 파란색과 보라색 코호트의 평균 추세를 가져와서(추세 투영) 빨간색 코호트의 수준으로 옮겨 놓은 것입니다(수준 조정). 그래서 TWFE를 이중차분법의 하나로 봅니다. TWFE도 추세 투영과 수준 조정을 하지만, 여러 기간과 여러 대상에서 작동한다는 점이 다릅니다(대상 2개, 기간 2개인 경우에는 TWFE와 DID가 같습니다)."
+ "그래프를 보면 TWFE는 대조군에서 본 추세를 실험군에 투영하면서 수준도 맞추고 있습니다. 예를 들어 빨간색 코호트를 보면, 반사실 $Y_0$는 파란색과 보라색 코호트의 평균 추세를 가져와서(추세 투영) 빨간색 코호트의 수준으로 옮겨 놓은 것입니다(수준 조정). 그래서 TWFE를 이중차분법의 하나로 봅니다. TWFE도 추세 투영과 수준 조정을 하지만, 여러 기간과 여러 대상에서 작동한다는 점이 다릅니다(대상 2개, 기간 2개인 경우에는 TWFE와 DID가 같습니다)."
]
},
{
@@ -384,7 +384,7 @@
"\n",
"\n",
"\n",
- "단순하게 하기 위해 시간 효과가 없는 고정효과모델(FE)을 생각해 봅시다.\n",
+ "간단히 하기 위해 시간 효과가 없는 고정효과모델(FE)을 생각해 봅시다.\n",
"\n",
"$$\n",
"y_{it} = \\tau D_{it} + \\gamma_i + e_{it}\n",
@@ -403,7 +403,7 @@
" * 과거 처치가 현재 결과에 영향을 주지 않음(이월 효과 없음)\n",
" * 과거 결과가 현재 처치에 영향을 주지 않음(피드백 없음)\n",
"\n",
- "여기서는 함수 형태 가정에 집중하겠습니다. 공변량에 대한 선형성은 잘 알려진 가정이고 모든 선형회귀 모델에 해당합니다. 하지만 이중/편향 제거 머신러닝 장에서 본 것처럼 머신러닝 모델을 쓰면 이 가정은 쉽게 완화할 수 있습니다. 즉, 원한다면 이 가정은 풀 수 있습니다. 가법적 고정효과는 그리 제약이 큰 가정이 아니어서 문제를 별로 일으키지 않습니다. 제가 집중하고 싶은 것(그리고 큰 소동을 일으킨 것)은 시간에 따른 이질적 효과가 없다는 가정입니다.\n",
+ "여기서는 함수 형태 가정에 집중하겠습니다. 공변량에 대한 선형성은 잘 알려진 가정이고 모든 선형회귀 모델에 해당합니다. 하지만 이중/편향 제거 머신러닝 장에서 본 것처럼 머신러닝 모델을 쓰면 이 가정은 쉽게 완화할 수 있습니다. 즉, 원한다면 얼마든지 풀 수 있는 가정입니다. 가법적 고정효과는 그리 제약이 큰 가정이 아니어서 문제를 별로 일으키지 않습니다. 제가 집중하고 싶은 것(그리고 큰 소동을 일으킨 것)은 시간에 따른 이질적 효과가 없다는 가정입니다.\n",
"\n",
"### 시간에 따른 처치효과의 이질성\n",
"\n",
@@ -489,7 +489,7 @@
"id": "e26ad4b8",
"metadata": {},
"source": [
- "설치 수가 결국 예전과 같은 수준에 이르지만 그러기까지 시간(10일)이 걸립니다. 그럴듯하지 않나요? 현실에서 보는 데이터는 대부분 이렇게 움직입니다. 효과가 무르익는 데는 시간이 걸립니다. 그럼 이 데이터에 TWFE 모델을 돌려 무슨 일이 생기는지 보겠습니다."
+ "설치 수가 결국 예전과 같은 수준에 이르지만 그러기까지 시간(10일)이 걸립니다. 그럴듯하지 않나요? 현실의 데이터는 대부분 이렇게 효과가 무르익는 데 시간이 걸립니다. 그럼 이 데이터에 TWFE 모델을 돌려 무슨 일이 생기는지 보겠습니다."
]
},
{
@@ -521,7 +521,7 @@
"id": "1f2c130c",
"metadata": {},
"source": [
- "먼저 실제 ATT가 더 이상 1이 아니라는 점에 주목하세요. 처음 몇 기간에는 효과가 더 작기 때문입니다. 둘째로, 그리고 가장 중요한 점은 **TWFE로 추정한 ATT가 더 이상 실제 ATT를 찾아내지 못한다**는 것입니다. 간단히 말해 TWFE가 편향되었습니다. 왜 그럴까요? 여기서는 평행 추세도, 비기대도, 그 밖의 강외생성 가정도 모두 성립합니다. 그런데 대체 무슨 일이 일어난 걸까요?\n",
+ "먼저 실제 ATT가 더 이상 1이 아니라는 점에 주목하세요. 처음 몇 기간에는 효과가 더 작기 때문입니다. 둘째이자 가장 중요한 점은 **TWFE로 추정한 ATT가 더 이상 실제 ATT를 찾아내지 못한다**는 것입니다. 간단히 말해 TWFE가 편향되었습니다. 왜 그럴까요? 여기서는 평행 추세도, 비기대도, 그 밖의 강외생성 가정도 모두 성립합니다. 그런데 대체 무슨 일이 일어난 걸까요?\n",
"\n",
"무슨 일이 일어나는지 이해하는 첫걸음은 TWFE를 여러 개의 2×2 DID로 분해할 수 있다는 사실을 깨닫는 것입니다. 이 예에서는 네 가지 비교가 나옵니다. 조기 처치 코호트 대 미처치 코호트, 후기 처치 코호트 대 미처치 코호트, 조기 처치 코호트 대 후기 처치 코호트(후기 처치 코호트가 대조군), 그리고 후기 처치 코호트 대 조기 처치 코호트(조기 처치 코호트가 대조군)입니다."
]
@@ -598,7 +598,7 @@
"id": "ab6911ad",
"metadata": {},
"source": [
- "처음 세 비교는 크게 걱정할 필요가 없습니다. 대조군으로 쓰는 코호트가 아주 얌전하게 움직이기 때문입니다. 하지만 네 번째 비교인 후기 대 조기는 문제가 있습니다. 이 비교는 조기 처치 코호트를 대조군으로 쓴다는 점에 주목하세요. 그리고 이 대조군이 이상하게 움직인다는 점도 보세요. 초반에 가파르게 올라갑니다. ATT가 즉시 나타나지 않고 10일에 걸쳐 무르익는다는 사실이 반영된 모습입니다. 직관적으로도 이것이 DID의 반사실 추세 추정을 망가뜨려 추세를 실제보다 가파르게 만들리라는 것을 짐작할 수 있습니다. 이를 시각화하기 위해 네 번째 비교에서 후기 처치 코호트의 반사실 $Y_0$ 추정값을 그려 보겠습니다."
+ "처음 세 비교는 크게 걱정할 필요가 없습니다. 대조군으로 쓰는 코호트가 아주 얌전하게 움직이기 때문입니다. 하지만 네 번째 비교인 후기 대 조기는 문제가 있습니다. 이 비교는 조기 처치 코호트를 대조군으로 씁니다. 그런데 이 대조군은 움직임이 이상합니다. 초반에 가파르게 올라가는데, ATT가 즉시 나타나지 않고 10일에 걸쳐 무르익기 때문입니다. 직관적으로 생각해도 이런 대조군은 DID의 반사실 추세 추정을 망가뜨려 추세를 실제보다 가파르게 만들 것입니다. 이를 시각화하기 위해 네 번째 비교에서 후기 처치 코호트의 반사실 $Y_0$ 추정값을 그려 보겠습니다."
]
},
{
@@ -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씩 줄어듭니다. 무슨 일이 일어나는지 제대로 보이도록 시간 고정효과와 추세도 모두 없앴습니다."
]
},
{
@@ -791,7 +791,7 @@
"id": "a85d16ab",
"metadata": {},
"source": [
- "이번에도 무슨 일이 일어나는지 보려면 조기 처치 코호트가 후기 처치 코호트의 대조군 역할을 하는 비교에 집중하세요. TWFE는 DID처럼 대조군의 추세를 실험군의 수준에 맞춘다는 점을 기억하세요. 그러니 반사실에도 이것이 반영되어 있어야 합니다."
+ "이번에도 무슨 일이 일어나는지 보려면 조기 처치 코호트가 후기 처치 코호트의 대조군 역할을 하는 비교에 집중하세요. TWFE는 DID처럼 대조군의 추세를 실험군의 수준에 맞춘다는 점을 기억하세요. 그러니 반사실에도 이 점이 드러나야 합니다."
]
},
{
@@ -1143,9 +1143,9 @@
"id": "4211d580",
"metadata": {},
"source": [
- "처치 후 추정 효과가 1) 대체로 음수이고 2) 대체로 줄어들고 있으니 조금 나아진 것은 맞습니다. 하지만 이상하게 튀는 값들이 있고, 처치 전에 양의 효과가 있는 것처럼 보이는데, 이는 당연히 말이 안 됩니다.\n",
+ "처치 후 추정 효과가 1) 대체로 음수이고 2) 대체로 줄어들고 있으니 조금 나아진 것은 맞습니다. 하지만 이상하게 튀는 값들이 있고, 처치 전에도 양의 효과가 있는 것처럼 보입니다. 당연히 말이 안 되는 결과입니다.\n",
"\n",
- "문제는 지금까지 이야기한 것과 같습니다. 처치 시점이 서로 다르기 때문에 조기 처치 대상이 후기 처치 대상의 대조군으로 쓰이고, 그래서 모델이 아주 이상한 반사실 추세를 추정합니다. 결국 처치 시점 대비 상대 시간 더미를 추가해도 문제는 풀리지 않습니다. 그렇다면 무엇이 문제를 풀어 줄까요?\n",
+ "문제는 지금까지 이야기한 것과 같습니다. 처치 시점이 서로 다르기 때문에 조기 처치 대상이 후기 처치 대상의 대조군으로 쓰이고, 그래서 모델이 아주 이상한 반사실 추세를 추정합니다. 결국 처치 시점 대비 상대 시간 더미를 추가해도 문제는 풀리지 않습니다. 그렇다면 정확히 무엇으로 풀 수 있을까요?\n",
"\n",
"## 3) 깨달음: 유연한 함수 형태\n",
"\n",
@@ -1172,7 +1172,7 @@
"\n",
"안타깝게도 이 모델은 적합할 수 없습니다. 매개변수가 데이터 포인트보다 많아지기 때문입니다. 날짜와 대상을 상호작용시키므로 대상마다, 기간마다 처치효과 매개변수가 하나씩, 모두 $T*N$개 생깁니다. 그런데 이는 정확히 표본 수와 같습니다! OLS는 돌아가지도 않습니다.\n",
"\n",
- "이제 모델의 처치효과 매개변수 개수를 줄여야 합니다. 그러려면 대상을 어떻게든 묶는 방법을 생각해야 합니다. 조금만 생각해 보면 아주 자연스러운 방법이 보입니다. 코호트로 묶는 것입니다! 한 코호트 전체의 효과는 시간에 따라 같은 패턴을 따른다는 것을 알고 있습니다. 따라서 위의 비현실적인 모델을 자연스럽게 개선하는 방법은 효과가 대상이 아니라 코호트별로 달라지도록 허용하는 것입니다.\n",
+ "이제 모델의 처치효과 매개변수 개수를 줄여야 합니다. 그러려면 대상을 어떻게든 묶어야 합니다. 조금만 생각해 보면 아주 자연스러운 방법이 보입니다. 코호트로 묶는 것입니다! 한 코호트 전체의 효과는 시간에 따라 같은 패턴을 따른다는 것을 알고 있습니다. 따라서 위의 비현실적인 모델은 효과가 대상이 아니라 코호트별로 달라지도록 허용하면 자연스럽게 개선됩니다.\n",
"\n",
"$$\n",
"Installs_{it} = \\sum_{g=0}^G \\sum_{t=0}^T \\tau_{gt} D_{it} + \\gamma_i + \\theta_t + e_{it}\n",
@@ -1201,7 +1201,7 @@
"id": "d9ecfc5c",
"metadata": {},
"source": [
- "이 모델이 통하는지 보려면 모두의 `treat`를 0으로 강제해서 $Y_0$의 반사실 예측값을 구하면 됩니다. 그런 다음 실험군에서 관측된 결과, 즉 $Y_1$에서 $\\hat{Y}_0$를 빼서 효과를 추정합니다. 이 값이 실제 ATT와 맞는지 봅시다."
+ "이 모델이 통하는지 보려면 모든 대상의 `treat`를 0으로 바꿔서 $Y_0$의 반사실 예측값을 구하면 됩니다. 그런 다음 실험군에서 관측된 결과, 즉 $Y_1$에서 $\\hat{Y}_0$를 빼서 효과를 추정합니다. 이 값이 실제 ATT와 맞는지 봅시다."
]
},
{
@@ -1235,7 +1235,7 @@
"id": "7000d91c",
"metadata": {},
"source": [
- "맞습니다! 마침내 시간 이질성을 포착할 만큼 유연한 모델을 만들었고, 덕분에 올바른 처치효과를 추정할 수 있었습니다! 또 하나 해 볼 만한 멋진 일은 시점과 코호트별 추정 효과를 뽑아 그래프로 그리는 것입니다. 이번에는 데이터가 어떻게 생성됐는지 알기 때문에 어떤 모양이 나와야 하는지도 압니다. 각 코호트의 효과는 처치 전에는 0, 처치 후 10일째부터는 1이어야 하고, 처치 시점부터 10일째까지는 0에서 1로 올라가는 직선이어야 합니다."
+ "맞습니다! 마침내 시간 이질성을 포착할 만큼 유연한 모델을 만들었고, 덕분에 올바른 처치효과를 추정할 수 있었습니다! 또 하나 해 볼 만한 멋진 일이 있습니다. 시점별, 코호트별 추정 효과를 뽑아 그래프로 그려 보는 것입니다. 이번에는 데이터가 어떻게 생성됐는지 알기 때문에 어떤 모양이 나와야 하는지도 압니다. 각 코호트의 효과는 처치 전에는 0, 처치 후 10일째부터는 1이어야 하고, 처치 시점부터 10일째까지는 0에서 1로 올라가는 직선이어야 합니다."
]
},
{
@@ -1274,9 +1274,9 @@
"id": "5479dd42",
"metadata": {},
"source": [
- "이번에도 위 그래프는 예상한 효과와 일치합니다. 앞에서 말한 패턴을 정확히 따릅니다.\n",
+ "이번에도 그래프가 예상과 일치합니다. 효과가 앞에서 말한 패턴을 정확히 따릅니다.\n",
"\n",
- "이것만으로도 훌륭하지만 더 잘할 수 있습니다. 먼저 이 모델의 매개변수가 엄청나게 많다는 점을 보세요. 데이터에 대상이 100개, 날짜가 약 92일이므로 그중 192개는 대상 효과와 시간 효과 매개변수입니다. 그래도 처치효과 매개변수가 250개 넘게 남습니다.\n",
+ "이것만으로도 훌륭하지만 더 잘할 수 있습니다. 먼저 이 모델의 매개변수가 엄청나게 많다는 점을 보세요. 데이터에 대상이 100개, 날짜가 약 92일이므로 그중 192개는 대상 효과와 시간 효과 매개변수입니다. 이를 빼도 처치효과 매개변수가 250개 넘게 남습니다.\n",
"\n",
"처치 전에는 효과가 0이라고 가정하면(비기대), 상호작용 항에서 처치 전 날짜를 빼서 매개변수 개수를 줄일 수 있습니다.\n",
"\n",
@@ -1360,7 +1360,7 @@
"id": "b64c22ce",
"metadata": {},
"source": [
- "처치효과 매개변수를 그려 보면 대조군 코호트의 매개변수와 코호트가 처치받기 전 날짜의 매개변수를 제거했다는 것을 확인할 수 있습니다."
+ "처치효과 매개변수를 그려 보면 대조군 코호트의 매개변수와, 각 코호트가 처치받기 전 날짜의 매개변수가 빠진 것을 확인할 수 있습니다."
]
},
{
@@ -1414,7 +1414,7 @@
"```\n",
"하지만 여기서 멈춰도 될 것 같습니다. 코호트별 이질성을 허용하지 않는 것은 대개 좋지 않은 생각입니다. 처치효과는 처치 후 경과 시간뿐 아니라 달력상의 시간에 따라서도 변하는 경향이 있기 때문입니다. 예를 들어 시간이 지나 경쟁사가 같은 기능을 베끼면, 그 기능은 더 이상 예전처럼 고객을 강하게 끌어들이지 못할 수 있습니다. 그렇다면 새 기능이 설치 수에 미치는 효과는 시간이 지나면서 줄어들 것입니다.\n",
"\n",
- "시간에 따른 효과를 보여 주는 것 말고 마지막으로 해야 할 일은 반사실을 그려서 그럴듯한 위치에 있는지 확인하는 것입니다. 모델을 과학적으로 검증하는 방법은 아니지만, 믿어 보세요. 정말 큰 도움이 됩니다. 그래프는 다음과 같습니다."
+ "시간에 따른 효과를 보는 것 말고도 마지막으로 할 일이 하나 있습니다. 반사실을 그려서 그럴듯한 위치에 있는지 확인하는 것입니다. 모델을 과학적으로 검증하는 방법은 아니지만, 믿어 보세요. 정말 큰 도움이 됩니다. 그래프는 다음과 같습니다."
]
},
{
@@ -1480,7 +1480,7 @@
"id": "87b82806",
"metadata": {},
"source": [
- "보다시피 반사실 $Y_0$ 예측값이 있어야 할 곳, 즉 대조군 코호트와 아주 가까운 곳에 놓여 있습니다. 무척 안심이 됩니다. TWFE 모델은 처치효과를 $Y-\\hat{Y_0}$로 추정한다는 것을 알고 있습니다. 즉, 실험군 코호트의 결과를 이 반사실과 단순히 비교할 뿐입니다. 반사실이 괜찮아 보이니 처치효과도 아마 괜찮을 것이라고 안심해도 됩니다.\n",
+ "보다시피 반사실 $Y_0$ 예측값이 있어야 할 곳, 즉 대조군 코호트와 아주 가까운 곳에 놓여 있습니다. 무척 안심이 됩니다. TWFE 모델은 처치효과를 $Y-\\hat{Y_0}$로 추정합니다. 즉, 실험군 코호트의 결과를 이 반사실과 단순히 비교할 뿐입니다. 반사실이 괜찮아 보이니 처치효과도 아마 괜찮다고 믿어도 됩니다.\n",
"\n",
"여기까지가 좋은 소식입니다. 약속한 나쁜 소식을 잊은 건 아닙니다. TWFE의 함수 형태 문제는 해결했지만, DID와 TWFE에는 그보다 더 크다고도 할 만한 문제가 남아 있습니다. 바로 독립성 가정에 관한 문제입니다.\n",
"\n",
@@ -1488,11 +1488,11 @@
"\n",
"## 핵심 요약\n",
"\n",
- "마침내 TWFE의 함수 형태 문제를 이해했을 뿐 아니라 바로잡는 데도 성공했다고 말해도 될 것 같습니다. 문제를 뿌리(시간 이질성)까지 추적했고, 모델에 더 많은 유연성을 허용해 고쳤습니다. 이제 TWFE를 다시 안심하고 쓸 수 있다는 것을 알았으니 한잔하며 쉬어도 됩니다. 정말 그럴까요?!\n",
+ "마침내 TWFE의 함수 형태 문제를 이해했을 뿐 아니라 바로잡는 데도 성공했다고 말해도 될 것 같습니다. 문제를 뿌리(시간 이질성)까지 추적했고, 모델을 더 유연하게 만들어 고쳤습니다. 이제 TWFE를 다시 안심하고 쓸 수 있으니 한잔하며 쉬어도 됩니다. 정말 그럴까요?!\n",
"\n",
"\n",
"\n",
- "TWFE(넓게는 DID)가 **함수 형태 가정과 독립성 가정이 함께 섞인 것**이라는 점을 절대 잊어서는 안 됩니다. 이 장에서는 함수 형태 문제만 다뤘고, 방 안에는 아직 커다란 코끼리가 버티고 있습니다. 바로 평행 추세 가정입니다. 평행 추세는 DID가 하는 독립성 가정입니다. 여기까지는 잘 알려져 있습니다. 하지만 이 가정이 무엇을 함축하는지는 제대로 이해하지 못하고 있는 것 같습니다. 허공에서 불러내기만 하면 참이 되기라도 하는 것처럼 그냥 가정해 버리곤 합니다. 안타깝게도 평행 추세 가정은 대부분의 사람이 생각하는 것보다 훨씬 많은 것을 요구합니다. 다음 장들에서는 왜 그런지, 그리고 이에 대해 무엇을 할 수 있는지, 아니 할 수 있는 것이 있기는 한지 살펴보겠습니다.\n",
+ "TWFE(넓게는 DID)가 **함수 형태 가정과 독립성 가정이 함께 섞인 것**이라는 점을 절대 잊어서는 안 됩니다. 이 장에서는 함수 형태 문제만 다뤘고, 방 안에는 아직 커다란 코끼리가 버티고 있습니다. 바로 평행 추세 가정입니다. 평행 추세는 DID가 하는 독립성 가정입니다. 여기까지는 잘 알려져 있습니다. 하지만 이 가정이 무엇을 함축하는지는 제대로 이해하지 못하고 있는 것 같습니다. 허공에서 불러내기만 하면 참이 되기라도 하는 것처럼 그냥 가정해 버리곤 합니다. 안타깝게도 평행 추세 가정은 대부분의 사람이 생각하는 것보다 훨씬 많은 것을 요구합니다. 다음 장들에서는 왜 그런지, 그리고 이 문제에 무엇을 할 수 있는지, 아니 할 수 있는 것이 있기는 한지 살펴보겠습니다.\n",
"\n",
"## 참고 자료\n",
"\n",
@@ -1500,7 +1500,7 @@
"\n",
"먼저 Andrew Goodman-Bacon의 *Difference-in-Differences with Variation in Treatment Timing*에서 많은 것을 가져왔습니다. 그의 문제 진단은 아주 깔끔하고 직관적입니다. 게다가 DID에서 무슨 일이 일어나는지 명확하게 이해하게 해 준 멋진 그림들도 함께 실려 있습니다. 이 장의 그림 몇 개는 Goodman-Bacon의 그림을 거의 그대로 옮긴 것입니다.\n",
"\n",
- "두 번째로 큰 영감을 준 것은 Pedro H. C. Sant'Anna와 Brantly Callaway의 *Difference-in-Differences with Multiple Time Periods*입니다. Callaway와 Sant'Anna의 해결책은 이 장에서 택한 것과 다른 길을 간다는 점에 유의하세요. 그래도 그들의 해결책은 DID 문제를 환히 비춰 주어 이해하기 쉽게 만들어 줍니다. 논문과 별개로 Pedro는 TWFE의 문제를 보여 주는 아주 좋은 블로그 글도 썼습니다. 이 장에서 쓴 데이터 생성 과정은 그 블로그 글의 데이터 생성 과정에서 큰 영향을 받았습니다. 사실상 Pedro의 R 코드를 파이썬으로 옮긴 것입니다. Pedro는 DID 가정에 관해 제가 가졌던 몇 가지 질문에도 친절하게 답해 주었습니다. 그는 DID 모델에 공변량을 추가하는 문제를 다룬 매우 흥미로운 논문도 썼는데, 이 장이 이미 너무 길어 여기서는 다루지 않았습니다. 논문 제목은 *Doubly Robust Difference-in-Differences Estimators*이고, 모델에 공변량을 넣을 계획이라면 꼭 읽어 보기를 강력히 권합니다.\n",
+ "두 번째로 큰 영감을 준 것은 Pedro H. C. Sant'Anna와 Brantly Callaway의 *Difference-in-Differences with Multiple Time Periods*입니다. Callaway와 Sant'Anna의 해결책은 이 장에서 택한 것과 다른 길을 간다는 점에 유의하세요. 그래도 그들의 해결책 덕분에 DID 문제가 환히 드러나 이해하기 쉬워집니다. 논문과 별개로 Pedro는 TWFE의 문제를 보여 주는 아주 좋은 블로그 글도 썼습니다. 이 장의 데이터 생성 과정은 그 블로그 글에 나온 것을 많이 참고했습니다. 사실상 Pedro의 R 코드를 파이썬으로 옮긴 것입니다. Pedro는 DID 가정에 관해 제가 가졌던 몇 가지 질문에도 친절하게 답해 주었습니다. 그는 DID 모델에 공변량을 추가하는 문제를 다룬 매우 흥미로운 논문도 썼는데, 이 장이 이미 너무 길어 여기서는 다루지 않았습니다. 논문 제목은 *Doubly Robust Difference-in-Differences Estimators*이고, 모델에 공변량을 넣을 계획이라면 꼭 읽어 보기를 강력히 권합니다.\n",
"\n",
"마지막으로 빼놓을 수 없는 자료가 있습니다. 이 장에서 쓴 함수 형태 수정은 Sun과 Abraham의 *Estimating dynamic treatment effects in event studies with heterogeneous treatment effects*와 Jeffrey Wooldridge의 *Two-Way Fixed Effects, the Two-Way Mundlak Regression, and Difference-in-Differences Estimators*에서 영감을 얻었습니다. Callaway와 Sant'Anna의 논문도 무척 좋았지만, 그들의 해결책은 구현하기가 조금 더 복잡합니다. 반면 Sun, Abraham, Wooldridge의 해결책은 TWFE 회귀 모델에서 상호작용을 영리하게 다루기만 하면 되므로, `statsmodels`와 공식 몇 줄만으로 아주 쉽게 구현할 수 있습니다.\n",
"\n",
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 41c294d..7223e9a 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
@@ -7,7 +7,7 @@
"source": [
"# 25 - Synthetic Difference-in-Differences\n",
"\n",
- "앞의 장들에서는 패널데이터(여러 대상을 여러 기간에 걸쳐 관측한 데이터)로 처치효과를 식별하는 방법으로 이중차분법(difference-in-differences, DID)과 통제집단합성법(synthetic control)을 살펴봤습니다. 그런데 이 두 접근법을 하나의 추정량으로 합칠 수 있습니다. 새로운 추정 방법인 합성 이중차분법(synthetic difference-in-differences, SDID)은 두 방법의 장점을 함께 살리면서 처치효과 추정값의 정밀도까지 높여 줍니다(오차 막대가 줄어듭니다).\n",
+ "앞의 장들에서는 패널데이터(여러 대상을 여러 기간에 걸쳐 관측한 데이터)로 처치효과를 식별하는 방법으로 이중차분법(difference-in-differences, DID)과 통제집단합성법(synthetic control)을 살펴봤습니다. 그런데 알고 보면 이 두 접근법을 하나의 추정량으로 합칠 수 있습니다. 새로운 추정 방법인 합성 이중차분법(synthetic difference-in-differences, SDID)은 두 방법의 장점을 함께 살리면서 처치효과 추정값의 정밀도까지 높여 줍니다(오차 막대가 줄어듭니다).\n",
"\n",
"이 장에서는 주로 **블록 처치 배정(block treatment assignment)** 상황에서 합성 이중차분법을 다룹니다. 여러 대상을 시간에 걸쳐 관측하는데, 일부 대상은 **같은** 시점에 처치를 받고 나머지 대상은 처치를 받지 않는 경우를 말합니다. 이 상황은 처치 배정 행렬 $D$로 나타낼 수 있는데, 이 행렬의 **열은 대상**이고 **행은 기간**입니다.\n",
"\n",
@@ -21,7 +21,7 @@
"\\end{bmatrix}\n",
"$$\n",
"\n",
- "좀 더 구체적으로, 발의안 99호(Proposition 99)가 캘리포니아의 담배 소비에 미친 영향을 추정하는 예제를 따라가 보겠습니다. 이 예제에서 실험군은 캘리포니아 하나뿐이며, 캘리포니아는 어느 시점(정확히는 1988년 11월)에 처치를 받습니다(발의안 99호를 통과시킵니다). 캘리포니아를 행렬의 마지막 열이라고 하면 다음과 같은 행렬이 됩니다.\n",
+ "좀 더 구체적인 예로, 발의안 99호(Proposition 99)가 캘리포니아의 담배 소비에 미친 영향을 추정하는 예제를 따라가 보겠습니다. 이 예제에서 실험군은 캘리포니아 하나뿐입니다. 캘리포니아는 어느 시점(정확히는 1988년 11월)에 발의안 99호를 통과시키면서 처치를 받습니다. 캘리포니아를 행렬의 마지막 열이라고 하면 다음과 같은 행렬이 됩니다.\n",
"\n",
"$$\n",
"D = \\begin{bmatrix}\n",
@@ -33,9 +33,9 @@
"\\end{bmatrix}\n",
"$$\n",
"\n",
- "여기서는 모든 실험군이 **같은 시점에** 처치를 받는 경우만 다룬다는 점에 주의하세요. 장의 끝부분에서는 처치가 대상들에 점진적으로 도입되어 대상마다 처치 시점이 다른 **시차 도입(staggered adoption) 처치 배정**을 다루는 방법도 살펴봅니다. 이 설계에서 요구하는 조건은 단 하나, 어떤 대상이 한 번 처치를 받으면 다시 처치받지 않은 상태로 돌아가지 않는다는 것뿐입니다.\n",
+ "여기서는 모든 실험군이 **같은 시점에** 처치를 받는 경우만 다룬다는 점에 주의하세요. 장 끝부분에서는 처치가 대상들에 점진적으로 도입되어 대상마다 처치 시점이 다른 **시차 도입(staggered adoption) 처치 배정**을 다루는 방법도 살펴봅니다. 이 설계에서 요구하는 조건은 단 하나, 어떤 대상이 한 번 처치를 받으면 다시 처치받지 않은 상태로 돌아가지 않는다는 것뿐입니다.\n",
"\n",
- "모든 대상이 같은 시점에 처치를 받는 단순한 경우로 돌아가면, 처치 배정 행렬을 네 개의 블록으로 단순화할 수 있고 각 블록은 또 하나의 행렬로 나타낼 수 있습니다. 일반적으로 행렬에서 아래로 내려갈수록 시간이 흐릅니다. 또한 실험군은 행렬의 오른쪽에 모아 둡니다. 그 결과 첫 번째 블록(왼쪽 위)은 처치 전 기간의 대조군, 두 번째 블록(오른쪽 위)은 처치 전 기간의 실험군, 세 번째 블록(왼쪽 아래)은 처치 후 기간의 대조군, 네 번째 블록(오른쪽 아래)은 처치 후 기간의 실험군에 해당합니다. 처치 지표는 처치 후 기간의 실험군 블록을 제외하면 모두 0입니다.\n",
+ "다시 모든 대상이 같은 시점에 처치를 받는 단순한 경우로 돌아가 보겠습니다. 이때는 처치 배정 행렬을 네 블록으로 단순화할 수 있고, 각 블록은 또 하나의 행렬로 나타낼 수 있습니다. 일반적으로 행렬에서 아래로 내려갈수록 시간이 흐릅니다. 또한 실험군은 행렬의 오른쪽에 모아 둡니다. 그 결과 첫 번째 블록(왼쪽 위)은 처치 전 기간의 대조군, 두 번째 블록(오른쪽 위)은 처치 전 기간의 실험군, 세 번째 블록(왼쪽 아래)은 처치 후 기간의 대조군, 네 번째 블록(오른쪽 아래)은 처치 후 기간의 실험군에 해당합니다. 처치 지표는 처치 후 기간의 실험군 블록을 제외하면 모두 0입니다.\n",
"\n",
"$$\n",
"D = \\begin{bmatrix}\n",
@@ -443,7 +443,7 @@
"\\end{bmatrix}\n",
"$$\n",
"\n",
- "목표는 실험군에 대한 평균 처치효과 $ATT = \\pmb{Y}(1)_{post, tr} - \\pmb{Y}(0)_{post, tr}$를 추정하는 것입니다. 이를 위해서는 관측되지 않은 잠재적 결과 $\\pmb{Y}(0)_{post, tr}$를 어떻게든 추정해야 합니다. 말로 풀면, 실험군이 처치를 받지 않았다면 처치 후 기간에 어떤 일이 일어났을지 알아야 합니다. 이 점을 염두에 두고 이중차분법과 통제집단합성법을 차례로 복습하는 것부터 시작하겠습니다. 언뜻 보면 두 방법은 관측되지 않은 잠재적 결과를 추정하려고 완전히 다른 일을 하는 것처럼 보입니다. 둘을 합친다니 확실히 이상하게 느껴집니다. 하지만 두 방법에는 생각보다 공통점이 많습니다."
+ "목표는 실험군에 대한 평균 처치효과 $ATT = \\pmb{Y}(1)_{post, tr} - \\pmb{Y}(0)_{post, tr}$를 추정하는 것입니다. 이를 위해서는 관측되지 않은 잠재적 결과 $\\pmb{Y}(0)_{post, tr}$를 어떻게든 추정해야 합니다. 말로 풀면, 실험군이 처치를 받지 않았다면 처치 후 기간에 어떤 일이 일어났을지 알아야 합니다. 이 점을 염두에 두고, 먼저 이중차분법과 통제집단합성법을 차례로 복습하겠습니다. 언뜻 보면 두 방법은 관측되지 않은 잠재적 결과를 추정하려고 완전히 다른 일을 하는 것처럼 보입니다. 둘을 합친다니 어딘가 어색하게 느껴집니다. 하지만 두 방법에는 생각보다 공통점이 많습니다."
]
},
{
@@ -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갑 줄었다는 이야기입니다."
]
},
{
@@ -542,7 +542,7 @@
"id": "1f4a1b5d",
"metadata": {},
"source": [
- "하지만 이 추정값을 곧이곧대로 받아들여서는 안 됩니다. 이중차분법은 처치가 없었을 때 대조군의 추세가 실험군의 추세와 같아야 한다는 조건을 요구합니다. 식으로 쓰면 $E[Y(0)_{post, co} - Y(0)_{pre, co}] = E[Y(0)_{post, tr} - Y(0)_{pre, tr}]$입니다. 검증할 수 없는 가정이지만, 캘리포니아(실험군)와 다른 주들의 처치 전 추세를 보면 이 가정이 얼마나 그럴듯한지 감을 잡을 수 있습니다. 구체적으로 캘리포니아의 `cigsale` 추세는 적어도 처치 전 기간에는 다른 주들과 평행하지 않습니다. 캘리포니아의 담배 판매량은 처치 전부터 이미 대조군 주들의 평균보다 빠르게 줄고 있습니다. 이 추세가 처치 전 기간 이후로도 이어진다면 DID 추정량에는 하향 편향이 생깁니다. 즉, 실제 효과는 위에서 추정한 값보다 덜 극단적입니다."
+ "하지만 이 추정값을 곧이곧대로 받아들여서는 안 됩니다. 이중차분법은 처치가 없었을 때 대조군의 추세가 실험군의 추세와 같아야 한다는 조건을 요구합니다. 식으로 쓰면 $E[Y(0)_{post, co} - Y(0)_{pre, co}] = E[Y(0)_{post, tr} - Y(0)_{pre, tr}]$입니다. 검증할 수 없는 가정이지만, 캘리포니아(실험군)와 다른 주들의 처치 전 추세를 보면 이 가정이 얼마나 그럴듯한지 감을 잡을 수 있습니다. 그래프를 보면 캘리포니아의 `cigsale` 추세는 적어도 처치 전 기간에는 다른 주들과 평행하지 않습니다. 캘리포니아의 담배 판매량은 처치 전부터 이미 대조군 주들의 평균보다 빠르게 줄고 있습니다. 이 추세가 처치 전 기간 이후로도 이어진다면 DID 추정량에는 하향 편향이 생깁니다. 즉, 실제 효과는 위에서 추정한 값보다 덜 극단적입니다."
]
},
{
@@ -669,7 +669,7 @@
"id": "a0b13791",
"metadata": {},
"source": [
- "보다시피 앞에서와 정확히 같은 매개변수가 나옵니다. 결국 두 접근법은 같은 DID 추정량을 다른 방식으로 바라본 것일 뿐입니다. 그런데 지금 목적에서 이 표현이 훨씬 흥미로운 이유는 DID가 사실 통제집단합성법과 꽤 비슷하다는 점을 드러내 주기 때문입니다. 위의 TWFE 식을 아주 자세히 보세요. 시간 효과와 대상 효과가 들어간 회귀 문제입니다. 그런데 최적화 목적함수에 가중치가 없다는 점에 주목하세요. 곧 보겠지만 이것이 이중차분법과 통제집단합성법의 가장 큰 차이입니다.\n",
+ "보다시피 앞에서와 정확히 같은 매개변수가 나옵니다. 결국 두 접근법은 같은 DID 추정량을 다른 방식으로 바라본 것일 뿐입니다. 그런데 지금 목적에서는 이 표현이 훨씬 흥미롭습니다. DID가 사실 통제집단합성법과 꽤 비슷하다는 점을 드러내 주기 때문입니다. 위의 TWFE 식을 아주 자세히 보세요. 시간 효과와 대상 효과가 들어간 회귀 문제입니다. 그런데 최적화 목적함수에 가중치가 없다는 점에 주목하세요. 곧 보겠지만 이것이 이중차분법과 통제집단합성법의 가장 큰 차이입니다.\n",
"\n",
"## 통제집단합성법 다시 보기\n",
"\n",
@@ -688,7 +688,7 @@
"\\pmb{y}_{sc} = \\pmb{Y}_{co}\\hat{\\pmb{w}}^{sc}\n",
"$$\n",
"\n",
- "핵심은 $\\pmb{y}_{post, sc}$가 관측되지 않은 잠재적 결과 $Y(0)_{post, tr}$의 좋은 추정량이라는 것입니다. 그렇다면 $ATT$는 처치 후 기간 실험군의 평균에서 같은 처치 후 기간 가상의 대조군의 평균을 뺀 값이 됩니다.\n",
+ "핵심은 $\\pmb{y}_{post, sc}$가 관측되지 않은 잠재적 결과 $Y(0)_{post, tr}$의 좋은 추정량이라는 것입니다. 그렇다면 $ATT$는 처치 후 기간 실험군의 평균에서 같은 기간 가상의 대조군 평균을 뺀 값이 됩니다.\n",
"\n",
"$$\n",
"\\hat{\\tau} = \\bar{y}_{post, tr} - \\bar{y}_{post, sc}\n",
@@ -739,7 +739,7 @@
"source": [
"이 추정값은 이중차분법으로 얻은 값보다 훨씬 작습니다. 통제집단합성법은 평행하지 않은 처치 전 추세를 훨씬 잘 다루므로 이중차분법과 같은 편향에 빠지지 않습니다. 오히려 가상의 대조군을 빚어내는 과정 자체가 적어도 처치 전 기간에는 평행 추세를 강제합니다. 그 결과 훨씬 작고 훨씬 그럴듯한 추정값을 얻습니다.\n",
"\n",
- "캘리포니아의 실제 결과와 가상의 대조군의 결과를 함께 그려 보면 이 추정 과정을 눈으로 확인할 수 있습니다. 캘리포니아와 가상의 대조군 각각의 개입 후 평균도 점선으로 그렸습니다. 두 점선의 차이가 $ATT$ 추정값입니다."
+ "캘리포니아의 실제 결과와 가상의 대조군 결과를 함께 그려 보면 이 추정 과정을 눈으로 확인할 수 있습니다. 캘리포니아와 가상의 대조군 각각의 개입 후 평균도 점선으로 그렸습니다. 두 점선의 차이가 $ATT$ 추정값입니다."
]
},
{
@@ -790,7 +790,7 @@
"id": "aca0d0d5",
"metadata": {},
"source": [
- "흥미롭게도 통제집단합성법 추정량은 다음 최적화 문제를 푸는 형태로도 다시 쓸 수 있는데, 이중차분법에 썼던 이원고정효과 식과 꽤 비슷합니다.\n",
+ "흥미롭게도 통제집단합성법 추정량은 다음 최적화 문제를 푸는 형태로도 다시 쓸 수 있습니다. 이중차분법에 썼던 이원고정효과 식과 꽤 비슷한 모양입니다.\n",
"\n",
"$$\n",
"\\hat{\\tau}^{sc} = \\underset{\\beta, \\tau}{argmin} \\bigg\\{ \\sum_{i=1}^N \\sum_{t=1}^T \\big(Y_{it} - \\beta_t - \\tau D_{it}\\big)^2 \\hat{w}^{sc}_i \\bigg\\}\n",
@@ -891,9 +891,9 @@
"\n",
"다시 말하지만 $\\pmb{Y}_{pre, co}$는 행이 기간, 열이 대상을 나타내는 $T_{pre}$ × $N_{co}$ 결과 행렬입니다. 하지만 이번에는 $\\bar{\\pmb{y}}_{post, co}$가 1 × $N_{co}$ 행벡터이고, 각 원소는 해당 대조군 대상의 처치 후 기간 평균 결과입니다. 마지막으로 $\\pmb{\\lambda}_{pre}$는 처치 전 기간마다 원소가 하나씩 있는 1 × $T_{pre}$ 행벡터입니다. 다른 각도에서 보면, 대상 가중치 $w$는 결과 행렬에 오른쪽에서 곱해졌습니다($\\pmb{Y}_{pre, co} \\pmb{w}_{co}$). 그때는 실험군의 **대상별** 평균 결과를 대조군 대상들의 결과에 회귀했습니다. 이번에는 그 문제를 거꾸로 뒤집어서, 대조군의 **처치 후 기간별** 평균 결과를 같은 대조군 대상들의 처치 전 기간 결과에 회귀합니다.\n",
"\n",
- "처치 후 기간의 시간 가중치는 1을 처치 후 기간 수로 나눈 값 $1/T_{post}$로 둡니다(이번에도 균일 가중치입니다). 절편 $\\lambda_0$도 있습니다. 절편을 두는 이유는 처치 후 기간이 모든 처치 전 기간보다 위에 있거나 아래에 있을 수 있게 하기 위해서입니다. 뚜렷한 상승 추세나 하락 추세가 있는 많은 응용 사례가 이런 경우입니다.\n",
+ "처치 후 기간의 시간 가중치는 1을 처치 후 기간 수로 나눈 값 $1/T_{post}$로 둡니다(이번에도 균일 가중치입니다). 절편 $\\lambda_0$도 있다는 점에 주목하세요. 절편이 있어야 처치 후 기간이 모든 처치 전 기간보다 위에 있거나 아래에 있을 수 있습니다. 뚜렷한 상승 추세나 하락 추세가 있는 응용 사례에서는 흔히 이런 일이 생깁니다.\n",
"\n",
- "이 모든 내용이 다소 추상적으로 느껴진다면, 코드를 보면 무슨 일이 일어나는지 이해하는 데 도움이 될 것입니다."
+ "이 모든 내용이 다소 추상적으로 느껴진다면, 코드를 보면 좀 더 감이 올 것입니다."
]
},
{
@@ -946,9 +946,9 @@
"id": "21a3827c",
"metadata": {},
"source": [
- "이 코드에서 가장 먼저 하는 일은 실험군을 걸러 내는 것입니다. 그런 다음 처치 전 데이터를 피벗해서 행렬 $\\pmb{Y}_{pre,co}$를 만듭니다. 이어서 처치 후 데이터를 그룹화해 대조군 대상별로 처치 후 기간의 평균 결과를 구합니다. 그다음 $\\pmb{Y}_{pre,co}$의 맨 위에 1로 채운 행을 추가해 절편 역할을 하게 합니다. 그리고 $\\bar{\\pmb{y}}_{post, co}$를 처치 전 기간들($\\pmb{Y}_{pre,co}$의 행)에 회귀해서 시간 가중치 $\\lambda_t$를 얻습니다. 가중치의 합이 1이고 음수가 아니어야 한다는 제약도 추가했습니다. 마지막으로 절편은 버리고 시간 가중치를 시리즈에 저장합니다.\n",
+ "코드는 먼저 실험군을 걸러 내고, 처치 전 데이터를 피벗해서 행렬 $\\pmb{Y}_{pre,co}$를 만듭니다. 이어서 처치 후 데이터를 대상별로 묶어 대조군 대상마다 처치 후 기간의 평균 결과를 구합니다. 그다음 $\\pmb{Y}_{pre,co}$의 맨 위에 1로 채운 행을 추가해 절편 역할을 하게 합니다. 이제 $\\bar{\\pmb{y}}_{post, co}$를 처치 전 기간들($\\pmb{Y}_{pre,co}$의 행)에 회귀하면 시간 가중치 $\\lambda_t$를 얻습니다. 이때 가중치의 합이 1이고 음수가 아니어야 한다는 제약을 건다는 점을 눈여겨보세요. 마지막으로 절편은 버리고 시간 가중치를 시리즈에 저장합니다.\n",
"\n",
- "위 코드를 실행해 발의안 99호 문제의 시간 가중치를 구하면 다음과 같은 결과가 나옵니다. 1986, 87, 88년을 제외한 모든 기간의 가중치가 0입니다. 마지막 3개 기간의 가중평균만으로도 처치 전 기간과 처치 후 기간의 균형을 맞추기에 충분하다는 뜻입니다."
+ "위 코드를 실행해 발의안 99호 문제의 시간 가중치를 구하면 다음과 같은 결과가 나옵니다. 1986, 87, 88년을 제외한 모든 기간의 가중치가 0이라는 점에 주목하세요. 마지막 3개 기간만 가중평균해도 처치 전 기간과 처치 후 기간의 균형을 맞추기에 충분하다는 뜻입니다."
]
},
{
@@ -1054,7 +1054,7 @@
"id": "b15ee07d",
"metadata": {},
"source": [
- "합성 이중차분법 추정량에서 시간 가중치 $\\lambda_t$가 무엇이고 어떻게 추정하는지 배웠으니, 이제 대상 가중치 $w_i$로 눈을 돌려 보겠습니다. 아쉽게도 대상 가중치는 기존 통제집단합성법에서 얻는 가중치와 똑같지 않습니다. 첫 번째 차이는 여기서도 절편 $w_0$을 허용한다는 것입니다. 이제는 실험군과 가상의 대조군의 수준이 같을 필요가 없기 때문입니다. DID를 함께 쓸 것이므로 가상의 대조군과 실험군의 추세만 평행하게 만들면 됩니다.\n",
+ "합성 이중차분법 추정량에서 시간 가중치 $\\lambda_t$가 무엇이고 어떻게 추정하는지 배웠으니, 이제 대상 가중치 $w_i$로 눈을 돌려 보겠습니다. 기대했을지 모르지만, 아쉽게도 대상 가중치는 기존 통제집단합성법에서 얻는 가중치와 똑같지 않습니다. 첫 번째 차이는 여기서도 절편 $w_0$을 허용한다는 것입니다. 이제는 실험군과 가상의 대조군이 같은 수준에 있을 필요가 없기 때문입니다. DID를 함께 쓸 것이므로 가상의 대조군과 실험군의 추세만 평행하게 만들면 됩니다.\n",
"\n",
"두 번째 차이는 가중치에 $L_2$ 페널티를 추가한다는 것입니다. 이 페널티 덕분에 소수의 대상만 가상의 대조군에 기여하는 대신, 0이 아닌 가중치가 여러 대조군 대상에 더 고르게 퍼집니다. $L_2$ 페널티는 아주 큰 가중치가 생기지 않게 막아서 더 많은 대상을 쓰도록 강제합니다.\n",
"\n",
@@ -1107,7 +1107,7 @@
"id": "91eadd6b",
"metadata": {},
"source": [
- "대상 가중치 자체에는 특별히 새로운 것이 없습니다. 시간 가중치를 추정하는 함수의 코드를 상당 부분 다시 쓸 수 있습니다. 이제는 문제가 위아래로 뒤집혔으니 차원에만 주의하면 됩니다."
+ "대상 가중치를 추정하는 코드에도 특별히 새로운 것은 없습니다. 시간 가중치를 추정하던 함수의 코드를 상당 부분 그대로 가져다 쓸 수 있습니다. 이제는 문제가 위아래로 뒤집혔으니 차원에만 주의하면 됩니다."
]
},
{
@@ -1162,7 +1162,7 @@
"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",
"\n",
@@ -1213,7 +1213,7 @@
"id": "7cbd2cb6",
"metadata": {},
"source": [
- "이 대상 가중치로도 가상의 대조군을 정의할 수 있으니 캘리포니아의 결과와 함께 그려 보겠습니다. 또한 앞에서 추정한 기존 가상의 대조군을, 방금 추정한 가상의 대조군에 절편 항을 더한 것과 나란히 그리겠습니다. 이렇게 하면 무슨 일이 일어나고 있는지, 방금 한 작업이 기존 통제집단합성법과 어떻게 다른지 감을 잡을 수 있습니다."
+ "이 대상 가중치로도 가상의 대조군을 정의할 수 있으니 캘리포니아의 결과와 함께 그려 보겠습니다. 또한 방금 추정한 가상의 대조군에 절편 항을 더한 선도, 앞에서 추정한 기존 가상의 대조군과 나란히 그리겠습니다. 이렇게 하면 무슨 일이 일어나고 있는지, 방금 한 작업이 기존 통제집단합성법과 어떻게 다른지 감을 잡을 수 있습니다."
]
},
{
@@ -1528,7 +1528,7 @@
"id": "0d7dc7f5",
"metadata": {},
"source": [
- "이제 남은 일은 방금 정의한 가중치로 이중차분법 모델을 추정하는 것뿐입니다. 처치 후 기간 더미와 실험군 더미의 상호작용 항의 매개변수 추정값이 $ATT$의 합성 이중차분법 추정값입니다."
+ "이제 남은 일은 방금 정의한 가중치로 이중차분법 모델을 추정하는 것뿐입니다. 처치 후 기간 더미와 실험군 더미의 상호작용 항에 붙는 매개변수 추정값이 바로 $ATT$에 대한 합성 이중차분법 추정값입니다."
]
},
{
@@ -1587,7 +1587,7 @@
"source": [
"이 추정값은 이중차분법으로 얻은 값보다 훨씬 작지만 놀랄 일은 아닙니다. 앞서 이야기했듯이 이 예제에서는 평행 추세 가정을 의심할 만한 이유가 충분하므로 이중차분법 추정량은 아마 편향되어 있을 것입니다. 덜 분명한 것은 SDID 추정값이 왜 기존 통제집단합성법 추정값보다도 작은가 하는 점입니다. 앞의 통제집단합성법 그래프를 다시 보면, 캘리포니아의 담배 판매량이 발의안 99호 이전부터 가상의 대조군보다 낮아지기 시작했습니다. 이는 기존 통제집단합성법이 처치 전 기간 전체에 걸쳐 실험군과 대조군을 맞춰야 해서 이 연도 저 연도에서 조금씩 빗나가기 때문일 것입니다. SDID에서는 시간 가중치 덕분에 개입 후 기간과 더 비슷한 기간에만 집중할 수 있으므로 이 문제가 덜합니다. 이 예제에서는 그 기간이 바로 발의안 99호 직전 3년이었습니다.\n",
"\n",
- "SDID가 하는 일을 이해하기 위해 실험군(캘리포니아)과 SDID 가상의 대조군의 이중차분 선을 그려 보겠습니다. 가상의 대조군에서 보이는 추세를 실험군에 투영해서 반사실(counterfactual) $Y(0)_{tr, post}$를 얻는다는 점에 주목하세요. 보라색 점선과 아래쪽 보라색 실선 사이의 차이가 $ATT$입니다. 시간 가중치가 1986, 87, 88년을 제외한 모든 기간을 0으로 만든다는 점을 보여 주려고 선을 1987년에서 시작했습니다. 시간 가중치는 아래쪽의 작은 그래프에도 나타냈습니다."
+ "SDID가 하는 일을 이해하기 위해 실험군(캘리포니아)과 SDID로 만든 가상의 대조군에 이중차분 선을 그려 보겠습니다. 가상의 대조군에서 보이는 추세를 실험군에 투영해서 반사실(counterfactual) $Y(0)_{tr, post}$를 얻는다는 점에 주목하세요. 보라색 점선과 아래쪽 보라색 실선 사이의 차이가 $ATT$입니다. 시간 가중치가 1986, 87, 88년을 제외한 모든 기간을 0으로 만든다는 점을 보여 주려고 선을 1987년에서 시작했습니다. 시간 가중치는 아래쪽의 작은 그래프에도 나타냈습니다."
]
},
{
@@ -1658,13 +1658,13 @@
"id": "6140f080",
"metadata": {},
"source": [
- "위의 추정량이 추정하는 $ATT$는 캘리포니아에 미친 발의안 99호의 효과를 처치 후 모든 기간에 걸쳐 평균한 값입니다. 그런데 위 그래프를 보면 효과가 시간이 지날수록 커지는 것 같습니다. 이 점을 반영하고 싶다면 어떻게 해야 할까요? 다행히 아주 간단합니다.\n",
+ "위 추정량으로 구한 $ATT$는 발의안 99호가 캘리포니아에 미친 효과를 처치 후 모든 기간에 걸쳐 평균한 값입니다. 그런데 위 그래프를 보면 효과가 시간이 지날수록 커지는 것 같습니다. 이 점을 반영하고 싶다면 어떻게 해야 할까요? 다행히 아주 간단합니다.\n",
"\n",
"넘어가기 전에 위의 추정량과 관련해 주의할 점을 하나 말씀드리겠습니다. 방금 실행한 회귀분석이 보고하는 표준오차나 신뢰구간은 믿으면 **안 됩니다**. 가중치를 추정하면서 생기는 분산이 반영되어 있지 않기 때문입니다. 올바르게 추론하는 방법은 잠시 후에 살펴보고, 그 전에 시간에 따른 효과의 이질성을 다루는 방법부터 보겠습니다.\n",
"\n",
"## 시간에 따른 효과 이질성과 시차 도입\n",
"\n",
- "다행히 SDID로 기간마다 효과를 하나씩 추정하기는 놀라울 만큼 쉽습니다. 기간마다 한 번씩, 여러 번 실행하기만 하면 됩니다. 좀 더 정확히 설명하기 위해 기간이 4개, 대상이 3개인 다음 처치 배정 행렬이 있다고 해 보겠습니다. 마지막 대상이 실험군입니다.\n",
+ "다행히 SDID로 기간마다 효과를 하나씩 추정하기는 놀라울 만큼 쉽습니다. 기간마다 한 번씩 여러 번 실행하기만 하면 됩니다. 좀 더 정확히 설명하기 위해 기간이 4개, 대상이 3개인 다음 처치 배정 행렬이 있다고 해 보겠습니다. 마지막 대상이 실험군입니다.\n",
"\n",
"$$\n",
"D = \\begin{bmatrix}\n",
@@ -1831,7 +1831,7 @@
"source": [
"예상대로 효과는 시간이 지날수록 커집니다. 처음에는 작지만 점점 커져서 2020년에는 1인당 담배 소비량이 25갑 줄어든 것으로 보입니다.\n",
"\n",
- "편리하게도 SDID를 여러 번 실행하는 방식은 시차 도입 상황을 다룰 때도 중요합니다. 시차 도입 설계에서는 실험군이 여럿이고, 각 실험군이 서로 다른 기간에 처치를 받습니다. 예를 들어 대상 3개, 기간 4개로 된 아주 단순한 배정 행렬로 돌아가서, 대상 1은 처치를 전혀 받지 않고, 대상 2는 기간 4에, 대상 3은 기간 3에 처치를 받는다고 해 보겠습니다. 그러면 다음 행렬이 됩니다.\n",
+ "편리하게도 SDID를 여러 번 실행하는 이 방식은 시차 도입 상황을 다룰 때도 중요한 역할을 합니다. 시차 도입 설계에서는 실험군이 여럿이고, 각 실험군이 서로 다른 기간에 처치를 받습니다. 예를 들어 대상 3개, 기간 4개로 된 아주 단순한 배정 행렬로 돌아가서, 대상 1은 처치를 전혀 받지 않고, 대상 2는 기간 4에, 대상 3은 기간 3에 처치를 받는다고 해 보겠습니다. 그러면 다음 행렬이 됩니다.\n",
"\n",
"$$\n",
"D = \\begin{bmatrix}\n",
@@ -1842,7 +1842,7 @@
"\\end{bmatrix}\n",
"$$\n",
"\n",
- "SDID는 이 행렬을 처리할 수 없습니다. 무엇이 처치 전 기간인지(두 번째 대상이라면 기간 4 이전, 세 번째 대상이라면 기간 3 이전), 무엇이 대조군인지(기간 3에 시작하는 처치에 대해서는 대상 2가 대조군이 될 수 있습니다) 명확하게 정의되지 않기 때문입니다. 이 문제를 푸는 열쇠는 행렬에서 열(대상)이나 행(기간)을 지워서 블록 배정 설계로 되돌릴 수 있다는 사실을 깨닫는 것입니다.\n",
+ "SDID는 이 행렬을 처리할 수 없습니다. 처치 전 기간이 어디까지인지(두 번째 대상이라면 기간 4 이전, 세 번째 대상이라면 기간 3 이전), 어떤 대상이 대조군인지(기간 3에 시작하는 처치에 대해서는 대상 2가 대조군이 될 수 있습니다)가 명확하지 않기 때문입니다. 이 문제를 푸는 열쇠는 행렬에서 열(대상)이나 행(기간)을 지워서 블록 배정 설계로 되돌릴 수 있다는 사실을 깨닫는 것입니다.\n",
"\n",
"예를 들어 위 행렬에서 세 번째 기간을 지워 블록 행렬을 하나 만들고, 네 번째 기간을 지워 또 하나를 만들 수 있습니다.\n",
"\n",
@@ -1887,7 +1887,7 @@
"\n",
"여기서 $D_1$은 대상 1과 2로, $D_2$는 대상 1과 3으로 이루어져 있습니다.\n",
"\n",
- "기간별로 SDID를 추정하는 방법은 이미 보았으니, 이번에는 대상을 걸러 내는 접근법을 살펴보겠습니다. 원래 발의안 99호 데이터는 시차 도입 설계가 아니므로 시뮬레이션으로 만들어 보겠습니다. 데이터에서 새로운 주 3개를 만들고, 이 주들이 1993년에 발의안 99호와 비슷한 법을 통과시켰다고 가정합니다. 캘리포니아의 성과에 감명받아 자기 주에서도 시도해 보고 싶었을지도 모릅니다. 이 주들이 통과시킨 법은 시행 후 매년 담배 소비를 3%씩 줄입니다. 무슨 일이 일어나는지 더 잘 이해하기 위해 새 주들의 평균 담배 소비량을 시각화해 보겠습니다. 검은 점선은 이 주들이 금연법을 통과시킨 연도입니다.\n",
+ "기간별로 SDID를 추정하는 방법은 이미 보았으니, 이번에는 대상을 걸러 내는 접근법을 살펴보겠습니다. 원래 발의안 99호 데이터에는 시차 도입 설계가 없으니 하나를 시뮬레이션으로 만들어 보겠습니다. 데이터에서 새로운 주 3개를 만들고, 이 주들이 1993년에 발의안 99호와 비슷한 법을 통과시켰다고 가정합니다. 캘리포니아의 성과에 감명받아 자기 주에서도 시도해 보고 싶었을지도 모릅니다. 이 주들이 통과시킨 법은 시행 후 매년 담배 소비를 3%씩 줄입니다. 상황을 파악하기 쉽도록 새 주들의 평균 담배 소비량을 그려 보겠습니다. 검은 점선은 이 주들이 금연법을 통과시킨 연도입니다.\n",
"\n",
"> 옮긴이: 원문의 몇 군데 오기를 바로잡거나 짚어 둡니다. 데이터는 2000년까지이므로 첫 문단의 2020년은 2000년의 오기로 보입니다(본문은 원문대로 두었습니다). 처치 전 기간을 설명하는 괄호에서 원문은 두 번 모두 '두 번째 대상'이라고 썼고, 열을 지운 예에서는 두 번째 행렬이 '대상 1과 4'로 이루어졌다고 썼지만, 문맥상 각각 세 번째 대상, 대상 1과 3이 맞아서 그렇게 옮겼습니다."
]
@@ -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`를 다시 만들기만 하면 됩니다."
]
},
{
@@ -2101,9 +2101,9 @@
"\n",
"## 위약 분산 추정\n",
"\n",
- "장이 좀 길어지고 있지만 아직 지키지 못한 약속이 하나 남았습니다. 맨 처음에 SDID가 통제집단합성법보다 정밀도가 높다(오차 막대가 작다)고 했던 것을 기억하나요? SDID의 시간 고정효과와 대상 고정효과가 결과의 변동을 상당 부분 포착하고, 그 덕분에 추정량의 분산이 줄어들기 때문입니다.\n",
+ "장이 좀 길어지고 있지만 아직 지키지 못한 약속이 하나 남았습니다. 맨 처음에 SDID가 통제집단합성법보다 정밀도가 높다(오차 막대가 작다)고 했던 것을 기억하나요? 그 이유는 SDID의 시간 고정효과와 대상 고정효과가 결과의 변동을 상당 부분 포착해서 추정량의 분산을 줄이기 때문입니다.\n",
"\n",
- "물론 제 말만 믿으라고 하지는 않겠습니다. 이제 SDID 추정값의 신뢰구간을 구하는 방법을 보여 드리겠습니다. 이 문제에는 여러 해법이 있지만, 실험군이 하나뿐인 경우에 맞는 방법은 하나뿐입니다. 캘리포니아만 처치를 받았으니 지금이 바로 그런 경우입니다. 아이디어는 일련의 위약 검정(placebo test)을 실행하는 것입니다. 대조군 풀에서 실제로는 처치를 받지 않은 대상 하나를 처치받은 것처럼 꾸밉니다. 그런 다음 SDID로 이 위약 검정의 $ATT$를 추정하고 결과를 저장합니다. 매번 대조군 대상을 하나씩 뽑으면서 이 단계를 여러 번 반복합니다. 그러면 결국 위약 $ATT$의 배열을 얻게 됩니다. 이 배열의 분산이 SDID 효과 추정값의 위약 분산이며, 이를 이용해 신뢰구간을 만들 수 있습니다.\n",
+ "물론 제 말만 믿으라고 하지는 않겠습니다. 이제 SDID 추정값의 신뢰구간을 구하는 방법을 보여 드리겠습니다. 이 문제에는 여러 해법이 있지만, 실험군이 하나뿐인 경우에 맞는 방법은 한 가지입니다. 캘리포니아만 처치를 받았으니 지금이 바로 그런 경우입니다. 아이디어는 위약 검정(placebo test)을 여러 번 실행하는 것입니다. 각 검정에서는 대조군 풀에서 실제로는 처치를 받지 않은 대상 하나를 처치받은 것처럼 꾸밉니다. 그런 다음 SDID로 이 위약 검정의 $ATT$를 추정하고 결과를 저장합니다. 매번 대조군 대상을 하나씩 뽑으면서 이 단계를 여러 번 반복합니다. 그러면 결국 위약 $ATT$들이 담긴 배열이 남습니다. 이 배열의 분산이 SDID 효과 추정값의 위약 분산이며, 이를 이용해 신뢰구간을 만들 수 있습니다.\n",
"\n",
"$$\n",
"\\hat{V}^{placebo}_{\\tau} = B^{-1}\\sum_{b=1}^B\\bigg(\\hat{\\tau}^{(b)} - \\bar{\\hat{\\tau}}^{(b)}\\bigg)^2\n",
@@ -2247,7 +2247,7 @@
"source": [
"위 예에서는 주 39를 뽑았고, 이제 이 주가 처치를 받았다고 가정합니다. `treated` 열이 `True`로 바뀐 것을 확인할 수 있습니다.\n",
"\n",
- "다음으로 필요한 것은 이 위약 데이터로 SDID 추정값을 계산하는 과정을 여러 번 반복하는 것입니다. 다음 함수가 이 일을 합니다. 이 함수는 `synthetic_diff_in_diff` 함수를 실행해 SDID 추정값을 구하는데, 평소의 데이터 대신 `make_random_placebo`를 호출한 결과를 넘깁니다. 이를 여러 번 반복해서 SDID 추정값의 배열을 얻고, 마지막으로 이 배열의 분산의 제곱근, 즉 표준편차를 계산합니다."
+ "다음으로는 이 위약 데이터로 SDID 추정값을 계산하는 과정을 여러 번 반복해야 합니다. 다음 함수가 이 일을 합니다. 이 함수는 `synthetic_diff_in_diff` 함수를 실행해 SDID 추정값을 구하는데, 평소의 데이터 대신 `make_random_placebo`를 호출한 결과를 넘깁니다. 이를 여러 번 반복해서 SDID 추정값의 배열을 얻고, 마지막으로 이 배열의 분산의 제곱근, 즉 표준편차를 계산합니다."
]
},
{
@@ -2533,7 +2533,7 @@
"source": [
"## 핵심 요약\n",
"\n",
- "합성 이중차분법(SDID)은 이중차분법과 통제집단합성법 양쪽에서 아이디어를 가져왔고, 그 덕분에 두 모델의 장점을 함께 누립니다. SDID는 통제집단합성법처럼 처치 전 추세가 평행하지 않아도 여러 기간에 걸쳐 잘 작동합니다. 하지만 통제집단합성법과 달리, SDID는 실험군과 평행하기만 한(수준까지 맞출 필요는 없는) 대조 대상을 만들도록 대상 가중치를 추정합니다. SDID는 DID에서 시간 고정효과와 대상 고정효과를 가져오는데, 이 고정효과들이 결과의 분산을 많이 설명해 주므로 SDID 추정량의 분산이 줄어듭니다. 합성 이중차분법은 고유한 새 아이디어도 몇 가지 내놓습니다. 첫째, 대상 가중치를 최적화할 때 $L2$ 페널티를 추가해 가중치가 대조군 대상들에 더 넓게 퍼지게 합니다. 둘째, 가중치를 만들 때 절편을 허용합니다(따라서 외삽도 허용합니다). 셋째, DID에도 SC에도 없는 시간 가중치를 사용합니다. 그래서 저는 SDID가 단순히 SC와 DID를 합친 것이라고 말하지 않겠습니다. 오히려 두 접근법에서 영감을 받아 새로운 것을 만들었다고 보는 편이 맞습니다. 또한 SDID가 기존 통제집단합성법보다 낫다거나 못하다고 말하지도 않겠습니다. 둘은 서로 다른 성질을 지니고 있어서 상황에 따라 적절할 수도, 그렇지 않을 수도 있습니다. 예를 들어 SDID가 허용하는 외삽이 위험한 상황에 놓일 수도 있습니다. 그럴 때는 SC가 좋은 대안이 될 수 있습니다.\n",
+ "합성 이중차분법(SDID)은 이중차분법과 통제집단합성법 양쪽에서 아이디어를 가져왔고, 그 덕분에 두 모델의 장점을 함께 누립니다. SDID는 통제집단합성법처럼 처치 전 추세가 평행하지 않아도 여러 기간에 걸쳐 잘 작동합니다. 하지만 통제집단합성법과 달리, 실험군과 평행하기만 하면 되는(수준까지 맞출 필요는 없는) 대조 대상을 만들도록 대상 가중치를 추정합니다. 또 DID에서 시간 고정효과와 대상 고정효과를 가져오는데, 이 고정효과들이 결과의 분산을 많이 설명해 주므로 SDID 추정량의 분산이 줄어듭니다. 합성 이중차분법은 고유한 새 아이디어도 몇 가지 내놓습니다. 첫째, 대상 가중치를 최적화할 때 $L2$ 페널티를 추가해 가중치가 대조군 대상들에 더 넓게 퍼지게 합니다. 둘째, 가중치를 만들 때 절편을 허용합니다(따라서 외삽도 허용합니다). 셋째, DID에도 SC에도 없는 시간 가중치를 사용합니다. 그래서 저는 SDID가 단순히 SC와 DID를 합친 것이라고 말하지 않겠습니다. 오히려 두 접근법에서 영감을 받아 새로운 것을 만들었다고 보는 편이 맞습니다. 또한 SDID가 기존 통제집단합성법보다 낫다거나 못하다고 말하지도 않겠습니다. 둘은 서로 다른 성질을 지니고 있어서 상황에 따라 적절할 수도, 그렇지 않을 수도 있습니다. 예를 들어 SDID가 허용하는 외삽이 위험한 상황에 놓일 수도 있습니다. 그럴 때는 SC가 좋은 대안이 될 수 있습니다.\n",
"\n",
"> 옮긴이: 원문은 \"SC와 SDID를 합친 것\"이라고 썼지만 \"SC와 DID\"의 오기로 보고 그렇게 옮겼습니다.\n",
"\n",
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 3b1b584..138097c 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
@@ -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",
"\n",
"\n",
@@ -295,7 +295,7 @@
"source": [
"## 어른을 위한 추론\n",
"\n",
- "통제집단합성법 장에서는 대조군 대상을 실험군인 것처럼 가정하고 대상을 바꿔 가며 효과를 구하는 추론 절차를 보여 드렸습니다. 처치를 받지 않은 대상의 효과를 확인한다는 점에서 위약 검정(placebo test)이라고도 부릅니다. 실험군 대상의 효과 추정값이 대부분의 위약 효과보다 크면 이 효과 추정값이 유의하다고 말합니다."
+ "통제집단합성법 장에서는 대조군 대상을 실험군인 것처럼 가정하고 대상을 바꿔 가며 효과를 구하는 추론 절차를 보여 드렸습니다. 처치를 받지 않은 대상의 효과를 확인한다는 점에서 위약 검정(placebo test)이라고도 부릅니다. 실험군 대상의 효과 추정값이 대부분의 위약 효과보다 크면 그 추정값이 유의하다고 말합니다."
]
},
{
@@ -349,7 +349,7 @@
"source": [
"이 예에서는 캘리포니아의 처치 후 차이가 다른 주들에 비해 꽤 극단적입니다. 하지만 처치 전 적합이 형편없는 주도 몇 개 있고, 이런 주는 개입 이후 기간에 오차가 아주 커집니다. 처치 전 오차가 큰 대상은 빼라는 것이 일반적인 지침이지만, 얼마나 커야 큰 것인지는 조금 복잡한 문제입니다. 게다가 이 절차는 개입이 무작위로 배정됐다고 가정하는데, 이런 종류의 정책 개입에서는 믿기 어려운 가정입니다(Abadie, 2021 참고).\n",
"\n",
- "다른 추론 방법으로, 효과 추정 문제를 반사실 예측 문제로 바꿔서 볼 수 있습니다. 생각해 보면 지금 하려는 일은 결국 반사실 $Y_{i, t}(0)$를 예측하는 것입니다. 여기서 $i$는 실험군 대상이고 $t \\geq T1$, 즉 개입 이후 기간입니다. 이렇게 보면 **추론을 위한 컨포멀 예측(conformal prediction)** 문헌을 활용할 수 있습니다. 흥미롭게도 이 방법은 꽤 일반적이어서 $Y_{i, t}(0)$에 대한 다른 모델에도 적용할 수 있지만, 여기서는 통제집단합성법에만 집중하겠습니다.\n",
+ "다른 추론 방법은 효과 추정 문제를 반사실 예측 문제로 바꿔 보는 것입니다. 생각해 보면 지금 하려는 일은 결국 반사실 $Y_{i, t}(0)$를 예측하는 일입니다. 여기서 $i$는 실험군 대상이고 $t \\geq T1$, 즉 개입 이후 기간입니다. 이렇게 보면 **추론을 위한 컨포멀 예측(conformal prediction)** 문헌을 활용할 수 있습니다. 흥미롭게도 이 방법은 꽤 일반적이어서 $Y_{i, t}(0)$에 대한 다른 모델에도 적용할 수 있지만, 여기서는 통제집단합성법에만 집중하겠습니다.\n",
"\n",
"이 절차를 이해하기 위해, 먼저 가설검정을 하고 p 값을 구하는 방법부터 살펴봅시다.\n",
"\n",
@@ -421,11 +421,11 @@
"id": "9afe8f41",
"metadata": {},
"source": [
- "효과가 없다는 귀무가설을 가정하면, 그 귀무가설 아래의 데이터는 $Y(0) = Y(1) = Y$입니다. 즉 실험군인 캘리포니아에서 관측한 결과의 궤적 그대로입니다. 이번에는 귀무가설을 -4, 즉 발의안 99호가 담배 판매량을 4갑 줄인다고 가정하면 $Y(0) = Y(1) - (-4)$가 되어 처치 후 결과의 궤적이 +4만큼 위로 이동합니다. 아주 직관적입니다. 법안이 담배 판매량을 줄인다고 생각한다면, 법안이 없었을 때는 관측 데이터보다 담배 판매량이 더 높아야 하니까요.\n",
+ "효과가 없다는 귀무가설을 가정하면, 그 귀무가설 아래의 데이터는 $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$를 계산해 모든 결과를 데이터프레임에 담습니다."
]
},
{
@@ -758,7 +758,7 @@
"source": [
"### 신뢰구간\n",
"\n",
- "처치 이후 각 기간의 효과에 신뢰구간을 두는 방법을 이해하기 위해, 먼저 한 기간의 신뢰구간을 어떻게 정의할지 생각해 봅시다. 기간이 하나뿐이라면 $H_0$는 궤적 벡터 $\\theta$가 아니라 스칼라 값 하나로 정의됩니다. 따라서 $H_0s$를 촘촘하게 늘어놓고 귀무가설마다 p 값을 계산할 수 있습니다. 예를 들어 발의안 99호가 통과된 1988년의 효과가 -20에서 20 사이 어딘가라고 생각한다고 합시다. 그러면 -20부터 20까지 여러 $H_0$와 각각의 p 값을 담은 표를 만들 수 있습니다.\n",
+ "처치 이후 각 기간의 효과에 신뢰구간을 두는 방법을 이해하기 위해, 먼저 한 기간의 신뢰구간을 어떻게 정의할지 생각해 봅시다. 기간이 하나뿐이라면 $H_0$는 궤적 벡터 $\\theta$가 아니라 스칼라 값 하나로 정의됩니다. 따라서 $H_0s$를 촘촘하게 늘어놓고 귀무가설마다 p 값을 계산할 수 있습니다. 예를 들어 발의안 99호가 통과된 1988년의 효과가 -20에서 20 사이 어딘가에 있다고 생각해 봅시다. 그러면 -20부터 20까지 여러 $H_0$와 각각의 p 값을 담은 표를 만들 수 있습니다.\n",
"\n",
"```\n",
"P-value(H_0: -20) = 0.01\n",
@@ -1000,7 +1000,7 @@
"source": [
"이렇게 1988년 효과의 신뢰구간을 얻습니다.\n",
"\n",
- "$H_0$별 p 값을 그래프로 그려 보면 이 신뢰구간이 어떻게 나왔는지 더 잘 이해할 수 있습니다. 아래 그림에서 점선은 앞에서 정한 $\\alpha$인 0.1을 나타냅니다. 파란 선은 신뢰구간의 경계입니다. 이 선 바깥의 $H_0$는 p 값이 0.1보다 낮습니다."
+ "$H_0$별 p 값을 그래프로 그려 보면 이 신뢰구간이 어떻게 나왔는지 더 잘 이해할 수 있습니다. 아래 그림에서 점선은 앞에서 정한 $\\alpha$인 0.1을 나타냅니다. 파란 선은 신뢰구간의 경계로, 이 선 바깥의 $H_0$는 p 값이 0.1보다 낮습니다."
]
},
{
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 255ec33..b9460a1 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
@@ -6,7 +6,7 @@
"source": [
"# Debiasing with Orthogonalization\n",
"\n",
- "앞 장에서는 인과 모델을 평가하는 방법을 살펴봤습니다. 그것만으로도 대단한 일입니다. 인과 모델이 추정하는 탄력성(elasticity) $\\frac{\\delta y}{\\delta t}$는 관측할 수 없는 값입니다. 모델이 추정하려는 대상의 참값(ground truth)을 볼 수 없으니, 모델을 평가하려면 꽤 창의적인 방법을 짜내야 했습니다.\n",
+ "앞 장에서는 인과 모델을 평가하는 방법을 살펴봤습니다. 그 자체로도 대단한 일입니다. 인과 모델이 추정하는 탄력성(elasticity) $\\frac{\\delta y}{\\delta t}$는 관측할 수 없는 값입니다. 모델이 추정하려는 대상의 참값(ground truth)을 볼 수 없으니, 모델을 평가하려면 꽤 창의적인 방법을 짜내야 했습니다.\n",
"\n",
"앞 장에서 소개한 기법은 처치가 무작위로 배정된 데이터에 크게 기대고 있었습니다. 단일 변수 선형회귀 `y ~ t`의 계수로 탄력성 $\\frac{\\delta y}{\\delta t}$를 추정한다는 아이디어였습니다. 하지만 이 방법은 처치가 무작위로 배정되었을 때만 통합니다. 그렇지 않으면 누락 변수 편향(omitted variable bias) 때문에 곤란해집니다.\n",
"\n",
@@ -59,9 +59,9 @@
"\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",
@@ -94,7 +94,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "이번에도 가격 데이터를 쓰겠습니다. 다만 이번에는 가격이 무작위로 배정되지 **않은** 표본만 가져옵니다. 이전과 마찬가지로 데이터를 훈련 셋과 테스트 셋으로 나눕니다. 인과 모델을 평가할 때는 테스트 셋을 쓸 테니, 직교화로 테스트 셋의 편향을 어떻게 제거하는지 알아보겠습니다."
+ "이번에도 가격 데이터를 쓰겠습니다. 다만 가격이 무작위로 배정되지 **않은** 표본만 가져옵니다. 이전과 마찬가지로 데이터를 훈련 셋과 테스트 셋으로 나눕니다. 인과 모델을 평가할 때는 테스트 셋을 쓸 테니, 직교화로 테스트 셋의 편향을 어떻게 제거하는지 알아보겠습니다."
]
},
{
@@ -124,7 +124,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "테스트 셋에서 상관계수를 확인해 보면 가격과 판매량이 양의 상관관계를 보입니다. 가격을 올리면 판매량이 늘어나야 한다는 뜻입니다. 말이 안 되는 결과입니다. 아이스크림이 비싸다고 더 사 먹는 사람은 없습니다. 여기에는 아마 어떤 편향이 숨어 있을 것입니다."
+ "테스트 셋에서 상관계수를 확인해 보면 가격과 판매량이 양의 상관관계를 보입니다. 가격을 올리면 판매량이 늘어나야 한다는 뜻입니다. 누가 봐도 말이 안 되는 결과입니다. 아이스크림이 비싸다고 더 사 먹는 사람은 없습니다. 여기에는 아마 어떤 편향이 숨어 있을 것입니다."
]
},
{
@@ -227,9 +227,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "데이터를 그려 보면 왜 이런 일이 생기는지 알 수 있습니다. 주말(토요일과 일요일)에는 가격도 높지만 판매량도 높습니다. 주말에 해당하는 점들이 그래프의 오른쪽 위에 몰려 있는 것을 보면 알 수 있습니다.\n",
+ "데이터를 그려 보면 왜 이런 일이 생기는지 알 수 있습니다. 주말(토요일과 일요일)에는 가격도 높지만 판매량도 높습니다. 주말에 해당하는 점들이 그래프의 오른쪽 위에 몰려 있는 것이 그 증거입니다.\n",
"\n",
- "여기서는 주말이 편향에 큰 역할을 하고 있을 가능성이 큽니다. 주말에는 수요가 많아서 아이스크림이 더 많이 팔립니다. 그리고 그 수요에 맞춰 가격이 오릅니다. 그러니 가격이 올라서 판매량이 늘어나는 것이 아닙니다. 그저 주말에는 판매량과 가격이 둘 다 높을 뿐입니다."
+ "이 편향에는 아마 주말이 큰 몫을 하고 있을 것입니다. 주말에는 수요가 많아서 아이스크림이 더 많이 팔리고, 그 수요에 맞춰 가격도 오릅니다. 그러니 가격이 올라서 판매량이 늘어나는 것이 아닙니다. 그저 주말에는 판매량과 가격이 둘 다 높을 뿐입니다."
]
},
{
@@ -323,7 +323,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "주말이 더 이상 오른쪽 위에 몰려 있지 않습니다. 가운데로 밀려났습니다. 게다가 요일로는 가격 수준(처치)을 더 이상 구분할 수 없습니다. x축에 그린 잔차 $price-M_t(X)$는 원래 처치를 '무작위'로 만든, 즉 편향을 제거한 버전이라고 할 수 있습니다.\n",
+ "주말 점들이 더 이상 오른쪽 위에 몰려 있지 않고 가운데로 밀려났습니다. 게다가 요일로는 가격 수준(처치)을 더 이상 구분할 수 없습니다. x축에 그린 잔차 $price-M_t(X)$는 원래 처치를 '무작위'로 만든, 즉 편향을 제거한 버전이라고 할 수 있습니다.\n",
"\n",
"데이터셋의 편향을 제거하는 데는 이것만으로 충분합니다. 새로 만든 처치는 무작위 배정이나 다름없습니다. 하지만 편향을 제거한 데이터셋을 더 낫게 만들 방법이 하나 더 있습니다. 바로 결과의 잔차도 구하는 것입니다.\n",
"\n",
@@ -331,7 +331,7 @@
"\\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$에 들어 있지 않은 것)뿐이고, 그런 것은 처치밖에 없습니다(다시 말하지만, 측정되지 않은 교란 요인이 없다는 가정 아래에서입니다)."
]
},
{
@@ -677,7 +677,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "가장 먼저 눈에 띄는 것은 평균 탄력성이 내려가지 않고 올라간다는 점입니다. 이미 본 현상입니다. 편향된 데이터에서는 가격이 오를수록 판매량이 늘어나는 것처럼 보입니다. 그래서 누적 이득 그래프의 끝점이 양수입니다. 아이스크림 가격을 올린다고 사람들이 더 사 먹지 않는다는 것을 알고 있으니 말이 안 되는 결과입니다. 평균 가격 탄력성부터 엉망이라면 그 안에서 매긴 순서도 의미가 없습니다. 결론적으로 이 데이터는 모델 평가에 써서는 안 됩니다."
+ "가장 먼저 눈에 띄는 것은 평균 탄력성이 내려가지 않고 올라간다는 점입니다. 이미 본 현상입니다. 편향된 데이터에서는 가격이 오를수록 판매량이 늘어나는 것처럼 보입니다. 그래서 누적 이득 그래프의 끝점이 양수입니다. 아이스크림 가격을 올린다고 사람들이 더 사 먹지 않는다는 것을 알고 있으니 말이 안 되는 결과입니다. 평균 가격 탄력성부터 엉망이라면 그 안에서 매긴 순서도 의미가 없습니다. 결론은 이 데이터를 모델 평가에 써서는 안 된다는 것입니다."
]
},
{
@@ -889,19 +889,19 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "이번에도 가격이 판매량에 미치는 음의 탄력성을 찾아냈습니다. 사실 이 그래프는 단순 선형회귀를 썼을 때 얻은 그래프와 놀라울 만큼 비슷합니다. 하지만 이는 아마 데이터셋이 아주 단순하기 때문일 것입니다. 머신러닝 직교화의 장점은 더 복잡한 함수를 추정할 수 있다는 데 있습니다. 선형회귀로는 표현하기 어려운 상호작용과 비선형성을 학습할 수 있습니다. 또 일부 머신러닝 모델(결정 트리 기반 모델)은 선형회귀보다 훨씬 간편하게 돌릴 수 있다는 장점도 있습니다. 범주형 데이터, 이상치, 심지어 결측값까지 처리할 수 있는데, 선형회귀만 쓴다면 이런 것들은 따로 신경을 써야 합니다.\n",
+ "이번에도 가격이 판매량에 미치는 음의 탄력성을 찾아냈습니다. 사실 이 그래프는 단순선형회귀를 썼을 때 얻은 그래프와 놀라울 만큼 비슷합니다. 하지만 이는 아마 데이터셋이 아주 단순하기 때문일 것입니다. 머신러닝 직교화의 장점은 더 복잡한 함수를 추정할 수 있다는 데 있습니다. 선형회귀로는 표현하기 어려운 상호작용과 비선형성을 학습할 수 있습니다. 또 일부 머신러닝 모델(결정 트리 기반 모델)은 선형회귀보다 훨씬 간편하게 돌릴 수 있다는 장점도 있습니다. 범주형 데이터, 이상치, 심지어 결측값까지 처리할 수 있는데, 선형회귀만 쓴다면 이런 것들은 따로 신경을 써야 합니다.\n",
"\n",
- "마무리하기 전에, 데이터 과학자들이 이 아이디어를 처음 접할 때 흔히 저지르는 실수 하나만 짚고 넘어가겠습니다(저도 해 봤습니다). 처치나 결과가 이진 변수라면 머신러닝 회귀 모델을 분류 모델로 바꾸는 편이 낫다고 생각할 수 있습니다. 하지만 그렇게 하면 안 됩니다. 직교화 이론은 회귀 모델에서만 성립합니다. 오래전에 도구변수(instrumental variable)를 다룰 때 본 것과 비슷합니다. 솔직히 말하면 회귀를 분류로 바꾼다고 모델이 처참하게 실패하지는 않겠지만, 저라면 권하지 않겠습니다. 이론이 뒷받침하지 않는데 굳이 위험을 감수할 이유가 있을까요?\n",
+ "마무리하기 전에, 데이터 과학자들이 이 아이디어를 처음 접할 때 흔히 저지르는 실수 하나만 짚고 넘어가겠습니다(저도 해 본 실수입니다). 처치나 결과가 이진 변수라면 머신러닝 회귀 모델을 분류 모델로 바꾸는 편이 낫다고 생각할 수 있습니다. 하지만 그렇게 하면 안 됩니다. 직교화 이론은 회귀 모델에서만 성립합니다. 한참 전에 도구변수(instrumental variable)를 다룰 때 본 것과 비슷한 이야기입니다. 솔직히 말하면 회귀를 분류로 바꾼다고 모델이 처참하게 실패하지는 않겠지만, 저라면 권하지 않겠습니다. 이론이 뒷받침하지 않는데 굳이 위험을 감수할 이유가 있을까요?\n",
"\n",
"## 핵심 요약\n",
"\n",
- "이번 장은 인과 모델 평가 방법이 제대로 작동하려면 처치가 무작위로 배정되어야 한다는 점을 강조하면서 시작했습니다. 무작위 데이터가 없으면 이것이 문제가 됩니다. 분명히 해 두자면, 이럴 때 가장 안전한 해법은 실험을 해서 무작위 데이터를 얻는 것입니다. 그럴 수 없을 때에야 비로소 기발한 대안에 기댈 수 있습니다. 바로 처치가 무작위로 배정된 것처럼 보이도록 데이터를 변환하는 것입니다.\n",
+ "이번 장은 인과 모델 평가 방법이 제대로 작동하려면 처치가 무작위로 배정되어야 한다는 점을 강조하면서 시작했습니다. 무작위 데이터를 구할 수 없을 때는 이 점이 문제가 됩니다. 분명히 해 두자면, 이럴 때 가장 안전한 해법은 실험을 해서 무작위 데이터를 얻는 것입니다. 그럴 수 없을 때에야 비로소 기발한 대안에 기댈 수 있습니다. 바로 처치가 무작위로 배정된 것처럼 보이도록 데이터를 변환하는 것입니다.\n",
"\n",
"이번 장에서는 직교화의 원리로 이를 해내는 방법을 다뤘습니다. 먼저 특성 $X$로 처치 $t$를 예측하는 모델을 만들고 그 잔차를 구했습니다. 처치 잔차는 정의상 자신을 만드는 데 쓴 특성과 독립이라는 것이 핵심입니다. 다시 말해 처치 잔차는 특성과 직교합니다. 이 잔차는 $X$로 생긴 교란편향을 모두 걷어 낸 처치라고 볼 수 있습니다.\n",
"\n",
"데이터를 무작위나 다름없게 만드는 데는 이것만으로 충분합니다. 하지만 한 걸음 더 나아갈 수 있습니다. 처치는 빼고 특성 $X$만으로 결과 $y$를 예측하는 모델을 만들고, 마찬가지로 그 잔차를 구하는 것입니다. 이번에도 직관은 아주 비슷합니다. 결과 잔차는 특성으로 생긴 분산을 모두 설명해서 걷어 낸 결과입니다. 이 과정에서 분산이 많이 설명되면 처치효과를 보기가 더 쉬워집니다.\n",
"\n",
- "이번 장에서는 모델 평가를 위해 데이터의 편향을 제거하려고 직교화를 썼습니다. 하지만 이 기법은 다른 목적으로도 쓰입니다. 많은 인과추론 모델이 인과 모델의 부담을 덜기 위해 첫 번째 전처리 단계로 직교화를 사용합니다. 직교화는 현대 인과추론 알고리즘 상당수의 토대라고 할 수 있습니다.\n",
+ "이번 장에서는 모델을 평가하려고 데이터의 편향을 제거하는 데 직교화를 썼습니다. 하지만 이 기법은 다른 목적으로도 쓰입니다. 많은 인과추론 모델이 인과 모델의 부담을 덜려고 직교화를 첫 번째 전처리 단계로 씁니다. 직교화는 현대 인과추론 알고리즘 상당수의 토대라고 할 수 있습니다.\n",
"\n",
"\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 b489276..a928cd4 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
@@ -26,9 +26,9 @@
" \n",
"\n",
" \n",
- "덧붙이자면, 비즈니스 전문성을 살려 타깃 고객을 고르면서도 마케팅 전략이 얼마나 효과적인지 타당하게 추론할 수 있는 방법으로는 이것이 제가 아는 최선입니다. 마케팅팀은 이 확률 함수에 따라 이메일을 배정했을 뿐 아니라 고객별 확률까지 저장해 두었습니다. 나중에 아주 요긴하게 쓰일 것입니다.\n",
+ "덧붙이자면, 비즈니스 전문성을 살려 타깃 고객을 고르면서도 마케팅 전략의 효과를 타당하게 추론할 수 있는 방법 가운데 제가 아는 최선이 바로 이것입니다. 마케팅팀은 이 확률 함수에 따라 이메일을 배정했을 뿐 아니라 고객별 확률까지 저장해 두었습니다. 이 확률은 나중에 아주 요긴하게 쓰입니다.\n",
" \n",
- "실험 데이터는 다음과 같습니다. 고객 속성은 네 가지로, 나이(`age`), 소득(`income`), 생명보험 가입액(`insurance`), 투자액(`invested`)입니다. 마케팅팀은 이 속성들로 고객이 각 이메일을 받을 확률을 정했습니다. 그 확률은 `em1_ps`, `em2_ps`, `em3_ps` 열에 저장되어 있습니다. 다음으로 `em1`, `em2`, `em3` 열에는 고객이 실제로 이메일을 받았는지가 들어 있습니다. 이것이 처치변수입니다. 마지막으로 결과변수 `converted`는 고객이 금융 자문 서비스에 가입했는지를 나타냅니다."
+ "실험 데이터는 다음과 같습니다. 고객 속성은 네 가지로, 나이(`age`), 소득(`income`), 생명보험 가입액(`insurance`), 투자액(`invested`)입니다. 마케팅팀은 이 속성들로 고객이 각 이메일을 받을 확률을 정했습니다. 그 확률은 `em1_ps`, `em2_ps`, `em3_ps` 열에 저장되어 있습니다. 다음으로 `em1`, `em2`, `em3` 열에는 고객이 실제로 이메일을 받았는지가 들어 있습니다. 이 세 열이 처치변수입니다. 마지막으로 결과변수 `converted`는 고객이 금융 자문 서비스에 가입했는지를 나타냅니다."
]
},
{
@@ -327,9 +327,9 @@
" \n",
"\n",
" \n",
- "성향점수를 이용한 편향 제거의 아이디어를 다시 정리해 보겠습니다(성향점수 장에서 이미 본 내용입니다). 바로 위와 같은 고객들이 무척 흥미롭습니다. 이들은 `em1`을 받은 고객과 아주 비슷합니다. 어쨌든 이메일을 받을 확률이 높았으니까요. 그런데도 이메일을 받지 않았습니다. 그래서 반사실적 결과(counterfactual outcome) $Y_0|em1=1$을 추정하는 데 안성맞춤인 후보입니다.\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",
@@ -341,7 +341,7 @@
"W_i = \\sum^K_{k=0} \\dfrac{\\mathcal{1}_{K=k} }{P(T=k|X)}\n",
"$$\n",
" \n",
- "성향점수로 편향을 제거하는 방법을 대략 알았으니, 실제로 어떻게 작동하는지 확인해 보겠습니다. 하지만 먼저 데이터셋의 편향을 제거하지 않으면 어떻게 되는지 보겠습니다.\n",
+ "성향점수로 편향을 제거하는 방법을 대략 알았으니, 실제로 어떻게 작동하는지 확인해 볼 차례입니다. 하지만 먼저 데이터셋의 편향을 제거하지 않으면 어떻게 되는지 보겠습니다.\n",
" \n",
"앞에서 말했듯이 처치는 고객의 특성, 즉 나이, 소득, 보험 가입액, 투자액과 교란되어 있습니다."
]
@@ -450,7 +450,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "이 교란편향을 고려하지 않으면 인과 추정값이 틀리게 됩니다. `invested` 변수를 예로 들어 보겠습니다. 투자를 **적게** 하는 고객일수록 전환할 가능성이 **더 높고**, **동시에** 이메일을 받을 가능성도 **더 높습니다**. 그러니 투자액을 통제하지 않으면 `em1`이 전환 확률을 높이는 것처럼 보일 것입니다. 하지만 이는 인과관계가 아니라 그저 상관관계 때문일 수 있습니다. 투자액이 적으면 전환율도 높아지고 `em1`을 받을 확률도 높아지기 때문입니다.\n",
+ "이 교란편향을 고려하지 않으면 인과 추정값이 틀어집니다. `invested` 변수를 예로 들어 보겠습니다. 투자를 **적게** 하는 고객일수록 전환할 가능성이 **더 높고**, **동시에** 이메일을 받을 가능성도 **더 높습니다**. 그러니 투자액을 통제하지 않으면 `em1`이 전환 확률을 높이는 것처럼 보일 것입니다. 하지만 이는 인과관계가 아니라 그저 상관관계 때문일 수 있습니다. 투자액이 적으면 전환율도 높아지고 `em1`을 받을 확률도 높아지기 때문입니다.\n",
" \n",
"교란 요인과의 상관관계 말고도, 이메일 `em1`을 받은 고객과 받지 않은 고객의 분포가 어떻게 생겼는지도 확인할 수 있습니다."
]
@@ -666,9 +666,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "이렇게 다시 추출하면 편향이 제거된 새 데이터셋이 만들어질 것입니다. 실험군처럼 보이지만(`em1_ps`가 높지만) 처치를 받지 않은 대상과, 대조군처럼 보이지만(`em1_ps`가 낮지만) 처치를 받은 대상이 더 많이 뽑혔을 것입니다.\n",
+ "이렇게 다시 추출하면 편향이 제거된 새 데이터셋이 나올 것입니다. 실험군처럼 보이지만(`em1_ps`가 높지만) 처치를 받지 않은 대상과, 대조군처럼 보이지만(`em1_ps`가 낮지만) 처치를 받은 대상이 더 많이 뽑혔을 것입니다.\n",
" \n",
- "처치와 교란 요인 사이의 상관관계를 보면 사실상 사라진 것을 확인할 수 있습니다."
+ "처치와 교란 요인 사이의 상관관계를 보면 사실상 사라졌습니다."
]
},
{
@@ -988,7 +988,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "궁금하니 한번 살펴보면, 추정한 성향점수 `ps_score_m1_est`는 실제 성향점수 `em1_ps`와 가깝지만 똑같지는 않습니다. 추정 과정의 이런 오차는 최종 편향 제거에 영향을 주겠지만, 그 영향이 크지 않기를 바랄 뿐입니다. 점수가 얼마나 잘 보정되었는지도 확인할 수 있습니다. 평균 점수와 `em1`의 평균을 비교해 그려 보면 됩니다. 점수가 잘 보정되어 있다면 점수가 0.2인 고객 중 20%가, 점수가 0.3인 고객 중 30%가 이메일 1을 받았어야 합니다."
+ "호기심 삼아 살펴보면, 추정한 성향점수 `ps_score_m1_est`는 실제 성향점수 `em1_ps`와 가깝지만 똑같지는 않습니다. 추정 과정의 이런 오차는 최종 편향 제거에 영향을 주겠지만, 그 영향이 크지 않기를 바랄 뿐입니다. 점수가 얼마나 잘 보정되었는지도 확인할 수 있습니다. 평균 점수와 `em1`의 평균을 비교해 그려 보면 됩니다. 점수가 잘 보정되어 있다면 점수가 0.2인 고객 중 20%가, 점수가 0.3인 고객 중 30%가 이메일 1을 받는 식이어야 합니다."
]
},
{
@@ -1047,7 +1047,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "상관관계 구조를 확인해 보면, 편향 제거 과정을 거친 뒤에도 처치와 교란 요인 사이에 여전히 상당한 상관관계가 남아 있습니다. 예를 들어 소득의 상관계수는 `-0.18`입니다. 편향된 원래 데이터셋의 상관계수(`-0.3`)보다는 작지만, 원래 성향점수로 편향을 제거한 데이터셋에서 얻은 값(`0.01`)보다는 훨씬 큽니다. `invested` 변수도 마찬가지로 여전히 어느 정도 상관관계를 보입니다.\n",
+ "상관관계 구조를 확인해 보면, 편향 제거 과정을 거친 뒤에도 처치와 교란 요인 사이에 여전히 상당한 상관관계가 남아 있습니다. 예를 들어 소득의 상관계수는 `-0.18`입니다. 편향된 원래 데이터셋의 상관계수(`-0.3`)보다는 작지만, 저장된 원래 성향점수로 편향을 제거한 데이터셋에서 얻은 값(`0.01`)보다는 훨씬 큽니다. `invested` 변수도 마찬가지로 여전히 어느 정도 상관관계를 보입니다.\n",
"\n",
"> 옮긴이: 원문은 이 데이터셋을 \"unbiased dataset\"이라고 썼지만, 편향을 제거하기 전 원래 데이터를 가리키므로 \"편향된 원래 데이터셋\"으로 옮겼습니다."
]
@@ -1233,9 +1233,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "이것이 문제인 이유는 편향 제거 데이터셋에 대상 하나가 지나치게 많이 들어가기 때문입니다. 이 대상이 원래 데이터셋에 없었다면 편향 제거 데이터셋은 완전히 다르게 보였을 수도 있습니다. 즉, 대상 하나만 빼도 편향 제거 데이터셋의 모습이 크게 달라질 수 있습니다. 바로 분산이 크다는 문제입니다.\n",
+ "이러면 편향 제거 데이터셋이 대상 하나로 지나치게 채워지니 문제입니다. 이 대상이 원래 데이터셋에 없었다면 편향 제거 데이터셋은 완전히 다르게 보였을 수도 있습니다. 즉, 대상 하나만 빼도 편향 제거 데이터셋의 모습이 크게 달라질 수 있습니다. 바로 분산이 크다는 문제입니다.\n",
" \n",
- "편향 제거 데이터셋에서 대상별로 몇 번씩 복제되었는지 그려 보면, 10번 넘게 나타나는 대상이 꽤 많습니다. 성향점수가 낮은 실험군 대상이거나 성향점수가 높은 대조군 대상입니다."
+ "편향 제거 데이터셋에서 대상별로 몇 번씩 복제되었는지 그려 보면, 10번 넘게 나타나는 대상이 꽤 많습니다. 이들은 성향점수가 낮은 실험군 대상이거나 성향점수가 높은 대조군 대상입니다."
]
},
{
@@ -1280,7 +1280,7 @@
" \n",
"제 생각에 가장 좋은 방법은 분석 단계가 아니라 실험 단계에서 손을 쓰는 것입니다. 가중치가 지나치게 큰 대상이 하나도 없도록 해야 합니다. 다시 말해 가능한 한 모두에게 같은 확률로 처치를 주도록 해 보세요.\n",
" \n",
- "성향점수 가중치 방법의 편을 조금 들어 주자면, 전체 표본이든 일부 하위 집단이든 처치를 받을 확률이나 받지 않을 확률이 너무 낮으면 어떤 인과추론 방법이든 어려움을 겪습니다. 직관적으로 말하면, 어떤 대상은 처치를 거의 받지 못하거나 반대로 거의 언제나 받으므로, 그 대상의 반사실을 추정하기 어렵다는 뜻입니다. 이 문제는 공통 지지 가정을 거의 위반하는 것으로 볼 수 있는데, 바로 다음에서 살펴보겠습니다."
+ "성향점수 가중치 방법의 편을 조금 들어 주자면, 전체 표본이든 일부 하위 집단이든 처치를 받을 확률이나 받지 않을 확률이 너무 낮으면 어떤 인과추론 방법이든 어려움을 겪습니다. 직관적으로 말하면, 어떤 대상은 처치를 거의 받지 못하거나 반대로 거의 언제나 받으므로, 그 대상의 반사실을 추정하기 어렵다는 뜻입니다. 이 문제는 공통 지지 가정을 위반하기 직전인 상황으로 볼 수 있습니다. 공통 지지는 바로 다음에서 살펴보겠습니다."
]
},
{
@@ -1289,7 +1289,7 @@
"source": [
"## 양수성 또는 공통 지지\n",
" \n",
- "분산이 큰 문제 말고도 양수성 문제가 생길 수 있습니다. 양수성(positivity) 또는 공통 지지(common support)는 실험군과 대조군의 특성이 충분히 겹쳐야 한다는 인과추론의 가정입니다. 달리 말해 누구든 처치를 받을 확률과 받지 않을 확률이 모두 0이 아니어야 합니다. 그렇지 않으면 전체 모집단에 대해 타당한 인과효과를 추정할 수 없고, 공통 지지가 있는 대상에 대해서만 추정할 수 있습니다.\n",
+ "분산이 큰 문제 말고도 양수성 문제가 생길 수 있습니다. 양수성(positivity) 또는 공통 지지(common support)는 실험군과 대조군의 특성이 충분히 겹쳐야 한다는 인과추론의 가정입니다. 달리 말해 누구든 처치를 받을 확률과 받지 않을 확률이 모두 0이 아니어야 합니다. 그렇지 않으면 전체 모집단에서 타당한 인과효과는 추정할 수 없고, 공통 지지가 있는 대상에서만 추정할 수 있습니다.\n",
" \n",
"분명히 해 두자면, 양수성 문제는 성향점수 방법의 문제가 아니라 데이터 자체의 문제입니다. 성향점수 방법은 양수성 문제가 있을 때 이를 아주 분명하게 드러낼 뿐입니다. 그런 의미에서 이 점은 오히려 성향점수에 유리한 논거입니다. 대부분의 방법은 양수성 문제가 있어도 경고해 주지 않지만, 성향점수는 문제를 눈앞에 들이밉니다. 실험군과 대조군의 성향점수 분포를 그려 보기만 하면 됩니다."
]
@@ -1584,7 +1584,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "여기서는 중첩(overlap)이 얼마나 부족한지 보세요. 성향점수가 0.4보다 낮은 대상은 처치를 거의 받지 않습니다. 0에 우뚝 솟은 봉우리는 말할 것도 없습니다.\n",
+ "중첩(overlap)이 얼마나 부족한지 보세요. 성향점수가 0.4보다 낮은 대상은 처치를 거의 받지 않습니다. 0에 우뚝 솟은 봉우리는 말할 것도 없습니다.\n",
" \n",
"### 실무에서의 양수성\n",
" \n",
@@ -1628,7 +1628,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "그렇게 하고 나면 처치와 교란 요인 사이의 상관관계가 사라지는 것을 볼 수 있습니다. 전체 표본에서는 나이와의 상관계수가 0.2를 넘었다는 점을 떠올려 보세요. 이제는 아마 0과 구별하기 어려울 것입니다.\n",
+ "이렇게 하면 처치와 교란 요인 사이의 상관관계가 사라집니다. 전체 표본에서는 나이와의 상관계수가 0.2를 넘었다는 점을 떠올려 보세요. 이제는 아마 0과 구별하기 어려울 것입니다.\n",
" \n",
"이렇게 걸러 낸 표본에서 실험군과 대조군의 분포도 살펴볼 수 있습니다."
]
@@ -1669,7 +1669,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "정리하면, 양수성 위반 때문에 `em3`에 대해서는 전체 표본의 편향을 제거할 수 없습니다. 하지만 이메일 3이 애초에 겨냥한 모집단에 대해서는 편향을 제거할 수 있습니다. 그것으로 충분합니다.\n",
+ "정리하면, 맞습니다. 양수성 위반 때문에 `em3`에 대해서는 전체 표본의 편향을 제거할 수 없습니다. 하지만 이메일 3이 애초에 겨냥한 모집단에 대해서는 편향을 제거할 수 있습니다. 그 정도면 충분합니다.\n",
" \n",
"## 핵심 요약\n",
" \n",
@@ -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 77777ec..96cfd42 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
@@ -23,7 +23,7 @@
" \n",
"자주 듣는 오해가 하나 있습니다. 무작위 데이터가 있다면, 인과 모델을 평가할 때 그 데이터셋에서 $R^2$ 같은 지표로 모델의 예측 성능만 재면 된다는 생각입니다. 안타깝게도 일이 그렇게 간단하지는 않습니다. 왜 그런지 설명해 보겠습니다.\n",
" \n",
- "일반적으로 어떤 결과든 처치와 공변량의 함수라고 할 수 있습니다.\n",
+ "일반적으로 어떤 결과든 처치와 공변량의 함수로 나타낼 수 있습니다.\n",
" \n",
"$$\n",
"Y = F(x, t)\n",
@@ -45,7 +45,7 @@
" \n",
"## 데이터 시뮬레이션\n",
" \n",
- "아래 DGP에는 예측력은 높지만 처치와 상호작용하지 않는 공변량 $X$가 있습니다. 즉, 처치효과의 이질성을 좌우하지 않습니다. 또한 처치를 통해서만 결과에 영향을 주는(교란 요인이 아닌) 특성 $W$도 있습니다. 처치 자체의 예측력이 낮으므로 $W$도 예측력이 그다지 높지 않습니다.\n",
+ "아래 DGP에는 예측력은 높지만 처치와 상호작용하지 않는 공변량 $X$가 있습니다. 즉, 이 공변량은 처치효과의 이질성을 좌우하지 않습니다. 또한 처치를 통해서만 결과에 영향을 주는(교란 요인이 아닌) 특성 $W$도 있습니다. 처치 자체의 예측력이 낮으므로 $W$도 예측력이 그다지 높지 않습니다.\n",
" \n",
"$$\n",
"Y_i = g(X_i) + f(T_i,W_i) + e_i\n",
@@ -306,7 +306,7 @@
"id": "f6302a6a",
"metadata": {},
"source": [
- "이렇게 하고 나면, 각 모델이 잔차화한 결과 $\\tilde{Y}$를 얼마나 잘 예측하는지 평가할 수 있습니다. 이 새 결과변수를 더 잘 예측하는 모델일수록 더 나은 인과 모델입니다."
+ "이제 잔차화한 결과 $\\tilde{Y}$를 각 모델이 얼마나 잘 예측하는지 평가할 수 있습니다. 이 새 결과변수를 더 잘 예측하는 모델일수록 더 나은 인과 모델입니다."
]
},
{
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 e019c66..18db309 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
@@ -73,7 +73,7 @@
"source": [
"## 쿠폰 받으실 분?\n",
" \n",
- "조금 더 와닿게 하려고 앞 장에서 쓴 예제를 이어 가되, 살짝 비틀어 보겠습니다. 앞 장에서는 수익이 나는 고객과 그렇지 않은 고객을 구별하려 했습니다. 이를 고객 수익성 예측 문제로 정의했습니다. 그러고 나서 이 과제를 위한 머신러닝 모델을 만들고, 그 모델로 거래할 고객, 즉 수익이 날 것으로 예측된 고객만 골라낼 수 있었습니다. 다시 말해 목표는 수익이 나는 고객과 나지 않는 고객을 가르는 것이었고, 예측 모델로 그 일을 해낼 수 있었습니다.\n",
+ "조금 더 와닿게 하려고 앞 장에서 쓴 예제를 이어 가되, 살짝 비틀어 보겠습니다. 앞 장에서는 수익이 나는 고객과 그렇지 않은 고객을 구별하려 했고, 이를 고객 수익성 예측 문제로 정의했습니다. 그러고 나서 이 과제를 위한 머신러닝 모델을 만들고, 그 모델로 거래할 고객, 즉 수익이 날 것으로 예측된 고객만 골라낼 수 있었습니다. 다시 말해 목표는 수익이 나는 고객과 나지 않는 고객을 가르는 것이었고, 예측 모델로 그 일을 해낼 수 있었습니다.\n",
" \n",
"이번에는 새 과제가 주어졌습니다. 신규 고객에게 쿠폰을 주면 고객의 참여가 늘고 장기적으로 수익성이 높아질 것 같다는 생각이 듭니다. 고객이 돈을 더 많이, 더 오래 쓴다는 뜻입니다. 새로 맡은 일은 쿠폰 금액을 얼마로 할지(0 포함) 정하는 것입니다. 쿠폰을 준다는 건 사실상 고객이 우리 비즈니스에서 쓸 돈을 공짜로 나눠 주는 셈이라는 점에 주목하세요. 그래서 쿠폰은 장부에 비용으로 잡힙니다. 쿠폰 금액이 너무 크면 고객이 필요한 것을 전부 쿠폰만으로 사 버릴 테니 아마 손해를 볼 것입니다. 제품을 공짜로 가져간다는 말을 달리 한 것뿐입니다. 반대로 쿠폰 금액이 너무 작으면(또는 0이면) 쿠폰을 아예 주지 않는 것과 같습니다. 이것도 정답일 수 있지만, 처음에 쿠폰 형태로 약간 할인해 주는 편이 장기적으로 더 이익일 수도 있습니다.\n",
" \n",
@@ -303,7 +303,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "나머지 데이터에도 마찬가지로 고객 식별자, 고객이 사는 지역, 소득, 나이가 있습니다. 여기에 더해 이번에는 `coupons` 변수가 생겼습니다. 해당 고객에게 쿠폰을 얼마나 주었는지를 나타냅니다."
+ "나머지 데이터에도 마찬가지로 고객 식별자, 고객이 사는 지역, 소득, 나이가 있습니다. 여기에 더해 이번에는 해당 고객에게 쿠폰을 얼마나 주었는지 나타내는 `coupons` 변수가 생겼습니다."
]
},
{
@@ -655,9 +655,9 @@
"source": [
"흥미롭습니다. 나이가 많을수록 쿠폰을 받을 확률이 높은 것 같습니다. 데이터에 편향(bias)이 있다는 신호입니다. 쿠폰과 `net_value` 사이에는 음의 상관관계도 보입니다. 쿠폰을 많이 줄수록 net_value가 작습니다. 쿠폰이 무작위로 지급되지 않았다는 걸 이미 알고 있으니 이 관계를 인과관계로 보기는 어렵습니다. 예를 들어 나이 든 고객이 우리 제품에 돈을 덜 쓰면서 동시에 더 큰 쿠폰을 받는다면, 이 교란(confounding) 때문에 쿠폰과 `net_value`의 관계가 음수로 보일 정도로 왜곡될 수 있습니다.\n",
"\n",
- "요점은 편향이 있다는 사실을 이미 알고 있다는 것입니다. 다만 이 장에는 이미 담을 내용이 너무 많으니 지금은 무시하겠습니다(사실은 곧 보게 될 장치를 써서 이 문제를 비켜 가겠습니다). 언젠가는 해결해야 할 문제라는 점만 기억해 두세요.\n",
+ "요점은 편향이 있다는 사실을 이미 알고 있다는 것입니다. 다만 이 장에 담을 내용이 벌써 너무 많으니 지금은 무시하겠습니다(사실은 곧 보게 될 장치를 써서 이 문제를 비켜 가겠습니다). 언젠가는 해결해야 할 문제라는 점만 기억해 두세요.\n",
"\n",
- "분석이 이 단계에 이르렀을 때 **예측 문제라면** 데이터셋을 훈련 셋과 테스트 셋으로 나눠 각각 정책(policy)을 만들고 평가할 것입니다. 하지만 이건 예측 문제가 아닙니다. 최종 목표는 고객 수익성을 잘 예측하는 것이 아니라 최적의 쿠폰 전략을 찾는 것입니다. 이 최적화를 평가하려면 실제로 준 쿠폰과 다른 쿠폰을 주었다면 어떻게 되었을지 알아야 합니다. 지금까지 인과관계를 다루며 공부해 온 '만약 ~였다면'이라는 반사실(counterfactual) 질문이 바로 이런 것입니다. 반사실은 아예 관측할 수 없으니 교차 검증(cross validation)도 여기서는 도움이 되지 않습니다. 실제로 준 쿠폰에 대해 일어난 일만 볼 수 있을 뿐, 고객이 다른 금액의 쿠폰을 받았다면 어떻게 되었을지는 알 수 없습니다. 시뮬레이션 데이터가 아니라면 말입니다!\n",
+ "분석이 이 단계에 이르렀을 때 **예측 문제라면** 데이터셋을 훈련 셋과 테스트 셋으로 나눠 각각 정책(policy)을 만들고 평가할 것입니다. 하지만 이건 예측 문제가 아닙니다. 최종 목표는 고객 수익성을 잘 예측하는 것이 아니라 최적의 쿠폰 전략을 찾는 것입니다. 이 최적화를 평가하려면 실제로 준 쿠폰과 다른 쿠폰을 주었다면 어떻게 되었을지 알아야 합니다. 지금까지 인과관계를 다루며 공부해 온 '만약 ~였다면'이라는 반사실(counterfactual) 질문이 바로 이런 것입니다. 반사실은 아예 관측할 수 없으니 교차 검증(cross validation)도 여기서는 도움이 되지 않습니다. 실제로 준 쿠폰으로 일어난 일만 볼 수 있을 뿐, 고객이 다른 금액의 쿠폰을 받았다면 어떻게 되었을지는 알 수 없습니다. 시뮬레이션 데이터가 아니라면 말입니다!\n",
"\n",
"데이터가 시뮬레이션된 것이라면 쿠폰 금액 매개변수만 바꿔서 완전히 똑같은 데이터를 생성할 수 있습니다. 그러면 쿠폰 전략에 따라 `net_value`가 어떻게 달라지는지 볼 수 있고, 전략 간 처치효과(treatment effect) $NetValue_{t=a} - NetValue_{t=b}$도 계산할 수 있습니다. 시뮬레이션 데이터의 힘을 빌리면 이 장을 이해하기가 훨씬 쉬워집니다. 아, 그리고 인과효과를 직접 관측하게 되니 편향 문제도 신경 쓸 필요가 없어집니다.\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짜리 배열을 인수로 받습니다. 이 배열은 `coupons` 배열과 같은 크기(10,000)로 1을 채운 배열을 `np.ones`로 만든 뒤 5를 곱해서 얻습니다. 그다음 이 배열을 `ltv_with_coupons`에 넘기면, 앞서 본 데이터와 똑같되 모든 쿠폰 금액이 5인 새 데이터셋이 생성됩니다. 이 데이터를 정리하면 새로 제안한 정책에서의 순가치를 구할 수 있습니다."
+ "이 정책을 평가할 수 있도록 `ltv_with_coupons` 함수는 데이터베이스에 있는 고객 10,000명 각각에게 줄 쿠폰 금액을 담은 길이 10,000짜리 배열을 인수로 받습니다. 이 배열은 `np.ones`로 `coupons` 배열과 같은 크기(10,000)의 배열을 1로 채워 만들고, 여기에 5를 곱해서 얻습니다. 그다음 이 배열을 `ltv_with_coupons`에 넘기면, 앞서 본 데이터와 똑같되 모든 쿠폰 금액이 5인 새 데이터셋이 생성됩니다. 이 데이터를 정리하면 새로 제안한 정책에서의 순가치를 구할 수 있습니다."
]
},
{
@@ -855,7 +855,7 @@
"\n",
"이런 문제를 개인화(personalization) 문제라고 합니다. 선택할 수 있는 전략이 둘 이상이고, 그중 적어도 하나가 전체로 보면 최선이 아니지만 대상 집단의 일부에서는 최선일 때 개인화를 활용할 수 있습니다. 정의가 좀 복잡하지만 직관은 간단합니다. 전략이 하나뿐이라면 개인화가 아닙니다. 모든 고객에게 똑같이 하는 것이니까요. 전략이 여럿이더라도 그중 하나가 고객 한 명 한 명 모두에게 더 낫다면 굳이 개인화할 이유가 있을까요? 그 최선의 전략 하나만 쓰면 됩니다. 개인화는 어떤 전략이 집단의 한 부분에서 더 잘 통하고, 다른 전략이 다른 부분에서 더 잘 통할 때만 합니다.\n",
"\n",
- "다시 예제로 돌아갑시다. 먼저 예측 모델을 학습시키고 예측값을 예측값 구간으로 나누는 함수가 필요합니다. 이 함수는 또 다른 함수, 즉 데이터프레임을 받아 예측값 열과 구간 열을 추가하는 예측 함수를 반환합니다."
+ "다시 예제로 돌아갑시다. 먼저 예측 모델을 학습시키고 예측값을 예측값 구간으로 나누는 함수가 필요합니다. 이 함수는 또 다른 함수를 반환하는데, 데이터프레임을 받아 예측값 열과 구간 열을 추가하는 예측 함수입니다."
]
},
{
@@ -1117,7 +1117,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "아주 흥미로운 그래프입니다. 최적의 결정이 예측값 구간마다 달라진다는 점에 주목하세요. 예를 들어 1, 7, 8번 구간에서는 10헤알 쿠폰을 주는 것이 최선입니다. 3, 5, 10번 구간에서는 5헤알 쿠폰이 최선입니다. 즉, 이 정책은 마지막 구간을 빼면 단순한 정책과 매우 비슷합니다. 최적의 결정이 하위 집단마다 달라지니 개인화가 가능할 수도 있다는 증거입니다.\n",
+ "아주 흥미로운 그래프입니다. 최적의 결정이 예측값 구간마다 달라진다는 점에 주목하세요. 예를 들어 1, 7, 8번 구간에서는 10헤알 쿠폰을 주는 것이 최선이고, 3, 5, 10번 구간에서는 5헤알 쿠폰이 최선입니다. 즉, 이 정책은 마지막 구간을 빼면 단순한 정책과 매우 비슷합니다. 최적의 결정이 하위 집단마다 달라지니 개인화가 가능할 수도 있다는 증거입니다.\n",
"\n",
"이 정책을 `if ... then ...` 문 몇 개로 코딩할 수도 있지만, 데이터프레임 연산을 활용하는 좀 더 일반적인 방법을 보여 드리겠습니다.\n",
"\n",
@@ -1778,15 +1778,15 @@
"\n",
"\n",
"\n",
- "첫 번째는 앞에서 본, 쿠폰이 수익성에 미치는 영향을 이해하는 문제입니다. 처음에는 쿠폰 금액을 늘리면 수익성이 높아집니다. 둘이 함께 오르니 양의 상관관계라고 볼 수 있습니다. 게다가 도함수 그래프를 보면, 처음에는 쿠폰 금액을 늘릴수록 탄력성 $\\frac{\\delta Y}{\\delta T} $가 줄어듭니다. 둘을 합쳐 보면, 그래프의 첫 구간에서는 순가치가 커질수록 탄력성이 작아집니다. 즉, 둘은 음의 상관관계입니다.\n",
+ "첫 번째는 앞에서 본, 쿠폰이 수익성에 미치는 영향을 이해하는 문제입니다. 처음에는 쿠폰 금액을 늘리면 수익성이 높아집니다. 둘이 함께 오르니 양의 상관관계라고 볼 수 있습니다. 게다가 도함수 그래프를 보면, 처음에는 쿠폰 금액을 늘릴수록 탄력성 $\\frac{\\delta Y}{\\delta T} $가 줄어듭니다. 둘을 합쳐 보면, 그래프의 앞부분에서는 순가치가 커질수록 탄력성이 작아집니다. 즉, 둘은 음의 상관관계입니다.\n",
"\n",
"하지만 그건 처음뿐입니다. 쿠폰 금액을 계속 늘리면 수익성은 낮아지고 수익성의 탄력성도 낮아집니다. 이제 $\\frac{\\delta Y}{\\delta T} $와 $Y$는 양의 상관관계가 됩니다. 결국 결과와 탄력성은 처음에는 음의 상관관계였다가, 쿠폰 금액이 커지면서 그 상관관계가 뒤집힙니다. 결과와 결과의 탄력성 사이에 직접적인 관계가 없으니 여기서는 예측 모델이 도움이 되지 않습니다.\n",
"\n",
- "달리 생각해 보면, 예측 모델은 데이터를 $Y$축 방향으로 잘라 냅니다. 이런 식으로 자르면 탄력성이 양수인 구간의 분석단위와 음수인 구간의 분석단위가 한데 섞입니다.\n",
+ "달리 생각해 보면, 예측 모델은 데이터를 $Y$축 방향으로 잘라 냅니다. 이런 식으로 자르면 탄력성이 양수인 영역의 분석단위와 음수인 영역의 분석단위가 한데 섞입니다.\n",
"\n",
"\n",
"\n",
- "이번에는 두 번째 경우를 생각해 봅시다. 고객 센터 상담원과 연결되기까지 줄을 서서 기다리는 시간이 고객 만족도에 어떤 영향을 미치는지 알고 싶다고 합시다. 이 경우 고객 만족도는 대기 시간의 처음 몇 분 동안 꽤 빠르게 떨어집니다. 거의 기다리지 않다가 조금이라도 기다려야 하게 되면 고객은 정말 화가 납니다. 하지만 대기 시간이 길어지면 만족도가 이미 너무 낮아서 그 뒤로는 크게 떨어지지 않습니다. 낮은 수준에서 일종의 포화 상태에 이르는 셈입니다.\n",
+ "이번에는 두 번째 경우를 생각해 봅시다. 고객 센터 상담원과 연결되기까지 줄을 서서 기다리는 시간이 고객 만족도에 어떤 영향을 미치는지 알고 싶다고 합시다. 이 경우 고객 만족도는 대기 시간의 처음 몇 분 동안 꽤 빠르게 떨어집니다. 거의 기다리지 않다가 조금이라도 기다려야 하게 되면 고객은 제대로 열받습니다. 하지만 대기 시간이 길어지면 만족도가 이미 너무 낮아서 그 뒤로는 크게 떨어지지 않습니다. 낮은 수준에서 일종의 포화 상태에 이르는 셈입니다.\n",
"\n",
"이 경우가 흥미로운 이유는 $\\frac{\\delta Y}{\\delta T} $와 $Y$의 관계가 크게 바뀌지 않기 때문입니다. 둘은 언제나 음의 상관관계입니다. 대기 시간이 길어지면 만족도는 낮아지고 만족도의 탄력성은 커집니다. 바꿔 말하면 $T$가 커질수록 $\\frac{\\delta Y}{\\delta T} $는 커지고 $Y$는 작아집니다. 이런 경우에는 예측 모델이 쓸모 있을 수 있습니다. 이제는 $Y$축 방향으로 자르면 탄력성이 비슷한 분석단위끼리 묶이기 때문입니다.\n",
"\n",
@@ -1801,7 +1801,7 @@
"source": [
"## 그래프로 본 설명\n",
"\n",
- "예측 모델이 개인화에 해로울 수 있다는 사실은 너무 직관에 어긋나고 이상해서, 이 문제를 여러 관점에서 다뤄야겠다는 생각이 듭니다. 다음에 나올 그래프 설명은 지금 일어나는 일을 다른 각도에서 이해하는 방법입니다.\n",
+ "예측 모델이 개인화에 해로울 수 있다는 사실은 너무 직관에 어긋나고 이상해서, 이 문제를 여러 관점에서 다뤄야겠다는 생각이 듭니다. 다음 그래프 설명은 지금 일어나는 일을 다른 각도에서 이해해 보려는 것입니다.\n",
"\n",
"아래 그림에서 가장 왼쪽의 인과 그래프를 보세요. 특성 $X$가 결과 $Y$와 처치 $T$를 모두 일으키는 전형적인 교란 그래프입니다. 예측 모델을 만들어 그 예측값으로 분석단위를 세분화하면 어떻게 될까요?\n",
"\n",
@@ -1817,7 +1817,7 @@
"\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",
@@ -1836,11 +1836,11 @@
"\n",
"전통적인 예측 머신러닝으로는 풀 수 없는 문제가 한 부류 통째로 있다는 것을 보았습니다. 인과적 요소가 있는 최적화 문제로, 대개 '이 지표 Y(이익, 고객 만족도, 전환, 비용...)를 최적화하려면 내가 통제할 수 있는 T(가격, 전화 횟수, 할인 등)를 어떻게 설정해야 할까?'라는 형태를 띱니다. 이런 경우에는 예측 모델이 득보다 실이 클 수 있습니다.\n",
"\n",
- "이를 증명하기 위해 최적의 쿠폰 금액을 찾아야 하는 예제를 살펴보았습니다. 처음에는 과거 데이터를 보고 어떤 쿠폰 금액이 가장 높은 수익을 냈는지 확인했습니다. 그런 다음 최적이라고 여긴 그 금액을 모든 고객에게 주었습니다. 이 접근법은 평균적으로 가장 좋은 쿠폰 금액(인과추론 용어로는 처치)이 무엇인지에 답합니다. 즉, 고정된 쿠폰 금액 하나만 골라야 한다면 얼마로 해야 하는가입니다. 하지만 그런 제약은 없습니다. 어떤 고객은 낮은 금액의 쿠폰에, 어떤 고객은 높은 금액의 쿠폰에 더 잘 반응한다면 고객마다 쿠폰을 개인화할 수 있습니다. 이를 위해 예측 머신러닝 모델, 즉 고객 각각이 가져올 가치를 예측하는 모델을 만들어 보았습니다. 그리고 모델의 예측값을 바탕으로 쿠폰 금액을 개인화하려 했습니다. 예측값에 따라 고객을 묶고, 그룹마다 어떤 쿠폰 금액이 가장 좋은지 찾았습니다. 그런 다음 그렇게 알아낸 금액을 쿠폰 전략으로 써 보았습니다. 하지만 모든 고객에게 같은 쿠폰 금액을 주는 단순한 전략보다 성과가 나빴습니다. 다시 말해 머신러닝 모델은 쿠폰 금액에 잘 반응하는 고객과 그렇지 않은 고객을 가려내지 못했습니다.\n",
+ "이를 증명하기 위해 최적의 쿠폰 금액을 찾아야 하는 예제를 살펴보았습니다. 처음에는 과거 데이터를 보고 어떤 쿠폰 금액이 가장 높은 수익을 냈는지 확인했습니다. 그런 다음 최적이라고 여긴 그 금액을 모든 고객에게 주었습니다. 이 접근법은 평균적으로 가장 좋은 쿠폰 금액(인과추론 용어로는 처치)이 무엇인지에 답합니다. 즉, 고정된 쿠폰 금액 하나만 골라야 한다면 얼마로 해야 하는가입니다. 하지만 그런 제약은 없습니다. 어떤 고객은 낮은 금액의 쿠폰에, 어떤 고객은 높은 금액의 쿠폰에 더 잘 반응한다면 고객마다 쿠폰을 개인화할 수 있습니다. 이를 위해 예측 머신러닝 모델, 즉 고객 각각이 가져올 가치를 예측하는 모델을 만들어 보았습니다. 그리고 모델의 예측값을 바탕으로 쿠폰 금액을 개인화하려 했습니다. 예측값에 따라 고객을 묶고, 그룹마다 가장 좋은 쿠폰 금액을 찾아 이를 쿠폰 전략으로 써 보았습니다. 하지만 모든 고객에게 같은 쿠폰 금액을 주는 단순한 전략보다 성과가 나빴습니다. 다시 말해 머신러닝 모델은 쿠폰 금액에 잘 반응하는 고객과 그렇지 않은 고객을 가려내지 못했습니다.\n",
"\n",
"여기서 풀려는 문제가 **개인화** 문제라는 점에 주목하세요. 이 예제에서는 고객마다 어떤 쿠폰 금액이 가장 좋은지 알아내려 했습니다. 좀 더 일반적으로는 '모든 고객에 걸쳐 $Y_i$를 최대화하려면 고객 $i$마다 어떤 결정 $T$를 내리는 것이 가장 좋을까'라는 형태가 됩니다. 쉽게 풀리는 문제는 아닙니다. 하지만 인과추론의 도움을 받으면 풀 수 있습니다.\n",
"\n",
- "이 장에서 꼭 가져가셨으면 하는 중요한 점이 하나 있습니다. 먼저, 1부에서 본 인과추론은 여기서 만든 단순한 정책 같은 정책을 설계하는 데 도움이 됩니다. 그런 정책으로는 처치의 평균 인과효과를 추정하고, 평균적으로 가장 잘 통하는 처치를 찾으려 합니다. 이제는 더 큰 욕심을 내 보겠습니다. 평균적으로 가장 좋은 처치가 아니라 고객 한 명 한 명에게 가장 좋은 처치를 원합니다. 개인화란 바로 이런 것이고, 개인화는 인과추론 방법에 크게 기댑니다.\n",
+ "이 장에서 꼭 가져가셨으면 하는 중요한 점이 하나 있습니다. 먼저, 1부에서 본 인과추론은 여기서 만든 단순한 정책 같은 것을 설계하는 데 도움이 됩니다. 이런 정책은 처치의 평균 인과효과를 추정하고, 평균적으로 가장 잘 통하는 처치를 찾으려 합니다. 이제는 더 큰 욕심을 내 보겠습니다. 평균적으로 가장 좋은 처치가 아니라 고객 한 명 한 명에게 가장 좋은 처치를 원합니다. 개인화란 바로 이런 것이고, 개인화는 인과추론 방법에 크게 기댑니다.\n",
"\n",
"## 참고 자료 \n",
"\n",