스포츠 분석 (Sports Analytics)¶
1. 개요¶
스포츠 분석은 선수 성과, 팀 전략, 비즈니스 운영을 최적화하기 위해 경기 및 선수 데이터를 분석하는 분야.
정의¶
스포츠 분석의 영역¶
| 영역 | 질문 |
|---|---|
| 성과 분석 | 선수가 얼마나 잘했는가? |
| 전술 분석 | 어떤 전략이 효과적인가? |
| 선수 평가 | 선수의 가치는? |
| 부상 분석 | 부상 위험은? |
| 비즈니스 | 수익 최적화는? |
2. 핵심 지표¶
2.1 야구 (Baseball)¶
| 지표 | 수식 | 설명 |
|---|---|---|
| WAR | Wins Above Replacement | 대체 선수 대비 승리 기여 |
| wOBA | Weighted On-Base Average | 가중 출루율 |
| ERA+ | (lgERA/ERA) × 100 | 조정 방어율 |
| FIP | (HR×13 + BB×3 - K×2) / IP + 상수 | 수비 무관 투구 성과 |
| OPS+ | (OBP/lgOBP + SLG/lgSLG - 1) × 100 | 조정 OPS |
2.2 축구 (Soccer)¶
| 지표 | 설명 |
|---|---|
| xG (Expected Goals) | 슈팅의 기대 득점 |
| xA (Expected Assists) | 패스의 기대 어시스트 |
| PPDA | 압박 강도 |
| Progressive Passes | 전진 패스 |
| Key Passes | 슈팅 기회 창출 패스 |
xG 모델:
2.3 농구 (Basketball)¶
| 지표 | 설명 |
|---|---|
| PER | Player Efficiency Rating |
| TS% | True Shooting % |
| BPM | Box Plus/Minus |
| VORP | Value Over Replacement Player |
| +/- | Plus/Minus |
Advanced Stats:
3. 주요 분석 방법¶
3.1 선수 성과 평가¶
포괄적 가치 지표:
역할별 분석:
3.2 전술 분석¶
스페이셜 분석:
이벤트 분석:
3.3 선수 영입/평가¶
Market Value 모델:
스카우팅 분석:
3.4 부상 분석¶
부상 예측 모델:
Load Management:
3.5 실시간 분석¶
4. 실무 적용 사례¶
4.1 Moneyball (Oakland A's)¶
4.2 Liverpool FC - xG 활용¶
데이터 기반 선수 영입:
- xG 기반 공격수 평가
- Mohamed Salah, Sadio Mane 영입
- 데이터 + 스카우팅 결합
결과: Premier League, UCL 우승
4.3 NBA - 3점 혁명¶
4.4 부상 관리¶
5. 참고 자료¶
핵심 서적¶
| 서적 | 저자 | 주제 |
|---|---|---|
| "Moneyball" | Michael Lewis | 야구 분석 |
| "The Numbers Game" | Anderson & Sally | 축구 분석 |
| "Basketball on Paper" | Dean Oliver | 농구 분석 |
| "Soccermatics" | David Sumpter | 수학적 축구 분석 |
주요 저널¶
| 저널 | 분야 |
|---|---|
| Journal of Quantitative Analysis in Sports | 스포츠 통계 |
| MIT Sloan Sports Analytics Conference | 학회 |
| ESPN Analytics | 업계 연구 |
6. 도구¶
| 도구 | 용도 |
|---|---|
| StatsBomb | 축구 이벤트 데이터 |
| Opta | 축구 데이터 |
| Second Spectrum | NBA 추적 데이터 |
| Statcast | MLB 추적 데이터 |
| Python (pybaseball) | 야구 데이터 분석 |
데이터 소스¶
| 소스 | 스포츠 |
|---|---|
| FBref | 축구 통계 |
| Baseball Reference | 야구 통계 |
| Basketball Reference | 농구 통계 |
| Understat | xG 데이터 |
Python 스포츠 분석 예시¶
# 야구 WAR 근사 계산
def calculate_batting_war(df):
# 가중 출루율
woba = (0.69*df['BB'] + 0.72*df['HBP'] + 0.89*df['1B'] +
1.27*df['2B'] + 1.62*df['3B'] + 2.10*df['HR']) / df['PA']
# wRAA (리그 평균 대비 생산)
woba_scale = 1.15
wRAA = ((woba - 0.320) / woba_scale) * df['PA']
# WAR 근사
runs_per_win = 10
war = wRAA / runs_per_win
return war
# 축구 xG 모델
from sklearn.ensemble import RandomForestClassifier
def train_xg_model(shots_df):
features = ['distance', 'angle', 'body_part', 'assist_type',
'game_state', 'is_counter']
X = shots_df[features]
y = shots_df['is_goal']
model = RandomForestClassifier()
model.fit(X, y)
return model