02 분석 — 대분류 취업계수, 추세 연장, 산업별 취업자 전망¶
계산 구조. 대분류 $s$의 연도 $y$ 취업계수는 취업자 $L_{s,y}$(천 명)를 소속 산업 실질부가가치 합계(십억 원)로 나눈 값이다.
$$c_{s,y} = \frac{L_{s,y}}{\sum_{i \in s} Y_{i,y}}$$
기준 수준 $b_s$는 2023–2025년 3개년 합계 취업자를 같은 기간 합계 부가가치로 나눈 값이고, 기준 기간의 중앙 연도인 2024년에 둔다. 추세 $g_s$는 2013–2025년 $\ln c_{s,y}$를 연도에 회귀한 최소제곱 기울기(연간 로그변화율)이다.
$$b_s = \frac{\sum_{y=2023}^{2025} L_{s,y}}{\sum_{y=2023}^{2025} \sum_{i \in s} Y_{i,y}}, \qquad \ln c_{s,y} = \alpha_s + g_s\, y + e_{s,y}, \qquad c_{s,t} = b_s \exp\{g_s (t - 2024)\}$$
시나리오 $k$(S1–S5)의 산업 $i$ 취업자 전망은 소속 대분류의 계수 경로에 시나리오 실질부가가치를 곱한 값이다.
$$\hat L^{k}_{i,t} = c_{s(i),t} \times Y^{k}_{i,t}, \qquad t = 2026, \dots, 2035$$
같은 대분류에 속한 산업은 같은 계수를 쓰므로, 대분류 안의 산업별 취업자 비중은 실질부가가치 비중과 같다. 2025년 산업별 실적도 같은 원칙으로 대분류 취업자를 2025년 실질부가가치 비중으로 나누어 정한다(대분류가 산업 하나이면 실측치와 같다).
2026-10 정비판. 계수 경로(1–2절)는 이전 판과 같다. 주 산출물의 투입 부가가치만 5장 정비판 최종 전망으로 바뀌었다.
| 산출물 | 투입 부가가치 | 파일 |
|---|---|---|
| 주 산출물(정비판) | 보고서1 5장 2026-10 정비판 최종 전망(연간) | labor_demand_36.csv, labor_demand_viewer_data.json, labor_actual_2025_36.csv |
| 이전 판(2026-10-08 판) 재현 | 정비 이전 5장 최종 전망(연간, 2026-09-03 판) | labor_demand_36_prev.csv, labor_demand_viewer_data_prev.json |
| 최초 판(v0) 재현 | 정합화 이전 분기 전망(2026-08-04 게시) | labor_demand_36_v0.csv, labor_demand_viewer_data_v0_pre-reconciliation.json |
그 밖의 산출물: coef_history.csv, coef_params.csv, coef_path.csv, spec_comparison.csv, vintage_comparison.csv
재구성 안내. 2026-08-04 게시 자료(최초 판)를 만든 프로그램은 프로젝트 폴더·작업 기록·포털 서버 어디에서도 찾지 못했다. 이 노트북의 계산은 뷰어 설명문과 게시 수치에서 방법을 역산해 다시 작성한 것이다. 6절은 같은 방법에 최초 판 투입을 넣으면 게시 파일이 바이트 단위로 재현됨을, 7절은 대안 명세 가운데 이 명세만 게시 수치를 그대로 재현함을 보인다. 이전 판과 정비판은 같은 방법에 투입 부가가치만 바꾼 것이며, 5절은 이전 판 산출 파일이 바이트 단위로 재현됨을 보인다.
import os, json
import numpy as np, pandas as pd
import config as C
import labor_demand as F
pd.set_option("display.float_format", lambda v: f"{v:,.3f}")
C.setup()
emp_a = pd.read_csv(os.path.join(C.INTERIM, "emp_section_annual_sa.csv"), index_col=0)
emp_n = pd.read_csv(os.path.join(C.INTERIM, "emp_section_annual_nsa.csv"), index_col=0)
va_a = pd.read_csv(os.path.join(C.INTERIM, "va36_hist_annual.csv"), index_col=0)
smap = pd.read_csv(C.SECTION_MAP, dtype={"산업코드": str})
sec_of = dict(zip(smap["산업명"], smap["대분류"]))
sec_name = dict(zip(smap["대분류"], smap["대분류명"]))
def wide(path):
d = pd.read_csv(path)
return {s: g.pivot(index="연도", columns="산업", values="실질VA_십억원") for s, g in d.groupby("시나리오")}
recon = wide(os.path.join(C.INTERIM, "va36_recon_annual.csv")) # 주 투입(정비판)
recon_prev = wide(os.path.join(C.INTERIM, "va36_recon_prev_annual.csv")) # 이전 판 투입
scen_a = wide(os.path.join(C.INTERIM, "va36_scen_annual.csv")) # 최초 판 투입
va_sec = F.section_va(va_a, sec_of)
Python 3.12.10 · pandas 2.2.3 · numpy 2.4.6 · matplotlib 3.11.0 스위치: ONLINE=0 · FULL=0 · API_KEY_BOK 없음 취업자(분기) 있음 data\inputs\emp_section_q.csv 실질VA 이력(분기) 있음 data\inputs\va36_hist_q.csv 주 투입: 정비판 VA 있음 data\inputs\va36_reconciled_annual.csv 이전 판 투입: VA 있음 data\published_prev\va36_reconciled_annual_prev.csv 이전 판 산출 JSON 있음 data\published_prev\labor_demand_viewer_data_prev.json 최초 판 투입: 분기 VA 있음 data\inputs\scenario_viewer_39q_data.json 최초 판 게시 JSON 있음 data\published\labor_demand_viewer_data_v0_pre-reconciliation.json 산업 대응표 있음 data\section_map_36_19.csv
1. 대분류별 취업계수 이력(2013–2025)¶
표의 단위는 실질부가가치 10억 원당 취업자 수(명)이다(천 명/십억 원 × 1,000).
coef = F.coefficients(emp_a, va_sec, range(C.HIST_START, C.HIST_END + 1))
coef.to_csv(os.path.join(C.OUTPUT, "coef_history.csv"), encoding="utf-8-sig")
(coef * 1000).T.rename(index=lambda s: f"{s} {sec_name[s]}")[[2013, 2016, 2019, 2022, 2023, 2024, 2025]].round(2)
| 연도 | 2013 | 2016 | 2019 | 2022 | 2023 | 2024 | 2025 |
|---|---|---|---|---|---|---|---|
| A 농업, 임업 및 어업 | 43.860 | 37.780 | 40.130 | 45.070 | 45.470 | 44.340 | 41.070 |
| B 광업 | 7.090 | 8.770 | 8.220 | 5.040 | 4.290 | 4.960 | 6.410 |
| C 제조업 | 9.140 | 9.110 | 8.200 | 7.670 | 7.500 | 7.080 | 6.760 |
| D 전기, 가스, 증기 및 공기조절 공급업 | 3.110 | 2.880 | 2.310 | 2.310 | 2.490 | 2.430 | 2.560 |
| E 수도, 하수 및 폐기물 처리, 원료 재생업 | 7.540 | 8.240 | 9.980 | 11.260 | 10.750 | 10.150 | 10.900 |
| F 건설업 | 19.750 | 17.310 | 18.240 | 19.250 | 19.290 | 19.500 | 20.170 |
| G 도매 및 소매업 | 25.070 | 23.690 | 21.090 | 18.190 | 18.590 | 18.570 | 18.230 |
| H 운수 및 창고업 | 21.790 | 20.420 | 18.590 | 20.000 | 17.010 | 15.760 | 15.490 |
| I 숙박 및 음식점업 | 45.290 | 48.960 | 45.550 | 43.660 | 46.650 | 47.160 | 47.400 |
| J 정보통신업 | 10.260 | 10.520 | 10.050 | 9.810 | 9.910 | 10.430 | 10.510 |
| K 금융 및 보험업 | 11.100 | 8.790 | 7.660 | 6.040 | 6.180 | 6.100 | 6.160 |
| L 부동산업 | 3.390 | 3.380 | 3.580 | 3.440 | 3.300 | 3.220 | 3.250 |
| M 전문, 과학 및 기술 서비스업 | 14.150 | 13.480 | 13.410 | 13.430 | 13.610 | 14.300 | 14.880 |
| N 사업시설 관리, 사업 지원 및 임대 서비스업 | 23.820 | 22.970 | 18.720 | 21.070 | 20.140 | 19.750 | 19.650 |
| O 공공행정, 국방 및 사회보장 행정 | 9.490 | 8.970 | 8.800 | 9.060 | 8.970 | 9.040 | 9.020 |
| P 교육 서비스업 | 20.610 | 21.260 | 20.480 | 19.260 | 18.960 | 18.880 | 19.370 |
| Q 보건업 및 사회복지 서비스업 | 23.160 | 22.740 | 21.140 | 22.750 | 23.280 | 23.000 | 23.490 |
| R 예술, 스포츠 및 여가관련 서비스업 | 17.600 | 18.170 | 18.240 | 19.350 | 18.170 | 18.640 | 19.830 |
| S 협회 및 단체, 수리 및 기타 개인 서비스업 | 43.460 | 40.480 | 42.330 | 40.940 | 39.590 | 37.890 | 38.610 |
2. 기준 수준과 추세¶
$g_s$가 음수이면 같은 부가가치를 만드는 데 필요한 취업자가 해마다 줄어든다는 뜻이다(노동생산성 상승). 추세 결정계수($R^2$)가 낮은 대분류는 2013–2025년 계수의 움직임이 직선 추세로 잘 설명되지 않는 경우이며, 이때도 추정 기울기를 그대로 연장한다.
par = F.fit_params(emp_a, va_sec, C.BASE_YEARS, (C.HIST_START, C.HIST_END), base="ratio", trend="ols")
path = F.coef_path(par, C.FORECAST_YEARS, C.ANCHOR)
par.assign(대분류명=[sec_name[s] for s in par.index]).to_csv(os.path.join(C.OUTPUT, "coef_params.csv"), encoding="utf-8-sig")
path.to_csv(os.path.join(C.OUTPUT, "coef_path.csv"), encoding="utf-8-sig")
pd.DataFrame({"대분류명": [sec_name[s] for s in par.index],
"2025 실적 계수(명/10억원)": coef.loc[2025] * 1000,
"기준 수준(명/10억원, 2024)": par["기준수준_b"] * 1000,
"연간 로그변화율(%)": par["연간로그변화율_g"] * 100,
"추세 R²": par["추세_R2"],
"2035 계수(명/10억원)": path.loc[2035] * 1000}, index=par.index).round(3)
| 대분류명 | 2025 실적 계수(명/10억원) | 기준 수준(명/10억원, 2024) | 연간 로그변화율(%) | 추세 R² | 2035 계수(명/10억원) | |
|---|---|---|---|---|---|---|
| A | 농업, 임업 및 어업 | 41.075 | 43.622 | 1.032 | 0.291 | 48.867 |
| B | 광업 | 6.414 | 5.147 | -3.484 | 0.236 | 3.509 |
| C | 제조업 | 6.760 | 7.104 | -2.600 | 0.944 | 5.337 |
| D | 전기, 가스, 증기 및 공기조절 공급업 | 2.559 | 2.493 | -1.944 | 0.493 | 2.013 |
| E | 수도, 하수 및 폐기물 처리, 원료 재생업 | 10.897 | 10.594 | 3.433 | 0.738 | 15.455 |
| F | 건설업 | 20.174 | 19.636 | 0.341 | 0.068 | 20.387 |
| G | 도매 및 소매업 | 18.234 | 18.463 | -3.274 | 0.946 | 12.879 |
| H | 운수 및 창고업 | 15.495 | 16.051 | -2.206 | 0.509 | 12.593 |
| I | 숙박 및 음식점업 | 47.395 | 47.067 | -0.117 | 0.012 | 46.466 |
| J | 정보통신업 | 10.511 | 10.287 | -0.398 | 0.110 | 9.847 |
| K | 금융 및 보험업 | 6.163 | 6.149 | -5.151 | 0.933 | 3.489 |
| L | 부동산업 | 3.254 | 3.258 | -0.497 | 0.232 | 3.085 |
| M | 전문, 과학 및 기술 서비스업 | 14.875 | 14.259 | 0.317 | 0.101 | 14.765 |
| N | 사업시설 관리, 사업 지원 및 임대 서비스업 | 19.646 | 19.847 | -1.471 | 0.561 | 16.883 |
| O | 공공행정, 국방 및 사회보장 행정 | 9.024 | 9.013 | -0.205 | 0.094 | 8.811 |
| P | 교육 서비스업 | 19.374 | 19.072 | -1.069 | 0.761 | 16.956 |
| Q | 보건업 및 사회복지 서비스업 | 23.493 | 23.263 | 0.010 | 0.000 | 23.287 |
| R | 예술, 스포츠 및 여가관련 서비스업 | 19.825 | 18.877 | 0.666 | 0.076 | 20.312 |
| S | 협회 및 단체, 수리 및 기타 개인 서비스업 | 38.612 | 38.686 | -0.764 | 0.396 | 35.567 |
3. 주 산출물 — 5장 정비판 최종 전망 투입(S1–S5, 2026–2035)¶
반올림 전 값은 labor_demand_36.csv에, 포털 뷰어 형식(소수 첫째 자리 반올림, 산업 이름순, 시나리오 합계 포함)은 labor_demand_viewer_data.json에 저장한다.
파일 구조(키·연도·시나리오·산업 이름과 순서)가 최초 판 게시 파일·이전 판 파일과 같은지 확인하므로, 포털 뷰어 페이지는 고치지 않고 이 파일로 바꾸어 쓸 수 있다.
2025년 산업별 실적(대분류 취업자의 부가가치 비중 배분)은 labor_actual_2025_36.csv에 저장한다.
proj = F.project(recon, path, sec_of)
F.to_long(proj).to_csv(os.path.join(C.OUTPUT, "labor_demand_36.csv"), index=False, encoding="utf-8-sig")
main = F.viewer_json(proj)
with open(C.OUT_JSON, "wb") as f:
f.write(F.dumps_viewer(main))
v0_pub = json.load(open(C.V0_JSON, encoding="utf-8"))
prev_pub = json.load(open(C.PREV_JSON, encoding="utf-8"))
assert F.same_structure(main, v0_pub) and F.same_structure(main, prev_pub), "주 산출물의 구조가 기존 파일과 다르다"
print(f"labor_demand_viewer_data.json: {os.path.getsize(C.OUT_JSON):,d} bytes · SHA-256 {F.sha256(C.OUT_JSON)[:16]}… · 최초 판·이전 판 파일과 구조 동일")
act25 = F.actual_by_industry(emp_a, va_a, sec_of, C.ACTUAL_YEAR)
act25.rename("취업자_천명").rename_axis("산업").to_csv(os.path.join(C.OUTPUT, "labor_actual_2025_36.csv"), encoding="utf-8-sig")
tot = pd.DataFrame({s: p.sum(axis=1) for s, p in proj.items()})
print(f"2025년 실적(19개 대분류 합계): {act25.sum():,.1f}천 명")
tot.loc[[2026, 2028, 2030, 2032, 2035]].round(1)
labor_demand_viewer_data.json: 17,220 bytes · SHA-256 776c43a570648a03… · 최초 판·이전 판 파일과 구조 동일 2025년 실적(19개 대분류 합계): 28,681.5천 명
| S1 | S2 | S3 | S4 | S5 | |
|---|---|---|---|---|---|
| 2026 | 28,526.200 | 28,289.400 | 28,656.100 | 28,652.600 | 28,337.000 |
| 2028 | 28,614.800 | 28,507.200 | 28,660.100 | 28,693.000 | 28,629.900 |
| 2030 | 28,670.800 | 28,648.000 | 28,678.100 | 28,681.000 | 28,729.000 |
| 2032 | 28,656.900 | 28,630.200 | 28,673.200 | 28,627.000 | 28,717.100 |
| 2035 | 28,560.200 | 28,517.200 | 28,595.300 | 28,517.500 | 28,614.900 |
4. 대분류 합계 점검¶
같은 대분류 안의 산업은 같은 계수를 쓰므로 산업별 취업자를 대분류로 더하면 대분류 계수 × 대분류 부가가치와 같아야 한다. 2025년 산업별 실적의 대분류 합계도 대분류 실측치와 같아야 한다.
chk = []
for s in C.SCENARIOS:
by_sec = proj[s].T.groupby(pd.Series(sec_of)).sum().T
direct = path * F.section_va(recon[s], sec_of).loc[C.FORECAST_YEARS]
chk.append((by_sec[F.SECTIONS] - direct[F.SECTIONS]).abs().max().max())
d25 = (act25.groupby(pd.Series(sec_of)).sum() - emp_a.loc[C.ACTUAL_YEAR, F.SECTIONS]).abs().max()
print(f"대분류 합계와 직접 계산의 최대 차이: {max(chk):.2e}천 명 · 2025 실적 배분의 대분류 합계 차이: {d25:.2e}천 명")
assert max(chk) < 1e-6 and d25 < 1e-6
대분류 합계와 직접 계산의 최대 차이: 9.09e-13천 명 · 2025 실적 배분의 대분류 합계 차이: 2.27e-13천 명
5. 이전 판(2026-10-08 판) 재현¶
같은 계수 경로에 이전 판 투입(정비 이전 5장 최종 전망)을 넣어 이전 판 산출 파일을 다시 만든다. 산출 파일의 SHA-256이 data/published_prev/에 보존한 파일과 같아야 한다.
이 절은 정비판과 이전 판의 차이가 투입 부가가치에서만 생긴다는 것을 보인다.
proj_prev = F.project(recon_prev, path, sec_of)
F.to_long(proj_prev).to_csv(os.path.join(C.OUTPUT, "labor_demand_36_prev.csv"), index=False, encoding="utf-8-sig")
prev = F.viewer_json(proj_prev)
with open(C.OUT_PREV_JSON, "wb") as f:
f.write(F.dumps_viewer(prev))
h = F.sha256(C.OUT_PREV_JSON)
print(f"재현본 SHA-256 {h[:16]}… · 보존 파일 {F.sha256(C.PREV_JSON)[:16]}… · {'일치' if h == F.sha256(C.PREV_JSON) else '불일치'}")
F.compare_viewer(prev, prev_pub)
재현본 SHA-256 f3346aee10c08f89… · 보존 파일 f3346aee10c08f89… · 일치
{'연도 일치': True,
'시나리오 일치': True,
'산업 일치': True,
'산업값 개수': 1800,
'산업값 최대절대오차': 0.0,
'합계 개수': 50,
'합계 최대절대오차': 0.0}
6. 최초 판(v0, 정합화 이전 부가가치 사용) 재현¶
같은 계수 경로에 2026-08-04 게시 당시의 투입(정합화 이전 분기 전망)을 넣어 게시 파일을 다시 만든다. 산출 파일의 SHA-256이 게시 파일과 같아야 한다.
proj_v0 = F.project(scen_a, path, sec_of)
F.to_long(proj_v0).to_csv(os.path.join(C.OUTPUT, "labor_demand_36_v0.csv"), index=False, encoding="utf-8-sig")
v0 = F.viewer_json(proj_v0)
with open(C.OUT_V0_JSON, "wb") as f:
f.write(F.dumps_viewer(v0))
h = F.sha256(C.OUT_V0_JSON)
print(f"재현본 SHA-256 {h[:16]}… · 게시 파일 {F.sha256(C.V0_JSON)[:16]}… · {'일치' if h == F.sha256(C.V0_JSON) else '불일치'}")
F.compare_viewer(v0, v0_pub)
재현본 SHA-256 31c1c9c5dfadd831… · 게시 파일 31c1c9c5dfadd831… · 일치
{'연도 일치': True,
'시나리오 일치': True,
'산업 일치': True,
'산업값 개수': 1800,
'산업값 최대절대오차': 0.0,
'합계 개수': 50,
'합계 최대절대오차': 0.0}
7. 재구성 근거 — 대안 명세 비교(최초 판 게시 파일 기준)¶
뷰어 설명문은 '2023–2025년 평균 취업계수', '2013–2025년 계수 변화추세(연간 로그변화율)', '경제활동인구조사 19개 대분류'만 밝힌다.
취업자 계열(계절조정·원계열), 기준 수준의 평균 방식, 추세 추정 방식, 기준 연도를 바꾸어 가며 최초 판 게시 수치와의 차이를 계산한다.
기본 실행은 16개 명세를 비교하고, FULL=1이면 기준 수준 3종과 추세 기간 4종으로 넓힌 96개 명세를 비교한다.
| 선택지 | 후보 |
|---|---|
| 취업자 계열 | 계절조정(분기 평균) · 원계열(분기 평균) |
| 기준 수준 | ratio: 3개년 합계 비율 · mean: 연도별 계수의 산술평균 · geo: 기하평균(FULL) |
| 추세 추정 | ols: 로그 계수의 최소제곱 기울기 · endpoint: 양 끝 연도 로그 차이 |
| 추세 기간 | 2013–2025 · 2014–2025 · 2015–2025 · 2013–2024(FULL) |
| 기준 연도 | 2024(기준 기간 중앙) · 2025 |
grid = F.spec_grid({"계절조정": emp_a, "원계열": emp_n}, va_sec, scen_a, sec_of, v0_pub, full=C.FULL)
grid.to_csv(os.path.join(C.OUTPUT, "spec_comparison.csv"), index=False, encoding="utf-8-sig")
print(f"비교한 명세: {len(grid)}개 · 게시 수치를 모두 재현한 명세: {int((grid['최대절대오차(천명)'] < 0.05).sum())}개")
grid.head(8)
비교한 명세: 16개 · 게시 수치를 모두 재현한 명세: 1개
| 취업자 계열 | 기준 수준 | 추세 추정 | 추세 기간 | 기준연도 | 최대절대오차(천명) | 일치 비율 | |
|---|---|---|---|---|---|---|---|
| 0 | 계절조정 | ratio | ols | 2013–2025 | 2024 | 0.000 | 1.000 |
| 1 | 원계열 | ratio | ols | 2013–2025 | 2024 | 5.100 | 0.566 |
| 2 | 원계열 | mean | ols | 2013–2025 | 2024 | 5.400 | 0.115 |
| 3 | 계절조정 | mean | ols | 2013–2025 | 2024 | 5.600 | 0.187 |
| 4 | 계절조정 | ratio | ols | 2013–2025 | 2025 | 105.500 | 0.000 |
| 5 | 원계열 | ratio | ols | 2013–2025 | 2025 | 105.500 | 0.000 |
| 6 | 계절조정 | mean | ols | 2013–2025 | 2025 | 105.600 | 0.000 |
| 7 | 원계열 | mean | ols | 2013–2025 | 2025 | 105.600 | 0.000 |
1,800개 값(36개 산업 × 10년 × 5개 시나리오)을 모두 재현하는 명세는 하나뿐이다. 원계열을 쓰면 계절성이 큰 농림어업·공공행정 등에서 최대 5천 명 안팎의 차이가 남고, 기준 연도를 2025년에 두면 전 산업이 한 해 추세만큼 어긋난다.
8. 판본 비교 — 최초 판, 이전 판, 정비판¶
세 판은 계수 경로가 같고 투입 부가가치만 다르다. 최초 판은 정합화 이전 산업 합산 경로(2025–2035년 연평균 약 4.0–4.3%)를, 이전 판은 정비 이전 5장 최종 전망을,
정비판은 2026-10 정비판 최종 전망을 투입했다. 투입 부가가치의 수준과 증가율은 01_입수.ipynb 4절의 표에 있다.
tot_prev = pd.DataFrame({s: p.sum(axis=1) for s, p in proj_prev.items()})
tot_v0 = pd.DataFrame({s: p.sum(axis=1) for s, p in proj_v0.items()})
rows = []
for s in C.SCENARIOS:
for y in (2026, 2030, 2035):
rows.append({"시나리오": s, "연도": y, "최초 판(천명)": tot_v0.loc[y, s], "이전 판(천명)": tot_prev.loc[y, s],
"정비판(천명)": tot.loc[y, s], "정비판 − 이전 판(천명)": tot.loc[y, s] - tot_prev.loc[y, s],
"정비판 − 최초 판(천명)": tot.loc[y, s] - tot_v0.loc[y, s]})
vc = pd.DataFrame(rows)
vc.to_csv(os.path.join(C.OUTPUT, "vintage_comparison.csv"), index=False, encoding="utf-8-sig")
vc[vc["연도"] == 2035].set_index("시나리오").drop(columns="연도").round(1)
| 최초 판(천명) | 이전 판(천명) | 정비판(천명) | 정비판 − 이전 판(천명) | 정비판 − 최초 판(천명) | |
|---|---|---|---|---|---|
| 시나리오 | |||||
| S1 | 36,284.800 | 29,040.100 | 28,560.200 | -479.900 | -7,724.600 |
| S2 | 35,703.400 | 28,988.900 | 28,517.200 | -471.700 | -7,186.100 |
| S3 | 36,569.300 | 29,079.600 | 28,595.300 | -484.300 | -7,974.000 |
| S4 | 36,450.600 | 29,110.800 | 28,517.500 | -593.300 | -7,933.100 |
| S5 | 36,076.500 | 29,046.200 | 28,614.900 | -431.300 | -7,461.600 |