스포츠 데이터 분석 포트폴리오 · 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로 직접 구현 (외부 차트 라이브러리 없음)