파이썬 야구 데이터 분석 - paisseon yagu deiteo bunseog

오래 전 아주 어렸을 때부터 야구를 좋아했었고, 중학생 시절부터 야구에 관련된 직업을 가지겠다는 꿈을 가졌다.

Python부터 머신러닝까지 데이터 분석 기법들을 배우기 시작한 계기도 야구 데이터에 관심을 크게 가졌기 때문이다.

평소부터 야구데이터를 다뤄보고 싶었지만, 스탯캐스트가 공개된 2016년부터 너무 많은 시간이 흘렀다.

좀 더 배우고, 좀 더 깊게 데이터를 다루고 싶은 마음때문에 이것저것 건드려보았지만,

결국 내가 제일 즐거웠던 건 빅콘테스트 퓨처스리그 때 팀 별 잔여경기 승률을 맞추는 문제였다.

지금이라도 MLB 스탯캐스트에 공개된 데이터를 가지고 이것저것 개인적인 호기심을 풀어보려고 한다.

부족하더라도 조금씩 조금씩 직접 데이터를 다루며 배워가보려고 한다.

본인의 Github :

https://github.com/JeongMinHyeok/Handling_MLB_Statcast

JeongMinHyeok/Handling_MLB_Statcast

Contribute to JeongMinHyeok/Handling_MLB_Statcast development by creating an account on GitHub.

github.com

파이썬 야구 데이터 분석 - paisseon yagu deiteo bunseog

최근 타격에서 흔히 강조하는 지표들이 있다. 그중 하나가 타구의 속도와 발사각이다.

발사각을 높이기 위해 선수들은 어퍼스윙을 연습하고, MLB에서는 대부분의 선수들이 팔꿈치를 높게드는 어퍼스윙을 한다.

공을 최대한 세게 때리고, 공을 최대한 높게 띄우는 것이 정말로 홈런에 영향이 있을까?

오늘은 지표를 하나하나씩 살펴보기보다는, 타구속도(EV)와 관련된 지표들을 둘러볼 겸,

2021년 현재 (6월 23일) 기준의 올해 기록들만을 가지고 각 지표들과 홈런 개수 간의 상관관계를 살펴보았다.


홈런과 EV관련 지표들과의 상관관계 분석

Exit Velocity (EV)?

  • 타자가 타격한 직후 공의 속도 측정
  • 모든 타격 (아웃, 안타, 오류 등)에 대해 추적
  • 높은 EV는 수비의 반응할 시간을 비교적 적게 하므로 안타확률 높음

칼럼 설명

  • attempts : 타구이벤트가 발생한 타석 수 (BBE)
  • avg_hit_angle : 평균 타구발사각
  • anglesweetspotpercent : 발사각도가 8도에서 32도 사이인 타구의 비율
  • max_hit_speed : 최고 타구속도
  • avg_hit_speed : 평균 타구속도
  • fbld(FD/LD) : 뜬공과 라인드라이브 타구의 평균 타구속도
  • gb : 땅볼 타구의 평균 타구속도
  • max_distance : 최장 타구거리
  • avg_distance : 평균 타구거리
  • avg_hr_distance : 평균 홈런타구거리
  • ev95plust : HardHit(타구속도 95마일 이상) 개수
  • ev95per-swing : 스윙 당 HardHit 비율
  • ev95percent : HardHit 비율
  • barrels : 배럴타구를 만들어낸 횟수
  • brl_percent : BBE 당 배럴타구 비율
  • brl_pa : 타석 당 배럴타구 비율
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns

데이터 확인

  • ev_df : Exit_velocity 관련 지표들의 데이터프레임
  • hr_df : 홈런 개수가 기록된 데이터프레임
ev_df = pd.read_csv('./data/exit_velocity.csv')
hr_df = pd.read_csv('./data/stats.csv')
ev_df.head()
파이썬 야구 데이터 분석 - paisseon yagu deiteo bunseog
hr_df.head()
파이썬 야구 데이터 분석 - paisseon yagu deiteo bunseog
ev_df.describe()
파이썬 야구 데이터 분석 - paisseon yagu deiteo bunseog
hr_df.describe()
파이썬 야구 데이터 분석 - paisseon yagu deiteo bunseog

필요없는 칼럼제거 (player_id와 홈런 갯수만 사용)

  • player_id는 ev_df와 merge하기 위한 key로 남겨둠
hr_df = hr_df.drop(['Unnamed: 5', 'last_name', ' first_name', 'year'], axis=1)
hr_df.columns

>>>
Index(['player_id', 'b_home_run'], dtype='object')

ev_df와 hr_df merge

ev_hr = pd.merge(ev_df, hr_df, how = 'outer', on='player_id')
ev_hr.head()
파이썬 야구 데이터 분석 - paisseon yagu deiteo bunseog

결측치 제거

ev_hr = ev_hr.dropna()

player_id 데이터 타입변경

  • 상관관계분석에 포함되지 않게 하기 위함
ev_hr['player_id'] = ev_hr['player_id'].astype({'player_id' : 'str'})
ev_hr.dtypes

>>>
last_name                 object
 first_name               object
player_id                 object
attempts                 float64
avg_hit_angle            float64
anglesweetspotpercent    float64
max_hit_speed            float64
avg_hit_speed            float64
fbld                     float64
gb                       float64
max_distance             float64
avg_distance             float64
avg_hr_distance          float64
ev95plus                 float64
ev95per-swing            float64
ev95percent              float64
barrels                  float64
brl_percent              float64
brl_pa                   float64
b_home_run                 int64
dtype: object

상관관계 분석

  • EV 지표들과 홈런개수와의 상관계수
  • 상관계수가 0.4이상인 것만 히트맵에 표시
  • Barrels(타구속도와 발사각도가 완벽하게 조합된 타구)과 관련된 지표가 높은 상관관계 보임
  • fbld(플라이볼과 라인드라이브타구속도), ev95percent(95마일이상 타구속도 비율)도 눈여겨 볼 만함
corrmat = ev_hr.corr()
corr_columns = corrmat.index[abs(corrmat["b_home_run"])>=0.4]
plt.figure(figsize=(13,10))
heatmap = sns.heatmap(ev_hr[corr_columns].corr(), annot=True, cmap="RdYlGn")
파이썬 야구 데이터 분석 - paisseon yagu deiteo bunseog