03 결과 도출 — 패널 요약·분화 몫·연쇄가중 재현과 검증¶

02_분석.ipynb의 산출물로 2장의 표와 그림을 만든다. 마지막 셀은 계산 결과를 공표 산출물(data/published/의 패널·몫·연계 행렬 사본)과 공표 수치(config.PUBLISHED)에 대조한다. 허용오차는 공표 자릿수의 반올림 범위이며, 파일 대조는 부동소수점 오차 범위이다.

In [1]:
import os, glob
import numpy as np, pandas as pd
import config as C
import gva_data as F
pd.set_option("display.float_format", lambda v: f"{v:,.4f}")
pd.set_option("display.width", 160)
C.setup()
import matplotlib.pyplot as plt
import koreanize_matplotlib  # noqa: F401  (한글 글꼴)
rd = lambda n, **kw: pd.read_csv(os.path.join(C.OUTPUT, n), **kw)
real = pd.read_csv(os.path.join(C.INTERIM, "va36_real_q.csv"), index_col=0)
L62, L69 = rd("levels_62.csv", index_col=0), rd("levels_69.csv", index_col=0)
mapping, carve_log = rd("mapping_62_official.csv"), rd("carve_log.csv")
share_b, share_r = rd("share_battery.csv", index_col=0).iloc[:, 0], rd("share_renew.csv", index_col=0).iloc[:, 0]
act, rq, ra = rd("renew_gen_actual.csv"), rd("recon_total_q.csv", index_col=0), rd("recon_total_a.csv", index_col=0)
rules = pd.read_csv(C.CARVE_RULES, dtype={"IO분자": str, "IO분모": str})
Python 3.12.10 · pandas 2.2.3 · numpy 2.4.6
  ONLINE=0 (원천 재수집)  FULL=0  ECOS 키 없음 · KOSIS 키 없음
  36개 산업 분기      있음  data\inputs\bok36_va_q.csv
  총부가가치          있음  data\inputs\gva_total_q.csv
  실질 GDP         있음  data\inputs\gdp_quarterly_sa.csv
  IO 중분류 부가가치    있음  data\inputs\io_benchmark_va_83ind.csv
  IO 생산유발계수      있음  data\inputs\io_M_mid_2020.csv
  IO 소분류 37x     있음  data\inputs\io_small_37x_va.csv
  생산지수 C28·C282  있음  data\inputs\mfg_prod_c28_c282.csv
  발전량 KPX        있음  data\inputs\power_gen_kpx.csv
  발전량 KEPCO      있음  data\inputs\power_gen_kepco.csv
  대조표 62         있음  data\crosswalk_62.json
  분화 규칙 69       있음  data\carveout_rules.csv

표 1. 산업 해상도별 분기 실질부가가치 패널(2020년 연쇄가격)¶

In [2]:
t1 = F.panel_summary(real, L62, L69, ["2000Q1", "2020Q1", "2025Q4"])
t1.to_csv(os.path.join(C.OUTPUT, "table1_panels.csv"), index=False, encoding="utf-8-sig")
t1.style.format({c: "{:,.1f}" for c in t1.columns if "조원" in c} | {"36합 대비 최대오차(십억원)": "{:.1e}"}).hide(axis="index")
Out[2]:
분류 산업 수 기간 2000Q1 합계(조원) 2020Q1 합계(조원) 2025Q4 합계(조원) 36합 대비 최대오차(십억원)
36(한국은행) 36 2000Q1–2025Q4 233.4 475.9 549.4 0.0e+00
62(KEIT) 62 2000Q1–2025Q4 233.4 475.9 549.4 2.9e-10
69(62+분화) 69 2000Q1–2025Q4 233.4 475.9 549.4 3.5e-10

표 2. 36→62 배분 — 모산업을 나누는 산업과 몫(2020년 산업연관표)¶

62개 가운데 47개는 BOK36 산업 17개를 나누어 가지고(분할), 15개는 BOK36 산업 하나(13개) 또는 병합 묶음(전기업+가스·증기, 건설 4개 업종)과 1:1로 대응한다.

