jaehyeong.net
writing
2026-05-15·baseball·9 min

xwOBA − wOBA 갭, 운보다는 발이다

타자가 "받았어야 할 만큼" 받지 못하는 이유. EV가 1등으로 보였던 건 통계적 착시였고, 분포 변수들은 spray angle과 hit distance의 그림자였다. 끝까지 남는 건 sprint speed — 갭의 40%는 발, 60%는 운.

토이프로젝트 정리 노트. 분석 자체는 2015–2024 MLB 풀시즌(PA ≥ 500) 1,247개 시즌을 대상으로 했고, 데이터는 FanGraphs + Baseball Savant. 코드와 표는 repo 에 있다.

갭이 뭔지부터

xwOBA는 한 줄로 말해 "타구의 질만 가지고 계산한 가상의 wOBA"다. 타구 속도, 발사각, 그 정도의 타구가 역사적으로 안타로 이어진 비율 — 이런 걸 합쳐 "이 타자가 받았어야 할 만큼"을 내놓는다. 실제 결과 wOBA에서 이 값을 빼면 갭이 나온다.

gap_woba = xwOBA − wOBA

갭이 양수면 기대보다 덜 받은 타자, 음수면 기대보다 더 받은 타자다. 갭의 양쪽 끝에 누가 있는지부터 보자.

갭 상위 (기대보다 덜 받음)Seasongapsprint_speed
Cabrera, Miguel2017+0.05724.9
Howard, Ryan2015+0.05124.3
Cabrera, Miguel2016+0.05024.4
Morales, Kendrys2016+0.05024.3
Calhoun, Kole2018+0.04926.1
갭 하위 (기대보다 더 받음)Seasongapsprint_speed
Friedl, TJ2023−0.06628.3
Cozart, Zack2017−0.06226.0
Burns, Billy2015−0.05729.1
Strange-Gordon, Dee2015−0.05429.1
Arozarena, Randy2021−0.05228.7

패턴은 한눈에 보인다. 위쪽은 발이 굼뜬 거구의 슬러거, 아래쪽은 외야를 휘젓는 빠른 발의 타자다. sprint_speed 열만 봐도 분명한 갈림이 있다 (24 vs 28+ ft/s). 이게 이 분석의 출발점이다.

처음엔 "타구 속도"가 1등으로 보였다

회귀를 단순하게 돌리면 갭을 가장 잘 설명하는 변수는 평균 타구 속도 avg_EV였다. 표준화 계수 β = +0.31, p ≈ 0. 랜덤포레스트 importance도 1등. 그대로면 결론은 "강한 컨택을 만드는 타자일수록 wOBA가 xwOBA를 못 따라간다"가 된다.

그런데 함정이 있다. avg_EV는 xwOBA를 만드는 재료 자체다. 강하게 친 타자는 정의상 xwOBA가 높다. wOBA에는 천장이 있다 — 아무리 잘 맞아도 안타는 안타고, 홈런은 홈런이다. EV가 높을수록 xwOBA는 끝없이 올라가지만 wOBA는 따라가지 못해 갭이 자연히 벌어진다. 이건 "EV가 갭을 만든다"가 아니라 지표 정의상 그렇게 보일 수밖에 없다에 가깝다.

검증은 간단하다. 회귀식에 xwOBA를 같이 넣어서 통제한다.

변수단순 회귀 βxwOBA 통제 후 βp
avg_EV+0.308+0.1390.002
sprint_speed−0.192−0.210< 0.001
chase_pct+0.184+0.204< 0.001
bb_pct−0.137−0.225< 0.001
gb_share−0.173−0.0910.009

avg_EV의 영향력은 절반 이상 잘려나갔다 (β −55%). 갭의 직접 원인이 아니라 xwOBA를 통한 매개 효과였다는 게 드러난 것. 후보 1번이 탈락하는 순간이다.

이 mediation 발견이 사실상 이 프로젝트의 진짜 성과다. 단순 회귀로 끝냈으면 잘못된 결론을 낼 뻔했다.

살아남은 셋

xwOBA를 통제한 뒤에도 끝까지 남은 변수들 — 이게 진짜 갭을 만든다.

스프린트 스피드. 표준화 계수 −0.21, p값은 사실상 0. 빠른 발일수록 갭이 음수 쪽으로 간다. 즉 wOBA가 xwOBA를 자주 이긴다. 직관적인 이유다 — 잘 맞지 않은 내야 땅볼을 안타로 만들고, 짧게 떨어진 외야 타구를 한 베이스 더 가져간다. xwOBA 모델은 타구의 질만 보고 "이건 아웃이어야 한다"고 판정하는데 실제 결과는 발이 뒤집는다.

볼넷·추격 비율. 선구안이 좋은 타자일수록 갭이 음수로, 스트라이크존 밖 공을 잘 쫓아치는 타자는 양수로. 메커니즘은 좀 다르다. 출루 자체는 xwOBA가 직접 보상하지 않는 영역이라 wOBA에는 반영되지만 잔차로 새어나오는 부분이 있다.

플라이볼 비율. fb_pct. 확장 모델에서 단일 변수 중 갭과 가장 강하게 엮인다. 플라이가 많을수록 갭이 양수 — 외야 플라이가 잡혀나가면서 "잘 맞은 정타가 아웃되는" 케이스가 누적된다.

