jaehyeong.net
writing
2026-05-18·baseball·8 min

유망주 5년 WAR 예측의 천장

유망주 5년 WAR 예측의 1위 변수는 나이였다. 한 꺼풀 벗기니 88%가 측정창 거품이었고, 모델은 스카우트 컨센서스를 베끼고 있었다. 다섯 번 같은 벽에 막힌 뒤, 누수를 제거한 스카우트 랭킹에서 AUC 0.894의 롱런 신호가 처음 나왔다.

유망주 예측의 천장에 관한 기록. 10년치 AAA·MLB 타격 데이터. 모든 수치는 prospect-forecasting 결과 파일에서 두 번 대조했다. 코드는 repo.

질문

"AAA에 있는 타자 유망주 중 누가 5년 뒤 빅리그를 씹어먹을까. 누구를 콜업해야 하나."

10년치 마이너·메이저 타격 데이터를 모아 모델을 돌렸다. 단변량 회귀, 랜덤포레스트, permutation importance, SHAP. 네 방법이 한 변수를 만장일치 1위에 올렸다. 타율도 장타율도 아니었다. 나이, 정확히는 동년배 대비 상대 나이(age relative to level). 나이 하나만 넣은 RF 모델의 R²이 0.307이었다. 5년 누적 WAR 분산의 30% 이상을 그 한 변수가 잡았다.

Univariate OLS R² leaderboard with age ranked first
단변량 OLS 기준 리더보드. age가 R² 0.113으로 1위, wRC+·wOBA가 그 뒤. RF로 비선형 적합하면 age 단독 R²은 0.307까지 올라간다.

"어린 유망주가 더 큰다." 야구계의 오랜 직관을 데이터가 깔끔하게 확인해주는 것처럼 보였다. 한 꺼풀 벗기자 이야기가 무너지기 시작했다.

첫 번째 거품

5년 누적 WAR이라는 잣대 자체에 함정이 있었다. 22세 유망주의 "이후 5년"은 22–27세, 전성기 입구다. 30세의 "이후 5년"은 쇠퇴기다. 같은 실력이어도 어린 선수의 5년 합계가 구조적으로 클 수밖에 없다.

잣대를 나이에 중립적인 지표(생애 동일 구간의 최고 wRC+)로 바꾸자 나이의 위력 중 88%가 증발했다. age importance가 0.787에서 0.096으로, 감소율 87.8%. 우리가 찾은 "가장 강력한 발견"의 대부분은 발견이 아니라 측정 방식이 만든 거품이었다.

Age importance collapses when switching from cum_war_5y to peak wRC+ target
타깃을 cum_war_5y에서 나이-중립 지표(peak wRC+)로 바꾸면 age permutation ΔR²가 0.787에서 0.096으로, 87.8% 사라진다. 측정창이 만든 거품.

거품이 다는 아니었다. 남은 12%는 나이에 중립적인 잣대에서도 1위를 지켰다. 절대 나이 artifact가 아니라 상대-나이 발달 신호가 그만큼은 진짜였다는 뜻이다. 거품을 걷어내자 그동안 가려져 있던 장타력(ISO, 6위→3위)과 선구안(BB%, 9위→5위)이 비로소 떠올랐다. counting artifact에 눌려 저평가됐던 진짜 skill predictor들이다.

모델은 무엇을 보고 있었나

여기서 더 불편한 질문이 나온다. 이 모델은 이미 빅리그에 올라온 선수들의 데이터로만 학습됐다. 콜업되지 못한 선수는 성적 자체가 존재하지 않는다. 모델이 배운 건 "재능"이 아니라 "구단이 실제로 올려서 붙박이로 쓴 패턴"이다. 콜업을 도우려는 도구가, 이미 내려진 콜업 결정을 베끼고 있었다.

모델이 꼽은 최상위 유망주 리스트를 열어봤다. Matt McLain, James Wood, Elly De La Cruz, Jackson Holliday. 전부 그 시대 모두가 아는 컨센서스 1순위 유망주들이었다. 모델은 미래를 예측한 게 아니라 스카우트가 이미 내린 평가를 충실히 복원하고 있었다. 정확하다는 사실이 곧 한계의 증거였다. 이런 모델은 모두가 놓친 보석을 찾을 수 없다. 구조적으로, 기존 평가를 학습했기 때문이다.

Model top-30 forecast matches the consensus prospect list
모델 top-30 예측. 당대 컨센서스 1순위 유망주들과 거의 그대로 겹친다. 미래 예측이 아니라 기존 평가의 복원.

경쟁위험(competing-risks) 모델로 콜업이라는 관문과 그 이후 성과를 분리하니 한 가지가 분명해졌다. 구단은 생산성(wOBA·ISO·K%)을 보고 콜업한다. 그런데 그 생산성은 그 선수가 빅리그에서 오래 가는지를 예측하지 못한다. 콜업의 잣대와 롱런의 잣대가 다르다. regular 도달 hazard 모델의 GroupKFold 교차검증 concordance는 0.899 ± 0.031로, 콜업 후보 순위 보조로는 쓸 만한 판별력이었다. 단 hazard ratio 절대값과 "콜업 시기"는 소표본·season 해상도 때문에 신뢰 불가다. 그렇다면 롱런은 무엇이 예측하는가.

