{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "8fb9ea0f",
   "metadata": {},
   "source": [
    "# 01 데이터 입수 — 국민계정 36개 산업, 산업연관표, 신산업 대용지표\n",
    "\n",
    "**목적.** 62·69개 산업 분기 실질부가가치 패널과 연쇄가중 총량 재현에 필요한 공개 자료를 불러오고 검증한다.\n",
    "기본 실행은 `data/inputs/`의 스냅샷(2026년 6–8월 수집, 2026-10-08 원천 재수집 대조 — 6절 참조)만 읽으므로 인증키와 인터넷 연결이 필요 없다.\n",
    "\n",
    "| 입력 | 내용 | 원천(통계표·항목) | 기간 |\n",
    "|---|---|---|---|\n",
    "| `bok36_va_q.csv` | 36개 산업 분기 실질·명목 부가가치(계절조정, 십억원) | 한국은행 ECOS 200Y104(실질)·200Y103(명목) | 1980Q1–2025Q4 |\n",
    "| `gva_total_q.csv` | 총부가가치(기초가격, 실질, 계절조정) | ECOS 200Y104 항목 1200 | 1980Q1–2025Q4 |\n",
    "| `gdp_quarterly_sa.csv` | 국내총생산(지출, 계절조정, 명목·실질) | ECOS 200Y107·200Y108 항목 10601 | 1980Q1–2025Q4 |\n",
    "| `io_benchmark_va_83ind.csv` | 상품중분류(83) 부가가치(백만원) | ECOS 271Y120 부가가치계(9690) | 2015·2020 |\n",
    "| `io_M_mid_2020.csv` | 중분류 생산유발계수(85×85) | ECOS 271Y122 | 2020 |\n",
    "| `io_small_37x_va.csv` | 통합소분류 37x(전기장비) 부가가치(백만원) | 한국은행 산업연관표 2020 실측표·2021–2023 연장표(xlsx) | 2020–2023 |\n",
    "| `mfg_prod_c28_c282.csv` | 생산지수(원지수) 전기장비(C28)·일차전지 및 축전지(C282) | KOSIS 101/DT_1F02001 항목 T10 | 2000.01–2026.04 |\n",
    "| `power_gen_kpx.csv` | 발전량: 신재생 및 기타·합계(GWh) | KOSIS 388/TX_38803_A016A(한국전력거래소) | 2006–2016 |\n",
    "| `power_gen_kepco.csv` | 발전원별 발전량 6종(GWh) | 한국전력공사 전력통계(e-나라지표 1339) | 2016–2025 |\n",
    "\n",
    "설계표 `data/crosswalk_62.json`(KEIT62 ↔ BOK36 ↔ IO 상품중분류 83)과 `data/carveout_rules.csv`(62→69 분화 규칙)는 본 연구가 작성한 표이다.\n",
    "\n",
    "**산출물.** `data/interim/va36_real_q.csv`, `va36_nominal_q.csv`(36개 산업 광형), `snapshot_check.csv`, (ONLINE=1일 때) `online_diff.csv`\n",
    "\n",
    "**스위치.** 환경변수 `ONLINE=1`이면 6절에서 ECOS·KOSIS를 다시 조회해 스냅샷과 비교한다. 인증키는 `API_KEY_BOK`, `API_KEY_KOSIS` 환경변수에서만 읽는다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e32b9743",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-07T20:32:50.863907Z",
     "iopub.status.busy": "2026-10-07T20:32:50.863408Z",
     "iopub.status.idle": "2026-10-07T20:32:51.322085Z",
     "shell.execute_reply": "2026-10-07T20:32:51.321582Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Python 3.12.10 · pandas 2.2.3 · numpy 2.4.6\n",
      "  ONLINE=0 (원천 재수집)  FULL=0  ECOS 키 없음 · KOSIS 키 없음\n",
      "  36개 산업 분기      있음  data\\inputs\\bok36_va_q.csv\n",
      "  총부가가치          있음  data\\inputs\\gva_total_q.csv\n",
      "  실질 GDP         있음  data\\inputs\\gdp_quarterly_sa.csv\n",
      "  IO 중분류 부가가치    있음  data\\inputs\\io_benchmark_va_83ind.csv\n",
      "  IO 생산유발계수      있음  data\\inputs\\io_M_mid_2020.csv\n",
      "  IO 소분류 37x     있음  data\\inputs\\io_small_37x_va.csv\n",
      "  생산지수 C28·C282  있음  data\\inputs\\mfg_prod_c28_c282.csv\n",
      "  발전량 KPX        있음  data\\inputs\\power_gen_kpx.csv\n",
      "  발전량 KEPCO      있음  data\\inputs\\power_gen_kepco.csv\n",
      "  대조표 62         있음  data\\crosswalk_62.json\n",
      "  분화 규칙 69       있음  data\\carveout_rules.csv\n"
     ]
    }
   ],
   "source": [
    "import os, glob\n",
    "import numpy as np, pandas as pd\n",
    "import config as C\n",
    "import gva_data as F\n",
    "pd.set_option(\"display.float_format\", lambda v: f\"{v:,.4f}\")\n",
    "pd.set_option(\"display.width\", 160)\n",
    "C.setup()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fe852ec5",
   "metadata": {},
   "source": [
    "## 1. 스냅샷 무결성\n",
    "\n",
    "각 입력 파일의 SHA-256을 `config.INPUT_SHA256`에 기록한 값과 대조한다. 하나라도 다르면 이후 계산 결과가 공표본과 달라질 수 있으므로 여기서 멈춘다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "9965206c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-07T20:32:51.323091Z",
     "iopub.status.busy": "2026-10-07T20:32:51.323091Z",
     "iopub.status.idle": "2026-10-07T20:32:51.345120Z",
     "shell.execute_reply": "2026-10-07T20:32:51.344616Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>파일</th>\n",
       "      <th>내용</th>\n",
       "      <th>바이트</th>\n",
       "      <th>행수</th>\n",
       "      <th>SHA-256(앞 16자)</th>\n",
       "      <th>기록값과 일치</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>bok36_va_q.csv</td>\n",
       "      <td>36개 산업 분기</td>\n",
       "      <td>377192</td>\n",
       "      <td>6624</td>\n",
       "      <td>be93329c14b1ea65</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>gva_total_q.csv</td>\n",
       "      <td>총부가가치</td>\n",
       "      <td>3135</td>\n",
       "      <td>184</td>\n",
       "      <td>4087e14e8d461c59</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>gdp_quarterly_sa.csv</td>\n",
       "      <td>실질 GDP</td>\n",
       "      <td>6242</td>\n",
       "      <td>184</td>\n",
       "      <td>3adbc832b93488c3</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>io_benchmark_va_83ind.csv</td>\n",
       "      <td>IO 중분류 부가가치</td>\n",
       "      <td>7463</td>\n",
       "      <td>206</td>\n",
       "      <td>24a07dfdbc388f6e</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>io_M_mid_2020.csv</td>\n",
       "      <td>IO 생산유발계수</td>\n",
       "      <td>111783</td>\n",
       "      <td>7225</td>\n",
       "      <td>af8a6514e0ddd90c</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>io_small_37x_va.csv</td>\n",
       "      <td>IO 소분류 37x</td>\n",
       "      <td>3081</td>\n",
       "      <td>24</td>\n",
       "      <td>46f72bff6388a9ee</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>mfg_prod_c28_c282.csv</td>\n",
       "      <td>생산지수 C28·C282</td>\n",
       "      <td>33618</td>\n",
       "      <td>632</td>\n",
       "      <td>1af50c079edd888e</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>power_gen_kpx.csv</td>\n",
       "      <td>발전량 KPX</td>\n",
       "      <td>249</td>\n",
       "      <td>11</td>\n",
       "      <td>4c05ae3809eb8879</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>power_gen_kepco.csv</td>\n",
       "      <td>발전량 KEPCO</td>\n",
       "      <td>490</td>\n",
       "      <td>10</td>\n",
       "      <td>81fb52b2499a2ce3</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>crosswalk_62.json</td>\n",
       "      <td>대조표 62</td>\n",
       "      <td>4674</td>\n",
       "      <td>&lt;NA&gt;</td>\n",
       "      <td>09c137303ab59970</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>carveout_rules.csv</td>\n",
       "      <td>분화 규칙 69</td>\n",
       "      <td>879</td>\n",
       "      <td>7</td>\n",
       "      <td>59b7fb2688cec105</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                           파일             내용     바이트    행수    SHA-256(앞 16자)  기록값과 일치\n",
       "0              bok36_va_q.csv      36개 산업 분기  377192  6624  be93329c14b1ea65     True\n",
       "1             gva_total_q.csv          총부가가치    3135   184  4087e14e8d461c59     True\n",
       "2        gdp_quarterly_sa.csv         실질 GDP    6242   184  3adbc832b93488c3     True\n",
       "3   io_benchmark_va_83ind.csv    IO 중분류 부가가치    7463   206  24a07dfdbc388f6e     True\n",
       "4           io_M_mid_2020.csv      IO 생산유발계수  111783  7225  af8a6514e0ddd90c     True\n",
       "5         io_small_37x_va.csv     IO 소분류 37x    3081    24  46f72bff6388a9ee     True\n",
       "6       mfg_prod_c28_c282.csv  생산지수 C28·C282   33618   632  1af50c079edd888e     True\n",
       "7           power_gen_kpx.csv        발전량 KPX     249    11  4c05ae3809eb8879     True\n",
       "8         power_gen_kepco.csv      발전량 KEPCO     490    10  81fb52b2499a2ce3     True\n",
       "9           crosswalk_62.json         대조표 62    4674  <NA>  09c137303ab59970     True\n",
       "10         carveout_rules.csv       분화 규칙 69     879     7  59b7fb2688cec105     True"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "files = {\"36개 산업 분기\": C.VA36, \"총부가가치\": C.GVA_TOTAL, \"실질 GDP\": C.GDP_Q, \"IO 중분류 부가가치\": C.IO_VA83,\n",
    "         \"IO 생산유발계수\": C.IO_M, \"IO 소분류 37x\": C.IO_SMALL, \"생산지수 C28·C282\": C.MFG_PROD,\n",
    "         \"발전량 KPX\": C.POWER_KPX, \"발전량 KEPCO\": C.POWER_KEPCO, \"대조표 62\": C.CROSSWALK, \"분화 규칙 69\": C.CARVE_RULES}\n",
    "snap = F.snapshot_table(files, C.INPUT_SHA256)\n",
    "snap.to_csv(os.path.join(C.INTERIM, \"snapshot_check.csv\"), index=False, encoding=\"utf-8-sig\")\n",
    "assert snap[\"기록값과 일치\"].all(), \"스냅샷 SHA-256이 기록값과 다르다 — data/inputs/ 파일을 확인한다\"\n",
    "snap"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "30395313",
   "metadata": {},
   "source": [
    "## 2. 36개 산업 분기 실질·명목 부가가치\n",
    "\n",
    "한국은행 「경제활동별 GDP 및 GNI」(계절조정, 분기)의 말단 산업 36개이다. 실질은 2020년 기준 연쇄가격이다.\n",
    "상위 집계(제조업·서비스업 등)와 소득 항목(총부가가치·GDP·GNI)은 제외하였다. 36개 산업이 모두 존재하는 첫 분기가 1980Q1이므로 결측이 없는 균형 패널을 이룬다.\n",
    "수집 당시 2026Q1 계절조정 명목 GDP가 직전 분기보다 10.5% 높은 비정상값을 보여 표본을 2025Q4에서 끊었다(원 수집 코드 `fetch_gdp_quarterly.py`의 기록).\n",
    "62·69 패널은 이 가운데 2000Q1–2025Q4(104분기)의 실질값만 쓰고, 연쇄가중 재현(02의 7절)은 1980Q1부터의 실질·명목을 모두 쓴다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "4df1e427",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-07T20:32:51.346121Z",
     "iopub.status.busy": "2026-10-07T20:32:51.346121Z",
     "iopub.status.idle": "2026-10-07T20:32:51.371744Z",
     "shell.execute_reply": "2026-10-07T20:32:51.371240Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "실질 (184, 36) · 명목 (184, 36) · 기간 1980Q1–2025Q4 · 결측 0\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>산업명</th>\n",
       "      <th>실질 2025Q4</th>\n",
       "      <th>명목 2025Q4</th>\n",
       "      <th>실질 2000Q1</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>ECOS 코드</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1101</th>\n",
       "      <td>농림어업</td>\n",
       "      <td>8,373.6000</td>\n",
       "      <td>9,686.2000</td>\n",
       "      <td>7,369.2000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1102</th>\n",
       "      <td>광업</td>\n",
       "      <td>339.3000</td>\n",
       "      <td>402.3000</td>\n",
       "      <td>778.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>110301</th>\n",
       "      <td>음식료품 제조업</td>\n",
       "      <td>7,990.9000</td>\n",
       "      <td>9,148.5000</td>\n",
       "      <td>4,215.3000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>110302</th>\n",
       "      <td>섬유 및 가죽제품 제조업</td>\n",
       "      <td>3,732.1000</td>\n",
       "      <td>4,073.9000</td>\n",
       "      <td>4,651.3000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>110303</th>\n",
       "      <td>목재, 종이, 인쇄 및 복제업</td>\n",
       "      <td>3,273.7000</td>\n",
       "      <td>3,952.5000</td>\n",
       "      <td>2,868.4000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>110304</th>\n",
       "      <td>코크스 및 석유정제품 제조업</td>\n",
       "      <td>2,427.6000</td>\n",
       "      <td>4,780.0000</td>\n",
       "      <td>6,051.7000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>110305</th>\n",
       "      <td>화학물질 및 화학제품 제조업</td>\n",
       "      <td>24,256.2000</td>\n",
       "      <td>27,003.9000</td>\n",
       "      <td>9,878.1000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>110306</th>\n",
       "      <td>비금속광물제품 제조업</td>\n",
       "      <td>2,271.9000</td>\n",
       "      <td>3,051.3000</td>\n",
       "      <td>1,822.3000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>110307</th>\n",
       "      <td>1차금속 제조업</td>\n",
       "      <td>5,973.8000</td>\n",
       "      <td>9,942.3000</td>\n",
       "      <td>4,991.5000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>110308</th>\n",
       "      <td>금속가공제품 제조업</td>\n",
       "      <td>6,310.6000</td>\n",
       "      <td>11,815.7000</td>\n",
       "      <td>4,579.5000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>110309</th>\n",
       "      <td>컴퓨터, 전자 및 광학기기 제조업</td>\n",
       "      <td>61,268.0000</td>\n",
       "      <td>72,310.8000</td>\n",
       "      <td>5,389.9000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>110310</th>\n",
       "      <td>전기장비 제조업</td>\n",
       "      <td>8,512.3000</td>\n",
       "      <td>10,015.8000</td>\n",
       "      <td>3,233.5000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                        산업명   실질 2025Q4   명목 2025Q4  실질 2000Q1\n",
       "ECOS 코드                                                       \n",
       "1101                   농림어업  8,373.6000  9,686.2000 7,369.2000\n",
       "1102                     광업    339.3000    402.3000   778.0000\n",
       "110301             음식료품 제조업  7,990.9000  9,148.5000 4,215.3000\n",
       "110302        섬유 및 가죽제품 제조업  3,732.1000  4,073.9000 4,651.3000\n",
       "110303     목재, 종이, 인쇄 및 복제업  3,273.7000  3,952.5000 2,868.4000\n",
       "110304      코크스 및 석유정제품 제조업  2,427.6000  4,780.0000 6,051.7000\n",
       "110305      화학물질 및 화학제품 제조업 24,256.2000 27,003.9000 9,878.1000\n",
       "110306          비금속광물제품 제조업  2,271.9000  3,051.3000 1,822.3000\n",
       "110307             1차금속 제조업  5,973.8000  9,942.3000 4,991.5000\n",
       "110308           금속가공제품 제조업  6,310.6000 11,815.7000 4,579.5000\n",
       "110309   컴퓨터, 전자 및 광학기기 제조업 61,268.0000 72,310.8000 5,389.9000\n",
       "110310             전기장비 제조업  8,512.3000 10,015.8000 3,233.5000"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "real, nom, names = F.read_va36(C.VA36)\n",
    "print(f\"실질 {real.shape} · 명목 {nom.shape} · 기간 {real.index[0]}–{real.index[-1]} · 결측 {int(real.isna().sum().sum() + nom.isna().sum().sum())}\")\n",
    "assert real.shape == (184, 36) and nom.shape == (184, 36) and not real.isna().any().any()\n",
    "real.to_csv(os.path.join(C.INTERIM, \"va36_real_q.csv\"), encoding=\"utf-8-sig\")\n",
    "nom.to_csv(os.path.join(C.INTERIM, \"va36_nominal_q.csv\"), encoding=\"utf-8-sig\")\n",
    "last = pd.DataFrame({\"산업명\": pd.Series(names), \"실질 2025Q4\": real.loc[\"2025Q4\"], \"명목 2025Q4\": nom.loc[\"2025Q4\"],\n",
    "                     \"실질 2000Q1\": real.loc[\"2000Q1\"]})\n",
    "last.index.name = \"ECOS 코드\"\n",
    "last.head(12)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "56a95758",
   "metadata": {},
   "source": [
    "## 3. 총량 계열 — 총부가가치와 국내총생산\n",
    "\n",
    "연쇄가중 실질값은 가법성이 없다. 36개 산업 실질값을 단순히 더한 값은 기준연도(2020) 부근에서만 총부가가치와 같고, 기준연도에서 멀어질수록 차이가 커진다.\n",
    "국내총생산은 총부가가치에 순생산물세를 더한 값이다. 실질 GDP는 총량 모형의 입력 패널(`levels_agg.csv`)이 된다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "8efae176",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-07T20:32:51.372744Z",
     "iopub.status.busy": "2026-10-07T20:32:51.372244Z",
     "iopub.status.idle": "2026-10-07T20:32:51.379135Z",
     "shell.execute_reply": "2026-10-07T20:32:51.379135Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>36개 단순합</th>\n",
       "      <th>총부가가치(1200)</th>\n",
       "      <th>실질 GDP(10601)</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>분기</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1980Q1</th>\n",
       "      <td>52,579.1000</td>\n",
       "      <td>43,120.7000</td>\n",
       "      <td>47,272.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000Q1</th>\n",
       "      <td>233,441.0000</td>\n",
       "      <td>220,819.8000</td>\n",
       "      <td>243,573.1000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2010Q1</th>\n",
       "      <td>358,568.4000</td>\n",
       "      <td>354,510.9000</td>\n",
       "      <td>386,238.5000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020Q1</th>\n",
       "      <td>475,917.8000</td>\n",
       "      <td>475,788.6000</td>\n",
       "      <td>517,226.9000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2025Q4</th>\n",
       "      <td>549,415.1000</td>\n",
       "      <td>543,908.0000</td>\n",
       "      <td>585,964.0000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            36개 단순합  총부가가치(1200)  실질 GDP(10601)\n",
       "분기                                             \n",
       "1980Q1  52,579.1000  43,120.7000    47,272.0000\n",
       "2000Q1 233,441.0000 220,819.8000   243,573.1000\n",
       "2010Q1 358,568.4000 354,510.9000   386,238.5000\n",
       "2020Q1 475,917.8000 475,788.6000   517,226.9000\n",
       "2025Q4 549,415.1000 543,908.0000   585,964.0000"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gva = F.read_gva_total(C.GVA_TOTAL)\n",
    "gdp = F.read_gdp(C.GDP_Q)\n",
    "show = [\"1980Q1\", \"2000Q1\", \"2010Q1\", \"2020Q1\", \"2025Q4\"]\n",
    "pd.DataFrame({\"36개 단순합\": real.sum(axis=1), \"총부가가치(1200)\": gva, \"실질 GDP(10601)\": gdp[\"실질GDP_십억원\"]}).loc[show]\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c9acc98f",
   "metadata": {},
   "source": [
    "## 4. 산업연관표(2020 실측표)\n",
    "\n",
    "- **상품중분류 83개 부가가치(271Y120)**: 36→62 배분과 62→69 고정 몫의 기준이다. 표의 열(수요부문 1–83)별 '부가가치계'(9690) 행 값이다.\n",
    "- **중분류 생산유발계수(271Y122)**: 산업모형의 산업연관 사전(prior)에 쓰는 62·69 연계강도 행렬의 원자료이다.\n",
    "- **통합소분류 37x 부가가치**: 전기장비(37) 안의 전지(373) 비중을 구해 이차전지 몫의 수준을 맞춘다. ECOS Open API는 소분류 표를 제공하지 않으므로 한국은행 산업연관표 xlsx에서 추출한 값을 스냅샷으로 둔다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "a4d360a4",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-07T20:32:51.380578Z",
     "iopub.status.busy": "2026-10-07T20:32:51.380578Z",
     "iopub.status.idle": "2026-10-07T20:32:51.390970Z",
     "shell.execute_reply": "2026-10-07T20:32:51.390466Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "IO83 부가가치(2020): 83개 상품 · 합계 2,036.2조원 · 0인 상품 [83]\n",
      "생산유발계수: 85×85 · 대각 평균 1.071\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>연도</th>\n",
       "      <th>2020</th>\n",
       "      <th>2021</th>\n",
       "      <th>2022</th>\n",
       "      <th>2023</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>소분류코드</th>\n",
       "      <th>소분류명</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>371</th>\n",
       "      <th>발전기 및 전동기</th>\n",
       "      <td>2553718</td>\n",
       "      <td>2928477</td>\n",
       "      <td>3467250</td>\n",
       "      <td>3272707</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>372</th>\n",
       "      <th>전기변환.공급제어장치</th>\n",
       "      <td>8899299</td>\n",
       "      <td>8782292</td>\n",
       "      <td>9408848</td>\n",
       "      <td>10641695</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>373</th>\n",
       "      <th>전지</th>\n",
       "      <td>5752407</td>\n",
       "      <td>6424953</td>\n",
       "      <td>7674703</td>\n",
       "      <td>7441610</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>374</th>\n",
       "      <th>전선 및 케이블</th>\n",
       "      <td>2241154</td>\n",
       "      <td>2706742</td>\n",
       "      <td>2845949</td>\n",
       "      <td>2641273</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>375</th>\n",
       "      <th>가정용 전기기기</th>\n",
       "      <td>4954564</td>\n",
       "      <td>4490541</td>\n",
       "      <td>5012941</td>\n",
       "      <td>5278263</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>379</th>\n",
       "      <th>기타 전기장비</th>\n",
       "      <td>7272675</td>\n",
       "      <td>6803946</td>\n",
       "      <td>7329982</td>\n",
       "      <td>8389264</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "연도                    2020     2021     2022      2023\n",
       "소분류코드 소분류명                                            \n",
       "371   발전기 및 전동기    2553718  2928477  3467250   3272707\n",
       "372   전기변환.공급제어장치  8899299  8782292  9408848  10641695\n",
       "373   전지           5752407  6424953  7674703   7441610\n",
       "374   전선 및 케이블     2241154  2706742  2845949   2641273\n",
       "375   가정용 전기기기     4954564  4490541  5012941   5278263\n",
       "379   기타 전기장비      7272675  6803946  7329982   8389264"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "io = F.read_io_va83(C.IO_VA83)\n",
    "M = pd.read_csv(C.IO_M)\n",
    "small = pd.read_csv(C.IO_SMALL, dtype={\"소분류코드\": str})\n",
    "print(f\"IO83 부가가치(2020): {len(io)}개 상품 · 합계 {io.sum()/1e6:,.1f}조원 · 0인 상품 {list(io[io == 0].index)}\")\n",
    "print(f\"생산유발계수: {M['i'].nunique()}×{M['j'].nunique()} · 대각 평균 {M[M.i == M.j]['v'].mean():.3f}\")\n",
    "small.pivot(index=[\"소분류코드\", \"소분류명\"], columns=\"연도\", values=\"부가가치_백만원\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d32259aa",
   "metadata": {},
   "source": [
    "## 5. 신산업 대용지표 — 생산지수와 발전량\n",
    "\n",
    "이차전지와 신재생에너지는 산업연관표 상품중분류에 독립 코드가 없어 시계열 몫을 따로 만든다.\n",
    "\n",
    "- **이차전지**: 광업제조업동향조사 생산지수(원지수) C282(일차전지 및 축전지)/C28(전기장비) 비율이 시간적 형태를 준다.\n",
    "- **신재생에너지**: 신재생 발전량/총발전량. 2006–2015년은 한국전력거래소(KOSIS 388/TX_38803_A016A)의 '신재생 및 기타'/'합계', 2016–2025년은 한국전력공사 전력통계(e-나라지표 1339)의 발전원별 발전량 6종 합계를 쓴다. 두 원천은 2016년 신재생 25,837 GWh(KPX)와 25,836 GWh(KEPCO)로 거의 같다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "3be560d3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-07T20:32:51.391472Z",
     "iopub.status.busy": "2026-10-07T20:32:51.391472Z",
     "iopub.status.idle": "2026-10-07T20:32:51.402685Z",
     "shell.execute_reply": "2026-10-07T20:32:51.402181Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "생산지수: 2000-01-01–2026-04-01 (316개월) · 결측 0\n",
      "2016년 접합 점검: KPX 신재생 25,837 / 합계 540,441 GWh · KEPCO 신재생 25,836 / 합계 540,440 GWh\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>ksic</th>\n",
       "      <th>C28</th>\n",
       "      <th>C282</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2000-01-01</th>\n",
       "      <td>59.0560</td>\n",
       "      <td>8.9690</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2010-01-01</th>\n",
       "      <td>86.6710</td>\n",
       "      <td>75.0080</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-01-01</th>\n",
       "      <td>92.6000</td>\n",
       "      <td>96.4000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2025-12-01</th>\n",
       "      <td>114.3000</td>\n",
       "      <td>95.1000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "ksic            C28    C282\n",
       "date                       \n",
       "2000-01-01  59.0560  8.9690\n",
       "2010-01-01  86.6710 75.0080\n",
       "2020-01-01  92.6000 96.4000\n",
       "2025-12-01 114.3000 95.1000"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mfg = F.read_mfg_prod(C.MFG_PROD)\n",
    "kpx, kepco = pd.read_csv(C.POWER_KPX), pd.read_csv(C.POWER_KEPCO)\n",
    "print(f\"생산지수: {mfg.index[0]}–{mfg.index[-1]} ({len(mfg)}개월) · 결측 {int(mfg.isna().sum().sum())}\")\n",
    "k16, e16 = kpx.set_index(\"연도\").loc[2016], kepco.set_index(\"연도\").loc[2016]\n",
    "print(f\"2016년 접합 점검: KPX 신재생 {k16['신재생및기타_GWh']:,} / 합계 {k16['합계_GWh']:,} GWh · \"\n",
    "      f\"KEPCO 신재생 {e16['신재생']:,} / 합계 {int(e16[['원자력','양수','석탄','유류','가스','신재생']].sum()):,} GWh\")\n",
    "mfg.loc[[\"2000-01-01\", \"2010-01-01\", \"2020-01-01\", \"2025-12-01\"]]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "71c78700",
   "metadata": {},
   "source": [
    "## 6. 원천 재수집과 대조(ONLINE=1)\n",
    "\n",
    "ECOS·KOSIS Open API로 같은 통계표를 다시 받아 스냅샷과 공통 관측을 비교한다. 한국은행·통계청은 과거 계열을 수정 공표하므로 차이가 생길 수 있으며,\n",
    "차이는 보고만 하고 실행을 멈추지 않는다. 전력통계(e-나라지표 1339)는 Open API가 없어 대조 대상에서 제외한다.\n",
    "재수집 자료는 `data/interim/online_*.csv`로 저장하며, 02의 8절이 이 자료로 62 패널과 이차전지 몫을 다시 계산해 차이를 보인다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "916395c0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-07T20:32:51.403685Z",
     "iopub.status.busy": "2026-10-07T20:32:51.403185Z",
     "iopub.status.idle": "2026-10-07T20:32:51.408499Z",
     "shell.execute_reply": "2026-10-07T20:32:51.407993Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ONLINE=0 — 스냅샷만 사용한다. 원천과 대조하려면 ONLINE=1과 API_KEY_BOK·API_KEY_KOSIS 환경변수를 설정한 뒤 다시 실행한다.\n"
     ]
    }
   ],
   "source": [
    "if not C.ONLINE:\n",
    "    print(\"ONLINE=0 — 스냅샷만 사용한다. 원천과 대조하려면 ONLINE=1과 API_KEY_BOK·API_KEY_KOSIS 환경변수를 설정한 뒤 다시 실행한다.\")\n",
    "else:\n",
    "    rows = []\n",
    "    def attempt(label, fn):\n",
    "        try:\n",
    "            rows.append(fn())\n",
    "        except Exception as e:\n",
    "            rows.append({\"항목\": label, \"비고\": f\"재수집 실패: {str(e)[:80]}\"})\n",
    "    if not C.API_KEY_BOK:\n",
    "        rows.append({\"항목\": \"ECOS 전체\", \"비고\": \"API_KEY_BOK 없음 — 건너뜀\"})\n",
    "    else:\n",
    "        def va36():\n",
    "            r2, n2, g2 = F.fetch_va36_online(C.API_KEY_BOK, list(real.columns))\n",
    "            r2.to_csv(os.path.join(C.INTERIM, \"online_va36_real_q.csv\"), encoding=\"utf-8-sig\")\n",
    "            rows.append(F.diff_summary(\"36개 산업 명목(200Y103)\", nom, n2))\n",
    "            rows.append(F.diff_summary(\"총부가가치(200Y104·1200)\", gva.to_frame(\"v\"), g2.to_frame(\"v\")))\n",
    "            return F.diff_summary(\"36개 산업 실질(200Y104)\", real, r2)\n",
    "        attempt(\"36개 산업(200Y103·200Y104)\", va36)\n",
    "        attempt(\"실질 GDP(200Y108)\", lambda: F.diff_summary(\"실질 GDP(200Y108)\", gdp[[\"실질GDP_십억원\"]], F.fetch_gdp_online(C.API_KEY_BOK).to_frame()))\n",
    "        attempt(\"IO83 부가가치(271Y120)\", lambda: F.diff_summary(\"IO83 부가가치(271Y120)\", io.to_frame(\"v\"), F.fetch_io_va83_online(C.API_KEY_BOK).to_frame(\"v\")))\n",
    "        attempt(\"생산유발계수(271Y122)\", lambda: F.diff_summary(\"생산유발계수(271Y122)\", M.pivot(index=\"i\", columns=\"j\", values=\"v\"),\n",
    "                                                          F.fetch_io_M_online(C.API_KEY_BOK).pivot(index=\"i\", columns=\"j\", values=\"v\")))\n",
    "    if not C.API_KEY_KOSIS:\n",
    "        rows.append({\"항목\": \"KOSIS 전체\", \"비고\": \"API_KEY_KOSIS 없음 — 건너뜀\"})\n",
    "    else:\n",
    "        def mfg_online():\n",
    "            m2 = F.fetch_mfg_prod_online(C.API_KEY_KOSIS)\n",
    "            m2.to_csv(os.path.join(C.INTERIM, \"online_mfg_prod.csv\"), encoding=\"utf-8-sig\")\n",
    "            return F.diff_summary(\"생산지수 C28·C282(DT_1F02001)\", mfg, m2)\n",
    "        attempt(\"생산지수(DT_1F02001)\", mfg_online)\n",
    "        attempt(\"발전량 KPX(TX_38803_A016A)\", lambda: F.diff_summary(\"발전량 KPX(TX_38803_A016A)\", kpx.set_index(\"연도\"),\n",
    "                                                                  F.fetch_kpx_online(C.API_KEY_KOSIS).set_index(\"연도\")))\n",
    "    diff = pd.DataFrame(rows)\n",
    "    diff.to_csv(os.path.join(C.INTERIM, \"online_diff.csv\"), index=False, encoding=\"utf-8-sig\")\n",
    "    display(diff)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0f8bb8bc",
   "metadata": {},
   "source": [
    "## 7. (선택) 산업연관표 통합소분류 원본 재추출\n",
    "\n",
    "한국은행 산업연관표 「투입산출표(생산자가격) 통합소분류」 xlsx 4개(2020 실측, 2021–2023 연장)를 `data/external/`에 두면 37x 부가가치를 다시 추출해 스냅샷과 대조한다.\n",
    "파일이 없으면 이 절을 건너뛴다. 파일명 형식은 `config.IO_SMALL_XLSX`에 있다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "918196cc",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-07T20:32:51.408997Z",
     "iopub.status.busy": "2026-10-07T20:32:51.408997Z",
     "iopub.status.idle": "2026-10-07T20:32:51.413582Z",
     "shell.execute_reply": "2026-10-07T20:32:51.413075Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "data/external/ 에 통합소분류 xlsx가 없어 건너뛴다(스냅샷 io_small_37x_va.csv 사용).\n"
     ]
    }
   ],
   "source": [
    "found = {y: sorted(glob.glob(os.path.join(C.EXTERNAL, pat))) for y, pat in C.IO_SMALL_XLSX.items()}\n",
    "if not all(found.values()):\n",
    "    print(\"data/external/ 에 통합소분류 xlsx가 없어 건너뛴다(스냅샷 io_small_37x_va.csv 사용).\")\n",
    "else:\n",
    "    ext = F.extract_io_small_xlsx({y: f[0] for y, f in found.items()})\n",
    "    m = ext.merge(small, on=[\"연도\", \"소분류코드\"], suffixes=(\"_원본\", \"_스냅샷\"))\n",
    "    print(f\"대조 {len(m)}행 · 최대 차이 {(m['부가가치_백만원_원본'] - m['부가가치_백만원_스냅샷']).abs().max()} 백만원\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "592327f3",
   "metadata": {},
   "source": [
    "## 8. 산출물\n",
    "\n",
    "다음 노트북(`02_분석.ipynb`)은 `data/interim/`의 36개 산업 광형 파일과 `data/inputs/`의 나머지 스냅샷을 읽는다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "e6605740",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-07T20:32:51.415082Z",
     "iopub.status.busy": "2026-10-07T20:32:51.414581Z",
     "iopub.status.idle": "2026-10-07T20:32:51.418328Z",
     "shell.execute_reply": "2026-10-07T20:32:51.417824Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "snapshot_check.csv                 830 bytes\n",
      "va36_nominal_q.csv              47,341 bytes\n",
      "va36_real_q.csv                 48,741 bytes\n"
     ]
    }
   ],
   "source": [
    "for f in sorted(os.listdir(C.INTERIM)):\n",
    "    p = os.path.join(C.INTERIM, f)\n",
    "    print(f\"{f:<28} {os.path.getsize(p):>9,d} bytes\")"
   ]
  }
 ],
 "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.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
