스포츠 데이터 분석 포트폴리오 · MLB 2025

홈 어드밴티지는
실재하는가

배경 · 타구 궤적 26개 · 실측 발사속도와 발사각으로 계산

작성
심재훈
연락처
010-0000-0000
이메일
dyss7777@cau.ac.kr
코드
github.com
01 — 출발점

질문

야구 중계에서 "홈에서 강한 팀"이라는 말은 매일 나온다. 그런데 이 말은 두 가지 서로 다른 주장을 섞어 쓴다. 하나는 홈이라는 조건 자체가 승률을 올린다는 주장이고, 다른 하나는 그 팀이 원래 강하다는 주장이다. 앞의 것은 구장·관중·이동 피로의 문제이고, 뒤의 것은 전력의 문제다. 둘을 구분하지 않으면 "우리 구장이 특별하다"는 마케팅 문구는 근거가 없다.

이 프로젝트가 답하려는 질문 — 홈 어드밴티지는 통계적으로 실재하는가. 실재한다면 구장마다 다른가. 그 차이는 구장의 것인가, 팀의 것인가.

세 번째 질문이 핵심이다. 첫 두 개는 평균만 내면 나오지만, 세 번째는 답이 뒤집힐 수 있다. 실제로 이 분석에서도 뒤집혔다.

02 — 신뢰의 근거

데이터와 검증

MLB Stats API에서 수집된 2025시즌 4개 파일(9,435행)을 받았다. 분석에 들어가기 전 모든 컬럼의 값 범위와 이름의 의미가 일치하는지 확인했고, 네 곳에서 불일치를 발견했다.

E-1

game_id 중복

games_2025_wide.csv

고유번호라는 이름과 달리 모든 값이 완전히 같은 행이 8줄 있었다. 집계마다 이 경기들이 두 번 반영된다.

2,833행 2,829행
E-2

is_postseason 오작동

games_2025_wide.csv

평균이 0.143. 포스트시즌이 14%일 수는 없다. game_type과 교차집계하니 시범경기 345건과 올스타전까지 1로 잡혀 있었다.

404건 47건
E-3

winPercentage 문자열화

pitching_2025.csv

승·패가 모두 0인 투수 2명의 값이 .--- 로 적혀 있어, 473개의 멀쩡한 숫자까지 문자로 읽혔다.

문자열 숫자 473 + 결측 2
E-4

inningsPitched 진법 오류

pitching_2025.csv

.1은 0.1이 아니라 3분의 1이닝이다. 십진수로 더하면 이닝이 사라진다.

38,786.8이닝 38,903.0이닝

이 오류들이 결론을 바꿨는가

바꾸지 않았다. 정제 전후 차이는 소수점 두세째 자리에 머물렀다.

지표정제 전정제 후차이
홈팀 승률54.08%54.31%+0.23%p
경기당 양팀 득점9.0548.899−0.155
리그 평균자책점3.9803.968−0.012
결론이 뒤집히지 않았다는 사실은, 검산한 뒤에야 말할 수 있다. 검산 없이 같은 숫자에 도달했다면 그것은 운이다.

덧붙여, game_type == "R" 필터 하나로 Long 파일에 섞여 있던 일본 구단·마이너리그 팀 9개도 함께 걸러졌다. 필터를 언제 거는지가 뒤의 모든 집계를 좌우한다.

03 — 본론

분석

3-1. 리그 전체 — 홈 어드밴티지는 있다

정제된 2,425경기에서 홈팀은 1,317승을 거뒀다. 승률 54.31%. 동전 던지기라면 이 정도로 치우칠 확률은 이항검정 기준 p = 0.0000119, 95% 신뢰구간 하한은 52.6%다. 표본이 2,400경기가 넘어야 이 정도 차이가 우연이 아니라고 말할 수 있다.

한 시즌 162경기만 봤다면 같은 결론에 도달하지 못했을 것이다. 홈 어드밴티지는 존재하지만, 경기 단위로는 거의 감지되지 않는 크기다. 이 점이 뒤의 해석에서 계속 발목을 잡는다.

54.31%
정규시즌 홈팀 승률
2,425경기 중 1,317승
0.0000119
이항검정 p값
귀무가설 p=0.5, 단측
52.6%
95% 신뢰구간 하한
최소한 이만큼은 유리하다

3-2. 구장별로 쪼개면 이상한 그림이 나온다

구장별로 나눠 홈 승률을 세우면 순위표가 나온다. 여기까지는 누구나 만든다. 문제는 이 표를 읽는 방법이다.

