재현 패키지 — 보고서1 「산업별 실질부가가치 시나리오 전망 2025–2035」 6장 진단과 보완

이 묶음은 6장의 외생 6종 진단(유가·세계수요·실질금리·실질환율·고용·우리경기)을 데이터 입수 → 분석 → 결과 도출 세 단계로 다시 계산한다. 외생을 하나씩 고정한 반사실 재전망, 계수 × 외생 경로로 정의한 선형 SHAP 기여, 유가의 원천·누적 구조·부호·두바이유 교체 시산을 다룬다. 마지막 단계의 검증 셀이 포털 카드 두 장(「여섯 외생을 나란히 놓고 보니」, 「유가 한 변수를 파보니」)과 공표 SHAP 산출물의 수치 67개(이전 판), 2026-10 정비판 선형 SHAP·유가 진단·시나리오 폭의 46개 항목(5장 분해 대조·정비판 기록 수치)을 계산 결과와 대조하며(합계 113개), 하나라도 다르면 실행이 멈춘다.

2026-10 기준선 정비 이후. 이 패키지는 정비 이전 판(2026-09-03 공표 전망)의 진단을 재현하며, 수치는 정비의 근거로 그대로 둔다. 진단이 지적한 과제 가운데 기준선 장기값(3장 정상상태 교체), 실질금리의 정의·적분차수(1차 차분 투입), 시나리오 레버 연결(인구·교역비용·S3 세계수요), 유가 정의(두바이유로 통일)는 3·4·5장 정비판 재현 패키지에서 반영되었다. 같은 반사실 방법을 정비판 외생(data/inputs/postreform/)에 적용한 결과는 02_분석.ipynb 9절과 03_결과.ipynb 표 7(output/exog_effects_before_after.csv, 검증 대상 아님)에 있다. 실질금리 기여는 총량 162조 원·바텀업 354조 원에서 각각 0.4조·1.4조 원으로, 유가 기여는 15조·65조 원에서 1조·5조 원으로, 고용 기여는 62조·32조 원에서 0 안팎으로 줄었다. 유가 공급충격 분리(킬리안 2009)와 시나리오 충격의 수준 처리는 남은 과제이다.

정비판 선형 SHAP·유가 진단(2026-10-08 추가). 02_분석.ipynb 10절은 정비판 외생과 5장의 드리프트 재설정 계수(δ 연 1.524%p)로 36·62·69분류 선형 SHAP, 유가 최민감 산업, SHAP 대 반사실, 유가 순효과를 다시 계산하고, 62분류 분해가 5장 패키지(s5-results/output/shap_62.csv, 전망 갱신 카드)와 같은지 대조한다(최대 차이 1e-14). 10.6절은 3장 정비판 외생 수준값으로 시나리오 폭과 유가 경로를 다시 계산한다. 결과는 03_결과.ipynb 표 8–11·그림 4와 검증 셀(정비판 46개 항목)에 있다. 실질금리 기여는 세 분류 모두 최대 0.25%p 이하로 사라졌고, 유가 최민감 산업은 여전히 석유정제(36 +8.47, 62 +6.21, 69 +6.08%p; 이전 판 41.1·31.4·30.8)이다. 유가 계수는 거의 그대로이며 기여 감소는 S1 유가 경로 (10년 누적 100·ln 98.05 → 22.43)에서 온다. 유가 순효과(2035, S1)는 총량 모형 1.07조 원(0.04%), 62 바텀업 3.97조 원(0.14%)으로 3.7배 차이가 남는다. 이 절은 S1만 쓰며, 이후 시나리오 재설계(S2–S5 경로 변경)의 영향을 받지 않는다.

폴더 구조