이 질문에 답하려고 다섯 가지 다른 길을 팠다. 잔차 분석, 최대우도 기반 타깃 재설정(MLE), 선수 고정효과, 회귀불연속, 새로운 트래킹 지표(MiLB Statcast). 다섯 번 모두 같은 벽에 부딪혔다.

데이터는 시스템이 남긴 선수만 기록한다. 콜업되지 못한 선수의 미래는 존재하지 않는다. "숨겨진 보석"은 정의상, 숨겨지지 않은 선수만 기록된 데이터로는 찾을 수 없다. 더 정교한 알고리즘으로 우회할 수 있는 문제가 아니었다. 모델의 문제가 아니라 관측 구조(survivor-only)의 문제였다.

다섯 경로, 같은 벽
  • 잔차 분석 — 승격 proxy가 outcome 정의에 순환
  • 최대우도 타깃 재설정 (MLE) — 잔류자만 t+1 관측, 52% 결측
  • 선수 고정효과 (FE) — 콜업된 선수 안에서만 식별
  • 회귀불연속 (RDD) — 진짜 indifference zone 부재
  • MiLB Statcast — 전통 지표에 redundant + 검증 calendar 벽
  • 공통 원인: 데이터는 시스템이 남긴 선수만 기록

가장 정직한 중간 결론은 "이 데이터로는 답할 수 없는 질문을 묻고 있다"였고, 그것을 다섯 번 독립적으로 확인한 것이 사실상의 성과였다.

한 번의 진짜 돌파

벽을 깨는 길은 하나뿐이었다. 모델 바깥에서, 결과와 무관하게 매겨진 평가를 들여오는 것. 박스스코어가 아니라 스카우트의 prospect 랭킹. 7년치 30개 구단 유망주 랭킹을 모았다.

함정이 또 있었다. 처음엔 선수의 역대 최고 랭킹을 붙였는데, 이건 "나중에 잘해서 올라간 랭킹"이 예측 변수에 새는 누수다. 예측하려는 결과가 입력에 섞인다. 그 결과(부풀려진 수치)는 폐기하고, 그 선수가 AAA에 있던 당시까지 알려진 랭킹만 쓰도록 다시 짰다.

그러자 처음으로 동어반복이 아닌 신호가 나왔다.

Leaky versus leakage-removed scout-ranking metrics
누수 버전과 누수 제거(clean) 버전 비교. 누수를 빼도 2023 AUC는 0.872에서 0.894로 오히려 올라간다. 신호가 0으로 무너지지 않는다.

누수를 제거한 스카우트 랭킹은 전통 타격 지표(wOBA·ISO)와 직교하는 롱런 신호를 운반했다. 2023년 코호트 사후 검증에서 판별력(AUC) 0.894, 95% CI [0.846, 0.934]. 우연을 압도하는 수치다. 효과 크기는 무평가 선수를 어떻게 처리하느냐에 따라 갈렸다. 무평가 선수를 포함하면 partial R² 0.157, CI [0.014, 0.393]으로 방향성은 잡히되 유의성은 표본 부족으로 미달. 제외하면 0.211, CI [0.022, 0.459]로 유의. 두 경우 모두 신뢰구간 하한이 0보다 컸다. 신호가 0이 아니라는 점은 모든 검증에서 흔들리지 않았다.

내 해석은 이렇다. 스카우트는 박스스코어가 잡지 못하는 "오래 갈 선수"에 관한 정보를 실제로 갖고 있는 것으로 보인다. 콜업의 잣대(생산성)가 채우지 못한 빈칸의 첫 번째 신뢰할 수 있는 답이, 숫자가 아니라 사람의 눈에 있었다.

끝까지 알 수 없는 것

그렇다고 "재능을 측정했다"고 말할 수는 없다. 스카우트 랭킹은 그 자체가 구단의 판단이다. 어린 선수가 오래 가는 것이 타고난 재능 때문인지, 구단이 그 선수에게 더 많은 기회와 육성을 투자했기 때문인지, 높이 평가받았기에 자기실현된 것인지, 이 데이터로는 끝내 분리할 수 없다. 롱런 신호의 표본은 n=105 수준의 방향성이고, 진입 이후 받은 기회 차이도 배제하지 못했다. 알고리즘의 한계가 아니라 관측의 한계다. 표지판은 세웠지만 목적지는 아니다.

남는 생각

세이버메트릭스에서 가장 강력해 보이는 변수가, 알고 보니 우리가 이미 아는 것을 비추는 거울인 경우는 흔하다. 선택 편향으로 오염된 잣대에 중요도를 돌리면 "가장 중요한 지표"가 아니라 "기존 컨센서스"가 1등으로 나온다. 나이가, wOBA가 1위였던 것은 그 증거였지 답이 아니었다.

데이터 분석에서 가장 정직한 문장은 종종 "여기까지가 데이터의 천장이다"이다. 그 천장이 정확히 어디인지 짚는 일은, 가짜 답을 하나 더 만드는 것보다 가치 있다. 이 기록은 답을 찾은 이야기가 아니라, 답할 수 없는 것과 겨우 답할 수 있는 것의 경계를 그은 이야기다.


Method: 10y AAA·MLB batting (pybaseball). Targets: cum_war_5y / peak wRC+. Univariate OLS · RF · permutation · SHAP importance; competing-risks (Fine-Gray) for call-up vs longevity; bias-corrected scout-ranking ingest with leakage-removed point-in-time grades, bootstrap CI. 코드는 repo.