시각화 주제
KBO나 MLB의 선수 기록을 확인하는 사이트인 스탯티즈나 베이스볼 서번트에서 타자의 기록을 확인할 때마다 나오는 히트 스프레이 차트가 있습니다. 타자의 안타, 2루타, 3루타, 홈런을 각각 다른 색의 점으로 표현해 공이 야구장의 어느 곳으로 떨어졌는지 알 수 있습니다. 그래서 이걸 직접 만들어 볼 수 있을까 궁금해서 한번 시도해 보았습니다.
데이터 출처
메이저리그 데이터를 분석하기 위해 개발된 오픈 소스 라이브러리인 pybaseball을 사용했습니다. 이 라이브러리는 주로 여러 공개 데이터 소스에서 정보를 수집하며, 이 데이터는 Retrosheet, Baseball Savant, Fangraphs 등과 같은 웹사이트에서 제공됩니다.
데이터 시각화
패키지 설치 및 임포트
!pip install pybaseball
import pybaseball
import pandas as pd
import plotly.graph_objects as go
선수 데이터 불러오기
pybaseball에서 아레나도 선수의 id를 찾은 후 히트 스프레이 차트를 그려보게습니다.
from pybaseball import playerid_lookup
# 선수의 성(last)과 이름(first)을 이용해 검색
player_info = playerid_lookup('arenado', 'nolan')
print(player_info)
id가 571448인 것을 확인했고 23 시즌에 해당하는 값들만 가져오겠습니다.
import pybaseball
# 특정 선수의 2023년 시즌 타구 데이터 가져오기
data = pybaseball.statcast_batter('2023-01-01', '2023-12-31', player_id='571448')
data
2346 X 94로 매우 많은 데이터가 있다는 것을 알 수 있습니다.
스프레이 차트 만들기
가져온 데이터 중 안타, 2루타, 3루타, 홈런이 몇 개나 있었는지 출력해 보겠습니다.
import pandas as pd
# 필요한 데이터 필터링
hits_data = data[data['events'].isin(['single', 'double', 'triple', 'home_run'])]
# 각 타구 결과별 개수 계산
hit_counts = hits_data['events'].value_counts()
# 개수 출력
print("Single hits: ", hit_counts.get('single', 0))
print("Double hits: ", hit_counts.get('double', 0))
print("Triple hits: ", hit_counts.get('triple', 0))
print("Home runs: ", hit_counts.get('home_run', 0))
안타가 102개 2루타가 28개 3루타가 2개 홈런이 28개 인 것을 확인했고 이것을 그려보겠습니다.
import plotly.graph_objects as go
# 필요한 데이터 필터링
hits_data = data[data['events'].isin(['single', 'double', 'triple', 'home_run'])]
# 그래프 객체 생성
fig = go.Figure()
# 타구 결과별로 데이터 추가
for hit_type, color in zip(['single', 'double', 'triple', 'home_run'], ['blue', 'orange', 'green', 'red']):
subset = hits_data[hits_data['events'] == hit_type]
fig.add_trace(go.Scatter(x=subset['hc_x'], y=subset['hc_y'], mode='markers',
marker=dict(size=12, color=color), name=hit_type))
# 레이아웃 설정
fig.update_layout(
title="Baseball Hits Spray Chart",
xaxis=dict(title='Horizontal Coordinate', showgrid=False, zeroline=False),
yaxis=dict(title='Vertical Coordinate', showgrid=False, zeroline=False, scaleanchor="x", scaleratio=1),
showlegend=True,
plot_bgcolor='white',
width=700, # 그래프 크기 설정 (정사각형 형태)
height=700
)
# 그래프 표시
fig.show()
히트 스프레이 차트를 만들었는데 반대로 되어있는 것을 알 수 있습니다. Y축 반전을 시켜 제대로 보이도록 해주겠습니다.
# 레이아웃 설정
fig.update_layout(
title="Baseball Hits Spray Chart",
xaxis=dict(title='Horizontal Coordinate', showgrid=False, zeroline=False),
yaxis=dict(title='Vertical Coordinate', showgrid=False, zeroline=False, autorange='reversed', scaleanchor="x", scaleratio=1),
showlegend=True,
plot_bgcolor='white',
width=700, # 그래프 크기 설정 (정사각형 형태)
height=700
)
# 그래프 표시
fig.show()
제대로 된 히트 스프레이 차트가 나오는 것을 알 수 있다.
베이스볼 서번트에서 나오는 히트 스프레이 차트와 똑같은 것을 볼 수 있고 위의 사진처럼 타구 데이터의 테두리도 추가해 주었습니다.
다음번에는 뒤에 야구장 이미지도 추가해 주겠습니다.
'야구 분석 > Python' 카테고리의 다른 글
타율이 높은 선수는 홈런도 많이 칠까? 2023 시즌 데이터로 본 상관관계 (0) | 2024.05.25 |
---|---|
히트 스프레이 차트에 야구장 사진 넣어보기 (0) | 2024.05.22 |
놀란 아레나도 수비 지표 분석 (0) | 2024.05.15 |
24시즌 오타니와 베츠의 성적 비교 (0) | 2024.05.11 |
2023시즌 메이저리그 팀 순위 변화 (2) | 2024.05.08 |