01 데이터 입수 — AI 확산 지표, 산업모형 입력, 설문¶

목적. AI 확산 지수(총량·산업별)와 VARX 대안 모형에 필요한 입력을 불러오고 검증한다.

입력 내용 출처 공개
levels_62.csv, exog_hist_v2.csv, exog_scen_v2.csv, io_linkage_62.csv 62개 산업 분기 실질부가가치(100·log), 외생 6종 과거·시나리오, 산업연관 연계 가중치 보고서1 5장 재현 패키지 입력(2026-10 정비판) 공개
base_va_62.csv 정합화 후 기준 시나리오(S1) 산업별 실질부가가치 보고서1 5장 산출물(보고서2 4장 입력과 같은 파일) 공개
findip_g06n_by_year.csv, openalex_by_year.csv, eventregistry_ai_eng_daily.csv 연도별 AI 특허(G06N, 5개국)·AI 논문, 일별 영문 AI 뉴스 보고서2 1장 스냅샷 공개
eventregistry_industry_ai_share_2025.csv 2025년 업종 키워드 뉴스 중 AI를 함께 다룬 비율 Event Registry(이 장에서 조회) 공개
openalex_field_ai_share_2023_2025.csv 2023–2025년 학문 분야별 AI 논문 비중 OpenAlex(이 장에서 조회) 공개
findip_g06n_coipc_5c_2020_2025.csv, findip_g06n_coipc_supplement_2020_2025.csv G06N 특허의 동시분류 IPC별 건수(상위 20개 + 포함–배제 보완) FindIP CENSUS(이 장에서 조회) 공개
keis_r14_va_scenarios.csv 기준전망·혁신전망의 산업별 실질부가가치 연평균 증가율(인쇄값) 한국고용정보원(2017) 「기술혁신을 반영한 중장기 인력수요 전망 2016~2030」 표 8-6·8-8~8-14, 11장 공개
data/private/AI수용도조사_통계표_260417.xlsx, AI수용도조사_원자료_n2297.xlsx E4-1(AI의 매출 영향 정도) 업종 평균과 응답 분포 한국고용정보원 공유자료 비공개

출처·조회 시각·SHA-256은 data/inputs/PROVENANCE.md, FindIP 조회 조건은 data/inputs/FINDIP_QUERY.md, Event Registry 조회 조건은 data/inputs/EVENTREGISTRY_QUERY.md에 적었다.

산출물. data/interim/survey_signal_21.csv(E4-1 4시점 업종 평균), data/interim/survey_se_21.csv(E4-1 2040년 업종 평균의 표준오차) — 둘 다 비공개 자료에서 만든 중간 산출물이다.

In [1]:
import os, hashlib
import numpy as np, pandas as pd
import config as C
import ai_index as I, ai_varx as X, ai_forecast as F, varx_engine as V, alt_run as R
pd.set_option("display.float_format", lambda v: f"{v:,.3f}")
pd.set_option("display.width", 200)
C.setup()
Python 3.12.10 · pandas 2.2.3 · numpy 2.4.6 · matplotlib 3.11.0
  판: 2026-10 정비판 기준 · Λ 0.5 · 드리프트 목표 1.8% · ONLINE=0(스냅샷) · Event Registry 키 없음
  설문 통계표(비공개)    있음  data\private\AI수용도조사_통계표_260417.xlsx
  설문 원자료(비공개)    있음  data\private\AI수용도조사_원자료_n2297.xlsx

1. 입력 파일 검증¶

공개 입력 13개의 SHA-256을 config.INPUT_SHA256의 기록과 대조한다. 보고서1 5장·보고서2 1장·4장 패키지에서 복사한 파일은 원본과 해시가 같다.

In [2]:
def sha256(p):
    h = hashlib.sha256()
    with open(p, "rb") as f:
        h.update(f.read())
    return h.hexdigest()

chk = pd.DataFrame([{"파일": k, "SHA-256(앞 16자리)": sha256(os.path.join(C.DATA, k))[:16],
                     "기록과 일치": sha256(os.path.join(C.DATA, k)) == v} for k, v in C.INPUT_SHA256.items()])
