야구 분석/Python

히트 스프레이 차트 만들어보기

sam_j_s 2024. 5. 18. 18:57
728x90
반응형

구자욱 선수의 2024 Hits Spray Chart

시각화 주제

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()

제대로 된 히트 스프레이 차트가 나오는 것을 알 수 있다.

 

23시즌 아레나도의 히트 스프레이 차트

베이스볼 서번트에서 나오는 히트 스프레이 차트와 똑같은 것을 볼 수 있고 위의 사진처럼 타구 데이터의 테두리도 추가해 주었습니다.

다음번에는 뒤에 야구장 이미지도 추가해 주겠습니다.

반응형

'야구 분석/Python'의 다른글

  • 현재글 히트 스프레이 차트 만들어보기

관련글