01 데이터 입수 — 기준 전망과 AI 수용도조사¶

목적. AI 확산 시나리오 계산에 필요한 입력을 불러오고 검증한다.

2026-10 정비판. 보고서1의 기준 시나리오가 정비되었다. BOKDPM 장기 정상상태를 고치고(잠재성장률 1.8%, 물가안정목표 2%, 실질유가 불변), 실질금리를 1차 차분으로 투입하며, 시나리오 외생 경로의 레버를 연결한 뒤 산업 전망과 정합화를 다시 실행한 결과이다. 이 판은 그 기준 시나리오(data/inputs/base_va_62.csv·base_va_69.csv)만 교체하였고, AI 확산 층(산업 배분 A1, Λ 보정, 고용 중립 취업계수)은 이전 판과 같다. 이전 판 기준 시나리오는 data/published_prev/에 두고 정비 전후 비교와 이전 판 재현 점검에만 쓴다.

입력 내용 출처 공개
data/inputs/base_va_62.csv, base_va_69.csv 기준 시나리오(S1) 산업별 실질부가가치, 2025 실적·2026–2035 전망 보고서1 5장 산출물(정합화 후, 2026-10 정비판) 공개
data/published_prev/base_va_62_prev.csv, base_va_69_prev.csv 이전 판 기준 시나리오(같은 형식) — 비교·재현 점검용 보고서1 5장 이전 판 산출물(2026-10-08 패키지 입력) 공개
data/private/AI수용도조사_통계표_260417.xlsx AI 수용도조사 통계표 E4-1·E5-1(AI 영향의 정도), E4·E5 상세(매출·고용 증감 구간) 한국고용정보원 공유자료 비공개

입력 파일의 출처·작성 시각·SHA-256은 data/inputs/PROVENANCE.md에 적었다.

산출물. data/interim/survey_signal_21.csv(E4-1·E5-1 4시점 평균 점수), data/interim/change_expect_21.csv(2024년 대비 2040년 기대 매출·고용 증감률)

비공개 통계표가 없으면 2절에서 멈춘다. 통계표는 과제 참여기관만 받을 수 있으며 배포 묶음에 넣지 않는다.

In [1]:
import os, hashlib
import numpy as np, pandas as pd
import config as C
import ai_forecast as F
pd.set_option("display.float_format", lambda v: f"{v:,.3f}")
C.setup()
Python 3.12.10 · pandas 2.2.3 · numpy 2.4.6 · openpyxl 3.1.5 · matplotlib 3.11.0
  판: 2026-10 정비판 · 배분 A1 · 취업계수 neutral · Λ 중심 0.5
  기준 62          있음  data\inputs\base_va_62.csv
  기준 69          있음  data\inputs\base_va_69.csv
  이전 판 기준 62     있음  data\published_prev\base_va_62_prev.csv
  이전 판 기준 69     있음  data\published_prev\base_va_69_prev.csv
  크로스워크          있음  data\crosswalk_21_62.csv
  분화표            있음  data\carveout_69.csv
  설문 통계표(비공개)    있음  data\private\AI수용도조사_통계표_260417.xlsx

1. 기준 시나리오 — 보고서1 5장 산출물¶

기준 시나리오는 BOKDPM 기준 경로(S1)를 외생으로 넣은 베이지언 VARX 산업 전망을 총량 벤치마킹과 기존 전망 결합으로 정합화한 결과이다. 단위는 십억 원, 2020년 연쇄가격이다. 62분류와 69분류는 전산업 합계가 같아야 한다(69분류는 62분류의 일부 산업을 분화한 것이다). 먼저 네 파일(정비판 2개, 이전 판 2개)의 SHA-256을 config.INPUT_SHA256의 기록과 대조한다.

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을 확인한다"

base62, base69 = F.read_base(C.BASE_62), F.read_base(C.BASE_69)
prev62, prev69 = F.read_base(C.BASE_62_PREV), F.read_base(C.BASE_69_PREV)
for name, b, pb in [("62", base62, prev62), ("69", base69, prev69)]:
    print(f"{name}분류: 산업 {b.shape[1]}개 · {b.index.min()}–{b.index.max()} (이전 판 산업 {pb.shape[1]}개 · {pb.index.min()}–{pb.index.max()})")
    assert list(b.columns) == list(pb.columns) and list(b.index) == list(pb.index), "정비판과 이전 판의 산업·연도 구성이 다르다"
    assert (b.loc[C.START] - pb.loc[C.START]).abs().max() < 1e-6, "2025년 실적이 이전 판과 다르다"

