야구 분석/Python

24시즌 KBO 관중 수 시각화

sam_j_s 2024. 5. 29. 13:49
728x90
반응형

시각화 주제

2024 KBO 리그가 10개 구단 체재 출범 이후 최다 매진 경기 신기록을 세울 정도로 많은 팬분들이 야구장을 향하고 있습니다. 

 

올해 프로야구의 열기는 개막전 모든 경기가 매진되면서부터 알 수 있었습니다. 2024 시즌이 개막한 3월 23일부터 5월 26일까지 얼마나 많은 팬들이 야구장을 왔는지 확인해 보겠습니다.

 

관중 수 크롤링 하기

KBO의 관중 수는 KBO 공식 사이트에서 확인할 수 있습니다. 

 

시각화

필요한 패키지 임포트

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mlp
import seaborn as sns
import requests
from bs4 import BeautifulSoup
import plotly.express as px

 

KBO 사이트 구조 확인하기

%matplotlib inline
# 한글 폰트 설정
plt.rcParams['font.family'] = 'NanumGothic'

req = requests.get('https://www.koreabaseball.com/Record/Crowd/GraphDaily.aspx')
soup = BeautifulSoup(req.text, 'html.parser')
soup

우리가 원하는 데이터인 관중수는 tData라는 table안에 있다는 것을 볼 수 있습니다.

 

그럼 이제 table 안에 있는 데이터들을 가져오겠습니다.

# class 이름이 tData인 table을 가져옵니다
tdata = soup.find('table', {'class': 'tData'})


# table에서 tbody를 찾습니다
series = tdata.find('tbody')


# 객체가 아닌 string 형태로 담아줍니다
kbdata_spec = series.text
kbdata_spec

tbody에 있는 데이터들이 관중 수를 잘 가지고 있는 것을 확인했고 이제 이것을 데이터 프레임으로 만들어 주겠습니다.

# tr 태그를 찾습니다.
table_rows = tdata.find_all('tr')

# res라는 list에 row 별로 담아줍니다
res = []
for tr in table_rows:
    td = tr.find_all('td')
    row = [tr.text.strip() for tr in td if tr.text.strip()]
    if row:
        res.append(row)
        
# DataFrame으로 만들어 줍니다
df = pd.DataFrame(res, columns=["date", "day", "team_1", "team_2", 'place', 'number'])

# 첫 줄은 드롭합니다.
df = df.drop(0)
df

3월 23일부터 5월 28일까지 총 265 경기가 치러진 것을 알 수 있습니다. 그럼 이제 시각화를 하기 전에 date가 yyyy/mm/dd로 되어 있는 것을 yyyy-mm-dd로 바꿔주고 number에 콤마를 제거해 주겠습니다.

# 콤마 제거
df['number'] = df['number'].str.replace(',', '')

# datetime type으로 변환
df['date'] = pd.to_datetime(df['date'])

# 날짜 column을 분리
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['day'] = df['date'].dt.day
df['dayofweek'] = df['date'].dt.dayofweek
df

그래프 그리기

우선 월별 관객수를 비교해 보겠습니다.

# 월별 'number'의 합계를 계산하여 데이터프레임으로 변환
df_grouped = df.groupby('month')['number'].sum().reset_index()

# plotly를 사용하여 막대 그래프 생성
fig = px.bar(df_grouped, x='month', y='number', labels={'month':'월', 'number':'관객수'}, 
		title='월별 관객수')

# 그래프 표시
fig.show()

3월은 2024 시즌이 23일부터 시작해 8 경기만 해서 적습니다. 5월은 아직 경기가 남아있는데 4월보다 관중 수 가 더 많은 것을 알 수 있습니다.

 

이제 구장별로 관중 수를 확인해보겠습니다.

# 'place' 별로 'number'의 합계를 계산
place_grouped = df.groupby('place')['number'].sum().reset_index()

# plotly를 사용하여 막대 그래프 생성
fig = px.bar(place_grouped, x='place', y='number', labels={'place':'구장', 'number':'관객수'}, 
		title='구장별 관객수')

# 그래프 표시
fig.show()

잠실은 두산과 엘지가 구장을 같이 써서 관중 수가 다른 구장과 2배 이상 차이 나는 것을 알 수 있습니다. 광주, 사직, 문학, 대구, 대전, 창원, 고척, 수원 순으로 팬분들이 많이 온 것을 알 수 있습니다.

 

마지막으로 요일별로 어느 날 팬들이 많이 오는지 확인해 보겠습니다.

# 'dayofweek' 별로 'number'의 합계를 계산
dayofweek_grouped = df.groupby('dayofweek')['number'].sum().reset_index()

# 요일 이름으로 변환
day_names = {0: '월요일', 1: '화요일', 2: '수요일', 3: '목요일', 4: '금요일',
		5: '토요일', 6: '일요일'}
dayofweek_grouped['dayofweek'] = dayofweek_grouped['dayofweek'].map(day_names)

# plotly를 사용하여 막대 그래프 생성
fig = px.bar(dayofweek_grouped, x='dayofweek', y='number',
	labels={'dayofweek':'요일', 'number':'관객수'}, title='요일별 관객수')

# 그래프 표시
fig.show()

주중 시리즈인 화요일, 수요일, 목요일에는 50만 명 정도 온 것을 볼 수 있고 주말 시리즈인 금요일, 토요일, 일요일에는 73만 명 정도씩 온 것을 알 수 있습니다.

 

다음에는 삼성라이온즈의 22 시즌부터 현재까지 관중 수를 비교해 보겠습니다. 

반응형

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

  • 현재글 24시즌 KBO 관중 수 시각화

관련글