MLB 2025 · 데이터 분석 프로젝트 #1
2025년 오타니 쇼헤이는 팔꿈치 수술 후 투수로 복귀하면서 동시에 타자로 158경기 55홈런을 기록했다. 사람의 몸은 하나인데 두 개의 일을 했다. 그 부하가 타격에 흔적을 남겼는지, 경기 단위 · 선수 단위 · 투구 단위 데이터 3종을 모두 붙여서 확인했다. 아래 필터로 직접 잘라 보세요 — 모든 숫자가 그 조건으로 다시 계산됩니다.
한 줄 결론
시즌 전체로는 유지했다.
다만 등판 다음날 하루가 눌렸다.
* 위 KPI의 시즌 집계는 경기 단위 데이터(정규시즌 기준)로 필터와 무관하게 고정입니다. 이하 차트는 모두 현재 필터로 다시 계산됩니다.
SECTION 01 — 부하의 크기
첫 등판은 28구 1이닝. 마지막은 100구 7이닝. 18번의 등판은 계단처럼 설계되어 있었다. 구종 필터를 켜면 그 계단 안에서 어떤 공을 늘려갔는지가 보인다.
회색 트랙은 그 등판의 전체 투구수, 색칠된 부분이 현재 필터에 해당하는 투구수
최근 7일 투구수를 최근 28일 평균 주간 투구수로 나눈 값. 스포츠 과학에서 0.8~1.3을 관리 구간으로 본다. 부하는 총량 개념이라 구종·타자 필터를 적용하지 않는다.
읽은 것
SECTION 02 — 어디로 던졌나
2025년에 던진 공을 전부 포수 시점의 스트라이크 존 위에 찍었다. 위 필터에서 구종을 하나만 켜고 좌타/우타를 바꿔보면, 같은 구종을 타자 유형에 따라 어디에 넣는지가 드러난다. 범례를 클릭하면 결과별로 켜고 끌 수 있다.
가로축 = 좌우 위치(ft), 세로축 = 높이(ft) · 사각형은 평균 스트라이크 존
스윙 10회 이상인 구종만 · 헛스윙 ÷ 전체 스윙
읽은 것
SECTION 03 — 핵심 질문
타석을 등판일로부터 며칠 지났는지로 나눠 묶었다. 비교를 공정하게 하려고 복귀 전 기간은 제외했다. 위 필터의 타격 지표를 바꾸면 같은 구간을 다른 눈으로 볼 수 있다 — 결과(wOBA)가 아니라 스윙의 질(배트 스피드 · 헛스윙률)로 보면 이야기가 조금 달라진다.
⚠ 표본이 작다 — 정직하게 적어둔다
투수를 병행하기 시작한 시점을 기준으로 시즌을 반으로 자른 비교
경기 단위 데이터 · LA 다저스
SECTION 04 — 시간에 따라
같은 x축(월)을 두 개의 패널로 나눠 그렸다. 단위가 다른 두 지표를 하나의 그래프에 두 개의 y축으로 겹쳐 그리면 없는 상관관계가 보이기 때문에, 일부러 분리했다.
3월(개막)과 11월(월드시리즈)은 표본이 작아 해석에 주의
SECTION 05 — 다른 투수가 되어 돌아왔다
부상 직전 시즌(2023)과 복귀 시즌(2025)의 구종 구성을 비교했다. 2023년은 비교 기준이라 필터를 적용하지 않고, 2025년만 현재 필터로 다시 계산한다.
점의 이동이 곧 변화량 · 구종 필터에서 꺼진 구종은 흐리게 표시
읽은 것
SECTION 06 — 그래서 얼마나 잘한 건가
선수 단위 트래킹 데이터로 리그 안에서의 위치를 확인했다. 백분위 100 = 리그 1위. 이 절이 있어야 "유지했다"가 "그저 안 떨어졌다"가 아니라 "최상위를 지켰다"가 된다.
선수 단위 측정 데이터 4종 · 각 지표의 리그 표본 수는 지표 아래에 표기
경기 단위 시즌 집계 · 10선발 이상 투수들 안에서의 위치
SECTION 07 — 방법과 한계
수집 → 적재 → 정제 → 가공 → 제공
data/에 보관. 원본은 수정하지 않았다.game_type=S)와 연습경기(E, F)를 제외하고 정규시즌 · 포스트시즌만 남겼다.analyze.py가 집계값과 함께 '원자 데이터'를 data.json으로 떨어뜨린다. 필터가 동작하려면 미리 합쳐놓은 숫자가 아니라 더 이상 못 쪼개는 단위(투구 1개, 경기 1개)가 필요하다.build.py가 그 JSON을 HTML에 심는다. 필터를 바꾸면 브라우저가 그 자리에서 다시 집계한다. 서버도, 외부 차트 라이브러리도 쓰지 않는다.
필터 로직도 같은 방식으로 확인한다 — 필터를 '전체'로 두면 브라우저의 재집계 결과가
파이썬 집계값과 소수점까지 일치해야 한다. 이 페이지는 로드할 때마다 그 대조를 실행하고
결과를 브라우저 콘솔에 남긴다([필터 자기검증]).
arm_strength는 쓰지 못했다. 야수 송구만 측정하는 데이터라 투수 오타니의 기록이 아예 없다(투수 0명). 있을 것 같은 데이터가 없는 것도 결과의 일부라서 적어둔다.