tot = pd.DataFrame({"62분류(조원)": base62.sum(axis=1) / 1e3, "69분류(조원)": base69.sum(axis=1) / 1e3})
tot["차이(십억원)"] = (tot["62분류(조원)"] - tot["69분류(조원)"]) * 1e3
assert tot["차이(십억원)"].abs().max() < 1.0, "62·69 전산업 합계가 일치하지 않는다"
assert ((prev62.sum(axis=1) - prev69.sum(axis=1)).abs().max()) < 1.0, "이전 판 62·69 전산업 합계가 일치하지 않는다"
tot["이전 판 62분류(조원)"] = prev62.sum(axis=1) / 1e3
tot["정비 전후 차이(%)"] = (tot["62분류(조원)"] / tot["이전 판 62분류(조원)"] - 1) * 100
tot
파일 SHA-256(앞 16자리) 기록과 일치
0 inputs/base_va_62.csv 81c0a99e7e67aad3 True
1 inputs/base_va_69.csv 694821fa05b22f06 True
2 published_prev/base_va_62_prev.csv 31e8573a5d2da3d7 True
3 published_prev/base_va_69_prev.csv ee49d2c1323d58bd True
62분류: 산업 62개 · 2025–2035 (이전 판 산업 62개 · 2025–2035)
69분류: 산업 69개 · 2025–2035 (이전 판 산업 69개 · 2025–2035)
Out[2]:
62분류(조원) 69분류(조원) 차이(십억원) 이전 판 62분류(조원) 정비 전후 차이(%)
연도
2025 2,178.489 2,178.489 -0.001 2,178.489 0.000
2026 2,221.073 2,221.073 -0.001 2,219.013 0.093
2027 2,259.627 2,259.627 -0.001 2,265.859 -0.275
2028 2,306.255 2,306.255 -0.002 2,313.598 -0.317
2029 2,349.581 2,349.581 -0.003 2,364.607 -0.635
2030 2,392.963 2,392.963 0.001 2,417.734 -1.025
2031 2,436.124 2,436.124 -0.002 2,471.718 -1.440
2032 2,479.230 2,479.230 -0.006 2,526.031 -1.853
2033 2,522.383 2,522.383 -0.002 2,580.376 -2.247
2034 2,565.638 2,565.638 -0.001 2,634.576 -2.617
2035 2,609.028 2,609.028 -0.004 2,688.518 -2.957

두 판은 2025년 실적이 같고 2026년 이후 전망만 다르다. 정비판 기준 시나리오는 2035년 전산업이 이전 판보다 낮다. 2025–2035년 연평균 증가율은 아래와 같다.

In [3]:
pd.DataFrame({"2025(조원)": [tot.loc[C.START, "62분류(조원)"], tot.loc[C.START, "이전 판 62분류(조원)"]],
              "2035(조원)": [tot.loc[C.END, "62분류(조원)"], tot.loc[C.END, "이전 판 62분류(조원)"]]},
             index=["정비판", "이전 판"]).assign(**{"연평균(%)": lambda d: F.cagr(d["2025(조원)"], d["2035(조원)"], C.END - C.START)})
Out[3]:
2025(조원) 2035(조원) 연평균(%)
정비판 2,178.489 2,609.028 1.820
이전 판 2,178.489 2,688.518 2.126

2. AI 영향의 정도 — E4-1·E5-1¶

조사는 2025년 사업체 2,297개(21개 업종)를 대상으로, 시점별(현재 2025년·2029년·2034년·2040년) AI 기술이 자사 업종의 성장(매출 규모, E4-1) 과 고용(일자리, E5-1) 에 미치는 영향이 어느 정도인지를 9점 척도(①매우 낮음 · ⑤보통 · ⑨매우 높음)로 물었다. 영향의 크기를 묻는 문항이며 방향(증가·감소)은 묻지 않았다. 따라서 5점은 '영향 없음'이 아니라 '보통'이고, '영향 최소'에 해당하는 점은 ①이다. 표 제목(E4-1., E5-1.)을 기준으로 블록을 찾으므로 행 번호가 바뀌어도 읽을 수 있다.

In [4]:
if not os.path.exists(C.SURVEY_XLSX):
    raise FileNotFoundError("비공개 통계표가 없다: data/private/ 에 'AI수용도조사_통계표_260417.xlsx'를 넣은 뒤 다시 실행한다.")

signal = F.read_survey_signal(C.SURVEY_XLSX)
signal.to_csv(os.path.join(C.INTERIM, "survey_signal_21.csv"), encoding="utf-8-sig")
print(f"읽은 행: {len(signal)} (21개 업종 + 전체·제조업·비제조업)")
signal.loc[["전체", "제조업", "비제조업"]]
(비공개 설문 집계를 보여주는 셀이다. 공개 화면에서는 출력을 생략했다. 자료를 가진 경우 직접 실행하면 표시된다.)
In [5]:
detail = signal.drop(index=["전체", "제조업", "비제조업"])
s = detail["AI성장_2040"].sort_values(ascending=False)
pd.DataFrame({"2040 성장 영향(상위 3)": s.head(3).round(2).values, "업종(상위)": s.head(3).index,
              "2040 성장 영향(하위 3)": s.tail(3).round(2).values, "업종(하위)": s.tail(3).index})
(비공개 설문 집계를 보여주는 셀이다. 공개 화면에서는 출력을 생략했다. 자료를 가진 경우 직접 실행하면 표시된다.)

3. 매출·고용의 기대 증감 — E4·E5 상세¶

E4·E5는 2024년 대비 각 시점의 매출 규모와 고용 규모가 얼마나 늘거나 줄지를 18개 구간(①50% 이상 감소 … ⑦변동 없음 … ⑱100% 이상 증가)으로 물었다. 방향과 크기를 함께 묻는 문항이므로, AI 확산에 따른 고용 반응(탄력성)을 정하는 근거로 쓴다. 구간 중간값의 가중평균으로 업종별 기대 증감률을 구하며, 열린 구간 ⑱은 110%로 둔다.

In [6]:
expect = F.read_change_expectations(C.SURVEY_XLSX, 2040)
expect.to_csv(os.path.join(C.INTERIM, "change_expect_21.csv"), encoding="utf-8-sig")
expect.loc[["전체", "제조업", "비제조업"]]
(비공개 설문 집계를 보여주는 셀이다. 공개 화면에서는 출력을 생략했다. 자료를 가진 경우 직접 실행하면 표시된다.)

4. 산출물¶

다음 노트북(02_분석.ipynb)은 data/interim/의 두 파일과 기준 시나리오를 읽는다.

In [7]:
for f in sorted(os.listdir(C.INTERIM)):
    p = os.path.join(C.INTERIM, f)
    print(f"{f:<28} {os.path.getsize(p):>8,d} bytes")
change_expect_21.csv            1,363 bytes
survey_signal_21.csv            3,676 bytes