display(chk)
assert chk["기록과 일치"].all(), "입력 파일이 기록된 SHA-256과 다르다 — data/inputs/PROVENANCE.md와 config.INPUT_SHA256을 확인한다"
파일 SHA-256(앞 16자리) 기록과 일치
0 inputs/levels_62.csv 00469e892aac4742 True
1 inputs/exog_hist_v2.csv d142ff2992b5ae3e True
2 inputs/exog_scen_v2.csv f45f8007d7b88faf True
3 inputs/io_linkage_62.csv 3f747a97c3804541 True
4 inputs/base_va_62.csv 81c0a99e7e67aad3 True
5 inputs/findip_g06n_by_year.csv f6e79f9f95ebec5b True
6 inputs/openalex_by_year.csv 19811d9fa29793f3 True
7 inputs/eventregistry_ai_eng_daily.csv edaf04ea090e175f True
8 inputs/eventregistry_industry_ai_share_2025.csv 6e105511bea37791 True
9 inputs/openalex_field_ai_share_2023_2025.csv f14368ff7d0da4ab True
10 inputs/findip_g06n_coipc_5c_2020_2025.csv f327ecb7e4d97dfe True
11 inputs/findip_g06n_coipc_supplement_2020_2025.csv 59db0c342111bbb4 True
12 inputs/keis_r14_va_scenarios.csv 6f1ce507eb886c63 True

2. 총량 지수의 원천 — 특허·논문·뉴스¶

세 자료는 보고서2 1장과 같은 스냅샷이다. 특허는 출원 후 약 18개월 뒤 공개되므로 2025년 값은 하한이며, 총량 지수에서는 2024년까지만 쓴다.

In [3]:
pat = pd.read_csv(C.PATENT_YEAR, index_col=0)
pap = pd.read_csv(C.PAPER_YEAR, index_col=0)
news = pd.read_csv(C.NEWS_DAILY, index_col=0, parse_dates=True).iloc[:, 0]
src = pd.DataFrame({"특허_5개국_G06N": pat["5개국_G06N"], "논문_AI개념": pap["AI_개념_전체"],
                    "뉴스_영문_AI(건)": news.groupby(news.index.year).sum()}).loc[2015:2025]
display(src)
print(f"뉴스 일별 자료: {news.index.min().date()} ~ {news.index.max().date()} ({len(news):,}일)")
특허_5개국_G06N 논문_AI개념 뉴스_영문_AI(건)
2015 11236 587875 24,403.000
2016 19798 600936 61,363.000
2017 37365 615136 108,244.000
2018 64670 682018 168,256.000
2019 105498 757190 243,108.000
2020 150623 812529 249,449.000
2021 180708 870702 281,966.000
2022 180372 864639 251,660.000
2023 185064 993579 644,746.000
2024 224600 1344532 949,803.000
2025 222017 1306793 1,145,636.000
뉴스 일별 자료: 2015-01-01 ~ 2025-12-31 (4,018일)

3. 산업별 노출의 원천¶

  • 뉴스. 설문 21개 업종마다 대표 영문 키워드 하나로 2025년 기사 수를 세고, 같은 키워드와 'artificial intelligence'를 함께 담은 기사 수를 다시 센다. 비율이 높을수록 그 업종 뉴스에서 AI가 자주 다루어진다.
  • 논문. OpenAlex의 2023–2025년 문헌을 주제 분야(26개)별로 세고, 그중 'Artificial intelligence' 개념 문헌의 비중을 구한다.
  • 특허. 5개국 G06N(AI 핵심 IPC) 특허 2020–2025년 출원의 동시분류 IPC별 건수다. FindIP 집계는 상위 20개 IPC만 돌려주므로, 대응표에 있으나 상위 20개 밖인 IPC는 포함–배제 원리로 정확히 구했다: $|G06N \cap X| = |G06N| + |X| - |G06N \cup X|$ (세 값 모두 CENSUS 정확 건수). 상위 20개 안에 있는 G05B로 이 방식을 점검하면 두 값이 같다.
