재현 패키지 — 보고서1 「산업별 실질부가가치 시나리오 전망과 인력수급 시사점」 4장 산업모형(2026-10 정비판)
이 묶음은 4장의 모형 비교(베이지언 VARX 12개 옵션 × 36·62·69개 산업과 총량)를 데이터 입수 → 분석 → 결과 도출 세 단계로 다시 계산한다.
2026-10 정비판. 3장이 기준선을 정비하면서 외생 6종 가운데 실질금리의 투입형을 수준에서 1차 차분으로 바꾸었다(실질금리 수준은 2000–2025년 하락 추세를 지녀 성장률 식과 적분차수가 맞지 않았다). 이 패키지는 정비판 외생으로 12개 옵션을 다시 계산하고, 이전 판 공표 그리드(2026-08-28 외생)도 그대로 재현하여 두 판을 비교하며, 실질금리 계수의 부호를 점검한다. 마지막 단계의 검증 셀이 정비판 기록 그리드와 이전 판 공표 그리드를 함께 대조하며, 하나라도 다르면 실행이 멈춘다. 이전 판 패키지(2026-10-08)는 포털 보관본으로 남는다.
폴더 구조
s4-model/
├─ README.md 이 문서
├─ requirements.txt 검증한 패키지 버전
├─ config.py 경로·표본 분할·옵션·정비판 기록 수치(PUBLISHED)·이전 판 공표 수치(PREVIOUS)
├─ run_all.py 01→02→03 노트북을 순서대로 실행하고 output/run_log.txt 기록
├─ 01_입수.ipynb 동결 입력의 해시·구조 검증, 정비판·이전 판 외생 비교 → data/interim/
├─ 02_분석.ipynb 12개 옵션 추정·평가(정비판), 이전 판 재현과 정비 영향, 실질금리 계수 부호, 36 행렬 정규화, λ 민감도, 기여 분해 방법 → output/
├─ 03_결과.ipynb 옵션 비교표·그림, 이전 판 대비 표 + 검증 셀
├─ src/varx_grid.py 계산 함수 — industry_pipeline/run_grid.py 엔진의 정리본(+ 외생 계수표·부호 요약)
├─ data/
│ ├─ inputs/ 2장·3장 산출물 사본 9개 + PROVENANCE.md
│ ├─ published/ 정비판 기록 그리드 grid_summary_{36,62,69,AGG}.csv(2026-10 정비 실행에서 동결)
│ ├─ published_prev/ 이전 판 공표 그리드(2026-08-28·09-01 실행)
│ └─ interim/ 01이 만드는 중간 산출물
└─ output/ 02·03이 만드는 최종 산출물
실행 방법
bash
pip install -r requirements.txt
python run_all.py
전체 실행은 약 25초 걸린다. JupyterLab에서 01_입수.ipynb부터 차례로 실행해도 같은 결과가 나온다.
config.py는 선형대수 라이브러리(OpenBLAS·MKL)의 스레드를 1개로 고정한다(다중 스레드 경합으로 수십 배 느려지는 환경이 있다). 결과 값은 스레드 수와 무관하다. 인증키는 필요 없다.
입력과 산출물
| 단계 | 입력 | 산출물 |
|---|---|---|
| 01 입수 | data/inputs/ 9개 파일 |
data/interim/logpanel_{36,62,69,AGG}.csv, io_{36,62,69}.csv, exog_new.csv, exog_prev.csv, split.csv |
| 02 분석 | interim | output/grid_{36,62,69,AGG}.csv(정비판, 반올림 전), grid_prev_*.csv(이전 판 외생), check_prev_vs_new*.csv, real_rate_coef.csv, real_rate_sign.csv, check_io36_normalized.csv, lambda_sensitivity.csv, decomposition_check_62.csv |
| 03 결과 | output, data/published/, data/published_prev/ |
table1_grid_rmse.csv ~ table6_real_rate_sign.csv, fig1_rmse_69.png, fig2_valid_heatmap.png, verification.csv |
| 입력 파일 | 내용 | 만든 장 |
|---|---|---|
levels_sa.csv |
36개 산업 분기 실질부가가치(계절조정, 십억 원)와 실질 GDP, 1980Q1–2025Q4 | 2장 데이터 |
levels_62.csv, levels_69.csv |
62·69개 산업 분기 실질부가가치, 2000Q1–2025Q4 | 2장 데이터 |
levels_agg.csv |
총량 단일 계열(실질 GDP) | 4장(총량 그리드용) |
io_linkage_W.csv, io_linkage_62.csv, io_linkage_69.csv |
산업연관 연계강도(생산유발계수) | 2장 데이터 |
exog_hist_v2.csv |
외생 6종 투입형 과거값 — 정비판(실질금리 1차 차분) | 3장(2026-10 정비) |
exog_hist_v2_20260828.csv |
외생 6종 투입형 과거값 — 이전 공표 그리드가 쓴 판(실질금리 수준, 복원) | 3장 |
계산 요약
- 모형: $y_t = \sum_{l=1}^{4} A_l y_{t-l} + \alpha\,ect_{t-1} + \sum_{s=0}^{2}\Gamma_s x_{t-s} + c + e_t$. $x_t$는 외생 6종(유가·세계수요·실질금리·실질환율·고용_취업자·우리경기). 정비판의 실질금리는 1차 차분이다.
- 12개 옵션 = 명세 3(차분 / 수준 / VECM) × 사전분포 2(미네소타 / 산업연관표) × 외생 2(VARX / VAR). 사전분포·추정·평가 방식은 이전 판과 같다($\lambda=0.2$, $P=4$, $Q=2$; train 2000Q1–2021Q4, valid 2022–2023, test 2024–2025; 수준 1기 앞 RMSE).
- 결과(정비판): 36·62·69분류 모두 차분·산업연관표·VARX가 선택된다(valid 6.744·6.181·6.230, test 3.106·3.306·3.449; 이전 판 valid 6.793·6.179·6.235). 시험 구간 최소 옵션은 36·62·69분류에서 각각 차분_io_var·차분_io_var·차분_io_var이다. 총량은 수준·VAR(valid 0.414)이 선택되며 두 사전분포는 같은 모형이다.
- 실질금리 계수의 부호(02 4-1절): 선택 옵션을 전체 표본으로 적합했을 때, 실질금리 계수 합계가 음(−)인 산업의 비율은 이전 판 19%(62분류)에서 정비판 45%로, 부가가치 가중평균 계수 합계는 +0.195에서 +0.015로 바뀐다(36분류 +0.213 → +0.119, 69분류 +0.198 → +0.010). 이전 판의 체계적인 양(+)의 계수는 사라졌으나 뚜렷한 음(−)으로 바뀌지는 않는다. 총량 VARX의 동시항은 -0.126(음)이지만 세 시차의 합은 +0.065이다.
- 기여 분해(SHAP 방식): 각 분기 예측을 상수·내생 시차·외생 변수별 '계수 × 입력값'으로 정확히 나눈다. 02 7절은 가법성만 확인한다.
검증
03_결과.ipynb 마지막 셀이 308개 항목을 대조하며 모두 통과한다.
| 대조 대상 | 항목 수 | 허용오차 | 근거 |
|---|---|---|---|
| 정비판 기록 그리드 RMSE(4개 분류 × 12개 옵션 × 3개 구간) | 144 | 0.0005 | data/published/grid_summary_*.csv(소수 셋째 자리) |
| 이전 판 공표 그리드 RMSE(이전 판 외생으로 다시 계산) | 144 | 0.0005 | data/published_prev/grid_summary_*.csv |
| 분류별 선택 옵션(두 판) | 8 | 동률 포함 | 총량은 두 사전분포가 같은 모형이라 동률 |
| 차분·io·varx의 valid·test(정비판 기록값, 이전 판 논문 1–3 인용값) | 12 | 0.005 | 소수 둘째 자리 |
쟁점과 정정 기록
- 정비판 외생(2026-10). 실질금리 수준은 KPSS 검정에서 상수 주위 정상성이 기각되고 상수+추세를 두면 추세 정상으로 판정되는, 하락 추세를 지닌 계열이다(3장 02 7절). 성장률(차분) 식에 수준으로 넣으면 두 계열의 공통 하락 추세가 양(+)의 계수로 나타나 전망을 움직였다(6장 진단: 실질금리 기여 1위). 정비판은 1차 차분을 쓴다. 정비 전후 RMSE 차이는 최대 |Δvalid| 0.064이며 선택은 네 분류 모두 바뀌지 않는다.
- 이전 판 외생의 판 차이(2000년 실질금리). 이전 판 공표 그리드는 2000Q1–Q4 실질금리를 2001Q1 값(3.5972)으로 역채움한 2026-08-28판을 썼다(
PROVENANCE.md의 복원 근거). 이 패키지는 그 판으로 이전 판 그리드를 반올림 범위까지 재현한다. - 36분류 산업연관 행렬의 정규화 누락. 62·69 행렬과 달리 36분류 그리드는 정규화하지 않은 생산유발계수 평균(비대각 평균 0.037)을 쓴다. 정규화 여부에 따른 결과는 02 5절과
check_io36_normalized.csv에 있다. - 사전분포 선택의 λ 의존성. 정비판에서도 명세(차분)와 외생(VARX)의 선택은 λ=0.05·0.1·0.2·0.4에서 유지되지만, 62·69분류의 산업연관표 대 미네소타 차이는 작고 (λ=0.2에서 62분류 -0.007, 69분류 -0.002) λ=0.2에서만 산업연관표가 앞선다. '산업연관표 사전이 미네소타보다 낫다'는 결론은 λ=0.2에 조건부이다.
- 62·69 패널의 성장률 중복. 62·69개 산업은 36개 공표 산업을 2020년 고정 비중으로 나눈 것이어서 서로 다른 분기 성장률 계열이 62분류 32개, 69분류 34개뿐이다. 옵션 비교는 같은 분류 안에서 한다.
- VECM 기준점의 정의 차이. 오차수정항의 기준이 36분류는 실질 GDP, 62·69분류는 산업 합계이다. 총량(AGG)은 오차수정항이 항상 0이어서 VECM이 차분과 같다.
- 사전 척도의 표본 범위. $\sigma_i$는 전체 표본(2000–2025)의 AR(4) 잔차로 계산한다(원본과 같다).
- 총량 모형과 5장. 총량 그리드의 valid 최소는 수준·VAR이다. 정비판 5장은 총량의 기준선을 BOKDPM 실질GDP 전망에서 가져오고, 총량 VARX(수준·산업연관표·VARX)는 시나리오 간 차이(S1 대비 비율)를 내는 데만 쓴다. 수준 명세의 총량 VARX는 자기 시차 계수의 합이 1보다 작아 10년 전망에서 성장률이 기계적으로 낮아지기 때문이다(5장 패키지 02 4절).
- 문서와 저장 출력의 불일치(이전 판에서 확인). 포털·통합 번들의 4장 재현 안내는
industry_models.py를 사전분포 구현으로 소개하지만, 그리드는run_grid.py의 엔진으로 계산되었다. 수치의 기준은grid_summary_*.csv이다. - 원고와의 대조. 원고(
reports_src/content/report-gva/s4-model.md)와 논문 1–3은 이전 판 수치(예: 36분류 valid 6.79)를 인용한다. 정비판 수치(위 계산 요약)로 고쳐야 하며, 선택 옵션의 결론은 같다. 선택은 valid 기준이고 시험 구간 최소는 분류에 따라 다르다는 점, '후방연쇄'가 실제로는 생산유발계수라는 점은 이전 판 쟁점과 같다.
- 2026-10 정비: 정비판 외생으로 그리드를 다시 계산하고 기록 그리드를
data/published/에 동결하였다. 이전 판 공표 그리드는data/published_prev/로 옮겨 재현 점검에 쓴다. 실질금리 계수 부호 점검(02 4-1절)을 더하였다.
출처
입력 파일의 원래 위치, 생성 프로그램, 작성 시각, SHA-256은 data/inputs/PROVENANCE.md에 있다. src/varx_grid.py는 industry_pipeline/run_grid.py(2026-08-28)의 추정·평가 식을 그대로 옮긴 정리본이다.
R 사용
R은 쓰지 않는다. 모든 계산은 닫힌 형태의 선형대수(numpy)이다.