s6-diagnosis/ ├─ README.md 이 문서 ├─ requirements.txt 검증한 패키지 버전 ├─ config.py 경로·모형 정의·실행 스위치·공표 수치(검증 기준)·입력 SHA-256 — 모든 경로는 이 폴더 기준 상대경로 ├─ run_all.py 01→02→03 노트북을 순서대로 실행하고 output/run_log.txt 기록 ├─ 01_입수.ipynb 동결 입력 대조(SHA-256), 외생 변환 관계, 유가 원천 확인, (ONLINE=1) FRED 재수집 ├─ 02_분석.ipynb VARX 재추정, 외생 반사실, 시나리오 폭, 선형 SHAP, 유가 진단, 두바이유 시산, 정비판 반사실(9절)·SHAP·유가 진단(10절) → output/ ├─ 03_결과.ipynb 카드 표·그림 재작성, 공표 문구 점검, 정비판 표 8–11·그림 4, 공표·기록 수치 대조(검증 셀) ├─ src/exog_diagnosis.py 계산 함수(노트북은 이 함수만 호출) ├─ data/ │ ├─ inputs/ 동결 입력 18개(정비판 외생 postreform/ 3개 포함)와 PROVENANCE.md(출처·원래 위치·SHA-256) │ ├─ published/ 공표 SHAP 산출물 shap_36/62/69.json(이전 판 검증 기준), jeongbi/(5장 정비판 분해·드리프트 재설정 기록 사본, 10절 대조 기준) │ └─ interim/ 01이 만드는 점검 기록 └─ output/ 02·03이 만드는 산출물

실행 방법

bash pip install -r requirements.txt python run_all.py

기본 실행은 동결 입력만 읽으며 인증키와 인터넷 연결이 필요 없다. 세 노트북 실행에 약 10초가 걸린다(2026-10-08, Windows 11, Python 3.12). JupyterLab에서 01_입수.ipynb부터 차례로 열어 위에서 아래로 실행해도 같은 결과가 나온다.

스위치 기본값 내용
ONLINE=1 0 01_입수.ipynb 5절에서 FRED POILWTIUSDM·POILDUBUSDM을 다시 받아 동결본과 대조하고 로그차분 상관을 다시 계산한다. FRED 키는 환경변수 API_KEY_FRED(또는 FRED_API_KEY)에서만 읽고 화면에 출력하지 않는다. 키가 없으면 키가 필요 없는 FRED 공개 CSV 주소를 쓴다. FRED가 과거 값을 개정해도 검증은 동결본 기준이다.
FULL=1 0 02_분석.ipynb 8절에서 공표 수치 검증에 쓰지 않는 확장 점검을 더한다. 다섯 시나리오(S1–S5) 각각의 총량·62 반사실과 S1의 36·69 반사실을 계산해 output/full_effects_by_scenario.csv에 저장한다. 수 초가 더 걸린다.

```bash

예: Git Bash

ONLINE=1 FULL=1 python run_all.py

예: PowerShell

$env:ONLINE="1"; $env:FULL="1"; python run_all.py ```

config.py는 numpy를 불러오기 전에 BLAS 스레드 수를 1로 둔다. 이 장의 계산은 작은 행렬(최대 295×295)을 방정식마다 푸는 일이라 다중 스레드가 이득이 없고, 다른 작업이 CPU를 쓰는 환경에서는 다중 스레드 BLAS가 수백 배 느려지는 현상을 확인하였다(같은 계산이 0.2초 대 215초). 결과는 스레드 수와 무관하게 소수 12자리 이상 같다.

압축은 Windows 탐색기·7-Zip·macOS 기본 도구 또는 python -m zipfile -e s6-diagnosis-repro.zip .로 푼다. 한글 파일명은 표준 UTF-8 표시로 저장되어 있으나, 오래된 unzip(예: Git Bash 동봉판)은 이를 읽지 못해 이름이 깨질 수 있다. 내려받은 뒤 SHA256SUMS.txt로 파일이 온전한지 확인할 수 있다.

입력과 산출물

단계 입력 산출물
01 입수 data/inputs/ 전체 data/interim/input_inventory.csv, oil_quarterly_100ln.csv, (ONLINE=1) fred_*_online.csv
02 분석 data/inputs/, data/published/shap_*.json, data/published/jeongbi/ model_fit_check.csv, model_totals.csv, exog_effects.csv, exog_paths_summary.csv, exog_persistence.csv, shap_36/62/69.csv, shap_check.csv, oil_rank.csv, exog_top_industries_62.csv, oil_shap_vs_cf_62.csv, battery_parent_check.csv, oil_source_check.csv, oil_source_variants.csv, oil_level_gap.csv, oil_dollar_paths.csv, oil_effect_compare.csv, oil_comovement.csv, oil_coef_controls.csv, oil_benchmark.csv, dubai_sim.csv, exog_effects_postreform.csv·exog_effects_before_after.csv(9절), 정비판(10절) drift_anchor_jeongbi.csv, shap_36/62/69_jeongbi.csv·.json(카드 형식, 소수 둘째 자리), shap_check_jeongbi.csv, shap_summary_jeongbi.csv, oil_rank_jeongbi.csv, oil_factor_jeongbi.csv, exog_top_industries_62_jeongbi.csv, oil_shap_vs_cf_62_jeongbi.csv, exog_effects_jeongbi.csv, oil_effect_compare_jeongbi.csv, exog_persistence_jeongbi.csv, exog_paths_summary_jeongbi.csv, oil_dollar_paths_jeongbi.csv, (FULL=1) full_effects_by_scenario.csv
03 결과 output의 위 파일 table1_exog_effects.csv ~ table6_dubai.csv, fig1_exog_effects.png, fig2_oil_paths.png, fig3_oil_shap_62.png, claims_check.csv, 정비판 table8_shap_jeongbi.csv, table9_oil_sensitive_jeongbi.csv, table10_oil_effect_jeongbi.csv, table11_persistence_jeongbi.csv, fig4_oil_shap_62_jeongbi.png, verification.csv