세 가지를 합치면 손해 보는 타자의 인상이 또렷해진다. 느리고, 띄우고, 볼을 쫓아치는 타자. 위쪽 갭 리스트의 카브레라 후기, 하워드, 푸홀스, 칼훈이 정확히 그런 프로필이다. 반대로 이득을 보는 타자는 빠르고, 깔고, 골라내는 타자. 알투베, 프리들, 스트레인지-고든이 여기에 속한다.

여기서 "1등 결정 요인은 X다"라고 단정하기는 어렵다. final_summary는 sprint_speed를, OLS 확장 모델은 fb_pct를, RF는 avg_EV를 1등으로 꼽았다. 모델 스펙에 따라 1위가 바뀌면 셋 모두를 "결정 요인"으로 묶어 제시하는 쪽이 데이터에 더 충실하다.

한 층 더: spray + distance

여기서 멈출 수도 있었지만 한 가지가 걸렸다. 왜 pull_pct, oppo_pct, fb_pct, gb_pct처럼 타구 분포를 가리키는 변수들이 그렇게 강하게 잡혔는가. 이것들이 정말 갭의 원인일까, 아니면 더 본질적인 변수의 그림자일까.

두 가지 후보를 의심했다.

gap_woba 분해 가설
├─ Missing 1: spray angle (방향)
│    pull%/oppo%는 그 surrogate
├─ Missing 2: hit distance (비행 거리·hang time·공기저항)
│    fb%/gb%/avg_LA는 그 surrogate
└─ 잔여: sprint_speed (−) + 진짜 random

spray_xwoba_v2 스크립트에서 단계별로 추가하며 β의 변화를 추적했다.

변수원본 (A)+spray (B)+distance (C)shrink B→C
pull_pct−0.08+0.007−0.04spray 단계에서 이미 collapse
oppo_pct−0.11+0.04+0.006spray가 흡수
fb_pct+0.45+0.51+0.21distance가 흡수 (−59%)
gb_pct+0.03+0.10−0.01distance가 흡수 (−109%)
avg_LA−0.30−0.21−0.12distance가 일부 흡수 (+40%)
sprint_speed−0.30−0.29−0.38끝까지 살아남음

다이어그램이 데이터에 그대로 찍혀 있다.

pull_pct / oppo_pct의 영향력은 spray angle을 직접 넣은 순간 사라진다. fb_pct / gb_pct의 영향력은 hit distance를 넣은 순간 절반 이하로 떨어진다. 시즌별로 갭이 변해가는 흐름 — 외야 수비가 좋아지면서 잘 친 공도 더 자주 잡히는 — 도 결국 이 "거리" 채널을 통해 들어온다.

그리고 두 변수를 다 통제한 뒤에도 끝까지 남는 게 sprint speed다. 같은 거리, 같은 방향, 같은 발사각의 타구라도 발이 빠른 타자는 갭을 더 줄인다.

그래서 갭의 정체는

원래 칼럼 마지막 문단을 "남은 5분의 4가 무엇인지는 다음 분석의 몫이다" 로 닫고 싶었다. 다이어그램이 그 닫음을 더 단단하게 바꿔준다:

마지막에 짚어야 할 숫자 하나. 갭의 시즌 간 상관 (r_yoy) 은 0.375다. 비교하자면:

변수r_yoy
sprint_speed0.949
avg_EV0.775
xwOBA0.675
wOBA0.529
gap_woba0.375

xwOBA·wOBA 자체는 시즌 간에 꽤 재현되지만 갭은 절반 이하의 재현성이다. 거칠게 말해 갭의 40% 정도는 구조적, 나머지 60%는 운에 가까운 노이즈라는 뜻이다.

한계

분석의 R²는 14–19% 수준이다. 갭의 80% 이상은 위 변수들로 설명되지 않는다. 모델이 가장 크게 빗나간 이상치들 — 잭 코자트(2017), 놀란 아레나도(2019), 폴 골드슈미트(2022) — 은 셋 다 콜로라도 시기와 겹친다. 쿠어스 필드의 고지대 효과는 모델에 들어가 있지 않다.

상대 수비의 질, 타구 낙구 지점의 운, 1루까지 전력질주하느냐 같은 주루 센스 — 통계로 잘 짚이지 않는 것들이 잔차에 섞여 있다. 발과 선구안과 띄움이 갭의 일부를 설명한다는 것은 분명하지만, 갭은 본질적으로 노이즈가 많은 지표라는 것도 함께 받아들여야 한다.

마무리

xwOBA와 wOBA의 갭을 보고 흔히 "운이 따랐다" 또는 "운이 없었다" 고 말한다. 이 분석이 보여주는 건 그 한 줄이 절반만 맞다는 것이다.

갭의 5분의 2쯤은 선수의 신체 조건과 접근법으로 추적이 된다. 빠른 발은 xwOBA가 매기지 못하는 가산점이고, 띄워 치는 스타일은 보이지 않는 감점이다. 분포 변수처럼 보였던 것들은 사실 spray angle과 hit distance라는 더 본질적인 변수의 그림자였다.

남은 5분의 3은 — 일단은 — 운이다.


Data: FanGraphs (pybaseball.batting_stats) + Baseball Savant (statcast_sprint_speed), 2015–2024, PA ≥ 500. n = 1,247 player-seasons. Mediation analysis via OLS with sequential controls (xwOBA → spray → distance). YoY correlation as proxy for ICC.