Citizens Bank Park67.9%
Rogers Centre66.7%
American Family Field64.2%
Dodger Stadium64.2%
Petco Park64.2%
Wrigley Field63.3%
… 중간 18개 생략
T-Mobile Park63.0%
Yankee Stadium62.5%
Citi Field60.0%
Fenway Park59.3%
Globe Life Field59.3%
Comerica Park56.8%
Daikin Park56.8%
Great American Ball Park55.7%
Progressive Field55.6%
Busch Stadium54.3%
PNC Park54.3%
Kauffman Stadium53.1%
Chase Field53.1%
Oracle Park51.8%
George M. Steinbrenner Field50.6%
Oriole Park at Camden Yards48.1%
Angel Stadium48.1%
Truist Park48.1%
Target Field47.5%
loanDepot park46.9%
Sutter Health Park44.4%
Rate Field40.5%
Nationals Park39.5%
Coors Field30.9%
구장별 홈 승률 · 정규시즌 60경기 이상 개최 30개 구장 · 붉은 막대는 하위 4곳
쿠어스필드는 경기당 11.72점으로 30개 구장 중 득점 1위인데, 홈 승률은 30.9%로 꼴찌다. 타자 친화 구장이 홈팀에 불리하다는 결론이 나올 참이었다.

멈춰서 다른 숫자를 봤다. 로키스의 2025년 전체 승률은 26.5%였다. 이 팀은 홈에서 약한 게 아니라 그냥 약했다. 구장별 홈 승률 순위표는 구장을 재고 있지 않았다.

전체 승률과 홈 승률의 상관계수를 구하니 0.93. 사실상 같은 것을 두 번 그린 셈이다. 구장 이름을 붙여 놓았을 뿐, 이 그래프는 팀 순위표다.

3-3. 팀 전력을 상쇄하고 다시 재기

홈이라는 조건의 효과만 남기려면 같은 팀을 기준선으로 삼아야 한다. 팀별로 홈 승률에서 원정 승률을 뺀 값을 쓰면 전력이 상쇄된다. 약한 팀은 홈에서도 원정에서도 약하니, 그 차이만 남는다.

리그
지구
정렬 기준
30개 팀
팀별 홈 효과 = 홈 승률 − 원정 승률 (%p) · 팀당 162경기 · 세로선이 0 · 리그·지구·정렬 기준을 바꿔 볼 수 있습니다
+8.7%p
보정 후 평균 홈 효과
27 / 30
홈 효과가 양수인 팀
0.93 → 0.28
전체 승률과의 상관
보정 전 → 보정 후

이 지표의 평균은 +8.7%p, 중앙값은 +8.2%p. 30개 팀 중 27개 팀이 양수다. 전체 승률과의 상관은 0.93에서 0.28로 떨어졌다 — 팀 전력의 그림자가 대부분 걷혔다는 뜻이다.

이제야 구장별 이야기를 할 수 있다. 파이리츠(+21.0%p)와 메츠·레인저스(+18.5%p)는 전력과 무관하게 홈에서 확실히 다른 팀이 된다. 반대로 애슬레틱스는 −4.9%p로, 임시 구장(서터헬스파크)을 쓰는 상황과 무관해 보이지 않는다.

다만 팀당 81경기라 이 순위 자체의 불확실성은 크다. +21%p와 +18%p의 차이를 진지하게 다루면 안 된다. 말할 수 있는 것은 "대부분의 팀에서 홈 효과가 양수이며 그 크기는 대략 5~10%p"까지다.

3-4. 보정 전과 후를 겹쳐 보기

앞의 두 그래프가 말이 되려면, 보정 전과 후가 실제로 다른 그림이어야 한다. 같은 가로축(팀 전체 승률) 위에 두 지표를 각각 올려 보면 차이가 눈에 보인다.

세로축

보정 전에는 점들이 대각선 위에 거의 일직선으로 늘어선다. 전체 승률을 알면 홈 승률이 결정된다는 뜻이고, 그 그래프는 새로운 정보를 담고 있지 않다. 보정 후에는 점들이 흩어진다. 흩어졌다는 것이 좋은 신호다 — 팀 전력으로 설명되지 않는 무언가가 남았다는 뜻이니까.

3-5. 시즌 흐름 — 보이는 패턴과 실재하는 패턴

홈 어드밴티지가 시즌 내내 일정한지도 물어볼 만하다. 개막 직후에는 홈 관중이 더 많이 오고, 여름에는 원정팀의 이동 피로가 쌓인다는 이야기가 흔하다.

구분

월별로는 4월 60.4%에서 5~6월 51%대로 떨어졌다가 다시 오르는 모양이 보인다. 요일별로도 수요일과 토요일이 낮다. 패턴이 있어 보인다.

하지만 카이제곱 동질성 검정 결과 월별 p = 0.088, 요일별 p = 0.682. 둘 다 우연으로 설명 가능한 범위다.

"봄에 홈 어드밴티지가 크다"거나 "수요일엔 홈이 약하다"고 말할 근거가 없다. 월 400경기 안팎이면 승률이 ±5%p 흔들리는 것은 자연스럽다.