동결 입력의 출처와 원래 위치는 data/inputs/PROVENANCE.md에 있다. 모두 공개 자료(ECOS·KOSIS·FRED·한국은행 산업연관표)이거나 본 연구 모형의 산출물이다.

계산 요약

검증

03_결과.ipynb의 마지막 셀이 이전 판 공표 수치 67개와 정비판 항목 46개, 합계 113개를 대조한다.

범주 항목 수 내용 허용오차
외생 카드 42 외생별 총량·바텀업 순효과(조원)와 CAGR 기여(%p) 24개, 지배 변수·순위, 실질금리 2025·2035, 바텀업 CAGR, 시나리오 폭 12개, 영구 판정 공표 자릿수의 반올림 폭(정수 ±0.5, 소수 둘째 자리 ±0.005 등)
유가 카드 22 총량·바텀업 2035 수준·유가 고정 수준·효과(%)·CAGR 기여, 36·62·69 유가 1위 산업과 기여, 유가 경로($69·$163·$136·$229), WTI·두바이 상관 0.954, 스프레드, 정유 기여 변화 +1.6%p, 나머지 ±1%p 같음(범주 항목은 일치 여부)
SHAP 산출물 3 shap_36/62/69.json의 1,503개 값(산업 × 9개 기여) 최대 차이 ±0.005(소수 둘째 자리 반올림)
정비판 — 5장 대조 10 36·62·69 분해 점검(성분 합·전망 로그성장·재설정분) 3개, 62분류 분해 = 5장 shap_62.csv(558개 값), 드리프트 재설정 δ·바텀업 S1 연평균 = 5장 drift_anchor.csv 6개 1e-8(분해), 1e-9(δ), 1e-6(연평균)
정비판 — 기록 수치 36 S1 유가 누적 변화, 36·62·69 유가 1위 산업과 기여, 평균 절대 기여(과거추세·동학·외생)·실질금리 최대 기여, 62 SHAP·반사실 상관, 유가 순효과(총량·바텀업 2035 수준·효과·비율·CAGR 기여), 바텀업/총량 배율, 영구 수준차 외생, 유가 시나리오 폭·경로($69·$79, 2035 최저·최고), 실질금리 2035 기록 자릿수의 반올림 폭(config.JEONGBI)

공표 문구 가운데 계산과 맞지 않거나 근거가 달라진 항목은 검증 셀에 넣지 않고 output/claims_check.csv(03의 「공표 문구 점검」 표)와 아래 정정 기록에 적었다.

