From af7c2fe08b82a895fc860e98222eaf41932cbc9d Mon Sep 17 00:00:00 2001 From: myeongseok Date: Sun, 17 May 2026 00:54:55 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat(iv):=20IV=20=EC=B1=95=ED=84=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(=EB=85=B8=ED=8A=B8=EB=B6=81=20+=20?= =?UTF-8?q?=EC=98=81=EC=83=81=20=ED=8C=8C=EC=9D=B4=ED=94=84=EB=9D=BC?= =?UTF-8?q?=EC=9D=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - book/iv: 도구변수 한눈에 보기 노트북 ko/en (numpy/2SLS 시뮬레이션 + graphviz DAG 포함) - videos/iv: 7-Scene Manim 파이프라인 ko/en, 약 7분 50초 / 7분 39초 1080p60 - book/myst.yml: 회귀 챕터 + IV 챕터 TOC 연결, ko 항목 hidden 처리 - .claude/skills/manim-video-pipeline: OpenAI gpt-4o-mini-tts 어댑터로 전환, 3b1b 경로 갱신, # 주석 라인 TTS 입력에서 제외 - .claude/skills/video-assets-setup: 3b1b 검증 경로 갱신 - .codex/skills: jupyter-notebook / minimal-ipynb / ipynb-to-korean 스킬 추가 - book/regression, videos/grouped_dummy_regression, videos/linear_regression_effectiveness: 사전 작업분 함께 포함 Co-Authored-By: Claude Opus 4.7 --- .claude/skills/manim-video-pipeline/SKILL.md | 39 +- .../manim-video-pipeline/package-lock.json | 88 +- .../skills/manim-video-pipeline/package.json | 7 +- .../scripts/generate_elevenlabs_audio.mjs | 70 +- .claude/skills/video-assets-setup/SKILL.md | 2 +- .codex/skills/ipynb-to-korean/SKILL.md | 47 + .../skills/ipynb-to-korean/agents/openai.yaml | 4 + .codex/skills/jupyter-notebook/LICENSE.txt | 201 +++ .codex/skills/jupyter-notebook/SKILL.md | 107 ++ .../jupyter-notebook/agents/openai.yaml | 6 + .../assets/experiment-template.ipynb | 110 ++ .../jupyter-notebook/assets/jupyter-small.svg | 3 + .../jupyter-notebook/assets/jupyter.png | Bin 0 -> 2713 bytes .../assets/tutorial-template.ipynb | 107 ++ .../references/experiment-patterns.md | 10 + .../references/notebook-structure.md | 17 + .../references/quality-checklist.md | 11 + .../references/tutorial-patterns.md | 9 + .../jupyter-notebook/scripts/new_notebook.py | 130 ++ .codex/skills/minimal-ipynb/SKILL.md | 90 ++ book/custom.css | 6 +- book/iv/assets/.gitkeep | 0 book/iv/data/.gitkeep | 0 book/iv/iv_en.ipynb | 574 ++++++++ book/iv/iv_ko.ipynb | 572 ++++++++ book/myst.yml | 12 + ...e-Effectiveness-of-Linear-Regression.ipynb | 1182 +++++++++++++++++ ...iveness-of-Linear-Regression_minimal.ipynb | 478 +++++++ ...ness-of-Linear-Regression_minimal_ko.ipynb | 504 +++++++ .../06-Grouped-and-Dummy-Regression.ipynb | 1160 ++++++++++++++++ ...Grouped-and-Dummy-Regression_minimal.ipynb | 504 +++++++ ...uped-and-Dummy-Regression_minimal_ko.ipynb | 596 +++++++++ book/regression/data/wage.csv | 936 +++++++++++++ book/regression/prompt.md | 2 + .../src/grouped_dummy_regression.py | 218 +++ .../scripts/01_grouped_regression_weights.txt | 38 + videos/iv/src/build_notebooks.py | 471 +++++++ videos/iv/src/iv.py | 928 +++++++++++++ videos/iv/src/iv_en.py | 731 ++++++++++ videos/iv/src/scripts/.gitkeep | 0 videos/iv/src/scripts/01_snow_pumps.txt | 29 + videos/iv/src/scripts/01_snow_pumps_en.txt | 23 + videos/iv/src/scripts/02_rct_recap_break.txt | 18 + .../iv/src/scripts/02_rct_recap_break_en.txt | 18 + videos/iv/src/scripts/03_three_types.txt | 20 + videos/iv/src/scripts/03_three_types_en.txt | 20 + videos/iv/src/scripts/04_iv_machinery.txt | 18 + videos/iv/src/scripts/04_iv_machinery_en.txt | 18 + .../iv/src/scripts/05_three_assumptions.txt | 19 + .../src/scripts/05_three_assumptions_en.txt | 19 + videos/iv/src/scripts/06_draft_lottery.txt | 15 + videos/iv/src/scripts/06_draft_lottery_en.txt | 15 + videos/iv/src/scripts/07_outro.txt | 9 + videos/iv/src/scripts/07_outro_en.txt | 9 + .../src/linear_regression_effectiveness.py | 240 ++++ .../scripts/01_rct_vs_observational_intro.txt | 24 + 56 files changed, 10350 insertions(+), 134 deletions(-) create mode 100644 .codex/skills/ipynb-to-korean/SKILL.md create mode 100644 .codex/skills/ipynb-to-korean/agents/openai.yaml create mode 100644 .codex/skills/jupyter-notebook/LICENSE.txt create mode 100644 .codex/skills/jupyter-notebook/SKILL.md create mode 100644 .codex/skills/jupyter-notebook/agents/openai.yaml create mode 100644 .codex/skills/jupyter-notebook/assets/experiment-template.ipynb create mode 100644 .codex/skills/jupyter-notebook/assets/jupyter-small.svg create mode 100644 .codex/skills/jupyter-notebook/assets/jupyter.png create mode 100644 .codex/skills/jupyter-notebook/assets/tutorial-template.ipynb create mode 100644 .codex/skills/jupyter-notebook/references/experiment-patterns.md create mode 100644 .codex/skills/jupyter-notebook/references/notebook-structure.md create mode 100644 .codex/skills/jupyter-notebook/references/quality-checklist.md create mode 100644 .codex/skills/jupyter-notebook/references/tutorial-patterns.md create mode 100644 .codex/skills/jupyter-notebook/scripts/new_notebook.py create mode 100644 .codex/skills/minimal-ipynb/SKILL.md create mode 100644 book/iv/assets/.gitkeep create mode 100644 book/iv/data/.gitkeep create mode 100644 book/iv/iv_en.ipynb create mode 100644 book/iv/iv_ko.ipynb create mode 100644 book/regression/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb create mode 100644 book/regression/05-The-Unreasonable-Effectiveness-of-Linear-Regression_minimal.ipynb create mode 100644 book/regression/05-The-Unreasonable-Effectiveness-of-Linear-Regression_minimal_ko.ipynb create mode 100644 book/regression/06-Grouped-and-Dummy-Regression.ipynb create mode 100644 book/regression/06-Grouped-and-Dummy-Regression_minimal.ipynb create mode 100644 book/regression/06-Grouped-and-Dummy-Regression_minimal_ko.ipynb create mode 100644 book/regression/data/wage.csv create mode 100644 book/regression/prompt.md create mode 100644 videos/grouped_dummy_regression/src/grouped_dummy_regression.py create mode 100644 videos/grouped_dummy_regression/src/scripts/01_grouped_regression_weights.txt create mode 100644 videos/iv/src/build_notebooks.py create mode 100644 videos/iv/src/iv.py create mode 100644 videos/iv/src/iv_en.py create mode 100644 videos/iv/src/scripts/.gitkeep create mode 100644 videos/iv/src/scripts/01_snow_pumps.txt create mode 100644 videos/iv/src/scripts/01_snow_pumps_en.txt create mode 100644 videos/iv/src/scripts/02_rct_recap_break.txt create mode 100644 videos/iv/src/scripts/02_rct_recap_break_en.txt create mode 100644 videos/iv/src/scripts/03_three_types.txt create mode 100644 videos/iv/src/scripts/03_three_types_en.txt create mode 100644 videos/iv/src/scripts/04_iv_machinery.txt create mode 100644 videos/iv/src/scripts/04_iv_machinery_en.txt create mode 100644 videos/iv/src/scripts/05_three_assumptions.txt create mode 100644 videos/iv/src/scripts/05_three_assumptions_en.txt create mode 100644 videos/iv/src/scripts/06_draft_lottery.txt create mode 100644 videos/iv/src/scripts/06_draft_lottery_en.txt create mode 100644 videos/iv/src/scripts/07_outro.txt create mode 100644 videos/iv/src/scripts/07_outro_en.txt create mode 100644 videos/linear_regression_effectiveness/src/linear_regression_effectiveness.py create mode 100644 videos/linear_regression_effectiveness/src/scripts/01_rct_vs_observational_intro.txt diff --git a/.claude/skills/manim-video-pipeline/SKILL.md b/.claude/skills/manim-video-pipeline/SKILL.md index b3d74f3..148daaa 100644 --- a/.claude/skills/manim-video-pipeline/SKILL.md +++ b/.claude/skills/manim-video-pipeline/SKILL.md @@ -29,7 +29,7 @@ Manim CE 기반 교육 영상 제작 워크플로우. - 코드 주석은 단순히 `Beat 1`, `Beat 2`만 적지 말고, 해당 Beat가 스크립트의 어떤 설명을 화면에서 어떻게 처리하는지 드러내야 한다. - 아직 작업하지 않는 다음 Scene들을 미리 script/code에 길게 쌓아두지 않는다. - 사용자가 참고할 3b1b 영상을 주면, 그 영상을 직접 참조해 script와 code를 만든다. -- 사용자가 참고 영상을 주지 않으면, 로컬 `3b1b/videos` 안에서 현재 ipynb 주제, scene 목표, 연출 방식과 가장 비슷한 파일을 골라 참조한다. +- 사용자가 참고 영상을 주지 않으면, 로컬 `3b1b/` 안에서 (`_2015` ~ `_2026` 연도 디렉터리) 현재 ipynb 주제, scene 목표, 연출 방식과 가장 비슷한 파일을 골라 참조한다. - 3b1b 코드는 복붙하지 말고, 현재 Manim CE 버전에 맞게 구조와 표현만 참고해 재구현한다. - 화면 글자는 기본적으로 최소화한다. 자세한 설명은 mp3/스크립트가 맡고, 화면은 앵커 단어, 짧은 수식, 도형, 색, 위치 변화로 전달한다. - 같은 내용을 긴 문장 자막으로 다시 쓰지 않는다. 문장이 필요해도 헤드라인 수준으로 제한한다. @@ -96,29 +96,29 @@ book/{topic}/{topic}.ipynb 아래 인자를 함께 전달하면 3b1b 스타일 참조를 명시적으로 반영한다. - `topic`: 작업 토픽명 (예: `why_causal_inference`, `iv`) -- `ref_video`: 3b1b Manim 코드 경로 (예: `3b1b/videos/_2020/covid.py`) -- `ref_transcript`: 3b1b 자막 경로 (예: `3b1b/captions/2020/exponential-and-epidemics/english/transcript.txt`) -- `ref_sentence_timings`: 문장 타이밍 경로 (예: `3b1b/captions/2020/exponential-and-epidemics/english/sentence_timings.json`) +- `ref_video`: 3b1b Manim 코드 경로 (예: `3b1b/_2020/covid.py`) +- `ref_transcript`: 3b1b 자막 경로 (옵션, 현재 로컬 클론에는 없음) +- `ref_sentence_timings`: 문장 타이밍 경로 (옵션, 현재 로컬 클론에는 없음) Codex 호출 예: ```bash -$manim-video-pipeline topic=iv ref_video=3b1b/videos/_2020/covid.py ref_transcript=3b1b/captions/2020/exponential-and-epidemics/english/transcript.txt ref_sentence_timings=3b1b/captions/2020/exponential-and-epidemics/english/sentence_timings.json +$manim-video-pipeline topic=iv ref_video=3b1b/_2020/covid.py ``` Claude 호출 예: ```bash -/manim-video-pipeline topic=iv ref_video=3b1b/videos/_2020/covid.py ref_transcript=3b1b/captions/2020/exponential-and-epidemics/english/transcript.txt ref_sentence_timings=3b1b/captions/2020/exponential-and-epidemics/english/sentence_timings.json +/manim-video-pipeline topic=iv ref_video=3b1b/_2020/covid.py ``` 자연어 호출 예: ```text -iv 토픽으로 진행하고 ref_video=3b1b/videos/_2020/covid.py ref_transcript=3b1b/captions/2020/exponential-and-epidemics/english/transcript.txt ref_sentence_timings=3b1b/captions/2020/exponential-and-epidemics/english/sentence_timings.json 참고해서 scene 구조 설계해줘 +iv 토픽으로 진행하고 ref_video=3b1b/_2020/covid.py 참고해서 scene 구조 설계해줘 ``` 참조 영상 규칙: - `ref_video`가 주어지면 그 파일을 우선 참조한다. -- `ref_video`가 없으면 로컬 `3b1b/videos`에서 현재 ipynb 주제, scene의 핵심 메시지, 필요한 연출 타입이 가장 비슷한 파일을 고른다. +- `ref_video`가 없으면 로컬 `3b1b/_/` 디렉터리에서 현재 ipynb 주제, scene의 핵심 메시지, 필요한 연출 타입이 가장 비슷한 파일을 고른다. - 단순 랜덤 선택은 금지한다. - 선택 이유를 한 줄로 남긴다. 예: "질문 나열형 인트로 구조가 유사해서", "표/수식 전개 리듬이 유사해서" - 참조 대상을 정했으면, 현재 Scene의 코드 docstring/주석에 어떤 파일을 참조했는지 명시한다. @@ -205,11 +205,12 @@ Scene 구조 기반 내레이션 스크립트 생성 (한국어). - 사용자가 승인하기 전에는 mp3 생성이나 Scene 코드 작성으로 넘어가지 않는다. ### 2. 오디오 생성 (외부) -스크립트를 TTS(ElevenLabs/Piper)로 mp3 변환. -- 기본 ElevenLabs 생성 스크립트: `scripts/generate_elevenlabs_audio.mjs` -- API 키는 repo root `.env`의 `ELEVENLABS_API_KEY`를 사용한다. -- voice_id는 `7Nah3cbXKVmGX7gQUuwz`를 고정으로 사용한다. -- model은 `eleven_multilingual_v2`, output format은 `mp3_44100_128`을 사용한다. +스크립트를 OpenAI gpt-4o-mini-tts로 mp3 변환. +- 기본 생성 스크립트: `scripts/generate_elevenlabs_audio.mjs` (파일명은 레거시, 내부 구현은 OpenAI API) +- API 키는 repo root `.env`의 `OPENAI_API_KEY`를 사용한다. +- model은 `gpt-4o-mini-tts`, output format은 `mp3`를 사용한다. +- voice 기본값은 `coral`. 변경하려면 `OPENAI_TTS_VOICE` 환경변수로 지정한다 (예: `nova`, `sage`, `ash`, `shimmer`). +- 톤 지시는 `OPENAI_TTS_INSTRUCTIONS` 환경변수로 전달한다 (예: "차분한 한국어 설명 톤, 12세 청취자가 이해하기 쉽게"). - 출력: `videos/{topic}/build/audio/{NN}_{scene_name}.mp3` - 동시에 chunk별 timing 메타데이터를 `videos/{topic}/build/audio/{NN}_{scene_name}.timings.json`에 저장한다. - 스크립트 파일을 그대로 읽어 음성을 만들고, 파일명은 scene 번호와 scene 이름을 유지한다. @@ -323,19 +324,25 @@ cd videos/{topic} && ../../.claude/skills/manim-video-pipeline/scripts/mix_bgm.s --bgm-volume 0.10 ``` -### ElevenLabs 오디오 생성 +### OpenAI gpt-4o-mini-tts 오디오 생성 ```bash cd .claude/skills/manim-video-pipeline && \ -npm run elevenlabs-audio -- --topic {topic} --scene 01 --name {scene_name} +npm run openai-audio -- --topic {topic} --scene 01 --name {scene_name} ``` 직접 script 경로를 줄 수도 있다: ```bash cd .claude/skills/manim-video-pipeline && \ -npm run elevenlabs-audio -- --topic {topic} --scene 01 --name {scene_name} \ +npm run openai-audio -- --topic {topic} --scene 01 --name {scene_name} \ --script ../../../videos/{topic}/src/scripts/01_{scene_name}.txt ``` +voice 또는 톤을 바꾸려면 환경변수로: +```bash +OPENAI_TTS_VOICE=nova OPENAI_TTS_INSTRUCTIONS="차분한 한국어 설명 톤" \ + npm run openai-audio -- --topic {topic} --scene 01 --name {scene_name} +``` + ### 현재 Scene 반복 루프 예시 ```bash # 1) Scene 01 코드 작성 후 debug 렌더 diff --git a/.claude/skills/manim-video-pipeline/package-lock.json b/.claude/skills/manim-video-pipeline/package-lock.json index 32aabc7..7531986 100644 --- a/.claude/skills/manim-video-pipeline/package-lock.json +++ b/.claude/skills/manim-video-pipeline/package-lock.json @@ -7,93 +7,7 @@ "": { "name": "manim-video-pipeline", "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@elevenlabs/elevenlabs-js": "^2.38.1" - } - }, - "node_modules/@elevenlabs/elevenlabs-js": { - "version": "2.38.1", - "resolved": "https://registry.npmjs.org/@elevenlabs/elevenlabs-js/-/elevenlabs-js-2.38.1.tgz", - "integrity": "sha512-D2nL4KId2y052IXbJ5UG7DW7JjjDmgGHf08UalLb7OCbmm5RgJQoRIWigfcQyCr9XrrhoKWUxvK8r72pNwYM7g==", - "license": "MIT", - "dependencies": { - "command-exists": "^1.2.9", - "node-fetch": "^2.7.0", - "ws": "^8.18.3" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "license": "MIT" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } + "license": "ISC" } } } diff --git a/.claude/skills/manim-video-pipeline/package.json b/.claude/skills/manim-video-pipeline/package.json index 95af029..668ed8a 100644 --- a/.claude/skills/manim-video-pipeline/package.json +++ b/.claude/skills/manim-video-pipeline/package.json @@ -4,13 +4,12 @@ "description": "", "main": "index.js", "scripts": { - "elevenlabs-audio": "node scripts/generate_elevenlabs_audio.mjs" + "elevenlabs-audio": "node scripts/generate_elevenlabs_audio.mjs", + "openai-audio": "node scripts/generate_elevenlabs_audio.mjs" }, "keywords": [], "author": "", "license": "ISC", "type": "commonjs", - "dependencies": { - "@elevenlabs/elevenlabs-js": "^2.38.1" - } + "dependencies": {} } diff --git a/.claude/skills/manim-video-pipeline/scripts/generate_elevenlabs_audio.mjs b/.claude/skills/manim-video-pipeline/scripts/generate_elevenlabs_audio.mjs index 1f2268f..14566fe 100644 --- a/.claude/skills/manim-video-pipeline/scripts/generate_elevenlabs_audio.mjs +++ b/.claude/skills/manim-video-pipeline/scripts/generate_elevenlabs_audio.mjs @@ -6,11 +6,10 @@ import path from "node:path"; import process from "node:process"; import { spawn } from "node:child_process"; -import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js"; - -const VOICE_ID = "7Nah3cbXKVmGX7gQUuwz"; -const MODEL_ID = "eleven_multilingual_v2"; -const OUTPUT_FORMAT = "mp3_44100_128"; +const MODEL_ID = "gpt-4o-mini-tts"; +const VOICE = process.env.OPENAI_TTS_VOICE || "coral"; +const OUTPUT_FORMAT = "mp3"; +const INSTRUCTIONS = process.env.OPENAI_TTS_INSTRUCTIONS || ""; function printUsage() { console.log(`Usage: @@ -57,8 +56,15 @@ async function readText(scriptPath, directText) { return raw.trim(); } +function stripComments(text) { + return text + .split(/\r?\n/) + .filter((line) => !/^\s*#/.test(line)) + .join("\n"); +} + function splitIntoChunks(text, maxChars = 650) { - const paragraphs = text + const paragraphs = stripComments(text) .split(/\n\s*\n/g) .map((part) => part.replace(/\s+/g, " ").trim()) .filter(Boolean); @@ -93,22 +99,40 @@ function splitIntoChunks(text, maxChars = 650) { async function ensureEnv(repoRoot) { const envPath = path.join(repoRoot, ".env"); process.loadEnvFile(envPath); - const apiKey = process.env.ELEVENLABS_API_KEY; + const apiKey = process.env.OPENAI_API_KEY; if (!apiKey) { - throw new Error(`ELEVENLABS_API_KEY not found in ${envPath}`); + throw new Error(`OPENAI_API_KEY not found in ${envPath}`); } return apiKey; } -async function streamToBuffer(stream) { - const reader = stream.getReader(); - const chunks = []; - while (true) { - const { done, value } = await reader.read(); - if (done) break; - chunks.push(Buffer.from(value)); +async function synthesizeSpeechChunk(apiKey, text) { + const payload = { + model: MODEL_ID, + voice: VOICE, + input: text, + response_format: OUTPUT_FORMAT, + }; + if (INSTRUCTIONS) { + payload.instructions = INSTRUCTIONS; } - return Buffer.concat(chunks); + + const response = await fetch("https://api.openai.com/v1/audio/speech", { + method: "POST", + headers: { + Authorization: `Bearer ${apiKey}`, + "Content-Type": "application/json", + }, + body: JSON.stringify(payload), + }); + + if (!response.ok) { + const body = await response.text(); + throw new Error(`Status code: ${response.status}\nBody: ${body}`); + } + + const arrayBuffer = await response.arrayBuffer(); + return Buffer.from(arrayBuffer); } async function runFfmpeg(fileListPath, outputPath) { @@ -214,7 +238,8 @@ async function main() { scriptPath, outputPath, timingsPath, - voiceId: VOICE_ID, + provider: "openai", + voice: VOICE, modelId: MODEL_ID, outputFormat: OUTPUT_FORMAT, charCount: text.length, @@ -225,17 +250,11 @@ async function main() { } const apiKey = await ensureEnv(repoRoot); - const client = new ElevenLabsClient({ apiKey }); const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "elevenlabs-scene-")); const chunkPaths = []; for (let i = 0; i < chunks.length; i += 1) { - const audioStream = await client.textToSpeech.convert(VOICE_ID, { - text: chunks[i], - modelId: MODEL_ID, - outputFormat: OUTPUT_FORMAT, - }); - const buffer = await streamToBuffer(audioStream); + const buffer = await synthesizeSpeechChunk(apiKey, chunks[i]); const chunkPath = path.join(tempDir, `${String(i + 1).padStart(2, "0")}.mp3`); await fs.writeFile(chunkPath, buffer); chunkPaths.push(chunkPath); @@ -276,7 +295,8 @@ async function main() { sceneName, scriptPath, outputPath, - voiceId: VOICE_ID, + provider: "openai", + voice: VOICE, modelId: MODEL_ID, outputFormat: OUTPUT_FORMAT, totalDuration: mergedDuration, diff --git a/.claude/skills/video-assets-setup/SKILL.md b/.claude/skills/video-assets-setup/SKILL.md index de4772f..6dc1a76 100644 --- a/.claude/skills/video-assets-setup/SKILL.md +++ b/.claude/skills/video-assets-setup/SKILL.md @@ -24,7 +24,7 @@ bash .claude/skills/video-assets-setup/scripts/setup_video_assets.sh ## 확인 ```bash -test -f 3b1b/videos/_2020/covid.py && echo "3b1b OK" +test -f 3b1b/_2020/covid.py && echo "3b1b OK" test -f videos/assets/tabler-icons/icons/outline/device-tablet.svg && echo "tabler OK" ``` diff --git a/.codex/skills/ipynb-to-korean/SKILL.md b/.codex/skills/ipynb-to-korean/SKILL.md new file mode 100644 index 0000000..54aeab5 --- /dev/null +++ b/.codex/skills/ipynb-to-korean/SKILL.md @@ -0,0 +1,47 @@ +--- +name: ipynb-to-korean +description: Translate English Jupyter notebooks (.ipynb) to natural Korean without requiring an API key. Use when asked to convert an English notebook to Korean, translate English cells in a notebook, or create a `_ko.ipynb` version. +--- + +# ipynb-to-korean + +Translate English text in a Jupyter notebook to natural Korean while preserving notebook structure. + +## Workflow + +1. Identify the input `.ipynb` file from the user's request. +2. Set the output path by appending `_ko` before `.ipynb`. + - Example: `analysis.ipynb` -> `analysis_ko.ipynb` +3. Read the notebook JSON and translate only notebook cell sources. +4. Add a language switcher to the first markdown cell so each notebook can navigate to its counterpart. + - If the notebook is standalone, sibling `.ipynb` links are fine. + - English notebook: `**🌐 Language:** **English** | [한국어 →](./file_ko.ipynb)` + - Korean notebook: `**🌐 언어:** [← English](./file.ipynb) | **한국어**` + - If the notebook is published in this repo's book, use the final built page slug instead of the source `.ipynb` path. + - English notebook in book: `**🌐 Language:** **English** | [한국어 →](/why-causal-inference-ko/)` + - Korean notebook in book: `**🌐 언어:** [← English](/why-causal-inference-en/) | **한국어**` +5. If the notebook is part of the book, update `book/myst.yml` so the pair appears together in the TOC. + - Follow the current `why_causal_inference` pattern used in this repo. + - Give only the primary entry a `title:`. + - Place the translated sibling immediately after it with `file:` and `hidden: true`. + - This keeps language pair navigation available while avoiding duplicate visible sidebar titles. + - If the deployed sidebar still shows the secondary Korean page, also update `book/custom.css` with `a.myst-toc-item[href$=\"/...-ko/\"]` style selectors that match the built page slug under GitHub Pages. +6. Preserve notebook structure, outputs, metadata, and execution counts unless the user asks otherwise. +7. Report the input path, output path, whether `myst.yml` was updated, and how many cells were translated. + +## Translation Rules + +- **Markdown cells**: Translate English prose to natural Korean. Keep headings, lists, links, LaTeX, and code fences intact. +- **Code cells**: Translate English comments and English user-facing string literals only. Do not change Python syntax, variable names, function names, library calls, or file paths unless the English text is part of a displayed label or message. +- **Outputs / metadata / kernelspec**: Do not modify. + +## Editing Notes + +- Prefer creating a sibling notebook with the `_ko.ipynb` suffix instead of overwriting the source notebook. +- For small or medium notebooks, translate directly and then write the new notebook file. +- For large notebooks, work cell by cell and keep a count of modified cells. +- When updating the first markdown cell, keep the original title and body content below the language switcher. +- When editing `book/myst.yml`, preserve existing order unless the user asks to move the notebook elsewhere. +- In this repo's MyST setup, a secondary language entry should use `hidden: true`; omitting `title:` alone is not enough to keep it out of the sidebar. +- For this repo's deployed site, verify the hidden page is not still exposed by path-based sidebar links. If needed, patch `book/custom.css` with `href$=` selectors that include the final built slug such as `/intro-ko/` or `/why-causal-inference-ko/`. +- For pages published in this repo's GitHub Pages site, do not leave language switcher links pointing at `.md` or `.ipynb` source files. Use root-based built routes such as `/`, `/intro-ko/`, or `/why-causal-inference-en/`. diff --git a/.codex/skills/ipynb-to-korean/agents/openai.yaml b/.codex/skills/ipynb-to-korean/agents/openai.yaml new file mode 100644 index 0000000..b13ce78 --- /dev/null +++ b/.codex/skills/ipynb-to-korean/agents/openai.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "IPYNB to Korean" + short_description: "Translate notebooks from English to Korean" + default_prompt: "Use $ipynb-to-korean to translate this English notebook into a Korean sibling notebook." diff --git a/.codex/skills/jupyter-notebook/LICENSE.txt b/.codex/skills/jupyter-notebook/LICENSE.txt new file mode 100644 index 0000000..13e25df --- /dev/null +++ b/.codex/skills/jupyter-notebook/LICENSE.txt @@ -0,0 +1,201 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf of + any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don\'t include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/.codex/skills/jupyter-notebook/SKILL.md b/.codex/skills/jupyter-notebook/SKILL.md new file mode 100644 index 0000000..e1d1748 --- /dev/null +++ b/.codex/skills/jupyter-notebook/SKILL.md @@ -0,0 +1,107 @@ +--- +name: "jupyter-notebook" +description: "Use when the user asks to create, scaffold, or edit Jupyter notebooks (`.ipynb`) for experiments, explorations, or tutorials; prefer the bundled templates and run the helper script `new_notebook.py` to generate a clean starting notebook." +--- + + +# Jupyter Notebook Skill + +Create clean, reproducible Jupyter notebooks for two primary modes: + +- Experiments and exploratory analysis +- Tutorials and teaching-oriented walkthroughs + +Prefer the bundled templates and the helper script for consistent structure and fewer JSON mistakes. + +## When to use +- Create a new `.ipynb` notebook from scratch. +- Convert rough notes or scripts into a structured notebook. +- Refactor an existing notebook to be more reproducible and skimmable. +- Build experiments or tutorials that will be read or re-run by other people. + +## Decision tree +- If the request is exploratory, analytical, or hypothesis-driven, choose `experiment`. +- If the request is instructional, step-by-step, or audience-specific, choose `tutorial`. +- If editing an existing notebook, treat it as a refactor: preserve intent and improve structure. + +## Skill path (set once) + +```bash +export CODEX_HOME="${CODEX_HOME:-$HOME/.codex}" +export JUPYTER_NOTEBOOK_CLI="$CODEX_HOME/skills/jupyter-notebook/scripts/new_notebook.py" +``` + +User-scoped skills install under `$CODEX_HOME/skills` (default: `~/.codex/skills`). + +## Workflow +1. Lock the intent. +Identify the notebook kind: `experiment` or `tutorial`. +Capture the objective, audience, and what "done" looks like. + +2. Scaffold from the template. +Use the helper script to avoid hand-authoring raw notebook JSON. + +```bash +uv run --python 3.12 python "$JUPYTER_NOTEBOOK_CLI" \ + --kind experiment \ + --title "Compare prompt variants" \ + --out output/jupyter-notebook/compare-prompt-variants.ipynb +``` + +```bash +uv run --python 3.12 python "$JUPYTER_NOTEBOOK_CLI" \ + --kind tutorial \ + --title "Intro to embeddings" \ + --out output/jupyter-notebook/intro-to-embeddings.ipynb +``` + +3. Fill the notebook with small, runnable steps. +Keep each code cell focused on one step. +Add short markdown cells that explain the purpose and expected result. +Avoid large, noisy outputs when a short summary works. + +4. Apply the right pattern. +For experiments, follow `references/experiment-patterns.md`. +For tutorials, follow `references/tutorial-patterns.md`. + +5. Edit safely when working with existing notebooks. +Preserve the notebook structure; avoid reordering cells unless it improves the top-to-bottom story. +Prefer targeted edits over full rewrites. +If you must edit raw JSON, review `references/notebook-structure.md` first. + +6. Validate the result. +Run the notebook top-to-bottom when the environment allows. +If execution is not possible, say so explicitly and call out how to validate locally. +Use the final pass checklist in `references/quality-checklist.md`. + +## Templates and helper script +- Templates live in `assets/experiment-template.ipynb` and `assets/tutorial-template.ipynb`. +- The helper script loads a template, updates the title cell, and writes a notebook. + +Script path: +- `$JUPYTER_NOTEBOOK_CLI` (installed default: `$CODEX_HOME/skills/jupyter-notebook/scripts/new_notebook.py`) + +## Temp and output conventions +- Use `tmp/jupyter-notebook/` for intermediate files; delete when done. +- Write final artifacts under `output/jupyter-notebook/` when working in this repo. +- Use stable, descriptive filenames (for example, `ablation-temperature.ipynb`). + +## Dependencies (install only when needed) +Prefer `uv` for dependency management. + +Optional Python packages for local notebook execution: + +```bash +uv pip install jupyterlab ipykernel +``` + +The bundled scaffold script uses only the Python standard library and does not require extra dependencies. + +## Environment +No required environment variables. + +## Reference map +- `references/experiment-patterns.md`: experiment structure and heuristics. +- `references/tutorial-patterns.md`: tutorial structure and teaching flow. +- `references/notebook-structure.md`: notebook JSON shape and safe editing rules. +- `references/quality-checklist.md`: final validation checklist. diff --git a/.codex/skills/jupyter-notebook/agents/openai.yaml b/.codex/skills/jupyter-notebook/agents/openai.yaml new file mode 100644 index 0000000..8832dea --- /dev/null +++ b/.codex/skills/jupyter-notebook/agents/openai.yaml @@ -0,0 +1,6 @@ +interface: + display_name: "Jupyter Notebooks" + short_description: "Create Jupyter notebooks for experiments and tutorials" + icon_small: "./assets/jupyter-small.svg" + icon_large: "./assets/jupyter.png" + default_prompt: "Create a Jupyter notebook for this task with clear sections, runnable cells, and concise takeaways." diff --git a/.codex/skills/jupyter-notebook/assets/experiment-template.ipynb b/.codex/skills/jupyter-notebook/assets/experiment-template.ipynb new file mode 100644 index 0000000..a4a0323 --- /dev/null +++ b/.codex/skills/jupyter-notebook/assets/experiment-template.ipynb @@ -0,0 +1,110 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Experiment: TITLE\n", + "\n", + "Objective:\n", + "- State the question you want to answer.\n", + "- Define the success criteria.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Setup: imports and reproducibility\n", + "from __future__ import annotations\n", + "\n", + "import random\n", + "import statistics\n", + "\n", + "SEED = 7\n", + "random.seed(SEED)\n", + "SEED\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plan\n", + "\n", + "- Hypothesis:\n", + "- Variables to sweep:\n", + "- Metrics to record:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Define parameters and lightweight helpers\n", + "sample_size = 20\n", + "values = [random.random() for _ in range(sample_size)]\n", + "summary = {\n", + " \"count\": len(values),\n", + " \"mean\": statistics.fmean(values),\n", + " \"min\": min(values),\n", + " \"max\": max(values),\n", + "}\n", + "summary\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Results\n", + "\n", + "- Key observations:\n", + "- Surprises or failure modes:\n", + "- Decision: continue, pivot, or stop:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Record findings in a minimal, copy-pasteable structure\n", + "result = {\n", + " \"seed\": SEED,\n", + " \"mean\": summary[\"mean\"],\n", + " \"range\": summary[\"max\"] - summary[\"min\"],\n", + "}\n", + "result\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Next steps\n", + "\n", + "- What to try next:\n", + "- What to document elsewhere (PRD, notes, issue):\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/.codex/skills/jupyter-notebook/assets/jupyter-small.svg b/.codex/skills/jupyter-notebook/assets/jupyter-small.svg new file mode 100644 index 0000000..472d07f --- /dev/null +++ b/.codex/skills/jupyter-notebook/assets/jupyter-small.svg @@ -0,0 +1,3 @@ + + + diff --git a/.codex/skills/jupyter-notebook/assets/jupyter.png b/.codex/skills/jupyter-notebook/assets/jupyter.png new file mode 100644 index 0000000000000000000000000000000000000000..51cdf7d3bba730eda85a26a87d1ee65c14da97f0 GIT binary patch literal 2713 zcmV;K3TE|*P)~ebAJu^KsRWmhq|HNp<{jU1g z_o(i!A~EhEG0spXF-{Q+;ux_Yju8vu7_lIZ5ewoNu^^5S3*s2%5;KiQj~+>1U%!lu zjL71}i{<_ItJHTPhz0S10IjWU(%s#iv>Y*Z?b;H{fz=RNOxy<|g8O^vj* zeVulj&6_uiZHx%g-rg>~_wLEi(2#7ctCKqKlMh;eSO4pf*F7D-2#^Jd%D0s$<<<2v zr>0)Y7QdTzds_a7AJ(S~+aPKQ^PTerHCVoFt2m3;hhLqR%+c?r_n+bjS0?6c5yCp|&dd%{Ek zAx1m?rM_*0<;=9sicGt}mpRa197Eui|-)gS8C(b5GH)En(ulEYe+__WsJVj4-RA1yX3&A<$PI{cpxJ*%paHyeL;HVrYsf zigiJ95rfn;;Z+75yE!XAki-)2_d8zY&>N>$?yV1lWMO=u&-?!ImtMWs!Nd){`Tje} zhGL0gRgkD+sJ?-h<>(KcIMXEc{vUoDNuXkgVoeYVKGOV$lO`X<6Afy1LDh8->e0pt4gt2d$jXxHc zc1|$_LX34aE7yc++elrD1r4jxbGtGw*6+a?6Xdm*=JI5Y;8)64k&5!oA9-bK_R{%I zt5#x6ka6$%c4fm~WhR5wSAOyz^+eMaMuIvmW+qxiF(}B*#hB>C?`1j0tP$k#n>luEZetlPg-~3!Ub8jY?J{QUWIRk$#J%{rD-Xg^dkE(JeNh3X2S0{Hv% z>C;o&QW+crVS{j7#9}?iVE^EH{qe(jsa!w=&doJ(UjH%pt*@VT`aGs^>Sb#RNhQ$Q zs1Uu37D>UWXe@#X(4z3+w}w~&d-v{D-?Z8@XU?csUJ;PxL93AykMK11PL^Jye25R}dBLhsuSG8#hW+sBq4s#n2!$*P@RJ z+FJNNb?TH+F~GUu2wS#nnYN6I!7BVNP%p!O>sW&|@i(z0YDKXx`>=gbT)p1!-n1YH zWm*hyPLNdon8H(WRF19)M#kcX2*kKD?XGY)QQ?@tal>L#w%3_2B{M9Vm+-*fDiMK7 z#Fg=L;jk7}8zFkh@Y41fR;#1E$FsnPH;*^mU^e zo=5B`so@A%3Bn-8(BHQ^Gdn`A;G&pJK)>;xZo(Q<7|*iCzWE|4z*7KT=P%#!fMQmdw?In%`XZR_FF@^|%2#j+H4ml{gemF{C*E2bkdjgfMtj>A@ z%P9C~a=;>@Oqw>MW^&L(6~&L9z;a@S(RbBcCsXsEq^TS=*U9k2JSYAcOqsDE+cbPe z&UK>6MU*H|SxNxY6K2lj*?=^*L@~{*m@i8c?4!7b9@JSZF`(eL-_uP@Q%tzaFz>g8 znP4UzMR^|L%B-Z|+FUF}eLz)AYniwideFJKSe$rb$gDe=CK5A+t3qh32{Jl5Dgy%p z>i3c*OQfQrBI7=E*2cQORL@mRr?L~%2i7`2JCSigo;-OXw{PE8-+tDtS)(Rb<`vB- zs7d+xpAneEG6%~^`ri>O&EseTqk`POe_y(~x>BykN_OttsVpWN^lcArd8psSoXHNM zYVF?RV<=NS`S-lrFY8NoHX>t!@M3aHOH0P>5T&7^A(9K5jTn1kc>VhINZS!x7`Yo0 zjuAnqgwuPj0{-4+pE*tY=i!6CLXZk81WQ;ju8vu7_lIZ5ewoNu^^5S3*s2DAdc}f?~c@J Tv%g`A00000NkvXXu0mjf)PowP literal 0 HcmV?d00001 diff --git a/.codex/skills/jupyter-notebook/assets/tutorial-template.ipynb b/.codex/skills/jupyter-notebook/assets/tutorial-template.ipynb new file mode 100644 index 0000000..7001309 --- /dev/null +++ b/.codex/skills/jupyter-notebook/assets/tutorial-template.ipynb @@ -0,0 +1,107 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Tutorial: TITLE\n", + "\n", + "Audience:\n", + "- Describe who this is for.\n", + "\n", + "Prerequisites:\n", + "- List required concepts or setup.\n", + "\n", + "Learning goals:\n", + "- By the end, the reader can...\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Outline\n", + "\n", + "1. Setup\n", + "2. A minimal working example\n", + "3. Variations and pitfalls\n", + "4. Exercises\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Setup cell: keep it short and deterministic\n", + "from __future__ import annotations\n", + "\n", + "import math\n", + "import random\n", + "\n", + "SEED = 21\n", + "random.seed(SEED)\n", + "SEED\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 1 - Start with a tiny example\n", + "\n", + "Explain what the next cell does in plain language.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Minimal working example\n", + "angles = [0, math.pi / 4, math.pi / 2]\n", + "sines = [math.sin(a) for a in angles]\n", + "list(zip(angles, sines))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "- Try a different input.\n", + "- Predict the output before running the code.\n", + "- Note one common mistake and how to fix it.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise answer scaffold\n", + "def describe(values: list[float]) -> dict[str, float]:\n", + " return {\"min\": min(values), \"max\": max(values)}\n", + "\n", + "describe(sines)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/.codex/skills/jupyter-notebook/references/experiment-patterns.md b/.codex/skills/jupyter-notebook/references/experiment-patterns.md new file mode 100644 index 0000000..2d5093b --- /dev/null +++ b/.codex/skills/jupyter-notebook/references/experiment-patterns.md @@ -0,0 +1,10 @@ +# Experiment Patterns + +Use this structure for exploratory and experimental work: + +- Title and objective: state the question and the success criteria. +- Setup and reproducibility: import only what you need, set a seed early, and keep configuration in one short cell. +- Plan: list hypotheses, sweeps, and metrics before running code. +- Minimal baseline: start with the smallest runnable example and confirm it runs end-to-end before adding complexity. +- Results and notes: summarize findings in markdown near the relevant code and record key metrics in a small dictionary or table-like structure. +- Next steps: decide whether to continue, pivot, or stop, and capture follow-up ideas as short bullets. diff --git a/.codex/skills/jupyter-notebook/references/notebook-structure.md b/.codex/skills/jupyter-notebook/references/notebook-structure.md new file mode 100644 index 0000000..681d36f --- /dev/null +++ b/.codex/skills/jupyter-notebook/references/notebook-structure.md @@ -0,0 +1,17 @@ +# Notebook Structure + +Jupyter notebooks are JSON documents with this high-level shape: + +- `nbformat` and `nbformat_minor` +- `metadata` +- `cells` (a list of markdown and code cells) + +When editing `.ipynb` files programmatically: + +- Preserve `nbformat` and `nbformat_minor` from the template. +- Keep `cells` as an ordered list; do not reorder unless intentional. +- For code cells, set `execution_count` to `null` when unknown. +- For code cells, set `outputs` to an empty list when scaffolding. +- For markdown cells, keep `cell_type="markdown"` and `metadata={}`. + +Prefer scaffolding from the bundled templates or `new_notebook.py` (for example, `$CODEX_HOME/skills/jupyter-notebook/scripts/new_notebook.py`) instead of hand-authoring raw notebook JSON. diff --git a/.codex/skills/jupyter-notebook/references/quality-checklist.md b/.codex/skills/jupyter-notebook/references/quality-checklist.md new file mode 100644 index 0000000..5482f28 --- /dev/null +++ b/.codex/skills/jupyter-notebook/references/quality-checklist.md @@ -0,0 +1,11 @@ +# Quality Checklist + +Before delivering a notebook: + +- Run it top-to-bottom at least once (or as much as the environment allows). +- Ensure early cells set all required state; avoid hidden state from prior runs. +- Keep outputs tidy. Avoid giant outputs when a short summary works. +- Prefer small tables, key metrics, or short printouts. +- Keep the narrative skimmable. Use headings and short bullets, and avoid long paragraphs. +- Leave helpful TODOs only when necessary, and label them clearly. +- If execution is not possible, call out the risk and how to validate locally. diff --git a/.codex/skills/jupyter-notebook/references/tutorial-patterns.md b/.codex/skills/jupyter-notebook/references/tutorial-patterns.md new file mode 100644 index 0000000..2a360b0 --- /dev/null +++ b/.codex/skills/jupyter-notebook/references/tutorial-patterns.md @@ -0,0 +1,9 @@ +# Tutorial Patterns + +Use this structure for teaching and walkthroughs: + +- Audience, prerequisites, and learning goals: say who it is for, list what they should already know, and state what they will be able to do by the end. +- Outline: provide a short numbered outline so readers can skim. +- Step-by-step flow: pair a short markdown explanation with a small code cell that runs on its own and a brief interpretation of the result. +- Exercises: include at least one exercise that reinforces the key concept and provide an answer scaffold in the next cell. +- Pitfalls and extensions: call out one common mistake and how to fix it, and suggest one optional extension for curious readers. diff --git a/.codex/skills/jupyter-notebook/scripts/new_notebook.py b/.codex/skills/jupyter-notebook/scripts/new_notebook.py new file mode 100644 index 0000000..0aba209 --- /dev/null +++ b/.codex/skills/jupyter-notebook/scripts/new_notebook.py @@ -0,0 +1,130 @@ +from __future__ import annotations + +import argparse +import json +import re +from pathlib import Path +from typing import Any + + +def slugify(text: str) -> str: + lowered = text.strip().lower() + cleaned = re.sub(r"[^a-z0-9]+", "-", lowered) + collapsed = re.sub(r"-+", "-", cleaned).strip("-") + return collapsed or "notebook" + + +def find_repo_root(start: Path) -> Path: + for candidate in (start, *start.parents): + if (candidate / ".git").exists(): + return candidate + return start + + +def load_template(skill_dir: Path, kind: str) -> dict[str, Any]: + asset_name = "experiment-template.ipynb" if kind == "experiment" else "tutorial-template.ipynb" + template_path = skill_dir / "assets" / asset_name + if not template_path.exists(): + raise SystemExit(f"Missing template: {template_path}") + with template_path.open("r", encoding="utf-8") as f: + data = json.load(f) + if not isinstance(data, dict): + raise SystemExit(f"Unexpected template shape: {template_path}") + return data + + +def update_title(notebook: dict[str, Any], kind: str, title: str) -> None: + prefix = "Experiment" if kind == "experiment" else "Tutorial" + expected = f"# {prefix}: {title}\n" + + cells = notebook.get("cells") + if not isinstance(cells, list) or not cells: + raise SystemExit("Template notebook has no cells") + + first_cell = cells[0] + if not isinstance(first_cell, dict) or first_cell.get("cell_type") != "markdown": + raise SystemExit("Template notebook must start with a markdown title cell") + + source = first_cell.get("source", []) + if isinstance(source, str): + source_lines = [source] + elif isinstance(source, list): + source_lines = [str(line) for line in source] + else: + source_lines = [] + + if source_lines: + source_lines[0] = expected + else: + source_lines = [expected] + + first_cell["source"] = source_lines + + metadata = notebook.setdefault("metadata", {}) + if not isinstance(metadata, dict): + raise SystemExit("Notebook metadata must be a mapping") + + language_info = metadata.setdefault("language_info", {}) + if isinstance(language_info, dict): + language_info.setdefault("name", "python") + language_info.setdefault("version", "3.12") + + +def default_output(repo_root: Path, title: str) -> Path: + filename = f"{slugify(title)}.ipynb" + return repo_root / "output" / "jupyter-notebook" / filename + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description="Scaffold a Jupyter notebook for experiments or tutorials.") + parser.add_argument( + "--kind", + choices=["experiment", "tutorial"], + default="experiment", + help="Notebook style to scaffold (default: experiment).", + ) + parser.add_argument( + "--title", + required=True, + help="Human-readable notebook title used in the first markdown cell.", + ) + parser.add_argument( + "--out", + type=Path, + default=None, + help="Output path for the notebook. Defaults to output/jupyter-notebook/.ipynb.", + ) + parser.add_argument( + "--force", + action="store_true", + help="Overwrite the output file if it already exists.", + ) + return parser.parse_args() + + +def main() -> None: + args = parse_args() + + script_path = Path(__file__).resolve() + skill_dir = script_path.parents[1] + repo_root = find_repo_root(skill_dir) + + notebook = load_template(skill_dir, args.kind) + update_title(notebook, args.kind, args.title) + + out_path = args.out or default_output(repo_root, args.title) + out_path = out_path.resolve() + + if out_path.exists() and not args.force: + raise SystemExit(f"Refusing to overwrite existing file without --force: {out_path}") + + out_path.parent.mkdir(parents=True, exist_ok=True) + with out_path.open("w", encoding="utf-8") as f: + json.dump(notebook, f, indent=2) + f.write("\n") + + print(f"Wrote {out_path} using kind={args.kind}.") + + +if __name__ == "__main__": + main() diff --git a/.codex/skills/minimal-ipynb/SKILL.md b/.codex/skills/minimal-ipynb/SKILL.md new file mode 100644 index 0000000..643d219 --- /dev/null +++ b/.codex/skills/minimal-ipynb/SKILL.md @@ -0,0 +1,90 @@ +--- +name: minimal-ipynb +description: Simplify an existing Jupyter notebook into a concise, minimal, runnable `.ipynb` with only the essential data loading, transformations, analysis, and outputs. Use when the input notebook is verbose, repetitive, theory-heavy, or hard to read; when the user wants a cleaner notebook built from an existing `.ipynb` plus one or more CSV paths; or when the user wants to keep only a selected subset of CSV files and remove all content tied to the others. Write the simplified notebook in the same directory as the source notebook unless the user gives a different output path. +--- + +# minimal-ipynb + +Turn a complicated notebook into a compact working notebook. +Optimize for execution, readability, and directness. Do not preserve theory, long prose, exploratory dead ends, or redundant code unless the user explicitly asks for them. + +## Workflow + +1. Lock the scope. +- Identify the source `.ipynb`. +- Identify the CSV files that must remain in scope. +- If the original notebook uses more CSV files than the user wants, treat every non-selected CSV as out of scope and remove its related cells, variables, plots, joins, and commentary. + +2. Read the notebook top to bottom. +- Extract the minimum path from raw data to final result. +- Keep only cells required for: + - imports + - loading the selected CSV files + - essential cleaning or feature preparation + - the core analysis or visualization the user still needs + - a short result summary when needed + +3. Rewrite, do not merely trim. +- Prefer rebuilding the notebook structure over preserving the old cell layout. +- Merge fragmented code cells when that improves flow. +- Split oversized code cells only when it improves readability. +- Replace long markdown with one or two short markdown cells at most. +- Avoid “background”, “theory”, “interpretation”, and “next steps” sections unless directly required. + +4. Keep the notebook runnable. +- Preserve required imports and file paths. +- Remove unused imports, helper functions, intermediate DataFrames, and abandoned experiments. +- Do not leave references to deleted CSVs. +- If the original notebook depends on multiple files but the user wants only some of them, adjust the logic so the remaining notebook still runs cleanly with only those files. +- Prefer explicit, local variables over clever abstractions. + +5. Keep explanations minimal. +- Use short markdown headings such as `Load data`, `Prepare`, `Analyze`, `Result`. +- Keep prose to the minimum needed to orient the reader. +- Let the code show the workflow. +- Prefer small comments inside code only when they prevent confusion. + +6. Write the output beside the source notebook. +- Default naming: append `_minimal` before `.ipynb`. +- Example: `analysis.ipynb` -> `analysis_minimal.ipynb` +- If the user specifies an output filename, use it. + +7. Validate before finishing. +- Check notebook JSON validity. +- Run the notebook when the environment allows. +- If full execution is not possible, at least verify that cell order, imports, and file references are coherent and state what was not executed. + +## Editing Rules + +- Prefer `pandas` code that is direct and easy to scan. +- Remove duplicate plots; keep the one that best answers the task. +- Keep outputs lightweight; avoid huge tables unless the final result depends on them. +- Replace exploratory print spam with one concise display or summary. +- Keep naming practical; do not preserve cryptic temporary variable chains if they can be simplified safely. +- Preserve semantics. Do not silently change the business question or statistical logic just to make the notebook shorter. + +## CSV Selection Rules + +- If the user names the CSV files to keep, load only those files in the new notebook. +- Remove cells that inspect, merge, clean, or visualize dropped CSV files. +- If a dropped CSV provided columns later used by the notebook, either: + - remove the dependent analysis entirely, or + - replace it with an equivalent path that uses only the kept CSV files +- Never leave dead code that assumes removed files still exist. + +## Structure Target + +Prefer this shape: + +1. Title markdown cell +2. Short setup/imports code cell +3. Short load-data code cell +4. One or two preparation code cells +5. One or two analysis or visualization code cells +6. Optional short conclusion markdown cell + +Do not add extra sections unless they materially improve comprehension. + +## Reference + +Use [.codex/skills/jupyter-notebook/SKILL.md](/Users/edgar/Repository/causal-studio/.codex/skills/jupyter-notebook/SKILL.md) only as a secondary reference for safe notebook editing and notebook structure. Follow this skill first whenever brevity and pragmatism are the goal. diff --git a/book/custom.css b/book/custom.css index d3ab73e..4943a4b 100644 --- a/book/custom.css +++ b/book/custom.css @@ -2,6 +2,10 @@ a.myst-toc-item[href$="/intro-ko"], a.myst-toc-item[href$="/intro-ko/"], a.myst-toc-item[href$="/why-causal-inference-ko"], -a.myst-toc-item[href$="/why-causal-inference-ko/"] { +a.myst-toc-item[href$="/why-causal-inference-ko/"], +a.myst-toc-item[href$="/regression/05-the-unreasonable-effectiveness-of-linear-regression-minimal-ko"], +a.myst-toc-item[href$="/regression/05-the-unreasonable-effectiveness-of-linear-regression-minimal-ko/"], +a.myst-toc-item[href$="/regression/06-grouped-and-dummy-regression-minimal-ko"], +a.myst-toc-item[href$="/regression/06-grouped-and-dummy-regression-minimal-ko/"] { display: none !important; } diff --git a/book/iv/assets/.gitkeep b/book/iv/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/book/iv/data/.gitkeep b/book/iv/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/book/iv/iv_en.ipynb b/book/iv/iv_en.ipynb new file mode 100644 index 0000000..bd574de --- /dev/null +++ b/book/iv/iv_en.ipynb @@ -0,0 +1,574 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0d3336b1", + "metadata": {}, + "source": [ + "**🌐 Language:** **English** | [한국어 →](/iv-ko)\n", + "\n", + "# Instrumental Variables in a Nutshell\n", + "\n", + "Causal inference peer-learning material · Companion video: Causal Studio" + ] + }, + { + "cell_type": "markdown", + "id": "aa9a38ac", + "metadata": {}, + "source": [ + "This notebook is the written-and-coded counterpart of a 7-minute companion video.\n", + "\n", + "Prerequisites:\n", + "- Linear regression (OLS)\n", + "- Why random assignment (RCTs) gives a clean estimate of a causal effect\n", + "- The intuition that simple mean differences can be biased\n", + "\n", + "We build on those by asking: when random assignment is *not* possible, can we use some other randomness already lying around in the real world to identify a causal effect? That's the **instrumental variable**." + ] + }, + { + "cell_type": "markdown", + "id": "0c38b585", + "metadata": {}, + "source": [ + "## 1) The Snow story: a coin flipped by nature\n", + "\n", + "When cholera devastated London in 1854, the physician John Snow noticed that death rates varied wildly from street to street. At the time, two companies piped water into London homes — Lambeth, which drew clean water from upstream, and Southwark & Vauxhall, which drew sewage-mixed water from the lower Thames.\n", + "\n", + "Crucially, **which company served which street had almost nothing to do with the household's income or hygiene**. It was a matter of which pipes had been laid decades earlier.\n", + "\n", + "Snow exploited that accident. The experimenter (Snow) couldn't flip a coin to decide who drank clean water, but **nature had already flipped one** on his behalf.\n", + "\n", + "An instrumental variable (IV) is exactly this kind of tool — one that catches accidents already present in the real world and uses them to pin down a causal effect." + ] + }, + { + "cell_type": "markdown", + "id": "cdd47ad2", + "metadata": {}, + "source": [ + "## 2) Notation\n", + "\n", + "We need three variables:\n", + "\n", + "- $Z$ : the **instrument** — a coin flipped by the experimenter or by nature. (e.g., tablet assignment, lottery number)\n", + "- $T$ : the **treatment actually taken**. (e.g., whether the school actually used the tablets)\n", + "- $Y$ : the **outcome** we care about. (e.g., test scores)\n", + "\n", + "Plus potential outcomes:\n", + "\n", + "- $Y_0$ : the potential outcome under no treatment\n", + "- $Y_1$ : the potential outcome under treatment\n", + "\n", + "The previous chapter introduced the average treatment effect, $ATE = E[Y_1 - Y_0]$. This chapter's main quantity is **an effect restricted to a particular subgroup (the compliers)** — the **LATE**." + ] + }, + { + "cell_type": "markdown", + "id": "7e0013ca", + "metadata": {}, + "source": [ + "## 3) Non-compliance breaks the naive comparison\n", + "\n", + "Take the tablet RCT from the previous chapter. Researchers flipped a coin and \"assigned\" some schools to receive tablets. In the real world, two things happen at once.\n", + "\n", + "1. **Some assigned-treatment schools refuse the tablets** (\"the teachers don't want them\", \"nowhere to store them\").\n", + "2. **Some assigned-control schools buy tablets with their own budget** (\"we're going to use them anyway\").\n", + "\n", + "If we now compare \"actually treated\" vs. \"actually untreated\", the two groups are no longer comparable. Refusers are probably skeptical of new tech; self-buyers are probably more motivated to begin with.\n", + "\n", + "**Assignment ($Z$) is random, but actual treatment ($T$) is not.** A small simulation makes this concrete." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "5164b019", + "metadata": { + "execution": { + "iopub.execute_input": "2026-05-16T13:07:23.890771Z", + "iopub.status.busy": "2026-05-16T13:07:23.890604Z", + "iopub.status.idle": "2026-05-16T13:07:24.184962Z", + "shell.execute_reply": "2026-05-16T13:07:24.184579Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ZTYtype
01168.074178complier
10188.706656always_taker
21168.704090complier
30071.881550complier
41170.147837complier
\n", + "
" + ], + "text/plain": [ + " Z T Y type\n", + "0 1 1 68.074178 complier\n", + "1 0 1 88.706656 always_taker\n", + "2 1 1 68.704090 complier\n", + "3 0 0 71.881550 complier\n", + "4 1 1 70.147837 complier" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "rng = np.random.default_rng(2026)\n", + "n = 4000\n", + "\n", + "# Each school has a latent compliance type: 60% compliers, 20% always-takers, 20% never-takers.\n", + "compliance_type = rng.choice(\n", + " [\"complier\", \"always_taker\", \"never_taker\"],\n", + " size=n, p=[0.60, 0.20, 0.20],\n", + ")\n", + "\n", + "# Random assignment: half get assigned to treatment.\n", + "Z = rng.binomial(1, 0.5, n)\n", + "\n", + "# Actual treatment T depends on type AND assignment.\n", + "T = np.where(\n", + " compliance_type == \"complier\", Z, # complier: assignment = treatment\n", + " np.where(compliance_type == \"always_taker\", 1, 0) # always / never\n", + ")\n", + "\n", + "# Outcome Y: true treatment effect = +5. But baseline scores differ by type.\n", + "baseline = np.where(\n", + " compliance_type == \"complier\", 70,\n", + " np.where(compliance_type == \"always_taker\", 80, 60)\n", + ")\n", + "true_effect = 5 # true LATE\n", + "Y = baseline + true_effect * T + rng.normal(0, 5, n)\n", + "\n", + "df = pd.DataFrame(dict(Z=Z, T=T, Y=Y, type=compliance_type))\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e8e3d9b1", + "metadata": { + "execution": { + "iopub.execute_input": "2026-05-16T13:07:24.185923Z", + "iopub.status.busy": "2026-05-16T13:07:24.185871Z", + "iopub.status.idle": "2026-05-16T13:07:24.188268Z", + "shell.execute_reply": "2026-05-16T13:07:24.187956Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naive mean difference (by actual T): +12.94\n", + "True treatment effect: +5.00\n" + ] + } + ], + "source": [ + "# Naive comparison: actually-treated vs actually-untreated\n", + "naive_diff = df.loc[df[\"T\"] == 1, \"Y\"].mean() - df.loc[df[\"T\"] == 0, \"Y\"].mean()\n", + "print(f\"Naive mean difference (by actual T): {naive_diff:+.2f}\")\n", + "print(f\"True treatment effect: {true_effect:+.2f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cc14c6a2", + "metadata": {}, + "source": [ + "The naive difference is far from the true effect of +5. Why? The actually-treated pool is rich in always-takers (baseline 80) and the actually-untreated pool is rich in never-takers (baseline 60). **Type composition leaks into the mean difference** and becomes bias.\n", + "\n", + "What if we compare by assignment ($Z$) instead?" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "abadfec0", + "metadata": { + "execution": { + "iopub.execute_input": "2026-05-16T13:07:24.189283Z", + "iopub.status.busy": "2026-05-16T13:07:24.189238Z", + "iopub.status.idle": "2026-05-16T13:07:24.191292Z", + "shell.execute_reply": "2026-05-16T13:07:24.191027Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ITT (assignment) difference: +2.63\n" + ] + } + ], + "source": [ + "itt = df.loc[df[\"Z\"] == 1, \"Y\"].mean() - df.loc[df[\"Z\"] == 0, \"Y\"].mean()\n", + "print(f\"ITT (assignment) difference: {itt:+.2f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "2400f7bf", + "metadata": {}, + "source": [ + "The intention-to-treat difference lands somewhere around +3 — unbiased, but **smaller than the true effect**, because only some of the schools (the compliers) actually moved with the coin.\n", + "\n", + "IV's core idea: **divide this small assignment-driven difference by the share of people the coin actually moved** to recover the effect on one mover." + ] + }, + { + "cell_type": "markdown", + "id": "b9c60a75", + "metadata": {}, + "source": [ + "## 4) Three types: complier, always-taker, never-taker\n", + "\n", + "Here is how the coin $Z$ moves people, organized by type:\n", + "\n", + "| Type | $T$ when $Z = 1$ | $T$ when $Z = 0$ | Note |\n", + "|---|:---:|:---:|---|\n", + "| **Complier** | 1 | 0 | follows the coin |\n", + "| **Always-taker** | 1 | 1 | ignores the coin |\n", + "| **Never-taker** | 0 | 0 | ignores the coin |\n", + "| Defier | 0 | 1 | assumed not to exist (monotonicity) |\n", + "\n", + "IV recovers an effect for **the compliers only**, because the always-takers and never-takers behave the same in both arms and contribute nothing to the difference. This is the **Local Average Treatment Effect (LATE)**." + ] + }, + { + "cell_type": "markdown", + "id": "0b3286a2", + "metadata": {}, + "source": [ + "## 5) The Wald estimator: LATE in numbers\n", + "\n", + "$$\n", + "\\text{LATE} \\;=\\; \\frac{E[Y \\mid Z=1] - E[Y \\mid Z=0]}{E[T \\mid Z=1] - E[T \\mid Z=0]}\n", + "$$\n", + "\n", + "- Numerator: **ITT** — the effect the coin produced on the outcome.\n", + "- Denominator: **share of compliers** — the fraction the coin actually moved.\n", + "\n", + "Dividing one by the other gives the effect of treatment on a single complier. This is the Wald estimator — the simplest form of IV estimation." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "52f153ff", + "metadata": { + "execution": { + "iopub.execute_input": "2026-05-16T13:07:24.192216Z", + "iopub.status.busy": "2026-05-16T13:07:24.192169Z", + "iopub.status.idle": "2026-05-16T13:07:24.194784Z", + "shell.execute_reply": "2026-05-16T13:07:24.194462Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ITT (numerator): +2.634\n", + "Compliers share (denom): 0.588\n", + "Wald estimator: +4.483\n", + "True LATE: +5.000\n" + ] + } + ], + "source": [ + "num = df.loc[df[\"Z\"] == 1, \"Y\"].mean() - df.loc[df[\"Z\"] == 0, \"Y\"].mean()\n", + "den = df.loc[df[\"Z\"] == 1, \"T\"].mean() - df.loc[df[\"Z\"] == 0, \"T\"].mean()\n", + "wald = num / den\n", + "print(f\"ITT (numerator): {num:+.3f}\")\n", + "print(f\"Compliers share (denom): {den:.3f}\")\n", + "print(f\"Wald estimator: {wald:+.3f}\")\n", + "print(f\"True LATE: {true_effect:+.3f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "325b2abd", + "metadata": {}, + "source": [ + "The Wald estimator lines up with the true effect (+5). The naive comparison was contaminated by type composition; the Wald formula isolates the part the coin actually moved and rescales it by the compliers' share.\n", + "\n", + "In practice, the same estimate is computed via **2SLS (Two-Stage Least Squares)**: first regress $T$ on $Z$ to get fitted values $\\hat T$, then regress $Y$ on $\\hat T$." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "bea0f52e", + "metadata": { + "execution": { + "iopub.execute_input": "2026-05-16T13:07:24.195608Z", + "iopub.status.busy": "2026-05-16T13:07:24.195568Z", + "iopub.status.idle": "2026-05-16T13:07:24.749382Z", + "shell.execute_reply": "2026-05-16T13:07:24.749010Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2SLS estimated treatment effect: +4.483\n" + ] + } + ], + "source": [ + "import statsmodels.api as sm\n", + "\n", + "# Stage 1: T ~ Z\n", + "first = sm.OLS(df[\"T\"], sm.add_constant(df[\"Z\"])).fit()\n", + "df[\"T_hat\"] = first.predict(sm.add_constant(df[\"Z\"]))\n", + "\n", + "# Stage 2: Y ~ T_hat\n", + "second = sm.OLS(df[\"Y\"], sm.add_constant(df[\"T_hat\"])).fit()\n", + "print(f\"2SLS estimated treatment effect: {second.params['T_hat']:+.3f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "29d3db93", + "metadata": {}, + "source": [ + "## 6) Three assumptions for a valid instrument\n", + "\n", + "For the Wald formula to deliver a **causal** quantity, three conditions must hold simultaneously. If any one fails, the estimate is no longer causally interpretable.\n", + "\n", + "**(a) Relevance** — $Z$ must actually move $T$.\n", + "$$\\operatorname{Cov}(Z, T) \\neq 0$$\n", + "If $Z$ barely moves $T$, the denominator approaches zero and the estimator explodes — the \"weak instrument\" problem.\n", + "\n", + "**(b) Exclusion restriction** — $Z$ can affect $Y$ only through $T$.\n", + "If being assigned tablets changes school morale even when no tablets are used, exclusion is broken.\n", + "\n", + "**(c) Independence** — $Z$ must be independent of the potential outcomes.\n", + "$$(Y_0, Y_1) \\perp Z$$\n", + "In an RCT this is satisfied by design. For a coin flipped by nature, you must argue it case by case.\n", + "\n", + "As a DAG:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "2b464a50", + "metadata": { + "execution": { + "iopub.execute_input": "2026-05-16T13:07:24.750552Z", + "iopub.status.busy": "2026-05-16T13:07:24.750486Z", + "iopub.status.idle": "2026-05-16T13:07:24.896979Z", + "shell.execute_reply": "2026-05-16T13:07:24.896647Z" + } + }, + "outputs": [ + { + "ename": "ExecutableNotFound", + "evalue": "failed to execute PosixPath('dot'), make sure the Graphviz executables are on your systems' PATH", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mFileNotFoundError\u001b[39m Traceback (most recent call last)", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/backend/execute.py:76\u001b[39m, in \u001b[36mrun_check\u001b[39m\u001b[34m(cmd, input_lines, encoding, quiet, **kwargs)\u001b[39m\n\u001b[32m 75\u001b[39m kwargs[\u001b[33m'\u001b[39m\u001b[33mstdout\u001b[39m\u001b[33m'\u001b[39m] = kwargs[\u001b[33m'\u001b[39m\u001b[33mstderr\u001b[39m\u001b[33m'\u001b[39m] = subprocess.PIPE\n\u001b[32m---> \u001b[39m\u001b[32m76\u001b[39m proc = \u001b[43m_run_input_lines\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcmd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minput_lines\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 77\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/backend/execute.py:96\u001b[39m, in \u001b[36m_run_input_lines\u001b[39m\u001b[34m(cmd, input_lines, kwargs)\u001b[39m\n\u001b[32m 95\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_run_input_lines\u001b[39m(cmd, input_lines, *, kwargs):\n\u001b[32m---> \u001b[39m\u001b[32m96\u001b[39m popen = \u001b[43msubprocess\u001b[49m\u001b[43m.\u001b[49m\u001b[43mPopen\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcmd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstdin\u001b[49m\u001b[43m=\u001b[49m\u001b[43msubprocess\u001b[49m\u001b[43m.\u001b[49m\u001b[43mPIPE\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 98\u001b[39m stdin_write = popen.stdin.write\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/subprocess.py:1026\u001b[39m, in \u001b[36mPopen.__init__\u001b[39m\u001b[34m(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds, user, group, extra_groups, encoding, errors, text, umask, pipesize, process_group)\u001b[39m\n\u001b[32m 1023\u001b[39m \u001b[38;5;28mself\u001b[39m.stderr = io.TextIOWrapper(\u001b[38;5;28mself\u001b[39m.stderr,\n\u001b[32m 1024\u001b[39m encoding=encoding, errors=errors)\n\u001b[32m-> \u001b[39m\u001b[32m1026\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_execute_child\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexecutable\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpreexec_fn\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mclose_fds\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1027\u001b[39m \u001b[43m \u001b[49m\u001b[43mpass_fds\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcwd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43menv\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1028\u001b[39m \u001b[43m \u001b[49m\u001b[43mstartupinfo\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcreationflags\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mshell\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1029\u001b[39m \u001b[43m \u001b[49m\u001b[43mp2cread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mp2cwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1030\u001b[39m \u001b[43m \u001b[49m\u001b[43mc2pread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mc2pwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1031\u001b[39m \u001b[43m \u001b[49m\u001b[43merrread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merrwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1032\u001b[39m \u001b[43m \u001b[49m\u001b[43mrestore_signals\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1033\u001b[39m \u001b[43m \u001b[49m\u001b[43mgid\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgids\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43muid\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mumask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1034\u001b[39m \u001b[43m \u001b[49m\u001b[43mstart_new_session\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mprocess_group\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1035\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m:\n\u001b[32m 1036\u001b[39m \u001b[38;5;66;03m# Cleanup if the child failed starting.\u001b[39;00m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/subprocess.py:1955\u001b[39m, in \u001b[36mPopen._execute_child\u001b[39m\u001b[34m(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, gid, gids, uid, umask, start_new_session, process_group)\u001b[39m\n\u001b[32m 1954\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m err_filename \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1955\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m child_exception_type(errno_num, err_msg, err_filename)\n\u001b[32m 1956\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "\u001b[31mFileNotFoundError\u001b[39m: [Errno 2] No such file or directory: PosixPath('dot')", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[31mExecutableNotFound\u001b[39m Traceback (most recent call last)", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/formatters.py:1036\u001b[39m, in \u001b[36mMimeBundleFormatter.__call__\u001b[39m\u001b[34m(self, obj, include, exclude)\u001b[39m\n\u001b[32m 1033\u001b[39m method = get_real_method(obj, \u001b[38;5;28mself\u001b[39m.print_method)\n\u001b[32m 1035\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m method \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1036\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[49m\u001b[43minclude\u001b[49m\u001b[43m=\u001b[49m\u001b[43minclude\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexclude\u001b[49m\u001b[43m=\u001b[49m\u001b[43mexclude\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1037\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 1038\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/jupyter_integration.py:98\u001b[39m, in \u001b[36mJupyterIntegration._repr_mimebundle_\u001b[39m\u001b[34m(self, include, exclude, **_)\u001b[39m\n\u001b[32m 96\u001b[39m include = \u001b[38;5;28mset\u001b[39m(include) \u001b[38;5;28;01mif\u001b[39;00m include \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m {\u001b[38;5;28mself\u001b[39m._jupyter_mimetype}\n\u001b[32m 97\u001b[39m include -= \u001b[38;5;28mset\u001b[39m(exclude \u001b[38;5;129;01mor\u001b[39;00m [])\n\u001b[32m---> \u001b[39m\u001b[32m98\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m {mimetype: \u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod_name\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 99\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m mimetype, method_name \u001b[38;5;129;01min\u001b[39;00m MIME_TYPES.items()\n\u001b[32m 100\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m mimetype \u001b[38;5;129;01min\u001b[39;00m include}\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/jupyter_integration.py:112\u001b[39m, in \u001b[36mJupyterIntegration._repr_image_svg_xml\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 110\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_repr_image_svg_xml\u001b[39m(\u001b[38;5;28mself\u001b[39m) -> \u001b[38;5;28mstr\u001b[39m:\n\u001b[32m 111\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Return the rendered graph as SVG string.\"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m112\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mpipe\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m=\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43msvg\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m=\u001b[49m\u001b[43mSVG_ENCODING\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/piping.py:104\u001b[39m, in \u001b[36mPipe.pipe\u001b[39m\u001b[34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[39m\n\u001b[32m 55\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mpipe\u001b[39m(\u001b[38;5;28mself\u001b[39m,\n\u001b[32m 56\u001b[39m \u001b[38;5;28mformat\u001b[39m: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m 57\u001b[39m renderer: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m (...)\u001b[39m\u001b[32m 61\u001b[39m engine: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m 62\u001b[39m encoding: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m) -> typing.Union[\u001b[38;5;28mbytes\u001b[39m, \u001b[38;5;28mstr\u001b[39m]:\n\u001b[32m 63\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Return the source piped through the Graphviz layout command.\u001b[39;00m\n\u001b[32m 64\u001b[39m \n\u001b[32m 65\u001b[39m \u001b[33;03m Args:\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 102\u001b[39m \u001b[33;03m ' \u001b[39m\u001b[32m104\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_pipe_legacy\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 105\u001b[39m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 106\u001b[39m \u001b[43m \u001b[49m\u001b[43mformatter\u001b[49m\u001b[43m=\u001b[49m\u001b[43mformatter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 107\u001b[39m \u001b[43m \u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[43m=\u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 108\u001b[39m \u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[43m=\u001b[49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 109\u001b[39m \u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[43m=\u001b[49m\u001b[43mengine\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 110\u001b[39m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m=\u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/_tools.py:185\u001b[39m, in \u001b[36mdeprecate_positional_args..decorator..wrapper\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 177\u001b[39m wanted = \u001b[33m'\u001b[39m\u001b[33m, \u001b[39m\u001b[33m'\u001b[39m.join(\u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mvalue\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[33m'\u001b[39m\n\u001b[32m 178\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m name, value \u001b[38;5;129;01min\u001b[39;00m deprecated.items())\n\u001b[32m 179\u001b[39m warnings.warn(\u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[33mThe signature of \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfunc_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m will be reduced\u001b[39m\u001b[33m'\u001b[39m\n\u001b[32m 180\u001b[39m \u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[33m to \u001b[39m\u001b[38;5;132;01m{\u001b[39;00msupported_number\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m positional arg\u001b[39m\u001b[38;5;132;01m{\u001b[39;00ms_\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00mqualification\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m'\u001b[39m\n\u001b[32m 181\u001b[39m \u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[33m \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlist\u001b[39m(supported)\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m: pass \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mwanted\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m as keyword arg\u001b[39m\u001b[38;5;132;01m{\u001b[39;00ms_\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m'\u001b[39m,\n\u001b[32m 182\u001b[39m stacklevel=stacklevel,\n\u001b[32m 183\u001b[39m category=category)\n\u001b[32m--> \u001b[39m\u001b[32m185\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/piping.py:121\u001b[39m, in \u001b[36mPipe._pipe_legacy\u001b[39m\u001b[34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[39m\n\u001b[32m 112\u001b[39m \u001b[38;5;129m@_tools\u001b[39m.deprecate_positional_args(supported_number=\u001b[32m1\u001b[39m, ignore_arg=\u001b[33m'\u001b[39m\u001b[33mself\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m 113\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_pipe_legacy\u001b[39m(\u001b[38;5;28mself\u001b[39m,\n\u001b[32m 114\u001b[39m \u001b[38;5;28mformat\u001b[39m: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m (...)\u001b[39m\u001b[32m 119\u001b[39m engine: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m 120\u001b[39m encoding: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m) -> typing.Union[\u001b[38;5;28mbytes\u001b[39m, \u001b[38;5;28mstr\u001b[39m]:\n\u001b[32m--> \u001b[39m\u001b[32m121\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_pipe_future\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 122\u001b[39m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 123\u001b[39m \u001b[43m \u001b[49m\u001b[43mformatter\u001b[49m\u001b[43m=\u001b[49m\u001b[43mformatter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 124\u001b[39m \u001b[43m \u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[43m=\u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 125\u001b[39m \u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[43m=\u001b[49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 126\u001b[39m \u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[43m=\u001b[49m\u001b[43mengine\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 127\u001b[39m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m=\u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/piping.py:149\u001b[39m, in \u001b[36mPipe._pipe_future\u001b[39m\u001b[34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[39m\n\u001b[32m 146\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m encoding \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 147\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m codecs.lookup(encoding) \u001b[38;5;129;01mis\u001b[39;00m codecs.lookup(\u001b[38;5;28mself\u001b[39m.encoding):\n\u001b[32m 148\u001b[39m \u001b[38;5;66;03m# common case: both stdin and stdout need the same encoding\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m149\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_pipe_lines_string\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m=\u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 150\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 151\u001b[39m raw = \u001b[38;5;28mself\u001b[39m._pipe_lines(*args, input_encoding=\u001b[38;5;28mself\u001b[39m.encoding, **kwargs)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/backend/piping.py:212\u001b[39m, in \u001b[36mpipe_lines_string\u001b[39m\u001b[34m(engine, format, input_lines, encoding, renderer, formatter, neato_no_op, quiet)\u001b[39m\n\u001b[32m 206\u001b[39m cmd = dot_command.command(engine, \u001b[38;5;28mformat\u001b[39m,\n\u001b[32m 207\u001b[39m renderer=renderer,\n\u001b[32m 208\u001b[39m formatter=formatter,\n\u001b[32m 209\u001b[39m neato_no_op=neato_no_op)\n\u001b[32m 210\u001b[39m kwargs = {\u001b[33m'\u001b[39m\u001b[33minput_lines\u001b[39m\u001b[33m'\u001b[39m: input_lines, \u001b[33m'\u001b[39m\u001b[33mencoding\u001b[39m\u001b[33m'\u001b[39m: encoding}\n\u001b[32m--> \u001b[39m\u001b[32m212\u001b[39m proc = \u001b[43mexecute\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrun_check\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcmd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcapture_output\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[43m=\u001b[49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 213\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m proc.stdout\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/backend/execute.py:81\u001b[39m, in \u001b[36mrun_check\u001b[39m\u001b[34m(cmd, input_lines, encoding, quiet, **kwargs)\u001b[39m\n\u001b[32m 79\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mOSError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 80\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m e.errno == errno.ENOENT:\n\u001b[32m---> \u001b[39m\u001b[32m81\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m ExecutableNotFound(cmd) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01me\u001b[39;00m\n\u001b[32m 82\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m\n\u001b[32m 84\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m quiet \u001b[38;5;129;01mand\u001b[39;00m proc.stderr:\n", + "\u001b[31mExecutableNotFound\u001b[39m: failed to execute PosixPath('dot'), make sure the Graphviz executables are on your systems' PATH" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import graphviz as gr\n", + "\n", + "g = gr.Digraph()\n", + "g.attr(rankdir=\"LR\")\n", + "g.node(\"Z\", \"Z (instrument)\", color=\"orange\", fontcolor=\"orange\")\n", + "g.node(\"T\", \"T (treatment)\")\n", + "g.node(\"Y\", \"Y (outcome)\")\n", + "g.node(\"U\", \"U (unobserved confounder)\", style=\"dashed\")\n", + "\n", + "g.edge(\"Z\", \"T\")\n", + "g.edge(\"T\", \"Y\")\n", + "g.edge(\"U\", \"T\", style=\"dashed\")\n", + "g.edge(\"U\", \"Y\", style=\"dashed\")\n", + "\n", + "g" + ] + }, + { + "cell_type": "markdown", + "id": "66b6b3a8", + "metadata": {}, + "source": [ + "$U$ is an unobserved variable that affects both $T$ and $Y$. A naive regression $Y \\sim T$ is biased because of $U$. But if $Z$ is independent of $U$ and the only path from $Z$ to $Y$ is through $T$, then $Z$ isolates a \"clean\" slice of variation in $T$ that we can use to identify the $T \\to Y$ effect." + ] + }, + { + "cell_type": "markdown", + "id": "f75b9904", + "metadata": {}, + "source": [ + "## 7) National scale: the Vietnam draft lottery (Angrist 1990)\n", + "\n", + "The United States, 1969. To draft people for the Vietnam War, the government used a lottery: balls labeled with all 365 birthdays were drawn bingo-style, and the lowest numbers went first.\n", + "\n", + "Your birthday is something you can't pick, and the lottery number was unrelated to your education, occupation, or family. As close to a perfectly natural coin flip as you'll get.\n", + "\n", + "The economist Joshua Angrist used this lottery as an instrument for the effect of **military service on lifetime earnings**.\n", + "\n", + "- $Z$ : draft eligibility based on lottery number\n", + "- $T$ : whether the person actually served\n", + "- $Y$ : later earnings\n", + "\n", + "A naive veteran-vs-non-veteran comparison conflates the effect of service with the selection of who chose to serve and who avoided it. Using the lottery as an instrument isolates the part chance moved.\n", + "\n", + "Angrist (1990) estimated that military service reduced subsequent earnings of white male veterans by about **15%** — a result that overturns the casual \"service = experience = higher earnings\" intuition and remains one of the canonical IV findings." + ] + }, + { + "cell_type": "markdown", + "id": "f19fc5d8", + "metadata": {}, + "source": [ + "## 8) Summary\n", + "\n", + "- **Naive mean differences** are biased whenever there is unobserved confounding.\n", + "- **RCTs** break the bias by random assignment, but non-compliance reopens it for \"actually treated\" comparisons.\n", + "- **Instrumental variables (IV)** rescue identification by finding a variable $Z$ that moves $T$ but only affects $Y$ through $T$ — isolating the part driven by chance.\n", + "- **Wald estimator / 2SLS**: ITT divided by share of compliers. What you identify is **LATE** — the average treatment effect *for the compliers*.\n", + "- **Three locks**: relevance, exclusion, independence. All three must open or the IV door stays shut.\n", + "\n", + "The hardest part of an IV analysis isn't the formula — it's **finding a plausible accident in the real world**. Snow's water companies, Angrist's lottery, and maybe your own birthday are all examples of accidents waiting to be used." + ] + }, + { + "cell_type": "markdown", + "id": "1629c7f6", + "metadata": {}, + "source": [ + "## References\n", + "\n", + "- Angrist, J. D. (1990). *Lifetime Earnings and the Vietnam Era Draft Lottery: Evidence from Social Security Administrative Records.* American Economic Review, 80(3), 313–336.\n", + "- Imbens, G. W., & Angrist, J. D. (1994). *Identification and Estimation of Local Average Treatment Effects.* Econometrica, 62(2), 467–475.\n", + "- Angrist, J. D., & Pischke, J.-S. (2009). *Mostly Harmless Econometrics: An Empiricist's Companion.* Princeton University Press. (Ch. 4)\n", + "- Snow, J. (1855). *On the Mode of Communication of Cholera.* John Churchill.\n", + "- Matheus Facure, *Python Causality Handbook*: [08 - Instrumental Variables](https://matheusfacure.github.io/python-causality-handbook/08-Instrumental-Variables.html)\n", + "- Companion video: [Causal Studio · IV in a Nutshell (EN)](https://www.youtube.com/@CausalStudio)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/book/iv/iv_ko.ipynb b/book/iv/iv_ko.ipynb new file mode 100644 index 0000000..47bfef4 --- /dev/null +++ b/book/iv/iv_ko.ipynb @@ -0,0 +1,572 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "13f10252", + "metadata": {}, + "source": [ + "**🌐 언어:** **한국어** | [English →](/iv-en)\n", + "\n", + "# 도구변수(Instrumental Variables) 한눈에 보기\n", + "\n", + "인과추론 동료 학습 자료 · 동반 영상: Causal Studio" + ] + }, + { + "cell_type": "markdown", + "id": "2c8f7be6", + "metadata": {}, + "source": [ + "이 노트북은 7분짜리 동반 영상의 내용을 글과 코드로 풀어 놓은 자료입니다.\n", + "\n", + "전제 지식은 다음과 같습니다.\n", + "- 선형회귀(OLS)의 의미\n", + "- 무작위 배정(RCT)이 왜 인과효과를 깨끗하게 추정할 수 있는지\n", + "- 단순 평균 차이에 편향이 섞일 수 있다는 직관\n", + "\n", + "여기서 더 나아가, 무작위 배정이 불가능한 현실에서 \"우리가 손에 쥔 다른 무작위성\"을 이용해 인과효과를 짚어 내는 방법, 즉 **도구변수**를 다룹니다." + ] + }, + { + "cell_type": "markdown", + "id": "7c6573bc", + "metadata": {}, + "source": [ + "## 1) 도입: 1854년 런던, 존 스노우의 우연\n", + "\n", + "1854년 런던에 콜레라가 휩쓸 때, 의사 존 스노우(John Snow)는 거리마다 사망률이 크게 다르다는 사실에 주목했습니다. 당시 런던에는 두 곳의 수도 회사가 가정에 물을 공급했는데, 한 회사(Lambeth)는 상류의 깨끗한 물을, 다른 회사(Southwark & Vauxhall)는 하수가 섞인 강물을 끌어다 썼습니다.\n", + "\n", + "결정적으로, **어느 회사의 물이 어느 거리로 들어가는지는 가정의 형편이나 위생 습관과 거의 무관**했습니다. 거리마다 미리 깔린 배관망의 차이였을 뿐이죠.\n", + "\n", + "스노우는 이 우연을 붙잡았습니다. 실험자가 직접 동전을 던질 수 없는 상황에서, **자연이 던진 동전**이 도시 안에 이미 존재했던 셈입니다.\n", + "\n", + "도구변수(Instrumental Variable, IV)는 바로 이런 \"현실 속 우연\"을 찾아 인과효과를 짚어 내는 도구입니다." + ] + }, + { + "cell_type": "markdown", + "id": "8d5d2100", + "metadata": {}, + "source": [ + "## 2) 표기법과 출발점\n", + "\n", + "도구변수를 이야기하기 위해 세 가지 변수를 도입합니다.\n", + "\n", + "- $Z$ : **도구변수**. 실험자 또는 자연이 던진 동전. (예: 태블릿 배정 여부, 추첨 번호)\n", + "- $T$ : **처치**. 실제로 받은 처치 여부. (예: 태블릿을 실제로 사용했는가)\n", + "- $Y$ : **결과**. 우리가 알고 싶은 결과 변수. (예: 학업 성취도)\n", + "\n", + "그리고 잠재적 결과(potential outcomes) 표기:\n", + "\n", + "- $Y_0$ : 처치를 받지 않았을 때의 잠재적 결과\n", + "- $Y_1$ : 처치를 받았을 때의 잠재적 결과\n", + "\n", + "이전 챕터에서 본 평균 처치 효과는 $ATE = E[Y_1 - Y_0]$이었습니다. 이번 챕터의 핵심 결과는 **모든 사람의 평균이 아니라 일부 사람(순응자)의 평균에 한정된 효과**, 즉 **LATE**가 됩니다." + ] + }, + { + "cell_type": "markdown", + "id": "2fae3afb", + "metadata": {}, + "source": [ + "## 3) 비순응으로 단순 비교가 깨진다\n", + "\n", + "이전 챕터의 태블릿 RCT를 다시 가져옵시다. 연구진이 동전을 던져 일부 학교에는 태블릿을 \"배정\"했습니다. 그런데 현실에서는 두 가지 일이 동시에 벌어집니다.\n", + "\n", + "1. **처치 배정 학교 중 일부가 태블릿을 거부**합니다 (\"교사가 쓰기 싫어요\", \"보관할 곳이 없어요\").\n", + "2. **통제 배정 학교 중 일부가 사비로 태블릿을 구매**합니다 (\"우리는 어쨌든 쓸래요\").\n", + "\n", + "이 상황에서 \"실제 처치 여부\"로 두 집단의 평균을 비교하면, 두 집단은 더 이상 비교 가능하지 않습니다. 거부한 학교는 새 기술에 회의적인 곳일 가능성이 높고, 사비로 산 학교는 원래 의지가 강한 곳일 가능성이 높기 때문입니다.\n", + "\n", + "**배정($Z$)은 무작위지만, 실제 처치($T$)는 무작위가 아닙니다.** 작은 시뮬레이션으로 이 깨짐을 확인해 봅시다." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "7273a43d", + "metadata": { + "execution": { + "iopub.execute_input": "2026-05-16T13:07:15.067677Z", + "iopub.status.busy": "2026-05-16T13:07:15.067519Z", + "iopub.status.idle": "2026-05-16T13:07:15.722265Z", + "shell.execute_reply": "2026-05-16T13:07:15.721887Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ZTYtype
01168.074178complier
10188.706656always_taker
21168.704090complier
30071.881550complier
41170.147837complier
\n", + "
" + ], + "text/plain": [ + " Z T Y type\n", + "0 1 1 68.074178 complier\n", + "1 0 1 88.706656 always_taker\n", + "2 1 1 68.704090 complier\n", + "3 0 0 71.881550 complier\n", + "4 1 1 70.147837 complier" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "rng = np.random.default_rng(2026)\n", + "n = 4000\n", + "\n", + "# 학교의 잠재적 처치-반응 유형: 60% 순응자, 20% 언제나 받음, 20% 절대 안 받음\n", + "compliance_type = rng.choice(\n", + " [\"complier\", \"always_taker\", \"never_taker\"],\n", + " size=n, p=[0.60, 0.20, 0.20],\n", + ")\n", + "\n", + "# 동전 배정: 절반에게 처치 배정\n", + "Z = rng.binomial(1, 0.5, n)\n", + "\n", + "# 실제 처치 T는 유형 + 배정에 따라 결정\n", + "T = np.where(\n", + " compliance_type == \"complier\", Z, # 순응자: 배정 = 처치\n", + " np.where(compliance_type == \"always_taker\", 1, 0) # 언제나/절대\n", + ")\n", + "\n", + "# 결과 Y: 진짜 처치 효과는 +5점. 단, 순응자와 그 외 그룹의 기본 점수가 다르다.\n", + "baseline = np.where(\n", + " compliance_type == \"complier\", 70,\n", + " np.where(compliance_type == \"always_taker\", 80, 60)\n", + ")\n", + "true_effect = 5 # 진짜 LATE\n", + "Y = baseline + true_effect * T + rng.normal(0, 5, n)\n", + "\n", + "df = pd.DataFrame(dict(Z=Z, T=T, Y=Y, type=compliance_type))\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "3fa902c3", + "metadata": { + "execution": { + "iopub.execute_input": "2026-05-16T13:07:15.723300Z", + "iopub.status.busy": "2026-05-16T13:07:15.723247Z", + "iopub.status.idle": "2026-05-16T13:07:15.726714Z", + "shell.execute_reply": "2026-05-16T13:07:15.726423Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "단순 평균 차이 (실제 T 기준): +12.94\n", + "진짜 처치 효과: +5.00\n" + ] + } + ], + "source": [ + "# 단순 비교: 실제 처치 받은 학교 vs 받지 않은 학교\n", + "naive_diff = df.loc[df[\"T\"] == 1, \"Y\"].mean() - df.loc[df[\"T\"] == 0, \"Y\"].mean()\n", + "print(f\"단순 평균 차이 (실제 T 기준): {naive_diff:+.2f}\")\n", + "print(f\"진짜 처치 효과: {true_effect:+.2f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "636665f7", + "metadata": {}, + "source": [ + "단순 평균 차이는 진짜 처치 효과(+5점)와 크게 어긋납니다. 이유는 단순합니다. 실제 처치를 받은 학교에는 \"언제나 받음(기본 점수 80)\"이 더 많고, 받지 않은 학교에는 \"절대 안 받음(기본 점수 60)\"이 더 많기 때문입니다. **유형 차이가 평균 차이로 흘러 들어와** 편향을 만든 것입니다.\n", + "\n", + "배정($Z$)으로 비교하면 어떨까요?" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "76b78d2c", + "metadata": { + "execution": { + "iopub.execute_input": "2026-05-16T13:07:15.727583Z", + "iopub.status.busy": "2026-05-16T13:07:15.727541Z", + "iopub.status.idle": "2026-05-16T13:07:15.729577Z", + "shell.execute_reply": "2026-05-16T13:07:15.729297Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "배정(ITT) 차이: +2.63\n" + ] + } + ], + "source": [ + "itt = df.loc[df[\"Z\"] == 1, \"Y\"].mean() - df.loc[df[\"Z\"] == 0, \"Y\"].mean()\n", + "print(f\"배정(ITT) 차이: {itt:+.2f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "2aed6ca3", + "metadata": {}, + "source": [ + "ITT(Intention-to-Treat) 차이는 약 +3점 부근으로 나옵니다. 이 값은 \"동전을 던졌을 때 평균적으로 점수가 얼마나 달라지는가\"를 말해 줍니다. 편향은 없지만, **진짜 처치 효과보다 작게** 측정됩니다. 동전을 따른 사람이 일부(순응자)뿐이기 때문입니다.\n", + "\n", + "도구변수의 핵심 아이디어는, **이 작은 차이를 \"실제로 움직인 사람의 비율\"로 환산**하면 한 명의 순응자에게 처치가 만든 효과가 나온다는 것입니다." + ] + }, + { + "cell_type": "markdown", + "id": "57b83ccf", + "metadata": {}, + "source": [ + "## 4) 세 가지 유형: 순응자, 언제나 받음, 절대 안 받음\n", + "\n", + "동전 $Z$가 사람들을 움직이는 방식은 세 가지로 나뉩니다.\n", + "\n", + "| 유형 | $Z = 1$일 때 $T$ | $Z = 0$일 때 $T$ | 비고 |\n", + "|---|:---:|:---:|---|\n", + "| **순응자** (Complier) | 1 | 0 | 동전을 따른다 |\n", + "| **언제나 받음** (Always-taker) | 1 | 1 | 동전과 무관 |\n", + "| **절대 안 받음** (Never-taker) | 0 | 0 | 동전과 무관 |\n", + "| Defier (배반자) | 0 | 1 | 일반적으로 존재하지 않는다고 가정 |\n", + "\n", + "도구변수가 짚어 내는 효과는 **오직 순응자에 한정**됩니다. 동전이 흔들지 않은 두 그룹(언제나 받음, 절대 안 받음)은 비교에 들어가도 차이를 만들지 않기 때문입니다. 이것이 LATE(Local Average Treatment Effect)의 정의입니다." + ] + }, + { + "cell_type": "markdown", + "id": "cd21e1dc", + "metadata": {}, + "source": [ + "## 5) 와알드 추정량: 숫자로 구하는 LATE\n", + "\n", + "$$\n", + "\\text{LATE} \\;=\\; \\frac{E[Y \\mid Z=1] - E[Y \\mid Z=0]}{E[T \\mid Z=1] - E[T \\mid Z=0]}\n", + "$$\n", + "\n", + "- 분자: **ITT** — 동전이 만든 결과 차이.\n", + "- 분모: **순응자 비율** — 동전이 실제로 움직인 사람의 몫.\n", + "\n", + "둘을 나누면 \"한 명의 순응자에게 처치가 만든 효과\"가 됩니다. 이 식을 와알드(Wald) 추정량이라고 부르며, 가장 단순한 도구변수 추정의 형태입니다." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "0030754f", + "metadata": { + "execution": { + "iopub.execute_input": "2026-05-16T13:07:15.730435Z", + "iopub.status.busy": "2026-05-16T13:07:15.730392Z", + "iopub.status.idle": "2026-05-16T13:07:15.733432Z", + "shell.execute_reply": "2026-05-16T13:07:15.733065Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ITT (분자): +2.634\n", + "순응자 비율 (분모): 0.588\n", + "와알드 추정량: +4.483\n", + "진짜 LATE: +5.000\n" + ] + } + ], + "source": [ + "num = df.loc[df[\"Z\"] == 1, \"Y\"].mean() - df.loc[df[\"Z\"] == 0, \"Y\"].mean()\n", + "den = df.loc[df[\"Z\"] == 1, \"T\"].mean() - df.loc[df[\"Z\"] == 0, \"T\"].mean()\n", + "wald = num / den\n", + "print(f\"ITT (분자): {num:+.3f}\")\n", + "print(f\"순응자 비율 (분모): {den:.3f}\")\n", + "print(f\"와알드 추정량: {wald:+.3f}\")\n", + "print(f\"진짜 LATE: {true_effect:+.3f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "02c046c6", + "metadata": {}, + "source": [ + "와알드 추정량은 진짜 처치 효과(+5점)와 거의 일치합니다. 단순 평균 차이는 유형 구성에 오염되어 있었지만, 동전이 만들어 낸 차이만을 골라내고 동전이 움직인 비율로 환산하면 깨끗한 효과가 회복됩니다.\n", + "\n", + "실무에서는 같은 추정을 **2SLS(Two-Stage Least Squares)**로 합니다. 1단계에서 $T$를 $Z$로 회귀해 적합값 $\\hat T$를 만들고, 2단계에서 $Y$를 $\\hat T$로 회귀합니다." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c46072f9", + "metadata": { + "execution": { + "iopub.execute_input": "2026-05-16T13:07:15.734297Z", + "iopub.status.busy": "2026-05-16T13:07:15.734260Z", + "iopub.status.idle": "2026-05-16T13:07:21.734253Z", + "shell.execute_reply": "2026-05-16T13:07:21.733503Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2SLS 추정 처치 효과: +4.483\n" + ] + } + ], + "source": [ + "import statsmodels.api as sm\n", + "\n", + "# 1단계: T ~ Z\n", + "first = sm.OLS(df[\"T\"], sm.add_constant(df[\"Z\"])).fit()\n", + "df[\"T_hat\"] = first.predict(sm.add_constant(df[\"Z\"]))\n", + "\n", + "# 2단계: Y ~ T_hat\n", + "second = sm.OLS(df[\"Y\"], sm.add_constant(df[\"T_hat\"])).fit()\n", + "print(f\"2SLS 추정 처치 효과: {second.params['T_hat']:+.3f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "6ac16111", + "metadata": {}, + "source": [ + "## 6) 도구변수의 세 가지 가정\n", + "\n", + "와알드 식이 **인과효과**를 추정하려면 다음 세 조건이 모두 만족되어야 합니다. 하나라도 깨지면 결과를 인과적으로 해석할 수 없습니다.\n", + "\n", + "**(a) 적합성 (Relevance)** — $Z$가 $T$를 실제로 움직여야 한다.\n", + "$$\\operatorname{Cov}(Z, T) \\neq 0$$\n", + "$Z$가 $T$를 거의 움직이지 못하면 분모가 0에 가까워져 추정량이 폭주합니다. \"약한 도구(weak instrument)\" 문제입니다.\n", + "\n", + "**(b) 배제 조건 (Exclusion Restriction)** — $Z$가 $Y$에 미치는 영향은 오직 $T$를 거쳐야 한다.\n", + "태블릿을 받았다는 통보 자체가 — 태블릿을 쓰지 않더라도 — 학교 분위기를 바꾼다면 이 조건은 깨집니다.\n", + "\n", + "**(c) 독립성 (Independence)** — $Z$는 잠재적 결과와 독립이어야 한다.\n", + "$$(Y_0, Y_1) \\perp Z$$\n", + "RCT 배정이라면 설계상 만족됩니다. 자연이 던진 동전이라면, 정말 우연이었는지 따져 보아야 합니다.\n", + "\n", + "DAG로 그리면 다음과 같습니다." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "03812975", + "metadata": { + "execution": { + "iopub.execute_input": "2026-05-16T13:07:21.736004Z", + "iopub.status.busy": "2026-05-16T13:07:21.735838Z", + "iopub.status.idle": "2026-05-16T13:07:21.928539Z", + "shell.execute_reply": "2026-05-16T13:07:21.928124Z" + } + }, + "outputs": [ + { + "ename": "ExecutableNotFound", + "evalue": "failed to execute PosixPath('dot'), make sure the Graphviz executables are on your systems' PATH", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mFileNotFoundError\u001b[39m Traceback (most recent call last)", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/backend/execute.py:76\u001b[39m, in \u001b[36mrun_check\u001b[39m\u001b[34m(cmd, input_lines, encoding, quiet, **kwargs)\u001b[39m\n\u001b[32m 75\u001b[39m kwargs[\u001b[33m'\u001b[39m\u001b[33mstdout\u001b[39m\u001b[33m'\u001b[39m] = kwargs[\u001b[33m'\u001b[39m\u001b[33mstderr\u001b[39m\u001b[33m'\u001b[39m] = subprocess.PIPE\n\u001b[32m---> \u001b[39m\u001b[32m76\u001b[39m proc = \u001b[43m_run_input_lines\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcmd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minput_lines\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 77\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/backend/execute.py:96\u001b[39m, in \u001b[36m_run_input_lines\u001b[39m\u001b[34m(cmd, input_lines, kwargs)\u001b[39m\n\u001b[32m 95\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_run_input_lines\u001b[39m(cmd, input_lines, *, kwargs):\n\u001b[32m---> \u001b[39m\u001b[32m96\u001b[39m popen = \u001b[43msubprocess\u001b[49m\u001b[43m.\u001b[49m\u001b[43mPopen\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcmd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstdin\u001b[49m\u001b[43m=\u001b[49m\u001b[43msubprocess\u001b[49m\u001b[43m.\u001b[49m\u001b[43mPIPE\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 98\u001b[39m stdin_write = popen.stdin.write\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/subprocess.py:1026\u001b[39m, in \u001b[36mPopen.__init__\u001b[39m\u001b[34m(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds, user, group, extra_groups, encoding, errors, text, umask, pipesize, process_group)\u001b[39m\n\u001b[32m 1023\u001b[39m \u001b[38;5;28mself\u001b[39m.stderr = io.TextIOWrapper(\u001b[38;5;28mself\u001b[39m.stderr,\n\u001b[32m 1024\u001b[39m encoding=encoding, errors=errors)\n\u001b[32m-> \u001b[39m\u001b[32m1026\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_execute_child\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexecutable\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpreexec_fn\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mclose_fds\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1027\u001b[39m \u001b[43m \u001b[49m\u001b[43mpass_fds\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcwd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43menv\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1028\u001b[39m \u001b[43m \u001b[49m\u001b[43mstartupinfo\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcreationflags\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mshell\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1029\u001b[39m \u001b[43m \u001b[49m\u001b[43mp2cread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mp2cwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1030\u001b[39m \u001b[43m \u001b[49m\u001b[43mc2pread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mc2pwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1031\u001b[39m \u001b[43m \u001b[49m\u001b[43merrread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merrwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1032\u001b[39m \u001b[43m \u001b[49m\u001b[43mrestore_signals\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1033\u001b[39m \u001b[43m \u001b[49m\u001b[43mgid\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgids\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43muid\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mumask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1034\u001b[39m \u001b[43m \u001b[49m\u001b[43mstart_new_session\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mprocess_group\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1035\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m:\n\u001b[32m 1036\u001b[39m \u001b[38;5;66;03m# Cleanup if the child failed starting.\u001b[39;00m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/subprocess.py:1955\u001b[39m, in \u001b[36mPopen._execute_child\u001b[39m\u001b[34m(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, gid, gids, uid, umask, start_new_session, process_group)\u001b[39m\n\u001b[32m 1954\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m err_filename \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1955\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m child_exception_type(errno_num, err_msg, err_filename)\n\u001b[32m 1956\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "\u001b[31mFileNotFoundError\u001b[39m: [Errno 2] No such file or directory: PosixPath('dot')", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[31mExecutableNotFound\u001b[39m Traceback (most recent call last)", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/formatters.py:1036\u001b[39m, in \u001b[36mMimeBundleFormatter.__call__\u001b[39m\u001b[34m(self, obj, include, exclude)\u001b[39m\n\u001b[32m 1033\u001b[39m method = get_real_method(obj, \u001b[38;5;28mself\u001b[39m.print_method)\n\u001b[32m 1035\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m method \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1036\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[49m\u001b[43minclude\u001b[49m\u001b[43m=\u001b[49m\u001b[43minclude\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexclude\u001b[49m\u001b[43m=\u001b[49m\u001b[43mexclude\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1037\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 1038\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/jupyter_integration.py:98\u001b[39m, in \u001b[36mJupyterIntegration._repr_mimebundle_\u001b[39m\u001b[34m(self, include, exclude, **_)\u001b[39m\n\u001b[32m 96\u001b[39m include = \u001b[38;5;28mset\u001b[39m(include) \u001b[38;5;28;01mif\u001b[39;00m include \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m {\u001b[38;5;28mself\u001b[39m._jupyter_mimetype}\n\u001b[32m 97\u001b[39m include -= \u001b[38;5;28mset\u001b[39m(exclude \u001b[38;5;129;01mor\u001b[39;00m [])\n\u001b[32m---> \u001b[39m\u001b[32m98\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m {mimetype: \u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod_name\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 99\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m mimetype, method_name \u001b[38;5;129;01min\u001b[39;00m MIME_TYPES.items()\n\u001b[32m 100\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m mimetype \u001b[38;5;129;01min\u001b[39;00m include}\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/jupyter_integration.py:112\u001b[39m, in \u001b[36mJupyterIntegration._repr_image_svg_xml\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 110\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_repr_image_svg_xml\u001b[39m(\u001b[38;5;28mself\u001b[39m) -> \u001b[38;5;28mstr\u001b[39m:\n\u001b[32m 111\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Return the rendered graph as SVG string.\"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m112\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mpipe\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m=\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43msvg\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m=\u001b[49m\u001b[43mSVG_ENCODING\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/piping.py:104\u001b[39m, in \u001b[36mPipe.pipe\u001b[39m\u001b[34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[39m\n\u001b[32m 55\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mpipe\u001b[39m(\u001b[38;5;28mself\u001b[39m,\n\u001b[32m 56\u001b[39m \u001b[38;5;28mformat\u001b[39m: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m 57\u001b[39m renderer: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m (...)\u001b[39m\u001b[32m 61\u001b[39m engine: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m 62\u001b[39m encoding: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m) -> typing.Union[\u001b[38;5;28mbytes\u001b[39m, \u001b[38;5;28mstr\u001b[39m]:\n\u001b[32m 63\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Return the source piped through the Graphviz layout command.\u001b[39;00m\n\u001b[32m 64\u001b[39m \n\u001b[32m 65\u001b[39m \u001b[33;03m Args:\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 102\u001b[39m \u001b[33;03m ' \u001b[39m\u001b[32m104\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_pipe_legacy\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 105\u001b[39m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 106\u001b[39m \u001b[43m \u001b[49m\u001b[43mformatter\u001b[49m\u001b[43m=\u001b[49m\u001b[43mformatter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 107\u001b[39m \u001b[43m \u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[43m=\u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 108\u001b[39m \u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[43m=\u001b[49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 109\u001b[39m \u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[43m=\u001b[49m\u001b[43mengine\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 110\u001b[39m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m=\u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/_tools.py:185\u001b[39m, in \u001b[36mdeprecate_positional_args..decorator..wrapper\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 177\u001b[39m wanted = \u001b[33m'\u001b[39m\u001b[33m, \u001b[39m\u001b[33m'\u001b[39m.join(\u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mvalue\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[33m'\u001b[39m\n\u001b[32m 178\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m name, value \u001b[38;5;129;01min\u001b[39;00m deprecated.items())\n\u001b[32m 179\u001b[39m warnings.warn(\u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[33mThe signature of \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfunc_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m will be reduced\u001b[39m\u001b[33m'\u001b[39m\n\u001b[32m 180\u001b[39m \u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[33m to \u001b[39m\u001b[38;5;132;01m{\u001b[39;00msupported_number\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m positional arg\u001b[39m\u001b[38;5;132;01m{\u001b[39;00ms_\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00mqualification\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m'\u001b[39m\n\u001b[32m 181\u001b[39m \u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[33m \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlist\u001b[39m(supported)\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m: pass \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mwanted\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m as keyword arg\u001b[39m\u001b[38;5;132;01m{\u001b[39;00ms_\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m'\u001b[39m,\n\u001b[32m 182\u001b[39m stacklevel=stacklevel,\n\u001b[32m 183\u001b[39m category=category)\n\u001b[32m--> \u001b[39m\u001b[32m185\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/piping.py:121\u001b[39m, in \u001b[36mPipe._pipe_legacy\u001b[39m\u001b[34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[39m\n\u001b[32m 112\u001b[39m \u001b[38;5;129m@_tools\u001b[39m.deprecate_positional_args(supported_number=\u001b[32m1\u001b[39m, ignore_arg=\u001b[33m'\u001b[39m\u001b[33mself\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m 113\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_pipe_legacy\u001b[39m(\u001b[38;5;28mself\u001b[39m,\n\u001b[32m 114\u001b[39m \u001b[38;5;28mformat\u001b[39m: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m (...)\u001b[39m\u001b[32m 119\u001b[39m engine: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m 120\u001b[39m encoding: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m) -> typing.Union[\u001b[38;5;28mbytes\u001b[39m, \u001b[38;5;28mstr\u001b[39m]:\n\u001b[32m--> \u001b[39m\u001b[32m121\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_pipe_future\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 122\u001b[39m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 123\u001b[39m \u001b[43m \u001b[49m\u001b[43mformatter\u001b[49m\u001b[43m=\u001b[49m\u001b[43mformatter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 124\u001b[39m \u001b[43m \u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[43m=\u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 125\u001b[39m \u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[43m=\u001b[49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 126\u001b[39m \u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[43m=\u001b[49m\u001b[43mengine\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 127\u001b[39m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m=\u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/piping.py:149\u001b[39m, in \u001b[36mPipe._pipe_future\u001b[39m\u001b[34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[39m\n\u001b[32m 146\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m encoding \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 147\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m codecs.lookup(encoding) \u001b[38;5;129;01mis\u001b[39;00m codecs.lookup(\u001b[38;5;28mself\u001b[39m.encoding):\n\u001b[32m 148\u001b[39m \u001b[38;5;66;03m# common case: both stdin and stdout need the same encoding\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m149\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_pipe_lines_string\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m=\u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 150\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 151\u001b[39m raw = \u001b[38;5;28mself\u001b[39m._pipe_lines(*args, input_encoding=\u001b[38;5;28mself\u001b[39m.encoding, **kwargs)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/backend/piping.py:212\u001b[39m, in \u001b[36mpipe_lines_string\u001b[39m\u001b[34m(engine, format, input_lines, encoding, renderer, formatter, neato_no_op, quiet)\u001b[39m\n\u001b[32m 206\u001b[39m cmd = dot_command.command(engine, \u001b[38;5;28mformat\u001b[39m,\n\u001b[32m 207\u001b[39m renderer=renderer,\n\u001b[32m 208\u001b[39m formatter=formatter,\n\u001b[32m 209\u001b[39m neato_no_op=neato_no_op)\n\u001b[32m 210\u001b[39m kwargs = {\u001b[33m'\u001b[39m\u001b[33minput_lines\u001b[39m\u001b[33m'\u001b[39m: input_lines, \u001b[33m'\u001b[39m\u001b[33mencoding\u001b[39m\u001b[33m'\u001b[39m: encoding}\n\u001b[32m--> \u001b[39m\u001b[32m212\u001b[39m proc = \u001b[43mexecute\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrun_check\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcmd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcapture_output\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[43m=\u001b[49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 213\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m proc.stdout\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/backend/execute.py:81\u001b[39m, in \u001b[36mrun_check\u001b[39m\u001b[34m(cmd, input_lines, encoding, quiet, **kwargs)\u001b[39m\n\u001b[32m 79\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mOSError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 80\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m e.errno == errno.ENOENT:\n\u001b[32m---> \u001b[39m\u001b[32m81\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m ExecutableNotFound(cmd) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01me\u001b[39;00m\n\u001b[32m 82\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m\n\u001b[32m 84\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m quiet \u001b[38;5;129;01mand\u001b[39;00m proc.stderr:\n", + "\u001b[31mExecutableNotFound\u001b[39m: failed to execute PosixPath('dot'), make sure the Graphviz executables are on your systems' PATH" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import graphviz as gr\n", + "\n", + "g = gr.Digraph()\n", + "g.attr(rankdir=\"LR\")\n", + "g.node(\"Z\", \"Z (도구변수)\", color=\"orange\", fontcolor=\"orange\")\n", + "g.node(\"T\", \"T (처치)\")\n", + "g.node(\"Y\", \"Y (결과)\")\n", + "g.node(\"U\", \"U (관측되지 않은 교란)\", style=\"dashed\")\n", + "\n", + "g.edge(\"Z\", \"T\")\n", + "g.edge(\"T\", \"Y\")\n", + "g.edge(\"U\", \"T\", style=\"dashed\")\n", + "g.edge(\"U\", \"Y\", style=\"dashed\")\n", + "\n", + "g" + ] + }, + { + "cell_type": "markdown", + "id": "c658bb7d", + "metadata": {}, + "source": [ + "위 DAG에서 $U$는 $T$와 $Y$ 양쪽에 영향을 주는 관측되지 않은 교란입니다. 단순 회귀 $Y \\sim T$는 이 $U$ 때문에 편향됩니다. 하지만 $Z$가 $U$와 무관하고, $Z \\to Y$ 경로가 $T$를 거쳐서만 존재한다면, $Z$를 통해 \"오염되지 않은\" 변동만 골라 $T \\to Y$ 효과를 식별할 수 있습니다." + ] + }, + { + "cell_type": "markdown", + "id": "0cfd99bd", + "metadata": {}, + "source": [ + "## 7) 국가 규모 사례: 베트남 징집 추첨 (Angrist 1990)\n", + "\n", + "1969년 미국. 베트남 전쟁을 위한 징집을 추첨 방식으로 결정했습니다. 생일 365일이 적힌 공이 뽑혀, 낮은 번호가 뽑힌 사람부터 입대했습니다. **태어난 날짜는 본인이 고를 수 없고**, 추첨 번호는 학력·직업·집안과 무관했습니다. 거의 완벽한 자연의 동전이었습니다.\n", + "\n", + "경제학자 조슈아 앵그리스트(Joshua Angrist)는 이 추첨을 도구변수로 써서 **군 복무가 평생 소득에 미친 효과**를 추정했습니다.\n", + "\n", + "- $Z$ : 추첨 번호 기반 입대 자격\n", + "- $T$ : 실제 군 복무 여부\n", + "- $Y$ : 이후 소득\n", + "\n", + "단순히 참전 군인과 비참전 군인의 소득을 비교하면 \"참전을 선택한 사람\"과 \"회피한 사람\"의 차이가 섞여 들어옵니다. 추첨 번호를 도구변수로 두면, 우연이 움직인 부분만 분리해 깨끗한 효과(LATE)를 얻을 수 있습니다.\n", + "\n", + "Angrist(1990)는 이 방법으로 군 복무가 백인 남성의 이후 소득을 약 **15% 감소**시킨 것으로 추정했습니다. 이는 \"참전 = 경험치 + 네트워크 = 소득 증가\"라는 단순 해석이 편향되어 있음을 보여 준 대표적 결과입니다." + ] + }, + { + "cell_type": "markdown", + "id": "8c44c16b", + "metadata": {}, + "source": [ + "## 8) 정리\n", + "\n", + "- **단순 평균 차이**: 교란이 있으면 인과효과와 일치하지 않는다.\n", + "- **RCT**: 무작위 배정으로 편향을 제거하지만, 비순응이 끼어들면 \"실제 처치\" 기준 비교는 다시 깨진다.\n", + "- **도구변수 (IV)**: 무작위 배정이 불가능한 현실에서, 실제로 처치에는 영향을 주지만 결과에는 처치를 통해서만 영향을 주는 변수 $Z$를 찾아 \"우연이 움직인 부분만\" 분리해 효과를 식별한다.\n", + "- **와알드 추정량 / 2SLS**: ITT를 순응자 비율로 나눈 비율. 식별되는 효과는 LATE, 즉 **순응자에 한정된 평균 처치 효과**다.\n", + "- **세 자물쇠**: 적합성, 배제 조건, 독립성. 모두 만족해야 도구변수의 문이 열린다.\n", + "\n", + "도구변수 분석에서 가장 어려운 일은 수식이 아니라 **현실 속에서 그럴듯한 우연을 찾아내는 일**입니다. 스노우의 수도 회사, 앵그리스트의 추첨, 또 어쩌면 여러분의 생일이 그런 우연이 될 수 있습니다." + ] + }, + { + "cell_type": "markdown", + "id": "a0abc2d9", + "metadata": {}, + "source": [ + "## 참고 자료\n", + "\n", + "- Angrist, J. D. (1990). *Lifetime Earnings and the Vietnam Era Draft Lottery: Evidence from Social Security Administrative Records.* American Economic Review, 80(3), 313–336.\n", + "- Imbens, G. W., & Angrist, J. D. (1994). *Identification and Estimation of Local Average Treatment Effects.* Econometrica, 62(2), 467–475.\n", + "- Angrist, J. D., & Pischke, J.-S. (2009). *Mostly Harmless Econometrics: An Empiricist's Companion.* Princeton University Press. (Ch. 4)\n", + "- Snow, J. (1855). *On the Mode of Communication of Cholera.* John Churchill.\n", + "- Matheus Facure, *Python Causality Handbook*: [08 - Instrumental Variables](https://matheusfacure.github.io/python-causality-handbook/08-Instrumental-Variables.html)\n", + "- 동반 영상: [Causal Studio · IV in a Nutshell (KO)](https://www.youtube.com/@CausalStudio)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/book/myst.yml b/book/myst.yml index 617cab2..53be948 100644 --- a/book/myst.yml +++ b/book/myst.yml @@ -23,6 +23,18 @@ project: file: why_causal_inference/why_causal_inference_en.ipynb - file: why_causal_inference/why_causal_inference_ko.ipynb hidden: true + - title: The Unreasonable Effectiveness of Linear Regression (Minimal) + file: regression/05-The-Unreasonable-Effectiveness-of-Linear-Regression_minimal.ipynb + - file: regression/05-The-Unreasonable-Effectiveness-of-Linear-Regression_minimal_ko.ipynb + hidden: true + - title: Grouped and Dummy Regression (Minimal) + file: regression/06-Grouped-and-Dummy-Regression_minimal.ipynb + - file: regression/06-Grouped-and-Dummy-Regression_minimal_ko.ipynb + hidden: true + - title: Instrumental Variables in a Nutshell + file: iv/iv_en.ipynb + - file: iv/iv_ko.ipynb + hidden: true site: template: book-theme diff --git a/book/regression/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb b/book/regression/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb new file mode 100644 index 0000000..c0ba430 --- /dev/null +++ b/book/regression/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb @@ -0,0 +1,1182 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 05 - The Unreasonable Effectiveness of Linear Regression\n", + "\n", + "\n", + "## All You Need is Regression\n", + "\n", + "When dealing with causal inference, we saw how there are two potential outcomes for each individual: $Y_0$ is the outcome the individual would have if he or she didn't take the treatment and $Y_1$ is the outcome if he or she took the treatment. The act of setting the treatment $T$ to 0 or 1 materializes one of the potential outcomes and makes it impossible for us to ever know the other one. This leads to the fact that the individual treatment effect $\\tau_i = Y_{1i} - Y_{0i}$ is unknowable. \n", + "\n", + "$\n", + "Y_i = Y_{0i} + T_i(Y_{1i} - Y_{0i}) = Y_{0i}(1-T_i) + T_i Y_{1i}\n", + "$\n", + "\n", + "So, for now, let's focus on the simpler task of estimating the average causal effect. With this in mind, we are accepting the fact that some people respond better than others to the treatment, but we are also accepting that we can't know who they are. Instead, we will just try to see if the treatment works, **on average**. \n", + "\n", + "$\n", + "ATE = E[Y_1 - Y_0]\n", + "$\n", + "\n", + "This will give us a simplified model, with a constant treatment effect $Y_{1i} = Y_{0i} + \\kappa$. If $\\kappa$ is positive, we will say that the treatment has, on average, a positive effect. Even if some people will respond badly to it, on average, the impact will be positive.\n", + "\n", + "Let's also recall that we can't simply estimate $E[Y_1 - Y_0]$ with the difference in mean $E[Y|T=1] - E[Y|T=0]$ due to bias. Bias often arises when the treated and untreated are different for reasons other than the treatment itself. One way to see this is on how they differ in the potential outcome $Y_0$\n", + "\n", + "$\n", + "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", + "Previously, we saw how we can eliminate bias with Random Experiments, or **Randomised Controlled Trial** (RCT) as they are sometimes called. RCT forces the treated and the untreated to be equal and that's why the bias vanishes. We also saw how to place uncertainty levels around our estimates for the treatment effect. Namely, we looked at the case of online versus face-to-face classrooms, where $T=0$ represent face-to-face lectures and $T=1$ represent online ones. Students were randomly assigned to one of those 2 types of lectures and then their performance on an exam was evaluated. We've built an A/B testing function that could compare both groups, provide the average treatment effect and even place a confidence interval around it.\n", + "\n", + "Now, it's time to see that we can do all of that with the workhorse of causal inference: **Linear Regression**! Think of it this way. If comparing treated and untreated means was an apple for dessert, linear regression would be cold and creamy tiramisu. Or if comparing treated and untreated is a sad and old loaf of white wonder bread, linear regression would be a crusty, soft crumb country loaf sourdough baked by Chad Robertson himself.\n", + "\n", + "![img](./data/img/linear-regression/you_vs.png)\n", + "\n", + "Lets see how this beauty works. In the code below, we want to run the exact same analysis of comparing online vs face-to-face classes. But instead of doing all that math of confidence intervals, we just run a regression. More specifically, we estimate the following model:\n", + "\n", + "$\n", + "exam_i = \\beta_0 + \\kappa \\ Online_i + u_i\n", + "$\n", + "\n", + "This means we are modeling the exam outcome as a baseline $\\beta_0$ plus $\\kappa$ if the class is online. Of course the exam result is driven by additional variables (like student's mood on the exam day, hours studied and so on). But we don't really care about understanding those relationships. So, instead, we use that $u_i$ term to represent everything else we don't care about. This is called the model error. \n", + "\n", + "Notice that $Online$ is our treatment indication and hence, a dummy variable. It is zero when the treatment is face to face and 1 if it's online. With that in mind, we can see that linear regression will recover $E[Y|T=0] = \\beta_0$ and $E[Y|T=1] = \\beta_0 + \\kappa $. $\\kappa$ will be our ATE." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "import statsmodels.formula.api as smf\n", + "import graphviz as gr\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "
coef std err t P>|t| [0.025 0.975]
Intercept 78.5475 1.113 70.563 0.000 76.353 80.742
format_ol -4.9122 1.680 -2.925 0.004 -8.223 -1.601
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = pd.read_csv(\"data/online_classroom.csv\").query(\"format_blended==0\")\n", + "\n", + "result = smf.ols('falsexam ~ format_ol', data=data).fit()\n", + "result.summary().tables[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That's quite amazing. We are not only able to estimate the ATE, but we also get, for free, confidence intervals and P-Values out of it! More than that, we can see that regression is doing exactly what it supposed to do: comparing $E[Y|T=0]$ and $E[Y|T=1]$. The intercept is exactly the sample mean when $T=0$, $E[Y|T=0]$, and the coefficient of the online format is exactly the sample difference in means $E[Y|T=1] - E[Y|T=0]$. Don't trust me? No problem. You can see for yourself:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "format_ol\n", + "0 78.547485\n", + "1 73.635263\n", + "Name: falsexam, dtype: float64" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(data\n", + " .groupby(\"format_ol\")\n", + " [\"falsexam\"]\n", + " .mean())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As expected. If you add to the intercept the ATE, that is, the parameter estimate of online format, you get the sample mean for the treated: $78.5475 + (-4.9122) = 73.635263$.\n", + "\n", + "## Regression Theory\n", + "\n", + "I don't intend to dive too deep into how linear regression is constructed and estimated. However, a little bit of theory will go a long way in explaining its power in causal inference. First of all, regression solves a theoretical best linear prediction problem. Let $\\beta^*$ be a vector of parameters:\n", + "\n", + "$\n", + "\\beta^* =\\underset{\\beta}{argmin} \\ E[(Y_i - X_i'\\beta)^2]\n", + "$\n", + "\n", + "Linear regression finds the parameters that minimise the mean squared error (MSE). \n", + "\n", + "If you differentiate it and set it to zero, you will find that the linear solution to this problem is given by\n", + "\n", + "$\n", + "\\beta^* = E[X_i'X_i]^{-1}E[X_i' Y_i]\n", + "$\n", + "\n", + "We can estimate this beta using the sample equivalent:\n", + "\n", + "$\n", + "\\hat{\\beta} = (X'X)^{-1}X' Y\n", + "$\n", + "\n", + "But don't take my word for it. If you are one of those that understand code better than formulas, try for yourself:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-4.9122215 , 78.54748458])" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X = data[[\"format_ol\"]].assign(intercep=1)\n", + "y = data[\"falsexam\"]\n", + "\n", + "def regress(y, X): \n", + " return np.linalg.inv(X.T.dot(X)).dot(X.T.dot(y))\n", + "\n", + "beta = regress(y, X)\n", + "beta" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The formulas above are pretty general. However, it pays off to study the case where we only have one regressor. In causal inference, we often want to estimate the causal impact of a variable $T$ on an outcome $y$. So, we use regression with this single variable to estimate this effect. Even if we include other variables in the model, they are usually just auxiliary. Adding other variables can help us estimate the causal effect of the treatment, but we are not very interested in estimating their parameters. \n", + "\n", + "With a single regressor variable $T$, the parameter associated to it will be given by\n", + "\n", + "$\n", + "\\beta_1 = \\dfrac{Cov(Y_i, T_i)}{Var(T_i)} \n", + "$\n", + "\n", + "If $T$ is randomly assigned, $\\beta_1$ is the ATE." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-4.91222149822695" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "kapa = data[\"falsexam\"].cov(data[\"format_ol\"]) / data[\"format_ol\"].var()\n", + "kapa" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we have more than one regressor, we can extend the following formula to accommodate that. Let's say those other variables are just auxiliary and that we are truly interested only in estimating the parameter $\\kappa$ associated to $T$.\n", + "\n", + "$\n", + "y_i = \\beta_0 + \\kappa T_i + \\beta_1 X_{1i} + ... +\\beta_k X_{ki} + u_i\n", + "$\n", + "\n", + "$\\kappa$ can be obtained with the following formula\n", + "\n", + "$\n", + "\\kappa = \\dfrac{Cov(Y_i, \\tilde{T_i})}{Var(\\tilde{T_i})} \n", + "$\n", + "\n", + "where $\\tilde{T_i}$ is the residual from a regression of $T_i$ on all other covariates $X_{1i}, ..., X_{ki}$. Now, let's appreciate how cool this is. It means that the coefficient of a multivariate regression is the bivariate coefficient of the same regressor **after accounting for the effect of other variables in the model**. In causal inference terms, $\\kappa$ is the bivariate coefficient of $T$ after having used all other variables to predict it.\n", + "\n", + "This has a nice intuition behind it. If we can predict $T$ using other variables, it means it's not random. However, we can make it so that $T$ is as good as random once we control for other available variables. To do so, we use linear regression to predict it from the other variables and then we take the residuals of that regression $\\tilde{T}$. By definition, $\\tilde{T}$ cannot be predicted by the other variables $X$ that we've already used to predict $T$. Quite elegantly, $\\tilde{T}$ is a version of the treatment that is not associated with any other variable in $X$.\n", + "\n", + "By the way, this is also a property of linear regression. The residual are always orthogonal or uncorrelated with any of the variables in the model that created it:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Orthogonality imply that the dot product is zero: [7.81597009e-13 4.63984406e-12]\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
format_ole
format_ol1.000000e+00-9.419033e-16
e-9.419033e-161.000000e+00
\n", + "
" + ], + "text/plain": [ + " format_ol e\n", + "format_ol 1.000000e+00 -9.419033e-16\n", + "e -9.419033e-16 1.000000e+00" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "e = y - X.dot(beta)\n", + "print(\"Orthogonality imply that the dot product is zero:\", np.dot(e, X))\n", + "X[[\"format_ol\"]].assign(e=e).corr()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And what is even cooler is that these properties don't depend on anything! They are mathematical truths, regardless of what your data looks like.\n", + "\n", + "## Regression For Non-Random Data\n", + "\n", + "So far, we worked with random experiment data but, as we know, those are hard to come by. Experiments are very expensive to conduct or simply infeasible. It's very hard to convince McKinsey & Co. to randomly provide their services free of charge so that we can, once and for all, distinguish the value their consulting services brings from the fact that those firms that can afford to pay them are already very well off.\n", + "\n", + "\n", + "For this reason, we shall now delve into non random or observational data. In the following example, we will try to estimate the impact of an additional year of education on hourly wage. As you might have guessed, it is extremely hard to conduct an experiment with education. You can't simply randomize people to 4, 8 or 12 years of education. In this case observational data is all we have.\n", + "\n", + "First, let's estimate a very simple model. We will regress log hourly wages on years of education. We use logs here so that our parameter estimates have a percentage interpretation (if you never heard about this amazing properties of the log and want to know why that is, check out [this link](https://stats.stackexchange.com/questions/244199/why-is-it-that-natural-log-changes-are-percentage-changes-what-is-about-logs-th)). With it, we will be able to say that 1 extra year of education yields a wage increase of x%. \n", + "\n", + "\n", + "$\n", + "log(hwage)_i = \\beta_0 + \\beta_1 educ_i + u_i\n", + "$" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "
coef std err t P>|t| [0.025 0.975]
Intercept 2.3071 0.104 22.089 0.000 2.102 2.512
educ 0.0536 0.008 7.114 0.000 0.039 0.068
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wage = pd.read_csv(\"./data/wage.csv\").dropna()\n", + "model_1 = smf.ols('np.log(hwage) ~ educ', data=wage.assign(hwage=wage[\"wage\"]/wage[\"hours\"])).fit()\n", + "model_1.summary().tables[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The estimate of $\\beta_1$ is 0.0536, with a 95% confidence interval of (0.039, 0.068). This means that this model predicts that wages will increase about 5.3% for every additional year of education. This percentage increase is inline with the belief that education impacts wages in an exponential fashion: we expect that going from 11 to 12 years of education (average to graduate high school) to be less rewarding than going from 14 to 16 years (average to graduate college)." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAb4AAAE0CAYAAABTplZXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABf8klEQVR4nO3dd1xV9f/A8ddlCbIuIMOBI0QEcS9UcKQ5cqflqNzmaGhluTXNHGVaqaFp5p6Je5cLUbDMjRruraTsDff+/vDH/Xq9F7wocBnv5+Ph4+E9nzPe597LfZ/zOZ+hiI6OViOEEEIUEybGDkAIIYTIT5L4hBBCFCuS+IQQQhQrkviEEEIUK5L4hBBCFCuS+IQQQhQrkviEUTx8+JBhw4bh6+uLo6MjSqWSmzdv5msMSqWS9u3b5+sxc9vq1atRKpWsXr3a2KGIXNS+fXuUSqWxwyiyJPHpoVQqi92XLjg4GKVSybBhw/LleMOHD2ft2rVUr16dzz//nNGjR2Nvb5/tNtWrV9d8Nln9K2oJIDOxzZgxw9ihFBozZsx44XuW+X0v7Bc+OfX48WMcHBzw8PBArdbtwn3hwgXN39L27dv17qNNmzYolUrCwsLyOtw8Y2bsAETxk5qaysGDB/H09GTt2rU53n7o0KFZJsnq1au/aniFSocOHahfvz6urq7GDkUUAk5OTvj6+nLu3DnOnz+v8/dy+PBhABQKBUeOHKFjx45a5XFxcZw8eRJbW1vq1q2bb3HnNkl8It89fPgQlUqFi4vLS20/bNgwKlSokMtRFU729vYvvFMW4lnNmjXj3LlzHD58WCfxHTlyhFKlSuHt7c2RI0d0tj127Bjp6ek0btwYM7PCmz6kqtNAN2/e1FSNPHr0iA8//BBPT0/KlClD69atOXbsGAAJCQlMnDgRX19fXFxcaNiwIVu2bNHZ37NVWKGhoXTq1Al3d3fc3d3p3r07p0+f1tnm/v37zJo1izZt2lClShWcnZ2pWrUqAwcO5OLFi1nG/s8//zBgwAC8vb1xdnamSpUqdOzYkTVr1gBPq4Yyr+zWrl37UlWHZ8+epV+/fnh6euLs7Ey1atX46KOPuHHjhtZ61atX1/yxhYSEaI6TV1WsqampfPvtt9SqVQsXFxdq1KjBtGnTSElJ0bv+sGHDsnzemPkd0BdrUlISP/30Ey1atKBcuXKUKVOGevXq8fnnn3P79m3NeleuXOGrr76iefPmeHh44OLigq+vLx9//LHWepmxfPjhhwDMmjVL63MJDg4Gsn/GZ+hnAv+rHly9ejVHjhyhffv2lCtXDnd3d9555x0uX76c9Zush1qtZsWKFbRq1Ypy5cpRunRpAgICmDdvHmlpaTrrZ1Zjp6en8/3331OnTh1cXFyoVq0akydPJjU1NUfHfxWpqan89NNP+Pv7U7p0acqVK0erVq1YuXKlTvVgdt8J0P99eva35P79+3z44Yd4eXnh6OjIjh079O7nzz//RKlUMnz4cL3lGRkZ+Pj4ULZsWWJiYrI9v2bNmgHoJLaMjAyOHTuGv78/TZs25fLlyzx48EBrncxtMvcRExPDTz/9RMeOHfHx8cHZ2RkPDw969OiRbVXohg0baNq0KW5ublSuXJkPPviA+/fvZ/ts88iRI/Ts2RMPDw+cnZ3x9fXl888/5+HDh9merz6FN2UbSUxMDG3atMHBwYG3336be/fusXXrVrp168b+/fsZMWIE8fHxvPnmm8TFxbFp0yb69+9P2bJlqV+/vs7+Tp48ydy5c2nRogWDBw/m6tWrbN++nZCQELZs2ULDhg016x47dowffviBgIAAOnXqhLW1NVevXmXbtm3s3r2b3bt3U7NmTa39r1ixgk8//RQTExPatm2Lp6cnjx8/5syZMwQGBtK7d2/8/f25desWa9euxdfXV+u5hyFVh/v37+e9994jIyODjh07UqlSJS5cuMCqVavYsWMH27Zto0aNGsDTH4Jbt26xcOFC3N3d6d27t8HHySm1Wk2/fv3YtWsXFStWZPDgwaSlpbF69WouXLiQa8eJjo6mY8eOnDt3jsqVK9O7d28sLS25ceMGGzdupEWLFri7uwOwfft2li5dSkBAAA0aNMDCwoJLly6xatUq9uzZw6FDhyhbtizwtIFDTEwMu3btokmTJvj7+2uOWb58+Wxjysln8qy9e/eya9cuWrVqRf/+/bl8+TL79u3jn3/+ISwsDCcnJ4Pek6FDh7J+/XrKlClD7969MTc3Z8+ePUycOJGDBw+yYcMGvXcMgwYN4vjx47Rq1QpbW1v279/Pjz/+SGRkJD///LNBx34VaWlpdO/enSNHjlC5cmUGDBhAamoqO3bs4OOPPyY0NJQFCxbkyrGioqJ44403sLOzo3PnzqjVahwcHPSu+/rrr1OpUiU2b97M9OnTdZLDnj17uHfvHu+///4LawAaN26Mubk5x44dIy0tDXNzcwBOnTpFbGwsAQEBVKtWDXha9dmjRw/NtplVoZmJ799//+Xrr7+mcePGtG7dGqVSyZ07d9i9ezd//PEHa9eupXXr1lrH//HHH5k8eTL29vb07NkTe3t7Dh48SJs2bbCzs9Mb8w8//MBXX32Fg4MDrVu3xtXVlQsXLvDrr7+ye/du9u/fr/m7MYQkvhw6f/48H3zwAbNmzUKhUADw/fff8/XXX9OhQwcCAgL49ddfsbCwAJ5+YQcPHswPP/yg96r8jz/+4LvvvmPw4MGaZVu3bqVv37589NFHnDhxQnOcpk2b8u+//2Jra6u1j3PnztG2bVumTp3Kpk2bNMsvXbrEZ599hrW1Nbt379Z8mTPduXMHgICAAABNY5OxY8ca/H4kJCQwdOhQ0tLS2LJlC02bNtWUrVixgk8++YShQ4cSEhKCQqFg+PDh3Lx5k4ULF1K+fPkcHStTYGBgln/cmVfYAL///ju7du2iTp067Ny5EysrKwDGjRtHy5Ytc3zcrIwaNYpz587Rp08ffvjhB0xM/leRkpiYqHV32aNHD4YPH06JEiW09nHgwAG6d+/O7NmzmTt3LvD0+V1m4vP39zf4vcrpZ/KsnTt3EhQUpPlhA5gyZQpz585l1apVjBgx4oXHDwoKYv369VSrVo3du3drfswmT55M9+7dOXDgAIGBgXz88cc6216/fp3Q0FBNApg4cSL+/v6sW7eOyZMn5+hZ5tGjR7Ns4HLr1i29yxcsWMCRI0d4/fXXWbdunebveMKECbRt25bVq1fTunVrOnfubHAcWQkPD6dHjx4sWLDghdWGCoWCAQMGMHHiRNatW8fQoUO1yn/77TcABgwY8MLjWltbU69ePY4fP87Jkyfx8/MD/nc317RpUypWrIi1tbVW4nv8+DEXLlzA2dkZHx8fAKpUqcKlS5d0Loju3r1Ly5YtGT9+vFbiu3HjBl9//TUODg4cPnxYcwH31VdfMWjQIK3fr0whISFMmTKF+vXrs3HjRq2kn/lejBkzhpUrV77w3DNJVWcOWVtbM2nSJK0fjMwvRnR0NNOmTdP8sQC89dZbmJubc+7cOb37e+211xg4cKDWss6dO9OgQQMiIiK0qgucnZ11kh48vVsKCAjg6NGjWtVIv/76K+np6YwaNUon6QGUK1fOwLPO2s6dO3n8+DGdOnXS+oEF6NOnDzVr1iQ8PJy//vrrlY+VaeHChcyaNUvvv2ereTIvNCZOnKhJevC01e6oUaNyJZbIyEiCgoJwcXFh+vTpWkkPoGTJklpX8WXKlNFJevD0Aqlq1aocOHDglWN6lc+kW7duWkkPoG/fvsDT2glDrFixAnia6J69grewsGD69OkALF++XO+2U6ZM0Xq/rK2tefvtt1GpVJw6dcqg42cKCQnJ8nuSVaOqzNi/+eYbrb9je3t7Jk2alG3sOWVhYcG0adMMflb23nvvYWlpybJly7SW37x5kwMHDlCrVi1q165t0L4yvxeZd3DwNPGVKVMGT09PzM3NadiwoVZ1aHBwMGq1mqZNm2p+/+zt7fXWApQtW5ZOnToRERGhVYW/ceNG0tPTGTRokFathUKhYPLkyZiamursa+HChajVaubOnatzp9uzZ09q1KjBrl27iIuLM+jcQRJfjr322mvY2NhoLXNzcwOefgmeb3RhamqKs7Mz9+7d07u/Ro0a6fxYAjRp0gR4+pzmWXv37qVHjx54eXlRqlQpzTOfPXv2kJKSwuPHjzXr/v333wC0atUqh2dpuDNnzgDo/MBmat68udZ6uXXM6Ohovf+eff/PnDmDQqGgcePGOvvIfH9f1T///INKpcLPz0/ne6GPWq1m/fr1dO7cGQ8PD5ycnDSfYXh4OPfv33/lmF7lM6lVq5bOsswLpOjo6BwdP7Mm4Vm+vr44Oztz5coV4uPj8+T4mUaPHp3l90RfU/24uDiuXbuGi4sL3t7eOuWZFwS59V0uX748zs7OBq/v4OBA165duXTpEsePH9csX7FiBSqVyqC7vUyZ34HMxJeSkkJYWJhWdXpAQAB37tzh6tWrWus+f2EUGhpKv379qFatGi4uLprv8y+//AKg9Z3O/D1r1KiRTkzly5fXW10ZFhaGmZkZ27dvZ8aMGTr/UlNTycjI0MRpCKnqzCF9ddCZV2xZ1U+bmpqSnp6utyyrlo2ZfxCxsbGaZYGBgYwdOxalUqlpRGFlZYVCoWDnzp2cP39eq1ot8+6nTJkyBpzZy8mML6vzyKyaetED97wQGxuLnZ2d3jusl21R+rzM8ypdurRB648bN47AwEDc3Nxo2bIlpUuXxtLSEoA1a9boNHB5Ga/ymeirQs78fmdkZBh8fDs7O6277OePHxkZSWxsrM7Fgr6GDZl3AYYe/2W96H0rWbIkdnZ2ufZdfpnv4KBBg1i7di2//fYbjRo1Ii0tjVWrVmFnZ0e3bt0M3k+9evWwtrbm77//JjExkZMnT5KUlKR1sfTsXaGHh4dOwxZ4+sy6b9++WFpa0rx5cypVqkTJkiUxMTHh6NGjhISEaP0mZb7HWSV8FxcXnWroJ0+ekJ6ezqxZs7I9J30XUlmRxGdkjx490rs8MjIS+F8yTU9PZ+bMmbi6unL48GHNXWYmfdVWmT9i9+7dy7MO+ZnxZXUemS2usrooyEt2dnZER0eTkpKik/yyijfz7lvfj2x2icKQO7XIyEgWLVqEj48Pe/fu1am21vd842UY+zOxs7MjKiqKpKQkvcnPmN+J7LzofUtMTCQ2NhZHR0fNsuy+L5D9Bd/zz1cNUbduXWrVqsXWrVuZOXMmwcHBPHz4kMGDB2NtbW3wfszNzWncuDH79+/n+PHjhIaGAtp36bVq1cLOzo7Dhw/TunVrrl69SsWKFbVqVaZPn46FhQUHDx7Ey8tL6xgjR44kJCREa1nmdz7z9+15+t57Ozs70tLScuWiMJNUdRpZaGgoKpVKZ3nmFyaz5d3jx4+JiYmhQYMGOkkvPj5eb/VLvXr1gKcNaF7kZa+qM1uRZjavf17mVaK+Kqy8VrNmTdRqtaarybOe/4PMlHmBkNnw51n6njHVrVsXExMTQkNDX3jFeePGDVQqFS1atNBJenfv3tXbzeBlPhdjfyaZxz969KhOWXh4OJGRkVSuXNmgquH8ZGtry2uvvcajR4+4dOmSTrm+9y2770t6errOo4rcMHDgQFJSUlizZo2mUUv//v1zvJ9n7+iCg4OpUKGCVlIzNTWlUaNGBAcHc+jQIUC3mvPatWt4eXnpJD2VSqVJps/K/D17tqo2061bt7h7967O8vr16xMXF5dlO4mXIYnPyK5evcqvv/6qtWzr1q2cOHECT09PTXcGZ2dnSpYsyenTp7V+YNPS0hgzZozWs71MAwcOxMzMjNmzZxMeHq5T/uyXLPMqVt8fcHbat2+Po6MjW7du1Ukmq1ev5tSpU3h7e+vtypHX3n33XQC+/vprkpKSNMujo6OZPXu23m0yLxaWLVum1Wfr5s2beqtaSpUqRbdu3Xj06BHjx4/XuYhJSkoiKioK+F8XhNDQUK1EFh8fz4gRI/RWh7/M52Lsz+T9998HYOrUqTrf1fHjxwNPG9kURJmxT5gwQauhWGxsLFOnTgW0Y7e1tcXLy4uwsDCtLjJqtZqZM2fm+O/JEN27d0epVLJgwQIOHz6Mn5+fppVlTmQmsT179nDy5Em9z4T9/f158uSJpivJ84mvfPnyXLt2TavGQ61WM2PGDL0XD2+//TZmZmYsWbJEq0pTrVYzdepUvRd4mX1ZR44cqTcxJicn602k2ZGqTiPLbPL7xx9/UK1aNU0/PisrK+bNm6epDjExMWHIkCHMnTuXxo0b8+abb5KWlkZwcDBRUVEEBAToXOFXrVqV77//nk8//ZTmzZtr+vFFRUVx9uxZUlJSNNt4enpSrlw5jh8/zuDBg/Hw8MDU1JR27drh6+ubZfzW1tb8/PPP9OnThy5dutCpUycqVqzI+fPn2bdvH/b29gQGBr5UtU5WsuvOUL9+fU1jnu7duxMUFMTu3btp1KgR7du3Jy0tje3bt1OrVi29D8PffPNNqlSpQlBQEHfv3qVBgwY8ePCA3bt306ZNG73Vkd999x0XL15k+fLlhISE0LJlSywtLbl16xYHDhxgwYIFdOjQAVdXV7p168amTZsICAigRYsWxMbGcvDgQSwtLalevbrOVW2DBg2wtrYmKCgIc3Nz3N3dUSgU9OjRI8u+fMb4TJ7VrVs39uzZw8aNG/Hz86N9+/aafnxXrlyhWbNmWXbENrYPP/yQP/74gz/++IPGjRvTpk0bzXfm3r179OzZky5dumhtM2LECIYPH067du3o0qULJUuWJCwsjLt37+Lv76/3zvdVWFlZ0bt3b00yepm7PXjaGtzJyYl///0X0N8YKrPqMzw8HIVCobPO8OHD+fTTT2natCmdOnXCzMyMsLAwLl++TNu2bdmzZ4/W+pUqVWLcuHFMnTqVgIAA3nrrLU0/vqioKHx9fXX62DZt2pSvv/6ayZMnU7duXd544w0qVqxIcnIyt2/f5tixY5QvXz5H77MkPiOrV68eX3zxBd98842mFVSLFi2YOHGiTlXU+PHjcXJyYuXKlSxbtgw7OzuaN2/OhAkTsuyv1LdvX3x8fJg3bx6hoaHs3r0bR0dHvLy8GDRokGY9U1NTVq1axVdffcXevXuJi4tDrVZTpkyZbBMfQNu2bdm3bx9z5szh8OHDbN26FWdnZ3r16sWXX35JxYoVX+k9et7ChQuzLBs6dKgm8SkUCpYvX87cuXNZs2YNixcvxtXVld69e/Pll1/q7RNWokQJtm7dyqRJk/jjjz84ffo0Hh4eTJ8+nWbNmulNfEqlkn379rFw4UKCgoJYsWIFJiYmlClThrffflvrc5w3bx4VK1YkKCiIJUuWUKpUKdq1a8e4ceM0dxvP73vVqlXMmjWLzZs3a+6g/Pz8su3Ent+fyfMWLVpE48aNWblyJStXrkSlUuHh4cHUqVMZOnRogR3uysLCgqCgIAIDA9mwYQNLlizBxMQEb29vxowZo/czyhyEYf78+axbtw4bGxtef/11Vq5cyTfffJMncb7//vv8/PPPODo66iRiQykUCgICAjQjS+lrhVujRg2USiXR0dH4+PhQqlQprfL+/ftjYWFBYGAga9euxdLSkkaNGrFgwQK2bdumk/gAPvvsM8qUKcOCBQtYs2YNNjY2tGzZkilTpvDWW2/p7bL18ccf4+fnx8KFCzl+/Dh79uzBxsaG0qVL884779C1a9ecnXt0dLTuEN0iz61evZoPP/yQ0aNHv1QnbiFE8fX7778zaNAgPvroI6ZNm2bscHJFbGwsVapUoXr16uzfvz9PjyXP+IQQohDJyMhg3rx5mJiYaNXaFBaPHz/WGa81PT2dCRMmkJycTIcOHfI8hoJZ3yCEEELL8ePHCQkJISQkhDNnztCnT588r7LOCzt37mTq1Kk0b96csmXLEhUVxbFjx7hy5QrVq1fngw8+yPMYJPEJIUQhcOjQIc0sHe+++26hnZy4du3aNGrUiGPHjvHkyRMAKlSowKhRoxgxYkSWAx/kJnnGJ4QQoliRZ3xCCCGKFUl8QgghihVJfEIIIYoVSXyFQEREhLFDeGVyDgWDnIPxFfb4ofCfgyQ+IYQQxYokPiGEEMWKJD4hhBDFiiQ+IYQQxYokPiGEEMWKJD4hhBDFiiQ+IYQQBcL5J2kMD44iTZW3I2nKINVCCCGM7o87yfQ/9IS4NDXmJvBDYyUKhSJPjmW0O745c+bQokUL3N3d8fDwoEePHoSHh2uto1Qq9f4bNWpUlvu9efOm3m3++OOPvD4lIYQQL2HppQR6/PGYuLSnd3rL/01k3vn4PDue0e74jh49ysCBA6lTpw5qtZrp06fTpUsXwsLCcHBwAODy5cta25w6dYqePXvSpUuXF+5/06ZN+Pr6al5n7lMIIUTBoFKrmfRXLPMv6Ca5OwkZqNXqPLnrM1riCwoK0nq9aNEiypcvT2hoKO3atQPA1dVVa51du3ZRuXJl/P39X7h/R0dHne2FEEIUDInpKj44HMWOW8layxXA9Ab2DPWxLnpVnc+Lj49HpVKhVCqzLA8KCqJv374G7e/999+ncuXKtGnThq1bt+ZipEIIIV7Fw8QMOuz+TyfplTRTsOp1R4ZVs8mzpAcFaCLafv36cfXqVQ4dOoSpqalO+bJly/jyyy8JDw+nVKlSWe7n8ePHrFmzBj8/P8zMzNi1axfff/89gYGB9OjRI8vtCvugq0IIURhcTVDwaXgJ7qdo33c5mauZWy0Zb5vcSUmenp5ZlhWIxDdu3DiCgoLYs2cPFStW1LtOixYtqFChAsuWLcvx/j///HOOHz/OsWPHXi1QI4mIiMj2QywM5BwKBjkH4yvs8cPLn8Ohe8n0OfCE2DTttOPjYMb6Vk642+TP0zejV3WOHTuWTZs2sW3btiyT3tmzZzl16pTB1ZzPq1u3LteuXXuFKIUQQryKFf8m0H3fY52k17JsCfa86ZxvSQ+M3I9v9OjRbN68me3bt1OlSpUs11u+fDkVKlSgefPmL3Wcc+fOSUMXIYQwApVazdcnY5l7TrflZn+vknznp8TMJO+e5+ljtMQ3atQo1q9fz6pVq1AqlTx8+BAAa2trbGxsNOslJiayceNGPvnkE70PO6dMmcLJkyfZtm0bAGvWrMHc3JwaNWpgYmLCnj17WLJkCV999VW+nJcQQoinktLVDAuOYsuNJK3lCmBqfTs+yuNGLFkxWuJbsmQJAJ07d9ZaPnr0aMaOHat5HRQUREJCAu+++67e/Tx48IDr169rLZs9eza3b9/G1NQUDw8P5s+fn23DFiGEELkrMimD3n8+5q/INK3lVqYKfmnmQMcKVkaKzIiJLzo62qD13nvvPd57770sywMDA7Ve9+7dm969e79KaEIIIV7B5eg03tn/mJvxGVrLnS1NWNfKibrOFkaK7CkZq1MIIUSuOXwvhfcPPiY2VbsRS1Xl05abFWyNn3aMH4EQQogiYVVEAiNDokl/rpNc8zIlWNbcEWUJo3ckACTxCSGEeEUqtZrp/8Qx+2ycTtn7niWZ01iJeT633MyOJD4hhBAvLTldzYdHo9h0PUmn7Ku6doyobpyWm9mRxCeEEOKlPE7O4N0/nxD6KFVreQlTWBTgSJdKxmu5mR1JfEIIIXLsSkwab+9/zPU47ZabpSxNWNPSkQYuJYwU2YtJ4hNCCJEj/8SYMPpEJNHPtdysYm/GhjecqFgAWm5mp2BHJ4QQokBZdyWRj86XIF2tnfQC3CxY+bpTgWm5mR1JfEIIIV5IpVbzzT+xfH82nqeDjv1P78ol+aGxEgvTgtWIJSuS+IQQQmQrJlXFB0ei2Hs7WadsQh07Pq9R8FpuZkcSnxBCiCxdjUmn15+P+TcmXWu5hQn8HOBA99dKGimylyeJTwghhF5/3k1mwKEnxDzXiMXRXM3aN5xp6FpwW25mp+A/hRRCCJGv1Go1887F8fb+xzpJr3Ypc1bUSi60SQ8k8QkhhHhGUrqaIcFRTPw7FtVzY26+85oVu9o541pCrX/jQkKqOoUQQgBwLyGD9w485p//tOfQM1HAlLp2fORbuBqxZEUSnxBCCE48SuH9A094mKTSWm5noWBpM0dalbM0UmS5TxKfEEIUc6siEvjsWDSp2jkPT3sz1rZ0pLK9uXECyyOS+IQQophKV6mZ8FcMC8MTdMralCvBL80csbcoek1BJPEJIUQx9CQ5g36HojhyP0Wn7LMaNoyvbYdpAZpDLzdJ4hNCiGImPCqN3n8+5sZzMytYmSqY76+kWyHslJ4TkviEEKIY2X4ziaFHokhI1+6SUM7alFWvO1KrlIWRIss/kviEEKIYUKnVfHcmjhmn4nTKGrlasLyFIy5WpkaILP9J4hNCiCIuPk3F8OAott3UHWS6X5WSfOtXeGZWyA2S+IQQogi7EZdO7z8fEx6lPci0mQJm+dkzwMu6SHRKzwlJfEIIUUQduZ9Cv4NPeJKi3UHPqYQJy193xN+t8I63+SqM1kFjzpw5tGjRAnd3dzw8POjRowfh4eFa6wwbNgylUqn1r1WrVi/c99GjR2nWrBmurq7UrFmTpUuX5tVpCCFEgaNWq/klPJ6ue//TSXq+juYc6OhcbJMeGPGO7+jRowwcOJA6deqgVquZPn06Xbp0ISwsDAcHB816zZs3Z9GiRZrXFhbZtzi6ceMG77zzDu+++y6//PILoaGhfP755zg5OdG5c+c8Ox8hhCgIUjLUfBEazYp/E3XKulS0YoG/EmvzotcpPSeMlviCgoK0Xi9atIjy5csTGhpKu3btNMtLlCiBq6urwfv97bffcHNz47vvvgPAy8uLv//+m/nz50viE0IUaY+SMnj/wBPCHqXqlI2vbcuomrbF7nmePgUm7cfHx6NSqVAqlVrLjx8/TuXKlalbty6ffPIJkZGR2e7nxIkTvP7661rLWrZsyalTp0hLS8tiKyGEKNyOP0yh6dZHOknPxkzB6tcd+aKWnSS9/6eIjo4uEBMr9evXj6tXr3Lo0CFMTZ/2Jdm0aRNWVlZUqFCBW7duMW3aNFQqFYcOHaJECf3103Xr1uWdd95h9OjRmmUhISG0b9+eS5cu4ebmpne7iIiI3D8pIYTIY2o1rL1nxk/XzclAO7GVs1Qx2zsFD+sC8TOfrzw9PbMsKxCtOseNG0doaCh79uzRJD2Abt26af5frVo1atWqRfXq1dm7dy+dOnXK1Riye5OMLSIiokDHZwg5h4JBzsH4cjP+2FQVH4dEsfWGbv+85mVK8FtzRxxK5H7FXmH/DIye+MaOHUtQUBDbt2+nYsWK2a5bunRpypQpw7Vr17Jcx8XFRac6NDIyEjMzM5ycnHIjZCGEMLrwqDT6HHjCldh0nbJPq9swvo4dZkV0kOlXZdTEN3r0aDZv3sz27dupUqXKC9d//Pgx9+/fz7axS4MGDdixY4fWsoMHD1K7dm3MzYvWnFJCiOJpw9VERh6LJvG58TbtLBQsDHDgzfJWRoqscDBa45ZRo0axZs0aFi9ejFKp5OHDhzx8+JD4+HjgaWOXCRMmcOLECW7evElwcDA9e/bE2dmZDh06aPYzZMgQhgwZonndv39/7t+/z5gxY7h8+TIrVqxgzZo1fPTRR/l+jkIIkZtSMtSMOh7NB0eidJKer6M5hzu6SNIzgNHu+JYsWQKg08Vg9OjRjB07FlNTU8LDw1m3bh0xMTG4uroSEBDAb7/9hq2trWb9O3fuaG1fsWJFNmzYwLhx41i6dClubm7MmjVLujIIIQq12/Hp9Dv4hJP/6bZOf8+zJN/5KbEyk6pNQxgt8UVHR2dbbmVlpdPXT5+dO3fqLPP39+fIkSMvG5oQQhQof95NZvDhKJ1RWEqYwnd+SvpUsTZSZIWT0Ru3CCGE0C9zKqGZp+J4vkNCBRtTlrcoHvPn5TZJfEIIUQA9Sc7ggyNR/HE3RaesrbslCwMcUOZBV4XiQBKfEEIUMP9EptLn4BPuJGRoLTdRwIQ6doysboOJjMLy0iTxCSFEAaFWq/ntciJjwqJJ1X6cRylLE35t5kCzMpbGCa4IkcQnhBAFQEKaik+PR7PhapJOWUMXC35r7kgZa1M9W4qcksQnhBBGdiXm6Sgs4dG6o7AM87Fman17zGUUllwjiU8IIYxo240kPjwaRVyadrtNGzMF8/yVdK1U0kiRFV05ahKUmprKihUrGDx4MF26dOHMmTPA0z55a9eu5e7du3kSpBBCFDVpKjUTTsTQ5+ATnaRXVWnGgY7OkvTyiMF3fE+ePKFjx46Eh4drBoLO7IRuZ2fHN998w6VLl5gyZUpexSqEEEXCg8QM+h96wvGHuhPGdn/Nih8aK7Ep5rOk5yWD39nJkydz+/Zt9uzZw7Fjx1Cr/3eFYmJiQqdOndi/f3+eBCmEEEXFyRgTmm57pJP0zE3g24b2LG7qIEkvjxn87u7Zs4chQ4bQsGFDvbP4enh46IybKYQQ4imVWs2P5+L48FwJHiVp91UoW9KUXe2c+cDHRmZJzwcGV3XGxcVRrly5LMtTUlLIyMjIslwIIYqryKQMhgVnjsKindhalCnB4mYOlLKUrgr5xeA7vtdee41Tp05lWX7gwAG8vb1zJSghhCgqDt1Lxn/rI71Dj31R05bf33CSpJfPDE58ffv2Zc2aNWzYsAGV6ultukKhIDExka+++ooDBw7Qv3//PAtUCCEKkzSVmil/x9B172MePle1qbRQsKGVE+Pr2GEq/fPyncFVnUOGDOHSpUsMGTJEMx/egAEDiI6OJiMjg0GDBvHuu+/mWaBCCFFY3IxLZ9DhJ/wVqTt3Xk27DFa1KYO7jXSjNpYcvfNz586lZ8+ebN68mWvXrqFSqahUqRJdu3alcePGeRWjEEIUGluuJ/HJsShiU7X75imAUTVtecvmoSQ9I8vxu9+wYUMaNmyYF7EIIUShlZiuYmxYDMv/TdQpK13ShEVNHWlaugQREQ+NEJ14llx2CCHEKwqPSmPAoSdc0jPWZht3S372V+IkDVgKDIMTX40aNbLtX6JQKLC0tKRMmTIEBATQv39/lEplbsQohBAFklqtZtnlRMaeiCb5ud5cFiYwpZ49Q32spW9eAWNwq84mTZpgbW3NrVu3sLGxoUaNGtSoUQMbGxtu3bqFtbU1Xl5eREZGMnXqVBo3bsyNGzfyMHQhhDCe6BQVfQ8+4dPjuknPw86Ufe2dGVZNOqQXRAYnvjfffJP79++zc+dOQkJCWLlyJStXriQkJITt27dz//59evXqRXBwMNu2bSM6OpqpU6fmZexCCGEUYQ9T8N/6iG03k3XKenpYcaiTC7VKWRghMmEIgxPfjBkz+OCDD/S23vT392fQoEF8/fXXAAQEBNCvXz8OHTqUa4EKIYSxZajUfH8mjjd3/8edBO3bPBszBYuaOrCwqSO2MtZmgWbwM75r165hb2+fZblSqeTatWua115eXiQm6rZuEkKIwuh+YgZDjkRx5L7uCCw1ncxZ2swRD3tpL1gYGHxZUrFiRdauXas3mSUkJLB69WoqVKigWXb//n1KlSqVO1EKIYQR7budjP+WR3qT3vBq1uxr7yxJrxAx+JMaM2YMAwYMoH79+vTo0YOKFSsCcP36dTZs2MCDBw/49ddfAcjIyGDDhg3S308IUailZqiZcjKWBRfidcqcSpgQGOBAa3dLI0QmXoXBia9Lly5YWVkxZcoU5s6dq1Xm7e3N999/T9u2bYGnTXy3bNmSbXeGOXPmsH37dq5cuYKFhQX16tVj8uTJ+Pj4AJCWlsa0adPYv38/N27cwNbWloCAACZPnoy7u3uW+w0ODqZjx446y0+cOEGVKlUMPV0hRDF3LTadAYeecPqx7rBjAW4W/NLMkdIlpW9eYZSje/M2bdrQpk0bHjx4wO3btwFwd3fHzc1Ne6dmZpQvXz7bfR09epSBAwdSp04d1Go106dPp0uXLoSFheHg4EBiYiJnzpxh1KhRVK9endjYWCZMmED37t0JCQnBzCz70ENDQ3FwcNC8lmpXIYSh1l9N5PNj0cSnaw87ZqqAsbXt+LS6jQwuXYi9VKW0m5ubTrLLqaCgIK3XixYtonz58oSGhtKuXTvs7e3ZsmWL1jpz587Fz8+Py5cvU61atWz37+zsjJOT0yvFKIQoXuLTVHwRGsPaK7ptGcpZm/JrMwcaupYwQmQiN+U48d27d48zZ84QGxurmZ7oWb169XqpQOLj41GpVNlWj8bFxQEYNCJM8+bNSU1NxcvLi1GjRtG0adOXiksIUTyc/i+VQYejuBKrO+xYxwqWzGvigLKEdFMoChTR0dHqF6/2dIb1Dz/8kM2bN6NSqVAoFKjVTzd9dmSCJ0+evFQg/fr14+rVqxw6dAhTU91689TUVDp27IiDgwPr1q3Lcj8REREEBwdTp04dUlNTWb9+PUuXLmXnzp3ZziARERHxUnELIQq3dDUsv23G4tvmZKi1qy8tFGo+ey2Nt9zSkQFYChdPT88sywxOfJMmTeLnn39m3LhxNGzYkA4dOhAYGIibmxvz588nMjKShQsXvtQs7OPGjSMoKIg9e/ZoWos+Kz09nUGDBnHp0iV27dqFo6Njjvb/9ttvY2pqmm3CLMgiIiKy/RALAzmHgkHOQdvVmHSGBuufN8/L3oylzR2p5mieK8fKJJ+B8Rl8375582Z69uzJZ599pklupUuXpnnz5mzcuJGSJUuydOnSHAcwduxYNm3axLZt27JMegMHDuTChQts3bo1x0kPoG7dulqd64UQxZtarea3SwkEbHukN+n1rVKSg52ccz3piYLB4MT36NEj6tevD6BpUZmc/HScOoVCQefOndm2bVuODj569GhN0tPX1SAtLY3+/ftz4cIFtm/fjqura472n+ncuXMvva0Qomh5kJhBjz8e8+nxaBKfa7VZytKE1a878mMTB0qayfO8osrgxi2lSpUiNjYWAFtbW6ysrLh+/bqmPC0tjYSEBIMPPGrUKNavX8+qVatQKpU8fPh0ckZra2tsbGxIT0+nb9++nDp1irVr16JQKDTr2NnZYWVlBcCQIUOAp61CAX7++WfKly+Pt7c3qampbNiwgZ07d7JixQqDYxNCFE1bbyTx6bFonqToNsxr527JT02UOFtJ37yizuDEV716dU6ePAk8vcNr0qQJgYGB1KxZE5VKxS+//EL16tUNPvCSJUsA6Ny5s9by0aNHM3bsWO7evcuuXbuApy00n7VgwQLeffddAO7cuaNVlpaWxqRJk7h37x6WlpZ4e3uzYcMGWrdubXBsQoiiJSZVxejQaNZdTdIpszFTMKOhPe95lpQphIoJgxNf3759Wb16NcnJyVhaWjJ16lQ6dOhA+/btUavVODo68s033xh84Ojo6GzLK1So8MJ1AHbu3Kn1esSIEYwYMcLgOIQQRVvw/RSGBUfpzKYA0MjVgsAAByrayjibxUm2n3ZmkgNo164d7dq105R5e3tz6tQpgoODMTU1xc/PT2ZcF0IUGMnpar7+J5afL8TzfNN1cxMYX9uOj31lBJbiKNvEV758eWrVqkXDhg1p1KgRjRo10hoGzM7Ojvbt2+d5kEIIkRNnH6cy5EgUF6N1O6P7KM1Y2NSBGk4yUWxxlW3i69SpE6GhocyfP58FCxYATzsFNmrUCD8/P/z8/PR2QRBCCGPIUKn56Xw800/FkvZc+xUF8GE1GybUscPSTO7yirNsE19mA5Q7d+4QFhbG8ePHCQ0NZeXKlSxfvhyFQoGbm5smCfr5+VGjRo18CVwIIZ51Iy6doUeiCH2UqlNWztqUwAAHAkrLOJvCwMYt5cqVo1y5cnTr1g2A2NhYTpw4QWhoKKGhoezZs4ctW7agUCh4/PhxngYshBDPUqvVrIxIZFxYjM5sCgC9KpdkZkN77C2kX5546qWaMtnZ2VG7dm2Sk5NJSkoiNjaWc+fO5XZsQgiRrUdJGXwSEs2e28k6ZY4lTPihsZJOFa2MEJkoyAxOfNeuXdNUdYaGhnL16lVMTEzw9fXFz8+PkSNHyozrQoh8s+NmEiOPRfNfsm5n9NblSjCviQOuMlGs0CPbxPfzzz8TGhpKWFgYjx49ws7OjgYNGvDOO+/QsGFD6tWrR8mSJfMrViGEID4dPjoaxaoI3TnzSpopmN7Anr5VpDO6yFq2iW/8+PGYm5vTtWtXhg0bRq1atfIpLCGE0HXsQQqDTllyL0U36dV3NmdRU0des5PO6CJ72X5D3nnnHcLCwtiwYQNbt27V9Onz8/OjQYMGMsO5ECJfJKWrmXEqlnnn41E/N7a+mQLG1LZjZHUbzKQzujBAtokvc+DnBw8eaJ7tHT58mAULFqBSqfDw8MDPz0+TDCtXrpwvQQshio/Qhyl8dDRa78zoXvZmLGrqQK1S0hldGM6gOgE3Nze6dOlCly5dAEhISOCvv/7SJMOtW7cSHx+Pk5OTzGQuhMgVCWkqpp6M5ZeLCTpDjgEM9bFmcl17rKQzusihl6oMt7a2xtvbm5iYGKKjo4mMjCQ8PFz68AkhcsXheyl8EhLFzXjdgaVdLFQsbuFMszKWRohMFAUGJ75///2X0NBQTZeGmzdvAk87j3p4ePDuu+/i5+eXZ4EKIYq+2FQVk/+O4bfLuo1XAPp7laSPw3/UlqQnXkG2iW/evHkcP36cEydO8OTJE9RqNWZmZtSoUYM333wTPz8/GjVqRKlSpfIrXiFEEfXHnWRGhERzN1H3Lq+CjSk/NXGgWZkSRET8Z4ToRFGSbeKbNGkStra21KtXTzMWZ/369TWznwshxKuKTlEx7kQMa67o3uUpgA+8rZlY1w4bcxlyTOSObBPfoUOHqF69OiYm8oUTQuS+nTeT+Ox4NA+TdEdfqWxnxjx/JY1cZWBpkbuyTXw1a9bMrziEEMXIf8kZjA6NYdP1JJ0yEwV8XM2GMbXtpMWmyBMyxIEQIt+o1Wo2X0/ii9AYHqfo3uV5K81Y4O9AHWfplyfyjiQ+IUS+eJiYwefHo9lxS3cmBTMFfFbTls9r2FLCVO7yRN6SxCeEyFNqtZp1V5MYGxZNdKpuV/QajubM91dSw0nu8kT+kMQnhMgzdxMy+PRYFPvupOiUWZjA6Fp2fFLdBnMZY1PkI4MTX0REBJ6ennkZixCiiFCr1az4N5GJf8UQm6Z7l1fP2Zz5/g5UVZobITpR3Bmc+Bo0aEDdunXp0aMHb731lszMIITQ60ZcOiNCojl8X/cuz9IUxtexY7iPDaZylyeMxOAOejNmzECtVvPll1/i7e1Nr1692Lp1K6mpqXkZnxCikFCp1fwSHk+TLY/0Jr1GrhaEdHblY19bSXrCqAxOfEOHDuXPP//k77//ZsSIEVy6dIl+/frh6enJiBEjOHbsWI4PPmfOHFq0aIG7uzseHh706NGD8PBwrXXUajUzZsygatWquLm50b59ey5evPjCfW/dupWGDRvi4uJCw4YN2b59e47jE0IY5nJ0Gu13/8eXYTEkpGtXbVqbKfjOz56d7UrhYS/NCoTx5XhIFg8PD8aPH8+pU6fYs2cPb7/9Njt27KBDhw7UrFmTb775hmvXrhm0r6NHjzJw4ED27t3Ltm3bMDMzo0uXLkRFRWnW+fHHH1mwYAGzZs3iwIEDODs707VrV+Li4rLc74kTJxgwYABvv/02wcHBvP322/Tr14+///47p6crhMhGUrqaaf/E4r/1Eccf6tb+NC9TgmNdXBjsbYOJQu7yRMHwSmOR1ahRg4YNG+Lr64tarebevXv89NNP1KtXj969e3Pv3r1stw8KCuK9997Dx8eHatWqsWjRIv777z9CQ0OBp3d7gYGBjBw5ks6dO+Pj40NgYCDx8fH8/vvvWe43MDCQgIAARo0ahZeXF6NGjcLf35/AwMBXOV0hxDMO3UumyZaHzD4TR9pzfdHtzBX81ETJ5tZOVLCVuzxRsOQ48anVag4ePMjQoUOpUqUKQ4YMITo6munTp3Px4kUuX77MtGnTOH78OEOGDMnRvuPj41GpVCiVSgBu3rzJw4cPef311zXrWFlZ0bhxY8LCwrLcz19//aW1DUDLli2z3UYIYZhHSRkMPvyELnsfcy1OdyaF1uVKcLyrK32qWKOQuzxRABl8KXb27Fk2bNjApk2bePjwIS4uLvTr149evXrh4+Ojte7w4cMxNzdnwoQJOQpmzJgxVK9enQYNGgDw8OFDAJydnbXWc3Z25v79+1nu5+HDh3q3efToUY7iEUL8j+r/uyhM/juGGD0d0V2tTJjVUEnnipaS8ESBZnDia9asGZaWlrz55pv06tWL119/PdtZG7y8vKhfv77BgYwbN47Q0FD27NmDqampwdvlloiIiHw/Zk4U9PgMIedQMLzMOVxJUDDjigVn43T/NhWo6V46neEV0rBJj+fKldyIMnuF/XMo7PFDwT+H7PqdG5z4fvzxR7p06YKdnZ1B6zdt2pSmTZsatO7YsWMJCgpi+/btVKxYUbPc1dUVgMjISNzd3TXLIyMjcXFxyXJ/rq6uREZGai170TYFuXN+URg8QM6hYMjpOSSmq/judBzzzseTrnuTh6+jOT82VlI3HweVLuyfQ2GPHwr/ORj8jK9Pnz4GJ72cGD16NJs2bWLbtm1UqVJFq6xChQq4urpy8OBBzbLk5GSOHz9Ow4YNs9xn/fr1tbYBOHjwYLbbCCG07b+TTKPNj5h7TjfplTRT8HV9Ow51dM7XpCdEbsjyji8kJOSldtikSROD1x01ahTr169n1apVKJVKzTM9a2trbGxsUCgUDBs2jDlz5uDp6UnlypWZPXs21tbWdO/eXbOfTp06UbduXSZPngw87XP45ptvMnfuXNq3b8+OHTsIDg5mz549L3VOQhQnDxIzGBsWw+YbunPlAbR1t+RbP3vK20hrTVE4ZfnN7dChg9YDarVane0D68zyJ0+eGHzwJUuWANC5c2et5aNHj2bs2LEAjBgxgqSkJL744guio6OpW7cuQUFB2Nraata/fv06ZcuW1bxu2LAhS5cuZdq0aUyfPp1KlSqxdOlS6tWrZ3BsQhQ3GSo1v11OYOrJWL3ja5YpacIsPyUdykvjFVG4ZZn48mOkk+jo6Beuo1AoGDt2rCYR6nPu3DmdZZ07d9ZJqEII/c4+TuXTY9Gc/C9Np8xEAR94WzO+jh225q/U9VeIAiHLxOfv75+fcQghjCAhTcXM03H8fCGeDD2NV2o6PW28UquUPMcTRYdBl2+JiYk4Ojoye/bsvI5HCJFP9txOouHmR8w7r5v0bMwUzGhgz58dnCXpiSLHoKfTJUuWpFSpUnnSqlMIkb/uJWQwOiya7TeT9ZZ3KG/JLD8lZa3zvz+tEPnB4Ar7Ll26sHnzZlQq1YtXFkIUOBkqNevumdFw80O9Sa+ctSlrWzqyqqWTJD1RpBncHrlDhw4EBwfTtm1b+vTpQ8WKFbGystJZr27durkaoBDi1Z36L5XPjkdz6j8LQLte01QBw3xsGFPbFhtpvCKKAYMT37MtJP/66y+d5swv051BCJG3/kvOYOrJWFb+m4ietivULWXO3MZKajjJczxRfBic+BYsWJCXcQghclG6Ss3SSwl8cypW74DSduYKJta1Y4CXtcyGLoodgxNf79698zIOIUQuOfoghS9DowmPStdb3qWiFTMa2lO6pDzHE8WTjDkkRBFxNyGDSX/FsOm6/qHGPO3N+LhcPH0alNVbLkRxYXDi+/DDD1+4jkKhYP78+a8UkBAiZ1Iy1Cy4EM/3Z+JI0DOFgo2ZgtG1bBniY8PNa7FGiFCIgsXgxHfkyBGdBi0qlYoHDx6QkZFBqVKlKFmyZK4HKITI2r7byYwJi9Y7EzpADw8rptSzx02qNYXQMDjx6RsPEyAtLY3ffvuNwMBANm/enGuBCSGydi02nbEnYth7W38n9OqO5nznZ4+fa4l8jkyIgu+Vn/GZm5vzwQcfcPnyZb788ks2bNiQG3EJIfRISFMx5+zTiWFT9Ywl4VBCwcQ69vStUlJaawqRhVxr3OLr68v69etza3dCiGeo1Wo2X09i4l+x3E3UrdY0UUB/L2vG17bF0VKqNYXITq4lvoMHD+odyUUI8WrCo9L4MjSaow9S9Zb7uVgwy8+emtIJXQiDGJz4Zs2apXd5TEwMx44d48yZM3z66ae5FpgQxV10iooZp2JZcilB75RBblYmTK1vz9uvWcnEsELkgMGJb+bMmXqXK5VKKlWqxNy5c+nbt2+uBSZEcaVSq1kdkciUk7H8l6z7IM/c5OnYml/UspWJYYV4CQYnvqioqLyMQwgBnIxM5ctQ/TOhA7QsW4KZDe3xtDfP58iEKDpk5BYhCoDIpAymnIxlVUSi3vIKNqZMb2DPm+UtpVpTiFeU48S3b98+9u3bx61btwAoX748bdu2pVWrVrkenBBFXXK6mkUXn466Epum+yDPylTBpzVs+NjXFiszSXhC5AaDE19ycjJ9+/Zl//79mJiY4ObmBsCBAwdYunQpb7zxBitWrKBECekwK8SLqNVqgq4n8dXJWG7H6x91pXNFS76ub095G6mYESI3GfxkfMaMGezbt48vv/ySa9eucf78ec6fP8/169cZM2YM+/fvz7IBjBDif8IepvDGzkgGHo7Sm/S87M3Y2saJ5S2cJOkJkQcM/qvatGkT7733HmPGjNFabmtry5dffsnt27fZuHEjkydPzvUghSgKbsSl89XfsWy5oX/2BHsLBaNr2THY2xpzGXVFiDxjcOKLjIykdu3aWZbXqlVLhisTQo/oFBWzz8Txy0X9w4yZKWCQtzVf1pRRV4TIDwZXdZYtW5YjR45kWX7kyBHKlpV5voTIlKZSsyg8njqbHjL/gv6k16G8JWFdXZnZUClJT4h8YnDi6927N1u3buXjjz/m4sWLpKWlkZaWxsWLF/nkk0/Yvn077733Xo4OHhISQs+ePfH29kapVLJ69WqtcqVSqfffqFGjstznzZs39W7zxx9/5Cg2IV6WWq1m580kGm1+xOiwGJ6k6Ga8Wk7m7GxXilUtnfCwl+d4QuQng//iPvvsM27evMmqVatYvXq1pi+RWq1GrVbz/vvv53jIsoSEBHx8fOjVqxdDhw7VKb98+bLW61OnTtGzZ0+6dOnywn1v2rQJX19fzWsHB4ccxSbEyzj9Xyrj/4ohJItxNcuWNGVSPTvefs0KE+mPJ4RRGJz4TExMmDdvHkOHDmXfvn3cvn0bAHd3d1q3bk21atVyfPDWrVvTunVrAIYPH65T7urqqvV6165dVK5cGX9//xfu29HRUWd7IfLK3YQMvj4Zw/qrSegZVhMbMwWf1rBleDUb6Y8nhJHluI6lWrVqL5XkXlV8fDxBQUGMHj3aoPXff/99kpOT8fDwYPjw4XTu3DmPIxTFUXyaih/OxbPgfDxJekaSNlFAH8+SjKtjh4uVPMMToiAoNA8Xfv/9d1JTU+nVq1e269nY2PD111/j5+eHmZkZu3bton///gQGBtKjR498ilYUdRkqNauvJDLtn1geJelptQK0KluCqfXt8XGQcTWFKEgU0dHR+mpmAKhZs2bOdqZQcPr06ZcKpGzZsnz77be8++67estbtGhBhQoVWLZsWY73/fnnn3P8+HGOHTuW5ToRERE53q8onkKjTPjxugVXEvW3DfMoqWJEpVQaOehPiEKIvOfp6ZllWbZ3fFWrVtV6nZ6ezoEDB6hXrx6Ojo65E50Bzp49y6lTp5g0adJLbV+3bl2dFqPPy+5NMraIiIgCHZ8hisI57Dl9hSWPlPxxN0VvuYuVCeNr2/GuZ0nMCmgH9KLwORT2cyjs8UPhP4dsE9/69eu1Xj9+/JjKlSszYcIEmjVrlqeBPWv58uVUqFCB5s2bv9T2586dk4Yu4qU9SMxg1ulYll+2RIVu0rM0hY98bRlR3UbmxxOiEMjRM77cng4lPj6ea9euAaBSqbhz5w5nz57FwcEBd3d3ABITE9m4cSOffPKJ3uNPmTKFkydPsm3bNgDWrFmDubk5NWrUwMTEhD179rBkyRK++uqrXI1dFH3RKSrmnY8jMDyBxHQ1oPv96+FhxcQ6dpSTMTWFKDSM+td66tQpOnbsqHk9Y8YMZsyYQa9evQgMDAQgKCiIhISELJ/9PXjwgOvXr2stmz17Nrdv38bU1BQPDw/mz58vDVuEwRLTVSy+mMDcs3FEp+p/BN7Y1YJvGthTu5RFPkcnhHhVRk18AQEBREdHZ7vOe++9l+2IMJkJMlPv3r3p3bt3boQnipk0lZrVEYnMOh3L/UT9DVM87EyZUs+e9jIhrBCFltTPiGJPpVaz5XoS0/6J5Vqc/rnxXKxM6Fs6mS/8K2JhKglPiMIs28R38uRJrdexsbHA0xY9NjY2erepW7duLoUmRN5Sq9UcuJfClL9jOfskTe86duYKRlS3ZaiPNfduXJWkJ0QRkG3ia9Wqld7qnC+//FJnmVqtRqFQ8OTJk9yLTog88tejVKacjOFoFmNqWprCEG8bRtawxaGEtNQUoijJNvEtWLAgv+IQIl9cjErj639i2XUrWW+5qQLe9yzJl7XsKGMtQ4wJURRlm/ikkYgoKm7GpTPzdBzrriTqHUQaoGtFK8bXsaWyvQwxJkRRJo1bRJEWmZTB7DNxLL2cQFoWI4i1LFuCiXXsqCVdE4QoFiTxiSIpNlXF/AtPZ01ISNd/j1ff2ZxJde0JKF0in6MTQhiTJD5RpCSnq1lyKZ45Z+P1znwOUFVpxsQ6drwpffGEKJYk8YkiIV2lZu2VRGadjuNOgv6+eOWsTRlX25YeHiUxLaCDSAsh8p4kPlGoqdRqtt1IZvqpWP6NSde7TilLE0bVtKW/lzUlpB+eEMWeJD5RKKnUarbfTGbW6VjCo/QnPFtzBR/52jC8msyaIIT4H0l8olBRqdXs+P+EdyGLhGdhAoO8rfmshi2lLKUvnhBCmyQ+USio1Wp23kpm5uk4zmcxvJiJAnpXLsnoWra4yzRBQogsyK+DKNDUajW7/j/hncsi4SmA7q9Z8UVNW6oopfO5ECJ7kvhEgaRWq9lz+2nCO/M464T3ViUrvqxli5ckPCGEgSTxiQJFrVaz904yM0/FcTqbhNe10tM7PG8HSXhCiJyRxCcKBLVazb47Kcw8Hcup//QnPIAuFZ/e4flIwhNCvCRJfMKo1Go1f9xNYeapWE5mk/A6V7Tky5p2VHOUhCeEeDWS+IRRqNVq/rz79A7v78isE16nCpZ8WcsOX0l4QohcIolP5KvMWc9nnorlr2wSXofyloyubUd1SXhCiFwmiU/kC7UaDt5NZsapOE5E6p/1HKB9eUtG17KlhpNMESSEyBuS+ESeUqvVHL6fwuRzJTgT+zjL9dq5WzKmti01JeEJIfKYJD6RJ1RqNbtvJTP3XNz/P8PTP3RYW3dLxtSylUlghRD5RhKfyFXpKjVB15OYezaOi9H6x9IEaFOuBGNq21FbEp4QIp9J4hO5IiVDzZqIRH48H8eNOP3z4QG0LleCMbXsqOMsCU8IYRxGnaslJCSEnj174u3tjVKpZPXq1Vrlw4YNQ6lUav1r1arVC/d79OhRmjVrhqurKzVr1mTp0qV5dQrFXnyainnn46i58QGfHo/OMukFOKbzRwdnNrxRSpKeEMKojHrHl5CQgI+PD7169WLo0KF612nevDmLFi3SvLawyP5H88aNG7zzzju8++67/PLLL4SGhvL555/j5ORE586dczX+4iwqRcWi8HgWXYwnKkWtdx0TxdOxNEdWt6XE4xt4SsITQhQARk18rVu3pnXr1gAMHz5c7zolSpTA1dXV4H3+9ttvuLm58d133wHg5eXF33//zfz58yXx5YIHiRksuBDPb5cSiE/Xn/DMTZ5ODzSiui2v2T39ikVk3aBTCCHyVYF/xnf8+HEqV66Mvb09TZo0YeLEiTg7O2e5/okTJ3j99de1lrVs2ZK1a9eSlpaGubl0iH4ZN+LS+elcPKuvJJCSxSO8kmYK+nmV5MNqtpS1lglghRAFU4FOfK1ataJjx45UqFCBW7duMW3aNDp16sShQ4coUaKE3m0ePXpE8+bNtZY5OzuTnp7O48ePcXNzy4fIi46LUWnMPRfHpmtJZOi/wcPeQsEH3jYM9bHGSWY8F0IUcAU68XXr1k3z/2rVqlGrVi2qV6/O3r176dSpU64eKyIiIlf3l9vyO74LcSYsu23GoSdZf0UczdW8WzaNt9zSsTFL4MlteJLNPgv6e2wIOYeCobCfQ2GPHwr+OXh6emZZVqAT3/NKly5NmTJluHbtWpbruLi4EBkZqbUsMjISMzMznJycstwuuzfJ2CIiIvIlPrVaTfCDVOacjePQvZQs13O3MWWErw3velpjZaYwaN/5dQ55Sc6hYCjs51DY44fCfw6FKvE9fvyY+/fvZ9vYpUGDBuzYsUNr2cGDB6ldu7Y838uCSq1m7+1k5pyNy3bgaC97Mz6tYUu316wwNzEs4QkhREFj1MQXHx+vuXtTqVTcuXOHs2fP4uDggIODAzNnzqRTp064urpy69Ytpk6dirOzMx06dNDsY8iQIQCaLg/9+/dn8eLFjBkzhv79+xMWFsaaNWtYsmRJ/p9gAZea8XSUlZ/OxxEelfUoK7WczPmshi0dKlhiopCEJ4Qo3Iya+E6dOkXHjh01r2fMmMGMGTPo1asXc+bMITw8nHXr1hETE4OrqysBAQH89ttv2Nraara5c+eO1j4rVqzIhg0bGDduHEuXLsXNzY1Zs2ZJV4ZnRKeoWP5vAovC47mXqMpyPX83Cz6rYUuLMiVQSMITQhQRRk18AQEBREdHZ1keFBT0wn3s3LlTZ5m/vz9Hjhx5ldCKpFvx6SwMj2fF5cQs++ABtHG35LPqNjR01d9yVgghCrNC9YxPvJxT/6Uy/3w8W25k3SXBRAFdK1oxsoatTP4qhCjSJPEVUZkNVuZfiCfkQdYTv5Y0U/Bu5ZIMq2ajGWVFCCGKMvmlK2KS09Wsv5rI/AvxRMRk3WDFxcqED7xtGOBVEkfpdC6EKEYk8RURj5MzWHIpgcUXE/gvOesGK1WVZnxYzYa3XyuJpYF98IQQoiiRxFfIXYlJ4+cLCay5kkBy1tPg0bR0CT72taFl2RLSJUEIUaxJ4iuE1Go1oY9SmXc+nt23ksmqfaapArpVsuJDXxtqOsmUQEIIAZL4CpV0lZodN5OZdz6Ok/9lPcKKrbmCfl7WDPG2ppyNfMRCCPEs+VUsBBIzYGF4PD9fiOdWfNb1meWsTRnqY02fKtbYWZjkY4RCCFF4SOIrwG7Hp/PrpQR+DbciLiMmy/VqOJrzsa8NXSrJGJpCCPEikvgKGLVazbGHqSwKj2fHrWRUagD9yax1uRJ85GtLgJuFDCkmhBAGksRXQCSlq9l4LZFF4fFcyGbAaAsT6OFRkg99baiqlBFWhBAipyTxGVlmdebyfxOISsl6/EyHEgoGVrVhcFVrXEtKh3MhhHhZkviMQK1WE/L/1Zk7NdWZ+vkozehcKoGP/CpibS4NVoQQ4lVJ4stHiekqfr+WxMLw+GznvzNRwJvulnzgY0OAmwVXrlyRpCeEELlEEl8+uBWfzq8XE1gRkX11ptJCQZ8q1gysak0FW/lohBAiL8ivax5Rq9UcffC0OnPX7RdUZzqYMcTbhrc9rChpJnd2QgiRlyTx5bLEdBUbryax6KJh1ZlDfGzwl+4IQgiRbyTx5ZKbcU9bZ674N4Ho1OxbZ/bxtGagtzXlZTgxIYTId/LL+4rCHqYw7/yLqzOrOZgxxMeG7q9JdaYQQhiTJL5XFPwglR23kvWWmSigffmn1ZlNXKU6UwghCgJJfK+ob5WSfHs6ltRn5n51KKGgbxVrBlSV6kwhhCho5Ff5FTlbmdLttZKsvZKoqc58+7WSWMns5kIIUSBJ4ssFn9Ww4T3PkjSW6kwhhCjwJPHlAk97czztjR2FEEIIQ0jzQiGEEMWKJD4hhBDFilETX0hICD179sTb2xulUsnq1as1ZWlpaUyePJnGjRtTpkwZvLy8GDRoELdv3852n8HBwSiVSp1///77b16fjhBCiELAqIkvISEBHx8fZs6ciZWVlVZZYmIiZ86cYdSoURw+fJg1a9Zw9+5dunfvTnp61kOBZQoNDeXy5cuafx4eHnl1GkIIIQoRozZuad26Na1btwZg+PDhWmX29vZs2bJFa9ncuXPx8/Pj8uXLVKtWLdt9Ozs74+TklKvxCiGEKPwK1TO+uLg4AJRK5QvXbd68OV5eXnTq1IkjR47kcWRCCCEKC0V0dHQ2I0zmn7Jly/Ltt9/y7rvv6i1PTU2lY8eOODg4sG7duiz3ExERQXBwMHXq1CE1NZX169ezdOlSdu7cSePGjfMqfCGEEIVEoejHl56ezgcffEBMTAxr167Ndl1PT088PT01rxs0aMCtW7f46aefJPEJIYQo+FWd6enpDBw4kAsXLrB161YcHR1zvI+6dety7dq1PIhOCCFEYVOg7/jS0tIYMGAAFy9eZMeOHbi6ur7Ufs6dO/fS2wohhChajJr44uPjNXdiKpWKO3fucPbsWRwcHChdujR9+/bl1KlTrF27FoVCwcOHDwGws7PTdH8YMmQIAIsWLQLg559/pnz58nh7e5OamsqGDRvYuXMnK1asMMIZCiGEKGiM2rglODiYjh076izv1asXY8aMoWbNmnq3W7BggaYRTPv27QHYuXMnAD/++CPLly/n3r17WFpa4u3tzaeffqrpNiGEEKJ4M+ozvoCAAKKjo3X+BQYGUqFCBb1l0dHRWi0/d+7cqUl6ACNGjOCff/7hwYMH3Lhxg927dxfapPfgwQOGDh2Kh4cHrq6uNGzYkKNHjxo7LINlZGQwbdo0atSogaurKzVq1GDatGkGDUBgLNmNJgSgVquZMWMGVatWxc3Njfbt23Px4kUjRatfXoyIlJ9e9Bk8a+TIkSiVSubNm5ePEb6YIedw5coV3nvvPcqXL0/p0qVp2rQply9fNkK0+r3oHOLj4/niiy/w8fHBzc2NevXqsWDBAiNFmzMFvnFLcRUdHU2bNm1Qq9Vs2LCBsLAwvv32W5ydnY0dmsF++OEHlixZwqxZszhx4gQzZ85k8eLFzJkzx9ihZSm70YTgaY3CggULmDVrFgcOHMDZ2ZmuXbtq+pgWBHk5IlJ+eNFnkGnr1q2cPHmS0qVL52N0hnnROdy4cYM2bdpQoUIFtm3bxvHjx5kwYQLW1tZGiFa/F53D+PHj2bdvHwsXLiQsLIzPP/+cKVOmZNvdrKAoMP34hLapU6cSEhLC3r17jR3KS+vRowcODg4sXLhQs2zo0KFERUWxfv16I0ZmmOf7lqrVaqpWrcrgwYMZNWoUAElJSXh6evL111/Tv39/Y4ar14v6xwJcunQJPz8/QkJCXjgiUn7LKv5bt27Rpk0btmzZQvfu3fnggw/4+OOPjRRl9vSdw6BBg1AoFCxevNiIkRlO3zk0atSIjh07Mm7cOM2yN998k2rVqvHdd98ZI0yDyR1fAbVz507q1q1L//79qVy5Mv7+/vzyyy+o1YXnOsXPz4+jR49qBgi/dOkSwcHBvPHGG0aO7OXcvHmThw8f8vrrr2uWWVlZ0bhxY8LCwowY2avJyYhIBUF6ejqDBg1i1KhReHl5GTucHFOpVOzZswcvLy+6deuGh4cHLVq0ICgoyNih5Yifnx979uzhzp07AISFhXH+/Hlatmxp5MherEB3ZyjObty4wa+//srw4cMZOXIk586dY/To0QB88MEHRo7OMCNHjiQ+Pp6GDRtiampKeno6o0aNYtCgQcYO7aVktip+vrrZ2dmZ+/fvGyOkV5aamsqECRNo27YtZcuWNXY4BpkxYwaOjo4MHDjQ2KG8lMjISOLj45kzZw7jxo1j8uTJHDlyhMGDB2NtbU2bNm2MHaJBZs2axciRI/H19cXM7Gkq+fbbb2nbtq2RI3sxSXwFlEqlonbt2kyePBmAmjVrcu3aNZYsWVJoEl9QUBDr1q1jyZIlVK1alXPnzjFmzBjKly9Pnz59jB1esZeTEZEKiuDgYNasWUNwcLCxQ3lpKpUKeFot+NFHHwFQo0YNTp8+zeLFiwtN4lu0aBEnTpxg7dq1uLu7c+zYMSZOnEj58uVp1aqVscPLliS+AsrV1VWnGqdKlSqaaoXCYNKkSXz00Ud069YNgGrVqnH79m3mzp1bKBNf5iAIkZGRuLu7a5ZHRkbi4uJirLBeSuaISOHh4ezYseOlRkQyhqNHj/LgwQOtv42MjAwmT55MYGAg4eHhRozOME5OTpiZmen9+y4s1Z1JSUlMnTqVZcuW0a5dOwB8fX05d+4c8+bNK/CJT57xFVB+fn5cuXJFa9mVK1e0fnALusTERExNTbWWmZqaaq54C5sKFSrg6urKwYMHNcuSk5M5fvw4DRs2NGJkOZOWlkb//v25cOEC27dvL1SjGg0aNIiQkBCCg4M1/0qXLs3w4cPZunWrscMziIWFBXXq1CEiIkJreWH6+05LSyMtLa3Q/n3LHV8BNXz4cFq3bs3s2bN56623OHv2LL/88gsTJ040dmgGa9u2LT/88AMVKlSgatWqnD17lgULFtCzZ09jh5al7EYTcnd3Z9iwYcyZMwdPT08qV67M7Nmzsba2pnv37kaO/H9yY0QkY3rRZ/D8M1YzMzNcXV21Bqc3thedwyeffEL//v1p3LgxTZs2JTg4mKCgoGz7LOa3F51DkyZNmDJlCtbW1ri7uxMSEsK6deuYMmWKkSN/MenOUIDt3buXqVOncuXKFcqVK8fgwYMZMmQICoXC2KEZJC4ujm+++YYdO3bw33//4erqSrdu3fjyyy+xtLQ0dnh6ZTeaUGBgIGq1mpkzZ7Js2TKio6OpW7cus2fPxsfHxwjR6pcbIyIZ04s+g+dVr169wHVnMOQcVq9ezZw5c7h79y6vvfYan332WYG6gHrROTx8+JApU6Zw8OBBoqKicHd3p0+fPnz00UcF/jdKEp8QQohiRZ7xCSGEKFYk8QkhhChWJPEJIYQoViTxCSGEKFYk8QkhhChWJPEJIYQoViTxCVHIBAYGUqtWLRwdHfH398+z49y8efOFE8EWBEqlkhkzZhg7DFGISOIThVrHjh2pVKkS//33n05ZfHw8vr6+NGnSpMBMsvqqjh8/ztixY6lbty7z589n0qRJWa47Y8YMlEpllv8yp4sqDDZu3MjPP/9s7DBEESFDlolC7YcffqBJkyaMGzeOX375Rats+vTp3Lt3j+XLl2umTSnsjh49CsCcOXOwt7c3aJvvvvsOOzs7neVubm65Glte+v333wkPD2f48OE6ZQ8ePCgyn6/IH/JtEYWah4cHo0aNYtq0afTq1YsWLVoAcObMGRYtWsSgQYOoW7dunsaQkZFBeno6JUqUyNPjwNOZIACDkx5Ap06dCtVA1DlVUIe/EwWXVHWKQm/EiBH4+Pjw6aefkpSUhEql4rPPPsPNzY2JEydy5coV+vXrR6VKlXB1dSUgIEBnJP+oqCgmTpxI48aNKVeuHGXLlqV9+/YcO3ZMa73M515z587ll19+oU6dOri4uHDixAkANm/eTIsWLXB3d6dcuXI0aNCAb7/99oXnkJGRwezZs6lduzYuLi74+voyadIkkpKSNOsolUrNXW1mdWVuPX+Ljo5m2LBhlC9fnvLlyzN06FBiYmJ01mvfvj3t27fXWT5s2DCqV6+utUytVrN48WL8/f1xc3Pjtddeo0uXLlrv6erVq+ncuTNVqlTBxcWFOnXqMGfOHK0R/tu3b8/evXu5ffu2VlVtJn3P+G7evEn//v2pVKkSbm5utGjRgh07dmitExwcjFKp5Pfff+f777/Hx8cHV1dXOnXqpBmcWRRNcscnCj1zc3N++OEH2rZty7fffkvZsmU5efIka9as4d69e7Ru3RpXV1dGjBiBtbU1O3bsoG/fvixatIgePXoAT2e837p1K127dqVixYrExMSwcuVKunTpwoEDB/D19dU65vr160lISKBfv37Y2Njg5ubGoUOHGDBgAE2bNmXSpEmYmpoSERFBaGjoC89h5MiRrFy5ko4dO/Lhhx9y6tQpfvrpJy5evMiGDRtQKBQsWrSIdevWcfDgQRYtWgRg0HRIUVFROlWBJiYmODg4AE8TVO/evQkNDaV///54eXmxa9cuhg0bZtD7n5URI0awYsUKWrZsSe/evVGr1Zw4cYJjx47RuHFjAJYsWUKVKlV44403sLS05PDhw0ydOpXY2Fi++uorAEaNGkVsbCz37t1j+vTpLzxuZGQkbdq0IT4+niFDhuDk5MSGDRt4//33Wbx4sc5A0D/++COmpqZ89NFHxMbG8tNPPzF48GD+/PPPVzp/UXBJ4hNFQoMGDRgwYADz5s3DysqKTp068eabb9K1a1dKly7NwYMHNVPuDB48mK5duzJlyhTeeecdFAoFPj4+nD59GhOT/1WC9OvXj/r167No0SLmzZundbzbt29z8uRJredkS5cuxdbWlqCgIJ15yrJz/vx5Vq5cSe/evbUacJQrV45Zs2axd+9e2rZtS48ePfj77785ePCgJmEbws/PT2eZi4uLpnHLrl27OHbsGFOmTGHEiBEADBw4kM6dOxt8jOcFBwezYsUKBg0axOzZszXLP/zwQ9Tq/42Lv3PnTkqWLKl5PWjQIEaMGMHixYsZO3YsJUqUoEWLFpQpU4bo6GiDznvu3Lk8ePCA7du3ExAQAED//v1p3rw548ePp3Pnzpibm2vWT0lJ4ejRo1hYWABP7yDHjBlDeHh4gZp1Q+QeqeoURcakSZNwcnJCrVbz7bffEhUVxaFDh+jSpQuJiYk8fvxY869ly5bcu3dPM9lviRIlNEkvOTmZJ0+ekJGRQZ06dTh9+rTOsdq3b6/TOMTOzo6EhAQOHDiQo7j37dsHPE0Kzxo+fDimpqaa8pe1bNkytmzZovVv2bJlmvL9+/djYmLCgAEDNMtMTU0ZPHjwSx9z27ZtAIwdO1an7NkpazKTXkZGBtHR0Tx+/JgmTZqQkJDw0q1O9+3bR82aNTVJD8DKyoqBAwfy8OFDzpw5o7V+z549NUkPoFGjRsDTWgBRNMkdnygy7OzsqFy5Mo8ePcLNzY2TJ09q5s+bOXOm3m0iIyPx9PREpVLx448/smzZMm7evKm1ToUKFXS2q1ixos6yQYMGsXXrVt5++21Kly5Ns2bN6NSpE+3atct2frLbt2+jUCioXLmy1nJ7e3vc3Ny4deuWAWeftUaNGmXbuOX27du4urpia2urtdzDw+Olj3n9+nVcXFxwcnLKdr3jx48zdepUTp48SWpqqlZZbGzsSx379u3beueR8/LyAuDWrVvUq1dPs7xcuXJa62U+P4yOjn6p44uCTxKfKLIyG0hkzmavT2ZV1pw5czQtQydMmICjoyOmpqbMmTOH69ev62ynb6ZyZ2dnjhw5wqFDh9i/fz9//vkn69ato02bNqxbt67AT85pCIVCoVVVmSkjIyPH+7px4wZdunTBw8OD6dOnU65cOSwtLTlz5gyTJ0/WauCSl7KqltZ3nqJokMQniqzMuzIzMzOaN2+e7bpbtmzB399fZ4bvnI4IYmFhQevWrWndujVqtZopU6bwww8/EBYWpvdZG4C7uztqtZorV65QrVo1zfLY2FgePHhAmzZtchRDTrm7u3Pw4EHi4uK07vquXr2qs65SqdRbBXj79m2t15UqVeKPP/7gv//+o1SpUnqPu2vXLlJSUli3bh3ly5fXLH/+jjun3N3diYiI0FmeWXX67LFE8STP+ESR5ezsTEBAAMuXL+fevXs65c+O9mJqaqpzhR8WFqbppmCIJ0+eaL1WKBTUqFEDQG/XgEyZd6PPJ92FCxeSkZGR54nvjTfeQKVSsXTpUs0ylUrF4sWLddatVKkSERERWu/duXPnCAsL01qvU6dOAHqrmDPf58w7rWff95SUFJ2BCACsra2JiYkx6C6sTZs2nDlzRqvbRHJyMkuXLsXV1ZVatWq9cB+iaJM7PlGkzZkzhzZt2tCkSRP69u1LpUqViIyM5O+//+by5cucOnUKgHbt2jFz5kyGDBlC48aNuXr1KsuWLaNq1arEx8cbdKyPP/6YJ0+e0LRpU8qWLcv9+/dZvHgxbm5umub7+vj6+vL++++zcuVKYmNjadq0KWfOnGHVqlW0atUqy2paQ23btk3vyC0BAQGUKVOGdu3a4efnx5QpU7h16xZVq1Zl586dREVF6Wzz3nvvsWDBAt566y3ef/99IiMj+e2336hatSpxcXFa++7duzdLlizh+vXrtGrVCoC//vqLatWq8fnnn9OyZUssLCzo2bMn/fr1IzU1lXXr1mm1rM1Uu3ZtgoKCGDNmDPXq1cPExIRu3brpPd+RI0eyadMmevToodWd4dKlSyxevFhGeRGS+ETR5unpycGDB5k1axbr1q3j8ePHlCpVCl9fX8aPH69Z77PPPiMpKYmNGzeydetWvL29Wbp0KZs2bdIME/Yi77zzDitXruS3334jOjoaFxcX3njjDUaPHq3TcOR5P/zwAxUqVGDVqlXs3r0bFxcXPv74Y8aOHfvKzwa/+OILvcvXrVtHmTJlMDExYe3atYwZM4aNGzcCTy8Epk6dStOmTbW28fLyYuHChUyfPp3x48fj5eXFokWL2Lhxo877NH/+fKpVq8bKlSuZPHkyNjY21KxZkyZNmgBQuXJlVq9ezdSpU5k8eTJOTk707NkTf39/unbtqrWvgQMHcuHCBTZs2MAvv/yCWq3OMvE5OzuzZ88evvrqK5YsWUJSUhLe3t6sWLFCb6MXUfwooqOj5QmuEEKIYkOe8QkhhChWJPEJIYQoViTxCSGEKFYk8QkhhChWJPEJIYQoViTxCSGEKFYk8QkhhChWJPEJIYQoViTxCSGEKFYk8QkhhChW/g+FKpoEH8wkDgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib import pyplot as plt\n", + "from matplotlib import style\n", + "style.use(\"fivethirtyeight\")\n", + "\n", + "x = np.array(range(5, 20))\n", + "plt.plot(x, np.exp(model_1.params[\"Intercept\"] + model_1.params[\"educ\"] * x))\n", + "plt.xlabel(\"Years of Education\")\n", + "plt.ylabel(\"Hourly Wage\")\n", + "plt.title(\"Impact of Education on Hourly Wage\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Of course, it is not because we can estimate this simple model that it's correct. Notice how I was carefully with my words saying it **predicts** wage from education. I never said that this prediction was causal. In fact, by now, you probably have very serious reasons to believe this model is biased. Since our data didn't come from a random experiment, we don't know if those that got more education are comparable to those who got less. Going even further, from our understanding of how the world works, we are very certain that they are not comparable. Namely, we can argue that those with more years of education probably have richer parents, and that the increase we are seeing in wages as we increase education is just a reflection of how the family wealth is associated with more years of education. Putting it in math terms, we think that $E[Y_0|T=0] < E[Y_0|T=1]$, that is, those with more education would have higher income anyway, even without so many years of education. If you are really grim about education, you can argue that it can even *reduce* wages by keeping people out of the workforce and lowering their experience.\n", + "\n", + "Fortunately, in our data, we have access to lots of other variables. We can see the parents' education `meduc`, `feduc`, the `IQ` score for that person, the number of years of experience `exper` and the tenure of the person in his or her current company `tenure`. We even have some dummy variables for marriage and black ethnicity. " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
wagehourslhwageIQeducexpertenureagemarriedblacksouthurbansibsbrthordmeducfeduc
0769402.956212931211231100112.08.08.0
2825403.0265041081411933100112.014.014.0
3650402.788093961213732100143.012.012.0
4562402.6426227411145341001106.06.011.0
6600402.708050911013030000112.08.08.0
\n", + "
" + ], + "text/plain": [ + " wage hours lhwage IQ educ exper tenure age married black \\\n", + "0 769 40 2.956212 93 12 11 2 31 1 0 \n", + "2 825 40 3.026504 108 14 11 9 33 1 0 \n", + "3 650 40 2.788093 96 12 13 7 32 1 0 \n", + "4 562 40 2.642622 74 11 14 5 34 1 0 \n", + "6 600 40 2.708050 91 10 13 0 30 0 0 \n", + "\n", + " south urban sibs brthord meduc feduc \n", + "0 0 1 1 2.0 8.0 8.0 \n", + "2 0 1 1 2.0 14.0 14.0 \n", + "3 0 1 4 3.0 12.0 12.0 \n", + "4 0 1 10 6.0 6.0 11.0 \n", + "6 0 1 1 2.0 8.0 8.0 " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wage.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can include all those extra variables in a model and estimate it:\n", + "\n", + "$\n", + "log(hwage)_i = \\beta_0 + \\kappa \\ educ_i + \\pmb{\\beta}X_i + u_i\n", + "$\n", + "\n", + "To understand how this helps with the bias problem, let's recap the bivariate breakdown of multivariate linear regression.\n", + "\n", + "$\n", + "\\kappa = \\dfrac{Cov(Y_i, \\tilde{T_i})}{Var(\\tilde{T_i})} \n", + "$\n", + "\n", + "This formula says that we can predict `educ` from the parents' education, from IQ, from experience and so on. After we do that, we'll be left with a version of `educ`, $\\tilde{educ}$, which is uncorrelated with all the variables included previously. This will break down arguments such as \"people that have more years of education have it because they have higher IQ. It is not the case that education leads to higher wages. It is just the case that it is correlated with IQ, which is what drives wages\". Well, if we include IQ in our model, then $\\kappa$ becomes the return of an additional year of education while keeping IQ fixed. Pause a little bit to understand what this implies. Even if we can't use randomised controlled trials to keep other factors equal between treated and untreated, regression can do this by including those same factors in the model, even if the data is not random!" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.041147191010057635" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "controls = ['IQ', 'exper', 'tenure', 'age', 'married', 'black',\n", + " 'south', 'urban', 'sibs', 'brthord', 'meduc', 'feduc']\n", + "\n", + "X = wage[controls].assign(intercep=1)\n", + "t = wage[\"educ\"]\n", + "y = wage[\"lhwage\"]\n", + "\n", + "beta_aux = regress(t, X)\n", + "t_tilde = t - X.dot(beta_aux)\n", + "\n", + "kappa = t_tilde.cov(y) / t_tilde.var()\n", + "kappa" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This coefficient we've just estimated tells us that, for people with the same IQ, experience, tenure, age and so on, we should expect an additional year of education to be associated with a 4.11% increase in hourly wage. This confirms our suspicion that the first simple model with only `educ` was biased. It also confirms that this bias was overestimating the impact of education. Once we controlled for other factors, the estimated impact of education fell.\n", + "\n", + "If we are wiser and use software that other people wrote instead of coding everything yourself, we can even place a confidence interval around this estimate. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "
coef std err t P>|t| [0.025 0.975]
Intercept 1.1156 0.232 4.802 0.000 0.659 1.572
educ 0.0411 0.010 4.075 0.000 0.021 0.061
IQ 0.0038 0.001 2.794 0.005 0.001 0.006
exper 0.0153 0.005 3.032 0.003 0.005 0.025
tenure 0.0094 0.003 2.836 0.005 0.003 0.016
age 0.0086 0.006 1.364 0.173 -0.004 0.021
married 0.1795 0.053 3.415 0.001 0.076 0.283
black -0.0801 0.063 -1.263 0.207 -0.205 0.044
south -0.0397 0.035 -1.129 0.259 -0.109 0.029
urban 0.1926 0.036 5.418 0.000 0.123 0.262
sibs 0.0065 0.009 0.722 0.470 -0.011 0.024
brthord -0.0080 0.013 -0.604 0.546 -0.034 0.018
meduc 0.0089 0.007 1.265 0.206 -0.005 0.023
feduc 0.0069 0.006 1.113 0.266 -0.005 0.019
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_2 = smf.ols('lhwage ~ educ +' + '+'.join(controls), data=wage).fit()\n", + "model_2.summary().tables[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Omitted Variable or Confounding Bias\n", + "\n", + "The question that remains is: is this parameter we've estimated causal? Unfortunately, we can't say for sure. We can argue that the first simple model that regress wage on education probably isn't. It omits important variables that are correlated both with education and with wages. Without controlling for them, the estimated impact of education is also capturing the impact of those other variables that were not included in the model.\n", + "\n", + "To better understand how this bias works, let's suppose the true model for how education affects wage looks a bit like this\n", + "\n", + "$\n", + "Wage_i = \\alpha + \\kappa \\ Educ_i + \\beta' A_i + u_i\n", + "$\n", + "\n", + "wage is affected by education, which is measured by the size of $\\kappa$ and by an additional ability factor, denoted as $A$. If we omit ability from our model, our estimate for $\\kappa$ will look like this:\n", + "\n", + "$\n", + "\\dfrac{Cov(Wage_i, Educ_i)}{Var(Educ_i)} = \\kappa + \\beta'\\delta_{A}\n", + "$\n", + "\n", + "where $\\delta_{A}$ is the coefficient from the regression of $A$ on $Educ$\n", + "\n", + "The key point here is that it won't be exactly the $\\kappa$ that we want. Instead, it comes with this extra annoying term $\\beta'\\delta_{A}$. This term is the impact of the omitted $A$ on $Wage$, $\\beta'$ times the impact of the omitted on the included $Educ$. This is so important for economists that Joshua Angrist made a mantra out of it so that the students can recite it in meditation:\n", + "\n", + "```\n", + "\"Short equals long \n", + "plus the effect of omitted \n", + "times the regression of omitted on included\"\n", + "```\n", + "\n", + "Here, the short regression is the one that omits variables, while the long is the one that includes them. This formula or mantra gives us further insight into the nature of bias. First, the bias term will be zero if the omitted variables have no impact on the dependent variable $Y$. This makes total sense. I don't need to control for stuff that is irrelevant for wages when trying to understand the impact of education on it (like how tall the lilies of the field). Second, the bias term will also be zero if the omitted variables have no impact on the treatment variable. This also makes intuitive sense. If everything that impacts education has been included in the model, there is no way the estimated impact of education is mixed with a correlation from education on something else that also impacts wages. \n", + "\n", + "![img](data/img/linear-regression/confused_cat.png)\n", + "\n", + "To put it more succinctly, we say that **there is no OVB if all the confounding variables are accounted for in the model**. We can also leverage our knowledge about causal graphs here. A confounding variable is one that **causes both the treatment and the outcome**. In the wage example, IQ is a confounder. People with high IQ tend to complete more years of education because it's easier for them, so we can say that IQ causes education. People with high IQ also tend to be naturally more productive and consequently have higher wages, so IQ also causes wage. Since confounders are variables that affect both the treatment and the outcome, we mark them with an arrow going to T and Y. Here, I've denoted them with $W$. I've also marked positive causation with red and negative causation with blue." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "W\n", + "\n", + "W\n", + "\n", + "\n", + "\n", + "T\n", + "\n", + "T\n", + "\n", + "\n", + "\n", + "W->T\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Y\n", + "\n", + "Y\n", + "\n", + "\n", + "\n", + "W->Y\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "T->Y\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "IQ\n", + "\n", + "IQ\n", + "\n", + "\n", + "\n", + "Educ\n", + "\n", + "Educ\n", + "\n", + "\n", + "\n", + "IQ->Educ\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Wage\n", + "\n", + "Wage\n", + "\n", + "\n", + "\n", + "IQ->Wage\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Educ->Wage\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Crime\n", + "\n", + "Crime\n", + "\n", + "\n", + "\n", + "Police\n", + "\n", + "Police\n", + "\n", + "\n", + "\n", + "Crime->Police\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Violence\n", + "\n", + "Violence\n", + "\n", + "\n", + "\n", + "Crime->Violence\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Police->Violence\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = gr.Digraph()\n", + "\n", + "g.edge(\"W\", \"T\"), g.edge(\"W\", \"Y\"), g.edge(\"T\", \"Y\")\n", + "\n", + "g.edge(\"IQ\", \"Educ\", color=\"red\"), g.edge(\"IQ\", \"Wage\", color=\"red\"), g.edge(\"Educ\", \"Wage\", color=\"red\")\n", + "\n", + "g.edge(\"Crime\", \"Police\", color=\"red\"), g.edge(\"Crime\", \"Violence\", color=\"red\"), \n", + "g.edge(\"Police\", \"Violence\", color=\"blue\")\n", + "\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Causal graphs are excellent to depict our understanding of the world and understand how confounding bias works. In our first example, we have a graph where education causes wage: more education leads to higher wages. However, IQ also causes wage and it also causes education: high IQ causes both more education and wage. If we don't account for IQ in our model, some of its effect on wage will flow through the correlation with education. That will make the impact of education look higher than it actually is. This is an example of positive bias.\n", + "\n", + "Just to give another example, but with negative bias, consider the causal graph about the effect of police on city violence. What we usually see in the world is that cities with higher police force also have more violence. Does this mean that the police are causing the violence? Well, it could be, I don't think it's worth getting into that discussion here. But, there is also a strong possibility that there is a confounding variable causing us to see a biased version of the impact of police on violence. It could be that increasing police force decreases violence. But, a third variable crime, causes both more violence and more police force. If we don't account for it, the impact of crime on violence will flow through police force, making it look like it increases violence. This is an example of negative bias.\n", + "\n", + "Causal graphs can also show us how both regression and randomized control trials are correct for confounding bias. RCT does so by severing the connection of the confounder to the treatment variable. By making $T$ random, by definition, nothing can cause it. " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "W\n", + "\n", + "W\n", + "\n", + "\n", + "\n", + "Y\n", + "\n", + "Y\n", + "\n", + "\n", + "\n", + "W->Y\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "T\n", + "\n", + "T\n", + "\n", + "\n", + "\n", + "T->Y\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "IQ\n", + "\n", + "IQ\n", + "\n", + "\n", + "\n", + "Wage\n", + "\n", + "Wage\n", + "\n", + "\n", + "\n", + "IQ->Wage\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Educ\n", + "\n", + "Educ\n", + "\n", + "\n", + "\n", + "Educ->Wage\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = gr.Digraph()\n", + "\n", + "g.edge(\"W\", \"Y\"), g.edge(\"T\", \"Y\")\n", + "\n", + "g.edge(\"IQ\", \"Wage\", color=\"red\"), g.edge(\"Educ\", \"Wage\", color=\"red\")\n", + "\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Regression, on the other hand, does so by comparing the effect of $T$ while maintaining the confounder $W$ set to a fixed level. With regression, it is not the case that W cease to cause T and Y. It is just that it is held fixed, so it can't influence changes on T and Y." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "W=w\n", + "\n", + "W=w\n", + "\n", + "\n", + "\n", + "T\n", + "\n", + "T\n", + "\n", + "\n", + "\n", + "Y\n", + "\n", + "Y\n", + "\n", + "\n", + "\n", + "T->Y\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "IQ=x\n", + "\n", + "IQ=x\n", + "\n", + "\n", + "\n", + "Educ\n", + "\n", + "Educ\n", + "\n", + "\n", + "\n", + "Wage\n", + "\n", + "Wage\n", + "\n", + "\n", + "\n", + "Educ->Wage\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = gr.Digraph()\n", + "\n", + "g.node(\"W=w\"), g.edge(\"T\", \"Y\")\n", + "g.node(\"IQ=x\"), g.edge(\"Educ\", \"Wage\", color=\"red\")\n", + "\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, back to our question, is the parameter we've estimated for the impact of `educ` on wage causal? I'm sorry to bring it to you, but that will depend on our ability to argue in favor or against that fact that all confounders have been included in the model. Personally, I think they haven't. For instance, we haven't included family wealth. Even if we included family education, that can only be seen as a proxy for wealth. We've also not accounted for factors like personal ambition. It could be that ambition is what causes both more years of education and higher wage, so it is a confounder. This is to show that **causal inference with non-random or observational data should always be taken with a grain of salt**. We can never be sure that all confounders were accounted for.\n", + "\n", + "## Key Ideas\n", + "\n", + "We've covered a lot of ground with regression. We saw how regression can be used to perform A/B testing and how it conveniently gives us confidence intervals. Then, we moved to study how regression solves a prediction problem and it is the best linear approximation to the conditional expectation function (CEF). We've also discussed how, in the bivariate case, the regression treatment coefficient is the covariance between the treatment and the outcome divided by the variance of the treatment. Expanding to the multivariate case, we figured out how regression gives us a partialling out interpretation of the treatment coefficient: it can be interpreted as how the outcome would change with the treatment while keeping all other included variables constant. This is what economists love to refer as *ceteris paribus*.\n", + "\n", + "Finally, we took a turn to understanding bias. We saw how `Short equals long plus the effect of omitted times the regression of omitted on included`. This shed some light to how bias comes to be. We discovered that the source of omitted variable bias is confounding: a variable that affects both the treatment and the outcome. Lastly, we used causal graphs to see how RCT and regression fixes confounding.\n", + "\n", + "## References\n", + "\n", + "I like to think of this entire book as a tribute to Joshua Angrist, Alberto Abadie and Christopher Walters for their amazing Econometrics class. Most of the ideas here are taken from their classes at the American Economic Association. Watching them is what is keeping me sane during this tough year of 2020.\n", + "* [Cross-Section Econometrics](https://www.aeaweb.org/conference/cont-ed/2017-webcasts)\n", + "* [Mastering Mostly Harmless Econometrics](https://www.aeaweb.org/conference/cont-ed/2020-webcasts)\n", + "\n", + "I'll also like to reference the amazing books from Angrist. They have shown me that Econometrics, or 'Metrics as they call it, is not only extremely useful but also profoundly fun.\n", + "\n", + "* [Mostly Harmless Econometrics](https://www.mostlyharmlesseconometrics.com/)\n", + "* [Mastering 'Metrics](https://www.masteringmetrics.com/)\n", + "\n", + "My final reference is Miguel Hernan and Jamie Robins' book. It has been my trustworthy companion in the most thorny causal questions I had to answer.\n", + "\n", + "* [Causal Inference Book](https://www.hsph.harvard.edu/miguel-hernan/causal-inference-book/)\n", + "\n", + "![img](./data/img/poetry.png)\n", + "\n", + "\n", + "## Contribute\n", + "\n", + "Causal Inference for the Brave and True is an open-source material on causal inference, the statistics of science. It uses only free software, based in Python. Its goal is to be accessible monetarily and intellectually.\n", + "If you found this book valuable and you want to support it, please go to [Patreon](https://www.patreon.com/causal_inference_for_the_brave_and_true). If you are not ready to contribute financially, you can also help by fixing typos, suggesting edits or giving feedback on passages you didn't understand. Just go to the book's repository and [open an issue](https://github.com/matheusfacure/python-causality-handbook/issues). Finally, if you liked this content, please share it with others who might find it useful and give it a [star on GitHub](https://github.com/matheusfacure/python-causality-handbook/stargazers)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "causal-glory", + "language": "python", + "name": "causal-glory" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/book/regression/05-The-Unreasonable-Effectiveness-of-Linear-Regression_minimal.ipynb b/book/regression/05-The-Unreasonable-Effectiveness-of-Linear-Regression_minimal.ipynb new file mode 100644 index 0000000..1b76fb6 --- /dev/null +++ b/book/regression/05-The-Unreasonable-Effectiveness-of-Linear-Regression_minimal.ipynb @@ -0,0 +1,478 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "title", + "metadata": {}, + "source": [ + "**🌐 Language:** **English** | [한국어 →](/regression/05-the-unreasonable-effectiveness-of-linear-regression-minimal-ko)\n", + "\n", + "# The Unreasonable Effectiveness of Linear Regression (Minimal)\n", + "\n", + "If treatment is randomized, linear regression is a very efficient way to recover the same idea as a group mean difference in an RCT or A/B test. For non-random data, we need more caution: we should first look at how variables are related and ask what important variables might still be omitted, because omitted-variable bias (OVB) can remain.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "setup", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import statsmodels.formula.api as smf\n", + "import matplotlib.pyplot as plt\n", + "\n", + "plt.style.use(\"fivethirtyeight\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "load-data", + "metadata": {}, + "source": [ + "## Load Data\n", + "\n", + "We focus only on `wage.csv`.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "load", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
wagehourshwagelhwageeducIQexpertenureage
07694019.2252.956212129311231
28254020.6253.0265041410811933
36504016.2502.788093129613732
45624014.0502.642622117414534
66004015.0002.708050109113030
\n", + "
" + ], + "text/plain": [ + " wage hours hwage lhwage educ IQ exper tenure age\n", + "0 769 40 19.225 2.956212 12 93 11 2 31\n", + "2 825 40 20.625 3.026504 14 108 11 9 33\n", + "3 650 40 16.250 2.788093 12 96 13 7 32\n", + "4 562 40 14.050 2.642622 11 74 14 5 34\n", + "6 600 40 15.000 2.708050 10 91 13 0 30" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wage = pd.read_csv(\"data/wage.csv\").dropna().copy()\n", + "wage[\"hwage\"] = wage[\"wage\"] / wage[\"hours\"]\n", + "\n", + "wage[[\"wage\", \"hours\", \"hwage\", \"lhwage\", \"educ\", \"IQ\", \"exper\", \"tenure\", \"age\"]].head()\n" + ] + }, + { + "cell_type": "markdown", + "id": "relationships", + "metadata": {}, + "source": [ + "## Check Relationships First\n", + "\n", + "Before treating regression as causal in observational data, it helps to inspect how education, wages, ability proxies, and background variables move together.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "corr", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
lhwageeducIQexpertenureagemeducfeduc
lhwage1.000.270.270.060.170.180.200.20
educ0.271.000.54-0.45-0.030.050.360.42
IQ0.270.541.00-0.230.02-0.020.320.34
exper0.06-0.45-0.231.000.290.47-0.16-0.25
tenure0.17-0.030.020.291.000.280.01-0.04
age0.180.05-0.020.470.281.000.01-0.06
meduc0.200.360.32-0.160.010.011.000.58
feduc0.200.420.34-0.25-0.04-0.060.581.00
\n", + "
" + ], + "text/plain": [ + " lhwage educ IQ exper tenure age meduc feduc\n", + "lhwage 1.00 0.27 0.27 0.06 0.17 0.18 0.20 0.20\n", + "educ 0.27 1.00 0.54 -0.45 -0.03 0.05 0.36 0.42\n", + "IQ 0.27 0.54 1.00 -0.23 0.02 -0.02 0.32 0.34\n", + "exper 0.06 -0.45 -0.23 1.00 0.29 0.47 -0.16 -0.25\n", + "tenure 0.17 -0.03 0.02 0.29 1.00 0.28 0.01 -0.04\n", + "age 0.18 0.05 -0.02 0.47 0.28 1.00 0.01 -0.06\n", + "meduc 0.20 0.36 0.32 -0.16 0.01 0.01 1.00 0.58\n", + "feduc 0.20 0.42 0.34 -0.25 -0.04 -0.06 0.58 1.00" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "key_vars = [\"lhwage\", \"educ\", \"IQ\", \"exper\", \"tenure\", \"age\", \"meduc\", \"feduc\"]\n", + "wage[key_vars].corr().round(2)\n" + ] + }, + { + "cell_type": "markdown", + "id": "analyze", + "metadata": {}, + "source": [ + "## Analyze\n", + "\n", + "Start with a simple regression, then add plausible controls. The gap between them is a practical reminder that observational estimates depend on what we control for.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "models", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
coef_on_educp_valueci_lowci_high
Simple0.05360.00000.03880.0684
Controlled0.04110.00010.02130.0610
\n", + "
" + ], + "text/plain": [ + " coef_on_educ p_value ci_low ci_high\n", + "Simple 0.0536 0.0000 0.0388 0.0684\n", + "Controlled 0.0411 0.0001 0.0213 0.0610" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simple_model = smf.ols(\"lhwage ~ educ\", data=wage).fit()\n", + "\n", + "controls = [\n", + " \"IQ\", \"exper\", \"tenure\", \"age\", \"married\", \"black\",\n", + " \"south\", \"urban\", \"sibs\", \"brthord\", \"meduc\", \"feduc\"\n", + "]\n", + "controlled_model = smf.ols(\n", + " \"lhwage ~ educ + \" + \" + \".join(controls),\n", + " data=wage,\n", + ").fit()\n", + "\n", + "pd.DataFrame(\n", + " {\n", + " \"coef_on_educ\": [simple_model.params[\"educ\"], controlled_model.params[\"educ\"]],\n", + " \"p_value\": [simple_model.pvalues[\"educ\"], controlled_model.pvalues[\"educ\"]],\n", + " \"ci_low\": [simple_model.conf_int().loc[\"educ\", 0], controlled_model.conf_int().loc[\"educ\", 0]],\n", + " \"ci_high\": [simple_model.conf_int().loc[\"educ\", 1], controlled_model.conf_int().loc[\"educ\", 1]],\n", + " },\n", + " index=[\"Simple\", \"Controlled\"],\n", + ").round(4)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "plot", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ax = wage.plot.scatter(x=\"educ\", y=\"lhwage\", alpha=0.35, figsize=(7, 4))\n", + "ax.set_title(\"Education and Log Hourly Wage\")\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "id": "result", + "metadata": {}, + "source": [ + "## Result\n", + "\n", + "In a randomized setting, regression is often just a compact way to estimate the same treatment contrast as a difference in group means. Here, the wage data are observational, so the regression coefficient on `educ` is more fragile.\n", + "\n", + "Once we add controls, the estimate changes, which suggests that relationships with other variables matter. Even then, the result is not automatically causal, because unobserved factors such as family wealth, ambition, or other ability measures may still create omitted-variable bias.\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "3.12.13", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/book/regression/05-The-Unreasonable-Effectiveness-of-Linear-Regression_minimal_ko.ipynb b/book/regression/05-The-Unreasonable-Effectiveness-of-Linear-Regression_minimal_ko.ipynb new file mode 100644 index 0000000..bb63598 --- /dev/null +++ b/book/regression/05-The-Unreasonable-Effectiveness-of-Linear-Regression_minimal_ko.ipynb @@ -0,0 +1,504 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "title", + "metadata": {}, + "source": [ + "**🌐 언어:** [← English](/regression/05-the-unreasonable-effectiveness-of-linear-regression-minimal) | **한국어**\n", + "\n", + "# 선형회귀의 놀라운 효과 (간단 버전)\n", + "\n", + "처치가 무작위로 배정되면, 선형회귀는 RCT나 A/B 테스트에서 집단 평균 차이와 같은 아이디어를 매우 효율적으로 복원하는 방법입니다. 무작위가 아닌 데이터에서는 더 주의해야 합니다. 먼저 변수들이 어떻게 연결되어 있는지 살펴보고, 어떤 중요한 변수가 빠졌을 수 있는지 물어야 합니다. 누락변수편향(OVB)이 남아 있을 수 있기 때문입니다.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "setup", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import statsmodels.formula.api as smf\n", + "import matplotlib.pyplot as plt\n", + "\n", + "plt.style.use(\"fivethirtyeight\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "load-data", + "metadata": {}, + "source": [ + "## 데이터 불러오기\n", + "\n", + "`wage.csv`만 사용합니다.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "load", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
wagehourshwagelhwageeducIQexpertenureage
07694019.2252.956212129311231
28254020.6253.0265041410811933
36504016.2502.788093129613732
45624014.0502.642622117414534
66004015.0002.708050109113030
\n", + "
" + ], + "text/plain": [ + " wage hours hwage lhwage educ IQ exper tenure age\n", + "0 769 40 19.225 2.956212 12 93 11 2 31\n", + "2 825 40 20.625 3.026504 14 108 11 9 33\n", + "3 650 40 16.250 2.788093 12 96 13 7 32\n", + "4 562 40 14.050 2.642622 11 74 14 5 34\n", + "6 600 40 15.000 2.708050 10 91 13 0 30" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wage = pd.read_csv(\"data/wage.csv\").dropna().copy()\n", + "wage[\"hwage\"] = wage[\"wage\"] / wage[\"hours\"]\n", + "\n", + "wage[[\"wage\", \"hours\", \"hwage\", \"lhwage\", \"educ\", \"IQ\", \"exper\", \"tenure\", \"age\"]].head()\n" + ] + }, + { + "cell_type": "markdown", + "id": "relationships", + "metadata": {}, + "source": [ + "## 먼저 관계를 확인하기\n", + "\n", + "관찰자료에서 회귀를 인과적으로 해석하기 전에, 교육, 임금, 능력 대리변수, 배경 변수들이 함께 어떻게 움직이는지 살펴보는 것이 도움이 됩니다.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "corr", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
lhwageeducIQexpertenureagemeducfeduc
lhwage1.000.270.270.060.170.180.200.20
educ0.271.000.54-0.45-0.030.050.360.42
IQ0.270.541.00-0.230.02-0.020.320.34
exper0.06-0.45-0.231.000.290.47-0.16-0.25
tenure0.17-0.030.020.291.000.280.01-0.04
age0.180.05-0.020.470.281.000.01-0.06
meduc0.200.360.32-0.160.010.011.000.58
feduc0.200.420.34-0.25-0.04-0.060.581.00
\n", + "
" + ], + "text/plain": [ + " lhwage educ IQ exper tenure age meduc feduc\n", + "lhwage 1.00 0.27 0.27 0.06 0.17 0.18 0.20 0.20\n", + "educ 0.27 1.00 0.54 -0.45 -0.03 0.05 0.36 0.42\n", + "IQ 0.27 0.54 1.00 -0.23 0.02 -0.02 0.32 0.34\n", + "exper 0.06 -0.45 -0.23 1.00 0.29 0.47 -0.16 -0.25\n", + "tenure 0.17 -0.03 0.02 0.29 1.00 0.28 0.01 -0.04\n", + "age 0.18 0.05 -0.02 0.47 0.28 1.00 0.01 -0.06\n", + "meduc 0.20 0.36 0.32 -0.16 0.01 0.01 1.00 0.58\n", + "feduc 0.20 0.42 0.34 -0.25 -0.04 -0.06 0.58 1.00" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "key_vars = [\"lhwage\", \"educ\", \"IQ\", \"exper\", \"tenure\", \"age\", \"meduc\", \"feduc\"]\n", + "wage[key_vars].corr().round(2)\n" + ] + }, + { + "cell_type": "markdown", + "id": "analyze", + "metadata": {}, + "source": [ + "## 분석\n", + "\n", + "단순 회귀부터 시작한 뒤, 그럴듯한 통제변수를 추가합니다. 두 결과의 차이는 관찰자료 추정치가 무엇을 통제하느냐에 의존한다는 실용적인 경고입니다.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "models", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
educ_계수p값신뢰구간_하한신뢰구간_상한
단순 모형0.05360.00000.03880.0684
통제 포함0.04110.00010.02130.0610
\n", + "
" + ], + "text/plain": [ + " educ_계수 p값 신뢰구간_하한 신뢰구간_상한\n", + "단순 모형 0.0536 0.0000 0.0388 0.0684\n", + "통제 포함 0.0411 0.0001 0.0213 0.0610" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simple_model = smf.ols(\"lhwage ~ educ\", data=wage).fit()\n", + "\n", + "controls = [\n", + " \"IQ\", \"exper\", \"tenure\", \"age\", \"married\", \"black\",\n", + " \"south\", \"urban\", \"sibs\", \"brthord\", \"meduc\", \"feduc\"\n", + "]\n", + "controlled_model = smf.ols(\n", + " \"lhwage ~ educ + \" + \" + \".join(controls),\n", + " data=wage,\n", + ").fit()\n", + "\n", + "pd.DataFrame(\n", + " {\n", + " \"educ_계수\": [simple_model.params[\"educ\"], controlled_model.params[\"educ\"]],\n", + " \"p값\": [simple_model.pvalues[\"educ\"], controlled_model.pvalues[\"educ\"]],\n", + " \"신뢰구간_하한\": [simple_model.conf_int().loc[\"educ\", 0], controlled_model.conf_int().loc[\"educ\", 0]],\n", + " \"신뢰구간_상한\": [simple_model.conf_int().loc[\"educ\", 1], controlled_model.conf_int().loc[\"educ\", 1]],\n", + " },\n", + " index=[\"단순 모형\", \"통제 포함\"],\n", + ").round(4)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "plot", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 44368 (\\N{HANGUL SYLLABLE GYO}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 50977 (\\N{HANGUL SYLLABLE YUG}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 44284 (\\N{HANGUL SYLLABLE GWA}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 47196 (\\N{HANGUL SYLLABLE RO}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 44536 (\\N{HANGUL SYLLABLE GEU}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 49884 (\\N{HANGUL SYLLABLE SI}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 44036 (\\N{HANGUL SYLLABLE GAN}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 45817 (\\N{HANGUL SYLLABLE DANG}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 51076 (\\N{HANGUL SYLLABLE IM}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 44552 (\\N{HANGUL SYLLABLE GEUM}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqIAAAGqCAYAAADQuiYDAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAZz1JREFUeJzt3Ql8XVW9L/DfHs6Q5GSe2jQpHWgZy2xpL1icmAVREHFAvaDPCbzKfSqiz3f18VTUqygyXK9XHEFAeCqDCFfFMhUoMpShtKQtTZs2aebpjHvv9/mvnZMmJS1pM5ydtX/fj3FnrYZkn7PP3vu/1/BfRk9PjwciIiIiohlmzvQfJCIiIiISDESJiIiIqCAYiBIRERFRQTAQJSIiIqKCYCBKRERERAXBQJSIiIiICoKBKBEREREVBANRIiIiIioIBqJEREREVBAMRImIiIioIBiIEhEREVFB2IX5s0Q0G9x2221Yu3btfv9373vf+3DCCSeo77/5zW+iu7t7v3/HVVddhcrKSvXfyu/YX/Lfyu+YqAceeAAPPvjgfv+dU089Faeddpr6/sYbb8SmTZv2+3d88pOfxOLFiyf0s1PxfsgxlWO7v+SYyrGdqs/GRHzhC1/Agfjud7+rts3Nzbjpppv2+79ftGgRPvWpTx3Q3yaiiWMgSkR79dBDD+HWW2/d73fomGOOGQk25L9vaWnZ799x2WWXqeCpr68P//mf/7nf/31TU9N+BaJPP/30Af2dqqqqkUD0nnvuwaOPPrrfv+Pcc8+dcCA6Fe/HK6+8ckC/Y2BgYCQQnYrPxkQcyH6ODkRbW1sP6HecdNJJDESJZgADUSLap5KSEmzfvn1C79Lzzz+PVatWva7+9NNPn3AL3A033DBuAPl//s//weWXXz6h3/GBD3wA69atw4GQFrTq6uo3/Lmenh4sWLDgdfWHHXYYHn/88Qn9LQlcP/ShDx3Qfk7F+/G3v/0Nxx577IR+x/z586flszERH//4x0cCyzdy5ZVXjtsC+otf/ALvete7JvQ7Tj755P3eRyI6MBwjSkREREQFwUCUiIiIiAqCgSgRERERFQQDUSIiIiIqCAaiRERERFQQDESJiIiIqCAYiBIRERFRQTAQJSIiIqKCYCBKRERERAXBQJSIiIiICoKBKBEREREVBANRIiIiIioIBqJEREREVBAMRImIiIioIBiIEhEREVFBMBAlIiIiooJgIEpEREREBcFAlIiIiIgKgoEoERERERUEA1EiIiIiKgi7MH+WiGaLTCaDK6+8ckI/29nZOW79+vXrJ/w7nn/++XHr77vvPmzfvn1Cv+Oll17Cgbr66qsRi8Um9L6Mp62tbcKvdfPmzThQU/F+XH/99aipqZnQ70ilUtPy2ZiIxx9/fMJ/59FHHx23/pZbblG/ZyJ27NiB8vLy/dpHIjowDESJaJ+y2SxuuummSb1Lr7322qR/hwQREw0kRFNT0wH9nZtvvhmT0dXVNenXOlPvx+9+97uCfzYm4oUXXlBfk/HnP/95yvaHiKaO0dPT403h7yMiIiIimhCOESUiIiKigmAgSkREREQFwUCUiIiIiAqCgSgRERERFQQDUZoUSemyadOmcVO7kF54rMODxzo8eKzDIxXQ+zUDUZo0x3H4LoYEj3V48FiHB491eDgBvF8zECUiIiKigmAgSkREREQFwUCUiIiIiAqCgSgRERERFQQDUSIiIiIqCAaiRERERFQQDESJiIiIqCDswvxZIqLga+nPYU17BgNZFyUREyvromgq5WWTiGiqsEWUiGgvQejdW5Pw4KE0KpdKT5WlnoiIpgYDUSKicUhLaE3chGkY/sXSMFRZ6omIaGowECUiGod0x+eD0JELpmFgMOfy/SIimiIMRImIxpGImHA9b0ydlEtsXjaJiKYKr6hERONYURdFR8odCUYdz1NlqScioqnBQJSIaBwyO/6c+UUwYPjd9DBUmbPmiYimDvOQEBHthQSdDDyJiKYPW0SJiIiIqCAYiBIRERFRQTAQJSIiIqKCYCBKRERERAXBQJSIiIiICoKBKBEREREVBANRIiIiIioIBqJEREREVBAMRImIiIioIBiIEhEREVFBMBAlIiIiooJgIEpEREREBcFAlIiIiIgKgoEoERERERUEA1EiIiIiKggGokRERERUEAxEiYiIiKggGIgSERERUUEwECUiIiKigmAgSkREREQFwUCUiIiIiAqCgSgRERERFQQDUSIiIiIqCAaiRERERFQQDESJiIiIqCAYiBIRERFRQTAQJSIiIqKCYCBKRERERAXBQJSIiIiICoKBKBEREREVBANRIiIiIioIuzB/loiIKDha+nNY057BQNZFScTEyroomkp5iySabmwRJSIihD0IvXtrEh48lEbl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BqJEREREVBAMRImIAuC1115Ta3lzPW8iChMGokRERERUEAxEiYiIiKggGIgSERERUUEwECUiIiKigmAgSkR0gP74xz/ife97H5YsWYLa2lq1/cAHPoBHH3103J/3PA+/+MUvcMopp2Du3LlYuHAhLrjggr3+fN6yZcvUJKaHH3543H+Xevl3+bm9/d177rkH73//+3HooYeirq5O7es73vEOfOc738HOnTsP4NUTEU2ePQW/g4goVNLpND7+8Y+rQFTU1NTgsMMOQ0tLC+677z786U9/wje+8Q1cfvnlY/67T33qU/jtb3+rvm9oaEB9fT2eeOIJnHvuufj6178+LfuaTCZx6aWXqv0SVVVVOOKII9DT04PnnnsOa9euxbx58/DBD35wWv4+EdG+MBAlItpPV111lQpCJfj8wQ9+gBUrVoz82+23347Pfe5z+NrXvoZjjz0WJ598sqr/5S9/qYJQ27Zx/fXXq5bUfKD4pS99adoC0SuuuEIFoeXl5fjRj36Ec845B6ZpjvztP/zhDzjooIOm5W8TEb0Rds0TEe2HjRs34uabb0ZZWRluu+22MUGouPDCC1WgKt3hP/zhD1WdfC8Bq5CW1HwQKoqKinDttddiwYIFU34cXnjhBdx6660jgfC73vWukSA0/7cvuugirFy5csr/NhHRRDAQJSLaD9KC6LquGl85f/78cX9GutrFI488Asdx8Oqrr2Lz5s2q7hOf+MTrL8SmOW79ZN19991qu3z5cjUulYgoaNg1T0S0n62M4sknn8QZZ5wx7s9IC2i+67urqwsbNmxQ5eLi4r22fMokoqn20ksvjQSiRERBxECUiGg/yCQfsW3bNvX1RoaGhjAwMDAyqWlvZCb7VOvv71dbGR9KRBREDESJiPZDSUmJ2n7xi19UY0H3pxW1o6Njrz/T3t6+138zDGNMS+t4we54SktL1ba3t3dC+0lENNM4RpSIaD8cfvjhavviiy9O+L9ZunTpSMD42muvjfsz69evf8Pgd9euXeP+u4xBHY+kacoPIyAiCiIGokRE++G8885TLZQPPPDAPoPH0Q4++OCRsaE/+clPXvfv0tI5Xn3eokWL9hpQ5nI5NSN+b5OmZF/lv9tbMnwiokJiIEpEtB+klfHDH/4wstks3vOe9+D+++9/XZf5jh078NOf/nQkZZMEg5///OfV9xJw3nHHHSM/m0qlVK7P/Kz68Zx55plq++tf/xqrV68eqe/r68NnP/tZbNq0aa+tt7LSk5B9lln0o/dV/rakoHr88cf5GSCigjB6enrGH3RERETjymQyuOyyy1TyeiHLa8pynUKWy5RAVMiSmjfeeKP6XgLA//E//sdIECqrGcnKStKtPjg4qBLaf/WrXx0zIWp0q6fM0JdVkCSolbRR8jdfeeUVxGIxfPnLX8aVV16JpqYmrFu3bsx/KzP3L7nkErXaU35lJWmdlb8hK0FJQC0J9rmyEhEVAgNRIqID9NBDD6lucen6zo/flNnvRx11lAoczzrrLFRXV4/8vOQflbXmJSG+pHSKx+M4/vjjVYtoY2Mjjj766HED0Xzrp6wLL3lMJdiVgPJtb3ubCkC3bt2qVkwaLxDNB8Hy3/3mN7/Bs88+q35/ZWWlWlHp9NNPx8UXX6yCYiKimcZAlIiIiIgKgmNEiYiIiKggGIgSERERUUEwECUiIiKigmAgSkREREQFwUCUiIiIiAqCgSgRERERFQQDUSIiIiIqCAaiRERERFQQDESJiIiIqCAYiBIRERFRQTAQJSIiIqKCYCBKRERERAXBQJSIiIiIUAj/H92WHAao/lL4AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ax = wage.plot.scatter(x=\"educ\", y=\"lhwage\", alpha=0.35, figsize=(7, 4))\n", + "ax.set_title(\"교육과 로그 시간당 임금\")\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "id": "result", + "metadata": {}, + "source": [ + "## 결과\n", + "\n", + "무작위 배정 환경에서 회귀는 종종 집단 평균 차이와 같은 처치 대비를 더 간결하게 추정하는 방법일 뿐입니다. 하지만 여기의 임금 데이터는 관찰자료이므로, `educ`의 회귀계수는 더 취약합니다.\n", + "\n", + "통제변수를 추가하면 추정치가 바뀌는데, 이는 다른 변수들과의 관계가 중요하다는 신호입니다. 그렇더라도 이 결과가 자동으로 인과적이 되는 것은 아닙니다. 가족의 부, 야망, 다른 능력 지표처럼 관측되지 않은 요인들이 여전히 누락변수편향을 만들 수 있기 때문입니다.\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "3.12.13", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/book/regression/06-Grouped-and-Dummy-Regression.ipynb b/book/regression/06-Grouped-and-Dummy-Regression.ipynb new file mode 100644 index 0000000..7862b84 --- /dev/null +++ b/book/regression/06-Grouped-and-Dummy-Regression.ipynb @@ -0,0 +1,1160 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 06 - Grouped and Dummy Regression\n", + "\n", + "\n", + "## Regression With Grouped Data\n", + "\n", + "Not all data points are created equal. If we look again at our ENEM dataset, we trust the scores of big schools much more than the scores from small schools. This is not to say that big schools are better or anything. It is just due to the fact that their big size imply less variance." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "from scipy import stats\n", + "from matplotlib import style\n", + "import seaborn as sns\n", + "from matplotlib import pyplot as plt\n", + "import statsmodels.formula.api as smf\n", + "\n", + "style.use(\"fivethirtyeight\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAE0CAYAAAAL77i/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAB7n0lEQVR4nO3dd3xT1fvA8U+adBcolNJCByCUvVfZKHvIBlGQpYIM+YnKFNkiMgSRLxtlCIpQkb2hQsEKKFNQZAgUKKW0FCiltGnz+6MmNk3SJh0kKc/79eKlvSvn5ia5zz3nOeco4uLiNAghhBBC2AEHaxdACCGEEMJcErgIIYQQwm5I4CKEEEIIuyGBixBCCCHshgQuQgghhLAbErgIIYQQwm5I4CLylQ4dOuDp6cmNGzesXRS7U7VqVTw9Pa1djFz16NEjxo0bR/Xq1SlatCienp6EhYVZu1g55unpSYcOHaxdjDyxfv16PD09Wb9+vdXKkJ9/R27cuGGTn5+ZM2ea/f3Ml4GLp6dnlv/SvzlhYWG65X369DF6zMTERDw9Palatarecu2HIKt/6b8A2i+mp6cn7dq1M3ket27dokiRIrptExMTzX4Pzpw5w+DBg6latSrFihXD39+f6tWr07NnT+bOncuDBw/MPpYwj/aL5+npyZIlS4xuc+DAATw9PRk6dOhzLt2LafLkySxdupSAgABGjhzJ2LFjCQwMzHK/w4cP07dvXypWrIi3tzeBgYHUqlWLPn36sHDhQp49e6bb1lZvBHlB+1tp759fewhMtm7dSo8ePQgKCqJo0aKUKlWKunXr8vbbb/P1119bu3hWpbJ2AfLS2LFjTa4z9eO1c+dOjh07RqNGjSx6rYIFC2b6ZS5UqJDBMpVKRXh4OH///TflypUzWP/tt9+SmpqKSqVCrVabXZaQkBDeffddUlNTadKkCe3bt8fd3Z1bt27x66+/sn//fpo1a0bdunXNPqawzOzZs3njjTfyXQ2Gvdm7dy8eHh789NNPODo6mrXPl19+yZQpU1CpVLRo0YIyZcrg5OTE9evXCQ8PZ+fOnbz22mv4+PjkcelfTK+++ip169Z9od/fDz/8kG+++QZXV1dat25NyZIlAbhy5QoHDx5kx44dvP3221YupfXk68Bl/PjxFm3/0ksvce3aNSZMmEBoaCgKhcLsfQsVKmTx67Vu3Zpdu3axdu1aPv30U711qamprF+/nmrVqvHgwQMiIiLMOubTp0/58MMPAdiyZQvNmjUz2ObMmTMUL17corIK85UpU4arV68ye/ZsPvvsM2sX54UWGRmJv7+/2UFLREQE06dPp2DBguzevZvKlSvrrddoNBw9ehQPD4+8KK4g7bfU2IPei+L48eN88803+Pn5sW/fPvz8/PTWp6SkcOjQISuVzjbky6ai7KpRowZdu3blzJkz/PDDD3n+euXKlaNBgwZ8//33JCUl6a07cOAAt27don///hYd888//+TRo0dUrFjRaNACaedp7Gnmzp07jBs3jtq1a+Pr60vJkiVp1qwZM2bMIDk5WW/bc+fOMWDAAIKCgvD29qZy5cq89957XL9+3eC42iaU9evXs2/fPtq1a0dAQIDuKQLSmuIWLlxIs2bN8PPzo0SJErz88st88803aDSWz0qh0WhYuHAhderUwcfHh8qVKzNhwgQeP36s2yYlJYXKlSsTEBBAfHy80eNMmTIFT09P1q5da/Zrv/322/j7+7Ny5Ur++ecfs/YZOnSoyaprbVNExho97T5hYWGEhITQrFkzihcvToUKFfj44491zRmHDx/m1VdfJSAggMDAQAYPHkxsbKzJsjx79oxp06bpmhlr1qzJ7NmzDT6jWteuXWPEiBFUqVKFYsWKUaZMGfr06cOZM2cMtjXns5CZ69evM2zYMCpVqoS3tzdBQUEMGDCAP/74Q287bVOARqMhIiJC14SXVXPO77//TkpKCo0bNzYIWgAUCgVNmjTB3d0dSGv2rV69OgDHjh3Tax6eOXMm8F/zivbvjLRlzSgpKYnZs2dTo0YNihUrRrVq1fj000/1mqkySk1NZe3atbRp04bAwEB8fHxo0KAB8+bNM3r9tM3fT548YeLEibprWLNmTb788ku9797MmTPp2LEjAN9//73euWrzUTQaDd9//z1t2rShbNmy+Pj4UKlSJTp27MiaNWtMljs9Uzku2hwstVrNF198Qa1atShWrBiVK1dm8uTJJj+fxs752LFjAFSvXl13DhnTALRWrVpFw4YN8fHxISgoiPfff5+HDx8a3TYqKopx48ZRq1YtfHx8KFmyJF27duXw4cNmlQ3SAheAjh07GgQtAEqlklatWhnd99SpU7z11lu6Js5y5crRsWNHvvvuO6Pbx8TE8P7771O+fHmKFStG/fr1WbdundFtNRoNa9eupWXLlvj7+1O8eHGaNGnCwoULDe4PWpbcJyyRr2tcsmPy5Mns2rWL6dOn07lzZ1xdXfP09fr378+QIUPYuXMnXbt21S1fs2YNbm5u9OjRgy+//NLs4xUuXBiAu3fv8uTJE90PbFZOnz5N9+7diY2NpUGDBnTo0IHExEQuX77M/PnzGT58uO7Hdf/+/bz55pukpKTQsWNHSpcuzYULF1i3bh07duxg27ZtVKtWzeA1tm7dysGDB2ndujVvvfUW9+7dA+Dx48d06dKF33//nWrVqtG7d28ADh48yIcffsjJkydN5oyYMm7cOH799Ve6du1KwYIF2b9/P4sWLeLXX39l165dODs7o1Qq6devHzNnziQkJIQBAwboHSM5OZn169dTsGBBunfvbvZru7i4MHnyZAYNGsTkyZMtCnqyY/ny5YSGhtK+fXsaNmzInj17WLx4MQ8fPqR169a8++67tG3bln79+nH48GE2btxIbGwsISEhRo/Xv39/zp49S8eOHXF0dGTnzp189tlnnDlzxuAH8PDhw/Tp04fExETatGlDmTJliIyMZPv27Rw4cIDvvvuOFi1aGLyGqc9CZs6cOUPnzp159OgRrVu3pnLlyvzzzz9s376dPXv28N1339G8eXMAevfuTePGjZk1a5ZeM25W+S3a78/169dJSUlBqVRmun3VqlUZMmSILo9G+9kFaNy4cZbnZIpGo2HAgAHs2rWLUqVKMWjQIN3n8cKFC0b3UavVvPnmm+zZs4eyZcvSvXt3nJ2dOXbsGNOmTePw4cP8+OOPqFQqg/26d+9OZGQkLVu2RKVSsXPnTqZMmUJiYiLjxo3Tnc/Nmzf5/vvvqVKlil4QqL3pT58+nXnz5hEYGEjnzp0pVKgQUVFR/PHHH2zYsMHiBzFj3nnnHcLDw2nZsiUFChRg//79LFiwgOjoaBYvXpzl/mPHjuW7774jIiKCIUOG6Gp3jNXyTJ48mUOHDtG2bVteeeUVwsLCWLNmDdeuXWP79u162164cIGuXbsSHR1N8+bNad++PbGxsezcuZMuXbrw1Vdf0bdv3yzLp/2dvXbtmhnvxn/Wrl3LBx98gIODA23btiUoKIiYmBjOnj3LkiVL9D6bAA8fPqRNmzY4OTnRqVMnkpKS2LJlC++99x4ODg4G2w8ZMoQffviBEiVK0Lt3bxwdHdmzZw8TJ04kNDSUjRs36n22snufMEe+DlxMPeGA6WakUqVKMXjwYBYuXMj//vc/Ro8ebdZrPXz40OTrFSpUiGHDhhld17lzZ8aOHcuaNWt0gUtUVBR79+7ltddes7jKtFSpUtSqVYtTp07RunVr+vfvT7169ahQoQIuLi5G90lKSqJ///7ExsayZMkS3njjDb31UVFRuqrxJ0+eMGTIEJKTk9myZQtNmzbVbbd27Vr+7//+jyFDhnDs2DGDprb9+/ezadMmWrZsqbf8448/5vfff2fKlCmMHDlSt/zZs2f07duX77//nk6dOmWayJzRiRMnCAsLIyAgAIBJkybRt29fdu3axaJFi3TNaf3792fu3LmsWrXKIHDZvn070dHRDBo0yOwAUKtHjx4sXbqUbdu2ER4eToMGDSza3xJhYWEcOXKEl156CUD3xPf999+ze/dutm/frstnSkpKolmzZhw4cIBz584Z/eG4fPky4eHhuh/QTz75hA4dOrBr1y5CQkLo0aMHkPaZHzhwII6Ojhw4cIAKFSrojnHp0iVatGjB8OHDOXv2LM7OznqvYeqzYIpGo2HIkCE8fPiQxYsX6/2o/vzzz3Tt2pXBgwdz7tw53NzcdEn2s2bNsqgZt06dOgQEBHDx4kVeffVV3njjDWrXrk358uUNbvgA1apVo1ChQixdupTAwECLm4tNCQkJYdeuXdSqVYudO3fqHqA+/vhjo4EgwPz589mzZw+DBg3i888/1wVdqampfPDBB6xZs4avv/6ad999V2+/yMhIqlSpwk8//aR7nbFjx1K7dm0WL17MRx99hKOjI02aNAHSaluqVq1q9FxXrVpF8eLFCQ8PN/jOxMTE5OxN+dc///zDr7/+qgsyJ06cSOPGjdmwYQOTJ0/OMjdm/PjxHD16lIiICIYOHZppbd9vv/3GsWPHdL8jarWajh07EhYWxu+//07t2rWBtNrb/v378/DhQ7Zv364XtN69e5cWLVowZswY2rZti7e3d6bla9myJQULFmTfvn306tWL7t27U7NmTcqUKYODg/FGkr/++osPP/wQd3d3o02ct27dMtjnjz/+oG/fvnz55Ze6z8rQoUNp1KgRCxYs0PuObd68mR9++IHKlSuze/duChYsCKQFdj169ODQoUMsWbKEESNGADm7T5gjXzcVzZo1y+S/zIwaNQovLy8WLFhg1pMgpHW7NPVamdUWuLq68tprr3H48GFd9dn69etRq9XZejpRKBSsWbOGxo0bc+HCBcaMGcPLL7+Mv78/TZs2ZebMmdy/f19vn927d3Pz5k1at25tELQA+Pj46H60d+7cSUxMDJ06ddL7MAL069eP6tWrc/HiRU6ePGlwnPbt2xvcqB48eMD3339PtWrV9IIWAGdnZyZNmgRgcdPdkCFDdD82kFa9OnXqVBQKhV5VqK+vLx06dODs2bOcOnVK7xirVq0CYODAgRa9NqRdB23e0oQJE7LV3GWud999Vxe0QFqg3K5dO1JTU2nTpo1eEraTkxNdunQBMGhe0Ro9erRe04WrqyuffPIJgN57t2HDBmJjYxk7dqxe0AJQvnx5+vXrx927d41Wkxv7LGTm+PHj/PXXX9SqVcvgSfDll1/m1Vdf5f79++zatcvsYxrj7u6uuzGHh4fzf//3fzRq1Ag/Pz9at27NwoULTTYr5iZtM8nEiRP1an09PT0ZNWqUwfapqaksXboUb29vZs6cqVdT5ODgoPvsm/oezZo1S+91vL29ad++PY8ePeLy5csWld3R0dFokOfl5WXRcUyZOnWqLmiBtGvWs2dPUlNTOX36dK68htaYMWP0fkdUKpUuKP799991y/ft28eVK1d4++23DWrafH19GTFiBE+fPmXr1q1ZvmaJEiVYt24dpUuXZu/evQwePJi6desSEBBAx44dWb16tUGz2Ndff41arWbUqFFGmzj9/f0Nlrm5uTFjxgy9z0qFChUIDg7m0qVLep9zba3x5MmTdUELpP2eaPP40jcF5uQ+YY58XeMSFxeXrf0KFSrE2LFjGTNmDDNmzGDBggVZ7hMQEMD58+ez9Xr9+/dnxYoVrF27lokTJ7J27VrdByg7AgIC2LFjB5cuXSI0NJTTp09z6tQpzp07x7lz51i5ciU//vgjNWrUANKeKgCzbiRnz54FMPgwar388sucPXuWs2fPUq9ePb112qeT9H7//XfUajUODg5Ga6y0van+/vvvLMuWnrFeYUFBQRQrVoxr167x+PFjChQoAKTlpGzZsoVVq1ZRq1YtIC17PywsjPr161OpUiWLXlurQYMGdOrUiW3bthESEkLPnj2zdZysGKs18fX1NblOm5h9584do8cz9t41bNgQhULBuXPndMu0bfEXLlwweu2u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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "np.random.seed(876)\n", + "enem = pd.read_csv(\"./data/enem_scores.csv\").sample(200)\n", + "plt.figure(figsize=(8,4))\n", + "sns.scatterplot(y=\"avg_score\", x=\"number_of_students\", data=enem)\n", + "sns.scatterplot(y=\"avg_score\", x=\"number_of_students\", s=100, label=\"Trustworthy\",\n", + " data=enem.query(f\"number_of_students=={enem.number_of_students.max()}\"))\n", + "sns.scatterplot(y=\"avg_score\", x=\"number_of_students\", s=100, label=\"Not so Much\",\n", + " data=enem.query(f\"avg_score=={enem.avg_score.max()}\"))\n", + "plt.title(\"ENEM Score by Number of Students in the School\");" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the data above, intuitively, points to the left should have less impact in my model than points to the right. In essence, points to the right are actually lots of other data points grouped into a single one. If we could unbundle them and run a linear regression on the ungrouped data, they would indeed contribute much more to the model estimation than an unbundled point in the left. \n", + "\n", + "This phenomenon of having a region of low variance and another of high variance is called **heteroskedasticity**. Put it simply, heteroskedasticity is when the variance is not constant across all values of the features. In the case above, we can see that the variance decreases as the feature sample size increases. To give another example of where we have heteroskedasticity, if you plot wage by age, you will see that there is higher wage variance for the old than for the young. But, by far, the most common reason for variance to differ is grouped data.\n", + "\n", + "Grouped data like the one above are extremely common in data analysis. One reason for that is confidentiality. Governments and firms can't give away personal data because that would violate data privacy requirements they have to follow. If they need to export data to an outside researcher, they can only do it by means of grouping the data. This way, individuals get grouped together and are no longer uniquely identifiable.\n", + "\n", + "Fortunately for us, regression can handle those kinds of data pretty well. To understand how, let's first take some ungrouped data like the one we had on wage and education. It contains one line per worker, so we know the wage for each individual in this dataset and also how many years of education he or she has." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
wagelhwageeducIQ
07692.9562121293
18082.78253918119
28253.02650414108
36502.7880931296
45622.6426221174
\n", + "
" + ], + "text/plain": [ + " wage lhwage educ IQ\n", + "0 769 2.956212 12 93\n", + "1 808 2.782539 18 119\n", + "2 825 3.026504 14 108\n", + "3 650 2.788093 12 96\n", + "4 562 2.642622 11 74" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wage = pd.read_csv(\"./data/wage.csv\")[[\"wage\", \"lhwage\", \"educ\", \"IQ\"]]\n", + "\n", + "wage.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we run a regression model to figure out how education is associated with log hourly wages, we get the following result." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "
coef std err t P>|t| [0.025 0.975]
Intercept 2.2954 0.089 25.754 0.000 2.121 2.470
educ 0.0529 0.007 8.107 0.000 0.040 0.066
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_1 = smf.ols('lhwage ~ educ', data=wage).fit()\n", + "model_1.summary().tables[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, let's pretend for a moment that this data was under some confidentiality constraint. The provider of it was not able to give individualised data. So we ask him instead to group everyone by years of education and give us only the mean log hourly wage and the number of individuals in each group. This leaves us with only 10 data points." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
educlhwagecount
092.85647510
1102.78691135
2112.85599743
3122.922168393
4133.02118285
5143.04235277
6153.09076645
7163.176184150
8173.24656640
9183.14425757
\n", + "
" + ], + "text/plain": [ + " educ lhwage count\n", + "0 9 2.856475 10\n", + "1 10 2.786911 35\n", + "2 11 2.855997 43\n", + "3 12 2.922168 393\n", + "4 13 3.021182 85\n", + "5 14 3.042352 77\n", + "6 15 3.090766 45\n", + "7 16 3.176184 150\n", + "8 17 3.246566 40\n", + "9 18 3.144257 57" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "group_wage = (wage\n", + " .assign(count=1)\n", + " .groupby(\"educ\")\n", + " .agg({\"lhwage\":\"mean\", \"count\":\"count\"})\n", + " .reset_index())\n", + "\n", + "group_wage" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Fear not! Regression doesn't need big data to work! What we can do is provide weights to our linear regression model. This way, it will consider groups with higher sample size more than the small groups. Notice how I've replaced the `smf.ols` with `smf.wls`, for weighted least squares. It's hard to notice, but it will make all the difference." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "
coef std err t P>|t| [0.025 0.975]
Intercept 2.2954 0.078 29.327 0.000 2.115 2.476
educ 0.0529 0.006 9.231 0.000 0.040 0.066
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_2 = smf.wls('lhwage ~ educ', data=group_wage, weights=group_wage[\"count\"]).fit()\n", + "model_2.summary().tables[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notice how the parameter estimate of `educ` in the grouped model is very close to the one in the ungrouped data (actually, they are the same in this case). Also, even with only 10 data points, we've managed to get a statistically significant coefficient. That's because, although we have fewer points, grouping also lowers the variance by a lot. Also notice how the standard error is a bit smaller and the t statistics is a bit larger. That's because some information about the variance is lost, so we have to be more conservative. Once we group the data, we don't know how large the variance is within each group. Compare the results above with what we would have with the non weighted model below." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "
coef std err t P>|t| [0.025 0.975]
Intercept 2.3650 0.082 28.988 0.000 2.177 2.553
educ 0.0481 0.006 8.136 0.000 0.034 0.062
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_3 = smf.ols('lhwage ~ educ', data=group_wage).fit()\n", + "model_3.summary().tables[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The parameter estimate is smaller. What is happening here is that the regression is placing equal weight for all points. If we plot the model along the grouped points, we see that the non weighted model is giving more importance to small points in the lower left than it should. As a consequence, the line has a lower slope." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.scatterplot(x=\"educ\", y = \"lhwage\", size=\"count\", legend=False, data=group_wage, sizes=(40, 400))\n", + "plt.plot(wage[\"educ\"], model_2.predict(wage[\"educ\"]), c=\"C1\", label = \"Weighted\")\n", + "plt.plot(wage[\"educ\"], model_3.predict(wage[\"educ\"]), c=\"C2\", label = \"Non Weighted\")\n", + "plt.xlabel(\"Years of Education\")\n", + "plt.ylabel(\"Log Hourly Wage\")\n", + "plt.legend();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The bottom line is that regression is this marvellous tool that works both with individual or aggregated data, but you have to use weights in this last case. To use weighted regression you need mean statistics. Not sums, not standard deviations, not medians, but means! For both the covariates and the dependent variable. Just keep in mind that the result of weighted regression with grouped data won't match exactly that of regression in ungrouped data, but it will be pretty similar. \n", + "\n", + "![img](./data/img/dummy/heterosk.png)\n", + "\n", + "I'll finish with a final example using additional covariates in a grouped data model." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of observations: 10.0\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "
coef std err t P>|t| [0.025 0.975]
Intercept 1.8821 0.324 5.800 0.001 1.115 2.649
educ 0.0257 0.021 1.198 0.270 -0.025 0.077
IQ 0.0077 0.006 1.309 0.232 -0.006 0.022
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "group_wage = (wage\n", + " .assign(count=1)\n", + " .groupby(\"educ\")\n", + " .agg({\"lhwage\":\"mean\", \"IQ\":\"mean\", \"count\":\"count\"})\n", + " .reset_index())\n", + "\n", + "model_4 = smf.wls('lhwage ~ educ + IQ', data=group_wage, weights=group_wage[\"count\"]).fit()\n", + "print(\"Number of observations:\", model_4.nobs)\n", + "model_4.summary().tables[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this example, we've included IQ as a feature, besides the previously added years of education. The mechanics is pretty much the same: get the means and count, regress the mean and use the count as weights. \n", + "\n", + "## Regression for Dummies\n", + "\n", + "Dummy variables are categorical variables we've encoded as binary columns. For example, suppose you have a gender variable that you wish to include in your model. This variable is encoded into 3 categories: male, female and other genders. \n", + "\n", + "|gender|\n", + "|------|\n", + "|male |\n", + "|female|\n", + "|female|\n", + "|other |\n", + "|male |\n", + "\n", + "Since our model only accepts numerical values, we need to convert this category to a number. In linear regression, we use dummies for that. We encode each variable as a 0/1 column, denoting the presence of a category. We also leave one of the categories out as the base category. This is necessary since the last category is a linear combination of the others. Put it differently, we can know the last category if someone gives us information on the others. In our example, if someone is neither female nor other genders, we can infer that the person's category is male.\n", + "\n", + "|gender|female|other|\n", + "|------|:-----|:----|\n", + "|male |0|0|\n", + "|female|1|0|\n", + "|female|1|0|\n", + "|other |0|1|\n", + "|male |0|0|\n", + "\n", + "We've already dealt with a simple form of dummy regression when dealing with A/B testing. More generally, when we are dealing with a binary treatment, we represent it as a dummy variable. In this case, **the regression coefficient for that dummy is the increment for the intercept in the regression line**, or the difference in means between the treated and untreated.\n", + "\n", + "To make this more concrete, consider the problem of estimating the effect of graduating 12th grade on hourly wage (and let's ignore confounding just for now). In the code below, we've created a treatment dummy variable `T` indicating if years of education is greater than 12. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
hwageIQT
019.225930
116.1601191
220.6251081
316.250960
414.050740
\n", + "
" + ], + "text/plain": [ + " hwage IQ T\n", + "0 19.225 93 0\n", + "1 16.160 119 1\n", + "2 20.625 108 1\n", + "3 16.250 96 0\n", + "4 14.050 74 0" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wage = (pd.read_csv(\"./data/wage.csv\")\n", + " .assign(hwage=lambda d: d[\"wage\"] / d[\"hours\"])\n", + " .assign(T=lambda d: (d[\"educ\"] > 12).astype(int)))\n", + "\n", + "wage[[\"hwage\", \"IQ\", \"T\"]].head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The dummy works as a kind of switch. In our example, if the dummy is on, the predicted value is the intercept plus the dummy coefficient. If the dummy is off, the predicted value is just the intercept. " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "
coef std err t P>|t| [0.025 0.975]
Intercept 19.9405 0.436 45.685 0.000 19.084 20.797
T 4.9044 0.626 7.830 0.000 3.675 6.134
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "smf.ols('hwage ~ T', data=wage).fit().summary().tables[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this case, when the person hasn't completed 12th grade (dummy off), the average income is 19.9. When he or she has completed 12th grade (dummy on), the predicted value or the average income is 24.8449 (19.9405 + 4.9044). Hence, the dummy coefficient captures the difference in means, which is 4.9044 in our case.\n", + "\n", + "More formally, when the independent variable is binary, as is often the case with treatment indicators, regression captures the ATE perfectly. That is because regression is a linear approximation to the conditional expectation function (CEF) $E[Y|X]$ and, in this particular case, the CEF IS linear. Namely, we can define $E[Y_i|T_i=0]=\\alpha$ and $E[Y_i|T_i=1] = \\alpha + \\beta$, which leads to the following CEF\n", + "\n", + "$\n", + "E[Y_i|T_i] = E[Y_i|T_i=0] + \\beta T_i = \\alpha + \\beta T_i\n", + "$\n", + "\n", + "and $\\beta$ is the difference in means or the ATE in the case of random data\n", + "\n", + "$\n", + "\\beta = [Y_i|T_i=1] - [Y_i|T_i=0]\n", + "$\n", + "\n", + "If we use additional variables, the dummy coefficient becomes the **conditional** difference in means. For instance, let's say we add IQ to the previous model. Now, the dummy coefficient tells us how much increase we should expect from graduating 12th grade **while holding IQ fixed**. If we plot the prediction, we will see two parallel lines. The jump from one line to the next says the amount we should expect for completing 12th grade. They also say that the effect is constant. No matter your IQ, everyone benefits the same from graduating 12th grade. " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "m = smf.ols('hwage ~ T+IQ', data=wage).fit()\n", + "plt_df = wage.assign(y_hat = m.fittedvalues)\n", + "\n", + "plt.plot(plt_df.query(\"T==1\")[\"IQ\"], plt_df.query(\"T==1\")[\"y_hat\"], c=\"C1\", label=\"T=1\")\n", + "plt.plot(plt_df.query(\"T==0\")[\"IQ\"], plt_df.query(\"T==0\")[\"y_hat\"], c=\"C2\", label=\"T=0\")\n", + "plt.title(f\"E[T=1|IQ] - E[T=0|IQ] = {round(m.params['T'], 2)}\")\n", + "plt.ylabel(\"Wage\")\n", + "plt.xlabel(\"IQ\")\n", + "plt.legend();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we put this model into an equation, we can see why:\n", + "\n", + "$\n", + "wage_i = \\beta_0 + \\beta_1T_i + \\beta_2 IQ_i + e_i\n", + "$\n", + "\n", + "Here, $\\beta_1$ is the conditional difference in means and it is a constant value, 3.16 in our case. We can make this model more flexible by adding an interaction term.\n", + "\n", + "$\n", + "wage_i = \\beta_0 + \\beta_1T_i + \\beta_2 IQ_i + \\beta_3 IQ_i * T_i + e_i\n", + "$\n", + "\n", + "Things are getting a little bit more complex, so let's see what each parameter means in this model. First, the intercept $\\beta_0$. This bad boy doesn't have a particularly interesting interpretation. It's the expected wage when the treatment is zero (the person hasn't graduated from 12th grade) AND the IQ is zero. Since we don't expect IQ to be zero for anyone this parameter is not very meaningful. As for $\\beta_1$, we have a similar situation. This parameter is how much increase in wage we should expect from completing 12th grade **when IQ is zero**. Once again, since IQ is never zero, it doesn't have a particularly interesting meaning. Now, $\\beta_2$ is a bit more interesting. It tells us how much IQ increases wages **for the non-treated**. So, in our case, it is something like 0.11. This means that for each 1 extra IQ point, the person that has not completed 12th grade should expect to gain an extra 11 cents per hour. Finally, the most interesting parameter is $\\beta_3$. It tells us how much IQ increases the effect of graduating 12th grade. In our case, this parameter is 0.024, which means that for each extra IQ point, graduating 12th grade gives 2 extra cents. This might not seem much, but compare someone with 60IQ and with 140IQ. The first one will get an increase of 1.44 in wage (60 * 0.024), while the person with 140 IQ will gain an extra 3.36 dollars (140 * 0.024) when graduating from 12th grade.\n", + "\n", + "In simple modeling jargon, this interaction term allows the treatment effect to change by levels of the features (only IQ, in this example). The result is that if we plot the prediction lines, we will see that they are no longer parallel and that those that graduate 12th grade (T=1) have a higher slope on IQ, higher IQ benefit more from graduating than lower IQ. This is sometimes referenced as effect modification or heterogeneous treatment effect. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "m = smf.ols('hwage ~ T*IQ', data=wage).fit()\n", + "plt_df = wage.assign(y_hat = m.fittedvalues)\n", + "\n", + "plt.plot(plt_df.query(\"T==1\")[\"IQ\"], plt_df.query(\"T==1\")[\"y_hat\"], c=\"C1\", label=\"T=1\")\n", + "plt.plot(plt_df.query(\"T==0\")[\"IQ\"], plt_df.query(\"T==0\")[\"y_hat\"], c=\"C2\", label=\"T=0\")\n", + "plt.title(f\"E[T=1|IQ] - E[T=0|IQ] = {round(m.params['T'], 2)}\")\n", + "plt.ylabel(\"Wage\")\n", + "plt.xlabel(\"IQ\")\n", + "plt.legend();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, let's look at the case where all the variables in our model are dummies. To do so, we will discretize IQ into 4 bins and treat years of education as a category." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
hwageeducIQ_bins
019.225121
116.160183
220.625142
316.250121
414.050110
\n", + "
" + ], + "text/plain": [ + " hwage educ IQ_bins\n", + "0 19.225 12 1\n", + "1 16.160 18 3\n", + "2 20.625 14 2\n", + "3 16.250 12 1\n", + "4 14.050 11 0" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wage_ed_bins = (wage\n", + " .assign(IQ_bins = lambda d: pd.qcut(d[\"IQ\"], q=4, labels=range(4)))\n", + " [[\"hwage\", \"educ\", \"IQ_bins\"]])\n", + "\n", + "wage_ed_bins.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Treating education as a category, we no longer restrict the effect of education to a single parameter. Instead, we allow each year of education to have its own distinct impact. By doing so, we gain flexibility, since the effect of education is no longer parametric. This model simply computes the mean wage for each year of education." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "
coef std err t P>|t| [0.025 0.975]
Intercept 18.5600 3.011 6.164 0.000 12.651 24.469
C(educ)[T.10] -0.7874 3.414 -0.231 0.818 -7.488 5.913
C(educ)[T.11] 0.1084 3.343 0.032 0.974 -6.452 6.669
C(educ)[T.12] 1.7479 3.049 0.573 0.567 -4.236 7.732
C(educ)[T.13] 4.3290 3.183 1.360 0.174 -1.918 10.576
C(educ)[T.14] 4.0888 3.200 1.278 0.202 -2.192 10.370
C(educ)[T.15] 6.3013 3.329 1.893 0.059 -0.231 12.834
C(educ)[T.16] 7.2225 3.110 2.323 0.020 1.120 13.325
C(educ)[T.17] 9.5905 3.366 2.849 0.004 2.984 16.197
C(educ)[T.18] 7.3681 3.264 2.257 0.024 0.962 13.775
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_dummy = smf.ols('hwage ~ C(educ)', data=wage).fit()\n", + "model_dummy.summary().tables[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(wage[\"educ\"], wage[\"hwage\"])\n", + "plt.plot(wage[\"educ\"].sort_values(), model_dummy.predict(wage[\"educ\"].sort_values()), c=\"C1\")\n", + "plt.xlabel(\"Years of Education\")\n", + "plt.ylabel(\"Hourly Wage\");" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First of all, notice how this removes any assumption about the functional form of how education affects wages. We don't need to worry about logs anymore. In essence, this model is completely non-parametric. All it does is compute sample averages of wage for each year of education. This can be seen in the plot above, where the fitted line doesn't have a particular form. Instead, is the interpolation of the sample means for each year of education. We can also see that by reconstructing one parameter, for instance, that of 17 years of education. For this model, it's `9.5905`. Below, we can see how it is just the difference between the baseline years of education (9) and the individuals with 17 years\n", + "\n", + "$\n", + "\\beta_{17} = E[Y|T=17]-E[Y|T=9]\n", + "$\n", + "\n", + "The trade-off is that we lose statistical significance when we allow such flexibility. Notice how big the p-values are for some years." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "E[Y|T=9]: 18.56\n", + "E[Y|T=17]-E[Y|T=9]: 9.590472362353516\n" + ] + } + ], + "source": [ + "t1 = wage.query(\"educ==17\")[\"hwage\"]\n", + "t0 = wage.query(\"educ==9\")[\"hwage\"]\n", + "print(\"E[Y|T=9]:\", t0.mean())\n", + "print(\"E[Y|T=17]-E[Y|T=9]:\", t1.mean() - t0.mean())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we include more dummy covariates in the model, the parameter on education become a weighted average of the effect on each dummy group:\n", + "\n", + "$\n", + "E\\{ \\ (E[Y_i|T=1, Group_i] - E[Y_i|T=0, Group_i])w(Group_i) \\ \\}\n", + "$\n", + "\n", + "$w(Group_i)$ is not exactly, but is proportional to the variance of the treatment in the group $Var(T_i|Group_i)$. One natural question that arises from this is why not use the full nonparametric estimator, where the group weight is the sample size? This indeed is a valid estimator, but it is not what regression does. By using the treatment variance, regression is placing more weight on groups where the treatment varies a lot. This makes intuitive sense. If the treatment was almost constant (say 1 treated and everyone else untreated), it doesn't matter its sample size. It wouldn't provide much information about the treatment effect." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "
coef std err t P>|t| [0.025 0.975]
Intercept 18.4178 2.991 6.158 0.000 12.548 24.288
C(educ)[T.10] -1.2149 3.392 -0.358 0.720 -7.872 5.442
C(educ)[T.11] -0.4687 3.332 -0.141 0.888 -7.008 6.070
C(educ)[T.12] 0.3400 3.059 0.111 0.912 -5.664 6.344
C(educ)[T.13] 2.4103 3.206 0.752 0.452 -3.882 8.702
C(educ)[T.14] 1.8040 3.238 0.557 0.578 -4.551 8.159
C(educ)[T.15] 3.8599 3.369 1.146 0.252 -2.752 10.472
C(educ)[T.16] 4.4060 3.171 1.390 0.165 -1.817 10.629
C(educ)[T.17] 6.7470 3.422 1.971 0.049 0.030 13.464
C(educ)[T.18] 4.3463 3.332 1.304 0.192 -2.194 10.886
C(IQ_bins)[T.1] 1.4216 0.898 1.584 0.114 -0.340 3.183
C(IQ_bins)[T.2] 2.9717 0.930 3.195 0.001 1.146 4.797
C(IQ_bins)[T.3] 3.7879 1.022 3.708 0.000 1.783 5.793
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_dummy_2 = smf.ols('hwage ~ C(educ) + C(IQ_bins)', data=wage_ed_bins).fit()\n", + "model_dummy_2.summary().tables[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![img](./data/img/dummy/you_little_shit.png)\n", + "\n", + "## Key Ideas\n", + "\n", + "We started this section by looking at how some data points are more important than others. Namely, those with higher sample size and lower variance should be given more weight when estimating a linear model. Then, we looked at how linear regression can even handle grouped anonymised data with elegance, provided we use sample weights in our model.\n", + "\n", + "Next, we moved to dummy regression. We saw how it can be made a non parametric model that places no assumptions whatsoever on the functional form of how the treatment impacts the outcome. We then explored the intuition behind dummy regression.\n", + "\n", + "## References\n", + "\n", + "I like to think of this entire book as a tribute to Joshua Angrist, Alberto Abadie and Christopher Walters for their amazing Econometrics class. Most of the ideas here are taken from their classes at the American Economic Association. Watching them is what is keeping me sane during this tough year of 2020.\n", + "* [Cross-Section Econometrics](https://www.aeaweb.org/conference/cont-ed/2017-webcasts)\n", + "* [Mastering Mostly Harmless Econometrics](https://www.aeaweb.org/conference/cont-ed/2020-webcasts)\n", + "\n", + "I'll also like to reference the amazing books from Angrist. They have shown me that Econometrics, or 'Metrics as they call it, is not only extremely useful but also profoundly fun.\n", + "\n", + "* [Mostly Harmless Econometrics](https://www.mostlyharmlesseconometrics.com/)\n", + "* [Mastering 'Metrics](https://www.masteringmetrics.com/)\n", + "\n", + "My final reference is Miguel Hernan and Jamie Robins' book. It has been my trustworthy companion in the most thorny causal questions I had to answer.\n", + "\n", + "* [Causal Inference Book](https://www.hsph.harvard.edu/miguel-hernan/causal-inference-book/)\n", + "\n", + "![img](./data/img/poetry.png)\n", + "\n", + "## Contribute\n", + "\n", + "Causal Inference for the Brave and True is an open-source material on causal inference, the statistics of science. It uses only free software, based in Python. Its goal is to be accessible monetarily and intellectually.\n", + "If you found this book valuable and you want to support it, please go to [Patreon](https://www.patreon.com/causal_inference_for_the_brave_and_true). If you are not ready to contribute financially, you can also help by fixing typos, suggesting edits or giving feedback on passages you didn't understand. Just go to the book's repository and [open an issue](https://github.com/matheusfacure/python-causality-handbook/issues). Finally, if you liked this content, please share it with others who might find it useful and give it a [star on GitHub](https://github.com/matheusfacure/python-causality-handbook/stargazers).\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "causal-glory", + "language": "python", + "name": "causal-glory" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.7" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/book/regression/06-Grouped-and-Dummy-Regression_minimal.ipynb b/book/regression/06-Grouped-and-Dummy-Regression_minimal.ipynb new file mode 100644 index 0000000..b1dfe91 --- /dev/null +++ b/book/regression/06-Grouped-and-Dummy-Regression_minimal.ipynb @@ -0,0 +1,504 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**🌐 Language:** **English** | [한국어 →](/regression/06-grouped-and-dummy-regression-minimal-ko)\n", + "\n", + "# 06 - Grouped and Dummy Regression (Minimal)\n", + "\n", + "Grouped regression can recover the same idea from aggregated data when we keep group means and group counts. Dummy regression turns discrete categories into 0/1 indicators, so coefficients become differences in means or conditional differences in means.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import statsmodels.formula.api as smf\n", + "\n", + "plt.style.use(\"fivethirtyeight\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load Data\n", + "\n", + "We use only `wage.csv`.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
wagehourshwagelhwageeducIQT
07694019.2252.95621212930
18085016.1602.782539181191
28254020.6253.026504141081
36504016.2502.78809312960
45624014.0502.64262211740
\n", + "
" + ], + "text/plain": [ + " wage hours hwage lhwage educ IQ T\n", + "0 769 40 19.225 2.956212 12 93 0\n", + "1 808 50 16.160 2.782539 18 119 1\n", + "2 825 40 20.625 3.026504 14 108 1\n", + "3 650 40 16.250 2.788093 12 96 0\n", + "4 562 40 14.050 2.642622 11 74 0" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wage = (pd.read_csv(\"data/wage.csv\")\n", + " .dropna(subset=[\"wage\", \"hours\", \"educ\", \"IQ\", \"lhwage\"])\n", + " .assign(hwage=lambda d: d[\"wage\"] / d[\"hours\"],\n", + " T=lambda d: (d[\"educ\"] > 12).astype(int))\n", + " .copy())\n", + "\n", + "wage[[\"wage\", \"hours\", \"hwage\", \"lhwage\", \"educ\", \"IQ\", \"T\"]].head()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Grouped Regression\n", + "\n", + "Aggregate wages by years of education, then compare weighted and unweighted grouped regressions to the individual-data regression.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
coef_on_educstd_error
Individual OLS0.05290.0065
Grouped WLS0.05290.0057
Grouped OLS0.04810.0059
\n", + "
" + ], + "text/plain": [ + " coef_on_educ std_error\n", + "Individual OLS 0.0529 0.0065\n", + "Grouped WLS 0.0529 0.0057\n", + "Grouped OLS 0.0481 0.0059" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "group_wage = (wage\n", + " .groupby(\"educ\", as_index=False)\n", + " .agg(lhwage=(\"lhwage\", \"mean\"),\n", + " count=(\"lhwage\", \"size\")))\n", + "\n", + "individual_model = smf.ols(\"lhwage ~ educ\", data=wage).fit()\n", + "grouped_weighted_model = smf.wls(\"lhwage ~ educ\", data=group_wage, weights=group_wage[\"count\"]).fit()\n", + "grouped_unweighted_model = smf.ols(\"lhwage ~ educ\", data=group_wage).fit()\n", + "\n", + "pd.DataFrame(\n", + " {\n", + " \"coef_on_educ\": [\n", + " individual_model.params[\"educ\"],\n", + " grouped_weighted_model.params[\"educ\"],\n", + " grouped_unweighted_model.params[\"educ\"],\n", + " ],\n", + " \"std_error\": [\n", + " individual_model.bse[\"educ\"],\n", + " grouped_weighted_model.bse[\"educ\"],\n", + " grouped_unweighted_model.bse[\"educ\"],\n", + " ],\n", + " },\n", + " index=[\"Individual OLS\", \"Grouped WLS\", \"Grouped OLS\"],\n", + ").round(4)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ax = group_wage.plot.scatter(x=\"educ\", y=\"lhwage\", s=group_wage[\"count\"] * 2.5, alpha=0.65, figsize=(7, 4))\n", + "educ_grid = pd.DataFrame({\"educ\": sorted(wage[\"educ\"].unique())})\n", + "ax.plot(educ_grid[\"educ\"], grouped_weighted_model.predict(educ_grid), color=\"C1\", label=\"Weighted grouped fit\")\n", + "ax.plot(educ_grid[\"educ\"], grouped_unweighted_model.predict(educ_grid), color=\"C2\", label=\"Unweighted grouped fit\")\n", + "ax.set_title(\"Grouped Regression Needs Weights\")\n", + "ax.set_xlabel(\"Years of Education\")\n", + "ax.set_ylabel(\"Log Hourly Wage\")\n", + "ax.legend()\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Dummy Regression\n", + "\n", + "Use a treatment dummy for completing more than 12 years of education, then compare that dummy model with a fully categorical regression on years of education.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
coef_on_Tinterceptcoef_on_IQ
Dummy only4.904419.9405NaN
Dummy + IQ3.15738.09560.1253
\n", + "
" + ], + "text/plain": [ + " coef_on_T intercept coef_on_IQ\n", + "Dummy only 4.9044 19.9405 NaN\n", + "Dummy + IQ 3.1573 8.0956 0.1253" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dummy_model = smf.ols(\"hwage ~ T\", data=wage).fit()\n", + "conditional_dummy_model = smf.ols(\"hwage ~ T + IQ\", data=wage).fit()\n", + "categorical_model = smf.ols(\"hwage ~ C(educ)\", data=wage).fit()\n", + "\n", + "pd.DataFrame(\n", + " {\n", + " \"coef_on_T\": [dummy_model.params[\"T\"], conditional_dummy_model.params[\"T\"]],\n", + " \"intercept\": [dummy_model.params[\"Intercept\"], conditional_dummy_model.params[\"Intercept\"]],\n", + " \"coef_on_IQ\": [float(\"nan\"), conditional_dummy_model.params[\"IQ\"]],\n", + " },\n", + " index=[\"Dummy only\", \"Dummy + IQ\"],\n", + ").round(4)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
educmean_hourly_wage
0918.560000
11017.772594
21118.668373
31220.307866
41322.888960
\n", + "
" + ], + "text/plain": [ + " educ mean_hourly_wage\n", + "0 9 18.560000\n", + "1 10 17.772594\n", + "2 11 18.668373\n", + "3 12 20.307866\n", + "4 13 22.888960" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ax = wage.plot.scatter(x=\"IQ\", y=\"hwage\", c=\"T\", cmap=\"coolwarm\", alpha=0.3, figsize=(7, 4))\n", + "plot_df = wage.sort_values([\"T\", \"IQ\"]).copy()\n", + "plot_df[\"y_hat\"] = conditional_dummy_model.predict(plot_df)\n", + "for t_value, color, label in [(0, \"C2\", \"T=0\"), (1, \"C1\", \"T=1\")]:\n", + " subset = plot_df.query(\"T == @t_value\")\n", + " ax.plot(subset[\"IQ\"], subset[\"y_hat\"], color=color, linewidth=2.5, label=label)\n", + "ax.set_title(f\"Conditional Difference in Means = {conditional_dummy_model.params[\"T\"]:.2f}\")\n", + "ax.set_xlabel(\"IQ\")\n", + "ax.set_ylabel(\"Hourly Wage\")\n", + "ax.legend()\n", + "plt.show()\n", + "\n", + "wage.groupby(\"educ\", as_index=False)[\"hwage\"].mean().rename(columns={\"hwage\": \"mean_hourly_wage\"}).head()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Result\n", + "\n", + "With grouped data, weighted regression stays close to the individual-data result because large groups get more influence. With dummy regression, coefficients become differences in means, and a categorical specification removes the need to force education into a single linear slope.\n" + ] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "3.12.13", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.13" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/book/regression/06-Grouped-and-Dummy-Regression_minimal_ko.ipynb b/book/regression/06-Grouped-and-Dummy-Regression_minimal_ko.ipynb new file mode 100644 index 0000000..b67dd31 --- /dev/null +++ b/book/regression/06-Grouped-and-Dummy-Regression_minimal_ko.ipynb @@ -0,0 +1,596 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**🌐 언어:** [← English](/regression/06-grouped-and-dummy-regression-minimal) | **한국어**\n", + "\n", + "# 06 - 그룹화 회귀와 더미 회귀 (간단 버전)\n", + "\n", + "그룹화 회귀는 집계된 데이터에서도 집단 평균과 집단 크기를 함께 보존하면 같은 핵심 아이디어를 복원할 수 있습니다. 더미 회귀는 이산 범주를 0/1 지표로 바꾸기 때문에, 계수는 평균 차이 또는 조건부 평균 차이로 해석됩니다.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import statsmodels.formula.api as smf\n", + "\n", + "plt.style.use(\"fivethirtyeight\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 데이터 불러오기\n", + "\n", + "`wage.csv`만 사용합니다.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
wagehourshwagelhwageeducIQT
07694019.2252.95621212930
18085016.1602.782539181191
28254020.6253.026504141081
36504016.2502.78809312960
45624014.0502.64262211740
\n", + "
" + ], + "text/plain": [ + " wage hours hwage lhwage educ IQ T\n", + "0 769 40 19.225 2.956212 12 93 0\n", + "1 808 50 16.160 2.782539 18 119 1\n", + "2 825 40 20.625 3.026504 14 108 1\n", + "3 650 40 16.250 2.788093 12 96 0\n", + "4 562 40 14.050 2.642622 11 74 0" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wage = (pd.read_csv(\"data/wage.csv\")\n", + " .dropna(subset=[\"wage\", \"hours\", \"educ\", \"IQ\", \"lhwage\"])\n", + " .assign(hwage=lambda d: d[\"wage\"] / d[\"hours\"],\n", + " T=lambda d: (d[\"educ\"] > 12).astype(int))\n", + " .copy())\n", + "\n", + "wage[[\"wage\", \"hours\", \"hwage\", \"lhwage\", \"educ\", \"IQ\", \"T\"]].head()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 그룹화 회귀\n", + "\n", + "임금을 교육연수별로 집계한 뒤, 가중치를 둔 그룹화 회귀와 가중치가 없는 그룹화 회귀를 개별자료 회귀와 비교합니다.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
coef_on_educstd_error
Individual OLS0.05290.0065
Grouped WLS0.05290.0057
Grouped OLS0.04810.0059
\n", + "
" + ], + "text/plain": [ + " coef_on_educ std_error\n", + "Individual OLS 0.0529 0.0065\n", + "Grouped WLS 0.0529 0.0057\n", + "Grouped OLS 0.0481 0.0059" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "group_wage = (wage\n", + " .groupby(\"educ\", as_index=False)\n", + " .agg(lhwage=(\"lhwage\", \"mean\"),\n", + " count=(\"lhwage\", \"size\")))\n", + "\n", + "individual_model = smf.ols(\"lhwage ~ educ\", data=wage).fit()\n", + "grouped_weighted_model = smf.wls(\"lhwage ~ educ\", data=group_wage, weights=group_wage[\"count\"]).fit()\n", + "grouped_unweighted_model = smf.ols(\"lhwage ~ educ\", data=group_wage).fit()\n", + "\n", + "pd.DataFrame(\n", + " {\n", + " \"coef_on_educ\": [\n", + " individual_model.params[\"educ\"],\n", + " grouped_weighted_model.params[\"educ\"],\n", + " grouped_unweighted_model.params[\"educ\"],\n", + " ],\n", + " \"std_error\": [\n", + " individual_model.bse[\"educ\"],\n", + " grouped_weighted_model.bse[\"educ\"],\n", + " grouped_unweighted_model.bse[\"educ\"],\n", + " ],\n", + " },\n", + " index=[\"Individual OLS\", \"Grouped WLS\", \"Grouped OLS\"],\n", + ").round(4)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 47196 (\\N{HANGUL SYLLABLE RO}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 44536 (\\N{HANGUL SYLLABLE GEU}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 49884 (\\N{HANGUL SYLLABLE SI}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 44036 (\\N{HANGUL SYLLABLE GAN}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 45817 (\\N{HANGUL SYLLABLE DANG}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 51076 (\\N{HANGUL SYLLABLE IM}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 44552 (\\N{HANGUL SYLLABLE GEUM}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 47353 (\\N{HANGUL SYLLABLE RUB}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 54868 (\\N{HANGUL SYLLABLE HWA}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 54924 (\\N{HANGUL SYLLABLE HOE}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 44480 (\\N{HANGUL SYLLABLE GWI}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 50640 (\\N{HANGUL SYLLABLE E}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 45716 (\\N{HANGUL SYLLABLE NEUN}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 44032 (\\N{HANGUL SYLLABLE GA}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 51473 (\\N{HANGUL SYLLABLE JUNG}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 52824 (\\N{HANGUL SYLLABLE CI}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 54596 (\\N{HANGUL SYLLABLE PIL}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 50836 (\\N{HANGUL SYLLABLE YO}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 54633 (\\N{HANGUL SYLLABLE HAB}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 45768 (\\N{HANGUL SYLLABLE NI}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 45796 (\\N{HANGUL SYLLABLE DA}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 44368 (\\N{HANGUL SYLLABLE GYO}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 50977 (\\N{HANGUL SYLLABLE YUG}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 50672 (\\N{HANGUL SYLLABLE YEON}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 49688 (\\N{HANGUL SYLLABLE SU}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 51201 (\\N{HANGUL SYLLABLE JEOG}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 49440 (\\N{HANGUL SYLLABLE SEON}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 48708 (\\N{HANGUL SYLLABLE BI}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n" + ] + }, + { + "data": { + "image/png": "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yZIlXiPUAw884JX5ak0MtdTixANE1CY8keg8fmIH8mNPiKLLwdKlS713+eJJULTmiPmnxYNDjJxOTEzkFWsH11o88R2bPnHevHl1bku8w2eobR+Pa4qfay1a55577jmvG4IYQCRa7EQAEj+LT9pE0KX2ca3vuOMOr0ugeKOybt0675MX8RouuhKJ+6ZNm9bqxy+VlZW5rb5XIiIiIqJmxOoHRERERBTzGGqJiIiIKOYx1BIRERFRzGOoJSIiIqKYx1BLRERERDGPoZaIiIiIYh5DLRERERHFPIZaIiIiIop5DLVEREREFPMYaomIiIgo5qltfQBERPFqz549MAzD17KqqiI3N7dR6zR2X01Zj4iotUllZWVuq++ViIhw2WWXYfPmzb7ORE5ODjZt2tSodYTWXo+IqLWx+wERURt68MEHcfjw4Xq/fvvb3zZ5nbZYj4ioNbH7ARFRG5Jl2fvYPtIyTV2nLdYjImpNfBYiIiIiopjHUEtEREREMY+hloiIiIhiHkMtEREREcU8hloiIiIiinkMtUREREQU8xhqiYiIiCjmMdQSERERUcxjqCUiIiKimMdQS0REREQxj6GWiIiIiGIeQy0RERERxTyGWiIiIiKKeQy1RERERBTzGGqJiIiIKOapbX0ARETx7MiRI9i+fXu9yxw8eLDJ67TFekRErUkqKytzW3WPRETkueyyy7B582ZfZyMnJwebNm1q1DqN3VdT1iMiam0MtUREREQU89inloiIiIhiHkMtEREREcU8hloiIiIiinkMtUREREQU8xhqiYiIiCjmMdQSERERUcxjqCUiIiKimMdQS0REREQxj6GWiIiIiBDr/n+sid7vHnp5sgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ax = group_wage.plot.scatter(x=\"educ\", y=\"lhwage\", s=group_wage[\"count\"] * 2.5, alpha=0.65, figsize=(7, 4))\n", + "educ_grid = pd.DataFrame({\"educ\": sorted(wage[\"educ\"].unique())})\n", + "ax.plot(educ_grid[\"educ\"], grouped_weighted_model.predict(educ_grid), color=\"C1\", label=\"가중 그룹화 적합선\")\n", + "ax.plot(educ_grid[\"educ\"], grouped_unweighted_model.predict(educ_grid), color=\"C2\", label=\"비가중 그룹화 적합선\")\n", + "ax.set_title(\"그룹화 회귀에는 가중치가 필요합니다\")\n", + "ax.set_xlabel(\"교육연수\")\n", + "ax.set_ylabel(\"로그 시간당 임금\")\n", + "ax.legend()\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 더미 회귀\n", + "\n", + "교육연수가 12년을 초과하는지를 나타내는 처치 더미를 만든 뒤, 그 더미 모형과 교육연수를 완전한 범주형 변수로 둔 회귀를 비교합니다.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
T_계수절편IQ_계수
더미만4.904419.9405NaN
더미 + IQ3.15738.09560.1253
\n", + "
" + ], + "text/plain": [ + " T_계수 절편 IQ_계수\n", + "더미만 4.9044 19.9405 NaN\n", + "더미 + IQ 3.1573 8.0956 0.1253" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dummy_model = smf.ols(\"hwage ~ T\", data=wage).fit()\n", + "conditional_dummy_model = smf.ols(\"hwage ~ T + IQ\", data=wage).fit()\n", + "categorical_model = smf.ols(\"hwage ~ C(educ)\", data=wage).fit()\n", + "\n", + "pd.DataFrame(\n", + " {\n", + " \"T_계수\": [dummy_model.params[\"T\"], conditional_dummy_model.params[\"T\"]],\n", + " \"절편\": [dummy_model.params[\"Intercept\"], conditional_dummy_model.params[\"Intercept\"]],\n", + " \"IQ_계수\": [float(\"nan\"), conditional_dummy_model.params[\"IQ\"]],\n", + " },\n", + " index=[\"더미만\", \"더미 + IQ\"],\n", + ").round(4)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 49884 (\\N{HANGUL SYLLABLE SI}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 44036 (\\N{HANGUL SYLLABLE GAN}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 45817 (\\N{HANGUL SYLLABLE DANG}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 51076 (\\N{HANGUL SYLLABLE IM}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 44552 (\\N{HANGUL SYLLABLE GEUM}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 51312 (\\N{HANGUL SYLLABLE JO}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 44148 (\\N{HANGUL SYLLABLE GEON}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 48512 (\\N{HANGUL SYLLABLE BU}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 54217 (\\N{HANGUL SYLLABLE PYEONG}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 44512 (\\N{HANGUL SYLLABLE GYUN}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 52264 (\\N{HANGUL SYLLABLE CA}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n", + "/Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 51060 (\\N{HANGUL SYLLABLE I}) missing from font(s) DejaVu Sans.\n", + " fig.canvas.print_figure(bytes_io, **kw)\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
educ평균_시간당_임금
0918.560000
11017.772594
21118.668373
31220.307866
41322.888960
\n", + "
" + ], + "text/plain": [ + " educ 평균_시간당_임금\n", + "0 9 18.560000\n", + "1 10 17.772594\n", + "2 11 18.668373\n", + "3 12 20.307866\n", + "4 13 22.888960" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ax = wage.plot.scatter(x=\"IQ\", y=\"hwage\", c=\"T\", cmap=\"coolwarm\", alpha=0.3, figsize=(7, 4))\n", + "plot_df = wage.sort_values([\"T\", \"IQ\"]).copy()\n", + "plot_df[\"y_hat\"] = conditional_dummy_model.predict(plot_df)\n", + "for t_value, color, label in [(0, \"C2\", \"T=0\"), (1, \"C1\", \"T=1\")]:\n", + " subset = plot_df.query(\"T == @t_value\")\n", + " ax.plot(subset[\"IQ\"], subset[\"y_hat\"], color=color, linewidth=2.5, label=label)\n", + "ax.set_title(f\"조건부 평균 차이 = {conditional_dummy_model.params['T']:.2f}\")\n", + "ax.set_xlabel(\"IQ\")\n", + "ax.set_ylabel(\"시간당 임금\")\n", + "ax.legend()\n", + "plt.show()\n", + "\n", + "wage.groupby(\"educ\", as_index=False)[\"hwage\"].mean().rename(columns={\"hwage\": \"평균_시간당_임금\"}).head()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 결과\n", + "\n", + "그룹화된 데이터에서는 큰 집단이 더 큰 영향을 받도록 가중치를 주면 개별자료 회귀 결과와 가까워집니다. 더미 회귀에서는 계수가 평균 차이로 해석되고, 범주형 명세를 쓰면 교육의 효과를 하나의 선형 기울기에 억지로 묶지 않아도 됩니다.\n" + ] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "3.12.13", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.13" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/book/regression/data/wage.csv b/book/regression/data/wage.csv new file mode 100644 index 0000000..2e119a9 --- /dev/null +++ b/book/regression/data/wage.csv @@ -0,0 +1,936 @@ +wage,hours,lhwage,IQ,educ,exper,tenure,age,married,black,south,urban,sibs,brthord,meduc,feduc +769,40,2.9562115153917077,93,12,11,2,31,1,0,0,1,1,2.0,8.0,8.0 +808,50,2.7825390530929495,119,18,11,16,37,1,0,0,1,1,,14.0,14.0 +825,40,3.0265039322207445,108,14,11,9,33,1,0,0,1,1,2.0,14.0,14.0 +650,40,2.7880929087757464,96,12,13,7,32,1,0,0,1,4,3.0,12.0,12.0 +562,40,2.642622395779755,74,11,14,5,34,1,0,0,1,10,6.0,6.0,11.0 +1400,40,3.5553480614894135,116,16,14,2,35,1,1,0,1,1,2.0,8.0, +600,40,2.70805020110221,91,10,13,0,30,0,0,0,1,1,2.0,8.0,8.0 +1081,40,3.296762363525272,114,18,8,14,38,1,0,0,1,2,3.0,8.0, +1154,45,3.244326957297725,111,15,13,1,36,1,0,0,0,2,3.0,14.0,5.0 +1000,40,3.2188758248682006,95,12,16,16,36,1,0,0,1,1,1.0,12.0,11.0 +930,43,3.0739844704537393,132,18,8,13,38,1,0,0,0,1,1.0,13.0,14.0 +921,38,3.187873876528921,102,14,9,11,33,1,0,0,0,1,2.0,16.0, +900,45,2.995732273553991,125,15,4,3,30,0,0,0,0,2,,12.0,12.0 +1318,38,3.546284555336067,119,16,7,2,28,1,0,0,1,3,1.0,10.0,10.0 +1792,40,3.8022081394209395,118,16,9,9,34,1,0,0,1,1,1.0,12.0,12.0 +958,50,2.9528247725427144,105,10,17,2,35,1,0,0,1,1,2.0,6.0,8.0 +1360,45,3.4085774889597777,109,15,6,9,36,1,0,0,1,3,3.0,12.0,10.0 +850,40,3.056356895370426,72,11,19,10,38,1,0,0,1,2,3.0,10.0,8.0 +830,44,2.9372360668723823,105,14,4,7,29,1,0,0,1,3,1.0,12.0, +471,44,2.3706684600981567,101,12,13,7,31,1,0,0,1,3,2.0,8.0, +1275,40,3.46182200347859,123,14,9,1,31,1,0,0,1,0,1.0,12.0, +1615,50,3.475067230228611,113,16,10,4,36,1,0,0,1,2,1.0,12.0,12.0 +873,65,2.597548285943965,95,12,14,3,38,1,0,0,1,5,1.0,10.0,10.0 +2137,45,3.8604957655488277,145,16,17,8,38,1,0,0,1,2,1.0,12.0,12.0 +1053,38,3.3218123524075898,114,16,12,7,32,1,0,0,1,0,1.0,11.0,11.0 +1602,60,3.2846635654062037,124,16,8,9,29,1,0,0,1,3,1.0,16.0,16.0 +1188,40,3.391147045808654,93,13,16,5,35,1,0,0,1,2,1.0,12.0,8.0 +800,40,2.995732273553991,115,18,11,1,35,1,0,1,1,0,1.0,8.0,8.0 +1417,48,3.3850962287827895,125,17,9,4,34,1,0,0,1,3,1.0,13.0,12.0 +635,40,2.7647455447787554,128,18,8,13,36,0,0,0,1,2,1.0,16.0,16.0 +1000,40,3.2188758248682006,103,12,17,2,34,1,0,0,1,1,1.0,8.0, +1424,50,3.349202086543775,98,14,15,4,35,1,0,0,1,1,1.0,12.0,12.0 +2668,75,3.5715962934992036,108,13,12,2,32,1,0,1,1,1,2.0,12.0,12.0 +666,75,2.1838015570040787,129,18,8,12,38,1,0,0,0,2,1.0,18.0,18.0 +1779,40,3.794927233551899,132,17,8,9,32,1,0,0,1,1,1.0,17.0,14.0 +782,40,2.972975286431375,92,13,9,10,31,1,0,0,1,3,3.0,8.0, +1572,35,3.804755911499738,108,14,7,5,28,1,1,0,1,1,,12.0,8.0 +1274,40,3.4610373820181723,106,13,11,12,31,1,0,0,1,0,1.0,15.0,12.0 +714,35,3.0155349008501706,105,16,9,2,29,1,0,0,1,1,2.0,13.0,12.0 +1081,40,3.296762363525272,123,18,11,7,36,1,0,0,0,1,1.0,12.0,12.0 +692,40,2.8507065015037334,108,12,21,11,38,1,0,0,1,3,1.0,8.0,7.0 +1318,38,3.546284555336067,122,17,10,9,33,1,0,0,1,1,,12.0,8.0 +1239,45,3.3153973918588227,109,12,16,4,38,1,0,0,1,3,3.0,12.0, +1027,27,3.638560343924229,100,13,12,15,38,1,0,0,1,3,3.0,10.0,9.0 +1748,55,3.45889437098301,125,18,12,12,34,1,0,0,1,1,2.0,14.0,15.0 +981,40,3.1996930054514268,122,14,9,15,35,0,0,0,1,3,2.0,12.0, +770,40,2.9575110607337933,105,17,7,11,30,1,0,0,1,3,1.0,12.0,12.0 +1154,50,3.138966441639899,94,16,11,5,33,1,0,0,1,1,,12.0,12.0 +1155,40,3.3629761688419575,102,12,16,5,34,1,0,0,1,1,2.0,12.0, +808,60,2.6002174962989946,109,13,14,12,38,1,0,0,1,2,2.0,12.0,10.0 +1100,40,3.3141860046725258,105,12,22,14,38,1,0,0,1,1,1.0,12.0,12.0 +1154,40,3.3621099929541085,134,18,10,10,37,1,0,1,1,2,1.0,12.0,12.0 +1749,40,3.777920020904666,108,12,13,9,29,0,0,0,1,7,1.0,12.0,9.0 +1000,50,2.995732273553991,104,16,11,8,30,1,0,0,1,1,1.0,12.0,11.0 +462,40,2.446685436967803,112,12,11,1,29,1,0,0,1,8,3.0,12.0, +769,55,2.637757784273173,120,18,8,12,32,0,0,0,1,1,1.0,11.0,8.0 +875,50,2.8622008809294686,124,16,9,3,31,0,0,0,0,2,2.0,17.0,16.0 +1375,40,3.5373295559867355,103,12,12,7,29,1,0,0,1,4,2.0,12.0,10.0 +1452,45,3.4740347056144216,115,17,1,7,30,1,0,0,1,3,1.0,12.0,14.0 +800,40,2.995732273553991,96,12,17,12,35,1,0,0,1,1,2.0,6.0,8.0 +1748,55,3.45889437098301,123,17,10,7,36,1,0,0,1,1,1.0,12.0,12.0 +1151,40,3.359506954607946,98,12,12,12,29,1,0,0,1,3,4.0,12.0,8.0 +840,50,2.8213788864092133,96,12,18,13,35,1,0,0,1,2,1.0,12.0,8.0 +978,45,3.0788471802644977,89,12,17,2,38,1,0,0,1,0,1.0,12.0, +963,40,3.181173957684189,109,12,15,15,37,0,0,0,0,5,,,7.0 +619,42,2.690435654401228,93,12,10,10,28,0,0,0,1,8,,9.0,11.0 +442,60,1.9969653198555974,82,12,12,0,33,1,0,0,1,2,3.0,12.0,9.0 +600,40,2.70805020110221,120,15,12,1,38,1,0,0,0,3,4.0,12.0, +1366,38,3.5820558804043494,122,12,15,15,32,1,0,0,1,1,2.0,12.0, +1643,48,3.533078107129377,117,18,8,2,33,1,0,0,1,2,2.0,12.0,18.0 +1455,40,3.5938817254916566,109,16,8,13,36,1,0,0,1,1,2.0,8.0,8.0 +2310,40,4.056123349401903,114,18,12,7,38,1,0,0,1,2,,12.0,16.0 +1682,45,3.6210763507625736,126,16,10,11,31,1,0,0,1,1,1.0,12.0,16.0 +1235,40,3.4299467949481413,82,12,10,2,33,1,0,0,1,1,1.0,11.0,11.0 +855,45,2.9444389791664403,119,16,11,4,32,1,0,0,1,3,1.0,12.0,9.0 +1072,42,3.239611723347379,104,16,6,8,35,1,0,0,1,2,2.0,12.0,6.0 +1040,40,3.258096538021482,115,15,8,15,35,1,0,0,1,3,4.0,,11.0 +1000,50,2.995732273553991,97,12,17,15,36,1,0,0,1,1,2.0,12.0,12.0 +675,40,2.8258332367585934,105,15,8,2,31,1,0,0,0,3,,14.0,12.0 +1100,37,3.3921475461422377,100,12,14,1,30,1,0,0,1,1,2.0,7.0,7.0 +996,50,2.991724252156452,114,12,5,14,31,1,0,0,1,2,1.0,12.0,10.0 +732,40,2.9069010598473755,73,10,17,5,36,1,0,0,1,5,6.0,, +1200,40,3.4011973816621555,96,11,15,3,37,1,0,0,1,4,3.0,8.0,8.0 +1694,30,4.033650493549844,113,15,9,8,29,0,0,0,1,3,1.0,12.0,16.0 +686,55,2.523544442493414,106,10,15,3,36,1,0,1,1,4,5.0,14.0,10.0 +754,40,2.93651291389402,104,13,9,5,32,1,0,0,1,1,2.0,8.0, +857,35,3.198089857108366,80,10,14,15,33,1,0,0,1,2,1.0,,12.0 +832,50,2.8118094353930627,104,13,4,2,30,1,0,0,1,1,2.0,12.0,8.0 +579,44,2.577112843654734,122,13,8,1,30,1,0,0,0,4,1.0,16.0,16.0 +672,61,2.399384476349838,96,12,13,3,34,1,0,0,1,2,,12.0,13.0 +2500,40,4.135166556742356,95,15,12,9,36,1,0,0,1,3,1.0,16.0,16.0 +1076,45,3.17434325095141,105,12,5,8,31,0,0,0,1,1,1.0,16.0,17.0 +750,40,2.9311937524164198,94,12,16,3,37,1,1,0,1,7,3.0,8.0,8.0 +1186,30,3.6771441978955153,91,17,8,9,33,1,0,0,1,1,1.0,12.0,14.0 +833,48,2.853832631258952,96,16,9,7,31,1,0,0,1,4,4.0,12.0,14.0 +650,40,2.7880929087757464,69,12,14,11,30,1,1,0,1,3,4.0,10.0,9.0 +1250,46,3.302257433807252,110,12,5,16,38,1,0,0,0,1,1.0,,12.0 +1122,48,3.1516670751747506,111,15,12,9,31,1,0,0,1,3,1.0,9.0,12.0 +865,40,3.073850052817943,110,16,1,11,31,1,0,0,1,3,1.0,9.0,12.0 +808,40,3.005682604407159,97,16,10,7,29,1,0,0,1,3,3.0,9.0,12.0 +1299,60,3.075005454448499,125,18,6,12,35,0,0,0,1,1,2.0,8.0,8.0 +903,40,3.116843099303049,91,12,6,12,36,1,0,0,1,5,4.0,9.0,10.0 +900,40,3.1135153092103742,86,12,17,15,37,1,0,0,1,5,3.0,8.0,10.0 +625,40,2.7488721956224653,110,12,18,0,35,1,0,0,1,4,1.0,9.0,8.0 +1586,40,3.680090948080857,92,14,16,1,36,1,0,1,1,4,4.0,12.0, +962,40,3.1801349965517702,85,10,15,16,38,1,0,0,1,1,2.0,9.0,12.0 +1539,45,3.5322256440685598,120,17,7,8,34,1,0,0,1,1,1.0,8.0,8.0 +1110,52,3.0608715757249523,106,12,11,6,33,1,0,0,0,5,2.0,12.0,12.0 +1282,45,3.3495141477102957,112,16,6,6,31,0,0,1,1,2,2.0,12.0,12.0 +770,48,2.775189503939839,91,12,13,2,38,1,0,0,1,1,2.0,10.0,8.0 +1000,45,3.101092789211817,90,12,16,0,38,1,0,0,1,6,3.0,10.0,12.0 +895,40,3.107944264160919,86,9,17,16,38,1,1,0,0,2,,,12.0 +1205,40,3.405355391810819,86,10,13,0,32,1,1,0,1,5,5.0,8.0, +750,40,2.9311937524164198,113,12,11,10,29,1,0,0,0,1,,12.0,12.0 +654,50,2.5710843460290524,111,13,5,16,38,1,0,0,1,3,3.0,12.0,9.0 +601,48,2.527393923627317,111,12,15,3,33,1,0,0,1,0,1.0,12.0,12.0 +600,40,2.70805020110221,106,13,10,11,28,1,0,0,1,6,,8.0,7.0 +433,40,2.3818582738885534,98,12,11,10,30,0,0,0,1,1,1.0,12.0,11.0 +1188,40,3.391147045808654,105,12,11,7,30,1,0,0,1,3,1.0,12.0,10.0 +635,40,2.7647455447787554,105,12,15,15,33,1,0,0,0,2,2.0,10.0, +1225,40,3.421816668864891,118,13,9,14,32,1,0,0,1,0,1.0,12.0,9.0 +1151,45,3.2417239189515628,90,12,19,19,36,1,0,0,1,1,1.0,12.0,8.0 +865,40,3.073850052817943,95,12,15,11,32,0,0,0,1,3,1.0,9.0,8.0 +1031,40,3.2494050299030235,112,14,9,5,29,1,0,0,1,4,2.0,12.0,12.0 +1049,55,2.9482594231638264,120,12,9,11,32,1,0,0,1,3,2.0,12.0,10.0 +1000,45,3.101092789211817,123,12,12,1,29,1,0,0,1,3,3.0,12.0,10.0 +1105,40,3.3187211598379167,103,13,10,11,30,1,0,0,1,1,1.0,16.0,15.0 +1924,50,3.6501386257975055,121,18,11,7,35,1,0,0,1,3,1.0,16.0,18.0 +1346,40,3.5160130560907366,90,16,9,16,38,1,0,0,1,1,1.0,12.0,12.0 +809,65,2.5214116471628545,125,12,11,10,29,1,0,0,1,0,1.0,12.0,12.0 +1495,45,3.503218996054467,109,18,10,3,32,1,0,0,1,3,1.0,9.0,8.0 +1346,50,3.2928695047765273,128,16,10,1,33,0,0,0,0,3,1.0,10.0,9.0 +1200,40,3.4011973816621555,97,12,10,4,31,1,0,0,1,3,1.0,12.0,12.0 +500,40,2.5257286443082556,96,12,6,0,33,1,0,1,1,4,4.0,12.0,12.0 +1325,45,3.382505248650003,97,12,12,5,28,1,0,0,1,1,2.0,12.0,8.0 +900,40,3.1135153092103742,78,12,16,5,33,1,1,0,1,4,1.0,7.0,6.0 +800,40,2.995732273553991,112,12,15,3,34,1,0,0,1,6,4.0,7.0, +800,40,2.995732273553991,88,12,16,7,38,1,0,0,1,3,2.0,2.0,5.0 +1034,40,3.2523106009544382,97,12,15,16,36,1,0,0,1,14,10.0,14.0,11.0 +980,40,3.1986731175506815,101,12,4,12,36,1,0,0,1,1,,6.0,9.0 +884,40,3.095577608523707,106,10,19,12,34,1,0,0,1,2,1.0,7.0,10.0 +480,40,2.4849066497880004,59,10,11,5,34,0,0,0,1,0,1.0,8.0,6.0 +923,40,3.138749780388916,105,18,7,14,34,1,0,0,1,1,1.0,12.0,12.0 +513,45,2.4336133554004498,119,17,8,5,31,0,0,0,1,1,1.0,12.0,8.0 +1105,40,3.3187211598379167,93,11,17,16,37,0,0,0,1,2,2.0,8.0,8.0 +1193,50,3.17220341666977,82,12,19,10,36,1,0,1,1,0,1.0,12.0, +2771,50,4.014940539434832,134,18,6,7,34,1,0,0,1,4,3.0,16.0,16.0 +779,40,2.969131591756812,84,12,9,6,30,1,0,0,1,0,1.0,8.0,12.0 +950,60,2.762117422372486,98,11,13,6,31,1,0,0,1,2,1.0,12.0,12.0 +1394,40,3.551053137206533,118,16,11,8,30,1,0,0,0,2,1.0,13.0,12.0 +1495,45,3.503218996054467,113,17,13,9,33,1,0,0,1,3,3.0,12.0,8.0 +650,40,2.7880929087757464,100,12,4,3,28,1,0,0,1,6,2.0,9.0,11.0 +670,40,2.8183982582710754,93,13,9,5,29,1,0,0,1,2,,12.0,12.0 +1126,40,3.3375473545856993,119,16,5,8,32,1,0,0,1,1,1.0,12.0,10.0 +450,64,1.9503644994046936,67,12,11,1,33,0,1,0,1,6,1.0,11.0,4.0 +1028,40,3.246490991901174,111,12,19,12,37,1,1,1,1,3,4.0,12.0, +2404,50,3.872866290226952,106,15,8,0,32,1,0,0,1,2,1.0,12.0,12.0 +1899,40,3.8602032566983495,127,18,9,14,36,0,0,0,1,0,1.0,10.0, +757,40,2.9404837993235127,113,16,10,9,33,1,0,0,1,2,1.0,12.0,12.0 +1250,40,3.4420193761824107,115,14,9,1,29,1,0,0,1,2,2.0,12.0,12.0 +1162,48,3.1866969265039655,102,16,8,11,31,1,0,0,1,3,2.0,12.0, +1025,40,3.2435684374585723,85,15,9,13,29,1,1,0,1,6,1.0,14.0,12.0 +1100,50,3.091042453358316,117,16,11,12,32,1,0,0,0,0,1.0,12.0,10.0 +714,35,3.0155349008501706,125,16,7,5,28,1,0,0,1,4,1.0,10.0,10.0 +1318,35,3.628522653573039,118,16,16,17,37,1,0,0,0,1,1.0,8.0,12.0 +1411,45,3.4453914620824944,121,18,14,3,38,1,0,0,1,3,2.0,12.0,16.0 +2162,40,3.9899095440852173,115,17,4,4,38,1,0,0,1,1,1.0,12.0,12.0 +1273,55,3.1417984133249357,120,14,11,16,36,1,0,0,0,1,1.0,12.0, +1140,48,3.1675825304806504,109,12,16,15,35,1,0,0,1,2,2.0,11.0,6.0 +578,40,2.670694414558441,109,13,7,4,30,0,0,0,1,1,,12.0,11.0 +942,40,3.159125820462427,85,12,7,10,38,1,0,0,1,4,5.0,, +1058,40,3.2752561583043085,85,12,17,8,38,1,0,0,0,4,1.0,12.0, +750,40,2.9311937524164198,106,14,9,9,29,1,0,0,1,1,2.0,11.0,10.0 +1000,60,2.8134107167600364,101,12,11,6,30,1,0,0,1,3,1.0,10.0,10.0 +951,60,2.7631695003232895,116,12,9,7,30,1,0,0,1,4,5.0,12.0,9.0 +635,47,2.6034773971826333,91,12,13,2,31,1,0,0,1,2,2.0,7.0,7.0 +1250,40,3.4420193761824107,91,12,13,1,34,1,0,0,1,3,1.0,11.0,5.0 +675,40,2.8258332367585934,110,12,6,15,34,1,0,0,1,2,1.0,7.0, +400,40,2.302585092994046,75,12,11,6,32,1,0,0,1,4,,7.0,12.0 +577,50,2.4458192610799534,94,12,9,8,29,1,0,0,1,2,,12.0,8.0 +590,40,2.691243082785829,109,13,10,7,29,1,0,0,0,2,2.0,12.0,12.0 +923,50,2.9156062290747062,122,16,10,10,31,1,0,0,0,1,2.0,8.0,8.0 +1250,50,3.2188758248682006,102,12,6,2,32,0,0,0,1,4,2.0,11.0,8.0 +1100,40,3.3141860046725258,122,14,11,8,33,1,0,0,1,2,3.0,8.0,10.0 +1130,50,3.1179499062782403,105,12,18,2,37,1,0,0,1,4,2.0,10.0,10.0 +652,50,2.5680215564985067,113,12,14,4,36,0,0,0,1,1,2.0,9.0,9.0 +618,42,2.6888188391743224,104,12,6,2,30,1,0,0,1,3,2.0,8.0,12.0 +962,50,2.9569914452375605,124,16,7,14,34,1,0,0,1,2,2.0,9.0,11.0 +529,40,2.582108977744363,110,13,14,11,32,1,0,0,0,1,1.0,12.0,8.0 +817,40,3.0167596407460664,95,12,16,14,33,1,0,0,0,2,1.0,12.0,12.0 +962,40,3.1801349965517702,120,16,8,9,32,1,0,0,0,0,1.0,18.0, +840,40,3.044522437723423,105,12,19,15,38,1,0,0,0,3,1.0,12.0,8.0 +866,40,3.075005454448499,121,16,7,4,28,1,0,0,0,1,,12.0,12.0 +2404,50,3.872866290226952,96,14,1,1,36,1,0,0,1,5,5.0,8.0,10.0 +1126,40,3.3375473545856993,110,12,16,2,32,1,0,0,1,6,1.0,9.0,12.0 +1160,40,3.367295829986474,92,12,8,8,31,1,0,0,0,4,1.0,12.0,11.0 +723,40,2.8945297680448285,98,12,15,5,38,1,0,0,1,1,1.0,9.0, +1778,40,3.794364961959914,109,16,14,13,36,1,0,0,1,0,1.0,11.0,12.0 +1903,48,3.679985856388259,118,18,13,5,36,1,0,0,0,0,1.0,11.0,11.0 +1010,40,3.228826155721369,97,18,7,14,34,1,0,0,1,4,5.0,14.0, +971,40,3.1894470141773885,95,17,5,11,37,1,0,0,1,1,2.0,16.0,8.0 +525,40,2.5745188084776873,99,12,9,2,34,1,0,0,1,2,1.0,10.0,8.0 +525,40,2.5745188084776873,106,12,12,13,30,1,0,0,0,1,1.0,10.0,12.0 +670,45,2.700615222614692,117,12,10,3,30,1,0,0,0,5,2.0,12.0, +500,45,2.407945608651872,90,12,19,4,37,1,0,0,0,0,1.0,12.0,6.0 +1058,45,3.157473122647925,98,14,14,15,34,1,0,0,0,2,3.0,, +550,46,2.4812768817374216,95,12,18,15,35,1,0,0,1,1,1.0,12.0,11.0 +500,45,2.407945608651872,115,12,14,1,32,1,0,0,1,1,2.0,12.0,11.0 +727,55,2.5815932923010485,106,15,10,5,31,0,0,0,1,1,,12.0,12.0 +865,40,3.073850052817943,114,12,6,8,30,1,0,0,0,2,3.0,8.0,8.0 +1081,40,3.296762363525272,92,13,8,2,30,1,0,1,1,3,4.0,12.0,10.0 +1304,45,3.3665292527162785,119,17,9,9,31,1,0,0,0,1,1.0,13.0,12.0 +575,40,2.665490586683414,85,13,6,1,30,1,0,0,0,1,2.0,13.0,12.0 +623,45,2.6278840290171335,98,16,7,1,30,1,0,0,0,3,1.0,12.0,12.0 +515,45,2.4375044108934163,114,13,8,10,28,1,0,0,0,3,2.0,12.0,12.0 +1273,55,3.1417984133249357,84,18,14,4,37,1,0,0,1,1,1.0,8.0,12.0 +990,40,3.2088254890146994,108,13,13,9,33,1,0,0,0,4,1.0,16.0,16.0 +600,40,2.70805020110221,107,12,16,6,33,1,0,0,0,5,6.0,8.0,4.0 +1160,40,3.367295829986474,84,12,17,2,38,1,0,0,0,4,2.0,16.0,12.0 +500,55,2.207274913189721,86,12,11,9,29,1,0,0,0,5,5.0,10.0,12.0 +795,45,2.8716796248840124,88,12,17,18,35,1,0,0,0,2,2.0,10.0,12.0 +500,50,2.302585092994046,97,11,20,3,37,1,0,0,0,2,1.0,, +740,50,2.6946271807700692,84,10,23,13,38,1,0,0,0,5,1.0,,9.0 +1250,40,3.4420193761824107,117,16,10,7,33,1,0,0,1,1,1.0,12.0,14.0 +1014,55,2.9143249989186577,110,16,13,9,30,0,0,0,1,1,2.0,12.0,14.0 +1250,32,3.6651629274966204,104,13,13,3,33,1,0,0,1,3,3.0,9.0, +913,40,3.1278564264810322,110,14,4,13,29,1,0,0,1,3,4.0,9.0, +1346,40,3.5160130560907366,99,16,9,8,30,1,0,0,1,2,,11.0,12.0 +445,40,2.409194828052304,80,10,19,0,38,1,0,0,0,5,5.0,, +265,40,1.890850371872286,101,12,18,2,37,1,0,0,1,1,2.0,, +1250,40,3.4420193761824107,117,14,7,1,28,1,0,0,1,1,2.0,12.0,12.0 +1607,56,3.356772675002363,108,13,7,9,36,1,0,0,1,2,1.0,, +1452,35,3.7253491338953277,69,16,12,15,38,1,1,0,1,7,6.0,10.0,10.0 +1391,50,3.325755186495297,109,12,14,8,32,1,1,1,1,1,2.0,11.0,9.0 +821,45,2.9038606196821086,85,16,8,2,32,1,0,0,1,5,6.0,8.0,8.0 +794,40,2.9882040071331994,114,16,9,7,29,1,0,0,1,1,2.0,11.0,9.0 +500,30,2.8134107167600364,90,13,10,1,38,1,0,0,0,4,3.0,, +520,50,2.341805806147327,107,18,6,3,29,1,0,0,0,10,1.0,12.0,14.0 +1730,50,3.543853682063679,117,18,12,12,37,1,0,0,1,1,2.0,12.0,8.0 +1924,50,3.6501386257975055,112,18,9,10,38,1,0,0,1,6,1.0,16.0,18.0 +1155,60,2.9575110607337933,106,18,10,2,37,1,0,0,1,3,3.0,14.0,18.0 +2162,40,3.9899095440852173,116,15,9,4,31,1,0,0,1,2,1.0,12.0,17.0 +923,50,2.9156062290747062,123,14,8,7,31,1,0,0,1,1,2.0,8.0, +1115,40,3.3277302297802827,118,16,12,13,33,1,0,0,1,1,1.0,8.0, +449,36,2.523503949286144,91,12,7,2,30,0,0,0,1,1,,, +1500,40,3.624340932976365,103,12,10,11,34,1,0,0,1,2,3.0,12.0,7.0 +826,40,3.027715319407042,114,14,20,3,37,1,0,0,1,4,4.0,8.0,6.0 +937,40,3.153803828124486,102,12,16,8,35,1,0,0,1,3,2.0,12.0,6.0 +978,48,3.0143086591269266,104,12,19,15,36,1,0,0,1,5,6.0,6.0, +1031,40,3.2494050299030235,112,14,14,12,33,0,0,0,1,6,6.0,14.0,12.0 +1272,40,3.459466289786131,107,12,10,1,30,1,0,0,1,4,3.0,12.0,12.0 +1136,50,3.1232455938529506,117,14,16,12,34,1,0,1,1,2,3.0,12.0,12.0 +800,45,2.8779492378976075,110,12,19,12,36,1,0,0,1,7,8.0,, +1339,38,3.562092185964787,96,12,8,9,33,1,0,0,1,0,1.0,12.0,11.0 +1063,40,3.2799709242280115,90,12,14,12,32,1,1,0,1,2,2.0,8.0,12.0 +935,44,3.056356895370426,97,12,10,6,29,1,0,0,1,2,2.0,8.0,7.0 +808,40,3.005682604407159,99,12,18,13,38,1,1,0,1,0,1.0,9.0,8.0 +375,40,2.2380465718564744,99,10,12,2,30,1,0,1,0,3,2.0,8.0,5.0 +537,40,2.5971186403949282,97,12,14,8,31,0,1,0,1,2,1.0,11.0, +1082,55,2.979233274173956,95,12,11,4,29,1,1,0,1,2,2.0,11.0, +930,40,3.1463051320333655,126,14,10,1,31,0,0,0,1,3,,8.0, +1155,40,3.3629761688419575,109,17,13,4,38,1,0,0,0,3,3.0,12.0,8.0 +548,40,2.617395832834079,86,11,7,0,33,1,1,0,1,5,2.0,11.0, +622,45,2.6262776029688597,119,16,12,1,33,1,0,0,1,0,1.0,12.0,12.0 +841,40,3.0457122058590116,102,16,10,1,29,1,0,0,1,3,1.0,12.0,12.0 +769,55,2.637757784273173,105,18,7,15,38,0,0,0,1,2,3.0,9.0,5.0 +587,38,2.7374386601017107,117,17,8,5,29,1,0,0,0,3,3.0,12.0, +1924,45,3.755499141455332,112,16,17,18,38,1,0,0,1,1,1.0,12.0,12.0 +1058,40,3.2752561583043085,89,12,7,3,29,1,0,0,1,2,,8.0,6.0 +417,48,2.1618852108909103,131,12,7,1,28,0,0,0,1,1,2.0,12.0,6.0 +1202,48,3.220541104187262,114,16,6,6,28,1,0,0,1,3,3.0,16.0,16.0 +1154,40,3.3621099929541085,98,14,18,2,37,1,0,0,1,1,,10.0,14.0 +1070,40,3.2865344733420154,124,13,4,9,32,1,0,0,1,0,1.0,, +1202,40,3.4028626609812167,125,14,10,11,29,1,0,0,1,2,3.0,12.0,12.0 +711,45,2.760009940032921,100,18,13,3,36,1,0,0,1,1,,10.0,16.0 +1202,40,3.4028626609812167,84,14,6,5,31,1,1,0,1,2,1.0,11.0,9.0 +850,43,2.9840362337907997,113,12,7,3,28,1,0,0,1,1,2.0,8.0,12.0 +1000,40,3.2188758248682006,102,16,13,11,35,1,0,0,1,6,2.0,10.0,12.0 +490,49,2.302585092994046,82,18,7,8,31,0,0,0,1,2,,12.0,9.0 +1000,40,3.2188758248682006,112,14,15,4,35,1,0,0,1,4,1.0,12.0,10.0 +865,40,3.073850052817943,111,16,11,4,31,1,0,1,1,4,5.0,8.0,5.0 +1375,40,3.5373295559867355,96,13,3,3,30,1,0,0,1,3,1.0,11.0,8.0 +1586,40,3.680090948080857,127,16,16,12,37,1,0,0,1,4,4.0,16.0,16.0 +1602,65,3.2046208577326674,97,15,14,14,37,1,0,0,1,1,1.0,8.0, +3078,65,3.8576480445031875,120,14,12,13,36,1,0,1,1,1,2.0,12.0, +898,40,3.1112906141882632,101,16,7,9,35,0,0,0,1,3,4.0,16.0,14.0 +906,40,3.120159851929043,120,14,16,2,37,1,0,0,1,5,1.0,12.0,12.0 +952,40,3.169685580677429,99,13,10,10,31,1,1,0,1,1,1.0,8.0,10.0 +571,40,2.658509755542074,78,13,10,1,29,0,1,0,1,5,5.0,8.0,9.0 +445,45,2.2914117923959205,110,12,15,13,32,0,0,0,1,2,2.0,5.0,11.0 +289,40,1.9775472339984959,94,12,9,0,30,1,0,0,1,2,3.0,5.0,11.0 +1444,40,3.586292865338835,120,16,12,15,37,1,0,0,1,1,2.0,17.0,13.0 +962,55,2.8616812654332358,108,12,19,21,36,1,0,0,1,3,1.0,8.0,8.0 +1075,40,3.2911964864478267,103,12,17,10,33,1,0,0,1,13,3.0,11.0,11.0 +909,55,2.805011908945008,97,11,17,5,35,1,0,0,1,7,3.0,, +1250,40,3.4420193761824107,106,12,14,19,35,1,0,0,1,4,1.0,11.0,13.0 +620,40,2.740840023925201,99,11,10,5,29,1,1,0,1,11,5.0,, +1016,40,3.2347491740244907,72,10,14,15,37,1,1,0,1,8,9.0,11.0, +800,40,2.995732273553991,88,10,21,14,37,1,1,0,1,8,1.0,11.0,8.0 +1050,40,3.2676659890376327,119,16,7,18,37,0,0,0,1,2,2.0,12.0,13.0 +1079,50,3.0717669598299886,87,12,18,9,36,1,0,0,1,5,5.0,8.0, +654,50,2.5710843460290524,121,17,12,13,34,1,0,0,1,1,2.0,11.0,12.0 +781,50,2.7485521444115397,112,12,8,10,30,1,0,0,1,2,2.0,12.0,8.0 +1038,48,3.073850052817943,103,15,8,2,36,1,0,1,0,2,1.0,12.0,15.0 +1924,50,3.6501386257975055,99,16,16,14,37,1,0,0,1,0,1.0,16.0,18.0 +1202,40,3.4028626609812167,101,15,15,17,37,1,0,0,1,3,2.0,12.0,12.0 +666,70,2.25279442849103,117,15,8,2,32,1,0,0,1,0,1.0,, +905,45,3.0012724539296065,109,14,11,14,36,1,0,0,1,3,4.0,8.0,8.0 +890,70,2.5427262206768266,73,12,6,8,31,1,0,0,1,3,1.0,12.0,12.0 +817,40,3.0167596407460664,116,16,10,7,31,1,0,1,0,1,2.0,16.0,16.0 +812,40,3.0106208860477417,98,12,10,2,29,0,0,0,1,3,2.0,12.0,12.0 +577,60,2.263497704285999,104,14,6,2,30,1,0,1,1,2,3.0,14.0,12.0 +756,40,2.9391619220655967,78,14,9,2,31,1,0,0,1,2,2.0,12.0,12.0 +1011,40,3.229815764906535,104,12,20,7,37,1,0,1,1,0,1.0,, +1155,45,3.245193133185574,85,12,14,1,34,1,0,0,1,2,1.0,12.0,12.0 +1025,40,3.2435684374585723,104,12,12,7,29,1,0,0,1,3,4.0,12.0,10.0 +1350,40,3.518980417318539,107,12,17,12,35,1,0,0,0,2,3.0,, +1001,40,3.219875325201284,109,12,20,22,37,1,0,0,1,1,1.0,8.0,10.0 +796,48,2.808398174936492,119,13,16,15,37,1,1,0,1,7,1.0,11.0, +1230,50,3.202746442938317,96,13,11,12,30,1,0,0,1,3,2.0,10.0,11.0 +754,40,2.93651291389402,93,12,13,1,30,1,0,0,1,5,,, +714,40,2.8820035082256483,90,12,17,1,37,1,0,0,0,5,3.0,12.0,12.0 +1000,45,3.101092789211817,103,15,8,3,32,1,0,0,1,3,4.0,12.0, +2067,40,3.944974105567832,106,16,12,13,33,1,0,1,1,2,1.0,14.0,12.0 +912,40,3.126760535960395,96,16,11,5,30,1,0,0,1,2,2.0,14.0,12.0 +600,40,2.70805020110221,114,12,8,5,30,1,0,1,1,6,3.0,8.0,8.0 +951,40,3.168634608431454,86,11,13,1,31,1,0,0,1,3,4.0,9.0, +711,45,2.760009940032921,110,16,8,5,32,1,0,1,1,3,2.0,13.0,12.0 +1151,48,3.1771853978139917,87,12,18,9,38,1,0,0,1,2,1.0,12.0,12.0 +1000,40,3.2188758248682006,89,12,9,5,28,1,0,0,1,2,3.0,13.0,12.0 +841,44,2.950402026054687,106,12,15,10,31,1,0,0,1,5,6.0,8.0, +400,70,1.742969305058623,100,12,12,3,32,1,0,0,1,3,2.0,5.0,8.0 +1175,45,3.2623609368079394,111,12,17,14,34,1,0,0,1,0,1.0,16.0,4.0 +1202,40,3.4028626609812167,100,12,18,2,37,1,0,0,1,0,1.0,12.0,12.0 +1442,40,3.584906863730958,114,12,16,17,33,1,0,0,1,2,3.0,12.0,10.0 +538,55,2.2805253749293133,98,18,5,1,34,1,0,0,1,2,2.0,13.0, +781,40,2.9716956957257494,89,11,13,10,30,1,0,0,1,3,1.0,9.0,8.0 +750,60,2.5257286443082556,74,10,13,9,30,1,0,0,1,4,2.0,11.0,9.0 +841,48,2.863390649065057,110,18,13,1,37,0,1,0,1,1,1.0,12.0,12.0 +700,50,2.6390573296152584,130,13,14,1,38,1,0,0,1,1,2.0,11.0,14.0 +1346,50,3.2928695047765273,108,16,9,4,36,1,0,0,1,1,2.0,12.0,10.0 +800,45,2.8779492378976075,98,12,16,12,33,1,0,0,0,3,4.0,10.0,8.0 +1250,40,3.4420193761824107,125,16,9,10,30,1,0,0,1,3,1.0,16.0, +1105,40,3.3187211598379167,104,16,5,8,29,1,0,0,1,3,1.0,12.0,12.0 +475,52,2.2120710854532137,98,14,12,1,30,0,0,0,1,6,1.0,8.0,10.0 +762,58,2.575503545140227,104,15,6,4,33,1,0,0,0,2,1.0,11.0,12.0 +962,40,3.1801349965517702,120,12,18,19,36,1,0,0,1,3,,8.0,8.0 +721,40,2.8917596831710126,134,13,9,9,30,0,0,1,1,3,3.0,8.0,8.0 +800,50,2.772588722239781,92,9,18,13,34,1,0,0,1,0,1.0,8.0,8.0 +658,40,2.800325477211381,129,16,11,9,30,1,0,0,1,2,1.0,13.0,16.0 +1270,40,3.457892725338701,118,14,4,16,36,1,0,0,1,2,1.0,12.0,12.0 +1313,40,3.49119042018886,107,12,11,7,28,1,0,0,0,1,,12.0, +824,42,2.9765009116261036,92,12,19,15,38,1,0,0,1,1,1.0,12.0,11.0 +1442,40,3.584906863730958,118,16,6,7,29,1,0,0,1,2,1.0,16.0,12.0 +1400,42,3.506557897319982,108,17,7,3,31,1,0,0,1,2,1.0,12.0,14.0 +1038,50,3.033028058297688,119,12,20,5,36,1,0,0,0,3,3.0,12.0,8.0 +668,43,2.7430880578430834,109,12,11,12,29,1,0,0,0,2,3.0,8.0,7.0 +1100,40,3.3141860046725258,91,12,18,10,36,1,0,0,0,2,3.0,8.0,8.0 +1000,45,3.101092789211817,118,14,9,7,30,1,0,0,1,3,1.0,12.0,10.0 +523,43,2.4983813483713604,119,13,9,2,30,1,0,0,0,4,1.0,14.0, +1111,40,3.3241363355256937,103,14,13,13,31,1,0,0,0,6,3.0,14.0,12.0 +962,40,3.1801349965517702,120,16,6,4,28,1,0,0,0,4,3.0,12.0,8.0 +729,47,2.7415261302985994,122,18,6,13,34,1,0,0,1,3,3.0,8.0,6.0 +690,40,2.847812143477369,119,12,9,5,28,1,0,0,1,1,2.0,8.0, +1010,50,3.005682604407159,104,11,15,7,38,1,0,0,0,6,1.0,9.0,6.0 +600,40,2.70805020110221,96,11,7,2,29,1,0,1,1,4,3.0,8.0,8.0 +596,40,2.7013612129514133,83,12,16,17,34,1,0,0,0,3,3.0,8.0,8.0 +850,44,2.961046715566101,115,12,11,1,29,1,0,0,1,3,2.0,, +670,40,2.8183982582710754,88,12,9,2,29,1,0,0,1,7,3.0,10.0,8.0 +793,40,2.986943767520912,96,12,17,18,36,1,0,0,0,4,5.0,8.0,8.0 +1442,40,3.584906863730958,123,17,14,7,38,1,0,1,0,2,3.0,12.0,6.0 +670,50,2.5952547069568657,108,12,14,8,34,1,0,1,1,5,1.0,11.0,7.0 +876,45,2.9687036011660717,116,16,10,8,29,1,0,0,1,2,1.0,12.0,12.0 +841,40,3.0457122058590116,109,18,13,2,36,1,0,0,0,3,4.0,16.0,12.0 +975,40,3.193558016883911,97,13,8,0,31,1,0,0,1,3,1.0,12.0,12.0 +1223,40,3.420182681573236,107,12,7,3,28,1,0,0,0,1,1.0,12.0,10.0 +910,30,3.41224721784874,95,12,16,5,35,1,0,1,1,2,3.0,12.0,14.0 +533,45,2.4718589343955246,109,15,8,2,30,1,0,0,1,2,2.0,15.0,12.0 +750,40,2.9311937524164198,104,12,15,11,33,1,0,0,0,0,1.0,12.0,12.0 +1206,40,3.4061849231731944,110,12,16,4,38,1,0,0,1,1,1.0,12.0,12.0 +745,40,2.924504764265623,94,13,17,1,36,0,0,0,0,2,3.0,13.0,8.0 +900,40,3.1135153092103742,103,12,15,1,37,1,0,1,0,3,3.0,8.0,6.0 +1170,47,3.2146114260817433,123,14,9,14,32,1,0,0,1,3,4.0,8.0,12.0 +540,50,2.379546134130174,113,12,12,3,31,1,0,0,0,5,4.0,6.0,12.0 +550,40,2.6210388241125804,110,16,15,1,38,1,0,0,0,2,1.0,, +615,40,2.7327428136925818,100,14,9,4,30,1,0,0,0,3,3.0,12.0,12.0 +909,40,3.1234656400635425,95,13,6,2,31,1,0,0,1,2,1.0,12.0,12.0 +769,40,2.9562115153917077,100,12,18,12,36,1,0,0,0,1,2.0,8.0,8.0 +984,40,3.202746442938317,108,13,17,18,37,1,0,0,1,4,1.0,15.0,8.0 +833,60,2.6306890799447418,101,12,15,12,37,1,0,0,1,5,2.0,12.0, +879,70,2.530289655635818,90,12,17,10,35,0,0,0,1,1,2.0,12.0,16.0 +1027,45,3.1277347201582386,115,12,16,7,35,1,0,0,1,4,3.0,8.0,5.0 +1000,55,2.900422093749666,114,16,10,1,33,1,0,1,0,0,1.0,, +465,43,2.380837289893794,84,13,10,1,29,1,0,0,1,3,3.0,11.0,11.0 +1100,40,3.3141860046725258,92,13,21,12,38,1,1,0,1,6,6.0,12.0, +641,45,2.6563669671503503,125,14,9,0,37,1,0,0,1,1,1.0,12.0,11.0 +1035,48,3.0709556947915786,107,12,21,14,38,1,0,0,1,1,2.0,11.0,8.0 +1212,40,3.4111477125153233,129,14,9,3,32,0,0,0,1,6,7.0,8.0,9.0 +950,40,3.1675825304806504,98,12,11,6,30,1,0,0,1,3,4.0,12.0,12.0 +938,44,3.0595603150879636,108,12,19,20,38,1,0,0,1,0,1.0,8.0, +1250,40,3.4420193761824107,114,16,8,8,30,1,0,0,1,5,3.0,2.0,8.0 +586,60,2.278975227354912,111,18,6,10,34,1,0,0,0,3,1.0,12.0,11.0 +693,53,2.5707380856377813,101,12,7,6,28,1,0,0,0,1,2.0,12.0,12.0 +562,40,2.642622395779755,99,12,18,12,34,0,0,0,0,1,1.0,12.0,12.0 +375,60,1.8325814637483102,75,12,12,5,30,0,0,0,0,4,1.0,12.0,8.0 +673,40,2.8228658755307916,91,12,7,11,38,1,0,0,0,0,1.0,6.0, +654,50,2.5710843460290524,113,17,1,13,33,1,0,0,0,1,1.0,12.0,10.0 +692,50,2.6275629501895237,120,12,17,7,35,1,0,0,0,3,4.0,8.0, +1111,40,3.3241363355256937,98,14,10,1,29,1,0,0,1,3,1.0,12.0,15.0 +1368,45,3.414442608412176,107,16,11,1,33,1,0,1,1,2,2.0,16.0,16.0 +1282,45,3.3495141477102957,121,18,7,13,32,1,0,0,1,2,2.0,12.0,12.0 +1250,60,3.036554268074246,115,11,19,4,38,1,0,0,1,1,2.0,, +1346,40,3.5160130560907366,134,15,15,7,35,1,0,0,1,2,1.0,12.0,10.0 +1424,50,3.349202086543775,96,17,15,12,37,1,0,0,1,2,3.0,, +854,48,2.878730182880679,120,16,8,5,29,0,0,0,1,2,3.0,12.0,16.0 +888,50,2.876948737564024,105,15,9,5,32,0,0,0,1,2,2.0,12.0,10.0 +1161,50,3.1450139762697455,121,12,5,10,34,1,0,0,1,5,6.0,10.0, +583,58,2.307744175804073,113,16,9,0,30,1,0,0,1,2,2.0,12.0,9.0 +1260,45,3.332204510175204,106,12,5,3,29,1,0,0,1,2,1.0,12.0,13.0 +947,48,2.9820980822781875,104,18,8,13,35,1,0,0,0,3,2.0,9.0,12.0 +1850,40,3.834061463958434,80,11,14,15,33,1,0,0,1,3,,10.0,10.0 +1575,40,3.6731310971457973,117,12,13,2,30,1,0,0,1,3,3.0,10.0,10.0 +758,38,2.9930972259159856,126,16,10,8,28,0,0,0,1,2,2.0,12.0,12.0 +1442,40,3.584906863730958,112,12,19,15,36,1,0,0,1,3,2.0,10.0,8.0 +489,55,2.185029304242401,104,13,20,4,38,1,0,1,1,2,2.0,, +1126,40,3.3375473545856993,116,12,5,0,31,1,1,0,1,9,5.0,9.0,10.0 +1000,40,3.2188758248682006,70,12,12,5,32,0,1,0,1,6,,8.0,8.0 +500,70,1.9661128563728327,83,12,13,11,32,1,0,0,1,5,1.0,6.0,6.0 +1200,50,3.1780538303479458,84,12,13,9,32,1,0,0,1,5,2.0,6.0,6.0 +565,45,2.5301632413761213,82,10,15,3,33,1,0,0,0,4,4.0,, +1920,40,3.871201010907891,109,12,13,2,31,1,0,0,0,0,1.0,12.0,8.0 +684,45,2.7212954278522306,111,14,7,7,29,1,0,0,1,4,1.0,12.0,12.0 +774,40,2.962692419475791,94,12,20,4,37,1,0,0,0,1,1.0,12.0,7.0 +233,60,1.3566938913436,96,16,7,4,30,1,0,0,0,3,,12.0,8.0 +975,40,3.193558016883911,101,13,12,10,30,1,0,0,0,3,3.0,12.0,13.0 +1366,40,3.530762586016799,90,12,13,1,30,1,0,0,1,3,3.0,12.0,12.0 +2137,40,3.978278801205211,120,16,16,3,37,1,0,1,1,3,3.0,12.0,12.0 +700,40,2.8622008809294686,120,16,10,1,29,1,0,1,1,1,1.0,12.0,12.0 +1200,40,3.4011973816621555,108,12,16,11,33,1,0,0,1,3,2.0,8.0, +1161,40,3.3681575275839553,99,13,16,18,36,1,0,0,1,0,1.0,12.0,8.0 +729,60,2.4973291697865574,80,11,16,15,34,1,0,0,1,6,1.0,12.0,6.0 +750,45,2.8134107167600364,93,11,17,2,36,1,0,0,1,1,2.0,10.0,5.0 +1026,45,3.126760535960395,85,12,4,16,38,1,0,0,1,1,2.0,, +1111,45,3.2063532998693103,118,15,11,3,32,1,0,0,1,3,1.0,11.0,10.0 +625,50,2.5257286443082556,115,12,12,8,31,1,0,0,1,2,3.0,12.0, +1200,42,3.3524072174927233,119,16,11,5,30,1,0,0,1,5,1.0,10.0,11.0 +1541,40,3.6513073812061796,94,12,8,1,32,1,0,0,1,8,3.0,12.0,11.0 +1154,40,3.3621099929541085,109,16,12,9,34,1,0,0,1,0,1.0,13.0,16.0 +310,40,2.0476928433652555,104,13,10,0,33,0,0,0,0,2,1.0,14.0,8.0 +610,50,2.501435951739211,89,12,14,4,30,1,0,0,0,1,2.0,7.0,6.0 +1749,43,3.70559935932504,101,12,16,17,36,1,0,0,0,2,2.0,12.0,8.0 +1000,40,3.2188758248682006,96,16,9,1,31,0,0,1,1,4,2.0,12.0,7.0 +350,40,2.169053700369523,109,12,14,1,36,1,0,0,0,1,1.0,9.0,7.0 +765,45,2.833213344056216,94,12,17,18,37,1,0,0,0,10,6.0,4.0,6.0 +790,40,2.9831534913471307,115,12,15,2,34,1,0,0,0,6,5.0,6.0,5.0 +818,47,2.8567147348926887,92,12,16,17,38,1,0,0,0,12,1.0,8.0,4.0 +477,60,2.0731719286662407,71,9,12,1,30,1,0,0,0,4,2.0,11.0,5.0 +938,50,2.9317269435780786,130,14,15,1,33,1,0,0,0,3,1.0,12.0,11.0 +2099,55,3.641883134588162,119,16,10,4,32,1,0,0,1,0,1.0,12.0,12.0 +350,40,2.169053700369523,74,12,14,3,32,1,0,0,1,4,2.0,10.0,13.0 +940,48,2.9746788643561586,104,12,13,0,32,1,1,0,1,7,2.0,12.0,8.0 +1202,40,3.4028626609812167,124,15,11,8,28,1,0,0,1,2,2.0,10.0, +450,40,2.4203681286504293,94,15,9,4,31,1,0,0,0,1,1.0,12.0, +1058,40,3.2752561583043085,120,16,16,13,37,1,0,0,0,5,4.0,12.0,4.0 +1000,40,3.2188758248682006,96,11,15,15,37,1,0,0,1,5,5.0,8.0,9.0 +318,40,2.0731719286662407,67,12,16,5,36,1,1,1,1,6,,7.0,5.0 +556,40,2.631888840136646,69,11,13,9,34,0,1,0,1,3,,8.0,8.0 +958,60,2.77050321574876,98,12,11,9,28,1,0,0,1,0,1.0,12.0,11.0 +995,40,3.2138632830446565,92,9,22,13,38,1,1,0,1,7,3.0,7.0,4.0 +1600,50,3.4657359027997265,109,14,16,5,33,1,0,0,0,2,,9.0,10.0 +606,45,2.6002174962989946,100,18,6,5,30,0,0,0,0,1,,12.0,12.0 +511,45,2.429707100433385,101,12,13,1,30,1,0,0,1,4,2.0,11.0,12.0 +1411,45,3.4453914620824944,111,16,11,12,32,1,0,1,1,1,1.0,12.0,9.0 +1346,40,3.5160130560907366,106,16,15,11,37,1,0,0,1,1,1.0,8.0,14.0 +1522,46,3.4991391419325364,102,12,15,16,37,1,0,0,0,3,2.0,12.0,10.0 +1075,40,3.2911964864478267,115,14,9,10,30,1,0,0,0,2,1.0,12.0,10.0 +1200,50,3.1780538303479458,99,12,11,11,28,1,0,0,1,5,4.0,10.0,8.0 +1377,37,3.6167445860844305,118,16,15,1,36,1,0,0,1,2,2.0,11.0,10.0 +874,55,2.7657471904230646,132,13,8,2,33,1,0,0,0,2,1.0,13.0,16.0 +625,40,2.7488721956224653,108,13,11,9,30,1,0,0,1,3,,12.0,16.0 +1250,32,3.6651629274966204,98,12,17,2,33,1,0,0,1,0,1.0,14.0,10.0 +1082,40,3.2976870052924907,111,13,20,12,36,1,0,0,1,4,2.0,8.0,11.0 +693,40,2.852150545075967,79,11,18,3,38,1,0,0,0,3,2.0,8.0,8.0 +727,55,2.5815932923010485,97,12,11,11,31,1,0,0,0,3,1.0,12.0,11.0 +615,50,2.509599262378372,99,15,16,15,38,1,0,0,0,2,3.0,12.0,14.0 +913,40,3.1278564264810322,101,16,5,7,31,1,0,0,1,2,3.0,12.0, +884,46,2.955815666148548,120,17,4,10,36,1,0,0,0,2,1.0,12.0,18.0 +698,43,2.78701898706881,97,12,10,4,29,1,0,0,1,2,3.0,8.0,8.0 +800,55,2.6772785424354564,106,12,17,18,36,1,0,0,0,3,3.0,8.0,12.0 +812,40,3.0106208860477417,131,16,9,3,30,0,0,0,0,1,1.0,12.0,12.0 +1000,40,3.2188758248682006,93,11,16,14,34,1,0,0,1,1,,12.0,8.0 +549,49,2.416278143398904,79,12,11,3,32,0,0,0,0,4,2.0,8.0,8.0 +1300,35,3.6147714819602146,100,12,13,15,31,1,0,0,1,4,2.0,11.0, +923,50,2.9156062290747062,107,16,9,8,33,1,0,0,1,6,4.0,9.0,8.0 +1539,40,3.650008679724943,112,12,15,15,32,1,0,0,0,3,1.0,,10.0 +721,40,2.8917596831710126,105,12,11,9,30,1,0,0,0,3,2.0,12.0,10.0 +815,40,3.0143086591269266,114,12,15,14,31,1,0,0,0,2,1.0,12.0,10.0 +600,80,2.0149030205422647,116,12,20,2,38,1,0,0,0,10,10.0,8.0, +1100,40,3.3141860046725258,104,12,18,7,37,1,0,0,1,2,3.0,11.0,13.0 +1058,40,3.2752561583043085,85,12,18,19,35,1,0,0,1,2,1.0,9.0,12.0 +962,40,3.1801349965517702,93,12,15,1,30,1,0,0,1,2,2.0,9.0,12.0 +433,50,2.1587147225743437,100,12,5,9,37,1,0,0,0,2,2.0,8.0,7.0 +940,40,3.1570004211501135,71,11,9,2,29,1,0,0,0,2,3.0,, +1417,38,3.6187110799642945,88,16,9,10,32,0,0,0,1,2,1.0,12.0,12.0 +1000,65,2.7333680090865,93,12,11,9,29,1,0,0,1,7,1.0,12.0,8.0 +500,40,2.5257286443082556,98,13,14,5,32,1,0,0,0,3,4.0,12.0,8.0 +800,50,2.772588722239781,110,14,8,5,28,1,0,0,1,3,4.0,12.0,10.0 +766,40,2.952302715626655,109,12,17,18,35,1,0,0,0,4,3.0,,6.0 +750,43,2.8588730908367936,94,14,12,10,33,1,0,0,0,1,1.0,11.0,12.0 +550,40,2.6210388241125804,77,12,15,2,37,1,0,0,0,6,3.0,8.0,8.0 +795,52,2.7270983960729045,89,11,16,4,34,1,0,0,1,6,1.0,, +723,40,2.8945297680448285,102,12,12,10,30,1,0,0,1,10,6.0,12.0,6.0 +1039,40,3.257134536985291,113,14,12,8,34,1,0,0,1,1,2.0,16.0,14.0 +200,55,1.2909841813155658,103,10,11,15,32,1,0,1,1,3,2.0,12.0,5.0 +400,40,2.302585092994046,90,10,12,1,32,1,1,0,1,5,3.0,8.0, +575,40,2.665490586683414,96,11,17,1,35,1,0,1,1,2,1.0,12.0,7.0 +850,40,3.056356895370426,97,11,16,5,37,1,0,1,1,1,1.0,12.0,6.0 +508,50,2.318458442150336,87,12,16,1,32,1,1,1,1,2,1.0,10.0, +1162,45,3.2512354476415366,89,12,11,4,37,1,0,1,1,3,3.0,15.0, +1199,43,3.3280430393339517,70,13,13,5,30,1,1,1,1,3,1.0,8.0, +1270,40,3.457892725338701,104,16,8,4,31,1,0,1,1,3,4.0,16.0,17.0 +350,45,2.05127066471314,116,16,5,3,33,1,0,1,1,2,2.0,11.0,12.0 +963,40,3.181173957684189,85,14,9,9,28,1,1,1,1,5,1.0,7.0, +1463,45,3.4815819112498048,104,15,14,11,37,1,0,1,1,3,4.0,12.0,12.0 +802,40,2.998229153752578,99,12,13,12,29,1,1,1,1,8,6.0,9.0,12.0 +642,45,2.6579258139196416,93,12,12,7,30,1,1,1,1,1,2.0,6.0,6.0 +751,40,2.932526197650198,114,13,9,2,28,1,0,1,1,2,2.0,12.0,10.0 +488,40,2.501435951739211,103,17,5,3,31,1,0,1,1,1,,12.0,16.0 +1400,40,3.5553480614894135,92,12,15,5,36,1,0,1,1,2,1.0,6.0,2.0 +940,45,3.0392173854937297,98,18,10,7,31,1,0,1,1,2,2.0,8.0,12.0 +866,40,3.075005454448499,114,13,15,16,37,1,0,1,1,3,1.0,12.0, +675,40,2.8258332367585934,77,12,20,4,38,1,1,1,1,5,2.0,12.0,6.0 +375,40,2.2380465718564744,89,14,9,3,30,1,1,1,1,3,1.0,13.0, +325,40,2.094945728215801,93,14,10,1,33,1,1,1,1,1,,16.0, +346,40,2.157559320943788,110,12,16,17,38,1,0,1,1,2,,12.0,5.0 +1442,40,3.584906863730958,132,17,8,1,33,1,0,1,1,3,1.0,8.0,12.0 +560,49,2.436116485618568,112,16,13,2,32,1,0,1,0,3,1.0,8.0,2.0 +550,56,2.2845665874913674,99,12,17,11,36,1,0,1,1,1,2.0,12.0,12.0 +950,44,3.072272350676325,96,16,8,10,32,1,1,1,1,1,2.0,10.0, +684,45,2.7212954278522306,106,13,16,2,38,1,0,1,1,1,1.0,12.0,14.0 +1322,40,3.498021566297695,128,16,7,1,33,1,0,1,1,0,1.0,18.0, +1634,40,3.709906821306012,95,12,18,3,38,1,0,1,1,3,3.0,,3.0 +417,40,2.3442067676848652,80,12,8,0,30,0,0,1,1,3,4.0,8.0,7.0 +472,45,2.350316495815236,71,11,9,0,32,1,0,1,1,13,6.0,6.0,6.0 +666,50,2.589266665112243,89,12,16,1,34,1,1,1,1,6,1.0,9.0, +1679,55,3.41862047184507,127,18,10,3,32,1,0,1,1,1,2.0,12.0,16.0 +1039,40,3.257134536985291,114,16,1,9,31,0,0,1,1,6,5.0,8.0,8.0 +1250,40,3.4420193761824107,102,13,13,11,30,1,0,1,1,5,6.0,7.0, +760,40,2.9444389791664403,88,12,12,15,31,1,0,1,1,2,1.0,12.0,7.0 +1154,42,3.3133198287846763,88,12,14,12,29,1,0,1,1,2,2.0,12.0,7.0 +1602,60,3.2846635654062037,110,15,14,1,37,1,0,0,1,5,1.0,14.0,12.0 +1442,40,3.584906863730958,110,13,13,13,29,1,1,1,1,1,2.0,7.0,9.0 +865,40,3.073850052817943,130,16,5,3,30,1,0,0,1,4,2.0,8.0,12.0 +705,50,2.6461747973841225,100,12,15,12,36,1,0,1,1,1,2.0,, +1000,40,3.2188758248682006,101,12,16,1,35,1,0,1,1,1,1.0,12.0, +852,44,2.9633968929110543,89,10,13,9,32,1,0,1,1,6,7.0,9.0, +770,40,2.9575110607337933,80,12,16,14,35,1,0,0,1,1,2.0,12.0,12.0 +1000,40,3.2188758248682006,72,12,16,9,34,1,0,0,1,3,4.0,12.0,12.0 +1329,55,3.1848488734807745,115,18,10,5,36,1,0,0,1,1,1.0,12.0,12.0 +1682,40,3.738859386418957,115,16,10,4,37,1,0,1,1,1,2.0,12.0,17.0 +577,55,2.3505090812756286,108,16,4,0,31,1,1,1,1,2,2.0,8.0,8.0 +685,40,2.840539384148289,93,12,17,7,38,0,0,1,1,6,6.0,8.0,3.0 +577,40,2.668962812394163,111,16,8,8,29,0,1,1,1,1,1.0,18.0,18.0 +1040,40,3.258096538021482,101,12,19,9,38,1,1,1,1,6,1.0,11.0,12.0 +1250,40,3.4420193761824107,92,16,10,11,32,0,0,1,1,1,1.0,12.0,10.0 +600,40,2.70805020110221,115,13,7,7,28,0,0,1,1,4,5.0,5.0, +480,40,2.4849066497880004,76,12,17,3,35,0,1,1,1,8,5.0,11.0,10.0 +1000,40,3.2188758248682006,93,11,11,0,29,1,0,1,1,5,3.0,12.0,12.0 +988,48,3.0244816868399766,91,12,15,15,36,1,0,1,1,1,2.0,8.0,8.0 +478,45,2.3629482427211363,90,10,19,10,34,1,0,1,1,2,1.0,9.0,9.0 +440,40,2.3978952727983707,84,12,11,2,30,1,1,1,1,5,3.0,9.0,4.0 +485,40,2.495269436823547,120,12,11,1,30,1,1,1,1,6,6.0,, +705,40,2.8693183486983322,89,9,19,0,36,1,1,1,1,0,1.0,, +1550,40,3.657130755799356,104,12,16,1,34,1,0,1,0,8,4.0,9.0,10.0 +960,40,3.1780538303479458,107,12,11,9,29,1,1,1,1,11,2.0,6.0,9.0 +1000,40,3.2188758248682006,100,12,16,14,32,1,0,1,1,2,3.0,12.0,12.0 +625,40,2.7488721956224653,129,18,4,5,36,1,0,1,0,3,1.0,15.0,15.0 +1346,40,3.5160130560907366,112,16,14,14,35,1,0,0,1,0,1.0,12.0,16.0 +961,40,3.1790949548563563,76,12,13,13,31,0,1,0,1,13,5.0,,8.0 +479,40,2.482821143296979,97,12,15,1,38,1,0,1,0,3,4.0,, +1201,50,3.1788868166518376,98,11,17,16,36,1,0,1,0,4,5.0,11.0,2.0 +1346,45,3.398230020434353,60,16,8,2,31,1,0,1,1,2,3.0,, +1122,35,3.467520024593228,132,18,13,8,32,1,0,1,1,2,3.0,12.0,7.0 +543,45,2.4904468301636156,90,14,5,7,38,1,1,1,1,1,2.0,6.0, +450,40,2.4203681286504293,63,11,12,4,31,1,1,1,1,7,2.0,7.0, +507,55,2.2211778183587123,110,14,10,4,32,1,0,1,1,2,2.0,13.0,16.0 +547,60,2.2101042401998807,88,11,17,5,34,1,0,1,1,4,5.0,, +586,56,2.3479680988418634,98,11,18,16,35,1,0,1,1,2,2.0,,6.0 +462,55,2.128231705849268,61,12,6,4,29,1,1,1,0,9,,8.0,3.0 +705,40,2.8693183486983322,76,12,13,8,37,1,1,0,1,5,,, +1566,40,3.667400422436812,127,12,7,1,29,1,0,0,1,3,2.0,11.0, +1634,40,3.709906821306012,94,13,18,18,36,1,0,1,1,2,2.0,8.0,8.0 +1282,45,3.3495141477102957,97,16,4,1,32,1,0,0,1,11,3.0,16.0,16.0 +556,40,2.631888840136646,127,16,6,2,31,1,1,1,1,2,1.0,12.0,12.0 +1200,40,3.4011973816621555,109,15,7,8,33,1,0,0,1,2,1.0,11.0,12.0 +855,45,2.9444389791664403,89,12,6,6,31,1,0,1,0,4,3.0,3.0,3.0 +1053,40,3.270519058020039,90,12,18,7,37,1,0,1,0,1,1.0,11.0,11.0 +1000,48,3.036554268074246,105,12,11,4,28,1,0,1,0,0,1.0,12.0,7.0 +900,55,2.7950615780918397,100,12,18,5,34,0,0,0,1,2,2.0,8.0, +1602,45,3.572345637857985,111,16,10,10,31,1,0,1,0,1,,16.0,12.0 +508,50,2.318458442150336,125,17,9,2,31,1,0,1,1,3,1.0,16.0,13.0 +1500,60,3.2188758248682006,124,16,6,6,29,1,0,1,0,2,,12.0,10.0 +1682,50,3.5157158351047473,107,14,15,9,32,1,0,1,1,0,1.0,12.0,12.0 +750,40,2.9311937524164198,110,13,13,1,35,1,0,1,1,2,,12.0,16.0 +843,40,3.048087503887919,102,14,8,7,29,1,0,1,0,1,1.0,16.0,16.0 +409,40,2.3248357019288655,93,12,17,18,38,0,0,1,0,0,1.0,, +1004,40,3.2228678461377385,81,12,17,15,34,1,0,1,0,1,1.0,12.0, +650,40,2.7880929087757464,99,12,13,10,30,1,0,1,0,1,2.0,12.0,10.0 +808,40,3.005682604407159,93,12,17,9,37,1,1,1,0,4,1.0,, +2137,45,3.8604957655488277,102,13,8,2,30,1,0,1,0,0,1.0,12.0,12.0 +761,48,2.763432346953795,95,12,14,21,38,1,0,1,1,1,1.0,12.0,5.0 +769,40,2.9562115153917077,98,16,8,3,35,0,0,1,1,0,1.0,11.0,8.0 +345,40,2.1546649629174235,84,12,7,8,31,1,1,1,1,2,2.0,, +495,40,2.515678308454754,88,12,6,10,31,1,0,1,1,2,1.0,,7.0 +987,38,3.257083879707096,109,16,9,3,31,1,0,1,1,3,4.0,4.0, +2500,60,3.7297014486341915,82,12,21,1,38,1,0,1,0,3,3.0,8.0,5.0 +1098,45,3.1945831322991562,105,14,6,1,32,0,0,1,1,1,2.0,12.0, +1212,40,3.4111477125153233,95,12,6,16,38,1,0,1,0,3,1.0,12.0,8.0 +577,40,2.668962812394163,92,15,8,1,28,1,1,1,1,1,2.0,10.0,7.0 +390,59,1.8886092952179727,74,15,10,3,30,1,1,1,1,3,3.0,7.0,6.0 +1500,40,3.624340932976365,123,16,9,12,32,1,0,1,1,1,1.0,12.0,14.0 +583,80,1.9861605516766108,86,12,9,1,30,1,0,1,1,2,2.0,12.0,12.0 +460,40,2.4423470353692043,92,11,16,1,36,1,0,1,1,5,6.0,, +945,40,3.1623054733798064,87,12,12,13,38,1,0,1,1,2,2.0,8.0, +1442,60,3.179441755622794,117,16,9,3,31,1,0,1,1,1,2.0,12.0,10.0 +1333,45,3.388524830408389,112,16,14,8,38,1,0,1,1,1,2.0,12.0,4.0 +1500,37,3.702302474446077,119,15,8,5,33,0,0,0,1,1,1.0,12.0,18.0 +1333,45,3.388524830408389,103,16,7,1,34,1,0,0,1,3,1.0,, +700,40,2.8622008809294686,74,12,16,4,36,1,1,1,1,3,,9.0, +973,36,3.296865143729895,81,13,11,5,32,1,0,1,1,0,1.0,6.0,9.0 +2162,40,3.9899095440852173,124,18,10,8,32,1,0,1,1,1,1.0,10.0,10.0 +797,41,2.9672826120859073,89,12,10,7,36,1,0,1,0,1,2.0,7.0,8.0 +400,40,2.302585092994046,88,12,14,1,32,1,1,1,1,7,7.0,7.0,6.0 +1015,40,3.2337644373619514,67,12,15,11,32,1,1,0,1,3,2.0,9.0,5.0 +1744,43,3.7027364887753627,106,16,8,9,29,1,0,1,1,1,1.0,12.0,16.0 +630,40,2.7568403652716422,103,15,14,2,32,1,0,1,0,0,1.0,11.0,5.0 +445,40,2.409194828052304,91,12,11,4,32,1,0,1,0,0,1.0,6.0,8.0 +660,42,2.7545702167371027,101,16,12,9,31,1,0,1,1,0,1.0,12.0,12.0 +779,40,2.969131591756812,85,12,14,7,37,1,1,1,1,7,4.0,12.0, +377,40,2.2433657333340746,83,12,9,1,36,0,0,1,1,1,1.0,12.0,12.0 +560,44,2.5437471498109336,70,12,16,11,35,1,1,1,1,2,1.0,8.0, +1122,60,2.928523523860541,102,17,7,13,32,1,0,1,1,2,2.0,12.0,11.0 +453,50,2.203869120054888,94,12,9,2,30,1,0,1,0,6,4.0,7.0,7.0 +1386,40,3.5452977256359124,97,10,17,9,37,1,0,1,1,1,2.0,12.0,8.0 +1539,40,3.650008679724943,115,17,7,9,31,1,0,1,1,2,1.0,12.0,16.0 +1154,40,3.3621099929541085,117,16,11,12,35,1,0,1,1,5,5.0,17.0,18.0 +962,50,2.9569914452375605,105,14,15,2,37,1,0,1,1,3,4.0,8.0,4.0 +722,55,2.574691953660355,113,16,8,1,38,0,0,1,1,1,2.0,8.0, +480,40,2.4849066497880004,83,12,9,3,37,1,0,1,1,4,3.0,10.0,11.0 +808,50,2.7825390530929495,101,18,8,9,38,1,0,1,0,3,2.0,17.0,12.0 +1442,40,3.584906863730958,113,13,14,8,36,1,0,1,1,2,1.0,12.0,12.0 +1091,50,3.0828269804049246,88,13,13,4,37,1,0,0,1,4,1.0,12.0, +350,40,2.169053700369523,93,12,16,0,33,0,1,1,1,1,1.0,12.0, +500,40,2.5257286443082556,83,12,18,11,36,1,1,1,1,0,1.0,7.0, +1026,45,3.126760535960395,113,16,9,13,30,1,0,1,1,2,2.0,16.0,14.0 +577,40,2.668962812394163,106,17,11,7,33,0,1,1,1,3,2.0,13.0,16.0 +1333,60,3.100842757956608,106,15,5,1,30,1,0,1,1,2,2.0,12.0,12.0 +915,55,2.8115908800430502,114,12,17,9,37,1,0,0,1,1,,10.0, +1105,40,3.3187211598379167,119,16,9,10,30,0,0,1,1,5,1.0,11.0,10.0 +910,40,3.1245651453969594,82,14,5,5,30,1,1,1,1,10,,9.0,3.0 +1000,40,3.2188758248682006,89,12,17,8,38,1,0,1,1,7,7.0,1.0,4.0 +1160,40,3.367295829986474,74,12,14,1,33,1,1,1,1,9,6.0,3.0,4.0 +1001,34,3.3823942546990593,77,12,12,3,29,1,1,1,1,9,8.0,3.0,4.0 +713,40,2.8806019663003597,75,12,5,12,36,1,1,1,1,7,4.0,, +929,40,3.1452292846999024,97,13,12,5,30,1,0,1,1,2,1.0,12.0,12.0 +400,50,2.0794415416798357,68,12,4,9,31,1,1,1,1,6,1.0,6.0,2.0 +1241,40,3.434793331090671,83,13,9,10,33,1,0,1,1,2,3.0,12.0,12.0 +1065,40,3.2818506240295893,97,12,21,10,36,1,0,1,1,1,1.0,12.0, +403,45,2.1922740721763634,98,12,5,3,30,1,0,1,1,2,,12.0,12.0 +940,45,3.0392173854937297,102,13,15,12,30,1,1,1,1,2,2.0,, +812,40,3.0106208860477417,81,10,17,13,34,1,1,1,1,2,2.0,8.0,3.0 +700,20,3.5553480614894135,85,10,13,0,35,1,1,1,1,3,,6.0,10.0 +575,40,2.665490586683414,86,10,12,6,33,1,1,1,1,8,,, +450,40,2.4203681286504293,79,10,20,5,36,1,1,1,1,7,6.0,12.0,12.0 +621,43,2.6701309662399164,84,12,14,10,31,1,0,1,0,4,3.0,8.0,6.0 +441,38,2.4514587157204604,74,12,12,11,30,1,0,1,0,4,4.0,8.0,6.0 +625,40,2.7488721956224653,92,16,6,9,33,1,1,1,0,11,1.0,, +726,45,2.7808875250544762,93,12,16,5,36,1,0,1,0,5,2.0,6.0, +500,40,2.5257286443082556,69,9,21,13,38,1,1,1,1,8,6.0,6.0, +1000,44,3.123565645063876,113,17,8,2,34,1,0,1,1,4,1.0,17.0,18.0 +393,48,2.1026086009613705,92,12,15,16,38,1,0,1,1,1,1.0,8.0,7.0 +600,40,2.70805020110221,127,12,8,3,28,0,0,1,0,2,2.0,9.0,12.0 +962,50,2.9569914452375605,109,12,21,12,37,1,0,1,0,0,1.0,6.0, +962,40,3.1801349965517702,97,12,15,4,34,1,0,1,0,5,1.0,10.0,8.0 +865,40,3.073850052817943,66,11,10,7,30,1,0,0,1,14,4.0,0.0,10.0 +1154,50,3.138966441639899,109,16,10,3,35,1,0,1,1,2,1.0,16.0,14.0 +1386,42,3.4965075614664802,109,16,10,11,34,1,0,1,0,1,1.0,4.0,14.0 +732,40,2.9069010598473755,104,12,10,7,36,1,0,1,1,1,2.0,, +865,40,3.073850052817943,85,13,4,9,34,1,0,1,1,3,3.0,8.0,8.0 +700,40,2.8622008809294686,81,12,13,13,31,1,0,1,0,5,6.0,8.0,4.0 +975,40,3.193558016883911,87,9,20,10,37,1,0,1,0,3,,5.0,4.0 +1300,40,3.481240089335692,78,13,12,3,33,1,0,1,1,2,3.0,12.0,12.0 +900,40,3.1135153092103742,54,14,12,3,31,1,0,1,1,2,1.0,12.0,12.0 +829,40,3.031340701021359,98,12,15,15,36,1,0,0,1,4,5.0,8.0,8.0 +1000,40,3.2188758248682006,98,12,17,13,36,1,0,1,1,3,,12.0, +827,40,3.028925240909755,105,16,7,8,30,1,0,0,1,2,1.0,16.0,12.0 +500,44,2.4304184645039304,87,13,5,2,31,1,0,1,1,7,,12.0, +1155,40,3.3629761688419575,117,13,9,1,28,1,0,0,1,3,2.0,12.0,12.0 +950,55,2.8491287993621155,85,15,8,3,29,0,0,0,1,2,,12.0,12.0 +700,40,2.8622008809294686,82,13,10,4,30,1,0,0,1,4,5.0,8.0, +1710,45,3.6375861597263857,114,18,7,6,32,1,0,0,1,1,1.0,12.0, +533,30,2.8773240425036892,65,12,5,1,32,0,1,0,1,5,1.0,11.0,12.0 +2004,48,3.7316994512968646,105,18,10,0,34,1,0,0,1,2,1.0,12.0,12.0 +890,60,2.6968769005040847,92,14,9,8,32,1,0,0,1,1,2.0,7.0,7.0 +3078,30,4.630837932736669,107,13,11,4,29,1,0,0,1,2,2.0,12.0,12.0 +1539,40,3.650008679724943,111,17,10,13,37,1,0,0,1,3,2.0,12.0,16.0 +508,40,2.5416019934645457,73,12,1,1,31,1,1,0,1,1,,, +1354,40,3.521938999358284,119,17,13,9,35,0,0,0,0,2,1.0,16.0,16.0 +1143,35,3.486063602305397,97,12,21,8,38,1,0,0,1,5,1.0,12.0,12.0 +962,40,3.1801349965517702,110,12,16,8,33,1,0,0,1,2,1.0,10.0,10.0 +1250,44,3.3467091963780855,96,12,19,20,38,1,0,0,1,2,1.0,12.0,12.0 +990,40,3.2088254890146994,67,12,16,3,34,1,1,0,1,2,1.0,8.0,8.0 +905,40,3.11905548958599,102,12,17,4,37,1,0,0,0,5,5.0,12.0,12.0 +926,55,2.8235410494137083,64,12,18,0,38,1,0,0,1,4,5.0,0.0,2.0 +1559,40,3.6629204149438404,103,12,17,10,34,1,0,0,1,3,4.0,8.0,8.0 +1312,40,3.490428515390098,118,10,14,4,32,1,0,0,1,0,1.0,12.0,8.0 +923,40,3.138749780388916,118,14,8,16,35,1,1,0,1,5,1.0,7.0, +879,40,3.089905443571241,118,18,1,9,31,1,0,0,1,1,2.0,13.0,13.0 +800,25,3.4657359027997265,75,13,14,1,38,1,0,1,1,0,1.0,12.0,10.0 +1049,50,3.043569602968151,112,14,6,10,32,1,0,0,0,3,3.0,12.0,10.0 +550,40,2.6210388241125804,95,12,4,1,30,0,0,0,0,3,4.0,12.0,10.0 +1190,40,3.392829131991639,119,17,4,2,34,1,0,0,1,0,1.0,12.0,14.0 +583,48,2.4969861754426015,94,14,10,6,37,1,0,0,0,2,1.0,12.0,12.0 +1200,40,3.4011973816621555,103,14,5,2,30,1,0,0,1,1,1.0,6.0,7.0 +797,55,2.673521493557744,90,16,11,5,33,1,0,0,1,5,2.0,14.0,17.0 +1371,40,3.534416225448378,128,18,8,13,36,1,0,0,0,1,2.0,16.0,12.0 +360,55,1.8787708462176849,110,13,11,1,38,0,1,0,1,4,,12.0,8.0 +1270,40,3.457892725338701,84,12,11,12,30,1,0,0,1,2,2.0,12.0,12.0 +1832,40,3.824284091120139,97,12,16,1,36,1,0,0,1,1,2.0,8.0,12.0 +909,40,3.1234656400635425,102,12,14,5,33,1,0,0,1,3,3.0,12.0,7.0 +1746,40,3.776203282285611,131,18,9,10,33,1,0,0,1,7,3.0,12.0,12.0 +520,40,2.5649493574615367,126,16,8,1,30,1,0,0,1,7,5.0,12.0,12.0 +808,40,3.005682604407159,107,16,6,7,29,1,0,0,0,7,6.0,12.0,12.0 +2137,45,3.8604957655488277,108,16,11,2,36,1,0,0,1,2,3.0,12.0, +692,50,2.6275629501895237,92,15,9,3,38,1,1,0,1,0,1.0,8.0,8.0 +931,80,2.4542326426031855,108,16,4,1,36,1,0,0,1,4,2.0,12.0,12.0 +812,45,2.8928378503913583,115,16,11,3,34,1,0,0,1,1,2.0,12.0,8.0 +866,40,3.075005454448499,111,14,16,14,35,1,0,0,1,1,1.0,12.0,12.0 +1442,40,3.584906863730958,115,12,14,9,36,1,0,0,1,7,5.0,12.0,12.0 +500,40,2.5257286443082556,101,14,12,0,32,1,0,0,0,2,2.0,11.0,6.0 +1384,50,3.3207101307494686,114,18,12,2,37,1,0,0,1,1,1.0,12.0,13.0 +528,55,2.2617630984737906,116,18,5,9,30,1,0,0,1,4,5.0,12.0,12.0 +881,40,3.092178171822243,90,12,4,14,36,1,0,0,0,2,3.0,12.0, +1026,45,3.126760535960395,125,12,11,11,28,1,0,0,1,3,1.0,14.0,17.0 +1212,40,3.4111477125153233,98,12,11,12,28,0,0,0,1,4,,12.0,10.0 +1620,38,3.752595268500044,111,15,8,5,29,1,0,0,0,1,2.0,10.0, +1843,48,3.6479489467619324,109,16,11,2,32,1,0,0,1,3,2.0,12.0, +1602,60,3.2846635654062037,124,16,12,2,37,1,0,0,1,1,2.0,12.0,12.0 +1000,40,3.2188758248682006,121,13,6,1,33,1,0,0,1,2,2.0,8.0,14.0 +737,48,2.7313868812814457,103,12,7,4,30,1,0,0,1,4,4.0,10.0, +1699,40,3.7489156675579958,96,12,10,1,29,0,0,1,1,2,3.0,12.0,12.0 +1699,40,3.7489156675579958,100,12,11,9,33,1,0,0,1,1,2.0,12.0,8.0 +1025,48,3.061246880664618,104,14,6,5,32,1,0,0,1,2,3.0,,12.0 +1107,40,3.3205294785947004,112,12,12,5,38,1,0,0,1,5,3.0,11.0,12.0 +625,40,2.7488721956224653,73,11,1,1,31,1,0,0,1,3,4.0,12.0,12.0 +720,50,2.667228206581955,101,13,1,7,29,1,0,0,1,4,2.0,11.0,11.0 +855,40,3.062222014822824,99,12,19,10,36,1,0,0,1,1,2.0,12.0,12.0 +1250,40,3.4420193761824107,95,12,12,2,32,1,0,0,1,2,2.0,12.0,12.0 +1130,40,3.34109345759245,109,18,4,13,38,1,0,0,0,1,2.0,18.0,15.0 +900,40,3.1135153092103742,110,12,6,1,28,0,0,0,1,1,,13.0,13.0 +1924,50,3.6501386257975055,98,17,6,7,38,1,0,0,1,1,1.0,4.0, +962,40,3.1801349965517702,112,15,8,2,37,1,0,0,1,2,1.0,12.0,16.0 +1874,48,3.6646294518904763,64,11,22,3,38,1,1,0,1,7,,, +1573,55,3.353406717825807,90,12,5,3,30,1,0,0,1,4,3.0,11.0,8.0 +940,45,3.0392173854937297,102,14,11,7,36,1,0,0,1,1,2.0,12.0,10.0 +900,40,3.1135153092103742,119,16,8,9,30,1,0,0,0,1,2.0,12.0,12.0 +882,44,2.9980024220885304,96,12,15,13,31,1,0,0,0,6,3.0,8.0,10.0 +1710,45,3.6375861597263857,118,18,12,12,38,1,0,0,1,1,1.0,12.0,12.0 +1260,45,3.332204510175204,79,12,19,15,37,1,0,0,0,3,2.0,9.0,8.0 +751,40,2.932526197650198,96,12,9,7,38,1,0,0,0,1,1.0,10.0,8.0 +1097,50,3.088311454847084,80,11,12,12,28,1,0,0,0,5,1.0,12.0,11.0 +1001,48,3.0375537684073297,137,13,11,11,33,1,0,0,0,5,6.0,12.0, +1154,40,3.3621099929541085,116,15,11,12,34,0,0,0,0,2,1.0,12.0,9.0 +1000,43,3.1465551632885744,69,12,15,16,35,1,0,0,1,4,4.0,12.0,8.0 +1250,40,3.4420193761824107,78,12,16,3,33,1,0,0,1,9,,6.0,2.0 +857,65,2.5790506487021427,99,12,18,3,38,1,0,1,1,2,1.0,8.0,8.0 +1211,27,3.803364877548763,92,12,13,3,31,1,0,0,1,3,2.0,16.0,12.0 +937,32,3.3769473794386955,113,16,12,7,29,1,0,0,1,3,,16.0,12.0 +904,50,2.89480635496403,98,13,7,1,33,1,0,0,1,5,,12.0, +872,45,2.96412693413866,115,15,7,4,29,1,0,0,1,3,1.0,12.0,18.0 +1200,40,3.4011973816621555,96,9,18,0,34,1,0,0,1,4,3.0,,8.0 +1261,40,3.4507808818509833,117,17,1,9,35,1,0,0,1,4,1.0,6.0,8.0 +950,40,3.1675825304806504,96,12,14,2,35,1,0,0,1,1,1.0,8.0,2.0 +115,50,0.8329091229351039,108,12,9,3,29,1,0,0,1,5,6.0,10.0,11.0 +673,40,2.8228658755307916,92,17,6,4,31,1,0,0,1,5,5.0,16.0,12.0 +1084,45,3.1817506922292718,95,15,17,10,37,1,0,0,1,1,2.0,16.0,16.0 +1058,40,3.2752561583043085,94,14,13,14,34,1,0,0,1,0,1.0,15.0,9.0 +800,40,2.995732273553991,115,12,20,12,38,1,0,0,0,7,6.0,7.0,8.0 +369,40,2.221917189926591,117,18,11,1,31,0,0,0,0,3,4.0,, +1924,40,3.8732821771117156,105,16,14,13,36,1,0,0,0,0,1.0,12.0, +855,40,3.062222014822824,109,12,17,15,36,1,0,0,0,3,1.0,7.0,6.0 +864,40,3.0726933146901194,87,12,15,6,31,1,0,0,0,1,1.0,12.0,12.0 +1092,44,3.211576522386589,110,16,15,13,36,1,0,0,1,4,4.0,13.0,13.0 +1025,40,3.2435684374585723,110,16,9,4,30,1,0,0,0,3,,10.0,12.0 +850,35,3.1898882879949486,109,12,11,2,31,1,0,0,0,2,2.0,17.0, +673,40,2.8228658755307916,85,12,17,10,35,1,0,0,0,2,2.0,12.0,12.0 +800,40,2.995732273553991,105,14,12,12,37,1,0,0,0,3,2.0,10.0,12.0 +1049,44,3.171402974478036,122,16,7,3,33,1,0,0,0,3,3.0,10.0,12.0 +884,40,3.095577608523707,108,17,9,11,35,1,0,0,1,3,2.0,14.0,9.0 +800,40,2.995732273553991,122,16,10,2,31,0,0,1,1,3,3.0,12.0,8.0 +1200,40,3.4011973816621555,79,17,9,9,32,1,0,0,1,0,1.0,8.0,8.0 +664,40,2.8094026953624978,105,12,8,10,29,1,0,0,1,7,6.0,12.0,12.0 +1111,45,3.2063532998693103,90,12,18,18,37,1,0,0,1,6,3.0,, +850,43,2.9840362337907997,111,16,8,8,34,1,0,0,1,4,2.0,, +1000,40,3.2188758248682006,110,12,6,12,37,1,0,0,1,5,2.0,8.0,12.0 +875,40,3.0853444322436783,92,12,8,4,29,0,0,0,1,4,,14.0,14.0 +1202,40,3.4028626609812167,131,16,10,2,33,1,0,0,0,3,2.0,12.0,12.0 +666,40,2.8124102164264526,104,12,10,2,29,1,0,0,0,2,3.0,12.0,12.0 +923,40,3.138749780388916,110,16,15,11,37,1,0,0,0,2,1.0,12.0,7.0 +788,40,2.9806186357439426,99,12,10,10,28,1,0,1,1,4,5.0,10.0,3.0 +950,40,3.1675825304806504,86,10,23,5,38,1,0,1,1,9,9.0,,6.0 +1442,40,3.584906863730958,105,12,9,16,37,1,0,1,1,3,4.0,, +866,40,3.075005454448499,85,12,11,12,30,1,1,1,0,8,5.0,6.0,0.0 +625,40,2.7488721956224653,72,9,17,5,34,1,0,1,0,10,7.0,4.0, +680,40,2.833213344056216,86,12,13,9,32,0,0,1,0,6,1.0,6.0,7.0 +693,40,2.852150545075967,68,12,11,19,35,1,0,1,0,5,2.0,12.0,8.0 +875,36,3.1907049479015046,95,12,16,2,38,0,1,1,0,8,9.0,6.0, +2308,40,4.055257173514054,116,17,8,2,38,1,0,0,0,6,1.0,12.0,13.0 +1196,45,3.280075444740257,96,14,10,4,32,1,0,1,0,2,3.0,10.0,6.0 +700,38,2.913494175317019,85,12,13,8,32,1,1,1,1,6,,2.0,8.0 +721,40,2.8917596831710126,100,12,8,8,29,1,0,1,1,3,2.0,12.0,4.0 +1500,40,3.624340932976365,101,13,13,2,32,1,0,1,1,5,3.0,12.0,8.0 +1050,50,3.044522437723423,97,15,4,9,31,1,1,1,1,2,1.0,16.0,9.0 +801,48,2.8146599361604685,100,14,6,10,29,1,1,1,1,2,1.0,, +640,23,3.3259739604245677,96,12,7,3,31,0,1,1,1,5,,, +1198,32,3.622672875875668,117,16,7,9,30,1,0,1,1,1,2.0,12.0,12.0 +390,55,1.9588135538912212,93,12,4,2,32,1,0,1,1,1,,16.0,13.0 +889,36,3.2065782970577943,116,12,12,11,28,1,0,1,1,1,2.0,9.0,12.0 +1076,38,3.3434195809953438,106,12,19,20,36,1,0,1,1,1,1.0,12.0,9.0 +1127,40,3.33843505992584,98,12,17,12,36,1,0,1,1,1,2.0,14.0,12.0 +750,50,2.70805020110221,103,15,1,1,37,1,0,1,0,1,1.0,12.0,9.0 +855,40,3.062222014822824,118,14,6,14,33,1,0,1,0,3,1.0,,12.0 +525,40,2.5745188084776873,100,13,5,1,31,1,0,1,0,1,1.0,10.0,12.0 +1104,54,3.0177111802727663,96,12,11,4,29,1,0,1,0,1,2.0,10.0,12.0 +553,40,2.6264785474083983,67,12,11,10,30,1,1,1,0,7,2.0,8.0,9.0 +800,43,2.9234116119743647,96,12,10,1,29,1,0,1,0,1,1.0,10.0,10.0 +1384,50,3.3207101307494686,104,13,8,7,31,1,0,1,0,3,1.0,13.0,14.0 +425,30,2.6508917872622613,106,17,8,0,36,0,0,1,0,0,1.0,14.0,12.0 +510,54,2.245426679154097,62,11,13,4,33,0,1,1,1,7,6.0,2.0,10.0 +370,32,2.4477671028385437,73,12,13,2,31,1,1,1,0,9,2.0,3.0,4.0 +596,40,2.7013612129514133,62,12,16,14,33,1,1,1,0,9,8.0,2.0,8.0 +402,40,2.307572634505085,76,12,9,4,28,1,1,0,1,4,2.0,,10.0 +418,40,2.34660197841082,76,12,12,2,31,1,1,1,0,0,1.0,9.0,10.0 +1133,40,3.34374480691407,106,16,13,10,36,1,0,1,0,1,1.0,12.0, +681,40,2.834682852035576,94,12,18,15,35,0,0,1,1,4,,9.0,10.0 +950,40,3.1675825304806504,81,11,16,5,35,1,0,1,0,3,4.0,10.0,6.0 +600,40,2.70805020110221,87,10,20,7,36,1,0,1,0,0,1.0,5.0,6.0 +661,40,2.80487438573775,96,13,8,6,29,0,0,1,0,3,2.0,,5.0 +925,40,3.140914283398489,75,12,12,9,30,1,0,1,0,2,2.0,6.0, +550,40,2.6210388241125804,95,12,14,13,31,1,0,1,0,0,1.0,5.0,5.0 +606,40,2.7180005319553784,86,11,13,11,30,1,0,1,0,4,4.0,3.0,7.0 +425,40,2.3632097148104805,86,10,7,1,30,1,0,1,0,4,4.0,3.0,7.0 +340,50,1.916922612182061,104,14,4,1,31,1,0,1,1,5,3.0,8.0,18.0 +692,50,2.6275629501895237,95,12,16,9,34,1,0,1,1,2,2.0,7.0,5.0 +575,40,2.665490586683414,116,12,11,9,29,1,0,1,0,1,2.0,8.0,12.0 +571,40,2.658509755542074,66,9,15,10,33,1,0,1,0,5,1.0,8.0,6.0 +817,40,3.0167596407460664,101,16,11,9,32,1,0,1,1,1,2.0,0.0,5.0 +987,40,3.205790585319545,96,12,11,5,29,1,0,1,0,1,2.0,12.0,12.0 +616,55,2.4159137783010487,104,12,16,18,35,1,0,1,1,4,5.0,9.0, +1026,60,2.8390784635086144,105,16,12,1,35,1,0,0,1,3,1.0,14.0,10.0 +808,40,3.005682604407159,106,12,4,3,29,1,0,0,1,1,2.0,8.0,7.0 +808,50,2.7825390530929495,101,17,8,0,30,1,0,1,1,1,2.0,15.0,15.0 +788,40,2.9806186357439426,96,12,13,5,36,1,0,1,1,4,1.0,12.0,12.0 +850,40,3.056356895370426,105,12,6,2,33,1,0,0,1,1,1.0,12.0,9.0 +900,38,3.1648086035979253,106,12,10,19,38,1,0,1,1,7,,3.0,2.0 +1418,45,3.4503402173217532,102,12,19,20,36,1,0,1,1,2,3.0,8.0,8.0 +260,40,1.8718021769015913,75,12,21,0,37,1,1,1,0,3,3.0,, +662,45,2.688603066166688,99,14,7,2,28,1,1,1,0,6,1.0,5.0,5.0 +562,55,2.32416866466122,90,13,4,1,38,1,0,1,0,1,1.0,12.0,11.0 +562,80,1.9494752152198096,104,12,11,5,28,1,0,1,0,1,,12.0,12.0 +357,70,1.62924053973028,115,13,5,2,30,1,0,1,1,6,7.0,, +1009,40,3.2278355662396727,118,16,11,12,32,1,0,1,0,0,1.0,12.0,10.0 +1442,40,3.584906863730958,108,12,17,17,36,1,0,1,1,1,1.0,9.0,12.0 +651,40,2.789630188094633,76,11,11,2,29,1,1,0,1,7,7.0,10.0,11.0 +750,40,2.9311937524164198,50,12,14,5,32,1,1,1,0,10,,3.0, +754,40,2.93651291389402,55,12,13,14,33,1,1,1,0,2,1.0,10.0, +700,40,2.8622008809294686,73,12,17,9,38,1,1,1,0,8,3.0,, +503,40,2.531710715985803,84,11,11,2,30,0,1,0,1,3,,9.0,9.0 +937,40,3.153803828124486,104,12,14,15,32,1,0,1,0,1,2.0,12.0,9.0 +624,40,2.747270914255491,92,10,18,10,36,1,0,1,0,2,3.0,10.0,6.0 +750,40,2.9311937524164198,83,12,4,10,32,1,1,1,0,7,1.0,10.0,6.0 +900,40,3.1135153092103742,98,14,1,8,30,1,1,1,0,7,2.0,10.0,6.0 +540,40,2.6026896854443837,70,10,12,10,29,1,1,1,0,9,,10.0,7.0 +642,35,2.909240242200547,87,13,9,3,30,1,0,1,0,10,10.0,4.0,10.0 +400,50,2.0794415416798357,96,15,6,10,28,0,0,1,0,5,,12.0, +900,40,3.1135153092103742,80,10,15,14,38,1,0,1,0,3,3.0,12.0,10.0 +513,40,2.551396391056833,104,16,8,10,33,1,0,1,0,5,2.0,12.0,10.0 +894,40,3.106826321059578,104,18,7,10,35,1,0,1,0,7,8.0,9.0,8.0 +1282,60,3.061832075258515,96,18,7,5,32,1,0,1,1,4,2.0,12.0,18.0 +485,40,2.495269436823547,89,12,10,9,30,0,0,1,0,4,3.0,12.0,18.0 +325,55,1.7764919970972666,113,12,11,5,29,1,0,1,0,1,2.0,10.0,13.0 +769,45,2.8384284797353243,105,12,16,5,33,1,0,1,0,4,1.0,7.0,7.0 +618,40,2.7376090033437546,84,14,6,8,31,0,0,1,1,7,8.0,7.0,4.0 +1040,48,3.0757749812275277,108,12,16,17,35,1,0,1,1,6,7.0,7.0,3.0 +751,40,2.932526197650198,104,12,15,4,34,1,0,1,1,4,3.0,8.0,3.0 +380,50,2.028148247292285,106,12,15,11,30,1,0,1,0,2,1.0,7.0,7.0 +300,24,2.5257286443082556,83,12,16,3,37,1,1,1,1,4,1.0,3.0, +753,46,2.7954238313107984,70,10,21,7,38,1,0,1,1,4,2.0,12.0,7.0 +1065,65,2.7963428082478883,104,16,10,11,34,1,0,1,1,2,3.0,11.0,12.0 +1070,40,3.2865344733420154,91,12,13,1,30,1,0,0,1,1,2.0,14.0,12.0 +1573,55,3.353406717825807,112,18,7,8,34,1,0,1,1,1,1.0,14.0,18.0 +650,40,2.7880929087757464,97,10,14,9,30,1,0,1,0,5,1.0,12.0,9.0 +700,45,2.7444178452730847,99,12,15,7,32,1,0,1,0,4,2.0,10.0,10.0 +494,40,2.513656063073986,74,12,16,4,34,1,1,1,0,5,,, +890,48,2.920020451818295,100,12,4,8,31,1,0,1,0,0,1.0,, +520,40,2.5649493574615367,86,10,15,12,31,1,0,1,0,0,1.0,6.0, +891,40,3.103464973356873,90,12,16,16,32,1,0,1,0,5,5.0,12.0,9.0 +570,50,2.4336133554004498,101,12,11,12,30,1,0,0,1,2,3.0,12.0, +1444,40,3.586292865338835,109,15,11,1,29,1,0,1,1,2,1.0,11.0,9.0 +481,48,2.3046662591978704,98,12,14,2,31,0,1,0,1,4,3.0,, +500,44,2.4304184645039304,107,12,21,12,38,1,0,1,0,2,,12.0,7.0 +1473,40,3.606176962348694,110,16,15,15,36,1,0,1,0,1,2.0,12.0,14.0 +803,40,2.9994752598328254,120,13,4,1,28,1,0,1,1,3,4.0,10.0,12.0 +962,50,2.9569914452375605,97,16,7,2,30,1,0,1,1,0,1.0,12.0,12.0 +1000,44,3.123565645063876,103,12,9,5,29,1,0,1,1,0,1.0,11.0, +600,40,2.70805020110221,114,16,5,4,30,1,0,1,1,2,1.0,12.0,12.0 +450,40,2.4203681286504293,95,11,12,2,30,1,0,1,0,2,3.0,8.0,8.0 +629,60,2.3497866944783397,93,12,6,1,30,1,1,1,0,8,3.0,10.0,6.0 +492,60,2.1041341542702074,67,12,15,2,34,1,1,1,0,3,,8.0, +1562,40,3.664842876285695,97,17,7,2,32,1,0,1,1,5,1.0,12.0,13.0 +357,70,1.62924053973028,97,14,6,3,28,1,0,1,0,1,2.0,13.0,16.0 +960,40,3.1780538303479458,83,13,14,13,32,1,0,1,1,4,,10.0, +566,45,2.531931588432863,104,16,5,2,32,1,0,1,0,1,2.0,12.0,12.0 +481,40,2.486987815991825,82,12,9,2,32,1,0,1,0,2,2.0,12.0,8.0 +1442,40,3.584906863730958,113,16,8,10,35,1,0,1,1,2,2.0,8.0,8.0 +645,45,2.662587827025453,93,12,11,3,35,1,0,1,0,7,7.0,7.0,8.0 +788,40,2.9806186357439426,100,11,15,6,32,1,1,1,0,5,,9.0, +644,42,2.7300291078209855,101,12,11,5,33,1,0,1,0,4,3.0,12.0, +477,45,2.3608540011180215,100,12,9,3,31,1,0,1,0,3,3.0,7.0,7.0 +664,60,2.403937587254333,82,16,10,9,34,1,1,1,1,3,4.0,16.0,16.0 +520,40,2.5649493574615367,79,16,6,1,30,1,1,1,0,0,1.0,11.0, +1202,40,3.4028626609812167,102,13,10,3,31,1,0,1,1,7,7.0,8.0,6.0 +538,45,2.481196070391465,77,12,12,10,28,1,1,1,0,9,,7.0, +873,44,2.987745921921341,109,12,12,12,28,1,0,1,0,1,1.0,,11.0 +1000,40,3.2188758248682006,107,12,17,18,35,1,0,1,0,5,1.0,, diff --git a/book/regression/prompt.md b/book/regression/prompt.md new file mode 100644 index 0000000..1916ec4 --- /dev/null +++ b/book/regression/prompt.md @@ -0,0 +1,2 @@ +/skill /Users/edgar/Repository/causal-studio/book/regression/05-The-Unreasonable-Effectiveness-of-Linear-Regression.ipynb , + data: /Users/edgar/Repository/causal-studio/book/regression/data/wage.csv \ No newline at end of file diff --git a/videos/grouped_dummy_regression/src/grouped_dummy_regression.py b/videos/grouped_dummy_regression/src/grouped_dummy_regression.py new file mode 100644 index 0000000..bb4d3cc --- /dev/null +++ b/videos/grouped_dummy_regression/src/grouped_dummy_regression.py @@ -0,0 +1,218 @@ +import json +from pathlib import Path + +import numpy as np +import pandas as pd +from manim import * + + +TOPIC_DIR = Path(__file__).resolve().parents[1] +REPO_ROOT = Path(__file__).resolve().parents[3] + +ACCENT = YELLOW_E +WEIGHTED = TEAL_C +UNWEIGHTED = ORANGE +POINT_COLOR = BLUE_D +SOFT = GREY_B + + +def load_scene_timing_durations(scene_basename: str) -> list[float]: + payload = json.loads((TOPIC_DIR / "build" / "audio" / f"{scene_basename}.timings.json").read_text()) + return [float(chunk["duration"]) for chunk in payload["chunks"]] + + +def load_grouped_regression_data(): + wage = ( + pd.read_csv(REPO_ROOT / "book" / "regression" / "data" / "wage.csv") + .dropna(subset=["wage", "hours", "educ", "IQ", "lhwage"]) + .assign(hwage=lambda d: d["wage"] / d["hours"]) + .copy() + ) + sample = wage.sort_values(["educ", "IQ"]).groupby("educ", group_keys=False).head(12) + grouped = wage.groupby("educ", as_index=False).agg(lhwage=("lhwage", "mean"), count=("lhwage", "size")) + individual = np.polyfit(sample["educ"], sample["lhwage"], 1) + weighted = np.polyfit(grouped["educ"], grouped["lhwage"], 1, w=grouped["count"]) + unweighted = np.polyfit(grouped["educ"], grouped["lhwage"], 1) + return sample, grouped, individual, weighted, unweighted + + +def make_line(axes: Axes, slope: float, intercept: float, color: str): + x0, x1 = axes.x_range[0], axes.x_range[1] + return Line( + axes.c2p(x0, slope * x0 + intercept), + axes.c2p(x1, slope * x1 + intercept), + color=color, + stroke_width=5, + ) + + +class Scene01_GroupedRegressionWeights(Scene): + """ + Scene 01: Grouped Regression Needs Weights + + Core Claim: + 집계 데이터에서도 집단 평균과 집단 크기가 있으면 회귀의 핵심 구조를 복원할 수 있고, + 이때는 가중치가 필수다. + + Expected Misconception: + 그룹화된 점을 모두 같은 무게로 두어도 회귀선이 비슷할 것이라고 느끼기 쉽다. + + Visual Pivot: + 개별자료 산점도가 교육연수별 큰 버블로 압축되고, + 마지막에 가중 선과 비가중 선의 기울기 차이가 한 화면에서 갈라진다. + + Notebook Reference: + book/regression/06-Grouped-and-Dummy-Regression_minimal_ko.ipynb + - Cell 0: grouped regression 도입 + - Cell 2: wage.csv 범위 + - Cell 4-6: grouped regression, weighted vs unweighted 비교 + + Script Reference: + src/scripts/01_grouped_regression_weights.txt + + 3Blue1Brown Reference: + 3b1b/_2020/covid.py - IntroQuestion + Reason: + 한 화면의 비교 구조를 점진적으로 쌓고 마지막 대비를 크게 남기는 리듬을 참고했다. + + Script-to-Beat Mapping: + 1. chunk 1-2: grouped regression과 데이터 범위 도입 + 2. chunk 3-4: 개별자료와 그룹화된 자료의 대응 + 3. chunk 5-7: 같은 점이 아니라는 설명과 큰 집단 강조 + 4. chunk 8-10: 가중 선과 비가중 선 비교 + 5. chunk 11: 결론 정리 + """ + + WAIT_TAIL = 1.5 + + def construct(self): + durations = load_scene_timing_durations("01_grouped_regression_weights") + sample, grouped, individual_fit, weighted_fit, unweighted_fit = load_grouped_regression_data() + + axes = Axes( + x_range=[8, 18, 2], + y_range=[0.5, 2.0, 0.25], + x_length=8.4, + y_length=4.6, + axis_config={"include_numbers": False, "stroke_width": 2.4, "color": GREY_C}, + ) + axes.move_to(DOWN * 0.45) + x_label = Text("교육연수", font_size=24, color=SOFT).next_to(axes.x_axis, DOWN, buff=0.28) + y_label = Text("로그 시간당 임금", font_size=24, color=SOFT).rotate(PI / 2).next_to(axes.y_axis, LEFT, buff=0.28) + title = Text("그룹화 회귀에는 가중치가 필요하다", font_size=34, weight=BOLD, color=ACCENT) + title.to_edge(UP) + + intro = Text("집단 평균 + 집단 크기", font_size=28, color=ACCENT) + intro.next_to(title, DOWN, buff=0.25) + scope = Text("wage.csv", font_size=28, weight=BOLD, color=WHITE) + scope.next_to(intro, DOWN, buff=0.2) + + dots = VGroup( + *[ + Dot(axes.c2p(row.educ, row.lhwage), radius=0.045, color=POINT_COLOR, fill_opacity=0.45, stroke_opacity=0.45) + for row in sample.itertuples() + ] + ) + individual_line = make_line(axes, float(individual_fit[0]), float(individual_fit[1]), color=WHITE) + + bubble_mobs = VGroup() + for row in grouped.itertuples(): + bubble = Circle(radius=0.12 + 0.004 * row.count, color=WEIGHTED, stroke_width=3) + bubble.set_fill(WEIGHTED, opacity=0.16) + bubble.move_to(axes.c2p(row.educ, row.lhwage)) + bubble_mobs.add(bubble) + + weighted_line = make_line(axes, float(weighted_fit[0]), float(weighted_fit[1]), WEIGHTED) + unweighted_line = make_line(axes, float(unweighted_fit[0]), float(unweighted_fit[1]), UNWEIGHTED) + + big_label = Text("큰 집단 = 더 안정적", font_size=26, color=WEIGHTED, weight=BOLD) + big_label.move_to(RIGHT * 3.0 + UP * 2.3) + equal_weight = Text("같은 무게로 두면 안 된다", font_size=26, color=UNWEIGHTED, weight=BOLD) + equal_weight.move_to(RIGHT * 2.6 + UP * 2.3) + + legend = VGroup( + VGroup(Line(ORIGIN, RIGHT * 0.7, color=WEIGHTED, stroke_width=5), Text("가중 선", font_size=22)).arrange(RIGHT, buff=0.2), + VGroup(Line(ORIGIN, RIGHT * 0.7, color=UNWEIGHTED, stroke_width=5), Text("비가중 선", font_size=22)).arrange(RIGHT, buff=0.2), + ).arrange(DOWN, aligned_edge=LEFT, buff=0.2) + legend.to_corner(UR).shift(DOWN * 0.6 + LEFT * 0.1) + + close_text = Text("mean과 count를 함께 주면 된다", font_size=30, weight=BOLD, color=ACCENT) + close_text.move_to(UP * 0.35) + close_sub = Text("weighted regression keeps the slope honest", font_size=22, color=SOFT) + close_sub.next_to(close_text, DOWN, buff=0.25) + + # Beat 1 + # 남는 요소: 제목 + # 새로 등장: 제목, 범위 문구 + # 비워 두는 영역: 중앙 전체 + # 핵심 시선 대상: 집단 평균 + 집단 크기 문구 + self.play(FadeIn(title, shift=DOWN * 0.15), run_time=0.8) + self.play(FadeIn(intro, shift=UP * 0.12), run_time=0.7) + self.wait(max(0.2, durations[0] - 1.5)) + self.play(FadeIn(scope, shift=UP * 0.1), run_time=0.7) + self.wait(max(0.2, durations[1] - 0.7)) + + # Beat 2 + # 남는 요소: 제목, 축 + # 새로 등장: 개별자료 점, 개별자료 회귀선, 그룹 버블 + # 비워 두는 영역: 우상단 일부 + # 핵심 시선 대상: 개별자료 산점도 + self.play( + FadeOut(intro), + FadeOut(scope), + Create(axes), + FadeIn(x_label), + FadeIn(y_label), + FadeIn(dots, lag_ratio=0.02), + run_time=1.4, + ) + self.play(Create(individual_line), run_time=1.0) + self.wait(max(0.2, durations[2] - 2.4)) + self.play(ReplacementTransform(dots.copy(), bubble_mobs), run_time=1.2) + self.wait(max(0.2, durations[3] - 1.2)) + + # Beat 3 + # 남는 요소: 제목, 축, 버블 + # 새로 등장: 큰 집단 강조 문구 + # 비워 두는 영역: 좌상단 + # 핵심 시선 대상: 버블 크기 차이 + self.play(FadeOut(dots), FadeOut(individual_line), run_time=0.7) + self.wait(max(0.2, durations[4] - 0.7)) + biggest = bubble_mobs[grouped["count"].idxmax()] + self.play(Indicate(biggest, color=WEIGHTED), FadeIn(big_label, shift=UP * 0.1), run_time=1.0) + self.wait(max(0.2, durations[5] - 1.0)) + self.play(Circumscribe(biggest, color=WEIGHTED), run_time=0.9) + self.wait(max(0.2, durations[6] - 0.9)) + + # Beat 4 + # 남는 요소: 제목, 축, 버블 + # 새로 등장: 가중 선, 비가중 선, 범례 + # 비워 두는 영역: 좌하단 일부 + # 핵심 시선 대상: 두 선의 기울기 차이 + self.play(FadeOut(big_label), Create(weighted_line), run_time=1.0) + self.wait(max(0.2, durations[7] - 1.0)) + self.play(Create(unweighted_line), FadeIn(equal_weight, shift=UP * 0.1), run_time=1.0) + self.wait(max(0.2, durations[8] - 1.0)) + self.play(FadeIn(legend, shift=LEFT * 0.1), run_time=0.8) + self.wait(max(0.2, durations[9] - 0.8)) + + # Beat 5 + # 남는 요소: 제목 + # 새로 등장: 결론 문구 + # 비워 두는 영역: 하단 일부 + # 핵심 시선 대상: 결론 문구 + self.play( + FadeOut(axes), + FadeOut(x_label), + FadeOut(y_label), + FadeOut(bubble_mobs), + FadeOut(weighted_line), + FadeOut(unweighted_line), + FadeOut(equal_weight), + FadeOut(legend), + FadeIn(close_text, shift=UP * 0.15), + FadeIn(close_sub, shift=UP * 0.15), + run_time=1.2, + ) + self.wait(max(0.2, durations[10] - 1.2)) + self.wait(self.WAIT_TAIL) diff --git a/videos/grouped_dummy_regression/src/scripts/01_grouped_regression_weights.txt b/videos/grouped_dummy_regression/src/scripts/01_grouped_regression_weights.txt new file mode 100644 index 0000000..76874c5 --- /dev/null +++ b/videos/grouped_dummy_regression/src/scripts/01_grouped_regression_weights.txt @@ -0,0 +1,38 @@ +그룹화 회귀는 집계된 데이터에서도 같은 핵심 아이디어를 복원할 수 있습니다. + +이번에는 wage.csv 하나만 사용해서 그 점을 확인해 보겠습니다. + +먼저 각 노동자를 한 줄씩 가진 개별자료를 생각해 보겠습니다. +교육연수와 로그 시간당 임금의 관계를 개별자료로 회귀하면, +우리는 교육이 늘어날 때 임금이 어떻게 함께 움직이는지 하나의 기울기로 요약할 수 있습니다. + +이제 같은 데이터를 교육연수별로 묶어서, +각 집단의 평균 로그 시간당 임금과 집단 크기만 남겨 보겠습니다. + +이렇게 하면 데이터는 훨씬 짧아지지만, +모든 점이 같은 정보를 담고 있는 것은 아닙니다. + +어떤 교육연수 구간은 관측치가 많고, +어떤 구간은 관측치가 적습니다. +그러므로 그룹화된 점을 모두 같은 무게로 취급하면 안 됩니다. + +표본 수가 큰 집단의 평균은 더 안정적이고, +회귀에서도 더 큰 비중을 받아야 합니다. + +그래서 그룹화된 데이터에는 가중치를 둔 회귀를 사용합니다. +집단 크기를 가중치로 주면, +가중 그룹화 회귀의 교육 계수는 개별자료 회귀의 기울기와 매우 가까워집니다. + +반대로 가중치 없이 그룹화 회귀를 돌리면, +작은 집단도 큰 집단과 같은 영향력을 갖게 됩니다. +그러면 회귀선이 작은 집단 쪽으로 더 많이 끌려가고, +기울기도 달라집니다. + +산점도에서 점의 크기는 집단 크기입니다. +큰 점을 더 무겁게 반영한 선이 우리가 원하는 선이고, +비가중 선은 그 정보를 충분히 반영하지 못합니다. + +결론은 간단합니다. +개인 데이터를 직접 받지 못하더라도, +집단 평균과 집단 크기만 있으면 회귀의 핵심 구조를 상당 부분 복원할 수 있습니다. +다만 그때는 반드시 가중치를 함께 써야 합니다. diff --git a/videos/iv/src/build_notebooks.py b/videos/iv/src/build_notebooks.py new file mode 100644 index 0000000..87698f9 --- /dev/null +++ b/videos/iv/src/build_notebooks.py @@ -0,0 +1,471 @@ +"""Build book/iv/iv_ko.ipynb and iv_en.ipynb from inline cell specs. + +Run from repo root: + python videos/iv/src/build_notebooks.py + +Pattern mirrors book/why_causal_inference/why_causal_inference_{ko,en}.ipynb: +- Section headers as markdown +- Math via LaTeX +- DAGs via graphviz +- Tables / simulations via pandas+numpy +- References at the end +""" + +from __future__ import annotations + +from pathlib import Path + +import nbformat as nbf + + +REPO_ROOT = Path(__file__).resolve().parents[3] +BOOK_DIR = REPO_ROOT / "book" / "iv" + + +def md(text: str) -> nbf.NotebookNode: + return nbf.v4.new_markdown_cell(text) + + +def code(text: str) -> nbf.NotebookNode: + return nbf.v4.new_code_cell(text) + + +# ─────────────────────────────────────────────────────────────────── +# Korean notebook content +# ─────────────────────────────────────────────────────────────────── + +KO_CELLS: list[nbf.NotebookNode] = [ + md( + "**🌐 언어:** **한국어** | [English →](/iv-en)\n\n" + "# 도구변수(Instrumental Variables) 한눈에 보기\n\n" + "인과추론 동료 학습 자료 · " + "동반 영상: Causal Studio" + ), + md( + "이 노트북은 7분짜리 동반 영상의 내용을 글과 코드로 풀어 놓은 자료입니다.\n\n" + "전제 지식은 다음과 같습니다.\n" + "- 선형회귀(OLS)의 의미\n" + "- 무작위 배정(RCT)이 왜 인과효과를 깨끗하게 추정할 수 있는지\n" + "- 단순 평균 차이에 편향이 섞일 수 있다는 직관\n\n" + "여기서 더 나아가, 무작위 배정이 불가능한 현실에서 \"우리가 손에 쥔 다른 무작위성\"을 이용해 " + "인과효과를 짚어 내는 방법, 즉 **도구변수**를 다룹니다." + ), + md( + "## 1) 도입: 1854년 런던, 존 스노우의 우연\n\n" + "1854년 런던에 콜레라가 휩쓸 때, 의사 존 스노우(John Snow)는 거리마다 사망률이 크게 다르다는 사실에 주목했습니다. " + "당시 런던에는 두 곳의 수도 회사가 가정에 물을 공급했는데, 한 회사(Lambeth)는 상류의 깨끗한 물을, 다른 회사(Southwark & Vauxhall)는 하수가 섞인 강물을 끌어다 썼습니다.\n\n" + "결정적으로, **어느 회사의 물이 어느 거리로 들어가는지는 가정의 형편이나 위생 습관과 거의 무관**했습니다. 거리마다 미리 깔린 배관망의 차이였을 뿐이죠.\n\n" + "스노우는 이 우연을 붙잡았습니다. 실험자가 직접 동전을 던질 수 없는 상황에서, **자연이 던진 동전**이 도시 안에 이미 존재했던 셈입니다.\n\n" + "도구변수(Instrumental Variable, IV)는 바로 이런 \"현실 속 우연\"을 찾아 인과효과를 짚어 내는 도구입니다." + ), + md( + "## 2) 표기법과 출발점\n\n" + "도구변수를 이야기하기 위해 세 가지 변수를 도입합니다.\n\n" + "- $Z$ : **도구변수**. 실험자 또는 자연이 던진 동전. (예: 태블릿 배정 여부, 추첨 번호)\n" + "- $T$ : **처치**. 실제로 받은 처치 여부. (예: 태블릿을 실제로 사용했는가)\n" + "- $Y$ : **결과**. 우리가 알고 싶은 결과 변수. (예: 학업 성취도)\n\n" + "그리고 잠재적 결과(potential outcomes) 표기:\n\n" + "- $Y_0$ : 처치를 받지 않았을 때의 잠재적 결과\n" + "- $Y_1$ : 처치를 받았을 때의 잠재적 결과\n\n" + "이전 챕터에서 본 평균 처치 효과는 $ATE = E[Y_1 - Y_0]$이었습니다. " + "이번 챕터의 핵심 결과는 **모든 사람의 평균이 아니라 일부 사람(순응자)의 평균에 한정된 효과**, 즉 **LATE**가 됩니다." + ), + md( + "## 3) 비순응으로 단순 비교가 깨진다\n\n" + "이전 챕터의 태블릿 RCT를 다시 가져옵시다. 연구진이 동전을 던져 일부 학교에는 태블릿을 \"배정\"했습니다. " + "그런데 현실에서는 두 가지 일이 동시에 벌어집니다.\n\n" + "1. **처치 배정 학교 중 일부가 태블릿을 거부**합니다 (\"교사가 쓰기 싫어요\", \"보관할 곳이 없어요\").\n" + "2. **통제 배정 학교 중 일부가 사비로 태블릿을 구매**합니다 (\"우리는 어쨌든 쓸래요\").\n\n" + "이 상황에서 \"실제 처치 여부\"로 두 집단의 평균을 비교하면, 두 집단은 더 이상 비교 가능하지 않습니다. " + "거부한 학교는 새 기술에 회의적인 곳일 가능성이 높고, 사비로 산 학교는 원래 의지가 강한 곳일 가능성이 높기 때문입니다.\n\n" + "**배정($Z$)은 무작위지만, 실제 처치($T$)는 무작위가 아닙니다.** 작은 시뮬레이션으로 이 깨짐을 확인해 봅시다." + ), + code( + "import numpy as np\n" + "import pandas as pd\n\n" + "rng = np.random.default_rng(2026)\n" + "n = 4000\n\n" + "# 학교의 잠재적 처치-반응 유형: 60% 순응자, 20% 언제나 받음, 20% 절대 안 받음\n" + "compliance_type = rng.choice(\n" + " [\"complier\", \"always_taker\", \"never_taker\"],\n" + " size=n, p=[0.60, 0.20, 0.20],\n" + ")\n\n" + "# 동전 배정: 절반에게 처치 배정\n" + "Z = rng.binomial(1, 0.5, n)\n\n" + "# 실제 처치 T는 유형 + 배정에 따라 결정\n" + "T = np.where(\n" + " compliance_type == \"complier\", Z, # 순응자: 배정 = 처치\n" + " np.where(compliance_type == \"always_taker\", 1, 0) # 언제나/절대\n" + ")\n\n" + "# 결과 Y: 진짜 처치 효과는 +5점. 단, 순응자와 그 외 그룹의 기본 점수가 다르다.\n" + "baseline = np.where(\n" + " compliance_type == \"complier\", 70,\n" + " np.where(compliance_type == \"always_taker\", 80, 60)\n" + ")\n" + "true_effect = 5 # 진짜 LATE\n" + "Y = baseline + true_effect * T + rng.normal(0, 5, n)\n\n" + "df = pd.DataFrame(dict(Z=Z, T=T, Y=Y, type=compliance_type))\n" + "df.head()" + ), + code( + "# 단순 비교: 실제 처치 받은 학교 vs 받지 않은 학교\n" + "naive_diff = df.loc[df[\"T\"] == 1, \"Y\"].mean() - df.loc[df[\"T\"] == 0, \"Y\"].mean()\n" + "print(f\"단순 평균 차이 (실제 T 기준): {naive_diff:+.2f}\")\n" + "print(f\"진짜 처치 효과: {true_effect:+.2f}\")" + ), + md( + "단순 평균 차이는 진짜 처치 효과(+5점)와 크게 어긋납니다. " + "이유는 단순합니다. 실제 처치를 받은 학교에는 \"언제나 받음(기본 점수 80)\"이 더 많고, 받지 않은 학교에는 \"절대 안 받음(기본 점수 60)\"이 더 많기 때문입니다. " + "**유형 차이가 평균 차이로 흘러 들어와** 편향을 만든 것입니다.\n\n" + "배정($Z$)으로 비교하면 어떨까요?" + ), + code( + "itt = df.loc[df[\"Z\"] == 1, \"Y\"].mean() - df.loc[df[\"Z\"] == 0, \"Y\"].mean()\n" + "print(f\"배정(ITT) 차이: {itt:+.2f}\")" + ), + md( + "ITT(Intention-to-Treat) 차이는 약 +3점 부근으로 나옵니다. " + "이 값은 \"동전을 던졌을 때 평균적으로 점수가 얼마나 달라지는가\"를 말해 줍니다. " + "편향은 없지만, **진짜 처치 효과보다 작게** 측정됩니다. 동전을 따른 사람이 일부(순응자)뿐이기 때문입니다.\n\n" + "도구변수의 핵심 아이디어는, **이 작은 차이를 \"실제로 움직인 사람의 비율\"로 환산**하면 한 명의 순응자에게 처치가 만든 효과가 나온다는 것입니다." + ), + md( + "## 4) 세 가지 유형: 순응자, 언제나 받음, 절대 안 받음\n\n" + "동전 $Z$가 사람들을 움직이는 방식은 세 가지로 나뉩니다.\n\n" + "| 유형 | $Z = 1$일 때 $T$ | $Z = 0$일 때 $T$ | 비고 |\n" + "|---|:---:|:---:|---|\n" + "| **순응자** (Complier) | 1 | 0 | 동전을 따른다 |\n" + "| **언제나 받음** (Always-taker) | 1 | 1 | 동전과 무관 |\n" + "| **절대 안 받음** (Never-taker) | 0 | 0 | 동전과 무관 |\n" + "| Defier (배반자) | 0 | 1 | 일반적으로 존재하지 않는다고 가정 |\n\n" + "도구변수가 짚어 내는 효과는 **오직 순응자에 한정**됩니다. " + "동전이 흔들지 않은 두 그룹(언제나 받음, 절대 안 받음)은 비교에 들어가도 차이를 만들지 않기 때문입니다. " + "이것이 LATE(Local Average Treatment Effect)의 정의입니다." + ), + md( + "## 5) 와알드 추정량: 숫자로 구하는 LATE\n\n" + "$$\n" + "\\text{LATE} \\;=\\; \\frac{E[Y \\mid Z=1] - E[Y \\mid Z=0]}{E[T \\mid Z=1] - E[T \\mid Z=0]}\n" + "$$\n\n" + "- 분자: **ITT** — 동전이 만든 결과 차이.\n" + "- 분모: **순응자 비율** — 동전이 실제로 움직인 사람의 몫.\n\n" + "둘을 나누면 \"한 명의 순응자에게 처치가 만든 효과\"가 됩니다. " + "이 식을 와알드(Wald) 추정량이라고 부르며, 가장 단순한 도구변수 추정의 형태입니다." + ), + code( + "num = df.loc[df[\"Z\"] == 1, \"Y\"].mean() - df.loc[df[\"Z\"] == 0, \"Y\"].mean()\n" + "den = df.loc[df[\"Z\"] == 1, \"T\"].mean() - df.loc[df[\"Z\"] == 0, \"T\"].mean()\n" + "wald = num / den\n" + "print(f\"ITT (분자): {num:+.3f}\")\n" + "print(f\"순응자 비율 (분모): {den:.3f}\")\n" + "print(f\"와알드 추정량: {wald:+.3f}\")\n" + "print(f\"진짜 LATE: {true_effect:+.3f}\")" + ), + md( + "와알드 추정량은 진짜 처치 효과(+5점)와 거의 일치합니다. " + "단순 평균 차이는 유형 구성에 오염되어 있었지만, 동전이 만들어 낸 차이만을 골라내고 동전이 움직인 비율로 환산하면 깨끗한 효과가 회복됩니다.\n\n" + "실무에서는 같은 추정을 **2SLS(Two-Stage Least Squares)**로 합니다. 1단계에서 $T$를 $Z$로 회귀해 적합값 $\\hat T$를 만들고, 2단계에서 $Y$를 $\\hat T$로 회귀합니다." + ), + code( + "import statsmodels.api as sm\n\n" + "# 1단계: T ~ Z\n" + "first = sm.OLS(df[\"T\"], sm.add_constant(df[\"Z\"])).fit()\n" + "df[\"T_hat\"] = first.predict(sm.add_constant(df[\"Z\"]))\n\n" + "# 2단계: Y ~ T_hat\n" + "second = sm.OLS(df[\"Y\"], sm.add_constant(df[\"T_hat\"])).fit()\n" + "print(f\"2SLS 추정 처치 효과: {second.params['T_hat']:+.3f}\")" + ), + md( + "## 6) 도구변수의 세 가지 가정\n\n" + "와알드 식이 **인과효과**를 추정하려면 다음 세 조건이 모두 만족되어야 합니다. " + "하나라도 깨지면 결과를 인과적으로 해석할 수 없습니다.\n\n" + "**(a) 적합성 (Relevance)** — $Z$가 $T$를 실제로 움직여야 한다.\n" + "$$\\operatorname{Cov}(Z, T) \\neq 0$$\n" + "$Z$가 $T$를 거의 움직이지 못하면 분모가 0에 가까워져 추정량이 폭주합니다. \"약한 도구(weak instrument)\" 문제입니다.\n\n" + "**(b) 배제 조건 (Exclusion Restriction)** — $Z$가 $Y$에 미치는 영향은 오직 $T$를 거쳐야 한다.\n" + "태블릿을 받았다는 통보 자체가 — 태블릿을 쓰지 않더라도 — 학교 분위기를 바꾼다면 이 조건은 깨집니다.\n\n" + "**(c) 독립성 (Independence)** — $Z$는 잠재적 결과와 독립이어야 한다.\n" + "$$(Y_0, Y_1) \\perp Z$$\n" + "RCT 배정이라면 설계상 만족됩니다. 자연이 던진 동전이라면, 정말 우연이었는지 따져 보아야 합니다.\n\n" + "DAG로 그리면 다음과 같습니다." + ), + code( + "import graphviz as gr\n\n" + "g = gr.Digraph()\n" + "g.attr(rankdir=\"LR\")\n" + "g.node(\"Z\", \"Z (도구변수)\", color=\"orange\", fontcolor=\"orange\")\n" + "g.node(\"T\", \"T (처치)\")\n" + "g.node(\"Y\", \"Y (결과)\")\n" + "g.node(\"U\", \"U (관측되지 않은 교란)\", style=\"dashed\")\n\n" + "g.edge(\"Z\", \"T\")\n" + "g.edge(\"T\", \"Y\")\n" + "g.edge(\"U\", \"T\", style=\"dashed\")\n" + "g.edge(\"U\", \"Y\", style=\"dashed\")\n\n" + "g" + ), + md( + "위 DAG에서 $U$는 $T$와 $Y$ 양쪽에 영향을 주는 관측되지 않은 교란입니다. " + "단순 회귀 $Y \\sim T$는 이 $U$ 때문에 편향됩니다. " + "하지만 $Z$가 $U$와 무관하고, $Z \\to Y$ 경로가 $T$를 거쳐서만 존재한다면, $Z$를 통해 \"오염되지 않은\" 변동만 골라 $T \\to Y$ 효과를 식별할 수 있습니다." + ), + md( + "## 7) 국가 규모 사례: 베트남 징집 추첨 (Angrist 1990)\n\n" + "1969년 미국. 베트남 전쟁을 위한 징집을 추첨 방식으로 결정했습니다. " + "생일 365일이 적힌 공이 뽑혀, 낮은 번호가 뽑힌 사람부터 입대했습니다. **태어난 날짜는 본인이 고를 수 없고**, 추첨 번호는 학력·직업·집안과 무관했습니다. 거의 완벽한 자연의 동전이었습니다.\n\n" + "경제학자 조슈아 앵그리스트(Joshua Angrist)는 이 추첨을 도구변수로 써서 **군 복무가 평생 소득에 미친 효과**를 추정했습니다.\n\n" + "- $Z$ : 추첨 번호 기반 입대 자격\n" + "- $T$ : 실제 군 복무 여부\n" + "- $Y$ : 이후 소득\n\n" + "단순히 참전 군인과 비참전 군인의 소득을 비교하면 \"참전을 선택한 사람\"과 \"회피한 사람\"의 차이가 섞여 들어옵니다. " + "추첨 번호를 도구변수로 두면, 우연이 움직인 부분만 분리해 깨끗한 효과(LATE)를 얻을 수 있습니다.\n\n" + "Angrist(1990)는 이 방법으로 군 복무가 백인 남성의 이후 소득을 약 **15% 감소**시킨 것으로 추정했습니다. 이는 \"참전 = 경험치 + 네트워크 = 소득 증가\"라는 단순 해석이 편향되어 있음을 보여 준 대표적 결과입니다." + ), + md( + "## 8) 정리\n\n" + "- **단순 평균 차이**: 교란이 있으면 인과효과와 일치하지 않는다.\n" + "- **RCT**: 무작위 배정으로 편향을 제거하지만, 비순응이 끼어들면 \"실제 처치\" 기준 비교는 다시 깨진다.\n" + "- **도구변수 (IV)**: 무작위 배정이 불가능한 현실에서, 실제로 처치에는 영향을 주지만 결과에는 처치를 통해서만 영향을 주는 변수 $Z$를 찾아 \"우연이 움직인 부분만\" 분리해 효과를 식별한다.\n" + "- **와알드 추정량 / 2SLS**: ITT를 순응자 비율로 나눈 비율. 식별되는 효과는 LATE, 즉 **순응자에 한정된 평균 처치 효과**다.\n" + "- **세 자물쇠**: 적합성, 배제 조건, 독립성. 모두 만족해야 도구변수의 문이 열린다.\n\n" + "도구변수 분석에서 가장 어려운 일은 수식이 아니라 **현실 속에서 그럴듯한 우연을 찾아내는 일**입니다. 스노우의 수도 회사, 앵그리스트의 추첨, 또 어쩌면 여러분의 생일이 그런 우연이 될 수 있습니다." + ), + md( + "## 참고 자료\n\n" + "- Angrist, J. D. (1990). *Lifetime Earnings and the Vietnam Era Draft Lottery: Evidence from Social Security Administrative Records.* American Economic Review, 80(3), 313–336.\n" + "- Imbens, G. W., & Angrist, J. D. (1994). *Identification and Estimation of Local Average Treatment Effects.* Econometrica, 62(2), 467–475.\n" + "- Angrist, J. D., & Pischke, J.-S. (2009). *Mostly Harmless Econometrics: An Empiricist's Companion.* Princeton University Press. (Ch. 4)\n" + "- Snow, J. (1855). *On the Mode of Communication of Cholera.* John Churchill.\n" + "- Matheus Facure, *Python Causality Handbook*: [08 - Instrumental Variables](https://matheusfacure.github.io/python-causality-handbook/08-Instrumental-Variables.html)\n" + "- 동반 영상: [Causal Studio · IV in a Nutshell (KO)](https://www.youtube.com/@CausalStudio)" + ), +] + + +# ─────────────────────────────────────────────────────────────────── +# English notebook content +# ─────────────────────────────────────────────────────────────────── + +EN_CELLS: list[nbf.NotebookNode] = [ + md( + "**🌐 Language:** **English** | [한국어 →](/iv-ko)\n\n" + "# Instrumental Variables in a Nutshell\n\n" + "Causal inference peer-learning material · " + "Companion video: Causal Studio" + ), + md( + "This notebook is the written-and-coded counterpart of a 7-minute companion video.\n\n" + "Prerequisites:\n" + "- Linear regression (OLS)\n" + "- Why random assignment (RCTs) gives a clean estimate of a causal effect\n" + "- The intuition that simple mean differences can be biased\n\n" + "We build on those by asking: when random assignment is *not* possible, can we use some other randomness already lying around in the real world to identify a causal effect? " + "That's the **instrumental variable**." + ), + md( + "## 1) The Snow story: a coin flipped by nature\n\n" + "When cholera devastated London in 1854, the physician John Snow noticed that death rates varied wildly from street to street. " + "At the time, two companies piped water into London homes — Lambeth, which drew clean water from upstream, and Southwark & Vauxhall, which drew sewage-mixed water from the lower Thames.\n\n" + "Crucially, **which company served which street had almost nothing to do with the household's income or hygiene**. It was a matter of which pipes had been laid decades earlier.\n\n" + "Snow exploited that accident. The experimenter (Snow) couldn't flip a coin to decide who drank clean water, but **nature had already flipped one** on his behalf.\n\n" + "An instrumental variable (IV) is exactly this kind of tool — one that catches accidents already present in the real world and uses them to pin down a causal effect." + ), + md( + "## 2) Notation\n\n" + "We need three variables:\n\n" + "- $Z$ : the **instrument** — a coin flipped by the experimenter or by nature. (e.g., tablet assignment, lottery number)\n" + "- $T$ : the **treatment actually taken**. (e.g., whether the school actually used the tablets)\n" + "- $Y$ : the **outcome** we care about. (e.g., test scores)\n\n" + "Plus potential outcomes:\n\n" + "- $Y_0$ : the potential outcome under no treatment\n" + "- $Y_1$ : the potential outcome under treatment\n\n" + "The previous chapter introduced the average treatment effect, $ATE = E[Y_1 - Y_0]$. " + "This chapter's main quantity is **an effect restricted to a particular subgroup (the compliers)** — the **LATE**." + ), + md( + "## 3) Non-compliance breaks the naive comparison\n\n" + "Take the tablet RCT from the previous chapter. Researchers flipped a coin and \"assigned\" some schools to receive tablets. In the real world, two things happen at once.\n\n" + "1. **Some assigned-treatment schools refuse the tablets** (\"the teachers don't want them\", \"nowhere to store them\").\n" + "2. **Some assigned-control schools buy tablets with their own budget** (\"we're going to use them anyway\").\n\n" + "If we now compare \"actually treated\" vs. \"actually untreated\", the two groups are no longer comparable. " + "Refusers are probably skeptical of new tech; self-buyers are probably more motivated to begin with.\n\n" + "**Assignment ($Z$) is random, but actual treatment ($T$) is not.** A small simulation makes this concrete." + ), + code( + "import numpy as np\n" + "import pandas as pd\n\n" + "rng = np.random.default_rng(2026)\n" + "n = 4000\n\n" + "# Each school has a latent compliance type: 60% compliers, 20% always-takers, 20% never-takers.\n" + "compliance_type = rng.choice(\n" + " [\"complier\", \"always_taker\", \"never_taker\"],\n" + " size=n, p=[0.60, 0.20, 0.20],\n" + ")\n\n" + "# Random assignment: half get assigned to treatment.\n" + "Z = rng.binomial(1, 0.5, n)\n\n" + "# Actual treatment T depends on type AND assignment.\n" + "T = np.where(\n" + " compliance_type == \"complier\", Z, # complier: assignment = treatment\n" + " np.where(compliance_type == \"always_taker\", 1, 0) # always / never\n" + ")\n\n" + "# Outcome Y: true treatment effect = +5. But baseline scores differ by type.\n" + "baseline = np.where(\n" + " compliance_type == \"complier\", 70,\n" + " np.where(compliance_type == \"always_taker\", 80, 60)\n" + ")\n" + "true_effect = 5 # true LATE\n" + "Y = baseline + true_effect * T + rng.normal(0, 5, n)\n\n" + "df = pd.DataFrame(dict(Z=Z, T=T, Y=Y, type=compliance_type))\n" + "df.head()" + ), + code( + "# Naive comparison: actually-treated vs actually-untreated\n" + "naive_diff = df.loc[df[\"T\"] == 1, \"Y\"].mean() - df.loc[df[\"T\"] == 0, \"Y\"].mean()\n" + "print(f\"Naive mean difference (by actual T): {naive_diff:+.2f}\")\n" + "print(f\"True treatment effect: {true_effect:+.2f}\")" + ), + md( + "The naive difference is far from the true effect of +5. " + "Why? The actually-treated pool is rich in always-takers (baseline 80) and the actually-untreated pool is rich in never-takers (baseline 60). " + "**Type composition leaks into the mean difference** and becomes bias.\n\n" + "What if we compare by assignment ($Z$) instead?" + ), + code( + "itt = df.loc[df[\"Z\"] == 1, \"Y\"].mean() - df.loc[df[\"Z\"] == 0, \"Y\"].mean()\n" + "print(f\"ITT (assignment) difference: {itt:+.2f}\")" + ), + md( + "The intention-to-treat difference lands somewhere around +3 — unbiased, but **smaller than the true effect**, because only some of the schools (the compliers) actually moved with the coin.\n\n" + "IV's core idea: **divide this small assignment-driven difference by the share of people the coin actually moved** to recover the effect on one mover." + ), + md( + "## 4) Three types: complier, always-taker, never-taker\n\n" + "Here is how the coin $Z$ moves people, organized by type:\n\n" + "| Type | $T$ when $Z = 1$ | $T$ when $Z = 0$ | Note |\n" + "|---|:---:|:---:|---|\n" + "| **Complier** | 1 | 0 | follows the coin |\n" + "| **Always-taker** | 1 | 1 | ignores the coin |\n" + "| **Never-taker** | 0 | 0 | ignores the coin |\n" + "| Defier | 0 | 1 | assumed not to exist (monotonicity) |\n\n" + "IV recovers an effect for **the compliers only**, because the always-takers and never-takers behave the same in both arms and contribute nothing to the difference. " + "This is the **Local Average Treatment Effect (LATE)**." + ), + md( + "## 5) The Wald estimator: LATE in numbers\n\n" + "$$\n" + "\\text{LATE} \\;=\\; \\frac{E[Y \\mid Z=1] - E[Y \\mid Z=0]}{E[T \\mid Z=1] - E[T \\mid Z=0]}\n" + "$$\n\n" + "- Numerator: **ITT** — the effect the coin produced on the outcome.\n" + "- Denominator: **share of compliers** — the fraction the coin actually moved.\n\n" + "Dividing one by the other gives the effect of treatment on a single complier. " + "This is the Wald estimator — the simplest form of IV estimation." + ), + code( + "num = df.loc[df[\"Z\"] == 1, \"Y\"].mean() - df.loc[df[\"Z\"] == 0, \"Y\"].mean()\n" + "den = df.loc[df[\"Z\"] == 1, \"T\"].mean() - df.loc[df[\"Z\"] == 0, \"T\"].mean()\n" + "wald = num / den\n" + "print(f\"ITT (numerator): {num:+.3f}\")\n" + "print(f\"Compliers share (denom): {den:.3f}\")\n" + "print(f\"Wald estimator: {wald:+.3f}\")\n" + "print(f\"True LATE: {true_effect:+.3f}\")" + ), + md( + "The Wald estimator lines up with the true effect (+5). " + "The naive comparison was contaminated by type composition; the Wald formula isolates the part the coin actually moved and rescales it by the compliers' share.\n\n" + "In practice, the same estimate is computed via **2SLS (Two-Stage Least Squares)**: first regress $T$ on $Z$ to get fitted values $\\hat T$, then regress $Y$ on $\\hat T$." + ), + code( + "import statsmodels.api as sm\n\n" + "# Stage 1: T ~ Z\n" + "first = sm.OLS(df[\"T\"], sm.add_constant(df[\"Z\"])).fit()\n" + "df[\"T_hat\"] = first.predict(sm.add_constant(df[\"Z\"]))\n\n" + "# Stage 2: Y ~ T_hat\n" + "second = sm.OLS(df[\"Y\"], sm.add_constant(df[\"T_hat\"])).fit()\n" + "print(f\"2SLS estimated treatment effect: {second.params['T_hat']:+.3f}\")" + ), + md( + "## 6) Three assumptions for a valid instrument\n\n" + "For the Wald formula to deliver a **causal** quantity, three conditions must hold simultaneously. If any one fails, the estimate is no longer causally interpretable.\n\n" + "**(a) Relevance** — $Z$ must actually move $T$.\n" + "$$\\operatorname{Cov}(Z, T) \\neq 0$$\n" + "If $Z$ barely moves $T$, the denominator approaches zero and the estimator explodes — the \"weak instrument\" problem.\n\n" + "**(b) Exclusion restriction** — $Z$ can affect $Y$ only through $T$.\n" + "If being assigned tablets changes school morale even when no tablets are used, exclusion is broken.\n\n" + "**(c) Independence** — $Z$ must be independent of the potential outcomes.\n" + "$$(Y_0, Y_1) \\perp Z$$\n" + "In an RCT this is satisfied by design. For a coin flipped by nature, you must argue it case by case.\n\n" + "As a DAG:" + ), + code( + "import graphviz as gr\n\n" + "g = gr.Digraph()\n" + "g.attr(rankdir=\"LR\")\n" + "g.node(\"Z\", \"Z (instrument)\", color=\"orange\", fontcolor=\"orange\")\n" + "g.node(\"T\", \"T (treatment)\")\n" + "g.node(\"Y\", \"Y (outcome)\")\n" + "g.node(\"U\", \"U (unobserved confounder)\", style=\"dashed\")\n\n" + "g.edge(\"Z\", \"T\")\n" + "g.edge(\"T\", \"Y\")\n" + "g.edge(\"U\", \"T\", style=\"dashed\")\n" + "g.edge(\"U\", \"Y\", style=\"dashed\")\n\n" + "g" + ), + md( + "$U$ is an unobserved variable that affects both $T$ and $Y$. " + "A naive regression $Y \\sim T$ is biased because of $U$. " + "But if $Z$ is independent of $U$ and the only path from $Z$ to $Y$ is through $T$, then $Z$ isolates a \"clean\" slice of variation in $T$ that we can use to identify the $T \\to Y$ effect." + ), + md( + "## 7) National scale: the Vietnam draft lottery (Angrist 1990)\n\n" + "The United States, 1969. To draft people for the Vietnam War, the government used a lottery: balls labeled with all 365 birthdays were drawn bingo-style, and the lowest numbers went first.\n\n" + "Your birthday is something you can't pick, and the lottery number was unrelated to your education, occupation, or family. As close to a perfectly natural coin flip as you'll get.\n\n" + "The economist Joshua Angrist used this lottery as an instrument for the effect of **military service on lifetime earnings**.\n\n" + "- $Z$ : draft eligibility based on lottery number\n" + "- $T$ : whether the person actually served\n" + "- $Y$ : later earnings\n\n" + "A naive veteran-vs-non-veteran comparison conflates the effect of service with the selection of who chose to serve and who avoided it. Using the lottery as an instrument isolates the part chance moved.\n\n" + "Angrist (1990) estimated that military service reduced subsequent earnings of white male veterans by about **15%** — a result that overturns the casual \"service = experience = higher earnings\" intuition and remains one of the canonical IV findings." + ), + md( + "## 8) Summary\n\n" + "- **Naive mean differences** are biased whenever there is unobserved confounding.\n" + "- **RCTs** break the bias by random assignment, but non-compliance reopens it for \"actually treated\" comparisons.\n" + "- **Instrumental variables (IV)** rescue identification by finding a variable $Z$ that moves $T$ but only affects $Y$ through $T$ — isolating the part driven by chance.\n" + "- **Wald estimator / 2SLS**: ITT divided by share of compliers. What you identify is **LATE** — the average treatment effect *for the compliers*.\n" + "- **Three locks**: relevance, exclusion, independence. All three must open or the IV door stays shut.\n\n" + "The hardest part of an IV analysis isn't the formula — it's **finding a plausible accident in the real world**. Snow's water companies, Angrist's lottery, and maybe your own birthday are all examples of accidents waiting to be used." + ), + md( + "## References\n\n" + "- Angrist, J. D. (1990). *Lifetime Earnings and the Vietnam Era Draft Lottery: Evidence from Social Security Administrative Records.* American Economic Review, 80(3), 313–336.\n" + "- Imbens, G. W., & Angrist, J. D. (1994). *Identification and Estimation of Local Average Treatment Effects.* Econometrica, 62(2), 467–475.\n" + "- Angrist, J. D., & Pischke, J.-S. (2009). *Mostly Harmless Econometrics: An Empiricist's Companion.* Princeton University Press. (Ch. 4)\n" + "- Snow, J. (1855). *On the Mode of Communication of Cholera.* John Churchill.\n" + "- Matheus Facure, *Python Causality Handbook*: [08 - Instrumental Variables](https://matheusfacure.github.io/python-causality-handbook/08-Instrumental-Variables.html)\n" + "- Companion video: [Causal Studio · IV in a Nutshell (EN)](https://www.youtube.com/@CausalStudio)" + ), +] + + +def build(cells: list[nbf.NotebookNode], out_path: Path) -> None: + nb = nbf.v4.new_notebook() + nb.cells = cells + nb.metadata.update({ + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3", + }, + "language_info": { + "name": "python", + "version": "3.12", + }, + }) + out_path.parent.mkdir(parents=True, exist_ok=True) + with open(out_path, "w") as f: + nbf.write(nb, f) + print(f"wrote {out_path} ({len(cells)} cells)") + + +if __name__ == "__main__": + build(KO_CELLS, BOOK_DIR / "iv_ko.ipynb") + build(EN_CELLS, BOOK_DIR / "iv_en.ipynb") diff --git a/videos/iv/src/iv.py b/videos/iv/src/iv.py new file mode 100644 index 0000000..7217ee0 --- /dev/null +++ b/videos/iv/src/iv.py @@ -0,0 +1,928 @@ +"""IV (Instrumental Variables) 영상 Scene 모음. + +7 Scenes, 총 ~7분 50초: + Scene 01: 존 스노우 도입 (도구변수 = 자연이 던진 동전) + Scene 02: 태블릿 RCT 복습 + 비순응으로 단순 비교가 깨짐 + Scene 03: 순응자/언제나-받는/절대-안받는 세 유형 + LATE + Scene 04: 와알드 추정량 = ITT / 순응자 비율 + Scene 05: 도구변수 세 가정 (적합성/배제/독립성) + Scene 06: 1969 베트남 징집 추첨 = 국가 규모 IV + Scene 07: 아웃트로 (현실 속 우연 찾기) + +작업 흐름: .claude/skills/manim-video-pipeline/SKILL.md 참조. +""" + +import json +from pathlib import Path + +from manim import * + + +TOPIC_DIR = Path(__file__).resolve().parents[1] +ASSET_DIR = Path(__file__).resolve().parents[2] / "assets" / "tabler-icons" / "icons" / "outline" + +# 색상 의미 — 모든 Scene에서 일관되게 사용 +ACCENT = YELLOW_E +COIN_COLOR = YELLOW_E +TREAT_COLOR = TEAL_C +CONTROL_COLOR = BLUE_C +FORBIDDEN = MAROON_C +CLEAN_WATER = BLUE_C +DIRTY_WATER = MAROON_C +INSTRUMENT = ORANGE +COMPLIER = GREEN +ALWAYS_TAKER = RED_C +NEVER_TAKER = BLUE_E +SOFT = GREY_B + + +def load_icon(filename: str, color: str = WHITE, height: float = 1.0) -> SVGMobject: + icon = SVGMobject(str(ASSET_DIR / filename)) + icon.set_stroke(color=color, width=2.6, opacity=1) + icon.set_fill(opacity=0) + icon.height = height + return icon + + +def load_scene_timing_durations(scene_basename: str) -> list[float]: + payload = json.loads( + (TOPIC_DIR / "build" / "audio" / f"{scene_basename}.timings.json").read_text() + ) + return [float(chunk["duration"]) for chunk in payload["chunks"]] + + +def make_forbidden_card(label: str, width: float = 2.6, height: float = 1.6) -> VGroup: + """금지된 시나리오 카드: 라벨 + 빨간 X 오버레이.""" + frame = RoundedRectangle( + width=width, height=height, + corner_radius=0.14, + stroke_color=FORBIDDEN, stroke_width=2.4, + ) + text = Text(label, font_size=22, color=WHITE, line_spacing=0.9) + text.move_to(frame.get_center()) + x1 = Line(frame.get_corner(UL), frame.get_corner(DR), color=FORBIDDEN, stroke_width=4) + x2 = Line(frame.get_corner(UR), frame.get_corner(DL), color=FORBIDDEN, stroke_width=4) + return VGroup(frame, text, x1, x2) + + +def make_school_dot(color: str, radius: float = 0.20) -> Dot: + return Dot(radius=radius, color=color) + + +def make_school_row(count: int, color: str, spacing: float = 0.45) -> VGroup: + dots = VGroup(*[make_school_dot(color) for _ in range(count)]) + dots.arrange(RIGHT, buff=spacing) + return dots + + +def make_lock(color: str = WHITE, height: float = 0.9) -> SVGMobject: + icon = load_icon("lock.svg", color, height) + return icon + + +def make_unlock(color: str = WHITE, height: float = 0.9) -> SVGMobject: + icon = load_icon("lock-open.svg", color, height) + return icon + + +# ═══════════════════════════════════════════════════════════════════ +# Scene 01 — Snow Pumps +# ═══════════════════════════════════════════════════════════════════ + + +class Scene01_SnowPumps(Scene): + """ + Scene 01: Snow Pumps (도구변수 시리즈의 도입) + + Core Claim: + 실험자가 동전을 던질 수 없는 현실에서, 자연이 우연히 던진 동전을 + 찾아내는 것이 도구변수(IV)다. 1854년 런던의 수도 회사 배관망이 + 그런 자연의 동전 역할을 했다. + + Visual Pivot: + "실험자가 못 던지는 동전" → "런던 배관망이 대신 던져 준 동전" + + 3Blue1Brown Reference: 3b1b/_2020/covid.py — 큰 사건을 핵심 질문으로 압축 + Script: src/scripts/01_snow_pumps.txt — 7 chunks, 79.97s + """ + + WAIT_TAIL = 2.0 + + def construct(self): + durations = load_scene_timing_durations("01_snow_pumps") + + # Beat 1 (0~11.16s): RCT 복습 + coin = load_icon("coin.svg", COIN_COLOR, 1.4) + coin.move_to(ORIGIN + UP * 0.3) + treat_dots = VGroup(*[Dot(radius=0.13, color=TREAT_COLOR) for _ in range(4)]) + treat_dots.arrange(RIGHT, buff=0.18) + treat_label = Text("처치", font_size=22, color=TREAT_COLOR) + treat_group = VGroup(treat_dots, treat_label).arrange(DOWN, buff=0.18) + treat_group.move_to(LEFT * 3.2 + DOWN * 1.4) + control_dots = VGroup(*[Dot(radius=0.13, color=CONTROL_COLOR) for _ in range(4)]) + control_dots.arrange(RIGHT, buff=0.18) + control_label = Text("비교", font_size=22, color=CONTROL_COLOR) + control_group = VGroup(control_dots, control_label).arrange(DOWN, buff=0.18) + control_group.move_to(RIGHT * 3.2 + DOWN * 1.4) + split_arrow_l = Arrow(coin.get_corner(DL), treat_group.get_top(), buff=0.2, color=SOFT, stroke_width=3) + split_arrow_r = Arrow(coin.get_corner(DR), control_group.get_top(), buff=0.2, color=SOFT, stroke_width=3) + bias_badge = Text("편향 = 0", font_size=26, weight=BOLD, color=GREEN).move_to(DOWN * 3.0) + + self.play(FadeIn(coin, scale=0.8), run_time=0.8) + self.play(Rotate(coin, angle=2 * PI, axis=UP), run_time=1.2) + self.play(GrowArrow(split_arrow_l), GrowArrow(split_arrow_r), + FadeIn(treat_group, shift=DOWN * 0.2), FadeIn(control_group, shift=DOWN * 0.2), run_time=1.5) + self.play(FadeIn(bias_badge, shift=UP * 0.15), run_time=0.8) + self.wait(11.16 - 4.3) + + # Beat 2 (11.16~23.71s): 금지된 동전 + coin_small_target = coin.copy().scale(0.45).to_corner(UL, buff=0.5) + smoking_card = make_forbidden_card("임산부에게\n흡연 배정").move_to(LEFT * 2.6 + UP * 0.4) + army_card = make_forbidden_card("누구를\n군대로 보낼지").move_to(RIGHT * 2.6 + UP * 0.4) + forbidden_caption = Text("실험자가 던질 수 없는 동전들", font_size=24, color=FORBIDDEN).move_to(DOWN * 1.8) + + self.play(FadeOut(treat_group), FadeOut(control_group), FadeOut(split_arrow_l), + FadeOut(split_arrow_r), FadeOut(bias_badge), Transform(coin, coin_small_target), run_time=1.0) + self.play(FadeIn(smoking_card, shift=UP * 0.15), FadeIn(army_card, shift=UP * 0.15), run_time=1.4) + self.play(FadeIn(forbidden_caption, shift=UP * 0.1), run_time=0.8) + self.wait(12.55 - 3.2) + + # Beat 3 (23.71~32.47s): 누가 대신 던져 줄까? + big_question = Text("?", font_size=180, weight=BOLD, color=ACCENT).move_to(ORIGIN + UP * 0.2) + question_caption = Text("누가 대신 던져 줄까?", font_size=30, color=WHITE).next_to(big_question, DOWN, buff=0.5) + + self.play(FadeOut(smoking_card), FadeOut(army_card), FadeOut(forbidden_caption), run_time=0.7) + self.play(FadeIn(big_question, scale=0.6), run_time=1.0) + self.play(Write(question_caption), run_time=1.0) + self.wait(8.76 - 2.7) + + # Beat 4 (32.47~50.88s): 1854 런던 + date_label = Text("1854년 런던", font_size=30, weight=BOLD, color=SOFT).to_edge(UP, buff=0.5) + streets = VGroup(*[ + Rectangle(width=5.0, height=0.35, stroke_color=GREY_C, stroke_width=2, + fill_color=GREY_E, fill_opacity=0.35) for _ in range(6) + ]) + streets.arrange(DOWN, buff=0.18) + streets.move_to(ORIGIN + DOWN * 0.2) + clean_drop = load_icon("droplet.svg", CLEAN_WATER, 0.7) + clean_name = Text("Lambeth\n(상류 물)", font_size=20, color=CLEAN_WATER, line_spacing=0.9) + clean_group = VGroup(clean_drop, clean_name).arrange(DOWN, buff=0.18) + clean_group.next_to(streets, LEFT, buff=0.6) + dirty_drop = load_icon("droplet.svg", DIRTY_WATER, 0.7) + dirty_name = Text("S & V\n(하수 섞인 강물)", font_size=20, color=DIRTY_WATER, line_spacing=0.9) + dirty_group = VGroup(dirty_drop, dirty_name).arrange(DOWN, buff=0.18) + dirty_group.next_to(streets, RIGHT, buff=0.6) + + self.play(FadeOut(big_question), FadeOut(question_caption), FadeOut(coin), run_time=0.7) + self.play(FadeIn(date_label, shift=DOWN * 0.1), run_time=0.7) + self.play(LaggedStart(*[Create(s) for s in streets], lag_ratio=0.12), run_time=1.6) + self.play(FadeIn(clean_group, shift=RIGHT * 0.2), FadeIn(dirty_group, shift=LEFT * 0.2), run_time=1.2) + self.wait(18.41 - 4.2) + + # Beat 5 (50.88~63.24s): 거리별 회사 배정 = 우연 + assignment = [CLEAN_WATER, DIRTY_WATER, DIRTY_WATER, CLEAN_WATER, DIRTY_WATER, CLEAN_WATER] + street_fills = [ + street.animate.set_fill(color, opacity=0.75).set_stroke(color=color) + for street, color in zip(streets, assignment) + ] + self.play(LaggedStart(*street_fills, lag_ratio=0.18), run_time=2.4) + chance_label = Text("거의 우연", font_size=32, weight=BOLD, color=ACCENT).move_to(DOWN * 3.0) + chance_box = SurroundingRectangle(chance_label, color=ACCENT, buff=0.15) + self.play(FadeIn(chance_label, shift=UP * 0.1), Create(chance_box), run_time=1.0) + self.wait(12.36 - 3.4) + + # Beat 6 (63.24~69.65s): 자연이 던진 동전 + nature_coin = load_icon("coin.svg", COIN_COLOR, 1.6).move_to(ORIGIN + UP * 0.5) + nature_caption = Text("자연이 던진 동전", font_size=28, color=COIN_COLOR).next_to(nature_coin, DOWN, buff=0.4) + + self.play(streets.animate.set_opacity(0.25), + clean_group.animate.set_opacity(0.4), + dirty_group.animate.set_opacity(0.4), + chance_label.animate.set_opacity(0.4), + chance_box.animate.set_opacity(0.4), run_time=0.7) + self.play(FadeIn(nature_coin, scale=0.7), run_time=0.9) + self.play(Rotate(nature_coin, angle=2 * PI, axis=UP), Write(nature_caption), run_time=1.4) + self.wait(6.41 - 3.0) + + # Beat 7 (69.65~79.97s): 도구변수 타이틀 + title_group_old = VGroup(date_label, streets, clean_group, dirty_group, + chance_label, chance_box, nature_coin, nature_caption) + self.play(FadeOut(title_group_old), run_time=0.7) + topic_title = Text("도구변수", font_size=72, weight=BOLD, color=INSTRUMENT) + topic_sub = Text("Instrumental Variable · IV", font_size=28, color=SOFT) + title_stack = VGroup(topic_title, topic_sub).arrange(DOWN, buff=0.3).move_to(UP * 1.2) + z_node = Circle(radius=0.42, color=INSTRUMENT, stroke_width=3) + z_label = Text("Z", font_size=28, color=INSTRUMENT, weight=BOLD).move_to(z_node) + z_group = VGroup(z_node, z_label).move_to(LEFT * 2.8 + DOWN * 1.6) + t_node = Circle(radius=0.42, color=TREAT_COLOR, stroke_width=3) + t_label = Text("T", font_size=28, color=TREAT_COLOR, weight=BOLD).move_to(t_node) + t_group = VGroup(t_node, t_label).move_to(ORIGIN + DOWN * 1.6) + y_node = Circle(radius=0.42, color=CONTROL_COLOR, stroke_width=3) + y_label = Text("Y", font_size=28, color=CONTROL_COLOR, weight=BOLD).move_to(y_node) + y_group = VGroup(y_node, y_label).move_to(RIGHT * 2.8 + DOWN * 1.6) + zt_arrow = Arrow(z_group.get_right(), t_group.get_left(), buff=0.12, color=WHITE, stroke_width=3) + ty_arrow = Arrow(t_group.get_right(), y_group.get_left(), buff=0.12, color=WHITE, stroke_width=3) + + self.play(FadeIn(title_stack, shift=DOWN * 0.2), run_time=1.0) + self.play(FadeIn(z_group), FadeIn(t_group), FadeIn(y_group), run_time=0.9) + self.play(GrowArrow(zt_arrow), GrowArrow(ty_arrow), run_time=0.8) + self.play(Indicate(z_group, color=INSTRUMENT), run_time=0.9) + self.wait(10.32 - 3.6) + self.wait(self.WAIT_TAIL) + + +# ═══════════════════════════════════════════════════════════════════ +# Scene 02 — RCT Recap & Non-compliance Break +# ═══════════════════════════════════════════════════════════════════ + + +class Scene02_RctRecapBreak(Scene): + """ + Scene 02: 태블릿 RCT 복습 + 비순응으로 단순 비교가 깨짐. + + Core Claim: + 무작위 배정과 실제 처치를 구분해야 한다. + 배정은 무작위지만 실제 처치는 학교의 의지로 결정되므로, + 실제 처치 여부로 단순 평균을 비교하면 편향이 돌아온다. + 이 비뚤어진 상황이 바로 도구변수의 진짜 무대다. + + Visual Pivot: + "배정 행"은 무작위 색칠이 유지되지만, "실제 처치 행"은 일부 + 학교가 색을 바꾸는 순간 — 무작위성이 한 줄에만 남는다는 사실. + + Script: src/scripts/02_rct_recap_break.txt — 5 chunks, 70.4s + """ + + WAIT_TAIL = 1.5 + + def construct(self): + durations = load_scene_timing_durations("02_rct_recap_break") + # durations ≈ [15.91, 13.06, 7.25, 18.36, 15.86] + + # Beat 1 (0~15.91s): 태블릿 RCT 복습 — 8 학교, 동전으로 배정 + title = Text("태블릿 RCT 복습", font_size=30, weight=BOLD, color=SOFT).to_edge(UP, buff=0.4) + coin = load_icon("coin.svg", COIN_COLOR, 1.0).move_to(UP * 1.0) + + # 8 학교: 4 처치 배정 + 4 통제 배정 + assigned_t = make_school_row(4, TREAT_COLOR).move_to(LEFT * 2.7 + DOWN * 0.6) + assigned_t_label = Text("배정 = 처치", font_size=22, color=TREAT_COLOR).next_to(assigned_t, DOWN, buff=0.25) + assigned_c = make_school_row(4, CONTROL_COLOR).move_to(RIGHT * 2.7 + DOWN * 0.6) + assigned_c_label = Text("배정 = 통제", font_size=22, color=CONTROL_COLOR).next_to(assigned_c, DOWN, buff=0.25) + + # 단순 비교 → 인과효과 + naive_eq = Text("평균 차이 = 인과효과", font_size=26, color=GREEN).move_to(DOWN * 2.5) + + self.play(FadeIn(title, shift=DOWN * 0.1), run_time=0.7) + self.play(FadeIn(coin, scale=0.8), run_time=0.7) + self.play(Rotate(coin, angle=2 * PI, axis=UP), run_time=1.0) + self.play(FadeIn(assigned_t, shift=DOWN * 0.15), FadeIn(assigned_t_label), + FadeIn(assigned_c, shift=DOWN * 0.15), FadeIn(assigned_c_label), run_time=1.4) + self.play(Write(naive_eq), run_time=1.2) + self.wait(15.91 - 5.0) + + # Beat 2 (15.91~28.97s): 일부 처치 배정 학교가 거부 (실제 = 비처치) + refuse_caption = Text("일부는 태블릿을 거부", font_size=22, color=FORBIDDEN).move_to(LEFT * 2.7 + DOWN * 1.9) + # assigned_t 중 2개를 색 변경 (거부 = 통제 색) + self.play(FadeOut(naive_eq), run_time=0.4) + self.play(FadeIn(refuse_caption, shift=UP * 0.1), run_time=0.7) + refuse_animations = [ + assigned_t[i].animate.set_color(CONTROL_COLOR).set_stroke(color=FORBIDDEN, width=2) + for i in (1, 3) + ] + self.play(LaggedStart(*refuse_animations, lag_ratio=0.3), run_time=1.6) + x_marks = VGroup(*[ + Cross(assigned_t[i], stroke_color=FORBIDDEN, stroke_width=3).scale(0.5) + for i in (1, 3) + ]) + self.play(FadeIn(x_marks), run_time=0.5) + self.wait(13.06 - 3.2) + + # Beat 3 (28.97~36.22s): 일부 통제 배정 학교가 사비로 구매 (실제 = 처치) + buy_caption = Text("일부는 사비로 구매", font_size=22, color=ACCENT).move_to(RIGHT * 2.7 + DOWN * 1.9) + self.play(FadeIn(buy_caption, shift=UP * 0.1), run_time=0.7) + buy_animations = [ + assigned_c[i].animate.set_color(TREAT_COLOR).set_stroke(color=ACCENT, width=2) + for i in (0, 2) + ] + self.play(LaggedStart(*buy_animations, lag_ratio=0.3), run_time=1.4) + stars = VGroup(*[ + Star(n=5, outer_radius=0.18, color=ACCENT, fill_opacity=0.9).move_to(assigned_c[i]) + for i in (0, 2) + ]) + self.play(FadeIn(stars, scale=0.6), run_time=0.5) + self.wait(7.25 - 2.6) + + # Beat 4 (36.22~54.58s): 실제 처치로 비교 → 편향 부활 + # 상단 작게 정리, 중앙에 "실제 처치" vs "실제 비처치" 묶음 + previous = VGroup(title, coin, assigned_t, assigned_c, assigned_t_label, assigned_c_label, + refuse_caption, buy_caption, x_marks, stars) + warning = Text("실제 처치 여부로 비교하면…", font_size=26, color=FORBIDDEN).to_edge(UP, buff=0.6) + # 실제 처치 그룹 + actual_t = VGroup( + Dot(radius=0.20, color=TREAT_COLOR), + Dot(radius=0.20, color=TREAT_COLOR), + Dot(radius=0.20, color=TREAT_COLOR), + Dot(radius=0.20, color=TREAT_COLOR), + ).arrange(RIGHT, buff=0.4).move_to(LEFT * 2.8 + UP * 0.2) + actual_t_label = Text("실제 처치", font_size=22, color=TREAT_COLOR).next_to(actual_t, DOWN, buff=0.25) + actual_c = VGroup( + Dot(radius=0.20, color=CONTROL_COLOR), + Dot(radius=0.20, color=CONTROL_COLOR), + Dot(radius=0.20, color=CONTROL_COLOR), + Dot(radius=0.20, color=CONTROL_COLOR), + ).arrange(RIGHT, buff=0.4).move_to(RIGHT * 2.8 + UP * 0.2) + actual_c_label = Text("실제 비처치", font_size=22, color=CONTROL_COLOR).next_to(actual_c, DOWN, buff=0.25) + bias_eq = Text("평균 차이 ≠ 인과효과", font_size=28, weight=BOLD, color=FORBIDDEN).move_to(DOWN * 1.4) + bias_note = Text("거부 학교 = 회의적, 자비 구매 학교 = 의지 강함", font_size=20, color=SOFT).next_to(bias_eq, DOWN, buff=0.4) + + self.play(FadeOut(previous), run_time=0.7) + self.play(FadeIn(warning, shift=DOWN * 0.1), run_time=0.7) + self.play(FadeIn(actual_t), FadeIn(actual_t_label), + FadeIn(actual_c), FadeIn(actual_c_label), run_time=1.2) + self.play(Write(bias_eq), run_time=1.0) + self.play(FadeIn(bias_note, shift=UP * 0.1), run_time=0.9) + self.wait(18.36 - 4.5) + + # Beat 5 (54.58~70.44s): 배정만 무작위 → IV의 무대 + bridge_title = Text("배정만 무작위", font_size=30, weight=BOLD, color=ACCENT).to_edge(UP, buff=0.5) + # 두 행: 배정 (랜덤 표시), 실제 처치 (랜덤 아님) + row_label_assign = Text("배정", font_size=22, color=SOFT) + row_label_actual = Text("실제 처치", font_size=22, color=SOFT) + assign_row = make_school_row(8, COIN_COLOR, spacing=0.30) + actual_row = VGroup(*[ + Dot(radius=0.18, color=c) for c in + [TREAT_COLOR, CONTROL_COLOR, TREAT_COLOR, CONTROL_COLOR, + TREAT_COLOR, TREAT_COLOR, CONTROL_COLOR, TREAT_COLOR] + ]) + actual_row.arrange(RIGHT, buff=0.30) + # 정렬: 두 행을 수평 정렬 + assign_block = VGroup(row_label_assign, assign_row).arrange(RIGHT, buff=0.6) + actual_block = VGroup(row_label_actual, actual_row).arrange(RIGHT, buff=0.6) + rows_block = VGroup(assign_block, actual_block).arrange(DOWN, aligned_edge=LEFT, buff=0.7).move_to(UP * 0.2) + random_badge = Text("무작위 ✓", font_size=20, color=GREEN).next_to(assign_block, RIGHT, buff=0.5) + not_random = Text("무작위 아님 ✗", font_size=20, color=FORBIDDEN).next_to(actual_block, RIGHT, buff=0.5) + pivot = Text("무작위성을 잃지 않는 분석법이 필요하다 → IV", font_size=24, weight=BOLD, color=INSTRUMENT).move_to(DOWN * 2.2) + + self.play(FadeOut(warning), FadeOut(actual_t), FadeOut(actual_t_label), + FadeOut(actual_c), FadeOut(actual_c_label), + FadeOut(bias_eq), FadeOut(bias_note), run_time=0.7) + self.play(FadeIn(bridge_title, shift=DOWN * 0.1), run_time=0.6) + self.play(FadeIn(rows_block, shift=UP * 0.15), run_time=1.4) + self.play(FadeIn(random_badge), FadeIn(not_random), run_time=0.8) + self.play(Write(pivot), run_time=1.4) + self.wait(15.86 - 4.9) + self.wait(self.WAIT_TAIL) + + +# ═══════════════════════════════════════════════════════════════════ +# Scene 03 — Three Types (Compliers / Always / Never) +# ═══════════════════════════════════════════════════════════════════ + + +class Scene03_ThreeTypes(Scene): + """ + Scene 03: 비순응의 세 유형 + LATE. + + Core Claim: + 동전이 움직이는 사람은 순응자뿐이다. + 따라서 도구변수가 짚어 내는 효과는 전체 평균 처치 효과(ATE)가 아니라, + 순응자에 한정된 국소 평균 처치 효과(LATE)이다. + + Visual Pivot: + 동전이 처치/통제로 떨어지는 두 세계를 평행 트랙으로 보여줘서, + 같은 사람이 두 세계에서 어떻게 행동하는지를 한 번에 비교. + + Script: src/scripts/03_three_types.txt — 6 chunks, 70.3s + """ + + WAIT_TAIL = 1.5 + + def construct(self): + durations = load_scene_timing_durations("03_three_types") + # durations ≈ [8.02, 11.86, 13.01, 10.20, 16.06, 11.16] + + # Beat 1 (0~8.02s): 세 유형 소개 + title = Text("동전이 움직이는 세 유형", font_size=30, weight=BOLD, color=ACCENT).to_edge(UP, buff=0.4) + type_names = ["순응자", "언제나 받음", "절대 안 받음"] + type_colors = [COMPLIER, ALWAYS_TAKER, NEVER_TAKER] + cards = VGroup() + for name, color in zip(type_names, type_colors): + frame = RoundedRectangle(width=3.4, height=1.1, corner_radius=0.16, + stroke_color=color, stroke_width=2.5) + label = Text(name, font_size=24, weight=BOLD, color=color).move_to(frame.get_center()) + cards.add(VGroup(frame, label)) + cards.arrange(RIGHT, buff=0.4).move_to(UP * 0.6) + + self.play(FadeIn(title, shift=DOWN * 0.1), run_time=0.6) + self.play(LaggedStart(*[FadeIn(c, shift=UP * 0.2) for c in cards], lag_ratio=0.25), run_time=1.6) + self.wait(8.02 - 2.2) + + # Beat 2 (8.02~19.88s): 순응자 — 동전 따라감 + # 두 평행 트랙: 배정 처치 / 배정 통제, 각 트랙 위에 순응자가 어떻게 행동하는지 + # 작은 카드 상단 유지는 480p에서 가독성이 떨어지므로 FadeOut으로 정리한다. + # 타입 식별은 dot 색 + 캡션이 담당한다. + + track_label_z1 = Text("배정 = 처치", font_size=20, color=COIN_COLOR) + track_label_z0 = Text("배정 = 통제", font_size=20, color=COIN_COLOR) + track_z1 = Line(LEFT * 2.5, RIGHT * 2.5, color=GREY_C, stroke_width=2) + track_z0 = Line(LEFT * 2.5, RIGHT * 2.5, color=GREY_C, stroke_width=2) + track1_block = VGroup(track_label_z1, track_z1).arrange(RIGHT, buff=0.4) + track0_block = VGroup(track_label_z0, track_z0).arrange(RIGHT, buff=0.4) + tracks = VGroup(track1_block, track0_block).arrange(DOWN, aligned_edge=LEFT, buff=1.0).move_to(DOWN * 0.6) + + complier_z1_dot = Dot(radius=0.18, color=TREAT_COLOR).move_to(track_z1.get_center()) + complier_z0_dot = Dot(radius=0.18, color=CONTROL_COLOR).move_to(track_z0.get_center()) + complier_caption = Text("순응자: 동전이 가리키는 대로 행동", font_size=24, color=COMPLIER).to_edge(DOWN, buff=0.5) + + self.play(FadeOut(cards), run_time=0.5) + self.play(FadeIn(tracks, shift=DOWN * 0.1), run_time=0.8) + self.play(FadeIn(complier_z1_dot, scale=0.7), FadeIn(complier_z0_dot, scale=0.7), run_time=0.8) + self.play(Write(complier_caption), run_time=1.2) + self.wait(11.86 - 3.3) + + # Beat 3 (19.88~32.89s): 언제나 받음 — 두 트랙 모두 처치색 + always_z1 = Dot(radius=0.18, color=ALWAYS_TAKER).move_to(track_z1.get_center() + RIGHT * 0.8) + always_z0 = Dot(radius=0.18, color=ALWAYS_TAKER).move_to(track_z0.get_center() + RIGHT * 0.8) + always_caption = Text("언제나 받음: 동전과 무관하게 처치", font_size=24, color=ALWAYS_TAKER).to_edge(DOWN, buff=0.5) + + self.play(FadeOut(complier_caption), run_time=0.4) + self.play(FadeIn(always_z1, scale=0.7), FadeIn(always_z0, scale=0.7), run_time=0.8) + self.play(Write(always_caption), run_time=1.2) + self.wait(13.01 - 2.4) + + # Beat 4 (32.89~43.09s): 절대 안 받음 — 두 트랙 모두 통제색 + never_z1 = Dot(radius=0.18, color=NEVER_TAKER).move_to(track_z1.get_center() - RIGHT * 0.8) + never_z0 = Dot(radius=0.18, color=NEVER_TAKER).move_to(track_z0.get_center() - RIGHT * 0.8) + never_caption = Text("절대 안 받음: 동전과 무관하게 비처치", font_size=24, color=NEVER_TAKER).to_edge(DOWN, buff=0.5) + + self.play(FadeOut(always_caption), run_time=0.4) + self.play(FadeIn(never_z1, scale=0.7), FadeIn(never_z0, scale=0.7), run_time=0.8) + self.play(Write(never_caption), run_time=1.2) + self.wait(10.20 - 2.4) + + # Beat 5 (43.09~59.15s): 핵심 — 순응자만 동전에 반응 + # 다른 dot들은 적당히 약화(0.45), complier만 박스로 강조. + self.play(FadeOut(never_caption), run_time=0.4) + reveal = Text("동전 결과에 따라 움직이는 건 순응자뿐", font_size=26, weight=BOLD, color=COMPLIER).to_edge(DOWN, buff=0.5) + complier_box_top = SurroundingRectangle(complier_z1_dot, color=COMPLIER, buff=0.15, stroke_width=3) + complier_box_bot = SurroundingRectangle(complier_z0_dot, color=COMPLIER, buff=0.15, stroke_width=3) + self.play( + always_z1.animate.set_opacity(0.45), always_z0.animate.set_opacity(0.45), + never_z1.animate.set_opacity(0.45), never_z0.animate.set_opacity(0.45), + run_time=0.7, + ) + self.play(Create(complier_box_top), Create(complier_box_bot), run_time=0.9) + self.play(Write(reveal), run_time=1.4) + self.wait(16.06 - 3.4) + + # Beat 6 (59.15~70.31s): LATE 정의 카드 + late_box = RoundedRectangle(width=8.0, height=2.0, corner_radius=0.2, + stroke_color=INSTRUMENT, stroke_width=3) + late_title = Text("LATE", font_size=42, weight=BOLD, color=INSTRUMENT) + late_sub = Text("Local Average Treatment Effect\n순응자에 한정된 평균 처치 효과", font_size=22, + color=WHITE, line_spacing=0.95) + late_stack = VGroup(late_title, late_sub).arrange(DOWN, buff=0.25).move_to(late_box.get_center()) + late_group = VGroup(late_box, late_stack).move_to(ORIGIN) + + prior = VGroup(tracks, complier_z1_dot, complier_z0_dot, + complier_box_top, complier_box_bot, + always_z1, always_z0, never_z1, never_z0, reveal, title) + self.play(FadeOut(prior), run_time=0.7) + self.play(Create(late_box), run_time=0.9) + self.play(FadeIn(late_stack, shift=UP * 0.2), run_time=1.4) + self.wait(11.16 - 3.0) + self.wait(self.WAIT_TAIL) + + +# ═══════════════════════════════════════════════════════════════════ +# Scene 04 — Wald Machinery (Numerator / Denominator) +# ═══════════════════════════════════════════════════════════════════ + + +class Scene04_IvMachinery(Scene): + """ + Scene 04: 와알드 추정량 = ITT / 순응자 비율. + + Core Claim: + LATE를 숫자로 구하는 식은 ITT(배정 결과 차이)를 순응자 비율로 + 나눈 비율이다. 분자는 동전이 만든 총 효과, 분모는 동전이 실제로 + 움직인 비율, 둘을 나누면 "한 명의 순응자에게 처치가 만든 효과"가 된다. + + Visual Pivot: + 분자와 분모가 처음에는 따로 등장해 의미가 명확히 분리된 뒤, + 마지막에 분수선 위/아래로 합쳐지며 한 식으로 수렴. + + Script: src/scripts/04_iv_machinery.txt — 6 chunks, 79.51s + """ + + WAIT_TAIL = 1.5 + + def construct(self): + durations = load_scene_timing_durations("04_iv_machinery") + # durations ≈ [7.42, 16.85, 18.12, 5.95, 14.57, 16.61] + + # Beat 1 (0~7.42s): "식은 간단하다" 인트로 + title = Text("LATE를 숫자로 구하기", font_size=32, weight=BOLD, color=ACCENT).to_edge(UP, buff=0.5) + intro = Text("식은 의외로 간단합니다", font_size=26, color=SOFT).move_to(ORIGIN + UP * 0.3) + self.play(FadeIn(title, shift=DOWN * 0.1), run_time=0.7) + self.play(Write(intro), run_time=1.2) + self.wait(7.42 - 1.9) + + # Beat 2 (7.42~24.27s): 분자 — 배정별 평균 점수 차이 + # 라벨은 title 바로 아래에 두어 "이 차이" 위쪽 텍스트와 충돌 방지. + numerator_label = Text("분자: 배정으로 만든 점수 차이", font_size=24, color=COIN_COLOR).next_to(title, DOWN, buff=0.4) + score_z1 = Text("처치 배정\n평균 점수", font_size=20, color=TREAT_COLOR, line_spacing=0.9) + score_z0 = Text("통제 배정\n평균 점수", font_size=20, color=CONTROL_COLOR, line_spacing=0.9) + # 바 높이를 축소해 위쪽 라벨과 간격 확보. + bar_z1 = Rectangle(width=0.8, height=1.7, color=TREAT_COLOR, fill_opacity=0.7, stroke_width=0) + bar_z0 = Rectangle(width=0.8, height=1.3, color=CONTROL_COLOR, fill_opacity=0.7, stroke_width=0) + bar_block_z1 = VGroup(bar_z1, score_z1).arrange(DOWN, buff=0.25) + bar_block_z0 = VGroup(bar_z0, score_z0).arrange(DOWN, buff=0.25) + # 바닥선 정렬로 바 차트 느낌, 위치는 좀 더 아래로 내려 vertical 여백 확보. + bars = VGroup(bar_block_z1, bar_block_z0).arrange(RIGHT, buff=1.4, aligned_edge=DOWN).move_to(DOWN * 1.1) + diff_brace = Brace(VGroup(bar_z1, bar_z0), direction=UP, buff=0.25, color=COIN_COLOR) + diff_text = Text("이 차이", font_size=22, color=COIN_COLOR).next_to(diff_brace, UP, buff=0.2) + + self.play(FadeOut(intro), run_time=0.4) + self.play(FadeIn(numerator_label, shift=DOWN * 0.1), run_time=0.7) + self.play(FadeIn(bars, shift=UP * 0.15), run_time=1.2) + self.play(GrowFromCenter(diff_brace), FadeIn(diff_text, shift=DOWN * 0.1), run_time=1.0) + self.wait(16.85 - 3.3) + + # Beat 3 (24.27~42.39s): 작게 나오는 이유 — 순응자만 움직임 + explain = Text("이 차이는 순응자만이 만든다", font_size=26, weight=BOLD, color=COMPLIER).move_to(DOWN * 2.5) + complier_note = Text("(언제나 받음 / 절대 안 받음 학교는 동전에 무반응)", font_size=18, color=SOFT).next_to(explain, DOWN, buff=0.2) + # 분자 차이를 살짝 줄여서 시각적으로 강조 + self.play(FadeIn(explain, shift=UP * 0.1), run_time=1.0) + self.play(FadeIn(complier_note, shift=UP * 0.05), run_time=0.7) + # 박스로 분자 묶기 (buff 키워 내용 튀어나옴 방지) + numer_box = SurroundingRectangle(VGroup(bars, diff_brace, diff_text), color=COIN_COLOR, buff=0.4) + self.play(Create(numer_box), run_time=1.0) + self.wait(18.12 - 2.7) + + # Beat 4 (42.39~48.34s): "그래서 비율로 나눠야 한다" + divide_caption = Text("→ 순응자 비율로 나눠 환산한다", font_size=26, color=ACCENT).move_to(DOWN * 3.3) + self.play(FadeOut(complier_note), run_time=0.3) + self.play(FadeIn(divide_caption, shift=UP * 0.1), run_time=1.0) + self.wait(5.95 - 1.3) + + # Beat 5 (48.34~62.91s): 분모 — 실제 사용 비율 차이 = 순응자 비율 + # 화면 정리 후 새 분모 시각화 + previous = VGroup(numerator_label, bars, diff_brace, diff_text, + explain, numer_box, divide_caption) + self.play(FadeOut(previous), run_time=0.7) + denom_label = Text("분모: 동전이 움직인 비율", font_size=24, color=INSTRUMENT).move_to(UP * 1.6) + # 두 그룹: 처치 배정 중 실제 사용 비율 / 통제 배정 중 실제 사용 비율 + ratio_block_left = self._make_ratio_block("처치 배정 중\n실제 사용", filled=6, total=8, color=TREAT_COLOR) + ratio_block_right = self._make_ratio_block("통제 배정 중\n실제 사용", filled=2, total=8, color=CONTROL_COLOR) + ratios = VGroup(ratio_block_left, ratio_block_right).arrange(RIGHT, buff=1.2).move_to(DOWN * 0.2) + complier_pct = Text("≈ 순응자 비율 (6/8 − 2/8 = 50%)", font_size=22, color=COMPLIER).move_to(DOWN * 2.5) + + self.play(FadeIn(denom_label, shift=DOWN * 0.1), run_time=0.7) + self.play(FadeIn(ratios, shift=UP * 0.15), run_time=1.5) + self.play(Write(complier_pct), run_time=1.4) + self.wait(14.57 - 3.6) + + # Beat 6 (62.91~79.52s): 와알드 추정량 = 분자 / 분모 + self.play(FadeOut(VGroup(denom_label, ratios, complier_pct)), run_time=0.7) + wald_title = Text("와알드 추정량 (Wald Estimator)", font_size=28, weight=BOLD, color=INSTRUMENT).to_edge(UP, buff=1.2) + numer_line = Text("배정으로 만든 점수 차이", font_size=26, color=COIN_COLOR) + bar = Line(LEFT * 3.2, RIGHT * 3.2, color=WHITE, stroke_width=3) + denom_line = Text("순응자 비율", font_size=26, color=INSTRUMENT) + fraction = VGroup(numer_line, bar, denom_line).arrange(DOWN, buff=0.25).move_to(ORIGIN + UP * 0.1) + equals = Text("= LATE", font_size=30, weight=BOLD, color=COMPLIER).next_to(fraction, DOWN, buff=0.5) + meaning = Text("한 순응자에게 처치가 만든 효과", font_size=22, color=SOFT).next_to(equals, DOWN, buff=0.3) + + self.play(FadeIn(wald_title, shift=DOWN * 0.1), run_time=0.7) + self.play(FadeIn(numer_line, shift=UP * 0.1), run_time=0.9) + self.play(Create(bar), run_time=0.5) + self.play(FadeIn(denom_line, shift=DOWN * 0.1), run_time=0.9) + self.play(Write(equals), run_time=1.0) + self.play(FadeIn(meaning, shift=UP * 0.05), run_time=0.9) + self.wait(16.61 - 4.9) + self.wait(self.WAIT_TAIL) + + @staticmethod + def _make_ratio_block(title_text: str, filled: int, total: int, color: str) -> VGroup: + title = Text(title_text, font_size=20, color=color, line_spacing=0.9) + dots = VGroup() + for i in range(total): + d = Dot(radius=0.13, color=color if i < filled else GREY_D) + if i >= filled: + d.set_fill(opacity=0.3) + dots.add(d) + dots.arrange(RIGHT, buff=0.18) + ratio_text = Text(f"{filled}/{total}", font_size=24, weight=BOLD, color=color) + block = VGroup(title, dots, ratio_text).arrange(DOWN, buff=0.25) + return block + + +# ═══════════════════════════════════════════════════════════════════ +# Scene 05 — Three Assumptions (Locks) +# ═══════════════════════════════════════════════════════════════════ + + +class Scene05_ThreeAssumptions(Scene): + """ + Scene 05: 도구변수 세 가정 — 적합성, 배제, 독립성. + + Core Claim: + 와알드 식의 정당성은 세 가정 모두에 동시에 매달려 있다. + 적합성이 약하면 분모가 0에 가까워져 추정값이 폭주하고, + 배제 조건이 깨지면 분자가 처치 외 경로로 오염되며, + 독립성이 깨지면 처음부터 무작위성이 없는 셈이다. + + Visual Pivot: + 세 자물쇠가 차례로 등장해 마지막에 동시에 풀리는 순간 — + 어느 하나라도 잠겨 있으면 IV의 문은 열리지 않는다. + + Script: src/scripts/05_three_assumptions.txt — 5 chunks, 71.06s + """ + + WAIT_TAIL = 1.5 + + def construct(self): + durations = load_scene_timing_durations("05_three_assumptions") + # durations ≈ [11.90, 17.66, 17.76, 14.57, 9.17] + + # Beat 1 (0~11.90s): 세 자물쇠 등장 + title = Text("도구변수의 세 자물쇠", font_size=32, weight=BOLD, color=ACCENT).to_edge(UP, buff=0.5) + lock_names = ["적합성", "배제 조건", "독립성"] + locks = VGroup() + for name in lock_names: + lk = load_icon("lock.svg", FORBIDDEN, 1.1) + nm = Text(name, font_size=22, weight=BOLD, color=WHITE).next_to(lk, DOWN, buff=0.25) + locks.add(VGroup(lk, nm)) + locks.arrange(RIGHT, buff=1.5).move_to(DOWN * 0.4) + + self.play(FadeIn(title, shift=DOWN * 0.1), run_time=0.7) + self.play(LaggedStart(*[FadeIn(lk, shift=UP * 0.15) for lk in locks], lag_ratio=0.25), run_time=1.6) + warning = Text("하나라도 어긋나면 결과를 믿을 수 없다", font_size=22, color=SOFT).to_edge(DOWN, buff=0.6) + self.play(Write(warning), run_time=1.4) + self.wait(11.90 - 3.7) + + # Beat 2 (11.90~29.56s): 적합성 — Z가 T를 실제로 움직여야 함 + # locks을 상단에 작게 남기지 않는다 (Beat 4의 indep_title과 충돌). + # Beat 2~4 동안 무대를 비우고, Beat 5에서 unlock 상태로 다시 등장시킨다. + self.play(FadeOut(warning), FadeOut(locks), run_time=0.8) + + # DAG: Z → T 화살표 두께가 핵심 + z_node = Circle(radius=0.45, color=INSTRUMENT, stroke_width=3) + z_text = Text("Z", font_size=26, weight=BOLD, color=INSTRUMENT).move_to(z_node) + z_grp = VGroup(z_node, z_text).move_to(LEFT * 2.8 + DOWN * 0.5) + t_node = Circle(radius=0.45, color=TREAT_COLOR, stroke_width=3) + t_text = Text("T", font_size=26, weight=BOLD, color=TREAT_COLOR).move_to(t_node) + t_grp = VGroup(t_node, t_text).move_to(RIGHT * 2.8 + DOWN * 0.5) + strong_arrow = Arrow(z_grp.get_right(), t_grp.get_left(), buff=0.12, color=GREEN, stroke_width=8) + strong_label = Text("Z가 T를 강하게 움직임 ✓", font_size=22, color=GREEN).next_to(strong_arrow, UP, buff=0.3) + weak_arrow = Arrow(z_grp.get_right(), t_grp.get_left(), buff=0.12, color=FORBIDDEN, stroke_width=2) + weak_label = Text("약하면 분모 ≈ 0 → 추정값 폭주 ✗", font_size=22, color=FORBIDDEN).next_to(weak_arrow, DOWN, buff=0.3) + + self.play(FadeIn(z_grp), FadeIn(t_grp), run_time=0.8) + self.play(GrowArrow(strong_arrow), FadeIn(strong_label, shift=DOWN * 0.1), run_time=1.0) + self.play(Transform(strong_arrow, weak_arrow), FadeIn(weak_label, shift=UP * 0.1), run_time=1.4) + self.wait(17.66 - 3.2) + + # Beat 3 (29.56~47.32s): 배제 조건 — Z → Y는 오직 T를 통해서만 + previous = VGroup(z_grp, t_grp, strong_arrow, strong_label, weak_label) + self.play(FadeOut(previous), run_time=0.6) + + # DAG: Z → T → Y, 그리고 Z → Y 직접 경로가 금지 + z_node2 = Circle(radius=0.4, color=INSTRUMENT, stroke_width=3) + z_text2 = Text("Z", font_size=24, weight=BOLD, color=INSTRUMENT).move_to(z_node2) + z_grp2 = VGroup(z_node2, z_text2).move_to(LEFT * 3.5 + DOWN * 0.3) + t_node2 = Circle(radius=0.4, color=TREAT_COLOR, stroke_width=3) + t_text2 = Text("T", font_size=24, weight=BOLD, color=TREAT_COLOR).move_to(t_node2) + t_grp2 = VGroup(t_node2, t_text2).move_to(ORIGIN + DOWN * 0.3) + y_node2 = Circle(radius=0.4, color=CONTROL_COLOR, stroke_width=3) + y_text2 = Text("Y", font_size=24, weight=BOLD, color=CONTROL_COLOR).move_to(y_node2) + y_grp2 = VGroup(y_node2, y_text2).move_to(RIGHT * 3.5 + DOWN * 0.3) + zt_arrow2 = Arrow(z_grp2.get_right(), t_grp2.get_left(), buff=0.12, color=WHITE, stroke_width=3) + ty_arrow2 = Arrow(t_grp2.get_right(), y_grp2.get_left(), buff=0.12, color=WHITE, stroke_width=3) + # 금지된 직접 경로 (Z → Y arc) 빨간 X로 + zy_arc = CurvedArrow(z_grp2.get_top(), y_grp2.get_top(), color=FORBIDDEN, stroke_width=3, angle=-1.4) + zy_cross = Cross(zy_arc, stroke_color=FORBIDDEN, stroke_width=4).scale(1.0) + excl_label = Text("Z → Y의 영향은 오직 T를 거쳐야 한다", font_size=22, color=WHITE).to_edge(DOWN, buff=0.8) + + self.play(FadeIn(z_grp2), FadeIn(t_grp2), FadeIn(y_grp2), run_time=0.9) + self.play(GrowArrow(zt_arrow2), GrowArrow(ty_arrow2), run_time=0.9) + self.play(Create(zy_arc), run_time=0.8) + self.play(FadeIn(zy_cross, scale=0.7), run_time=0.6) + self.play(Write(excl_label), run_time=1.4) + self.wait(17.76 - 4.6) + + # Beat 4 (47.32~61.89s): 독립성 — Z ⊥ (Y_0, Y_1) + previous2 = VGroup(z_grp2, t_grp2, y_grp2, zt_arrow2, ty_arrow2, zy_arc, zy_cross, excl_label) + self.play(FadeOut(previous2), run_time=0.6) + indep_title = Text("Z는 잠재적 결과와 독립이어야 한다", font_size=26, weight=BOLD, color=ACCENT).to_edge(UP, buff=1.4) + coin_small = load_icon("coin.svg", COIN_COLOR, 1.0).move_to(LEFT * 3.0) + latent_box = RoundedRectangle(width=3.8, height=1.4, corner_radius=0.15, + stroke_color=SOFT, stroke_width=2) + latent_text = Text("잠재적 결과\n( 와이 0, 와이 1 )", font_size=22, color=WHITE, line_spacing=0.95).move_to(latent_box.get_center()) + latent_grp = VGroup(latent_box, latent_text).move_to(RIGHT * 2.5) + indep_sym = Text("⊥", font_size=46, weight=BOLD, color=GREEN).move_to(ORIGIN) + check_note = Text("RCT 배정이라면 설계상 만족\n자연의 동전이라면 따져 봐야 한다", font_size=20, color=SOFT, line_spacing=0.95).to_edge(DOWN, buff=0.6) + + self.play(FadeIn(indep_title, shift=DOWN * 0.1), run_time=0.7) + self.play(FadeIn(coin_small), FadeIn(latent_grp), run_time=1.0) + self.play(Write(indep_sym), run_time=0.8) + self.play(FadeIn(check_note, shift=UP * 0.1), run_time=1.4) + self.wait(14.57 - 3.9) + + # Beat 5 (61.89~71.06s): 세 자물쇠 모두 풀림 + previous3 = VGroup(indep_title, coin_small, latent_grp, indep_sym, check_note) + self.play(FadeOut(previous3), run_time=0.6) + # unlock 자물쇠를 새로 등장시킨다 (Beat 2에서 원래 locks을 FadeOut했음). + unlocks = VGroup() + for name in lock_names: + uk = load_icon("lock-open.svg", GREEN, 1.1) + nm = Text(name, font_size=22, weight=BOLD, color=GREEN).next_to(uk, DOWN, buff=0.25) + unlocks.add(VGroup(uk, nm)) + unlocks.arrange(RIGHT, buff=1.5).move_to(DOWN * 0.4) + door_caption = Text("세 자물쇠가 모두 풀려야 도구변수의 문이 열린다", font_size=24, weight=BOLD, color=INSTRUMENT).to_edge(DOWN, buff=0.6) + + self.play(LaggedStart(*[FadeIn(uk, shift=UP * 0.15) for uk in unlocks], lag_ratio=0.2), run_time=1.4) + self.play(Write(door_caption), run_time=1.6) + self.wait(9.17 - 3.0) + self.wait(self.WAIT_TAIL) + + +# ═══════════════════════════════════════════════════════════════════ +# Scene 06 — Draft Lottery (Vietnam, 1969) +# ═══════════════════════════════════════════════════════════════════ + + +class Scene06_DraftLottery(Scene): + """ + Scene 06: 1969 베트남 징집 추첨 = 국가 규모 IV. + + Core Claim: + 스노우의 수도 회사 트릭은 한 도시 위생 연구에 머무르지 않았다. + 한 세기 뒤 미국에서, 빙고 추첨이라는 자연의 동전이 군 복무가 + 평생 소득에 미친 효과를 추정하는 도구변수로 쓰였다. + + Visual Pivot: + 빙고볼이 떨어지며 생일 번호가 결정되는 순간 — 우연이 사람을 + 움직였다. 스노우의 수도 배관과 같은 구조다. + + Script: src/scripts/06_draft_lottery.txt — 5 chunks, 66.10s + """ + + WAIT_TAIL = 1.5 + + def construct(self): + durations = load_scene_timing_durations("06_draft_lottery") + # durations ≈ [6.72, 22.97, 10.56, 11.40, 14.45] + + # Beat 1 (0~6.72s): 국가 규모로 작동 + title = Text("같은 트릭, 국가 규모", font_size=32, weight=BOLD, color=ACCENT).to_edge(UP, buff=0.5) + scale_up = Text("작은 실험만이 아니다", font_size=24, color=SOFT).move_to(ORIGIN + UP * 0.2) + self.play(FadeIn(title, shift=DOWN * 0.1), run_time=0.7) + self.play(Write(scale_up), run_time=1.2) + self.wait(6.72 - 1.9) + + # Beat 2 (6.72~29.69s): 1969 베트남 징집 추첨 + self.play(FadeOut(scale_up), run_time=0.4) + date_label = Text("1969년 · 미국", font_size=28, weight=BOLD, color=SOFT).to_edge(UP, buff=1.4) + # 빙고볼 시뮬레이션: 3개 공 + balls = VGroup() + ball_nums = ["73", "144", "012"] + for i, num in enumerate(ball_nums): + ball = Circle(radius=0.5, color=ACCENT, stroke_width=3, fill_color=YELLOW_A, fill_opacity=0.9) + ball_num = Text(num, font_size=22, weight=BOLD, color=BLACK).move_to(ball) + balls.add(VGroup(ball, ball_num)) + balls.arrange(RIGHT, buff=0.5).move_to(UP * 0.2) + ball_caption = Text("생일 365일이 적힌 공을 무작위로 추첨", font_size=22, color=WHITE).next_to(balls, DOWN, buff=0.5) + rule = Text("낮은 번호 → 입대", font_size=24, weight=BOLD, color=INSTRUMENT).move_to(DOWN * 1.5) + independence_note = Text("태어난 날짜는 학력, 직업과 무관", font_size=20, color=SOFT).next_to(rule, DOWN, buff=0.3) + + self.play(FadeIn(date_label, shift=DOWN * 0.1), run_time=0.7) + self.play(LaggedStart(*[FadeIn(b, shift=DOWN * 0.2, scale=0.7) for b in balls], lag_ratio=0.2), run_time=1.4) + self.play(Write(ball_caption), run_time=1.4) + self.play(Write(rule), run_time=1.0) + self.play(FadeIn(independence_note, shift=UP * 0.1), run_time=0.9) + self.wait(22.97 - 5.4) + + # Beat 3 (29.69~40.25s): 앵그리스트의 질문 + prior = VGroup(date_label, balls, ball_caption, rule, independence_note) + self.play(FadeOut(prior), run_time=0.6) + angrist = Text("조슈아 앵그리스트의 질문", font_size=26, weight=BOLD, color=ACCENT).to_edge(UP, buff=1.2) + question = Text("\"군 복무가 평생 소득에 어떤 영향을 줄까?\"", font_size=26, color=WHITE).move_to(ORIGIN + UP * 0.4) + # T → Y + t_q = Text("군 복무", font_size=24, color=TREAT_COLOR) + y_q = Text("평생 소득", font_size=24, color=CONTROL_COLOR) + arrow_q = Arrow(LEFT * 1.0, RIGHT * 1.0, buff=0.05, color=WHITE, stroke_width=4) + chain = VGroup(t_q, arrow_q, y_q).arrange(RIGHT, buff=0.3).move_to(DOWN * 1.0) + + self.play(FadeIn(angrist, shift=DOWN * 0.1), run_time=0.7) + self.play(Write(question), run_time=1.4) + self.play(FadeIn(chain, shift=UP * 0.1), run_time=1.0) + self.wait(10.56 - 3.1) + + # Beat 4 (40.25~51.65s): 단순 비교는 편향 — 참전 선택의 차이 + # chain을 작게 위로 정리, 편향 경고 + bias_warn = Text("참전 군인 vs 비참전 군인 단순 비교 → 편향", font_size=24, color=FORBIDDEN).to_edge(DOWN, buff=2.2) + bias_reason = Text("참전을 선택한 사람과 회피한 사람은 애초에 다르다", font_size=20, color=SOFT).next_to(bias_warn, DOWN, buff=0.25) + self.play(FadeIn(bias_warn, shift=UP * 0.1), run_time=1.0) + self.play(FadeIn(bias_reason, shift=UP * 0.05), run_time=0.9) + self.wait(11.40 - 1.9) + + # Beat 5 (51.65~66.10s): 추첨을 도구변수로 → 스노우 회귀 + prior2 = VGroup(angrist, question, chain, bias_warn, bias_reason) + self.play(FadeOut(prior2), run_time=0.6) + title_fix = Text("추첨 번호 = 도구변수", font_size=30, weight=BOLD, color=INSTRUMENT).to_edge(UP, buff=1.2) + # DAG: Z(추첨) → T(복무) → Y(소득) + z6 = Circle(radius=0.4, color=INSTRUMENT, stroke_width=3) + z6t = Text("추첨", font_size=20, color=INSTRUMENT, weight=BOLD).move_to(z6) + z6g = VGroup(z6, z6t).move_to(LEFT * 3.5 + DOWN * 0.2) + t6 = Circle(radius=0.4, color=TREAT_COLOR, stroke_width=3) + t6t = Text("복무", font_size=20, color=TREAT_COLOR, weight=BOLD).move_to(t6) + t6g = VGroup(t6, t6t).move_to(ORIGIN + DOWN * 0.2) + y6 = Circle(radius=0.4, color=CONTROL_COLOR, stroke_width=3) + y6t = Text("소득", font_size=20, color=CONTROL_COLOR, weight=BOLD).move_to(y6) + y6g = VGroup(y6, y6t).move_to(RIGHT * 3.5 + DOWN * 0.2) + zt6 = Arrow(z6g.get_right(), t6g.get_left(), buff=0.12, color=WHITE, stroke_width=3) + ty6 = Arrow(t6g.get_right(), y6g.get_left(), buff=0.12, color=WHITE, stroke_width=3) + callback = Text("한 세기 전 런던의 수도 회사 트릭이\n미국 노동시장에서도 통했다", font_size=22, color=SOFT, line_spacing=0.95).to_edge(DOWN, buff=0.7) + + self.play(FadeIn(title_fix, shift=DOWN * 0.1), run_time=0.7) + self.play(FadeIn(z6g), FadeIn(t6g), FadeIn(y6g), run_time=0.9) + self.play(GrowArrow(zt6), GrowArrow(ty6), run_time=0.9) + self.play(Indicate(z6g, color=INSTRUMENT), run_time=0.8) + self.play(Write(callback), run_time=1.6) + self.wait(14.45 - 4.9) + self.wait(self.WAIT_TAIL) + + +# ═══════════════════════════════════════════════════════════════════ +# Scene 07 — Outro +# ═══════════════════════════════════════════════════════════════════ + + +class Scene07_Outro(Scene): + """ + Scene 07: 아웃트로 — 현실 속 우연 찾기. + + Core Claim: + 도구변수 분석에서 가장 어려운 일은 수식이 아니라, 현실 속에 + 이미 존재하는 우연을 찾아내는 일이다. 무작위 배정이 불가능한 + 질문 앞에서, 자연이 던진 동전을 찾는 안목이 다음 단계다. + + Visual Pivot: + 세 역사적 장면(수도 회사, 빙고볼, 생일)이 한 줄로 등장한 뒤, + 공통점인 "우연"이 한 단어로 응축되는 순간. + + Script: src/scripts/07_outro.txt — 3 chunks, 33.86s + """ + + WAIT_TAIL = 1.5 + + def construct(self): + durations = load_scene_timing_durations("07_outro") + # durations ≈ [16.56, 8.35, 8.95] + + # Beat 1 (0~16.56s): 세 장면 회상 + title = Text("우연은 이미 우리 곁에 있다", font_size=32, weight=BOLD, color=ACCENT).to_edge(UP, buff=0.5) + # 세 미니 카드 + snow = self._make_vignette("droplet.svg", CLEAN_WATER, "1854 런던", "수도 회사") + draft = self._make_vignette("dice.svg", ACCENT, "1969 미국", "징집 추첨") + birth = self._make_vignette("cake.svg", PINK, "어쩌면", "여러분의 생일") + vignettes = VGroup(snow, draft, birth).arrange(RIGHT, buff=0.9).move_to(ORIGIN + UP * 0.2) + common = Text("모두 현실 속 우연", font_size=24, color=SOFT).to_edge(DOWN, buff=1.2) + + self.play(FadeIn(title, shift=DOWN * 0.1), run_time=0.7) + self.play(LaggedStart(*[FadeIn(v, shift=UP * 0.2) for v in vignettes], lag_ratio=0.25), run_time=1.8) + self.play(Write(common), run_time=1.2) + self.wait(16.56 - 3.7) + + # Beat 2 (16.56~24.91s): 가장 어려운 일은 우연 찾기 + self.play(FadeOut(common), run_time=0.4) + hard_line = Text("가장 어려운 일은 수식이 아니라", font_size=26, color=WHITE).move_to(DOWN * 1.4) + hard_line2 = Text("우연을 찾아내는 일이다", font_size=30, weight=BOLD, color=INSTRUMENT).next_to(hard_line, DOWN, buff=0.3) + self.play(Write(hard_line), run_time=1.2) + self.play(Write(hard_line2), run_time=1.4) + self.wait(8.35 - 3.0) + + # Beat 3 (24.91~33.86s): 닫기 카드 + self.play(FadeOut(VGroup(title, vignettes, hard_line, hard_line2)), run_time=0.7) + close_line1 = Text("무작위 배정을 할 수 없다면,", font_size=30, color=WHITE).move_to(UP * 0.6) + close_line2 = Text("자연이 이미 던진 동전을 찾아내세요.", font_size=30, weight=BOLD, color=INSTRUMENT).next_to(close_line1, DOWN, buff=0.4) + end_tag = Text("그게 인과추론의 다음 단계입니다.", font_size=22, color=SOFT).next_to(close_line2, DOWN, buff=0.6) + + self.play(Write(close_line1), run_time=1.2) + self.play(Write(close_line2), run_time=1.4) + self.play(FadeIn(end_tag, shift=UP * 0.1), run_time=1.0) + self.wait(8.95 - 3.6) + self.wait(self.WAIT_TAIL) + + @staticmethod + def _make_vignette(icon_name: str, color: str, year: str, name: str) -> VGroup: + try: + icon = load_icon(icon_name, color, 0.9) + except Exception: + # 폴백: 색 원 + icon = Circle(radius=0.4, color=color, stroke_width=3) + year_text = Text(year, font_size=20, color=color, weight=BOLD) + name_text = Text(name, font_size=18, color=WHITE) + block = VGroup(icon, year_text, name_text).arrange(DOWN, buff=0.25) + return block diff --git a/videos/iv/src/iv_en.py b/videos/iv/src/iv_en.py new file mode 100644 index 0000000..feef708 --- /dev/null +++ b/videos/iv/src/iv_en.py @@ -0,0 +1,731 @@ +"""IV (Instrumental Variables) — English narration version. + +Parallel to iv.py with the same 7-Scene structure and identical visual layout, +but with English on-screen text and English-audio timings. + +Audio files: build/audio/{NN}_{scene}_en.{mp3,timings.json} +Class names: {SceneNN}_{Name}EN — suffix avoids render output collisions +with the Korean version under build/manim/videos/iv/1080p60/. + +Helpers (load_icon, color palette, etc.) are imported from iv.py — single +source of truth for layout primitives. Only text strings and per-Beat wait +durations differ. +""" + +from manim import * + +from iv import ( + load_icon, + load_scene_timing_durations, + make_forbidden_card, + make_school_row, + ACCENT, + COIN_COLOR, + TREAT_COLOR, + CONTROL_COLOR, + FORBIDDEN, + CLEAN_WATER, + DIRTY_WATER, + INSTRUMENT, + COMPLIER, + ALWAYS_TAKER, + NEVER_TAKER, + SOFT, +) + + +# ═══════════════════════════════════════════════════════════════════ +# Scene 01 EN — Snow Pumps +# ═══════════════════════════════════════════════════════════════════ + + +class Scene01_SnowPumpsEN(Scene): + """English version of Scene 01 (Snow Pumps). + 7 chunks, ~80.11s. Mirrors Korean layout exactly. + """ + + WAIT_TAIL = 2.0 + + def construct(self): + d = load_scene_timing_durations("01_snow_pumps_en") + + # Beat 1: RCT recap + coin = load_icon("coin.svg", COIN_COLOR, 1.4).move_to(ORIGIN + UP * 0.3) + treat_dots = VGroup(*[Dot(radius=0.13, color=TREAT_COLOR) for _ in range(4)]) + treat_dots.arrange(RIGHT, buff=0.18) + treat_label = Text("Treated", font_size=22, color=TREAT_COLOR) + treat_group = VGroup(treat_dots, treat_label).arrange(DOWN, buff=0.18).move_to(LEFT * 3.2 + DOWN * 1.4) + control_dots = VGroup(*[Dot(radius=0.13, color=CONTROL_COLOR) for _ in range(4)]) + control_dots.arrange(RIGHT, buff=0.18) + control_label = Text("Control", font_size=22, color=CONTROL_COLOR) + control_group = VGroup(control_dots, control_label).arrange(DOWN, buff=0.18).move_to(RIGHT * 3.2 + DOWN * 1.4) + split_arrow_l = Arrow(coin.get_corner(DL), treat_group.get_top(), buff=0.2, color=SOFT, stroke_width=3) + split_arrow_r = Arrow(coin.get_corner(DR), control_group.get_top(), buff=0.2, color=SOFT, stroke_width=3) + bias_badge = Text("Bias = 0", font_size=26, weight=BOLD, color=GREEN).move_to(DOWN * 3.0) + + self.play(FadeIn(coin, scale=0.8), run_time=0.8) + self.play(Rotate(coin, angle=2 * PI, axis=UP), run_time=1.2) + self.play(GrowArrow(split_arrow_l), GrowArrow(split_arrow_r), + FadeIn(treat_group, shift=DOWN * 0.2), FadeIn(control_group, shift=DOWN * 0.2), run_time=1.5) + self.play(FadeIn(bias_badge, shift=UP * 0.15), run_time=0.8) + self.wait(d[0] - 4.3) + + # Beat 2: forbidden coins + coin_small_target = coin.copy().scale(0.45).to_corner(UL, buff=0.5) + smoking_card = make_forbidden_card("Smoking randomized\nfor pregnant women").move_to(LEFT * 2.8 + UP * 0.4) + army_card = make_forbidden_card("Who gets drafted\ninto the army").move_to(RIGHT * 2.8 + UP * 0.4) + forbidden_caption = Text("Coins the experimenter can't flip", font_size=24, color=FORBIDDEN).move_to(DOWN * 1.8) + + self.play(FadeOut(treat_group), FadeOut(control_group), FadeOut(split_arrow_l), + FadeOut(split_arrow_r), FadeOut(bias_badge), Transform(coin, coin_small_target), run_time=1.0) + self.play(FadeIn(smoking_card, shift=UP * 0.15), FadeIn(army_card, shift=UP * 0.15), run_time=1.4) + self.play(FadeIn(forbidden_caption, shift=UP * 0.1), run_time=0.8) + self.wait(d[1] - 3.2) + + # Beat 3: the question + big_question = Text("?", font_size=180, weight=BOLD, color=ACCENT).move_to(ORIGIN + UP * 0.2) + question_caption = Text("Who can flip it for us?", font_size=30, color=WHITE).next_to(big_question, DOWN, buff=0.5) + + self.play(FadeOut(smoking_card), FadeOut(army_card), FadeOut(forbidden_caption), run_time=0.7) + self.play(FadeIn(big_question, scale=0.6), run_time=1.0) + self.play(Write(question_caption), run_time=1.0) + self.wait(d[2] - 2.7) + + # Beat 4: 1854 London + date_label = Text("London, 1854", font_size=30, weight=BOLD, color=SOFT).to_edge(UP, buff=0.5) + streets = VGroup(*[ + Rectangle(width=5.0, height=0.35, stroke_color=GREY_C, stroke_width=2, + fill_color=GREY_E, fill_opacity=0.35) for _ in range(6) + ]) + streets.arrange(DOWN, buff=0.18).move_to(ORIGIN + DOWN * 0.2) + clean_drop = load_icon("droplet.svg", CLEAN_WATER, 0.7) + clean_name = Text("Lambeth\n(clean upstream)", font_size=20, color=CLEAN_WATER, line_spacing=0.9) + clean_group = VGroup(clean_drop, clean_name).arrange(DOWN, buff=0.18).next_to(streets, LEFT, buff=0.6) + dirty_drop = load_icon("droplet.svg", DIRTY_WATER, 0.7) + dirty_name = Text("S & V\n(sewage-mixed)", font_size=20, color=DIRTY_WATER, line_spacing=0.9) + dirty_group = VGroup(dirty_drop, dirty_name).arrange(DOWN, buff=0.18).next_to(streets, RIGHT, buff=0.6) + + self.play(FadeOut(big_question), FadeOut(question_caption), FadeOut(coin), run_time=0.7) + self.play(FadeIn(date_label, shift=DOWN * 0.1), run_time=0.7) + self.play(LaggedStart(*[Create(s) for s in streets], lag_ratio=0.12), run_time=1.6) + self.play(FadeIn(clean_group, shift=RIGHT * 0.2), FadeIn(dirty_group, shift=LEFT * 0.2), run_time=1.2) + self.wait(d[3] - 4.2) + + # Beat 5: random street assignment + assignment = [CLEAN_WATER, DIRTY_WATER, DIRTY_WATER, CLEAN_WATER, DIRTY_WATER, CLEAN_WATER] + street_fills = [ + street.animate.set_fill(color, opacity=0.75).set_stroke(color=color) + for street, color in zip(streets, assignment) + ] + self.play(LaggedStart(*street_fills, lag_ratio=0.18), run_time=2.4) + chance_label = Text("Almost an accident", font_size=32, weight=BOLD, color=ACCENT).move_to(DOWN * 3.0) + chance_box = SurroundingRectangle(chance_label, color=ACCENT, buff=0.15) + self.play(FadeIn(chance_label, shift=UP * 0.1), Create(chance_box), run_time=1.0) + self.wait(d[4] - 3.4) + + # Beat 6: nature's coin + nature_coin = load_icon("coin.svg", COIN_COLOR, 1.6).move_to(ORIGIN + UP * 0.5) + nature_caption = Text("A coin flipped by nature", font_size=28, color=COIN_COLOR).next_to(nature_coin, DOWN, buff=0.4) + + self.play(streets.animate.set_opacity(0.25), + clean_group.animate.set_opacity(0.4), + dirty_group.animate.set_opacity(0.4), + chance_label.animate.set_opacity(0.4), + chance_box.animate.set_opacity(0.4), run_time=0.7) + self.play(FadeIn(nature_coin, scale=0.7), run_time=0.9) + self.play(Rotate(nature_coin, angle=2 * PI, axis=UP), Write(nature_caption), run_time=1.4) + self.wait(d[5] - 3.0) + + # Beat 7: title card + title_group_old = VGroup(date_label, streets, clean_group, dirty_group, + chance_label, chance_box, nature_coin, nature_caption) + self.play(FadeOut(title_group_old), run_time=0.7) + topic_title = Text("Instrumental Variable", font_size=64, weight=BOLD, color=INSTRUMENT) + topic_sub = Text("IV", font_size=36, color=SOFT) + title_stack = VGroup(topic_title, topic_sub).arrange(DOWN, buff=0.3).move_to(UP * 1.2) + z_node = Circle(radius=0.42, color=INSTRUMENT, stroke_width=3) + z_label = Text("Z", font_size=28, color=INSTRUMENT, weight=BOLD).move_to(z_node) + z_group = VGroup(z_node, z_label).move_to(LEFT * 2.8 + DOWN * 1.6) + t_node = Circle(radius=0.42, color=TREAT_COLOR, stroke_width=3) + t_label = Text("T", font_size=28, color=TREAT_COLOR, weight=BOLD).move_to(t_node) + t_group = VGroup(t_node, t_label).move_to(ORIGIN + DOWN * 1.6) + y_node = Circle(radius=0.42, color=CONTROL_COLOR, stroke_width=3) + y_label = Text("Y", font_size=28, color=CONTROL_COLOR, weight=BOLD).move_to(y_node) + y_group = VGroup(y_node, y_label).move_to(RIGHT * 2.8 + DOWN * 1.6) + zt_arrow = Arrow(z_group.get_right(), t_group.get_left(), buff=0.12, color=WHITE, stroke_width=3) + ty_arrow = Arrow(t_group.get_right(), y_group.get_left(), buff=0.12, color=WHITE, stroke_width=3) + + self.play(FadeIn(title_stack, shift=DOWN * 0.2), run_time=1.0) + self.play(FadeIn(z_group), FadeIn(t_group), FadeIn(y_group), run_time=0.9) + self.play(GrowArrow(zt_arrow), GrowArrow(ty_arrow), run_time=0.8) + self.play(Indicate(z_group, color=INSTRUMENT), run_time=0.9) + self.wait(d[6] - 3.6) + self.wait(self.WAIT_TAIL) + + +# ═══════════════════════════════════════════════════════════════════ +# Scene 02 EN — RCT Recap & Non-compliance Break +# ═══════════════════════════════════════════════════════════════════ + + +class Scene02_RctRecapBreakEN(Scene): + """English version of Scene 02. 5 chunks, ~68.98s.""" + + WAIT_TAIL = 1.5 + + def construct(self): + d = load_scene_timing_durations("02_rct_recap_break_en") + + # Beat 1: tablet RCT recap + title = Text("Tablet RCT recap", font_size=30, weight=BOLD, color=SOFT).to_edge(UP, buff=0.4) + coin = load_icon("coin.svg", COIN_COLOR, 1.0).move_to(UP * 1.0) + + assigned_t = make_school_row(4, TREAT_COLOR).move_to(LEFT * 2.7 + DOWN * 0.6) + assigned_t_label = Text("Assigned: Treatment", font_size=22, color=TREAT_COLOR).next_to(assigned_t, DOWN, buff=0.25) + assigned_c = make_school_row(4, CONTROL_COLOR).move_to(RIGHT * 2.7 + DOWN * 0.6) + assigned_c_label = Text("Assigned: Control", font_size=22, color=CONTROL_COLOR).next_to(assigned_c, DOWN, buff=0.25) + naive_eq = Text("Mean difference = causal effect", font_size=24, color=GREEN).move_to(DOWN * 2.5) + + self.play(FadeIn(title, shift=DOWN * 0.1), run_time=0.7) + self.play(FadeIn(coin, scale=0.8), run_time=0.7) + self.play(Rotate(coin, angle=2 * PI, axis=UP), run_time=1.0) + self.play(FadeIn(assigned_t, shift=DOWN * 0.15), FadeIn(assigned_t_label), + FadeIn(assigned_c, shift=DOWN * 0.15), FadeIn(assigned_c_label), run_time=1.4) + self.play(Write(naive_eq), run_time=1.2) + self.wait(d[0] - 5.0) + + # Beat 2: some refuse + refuse_caption = Text("Some refuse the tablet", font_size=22, color=FORBIDDEN).move_to(LEFT * 2.7 + DOWN * 1.9) + self.play(FadeOut(naive_eq), run_time=0.4) + self.play(FadeIn(refuse_caption, shift=UP * 0.1), run_time=0.7) + refuse_animations = [ + assigned_t[i].animate.set_color(CONTROL_COLOR).set_stroke(color=FORBIDDEN, width=2) + for i in (1, 3) + ] + self.play(LaggedStart(*refuse_animations, lag_ratio=0.3), run_time=1.6) + x_marks = VGroup(*[ + Cross(assigned_t[i], stroke_color=FORBIDDEN, stroke_width=3).scale(0.5) + for i in (1, 3) + ]) + self.play(FadeIn(x_marks), run_time=0.5) + self.wait(d[1] - 3.2) + + # Beat 3: some buy + buy_caption = Text("Some buy with their own funds", font_size=22, color=ACCENT).move_to(RIGHT * 2.7 + DOWN * 1.9) + self.play(FadeIn(buy_caption, shift=UP * 0.1), run_time=0.7) + buy_animations = [ + assigned_c[i].animate.set_color(TREAT_COLOR).set_stroke(color=ACCENT, width=2) + for i in (0, 2) + ] + self.play(LaggedStart(*buy_animations, lag_ratio=0.3), run_time=1.4) + stars = VGroup(*[ + Star(n=5, outer_radius=0.18, color=ACCENT, fill_opacity=0.9).move_to(assigned_c[i]) + for i in (0, 2) + ]) + self.play(FadeIn(stars, scale=0.6), run_time=0.5) + self.wait(d[2] - 2.6) + + # Beat 4: comparing by actual treatment brings bias back + previous = VGroup(title, coin, assigned_t, assigned_c, assigned_t_label, assigned_c_label, + refuse_caption, buy_caption, x_marks, stars) + warning = Text("If we compare by actual treatment…", font_size=26, color=FORBIDDEN).to_edge(UP, buff=0.6) + actual_t = VGroup(*[Dot(radius=0.20, color=TREAT_COLOR) for _ in range(4)]).arrange(RIGHT, buff=0.4).move_to(LEFT * 2.8 + UP * 0.2) + actual_t_label = Text("Actually treated", font_size=22, color=TREAT_COLOR).next_to(actual_t, DOWN, buff=0.25) + actual_c = VGroup(*[Dot(radius=0.20, color=CONTROL_COLOR) for _ in range(4)]).arrange(RIGHT, buff=0.4).move_to(RIGHT * 2.8 + UP * 0.2) + actual_c_label = Text("Actually untreated", font_size=22, color=CONTROL_COLOR).next_to(actual_c, DOWN, buff=0.25) + bias_eq = Text("Mean difference ≠ causal effect", font_size=28, weight=BOLD, color=FORBIDDEN).move_to(DOWN * 1.4) + bias_note = Text("Refusers = skeptical, Self-buyers = motivated", font_size=20, color=SOFT).next_to(bias_eq, DOWN, buff=0.4) + + self.play(FadeOut(previous), run_time=0.7) + self.play(FadeIn(warning, shift=DOWN * 0.1), run_time=0.7) + self.play(FadeIn(actual_t), FadeIn(actual_t_label), + FadeIn(actual_c), FadeIn(actual_c_label), run_time=1.2) + self.play(Write(bias_eq), run_time=1.0) + self.play(FadeIn(bias_note, shift=UP * 0.1), run_time=0.9) + self.wait(d[3] - 4.5) + + # Beat 5: only assignment is random + bridge_title = Text("Only the assignment is random", font_size=30, weight=BOLD, color=ACCENT).to_edge(UP, buff=0.5) + row_label_assign = Text("Assignment", font_size=22, color=SOFT) + row_label_actual = Text("Actual", font_size=22, color=SOFT) + assign_row = make_school_row(8, COIN_COLOR, spacing=0.30) + actual_row = VGroup(*[ + Dot(radius=0.18, color=c) for c in + [TREAT_COLOR, CONTROL_COLOR, TREAT_COLOR, CONTROL_COLOR, + TREAT_COLOR, TREAT_COLOR, CONTROL_COLOR, TREAT_COLOR] + ]) + actual_row.arrange(RIGHT, buff=0.30) + assign_block = VGroup(row_label_assign, assign_row).arrange(RIGHT, buff=0.6) + actual_block = VGroup(row_label_actual, actual_row).arrange(RIGHT, buff=0.6) + rows_block = VGroup(assign_block, actual_block).arrange(DOWN, aligned_edge=LEFT, buff=0.7).move_to(UP * 0.2) + random_badge = Text("Random ✓", font_size=20, color=GREEN).next_to(assign_block, RIGHT, buff=0.5) + not_random = Text("Not random ✗", font_size=20, color=FORBIDDEN).next_to(actual_block, RIGHT, buff=0.5) + pivot = Text("Use the randomness we still have → IV", font_size=24, weight=BOLD, color=INSTRUMENT).move_to(DOWN * 2.2) + + self.play(FadeOut(warning), FadeOut(actual_t), FadeOut(actual_t_label), + FadeOut(actual_c), FadeOut(actual_c_label), + FadeOut(bias_eq), FadeOut(bias_note), run_time=0.7) + self.play(FadeIn(bridge_title, shift=DOWN * 0.1), run_time=0.6) + self.play(FadeIn(rows_block, shift=UP * 0.15), run_time=1.4) + self.play(FadeIn(random_badge), FadeIn(not_random), run_time=0.8) + self.play(Write(pivot), run_time=1.4) + self.wait(d[4] - 4.9) + self.wait(self.WAIT_TAIL) + + +# ═══════════════════════════════════════════════════════════════════ +# Scene 03 EN — Three Types +# ═══════════════════════════════════════════════════════════════════ + + +class Scene03_ThreeTypesEN(Scene): + """English version of Scene 03. 6 chunks, ~65.88s.""" + + WAIT_TAIL = 1.5 + + def construct(self): + d = load_scene_timing_durations("03_three_types_en") + + # Beat 1: three types intro + title = Text("Three types the coin moves", font_size=30, weight=BOLD, color=ACCENT).to_edge(UP, buff=0.4) + type_names = ["Complier", "Always-taker", "Never-taker"] + type_colors = [COMPLIER, ALWAYS_TAKER, NEVER_TAKER] + cards = VGroup() + for name, color in zip(type_names, type_colors): + frame = RoundedRectangle(width=3.4, height=1.1, corner_radius=0.16, + stroke_color=color, stroke_width=2.5) + label = Text(name, font_size=24, weight=BOLD, color=color).move_to(frame.get_center()) + cards.add(VGroup(frame, label)) + cards.arrange(RIGHT, buff=0.4).move_to(UP * 0.6) + + self.play(FadeIn(title, shift=DOWN * 0.1), run_time=0.6) + self.play(LaggedStart(*[FadeIn(c, shift=UP * 0.2) for c in cards], lag_ratio=0.25), run_time=1.6) + self.wait(d[0] - 2.2) + + # Beat 2: complier + track_label_z1 = Text("Assigned: Treatment", font_size=20, color=COIN_COLOR) + track_label_z0 = Text("Assigned: Control", font_size=20, color=COIN_COLOR) + track_z1 = Line(LEFT * 2.5, RIGHT * 2.5, color=GREY_C, stroke_width=2) + track_z0 = Line(LEFT * 2.5, RIGHT * 2.5, color=GREY_C, stroke_width=2) + track1_block = VGroup(track_label_z1, track_z1).arrange(RIGHT, buff=0.4) + track0_block = VGroup(track_label_z0, track_z0).arrange(RIGHT, buff=0.4) + tracks = VGroup(track1_block, track0_block).arrange(DOWN, aligned_edge=LEFT, buff=1.0).move_to(DOWN * 0.3) + + complier_z1_dot = Dot(radius=0.20, color=TREAT_COLOR).move_to(track_z1.get_center()) + complier_z0_dot = Dot(radius=0.20, color=CONTROL_COLOR).move_to(track_z0.get_center()) + complier_caption = Text("Complier: follows the coin", font_size=24, color=COMPLIER).to_edge(DOWN, buff=0.5) + + self.play(FadeOut(cards), run_time=0.5) + self.play(FadeIn(tracks, shift=DOWN * 0.1), run_time=0.8) + self.play(FadeIn(complier_z1_dot, scale=0.7), FadeIn(complier_z0_dot, scale=0.7), run_time=0.8) + self.play(Write(complier_caption), run_time=1.2) + self.wait(d[1] - 3.3) + + # Beat 3: always-taker + always_z1 = Dot(radius=0.20, color=ALWAYS_TAKER).move_to(track_z1.get_center() + RIGHT * 0.9) + always_z0 = Dot(radius=0.20, color=ALWAYS_TAKER).move_to(track_z0.get_center() + RIGHT * 0.9) + always_caption = Text("Always-taker: treated regardless", font_size=24, color=ALWAYS_TAKER).to_edge(DOWN, buff=0.5) + + self.play(FadeOut(complier_caption), run_time=0.4) + self.play(FadeIn(always_z1, scale=0.7), FadeIn(always_z0, scale=0.7), run_time=0.8) + self.play(Write(always_caption), run_time=1.2) + self.wait(d[2] - 2.4) + + # Beat 4: never-taker + never_z1 = Dot(radius=0.20, color=NEVER_TAKER).move_to(track_z1.get_center() - RIGHT * 0.9) + never_z0 = Dot(radius=0.20, color=NEVER_TAKER).move_to(track_z0.get_center() - RIGHT * 0.9) + never_caption = Text("Never-taker: untreated regardless", font_size=24, color=NEVER_TAKER).to_edge(DOWN, buff=0.5) + + self.play(FadeOut(always_caption), run_time=0.4) + self.play(FadeIn(never_z1, scale=0.7), FadeIn(never_z0, scale=0.7), run_time=0.8) + self.play(Write(never_caption), run_time=1.2) + self.wait(d[3] - 2.4) + + # Beat 5: only complier moves + self.play(FadeOut(never_caption), run_time=0.4) + reveal = Text("Only compliers move with the coin", font_size=26, weight=BOLD, color=COMPLIER).to_edge(DOWN, buff=0.5) + complier_box_top = SurroundingRectangle(complier_z1_dot, color=COMPLIER, buff=0.15, stroke_width=3) + complier_box_bot = SurroundingRectangle(complier_z0_dot, color=COMPLIER, buff=0.15, stroke_width=3) + self.play( + always_z1.animate.set_opacity(0.45), always_z0.animate.set_opacity(0.45), + never_z1.animate.set_opacity(0.45), never_z0.animate.set_opacity(0.45), + run_time=0.7, + ) + self.play(Create(complier_box_top), Create(complier_box_bot), run_time=0.9) + self.play(Write(reveal), run_time=1.4) + self.wait(d[4] - 3.4) + + # Beat 6: LATE card + late_box = RoundedRectangle(width=8.0, height=2.0, corner_radius=0.2, + stroke_color=INSTRUMENT, stroke_width=3) + late_title = Text("LATE", font_size=42, weight=BOLD, color=INSTRUMENT) + late_sub = Text("Local Average Treatment Effect\nThe effect limited to compliers", font_size=22, + color=WHITE, line_spacing=0.95) + late_stack = VGroup(late_title, late_sub).arrange(DOWN, buff=0.25).move_to(late_box.get_center()) + + prior = VGroup(tracks, complier_z1_dot, complier_z0_dot, + complier_box_top, complier_box_bot, + always_z1, always_z0, never_z1, never_z0, reveal, title) + self.play(FadeOut(prior), run_time=0.7) + self.play(Create(late_box), run_time=0.9) + self.play(FadeIn(late_stack, shift=UP * 0.2), run_time=1.4) + self.wait(d[5] - 3.0) + self.wait(self.WAIT_TAIL) + + +# ═══════════════════════════════════════════════════════════════════ +# Scene 04 EN — Wald Machinery +# ═══════════════════════════════════════════════════════════════════ + + +class Scene04_IvMachineryEN(Scene): + """English version of Scene 04. 6 chunks, ~71.16s.""" + + WAIT_TAIL = 1.5 + + def construct(self): + d = load_scene_timing_durations("04_iv_machinery_en") + + # Beat 1: intro + title = Text("Computing LATE", font_size=32, weight=BOLD, color=ACCENT).to_edge(UP, buff=0.5) + intro = Text("The formula is surprisingly simple", font_size=26, color=SOFT).move_to(ORIGIN + UP * 0.3) + self.play(FadeIn(title, shift=DOWN * 0.1), run_time=0.7) + self.play(Write(intro), run_time=1.2) + self.wait(d[0] - 1.9) + + # Beat 2: numerator (with fix: label just below title, bars lower, larger box buff) + numerator_label = Text("Numerator: score difference from assignment", font_size=22, color=COIN_COLOR).next_to(title, DOWN, buff=0.4) + score_z1 = Text("Treatment\nassigned avg", font_size=18, color=TREAT_COLOR, line_spacing=0.9) + score_z0 = Text("Control\nassigned avg", font_size=18, color=CONTROL_COLOR, line_spacing=0.9) + bar_z1 = Rectangle(width=0.8, height=1.7, color=TREAT_COLOR, fill_opacity=0.7, stroke_width=0) + bar_z0 = Rectangle(width=0.8, height=1.3, color=CONTROL_COLOR, fill_opacity=0.7, stroke_width=0) + bar_block_z1 = VGroup(bar_z1, score_z1).arrange(DOWN, buff=0.25) + bar_block_z0 = VGroup(bar_z0, score_z0).arrange(DOWN, buff=0.25) + bars = VGroup(bar_block_z1, bar_block_z0).arrange(RIGHT, buff=1.4, aligned_edge=DOWN).move_to(DOWN * 1.1) + diff_brace = Brace(VGroup(bar_z1, bar_z0), direction=UP, buff=0.25, color=COIN_COLOR) + diff_text = Text("This difference", font_size=22, color=COIN_COLOR).next_to(diff_brace, UP, buff=0.2) + + self.play(FadeOut(intro), run_time=0.4) + self.play(FadeIn(numerator_label, shift=DOWN * 0.1), run_time=0.7) + self.play(FadeIn(bars, shift=UP * 0.15), run_time=1.2) + self.play(GrowFromCenter(diff_brace), FadeIn(diff_text, shift=DOWN * 0.1), run_time=1.0) + self.wait(d[1] - 3.3) + + # Beat 3: only compliers create the diff + explain = Text("Only compliers create this difference", font_size=26, weight=BOLD, color=COMPLIER).move_to(DOWN * 2.7) + complier_note = Text("(Always-takers / never-takers don't respond to the coin)", font_size=18, color=SOFT).next_to(explain, DOWN, buff=0.2) + self.play(FadeIn(explain, shift=UP * 0.1), run_time=1.0) + self.play(FadeIn(complier_note, shift=UP * 0.05), run_time=0.7) + numer_box = SurroundingRectangle(VGroup(bars, diff_brace, diff_text), color=COIN_COLOR, buff=0.4) + self.play(Create(numer_box), run_time=1.0) + self.wait(d[2] - 2.7) + + # Beat 4: divide by share + divide_caption = Text("→ Divide by the share of compliers", font_size=26, color=ACCENT).move_to(DOWN * 3.4) + self.play(FadeOut(complier_note), run_time=0.3) + self.play(FadeIn(divide_caption, shift=UP * 0.1), run_time=1.0) + self.wait(d[3] - 1.3) + + # Beat 5: denominator + previous = VGroup(numerator_label, bars, diff_brace, diff_text, + explain, numer_box, divide_caption) + self.play(FadeOut(previous), run_time=0.7) + denom_label = Text("Denominator: share the coin moved", font_size=24, color=INSTRUMENT).move_to(UP * 1.6) + ratio_block_left = self._make_ratio_block("Among treatment\nassigned, used", filled=6, total=8, color=TREAT_COLOR) + ratio_block_right = self._make_ratio_block("Among control\nassigned, used", filled=2, total=8, color=CONTROL_COLOR) + ratios = VGroup(ratio_block_left, ratio_block_right).arrange(RIGHT, buff=1.2).move_to(DOWN * 0.2) + complier_pct = Text("≈ Share of compliers (6/8 − 2/8 = 50%)", font_size=22, color=COMPLIER).move_to(DOWN * 2.5) + + self.play(FadeIn(denom_label, shift=DOWN * 0.1), run_time=0.7) + self.play(FadeIn(ratios, shift=UP * 0.15), run_time=1.5) + self.play(Write(complier_pct), run_time=1.4) + self.wait(d[4] - 3.6) + + # Beat 6: Wald estimator + self.play(FadeOut(VGroup(denom_label, ratios, complier_pct)), run_time=0.7) + wald_title = Text("Wald Estimator", font_size=32, weight=BOLD, color=INSTRUMENT).to_edge(UP, buff=1.2) + numer_line = Text("Score difference from assignment", font_size=26, color=COIN_COLOR) + bar = Line(LEFT * 3.5, RIGHT * 3.5, color=WHITE, stroke_width=3) + denom_line = Text("Share of compliers", font_size=26, color=INSTRUMENT) + fraction = VGroup(numer_line, bar, denom_line).arrange(DOWN, buff=0.25).move_to(ORIGIN + UP * 0.1) + equals = Text("= LATE", font_size=30, weight=BOLD, color=COMPLIER).next_to(fraction, DOWN, buff=0.5) + meaning = Text("Effect of treatment on a single complier", font_size=22, color=SOFT).next_to(equals, DOWN, buff=0.3) + + self.play(FadeIn(wald_title, shift=DOWN * 0.1), run_time=0.7) + self.play(FadeIn(numer_line, shift=UP * 0.1), run_time=0.9) + self.play(Create(bar), run_time=0.5) + self.play(FadeIn(denom_line, shift=DOWN * 0.1), run_time=0.9) + self.play(Write(equals), run_time=1.0) + self.play(FadeIn(meaning, shift=UP * 0.05), run_time=0.9) + self.wait(d[5] - 4.9) + self.wait(self.WAIT_TAIL) + + @staticmethod + def _make_ratio_block(title_text: str, filled: int, total: int, color: str) -> VGroup: + title = Text(title_text, font_size=18, color=color, line_spacing=0.9) + dots = VGroup() + for i in range(total): + d = Dot(radius=0.13, color=color if i < filled else GREY_D) + if i >= filled: + d.set_fill(opacity=0.3) + dots.add(d) + dots.arrange(RIGHT, buff=0.18) + ratio_text = Text(f"{filled}/{total}", font_size=24, weight=BOLD, color=color) + block = VGroup(title, dots, ratio_text).arrange(DOWN, buff=0.25) + return block + + +# ═══════════════════════════════════════════════════════════════════ +# Scene 05 EN — Three Assumptions +# ═══════════════════════════════════════════════════════════════════ + + +class Scene05_ThreeAssumptionsEN(Scene): + """English version of Scene 05. 5 chunks, ~69.91s.""" + + WAIT_TAIL = 1.5 + + def construct(self): + d = load_scene_timing_durations("05_three_assumptions_en") + + # Beat 1: three locks + title = Text("IV's three locks", font_size=32, weight=BOLD, color=ACCENT).to_edge(UP, buff=0.5) + lock_names = ["Relevance", "Exclusion", "Independence"] + locks = VGroup() + for name in lock_names: + lk = load_icon("lock.svg", FORBIDDEN, 1.1) + nm = Text(name, font_size=22, weight=BOLD, color=WHITE).next_to(lk, DOWN, buff=0.25) + locks.add(VGroup(lk, nm)) + locks.arrange(RIGHT, buff=1.5).move_to(DOWN * 0.4) + + self.play(FadeIn(title, shift=DOWN * 0.1), run_time=0.7) + self.play(LaggedStart(*[FadeIn(lk, shift=UP * 0.15) for lk in locks], lag_ratio=0.25), run_time=1.6) + warning = Text("If even one fails, you can't trust the result", font_size=22, color=SOFT).to_edge(DOWN, buff=0.6) + self.play(Write(warning), run_time=1.4) + self.wait(d[0] - 3.7) + + # Beat 2: relevance (fix: locks fully fade, not shrunk) + self.play(FadeOut(warning), FadeOut(locks), run_time=0.8) + + z_node = Circle(radius=0.45, color=INSTRUMENT, stroke_width=3) + z_text = Text("Z", font_size=26, weight=BOLD, color=INSTRUMENT).move_to(z_node) + z_grp = VGroup(z_node, z_text).move_to(LEFT * 2.8 + DOWN * 0.5) + t_node = Circle(radius=0.45, color=TREAT_COLOR, stroke_width=3) + t_text = Text("T", font_size=26, weight=BOLD, color=TREAT_COLOR).move_to(t_node) + t_grp = VGroup(t_node, t_text).move_to(RIGHT * 2.8 + DOWN * 0.5) + strong_arrow = Arrow(z_grp.get_right(), t_grp.get_left(), buff=0.12, color=GREEN, stroke_width=8) + strong_label = Text("Z strongly moves T ✓", font_size=22, color=GREEN).next_to(strong_arrow, UP, buff=0.3) + weak_arrow = Arrow(z_grp.get_right(), t_grp.get_left(), buff=0.12, color=FORBIDDEN, stroke_width=2) + weak_label = Text("Weak → denominator ≈ 0 → estimate explodes ✗", font_size=22, color=FORBIDDEN).next_to(weak_arrow, DOWN, buff=0.3) + + self.play(FadeIn(z_grp), FadeIn(t_grp), run_time=0.8) + self.play(GrowArrow(strong_arrow), FadeIn(strong_label, shift=DOWN * 0.1), run_time=1.0) + self.play(Transform(strong_arrow, weak_arrow), FadeIn(weak_label, shift=UP * 0.1), run_time=1.4) + self.wait(d[1] - 3.2) + + # Beat 3: exclusion + previous = VGroup(z_grp, t_grp, strong_arrow, strong_label, weak_label) + self.play(FadeOut(previous), run_time=0.6) + + z_node2 = Circle(radius=0.4, color=INSTRUMENT, stroke_width=3) + z_text2 = Text("Z", font_size=24, weight=BOLD, color=INSTRUMENT).move_to(z_node2) + z_grp2 = VGroup(z_node2, z_text2).move_to(LEFT * 3.5 + DOWN * 0.3) + t_node2 = Circle(radius=0.4, color=TREAT_COLOR, stroke_width=3) + t_text2 = Text("T", font_size=24, weight=BOLD, color=TREAT_COLOR).move_to(t_node2) + t_grp2 = VGroup(t_node2, t_text2).move_to(ORIGIN + DOWN * 0.3) + y_node2 = Circle(radius=0.4, color=CONTROL_COLOR, stroke_width=3) + y_text2 = Text("Y", font_size=24, weight=BOLD, color=CONTROL_COLOR).move_to(y_node2) + y_grp2 = VGroup(y_node2, y_text2).move_to(RIGHT * 3.5 + DOWN * 0.3) + zt_arrow2 = Arrow(z_grp2.get_right(), t_grp2.get_left(), buff=0.12, color=WHITE, stroke_width=3) + ty_arrow2 = Arrow(t_grp2.get_right(), y_grp2.get_left(), buff=0.12, color=WHITE, stroke_width=3) + zy_arc = CurvedArrow(z_grp2.get_top(), y_grp2.get_top(), color=FORBIDDEN, stroke_width=3, angle=-1.4) + zy_cross = Cross(zy_arc, stroke_color=FORBIDDEN, stroke_width=4).scale(1.0) + excl_label = Text("Z → Y must only pass through T", font_size=22, color=WHITE).to_edge(DOWN, buff=0.8) + + self.play(FadeIn(z_grp2), FadeIn(t_grp2), FadeIn(y_grp2), run_time=0.9) + self.play(GrowArrow(zt_arrow2), GrowArrow(ty_arrow2), run_time=0.9) + self.play(Create(zy_arc), run_time=0.8) + self.play(FadeIn(zy_cross, scale=0.7), run_time=0.6) + self.play(Write(excl_label), run_time=1.4) + self.wait(d[2] - 4.6) + + # Beat 4: independence + previous2 = VGroup(z_grp2, t_grp2, y_grp2, zt_arrow2, ty_arrow2, zy_arc, zy_cross, excl_label) + self.play(FadeOut(previous2), run_time=0.6) + indep_title = Text("Z must be independent of potential outcomes", font_size=24, weight=BOLD, color=ACCENT).to_edge(UP, buff=1.4) + coin_small = load_icon("coin.svg", COIN_COLOR, 1.0).move_to(LEFT * 3.0) + latent_box = RoundedRectangle(width=3.8, height=1.4, corner_radius=0.15, + stroke_color=SOFT, stroke_width=2) + latent_text = Text("Potential outcomes\n( Y₀, Y₁ )", font_size=22, color=WHITE, line_spacing=0.95).move_to(latent_box.get_center()) + latent_grp = VGroup(latent_box, latent_text).move_to(RIGHT * 2.5) + indep_sym = Text("⊥", font_size=46, weight=BOLD, color=GREEN).move_to(ORIGIN) + check_note = Text("Randomized assignment: satisfied by design\nNature's coin: argue case by case", font_size=20, color=SOFT, line_spacing=0.95).to_edge(DOWN, buff=0.6) + + self.play(FadeIn(indep_title, shift=DOWN * 0.1), run_time=0.7) + self.play(FadeIn(coin_small), FadeIn(latent_grp), run_time=1.0) + self.play(Write(indep_sym), run_time=0.8) + self.play(FadeIn(check_note, shift=UP * 0.1), run_time=1.4) + self.wait(d[3] - 3.9) + + # Beat 5: all three unlock + previous3 = VGroup(indep_title, coin_small, latent_grp, indep_sym, check_note) + self.play(FadeOut(previous3), run_time=0.6) + unlocks = VGroup() + for name in lock_names: + uk = load_icon("lock-open.svg", GREEN, 1.1) + nm = Text(name, font_size=22, weight=BOLD, color=GREEN).next_to(uk, DOWN, buff=0.25) + unlocks.add(VGroup(uk, nm)) + unlocks.arrange(RIGHT, buff=1.5).move_to(DOWN * 0.4) + door_caption = Text("Only when all three open does the IV door open", font_size=24, weight=BOLD, color=INSTRUMENT).to_edge(DOWN, buff=0.6) + + self.play(LaggedStart(*[FadeIn(uk, shift=UP * 0.15) for uk in unlocks], lag_ratio=0.2), run_time=1.4) + self.play(Write(door_caption), run_time=1.6) + self.wait(d[4] - 3.0) + self.wait(self.WAIT_TAIL) + + +# ═══════════════════════════════════════════════════════════════════ +# Scene 06 EN — Draft Lottery +# ═══════════════════════════════════════════════════════════════════ + + +class Scene06_DraftLotteryEN(Scene): + """English version of Scene 06. 5 chunks, ~71.26s.""" + + WAIT_TAIL = 1.5 + + def construct(self): + d = load_scene_timing_durations("06_draft_lottery_en") + + # Beat 1: national scale intro + title = Text("Same trick, national scale", font_size=32, weight=BOLD, color=ACCENT).to_edge(UP, buff=0.5) + scale_up = Text("Not just for small experiments", font_size=24, color=SOFT).move_to(ORIGIN + UP * 0.2) + self.play(FadeIn(title, shift=DOWN * 0.1), run_time=0.7) + self.play(Write(scale_up), run_time=1.2) + self.wait(d[0] - 1.9) + + # Beat 2: 1969 USA draft + self.play(FadeOut(scale_up), run_time=0.4) + date_label = Text("USA · 1969", font_size=28, weight=BOLD, color=SOFT).to_edge(UP, buff=1.4) + balls = VGroup() + ball_nums = ["73", "144", "012"] + for num in ball_nums: + ball = Circle(radius=0.5, color=ACCENT, stroke_width=3, fill_color=YELLOW_A, fill_opacity=0.9) + ball_num = Text(num, font_size=22, weight=BOLD, color=BLACK).move_to(ball) + balls.add(VGroup(ball, ball_num)) + balls.arrange(RIGHT, buff=0.5).move_to(UP * 0.2) + ball_caption = Text("365 birthday balls drawn at random", font_size=22, color=WHITE).next_to(balls, DOWN, buff=0.5) + rule = Text("Low number → drafted", font_size=24, weight=BOLD, color=INSTRUMENT).move_to(DOWN * 1.5) + independence_note = Text("Birthdate is unrelated to education or job", font_size=20, color=SOFT).next_to(rule, DOWN, buff=0.3) + + self.play(FadeIn(date_label, shift=DOWN * 0.1), run_time=0.7) + self.play(LaggedStart(*[FadeIn(b, shift=DOWN * 0.2, scale=0.7) for b in balls], lag_ratio=0.2), run_time=1.4) + self.play(Write(ball_caption), run_time=1.4) + self.play(Write(rule), run_time=1.0) + self.play(FadeIn(independence_note, shift=UP * 0.1), run_time=0.9) + self.wait(d[1] - 5.4) + + # Beat 3: Angrist's question + prior = VGroup(date_label, balls, ball_caption, rule, independence_note) + self.play(FadeOut(prior), run_time=0.6) + angrist = Text("Joshua Angrist's question", font_size=26, weight=BOLD, color=ACCENT).to_edge(UP, buff=1.2) + question = Text('"What is the effect of military service on lifetime earnings?"', font_size=24, color=WHITE).move_to(ORIGIN + UP * 0.4) + t_q = Text("Service", font_size=24, color=TREAT_COLOR) + y_q = Text("Earnings", font_size=24, color=CONTROL_COLOR) + arrow_q = Arrow(LEFT * 1.0, RIGHT * 1.0, buff=0.05, color=WHITE, stroke_width=4) + chain = VGroup(t_q, arrow_q, y_q).arrange(RIGHT, buff=0.3).move_to(DOWN * 1.0) + + self.play(FadeIn(angrist, shift=DOWN * 0.1), run_time=0.7) + self.play(Write(question), run_time=1.4) + self.play(FadeIn(chain, shift=UP * 0.1), run_time=1.0) + self.wait(d[2] - 3.1) + + # Beat 4: naive bias + bias_warn = Text("Veterans vs non-veterans simple comparison → bias", font_size=22, color=FORBIDDEN).to_edge(DOWN, buff=2.2) + bias_reason = Text("Those who chose to serve differ from those who avoided", font_size=20, color=SOFT).next_to(bias_warn, DOWN, buff=0.25) + self.play(FadeIn(bias_warn, shift=UP * 0.1), run_time=1.0) + self.play(FadeIn(bias_reason, shift=UP * 0.05), run_time=0.9) + self.wait(d[3] - 1.9) + + # Beat 5: lottery as IV + Snow callback + prior2 = VGroup(angrist, question, chain, bias_warn, bias_reason) + self.play(FadeOut(prior2), run_time=0.6) + title_fix = Text("Lottery number = instrument", font_size=30, weight=BOLD, color=INSTRUMENT).to_edge(UP, buff=1.2) + z6 = Circle(radius=0.4, color=INSTRUMENT, stroke_width=3) + z6t = Text("Lottery", font_size=18, color=INSTRUMENT, weight=BOLD).move_to(z6) + z6g = VGroup(z6, z6t).move_to(LEFT * 3.5 + DOWN * 0.2) + t6 = Circle(radius=0.4, color=TREAT_COLOR, stroke_width=3) + t6t = Text("Service", font_size=18, color=TREAT_COLOR, weight=BOLD).move_to(t6) + t6g = VGroup(t6, t6t).move_to(ORIGIN + DOWN * 0.2) + y6 = Circle(radius=0.4, color=CONTROL_COLOR, stroke_width=3) + y6t = Text("Earnings", font_size=18, color=CONTROL_COLOR, weight=BOLD).move_to(y6) + y6g = VGroup(y6, y6t).move_to(RIGHT * 3.5 + DOWN * 0.2) + zt6 = Arrow(z6g.get_right(), t6g.get_left(), buff=0.12, color=WHITE, stroke_width=3) + ty6 = Arrow(t6g.get_right(), y6g.get_left(), buff=0.12, color=WHITE, stroke_width=3) + callback = Text("Snow's water company trick from a century earlier\nworked in the US labor market too", font_size=22, color=SOFT, line_spacing=0.95).to_edge(DOWN, buff=0.7) + + self.play(FadeIn(title_fix, shift=DOWN * 0.1), run_time=0.7) + self.play(FadeIn(z6g), FadeIn(t6g), FadeIn(y6g), run_time=0.9) + self.play(GrowArrow(zt6), GrowArrow(ty6), run_time=0.9) + self.play(Indicate(z6g, color=INSTRUMENT), run_time=0.8) + self.play(Write(callback), run_time=1.6) + self.wait(d[4] - 4.9) + self.wait(self.WAIT_TAIL) + + +# ═══════════════════════════════════════════════════════════════════ +# Scene 07 EN — Outro +# ═══════════════════════════════════════════════════════════════════ + + +class Scene07_OutroEN(Scene): + """English version of Scene 07. 3 chunks, ~31.49s.""" + + WAIT_TAIL = 1.5 + + def construct(self): + d = load_scene_timing_durations("07_outro_en") + + # Beat 1: three vignettes + title = Text("Accidents are already around us", font_size=30, weight=BOLD, color=ACCENT).to_edge(UP, buff=0.5) + snow = self._make_vignette("droplet.svg", CLEAN_WATER, "1854 London", "Water company") + draft = self._make_vignette("dice.svg", ACCENT, "1969 USA", "Draft lottery") + birth = self._make_vignette("cake.svg", PINK, "Maybe", "Your birthday") + vignettes = VGroup(snow, draft, birth).arrange(RIGHT, buff=0.9).move_to(ORIGIN + UP * 0.2) + common = Text("All accidents already in the real world", font_size=22, color=SOFT).to_edge(DOWN, buff=1.2) + + self.play(FadeIn(title, shift=DOWN * 0.1), run_time=0.7) + self.play(LaggedStart(*[FadeIn(v, shift=UP * 0.2) for v in vignettes], lag_ratio=0.25), run_time=1.8) + self.play(Write(common), run_time=1.2) + self.wait(d[0] - 3.7) + + # Beat 2: hardest part isn't the formula + self.play(FadeOut(common), run_time=0.4) + hard_line = Text("The hardest part isn't the formula", font_size=26, color=WHITE).move_to(DOWN * 1.4) + hard_line2 = Text("It's finding the accident", font_size=30, weight=BOLD, color=INSTRUMENT).next_to(hard_line, DOWN, buff=0.3) + self.play(Write(hard_line), run_time=1.2) + self.play(Write(hard_line2), run_time=1.4) + self.wait(d[1] - 3.0) + + # Beat 3: closing card + self.play(FadeOut(VGroup(title, vignettes, hard_line, hard_line2)), run_time=0.7) + close_line1 = Text("When you can't randomize,", font_size=28, color=WHITE).move_to(UP * 0.6) + close_line2 = Text("find the coin nature has already flipped.", font_size=28, weight=BOLD, color=INSTRUMENT).next_to(close_line1, DOWN, buff=0.4) + end_tag = Text("That's the next step in causal inference.", font_size=22, color=SOFT).next_to(close_line2, DOWN, buff=0.6) + + self.play(Write(close_line1), run_time=1.2) + self.play(Write(close_line2), run_time=1.4) + self.play(FadeIn(end_tag, shift=UP * 0.1), run_time=1.0) + self.wait(d[2] - 3.6) + self.wait(self.WAIT_TAIL) + + @staticmethod + def _make_vignette(icon_name: str, color: str, year: str, name: str) -> VGroup: + try: + icon = load_icon(icon_name, color, 0.9) + except Exception: + icon = Circle(radius=0.4, color=color, stroke_width=3) + year_text = Text(year, font_size=20, color=color, weight=BOLD) + name_text = Text(name, font_size=18, color=WHITE) + block = VGroup(icon, year_text, name_text).arrange(DOWN, buff=0.25) + return block diff --git a/videos/iv/src/scripts/.gitkeep b/videos/iv/src/scripts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/videos/iv/src/scripts/01_snow_pumps.txt b/videos/iv/src/scripts/01_snow_pumps.txt new file mode 100644 index 0000000..d2b5413 --- /dev/null +++ b/videos/iv/src/scripts/01_snow_pumps.txt @@ -0,0 +1,29 @@ +# Scene 01: snow_pumps +# 핵심 주장: 실험자가 동전을 못 던지는 현실에서, 자연이 던진 동전을 찾아내는 도구가 IV다. +# 직전 chapter 마지막 문장: "어떻게 하면 두 집단을 비교 가능하게 만들 수 있는가." +# 첫 문장: "지난 시간에 우리는 무작위 배정이 편향을 없앤다는 걸 봤습니다." +# ipynb 대응 셀: book/iv/iv_ko.ipynb 의 도입부 (아직 미작성) +# 길이 목표: ~50초 (TTS 기준) + +지난 시간에 우리는 무작위 배정이 편향을 없앤다는 걸 봤습니다. +실험자가 동전을 던져 누가 처치를 받을지 정하면, 편향이 사라지죠. + +하지만 현실의 인과 질문 대부분은 동전을 던질 수가 없습니다. +임산부에게 흡연을 배정할 수도 없고, +누구를 군대에 보낼지 연구자가 정할 수도 없습니다. + +그래서 한 가지 질문이 남습니다. +실험자가 동전을 던지지 못한다면, 누가 대신 던져 줄 수 있을까? + +1854년 런던. 의사 존 스노우는 콜레라가 휩쓰는 도시 한복판에 서 있었습니다. +당시 런던에는 가정에 물을 공급하는 회사가 두 곳이었고, +한 회사는 깨끗한 상류 물을, 다른 회사는 하수가 섞인 강물을 끌어다 썼습니다. + +중요한 건 이겁니다. +어느 회사의 물이 어느 거리로 들어갈지는, 가정의 형편이나 위생 습관과 거의 무관했습니다. +거의 우연이었던 겁니다. + +수도 회사의 배관망이, 스노우 대신 동전을 던져 주고 있었던 셈이죠. + +오늘 다룰 도구변수, 영어로 아이브이는, +바로 이렇게 현실 속 우연을 붙잡아 인과효과를 짚어내는 도구입니다. diff --git a/videos/iv/src/scripts/01_snow_pumps_en.txt b/videos/iv/src/scripts/01_snow_pumps_en.txt new file mode 100644 index 0000000..c152885 --- /dev/null +++ b/videos/iv/src/scripts/01_snow_pumps_en.txt @@ -0,0 +1,23 @@ +Last time we saw that random assignment wipes out bias. +If the experimenter flips a coin to decide who gets treated, the bias disappears. + +But most causal questions in the real world don't let us flip a coin. +We can't randomly assign smoking to pregnant women. +We can't randomly decide who gets drafted into the army. + +So one question remains. +If the experimenter can't flip the coin, who can flip it for us? + +London, 1854. Dr. John Snow stood in the middle of a city devastated by cholera. +At the time, two companies supplied water to London homes. +One drew clean water from upstream, the other drew sewage-mixed water from the lower Thames. + +Here's the key. +Which company served which street had almost nothing to do with a family's income or hygiene. +It was, for all practical purposes, an accident. + +The water pipe network was, in effect, flipping a coin on Snow's behalf. + +Today's topic, the instrumental variable or IV, +is exactly this kind of tool — one that catches accidents that already exist in the world, +and uses them to pin down a causal effect. diff --git a/videos/iv/src/scripts/02_rct_recap_break.txt b/videos/iv/src/scripts/02_rct_recap_break.txt new file mode 100644 index 0000000..06213e4 --- /dev/null +++ b/videos/iv/src/scripts/02_rct_recap_break.txt @@ -0,0 +1,18 @@ +지난 시간 태블릿 실험을 다시 떠올려 봅시다. +연구진이 동전을 던져 어느 학교가 태블릿을 받을지 무작위로 정했죠. +이론적으로는 두 집단의 평균 점수를 비교하면 곧장 인과효과가 나옵니다. + +그런데 현실에서는 한 가지 일이 벌어집니다. +태블릿을 받기로 배정된 학교 중 일부가 태블릿을 거부합니다. +교사들이 쓰기 싫다고 하거나, 보관할 곳이 없다는 이유로요. + +반대로 통제 집단으로 배정된 학교 중 일부는 따로 예산을 만들어 태블릿을 사기도 합니다. + +이제 단순한 비교가 비틀어집니다. +실제로 태블릿을 쓴 학교와 안 쓴 학교를 비교해 보면, 다시 편향이 끼어듭니다. +태블릿을 거부한 학교는 새 기술에 회의적인 곳일 수 있고, +사비로 산 학교는 원래 의지가 강한 곳일 수 있으니까요. + +배정은 무작위였지만, 실제 처치는 무작위가 아닙니다. +그렇다면 우리가 손에 쥔 무작위성, 즉 동전 던지기는 어디에 쓸 수 있을까요? +바로 여기서 도구변수의 진짜 쓰임새가 등장합니다. diff --git a/videos/iv/src/scripts/02_rct_recap_break_en.txt b/videos/iv/src/scripts/02_rct_recap_break_en.txt new file mode 100644 index 0000000..efbf378 --- /dev/null +++ b/videos/iv/src/scripts/02_rct_recap_break_en.txt @@ -0,0 +1,18 @@ +Let's go back to the tablet experiment from last time. +Researchers flipped a coin to decide which schools would get tablets, completely at random. +In theory, comparing the average score of the two groups gives you the causal effect directly. + +But here's what actually happens in the real world. +Some schools assigned to receive tablets refuse them. +Maybe the teachers don't want to use them, or there's nowhere to store them. + +Meanwhile, some schools assigned to the control group find their own budget and buy tablets anyway. + +Now the simple comparison gets twisted. +If you compare schools that actually used tablets to schools that didn't, the bias creeps back in. +Schools that refused are probably skeptical of new technology. +Schools that bought their own are probably more motivated to begin with. + +The assignment was random, but the actual treatment is not. +So where can we still use the randomness we have in our hands — the original coin flip? +This is exactly where instrumental variables earn their keep. diff --git a/videos/iv/src/scripts/03_three_types.txt b/videos/iv/src/scripts/03_three_types.txt new file mode 100644 index 0000000..005c27f --- /dev/null +++ b/videos/iv/src/scripts/03_three_types.txt @@ -0,0 +1,20 @@ +태블릿 배정이라는 동전이 학교들을 어떻게 움직이는지 자세히 보면, 세 가지 유형이 보입니다. + +첫째, 순응자입니다. +동전이 처치로 떨어지면 태블릿을 쓰고, 통제로 떨어지면 쓰지 않는 학교입니다. +이 학교들은 동전 결과에 충실하게 따릅니다. + +둘째, 언제나 받는 학교입니다. +동전이 어떻게 떨어지든 어떻게든 태블릿을 손에 넣습니다. +배정이 처치든 통제든, 결과적으로 태블릿을 씁니다. + +셋째, 절대 받지 않는 학교입니다. +동전이 처치를 가리켜도 끝까지 거부합니다. +배정이 어떻든 태블릿을 쓰지 않습니다. + +여기서 핵심을 알아챘다면 박수를 보내드리고 싶습니다. +동전 결과에 따라 실제로 행동이 바뀌는 건 오직 순응자뿐입니다. +나머지 두 유형은 동전이 무엇을 가리켜도 같은 행동을 합니다. + +그러니까 동전이 만들어 내는 비교는 사실, 순응자에 한정된 비교입니다. +이걸 학계에서는 LATE, 우리말로 국소 평균 처치 효과라고 부릅니다. diff --git a/videos/iv/src/scripts/03_three_types_en.txt b/videos/iv/src/scripts/03_three_types_en.txt new file mode 100644 index 0000000..22ebd45 --- /dev/null +++ b/videos/iv/src/scripts/03_three_types_en.txt @@ -0,0 +1,20 @@ +If we look closely at how the tablet assignment moves schools, three types appear. + +First, compliers. +If the coin says treatment, they use the tablet. If it says control, they don't. +These schools follow the coin faithfully. + +Second, always-takers. +No matter how the coin lands, they end up with a tablet somehow. +Treatment or control, they're using the tablet either way. + +Third, never-takers. +Even if the coin says treatment, they refuse. +No matter the assignment, they don't use the tablet. + +If you've already caught the key idea, you deserve a round of applause. +Only the compliers change their behavior based on the coin. +The other two types do the same thing regardless of what the coin says. + +So the comparison the coin creates is, in fact, limited to compliers. +In the literature, this is called LATE — the Local Average Treatment Effect. diff --git a/videos/iv/src/scripts/04_iv_machinery.txt b/videos/iv/src/scripts/04_iv_machinery.txt new file mode 100644 index 0000000..1675356 --- /dev/null +++ b/videos/iv/src/scripts/04_iv_machinery.txt @@ -0,0 +1,18 @@ +이제 이 LATE를 어떻게 숫자로 구하는지 봅시다. 식은 의외로 간단합니다. + +먼저, 동전 결과별로 평균 점수를 비교합니다. +배정이 처치인 학교들의 평균 점수에서, 배정이 통제인 학교들의 평균 점수를 뺍니다. +이건 단순한 차이지만, 동전이 무작위이므로 인과효과의 후보가 됩니다. + +하지만 이 차이는 보통 작게 나옵니다. 왜일까요? +순응자만 동전을 따라 행동했기 때문입니다. +언제나 받는 학교와 절대 받지 않는 학교는 어차피 같은 행동을 했으니, 두 집단 사이에서 점수 차이를 만들지 않습니다. + +그래서 이 차이를 동전이 실제로 움직인 사람의 비율로 나눠 줍니다. + +분모는 무엇일까요? +배정이 처치인 학교 중 실제로 태블릿을 쓴 비율에서, 배정이 통제인 학교 중 실제로 태블릿을 쓴 비율을 뺍니다. +이게 바로 순응자의 비율입니다. + +이렇게 만든 비율, 즉 점수 차이를 순응자 비율로 나눈 값을 와알드 추정량이라고 부릅니다. +직관적으로는 동전이 만든 효과를, 동전이 실제로 움직인 만큼으로 다시 환산한 값입니다. diff --git a/videos/iv/src/scripts/04_iv_machinery_en.txt b/videos/iv/src/scripts/04_iv_machinery_en.txt new file mode 100644 index 0000000..383a4a0 --- /dev/null +++ b/videos/iv/src/scripts/04_iv_machinery_en.txt @@ -0,0 +1,18 @@ +So how do we actually compute this LATE in numbers? The formula is surprisingly simple. + +First, we compare average scores across coin outcomes. +We take the average score of schools assigned to treatment, and subtract the average score of schools assigned to control. +Since the coin was random, this difference is a candidate for the causal effect. + +But this difference usually comes out small. Why? +Because only the compliers followed the coin. +Always-takers and never-takers behaved the same in both groups, so they create no difference between them. + +So we divide this difference by the share of people the coin actually moved. + +What goes in the denominator? +We take the share of schools that actually used tablets among those assigned to treatment, minus the share that used tablets among those assigned to control. +That's the share of compliers. + +This ratio — the score difference divided by the share of compliers — is called the Wald estimator. +Intuitively, it converts the effect the coin produced back into the effect on one mover. diff --git a/videos/iv/src/scripts/05_three_assumptions.txt b/videos/iv/src/scripts/05_three_assumptions.txt new file mode 100644 index 0000000..adff627 --- /dev/null +++ b/videos/iv/src/scripts/05_three_assumptions.txt @@ -0,0 +1,19 @@ +그런데 와알드 식이 진짜 인과효과를 짚어 내려면 세 가지 조건이 모두 맞아야 합니다. +하나라도 어긋나면 결과를 믿을 수 없습니다. + +첫째, 적합성입니다. +도구변수가 처치를 실제로 움직여야 합니다. +태블릿 배정이 실제 사용에 거의 영향을 못 주면, 순응자 비율, 즉 분모가 0에 가까워집니다. +0에 가까운 수로 나눈 값은 폭주합니다. + +둘째, 배제 조건입니다. +도구변수가 결과에 미치는 영향은 오직 처치를 통해서만 흘러야 합니다. +태블릿을 받았다는 통보 자체가, 태블릿을 쓰지 않더라도 학교 분위기를 바꾼다면 배제 조건은 깨집니다. + +셋째, 독립성입니다. +도구변수는 잠재적 결과와 독립이어야 합니다. +무작위 배정이라면 이건 설계상 만족됩니다. +하지만 자연이 던진 동전이라면, 정말 우연이었는지 따져 봐야 합니다. + +세 자물쇠가 모두 풀려야 도구변수의 문이 열립니다. +도구변수는 강력한 도구이지만, 결코 마법은 아닙니다. diff --git a/videos/iv/src/scripts/05_three_assumptions_en.txt b/videos/iv/src/scripts/05_three_assumptions_en.txt new file mode 100644 index 0000000..40ab811 --- /dev/null +++ b/videos/iv/src/scripts/05_three_assumptions_en.txt @@ -0,0 +1,19 @@ +But for the Wald formula to actually pin down a causal effect, three conditions must hold at once. +If even one breaks, you can't trust the result. + +First, relevance. +The instrument must actually move the treatment. +If tablet assignment barely affects actual use, the share of compliers — the denominator — gets close to zero. +Dividing by something close to zero makes the estimate explode. + +Second, the exclusion restriction. +The instrument can affect the outcome only through the treatment. +If just being assigned tablets changes the school's atmosphere — even when the tablets aren't used — exclusion is broken. + +Third, independence. +The instrument must be independent of the potential outcomes. +In a randomized assignment, this is satisfied by design. +But for a coin nature flipped, you have to argue that it really was an accident. + +Only when all three locks are open does the door of instrumental variables actually open. +IV is a powerful tool, but it is never magic. diff --git a/videos/iv/src/scripts/06_draft_lottery.txt b/videos/iv/src/scripts/06_draft_lottery.txt new file mode 100644 index 0000000..9f23a2b --- /dev/null +++ b/videos/iv/src/scripts/06_draft_lottery.txt @@ -0,0 +1,15 @@ +이 트릭은 작은 실험에만 쓰이는 게 아닙니다. 국가 규모에서도 작동합니다. + +1969년 미국. 베트남 전쟁 징집을 위해 추첨 방식이 도입됩니다. +생일 365일이 적힌 공이 빙고처럼 뽑혀, 낮은 번호가 뽑힌 사람부터 입대했습니다. +태어난 날짜는 당사자가 고를 수 없고, 추첨 번호는 학력이나 직업과 무관했죠. +완벽한 자연의 동전이었습니다. + +경제학자 조슈아 앵그리스트는 이 추첨을 도구변수로 썼습니다. +질문은 이거였어요. 군 복무가 평생 소득에 어떤 영향을 줄까? + +그냥 참전 군인과 비참전 군인의 소득을 비교하면 편향이 생깁니다. +참전을 선택한 사람과 회피한 사람은 애초에 다르니까요. + +추첨 번호를 도구변수로 두면, 우연이 움직인 부분만 분리해 깨끗한 효과를 얻을 수 있습니다. +존 스노우의 수도 회사 트릭이, 한 세기 뒤 미국 노동시장에서도 통했던 셈입니다. diff --git a/videos/iv/src/scripts/06_draft_lottery_en.txt b/videos/iv/src/scripts/06_draft_lottery_en.txt new file mode 100644 index 0000000..378aa36 --- /dev/null +++ b/videos/iv/src/scripts/06_draft_lottery_en.txt @@ -0,0 +1,15 @@ +This trick isn't just for small experiments. It works at national scale too. + +The United States, 1969. To draft people for the Vietnam War, a lottery system was introduced. +Balls labeled with all 365 birthdays were drawn in bingo fashion, and the lowest numbers were called up first. +Your birthday is something you can't choose. And the lottery number had no relation to your education or job. +It was a perfect coin flipped by nature. + +The economist Joshua Angrist used this lottery as an instrumental variable. +The question was this: what's the effect of military service on lifetime earnings? + +Simply comparing veterans to non-veterans gives you bias. +People who chose to serve and people who avoided service were already different to begin with. + +If you use the lottery number as an instrument, you isolate the part that chance actually moved, and you get a clean effect. +John Snow's water company trick worked, a century later, in the American labor market too. diff --git a/videos/iv/src/scripts/07_outro.txt b/videos/iv/src/scripts/07_outro.txt new file mode 100644 index 0000000..a460664 --- /dev/null +++ b/videos/iv/src/scripts/07_outro.txt @@ -0,0 +1,9 @@ +세 장면을 나란히 놓아 봅시다. +1854년 런던의 수도 회사, 1969년 미국의 징집 추첨, 그리고 어쩌면 여러분의 생일. +모두 현실 속에 이미 존재하는 우연입니다. + +도구변수 분석에서 가장 어려운 일은 수식이 아닙니다. +바로 이 우연을 찾아내는 일입니다. + +무작위 배정을 할 수 없다면, 자연이 이미 던진 동전을 찾아내세요. +그게 인과추론의 다음 단계입니다. diff --git a/videos/iv/src/scripts/07_outro_en.txt b/videos/iv/src/scripts/07_outro_en.txt new file mode 100644 index 0000000..f1371fa --- /dev/null +++ b/videos/iv/src/scripts/07_outro_en.txt @@ -0,0 +1,9 @@ +Let's put three scenes side by side. +The water companies of 1854 London. The draft lottery of 1969 America. And, maybe, your own birthday. +All of them are accidents that already exist in the real world. + +In an IV analysis, the hardest part isn't the formula. +It's finding the accident. + +When random assignment isn't possible, find the coin nature has already flipped. +That's the next step in causal inference. diff --git a/videos/linear_regression_effectiveness/src/linear_regression_effectiveness.py b/videos/linear_regression_effectiveness/src/linear_regression_effectiveness.py new file mode 100644 index 0000000..4efe4c7 --- /dev/null +++ b/videos/linear_regression_effectiveness/src/linear_regression_effectiveness.py @@ -0,0 +1,240 @@ +import json +from pathlib import Path + +from manim import * + + +TOPIC_DIR = Path(__file__).resolve().parents[1] +ASSET_DIR = Path(__file__).resolve().parents[2] / "assets" / "tabler-icons" / "icons" / "outline" + +ACCENT = YELLOW_E +RANDOM_COLOR = TEAL_C +OBS_COLOR = ORANGE +HIDDEN_COLOR = MAROON_C +SOFT = GREY_B + + +def load_icon(filename: str, color: str = WHITE, height: float = 1.1) -> SVGMobject: + icon = SVGMobject(str(ASSET_DIR / filename)) + icon.set_stroke(color=color, width=2.6, opacity=1) + icon.set_fill(opacity=0) + icon.height = height + return icon + + +def load_scene_timing_durations(scene_basename: str) -> list[float]: + payload = json.loads((TOPIC_DIR / "build" / "audio" / f"{scene_basename}.timings.json").read_text()) + return [float(chunk["duration"]) for chunk in payload["chunks"]] + + +def make_card(title: str, body: str, color: str, width: float = 4.0, height: float = 2.2) -> VGroup: + frame = RoundedRectangle( + width=width, + height=height, + corner_radius=0.18, + stroke_color=color, + stroke_width=2.8, + ) + head = Text(title, font_size=28, weight=BOLD, color=color) + head.next_to(frame.get_top(), DOWN, buff=0.28) + body_text = Text(body, font_size=22, color=WHITE, line_spacing=0.9) + body_text.move_to(frame.get_center() + DOWN * 0.15) + return VGroup(frame, head, body_text) + + +class Scene01_RctVsObservationalIntro(Scene): + """ + Scene 01: RCT vs Observational Intro + + Core Claim: + 무작위 배정에서는 회귀가 평균 차이를 압축해서 보여주지만, + 관찰자료에서는 먼저 변수 관계와 누락 가능성을 확인해야 한다. + + Expected Misconception: + 회귀식을 한 줄 쓰면 곧바로 인과효과를 읽을 수 있다고 느끼기 쉽다. + + Visual Pivot: + 왼쪽의 깔끔한 무작위 배정 카드에서, + 오른쪽의 관찰자료 카드와 숨은 변수 네트워크로 시선이 이동한 뒤, + 마지막에 체크리스트로 수렴한다. + + Notebook Reference: + book/regression/05-The-Unreasonable-Effectiveness-of-Linear-Regression_minimal_ko.ipynb + - Cell 0: 무작위 배정 vs 관찰자료 도입 + - Cell 2: wage.csv 사용 + - Cell 4: 변수 관계를 먼저 확인 + - Cell 6: 단순 회귀와 통제 회귀 비교 예고 + + Script Reference: + src/scripts/01_rct_vs_observational_intro.txt + + 3Blue1Brown Reference: + 3b1b/_2020/covid.py - IntroQuestion + Reason: + 하나의 질문에서 대비 구조를 만들고, 마지막에 체크리스트형 정리로 수렴하는 리듬이 유사해서. + + Script-to-Beat Mapping: + 1. chunk 1-3: 무작위 배정에서는 평균 차이와 같은 아이디어라는 도입 + 2. chunk 4-5: 관찰자료에서는 계수를 바로 읽으면 안 된다는 경고 + 3. chunk 6: wage.csv만 본다는 범위 고정 + 4. chunk 7-8: 변수 관계와 누락변수편향 설명 + 5. chunk 9: 분석 순서 체크리스트 + """ + + WAIT_TAIL = 1.2 + + def construct(self): + durations = load_scene_timing_durations("01_rct_vs_observational_intro") + + title = Text("선형회귀는 언제 믿을 수 있을까?", font_size=34, weight=BOLD, color=ACCENT) + title.to_edge(UP) + + random_card = make_card("무작위 배정", "평균 차이와\n같은 아이디어", RANDOM_COLOR) + random_card.move_to(LEFT * 3.1 + UP * 0.2) + random_icon = load_icon("arrows-shuffle.svg", RANDOM_COLOR, 0.9) + random_icon.next_to(random_card[1], RIGHT, buff=0.2) + + obs_card = make_card("관찰자료", "계수를 바로\n인과효과로 읽지 않기", OBS_COLOR) + obs_card.move_to(RIGHT * 3.0 + UP * 0.2) + obs_icon = load_icon("alert-triangle.svg", OBS_COLOR, 0.9) + obs_icon.next_to(obs_card[1], RIGHT, buff=0.2) + + bridge = Arrow(random_card.get_right(), obs_card.get_left(), buff=0.2, color=SOFT, stroke_width=3.5) + bridge_label = Text("같은 회귀라도\n조건이 다르다", font_size=22, color=SOFT) + bridge_label.next_to(bridge, UP, buff=0.22) + + # Beat 1 + # 남는 요소: 제목, 무작위 배정 카드 + # 새로 등장: 제목, 무작위 배정 카드, 화살표 라벨 + # 비워 두는 영역: 하단 절반 + # 핵심 시선 대상: 무작위 배정 카드 + self.play(FadeIn(title, shift=DOWN * 0.15), run_time=0.8) + self.play(Create(random_card), FadeIn(random_icon, scale=0.85), run_time=1.2) + self.wait(max(0.2, durations[0] - 2.0)) + self.play(GrowArrow(bridge), FadeIn(bridge_label, shift=UP * 0.1), run_time=0.9) + self.wait(max(0.2, durations[1] - 0.9)) + same_idea = Text("회귀 = 평균 차이의 압축 표현", font_size=28, color=WHITE) + same_idea.next_to(random_card, DOWN, buff=0.45) + self.play(Write(same_idea), run_time=1.0) + self.wait(max(0.2, durations[2] - 1.0)) + + # Beat 2 + # 남는 요소: 제목, 두 카드, 연결 화살표 + # 새로 등장: 관찰자료 카드, 숨은 변수 원, 경고식 + # 비워 두는 영역: 좌하단 + # 핵심 시선 대상: 관찰자료 카드 + self.play(Create(obs_card), FadeIn(obs_icon, scale=0.85), run_time=1.0) + self.wait(max(0.2, durations[3] - 1.0)) + + wage_node = Circle(radius=0.42, color=WHITE, stroke_width=2.5) + wage_label = Text("임금", font_size=20).move_to(wage_node) + educ_node = Circle(radius=0.42, color=WHITE, stroke_width=2.5) + educ_label = Text("교육", font_size=20).move_to(educ_node) + hidden_node = Circle(radius=0.48, color=HIDDEN_COLOR, stroke_width=2.8) + hidden_label = Text("숨은 변수", font_size=18, color=HIDDEN_COLOR).move_to(hidden_node) + + educ_group = VGroup(educ_node, educ_label).move_to(RIGHT * 1.8 + DOWN * 1.2) + wage_group = VGroup(wage_node, wage_label).move_to(RIGHT * 3.5 + DOWN * 1.2) + hidden_group = VGroup(hidden_node, hidden_label).move_to(RIGHT * 2.65 + DOWN * 2.35) + arrow_ew = Arrow(educ_group.get_right(), wage_group.get_left(), buff=0.14, color=WHITE, stroke_width=3.2) + arrow_he = Arrow(hidden_group.get_top(), educ_group.get_bottom(), buff=0.12, color=HIDDEN_COLOR, stroke_width=3.2) + arrow_hw = Arrow(hidden_group.get_top(), wage_group.get_bottom(), buff=0.12, color=HIDDEN_COLOR, stroke_width=3.2) + warn = Text("계수만 보면 위험", font_size=26, weight=BOLD, color=OBS_COLOR) + warn.next_to(obs_card, DOWN, buff=0.42) + + self.play(FadeIn(warn, shift=UP * 0.1), Create(arrow_ew), FadeIn(educ_group), FadeIn(wage_group), run_time=1.2) + self.play(GrowArrow(arrow_he), GrowArrow(arrow_hw), FadeIn(hidden_group, scale=0.9), run_time=1.0) + self.wait(max(0.2, durations[4] - 2.2)) + + # Beat 3 + # 남는 요소: 제목, 관찰자료 카드 + # 새로 등장: wage.csv 카드 + # 비워 두는 영역: 좌측 대부분 + # 핵심 시선 대상: wage.csv 카드 + file_icon = load_icon("file-spreadsheet.svg", ACCENT, 1.1) + file_text = Text("wage.csv", font_size=28, weight=BOLD) + file_sub = Text("이번 예제의 범위", font_size=22, color=SOFT) + file_group = VGroup(file_icon, file_text, file_sub).arrange(DOWN, buff=0.18) + file_group.move_to(LEFT * 3.0 + DOWN * 1.3) + self.play( + FadeOut(same_idea), + FadeOut(bridge), + FadeOut(bridge_label), + FadeOut(educ_group), + FadeOut(wage_group), + FadeOut(hidden_group), + FadeOut(arrow_ew), + FadeOut(arrow_he), + FadeOut(arrow_hw), + FadeIn(file_group, shift=RIGHT * 0.2), + run_time=1.0, + ) + self.wait(max(0.2, durations[5] - 1.0)) + + # Beat 4 + # 남는 요소: 제목, 관찰자료 카드, wage.csv 카드 + # 새로 등장: 변수 관계 네트워크, OVB 라벨 + # 비워 두는 영역: 상단 중앙 + # 핵심 시선 대상: 변수 관계 네트워크 + relation_title = Text("먼저 관계를 본다", font_size=28, weight=BOLD, color=ACCENT) + relation_title.move_to(DOWN * 0.2) + iq = Text("IQ", font_size=22) + family = Text("가정 배경", font_size=22) + educ = Text("교육", font_size=22) + wage = Text("임금", font_size=22) + iq.move_to(LEFT * 1.6 + DOWN * 1.4) + family.move_to(LEFT * 0.2 + DOWN * 2.1) + educ.move_to(RIGHT * 1.2 + DOWN * 1.4) + wage.move_to(RIGHT * 2.8 + DOWN * 2.1) + rel_arrows = VGroup( + Arrow(iq.get_right(), educ.get_left(), buff=0.12, stroke_width=3), + Arrow(family.get_right(), educ.get_bottom(), buff=0.12, stroke_width=3, color=HIDDEN_COLOR), + Arrow(educ.get_right(), wage.get_left(), buff=0.12, stroke_width=3), + Arrow(family.get_right(), wage.get_left(), buff=0.12, stroke_width=3, color=HIDDEN_COLOR), + ) + ovb = Text("OVB", font_size=34, weight=BOLD, color=HIDDEN_COLOR) + ovb.next_to(family, LEFT, buff=0.5) + self.play( + FadeIn(relation_title, shift=UP * 0.1), + FadeIn(iq), + FadeIn(family), + FadeIn(educ), + FadeIn(wage), + *[GrowArrow(arr) for arr in rel_arrows], + run_time=1.4, + ) + self.wait(max(0.2, durations[6] - 1.4)) + self.play(Indicate(family, color=HIDDEN_COLOR), FadeIn(ovb, scale=0.85), run_time=1.0) + self.wait(max(0.2, durations[7] - 1.0)) + + # Beat 5 + # 남는 요소: 제목 + # 새로 등장: 분석 순서 체크리스트 + # 비워 두는 영역: 우하단 일부 + # 핵심 시선 대상: 체크리스트 + checklist = VGroup( + Text("1. 관계 확인", font_size=28, color=WHITE), + Text("2. 단순 회귀", font_size=28, color=WHITE), + Text("3. 통제 회귀", font_size=28, color=WHITE), + ).arrange(DOWN, aligned_edge=LEFT, buff=0.32) + checklist.move_to(DOWN * 1.0) + accent_box = SurroundingRectangle(checklist[0], color=ACCENT, buff=0.15) + self.play( + FadeOut(obs_card), + FadeOut(obs_icon), + FadeOut(file_group), + FadeOut(relation_title), + FadeOut(iq), + FadeOut(family), + FadeOut(educ), + FadeOut(wage), + FadeOut(rel_arrows), + FadeOut(ovb), + FadeIn(checklist, shift=UP * 0.2), + Create(accent_box), + run_time=1.2, + ) + self.play(accent_box.animate.surround(checklist[1], buff=0.15), run_time=0.8) + self.play(accent_box.animate.surround(checklist[2], buff=0.15), run_time=0.8) + self.wait(max(0.2, durations[8] - 2.8)) + self.wait(self.WAIT_TAIL) diff --git a/videos/linear_regression_effectiveness/src/scripts/01_rct_vs_observational_intro.txt b/videos/linear_regression_effectiveness/src/scripts/01_rct_vs_observational_intro.txt new file mode 100644 index 0000000..89f4570 --- /dev/null +++ b/videos/linear_regression_effectiveness/src/scripts/01_rct_vs_observational_intro.txt @@ -0,0 +1,24 @@ +이번 노트북의 출발점은 아주 단순합니다. + +처치가 무작위로 배정되면, 선형회귀는 알씨티나 에이비 테스트에서 집단 평균 차이를 정리해서 보여주는 효율적인 도구가 됩니다. + +같은 비교를 더 압축된 형태로 계산할 뿐이지, +핵심 아이디어 자체가 달라지는 것은 아닙니다. + +하지만 데이터가 무작위로 만들어지지 않았다면 이야기가 달라집니다. + +관찰자료에서는 회귀계수 하나를 바로 인과효과처럼 읽을 수 없습니다. +교육이 높을수록 임금도 높아 보인다고 해서, +그 차이가 곧바로 교육의 순수한 효과라고 말할 수는 없습니다. + +이번에는 wage.csv 하나만 사용해서 이 차이를 간단히 확인해 보겠습니다. + +중요한 건 회귀식을 바로 적는 일이 아니라, +교육, 임금, 능력의 대리변수, 그리고 배경 변수들이 서로 어떻게 함께 움직이는지 먼저 보는 일입니다. + +어떤 중요한 변수가 빠져 있다면, +그 빠진 변수 때문에 계수가 흔들릴 수 있습니다. +이것이 누락변수편향입니다. + +그래서 이 예제에서는 먼저 변수들 사이의 관계부터 확인하고, +그 다음에 단순 회귀와 통제변수를 넣은 회귀를 비교합니다. From 51e9569ea70f17e47bcdf07802284bb15f8fb0d3 Mon Sep 17 00:00:00 2001 From: myeongseok Date: Mon, 18 May 2026 22:13:19 +0900 Subject: [PATCH 2/2] =?UTF-8?q?docs(iv):=204=EA=B0=80=EC=A7=80=20=EC=9C=A0?= =?UTF-8?q?=ED=98=95=20=ED=91=9C=EA=B8=B0=20=EC=A0=95=EB=B9=84=20=EB=B0=8F?= =?UTF-8?q?=20=EC=BD=94=EC=9D=B8=20=EB=B9=84=EC=9C=A0=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 3)·4)절에서 [always-taker, never-taker, complier, defier] 순서로 표 재정렬하고 'Four types'로 표기, 배반자는 단조성 가정으로 부재 명시 - 전체적으로 '동전/coin flip' 비유를 '무작위 배정/random assignment' 표현으로 통일 Co-Authored-By: Claude Opus 4.7 --- book/iv/iv_en.ipynb | 121 ++-------------------- book/iv/iv_ko.ipynb | 244 ++++++++++++++++++-------------------------- 2 files changed, 111 insertions(+), 254 deletions(-) diff --git a/book/iv/iv_en.ipynb b/book/iv/iv_en.ipynb index bd574de..2462254 100644 --- a/book/iv/iv_en.ipynb +++ b/book/iv/iv_en.ipynb @@ -31,55 +31,19 @@ "cell_type": "markdown", "id": "0c38b585", "metadata": {}, - "source": [ - "## 1) The Snow story: a coin flipped by nature\n", - "\n", - "When cholera devastated London in 1854, the physician John Snow noticed that death rates varied wildly from street to street. At the time, two companies piped water into London homes — Lambeth, which drew clean water from upstream, and Southwark & Vauxhall, which drew sewage-mixed water from the lower Thames.\n", - "\n", - "Crucially, **which company served which street had almost nothing to do with the household's income or hygiene**. It was a matter of which pipes had been laid decades earlier.\n", - "\n", - "Snow exploited that accident. The experimenter (Snow) couldn't flip a coin to decide who drank clean water, but **nature had already flipped one** on his behalf.\n", - "\n", - "An instrumental variable (IV) is exactly this kind of tool — one that catches accidents already present in the real world and uses them to pin down a causal effect." - ] + "source": "## 1) The Snow story: an accident produced by nature\n\nWhen cholera devastated London in 1854, the physician John Snow noticed that death rates varied wildly from street to street. At the time, two companies piped water into London homes — Lambeth, which drew clean water from upstream, and Southwark & Vauxhall, which drew sewage-mixed water from the lower Thames.\n\nCrucially, **which company served which street had almost nothing to do with the household's income or hygiene**. It was a matter of which pipes had been laid decades earlier.\n\nSnow exploited that accident. He couldn't randomly split households into two groups to decide who drank clean water, but **nature had already produced an equivalent random split** on his behalf.\n\nAn instrumental variable (IV) is exactly this kind of tool — one that catches accidents already present in the real world and uses them to pin down a causal effect." }, { "cell_type": "markdown", "id": "cdd47ad2", "metadata": {}, - "source": [ - "## 2) Notation\n", - "\n", - "We need three variables:\n", - "\n", - "- $Z$ : the **instrument** — a coin flipped by the experimenter or by nature. (e.g., tablet assignment, lottery number)\n", - "- $T$ : the **treatment actually taken**. (e.g., whether the school actually used the tablets)\n", - "- $Y$ : the **outcome** we care about. (e.g., test scores)\n", - "\n", - "Plus potential outcomes:\n", - "\n", - "- $Y_0$ : the potential outcome under no treatment\n", - "- $Y_1$ : the potential outcome under treatment\n", - "\n", - "The previous chapter introduced the average treatment effect, $ATE = E[Y_1 - Y_0]$. This chapter's main quantity is **an effect restricted to a particular subgroup (the compliers)** — the **LATE**." - ] + "source": "## 2) Notation\n\nWe need three variables:\n\n- $Z$ : the **instrument** — a random assignment produced by the experimenter or by nature. (e.g., tablet assignment, lottery number)\n- $T$ : the **treatment actually taken**. (e.g., whether the school actually used the tablets)\n- $Y$ : the **outcome** we care about. (e.g., test scores)\n\nPlus potential outcomes:\n\n- $Y_0$ : the potential outcome under no treatment\n- $Y_1$ : the potential outcome under treatment\n\nThe previous chapter introduced the average treatment effect, $ATE = E[Y_1 - Y_0]$. This chapter's main quantity is **an effect restricted to a particular subgroup (the compliers)** — the **LATE**." }, { "cell_type": "markdown", "id": "7e0013ca", "metadata": {}, - "source": [ - "## 3) Non-compliance breaks the naive comparison\n", - "\n", - "Take the tablet RCT from the previous chapter. Researchers flipped a coin and \"assigned\" some schools to receive tablets. In the real world, two things happen at once.\n", - "\n", - "1. **Some assigned-treatment schools refuse the tablets** (\"the teachers don't want them\", \"nowhere to store them\").\n", - "2. **Some assigned-control schools buy tablets with their own budget** (\"we're going to use them anyway\").\n", - "\n", - "If we now compare \"actually treated\" vs. \"actually untreated\", the two groups are no longer comparable. Refusers are probably skeptical of new tech; self-buyers are probably more motivated to begin with.\n", - "\n", - "**Assignment ($Z$) is random, but actual treatment ($T$) is not.** A small simulation makes this concrete." - ] + "source": "## 3) Non-compliance breaks the naive comparison\n\nTake the tablet RCT from the previous chapter. Researchers randomly split the schools into two groups and \"assigned\" one group to receive tablets while the other served as the control. In the real world, two things happen at once.\n\n1. **Some assigned-treatment schools refuse the tablets** (\"the teachers don't want them\", \"nowhere to store them\").\n2. **Some assigned-control schools buy tablets with their own budget** (\"we're going to use them anyway\").\n\nIf we now compare \"actually treated\" vs. \"actually untreated\", the two groups are no longer comparable. Refusers are probably skeptical of new tech; self-buyers are probably more motivated to begin with.\n\n**Assignment ($Z$) is random, but actual treatment ($T$) is not.** A small simulation makes this concrete." }, { "cell_type": "code", @@ -278,47 +242,19 @@ "cell_type": "markdown", "id": "2400f7bf", "metadata": {}, - "source": [ - "The intention-to-treat difference lands somewhere around +3 — unbiased, but **smaller than the true effect**, because only some of the schools (the compliers) actually moved with the coin.\n", - "\n", - "IV's core idea: **divide this small assignment-driven difference by the share of people the coin actually moved** to recover the effect on one mover." - ] + "source": "The intention-to-treat difference lands somewhere around +3 — unbiased, but **smaller than the true effect**, because only some of the schools (the compliers) actually moved with the assignment.\n\nIV's core idea: **divide this small assignment-driven difference by the share of people the assignment actually moved** to recover the effect on one mover." }, { "cell_type": "markdown", "id": "b9c60a75", "metadata": {}, - "source": [ - "## 4) Three types: complier, always-taker, never-taker\n", - "\n", - "Here is how the coin $Z$ moves people, organized by type:\n", - "\n", - "| Type | $T$ when $Z = 1$ | $T$ when $Z = 0$ | Note |\n", - "|---|:---:|:---:|---|\n", - "| **Complier** | 1 | 0 | follows the coin |\n", - "| **Always-taker** | 1 | 1 | ignores the coin |\n", - "| **Never-taker** | 0 | 0 | ignores the coin |\n", - "| Defier | 0 | 1 | assumed not to exist (monotonicity) |\n", - "\n", - "IV recovers an effect for **the compliers only**, because the always-takers and never-takers behave the same in both arms and contribute nothing to the difference. This is the **Local Average Treatment Effect (LATE)**." - ] + "source": "## 4) Four types: always-taker, never-taker, complier, defier\n\nThere are four ways assignment $Z$ can move people, organized by type. By assumption, the last type (defiers) does **not** exist (monotonicity).\n\n| Type | $T$ when $Z = 1$ | $T$ when $Z = 0$ | Note |\n|---|:---:|:---:|---|\n| **Always-taker** | 1 | 1 | ignores assignment |\n| **Never-taker** | 0 | 0 | ignores assignment |\n| **Complier** | 1 | 0 | follows assignment |\n| **Defier** | 0 | 1 | assumed not to exist (monotonicity) |\n\nIV recovers an effect for **the compliers only**. Always-takers and never-takers behave the same in both arms and contribute nothing to the difference, and defiers are assumed not to exist. This is the **Local Average Treatment Effect (LATE)**." }, { "cell_type": "markdown", "id": "0b3286a2", "metadata": {}, - "source": [ - "## 5) The Wald estimator: LATE in numbers\n", - "\n", - "$$\n", - "\\text{LATE} \\;=\\; \\frac{E[Y \\mid Z=1] - E[Y \\mid Z=0]}{E[T \\mid Z=1] - E[T \\mid Z=0]}\n", - "$$\n", - "\n", - "- Numerator: **ITT** — the effect the coin produced on the outcome.\n", - "- Denominator: **share of compliers** — the fraction the coin actually moved.\n", - "\n", - "Dividing one by the other gives the effect of treatment on a single complier. This is the Wald estimator — the simplest form of IV estimation." - ] + "source": "## 5) The Wald estimator: LATE in numbers\n\n$$\n\\text{LATE} \\;=\\; \\frac{E[Y \\mid Z=1] - E[Y \\mid Z=0]}{E[T \\mid Z=1] - E[T \\mid Z=0]}\n$$\n\n- Numerator: **ITT** — the effect the random assignment produced on the outcome.\n- Denominator: **share of compliers** — the fraction the assignment actually moved.\n\nDividing one by the other gives the effect of treatment on a single complier. This is the Wald estimator — the simplest form of IV estimation." }, { "cell_type": "code", @@ -358,11 +294,7 @@ "cell_type": "markdown", "id": "325b2abd", "metadata": {}, - "source": [ - "The Wald estimator lines up with the true effect (+5). The naive comparison was contaminated by type composition; the Wald formula isolates the part the coin actually moved and rescales it by the compliers' share.\n", - "\n", - "In practice, the same estimate is computed via **2SLS (Two-Stage Least Squares)**: first regress $T$ on $Z$ to get fitted values $\\hat T$, then regress $Y$ on $\\hat T$." - ] + "source": "The Wald estimator lines up with the true effect (+5). The naive comparison was contaminated by type composition; the Wald formula isolates the part the random assignment actually moved and rescales it by the compliers' share.\n\nIn practice, the same estimate is computed via **2SLS (Two-Stage Least Squares)**: first regress $T$ on $Z$ to get fitted values $\\hat T$, then regress $Y$ on $\\hat T$." }, { "cell_type": "code", @@ -401,24 +333,7 @@ "cell_type": "markdown", "id": "29d3db93", "metadata": {}, - "source": [ - "## 6) Three assumptions for a valid instrument\n", - "\n", - "For the Wald formula to deliver a **causal** quantity, three conditions must hold simultaneously. If any one fails, the estimate is no longer causally interpretable.\n", - "\n", - "**(a) Relevance** — $Z$ must actually move $T$.\n", - "$$\\operatorname{Cov}(Z, T) \\neq 0$$\n", - "If $Z$ barely moves $T$, the denominator approaches zero and the estimator explodes — the \"weak instrument\" problem.\n", - "\n", - "**(b) Exclusion restriction** — $Z$ can affect $Y$ only through $T$.\n", - "If being assigned tablets changes school morale even when no tablets are used, exclusion is broken.\n", - "\n", - "**(c) Independence** — $Z$ must be independent of the potential outcomes.\n", - "$$(Y_0, Y_1) \\perp Z$$\n", - "In an RCT this is satisfied by design. For a coin flipped by nature, you must argue it case by case.\n", - "\n", - "As a DAG:" - ] + "source": "## 6) Three assumptions for a valid instrument\n\nFor the Wald formula to deliver a **causal** quantity, three conditions must hold simultaneously. If any one fails, the estimate is no longer causally interpretable.\n\n**(a) Relevance** — $Z$ must actually move $T$.\n$$\\operatorname{Cov}(Z, T) \\neq 0$$\nIf $Z$ barely moves $T$, the denominator approaches zero and the estimator explodes — the \"weak instrument\" problem.\n\n**(b) Exclusion restriction** — $Z$ can affect $Y$ only through $T$.\nIf being assigned tablets changes school morale even when no tablets are used, exclusion is broken.\n\n**(c) Independence** — $Z$ must be independent of the potential outcomes.\n$$(Y_0, Y_1) \\perp Z$$\nIn an RCT this is satisfied by design. For a random assignment produced by nature, you must argue the case by case.\n\nAs a DAG:" }, { "cell_type": "code", @@ -500,23 +415,7 @@ "cell_type": "markdown", "id": "f75b9904", "metadata": {}, - "source": [ - "## 7) National scale: the Vietnam draft lottery (Angrist 1990)\n", - "\n", - "The United States, 1969. To draft people for the Vietnam War, the government used a lottery: balls labeled with all 365 birthdays were drawn bingo-style, and the lowest numbers went first.\n", - "\n", - "Your birthday is something you can't pick, and the lottery number was unrelated to your education, occupation, or family. As close to a perfectly natural coin flip as you'll get.\n", - "\n", - "The economist Joshua Angrist used this lottery as an instrument for the effect of **military service on lifetime earnings**.\n", - "\n", - "- $Z$ : draft eligibility based on lottery number\n", - "- $T$ : whether the person actually served\n", - "- $Y$ : later earnings\n", - "\n", - "A naive veteran-vs-non-veteran comparison conflates the effect of service with the selection of who chose to serve and who avoided it. Using the lottery as an instrument isolates the part chance moved.\n", - "\n", - "Angrist (1990) estimated that military service reduced subsequent earnings of white male veterans by about **15%** — a result that overturns the casual \"service = experience = higher earnings\" intuition and remains one of the canonical IV findings." - ] + "source": "## 7) National scale: the Vietnam draft lottery (Angrist 1990)\n\nThe United States, 1969. To draft people for the Vietnam War, the government used a lottery: balls labeled with all 365 birthdays were drawn bingo-style, and the lowest numbers went first.\n\nYour birthday is something you can't pick, and the lottery number was unrelated to your education, occupation, or family. As close to a perfectly natural random assignment as you'll get.\n\nThe economist Joshua Angrist used this lottery as an instrument for the effect of **military service on lifetime earnings**.\n\n- $Z$ : draft eligibility based on lottery number\n- $T$ : whether the person actually served\n- $Y$ : later earnings\n\nA naive veteran-vs-non-veteran comparison conflates the effect of service with the selection of who chose to serve and who avoided it. Using the lottery as an instrument isolates the part chance moved.\n\nAngrist (1990) estimated that military service reduced subsequent earnings of white male veterans by about **15%** — a result that overturns the casual \"service = experience = higher earnings\" intuition and remains one of the canonical IV findings." }, { "cell_type": "markdown", @@ -571,4 +470,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/book/iv/iv_ko.ipynb b/book/iv/iv_ko.ipynb index 47bfef4..b641c70 100644 --- a/book/iv/iv_ko.ipynb +++ b/book/iv/iv_ko.ipynb @@ -31,59 +31,23 @@ "cell_type": "markdown", "id": "7c6573bc", "metadata": {}, - "source": [ - "## 1) 도입: 1854년 런던, 존 스노우의 우연\n", - "\n", - "1854년 런던에 콜레라가 휩쓸 때, 의사 존 스노우(John Snow)는 거리마다 사망률이 크게 다르다는 사실에 주목했습니다. 당시 런던에는 두 곳의 수도 회사가 가정에 물을 공급했는데, 한 회사(Lambeth)는 상류의 깨끗한 물을, 다른 회사(Southwark & Vauxhall)는 하수가 섞인 강물을 끌어다 썼습니다.\n", - "\n", - "결정적으로, **어느 회사의 물이 어느 거리로 들어가는지는 가정의 형편이나 위생 습관과 거의 무관**했습니다. 거리마다 미리 깔린 배관망의 차이였을 뿐이죠.\n", - "\n", - "스노우는 이 우연을 붙잡았습니다. 실험자가 직접 동전을 던질 수 없는 상황에서, **자연이 던진 동전**이 도시 안에 이미 존재했던 셈입니다.\n", - "\n", - "도구변수(Instrumental Variable, IV)는 바로 이런 \"현실 속 우연\"을 찾아 인과효과를 짚어 내는 도구입니다." - ] + "source": "## 1) 도입: 1854년 런던, 존 스노우의 우연\n\n1854년 런던에 콜레라가 휩쓸 때, 의사 존 스노우(John Snow)는 거리마다 사망률이 크게 다르다는 사실에 주목했습니다. 당시 런던에는 두 곳의 수도 회사가 가정에 물을 공급했는데, 한 회사(Lambeth)는 상류의 깨끗한 물을, 다른 회사(Southwark & Vauxhall)는 하수가 섞인 강물을 끌어다 썼습니다.\n\n결정적으로, **어느 회사의 물이 어느 거리로 들어가는지는 가정의 형편이나 위생 습관과 거의 무관**했습니다. 거리마다 미리 깔린 배관망의 차이였을 뿐이죠.\n\n스노우는 이 우연을 붙잡았습니다. 실험자가 직접 가정을 두 집단으로 무작위 배정할 수 없는 상황에서, **자연이 만들어 둔 무작위 배정**이 도시 안에 이미 존재했던 셈입니다.\n\n도구변수(Instrumental Variable, IV)는 바로 이런 \"현실 속 우연\"을 찾아 인과효과를 짚어 내는 도구입니다." }, { "cell_type": "markdown", "id": "8d5d2100", "metadata": {}, - "source": [ - "## 2) 표기법과 출발점\n", - "\n", - "도구변수를 이야기하기 위해 세 가지 변수를 도입합니다.\n", - "\n", - "- $Z$ : **도구변수**. 실험자 또는 자연이 던진 동전. (예: 태블릿 배정 여부, 추첨 번호)\n", - "- $T$ : **처치**. 실제로 받은 처치 여부. (예: 태블릿을 실제로 사용했는가)\n", - "- $Y$ : **결과**. 우리가 알고 싶은 결과 변수. (예: 학업 성취도)\n", - "\n", - "그리고 잠재적 결과(potential outcomes) 표기:\n", - "\n", - "- $Y_0$ : 처치를 받지 않았을 때의 잠재적 결과\n", - "- $Y_1$ : 처치를 받았을 때의 잠재적 결과\n", - "\n", - "이전 챕터에서 본 평균 처치 효과는 $ATE = E[Y_1 - Y_0]$이었습니다. 이번 챕터의 핵심 결과는 **모든 사람의 평균이 아니라 일부 사람(순응자)의 평균에 한정된 효과**, 즉 **LATE**가 됩니다." - ] + "source": "## 2) 표기법과 출발점\n\n도구변수를 이야기하기 위해 세 가지 변수를 도입합니다.\n\n- $Z$ : **도구변수**. 실험자나 자연이 만들어 낸 무작위 배정. (예: 태블릿 배정 여부, 추첨 번호)\n- $T$ : **처치**. 실제로 받은 처치 여부. (예: 태블릿을 실제로 사용했는가)\n- $Y$ : **결과**. 우리가 알고 싶은 결과 변수. (예: 학업 성취도)\n\n그리고 잠재적 결과(potential outcomes) 표기:\n\n- $Y_0$ : 처치를 받지 않았을 때의 잠재적 결과\n- $Y_1$ : 처치를 받았을 때의 잠재적 결과\n\n이전 챕터에서 본 평균 처치 효과는 $ATE = E[Y_1 - Y_0]$이었습니다. 이번 챕터의 핵심 결과는 **모든 사람의 평균이 아니라 일부 사람(순응자)의 평균에 한정된 효과**, 즉 **LATE**가 됩니다." }, { "cell_type": "markdown", "id": "2fae3afb", "metadata": {}, - "source": [ - "## 3) 비순응으로 단순 비교가 깨진다\n", - "\n", - "이전 챕터의 태블릿 RCT를 다시 가져옵시다. 연구진이 동전을 던져 일부 학교에는 태블릿을 \"배정\"했습니다. 그런데 현실에서는 두 가지 일이 동시에 벌어집니다.\n", - "\n", - "1. **처치 배정 학교 중 일부가 태블릿을 거부**합니다 (\"교사가 쓰기 싫어요\", \"보관할 곳이 없어요\").\n", - "2. **통제 배정 학교 중 일부가 사비로 태블릿을 구매**합니다 (\"우리는 어쨌든 쓸래요\").\n", - "\n", - "이 상황에서 \"실제 처치 여부\"로 두 집단의 평균을 비교하면, 두 집단은 더 이상 비교 가능하지 않습니다. 거부한 학교는 새 기술에 회의적인 곳일 가능성이 높고, 사비로 산 학교는 원래 의지가 강한 곳일 가능성이 높기 때문입니다.\n", - "\n", - "**배정($Z$)은 무작위지만, 실제 처치($T$)는 무작위가 아닙니다.** 작은 시뮬레이션으로 이 깨짐을 확인해 봅시다." - ] + "source": "## 3) 비순응으로 단순 비교가 깨진다\n\n이전 챕터의 태블릿 RCT를 다시 가져옵시다. 연구진이 학교를 무작위로 두 그룹으로 나눠 한 그룹에는 태블릿을 \"배정\"하고 다른 그룹은 통제로 두었습니다. 그런데 현실에서는 두 가지 일이 동시에 벌어집니다.\n\n1. **처치 배정 학교 중 일부가 태블릿을 거부**합니다 (\"교사가 쓰기 싫어요\", \"보관할 곳이 없어요\").\n2. **통제 배정 학교 중 일부가 사비로 태블릿을 구매**합니다 (\"우리는 어쨌든 쓸래요\").\n\n이 상황에서 \"실제 처치 여부\"로 두 집단의 평균을 비교하면, 두 집단은 더 이상 비교 가능하지 않습니다. 거부한 학교는 새 기술에 회의적인 곳일 가능성이 높고, 사비로 산 학교는 원래 의지가 강한 곳일 가능성이 높기 때문입니다.\n\n**배정($Z$)은 무작위지만, 실제 처치($T$)는 무작위가 아닙니다.** 작은 시뮬레이션으로 이 깨짐을 확인해 봅시다." }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "7273a43d", "metadata": { "execution": { @@ -170,7 +134,7 @@ "4 1 1 70.147837 complier" ] }, - "execution_count": 1, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -211,7 +175,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "id": "3fa902c3", "metadata": { "execution": { @@ -250,7 +214,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "76b78d2c", "metadata": { "execution": { @@ -278,51 +242,23 @@ "cell_type": "markdown", "id": "2aed6ca3", "metadata": {}, - "source": [ - "ITT(Intention-to-Treat) 차이는 약 +3점 부근으로 나옵니다. 이 값은 \"동전을 던졌을 때 평균적으로 점수가 얼마나 달라지는가\"를 말해 줍니다. 편향은 없지만, **진짜 처치 효과보다 작게** 측정됩니다. 동전을 따른 사람이 일부(순응자)뿐이기 때문입니다.\n", - "\n", - "도구변수의 핵심 아이디어는, **이 작은 차이를 \"실제로 움직인 사람의 비율\"로 환산**하면 한 명의 순응자에게 처치가 만든 효과가 나온다는 것입니다." - ] + "source": "ITT(Intention-to-Treat) 차이는 약 +3점 부근으로 나옵니다. 이 값은 \"무작위로 두 그룹을 나눠 한쪽에만 배정을 했을 때 평균적으로 점수가 얼마나 달라지는가\"를 말해 줍니다. 편향은 없지만, **진짜 처치 효과보다 작게** 측정됩니다. 배정을 따른 사람이 일부(순응자)뿐이기 때문입니다.\n\n도구변수의 핵심 아이디어는, **이 작은 차이를 \"실제로 움직인 사람의 비율\"로 환산**하면 한 명의 순응자에게 처치가 만든 효과가 나온다는 것입니다." }, { "cell_type": "markdown", "id": "57b83ccf", "metadata": {}, - "source": [ - "## 4) 세 가지 유형: 순응자, 언제나 받음, 절대 안 받음\n", - "\n", - "동전 $Z$가 사람들을 움직이는 방식은 세 가지로 나뉩니다.\n", - "\n", - "| 유형 | $Z = 1$일 때 $T$ | $Z = 0$일 때 $T$ | 비고 |\n", - "|---|:---:|:---:|---|\n", - "| **순응자** (Complier) | 1 | 0 | 동전을 따른다 |\n", - "| **언제나 받음** (Always-taker) | 1 | 1 | 동전과 무관 |\n", - "| **절대 안 받음** (Never-taker) | 0 | 0 | 동전과 무관 |\n", - "| Defier (배반자) | 0 | 1 | 일반적으로 존재하지 않는다고 가정 |\n", - "\n", - "도구변수가 짚어 내는 효과는 **오직 순응자에 한정**됩니다. 동전이 흔들지 않은 두 그룹(언제나 받음, 절대 안 받음)은 비교에 들어가도 차이를 만들지 않기 때문입니다. 이것이 LATE(Local Average Treatment Effect)의 정의입니다." - ] + "source": "## 4) 네 가지 유형: 언제나 받음, 절대 안 받음, 순응자, 배반자\n\n배정 $Z$가 사람들을 움직이는 방식은 네 가지로 나뉩니다. 다만 마지막 유형(배반자)은 **가정상 존재하지 않는다고 봅니다(단조성 가정).**\n\n| 유형 | $Z = 1$일 때 $T$ | $Z = 0$일 때 $T$ | 비고 |\n|---|:---:|:---:|---|\n| **언제나 받음** (Always-taker) | 1 | 1 | 배정과 무관 |\n| **절대 안 받음** (Never-taker) | 0 | 0 | 배정과 무관 |\n| **순응자** (Complier) | 1 | 0 | 배정을 따른다 |\n| **배반자** (Defier) | 0 | 1 | 가정상 존재하지 않음 |\n\n도구변수가 짚어 내는 효과는 **오직 순응자에 한정**됩니다. 배정이 흔들지 않은 두 그룹(언제나 받음, 절대 안 받음)은 비교에 들어가도 차이를 만들지 않고, 배반자는 가정상 존재하지 않기 때문입니다. 이것이 LATE(Local Average Treatment Effect)의 정의입니다." }, { "cell_type": "markdown", "id": "cd21e1dc", "metadata": {}, - "source": [ - "## 5) 와알드 추정량: 숫자로 구하는 LATE\n", - "\n", - "$$\n", - "\\text{LATE} \\;=\\; \\frac{E[Y \\mid Z=1] - E[Y \\mid Z=0]}{E[T \\mid Z=1] - E[T \\mid Z=0]}\n", - "$$\n", - "\n", - "- 분자: **ITT** — 동전이 만든 결과 차이.\n", - "- 분모: **순응자 비율** — 동전이 실제로 움직인 사람의 몫.\n", - "\n", - "둘을 나누면 \"한 명의 순응자에게 처치가 만든 효과\"가 됩니다. 이 식을 와알드(Wald) 추정량이라고 부르며, 가장 단순한 도구변수 추정의 형태입니다." - ] + "source": "## 5) 와알드 추정량: 숫자로 구하는 LATE\n\n$$\n\\text{LATE} \\;=\\; \\frac{E[Y \\mid Z=1] - E[Y \\mid Z=0]}{E[T \\mid Z=1] - E[T \\mid Z=0]}\n$$\n\n- 분자: **ITT** — 무작위 배정이 만든 결과 차이.\n- 분모: **순응자 비율** — 무작위 배정이 실제로 움직인 사람의 몫.\n\n둘을 나누면 \"한 명의 순응자에게 처치가 만든 효과\"가 됩니다. 이 식을 와알드(Wald) 추정량이라고 부르며, 가장 단순한 도구변수 추정의 형태입니다." }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "0030754f", "metadata": { "execution": { @@ -358,15 +294,11 @@ "cell_type": "markdown", "id": "02c046c6", "metadata": {}, - "source": [ - "와알드 추정량은 진짜 처치 효과(+5점)와 거의 일치합니다. 단순 평균 차이는 유형 구성에 오염되어 있었지만, 동전이 만들어 낸 차이만을 골라내고 동전이 움직인 비율로 환산하면 깨끗한 효과가 회복됩니다.\n", - "\n", - "실무에서는 같은 추정을 **2SLS(Two-Stage Least Squares)**로 합니다. 1단계에서 $T$를 $Z$로 회귀해 적합값 $\\hat T$를 만들고, 2단계에서 $Y$를 $\\hat T$로 회귀합니다." - ] + "source": "와알드 추정량은 진짜 처치 효과(+5점)와 거의 일치합니다. 단순 평균 차이는 유형 구성에 오염되어 있었지만, 무작위 배정이 만들어 낸 차이만을 골라내고 배정이 실제로 움직인 비율로 환산하면 깨끗한 효과가 회복됩니다.\n\n실무에서는 같은 추정을 **2SLS(Two-Stage Least Squares)**로 합니다. 1단계에서 $T$를 $Z$로 회귀해 적합값 $\\hat T$를 만들고, 2단계에서 $Y$를 $\\hat T$로 회귀합니다." }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "id": "c46072f9", "metadata": { "execution": { @@ -401,28 +333,32 @@ "cell_type": "markdown", "id": "6ac16111", "metadata": {}, + "source": "## 6) 도구변수의 세 가지 가정\n\n와알드 식이 **인과효과**를 추정하려면 다음 세 조건이 모두 만족되어야 합니다. 하나라도 깨지면 결과를 인과적으로 해석할 수 없습니다.\n\n**(a) 적합성 (Relevance)** — $Z$가 $T$를 실제로 움직여야 한다.\n$$\\operatorname{Cov}(Z, T) \\neq 0$$\n$Z$가 $T$를 거의 움직이지 못하면 분모가 0에 가까워져 추정량이 폭주합니다. \"약한 도구(weak instrument)\" 문제입니다.\n\n**(b) 배제 조건 (Exclusion Restriction)** — $Z$가 $Y$에 미치는 영향은 오직 $T$를 거쳐야 한다.\n태블릿을 받았다는 통보 자체가 — 태블릿을 쓰지 않더라도 — 학교 분위기를 바꾼다면 이 조건은 깨집니다.\n\n**(c) 독립성 (Independence)** — $Z$는 잠재적 결과와 독립이어야 한다.\n$$(Y_0, Y_1) \\perp Z$$\nRCT 배정이라면 설계상 만족됩니다. 자연이 만든 무작위 배정이라면, 정말 우연이었는지 따져 보아야 합니다.\n\nDAG로 그리면 다음과 같습니다." + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "e60627c1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: graphviz in /Users/edgar/.pyenv/versions/3.12.13/lib/python3.12/site-packages (0.21)\n", + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m26.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m26.1.1\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" + ] + } + ], "source": [ - "## 6) 도구변수의 세 가지 가정\n", - "\n", - "와알드 식이 **인과효과**를 추정하려면 다음 세 조건이 모두 만족되어야 합니다. 하나라도 깨지면 결과를 인과적으로 해석할 수 없습니다.\n", - "\n", - "**(a) 적합성 (Relevance)** — $Z$가 $T$를 실제로 움직여야 한다.\n", - "$$\\operatorname{Cov}(Z, T) \\neq 0$$\n", - "$Z$가 $T$를 거의 움직이지 못하면 분모가 0에 가까워져 추정량이 폭주합니다. \"약한 도구(weak instrument)\" 문제입니다.\n", - "\n", - "**(b) 배제 조건 (Exclusion Restriction)** — $Z$가 $Y$에 미치는 영향은 오직 $T$를 거쳐야 한다.\n", - "태블릿을 받았다는 통보 자체가 — 태블릿을 쓰지 않더라도 — 학교 분위기를 바꾼다면 이 조건은 깨집니다.\n", - "\n", - "**(c) 독립성 (Independence)** — $Z$는 잠재적 결과와 독립이어야 한다.\n", - "$$(Y_0, Y_1) \\perp Z$$\n", - "RCT 배정이라면 설계상 만족됩니다. 자연이 던진 동전이라면, 정말 우연이었는지 따져 보아야 합니다.\n", - "\n", - "DAG로 그리면 다음과 같습니다." + "!pip install graphviz" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 12, "id": "03812975", "metadata": { "execution": { @@ -433,39 +369,75 @@ } }, "outputs": [ - { - "ename": "ExecutableNotFound", - "evalue": "failed to execute PosixPath('dot'), make sure the Graphviz executables are on your systems' PATH", - "output_type": "error", - "traceback": [ - "\u001b[31m---------------------------------------------------------------------------\u001b[39m", - "\u001b[31mFileNotFoundError\u001b[39m Traceback (most recent call last)", - "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/backend/execute.py:76\u001b[39m, in \u001b[36mrun_check\u001b[39m\u001b[34m(cmd, input_lines, encoding, quiet, **kwargs)\u001b[39m\n\u001b[32m 75\u001b[39m kwargs[\u001b[33m'\u001b[39m\u001b[33mstdout\u001b[39m\u001b[33m'\u001b[39m] = kwargs[\u001b[33m'\u001b[39m\u001b[33mstderr\u001b[39m\u001b[33m'\u001b[39m] = subprocess.PIPE\n\u001b[32m---> \u001b[39m\u001b[32m76\u001b[39m proc = \u001b[43m_run_input_lines\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcmd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minput_lines\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 77\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/backend/execute.py:96\u001b[39m, in \u001b[36m_run_input_lines\u001b[39m\u001b[34m(cmd, input_lines, kwargs)\u001b[39m\n\u001b[32m 95\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_run_input_lines\u001b[39m(cmd, input_lines, *, kwargs):\n\u001b[32m---> \u001b[39m\u001b[32m96\u001b[39m popen = \u001b[43msubprocess\u001b[49m\u001b[43m.\u001b[49m\u001b[43mPopen\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcmd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstdin\u001b[49m\u001b[43m=\u001b[49m\u001b[43msubprocess\u001b[49m\u001b[43m.\u001b[49m\u001b[43mPIPE\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 98\u001b[39m stdin_write = popen.stdin.write\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/subprocess.py:1026\u001b[39m, in \u001b[36mPopen.__init__\u001b[39m\u001b[34m(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds, user, group, extra_groups, encoding, errors, text, umask, pipesize, process_group)\u001b[39m\n\u001b[32m 1023\u001b[39m \u001b[38;5;28mself\u001b[39m.stderr = io.TextIOWrapper(\u001b[38;5;28mself\u001b[39m.stderr,\n\u001b[32m 1024\u001b[39m encoding=encoding, errors=errors)\n\u001b[32m-> \u001b[39m\u001b[32m1026\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_execute_child\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexecutable\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpreexec_fn\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mclose_fds\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1027\u001b[39m \u001b[43m \u001b[49m\u001b[43mpass_fds\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcwd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43menv\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1028\u001b[39m \u001b[43m \u001b[49m\u001b[43mstartupinfo\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcreationflags\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mshell\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1029\u001b[39m \u001b[43m \u001b[49m\u001b[43mp2cread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mp2cwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1030\u001b[39m \u001b[43m \u001b[49m\u001b[43mc2pread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mc2pwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1031\u001b[39m \u001b[43m \u001b[49m\u001b[43merrread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merrwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1032\u001b[39m \u001b[43m \u001b[49m\u001b[43mrestore_signals\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1033\u001b[39m \u001b[43m \u001b[49m\u001b[43mgid\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgids\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43muid\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mumask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1034\u001b[39m \u001b[43m \u001b[49m\u001b[43mstart_new_session\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mprocess_group\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1035\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m:\n\u001b[32m 1036\u001b[39m \u001b[38;5;66;03m# Cleanup if the child failed starting.\u001b[39;00m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/subprocess.py:1955\u001b[39m, in \u001b[36mPopen._execute_child\u001b[39m\u001b[34m(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, gid, gids, uid, umask, start_new_session, process_group)\u001b[39m\n\u001b[32m 1954\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m err_filename \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1955\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m child_exception_type(errno_num, err_msg, err_filename)\n\u001b[32m 1956\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n", - "\u001b[31mFileNotFoundError\u001b[39m: [Errno 2] No such file or directory: PosixPath('dot')", - "\nThe above exception was the direct cause of the following exception:\n", - "\u001b[31mExecutableNotFound\u001b[39m Traceback (most recent call last)", - "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/IPython/core/formatters.py:1036\u001b[39m, in \u001b[36mMimeBundleFormatter.__call__\u001b[39m\u001b[34m(self, obj, include, exclude)\u001b[39m\n\u001b[32m 1033\u001b[39m method = get_real_method(obj, \u001b[38;5;28mself\u001b[39m.print_method)\n\u001b[32m 1035\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m method \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1036\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[49m\u001b[43minclude\u001b[49m\u001b[43m=\u001b[49m\u001b[43minclude\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexclude\u001b[49m\u001b[43m=\u001b[49m\u001b[43mexclude\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1037\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 1038\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/jupyter_integration.py:98\u001b[39m, in \u001b[36mJupyterIntegration._repr_mimebundle_\u001b[39m\u001b[34m(self, include, exclude, **_)\u001b[39m\n\u001b[32m 96\u001b[39m include = \u001b[38;5;28mset\u001b[39m(include) \u001b[38;5;28;01mif\u001b[39;00m include \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m {\u001b[38;5;28mself\u001b[39m._jupyter_mimetype}\n\u001b[32m 97\u001b[39m include -= \u001b[38;5;28mset\u001b[39m(exclude \u001b[38;5;129;01mor\u001b[39;00m [])\n\u001b[32m---> \u001b[39m\u001b[32m98\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m {mimetype: \u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod_name\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 99\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m mimetype, method_name \u001b[38;5;129;01min\u001b[39;00m MIME_TYPES.items()\n\u001b[32m 100\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m mimetype \u001b[38;5;129;01min\u001b[39;00m include}\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/jupyter_integration.py:112\u001b[39m, in \u001b[36mJupyterIntegration._repr_image_svg_xml\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 110\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_repr_image_svg_xml\u001b[39m(\u001b[38;5;28mself\u001b[39m) -> \u001b[38;5;28mstr\u001b[39m:\n\u001b[32m 111\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Return the rendered graph as SVG string.\"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m112\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mpipe\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m=\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43msvg\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m=\u001b[49m\u001b[43mSVG_ENCODING\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/piping.py:104\u001b[39m, in \u001b[36mPipe.pipe\u001b[39m\u001b[34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[39m\n\u001b[32m 55\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mpipe\u001b[39m(\u001b[38;5;28mself\u001b[39m,\n\u001b[32m 56\u001b[39m \u001b[38;5;28mformat\u001b[39m: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m 57\u001b[39m renderer: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m (...)\u001b[39m\u001b[32m 61\u001b[39m engine: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m 62\u001b[39m encoding: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m) -> typing.Union[\u001b[38;5;28mbytes\u001b[39m, \u001b[38;5;28mstr\u001b[39m]:\n\u001b[32m 63\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Return the source piped through the Graphviz layout command.\u001b[39;00m\n\u001b[32m 64\u001b[39m \n\u001b[32m 65\u001b[39m \u001b[33;03m Args:\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 102\u001b[39m \u001b[33;03m ' \u001b[39m\u001b[32m104\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_pipe_legacy\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 105\u001b[39m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 106\u001b[39m \u001b[43m \u001b[49m\u001b[43mformatter\u001b[49m\u001b[43m=\u001b[49m\u001b[43mformatter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 107\u001b[39m \u001b[43m \u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[43m=\u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 108\u001b[39m \u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[43m=\u001b[49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 109\u001b[39m \u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[43m=\u001b[49m\u001b[43mengine\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 110\u001b[39m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m=\u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/_tools.py:185\u001b[39m, in \u001b[36mdeprecate_positional_args..decorator..wrapper\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 177\u001b[39m wanted = \u001b[33m'\u001b[39m\u001b[33m, \u001b[39m\u001b[33m'\u001b[39m.join(\u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mvalue\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[33m'\u001b[39m\n\u001b[32m 178\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m name, value \u001b[38;5;129;01min\u001b[39;00m deprecated.items())\n\u001b[32m 179\u001b[39m warnings.warn(\u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[33mThe signature of \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfunc_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m will be reduced\u001b[39m\u001b[33m'\u001b[39m\n\u001b[32m 180\u001b[39m \u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[33m to \u001b[39m\u001b[38;5;132;01m{\u001b[39;00msupported_number\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m positional arg\u001b[39m\u001b[38;5;132;01m{\u001b[39;00ms_\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00mqualification\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m'\u001b[39m\n\u001b[32m 181\u001b[39m \u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[33m \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlist\u001b[39m(supported)\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m: pass \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mwanted\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m as keyword arg\u001b[39m\u001b[38;5;132;01m{\u001b[39;00ms_\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m'\u001b[39m,\n\u001b[32m 182\u001b[39m stacklevel=stacklevel,\n\u001b[32m 183\u001b[39m category=category)\n\u001b[32m--> \u001b[39m\u001b[32m185\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/piping.py:121\u001b[39m, in \u001b[36mPipe._pipe_legacy\u001b[39m\u001b[34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[39m\n\u001b[32m 112\u001b[39m \u001b[38;5;129m@_tools\u001b[39m.deprecate_positional_args(supported_number=\u001b[32m1\u001b[39m, ignore_arg=\u001b[33m'\u001b[39m\u001b[33mself\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m 113\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_pipe_legacy\u001b[39m(\u001b[38;5;28mself\u001b[39m,\n\u001b[32m 114\u001b[39m \u001b[38;5;28mformat\u001b[39m: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m (...)\u001b[39m\u001b[32m 119\u001b[39m engine: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m 120\u001b[39m encoding: typing.Optional[\u001b[38;5;28mstr\u001b[39m] = \u001b[38;5;28;01mNone\u001b[39;00m) -> typing.Union[\u001b[38;5;28mbytes\u001b[39m, \u001b[38;5;28mstr\u001b[39m]:\n\u001b[32m--> \u001b[39m\u001b[32m121\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_pipe_future\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 122\u001b[39m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m=\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 123\u001b[39m \u001b[43m \u001b[49m\u001b[43mformatter\u001b[49m\u001b[43m=\u001b[49m\u001b[43mformatter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 124\u001b[39m \u001b[43m \u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[43m=\u001b[49m\u001b[43mneato_no_op\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 125\u001b[39m \u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[43m=\u001b[49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 126\u001b[39m \u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[43m=\u001b[49m\u001b[43mengine\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 127\u001b[39m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m=\u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/piping.py:149\u001b[39m, in \u001b[36mPipe._pipe_future\u001b[39m\u001b[34m(self, format, renderer, formatter, neato_no_op, quiet, engine, encoding)\u001b[39m\n\u001b[32m 146\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m encoding \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 147\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m codecs.lookup(encoding) \u001b[38;5;129;01mis\u001b[39;00m codecs.lookup(\u001b[38;5;28mself\u001b[39m.encoding):\n\u001b[32m 148\u001b[39m \u001b[38;5;66;03m# common case: both stdin and stdout need the same encoding\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m149\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_pipe_lines_string\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m=\u001b[49m\u001b[43mencoding\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 150\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 151\u001b[39m raw = \u001b[38;5;28mself\u001b[39m._pipe_lines(*args, input_encoding=\u001b[38;5;28mself\u001b[39m.encoding, **kwargs)\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/backend/piping.py:212\u001b[39m, in \u001b[36mpipe_lines_string\u001b[39m\u001b[34m(engine, format, input_lines, encoding, renderer, formatter, neato_no_op, quiet)\u001b[39m\n\u001b[32m 206\u001b[39m cmd = dot_command.command(engine, \u001b[38;5;28mformat\u001b[39m,\n\u001b[32m 207\u001b[39m renderer=renderer,\n\u001b[32m 208\u001b[39m formatter=formatter,\n\u001b[32m 209\u001b[39m neato_no_op=neato_no_op)\n\u001b[32m 210\u001b[39m kwargs = {\u001b[33m'\u001b[39m\u001b[33minput_lines\u001b[39m\u001b[33m'\u001b[39m: input_lines, \u001b[33m'\u001b[39m\u001b[33mencoding\u001b[39m\u001b[33m'\u001b[39m: encoding}\n\u001b[32m--> \u001b[39m\u001b[32m212\u001b[39m proc = \u001b[43mexecute\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrun_check\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcmd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcapture_output\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mquiet\u001b[49m\u001b[43m=\u001b[49m\u001b[43mquiet\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 213\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m proc.stdout\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/.pyenv/versions/3.12.13/lib/python3.12/site-packages/graphviz/backend/execute.py:81\u001b[39m, in \u001b[36mrun_check\u001b[39m\u001b[34m(cmd, input_lines, encoding, quiet, **kwargs)\u001b[39m\n\u001b[32m 79\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mOSError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 80\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m e.errno == errno.ENOENT:\n\u001b[32m---> \u001b[39m\u001b[32m81\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m ExecutableNotFound(cmd) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01me\u001b[39;00m\n\u001b[32m 82\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m\n\u001b[32m 84\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m quiet \u001b[38;5;129;01mand\u001b[39;00m proc.stderr:\n", - "\u001b[31mExecutableNotFound\u001b[39m: failed to execute PosixPath('dot'), make sure the Graphviz executables are on your systems' PATH" - ] - }, { "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Z\n", + "\n", + "Z (도구변수)\n", + "\n", + "\n", + "\n", + "T\n", + "\n", + "T (처치)\n", + "\n", + "\n", + "\n", + "Z->T\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Y\n", + "\n", + "Y (결과)\n", + "\n", + "\n", + "\n", + "T->Y\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "U\n", + "\n", + "U (관측되지 않은 교란)\n", + "\n", + "\n", + "\n", + "U->T\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "U->Y\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], "text/plain": [ - "" + "" ] }, - "execution_count": 6, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -500,21 +472,7 @@ "cell_type": "markdown", "id": "0cfd99bd", "metadata": {}, - "source": [ - "## 7) 국가 규모 사례: 베트남 징집 추첨 (Angrist 1990)\n", - "\n", - "1969년 미국. 베트남 전쟁을 위한 징집을 추첨 방식으로 결정했습니다. 생일 365일이 적힌 공이 뽑혀, 낮은 번호가 뽑힌 사람부터 입대했습니다. **태어난 날짜는 본인이 고를 수 없고**, 추첨 번호는 학력·직업·집안과 무관했습니다. 거의 완벽한 자연의 동전이었습니다.\n", - "\n", - "경제학자 조슈아 앵그리스트(Joshua Angrist)는 이 추첨을 도구변수로 써서 **군 복무가 평생 소득에 미친 효과**를 추정했습니다.\n", - "\n", - "- $Z$ : 추첨 번호 기반 입대 자격\n", - "- $T$ : 실제 군 복무 여부\n", - "- $Y$ : 이후 소득\n", - "\n", - "단순히 참전 군인과 비참전 군인의 소득을 비교하면 \"참전을 선택한 사람\"과 \"회피한 사람\"의 차이가 섞여 들어옵니다. 추첨 번호를 도구변수로 두면, 우연이 움직인 부분만 분리해 깨끗한 효과(LATE)를 얻을 수 있습니다.\n", - "\n", - "Angrist(1990)는 이 방법으로 군 복무가 백인 남성의 이후 소득을 약 **15% 감소**시킨 것으로 추정했습니다. 이는 \"참전 = 경험치 + 네트워크 = 소득 증가\"라는 단순 해석이 편향되어 있음을 보여 준 대표적 결과입니다." - ] + "source": "## 7) 국가 규모 사례: 베트남 징집 추첨 (Angrist 1990)\n\n1969년 미국. 베트남 전쟁을 위한 징집을 추첨 방식으로 결정했습니다. 생일 365일이 적힌 공이 뽑혀, 낮은 번호가 뽑힌 사람부터 입대했습니다. **태어난 날짜는 본인이 고를 수 없고**, 추첨 번호는 학력·직업·집안과 무관했습니다. 거의 완벽한 자연의 무작위 배정이었습니다.\n\n경제학자 조슈아 앵그리스트(Joshua Angrist)는 이 추첨을 도구변수로 써서 **군 복무가 평생 소득에 미친 효과**를 추정했습니다.\n\n- $Z$ : 추첨 번호 기반 입대 자격\n- $T$ : 실제 군 복무 여부\n- $Y$ : 이후 소득\n\n단순히 참전 군인과 비참전 군인의 소득을 비교하면 \"참전을 선택한 사람\"과 \"회피한 사람\"의 차이가 섞여 들어옵니다. 추첨 번호를 도구변수로 두면, 우연이 움직인 부분만 분리해 깨끗한 효과(LATE)를 얻을 수 있습니다.\n\nAngrist(1990)는 이 방법으로 군 복무가 백인 남성의 이후 소득을 약 **15% 감소**시킨 것으로 추정했습니다. 이는 \"참전 = 경험치 + 네트워크 = 소득 증가\"라는 단순 해석이 편향되어 있음을 보여 준 대표적 결과입니다." }, { "cell_type": "markdown", @@ -550,7 +508,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "3.12.13", "language": "python", "name": "python3" }, @@ -569,4 +527,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file