diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml new file mode 100644 index 0000000..ca2b557 --- /dev/null +++ b/.github/workflows/book.yml @@ -0,0 +1,58 @@ +name: Book + +on: + push: + branches: [main] + pull_request: + branches: [main] + workflow_dispatch: + +permissions: + contents: write + +concurrency: + group: book-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + + # 노트북은 실행하지 않고 저장된 출력을 그대로 렌더링하므로 jupyter만 있으면 됩니다. + - name: Install Jupyter + run: pip install jupyter + + - uses: quarto-dev/quarto-actions/setup@v2 + with: + version: 1.8.25 + + - name: Prepare book sources + run: python book/prepare.py + + - name: Render book + working-directory: book + run: quarto render --to html + + - name: Upload preview + if: github.event_name == 'pull_request' + uses: actions/upload-artifact@v4 + with: + name: book-preview + path: book/_book + retention-days: 7 + + - name: Deploy to GitHub Pages + if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main' + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: book/_book + publish_branch: gh-pages + force_orphan: true + commit_message: "Deploy book" diff --git a/README.md b/README.md index 9513920..0d5c68b 100644 --- a/README.md +++ b/README.md @@ -1,79 +1,126 @@ -# Python으로 하는 인과추론 : 개념부터 실습까지 +# Python으로 하는 인과추론: 개념부터 실습까지 + +Matheus Facure의 [Causal Inference for The Brave and True](https://matheusfacure.github.io/python-causality-handbook/landing-page.html) 한국어판입니다. -## Causal Inference for The Brave and True 책 번역 [![DOI](https://zenodo.org/badge/255903310.svg)](https://zenodo.org/badge/latestdoi/255903310) -[![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2FCausalInferenceLab%2FCausal-Inference-with-Python&count_bg=%2379C83D&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=hits&edge_flat=false)](https://hits.seeyoufarm.com) -안녕하세요. [가짜연구소](https://pseudo-lab.com/) Causal Inference 팀입니다. -
-이 책은 Matheus Facure (Nubank Data Scientist)의 [Causal Inference for The Brave and True](https://matheusfacure.github.io/python-causality-handbook/landing-page.html)을 한국어로 번역한 자료입니다. 이 책은 인과추론에 대한 기본 개념과 Python 실습, 나아가 최신 사례까지 모두 다루고 있습니다. 인과추론에 대한 이론과 실습자료가 많지 않은 상황에서 이 책은 인과추론 처음 접하거나 인과추론에 대한 이해를 바탕으로 사례를 접하고 싶은 분 모두를 만족시킬 수 있는 책이라고 생각합니다. 한국에서 인과추론을 공부하시는 분들께 많은 도움이 되었으면 좋겠습니다. 해당 한국어 번역 자료는 [Jupyter Book](https://causalinferencelab.github.io/Causal-Inference-with-Python/landing-page.html)으로도 배포되어 있으니 많은 관심 부탁드립니다. +**[웹북으로 읽기](https://causalinferencelab.github.io/Causal-Inference-with-Python/)** · [번역 가이드](TRANSLATION_GUIDE.md) · [오류 제보](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/issues) +
-가짜연구소 Causal Inference 팀은 전문 번역가가 아닌, 데이터분석가/과학자/연구자로 구성 되어 있습니다. 따라서, 한국어 번역 과정에서 이상하거나 어색한 부분이 발생할 수 있어요. 해당 부분에 대한 여러분의 피드백을 부탁드립니다. 용어는 『실무로 통하는 인과추론 with 파이썬』(한빛미디어)과 맞췄고, 핵심 용어는 처음 나올 때 영어를 함께 적었습니다. + +## 소개 + +안녕하세요, [가짜연구소](https://pseudo-lab.com/) 인과추론팀입니다. + +『Causal Inference for The Brave and True』는 Nubank의 데이터 과학자 Matheus Facure가 쓴 인과추론 입문서입니다. 잠재적 결과와 무작위 실험 같은 기본 개념에서 시작해 이중차분법, 통제집단합성법, 메타러너, 직교화 머신러닝까지 다루고, 모든 장을 Python 코드로 직접 따라 할 수 있습니다. 인과추론을 처음 공부하는 분에게도, 실무 사례를 찾는 분에게도 좋은 출발점이 되리라 생각해 우리말로 옮겼습니다. + +번역은 전문 번역가가 아니라 데이터 분석가, 데이터 과학자, 연구자들이 함께 했습니다. 용어는 『실무로 통하는 인과추론 with 파이썬』(한빛미디어)과 맞췄고, 핵심 용어는 처음 나올 때 영어를 함께 적었습니다. 어색한 문장이나 잘못된 번역을 발견하면 언제든 알려 주세요.
-마지막으로, 이 책의 한국어 번역에 동의해 주신 Matheus Facure에게 감사의 말씀을 전합니다.
-그리고, 번역과 실습자료를 만들기 위해 같이 고생해준 Causal Inference 팀 멤버들에게도 진심으로 감사드립니다! +## 목차 + +원서 1부와 2부의 25개 장, 부록 5편을 모두 옮겼습니다. 제목을 누르면 웹북으로, '노트북'을 누르면 원고 파일로 이동합니다. + +### 1부 인과추론의 기초 + +| 장 | 제목 | 원고 | 최초 번역 | 번역 담당자 | +|:-:|---|:-:|:-:|---| +| 1 | [인과추론 소개](https://causalinferencelab.github.io/Causal-Inference-with-Python/01-Introduction-To-Causality.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/01-Introduction-To-Causality.ipynb) | 2022-08-20 | [신진수](https://github.com/jsshin2022) | +| 2 | [무작위 실험](https://causalinferencelab.github.io/Causal-Inference-with-Python/02-Randomised-Experiments.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/02-Randomised-Experiments.ipynb) | 2022-12-04 | [최은희](https://github.com/EunHuiChoi) | +| 3 | [통계 복습: 가장 위험한 수식](https://causalinferencelab.github.io/Causal-Inference-with-Python/03-Stats-Review-The-Most-Dangerous-Equation.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/03-Stats-Review-The-Most-Dangerous-Equation.ipynb) | 2022-11-10 | [김준영](https://github.com/CptAswadu) | +| 4 | [그래프 인과 모델](https://causalinferencelab.github.io/Causal-Inference-with-Python/04-Graphical-Causal-Models.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/04-Graphical-Causal-Models.ipynb) | 2022-11-23 | [김소희](https://github.com/soheekim911) | +| 5 | [선형회귀의 터무니없는 효과](https://causalinferencelab.github.io/Causal-Inference-with-Python/05-The-Unreasonable-Effectiveness-of-Linear-Regression.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb) | 2022-11-23 | [남궁민상](https://github.com/wholmesian) | +| 6 | [그룹 회귀와 더미 회귀](https://causalinferencelab.github.io/Causal-Inference-with-Python/06-Grouped-and-Dummy-Regression.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/06-Grouped-and-Dummy-Regression.ipynb) | 2022-11-05 | [정호재](https://github.com/wjdghwo) | +| 7 | [교란 요인을 넘어서](https://causalinferencelab.github.io/Causal-Inference-with-Python/07-Beyond-Confounders.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/07-Beyond-Confounders.ipynb) | 2022-11-26 | [김상돈](https://github.com/SANGDONKIM) | +| 8 | [도구변수](https://causalinferencelab.github.io/Causal-Inference-with-Python/08-Instrumental-Variables.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/08-Instrumental-Variables.ipynb) | 2022-12-04 | [최은희](https://github.com/EunHuiChoi) | +| 9 | [불응과 LATE](https://causalinferencelab.github.io/Causal-Inference-with-Python/09-Non-Compliance-and-LATE.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/09-Non-Compliance-and-LATE.ipynb) | 2022-11-19 | [김성수](https://github.com/fenzhantw) | +| 10 | [매칭](https://causalinferencelab.github.io/Causal-Inference-with-Python/10-Matching.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/10-Matching.ipynb) | 2022-11-04 | [김상돈](https://github.com/SANGDONKIM) | +| 11 | [성향점수](https://causalinferencelab.github.io/Causal-Inference-with-Python/11-Propensity-Score.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/11-Propensity-Score.ipynb) | 2022-11-11 | [김성수](https://github.com/fenzhantw) | +| 12 | [이중 강건 추정](https://causalinferencelab.github.io/Causal-Inference-with-Python/12-Doubly-Robust-Estimation.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/12-Doubly-Robust-Estimation.ipynb) | 2022-10-28 | [홍성철](https://github.com/chulhongsung) | +| 13 | [이중차분법](https://causalinferencelab.github.io/Causal-Inference-with-Python/13-Difference-in-Differences.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/13-Difference-in-Differences.ipynb) | 2022-08-27 | [신진수](https://github.com/jsshin2022) | +| 14 | [패널데이터와 고정효과](https://causalinferencelab.github.io/Causal-Inference-with-Python/14-Panel-Data-and-Fixed-Effects.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/14-Panel-Data-and-Fixed-Effects.ipynb) | 2022-11-26 | [신진수](https://github.com/jsshin2022) | +| 15 | [통제집단합성법](https://causalinferencelab.github.io/Causal-Inference-with-Python/15-Synthetic-Control.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/15-Synthetic-Control.ipynb) | 2022-09-03 | [정호재](https://github.com/wjdghwo) | +| 16 | [회귀 불연속 설계](https://causalinferencelab.github.io/Causal-Inference-with-Python/16-Regression-Discontinuity-Design.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/16-Regression-Discontinuity-Design.ipynb) | 2022-11-22 | [남궁민상](https://github.com/wholmesian) | + +### 2부 인과추론의 실무 응용 + +| 장 | 제목 | 원고 | 최초 번역 | 번역 담당자 | +|:-:|---|:-:|:-:|---| +| 17 | [예측 모델 101](https://causalinferencelab.github.io/Causal-Inference-with-Python/17-Predictive-Models-101.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/17-Predictive-Models-101.ipynb) | 2023-02-13 | [최은희](https://github.com/EunHuiChoi) | +| 18 | [이질적 처치효과와 개인화](https://causalinferencelab.github.io/Causal-Inference-with-Python/18-Heterogeneous-Treatment-Effects-and-Personalization.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/18-Heterogeneous-Treatment-Effects-and-Personalization.ipynb) | 2023-02-20 | [김소희](https://github.com/soheekim911) | +| 19 | [인과 모델 평가](https://causalinferencelab.github.io/Causal-Inference-with-Python/19-Evaluating-Causal-Models.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/19-Evaluating-Causal-Models.ipynb) | 2023-08-13 | [김성수](https://github.com/fenzhantw) | +| 20 | [플러그 앤 플레이 추정량](https://causalinferencelab.github.io/Causal-Inference-with-Python/20-Plug-and-Play-Estimators.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/20-Plug-and-Play-Estimators.ipynb) | 2023-06-22 | [남궁민상](https://github.com/wholmesian) | +| 21 | [메타러너](https://causalinferencelab.github.io/Causal-Inference-with-Python/21-Meta-Learners.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/21-Meta-Learners.ipynb) | 2023-12-31 | [박병수](https://github.com/Hinterhalter) | +| 22 | [편향 제거/직교화 머신러닝](https://causalinferencelab.github.io/Causal-Inference-with-Python/22-Debiased-Orthogonal-Machine-Learning.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/22-Debiased-Orthogonal-Machine-Learning.ipynb) | 2023-11-03 | [홍성철](https://github.com/chulhongsung) | +| 23 | [효과 이질성과 비선형성](https://causalinferencelab.github.io/Causal-Inference-with-Python/23-Challenges-with-Effect-Heterogeneity-and-Nonlinearity.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/23-Challenges-with-Effect-Heterogeneity-and-Nonlinearity.ipynb) | 2024-01-10 | [임종언](https://github.com/limjongun95) | +| 24 | [이중차분법 사가](https://causalinferencelab.github.io/Causal-Inference-with-Python/24-The-Diff-in-Diff-Saga.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/24-The-Diff-in-Diff-Saga.ipynb) | 2023-06-26 | [박시온](https://github.com/rockgoat95) | +| 25 | [합성 이중차분법](https://causalinferencelab.github.io/Causal-Inference-with-Python/25-Synthetic-Diff-in-Diff.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/25-Synthetic-Diff-in-Diff.ipynb) | 2026-10-18 | [신진수](https://github.com/jsshin2022) | + +### 부록 + +| 장 | 제목 | 원고 | 최초 번역 | 번역 담당자 | +|:-:|---|:-:|:-:|---| +| A | [직교화로 편향 제거하기](https://causalinferencelab.github.io/Causal-Inference-with-Python/Debiasing-with-Orthogonalization.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/Debiasing-with-Orthogonalization.ipynb) | 2026-10-18 | [신진수](https://github.com/jsshin2022) | +| B | [성향점수로 편향 제거하기](https://causalinferencelab.github.io/Causal-Inference-with-Python/Debiasing-with-Propensity-Score.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/Debiasing-with-Propensity-Score.ipynb) | 2026-10-18 | [신진수](https://github.com/jsshin2022) | +| C | [예측이 실패할 때](https://causalinferencelab.github.io/Causal-Inference-with-Python/When-Prediction-Fails.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/When-Prediction-Fails.ipynb) | 2026-10-18 | [신진수](https://github.com/jsshin2022) | +| D | [예측 지표가 인과 모델에 위험한 이유](https://causalinferencelab.github.io/Causal-Inference-with-Python/Prediction-Metrics-For-Causal-Models.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/Prediction-Metrics-For-Causal-Models.ipynb) | 2026-10-18 | [신진수](https://github.com/jsshin2022) | +| E | [통제집단합성법의 컨포멀 추론](https://causalinferencelab.github.io/Causal-Inference-with-Python/Conformal-Inference-for-Synthetic-Control.html) | [노트북](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/Conformal-Inference-for-Synthetic-Control.ipynb) | 2026-10-18 | [신진수](https://github.com/jsshin2022) |
+## 번역 현황 +2026년 10월에 원서 최신판을 기준으로 전체 번역을 다시 다듬었습니다. -이 책은 Joshua Angrist, Alberto Abadie, Christopher Walters, Miguel Hernan 및 Jamie Robins 등을 포함한 많은 연구자들의 계량 경제학 수업과 바탕으로 하고 있으며, 대부분의 아이디어는 미국경제학회(American Economic Association)의 수업에서 가져왔습니다. 이 책을 작성하기 위해 참고한 자료와 서적은 아래와 같습니다. +- 모든 장을 원문과 문장 단위로 대조해 빠진 문장을 채우고 오역을 바로잡았습니다. +- 원문 개정 내용(18·19장의 elasticity → sensitivity 등)을 반영했습니다. +- 25장과 부록 5편을 새로 옮겼습니다. +- 용어와 문체를 『실무로 통하는 인과추론 with 파이썬』 기준으로 통일했습니다. +- 원문의 오류는 본문과 수식을 고치지 않고 옮긴이 주로 짚었습니다. 뜻이 분명한 오타만 바로잡고 그 사실을 주에 밝혔습니다. -* [Cross-Section Econometrics](https://www.aeaweb.org/conference/cont-ed/2017-webcasts) -* [Mastering Mostly Harmless Econometrics](https://www.aeaweb.org/conference/cont-ed/2020-webcasts) -* [Mostly Harmless Econometrics](https://www.mostlyharmlesseconometrics.com/) -* [Mastering 'Metrics](https://www.masteringmetrics.com/) -* [Causal Inference Book](https://www.hsph.harvard.edu/miguel-hernan/causal-inference-book/) +자세한 원칙과 용어표는 [번역 가이드](TRANSLATION_GUIDE.md)에 있습니다.
-## 자료 이슈 및 관련 질문 -번역 자료에 대한 이슈가 있다면, 해당 Github 저장소의 [이슈 페이지](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/issues)를 방문해주세요. 또한, 관련 질문은 빌더인 [신진수](https://github.com/jsshin2022)에게 문의 부탁드립니다. +## 함께 만들기 + +- 오역, 오탈자, 깨진 수식이나 그림은 [이슈](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/issues)로 알려 주세요. +- 직접 고치고 싶다면 [번역 가이드](TRANSLATION_GUIDE.md)를 읽고 PR을 보내 주세요. 원고는 `causal-inference-for-the-brave-and-true/` 폴더의 노트북입니다. +- 그 밖의 문의는 메인테이너 [신진수](https://github.com/jsshin2022)에게 부탁드립니다.
-## 한국어 번역 현황 - -원서 Part I·II 25개 장과 부록 5편을 모두 옮겼습니다. 2026년 10월에는 원문 최신판을 기준으로 전체 번역을 다시 대조해 빠진 문장을 채우고, 원문 개정 내용(18·19장의 elasticity→sensitivity 등)을 반영했으며, 용어를 『실무로 통하는 인과추론 with 파이썬』에 맞춰 통일했습니다. 번역 원칙과 용어표는 [번역 가이드](TRANSLATION_GUIDE.md)에 있습니다. - -| 순서 | Chapter | 최초 번역 | 최초 번역자 | -| ---- | ------- | -------- | ---------- | -| 1 | [1. Introduction To Causality](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/01-Introduction-To-Causality.ipynb) | 2022-08-20 | [신진수](https://github.com/jsshin2022) | -| 2 | [2. Randomised Experiments](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/02-Randomised-Experiments.ipynb) | 2022-12-04 | [최은희](https://github.com/EunHuiChoi) | -| 3 | [3. Stats Review: The Most Dangerous Equation](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/03-Stats-Review-The-Most-Dangerous-Equation.ipynb) | 2022-11-10 | [김준영](https://github.com/CptAswadu) | -| 4 | [4. Graphical Causal Models](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/04-Graphical-Causal-Models.ipynb) | 2022-11-23 | [김소희](https://github.com/soheekim911) | -| 5 | [5. The Unreasonable Effectiveness of Linear Regression](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb) | 2022-11-23 | [남궁민상](https://github.com/wholmesian) | -| 6 | [6. Grouped and Dummy Regression](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/06-Grouped-and-Dummy-Regression.ipynb) | 2022-11-05 | [정호재](https://github.com/wjdghwo) | -| 7 | [7. Beyond Confounders](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/07-Beyond-Confounders.ipynb) | 2022-11-26 | [김상돈](https://github.com/SANGDONKIM) | -| 8 | [8. Instrumental Variables](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/08-Instrumental-Variables.ipynb) | 2022-12-04 | [최은희](https://github.com/EunHuiChoi) | -| 9 | [9. Non Compliance and LATE](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/09-Non-Compliance-and-LATE.ipynb) | 2022-11-19 | [김성수](https://github.com/fenzhantw) | -| 10 | [10. Matching](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/10-Matching.ipynb) | 2022-11-04 | [김상돈](https://github.com/SANGDONKIM) | -| 11 | [11. Propensity Score](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/11-Propensity-Score.ipynb) | 2022-11-11 | [김성수](https://github.com/fenzhantw) | -| 12 | [12. Doubly Robust Estimation](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/12-Doubly-Robust-Estimation.ipynb) | 2022-10-28 | [홍성철](https://github.com/chulhongsung) | -| 13 | [13. Difference-in-Differences](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/13-Difference-in-Differences.ipynb) | 2022-08-27 | [신진수](https://github.com/jsshin2022) | -| 14 | [14. Panel Data and Fixed Effects](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/14-Panel-Data-and-Fixed-Effects.ipynb) | 2022-11-26 | [신진수](https://github.com/jsshin2022) | -| 15 | [15. Synthetic Control](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/15-Synthetic-Control.ipynb) | 2022-09-03 | [정호재](https://github.com/wjdghwo) | -| 16 | [16. Regression Discontinuity Design](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/16-Regression-Discontinuity-Design.ipynb) | 2022-11-22 | [남궁민상](https://github.com/wholmesian) | -| 17 | [17. Predictive Models 101](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/17-Predictive-Models-101.ipynb) | 2023-02-13 | [최은희](https://github.com/EunHuiChoi) | -| 18 | [18. Heterogeneous Treatment Effects and Personalization](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/18-Heterogeneous-Treatment-Effects-and-Personalization.ipynb) | 2023-02-20 | [김소희](https://github.com/soheekim911) | -| 19 | [19. Evaluating Causal Models](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/19-Evaluating-Causal-Models.ipynb) | 2023-08-13 | [김성수](https://github.com/fenzhantw) | -| 20 | [20. Plug-and-Play Estimators](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/20-Plug-and-Play-Estimators.ipynb) | 2023-06-22 | [남궁민상](https://github.com/wholmesian) | -| 21 | [21. Meta Learners](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/21-Meta-Learners.ipynb) | 2023-12-31 | [박병수](https://github.com/Hinterhalter) | -| 22 | [22. Debiased/Orthogonal Machine Learning](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/22-Debiased-Orthogonal-Machine-Learning.ipynb) | 2023-11-03 | [홍성철](https://github.com/chulhongsung) | -| 23 | [23. Challenges with Effect Heterogeneity and Nonlinearity](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/23-Challenges-with-Effect-Heterogeneity-and-Nonlinearity.ipynb) | 2024-01-10 | [limjongun95](https://github.com/limjongun95) | -| 24 | [24. The Diff-in-Diff Saga](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/24-The-Diff-in-Diff-Saga.ipynb) | 2023-06-26 | [rockgoat95](https://github.com/rockgoat95) | -| 25 | [25. Synthetic Difference-in-Differences](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/25-Synthetic-Diff-in-Diff.ipynb) | 2026-10 | 가짜연구소 인과추론팀 | - -**부록** - -| Chapter | 최초 번역 | -| ------- | -------- | -| [Debiasing with Orthogonalization](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/Debiasing-with-Orthogonalization.ipynb) | 2026-10 | -| [Debiasing with Propensity Score](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/Debiasing-with-Propensity-Score.ipynb) | 2026-10 | -| [When Prediction Fails](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/When-Prediction-Fails.ipynb) | 2026-10 | -| [Why Prediction Metrics are Dangerous For Causal Models](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/Prediction-Metrics-For-Causal-Models.ipynb) | 2026-10 | -| [Conformal Inference for Synthetic Control](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/causal-inference-for-the-brave-and-true/Conformal-Inference-for-Synthetic-Control.ipynb) | 2026-10 | +## 웹북 빌드 + +웹북은 [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`는 빌드할 때만 장 제목, 수식 표기, 접힌 코드, 옮긴이 주 상자를 책 형식으로 바꿉니다. 그래서 노트북은 원서와 같은 구조로 두면 됩니다.
+ +## 감사의 말 + +한국어 번역을 흔쾌히 허락해 준 Matheus Facure에게 감사드립니다. 번역과 실습 자료를 함께 만든 인과추론팀 멤버들에게도 고마운 마음을 전합니다. + +원서는 Joshua Angrist, Alberto Abadie, Christopher Walters, Miguel Hernán, Jamie Robins 등의 계량경제학 강의를 바탕으로 쓰였고, 많은 아이디어를 미국경제학회(American Economic Association) 강좌에서 가져왔습니다. 원저자가 참고한 자료는 다음과 같습니다. + +- [Cross-Section Econometrics](https://www.aeaweb.org/conference/cont-ed/2017-webcasts) +- [Mastering Mostly Harmless Econometrics](https://www.aeaweb.org/conference/cont-ed/2020-webcasts) +- [Mostly Harmless Econometrics](https://www.mostlyharmlesseconometrics.com/) +- [Mastering 'Metrics](https://www.masteringmetrics.com/) +- [Causal Inference: What If](https://www.hsph.harvard.edu/miguel-hernan/causal-inference-book/) + +
+ +## 라이선스 + +[MIT License](LICENSE)를 따릅니다. diff --git a/TRANSLATION_GUIDE.md b/TRANSLATION_GUIDE.md index e0f2887..a825d4f 100644 --- a/TRANSLATION_GUIDE.md +++ b/TRANSLATION_GUIDE.md @@ -24,6 +24,8 @@ - 핵심 용어는 장마다 처음 나올 때 `한국어(English)`로 한 번 병기하고, 그 뒤로는 한국어만 씁니다. - ATE, CATE, DID, OLS 같은 약어는 처음에 `평균 처치효과(ATE)`처럼 풀어 쓰고 이후에는 약어를 써도 됩니다. - 장 제목(H1)은 원문 영어 제목을 유지하고, 그 아래 절 제목은 한국어로 옮깁니다. `Key Ideas`는 `핵심 요약`, `References`는 `참고 자료`, `Contribute`는 `기여하기`로 통일합니다. +- 문장은 `-습니다`로 맺습니다. 평서문을 `-죠.`, `-네요.`로 끝내지 않습니다. 독자에게 되묻는 `~죠?`는 써도 됩니다. +- white collar / blue collar는 `사무직` / `생산직`으로 옮깁니다. - 브라질 화폐는 `5헤알`처럼 쓰고, 장마다 처음 나올 때만 `5헤알(BRL)`로 병기합니다. - 인명은 원어 표기를 기본으로 합니다(예: Joshua Angrist). 본문 흐름상 한글 표기가 자연스러우면 『실무로 통하는 인과추론』의 표기(조슈아 앵그리스트, 알베르토 아바디, 주데아 펄)를 따릅니다. @@ -47,6 +49,7 @@ | counterfactual | 반사실 / 반사실적 결과 | | | factual outcome | 사실적 결과 | | | treatment effect | 처치효과 | 붙여 씀 | +| be treated | 처치받다 | 붙여 씀(`처치받은`, `처치받지`). 목적격을 쓰면 `처치를 받다` | | individual treatment effect (ITE) | 개별 처치효과(ITE) | | | average treatment effect (ATE) | 평균 처치효과(ATE) | | | average treatment effect on the treated (ATT) | 실험군에 대한 평균 처치효과(ATT) | | @@ -63,6 +66,7 @@ | estimand / causal quantity | 인과 추정량 | | | estimator | 추정량 | | | parameter | 매개변수 | `모수`, `파라미터` 쓰지 않음. nuisance parameter는 장애모수, parametric은 모수적 | +| hyperparameter | 하이퍼파라미터 | 머신러닝 관례를 따름. parameter 항목의 예외 | | estimate (명사) | 추정값 | `추정치` 쓰지 않음 | | SUTVA | SUTVA | | | spillover | 파급 효과 | | @@ -220,5 +224,5 @@ 1. 원문 저장소의 해당 노트북을 내려받아 코드 셀과 출력은 그대로 둡니다. 2. 마크다운 셀을 위 원칙대로 옮깁니다. 3. 수식, 이미지, 링크 개수가 원문과 같은지 확인합니다. -4. Jupyter Book으로 빌드해 렌더링을 확인합니다. +4. `python book/prepare.py && cd book && quarto preview`로 웹북 렌더링을 확인합니다. 새 노트북을 추가했다면 `book/prepare.py`의 장 제목 목록과 `book/_quarto.yml` 목차에도 넣어 주세요. 5. PR에는 원문 커밋과 바뀐 셀을 적어 주세요. diff --git a/book/.gitignore b/book/.gitignore new file mode 100644 index 0000000..6624fca --- /dev/null +++ b/book/.gitignore @@ -0,0 +1,11 @@ +# prepare.py가 만드는 빌드용 사본 +*.ipynb +*.py +!prepare.py +data/ +_book/ +.quarto/ +*_files/ + +/.quarto/ +**/*.quarto_ipynb diff --git a/book/404.qmd b/book/404.qmd new file mode 100644 index 0000000..80dba0c --- /dev/null +++ b/book/404.qmd @@ -0,0 +1,7 @@ +--- +title: "페이지를 찾을 수 없습니다" +--- + +주소가 바뀌었거나 없는 페이지입니다. [첫 페이지](index.html)에서 다시 찾아보거나, 왼쪽 목차와 검색을 이용해 주세요. + +기존 Jupyter Book 주소(`…/13-Difference-in-Differences.html` 등)는 그대로 쓸 수 있습니다. 문제가 계속되면 [이슈](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/issues)로 알려 주세요. diff --git a/book/_quarto.yml b/book/_quarto.yml new file mode 100644 index 0000000..c2dfeb9 --- /dev/null +++ b/book/_quarto.yml @@ -0,0 +1,118 @@ +project: + type: book + output-dir: _book + resources: + - data/img/** + - assets/** + +lang: ko + +execute: + enabled: false + +book: + title: "Python으로 하는 인과추론" + subtitle: "Causal Inference for The Brave and True 한국어판" + author: + - name: Matheus Facure + role: 지은이 + - name: 가짜연구소 인과추론팀 + role: 옮긴이 + site-url: https://causalinferencelab.github.io/Causal-Inference-with-Python/ + repo-url: https://github.com/CausalInferenceLab/Causal-Inference-with-Python + repo-subdir: causal-inference-for-the-brave-and-true + repo-actions: [issue] + favicon: assets/causal-lab-mark.png + search: true + reader-mode: true + open-graph: + image: assets/og-image.png + locale: ko_KR + twitter-card: + image: assets/og-image.png + page-navigation: true + sidebar: + style: docked + collapse-level: 2 + header: | + + 가짜연구소 Pseudo Lab + 가짜연구소 Pseudo Lab + + 인과추론팀 Causal-Lab + + page-footer: + left: "[가짜연구소](https://pseudo-lab.com/) 인과추론팀 옮김 · 원서 © [Matheus Facure](https://matheusfacure.github.io/python-causality-handbook/landing-page.html)" + center: + - text: 번역 가이드 + href: https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/TRANSLATION_GUIDE.md + - text: 오류 제보 + href: https://github.com/CausalInferenceLab/Causal-Inference-with-Python/issues + right: + - icon: github + href: https://github.com/CausalInferenceLab/Causal-Inference-with-Python + aria-label: GitHub 저장소 + chapters: + - index.qmd + - part: "1부 인과추론의 기초" + chapters: + - 01-Introduction-To-Causality.ipynb + - 02-Randomised-Experiments.ipynb + - 03-Stats-Review-The-Most-Dangerous-Equation.ipynb + - 04-Graphical-Causal-Models.ipynb + - 05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb + - 06-Grouped-and-Dummy-Regression.ipynb + - 07-Beyond-Confounders.ipynb + - 08-Instrumental-Variables.ipynb + - 09-Non-Compliance-and-LATE.ipynb + - 10-Matching.ipynb + - 11-Propensity-Score.ipynb + - 12-Doubly-Robust-Estimation.ipynb + - 13-Difference-in-Differences.ipynb + - 14-Panel-Data-and-Fixed-Effects.ipynb + - 15-Synthetic-Control.ipynb + - 16-Regression-Discontinuity-Design.ipynb + - part: "2부 인과추론의 실무 응용" + chapters: + - 17-Predictive-Models-101.ipynb + - 18-Heterogeneous-Treatment-Effects-and-Personalization.ipynb + - 19-Evaluating-Causal-Models.ipynb + - 20-Plug-and-Play-Estimators.ipynb + - 21-Meta-Learners.ipynb + - 22-Debiased-Orthogonal-Machine-Learning.ipynb + - 23-Challenges-with-Effect-Heterogeneity-and-Nonlinearity.ipynb + - 24-The-Diff-in-Diff-Saga.ipynb + - 25-Synthetic-Diff-in-Diff.ipynb + appendices: + - Debiasing-with-Orthogonalization.ipynb + - Debiasing-with-Propensity-Score.ipynb + - When-Prediction-Fails.ipynb + - Prediction-Metrics-For-Causal-Models.ipynb + - Conformal-Inference-for-Synthetic-Control.ipynb + +crossref: + chapters: true + appendix-delim: ":" + +format: + html: + theme: + light: [cosmo, styles.scss] + dark: [cosmo, styles.scss, styles-dark.scss] + toc: true + toc-depth: 2 + toc-title: 이 장의 내용 + number-sections: true + number-depth: 1 + code-copy: true + code-overflow: wrap + code-tools: false + html-math-method: mathjax + df-print: default + link-external-newwindow: true + include-in-header: + - text: | + + + + diff --git a/book/assets/causal-lab-logo.png b/book/assets/causal-lab-logo.png new file mode 100644 index 0000000..7b64ee2 Binary files /dev/null and b/book/assets/causal-lab-logo.png differ diff --git a/book/assets/causal-lab-mark.png b/book/assets/causal-lab-mark.png new file mode 100644 index 0000000..ec11117 Binary files /dev/null and b/book/assets/causal-lab-mark.png differ diff --git a/book/assets/og-image.png b/book/assets/og-image.png new file mode 100644 index 0000000..091c61f Binary files /dev/null and b/book/assets/og-image.png differ diff --git a/book/assets/pseudolab-dark.png b/book/assets/pseudolab-dark.png new file mode 100644 index 0000000..1a571ba Binary files /dev/null and b/book/assets/pseudolab-dark.png differ diff --git a/book/assets/pseudolab-light.png b/book/assets/pseudolab-light.png new file mode 100644 index 0000000..181991f Binary files /dev/null and b/book/assets/pseudolab-light.png differ diff --git a/book/index.qmd b/book/index.qmd new file mode 100644 index 0000000..72e7376 --- /dev/null +++ b/book/index.qmd @@ -0,0 +1,79 @@ +--- +title-block-style: none +aliases: + - landing-page.html +--- + +```{=html} +
+ 가짜연구소 인과추론팀 로고 +
+ 가짜연구소 Pseudo Lab + + 인과추론팀 Causal-Lab +
+

Python으로 하는
인과추론

+

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

+
+ 1장부터 읽기 + GitHub + 원서 보기 +
+
+``` + +# 들어가며 {.unnumbered} + +안녕하세요, [가짜연구소](https://pseudo-lab.com/) [신진수](https://www.linkedin.com/in/jinsoo-shin-436060162/)입니다. + +이 책은 Matheus Facure의 『Causal Inference for The Brave and True』를 가짜연구소 인과추론팀이 원저자의 동의를 받아 우리말로 옮긴 것입니다. 인과추론은 "이 정책이, 이 할인이, 이 기능이 정말 효과가 있었을까?"라는 질문에 데이터로 답하는 방법입니다. 그런데 막상 공부하려고 하면 한국어로 된 자료, 특히 코드와 함께 손으로 따라 해 볼 수 있는 자료가 많지 않습니다. 이 책이 그 빈자리를 채우는 길잡이가 되면 좋겠습니다. + +원서는 가볍지만 엄밀하게 효과 추정을 배우는 책입니다. 모든 실습을 파이썬으로 하고, 저자가 찾을 수 있는 밈은 최대한 넣었습니다. 딱딱한 교과서보다는 옆자리 동료가 설명해 주는 느낌으로 읽어 주세요. + +## 이 책의 구성 + +원서의 25개 장과 부록 5편을 모두 옮겼습니다. + +```{=html} +
+ +
1부 · 1~16장
+
인과추론의 기초
+

잠재적 결과, 인과 그래프, 편향부터 회귀분석, 도구변수, 매칭, 성향점수, 이중차분법, 통제집단합성법, 회귀 불연속 설계까지.

+
+ +
2부 · 17~25장
+
인과추론의 실무 응용
+

이질적 처치효과와 개인화, 인과 모델 평가, 메타러너, 이중 머신러닝, 이중차분법의 최근 논의와 합성 이중차분법.

+
+ +
부록 · 5편
+
더 깊이 보기
+

직교화와 성향점수로 편향 제거하기, 예측이 실패하는 경우, 예측 지표의 함정, 컨포멀 추론.

+
+
+``` + +1부는 학계에서 자리 잡은 내용이라 인과적 질문을 다룰 때 기댈 수 있는 튼튼한 토대가 됩니다. 2부는 저자가 핀테크 회사에서 쌓은 실무 경험에서 나온 내용이 많아 더 실험적이고, 그만큼 현업에 바로 가져다 쓸 거리가 많습니다. + +## 이렇게 읽어 주세요 + +각 장은 원서의 주피터 노트북을 그대로 옮긴 것이라 코드와 출력이 원서와 같습니다. 노트북 파일은 [GitHub 저장소](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/tree/main/causal-inference-for-the-brave-and-true)에서 내려받아 직접 실행해 볼 수 있습니다. 그래프를 그리는 코드처럼 길어서 접어 둔 셀은 **코드**를 눌러 펼치면 됩니다. + +용어는 같은 저자의 책을 옮긴 『실무로 통하는 인과추론 with 파이썬』(한빛미디어)과 맞췄습니다. 두 책을 함께 보셔도 용어가 헷갈리지 않습니다. 번역 원칙과 용어표는 [번역 가이드](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/TRANSLATION_GUIDE.md)에 정리해 두었습니다. + +## 함께 만들어 주세요 + +인과추론팀은 전문 번역가가 아니라 데이터 분석가, 데이터 과학자, 연구자로 이루어져 있습니다. 어색하거나 틀린 부분이 보이면 [이슈](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/issues)로 알려 주시거나 직접 PR을 보내 주세요. 도움이 되었다면 [GitHub 스타](https://github.com/CausalInferenceLab/Causal-Inference-with-Python)로 응원해 주시면 큰 힘이 됩니다. + +한국어 번역에 흔쾌히 동의해 준 Matheus Facure와, 번역과 실습 자료를 함께 만든 인과추론팀 멤버들에게 감사드립니다. + +## 원저자의 감사의 말 + +> 이 시리즈 전체를 Joshua Angrist, Alberto Abadie, Christopher Walters의 훌륭한 계량경제학 강의에 바치는 헌사로 생각합니다. 1부의 아이디어는 대부분 이들이 미국경제학회(American Economic Association)에서 한 강의에서 가져왔습니다. Angrist의 책들은 계량경제학이 아주 유용할 뿐 아니라 무척 재미있다는 것을 알려 주었고, Miguel Hernan과 Jamie Robins의 책은 가장 까다로운 인과적 질문 앞에서 늘 믿고 기댄 동반자였습니다. + +- [Mastering Mostly Harmless Econometrics](https://www.aeaweb.org/conference/cont-ed/2020-webcasts) · [Cross-Section Econometrics](https://www.aeaweb.org/conference/cont-ed/2017-webcasts) +- [Mostly Harmless Econometrics](https://www.mostlyharmlesseconometrics.com/) · [Mastering 'Metrics](https://www.masteringmetrics.com/) +- [Causal Inference: What If](https://miguelhernan.org/whatifbook) + +원서는 누구나 무료로 볼 수 있는 오픈소스 자료입니다. 원서가 도움이 되었다면 저자의 [Patreon](https://www.patreon.com/causal_inference_for_the_brave_and_true)을 후원하거나 [원서 저장소에 스타](https://github.com/matheusfacure/python-causality-handbook/stargazers)를 남겨 주세요. diff --git a/book/prepare.py b/book/prepare.py new file mode 100644 index 0000000..f404fc7 --- /dev/null +++ b/book/prepare.py @@ -0,0 +1,138 @@ +"""Quarto 빌드용 원고를 만든다. + +원본 노트북(causal-inference-for-the-brave-and-true/*.ipynb)은 원서와 같은 구조를 유지해야 하므로 +직접 고치지 않고, book/ 아래에 빌드 전용 사본을 만들어 다음만 바꾼다. + +- 장 제목: 원문 영어 H1을 지우고 한국어 장 제목을 front matter로 넣는다. +- 수식: 한 줄에 `$`만 있는 블록 수식을 `$$`로 바꾸고, 인라인 수식 안쪽 공백(`$ x $`)을 지운다(Pandoc은 둘 다 수식으로 읽지 않는다). +- `hide-input` 태그: 코드를 접어 두는 Quarto 옵션(code-fold)으로 바꾼다. +- 대체 텍스트가 `img`뿐인 이미지: 그림 캡션으로 찍히지 않게 비운다. +- `{note}` 지시문과 `> 옮긴이:` 인용문: Quarto 콜아웃으로 바꾼다. + +실행: python book/prepare.py +""" +import json +import re +import shutil +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +SRC = ROOT / "causal-inference-for-the-brave-and-true" +OUT = ROOT / "book" + +CHAPTERS = { + "01-Introduction-To-Causality": "인과추론 소개", + "02-Randomised-Experiments": "무작위 실험", + "03-Stats-Review-The-Most-Dangerous-Equation": "통계 복습: 가장 위험한 수식", + "04-Graphical-Causal-Models": "그래프 인과 모델", + "05-The-Unreasonable-Effectiveness-of-Linear-Regression": "선형회귀의 터무니없는 효과", + "06-Grouped-and-Dummy-Regression": "그룹 회귀와 더미 회귀", + "07-Beyond-Confounders": "교란 요인을 넘어서", + "08-Instrumental-Variables": "도구변수", + "09-Non-Compliance-and-LATE": "불응과 LATE", + "10-Matching": "매칭", + "11-Propensity-Score": "성향점수", + "12-Doubly-Robust-Estimation": "이중 강건 추정", + "13-Difference-in-Differences": "이중차분법", + "14-Panel-Data-and-Fixed-Effects": "패널데이터와 고정효과", + "15-Synthetic-Control": "통제집단합성법", + "16-Regression-Discontinuity-Design": "회귀 불연속 설계", + "17-Predictive-Models-101": "예측 모델 101", + "18-Heterogeneous-Treatment-Effects-and-Personalization": "이질적 처치효과와 개인화", + "19-Evaluating-Causal-Models": "인과 모델 평가", + "20-Plug-and-Play-Estimators": "플러그 앤 플레이 추정량", + "21-Meta-Learners": "메타러너", + "22-Debiased-Orthogonal-Machine-Learning": "편향 제거/직교화 머신러닝", + "23-Challenges-with-Effect-Heterogeneity-and-Nonlinearity": "효과 이질성과 비선형성", + "24-The-Diff-in-Diff-Saga": "이중차분법 사가", + "25-Synthetic-Diff-in-Diff": "합성 이중차분법", + "Debiasing-with-Orthogonalization": "직교화로 편향 제거하기", + "Debiasing-with-Propensity-Score": "성향점수로 편향 제거하기", + "When-Prediction-Fails": "예측이 실패할 때", + "Prediction-Metrics-For-Causal-Models": "예측 지표가 인과 모델에 위험한 이유", + "Conformal-Inference-for-Synthetic-Control": "통제집단합성법의 컨포멀 추론", +} + + +def src_text(cell): + s = cell["source"] + return "".join(s) if isinstance(s, list) else s + + +def set_text(cell, text): + lines = text.split("\n") + cell["source"] = [line + "\n" for line in lines[:-1]] + [lines[-1]] + + +PROTECT = re.compile(r"(```.*?```|`[^`\n]*`|\$\$.*?\$\$)", re.S) +INLINE = re.compile(r"(? 옮긴이: ... 인용문(여러 줄 포함) → 옮긴이 콜아웃 + def translator_note(m): + body = re.sub(r"(?m)^> ?", "", m.group(0)) + body = re.sub(r"^옮긴이:\s*", "", body.strip()) + return '::: {.callout-tip appearance="simple" title="옮긴이"}\n' + body + "\n:::" + + text = re.sub(r"(?m)^> 옮긴이:.*(?:\n>.*)*", translator_note, text) + return text + + +def prepare_notebook(key, title): + nb = json.loads((SRC / f"{key}.ipynb").read_text(encoding="utf-8")) + cells = nb["cells"] + for cell in cells: + if cell["cell_type"] == "markdown": + set_text(cell, fix_markdown(src_text(cell))) + elif cell["cell_type"] == "code": + tags = cell.get("metadata", {}).get("tags", []) + if "hide-input" in tags and src_text(cell).strip(): + set_text(cell, "#| code-fold: true\n" + src_text(cell)) + + # 원문 영어 H1을 지우고 한국어 제목을 front matter로 + for cell in cells: + if cell["cell_type"] == "markdown": + text = src_text(cell) + stripped = re.sub(r"\A\s*# [^\n]*\n?", "", text, count=1) + if stripped != text: + set_text(cell, stripped.lstrip("\n")) + break + front = {"cell_type": "raw", "metadata": {}, "source": [f'---\ntitle: "{title}"\n---']} + nb["cells"] = [front] + [c for c in cells if not (c["cell_type"] == "markdown" and not src_text(c).strip())] + (OUT / f"{key}.ipynb").write_text(json.dumps(nb, ensure_ascii=False), encoding="utf-8") + + +def main(): + for key, title in CHAPTERS.items(): + prepare_notebook(key, title) + # 이미지·데이터와 노트북이 import하는 보조 모듈 + data = OUT / "data" + if data.is_symlink() or data.exists(): + data.unlink() if data.is_symlink() else shutil.rmtree(data) + shutil.copytree(SRC / "data" / "img", data / "img") + for helper in SRC.glob("*.py"): + shutil.copy(helper, OUT / helper.name) + print(f"prepared {len(CHAPTERS)} notebooks into {OUT}") + + +if __name__ == "__main__": + main() diff --git a/book/styles-dark.scss b/book/styles-dark.scss new file mode 100644 index 0000000..ebcf6fa --- /dev/null +++ b/book/styles-dark.scss @@ -0,0 +1,80 @@ +/*-- scss:defaults --*/ +$body-color: #e4e5ee; +$body-bg: #14151f; +$primary: #b4a5ea; +$link-color: #b4a5ea; +$code-color: #c9b8ff; +$code-bg: #1d1f2c; +$border-color: #2b2e40; +$sidebar-bg: #171926; +$sidebar-fg: #b3b6c8; +$sidebar-hl: #b4a5ea; +$toc-color: #b4a5ea; +$footer-bg: #171926; + +/*-- scss:rules --*/ +h1, h2, h3, h4, .title, .sidebar-title, +.sidebar-item-section > .sidebar-item-container .sidebar-item-text { + color: #eceaff; +} + +.chapter-number { + background: rgba(180, 165, 234, 0.16); + color: #c9bcf5; +} + +.callout.callout-style-simple.callout-tip { + background: rgba(169, 150, 214, 0.12); +} + +.toc-cards .card-item { + background: #1b1d2a; +} + +.toc-cards .card-item .card-title { + color: #eceaff; +} + +// 그래프는 흰 배경으로 그려졌으므로 흰 바탕 유지 +.cell-output-display img { + background: #fff; +} + +// 다크 모드: 밝은 글씨 로고로 교체 +.only-dark { + display: inline-block; +} + +.only-light { + display: none; +} + +body { + background-color: $body-bg; +} + +.brand-lockup .brand-divider { + background: $border-color; +} + +.sidebar-title a, +.sidebar-title a:hover { + color: #eceaff; +} + +.cell-output-display table thead th { + background: rgba(180, 165, 234, 0.14); + color: #eceaff; +} + +.cell-output-display table tbody tr:nth-child(even) { + background: rgba(180, 165, 234, 0.05); +} + +.page-navigation .nav-page a { + color: #eceaff; +} + +.page-navigation .nav-page a:hover { + background: rgba(180, 165, 234, 0.12); +} diff --git a/book/styles.scss b/book/styles.scss new file mode 100644 index 0000000..d4d6bd1 --- /dev/null +++ b/book/styles.scss @@ -0,0 +1,488 @@ +/*-- scss:defaults --*/ +// 가짜연구소 인과추론팀(Causal-Lab) 로고의 남색·라벤더를 기본색으로, Quarto처럼 밝고 가벼운 화면 +$font-family-sans-serif: "Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont, "Apple SD Gothic Neo", "Noto Sans KR", sans-serif; +$font-family-monospace: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace; +$headings-font-family: $font-family-sans-serif; +$font-size-root: 16.5px; +$line-height-base: 1.8; + +$navy: #232766; +$indigo: #3d3f9e; +$lavender: #a996d6; +$lavender-soft: #f3f0fb; + +$body-color: #1f2330 !default; +$body-bg: #ffffff !default; +$primary: $indigo !default; +$link-color: $indigo !default; +$code-color: #6b4fb8 !default; +$code-bg: #f5f6fa !default; +$border-color: #e8e9f0 !default; + +$sidebar-bg: #fafafc !default; +$sidebar-fg: #4b5163 !default; +$sidebar-hl: $indigo !default; +$toc-color: $indigo !default; +$footer-bg: #fafafc !default; +$callout-color-note: $indigo; +$callout-color-tip: $lavender; + +/*-- scss:rules --*/ +body { + word-break: keep-all; + overflow-wrap: break-word; + letter-spacing: -0.01em; + -webkit-font-smoothing: antialiased; +} + +#quarto-content main.content { + max-width: 780px; +} + +h1, h2, h3, h4, .title { + font-weight: 750; + letter-spacing: -0.025em; + color: $navy; +} + +h1.title { + font-size: 2.15rem; + line-height: 1.3; +} + +.chapter-number { + display: inline-block; + min-width: 1.9em; + margin-right: 0.45em; + padding: 0.05em 0.35em; + border-radius: 0.4em; + background: $lavender-soft; + color: $indigo; + font-weight: 700; + text-align: center; +} + +h2 { + margin-top: 2.8rem; + font-size: 1.55rem; + border-bottom: none; +} + +h2::before { + content: ""; + display: block; + width: 2.2rem; + height: 4px; + margin-bottom: 0.7rem; + border-radius: 2px; + background: linear-gradient(90deg, $indigo, $lavender); +} + +p { + margin-bottom: 1.1rem; +} + +a { + text-decoration-color: rgba($indigo, 0.35); + text-underline-offset: 0.18em; +} + +// 사이드바 + +.sidebar-title { + font-weight: 750; + color: $navy; + letter-spacing: -0.02em; +} + +.sidebar-item-section > .sidebar-item-container .sidebar-item-text { + font-weight: 700; + color: $navy; +} + +.sidebar-navigation .sidebar-item .sidebar-link.active, +.sidebar-navigation .sidebar-item .sidebar-link.active .menu-text { + font-weight: 700; +} + +// 코드와 출력 +div.sourceCode, pre.sourceCode { + border: 1px solid $border-color; + border-radius: 10px; + background: $code-bg; +} + +.cell-output pre { + border-radius: 10px; +} + +.cell-output-display table { + font-size: 0.82rem; + font-variant-numeric: tabular-nums; + display: block; + overflow-x: auto; + border-radius: 8px; +} + +.cell-output-display img, +.quarto-figure img { + max-width: 100%; + height: auto; + border-radius: 8px; +} + +details.code-fold > summary { + color: $sidebar-fg; + font-size: 0.85rem; +} + +// 옮긴이 상자 +.callout.callout-style-simple.callout-tip { + border-left: 4px solid $lavender; + border-radius: 8px; + background: $lavender-soft; + font-size: 0.95rem; +} + +// 들어가며 첫 화면 +.hero { + position: relative; + overflow: hidden; + margin: 0.5rem 0 2.5rem; + padding: 2.4rem 2.4rem 2.2rem; + border-radius: 20px; + color: #fff; + background: + radial-gradient(circle at 85% 20%, rgba($lavender, 0.55), transparent 45%), + linear-gradient(135deg, $navy 0%, $indigo 60%, #5a4fb0 100%); +} + +.hero .hero-mark { + position: absolute; + right: 1.6rem; + top: 1.4rem; + width: 130px; + opacity: 0.95; + filter: drop-shadow(0 12px 24px rgba(0, 0, 0, 0.25)); +} + + +.hero .hero-title { + margin: 0; + font-size: 2.3rem; + font-weight: 800; + line-height: 1.25; + letter-spacing: -0.03em; + color: #fff; +} + +.hero .hero-sub { + max-width: 30rem; + margin: 0.8rem 0 1.6rem; + color: rgba(255, 255, 255, 0.85); +} + +.hero .hero-actions a { + display: inline-block; + margin: 0 0.5rem 0.5rem 0; + padding: 0.55rem 1.1rem; + border-radius: 999px; + font-weight: 650; + font-size: 0.92rem; + text-decoration: none; +} + +.hero .hero-actions a.primary { + background: #fff; + color: $navy; +} + +.hero .hero-actions a.ghost { + border: 1px solid rgba(255, 255, 255, 0.45); + color: #fff; +} + +.hero .hero-actions a:hover { + opacity: 0.9; +} + +.toc-cards { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); + gap: 0.9rem; + margin: 1.2rem 0 2rem; +} + +.toc-cards .card-item { + padding: 1.1rem 1.2rem; + border: 1px solid $border-color; + border-radius: 14px; + background: #fff; + transition: border-color 0.15s, transform 0.15s; +} + +.toc-cards .card-item:hover { + border-color: $lavender; + transform: translateY(-2px); +} + +.toc-cards .card-item p { + margin: 0; + font-size: 0.9rem; + color: $sidebar-fg; +} + +.toc-cards .card-item .card-label { + margin-bottom: 0.35rem; + font-size: 0.78rem; + font-weight: 700; + color: $indigo; +} + +.toc-cards .card-item .card-title { + margin-bottom: 0.4rem; + font-size: 1.05rem; + font-weight: 750; + color: $navy; +} + +@media (max-width: 720px) { + .hero { + padding: 1.8rem 1.4rem; + } + .hero .hero-mark { + display: none; + } + .hero .hero-title { + font-size: 1.8rem; + } + .hero .hero-brand { + flex-wrap: wrap; + row-gap: 0.4rem; + } +} + +// 들어가며: 히어로가 제목을 대신하므로 기본 제목 블록은 숨김 +main:has(.hero) #title-block-header { + display: none; +} + +// 사이드바의 장 번호는 작은 숫자로, 제목이 줄바꿈돼도 들여쓰기 유지 +.sidebar .menu-text { + display: flex; + gap: 0.55em; + align-items: baseline; +} + +.sidebar .chapter-number { + min-width: 1.4em; + margin: 0; + padding: 0; + background: none; + color: $lavender; + font-size: 0.82em; + font-weight: 700; + text-align: right; + flex-shrink: 0; +} + +.sidebar .sidebar-link.active .chapter-number { + color: $indigo; +} + +// 본문 그림은 가운데 +.cell-output-display p:has(> img), +.quarto-figure { + text-align: center; +} + +// 사이드바 상단: 가짜연구소 × 인과추론팀 +.brand-lockup { + display: flex; + align-items: center; + gap: 0.7rem; + margin: 0.3rem 0 0.9rem; + text-decoration: none; +} + +.brand-lockup .brand-pseudolab { + height: 26px; + width: auto; +} + +.brand-lockup .brand-divider { + width: 1px; + height: 26px; + background: $border-color; +} + +.brand-lockup .brand-causal { + height: 34px; + width: auto; +} + +.only-dark { + display: none; +} + +// 첫 화면 브랜드 줄 +.hero .hero-brand { + display: flex; + align-items: center; + gap: 0.8rem; + margin-bottom: 1.4rem; +} + +.hero .hero-pseudolab { + height: 24px; + width: auto; +} + +.hero .hero-brand-divider { + width: 1px; + height: 20px; + background: rgba(255, 255, 255, 0.35); +} + +.hero .hero-brand-team { + font-size: 0.88rem; + color: rgba(255, 255, 255, 0.82); + letter-spacing: 0.01em; +} + +.hero .hero-brand-team b { + font-weight: 700; + color: #fff; +} + +.sidebar-title a, +.sidebar-title a:hover { + color: $navy; + font-weight: 750; + text-decoration: none; +} + +// ---- 읽기 경험 다듬기 ---- + +// 데이터프레임 표 +.cell-output-display table { + border-collapse: collapse; + border: 1px solid $border-color; +} + +.cell-output-display table thead th { + background: $lavender-soft; + color: $navy; + font-weight: 700; + border-bottom: 1px solid $border-color; +} + +.cell-output-display table td, +.cell-output-display table th { + padding: 0.35rem 0.7rem; +} + +.cell-output-display table tbody tr:nth-child(even) { + background: rgba($lavender-soft, 0.45); +} + +// 접힌 코드 버튼 +details.code-fold { + margin: 0.4rem 0 0.6rem; +} + +details.code-fold > summary { + display: inline-flex; + align-items: center; + gap: 0.35rem; + padding: 0.2rem 0.75rem; + border: 1px solid $border-color; + border-radius: 999px; + color: $sidebar-fg; + font-size: 0.8rem; + font-weight: 600; + cursor: pointer; + list-style: none; +} + +details.code-fold > summary::-webkit-details-marker { + display: none; +} + +details.code-fold > summary::before { + content: ""; + font-family: $font-family-monospace; + font-size: 0.72rem; + color: $lavender; +} + +details.code-fold[open] > summary { + color: $indigo; + border-color: $lavender; +} + +// 노트 상자 +.callout-note { + border-left-color: $indigo !important; + border-radius: 8px; +} + +// 이전/다음 장 이동 +.page-navigation { + margin-top: 3rem; + padding-top: 1.2rem; + border-top: 1px solid $border-color; +} + +.page-navigation .nav-page a { + display: inline-flex; + align-items: center; + gap: 0.4rem; + padding: 0.55rem 0.9rem; + border: 1px solid $border-color; + border-radius: 12px; + color: $navy; + font-weight: 650; + text-decoration: none; + transition: border-color 0.15s, background 0.15s; +} + +.page-navigation .nav-page a:hover { + border-color: $lavender; + background: $lavender-soft; +} + +// 검색창 +.sidebar-search .aa-Form, +#quarto-search .aa-Form { + border-radius: 10px; +} + +// 본문 인용(원저자 감사의 말 등) +.content blockquote { + border-left: 3px solid $lavender; + color: $sidebar-fg; + padding-left: 1rem; +} + +// 페이지 하단 +.nav-footer { + font-size: 0.85rem; +} + +.nav-footer a { + color: $sidebar-fg; +} + +.nav-footer .nav-footer-center a { + margin: 0 0.6rem; +} + +// 본문 그림·밈은 가운데 정렬 +main.content p > img, +main.content .quarto-figure img, +.cell-output-display img { + display: block; + margin-left: auto; + margin-right: auto; +} diff --git a/causal-inference-for-the-brave-and-true/01-Introduction-To-Causality.ipynb b/causal-inference-for-the-brave-and-true/01-Introduction-To-Causality.ipynb index 48b553f..6371882 100644 --- a/causal-inference-for-the-brave-and-true/01-Introduction-To-Causality.ipynb +++ b/causal-inference-for-the-brave-and-true/01-Introduction-To-Causality.ipynb @@ -138,9 +138,9 @@ "\n", "이제 대상 i에서 관측한 결과변수(outcome variable)를 $Y_i$라고 하겠습니다.\n", "\n", - "결과는 우리가 관심을 두는 변수입니다. 처치가 결과에 조금이라도 영향을 미치는지 알고 싶은 것이죠. 태블릿 예시에서는 학업 성취도가 결과입니다.\n", + "결과는 우리가 관심을 두는 변수입니다. 처치가 결과에 조금이라도 영향을 미치는지 알고 싶은 것입니다. 태블릿 예시에서는 학업 성취도가 결과입니다.\n", "\n", - "여기서부터 흥미로워집니다. **인과추론의 근본적인 문제**(fundamental problem of causal inference)는 같은 대상을 처치를 받은 상태와 받지 않은 상태로 동시에 관측할 수 없다는 점입니다. 마치 두 갈래 길 앞에서 한 길을 고르면 그 길 앞에 무엇이 있는지만 알 수 있는 것과 같습니다. 로버트 프로스트(Robert Frost)의 시처럼 말이죠.\n", + "여기서부터 흥미로워집니다. **인과추론의 근본적인 문제**(fundamental problem of causal inference)는 같은 대상을 처치를 받은 상태와 받지 않은 상태로 동시에 관측할 수 없다는 점입니다. 마치 두 갈래 길 앞에서 한 길을 고르면 그 길 앞에 무엇이 있는지만 알 수 있는 것과 같습니다. 로버트 프로스트(Robert Frost)의 시처럼 말입니다.\n", "\n", ">노랗게 물든 숲속에 두 갈래 길이 있었습니다. \n", "안타깝게도 나는 한 사람의 나그네라 \n", @@ -411,7 +411,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "분명 이상적이지는 않다고 하실 수 있겠죠. 그래도 실험군(treated)의 평균을 구해서 대조군(untreated)의 평균과 비교하면 되지 않을까요? 다시 말해 그냥 $ATE=(600+750)/2 - (500 + 600)/2 = 125$로 계산하면 안 될까요? 안 됩니다! 결과가 얼마나 다른지 보세요. 방금 연관관계를 인과관계로 착각하는, 가장 무거운 죄를 저질렀습니다. 왜 그런지 이해하기 위해 인과추론의 가장 큰 적을 살펴보겠습니다.\n", + "분명 이상적이지는 않다고 하실 수도 있습니다. 그래도 실험군(treated)의 평균을 구해서 대조군(untreated)의 평균과 비교하면 되지 않을까요? 다시 말해 그냥 $ATE=(600+750)/2 - (500 + 600)/2 = 125$로 계산하면 안 될까요? 안 됩니다! 결과가 얼마나 다른지 보세요. 방금 연관관계를 인과관계로 착각하는, 가장 무거운 죄를 저질렀습니다. 왜 그런지 이해하기 위해 인과추론의 가장 큰 적을 살펴보겠습니다.\n", "\n", "## 편향\n", "\n", @@ -524,17 +524,19 @@ "\n", "오른쪽 그림에는 앞서 이야기한 편향을 나타냈습니다. 모든 대상이 처치를 받지 않도록 설정하면 편향을 볼 수 있습니다. 이렇게 하면 $T_0$ 잠재적 결과만 남습니다. 그런 다음 실험군과 대조군이 어떻게 다른지 봅니다. 차이가 있다면 처치가 아닌 다른 무언가가 두 그룹을 다르게 만들고 있는 것입니다. 이 무언가가 바로 편향이며, 진짜 처치효과를 가리는 요인입니다.\n", "\n", + "> 옮긴이: 위 문단의 T₀는 원문 그대로 옮긴 것으로, 처치를 받지 않았을 때의 잠재적 결과 Y₀를 잘못 적은 것으로 보입니다.\n", + "\n", "이번에는 편향이 없는 가상의 상황과 비교해 봅시다. 태블릿을 학교에 무작위로 배정한다고 해 보겠습니다. 이때 부유한 학교와 가난한 학교가 처치를 받을 확률은 같습니다. 처치는 등록금 수준 전반에 고르게 퍼질 것입니다.\n", "\n", "![img](./data/img/intro/anatomy3.png)\n", "\n", - "이 경우 실험군과 대조군의 결과 차이가 곧 평균 인과효과입니다. 처치 자체 말고는 실험군과 대조군 사이에 차이를 만드는 다른 원인이 없기 때문입니다. 관측되는 모든 차이는 처치 때문이라고 봐야 합니다. 편향이 없다는 말이죠.\n", + "이 경우 실험군과 대조군의 결과 차이가 곧 평균 인과효과입니다. 처치 자체 말고는 실험군과 대조군 사이에 차이를 만드는 다른 원인이 없기 때문입니다. 관측되는 모든 차이는 처치 때문이라고 봐야 합니다. 편향이 없다는 말입니다.\n", "\n", "![img](./data/img/intro/anatomy4.png)\n", "\n", "모든 대상이 처치를 받지 않도록 설정해 $Y_0$만 관측한다면, 실험군과 대조군 사이에서 아무런 차이도 발견되지 않을 것입니다.\n", "\n", - "인과추론이 다루는 일이 바로 이 헤라클레스급 과업입니다. 편향을 제거하고 실험군과 대조군을 비교 가능하게 만들어서, 관측되는 차이가 오직 평균 처치효과뿐이도록 하는 영리한 방법을 찾는 일이죠. 궁극적으로 인과추론은 모든 착각과 오해를 걷어 내고 세상이 실제로 어떻게 돌아가는지 알아내는 학문입니다. 이 점을 이해했으니, 이제 편향을 제거하고 인과효과를 식별하는 가장 강력한 방법들, 즉 용감하고 진실한 자들의 무기를 익히러 나아가 봅시다.\n", + "인과추론이 다루는 일이 바로 이 헤라클레스급 과업입니다. 편향을 제거하고 실험군과 대조군을 비교 가능하게 만들어서, 관측되는 차이가 오직 평균 처치효과뿐이도록 하는 영리한 방법을 찾는 일입니다. 궁극적으로 인과추론은 모든 착각과 오해를 걷어 내고 세상이 실제로 어떻게 돌아가는지 알아내는 학문입니다. 이 점을 이해했으니, 이제 편향을 제거하고 인과효과를 식별하는 가장 강력한 방법들, 즉 용감하고 진실한 자들의 무기를 익히러 나아가 봅시다.\n", "\n", "## 핵심 요약\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/02-Randomised-Experiments.ipynb b/causal-inference-for-the-brave-and-true/02-Randomised-Experiments.ipynb index d1b93c1..0453637 100644 --- a/causal-inference-for-the-brave-and-true/02-Randomised-Experiments.ipynb +++ b/causal-inference-for-the-brave-and-true/02-Randomised-Experiments.ipynb @@ -53,7 +53,7 @@ "\n", "이 질문에 답하는 한 가지 방법은 주로 온라인 수업을 하는 학교의 학생들과 전통적인 교실 수업을 하는 학교의 학생들을 비교하는 것입니다. 이제 다들 알다시피 이는 좋은 방법이 아닙니다. 온라인 학교에는 대면 수업을 듣더라도 평균보다 잘했을 자기 관리가 뛰어난 학생들만 모였을 수도 있습니다. 그렇다면 실험군이 대조군보다 학업 능력이 원래 더 뛰어난 양의 편향이 생깁니다. 즉, $E[Y_0|T=1] > E[Y_0|T=0]$입니다.\n", "\n", - "반대로 온라인 수업은 값이 더 싸기 때문에 공부하면서 일도 해야 하는 형편이 넉넉지 않은 학생들이 주로 들을 수도 있습니다. 이 경우 이 학생들은 대면 수업을 듣더라도 대면 수업 학교의 학생들보다 성적이 낮을 것입니다. 그렇다면 편향은 반대 방향으로 생겨, 실험군이 대조군보다 학업 능력이 원래 더 떨어지게 됩니다. 즉, $E[Y_0|T=1] < E[Y_0|T=0]$입니다.\n", + "반대로 온라인 수업은 값이 더 싸기 때문에 공부하면서 일도 해야 하는 형편이 넉넉지 않은 학생들이 주로 들을 수도 있습니다. 이 경우 이 학생들은 대면 수업을 듣더라도 대면 수업 학교의 학생들보다 성적이 낮을 것입니다. 그렇다면 실험군이 대조군보다 학업 능력이 원래 더 떨어지는, 반대 방향의 편향이 생깁니다. 즉, $E[Y_0|T=1] < E[Y_0|T=0]$입니다.\n", "\n", "그러니 단순 비교를 할 수는 있어도 설득력은 없습니다. 어느 쪽이든 편향이 숨어서 인과효과를 가리고 있지 않다고 확신할 수 없기 때문입니다.\n", "\n", @@ -365,7 +365,7 @@ "\n", "![img](./data/img/rct/science_dream.png)\n", "\n", - "안타깝게도 RCT는 비용이 매우 많이 들거나 아예 비윤리적인 경우가 많습니다. 처치 배정 메커니즘을 아예 통제할 수 없을 때도 있습니다. 임신 중 흡연이 신생아 출생 체중에 미치는 영향을 추정하려는 의사라고 상상해 보세요. 임산부 일부를 무작위로 골라 임신 중에 담배를 피우라고 강요할 수는 없습니다. 또는 큰 은행에서 일하면서 신용 한도가 고객 이탈에 미치는 영향을 추정해야 한다고 해 봅시다. 고객들에게 신용 한도를 무작위로 주기에는 비용이 너무 큽니다. 최저임금 인상이 실업률에 미치는 영향을 알고 싶을 때도 마찬가지입니다. 나라마다 최저임금을 이렇게 저렇게 정하라고 배정할 수는 없습니다. 무슨 말인지 아시겠죠.\n", + "안타깝게도 RCT는 비용이 매우 많이 들거나 아예 비윤리적인 경우가 많습니다. 처치 배정 메커니즘을 아예 통제할 수 없을 때도 있습니다. 임신 중 흡연이 신생아 출생 체중에 미치는 영향을 추정하려는 의사라고 상상해 보세요. 임산부 일부를 무작위로 골라 임신 중에 담배를 피우라고 강요할 수는 없습니다. 또는 큰 은행에서 일하면서 신용 한도가 고객 이탈에 미치는 영향을 추정해야 한다고 해 봅시다. 고객들에게 신용 한도를 무작위로 주기에는 비용이 너무 큽니다. 최저임금 인상이 실업률에 미치는 영향을 알고 싶을 때도 마찬가지입니다. 나라마다 최저임금을 이렇게 저렇게 정하라고 배정할 수는 없습니다. 무슨 말인지 아실 겁니다.\n", "\n", "나중에 조건부 랜덤화로 랜덤화 비용을 낮추는 방법을 살펴보겠지만, 비윤리적이거나 실행할 수 없는 실험은 어떻게 할 도리가 없습니다. 그래도 인과적 질문을 다룰 때는 언제나 **이상적인 실험**을 떠올려 볼 가치가 있습니다. 항상 스스로에게 물어보세요. **할 수만 있다면 이 인과효과를 밝히기 위해 어떤 완벽한 실험을 하겠는가?** 이렇게 생각해 보면 이상적인 실험 없이도 인과효과를 찾아낼 방법에 관한 실마리를 얻는 경우가 많습니다.\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/03-Stats-Review-The-Most-Dangerous-Equation.ipynb b/causal-inference-for-the-brave-and-true/03-Stats-Review-The-Most-Dangerous-Equation.ipynb index d2adf68..4416027 100644 --- a/causal-inference-for-the-brave-and-true/03-Stats-Review-The-Most-Dangerous-Equation.ipynb +++ b/causal-inference-for-the-brave-and-true/03-Stats-Review-The-Most-Dangerous-Equation.ipynb @@ -268,7 +268,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "위 그림은 드무아브르의 공식이 예측하는 모습을 그대로 보여 줍니다. 학생 수가 늘어날수록 평균 점수는 점점 더 정밀해집니다. 표본이 아주 적은 학교는 순전히 우연 때문에 점수가 아주 높게도, 아주 낮게도 나올 수 있습니다. 큰 학교에서는 이런 일이 일어날 가능성이 낮습니다. 드무아브르의 공식은 데이터라는 형태로 기록된 정보에 관한 근본적인 사실 하나를 알려 줍니다. 데이터는 언제나 부정확하다는 것입니다. 그렇다면 남는 질문은 얼마나 부정확하냐는 것이죠.\n", + "위 그림은 드무아브르의 공식이 예측하는 모습을 그대로 보여 줍니다. 학생 수가 늘어날수록 평균 점수는 점점 더 정밀해집니다. 표본이 아주 적은 학교는 순전히 우연 때문에 점수가 아주 높게도, 아주 낮게도 나올 수 있습니다. 큰 학교에서는 이런 일이 일어날 가능성이 낮습니다. 드무아브르의 공식은 데이터라는 형태로 기록된 정보에 관한 근본적인 사실 하나를 알려 줍니다. 데이터는 언제나 부정확하다는 것입니다. 그렇다면 남는 질문은 얼마나 부정확하냐는 것입니다.\n", "\n", "통계학은 이런 부정확성이 우리 허를 찌르지 못하도록 다루는 학문입니다. Taleb은 『행운에 속지 마라(Fooled by Randomness)』에서 이렇게 말합니다.\n", "\n", @@ -282,7 +282,7 @@ "\n", "통계 복습일 뿐이니 이제부터는 조금 빠르게 진행하겠습니다. 분포, 분산, 표준오차가 익숙하지 않다면 계속 읽되, 다른 자료가 더 필요할 수 있다는 점은 염두에 두세요. MIT의 통계학 입문 강의를 아무거나 검색해 보길 권합니다. 대체로 꽤 좋습니다.\n", "\n", - "앞 장에서는 평균 처치효과 $E[Y_1-Y_0]$를 실험군(treated)과 대조군(untreated)의 평균 차이 $E[Y|T=1]-E[Y|T=0]$로 추정했습니다. 그때 예제로 다룬 것이 온라인 수업의 $ATE$였습니다. 효과는 부정적이었죠. 온라인 수업을 들은 학생들이 대면 수업을 들은 학생들보다 점수가 5점가량 낮았습니다. 이제 이 효과가 통계적으로 유의한지 확인해 보겠습니다.\n", + "앞 장에서는 평균 처치효과 $E[Y_1-Y_0]$를 실험군(treated)과 대조군(untreated)의 평균 차이 $E[Y|T=1]-E[Y|T=0]$로 추정했습니다. 그때 예제로 다룬 것이 온라인 수업의 $ATE$였습니다. 효과는 부정적이었습니다. 온라인 수업을 들은 학생들이 대면 수업을 들은 학생들보다 점수가 5점가량 낮았습니다. 이제 이 효과가 통계적으로 유의한지 확인해 보겠습니다.\n", "\n", "그러려면 $SE$를 추정해야 합니다. 표본 크기 $n$은 이미 알고 있습니다. 표준편차의 추정값은 다음과 같이 구할 수 있습니다.\n", "\n", @@ -378,7 +378,7 @@ "source": [ "여기서 이야기하는 것이 평균들의 평균이라는 점에 주목하세요. 우연히 평균이 참 평균보다 조금 낮거나 높은 실험이 나올 수 있습니다. 다시 말해 우리 실험의 평균이 플라톤적이고 이상적인 참 평균과 일치한다고는 결코 확신할 수 없습니다. 하지만 **표준오차를 이용하면 95%의 경우에 참 평균을 포함하는 구간을 만들 수 있습니다**.\n", "\n", - "현실에서는 같은 실험을 여러 데이터셋으로 시뮬레이션하는 호사를 누릴 수 없습니다. 대개 데이터셋은 하나뿐이죠. 하지만 위의 직관을 바탕으로 **신뢰구간**(confidence interval)이라는 것을 만들 수 있습니다. 신뢰구간에는 확률이 하나 따라붙는데, 가장 흔한 것은 95%입니다. 이 확률은 서로 다른 연구에서 만든 가상의 신뢰구간들 가운데 얼마나 많은 구간이 참 평균을 포함하는지를 알려 줍니다. 예를 들어 비슷한 연구들에서 계산한 95% 신뢰구간은 95%의 경우에 참 평균을 포함합니다.\n", + "현실에서는 같은 실험을 여러 데이터셋으로 시뮬레이션하는 호사를 누릴 수 없습니다. 대개 데이터셋은 하나뿐입니다. 하지만 위의 직관을 바탕으로 **신뢰구간**(confidence interval)이라는 것을 만들 수 있습니다. 신뢰구간에는 확률이 하나 따라붙는데, 가장 흔한 것은 95%입니다. 이 확률은 서로 다른 연구에서 만든 가상의 신뢰구간들 가운데 얼마나 많은 구간이 참 평균을 포함하는지를 알려 줍니다. 예를 들어 비슷한 연구들에서 계산한 95% 신뢰구간은 95%의 경우에 참 평균을 포함합니다.\n", "\n", "신뢰구간을 계산할 때는 **중심극한정리**(central limit theorem)를 이용합니다. 이 정리에 따르면 **실험의 평균들은 정규분포를 따릅니다**. 통계 이론에서 알 수 있듯이 정규분포 질량의 95%는 평균 위아래로 표준편차 2배 이내에 있습니다. 엄밀히는 1.96이지만 2로도 충분합니다.\n", "\n", @@ -569,7 +569,7 @@ "\n", "## 가설검정\n", "\n", - "불확실성을 반영하는 또 다른 방법은 가설검정(hypothesis test)을 세우는 것입니다. 평균의 차이가 0(또는 다른 어떤 값)과 통계적으로 다른지를 묻는 것이죠. 서로 독립인 정규분포 2개의 합이나 차도 정규분포라는 사실을 떠올려 봅시다. 그 결과로 나오는 분포의 평균은 두 분포 평균의 합이나 차가 되고, 분산은 언제나 두 분산의 합이 됩니다.\n", + "불확실성을 반영하는 또 다른 방법은 가설검정(hypothesis test)을 세우는 것입니다. 평균의 차이가 0(또는 다른 어떤 값)과 통계적으로 다른지를 묻는 것입니다. 서로 독립인 정규분포 2개의 합이나 차도 정규분포라는 사실을 떠올려 봅시다. 그 결과로 나오는 분포의 평균은 두 분포 평균의 합이나 차가 되고, 분산은 언제나 두 분산의 합이 됩니다.\n", "\n", "$\n", "N(\\mu_1, \\sigma_1^2) - N(\\mu_2, \\sigma_2^2) = N(\\mu_1 - \\mu_2, \\sigma_1^2 + \\sigma_2^2)\n", @@ -699,7 +699,7 @@ "\n", "여기서 $H_0$는 차이와 비교해 검정하려는 값입니다.\n", "\n", - "z 통계량은 관측된 차이가 얼마나 극단적인지를 나타내는 척도입니다. 평균의 차이가 0과 통계적으로 다르다는 가설은 귀류법으로 검정합니다. 반대가 참이라고, 즉 차이가 0이라고 가정하는 것이죠. 이를 귀무가설(null hypothesis), 또는 $H_0$라고 합니다. 그런 다음 \"참 차이가 0이라면 이 정도 차이를 관측할 가능성이 있을까?\"라고 스스로 묻습니다. 통계학의 수학 언어로 바꾸면, 이 질문은 z 통계량이 0에서 얼마나 멀리 떨어져 있는지 확인하는 문제가 됩니다.\n", + "z 통계량은 관측된 차이가 얼마나 극단적인지를 나타내는 척도입니다. 평균의 차이가 0과 통계적으로 다르다는 가설은 귀류법으로 검정합니다. 반대가 참이라고, 즉 차이가 0이라고 가정하는 것입니다. 이를 귀무가설(null hypothesis), 또는 $H_0$라고 합니다. 그런 다음 \"참 차이가 0이라면 이 정도 차이를 관측할 가능성이 있을까?\"라고 스스로 묻습니다. 통계학의 수학 언어로 바꾸면, 이 질문은 z 통계량이 0에서 얼마나 멀리 떨어져 있는지 확인하는 문제가 됩니다.\n", "\n", "$H_0$ 아래에서 z 통계량은 표준정규분포를 따릅니다. 따라서 차이가 정말 0이라면 95%의 경우에 z 통계량은 평균에서 표준편차 2배 이내에 있을 것입니다. 곧바로 따라 나오는 결론은, z가 표준편차 2배를 넘어 위나 아래로 벗어나면 95% 신뢰도로 귀무가설을 기각할 수 있다는 것입니다.\n", "\n", @@ -809,13 +809,13 @@ "\n", "신뢰구간과 마찬가지로(사실 대부분의 빈도주의 통계학이 그렇듯이) p 값의 정확한 정의는 무척 헷갈릴 수 있습니다. 그래서 괜한 위험을 지지 않으려고 위키피디아의 정의를 그대로 옮겨 오겠습니다. \"p 값은 귀무가설이 옳다고 가정할 때, 검정에서 실제로 관측된 결과만큼 또는 그보다 더 극단적인 검정 결과를 얻을 확률이다.\"\n", "\n", - "좀 더 간단히 말하면, p 값은 귀무가설이 참이라는 조건에서 이런 데이터를 볼 확률입니다. 귀무가설이 참이라면 지금 보고 있는 측정값이 나오기가 얼마나 어려운지를 나타내죠. 당연히 이 값은 귀무가설이 참일 확률과 자주 혼동됩니다. 둘의 차이에 주의하세요. p 값은 $P(H_0|data)$가 아니라 $P(data|H_0)$입니다.\n", + "좀 더 간단히 말하면, p 값은 귀무가설이 참이라는 조건에서 이런 데이터를 볼 확률입니다. 귀무가설이 참이라면 지금 보고 있는 측정값이 나오기가 얼마나 어려운지를 나타냅니다. 당연히 이 값은 귀무가설이 참일 확률과 자주 혼동됩니다. 둘의 차이에 주의하세요. p 값은 $P(H_0|data)$가 아니라 $P(data|H_0)$입니다.\n", "\n", "하지만 이런 복잡함에 속지 마세요. 실제로 쓰기에는 꽤 간단합니다.\n", "\n", "![p_value](./data/img/stats-review/p_value.png)\n", "\n", - "p 값을 구하려면 표준정규분포에서 z 통계량의 앞쪽이나 뒤쪽 넓이를 계산해야 합니다. 다행히 이 계산은 컴퓨터가 대신해 줍니다. z 통계량을 표준정규분포의 누적분포함수에 넣기만 하면 됩니다." + "p 값을 구하려면 표준정규분포에서 z 통계량의 왼쪽이나 오른쪽 넓이를 계산해야 합니다. 다행히 이 계산은 컴퓨터가 대신해 줍니다. z 통계량을 표준정규분포의 누적분포함수에 넣기만 하면 됩니다." ] }, { @@ -843,7 +843,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "p 값이 흥미로운 점은 95%나 99% 같은 신뢰수준을 미리 정하지 않아도 된다는 것입니다. 그래도 신뢰수준을 보고하고 싶다면, p 값으로 검정이 정확히 어느 신뢰수준에서 통과하고 어디서부터 실패하는지 알 수 있습니다. 예를 들어 p 값이 0.0027이면 0.2% 수준까지 유의하다는 것을 알 수 있습니다. 그러니 차이에 대한 95% 신뢰구간과 99% 신뢰구간은 둘 다 0을 포함하지 않지만, 99.9% 신뢰구간은 0을 포함합니다. 차이가 0이라면 이렇게 극단적인 z 통계량을 관측할 확률이 0.2%밖에 되지 않는다는 뜻입니다." + "p 값이 흥미로운 점은 95%나 99% 같은 신뢰수준을 미리 정하지 않아도 된다는 것입니다. 그래도 신뢰수준을 보고하고 싶다면, p 값으로 검정이 정확히 어느 신뢰수준에서 통과하고 어디서부터 실패하는지 알 수 있습니다. 예를 들어 p 값이 0.0027이면 0.2% 수준까지 유의하다는 것을 알 수 있습니다. 그러니 차이에 대한 95% 신뢰구간과 99% 신뢰구간은 둘 다 0을 포함하지 않지만, 99.9% 신뢰구간은 0을 포함합니다. 차이가 0이라면 이렇게 극단적인 z 통계량을 관측할 확률이 0.2%밖에 되지 않는다는 뜻입니다.\n", + "\n", + "> 옮긴이: p 값 0.0027은 약 0.27%이므로, 엄밀히 말하면 0.2% 수준이 아니라 0.3% 수준까지 유의하고, 이런 z 통계량을 관측할 확률도 약 0.27%입니다. 본문의 0.2%는 원문 그대로 옮겼습니다." ] }, { diff --git a/causal-inference-for-the-brave-and-true/04-Graphical-Causal-Models.ipynb b/causal-inference-for-the-brave-and-true/04-Graphical-Causal-Models.ipynb index 3328106..c6f6285 100644 --- a/causal-inference-for-the-brave-and-true/04-Graphical-Causal-Models.ipynb +++ b/causal-inference-for-the-brave-and-true/04-Graphical-Causal-Models.ipynb @@ -1394,7 +1394,7 @@ "\n", "![image.png](./data/img/causal-graph/selection_bias.png)\n", "\n", - "편향의 두 번째 주요 원인은 여기서 선택편향(selection bias)이라고 부를 것입니다. 저는 선택편향과 교란편향을 구분하는 것이 도움이 된다고 생각하므로 이 구분을 따르겠습니다. 교란편향이 공통 원인을 통제하지 않을 때 생긴다면, 선택편향은 효과 쪽과 더 관련이 있습니다. 한 가지 주의할 점은, 경제학자들은 온갖 종류의 편향을 다 선택편향이라고 부르는 경향이 있다는 것입니다.\n", + "편향의 두 번째 주요 원인은 여기서 선택편향(selection bias)이라고 부를 현상입니다. 저는 선택편향과 교란편향을 구분하는 것이 도움이 된다고 생각하므로 이 구분을 따르겠습니다. 교란편향이 공통 원인을 통제하지 않을 때 생긴다면, 선택편향은 효과 쪽과 더 관련이 있습니다. 한 가지 주의할 점은, 경제학자들은 온갖 종류의 편향을 다 선택편향이라고 부르는 경향이 있다는 것입니다.\n", "\n", "선택편향은 통제해야 할 변수보다 더 많은 변수를 통제할 때 자주 생깁니다. 처치와 잠재적 결과가 주변적으로(marginally) 독립이더라도, 충돌부를 조건부로 두는 순간 종속이 될 수 있습니다.\n", "\n", @@ -1634,7 +1634,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "처치의 매개자(mediator)를 조건부로 둘 때도 비슷한 일이 생깁니다. 매개자는 처치와 결과 사이에 있는 변수입니다. 이름 그대로 인과효과를 매개하는 변수죠. 예를 들어 이번에도 교육을 무작위로 배정할 수 있다고 해 봅시다. 그런데 혹시 몰라서 그 사람이 화이트칼라 직업을 가졌는지 여부를 통제하기로 합니다. 이번에도 이 조건부는 인과효과 추정을 편향시킵니다. 다만 이번에는 충돌부 때문에 앞문 경로가 열려서가 아니라, 처치가 작용하는 통로 중 하나를 닫아 버리기 때문입니다. 이 예에서 화이트칼라 직업을 얻는 것은 교육을 많이 받으면 임금이 높아지는 통로 중 하나입니다. 이것을 통제하면 이 통로가 닫히고, 교육이 임금에 미치는 직접 효과만 열린 채로 남습니다." + "처치의 매개자(mediator)를 조건부로 둘 때도 비슷한 일이 생깁니다. 매개자는 처치와 결과 사이에 있는 변수입니다. 이름 그대로 인과효과를 매개하는 변수입니다. 예를 들어 이번에도 교육을 무작위로 배정할 수 있다고 해 봅시다. 그런데 혹시 몰라서 그 사람이 사무직인지 여부를 통제하기로 합니다. 이번에도 이 조건부는 인과효과 추정을 편향시킵니다. 다만 이번에는 충돌부 때문에 앞문 경로가 열려서가 아니라, 처치가 작용하는 통로 중 하나를 닫아 버리기 때문입니다. 이 예에서 사무직 일자리를 얻는 것은 교육을 많이 받으면 임금이 높아지는 통로 중 하나입니다. 이것을 통제하면 이 통로가 닫히고, 교육이 임금에 미치는 직접 효과만 열린 채로 남습니다." ] }, { @@ -1765,7 +1765,7 @@ ] }, "source": [ - "잠재적 결과로 설명해 보겠습니다. 무작위 배정 덕분에 편향은 0입니다: $E[Y_0|T=0] - E[Y_0|T=1] = 0$. 하지만 화이트칼라 직업을 가진 사람들을 조건부로 두면 $E[Y_0|T=0, WC=1] > E[Y_0|T=1, WC=1]$이 됩니다. 교육 없이도 화이트칼라 직업을 얻은 사람은 같은 직업을 얻는 데 교육의 도움이 필요했던 사람보다 아마 더 성실할 것이기 때문입니다. 같은 논리로 $E[Y_0|T=0, WC=0] > E[Y_0|T=1, WC=0]$입니다. 교육을 받고도 화이트칼라 직업을 얻지 못한 사람은 교육을 받지 않았고 화이트칼라 직업도 얻지 못한 사람보다 아마 덜 성실할 것이기 때문입니다.\n", + "잠재적 결과로 설명해 보겠습니다. 무작위 배정 덕분에 편향은 0입니다: $E[Y_0|T=0] - E[Y_0|T=1] = 0$. 하지만 사무직인 사람들을 조건부로 두면 $E[Y_0|T=0, WC=1] > E[Y_0|T=1, WC=1]$이 됩니다. 교육 없이도 사무직 일자리를 얻은 사람은 같은 직업을 얻는 데 교육의 도움이 필요했던 사람보다 아마 더 성실할 것이기 때문입니다. 같은 논리로 $E[Y_0|T=0, WC=0] > E[Y_0|T=1, WC=0]$입니다. 교육을 받고도 사무직 일자리를 얻지 못한 사람은 교육을 받지 않았고 사무직 일자리도 얻지 못한 사람보다 아마 덜 성실할 것이기 때문입니다.\n", "\n", "이 경우 매개자를 조건부로 두면 음의 편향이 생깁니다. 교육의 효과가 실제보다 작아 보이게 됩니다. 인과효과가 양수이기 때문에 이렇게 됩니다. 효과가 음수였다면 매개자를 조건부로 둘 때 양의 편향이 생겼을 것입니다. 어느 경우든 이런 조건부는 효과를 실제보다 약해 보이게 만듭니다.\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb b/causal-inference-for-the-brave-and-true/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb index 426da49..3db7f45 100644 --- a/causal-inference-for-the-brave-and-true/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb +++ b/causal-inference-for-the-brave-and-true/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb @@ -29,7 +29,7 @@ "E[Y|T=1] - E[Y|T=0] = \\underbrace{E[Y_1 - Y_0|T=1]}_{ATET} + \\underbrace{\\{ E[Y_0|T=1] - E[Y_0|T=0]\\}}_{BIAS}\n", "$\n", "\n", - "앞에서 무작위 실험, 다른 말로 **무작위 통제 실험**(RCT)으로 편향을 없앨 수 있다는 것을 보았습니다. RCT는 실험군과 대조군을 같게 만들기 때문에 편향이 사라집니다. 처치효과 추정값에 불확실성의 범위를 두는 방법도 살펴보았습니다. 온라인 수업과 대면 수업을 비교한 사례였는데, $T=0$은 대면 수업, $T=1$은 온라인 수업을 나타냈습니다. 학생들을 두 수업 방식 중 하나에 무작위로 배정한 뒤 시험 성적을 평가했죠. 그리고 두 그룹을 비교해 평균 처치효과(ATE)를 구하고 신뢰구간까지 계산해 주는 A/B 테스트 함수를 만들었습니다.\n", + "앞에서 무작위 실험, 다른 말로 **무작위 통제 실험**(RCT)으로 편향을 없앨 수 있다는 것을 보았습니다. RCT는 실험군과 대조군을 같게 만들기 때문에 편향이 사라집니다. 처치효과 추정값에 불확실성의 범위를 두는 방법도 살펴보았습니다. 온라인 수업과 대면 수업을 비교한 사례였는데, $T=0$은 대면 수업, $T=1$은 온라인 수업을 나타냈습니다. 학생들을 두 수업 방식 중 하나에 무작위로 배정한 뒤 시험 성적을 평가했습니다. 그리고 두 그룹을 비교해 평균 처치효과(ATE)를 구하고 신뢰구간까지 계산해 주는 A/B 테스트 함수를 만들었습니다.\n", "\n", "이제 이 모든 일을 인과추론의 든든한 일꾼인 **선형회귀**(linear regression)로 할 수 있다는 것을 보여 드릴 차례입니다! 이렇게 생각해 보세요. 실험군과 대조군의 평균을 비교하는 것이 디저트로 나온 사과 한 알이라면, 선형회귀는 차갑고 부드러운 티라미수입니다. 실험군과 대조군을 비교하는 것이 오래되어 처량한 원더 브레드 흰 식빵이라면, 선형회귀는 채드 로버트슨이 직접 구운, 껍질은 바삭하고 속은 촉촉한 시골풍 사워도우입니다.\n", "\n", @@ -43,7 +43,7 @@ "\n", "시험 결과를 기준값 $\\beta_0$에, 온라인 수업이면 $\\kappa$를 더한 값으로 모델링한다는 뜻입니다. 물론 시험 결과에는 다른 변수들(시험 당일 학생의 기분, 공부한 시간 등)도 영향을 줍니다. 하지만 그런 관계를 이해하는 데는 별 관심이 없습니다. 그래서 관심 없는 나머지 모든 것을 $u_i$ 항 하나로 나타냅니다. 이 항을 모델 오차(model error)라고 합니다.\n", "\n", - "$Online$은 처치 여부를 나타내므로 더미변수(dummy variable)입니다. 대면 수업이면 0, 온라인 수업이면 1이죠. 이 점을 생각하면 선형회귀가 $E[Y|T=0] = \\beta_0$와 $E[Y|T=1] = \\beta_0 + \\kappa $를 찾아낸다는 것을 알 수 있습니다. 즉 $\\kappa$가 ATE가 됩니다.\n", + "$Online$은 처치 여부를 나타내므로 더미변수(dummy variable)입니다. 대면 수업이면 0, 온라인 수업이면 1입니다. 이 점을 생각하면 선형회귀가 $E[Y|T=0] = \\beta_0$와 $E[Y|T=1] = \\beta_0 + \\kappa $를 찾아낸다는 것을 알 수 있습니다. 즉 $\\kappa$가 ATE가 됩니다.\n", "\n", "> 옮긴이: 원더 브레드(Wonder Bread)는 미국의 대표적인 공장제 흰 식빵 브랜드이고, 채드 로버트슨(Chad Robertson)은 샌프란시스코 타르틴 베이커리(Tartine Bakery)를 세운 제빵사로 사워도우 빵으로 이름난 사람입니다." ] @@ -173,7 +173,7 @@ "\\hat{\\beta} = (X'X)^{-1}X' Y\n", "$\n", "\n", - "그렇다고 제 말만 믿지는 마세요. 수식보다 코드가 더 잘 읽히는 분이라면 직접 해 보시죠." + "그렇다고 제 말만 믿지는 마세요. 수식보다 코드가 더 잘 읽히는 분이라면 직접 해 보세요." ] }, { @@ -351,7 +351,7 @@ "\n", "## 무작위가 아닌 데이터에서의 회귀분석\n", "\n", - "지금까지는 무작위 실험 데이터를 다뤘지만, 알다시피 그런 데이터는 구하기 어렵습니다. 실험은 비용이 아주 많이 들거나 아예 불가능한 경우가 많습니다. 예를 들어 맥킨지(McKinsey & Co.)에 무작위로 고른 회사에 무료로 컨설팅을 해 달라고 설득하기는 무척 어렵습니다. 그렇게만 할 수 있다면 맥킨지 컨설팅이 실제로 가져다주는 가치와, 애초에 맥킨지에 돈을 낼 수 있는 회사는 이미 형편이 아주 좋다는 사실을 단번에 구분할 수 있을 텐데 말이죠.\n", + "지금까지는 무작위 실험 데이터를 다뤘지만, 알다시피 그런 데이터는 구하기 어렵습니다. 실험은 비용이 아주 많이 들거나 아예 불가능한 경우가 많습니다. 예를 들어 맥킨지(McKinsey & Co.)에 무작위로 고른 회사에 무료로 컨설팅을 해 달라고 설득하기는 무척 어렵습니다. 그렇게만 할 수 있다면 맥킨지 컨설팅이 실제로 가져다주는 가치와, 애초에 맥킨지에 돈을 낼 수 있는 회사는 이미 형편이 아주 좋다는 사실을 단번에 구분할 수 있을 것입니다.\n", "\n", "\n", "그래서 이제부터는 무작위가 아닌 데이터, 즉 관측 데이터(observational data)를 깊이 다뤄 보겠습니다. 다음 예제에서는 교육을 1년 더 받는 것이 시간당 임금에 미치는 영향을 추정합니다. 짐작하셨겠지만 교육으로 실험을 하기는 극도로 어렵습니다. 사람들을 4년, 8년, 12년 교육에 무작위로 배정할 수는 없으니까요. 이럴 때 손에 쥔 것은 관측 데이터뿐입니다.\n", @@ -447,7 +447,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "물론 이 단순한 모델을 추정할 수 있다고 해서 그 모델이 옳은 것은 아닙니다. 제가 교육으로 임금을 **예측한다**고 조심스럽게 표현한 것에 주목하세요. 이 예측이 인과적이라고는 한 번도 말하지 않았습니다. 사실 지금쯤이면 이 모델이 편향되었다고 믿을 만한 아주 중대한 이유가 떠오를 겁니다. 데이터가 무작위 실험에서 나온 것이 아니므로, 교육을 더 받은 사람과 덜 받은 사람을 비교할 수 있는지 알 수 없습니다. 한 걸음 더 나아가, 세상이 돌아가는 방식을 생각해 보면 둘은 비교할 수 없다고 거의 확신할 수 있습니다. 예를 들어 교육을 더 오래 받은 사람은 부모가 더 부유할 가능성이 높고, 교육 연수가 늘수록 임금이 오르는 것처럼 보이는 것은 집안의 재산이 교육 연수와 연관되어 있다는 사실이 반영된 것일 뿐이라고 주장할 수 있습니다. 이를 수식으로 쓰면 $E[Y_0|T=0] < E[Y_0|T=1]$입니다. 교육을 더 받은 사람은 그만큼 교육을 받지 않았더라도 어차피 소득이 더 높았으리라는 뜻이죠. 교육을 정말 비관적으로 보는 사람이라면, 교육이 사람들을 노동시장 밖에 붙잡아 두어 경력을 쌓지 못하게 하므로 오히려 임금을 *낮춘다*고 주장할 수도 있습니다.\n", + "물론 이 단순한 모델을 추정할 수 있다고 해서 그 모델이 옳은 것은 아닙니다. 제가 교육으로 임금을 **예측한다**고 조심스럽게 표현한 것에 주목하세요. 이 예측이 인과적이라고는 한 번도 말하지 않았습니다. 사실 지금쯤이면 이 모델이 편향되었다고 믿을 만한 아주 중대한 이유가 떠오를 겁니다. 데이터가 무작위 실험에서 나온 것이 아니므로, 교육을 더 받은 사람과 덜 받은 사람을 비교할 수 있는지 알 수 없습니다. 한 걸음 더 나아가, 세상이 돌아가는 방식을 생각해 보면 둘은 비교할 수 없다고 거의 확신할 수 있습니다. 예를 들어 교육을 더 오래 받은 사람은 부모가 더 부유할 가능성이 높고, 교육 연수가 늘수록 임금이 오르는 것처럼 보이는 것은 집안의 재산이 교육 연수와 연관되어 있다는 사실이 반영된 것일 뿐이라고 주장할 수 있습니다. 이를 수식으로 쓰면 $E[Y_0|T=0] < E[Y_0|T=1]$입니다. 교육을 더 받은 사람은 그만큼 교육을 받지 않았더라도 어차피 소득이 더 높았으리라는 뜻입니다. 교육을 정말 비관적으로 보는 사람이라면, 교육이 사람들을 노동시장 밖에 붙잡아 두어 경력을 쌓지 못하게 하므로 오히려 임금을 *낮춘다*고 주장할 수도 있습니다.\n", "\n", "다행히 데이터에는 다른 변수가 많이 있습니다. 부모의 교육 연수 `meduc`, `feduc`, 본인의 `IQ` 점수, 경력 연수 `exper`, 현재 회사 근속 연수 `tenure`를 볼 수 있습니다. 결혼 여부와 흑인 여부를 나타내는 더미변수도 있습니다." ] diff --git a/causal-inference-for-the-brave-and-true/06-Grouped-and-Dummy-Regression.ipynb b/causal-inference-for-the-brave-and-true/06-Grouped-and-Dummy-Regression.ipynb index d147a67..a91c6d7 100644 --- a/causal-inference-for-the-brave-and-true/06-Grouped-and-Dummy-Regression.ipynb +++ b/causal-inference-for-the-brave-and-true/06-Grouped-and-Dummy-Regression.ipynb @@ -407,7 +407,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "그룹화한 모델의 `educ` 매개변수 추정값이 그룹화하지 않은 데이터의 추정값과 아주 가깝다는 점에 주목하세요(사실 이번 경우에는 똑같습니다). 또한 데이터 포인트가 10개뿐인데도 통계적으로 유의한 계수를 얻었습니다. 점의 개수는 줄었지만 그룹화하면서 분산도 크게 줄었기 때문입니다. 표준오차가 조금 작아지고 t 통계량이 조금 커진 점도 보세요. 분산에 대한 정보 일부를 잃었으니 더 보수적으로 접근해야 하기 때문입니다. 데이터를 그룹화하고 나면 각 그룹 안의 분산이 얼마나 큰지 알 수 없습니다. 위 결과를 아래의 가중치 없는 모델 결과와 비교해 보세요." + "그룹화한 모델의 `educ` 매개변수 추정값이 그룹화하지 않은 데이터의 추정값과 아주 가깝다는 점에 주목하세요(사실 이번 경우에는 똑같습니다). 또한 데이터 포인트가 10개뿐인데도 통계적으로 유의한 계수를 얻었습니다. 점의 개수는 줄었지만 그룹화하면서 분산도 크게 줄었기 때문입니다. 표준오차가 조금 작아지고 t 통계량이 조금 커진 점도 보세요. 분산에 대한 정보 일부를 잃었으니 더 보수적으로 접근해야 하기 때문입니다. 데이터를 그룹화하고 나면 각 그룹 안의 분산이 얼마나 큰지 알 수 없습니다. 위 결과를 아래의 가중치 없는 모델 결과와 비교해 보세요.\n", + "\n", + "> 옮긴이: 원문 설명과 달리, 정보를 잃어 더 보수적이어야 한다면 표준오차는 작아지는 것이 아니라 커져야 합니다. 실제 출력에서는 그룹화한 가중 회귀의 표준오차(0.006)가 그룹화하지 않은 회귀(0.007)보다 조금 작으니, 원문의 설명과 출력이 맞지 않습니다. 본문은 원문 그대로 옮겼습니다." ] }, { @@ -741,6 +743,8 @@ "\\beta = [Y_i|T_i=1] - [Y_i|T_i=0]\n", "$\n", "\n", + "> 옮긴이: 위 식은 원문 그대로이며, 각 항 앞에 기댓값 기호 E가 빠져 있습니다. 즉 β는 T=1일 때 Y의 기댓값에서 T=0일 때 Y의 기댓값을 뺀 값입니다.\n", + "\n", "변수를 더 넣으면 더미 계수는 **조건부** 평균 차이가 됩니다. 예를 들어 앞의 모델에 IQ를 추가한다고 해 봅시다. 이제 더미 계수는 **IQ를 고정했을 때** 12학년을 졸업하면 임금이 얼마나 오를지를 알려 줍니다. 예측값을 그려 보면 평행한 직선 두 개가 보입니다. 한 직선에서 다른 직선으로 뛰어오르는 폭이 12학년을 마쳤을 때 기대할 수 있는 증가분입니다. 두 직선은 효과가 일정하다는 것도 보여 줍니다. IQ가 얼마든 12학년 졸업으로 얻는 이득은 누구에게나 같습니다." ] }, diff --git a/causal-inference-for-the-brave-and-true/07-Beyond-Confounders.ipynb b/causal-inference-for-the-brave-and-true/07-Beyond-Confounders.ipynb index c595166..38ffa59 100644 --- a/causal-inference-for-the-brave-and-true/07-Beyond-Confounders.ipynb +++ b/causal-inference-for-the-brave-and-true/07-Beyond-Confounders.ipynb @@ -9,7 +9,7 @@ "\n", "## 좋은 통제변수\n", "\n", - "회귀 모델에 통제변수(control)를 추가하면 인과효과를 식별하는 데 도움이 된다는 것을 앞에서 살펴봤습니다. 통제변수가 교란 요인(confounder)이라면 모델에 넣는 것은 있으면 좋은 정도가 아니라 반드시 필요한 일입니다. 이를 본 부주의한 사람은 측정할 수 있는 것이라면 무엇이든 모델에 집어넣으려 하기 쉽습니다. 빅데이터 시대인 요즘에는 그 수가 1000개를 훌쩍 넘기도 합니다. 그런데 알고 보면 이렇게 하는 것은 불필요할 뿐 아니라 인과효과 식별(identification)을 오히려 해칠 수 있습니다. 이제 교란 요인이 아닌 통제변수로 눈을 돌려 보겠습니다. 먼저 좋은 통제변수를 살펴본 다음, 해로운 통제변수를 자세히 알아보겠습니다.\n", + "회귀 모델에 통제변수(control)를 추가하면 인과효과를 식별하는 데 도움이 된다는 것을 앞에서 살펴봤습니다. 통제변수가 교란 요인(confounder)이라면 모델에 넣는 것은 있으면 좋은 정도가 아니라 반드시 필요한 일입니다. 이를 본 부주의한 사람은 측정할 수 있는 것이라면 무엇이든 모델에 집어넣으려 하기 쉽습니다. 빅데이터 시대인 요즘에는 그런 변수가 1000개를 훌쩍 넘기도 합니다. 그런데 알고 보면 이렇게 하는 것은 불필요할 뿐 아니라 인과효과 식별(identification)을 오히려 해칠 수 있습니다. 이제 교란 요인이 아닌 통제변수로 눈을 돌려 보겠습니다. 먼저 좋은 통제변수를 살펴본 다음, 해로운 통제변수를 자세히 알아보겠습니다.\n", "\n", "문제를 실감 나게 이해하기 위해 예를 하나 들어 보겠습니다. 여러분이 한 핀테크 회사의 채권 추심팀에서 일하는 데이터 과학자라고 해 봅시다. 이번 과제는 연체 고객에게 채무 조정 협상을 제안하는 이메일을 보내면 어떤 효과가 있는지 알아내는 것입니다. 결과변수는 연체 고객의 상환액입니다.\n", "\n", @@ -279,7 +279,9 @@ "\n", "![img](./data/img/beyond-conf/y-pred.png)\n", "\n", - "이를 확인하기 위해 회귀를 두 단계로 나누는 부분 제거(partialling out) 방법을 써 보겠습니다. 먼저 처치인 이메일과 결과인 상환액을 각각 추가 통제변수인 신용 한도와 위험 점수에 회귀합니다. 그다음, 1단계에서 얻은 두 잔차를 가지고 상환액의 잔차를 이메일의 잔차에 회귀합니다(순전히 설명을 위한 과정이며, 실무에서는 이렇게 번거롭게 할 필요가 없습니다)." + "이를 확인하기 위해 회귀를 두 단계로 나누는 부분 제거(partialling out) 방법을 써 보겠습니다. 먼저 처치인 이메일과 결과인 상환액을 각각 추가 통제변수인 신용 한도와 위험 점수에 회귀합니다. 그다음, 1단계에서 얻은 두 잔차를 가지고 상환액의 잔차를 이메일의 잔차에 회귀합니다(순전히 설명을 위한 과정이며, 실무에서는 이렇게 번거롭게 할 필요가 없습니다).\n", + "\n", + "> 옮긴이: 원문은 '처치의 잔차를 상환액의 잔차에 회귀한다'고 썼지만, 아래 코드(`res_payments ~ res_email`)처럼 상환액의 잔차를 이메일의 잔차에 회귀하는 것이 맞으므로 그렇게 옮겼습니다." ] }, { @@ -1534,7 +1536,7 @@ "email -> opened -> agreement -> payment \n", "$\n", "\n", - "위험 점수와 신용 한도에 따라 합의할 성향도 다를 것이므로, 둘 다 합의의 원인으로 표시하겠습니다. 이메일과 합의의 관계를 보면, 어떤 사람은 이메일 제목만 읽고도 합의할 가능성이 커진다고 주장할 수도 있습니다. 요점은 이메일이 열람을 거치지 않고도 합의를 일으킬 수 있다는 것입니다.\n", + "위험 점수와 신용 한도에 따라 합의할 성향도 다를 것이므로, 둘 다 합의의 원인으로 표시하겠습니다. 이메일과 합의의 관계를 보면, 이메일 제목만 읽고도 합의할 가능성이 커지는 사람이 있다고 주장할 수도 있습니다. 요점은 이메일이 열람을 거치지 않고도 합의를 일으킬 수 있다는 것입니다.\n", "\n", "이 그래프에서 눈에 띄는 점은 열람과 합의가 모두 이메일에서 상환액으로 가는 인과 경로 위에 있다는 것입니다. 따라서 회귀분석으로 이 변수들을 통제하면 \"`opened`와 `agreement`를 고정했을 때의 이메일 효과\"를 구하는 셈이 됩니다. 그런데 두 변수 모두 이메일 인과효과의 일부이므로 고정해서는 안 됩니다. 오히려 이메일이 상환액을 늘리는 이유가 바로 합의율을 높이기 때문이라고 볼 수도 있습니다. 이 변수들을 고정하면 이메일 변수에서 진짜 효과의 일부를 지워 버리게 됩니다. \n", "\n", diff --git a/causal-inference-for-the-brave-and-true/08-Instrumental-Variables.ipynb b/causal-inference-for-the-brave-and-true/08-Instrumental-Variables.ipynb index 1ab97cc..e88b6c3 100644 --- a/causal-inference-for-the-brave-and-true/08-Instrumental-Variables.ipynb +++ b/causal-inference-for-the-brave-and-true/08-Instrumental-Variables.ipynb @@ -282,7 +282,7 @@ "\n", "## 출생 분기와 교육이 임금에 미치는 효과\n", "\n", - "지금까지는 도구변수를 처치를 통해서만 결과에 영향을 주는 기적 같은 성질을 지닌 마법의 변수 $Z$로 다뤄 왔습니다. 솔직히 말해 좋은 도구변수는 너무 찾기 어려워서 기적이라고 불러도 과언이 아닙니다. 마음 약한 사람이 할 일은 아니라고만 해 두죠. 소문에 따르면 시카고학파의 잘나가는 친구들은 술집에서 자기가 이런저런 도구변수를 어떻게 생각해 냈는지 떠든다고 합니다.\n", + "지금까지는 도구변수를 처치를 통해서만 결과에 영향을 주는 기적 같은 성질을 지닌 마법의 변수 $Z$로 다뤄 왔습니다. 솔직히 말해 좋은 도구변수는 너무 찾기 어려워서 기적이라고 불러도 과언이 아닙니다. 마음 약한 사람이 할 일은 아니라고만 해 두겠습니다. 소문에 따르면 시카고학파의 잘나가는 친구들은 술집에서 자기가 이런저런 도구변수를 어떻게 생각해 냈는지 떠든다고 합니다.\n", "\n", "![img](./data/img/iv/good-iv.png)\n", "\n", @@ -808,7 +808,9 @@ "\n", "$\n", "\\mathrm{ATE}_{IV} = \\dfrac{\\text{Reduced Form}}{\\text{1st Stage}} \n", - "$" + "$\n", + "\n", + "> 옮긴이: 원문은 '편향 없는'이라고 썼지만, 뒤의 '약한 도구변수' 절에서 보듯 도구변수 추정량은 일치성이 있을 뿐 유한 표본에서는 편향될 수 있습니다." ] }, { @@ -1281,7 +1283,7 @@ "\n", "1. 도구변수를 손으로 계산하는 것. 앞서 보았듯이 손으로 계산하면 매개변수 추정값은 맞더라도 표준오차가 틀립니다. 완전히 엉뚱한 값이 나오지는 않겠지만, 소프트웨어를 쓰면 올바른 표준오차를 얻을 수 있는데 굳이 손으로 할 이유가 있을까요?\n", "\n", - "2. 1단계에 OLS가 아닌 다른 방법을 쓰는 것. 많은 데이터 과학자가 도구변수를 접하고는 더 잘할 수 있다고 생각합니다. 예를 들어 처치가 더미변수인 것을 보고 1단계를 로지스틱 회귀로 바꾸려고 합니다. 더미변수를 예측하는 거니까 그게 맞지 않느냐는 거죠. 문제는 이것이 명백히 틀렸다는 것입니다. 도구변수의 일치성은 잔차의 직교성이라는, OLS만 줄 수 있는 성질에 기대고 있습니다. 그래서 1단계에 OLS가 아닌 방법을 쓰면 편향된 결과가 나옵니다. (참고로 도구변수에 머신러닝을 쓰는 최신 기법도 있지만, 그 결과는 좋게 봐줘도 미심쩍은 수준입니다.)\n", + "2. 1단계에 OLS가 아닌 다른 방법을 쓰는 것. 많은 데이터 과학자가 도구변수를 접하고는 더 잘할 수 있다고 생각합니다. 예를 들어 처치가 더미변수인 것을 보고 1단계를 로지스틱 회귀로 바꾸려고 합니다. 더미변수를 예측하는 거니까 그게 맞지 않느냐는 것입니다. 문제는 이것이 명백히 틀렸다는 것입니다. 도구변수의 일치성은 잔차의 직교성이라는, OLS만 줄 수 있는 성질에 기대고 있습니다. 그래서 1단계에 OLS가 아닌 방법을 쓰면 편향된 결과가 나옵니다. (참고로 도구변수에 머신러닝을 쓰는 최신 기법도 있지만, 그 결과는 좋게 봐줘도 미심쩍은 수준입니다.)\n", "\n", "## 핵심 요약\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/09-Non-Compliance-and-LATE.ipynb b/causal-inference-for-the-brave-and-true/09-Non-Compliance-and-LATE.ipynb index 596fb95..51cc7cb 100644 --- a/causal-inference-for-the-brave-and-true/09-Non-Compliance-and-LATE.ipynb +++ b/causal-inference-for-the-brave-and-true/09-Non-Compliance-and-LATE.ipynb @@ -19,7 +19,7 @@ "\n", "![img](./data/img/late/defiers.png)\n", "\n", - "현대의 도구변수 분석은 도구를 순응이 완벽하지 않은 준실험 설계로 다룹니다. 그렇게 함으로써 내적으로 타당한 인과효과와 외적으로 타당한 인과효과를 구분합니다. 다시 짚어 보면, 내적으로 타당한 효과는 식별할 수 있는 효과입니다. 그 특정한 상황, 그 특정한 데이터 안에서 타당합니다. 도구변수 분석에서는 도구가 처치를 바꾸는 사람들에 대한 처치효과가 여기에 해당합니다. 반면 외적 타당성은 그 인과효과의 예측력과 관련이 있습니다. 이 표본에서 찾은 효과를 다른 모집단에도 일반화할 수 있느냐는 질문입니다. 예를 들어, 기부할 유인을 주었을 때 사람들이 너그럽게 행동하는지 알아보려고 여러분의 대학교에서 RCT를 했다고 해 봅시다. 실험은 잘 설계했지만 참가자로 경제학과 학생들만 불렀습니다. 그랬더니 모두 이기적인 얌체라는 결과가 나왔습니다. 내적으로는 타당한 결론입니다. 이 데이터 포인트들에 대해서는 맞는 말입니다. 하지만 이 실험으로부터 인류가 이기적이라고 추론할 수 있을까요? 그렇다고 보기는 어렵습니다. 그래서 이 실험에 그 결과를 일반화할 만한 외적 타당성이 있는지 의문을 품게 됩니다. 아무튼 다시 도구변수로 돌아가겠습니다.\n", + "현대의 도구변수 분석은 도구를 순응이 완벽하지 않은 준실험 설계로 다룹니다. 그렇게 함으로써 내적으로 타당한 인과효과와 외적으로 타당한 인과효과를 구분합니다. 다시 짚어 보면, 내적으로 타당한 효과는 식별할 수 있는 효과입니다. 그 특정한 상황, 그 특정한 데이터 안에서 타당합니다. 도구변수 분석에서는 도구가 처치를 바꾸는 사람들에 대한 처치효과가 여기에 해당합니다. 반면 외적 타당성은 그 인과효과의 예측력과 관련이 있습니다. 이 표본에서 찾은 효과를 다른 모집단에도 일반화할 수 있느냐는 질문입니다. 예를 들어, 기부할 유인을 주었을 때 사람들이 너그럽게 행동하는지 알아보려고 여러분의 대학교에서 무작위 통제 실험(RCT)을 했다고 해 봅시다. 실험은 잘 설계했지만 참가자로 경제학과 학생들만 불렀습니다. 그랬더니 모두 이기적인 얌체라는 결과가 나왔습니다. 내적으로는 타당한 결론입니다. 이 데이터 포인트들에 대해서는 맞는 말입니다. 하지만 이 실험으로부터 인류가 이기적이라고 추론할 수 있을까요? 그렇다고 보기는 어렵습니다. 그래서 이 실험에 그 결과를 일반화할 만한 외적 타당성이 있는지 의문을 품게 됩니다. 아무튼 다시 도구변수로 돌아가겠습니다.\n", "\n", "좀 더 구체적으로, 인앱 구매로 측정하는 사용자 참여를 높이고 싶은 상황을 생각해 봅시다. 한 가지 방법은 마케팅 부서에 사용자 참여를 끌어올릴 푸시 알림을 만들어 달라고 요청하는 것입니다. 마케팅 부서는 멋진 디자인과 아주 화려한 사용자 인터랙션을 갖춘 푸시를 만들어 옵니다. 이 푸시를 가지고 무작위 실험을 설계합니다. 고객 10000명을 무작위로 뽑고, 각 고객에게 50% 확률로 푸시를 배정합니다. 그런데 테스트를 실행해 보니, 푸시를 받도록 배정된 고객 중 일부가 푸시를 받지 못하고 있습니다. 엔지니어에게 물어보니, 아마 그 고객들의 휴대전화가 오래되어서 마케팅팀이 디자인한 형태의 푸시를 지원하지 않기 때문일 거라고 합니다.\n", "\n", @@ -275,7 +275,7 @@ "\\mathrm{ATE} = E[Y | \\mathrm{push}=1] - E[Y | \\mathrm{push}=0]\n", "$\n", "\n", - "이번에도 이 값이 편향되었는지, 즉 $E[Y_0|\\mathrm{push}=0] = E[Y_0|\\mathrm{push}=1]$인지 따져 봐야 합니다. 위 인과 그래프만 봐도 그렇지 않다는 것을 알 수 있습니다. 측정되지 않은 교란 요인인 소득이 도사리고 있으니, 분명 일을 망쳐 놓을 겁니다. 앞서 말했듯이 이 사례에서 푸시 전달이 실패하는 원인은 고객의 휴대전화가 오래되었기 때문입니다. 그렇다면 아마도 $E[Y_0|\\mathrm{push}=0] < E[Y_0|\\mathrm{push}=1]$일 것입니다. 돈이 적은 고객일수록 오래된 휴대전화를 가지고 있어서 $\\mathrm{push}=0$이 되기 쉽고, 동시에 잠재적 인앱 구매액 $Y_0$도 낮을 것이기 때문입니다.\n", + "이번에도 이 값에 편향이 없는지, 즉 $E[Y_0|\\mathrm{push}=0] = E[Y_0|\\mathrm{push}=1]$인지 따져 봐야 합니다. 위 인과 그래프만 봐도 그렇지 않다는 것을 알 수 있습니다. 측정되지 않은 교란 요인인 소득이 도사리고 있으니, 분명 일을 망쳐 놓을 겁니다. 앞서 말했듯이 이 사례에서 푸시 전달이 실패하는 원인은 고객의 휴대전화가 오래되었기 때문입니다. 그렇다면 아마도 $E[Y_0|\\mathrm{push}=0] < E[Y_0|\\mathrm{push}=1]$일 것입니다. 돈이 적은 고객일수록 오래된 휴대전화를 가지고 있어서 $\\mathrm{push}=0$이 되기 쉽고, 동시에 잠재적 인앱 구매액 $Y_0$도 낮을 것이기 때문입니다.\n", "\n", "아쉽게도 배정된 처치로도, 실제로 받은 처치로도 ATE를 추정할 수 없습니다. 하지만 다행히 쓸 수 있는 도구가 있습니다. 바로 도구변수입니다. 여기서 배정된 처치는 처치에 대한 완벽한 도구입니다. 무작위 배정이나 다름없고, 오직 처치를 거쳐서만 인앱 구매에 영향을 줍니다.\n", "\n", @@ -311,7 +311,7 @@ "\n", "2. $Y_i(1, 0)=Y_i(1, 1)=Y_{i1}$ 그리고 $Y_i(0, 0)=Y_i(0, 1)=Y_{i0}$. 배제 제약입니다. 처치를 받은 경우의 잠재적 결과를 보면, 도구 값이 어느 쪽이든 똑같다는 뜻입니다. 도구는 잠재적 결과에 영향을 주지 않는다는 것, 곧 오직 처치를 거쳐서만 결과에 영향을 준다는 것입니다.\n", "\n", - "3. $E[T_{1i}-T_{0i}] \\neq 0$. 1단계가 존재한다는 가정입니다. 1단계의 잠재적 결과, 즉 잠재적 처치가 서로 같지 않다는 뜻입니다. 달리 말하면 도구가 실제로 처치에 영향을 준다는 것입니다.\n", + "3. $E[T_{1i}-T_{0i}] \\neq 0$. 1단계가 존재한다는 가정입니다. 1단계의 잠재적 결과, 즉 잠재적 처치가 서로 같지 **않다**는 뜻입니다. 달리 말하면 도구가 실제로 처치에 영향을 준다는 것입니다.\n", "\n", "4. $T_{i1} \\geq T_{i0}$. 단조성(monotonicity) 가정입니다. 모든 사람의 도구를 켰을 때의 처치 수준이 모든 사람의 도구를 껐을 때보다 같거나 높다는 뜻입니다.\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/10-Matching.ipynb b/causal-inference-for-the-brave-and-true/10-Matching.ipynb index 5e9c387..d1afb8f 100644 --- a/causal-inference-for-the-brave-and-true/10-Matching.ipynb +++ b/causal-inference-for-the-brave-and-true/10-Matching.ipynb @@ -1123,7 +1123,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "이제 매칭 자체로 넘어가 봅시다. 매칭 함수를 직접 짜는 대신 [Sklearn](https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsRegressor.html)의 K 최근접 이웃 알고리즘을 쓰겠습니다. 이 알고리즘은 추정용 세트, 즉 훈련 셋에서 가장 가까운 데이터 포인트를 찾아 예측합니다.\n", + "이제 매칭 자체로 넘어가 봅시다. 매칭 함수를 직접 짜는 대신 [Sklearn](https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsRegressor.html)의 K 최근접 이웃 알고리즘을 쓰겠습니다. 이 알고리즘은 추정용 데이터, 즉 훈련 셋에서 가장 가까운 데이터 포인트를 찾아 예측합니다.\n", "\n", "매칭에는 이런 모델이 2개 필요합니다. 하나인 `mt0`는 대조군 데이터를 저장해 두었다가 요청하면 대조군에서 짝을 찾습니다. 다른 하나인 `mt1`은 실험군 데이터를 저장해 두었다가 요청하면 실험군에서 짝을 찾습니다. 이렇게 적합한 뒤 KNN 모델로 예측하면, 그 예측값이 바로 짝이 됩니다." ] @@ -1474,7 +1474,7 @@ "\n", "둘째, 매칭은 비모수 추정량입니다. 선형성이나 어떤 모수적 모델도 가정하지 않습니다. 그래서 선형회귀보다 유연하고, 선형회귀가 통하지 않는 상황, 즉 비선형성이 아주 강한 상황에서도 쓸 수 있습니다.\n", "\n", - "그렇다면 매칭만 써야 할까요? 음, 어려운 질문입니다. 알베르토 아바디(Alberto Abadie)는 그래야 한다고 주장합니다. 더 유연하고, 코드만 갖춰 두면 실행하기도 똑같이 쉽다는 것이죠. 저는 완전히 동의하지는 않습니다. 우선 아바디는 이 추정량을 연구하고 발전시키는 데 많은 시간을 쏟았으니(그렇습니다, 매칭을 지금의 모습으로 만든 학자 중 한 명이 바로 그입니다) 이 방법에 개인적인 이해관계가 있을 수밖에 없습니다. 다음으로, 선형회귀에는 매칭에서 찾아볼 수 없는 단순함이 있습니다. \"다른 모든 것을 일정하게 유지한다\"는 편미분의 수학은 매칭보다 선형회귀로 훨씬 쉽게 이해할 수 있습니다. 하지만 이건 제 취향일 뿐입니다. 솔직히 이 질문에 명확한 답은 없습니다. 아무튼 예제로 돌아갑시다.\n", + "그렇다면 매칭만 써야 할까요? 음, 어려운 질문입니다. 알베르토 아바디(Alberto Abadie)는 그래야 한다고 주장합니다. 더 유연하고, 코드만 갖춰 두면 실행하기도 똑같이 쉽다는 것입니다. 저는 완전히 동의하지는 않습니다. 우선 아바디는 이 추정량을 연구하고 발전시키는 데 많은 시간을 쏟았으니(그렇습니다, 매칭을 지금의 모습으로 만든 학자 중 한 명이 바로 그입니다) 이 방법에 개인적인 이해관계가 있을 수밖에 없습니다. 다음으로, 선형회귀에는 매칭에서 찾아볼 수 없는 단순함이 있습니다. \"다른 모든 것을 일정하게 유지한다\"는 편미분의 수학은 매칭보다 선형회귀로 훨씬 쉽게 이해할 수 있습니다. 하지만 이건 제 취향일 뿐입니다. 솔직히 이 질문에 명확한 답은 없습니다. 아무튼 예제로 돌아갑시다.\n", "\n", "편향 보정 공식을 적용하면 ATE 추정값은 다음과 같습니다." ] diff --git a/causal-inference-for-the-brave-and-true/11-Propensity-Score.ipynb b/causal-inference-for-the-brave-and-true/11-Propensity-Score.ipynb index 1d0835d..f152282 100644 --- a/causal-inference-for-the-brave-and-true/11-Propensity-Score.ipynb +++ b/causal-inference-for-the-brave-and-true/11-Propensity-Score.ipynb @@ -447,7 +447,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "e(x)가 무엇인지 안다면, T가 어떻게 될지 알아내는 데 X가 더 알려 줄 정보는 없습니다. 즉, e(x)를 통제하는 것은 X를 직접 통제하는 것과 같은 효과를 냅니다. 마인드셋 프로그램에 대입해 생각해 봅시다. 처음에는 실험군과 대조군을 비교할 수 없습니다. 야심이 큰 사람일수록 처치를 받을 가능성도, 인생에서 더 많이 성취할 가능성도 높기 때문입니다. 하지만 실험군에서 한 명, 대조군에서 한 명을 뽑되 두 사람의 처치 받을 확률이 같다면 둘은 비교할 수 있습니다. 생각해 보세요. 두 사람의 처치 받을 확률이 정확히 같다면, 한 사람은 처치를 받고 다른 사람은 받지 않은 이유는 순전히 우연뿐입니다. 성향점수를 고정하면 데이터가 무작위 배정이나 다름없어 보이게 됩니다.\n", + "e(x)가 무엇인지 안다면, T가 어떻게 될지 알아내는 데 X가 더 알려 줄 정보는 없습니다. 즉, e(x)를 통제하는 것은 X를 직접 통제하는 것과 같은 효과를 냅니다. 마인드셋 프로그램에 대입해 생각해 봅시다. 처음에는 실험군과 대조군을 비교할 수 없습니다. 야심이 큰 사람일수록 처치를 받을 가능성도, 인생에서 더 많이 성취할 가능성도 높기 때문입니다. 하지만 실험군에서 한 명, 대조군에서 한 명을 뽑되 두 사람의 처치받을 확률이 같다면 둘은 비교할 수 있습니다. 생각해 보세요. 두 사람의 처치받을 확률이 정확히 같다면, 한 사람은 처치를 받고 다른 사람은 받지 않은 이유는 순전히 우연뿐입니다. 성향점수를 고정하면 데이터가 무작위 배정이나 다름없어 보이게 됩니다.\n", "\n", "직관을 얻었으니 이제 수학적 증명을 살펴봅시다. 보이려는 것은 $(Y_1, Y_0) \\perp T | e(x)$가 다음 식과 같다는 것입니다.\n", "\n", @@ -481,7 +481,7 @@ "E[Y|X,T=1]-E[Y|X,T=0] = E\\bigg[\\dfrac{Y}{e(x)}|X,T=1\\bigg]P(T) - E\\bigg[\\dfrac{Y}{(1-e(x))}|X,T=0\\bigg](1-P(T))\n", "$\n", "\n", - "이 식을 더 단순하게 만들 수도 있지만, 성향점수가 무슨 일을 하는지 직관을 얻기 좋으니 일단 이 형태로 보겠습니다. 첫 번째 항은 $Y_1$을 추정합니다. 처치를 받은 사람을 모두 모아 처치 확률의 역수로 가중치를 줍니다. 그러면 처치 받을 확률이 아주 낮은 사람이 높은 가중치를 받습니다. 그럴듯하지 않나요? 처치 받을 확률이 낮은 사람은 대조군과 닮았습니다. 그런데 이 사람은 처치를 받았습니다. 흥미로운 대상임이 틀림없습니다. 대조군처럼 보이는 실험군이니 높은 가중치를 줍니다. 이렇게 하면 원래 데이터와 크기는 같지만 모두가 처치를 받은 모집단이 만들어집니다. 같은 논리로 두 번째 항은 대조군을 보면서 실험군처럼 보이는 사람에게 높은 가중치를 줍니다. 각 대상에 그 대상이 받은 처치의 역확률로 가중치를 주기 때문에, 이 추정량을 처치 역확률 가중치(Inverse Probability of Treatment Weighting, IPTW)라고 부릅니다.\n", + "이 식을 더 단순하게 만들 수도 있지만, 성향점수가 무슨 일을 하는지 직관을 얻기 좋으니 일단 이 형태로 보겠습니다. 첫 번째 항은 $Y_1$을 추정합니다. 처치를 받은 사람을 모두 모아 처치 확률의 역수로 가중치를 줍니다. 그러면 처치받을 확률이 아주 낮은 사람이 높은 가중치를 받습니다. 그럴듯하지 않나요? 처치받을 확률이 낮은 사람은 대조군과 닮았습니다. 그런데 이 사람은 처치를 받았습니다. 흥미로운 대상임이 틀림없습니다. 대조군처럼 보이는 실험군이니 높은 가중치를 줍니다. 이렇게 하면 원래 데이터와 크기는 같지만 모두가 처치를 받은 모집단이 만들어집니다. 같은 논리로 두 번째 항은 대조군을 보면서 실험군처럼 보이는 사람에게 높은 가중치를 줍니다. 각 대상에 그 대상이 받은 처치의 역확률로 가중치를 주기 때문에, 이 추정량을 처치 역확률 가중치(Inverse Probability of Treatment Weighting, IPTW)라고 부릅니다.\n", "\n", "이 가중치가 하는 일을 그림으로 보면 다음과 같습니다.\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/12-Doubly-Robust-Estimation.ipynb b/causal-inference-for-the-brave-and-true/12-Doubly-Robust-Estimation.ipynb index 691f6b8..e61207b 100644 --- a/causal-inference-for-the-brave-and-true/12-Doubly-Robust-Estimation.ipynb +++ b/causal-inference-for-the-brave-and-true/12-Doubly-Robust-Estimation.ipynb @@ -690,7 +690,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "다시 한번, 조건부 평균 모델만 엉망으로 만들었을 때도 ATE는 조금 달라질 뿐입니다. 이 정도면 이중 강건 추정의 위력이 충분히 와닿았기를 바랍니다. 이런 마법이 일어나는 이유는 인과추론에서 인과 추정값의 편향을 없애는 방법이 두 가지이기 때문입니다. 처치 메커니즘을 모델링하거나 결과 메커니즘을 모델링하는 것이죠. 둘 중 하나만 맞으면 됩니다.\n", + "다시 한번, 조건부 평균 모델만 엉망으로 만들었을 때도 ATE는 조금 달라질 뿐입니다. 이 정도면 이중 강건 추정의 위력이 충분히 와닿았기를 바랍니다. 이런 마법이 일어나는 이유는 인과추론에서 인과 추정값의 편향을 없애는 방법이 두 가지이기 때문입니다. 처치 메커니즘을 모델링하거나 결과 메커니즘을 모델링하는 것입니다. 둘 중 하나만 맞으면 됩니다.\n", "\n", "다만 한 가지 주의할 점이 있습니다. 실무에서는 둘 중 어느 쪽도 정확하게 모델링하기가 매우 어렵습니다. 실제로는 성향점수 모델도 결과 모델도 100% 맞지 않는 경우가 더 흔합니다. 둘 다 틀리되, 서로 다른 방식으로 틀립니다. 이럴 때는 단일 모델을 쓰는 편이 나은지 이중 강건 추정을 쓰는 편이 나은지 아직 명확하게 결론 나지 않았습니다 [\\[1\\]](https://www.stat.cmu.edu/~ryantibs/journalclub/kang_2007.pdf) [\\[2\\]](https://arxiv.org/pdf/0804.2969.pdf) [\\[3\\]](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2798744/). 저는 그래도 이중 강건 추정을 즐겨 씁니다. 적어도 맞힐 기회가 두 번은 생기니까요.\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/14-Panel-Data-and-Fixed-Effects.ipynb b/causal-inference-for-the-brave-and-true/14-Panel-Data-and-Fixed-Effects.ipynb index 6bf84c7..dc822f7 100644 --- a/causal-inference-for-the-brave-and-true/14-Panel-Data-and-Fixed-Effects.ipynb +++ b/causal-inference-for-the-brave-and-true/14-Panel-Data-and-Fixed-Effects.ipynb @@ -67,7 +67,7 @@ "Y_d \\perp D\n", "$$\n", " \n", - "즉, 결과가 높은 대상에 처치를 더 많이 주거나(이러면 효과 추정에 상향 편향이 생깁니다) 결과가 낮은 대상에 처치를 더 많이 주지(하향 편향이 생깁니다) 않는다는 뜻입니다. 덜 추상적으로, 예제에 대입해 보겠습니다. 마케팅 매니저가 이미 예금이 아주 많은 도시에만 광고판을 설치하기로 했다고 해 봅시다. 그러면 나중에 광고판을 설치한 도시에서 예금이 더 많이 나왔다며 자랑할 수 있겠죠. 마케팅 캠페인은 당연히 대성공이었다고요. 도덕적인 문제는 일단 제쳐 두더라도, 이것이 독립성 가정을 위반한다는 것은 알 수 있을 겁니다. $Y_0$가 높은 도시에 처치를 주고 있으니까요. 그리고 이 가정을 자연스럽게 확장한 것이 조건부 독립성 가정(conditional independence assumption)이라는 것도 기억해 두세요. 이 가정에서는 잠재적 결과가 처음에는 처치와 독립이 아니어도 괜찮지만, 교란 요인(confounder) $X$로 조건화하고 나면 독립이어야 합니다.\n", + "즉, 결과가 높은 대상에 처치를 더 많이 주거나(이러면 효과 추정에 상향 편향이 생깁니다) 결과가 낮은 대상에 처치를 더 많이 주지(하향 편향이 생깁니다) 않는다는 뜻입니다. 덜 추상적으로, 예제에 대입해 보겠습니다. 마케팅 매니저가 이미 예금이 아주 많은 도시에만 광고판을 설치하기로 했다고 해 봅시다. 그러면 나중에 광고판을 설치한 도시에서 예금이 더 많이 나왔으니 마케팅 캠페인은 당연히 대성공이었다고 자랑할 수 있습니다. 도덕적인 문제는 일단 제쳐 두더라도, 이것이 독립성 가정을 위반한다는 것은 알 수 있을 겁니다. $Y_0$가 높은 도시에 처치를 주고 있으니까요. 그리고 이 가정을 자연스럽게 확장한 것이 조건부 독립성 가정(conditional independence assumption)이라는 것도 기억해 두세요. 이 가정에서는 잠재적 결과가 처음에는 처치와 독립이 아니어도 괜찮지만, 교란 요인(confounder) $X$로 조건화하고 나면 독립이어야 합니다.\n", " \n", "$\n", "Y_d \\perp D | X\n", @@ -96,7 +96,7 @@ "(Y_0, Y_1) \\perp T | X\n", "$\n", " \n", - "말로 풀면, 이 방법들을 쓰려면 모든 교란 요인을 알고 있고 측정할 수 있어서, 그 교란 요인으로 조건화하면 처치를 무작위 배정이나 다름없게 만들 수 있어야 합니다. 큰 문제는 교란 요인을 아예 측정할 수 없을 때가 있다는 점입니다. 예를 들어 결혼이 남성의 소득에 미치는 영향을 알아내는, 노동경제학의 고전적인 문제를 생각해 봅시다. 기혼 남성이 미혼 남성보다 돈을 더 많이 번다는 것은 경제학에서 잘 알려진 사실입니다. 하지만 이 관계가 인과관계인지는 분명하지 않습니다. 교육 수준이 높은 남성일수록 결혼할 가능성도 높고 소득이 높은 직업을 가질 가능성도 높을 수 있습니다. 그렇다면 교육은 결혼이 소득에 미치는 효과의 교란 요인이 됩니다. 이런 교란 요인이라면 연구 대상자의 교육 수준을 측정해 회귀분석에서 통제하면 됩니다. 하지만 외모라는 또 다른 교란 요인이 있을 수 있습니다. 잘생긴 남성일수록 결혼할 가능성도 높고 보수가 높은 직업을 가질 가능성도 높을 수 있죠. 안타깝게도 외모는 지능처럼 제대로 측정하기 어려운 특성입니다.\n", + "말로 풀면, 이 방법들을 쓰려면 모든 교란 요인을 알고 있고 측정할 수 있어서, 그 교란 요인으로 조건화하면 처치를 무작위 배정이나 다름없게 만들 수 있어야 합니다. 큰 문제는 교란 요인을 아예 측정할 수 없을 때가 있다는 점입니다. 예를 들어 결혼이 남성의 소득에 미치는 영향을 알아내는, 노동경제학의 고전적인 문제를 생각해 봅시다. 기혼 남성이 미혼 남성보다 돈을 더 많이 번다는 것은 경제학에서 잘 알려진 사실입니다. 하지만 이 관계가 인과관계인지는 분명하지 않습니다. 교육 수준이 높은 남성일수록 결혼할 가능성도 높고 소득이 높은 직업을 가질 가능성도 높을 수 있습니다. 그렇다면 교육은 결혼이 소득에 미치는 효과의 교란 요인이 됩니다. 이런 교란 요인이라면 연구 대상자의 교육 수준을 측정해 회귀분석에서 통제하면 됩니다. 하지만 외모라는 또 다른 교란 요인이 있을 수 있습니다. 잘생긴 남성일수록 결혼할 가능성도 높고 보수가 높은 직업을 가질 가능성도 높을 수 있습니다. 안타깝게도 외모는 지능처럼 제대로 측정하기 어려운 특성입니다.\n", " \n", "측정되지 않은 교란 요인이 있으면 편향이 생기므로 난처한 상황에 놓입니다. 이 문제를 다루는 한 가지 방법은 앞에서 본 도구변수(instrumental variable)입니다. 하지만 좋은 도구변수를 찾기란 쉽지 않고 창의력도 많이 필요합니다. 그래서 여기서는 도구변수 대신 패널데이터의 구조를 활용해 보겠습니다.\n", " \n", @@ -377,6 +377,9 @@ "\n", "2. $\\ddot{Y}_{it}$를 $\\ddot{X}_{it}$에 회귀합니다.\n", "\n", + "> 옮긴이: 원문은 바로 위 문단에서 '개인 더미를 다른 변수들에 회귀한다'고 회귀 방향을 반대로 적었습니다. 고정효과 모델에서 더미는 설명변수이므로, 아래 추정 절차와 맞도록 '다른 변수들을 개인 더미에 회귀한다'로 옮겼습니다.\n", + "\n", + "\n", "\n", "이렇게 하면 관측되지 않은 $U_i$가 사라진다는 점에 주목하세요. $U_i$는 시간에 따라 일정하므로 $\\bar{U_i}=U_i$입니다. 다음과 같이 두 식으로 이루어진 연립방정식이 있을 때\n", "\n", @@ -865,7 +868,7 @@ "\n", "## 고정효과 시각화하기\n", "\n", - "고정효과모델이 어떻게 작동하는지 직관을 넓히기 위해 잠시 다른 예제로 넘어가 보겠습니다. 대형 테크 기업에서 일하면서 광고판 마케팅 캠페인이 인앱 구매에 미치는 효과를 추정하려 한다고 해 봅시다. 과거 데이터를 보니 마케팅 부서는 구매 수준이 낮은 도시일수록 광고판 설치에 돈을 더 많이 쓰는 경향이 있습니다. 말이 되죠? 매출이 치솟고 있다면 굳이 광고를 많이 할 필요가 없을 테니까요. 이 데이터로 회귀 모델을 돌리면 마케팅 비용이 클수록 인앱 구매가 줄어드는 것처럼 보입니다. 하지만 이는 마케팅 투자가 지출이 적은 지역에 쏠려 있기 때문일 뿐입니다." + "고정효과모델이 어떻게 작동하는지 직관을 넓히기 위해 잠시 다른 예제로 넘어가 보겠습니다. 대형 테크 기업에서 일하면서 광고판 마케팅 캠페인이 인앱 구매에 미치는 효과를 추정하려 한다고 해 봅시다. 과거 데이터를 보니 마케팅 부서는 구매 수준이 낮은 도시일수록 광고판 설치에 돈을 더 많이 쓰는 경향이 있습니다. 말이 되죠? 매출이 치솟고 있다면 굳이 광고를 많이 할 필요가 없을 테니까요. 이 데이터로 회귀 모델을 돌리면 마케팅 비용이 클수록 인앱 구매가 줄어드는 것처럼 보입니다. 하지만 이는 마케팅 투자가 소비가 적은 지역에 쏠려 있기 때문일 뿐입니다." ] }, { diff --git a/causal-inference-for-the-brave-and-true/15-Synthetic-Control.ipynb b/causal-inference-for-the-brave-and-true/15-Synthetic-Control.ipynb index 1bc9bab..01c2229 100644 --- a/causal-inference-for-the-brave-and-true/15-Synthetic-Control.ipynb +++ b/causal-inference-for-the-brave-and-true/15-Synthetic-Control.ipynb @@ -1236,7 +1236,9 @@ "PV=\\frac{1}{N}\\sum \\mathcal{1}\\{\\hat{\\tau}_{Calif} > \\hat{\\tau}_j\\}\n", "$\n", "\n", - "결과를 보면 2000년 캘리포니아의 처치효과는 -24.8로, 개입이 담배 소비를 거의 25갑 줄였다는 뜻입니다. 추정한 나머지 위약 효과 34개 가운데 캘리포니아에서 찾은 효과보다 큰 것은 단 하나뿐입니다. 따라서 p 값은 1/35가 됩니다." + "결과를 보면 2000년 캘리포니아의 처치효과는 -24.8로, 개입이 담배 소비를 거의 25갑 줄였다는 뜻입니다. 추정한 나머지 위약 효과 34개 가운데 캘리포니아에서 찾은 효과보다 큰 것은 단 하나뿐입니다. 따라서 p 값은 1/35가 됩니다.\n", + "\n", + "> 옮긴이: 여기서 '크다'는 절댓값 기준입니다. 효과가 음수이므로, 캘리포니아보다 담배 소비가 더 많이 줄어든(더 큰 음수인) 위약 효과가 하나뿐이라는 뜻입니다. 아래 코드도 캘리포니아보다 작은 효과의 비율로 p 값을 계산합니다." ] }, { diff --git a/causal-inference-for-the-brave-and-true/16-Regression-Discontinuity-Design.ipynb b/causal-inference-for-the-brave-and-true/16-Regression-Discontinuity-Design.ipynb index 29d7e28..8f05f3d 100644 --- a/causal-inference-for-the-brave-and-true/16-Regression-Discontinuity-Design.ipynb +++ b/causal-inference-for-the-brave-and-true/16-Regression-Discontinuity-Design.ipynb @@ -596,7 +596,7 @@ "\n", "교육이 소득에 미치는 효과를 두고 경제학에는 크게 두 가지 견해가 있습니다. 첫째는 널리 알려진 주장으로, 교육이 인적 자본을 늘려 생산성을 높이고, 그 결과 소득도 높인다는 것입니다. 이 관점에서 교육은 실제로 사람을 더 나은 방향으로 바꿉니다. 다른 견해는 교육이 단지 신호(signaling) 장치일 뿐이라는 것입니다. 교육은 온갖 어려운 시험과 학업 과제를 거치게 할 뿐이고, 이를 해내면 그 사람이 좋은 직원이라는 신호를 시장에 보냅니다. 이렇게 보면 교육은 사람을 더 생산적으로 만들지 않습니다. 그 사람이 원래 얼마나 생산적이었는지를 시장에 알려 줄 뿐입니다. 여기서 중요한 것은 졸업장입니다. 졸업장이 있으면 돈을 더 받습니다. 예전에는 졸업장을 양피지에 인쇄했기 때문에 이를 **양피지 효과**(sheepskin effect)라고 부릅니다.\n", "\n", - "이 가설을 검증하려고 [Clark과 Martorell](https://faculty.smu.edu/millimet/classes/eco7321/papers/clark%20martorell%202014.pdf)은 회귀 불연속을 사용해 12학년 졸업이 소득에 미치는 효과를 측정했습니다. 그러려면 그 기준을 넘는 학생은 졸업하고 넘지 못하는 학생은 졸업하지 못하는 배정변수를 찾아야 했습니다. 이들은 텍사스 교육 시스템에서 그런 데이터를 찾아냈습니다.\n", + "이 가설을 검증하려고 [Clark과 Martorell](https://faculty.smu.edu/millimet/classes/eco7321/papers/clark%20martorell%202014.pdf)은 회귀 불연속을 사용해 12학년 졸업이 소득에 미치는 효과를 측정했습니다. 그러려면 기준을 넘는 학생은 졸업하고 넘지 못하는 학생은 졸업하지 못하는 배정변수를 찾아야 했습니다. 이들은 텍사스 교육 시스템에서 그런 데이터를 찾아냈습니다.\n", "\n", "텍사스에서 졸업하려면 시험을 통과해야 합니다. 시험은 10학년부터 볼 수 있고 여러 번 응시할 수 있지만, 결국 12학년 말에는 마지막 기회인 시험을 치르게 됩니다. 아이디어는 이 마지막 기회 시험을 본 학생들의 데이터를 모아, 아슬아슬하게 떨어진 학생과 아슬아슬하게 붙은 학생을 비교하는 것이었습니다. 이 학생들은 인적 자본은 매우 비슷하지만 신호로 내세울 자격은 다릅니다. 간신히 붙은 학생들만 졸업장을 받기 때문입니다." ] 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 8a2e82c..68c6b81 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 @@ -298,7 +298,7 @@ "\n", "그래야 이메일에 가장 잘 반응할(CATE가 높은) 고객을 골라서 보낼 수 있습니다.\n", "\n", - "하지만 그 전에 데이터셋을 훈련 셋과 검증 셋으로 나누겠습니다. 한쪽 세트에서 $\\tau(x)_i$를 추정하고 다른 쪽 세트에서 그 추정값을 평가합니다." + "하지만 그 전에 데이터셋을 훈련 셋과 검증 셋으로 나누겠습니다. 한쪽 셋에서 $\\tau(x)_i$를 추정하고 다른 쪽 셋에서 그 추정값을 평가합니다." ] }, { @@ -326,7 +326,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "이제 방금 배운 목표 변환을 적용해 보겠습니다. 이메일은 (50 대 50은 아니지만) 무작위로 배정됐으므로 성향점수를 신경 쓸 필요가 없습니다. 성향점수는 처치 확률과 같은 상수입니다." + "이제 방금 배운 목표 변환(target transformation)을 적용해 보겠습니다. 이메일은 (50 대 50은 아니지만) 무작위로 배정됐으므로 성향점수를 신경 쓸 필요가 없습니다. 성향점수는 처치 확률과 같은 상수입니다." ] }, { 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 a9e43e5..e20a338 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 @@ -20,7 +20,7 @@ "![img](data/img/meta-learners/learned-new-move.png)\n", "\n", "메타러너(meta-learner)는 시중에 나와 있는 예측용 머신러닝 기법을 가져다가, 지금까지 다뤄 온 바로 그 문제, 즉 CATE 추정을 푸는 간단한 방법입니다. 이번에도 어느 하나가 최선은 아니며 저마다 약점이 있습니다.\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 cc92d21..3f92be4 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 @@ -201,7 +201,7 @@ " \n", "여기서 $\\pmb{\\beta_3}$는 각 요일 더미에 대응하는 매개변수 벡터입니다.\n", " \n", - "관심 있는 것은 처치효과인 $\\tau$ 하나뿐이라는 점에 주목하세요. 나머지 매개변수는 신경 쓰지 않으므로 장애모수(nuisance parameter)라고 부르겠습니다. 그런데 알고 보면 신경 쓰지 않는 매개변수라도 제대로 맞혀야 합니다. 그렇지 않으면 처치효과가 어긋나기 때문입니다. 좀 성가신 일이죠.\n", + "관심 있는 것은 처치효과인 $\\tau$ 하나뿐이라는 점에 주목하세요. 나머지 매개변수는 신경 쓰지 않으므로 장애모수(nuisance parameter)라고 부르겠습니다. 그런데 알고 보면 신경 쓰지 않는 매개변수라도 제대로 맞혀야 합니다. 그렇지 않으면 처치효과가 어긋나기 때문입니다. 좀 성가신 일입니다.\n", " \n", "예를 들어 곰곰이 생각해 보면 `temp`와 판매량의 관계는 선형이 아닐 가능성이 큽니다. 처음에는 기온이 오를수록 해변에 가서 아이스크림을 사 먹는 사람이 늘어나니 판매량이 증가합니다. 하지만 어느 순간 너무 더워지면 사람들은 집에 있는 편이 낫다고 판단합니다. 그때부터는 판매량이 줄어듭니다. `temp`와 판매량의 관계는 어딘가에서 정점을 찍은 뒤 감소할 것입니다. 즉, 위 모델은 아마 틀렸습니다. 다음처럼\n", " \n", @@ -848,7 +848,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "다음으로 비모수 버전의 누적 탄력성 곡선을 매개변수(선형) 버전의 이중/직교화 머신러닝에서 얻은 곡선과 나란히 그려 봅니다." + "다음으로 비모수 버전의 누적 탄력성 곡선을 모수적(선형) 버전의 이중/직교화 머신러닝에서 얻은 곡선과 나란히 그려 봅니다." ] }, { @@ -1073,7 +1073,7 @@ " \n", "즉, 비선형 처치효과를 새로운 처치 수준으로 외삽할 때는 각별히 조심해야 합니다. 그러지 않으면 수익성이 아주 나쁜 결정을 내릴 수 있습니다. 달리 말하면, 처치효과가 선형이 아닐 때는 비모수 이중/편향 제거 머신러닝조차 **반사실적 결과를 예측하는 데 애를 먹습니다**. 처치효과(TE)를 낮은 처치 수준에서 높은 처치 수준으로, 또는 그 반대로 선형 외삽하려 들기 때문입니다. 그리고 비선형성 때문에 그 외삽은 빗나가기 쉽습니다.\n", " \n", - "이를 해결할 마지막 아이디어가 하나 있습니다. 다만 이 아이디어는 지금까지 본 내용보다 훨씬 덜 과학적이라는 점을 염두에 두세요. 요약하면 직교화 절차를 거친 뒤 S 러너를 쓰는 것인데, 너무 앞서 나갔네요. 다음에서 자세히 보겠습니다.\n", + "이를 해결할 마지막 아이디어가 하나 있습니다. 다만 이 아이디어는 지금까지 본 내용보다 훨씬 덜 과학적이라는 점을 염두에 두세요. 요약하면 직교화 절차를 거친 뒤 S 러너를 쓰는 것인데, 이야기가 너무 앞서 나갔습니다. 다음에서 자세히 보겠습니다.\n", "\n", "![img](./data/img/debiased-ml/non-sci.png)\n", "\n", @@ -1372,7 +1372,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "인덱스 1인 날, 즉 분석단위 하나만 보여 주고 있다는 점에 주목하세요. 그날(분석단위)의 실제 가격, 즉 사실적 처치는 7이었습니다. 하지만 3부터 10까지 여러 반사실적 처치를 시뮬레이션했습니다. 이제 이 반사실적 가격을 모두 인과 모델에 넣으면, 모델이 시뮬레이션한 가격을 바탕으로 반사실적 판매량을 예측합니다.\n", + "인덱스 0인 날, 즉 분석단위 하나만 보여 주고 있다는 점에 주목하세요. 그날(분석단위)의 실제 가격, 즉 사실적 처치는 7이었습니다. 하지만 3부터 10까지 여러 반사실적 처치를 시뮬레이션했습니다. 이제 이 반사실적 가격을 모두 인과 모델에 넣으면, 모델이 시뮬레이션한 가격을 바탕으로 반사실적 판매량을 예측합니다.\n", " \n", "모델은 다음과 같은 형태이므로\n", " \n", @@ -1380,7 +1380,9 @@ "\\widehat{Price_i} = \\hat{\\tau}(X_i, \\tilde{T}_i)\n", "$\n", " \n", - "반사실 예측을 하기 전에 $\\tilde{T}_i$, 즉 가격의 잔차를 구해야 합니다. 이 잔차는 다음과 같이 구합니다. 먼저 처치 모델 전부로 예측합니다(훈련 단계에서 5-폴드 교차 예측을 썼다는 점을 떠올려 보세요). 그다음 다섯 모델의 예측을 평균해 예측값 하나로 만들고, 마지막으로 이 모델 앙상블로 예측한 가격에서 앞서 만든 반사실적 가격을 뺍니다." + "반사실 예측을 하기 전에 $\\tilde{T}_i$, 즉 가격의 잔차를 구해야 합니다. 이 잔차는 다음과 같이 구합니다. 먼저 처치 모델 전부로 예측합니다(훈련 단계에서 5-폴드 교차 예측을 썼다는 점을 떠올려 보세요). 그다음 다섯 모델의 예측을 평균해 예측값 하나로 만들고, 마지막으로 이 모델 앙상블로 예측한 가격에서 앞서 만든 반사실적 가격을 뺍니다.\n", + "\n", + "> 옮긴이: 원문은 '인덱스 1인 날'이라고 적었지만 위 코드는 `query(\"index==0\")`으로 인덱스 0인 날을 보여 주므로 바로잡았습니다. 위 모델 식의 좌변도 문맥상 가격이 아니라 판매량의 예측값입니다. 또 코드(`pred_test[T] - ensamble_pred(...)`)는 본문 설명과 반대로 반사실적 가격에서 예측한 가격을 뺍니다. 뺄셈 방향을 설명한 본문과 수식은 원문대로 두었습니다." ] }, { 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 0737027..e449c32 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 @@ -656,9 +656,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "결과가 이진이었던 경우와 마찬가지로 이 예에서도 **처치효과가 결과와 상관관계를 가집니다**. 판매량이 많을수록(가격이 낮을수록) 처치효과의 절댓값이 작고, 판매량이 적을수록(가격이 높을수록) 처치효과의 절댓값이 작습니다. 하지만 이번에는 **효과가 결과뿐 아니라 처치 수준과도 상관관계를 가지기** 때문에 상황이 더 복잡합니다. 그래서 반사실적 질문에 답하기가 더 까다롭습니다. 예를 들어 실제 실험 데이터가 다음 그래프와 같다고 잠시 상상해 봅시다. 세그먼트 `A`(부유한 집단)에는 높은 가격을 시험하고 `A` 집단에는 낮은 가격만 시험한 경우입니다. 기업은 자신들이 더 합리적이라고 생각하는 처치 수준 주변에서 실험하고 싶어 하는 경우가 많으므로 이런 상황은 아주 흔합니다.\n", + "결과가 이진이었던 경우와 마찬가지로 이 예에서도 **처치효과가 결과와 상관관계를 가집니다**. 판매량이 많을수록(가격이 낮을수록) 처치효과의 절댓값이 작고, 판매량이 적을수록(가격이 높을수록) 처치효과의 절댓값이 큽니다. 하지만 이번에는 **효과가 결과뿐 아니라 처치 수준과도 상관관계를 가지기** 때문에 상황이 더 복잡합니다. 그래서 반사실적 질문에 답하기가 더 까다롭습니다. 예를 들어 실제 실험 데이터가 다음 그래프와 같다고 잠시 상상해 봅시다. 세그먼트 `A`(부유한 집단)에는 높은 가격을 시험하고 `B` 집단에는 낮은 가격만 시험한 경우입니다. 기업은 자신들이 더 합리적이라고 생각하는 처치 수준 주변에서 실험하고 싶어 하는 경우가 많으므로 이런 상황은 아주 흔합니다.\n", "\n", - "> 옮긴이: 원문의 앞 문장은 '판매량이 적을수록(가격이 높을수록) 처치효과의 절댓값이 작다'로 되어 있지만, 그래프와 앞뒤 맥락상 '절댓값이 크다'가 맞아 보입니다. 또 낮은 가격만 시험한 집단도 원문에는 `A`로 되어 있으나 그래프상 `B`를 뜻하는 것으로 보입니다." + "> 옮긴이: 원문은 '판매량이 적을수록(가격이 높을수록) 처치효과의 절댓값이 작다'로 되어 있지만, 그래프와 앞뒤 맥락상 '절댓값이 크다'의 오기로 보여 바로잡았습니다. 낮은 가격만 시험한 집단도 원문에는 `A`로 되어 있으나 그래프와 다음 셀의 설명상 `B`를 가리키므로 바로잡았습니다." ] }, { 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 1b4c243..66d6de8 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 @@ -154,6 +154,9 @@ "\n", "다음 질문은 가진 데이터로 이 값을 어떻게 추정하느냐입니다. 한 가지 방법은 패널데이터 구조의 힘을 빌려 반사실을 추정하는 것입니다. 예를 들어 선형회귀와 DID 공식을 써서 이원고정효과모델을 만들 수 있습니다. 각 도시 `i`에 기본 설치 수준 $\\gamma_i$가 있다고 해 봅시다. 앞에서 본 내용과 이어지는 이야기입니다. 어떤 도시는 인구가 많아서, 혹은 그 도시의 문화가 회사 제품과 잘 맞아서 설치 수가 많을 수 있습니다. 이유가 무엇이든, 또 이유를 모르더라도, 이런 대상별 고유한 특성은 **시간에 대해 고정된 매개변수** $\\gamma_i$로 포착할 수 있다고 봅니다. 마찬가지로 각 기간 `t`에도 기준 설치 수준이 있고, 이는 **대상에 대해 고정된 매개변수** $\\theta_t$로 포착할 수 있습니다. 그렇다면 설치 수가 도시(대상) 효과 $\\gamma$와 시간 효과 $\\theta$, 그리고 약간의 무작위 잡음으로 정해진다고 모델링하는 것이 좋은 방법입니다.\n", "\n", + "> 옮긴이: 원문의 표현을 그대로 옮겼지만, 이름 때문에 헷갈릴 수 있습니다. γᵢ는 시간이 지나도 변하지 않는 도시별 값이고 θₜ는 모든 도시에 똑같이 적용되는 기간별 값입니다. 보통은 γᵢ를 대상 고정효과(unit fixed effect), θₜ를 시간 고정효과(time fixed effect)라고 부릅니다.\n", + "\n", + "\n", "$$\n", "Installs_{it} = \\gamma_i + \\theta_t + e_{it}\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 fe26cee..9fe9b7f 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 @@ -589,7 +589,7 @@ "id": "9d354b70", "metadata": {}, "source": [ - "평행하지 않은 추세 문제를 해결하는 것이 바로 합성 이중차분법 모델에서 통제집단합성법이 맡는 역할입니다. 하지만 너무 앞서 나갔네요. 위 데이터에 DID가 타당한 모델인지와는 별개로, DID의 흥미로운 점은 이원고정효과(two-way fixed effects, TWFE) 형태로 다시 쓸 수 있다는 것입니다. DID를 이렇게 표현하려면 처치 지표와 함께 대상 평균($\\alpha_i$)과 시간 평균($\\beta_t$)을 적합합니다.\n", + "평행하지 않은 추세 문제를 해결하는 것이 바로 합성 이중차분법 모델에서 통제집단합성법이 맡는 역할입니다. 하지만 너무 앞서 나갔습니다. 위 데이터에 DID가 타당한 모델인지와는 별개로, DID의 흥미로운 점은 이원고정효과(two-way fixed effects, TWFE) 형태로 다시 쓸 수 있다는 것입니다. DID를 이렇게 표현하려면 처치 지표와 함께 대상 평균($\\alpha_i$)과 시간 평균($\\beta_t$)을 적합합니다.\n", "\n", "$$\n", "\\hat{\\tau}^{did} = \\underset{\\mu, \\alpha, \\beta, \\tau}{argmin} \\bigg\\{ \\sum_{i=1}^N \\sum_{t=1}^T \\big(Y_{it} - (\\mu + \\alpha_i + \\beta_t + \\tau D_{it}\\big)^2 \\bigg\\}\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이 맞아서 그렇게 옮겼습니다." ] 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 58af936..536084e 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 @@ -49,7 +49,7 @@ "y_i^* = \\beta_0 + \\pmb{\\beta_2 X}^*_{2i} + e_i\n", "$$\n", "\n", - "프리슈-워-로벨 정리(Frisch–Waugh–Lovell theorem)에 따르면, 이 모델에서 얻은 매개변수 추정값 $\\pmb{\\hat{\\beta}_2}$는 모든 특성을 넣은 전체 회귀에서 얻는 추정값과 같습니다.\n", + "프리슈-워-로벨 정리(Frisch-Waugh-Lovell theorem)에 따르면, 이 모델에서 얻은 매개변수 추정값 $\\pmb{\\hat{\\beta}_2}$는 모든 특성을 넣은 전체 회귀에서 얻는 추정값과 같습니다.\n", "\n", "$$\n", "y_i = \\beta_0 + \\pmb{\\beta_1 X}_{1i} + \\pmb{\\beta_2 X}_{2i} + e_i\n", diff --git a/causal-inference-for-the-brave-and-true/When-Prediction-Fails.ipynb b/causal-inference-for-the-brave-and-true/When-Prediction-Fails.ipynb index 674a377..63d5e81 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 @@ -1807,9 +1807,9 @@ "\n", "![img](./data/img/when-prediction-fails/graph-1.png)\n", "\n", - "그러면 왼쪽 그래프들과 비슷한 것을 얻게 됩니다(엄밀히 말하면 더는 인과 그래프가 아닙니다. 모델이 결과를 일으키지는 않으니까요. 모델은 특성에서 결과로 가는 매핑 함수를 학습할 뿐이지만, 그렇다고 지금부터 할 이야기가 틀려지지는 않습니다). 이 모델로 세분화하는 것은 모델 노드를 조건부로 두는 것과 같습니다. 각 세그먼트 안에서 $M(T, X)$를 고정하는 것입니다. 그렇게 해 놓고 $M(T, X)$를 조건부로 둔 채 $T$와 $Y$의 관계를 알아내려 하면, 1부에서 나쁜 통제변수(bad control)를 다루며 본 상황에 빠집니다. 기억나지 않는 분을 위해 다시 말하면, 처치와 결과 사이 경로에 있는 무언가를 통제하면 처치가 결과에 영향을 주는 경로를 막게 됩니다. 그 결과 겉으로 보이는 효과가 실제 효과보다 작아집니다. 자, 바로 이겁니다. 다른 설명으로도 앞에서와 정확히 같은 결론에 도달했습니다. 예측 모델로 분석단위를 세분화하면 인과효과를 식별하는 능력이 떨어집니다.\n", + "그러면 가운데와 오른쪽 그래프와 비슷한 것을 얻게 됩니다(엄밀히 말하면 더는 인과 그래프가 아닙니다. 모델이 결과를 일으키지는 않으니까요. 모델은 특성에서 결과로 가는 매핑 함수를 학습할 뿐이지만, 그렇다고 지금부터 할 이야기가 틀려지지는 않습니다). 이 모델로 세분화하는 것은 모델 노드를 조건부로 두는 것과 같습니다. 각 세그먼트 안에서 $M(T, X)$를 고정하는 것입니다. 그렇게 해 놓고 $M(T, X)$를 조건부로 둔 채 $T$와 $Y$의 관계를 알아내려 하면, 1부에서 나쁜 통제변수(bad control)를 다루며 본 상황에 빠집니다. 기억나지 않는 분을 위해 다시 말하면, 처치와 결과 사이 경로에 있는 무언가를 통제하면 처치가 결과에 영향을 주는 경로를 막게 됩니다. 그 결과 겉으로 보이는 효과가 실제 효과보다 작아집니다. 자, 바로 이겁니다. 다른 설명으로도 앞에서와 정확히 같은 결론에 도달했습니다. 예측 모델로 분석단위를 세분화하면 인과효과를 식별하는 능력이 떨어집니다.\n", "\n", - "> 옮긴이: 원문에는 '왼쪽 그래프들'이라고 되어 있지만, 그림에서 모델 노드가 들어간 것은 가운데와 오른쪽 그래프입니다.\n", + "> 옮긴이: 원문에는 '왼쪽 그래프들'이라고 되어 있지만, 그림에서 모델 노드가 들어간 것은 가운데와 오른쪽 그래프라서 바로잡았습니다.\n", "\n", "이쯤에서 눈치 빠른 분이라면 이렇게 반박할 것입니다. 그냥 모델에서 $T$를 빼면 되지 않을까요? 정말 좋은 지적입니다. 너무 좋은 지적이라, 모델을 그런 식으로 속이려는 게 왜 그다지 현명하지 않은지 제대로 설명하기까지 저도 몇 년이 걸렸습니다. 사실 이 장에서 살펴본 예제를 돌아보면, 예측 모델에 `coupon` 처치를 아예 넣지 않았다는 걸 알 수 있습니다. 그래도 예측 모델의 분할이 측정된 탄력성을 수평선으로 짓눌러 버리는 문제는 해결되지 않았습니다. 그 이유는 다음 그림에 있습니다.\n", "\n", diff --git a/causal-inference-for-the-brave-and-true/_config.yml b/causal-inference-for-the-brave-and-true/_config.yml deleted file mode 100644 index d75385e..0000000 --- a/causal-inference-for-the-brave-and-true/_config.yml +++ /dev/null @@ -1,22 +0,0 @@ -# in _config.yml -title: "Python으로 하는 인과추론" -author: Jinsoo Shin - -latex: - latex_documents: - targetname: book.tex - -execute: - execute_notebooks: "off" - -repository: - url: https://github.com/CausalInferenceLab/Causal-Inference-with-Python - - -html: - use_issues_button: true - use_repository_button: true - - -exclude_patterns: [_build, .DS_Store, "**.ipynb_checkpoints"] - diff --git a/causal-inference-for-the-brave-and-true/_toc.yml b/causal-inference-for-the-brave-and-true/_toc.yml deleted file mode 100644 index ad705f7..0000000 --- a/causal-inference-for-the-brave-and-true/_toc.yml +++ /dev/null @@ -1,45 +0,0 @@ -format: jb-book -root: landing-page -parts: -- caption: 인과추론 Part I - chapters: - - file: 01-Introduction-To-Causality.ipynb - - file: 02-Randomised-Experiments.ipynb - - file: 03-Stats-Review-The-Most-Dangerous-Equation.ipynb - - file: 04-Graphical-Causal-Models.ipynb - - file: 05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb - - file: 06-Grouped-and-Dummy-Regression.ipynb - - file: 07-Beyond-Confounders.ipynb - - file: 08-Instrumental-Variables.ipynb - - file: 09-Non-Compliance-and-LATE.ipynb - - file: 10-Matching.ipynb - - file: 11-Propensity-Score.ipynb - - file: 12-Doubly-Robust-Estimation.ipynb - - file: 13-Difference-in-Differences.ipynb - - file: 14-Panel-Data-and-Fixed-Effects.ipynb - - file: 15-Synthetic-Control.ipynb - - file: 16-Regression-Discontinuity-Design.ipynb -- caption: 인과추론 Part II - chapters: - - file: 17-Predictive-Models-101.ipynb - - file: 18-Heterogeneous-Treatment-Effects-and-Personalization.ipynb - - file: 19-Evaluating-Causal-Models.ipynb - - file: 20-Plug-and-Play-Estimators.ipynb - - file: 21-Meta-Learners.ipynb - - file: 22-Debiased-Orthogonal-Machine-Learning.ipynb - - file: 23-Challenges-with-Effect-Heterogeneity-and-Nonlinearity.ipynb - - file: 24-The-Diff-in-Diff-Saga.ipynb - - file: 25-Synthetic-Diff-in-Diff.ipynb -- caption: 부록 - chapters: - - file: Debiasing-with-Orthogonalization.ipynb - - file: Debiasing-with-Propensity-Score.ipynb - - file: When-Prediction-Fails.ipynb - - file: Prediction-Metrics-For-Causal-Models.ipynb - - file: Conformal-Inference-for-Synthetic-Control.ipynb -- caption: 기여하기 - chapters: - - url: https://github.com/CausalInferenceLab/Causal-Inference-with-Python/issues - title: 번역 오류 제보 - - url: https://www.patreon.com/causal_inference_for_the_brave_and_true - title: 원저자 후원 (Patreon) diff --git a/causal-inference-for-the-brave-and-true/landing-page.md b/causal-inference-for-the-brave-and-true/landing-page.md deleted file mode 100644 index f1aeec3..0000000 --- a/causal-inference-for-the-brave-and-true/landing-page.md +++ /dev/null @@ -1,43 +0,0 @@ -# Causal Inference for The Brave and True - -![img](./data/img/brave-and-true.png) - -안녕하세요. [가짜연구소](https://pseudo-lab.com/) 빌더 [신진수](https://www.linkedin.com/in/jinsoo-shin-436060162/)입니다. 가짜연구소 인과추론팀은 한국어 자료가 많지 않은 인과추론을 더 많은 분들이 쉽게 접할 수 있도록 이 책을 옮겼습니다. - -## 책 소개 - -이 책은 Matheus Facure(Nubank 데이터 과학자)의 [Causal Inference for The Brave and True](https://matheusfacure.github.io/python-causality-handbook/landing-page.html)를 한국어로 옮긴 것입니다. 저자는 이 책을 이렇게 소개합니다. - -> 가볍지만 엄밀하게 효과 추정과 민감도 분석을 배우는 책입니다. 모든 실습은 파이썬으로 하고, 찾을 수 있는 밈은 최대한 넣었습니다. -> -> Part I에서는 인과추론의 핵심 개념과 모델을 다룹니다. 인과적 질문을 잠재적 결과 표기법으로 나타내는 방법, 인과 그래프, 편향이 무엇이고 어떻게 다루는지를 배웁니다. 여기 담긴 내용은 대부분 학계에서 자리를 잡은 것들로, 책과 대학 강의, 온라인 강좌에서 찾은 자료를 엮은 것입니다. Part I은 인과적 질문을 탐구할 때 기댈 수 있는 튼튼하고 안전한 토대라고 생각하면 됩니다. -> -> Part II에서는 인과추론이 (주로 IT) 산업에서 최근 어떻게 발전하고 쓰이는지를 다룹니다. Part I이 주로 평균 처치효과를 식별하는 데 집중한다면, Part II는 개인화와 CATE 모델을 이용한 이질적 효과 추정으로 넘어갑니다. 이 부분은 대부분 저의 실무 경험에서 나온 것이라 아직 확립된 과학이라고 할 수는 없습니다. 훨씬 실험적이고 앞으로 바뀔 수도 있습니다. 저 역시 아직 배우는 중이니까요. - -용어는 같은 저자의 책을 옮긴 『실무로 통하는 인과추론 with 파이썬』(한빛미디어)과 맞췄습니다. 번역 원칙과 용어표는 저장소의 [번역 가이드](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/blob/main/TRANSLATION_GUIDE.md)에 정리해 두었습니다. - -가짜연구소 인과추론팀은 전문 번역가가 아니라 데이터 분석가, 데이터 과학자, 연구자로 이루어져 있습니다. 어색하거나 틀린 부분이 보이면 언제든 알려 주세요. 도움이 되었다면 GitHub 스타로 응원해 주시면 큰 힘이 됩니다. - -한국어 번역에 흔쾌히 동의해 준 Matheus Facure와, 번역과 실습 자료를 함께 만든 인과추론팀 멤버들에게 감사드립니다. - -## 감사의 말 (원저자) - -> 이 시리즈 전체를 Joshua Angrist, Alberto Abadie, Christopher Walters의 훌륭한 계량경제학 강의에 바치는 헌사로 생각합니다. Part I의 아이디어는 대부분 이들이 미국경제학회(American Economic Association)에서 한 강의에서 가져왔습니다. 2020년이라는 힘든 해를 버틸 수 있었던 것도 이 강의 덕분이었습니다. - -* [Cross-Section Econometrics](https://www.aeaweb.org/conference/cont-ed/2017-webcasts) -* [Mastering Mostly Harmless Econometrics](https://www.aeaweb.org/conference/cont-ed/2020-webcasts) - -> Angrist의 책들도 꼭 소개하고 싶습니다. 계량경제학, 그들 말로 'Metrics가 아주 유용할 뿐 아니라 무척 재미있다는 것을 이 책들에서 배웠습니다. - -* [Mostly Harmless Econometrics](https://www.mostlyharmlesseconometrics.com/) -* [Mastering 'Metrics](https://www.masteringmetrics.com/) - -> 마지막은 Miguel Hernan과 Jamie Robins의 책입니다. 가장 까다로운 인과적 질문에 답해야 했을 때 늘 믿고 기댄 동반자였습니다. - -* [Causal Inference Book](https://www.hsph.harvard.edu/miguel-hernan/causal-inference-book/) - -## 기여하기 - -번역 오류나 어색한 문장은 [이슈 페이지](https://github.com/CausalInferenceLab/Causal-Inference-with-Python/issues)에 남겨 주세요. 관련 질문은 메인테이너 [신진수](https://github.com/jsshin2022)에게 부탁드립니다. - -원서는 누구나 무료로 볼 수 있는 오픈소스 자료입니다. 원서가 도움이 되었다면 저자의 [Patreon](https://www.patreon.com/causal_inference_for_the_brave_and_true)을 후원하거나 [원서 저장소에 스타](https://github.com/matheusfacure/python-causality-handbook/stargazers)를 남겨 주세요.