{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "379c4563",
   "metadata": {},
   "source": [
    "# 01 데이터 입수 — AI 확산 지표, 산업모형 입력, 설문\n",
    "\n",
    "**목적.** AI 확산 지수(총량·산업별)와 VARX 대안 모형에 필요한 입력을 불러오고 검증한다.\n",
    "\n",
    "| 입력 | 내용 | 출처 | 공개 |\n",
    "|---|---|---|---|\n",
    "| `levels_62.csv`, `exog_hist_v2.csv`, `exog_scen_v2.csv`, `io_linkage_62.csv` | 62개 산업 분기 실질부가가치(100·log), 외생 6종 과거·시나리오, 산업연관 연계 가중치 | 보고서1 5장 재현 패키지 입력(2026-10 정비판) | 공개 |\n",
    "| `base_va_62.csv` | 정합화 후 기준 시나리오(S1) 산업별 실질부가가치 | 보고서1 5장 산출물(보고서2 4장 입력과 같은 파일) | 공개 |\n",
    "| `findip_g06n_by_year.csv`, `openalex_by_year.csv`, `eventregistry_ai_eng_daily.csv` | 연도별 AI 특허(G06N, 5개국)·AI 논문, 일별 영문 AI 뉴스 | 보고서2 1장 스냅샷 | 공개 |\n",
    "| `eventregistry_industry_ai_share_2025.csv` | 2025년 업종 키워드 뉴스 중 AI를 함께 다룬 비율 | Event Registry(이 장에서 조회) | 공개 |\n",
    "| `openalex_field_ai_share_2023_2025.csv` | 2023–2025년 학문 분야별 AI 논문 비중 | OpenAlex(이 장에서 조회) | 공개 |\n",
    "| `findip_g06n_coipc_5c_2020_2025.csv`, `findip_g06n_coipc_supplement_2020_2025.csv` | G06N 특허의 동시분류 IPC별 건수(상위 20개 + 포함–배제 보완) | FindIP CENSUS(이 장에서 조회) | 공개 |\n",
    "| `keis_r14_va_scenarios.csv` | 기준전망·혁신전망의 산업별 실질부가가치 연평균 증가율(인쇄값) | 한국고용정보원(2017) 「기술혁신을 반영한 중장기 인력수요 전망 2016~2030」 표 8-6·8-8~8-14, 11장 | 공개 |\n",
    "| `data/private/AI수용도조사_통계표_260417.xlsx`, `AI수용도조사_원자료_n2297.xlsx` | E4-1(AI의 매출 영향 정도) 업종 평균과 응답 분포 | 한국고용정보원 공유자료 | **비공개** |\n",
    "\n",
    "출처·조회 시각·SHA-256은 `data/inputs/PROVENANCE.md`, FindIP 조회 조건은 `data/inputs/FINDIP_QUERY.md`, Event Registry 조회 조건은 `data/inputs/EVENTREGISTRY_QUERY.md`에 적었다.\n",
    "\n",
    "**산출물.** `data/interim/survey_signal_21.csv`(E4-1 4시점 업종 평균), `data/interim/survey_se_21.csv`(E4-1 2040년 업종 평균의 표준오차) — 둘 다 비공개 자료에서 만든 중간 산출물이다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "fedaa21f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T05:49:03.918180Z",
     "iopub.status.busy": "2026-10-08T05:49:03.917680Z",
     "iopub.status.idle": "2026-10-08T05:49:04.614957Z",
     "shell.execute_reply": "2026-10-08T05:49:04.614957Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Python 3.12.10 · pandas 2.2.3 · numpy 2.4.6 · matplotlib 3.11.0\n",
      "  판: 2026-10 정비판 기준 · Λ 0.5 · 드리프트 목표 1.8% · ONLINE=0(스냅샷) · Event Registry 키 없음\n",
      "  설문 통계표(비공개)    있음  data\\private\\AI수용도조사_통계표_260417.xlsx\n",
      "  설문 원자료(비공개)    있음  data\\private\\AI수용도조사_원자료_n2297.xlsx\n"
     ]
    }
   ],
   "source": [
    "import os, hashlib\n",
    "import numpy as np, pandas as pd\n",
    "import config as C\n",
    "import ai_index as I, ai_varx as X, ai_forecast as F, varx_engine as V, alt_run as R\n",
    "pd.set_option(\"display.float_format\", lambda v: f\"{v:,.3f}\")\n",
    "pd.set_option(\"display.width\", 200)\n",
    "C.setup()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a31d4719",
   "metadata": {},
   "source": [
    "## 1. 입력 파일 검증\n",
    "\n",
    "공개 입력 13개의 SHA-256을 `config.INPUT_SHA256`의 기록과 대조한다. 보고서1 5장·보고서2 1장·4장 패키지에서 복사한 파일은 원본과 해시가 같다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "1d15f110",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T05:49:04.616869Z",
     "iopub.status.busy": "2026-10-08T05:49:04.616366Z",
     "iopub.status.idle": "2026-10-08T05:49:04.627379Z",
     "shell.execute_reply": "2026-10-08T05:49:04.627379Z"
    }
   },
   "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>SHA-256(앞 16자리)</th>\n",
       "      <th>기록과 일치</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>inputs/levels_62.csv</td>\n",
       "      <td>00469e892aac4742</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>inputs/exog_hist_v2.csv</td>\n",
       "      <td>d142ff2992b5ae3e</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>inputs/exog_scen_v2.csv</td>\n",
       "      <td>f45f8007d7b88faf</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>inputs/io_linkage_62.csv</td>\n",
       "      <td>3f747a97c3804541</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>inputs/base_va_62.csv</td>\n",
       "      <td>81c0a99e7e67aad3</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>inputs/findip_g06n_by_year.csv</td>\n",
       "      <td>f6e79f9f95ebec5b</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>inputs/openalex_by_year.csv</td>\n",
       "      <td>19811d9fa29793f3</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>inputs/eventregistry_ai_eng_daily.csv</td>\n",
       "      <td>edaf04ea090e175f</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>inputs/eventregistry_industry_ai_share_2025.csv</td>\n",
       "      <td>6e105511bea37791</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>inputs/openalex_field_ai_share_2023_2025.csv</td>\n",
       "      <td>f14368ff7d0da4ab</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>inputs/findip_g06n_coipc_5c_2020_2025.csv</td>\n",
       "      <td>f327ecb7e4d97dfe</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>inputs/findip_g06n_coipc_supplement_2020_2025.csv</td>\n",
       "      <td>59db0c342111bbb4</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>inputs/keis_r14_va_scenarios.csv</td>\n",
       "      <td>6f1ce507eb886c63</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                   파일   SHA-256(앞 16자리)  기록과 일치\n",
       "0                                inputs/levels_62.csv  00469e892aac4742    True\n",
       "1                             inputs/exog_hist_v2.csv  d142ff2992b5ae3e    True\n",
       "2                             inputs/exog_scen_v2.csv  f45f8007d7b88faf    True\n",
       "3                            inputs/io_linkage_62.csv  3f747a97c3804541    True\n",
       "4                               inputs/base_va_62.csv  81c0a99e7e67aad3    True\n",
       "5                      inputs/findip_g06n_by_year.csv  f6e79f9f95ebec5b    True\n",
       "6                         inputs/openalex_by_year.csv  19811d9fa29793f3    True\n",
       "7               inputs/eventregistry_ai_eng_daily.csv  edaf04ea090e175f    True\n",
       "8     inputs/eventregistry_industry_ai_share_2025.csv  6e105511bea37791    True\n",
       "9        inputs/openalex_field_ai_share_2023_2025.csv  f14368ff7d0da4ab    True\n",
       "10          inputs/findip_g06n_coipc_5c_2020_2025.csv  f327ecb7e4d97dfe    True\n",
       "11  inputs/findip_g06n_coipc_supplement_2020_2025.csv  59db0c342111bbb4    True\n",
       "12                   inputs/keis_r14_va_scenarios.csv  6f1ce507eb886c63    True"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def sha256(p):\n",
    "    h = hashlib.sha256()\n",
    "    with open(p, \"rb\") as f:\n",
    "        h.update(f.read())\n",
    "    return h.hexdigest()\n",
    "\n",
    "chk = pd.DataFrame([{\"파일\": k, \"SHA-256(앞 16자리)\": sha256(os.path.join(C.DATA, k))[:16],\n",
    "                     \"기록과 일치\": sha256(os.path.join(C.DATA, k)) == v} for k, v in C.INPUT_SHA256.items()])\n",
    "display(chk)\n",
    "assert chk[\"기록과 일치\"].all(), \"입력 파일이 기록된 SHA-256과 다르다 — data/inputs/PROVENANCE.md와 config.INPUT_SHA256을 확인한다\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "67d4d3a0",
   "metadata": {},
   "source": [
    "## 2. 총량 지수의 원천 — 특허·논문·뉴스\n",
    "\n",
    "세 자료는 보고서2 1장과 같은 스냅샷이다. 특허는 출원 후 약 18개월 뒤 공개되므로 2025년 값은 하한이며, 총량 지수에서는 2024년까지만 쓴다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "0ac16f18",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T05:49:04.628379Z",
     "iopub.status.busy": "2026-10-08T05:49:04.628379Z",
     "iopub.status.idle": "2026-10-08T05:49:04.641648Z",
     "shell.execute_reply": "2026-10-08T05:49:04.641145Z"
    }
   },
   "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>특허_5개국_G06N</th>\n",
       "      <th>논문_AI개념</th>\n",
       "      <th>뉴스_영문_AI(건)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2015</th>\n",
       "      <td>11236</td>\n",
       "      <td>587875</td>\n",
       "      <td>24,403.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2016</th>\n",
       "      <td>19798</td>\n",
       "      <td>600936</td>\n",
       "      <td>61,363.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017</th>\n",
       "      <td>37365</td>\n",
       "      <td>615136</td>\n",
       "      <td>108,244.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018</th>\n",
       "      <td>64670</td>\n",
       "      <td>682018</td>\n",
       "      <td>168,256.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019</th>\n",
       "      <td>105498</td>\n",
       "      <td>757190</td>\n",
       "      <td>243,108.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020</th>\n",
       "      <td>150623</td>\n",
       "      <td>812529</td>\n",
       "      <td>249,449.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2021</th>\n",
       "      <td>180708</td>\n",
       "      <td>870702</td>\n",
       "      <td>281,966.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2022</th>\n",
       "      <td>180372</td>\n",
       "      <td>864639</td>\n",
       "      <td>251,660.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023</th>\n",
       "      <td>185064</td>\n",
       "      <td>993579</td>\n",
       "      <td>644,746.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2024</th>\n",
       "      <td>224600</td>\n",
       "      <td>1344532</td>\n",
       "      <td>949,803.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2025</th>\n",
       "      <td>222017</td>\n",
       "      <td>1306793</td>\n",
       "      <td>1,145,636.000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      특허_5개국_G06N  논문_AI개념   뉴스_영문_AI(건)\n",
       "2015        11236   587875    24,403.000\n",
       "2016        19798   600936    61,363.000\n",
       "2017        37365   615136   108,244.000\n",
       "2018        64670   682018   168,256.000\n",
       "2019       105498   757190   243,108.000\n",
       "2020       150623   812529   249,449.000\n",
       "2021       180708   870702   281,966.000\n",
       "2022       180372   864639   251,660.000\n",
       "2023       185064   993579   644,746.000\n",
       "2024       224600  1344532   949,803.000\n",
       "2025       222017  1306793 1,145,636.000"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "뉴스 일별 자료: 2015-01-01 ~ 2025-12-31 (4,018일)\n"
     ]
    }
   ],
   "source": [
    "pat = pd.read_csv(C.PATENT_YEAR, index_col=0)\n",
    "pap = pd.read_csv(C.PAPER_YEAR, index_col=0)\n",
    "news = pd.read_csv(C.NEWS_DAILY, index_col=0, parse_dates=True).iloc[:, 0]\n",
    "src = pd.DataFrame({\"특허_5개국_G06N\": pat[\"5개국_G06N\"], \"논문_AI개념\": pap[\"AI_개념_전체\"],\n",
    "                    \"뉴스_영문_AI(건)\": news.groupby(news.index.year).sum()}).loc[2015:2025]\n",
    "display(src)\n",
    "print(f\"뉴스 일별 자료: {news.index.min().date()} ~ {news.index.max().date()} ({len(news):,}일)\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2b4e9ee8",
   "metadata": {},
   "source": [
    "## 3. 산업별 노출의 원천\n",
    "\n",
    "- **뉴스.** 설문 21개 업종마다 대표 영문 키워드 하나로 2025년 기사 수를 세고, 같은 키워드와 'artificial intelligence'를 함께 담은 기사 수를 다시 센다. 비율이 높을수록 그 업종 뉴스에서 AI가 자주 다루어진다.\n",
    "- **논문.** OpenAlex의 2023–2025년 문헌을 주제 분야(26개)별로 세고, 그중 'Artificial intelligence' 개념 문헌의 비중을 구한다.\n",
    "- **특허.** 5개국 G06N(AI 핵심 IPC) 특허 2020–2025년 출원의 동시분류 IPC별 건수다. FindIP 집계는 상위 20개 IPC만 돌려주므로,\n",
    "  대응표에 있으나 상위 20개 밖인 IPC는 포함–배제 원리로 정확히 구했다: $|G06N \\cap X| = |G06N| + |X| - |G06N \\cup X|$ (세 값 모두 CENSUS 정확 건수).\n",
    "  상위 20개 안에 있는 G05B로 이 방식을 점검하면 두 값이 같다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "91e67a5b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T05:49:04.642148Z",
     "iopub.status.busy": "2026-10-08T05:49:04.642148Z",
     "iopub.status.idle": "2026-10-08T05:49:04.654730Z",
     "shell.execute_reply": "2026-10-08T05:49:04.654730Z"
    }
   },
   "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>기사수_업종AND_AI</th>\n",
       "      <th>AI비중_%</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>01. 전기전자</td>\n",
       "      <td>semiconductor</td>\n",
       "      <td>240649</td>\n",
       "      <td>62531</td>\n",
       "      <td>25.984</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>02. 정밀기기</td>\n",
       "      <td>medical device</td>\n",
       "      <td>43680</td>\n",
       "      <td>4070</td>\n",
       "      <td>9.318</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>03. 섬유가죽</td>\n",
       "      <td>textile</td>\n",
       "      <td>89949</td>\n",
       "      <td>2373</td>\n",
       "      <td>2.638</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>04. 석유화학</td>\n",
       "      <td>chemical industry</td>\n",
       "      <td>9276</td>\n",
       "      <td>558</td>\n",
       "      <td>6.016</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>05. 비금속광물</td>\n",
       "      <td>cement</td>\n",
       "      <td>195807</td>\n",
       "      <td>6490</td>\n",
       "      <td>3.314</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>06. 금속제품</td>\n",
       "      <td>steel</td>\n",
       "      <td>653708</td>\n",
       "      <td>20049</td>\n",
       "      <td>3.067</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>07. 기계장비</td>\n",
       "      <td>machinery</td>\n",
       "      <td>245137</td>\n",
       "      <td>10510</td>\n",
       "      <td>4.287</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>08. 자동차</td>\n",
       "      <td>automotive</td>\n",
       "      <td>365309</td>\n",
       "      <td>26955</td>\n",
       "      <td>7.379</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>09. 식료품</td>\n",
       "      <td>food industry</td>\n",
       "      <td>36718</td>\n",
       "      <td>1053</td>\n",
       "      <td>2.868</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10. 에너지</td>\n",
       "      <td>utilities</td>\n",
       "      <td>253515</td>\n",
       "      <td>18917</td>\n",
       "      <td>7.462</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>11. 건설</td>\n",
       "      <td>construction</td>\n",
       "      <td>1684546</td>\n",
       "      <td>57662</td>\n",
       "      <td>3.423</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>12. 운수</td>\n",
       "      <td>logistics</td>\n",
       "      <td>535050</td>\n",
       "      <td>37939</td>\n",
       "      <td>7.091</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>13. 정보통신</td>\n",
       "      <td>telecommunications</td>\n",
       "      <td>160597</td>\n",
       "      <td>18590</td>\n",
       "      <td>11.576</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>14. 도소매</td>\n",
       "      <td>retail</td>\n",
       "      <td>1223940</td>\n",
       "      <td>61239</td>\n",
       "      <td>5.003</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>15. 음식숙박</td>\n",
       "      <td>hospitality</td>\n",
       "      <td>381444</td>\n",
       "      <td>10006</td>\n",
       "      <td>2.623</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>16. 금융</td>\n",
       "      <td>banking</td>\n",
       "      <td>667680</td>\n",
       "      <td>38916</td>\n",
       "      <td>5.829</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>17. 연구개발업</td>\n",
       "      <td>scientific research</td>\n",
       "      <td>84714</td>\n",
       "      <td>8908</td>\n",
       "      <td>10.515</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>18. 사업지원서비스</td>\n",
       "      <td>consulting</td>\n",
       "      <td>412602</td>\n",
       "      <td>38437</td>\n",
       "      <td>9.316</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>19. 교육</td>\n",
       "      <td>education</td>\n",
       "      <td>2551736</td>\n",
       "      <td>126992</td>\n",
       "      <td>4.977</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>20. 보건사회</td>\n",
       "      <td>healthcare</td>\n",
       "      <td>1237042</td>\n",
       "      <td>92167</td>\n",
       "      <td>7.451</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>21. 문화/예술</td>\n",
       "      <td>entertainment</td>\n",
       "      <td>1283184</td>\n",
       "      <td>35217</td>\n",
       "      <td>2.745</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           설문업종                  키워드   기사수_업종  기사수_업종AND_AI  AI비중_%\n",
       "0      01. 전기전자        semiconductor   240649         62531  25.984\n",
       "1      02. 정밀기기       medical device    43680          4070   9.318\n",
       "2      03. 섬유가죽              textile    89949          2373   2.638\n",
       "3      04. 석유화학    chemical industry     9276           558   6.016\n",
       "4     05. 비금속광물               cement   195807          6490   3.314\n",
       "5      06. 금속제품                steel   653708         20049   3.067\n",
       "6      07. 기계장비            machinery   245137         10510   4.287\n",
       "7       08. 자동차           automotive   365309         26955   7.379\n",
       "8       09. 식료품        food industry    36718          1053   2.868\n",
       "9       10. 에너지            utilities   253515         18917   7.462\n",
       "10       11. 건설         construction  1684546         57662   3.423\n",
       "11       12. 운수            logistics   535050         37939   7.091\n",
       "12     13. 정보통신   telecommunications   160597         18590  11.576\n",
       "13      14. 도소매               retail  1223940         61239   5.003\n",
       "14     15. 음식숙박          hospitality   381444         10006   2.623\n",
       "15       16. 금융              banking   667680         38916   5.829\n",
       "16    17. 연구개발업  scientific research    84714          8908  10.515\n",
       "17  18. 사업지원서비스           consulting   412602         38437   9.316\n",
       "18       19. 교육            education  2551736        126992   4.977\n",
       "19     20. 보건사회           healthcare  1237042         92167   7.451\n",
       "20    21. 문화/예술        entertainment  1283184         35217   2.745"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "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>AI논문</th>\n",
       "      <th>전체논문</th>\n",
       "      <th>AI비중_%</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>분야(OpenAlex field)</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Computer Science</th>\n",
       "      <td>1087535</td>\n",
       "      <td>2380834</td>\n",
       "      <td>45.679</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Neuroscience</th>\n",
       "      <td>79992</td>\n",
       "      <td>393921</td>\n",
       "      <td>20.307</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Agricultural and Biological Sciences</th>\n",
       "      <td>468562</td>\n",
       "      <td>2416451</td>\n",
       "      <td>19.391</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Decision Sciences</th>\n",
       "      <td>78114</td>\n",
       "      <td>407624</td>\n",
       "      <td>19.163</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Engineering</th>\n",
       "      <td>696950</td>\n",
       "      <td>3832229</td>\n",
       "      <td>18.187</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Mathematics</th>\n",
       "      <td>63837</td>\n",
       "      <td>511915</td>\n",
       "      <td>12.470</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Psychology</th>\n",
       "      <td>103889</td>\n",
       "      <td>1122951</td>\n",
       "      <td>9.251</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Health Professions</th>\n",
       "      <td>58519</td>\n",
       "      <td>701315</td>\n",
       "      <td>8.344</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Environmental Science</th>\n",
       "      <td>116332</td>\n",
       "      <td>1676514</td>\n",
       "      <td>6.939</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Earth and Planetary Sciences</th>\n",
       "      <td>33145</td>\n",
       "      <td>497829</td>\n",
       "      <td>6.658</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                         AI논문     전체논문  AI비중_%\n",
       "분야(OpenAlex field)                                            \n",
       "Computer Science                      1087535  2380834  45.679\n",
       "Neuroscience                            79992   393921  20.307\n",
       "Agricultural and Biological Sciences   468562  2416451  19.391\n",
       "Decision Sciences                       78114   407624  19.163\n",
       "Engineering                            696950  3832229  18.187\n",
       "Mathematics                             63837   511915  12.470\n",
       "Psychology                             103889  1122951   9.251\n",
       "Health Professions                      58519   701315   8.344\n",
       "Environmental Science                  116332  1676514   6.939\n",
       "Earth and Planetary Sciences            33145   497829   6.658"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "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>IPC</th>\n",
       "      <th>G06N_전체</th>\n",
       "      <th>X_전체</th>\n",
       "      <th>G06N_또는_X</th>\n",
       "      <th>G06N_동시분류_건수_5개국_2020_2025</th>\n",
       "      <th>비고</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>G05B</td>\n",
       "      <td>1143384</td>\n",
       "      <td>252352</td>\n",
       "      <td>1374820</td>\n",
       "      <td>20916</td>\n",
       "      <td>점검용: 상위 20개 동시분류 표의 20,916건과 일치</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>G01R</td>\n",
       "      <td>1143384</td>\n",
       "      <td>365437</td>\n",
       "      <td>1489886</td>\n",
       "      <td>18935</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>G01S</td>\n",
       "      <td>1143384</td>\n",
       "      <td>289574</td>\n",
       "      <td>1415095</td>\n",
       "      <td>17863</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>G05D</td>\n",
       "      <td>1143384</td>\n",
       "      <td>181594</td>\n",
       "      <td>1316166</td>\n",
       "      <td>8812</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>B60W</td>\n",
       "      <td>1143384</td>\n",
       "      <td>169937</td>\n",
       "      <td>1300892</td>\n",
       "      <td>12429</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>G08G</td>\n",
       "      <td>1143384</td>\n",
       "      <td>146110</td>\n",
       "      <td>1275308</td>\n",
       "      <td>14186</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>G08B</td>\n",
       "      <td>1143384</td>\n",
       "      <td>162772</td>\n",
       "      <td>1293333</td>\n",
       "      <td>12823</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>H01L</td>\n",
       "      <td>1143384</td>\n",
       "      <td>657693</td>\n",
       "      <td>1795418</td>\n",
       "      <td>5659</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    IPC  G06N_전체    X_전체  G06N_또는_X  G06N_동시분류_건수_5개국_2020_2025                               비고\n",
       "0  G05B  1143384  252352    1374820                       20916  점검용: 상위 20개 동시분류 표의 20,916건과 일치\n",
       "1  G01R  1143384  365437    1489886                       18935                              NaN\n",
       "2  G01S  1143384  289574    1415095                       17863                              NaN\n",
       "3  G05D  1143384  181594    1316166                        8812                              NaN\n",
       "4  B60W  1143384  169937    1300892                       12429                              NaN\n",
       "5  G08G  1143384  146110    1275308                       14186                              NaN\n",
       "6  G08B  1143384  162772    1293333                       12823                              NaN\n",
       "7  H01L  1143384  657693    1795418                        5659                              NaN"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "포함–배제 점검: G05B 상위 20개 표 20,916건 = 포함–배제 20,916건\n"
     ]
    }
   ],
   "source": [
    "er = pd.read_csv(C.NEWS_IND)\n",
    "display(er)\n",
    "fs = pd.read_csv(C.PAPER_FIELD).set_index(\"분야(OpenAlex field)\")\n",
    "display(fs.head(10))\n",
    "top20 = pd.read_csv(C.PATENT_COIPC)\n",
    "sup = pd.read_csv(C.PATENT_COIPC_SUP)\n",
    "display(sup)\n",
    "g05b_top = int(top20.set_index(\"IPC\").loc[\"G05B\"].iloc[0])\n",
    "g05b_ie = int(sup.set_index(\"IPC\").loc[\"G05B\", \"G06N_동시분류_건수_5개국_2020_2025\"])\n",
    "assert g05b_top == g05b_ie, \"포함–배제 점검 실패: G05B 동시분류 건수가 상위 20개 표와 다르다\"\n",
    "assert (sup[\"G06N_전체\"] == int(top20.set_index(\"IPC\").loc[\"G06N\"].iloc[0])).all(), \"G06N 전체 건수가 상위 20개 표와 다르다\"\n",
    "print(f\"포함–배제 점검: G05B 상위 20개 표 {g05b_top:,}건 = 포함–배제 {g05b_ie:,}건\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0c3e7d37",
   "metadata": {},
   "source": [
    "## 3-2. 한국고용정보원(2017) 기술혁신 시나리오\n",
    "\n",
    "같은 기관의 이전 인력수요 전망은 '기준전망'(최근 추세 지속)과 '혁신전망'(4차 산업혁명 적극 대응: 총요소생산성·노동의 질 개선, 신성장산업 견인)의 산업별 부가가치 증가율을 함께 제시하였다.\n",
    "8장은 산업연구원 모형(KIET-DIMM)에 업종 전문가 조정을 더한 세부 산업 전망(세 구간), 11장은 인력수급 산업별 2016~2030년 전망이다. 입력 파일은 보고서의 인쇄값만 담는다.\n",
    "AI만이 아니라 기술혁신 전반의 효과이고 생성형 AI 이전의 전망이므로, 산업 배분의 독립적인 비교 자료(대안 1c)와 크기 Λ의 참고값으로만 쓴다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "b76a1b1f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T05:49:04.655733Z",
     "iopub.status.busy": "2026-10-08T05:49:04.655733Z",
     "iopub.status.idle": "2026-10-08T05:49:04.664436Z",
     "shell.execute_reply": "2026-10-08T05:49:04.664436Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "인쇄값 400개: 8장 354개, 11장 46개\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>혁신</th>\n",
       "      <th>차이(%p)</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>2017~21</th>\n",
       "      <td>2.900</td>\n",
       "      <td>3.100</td>\n",
       "      <td>0.200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2022~26</th>\n",
       "      <td>2.400</td>\n",
       "      <td>2.900</td>\n",
       "      <td>0.500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2027~30</th>\n",
       "      <td>2.100</td>\n",
       "      <td>2.800</td>\n",
       "      <td>0.700</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "시나리오       기준    혁신  차이(%p)\n",
       "기간                         \n",
       "2017~21 2.900 3.100   0.200\n",
       "2022~26 2.400 2.900   0.500\n",
       "2027~30 2.100 2.800   0.700"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "keis = pd.read_csv(C.KEIS_R14)\n",
    "print(f\"인쇄값 {len(keis)}개: 8장 {keis['표'].str.startswith('표 8').sum()}개, 11장 {(~keis['표'].str.startswith('표 8')).sum()}개\")\n",
    "tot = keis[(keis[\"표\"] == \"표 8-6\") & (keis[\"산업(원문)\"] == \"전 산업\")].pivot(index=\"기간\", columns=\"시나리오\", values=\"실질VA_연평균증가율_%\")\n",
    "tot[\"차이(%p)\"] = tot[\"혁신\"] - tot[\"기준\"]\n",
    "display(tot)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "34953884",
   "metadata": {},
   "source": [
    "## 4. 재조회(ONLINE=1에서만)\n",
    "\n",
    "OpenAlex는 키 없이도 조회된다. Event Registry는 `EVENTREGISTRY_API_KEY`가 있어야 하며 조회 42회(업종 21 × 2)에 토큰이 든다.\n",
    "재조회 값은 `data/interim/`에 따로 저장하고 스냅샷과의 차이만 보여 준다(분석은 언제나 스냅샷으로 한다). 색인이 갱신되면 값이 조금 달라질 수 있다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "92e3a62d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T05:49:04.665439Z",
     "iopub.status.busy": "2026-10-08T05:49:04.665439Z",
     "iopub.status.idle": "2026-10-08T05:49:04.669213Z",
     "shell.execute_reply": "2026-10-08T05:49:04.668710Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ONLINE=0: 스냅샷만 쓴다.\n"
     ]
    }
   ],
   "source": [
    "if C.ONLINE:\n",
    "    import fetch\n",
    "    fs_new = fetch.openalex_field_share(2023, 2025)\n",
    "    fs_new.to_csv(os.path.join(C.INTERIM, \"openalex_field_ai_share_재조회.csv\"), encoding=\"utf-8-sig\")\n",
    "    d = fs.join(fs_new, rsuffix=\"_재조회\")\n",
    "    print(f\"OpenAlex 분야별 AI 비중 최대 차이: {(d['AI비중_%'] - d['AI비중_%_재조회']).abs().max():.3f}%p\")\n",
    "    if os.environ.get(\"EVENTREGISTRY_API_KEY\"):\n",
    "        er_new = fetch.eventregistry_industry_share(er.set_index(\"설문업종\")[\"키워드\"], 2025)\n",
    "        er_new.to_csv(os.path.join(C.INTERIM, \"eventregistry_industry_ai_share_재조회.csv\"), index=False, encoding=\"utf-8-sig\")\n",
    "        d = er.set_index(\"설문업종\").join(er_new.set_index(\"설문업종\"), rsuffix=\"_재조회\")\n",
    "        print(f\"Event Registry 업종별 AI 비중 최대 차이: {(d['AI비중_%'] - d['AI비중_%_재조회']).abs().max():.3f}%p\")\n",
    "    else:\n",
    "        print(\"EVENTREGISTRY_API_KEY가 없어 뉴스 재조회를 건너뛴다.\")\n",
    "else:\n",
    "    print(\"ONLINE=0: 스냅샷만 쓴다.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eab88902",
   "metadata": {},
   "source": [
    "## 5. 설문 — E4-1(AI가 매출에 미치는 영향의 정도)\n",
    "\n",
    "통계표에서 21개 업종·전체·제조업의 E4-1 4시점(2025·2029·2034·2040) 평균 점수를 읽는다(4장과 같은 함수).\n",
    "원자료에서는 업종별 2040년 응답의 표준편차와 응답 수로 업종 평균의 표준오차를 구한다. 이 표준오차가 대안 2 사전분포의 폭이 된다.\n",
    "업종 평균 점수는 비공개 집계이므로 이 절의 출력은 공개 화면에서 숨긴다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "5547fda2",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T05:49:04.669713Z",
     "iopub.status.busy": "2026-10-08T05:49:04.669713Z",
     "iopub.status.idle": "2026-10-08T05:49:10.536556Z",
     "shell.execute_reply": "2026-10-08T05:49:10.536057Z"
    },
    "tags": [
     "private-output"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(비공개 설문 집계를 보여주는 셀이다. 공개 화면에서는 출력을 생략했다. 자료를 가진 경우 직접 실행하면 표시된다.)"
     ]
    }
   ],
   "source": [
    "if not (os.path.exists(C.SURVEY_XLSX) and os.path.exists(C.SURVEY_RAW)):\n",
    "    raise SystemExit(\"비공개 설문 자료가 없다 — data/private/에 통계표와 원자료를 두고 다시 실행한다(배포 묶음에는 들어 있지 않다).\")\n",
    "sig = F.read_survey_signal(C.SURVEY_XLSX)\n",
    "sig.to_csv(os.path.join(C.INTERIM, \"survey_signal_21.csv\"), encoding=\"utf-8-sig\")\n",
    "se = X.survey_se_by_group(C.SURVEY_RAW)\n",
    "se.to_csv(os.path.join(C.INTERIM, \"survey_se_21.csv\"), encoding=\"utf-8-sig\")\n",
    "display(sig[[f\"AI성장_{t}\" for t in F.TIME_POINTS]])\n",
    "display(se)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "6660e704",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-08T05:49:10.538057Z",
     "iopub.status.busy": "2026-10-08T05:49:10.538057Z",
     "iopub.status.idle": "2026-10-08T05:49:10.542058Z",
     "shell.execute_reply": "2026-10-08T05:49:10.541556Z"
    },
    "tags": [
     "private-output"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(비공개 설문 집계를 보여주는 셀이다. 공개 화면에서는 출력을 생략했다. 자료를 가진 경우 직접 실행하면 표시된다.)"
     ]
    }
   ],
   "source": [
    "print(f\"설문 업종 {len(se) - 2}개 + 전체·제조업, 응답 {int(se.loc['전체', 'count']):,}개(2040년 E4-1 유효 응답)\")\n",
    "print(f\"업종 평균 표준오차 범위: {se.drop(['전체', '제조업'])['se'].min():.3f} ~ {se.drop(['전체', '제조업'])['se'].max():.3f}(점수 단위)\")"
   ]
  }
 ],
 "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
}