정정 기록과 쟁점(2026-10-08)

  1. 유가 원천은 WTI가 아니라 두바이유이다(정정). 유가 카드는 산업 외생 유가를 「BOKDPM 관측변수 LOIL_us = FRED POILWTIUSDM(WTI)」로 설명한다. BOKDPM 관측자료 파일과 수집 문서는 실제로 WTI이다. 그러나 BOKDPM 추정에서 Dynare가 읽은 자료 파일(bokdpm_pipeline/mod/BOKDPM_data_2025.m)은 두바이유였고, 그 평활값이 VARX 외생 유가의 과거값(2000Q1–2025Q4)이 되었다. 외생 유가 과거값과 100·ln(FRED POILDUBUSDM 분기 평균)의 최대 차이는 0.0001(파일의 소수 넷째 자리 반올림)이고, WTI와는 −30.3~+19.6(100·ln)만큼 다르다. 카드 그림의 과거 구간(축 표기 「WTI, $/배럴」)도 두바이유이다. - 영향: 공표 수치는 모두 두바이유 기준으로 계산되었고 이 패키지는 그대로 재현한다. 문서상 정의대로 WTI로 추정하면 총량 모형의 유가 효과는 +14.6조원(+0.49%) → +5.7조원(+0.20%), 62 바텀업은 +65.5조원 → +57.1조원, 석유제품 유가 기여는 +31.4 → +34.7%p가 되고, 총량 기준 전망도 2,970 → 2,924조원으로 바뀐다(02_분석.ipynb 6.1절, 표 5). - 유가 카드의 다음 걸음 ⑤ 「두바이유 정식 교체(POILWTIUSDM → POILDUBUSDM 한 줄)」는 전제가 성립하지 않는다. 할 일은 자료 문서와 실제 추정 입력을 일치시키는 것이다 (두바이유를 유지한다면 used_data_sources.json·BOKDPM_data_2025.m을 두바이유로 고치고, WTI로 바꾼다면 BOKDPM을 다시 추정한다).
  2. 「2008년 $109」는 연도 표기 오류이다(정정). 유가 카드 ② 부제 「2008년 $109 → 2025년 $69」에서 카드 그림 자료의 연평균은 2008년 $89.1이고 $109.0은 2012년 값이다.
  3. 「유가·실질금리는 바텀업이 총량의 약 2배」 중 유가 부분이 틀렸다(정정). 외생 카드 ⑤의 문구와 달리 실질금리는 2.2배(354/162)이지만 유가는 4.5배(65/15)이다. 유가 카드 ④의 「약 4배」가 맞다.
  4. WTI·두바이 상관 0.954의 표본(쟁점). 0.954는 동결 FRED 파일 전체(분기 2000Q1–2026Q3, 2026Q3은 7월 한 달)로 계산한 값이며 이 패키지가 재현한다. 원 시산 출력은 기간을 「2000Q1~2025Q4」로 표기했는데, 그 기간으로 계산하면 0.961이다. 결론(성장률이 거의 같다)은 바뀌지 않는다.
  5. 「최근 스프레드 약 $3」은 시점에 따라 달라진다(쟁점). 2026년 7월 한 달 값(WTI $79.7, 두바이 $77.1)의 차이 $2.6을 반올림한 것이다. 2025Q4에는 두바이유가 WTI보다 $3.9 높았다.
  6. 유가 카드 ③ 산업 목록은 일부를 생략했다(쟁점). 36분류 수혜(+)에서 3위인 예술·스포츠·여가(+12.1)를, 69분류 피해(−)에서 2위인 건물건설·건축보수(−4.8)를 뺐다.
  7. 69분류 이차전지의 해석(쟁점). 카드는 이차전지의 높은 유가 기여(+15.8%p)를 「모산업(전기장비) 계수를 IO 몫으로 물려받은 결과」로 설명한다. 그러나 이차전지는 자체 계열(전기장비 × 시변 몫)로 별도 방정식을 추정하며, 전기장비(잔여)와의 분기 성장률 상관은 0.12, 유가 기여는 +10.0%p로 다르다. 이 설명은 계산으로 확인되지 않는다.
  8. 양(+)의 유가 계수와 공행(쟁점). 총량 실질 GDP 성장률을 유가 변화에 회귀하면 세계수요(미국 산출갭)만 통제할 때 계수가 거의 변하지 않고(0.034 → 0.033), 외생 5종을 모두 통제하면 0.023으로 줄지만 양(+)으로 남는다. 유가와 미국 산출갭의 상관이 0.06에 불과한 2009년 이후에도 계수는 양(+)이다. 카드의 「공행 ≠ 인과」 해석과 모순되지는 않으나, 미국 산출갭과의 공행만으로는 부호를 설명하지 못한다.

카드의 나머지 수치(외생별 순효과·CAGR 기여·순위, 실질금리 0.99%→2.78%, 시나리오 폭, 유가 순효과 +0.5%·+1.9%, 유가 최민감 산업, 유가 경로, 두바이 시산의 계수 변화)는 반올림 범위 안에서 재현된다.

후속 과제(이 패키지 범위 밖)

R 사용

R은 쓰지 않는다. 이 장의 계산(닫힌 해 베이지언 VARX, 반사실 재전망, 선형 분해, OLS)은 numpy·pandas로 충분하다. 후속 과제인 Kilian 분해도 statsmodels로 구현할 수 있다.

출처