In [4]:
er = pd.read_csv(C.NEWS_IND)
display(er)
fs = pd.read_csv(C.PAPER_FIELD).set_index("분야(OpenAlex field)")
display(fs.head(10))
top20 = pd.read_csv(C.PATENT_COIPC)
sup = pd.read_csv(C.PATENT_COIPC_SUP)
display(sup)
g05b_top = int(top20.set_index("IPC").loc["G05B"].iloc[0])
g05b_ie = int(sup.set_index("IPC").loc["G05B", "G06N_동시분류_건수_5개국_2020_2025"])
assert g05b_top == g05b_ie, "포함–배제 점검 실패: G05B 동시분류 건수가 상위 20개 표와 다르다"
assert (sup["G06N_전체"] == int(top20.set_index("IPC").loc["G06N"].iloc[0])).all(), "G06N 전체 건수가 상위 20개 표와 다르다"
print(f"포함–배제 점검: G05B 상위 20개 표 {g05b_top:,}건 = 포함–배제 {g05b_ie:,}건")
설문업종 키워드 기사수_업종 기사수_업종AND_AI AI비중_%
0 01. 전기전자 semiconductor 240649 62531 25.984
1 02. 정밀기기 medical device 43680 4070 9.318
2 03. 섬유가죽 textile 89949 2373 2.638
3 04. 석유화학 chemical industry 9276 558 6.016
4 05. 비금속광물 cement 195807 6490 3.314
5 06. 금속제품 steel 653708 20049 3.067
6 07. 기계장비 machinery 245137 10510 4.287
7 08. 자동차 automotive 365309 26955 7.379
8 09. 식료품 food industry 36718 1053 2.868
9 10. 에너지 utilities 253515 18917 7.462
10 11. 건설 construction 1684546 57662 3.423
11 12. 운수 logistics 535050 37939 7.091
12 13. 정보통신 telecommunications 160597 18590 11.576
13 14. 도소매 retail 1223940 61239 5.003
14 15. 음식숙박 hospitality 381444 10006 2.623
15 16. 금융 banking 667680 38916 5.829
16 17. 연구개발업 scientific research 84714 8908 10.515
17 18. 사업지원서비스 consulting 412602 38437 9.316
18 19. 교육 education 2551736 126992 4.977
19 20. 보건사회 healthcare 1237042 92167 7.451
20 21. 문화/예술 entertainment 1283184 35217 2.745
AI논문 전체논문 AI비중_%
분야(OpenAlex field)
Computer Science 1087535 2380834 45.679
Neuroscience 79992 393921 20.307
Agricultural and Biological Sciences 468562 2416451 19.391
Decision Sciences 78114 407624 19.163
Engineering 696950 3832229 18.187
Mathematics 63837 511915 12.470
Psychology 103889 1122951 9.251
Health Professions 58519 701315 8.344
Environmental Science 116332 1676514 6.939
Earth and Planetary Sciences 33145 497829 6.658
IPC G06N_전체 X_전체 G06N_또는_X G06N_동시분류_건수_5개국_2020_2025 비고
0 G05B 1143384 252352 1374820 20916 점검용: 상위 20개 동시분류 표의 20,916건과 일치
1 G01R 1143384 365437 1489886 18935 NaN
2 G01S 1143384 289574 1415095 17863 NaN
3 G05D 1143384 181594 1316166 8812 NaN
4 B60W 1143384 169937 1300892 12429 NaN
5 G08G 1143384 146110 1275308 14186 NaN
6 G08B 1143384 162772 1293333 12823 NaN
7 H01L 1143384 657693 1795418 5659 NaN
포함–배제 점검: G05B 상위 20개 표 20,916건 = 포함–배제 20,916건

3-2. 한국고용정보원(2017) 기술혁신 시나리오¶

같은 기관의 이전 인력수요 전망은 '기준전망'(최근 추세 지속)과 '혁신전망'(4차 산업혁명 적극 대응: 총요소생산성·노동의 질 개선, 신성장산업 견인)의 산업별 부가가치 증가율을 함께 제시하였다. 8장은 산업연구원 모형(KIET-DIMM)에 업종 전문가 조정을 더한 세부 산업 전망(세 구간), 11장은 인력수급 산업별 2016~2030년 전망이다. 입력 파일은 보고서의 인쇄값만 담는다. AI만이 아니라 기술혁신 전반의 효과이고 생성형 AI 이전의 전망이므로, 산업 배분의 독립적인 비교 자료(대안 1c)와 크기 Λ의 참고값으로만 쓴다.