In [3]:
split = mapping[mapping["유형"].str.startswith("분할")].copy()
t2 = split.groupby("BOK36부모").apply(lambda g: pd.Series({"산업 수": len(g), "구성(몫)": " · ".join(f"{n}({s:.3f})" for n, s in zip(g["산업명"], g["몫"]))}),
                                    include_groups=False)
t2.to_csv(os.path.join(C.OUTPUT, "table2_split_62.csv"), encoding="utf-8-sig")
print(mapping["유형"].str.split("(").str[0].value_counts().to_string())
t2
유형
분할        47
1:1/병합    15
Out[3]:
산업 수 구성(몫)
BOK36부모
1101 3 농업(0.820) · 임업(0.073) · 어업(0.108)
1102 2 석탄ㆍ원유ㆍ천연가스(0.016) · 금속ㆍ비금속광업(0.984)
110301 3 식료품(0.603) · 음료품(0.161) · 담배(0.236)
110302 2 섬유ㆍ의복(0.925) · 가죽제품(0.075)
110303 3 목재ㆍ목제품(0.156) · 펄프ㆍ종이제품(0.561) · 인쇄ㆍ복제(0.283)
110305 4 화학물질ㆍ제품(0.343) · 화학섬유(0.010) · 의료ㆍ의약품(0.195) ·...
110309 2 전자부품ㆍ컴퓨터ㆍ영상ㆍ음향ㆍ통신장비(0.888) · 의료ㆍ정밀ㆍ광학기기ㆍ시계(0.112)
110312 2 자동차(0.836) · 기타 운송장비(0.164)
110403 3 수도사업(0.172) · 하수ㆍ폐수ㆍ분뇨처리업(0.195) · 폐기물ㆍ자원재활용서비...
1107 4 육상운송업(0.380) · 수상운송업(0.066) · 항공운송업(0.068) · 창...
1108 3 금융업(0.589) · 보험ㆍ연금업(0.136) · 금융ㆍ보험관련서비스업(0.276)
1112 2 의료ㆍ보건업(0.747) · 사회복지 서비스업(0.253)
11131 2 문화서비스업(0.292) · 스포츠ㆍ오락서비스업(0.708)
11132 2 사회단체(0.259) · 수리ㆍ개인서비스업(0.741)
11142 5 출판업(0.045) · 영상ㆍ오디오기록물제작 배급업(0.058) · 방송업(0.06...
111501 3 연구개발업(0.412) · 사업관련전문서비스업(0.272) · 과학기술관련전문서비스...
111502 2 장비ㆍ용품임대업(0.198) · 사업지원서비스업(0.802)

표 3. 62→69 분화 — 몫과 2025Q4 수준¶

In [4]:
lv = L69.loc["2025Q4"]
t3 = carve_log.assign(**{"신산업 2025Q4(십억원)": [lv[n] for n in carve_log["신산업"]],
                         "나머지 2025Q4(십억원)": [lv[n] for n in carve_log["나머지 열"]]})
t3.to_csv(os.path.join(C.OUTPUT, "table3_carveout_69.csv"), index=False, encoding="utf-8-sig")
t3.style.format({"몫(평균)": "{:.4f}", "신산업 2025Q4(십억원)": "{:,.1f}", "나머지 2025Q4(십억원)": "{:,.1f}"}).hide(axis="index")
Out[4]:
신산업 모산업 나머지 열 방식 몫(평균) 신산업 2025Q4(십억원) 나머지 2025Q4(십억원)
반도체 22.전자부품ㆍ컴퓨터ㆍ영상ㆍ음향ㆍ통신장비 22.전자부품ㆍ컴퓨터ㆍ영상ㆍ음향ㆍ통신장비(잔여) IO고정 0.5471 29,767.7 24,644.0
조선업 27.기타 운송장비 27.기타 운송장비(잔여) IO고정 0.5703 2,069.3 1,559.4
철강 20.1차 금속 20.1차 금속(잔여) IO고정 0.7041 4,206.3 1,767.5
택배 38.창고ㆍ운송보조서비스업 38.창고ㆍ운송보조서비스업(잔여) IO고정 0.2066 2,796.5 10,740.5
이차전지 24.전기장비 24.전기장비(잔여) share_battery 0.1394 1,279.0 7,233.3
신재생에너지 29.전기ㆍ가스ㆍ증기ㆍ공기조절공급업 29.전기ㆍ가스ㆍ증기ㆍ공기조절공급업(잔여) share_renew 0.0335 831.8 8,255.1
건물건설건축보수 33.건설업 토목건설 IO고정 0.7013 16,289.9 6,937.3

표 4. 시변 몫 — 연평균(이차전지/전기장비, 신재생/전기·가스·증기)¶

In [5]:
yr = lambda s: s.groupby(s.index.str[:4]).mean()
t4 = pd.DataFrame({"이차전지 몫": yr(share_b), "신재생 몫": yr(share_r)}).loc[["2000", "2005", "2010", "2015", "2020", "2021", "2022", "2023", "2024", "2025"]]
t4["신재생 발전비중(%)"] = act.set_index(act["year"].astype(str))["renew_share"].reindex(t4.index) * 100
t4.to_csv(os.path.join(C.OUTPUT, "table4_timevarying_shares.csv"), encoding="utf-8-sig")
t4.style.format({"이차전지 몫": "{:.4f}", "신재생 몫": "{:.4f}", "신재생 발전비중(%)": "{:.2f}"}, na_rep="—")
Out[5]:
  이차전지 몫 신재생 몫 신재생 발전비중(%)
2000 0.0278 0.0072 —
2005 0.0896 0.0082 —
2010 0.1661 0.0168 1.90
2015 0.1622 0.0360 4.36
2020 0.1823 0.0558 6.71
2021 0.1927 0.0642 7.51
2022 0.2186 0.0736 8.99
2023 0.2015 0.0799 9.67
2024 0.1573 0.0874 10.67
2025 0.1474 0.0915 11.50

그림 1. 이차전지·신재생에너지 시변 몫(분기)¶

In [6]:
fig, ax = plt.subplots(figsize=(8, 3.8))
x = range(len(share_b))
ax.plot(x, share_b.values, color="#1f4e79", label="이차전지 / 전기장비")
ax.plot(x, share_r.values, color="#a9781f", label="신재생에너지 / 전기·가스·증기")
ticks = [i for i, q in enumerate(share_b.index) if q.endswith("Q1") and int(q[:4]) % 5 == 0]
ax.set_xticks(ticks, [share_b.index[i][:4] for i in ticks]); ax.set_ylabel("모산업 대비 몫")
ax.grid(alpha=.3); ax.legend(frameon=False); ax.set_title("분화 산업의 시변 몫", loc="left")
fig.tight_layout(); fig.savefig(os.path.join(C.OUTPUT, "fig1_shares.png"), dpi=150)
No description has been provided for this image

표 5. 연쇄가중 총부가가치 재현 — 검증표¶

'단순합 괴리'(포털 검증표의 '그냥 합 괴리')는 36개 산업 실질값 단순합의 총부가가치 대비 괴리, '재현값 괴리'는 2020Q1 기준 양방향 연쇄 재현값의 괴리이다(%).

In [7]:
pts = ["1980Q1", "2000Q1", "2019Q4", "2020Q1", "2020Q4", "2025Q4"]
t5 = rq.loc[pts, ["단순합_괴리_pct", "재현_괴리_pct"]].copy()
t5.loc["전체(184분기) 최대 |괴리|"] = rq[["단순합_괴리_pct", "재현_괴리_pct"]].abs().max()
t5.loc["전체(184분기) 평균 |괴리|"] = rq[["단순합_괴리_pct", "재현_괴리_pct"]].abs().mean()
t5.loc["연간(46년) 최대 |괴리|"] = ra[["단순합_괴리_pct", "재현_괴리_pct"]].abs().max()
t5.columns = ["단순합 괴리(%)", "재현값 괴리(%)"]
t5.to_csv(os.path.join(C.OUTPUT, "table5_recon.csv"), encoding="utf-8-sig")
t5.style.format({"단순합 괴리(%)": "{:+.3f}", "재현값 괴리(%)": "{:+.4f}"})
Out[7]:
  단순합 괴리(%) 재현값 괴리(%)
분기    
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
연간(46년) 최대 |괴리| +23.096 +0.0014

그림 2. 36개 산업 단순합과 연쇄 재현값의 총부가가치 대비 괴리(분기)¶

In [8]:
fig, ax = plt.subplots(figsize=(8, 3.8))
x = range(len(rq))
ax.plot(x, rq["단순합_괴리_pct"].values, color="#b03a2e", label="36개 단순합")
ax.plot(x, rq["재현_괴리_pct"].values, color="#1e8449", label="연쇄 재현값(기준 2020Q1)")
ax.axhline(0, color="grey", lw=.8)
ticks = [i for i, q in enumerate(rq.index) if q.endswith("Q1") and int(q[:4]) % 5 == 0]
ax.set_xticks(ticks, [rq.index[i][:4] for i in ticks]); ax.set_ylabel("괴리(%)")
ax.grid(alpha=.3); ax.legend(frameon=False); ax.set_title("총부가가치 대비 괴리", loc="left")
fig.tight_layout(); fig.savefig(os.path.join(C.OUTPUT, "fig2_recon.png"), dpi=150)
No description has been provided for this image

검증 — 공표 산출물·공표 수치와 대조¶

① 패널·몫·연계 행렬은 data/published/의 공표본 사본과 원소별로 비교한다(부동소수점 오차 범위). ② 배분 유형·분화 몫·총량 정합은 원 노트북(industry_pipeline/01_데이터입수_산업구분.ipynb)의 실행 출력, ③ 이차전지·신재생 몫 수치는 포털 「62개에서 69개로 — 7가지 분화 제안」, ④ 연쇄가중 재현 수치는 포털 「36개 산업 실질값으로 GVA 재현하기」의 검증표와 비교한다.

In [9]:
P = C.PUBLISHED
R = lambda d: 0.5 * 10 ** -d + 1e-12      # 소수 d자리 반올림 범위(부동소수점 여유 1e-12)
pub = lambda n: os.path.join(C.PUB_DIR, n)
fd = lambda n: F.max_abs_diff(rd(n, index_col=0), pub(n))[0]
viewer = pd.read_csv(pub("recon_viewer.csv"), index_col=0)
map_pub = pd.read_csv(pub("mapping_62_official.csv"))
s36 = real.loc[L62.index].sum(axis=1)
share = dict(zip(carve_log["신산업"], carve_log["몫(평균)"]))
bench = F.io_battery_bench(pd.read_csv(C.IO_SMALL, dtype={"소분류코드": str}))
kappa = np.mean(list(C.BATTERY_BENCH.values())) / (lambda m: (F.quarterly_mean(m["C282"].dropna()) / F.quarterly_mean(m["C28"].dropna())).loc["2020Q1":"2023Q4"].mean())(F.read_mfg_prod(C.MFG_PROD))
gen = act.set_index("year")["renew_share"] * 100
nsplit = int(mapping["유형"].str.startswith("분할").sum())
checks = [
    ("levels_62 공표본 대비 최대차(십억원)", fd("levels_62.csv"), 0.0, 1e-6),
    ("levels_69 공표본 대비 최대차(십억원)", fd("levels_69.csv"), 0.0, 1e-6),
    ("levels_agg 공표본 대비 최대차(십억원)", fd("levels_agg.csv"), 0.0, 1e-6),
    ("share_battery 공표본 대비 최대차", fd("share_battery.csv"), 0.0, 1e-12),
    ("share_renew 공표본 대비 최대차", fd("share_renew.csv"), 0.0, 1e-12),
    ("io_linkage_62 공표본 대비 최대차", fd("io_linkage_62.csv"), 0.0, 1e-9),
    ("io_linkage_69 공표본 대비 최대차", fd("io_linkage_69.csv"), 0.0, 1e-9),
    ("mapping_62 몫 공표본 대비 최대차", float((mapping["몫"] - map_pub["몫"]).abs().max()), 0.0, 0.0),
    ("62합−36합 최대오차(십억원)", float((L62.drop(columns="총량GDP").sum(axis=1) - s36).abs().max()), P["62합-36합_최대오차"], 1e-6),
    ("69합−36합 최대오차(십억원)", float((L69.drop(columns="총량GDP").sum(axis=1) - s36).abs().max()), P["69합-36합_최대오차"], 1e-6),
    ("분화 항등식 최대오차(십억원)", F.mece_gap(L62, L69, rules), 0.0, 1e-6),
    ("62분류 2025Q4 합계(십억원)", float(L62.drop(columns="총량GDP").loc["2025Q4"].sum()), P["62_2025Q4_합계"], R(1)),
    ("분할 산업 수", nsplit, P["분할_산업수"], 0),
    ("1:1·병합 산업 수", len(mapping) - nsplit, P["1:1병합_산업수"], 0),
    ("몫: 반도체", share["반도체"], P["몫_반도체"], R(4)),
    ("몫: 조선업", share["조선업"], P["몫_조선업"], R(4)),
    ("몫: 철강", share["철강"], P["몫_철강"], R(4)),
    ("몫: 택배", share["택배"], P["몫_택배"], R(4)),
    ("몫: 이차전지(평균)", share["이차전지"], P["몫_이차전지_평균"], R(4)),
    ("몫: 신재생에너지(평균)", share["신재생에너지"], P["몫_신재생_평균"], R(4)),
    ("몫: 건물건설·건축보수", share["건물건설건축보수"], P["몫_건물건설"], R(4)),
    ("이차전지 κ", kappa, P["이차전지_k"], R(4)),
    ("IO 373/37 비중 2020–23 평균(원 코드 상수)", np.mean(list(C.BATTERY_BENCH.values())), P["IO373_비중_2020_23평균"], R(3)),
    ("원 코드 상수 = 소분류표 비중 반올림(일치 연도 수)", int((bench.round(3) == pd.Series(C.BATTERY_BENCH)).sum()), 4, 0),
    ("신재생 발전비중 2006(%)", gen[2006], P["발전비중_2006_pct"], R(1)),
    ("신재생 발전비중 2016(%)", gen[2016], P["발전비중_2016_pct"], R(1)),
    ("신재생 발전비중 2025(%)", gen[2025], P["발전비중_2025_pct"], R(1)),
    ("전력부문 VA몫 IO45/(45+46)", F.io_share(F.read_io_va83(C.IO_VA83), [45], [45, 46]), P["전력부문_VA몫"], R(3)),
    ("단순합 평균 |괴리|(%)", rq["단순합_괴리_pct"].abs().mean(), P["단순합_평균괴리"], R(3)),
    ("단순합 최대 |괴리|(%)", rq["단순합_괴리_pct"].abs().max(), P["단순합_최대괴리"], R(3)),
    ("재현 평균 |괴리|(%)", rq["재현_괴리_pct"].abs().mean(), P["재현_평균괴리"], R(4)),
    ("재현 최대 |괴리|(%)", rq["재현_괴리_pct"].abs().max(), P["재현_최대괴리"], R(4)),
]
for q in ["1980Q1", "2000Q1", "2019Q4", "2020Q1", "2020Q4", "2025Q4"]:
    checks.append((f"단순합 괴리 {q}(%)", rq.loc[q, "단순합_괴리_pct"], P[f"단순합_{q}"], R(3)))
    checks.append((f"재현 괴리 {q}(%)", rq.loc[q, "재현_괴리_pct"], P[f"재현_{q}"], R(4)))
checks += [
    ("연간 재현 최대 |괴리|(%)", ra["재현_괴리_pct"].abs().max(), P["연간_재현_최대괴리"], R(4)),
    ("분기별 단순합 괴리 184개 공표 대비 최대차(%p)", float((rq["단순합_괴리_pct"] - viewer["단순합_괴리_pct"]).abs().max()), 0.0, R(4)),
    ("분기별 재현 괴리 184개 공표 대비 최대차(%p)", float((rq["재현_괴리_pct"] - viewer["재현_괴리_pct"]).abs().max()), 0.0, R(4)),
]
res = pd.DataFrame([{"항목": k, "계산": float(v), "공표": float(p), "허용오차": tol, "통과": bool(abs(float(v) - float(p)) <= tol)}
                    for k, v, p, tol in checks])
res.to_csv(os.path.join(C.OUTPUT, "verification.csv"), index=False, encoding="utf-8-sig")
with pd.option_context("display.float_format", lambda v: f"{v:,.6g}", "display.max_rows", 100):
    display(res)
assert res["통과"].all(), "공표 수치와 계산 결과가 다르다 — 위 표에서 통과=False 항목을 확인한다"
print(f"검증 통과: {len(res)}개 항목 — 62·69·총량 패널, 분화 몫, IO 연계 행렬, 연쇄가중 재현 수치를 재현했다.")
항목 계산 공표 허용오차 통과
0 levels_62 공표본 대비 최대차(십억원) 1.16415e-10 0 1e-06 True
1 levels_69 공표본 대비 최대차(십억원) 1.16415e-10 0 1e-06 True
2 levels_agg 공표본 대비 최대차(십억원) 0 0 1e-06 True
3 share_battery 공표본 대비 최대차 0 0 1e-12 True
4 share_renew 공표본 대비 최대차 0 0 1e-12 True
5 io_linkage_62 공표본 대비 최대차 0 0 1e-09 True
6 io_linkage_69 공표본 대비 최대차 0 0 1e-09 True
7 mapping_62 몫 공표본 대비 최대차 0 0 0 True
8 62합−36합 최대오차(십억원) 2.91038e-10 0 1e-06 True
9 69합−36합 최대오차(십억원) 3.49246e-10 0 1e-06 True
10 분화 항등식 최대오차(십억원) 7.27596e-12 0 1e-06 True
11 62분류 2025Q4 합계(십억원) 549,415 549,415 0.05 True
12 분할 산업 수 47 47 0 True
13 1:1·병합 산업 수 15 15 0 True
14 몫: 반도체 0.5471 0.5471 5e-05 True
15 몫: 조선업 0.5703 0.5703 5e-05 True
16 몫: 철강 0.7041 0.7041 5e-05 True
17 몫: 택배 0.2066 0.2066 5e-05 True
18 몫: 이차전지(평균) 0.1394 0.1394 5e-05 True
19 몫: 신재생에너지(평균) 0.0335 0.0335 5e-05 True
20 몫: 건물건설·건축보수 0.7013 0.7013 5e-05 True
21 이차전지 κ 0.182221 0.1822 5e-05 True
22 IO 373/37 비중 2020–23 평균(원 코드 상수) 0.19875 0.199 0.0005 True
23 원 코드 상수 = 소분류표 비중 반올림(일치 연도 수) 4 4 0 True
24 신재생 발전비중 2006(%) 1.0439 1 0.05 True
25 신재생 발전비중 2016(%) 4.7805 4.8 0.05 True
26 신재생 발전비중 2025(%) 11.5004 11.5 0.05 True
27 전력부문 VA몫 IO45/(45+46) 0.795993 0.796 0.0005 True
28 단순합 평균 |괴리|(%) 7.65469 7.655 0.0005 True
29 단순합 최대 |괴리|(%) 25.2081 25.208 0.0005 True
30 재현 평균 |괴리|(%) 0.232416 0.2324 5e-05 True
31 재현 최대 |괴리|(%) 0.823244 0.8232 5e-05 True
32 단순합 괴리 1980Q1(%) 21.9347 21.935 0.0005 True
33 재현 괴리 1980Q1(%) 0.119986 0.12 5e-05 True
34 단순합 괴리 2000Q1(%) 5.71561 5.716 0.0005 True
35 재현 괴리 2000Q1(%) 0.215264 0.2153 5e-05 True
36 단순합 괴리 2019Q4(%) 0.0027738 0.003 0.0005 True
37 재현 괴리 2019Q4(%) 0.0380028 0.038 5e-05 True
38 단순합 괴리 2020Q1(%) 0.0271549 0.027 0.0005 True
39 재현 괴리 2020Q1(%) 0 0 5e-05 True
40 단순합 괴리 2020Q4(%) -0.0305575 -0.031 0.0005 True
41 재현 괴리 2020Q4(%) 0.068685 0.0687 5e-05 True
42 단순합 괴리 2025Q4(%) 1.01251 1.013 0.0005 True
43 재현 괴리 2025Q4(%) 0.327767 0.3278 5e-05 True
44 연간 재현 최대 |괴리|(%) 0.00142224 0.0014 5e-05 True
45 분기별 단순합 괴리 184개 공표 대비 최대차(%p) 4.98075e-05 0 5e-05 True
46 분기별 재현 괴리 184개 공표 대비 최대차(%p) 4.99501e-05 0 5e-05 True
검증 통과: 47개 항목 — 62·69·총량 패널, 분화 몫, IO 연계 행렬, 연쇄가중 재현 수치를 재현했다.