Park-Distance wRC+ (P-wRC+) 가이드
KBO 환경에서 wRC+ 가 풀어내지 못한 구장 크기 보정의 한계를 정면으로 파고든 새 산출 방식이다. 홈런의 비거리, 방향, 그리고 9개 구장의 디멘션을 그대로 끌어들여 구장 크기 의존성을 정직하게 걷어낸다.
⏱️ 30초 요약 — 처음 보시는 분께
wRC+ 는 타격 종합 점수다. 100이 리그 평균이고, 150은 평균보다 50% 잘 친 것, 200은 두 배 잘 친 것이다.
P-wRC+ (Park-Distance wRC+) 는 KBO 9개 구장의 크기와 펜스 차이를 한층 정밀하게 반영한 새 wRC+ 다. 홈런 하나하나의 실제 비거리와 방향을 따져 "이 타구가 나머지 8개 구장에서도 담장을 넘겼을 비율" 을 구하고, 그 결과로 구장 크기 효과를 깔끔하게 떼어낸다.
P-WAR 는 P-wRC+ 를 베이스라인으로 삼아 환산한 WAR (Wins Above Replacement) 다.
※ 'Park-Distance' 는 이 모델이 다루는 환경 요소를 가리킨다. 즉 구장의 거리(폴대·갭·중앙)와 펜스 높이다. 기후·바람·습도 같은 다른 환경 변수는 그대로 남아 있고, 이 부분은 §6.2 한계에서 따로 다룬다.
§1왜 또 다른 wRC+ 인가
KBO 환경에서 기존 wRC+ 산출 방식 두 가지(R / E)는 각자의 약점을 안고 있다.
| 방식 | 보정 메커니즘 | 한계 |
|---|---|---|
| R-wRC+ | wRC/PA 단계에 단일 종합 PF 1회 적용 (FanGraphs 표준) | HR/단타/볼넷 모두 같은 PF → 라팍 거포 부당 패널티 |
| E-wRC+ | 1B/2B/3B/HR 각각 다른 PF 로 raw count 보정 | 라팍 HR PF 1.51, 잠실 HR PF 0.64 같은 극단 PF 가 raw 적용 시 거포에게 systematic 패널티/보너스 — 본 시스템은 Phase 1 (PF+1)/2 변환으로 이를 절반으로 완화했으나, HR 자체에 PF 적용은 여전히 distance-blind |
| P-wRC+ | 각 HR 의 비거리/방향으로 다른 8개 구장에서 HR이 됐을 비율 산정 (PF 자체 우회) | 기후/바람 잔존 (구장 디멘션 의존만 제거) |
문제의 핵심은 이렇다. 모든 홈런에 똑같은 잣대로 PF 를 들이대면, 비거리가 충분한 "no-doubt" 홈런까지 패널티 또는 보너스를 받는다. 디아즈의 50홈런은 대부분 다른 구장에서도 담장을 넘겼을 타구지만, R 과 E 모두 라팍 효과로 일괄 깎아낸다. 전형적인 과다보정(overcorrection)이다.
§2산출 알고리즘
2.1 PARK_DIM (9구장 디멘션) — 5방향 비대칭 모델
시즌이 바뀌어도 모양이 그대로인 대칭 구장 7곳에, 사직(시즌별 펜스 분리)과 대전(비대칭 + 시즌 분리)을 더해 9개를 다룬다. 펜스 높이는 표준 3m 를 넘는 만큼만 거리·방향별 K 계수로 비거리에 더해준다.
- 폴대 (95~102m): 초과 1m 당 +1.95m
- 갭 (113~118m): 초과 1m 당 +1.45m
- 센터 (120~125m): 초과 1m 당 +1.10m
출처: Alan Nathan trajectory model (AJP 76:119, 2008) — RK4 적분, drag Cd=0.34, Magnus Cl_eff S-parametric, 표준 backspin 1800rpm, KBO 대기 ρ=1.166 kg/m³. Phase 3 Stream A (2026-04-29) 도입.
시즌 불변 대칭 구장 (7개) — 좌/우 폴대 동일, 펜스 단일
| 구장 | 폴대 (m) | 갭 (m) | 센터 (m) | 펜스높이 (m) | 특징 |
|---|---|---|---|---|---|
| 잠실 | 100.0 | 120.0 | 125.0 | 2.6 | 대형 펜스 낮음 |
| 대구 | 99.5 | 107.0 | 122.5 | 3.6 | 갭 짧음 (라팍) |
| 문학 | 95.0 | 115.0 | 120.0 | 2.4 | 낮은 펜스 |
| 창원 | 101.0 | 116.0 | 121.0 | 3.3 | |
| 광주 | 99.0 | 115.0 | 121.0 | 2.6 | 낮은 펜스 |
| 고척 | 99.0 | 115.0 | 122.0 | 4.0 | 돔구장 |
| 수원 | 98.0 | 115.0 | 120.0 | 4.0 |
사직 — 시즌별 펜스 분리 (롯데)
디멘션은 그대로 두고 외야 펜스 높이만 손댔다. 2022~2024년에는 보조 펜스 6m, 2025년에는 그 보조 펜스를 철거해 원래대로 돌렸다.
| 방향 | 폴대 (m) | 갭 (m) | 센터 (m) | 펜스 (m) | 갭 effective |
|---|---|---|---|---|---|
| 대칭 | 95.0 | 113.0 | 118.0 | 4.8 | 115.6m |
원래 외야 펜스 4.8m
| 방향 | 폴대 (m) | 갭 (m) | 센터 (m) | 펜스 (m) | 갭 effective |
|---|---|---|---|---|---|
| 대칭 | 95.0 | 113.0 | 118.0 | 6.0 | 117.3m |
⚠️ 보조 펜스 6m (투수력 강화 목적). 2025 철거 → 원상복구
대전 — 비대칭 + 시즌 분리 (한화)
2024년까지는 한밭, 2025년부터는 이글스파크다. 좌·우 폴대, 좌·우 갭, 중앙까지 다섯 방향을 따로 잡고 펜스 높이도 방향별로 둔다.
| 방향 | 좌 폴대 | 좌중간 | 중앙 | 우중간 | 우 폴대 |
|---|---|---|---|---|---|
| 거리 (m) | 98.6 | 112.0 | 122.0 | 112.0 | 100.0 |
| 펜스 (m) | 3.2 | 3.2 | 4.0 | 3.2 | 3.2 |
거의 대칭 (좌 98.6 / 우 100)
| 방향 | 좌 폴대 | 좌중간 | 중앙 | 우중간 | 우 폴대 |
|---|---|---|---|---|---|
| 거리 (m) | 99.0 | 115.0 | 122.0 | 112.0 | 95.0 |
| 펜스 (m) | 2.4 | 2.4 | 2.4 | 2.4 | 8.0 |
⚠️ 우측 폴대 8m 벽 — KBO 유일 비대칭
Effective fence (우측 폴대, K=1.95): 95.0 + (8.0 − 3.0) × 1.95 = 104.75m
2.2 Effective Fence Distance
표준 3m 를 넘는 펜스 높이에 대해 거리·방향별 K 계수를 곱해 비거리에 더한다. Phase 3 Stream A(2026-04-29)에서 갱신했다.
effective_fence(park, dir) = base_distance + max(0, fence_h - 3.0) × K(dir)
K = { left_pole: 1.95, left_gap: 1.45, center: 1.10, right_gap: 1.45, right_pole: 1.95 }- 사직 갭 (K=1.45): 113 + (6.0−3.0)×1.45 = 117.35m (성담장 통합)
- 잠실 갭 (K=1.45): 120 + 0 = 120.0m
- 라팍 갭 (K=1.45): 107 + (3.6−3.0)×1.45 = 107.87m
- 대전 우폴대 (K=1.95): 95 + (8.0−3.0)×1.95 = 104.75m (이글스파크 8m 벽)
출처는 Alan Nathan trajectory model (AJP 76:119, 2008)이다. K 는 하강 각도의 1/tan 값이며, 그래서 폴대(가파른 하강) > 갭 > 센터(완만한 하강) 순으로 커진다.
2.3 비거리/방향 추출 (PA-level)
문자중계 plate_appearances.result_text 에서 다음 정규식으로 뽑아낸다.
홈런거리 추출: 홈런거리\s*[::]\s*(\d+)\s*M 방향 추출: 좌익수 / 우익수 / 좌중간 / 우중간 / 중견수
방향은 이렇게 매핑한다. 좌익수 뒤·우익수 뒤는 left (폴대), 좌중간 뒤·우중간 뒤는 gap, 중견수 뒤는 center. 추출에 실패하는 약 0.3%는 fallback 값인 credit = 1.0 으로 두어 영향이 중립이 되도록 했다.
2.4 Cross-park Clearance (sigmoid)
홈런 한 타석마다 부여되는 credit 은 자기 구장을 뺀 나머지 8개 구장에서 담장을 넘긴 비율의 합이다.
측정 노이즈 σ=2.5m 의 정규 CDF 로 부드럽게 더해 0/1 계단식 판정의 임계점 효과를 없앤다.
smooth_clearance(d, fence) = Φ((d − fence) / σ) # σ = 2.5m credit(distance, dir, batter_park) = Σ smooth_clearance(distance, effective_fence(p, dir)) # p ≠ batter_park / 8
- credit ≈ 1.0 — no-doubt (다른 8개 구장에서 모두 홈런)
- credit ≈ 0.5 — 경계선상의 타구
- credit ≈ 0.125 — cheap (자기 구장에서만 홈런)
2.5 wOBA 산출 (Pure)
woba_p_num =
BBw·(BB-IBB) + HBPw·HBP
+ 1Bw·(1B / pf_1B) + 2Bw·(2B / pf_2B) + 3Bw·(3B / pf_3B)
+ HRw·hr_credit_sum ← cross-park clearance 합 (PF 미사용)
woba_p = woba_p_num / PAPF 가 어디에 들어가는가 — 1B/2B/3B 는 이벤트별 PF 를 한 번 적용한다. HR 은 cross-park clearance 로 대신하므로 PF 를 쓰지 않는다. BB/HBP 도 PF 를 적용하지 않는다.
2.6 영점 조절 (Multiplicative Normalization)
cross-park clearance 가 PF 를 우회하면서 생길 수 있는 리그 평균 편향을 차단한다.
lg_avg_pre_norm = Σ(wrc_p_raw[i] × PA[i]) / Σ(PA[i]) norm_factor = 100.0 / lg_avg_pre_norm P_wRC+ = wrc_p_raw × norm_factor
이 과정을 거치면 산출 후 PA 가중평균이 정확히 100으로 맞춰져 wRC+ 정의의 무결성이 유지된다. 곱셈 보정은 단 한 번만 들어가므로 추가 보정은 없다.
§3보정 정합성 — 캔슬/이중적용 차단 검증
R, E, P 세 방식은 가중치, 리그 wOBA, scale, 리그 R/PA 같은 raw 입력을 똑같이 공유한다. 차이는 오직 PF 를 어느 시점에 끼워 넣느냐다.
| 방식 | PF 적용 위치 | 횟수 |
|---|---|---|
| R | wRC/PA 단계 (집계 후) | 1회 |
| E | raw count 단계 (1B/2B/3B/HR) | 1회 |
| P | raw count (1B/2B/3B 만) + HR 은 cross-park clearance | 1회 |
결국 세 방식 모두 PF 가 정확히 한 번만 들어가고 추가 보정은 없다. 캔슬도 0, 이중적용도 0이다. 영점 조절도 곱셈 보정 한 번뿐이라, "리그 평균 = 100" 이라는 wRC+ 정의의 무결성이 그대로 지켜진다.
§4결과 검증 (2025 시즌, min_pa=300)
| 선수 (구장) | HR | R | E | P | P − R |
|---|---|---|---|---|---|
| 송성문 (고척) | 26 | 154.4 | 161.6 | 167.3 | +12.9 |
| 디아즈 (대구) | 50 | 162.8 | 135.2 | 175 | +12.2 |
| 안현민 (수원) | 22 | 188.2 | 187.4 | 203 | +14.8 |
| 오스틴 (잠실) | 31 | 163.1 | 166.8 | 175.1 | +12.0 |
| 양의지 (잠실) | 20 | 158.2 | 161.7 | 172.1 | +13.9 |
| 김영웅 (대구) | 22 | 99.5 | 85.5 | 106.8 | +7.3 |
- (PF+1)/2 변환, RE24 native wOBA, Nathan K table, KBO Lichtman k 를 모두 통합한 결과(Phase 3 Stage 2, 2026-04-29 v3 값)다. 디아즈는 E=135.2 → P=175.0 (+39.8)으로, 비거리가 대구 HR PF 의 부당한 패널티를 거둬낸다.
- R-방식이 매기던 PF 패널티와 보너스는 대부분 과다보정이었고, P-방식에서 자연스레 사라진다.
- 디아즈의 50홈런은 clearance 평균이 1.000이다. 50개 모두 나머지 8개 구장에서도 홈런이라는 뜻이다. 라팍 효과가 아니라 본인의 실력이었다.
- Stage 2 이후 송성문과 디아즈의 P-wRC+ 격차는 167.3 대 175.0, 즉 −7.7pt 다. 13.3pt → 7.7pt 로 좁혀졌다. HR k=400, ALL k=900 의 KBO 점추정값 채택 효과다.
§5P-WAR — P-wRC+ 기반 WAR
P-wRC+ 를 batting runs 으로 환산해 WAR 을 만든다. 나머지 컴포넌트(BR/Field/PosAdj/Repl/RPW)는 동일 베이스라인을 그대로 가져다 쓴다.
batting_runs_x = (wrc_plus_x − 100) / 100 × lgR/PA × PA # x ∈ {run, event, pure}
WAR_x = (batting_runs_x + br + fld + pos − rep) / RPW이렇게 하면 R, E, P 세 WAR 을 같은 베이스라인 위에서 직접 비교할 수 있다. batter_war_stats 가 없는 시즌은 NULL 로 둔다.
2025 시즌 R/E/P WAR 차이
max|P − R| = 2.44, RMSE = 0.52 다. 송성문이 +2.44 로 가장 컸는데, 고척 환경 패널티를 회복한 결과다.
§6비판과 응답
6.1 Threshold 효과 (계단식 모델)
비거리 119.9m 와 120.1m 의 가치가 단 0.2m 차이로 계단식 분기되는 것은 통계적으로 부당하다.
대응 — Sigmoid clearance 도입. 측정 노이즈 σ=2.5m 의 정규 CDF 로 부드럽게 합산해 임계점 근처의 급격한 변화를 누그러뜨렸다.
| Distance | Hard step | Sigmoid σ=2.5 | 차이 흡수 |
|---|---|---|---|
| 119.9m (펜스 120m) | 0 (탈락) | 0.484 | — |
| 120.1m (펜스 120m) | 1 (통과) | 0.516 | — |
| Δ | 1.000 ⚠ | 0.032 ✅ | 31× 부드러움 |
σ 캘리브레이션 — KBO 비거리는 1m 단위로 기록되고, 추정 정확도가 ±2~3m, 기후 노이즈가 +0.5m 정도 더해진다. 이를 종합해 σ=2.5m 를 채택했다. 환경변수 CLEARANCE_SIGMA_M 으로 조정할 수 있다.
6.2 비거리의 환경 의존성
비거리 자체가 기후·바람·습도의 산물이다. "120m면 어디서든 홈런" 이라는 명제는 환경 노이즈를 무시한다.
대응 — 'Pure' 의 정의를 좁힌다. 이 모델이 말하는 'Pure' 는 구장 디멘션과 펜스 높이 의존성 제거에 한정한다. 기후·바람·습도가 만드는 노이즈는 그대로 남아 있고, sigmoid σ 가 일부만 흡수한다.
- 여름철 고습도 (대전) — 비거리 −2~3m 추정
- 돔 항온항습 (고척) — 노이즈 최소
- 뒷바람 5m/s — 비거리 +5~10m
아직 적용하지 않은 보완 방안으로는 구장-월 단위 평균 비거리 정규화와 풍속 실측 데이터 통합이 있다.
6.3 Survivor Bias
no-doubt 홈런을 표본에서 빼고 남은 표본만으로 PF 를 다시 계산하면, 리그 평균이 무너진다.
대응 — 그 단계가 아예 없다. 이 모델은 PF 를 재산출하지 않는다. 홈런은 cross-park clearance 합산으로 처리해 PF 자체를 거치지 않는다(§2.4 참조). 따라서 문제가 발생할 코드 경로가 없다.
# 본 모델 — survivor bias 차단 woba_num_p = ... + hr_w * Σ(clearance_per_HR_PA) # PF 자체 미사용 # Survivor-bias 발생 가능 모델 (NOT used) no_doubt = [hr for hr in HRs if distance >= 125] cheap = [hr for hr in HRs if distance < 125] recalc_PF = compute_PF(cheap) # ← 표본 왜곡 발생 단계 woba_num_x = ... + hr_w * (cheap / recalc_PF + no_doubt)
1B/2B/3B PF 는 모든 타구를 포함한 raw count 로 산출하므로 survivor bias 와 무관하다.
6.4 Park Factor 적용 방식의 systematic 2x overcorrection bias
raw PF 를 모든 raw count 에 일률 적용한다는 것은 "선수가 모든 PA 를 홈에서 친다"는 가정과 같다. 홈 50%, 원정 50%라는 KBO 균형 일정에 어긋나, PF 효과가 약 2배 부풀려진다.
진단 — 체계적 2배 과다보정 편향(systematic 2x overcorrection bias)이다. 이 결함은 시스템 초기 산출에서 송성문과 디아즈가 6pt 차이로 뒤집혔던 사례를 통해 드러났다. 편향 유형은 모델 명세 오류 + 측정 편향이다.
예시 — 송성문의 1B 114개 가운데 절반쯤은 원정(정상 환경)에서 친 것인데, 산출 단계에서 전부 고척 PF (0.885) 로 깎였다. 결국 PF 효과가 두 배쯤 부풀려진 셈이다. 다른 이벤트별 PF 적용에서도 똑같은 문제가 일어난다.
대응 — Phase 1 에서 (PF+1)/2 변환 적용.
# Before (raw 적용 — bias) adjusted_event = raw_event_count / pf_event_raw # After (Phase 1 — 50/50 홈/원정 가정) pf_event_applied = (pf_event_raw + 1.0) / 2 adjusted_event = raw_event_count / pf_event_applied
출처:
- Tom Tango, Mitchel Lichtman, Andrew Dolphin (2007). The Book: Playing the Percentages in Baseball, Potomac Books. Chapter on Park Factors (홈/원정 50/50 가정 + 산술평균 보정 적용).
- Mitchel Lichtman. "How to Calculate Park Factors" — FanGraphs Library (library.fangraphs.com/principles/parkfactors).
- FanGraphs WAR Glossary — Park-Adjusting Stats 섹션 (library.fangraphs.com/war/calculating-war).
§7한계 및 향후 과제
| 항목 | 현재 상태 | 향후 과제 |
|---|---|---|
| 한화 한밭/이글스파크 분리 | DB stadium 컬럼이 분리되지 않아, 단년 PF 사용으로 자동 해소 | 데이터 정합성이 정리되면 별도 분리 |
| 펜스높이 페널티 계수 | 거리·방향별 K table (Nathan trajectory model, 2026-04-29 도입) | 백스핀과 발사 각도 분포에 따른 K 분산 추정. 지금은 표준 1800rpm 가정 |
| 좌/우 타자 batter_side 분리 | 미적용 | park_factors 의 batter_side='L'/'R' 을 활용할 여지가 있다 |
| 1B/2B/3B 의 비거리 활용 | 미적용 (문자중계에 비거리 데이터 없음) | 트래킹 데이터가 들어오면 도입 검토 |
| Lichtman shrinkage k | Phase 3 Stage 2 (2026-04-29): HR=400, ALL=900 (KBO closed-form 점추정). 1B/2B/3B 는 KBO CI 가 넓어 MLB 값을 유지 | 계층적 베이즈(Hierarchical Bayes) 도입 검토. 현재는 MLB 값을 fallback 으로 사용 |
| wOBA 가중치 | RE24 native — KBO 자체 산출, method='re24_native', 6시즌 분량 갱신 | 시즌별 자동 갱신 잡 등록 완료 (control-center) |
| YoY 예측력 / Bootstrap CI | Stage 3 후속 작업 (약 1주, P2-15 + P2-16) | Stage 4 민감도 분석 (27 cells), Stage 5 운영 문서 |
📋 운영 정책 — 모델 변경 시 절차
- σ (clearance sigmoid) 변경 — 외부 검증 RMSE 가 1.0pt 를 넘으면 전 시즌을 재산출하고, 명세서 §11 을 갱신한다.
- K table (FENCE_PENALTY_K_BY_DIRECTION) 변경 — 변경 일자, 전후 K 값, 영향 측정(reference player 4명 Δ)을 함께 남긴다.
- PARK_DIM 변경 (구장 리노베이션) — 해당 시즌부터 분리된 PARK_DIM 키를 추가하고, cross-park clearance 를 시즌 파라미터로 분기시킨다.
- Lichtman k 변경 —
park_factors_3yr_regressed에 새 calculation_version (v4, v5, …) 을 적재한 뒤,_team_pf_*_multiyearSQL 의 calc_version 분기를 갱신한다. 이전 버전은 보존해 롤백이 가능하도록 둔다. - 외부 호환성 —
wrc_plus_pure컬럼의 의미는 바꾸지 않는다. 의미가 달라져야 한다면 새 컬럼명을 쓴다(예:wrc_plus_pure_v2). - v3 덮어쓰기 + CSV 백업 — 직전 버전 스냅샷을
archive/p-wrc-plus-{ver}-snapshot-{date}.csv로 한 번만 내보낸다. 이후 변경은 git 으로 추적한다.
모든 변경은 명세서 docs/sabermetrics/p-wrc-plus.md §11 변경 이력에 일자·사유·영향 측정과 함께 기록한다.
§8갱신 주기 및 버전 정책
regular_advancedbatter_war_statspark_factors_3yr (category=seasonal)woba_weights (category=seasonal)📜 버전 이력
| 버전 | 일자 | 변경 |
|---|---|---|
| Phase 1 | 2026-04-28 | (PF+1)/2 변환 — systematic 2x overcorrection bias 해결 |
| Phase 1.5 | 2026-04-28 | 5방향 비대칭 PARK_DIM + 대전/사직 시즌별 분리 |
| Phase 2 | 2026-04-28 | Multi-year (3yr trailing) regressed PF + Lichtman shrinkage v1 |
| Phase 3 Stream A | 2026-04-29 | 거리·방향별 K table (Nathan trajectory model) — 폴대 1.95 / 갭 1.45 / 센터 1.10 |
| Phase 3 Stream B | 2026-04-29 | RE24 native wOBA 가중치 (HR -0.49~0.59, BB +0.11~0.12) |
| Phase 3 Stream C | 2026-04-29 | Lichtman k KBO 재추정 — HR k=400, ALL k=900 (KBO closed-form 점추정). 1B/2B/3B 는 MLB 유지 (KBO CI wide). |
| Phase 3 Stream D | 2026-04-29 | 사직 자연실험 검증 — 6m vs 4.8m 비교 K_gap=1.85 (95% CI 안에 이론 K_gap=1.45 포함, 정합) |
| Phase 3 Stream E | 2026-04-28 | 단년 PF + _bayes_shrink over-shrinkage 해소. 고척 ALL PF 1.08 → 1.0327 → 0.96 (3yr Lichtman 적용 후), R/E/P 베이스라인 통일 (event_type='ALL' 추가). |
| Phase 3 Stage 2 (v3) | 2026-04-29 | Stream A/B/C/E 통합 freeze — Lichtman k(KBO): HR=400, ALL=900. 1B/2B/3B MLB 유지. PF v3 + P-wRC+ 6시즌 backfill (1668 rows) |
백업 정책 — v3 덮어쓰기 직전의 v2 스냅샷을 archive/p-wrc-plus-v2-snapshot-2026-04-29.csv (1668 rows, encoding=utf-8-sig) 로 한 번 내보낸다. v3 이후 변경은 git history 로 추적한다. park_factors_3yr_regressed 는 v1/v2/v3 모두 DB 안에 보존해 fallback 으로 둔다.
§9케이스 스터디 — 송성문 vs 디아즈 (2025), 시스템 결함 발견과 정합성 회복
🚨 이 케이스 스터디는 P-wRC+ 시스템에서 발견된 체계적 측정 편향(systematic measurement bias) 과 그 정합성을 회복해 간 과정의 기록이다.
9.0 시작 — '왜 50홈런이 26홈런에 밀리는가?' 라는 의문
초기 산출에서 P-wRC+ 는 송성문 206, 디아즈 200으로 송성문이 6pt 우위였다. 홈런 수가 절반에도 못 미치는 송성문이 50홈런 디아즈를 어떻게 앞설 수 있을까. 개발자가 이 결과에 의문을 던지면서 시스템 검증이 시작됐다.
처음에는 "wRC+ 는 홈런 지표가 아니라 PA 당 종합 가치를 재는 잣대" 라는 표면적 설명이 그럴듯했다. 그러나 곧이어 "송성문이 단타를 전부 고척에서 친 것도 아니고, 디아즈가 50홈런을 모두 대구에서 친 것도 아니다" 라는 직관이 제기됐다. 이것이 결정적인 단서가 됐다.
9.1 Raw 데이터 (2025 시즌)
| 항목 | 송성문 (고척) | 디아즈 (대구) |
|---|---|---|
| PA | 646 | 628 |
| 1B | 114 | 91 |
| 2B | 37 | 32 |
| 3B | 4 | 0 |
| HR | 26 | 50 |
| BB | 68 | 60 |
| HBP | 1 | 6 |
| K | 96 | 100 |
| wOBA (raw) | 0.416 | 0.454 |
raw wOBA 만 놓고 보면 디아즈가 압승이다(0.454 대 0.416). 그런데 P-wRC+ 에서는 송성문 206, 디아즈 200으로 약 6pt가 뒤집힌다.
9.2 이벤트별 PF — 가장 큰 요인
| PF | 고척 (송성문) | 대구 (디아즈) | 의미 |
|---|---|---|---|
| 1B PF | 0.885 | 1.039 | 고척이 단타에 매우 불리. 송성문 +12.7% 회복 |
| 2B PF | 0.836 | 0.994 | 고척이 2루타에 매우 불리. 송성문 +19.6% 회복 |
| HR clearance | 0.991 | 0.974 | 둘 다 no-doubt 영역 |
고척은 단타와 2루타에 가혹하다. 송성문의 1B 114개는 보정 후 128.8개 값어치, 2B 37개는 보정 후 44.3개 값어치로 환산된다. 반대로 디아즈는 대구의 단타 PF 가 1.039 로 미세하게 우호적이라 오히려 raw count 가 약간 깎인다.
9.3 wOBA Pure 분자 분해
wOBA 가중치 (RE24 기반): BB=0.671 / HBP=0.682 / 1B=0.904 / 2B=1.397 / 3B=2.057 / HR=2.540
| 항목 | 송성문 기여 | 디아즈 기여 |
|---|---|---|
| BB | 0.671 × 68 = 45.6 | 0.671 × 60 = 40.3 |
| HBP | 0.682 × 1 = 0.7 | 0.682 × 6 = 4.1 |
| 1B (PF 보정) | 0.904 × 120.9 = 109.3 | 0.904 × 89.3 = 80.7 |
| 2B (PF 보정) | 1.397 × 40.3 = 56.3 | 1.397 × 32.1 = 44.8 |
| 3B | 2.057 × 4 ≈ 8.2 | 0 |
| HR (clearance) | 2.540 × 25.8 = 65.5 | 2.540 × 48.7 = 123.7 |
| 합계 (분자) | ~285.6 | ~293.6 |
| woba_pure | ~0.442 | ~0.467 |
※ 표의 PF 보정은 Phase 1+1.5 기준 (PF+1)/2 변환을 적용한 값이다. 보정 1B/2B 는 raw count 를 (PF+1)/2 로 나눠 산출했다.
- 홈런 가치는 디아즈 압승 (123.7 대 65.5, +58.2)
- 1루타+2루타 가치는 송성문 압승 (165.6 대 125.5, +40.1). 단타·2루타 누적과 PF 보정이 합쳐진 결과다.
- BB/HBP/3B 까지 모두 합치면 디아즈가 8 정도 앞선다. 그래서 woba_pure 가 0.467 대 0.442 로 디아즈가 살짝 우위, P-wRC+ 도 디아즈가 +13.3pt 앞서는 것으로 §9.7 결과와 들어맞는다.
9.4 P vs E 차이로 보는 환경 보정량
| 선수 | E | P | P − E | 의미 |
|---|---|---|---|---|
| 디아즈 | 135.2 | 175.0 | +39.8 | E 가 대구 HR PF (v3 1.584) 의 일률적 패널티를 적용. P 는 비거리로 정당하게 회복 |
| 송성문 | 161.6 | 167.3 | +5.7 | 거의 차이 없다. 26홈런이라 환경 영향이 제한적 |
디아즈는 P-방식의 최대 수혜자다. E-방식만 있었다면 135.2 로 송성문(161.6)에 밀렸을 것이다. P-방식이 175.0 까지 끌어올린 핵심은 HR clearance 0.974 가 대구 HR PF 1.584(v3)의 부당한 패널티를 차단한 데 있다.
※ 이 표는 Phase 3 Stage 2 (2026-04-29) v3 값이다. Stream A(Nathan K table), Stream B(RE24 native wOBA), Stream C(KBO Lichtman k: HR=400 / ALL=900), Stream E(R/E/P 베이스라인 통일)를 모두 적용해 통합 freeze 한 결과다.
9.5 결함에 대한 보정
앞서 살핀 wOBA 분자 기여도와 PF 보정 효과를 합쳐 보면, 송성문과 디아즈 사이 6pt 차이는 단순한 실력 차가 아니다. PF 적용 방식 자체의 결함이 만든 격차였다.
결함의 메커니즘과 통계적 진단은 §6 비판과 응답 §6.4 에서 자세히 다룬다. 다음 단계는 표준 방법론에 맞춰 보정 방식을 손보는 것이다.
결함의 크기를 정량으로 따져 보면 이렇다. 송성문에게 1B PF 0.862 를 raw 그대로 적용하면, 정확한 적용 대비 1B 가치가 약 8% 부풀려진다. wOBA 가중치 0.904 에 약 10개 차이를 곱하면 대략 5~7pt. 송성문과 디아즈의 6pt 격차와 정확히 맞아떨어진다.
9.6 Phase 1 적용 — (PF+1)/2 변환
FanGraphs, Tango, Lichtman 의 표준에 부합하는 산술평균 변환을 적용한다.
# Before adjusted_event = raw_event_count / pf_event_raw # After (Phase 1) pf_event_applied = (pf_event_raw + 1.0) / 2 # 50/50 홈/원정 가정 adjusted_event = raw_event_count / pf_event_applied
"선수는 절반은 홈에서, 절반은 원정에서 치므로 환경 효과의 절반만 보정한다" — 직관적이면서 통계적으로도 정합한 해석이다.
9.7 Phase 3 Stage 2 적용 결과 — 직관 회복 (v3 값)
| 선수 (구장) | Pre (raw PF 일률) | Post (Phase 3 Stage 2 v3) | Δ | 해석 |
|---|---|---|---|---|
| 안현민 (수원) | 199 | 203.0 | +4.0 | 수원 PF 가 거의 중립이라 변동도 작다 |
| 디아즈 (대구, 50홈런) | 200 | 175.0 | −25.0 | HR k=400 (KBO) 채택으로 대구 HR PF 가 1.55 → 1.58 로 강해져 P-방식 회복분이 줄어든다 |
| 오스틴 (잠실) | 192 | 175.1 | −16.9 | 잠실 ALL k=900 영향과 RE24 wOBA 효과가 약하게 더해짐 |
| 송성문 (고척, 26홈런) | 206 | 167.3 | −38.7 | 고척 1B/2B 페널티 회복 효과가 절반으로 줄고, 추가 freeze 까지 반영된 결과 |
| 양의지 (잠실) | 177 | 172.1 | −4.9 | 변동이 거의 없다 |
| 김영웅 (대구) | 113 | 106.8 | −6.2 | 대구 ALL PF v3 가 강해지면서 R-방식 베이스라인이 함께 움직임 |
🔄 핵심 변화 요약
- • Pre (raw PF 일률 적용) — 송성문 +6pt 우위 (직관에 어긋남)
- • Post (Phase 1+1.5) — 디아즈 +13.3pt 우위 ((PF+1)/2 효과)
- • Post (Phase 3 Stage 2 v3) — 디아즈 +7.7pt 우위 (KBO Lichtman k 와 정합)
- • "50홈런이 26홈런보다 값어치 있다" 는 직관을 되찾으면서 통계적 정합성도 함께 끌어올렸다.
영점 조절 무결성 — 2021~2026년 6시즌 모두 PA 가중평균 P-wRC+ = 100.00 ± 0.003 으로 곱셈 정규화의 무결성이 그대로 유지된다.
- Stream A (Nathan K table) — 거리·방향별 K (폴대 1.95 / 갭 1.45 / 센터 1.10)
- Stream B (RE24 native wOBA) — HR −0.49~0.59, BB +0.11~0.12, method='re24_native'
- Stream C (KBO Lichtman k) — HR k=400, ALL k=900 의 closed-form 점추정을 채택. 1B/2B/3B 는 KBO CI 가 넓어 MLB 값을 유지.
- Stream D (사직 자연실험 검증) — 6m 와 4.8m 비교에서 K_gap=1.85, 95% CI 안에 이론값 1.45 포함 ✅
- Stream E (PF 베이스라인 통일) — R/E/P 모두 park_factors_3yr_regressed v3 (event_type='ALL' + 이벤트별)
- v3 덮어쓰기 + CSV 백업 — archive/p-wrc-plus-v2-snapshot-2026-04-29.csv (1668 rows)
9.8 결론 — 통계적 정직성
📊 정직한 결론
송성문(167.3)과 디아즈(175.0)의 P-wRC+ 차이는 +7.7pt 로 디아즈가 앞선다(Phase 3 Stage 2 v3 값). 각 선수 P-wRC+ 의 표준오차를 ±10pt 로 잡으면*, 두 선수 차이의 표준오차는 √(10²+10²) ≈ ±14.1pt 다. 7.7pt 차이는 0.55σ 이내, t ≈ 0.55, p ≈ 0.59(양측)로 통계적 유의성이 없다. 결국 두 선수의 2025시즌 타격 능력은 표면적 차이에도 불구하고 통계적으로 구별되지 않는(statistically indistinguishable) 영역에 가깝다.
어느 한쪽을 "더 낫다" 고 못 박으려면 다년 추세, 클러치 상황, 부상 이력, 포지션 가치 같은 추가 정보가 필요하다. 표면적 P-wRC+ 차이는 환경 효과를 정리하고 나면 사실상 사라진다.
- 홈런 비율 — 디아즈 7.96%, 송성문 4.02%
- 1B+2B+3B+BB+HBP — 송성문 224, 디아즈 189 (송성문이 35건 더 많음)
- 가치 생성 패턴은 완전히 다르다. 디아즈는 홈런으로 압도하고, 송성문은 누적 컨택으로 쌓는다. 그런데도 wOBA 기반 종합 평가에서는 두 선수가 거의 동급이다.
- 이것이 wOBA 기반 평가의 본질이다. 홈런의 임팩트와 누적 가치를 함께 저울에 올린다.
* SE ±10pt 는 446 PA 표본의 이항 분포에 정규 근사를 적용한 추정치다. 정확한 95% 신용구간(PA 단위 블록 부트스트랩 1000회)은 Phase 2 작업 항목(P2-16)으로 등록돼 있다. ±10pt 는 FanGraphs WAR uncertainty estimate, BP DRC+ standard error reporting 등 동급 사베르메트릭 표준과 같은 자릿수다.
※ 이 케이스 스터디는 데이터 분석 플랫폼이 스스로의 결함을 찾아내고 정합성을 회복해 간 기록이다. "통계적 정직성이 플랫폼 장기 신뢰의 뿌리다" — 이 원칙 아래, 표면적 결과보다 측정의 정합성을 앞세우는 입장을 지킨다. 앞으로 Phase 2 (PA 단위 정확 보정 + 3년 회귀 PF) 가 도입되면 이 가이드도 다시 손본다.
§10P-wRC+ 의 통계적 정합성 — Phase 3 검증 결과 (2026-04-29)
핵심 reframing
P-wRC+ 의 진짜 가치는 예측력(predictive validity) 향상이 아니라 구장 맥락을 반영한 진짜 능력 추정(park-context-aware true talent estimate)에 있다. KBO 표본(n=228 pair)에서는 Δr=0.02~0.05 를 검출하는 것 자체가 거의 불가능하다(power 12~35%). Top-30 ranking 은 R-wRC+ 와 사실상 같다(Kendall τ=0.93). 그러나 park-distance contribution(median 7.0 wRC+) 이 cross-park 비교에서 R-wRC+ 를 보완하는 가치를 충분히 보여 준다.
10.1 YoY predictive validity (4 시즌쌍, pooled n=228)
| Metric | r (pooled) | 비고 |
|---|---|---|
| R-wRC+ | 0.466 | FanGraphs 표준 |
| E-wRC+ | 0.472 | 이벤트별 PF |
| P-wRC+ | 0.467 | Park-Distance |
| Marcel | 0.521 | n=118, 최상위 |
10.2 Ranking robustness — 순위 판단은 100% 안전
2024시즌을 기준으로 R-wRC+ 와 P-wRC+ 의 순위를 비교했다(n=59, bootstrap 1000회).
| 지표 | R↔P | E↔P |
|---|---|---|
| Kendall τ | 0.931 | 0.873 |
| Top-30 Jaccard | 0.909 | 0.869 |
P-wRC+ 의 부가가치는 순위 재배치가 아니라 절대 스케일에서의 park-context 정밀도다. 27 cells 민감도 분석에서도 모든 cells × 6시즌 조합에서 Kendall τ ≥ 0.95, Top-30 Jaccard = 1.0 으로 순위 판단은 100% 안전하다.
10.3 민감도 분석 (27 cells, σ × K × k_lichtman)
| Gate | 기준 | 통과 |
|---|---|---|
| Kendall τ ≥ 0.95 | min τ across 6 seasons | 26/26 (100%) |
| Top-10 Jaccard ≥ 0.9 | min Jaccard across 6 seasons | 11/26 (42%) |
| max|Δ| ≤ 1.5pt (전체 26 cells) | max across 6 seasons | 8/26 (31%) |
| max|Δ| ≤ 1.5pt (2022~2026 full-window) | 2021 단일연도 윈도우 제외 | 24/26 (92%) |
| All three (2021 제외) | full trailing window | 17/26 (65%) |
가장 취약한 축은 k_lichtman ±50% 다(2021 단일연도 윈도우에서 max|Δ|=3.4pt). σ/K ±20% 효과는 1pt 미만이라 무시해도 좋다. 2022~2026년 full-window 시즌에서는 결론이 안정적이다.
robust_in_ranking_partially_robust_in_magnitude10.4 Park-Distance contribution — 의미 있는 보정
| 선수 (구장) | 시즌 | R-wRC+ | P-wRC+ | P−R |
|---|---|---|---|---|
| 디아즈 (대구) | 2025 | 162.8 | 175 | +12.2 |
| 안현민 (수원) | 2025 | 188.2 | 203 | +14.8 |
| 오스틴 (잠실) | 2025 | 163.1 | 175.1 | +12.0 |
| 오스틴 (잠실) | 2023 | 155.8 | 169.4 | +13.6 |
| 송성문 (고척) | 2025 | 154.4 | 167.3 | +12.9 |
전체 405 player-seasons 분포는 median |P−R| = 7.0 wRC+, P95 = 13.6, max = 23.7 다. 선수 개별 CI95 폭은 약 27.4 wRC+pt 로(PA-sampling 노이즈 / P−R 효과 비율 = 3.9),팀별·구장별 같은 그룹 비교에서 실질적인 의미를 가진다.
출처 — Stage 3 research/p-wrc-plus-validity/ (n=228, block bootstrap 1000회) · Stage 4 research/p-wrc-plus-sensitivity/ (27 cells × 6시즌). 2026-04-29 완료.