방법론 · 기술문서

36개 산업 실질값으로 GVA 재현하기 — 방법과 코드

왜 어긋나는지는 연쇄가중의 비밀에서 다뤘습니다. 여기서는 그 이해를 바탕으로 실제로 어떻게 재현했는지 — 공식, 알고리즘, 코드, 전체 검증표를 정리합니다.

1. 공식

전체실질(t) = 전체실질(t−1) × Σᵢ [ 명목ᵢ(t−1) / Σⱼ명목ⱼ(t−1) × 실질성장률ᵢ(t) ]

매 분기, 바로 전 분기의 명목(경상가격) 비중으로 36개 산업의 실질 성장률을 가중평균해 "전체"의 성장률을 만들고, 이걸 이전 분기 값에 곱해 사슬처럼 이어갑니다. 이 공식은 한국은행이 실제로 총부가가치를 만드는 라스파이레스형 연쇄지수와 수학적으로 동일합니다.

2. 왜 출발점이 2020년이어야 하는가

이 공식으로 산출한 "성장률"은 분기별로 매우 정확합니다(공식 GVA 성장률과 오차 0.05~0.15%p 수준). 문제는 사슬을 어디서 출발시키느냐입니다 — 오차가 이미 큰 지점(예: 1980년) 에서 출발하면, 정확한 성장률을 계속 곱해도 그 초기 오차가 배율만 유지된 채 끝까지 사라지지 않고 이어집니다. 그래서 "36개 산업 그냥 합"이 실제로 거의 오차 없는(0.03% 이내) 지점, 즉 2020년 1분기를 기준점으로 삼고, 거기서 미래(2021~2025)와 과거(2019~1980) 양방향으로 사슬을 이어야 전체 구간에서 정확해집니다.

3. 알고리즘

  1. 36개 산업의 명목·실질 분기 데이터를 산업×분기 행렬로 준비한다.
  2. 기준점(2020Q1)의 재현값 = 그 분기 한국은행 공식 총부가가치(GVA)로 고정한다.
  3. 미래 방향(2020Q2→2025Q4): 매 분기 t에 대해 전기(t−1) 명목 비중으로 실질성장률을 가중평균해 성장배율을 구하고, 재현값(t) = 재현값(t−1) × 성장배율.
  4. 과거 방향(2019Q4→1980Q1): 반대로, 재현값(t) = 재현값(t+1) ÷ 성장배율 (이때 성장배율은 t시점 명목 비중으로 계산).

4. 코드

ANCHOR = "2020Q1"

def weighted_growth(nom_base, real_base, real_next):
    w = nom_base / nom_base.sum()          # 기준 시점 명목 비중
    g = real_next / real_base              # 산업별 실질 성장배율
    return float((w * g).sum())

def reconstruct(real, nom, gva, anchor):
    quarters = list(real.index)
    idx0 = quarters.index(anchor)
    recon = pd.Series(index=quarters, dtype=float)
    recon.loc[anchor] = gva.loc[anchor]     # 기준점은 공식 GVA로 고정

    for i in range(idx0 + 1, len(quarters)):        # 미래 방향
        t, tm1 = quarters[i], quarters[i - 1]
        recon.loc[t] = recon.loc[tm1] * weighted_growth(
            nom.loc[tm1], real.loc[tm1], real.loc[t])

    for i in range(idx0 - 1, -1, -1):               # 과거 방향
        t, tp1 = quarters[i], quarters[i + 1]
        recon.loc[t] = recon.loc[tp1] / weighted_growth(
            nom.loc[t], real.loc[t], real.loc[tp1])

    return recon

전체 코드: code/industry_models_36q/reconstruct_total.py (프로젝트 저장소)

5. 검증 결과

시점그냥 합 괴리재현값 괴리
1980Q1+21.935%+0.1200%
2000Q1+5.716%+0.2153%
2019Q4+0.003%+0.0380%
2020Q1 (기준점)+0.027%0.0000%
2020Q4−0.031%+0.0687%
2025Q4+1.013%+0.3278%
전체(184분기) 최대 |괴리|25.208%0.8232%
전체(184분기) 평균 |괴리|7.655%0.2324%

그래프로 보시려면 36개 산업 데이터 뷰어의 "보정 — 36개 산업만으로 전체를 직접 재현하기" 패널을 확인하세요.

6. 한계

연간 단위로는 오차가 사실상 0(최대 0.0014%)까지 사라지지만, 분기 단위에서는 0.2~0.8%의 잔차가 남습니다. 분기별 성장률은 이론상 정확한데도 이런 잔차가 남는 걸 보면, 한국은행이 실제로는 연간 단위로 사슬을 연결하고 그 안의 분기 움직임은 별도의 보간(interpolation) 방식을 쓸 가능성이 높습니다 — 이 세부 방식은 공개된 산업별 데이터만으로 완전히 역산하기는 어렵습니다. 다만 0.2~0.8%는 실무적으로 무시할 수 있는 수준입니다.

7. 활용

이렇게 만든 재현값을 이후 36개 산업 모형 추정(14개 방법론)과 62·70개 산업 분해 작업의 기준 총량으로 사용합니다 — 한국은행 공식 GDP를 억지로 맞추는 비례조정 없이, 36개 산업 데이터 자체의 내적 정합성만으로 항상 일치하는 총량을 확보한 것입니다.

정리: 챙겨야 할 건 딱 하나 — 사슬은 반드시 오차가 없는 기준연도에서 출발해 양방향으로 이어야 한다는 것입니다. 이 원칙 하나로 평균 오차가 7.65%에서 0.23%로, 30배 이상 줄었습니다.