눈으로 보이는 패턴에 이름을 붙이고 싶은 유혹이 가장 강한 지점이 여기다. 그래프에 굴곡이 있다는 것과 그 굴곡이 실재한다는 것은 다른 이야기다. 이 프로젝트에서 검정을 붙이지 않았다면 근거 없는 결론 두 개를 더 실었을 것이다.

04 — 정리

결론

  1. 홈 어드밴티지는 실재한다. 리그 전체 54.3%, p<0.0001. 단 경기 하나로는 보이지 않고 2,000경기 이상 모아야 드러나는 크기다.
  2. 구장별 홈 승률 순위표는 홈 어드밴티지를 재지 않는다. 전체 승률과의 상관 0.93. 그것은 팀 순위표를 다르게 그린 것이다.
  3. 홈 − 원정 차이로 보정하면 평균 +8.7%p, 30팀 중 27팀이 양수. 이것이 이 데이터로 말할 수 있는 홈 효과의 크기다.
  4. 월별·요일별 차이는 확인되지 않았다. 그래프에는 굴곡이 보이지만 카이제곱 검정은 각각 p=0.088, p=0.682로 우연의 범위였다. "봄에 홈이 강하다"는 이야기는 이 데이터로 뒷받침되지 않는다.

현업에 옮긴다면

"우리 구장은 홈 승률 X%"라는 홍보 문구는 대부분 팀 성적을 다시 말한 것이다. 구단 커뮤니케이션에서 홈 효과를 주장하려면 원정 성적을 함께 제시해야 한다. 같은 논리는 KBO의 구장별 비교, 시간대별 관중 효과 분석에도 그대로 적용된다.

한계

단일 시즌이라 팀별 추정치의 신뢰구간이 넓다. 이동거리·시차·요일·선발투수 질을 통제하지 않았고, 홈 효과의 원인(관중, 심판 판정, 익숙함)은 이 데이터로 분리할 수 없다. 여러 시즌을 쌓고 혼합효과 모형으로 팀·구장·연도를 분리하는 것이 다음 단계다.

05 — 확장

선수 탐색기

앞의 분석은 경기 단위 데이터만 썼다. 선수 단위로 내려가려면 시즌 성적 파일과 트래킹 파일을 결합해야 하는데, 여기서 앞서 E-1~E-4와 같은 성격의 문제를 하나 더 만났다.

이름으로 결합하면 252행, player_id로 결합하면 251행. 차이 1행의 정체는 동명이인 Max Muncy였다. 다저스 소속(571970)과 애슬레틱스 소속(691777)이 이름이 같아, 트래킹 기록 한 세트가 두 사람에게 복제됐다.

게다가 표기 순서도 반대다. 시즌 파일은 Aaron Judge, 트래킹 파일은 Judge, Aaron. 이름으로 붙이려면 뒤집는 전처리가 먼저 필요하고, 그러고도 동명이인은 남는다. 결국 번호로 붙이는 것 외에 안전한 방법이 없다.

아래는 그렇게 결합한 결과로 만든 탐색 도구다. 타자 461명·투수 475명이 들어 있고, 트래킹 지표가 있는 선수는 251명이다.

분석 모드
리그
보기

타구 품질 화면에서 오른쪽 위로 갈수록 강하고 높이 뜬 타구다. 발사각이 지나치게 높으면 뜬공, 낮으면 땅볼이 되므로 최적 구간은 가운데 위쪽에 몰린다. 기대 성적 화면의 대각선은 실제와 기대가 일치하는 선으로, 선 아래 선수는 기대보다 손해를 본 쪽이다 — 다음 시즌 반등을 점칠 때 쓰는 관점이다.

06 — 검증 가능성

재현 방법

  • 분석 환경Python 3 · pandas · SciPy (stats.binomtest)
  • 중복 제거전체 컬럼 기준 완전 중복 8행 삭제 (2,833 → 2,829)
  • 경기 유형 필터game_type == "R" 만 사용 (2,425경기). is_postseason 컬럼은 폐기
  • 구장 최소 표본60경기 이상 개최 구장 30곳만 비교
  • 검정홈 승률 — 이항검정(단측, 귀무가설 p = 0.5) · 기간별 차이 — 카이제곱 동질성 검정
  • 보정 지표팀별 홈 승률 − 원정 승률 (Long 파일의 is_home 기준)
  • 리그·지구 구분MLB 공식 편성 기준으로 30개 구단에 직접 부여 (원본 파일에 없는 컬럼)
  • 파일 결합시즌 성적 × 트래킹 4종을 player_id로 결합 (이름 결합 시 동명이인으로 유령 행 발생)
  • 이닝 변환정수부 + 소수부÷3 으로 변환 후 ERA·K/9 재계산
  • 인터랙티브필터·산점도·추이 그래프는 순수 JS + SVG로 직접 구현 (외부 차트 라이브러리 없음)