In [5]:
keis = pd.read_csv(C.KEIS_R14)
print(f"인쇄값 {len(keis)}개: 8장 {keis['표'].str.startswith('표 8').sum()}개, 11장 {(~keis['표'].str.startswith('표 8')).sum()}개")
tot = keis[(keis["표"] == "표 8-6") & (keis["산업(원문)"] == "전 산업")].pivot(index="기간", columns="시나리오", values="실질VA_연평균증가율_%")
tot["차이(%p)"] = tot["혁신"] - tot["기준"]
display(tot)
인쇄값 400개: 8장 354개, 11장 46개
시나리오 기준 혁신 차이(%p)
기간
2017~21 2.900 3.100 0.200
2022~26 2.400 2.900 0.500
2027~30 2.100 2.800 0.700

4. 재조회(ONLINE=1에서만)¶

OpenAlex는 키 없이도 조회된다. Event Registry는 EVENTREGISTRY_API_KEY가 있어야 하며 조회 42회(업종 21 × 2)에 토큰이 든다. 재조회 값은 data/interim/에 따로 저장하고 스냅샷과의 차이만 보여 준다(분석은 언제나 스냅샷으로 한다). 색인이 갱신되면 값이 조금 달라질 수 있다.

In [6]:
if C.ONLINE:
    import fetch
    fs_new = fetch.openalex_field_share(2023, 2025)
    fs_new.to_csv(os.path.join(C.INTERIM, "openalex_field_ai_share_재조회.csv"), encoding="utf-8-sig")
    d = fs.join(fs_new, rsuffix="_재조회")
    print(f"OpenAlex 분야별 AI 비중 최대 차이: {(d['AI비중_%'] - d['AI비중_%_재조회']).abs().max():.3f}%p")
    if os.environ.get("EVENTREGISTRY_API_KEY"):
        er_new = fetch.eventregistry_industry_share(er.set_index("설문업종")["키워드"], 2025)
        er_new.to_csv(os.path.join(C.INTERIM, "eventregistry_industry_ai_share_재조회.csv"), index=False, encoding="utf-8-sig")
        d = er.set_index("설문업종").join(er_new.set_index("설문업종"), rsuffix="_재조회")
        print(f"Event Registry 업종별 AI 비중 최대 차이: {(d['AI비중_%'] - d['AI비중_%_재조회']).abs().max():.3f}%p")
    else:
        print("EVENTREGISTRY_API_KEY가 없어 뉴스 재조회를 건너뛴다.")
else:
    print("ONLINE=0: 스냅샷만 쓴다.")
ONLINE=0: 스냅샷만 쓴다.

5. 설문 — E4-1(AI가 매출에 미치는 영향의 정도)¶

통계표에서 21개 업종·전체·제조업의 E4-1 4시점(2025·2029·2034·2040) 평균 점수를 읽는다(4장과 같은 함수). 원자료에서는 업종별 2040년 응답의 표준편차와 응답 수로 업종 평균의 표준오차를 구한다. 이 표준오차가 대안 2 사전분포의 폭이 된다. 업종 평균 점수는 비공개 집계이므로 이 절의 출력은 공개 화면에서 숨긴다.

In [7]:
if not (os.path.exists(C.SURVEY_XLSX) and os.path.exists(C.SURVEY_RAW)):
    raise SystemExit("비공개 설문 자료가 없다 — data/private/에 통계표와 원자료를 두고 다시 실행한다(배포 묶음에는 들어 있지 않다).")
sig = F.read_survey_signal(C.SURVEY_XLSX)
sig.to_csv(os.path.join(C.INTERIM, "survey_signal_21.csv"), encoding="utf-8-sig")
se = X.survey_se_by_group(C.SURVEY_RAW)
se.to_csv(os.path.join(C.INTERIM, "survey_se_21.csv"), encoding="utf-8-sig")
display(sig[[f"AI성장_{t}" for t in F.TIME_POINTS]])
display(se)
(비공개 설문 집계를 보여주는 셀이다. 공개 화면에서는 출력을 생략했다. 자료를 가진 경우 직접 실행하면 표시된다.)
In [8]:
print(f"설문 업종 {len(se) - 2}개 + 전체·제조업, 응답 {int(se.loc['전체', 'count']):,}개(2040년 E4-1 유효 응답)")
print(f"업종 평균 표준오차 범위: {se.drop(['전체', '제조업'])['se'].min():.3f} ~ {se.drop(['전체', '제조업'])['se'].max():.3f}(점수 단위)")
(비공개 설문 집계를 보여주는 셀이다. 공개 화면에서는 출력을 생략했다. 자료를 가진 경우 직접 실행하면 표시된다.)