주제
삼성 라이온즈 관중 수 크롤링
주제저번에 KBO 공식 사이트에서 2024 시즌 관중 수 크롤링을 해 보았습니다.2024.05.29 - [취미] - 24시즌 KBO 관중 수 시각화 24시즌 KBO 관중 수 시각화시각화 주제2024 KBO 리그가 10개 구단 체재 출범 이
bbdiary03.tistory.com
저번에 삼성 라이온즈의 2022 시즌부터 2024 시즌 5월까지의 관중 수 데이터를 크롤링해 보았습니다.
이번에는 크롤링 한 데이터를 시각화해 보도록 하겠습니다.
시각화
필요한 패키지 임포트
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
데이터 불러오기
# CSV 파일 불러오기
data_2022 = pd.read_csv('2022_samsung_crowd_data.csv')
data_2023 = pd.read_csv('2023_samsung_crowd_data.csv')
data_2024 = pd.read_csv('2024_samsung_crowd_data.csv')
월별 관중 수 시각화
우선 2022 시즌 관중 수를 월별로 비교해 보도록 하겠습니다.
# 데이터 정리 함수
def clean_data(data, year):
# 첫 번째 요약 행 및 NaN 행 제거
data_cleaned = data.dropna().reset_index(drop=True)
# 'Year' 열 추가
data_cleaned['Year'] = year
# '관중수' 열을 숫자형으로 변환
data_cleaned['관중수'] = data_cleaned['관중수'].str.replace(',', '').astype(int)
return data_cleaned
# 2022년 데이터 정리
data_2022_cleaned = clean_data(data_2022, 2022)
# '날짜' 열을 datetime 형식으로 변환
data_2022_cleaned['날짜'] = pd.to_datetime(data_2022_cleaned['날짜'], format='%Y/%m/%d')
# '날짜' 열에서 월 추출하여 'Month' 열 추가
data_2022_cleaned['Month'] = data_2022_cleaned['날짜'].dt.month
# 월별로 데이터 집계
data_2022_monthly = data_2022_cleaned.groupby('Month')['관중수'].sum().reset_index()
# Plotly를 사용하여 데이터 시각화
fig_2022 = px.bar(data_2022_monthly, x='Month', y='관중수',
labels={'관중수': '관중 수', 'Month': '월'},
title='2022년 월별 삼성 관중 수')
# 그래프 표시
fig_2022.show()
10월은 중간에 시즌이 끝나 경기가 얼마 없어 관중 수 가 적은 것을 볼 수 있습니다. 10월을 제외하고는 5월 달이 가장 많고 7월은 올스타 브레이크로 인해 1주일 정도 휴식이 있어 관중 수가 적은 것을 알 수 있습니다.
그럼 2023 시즌 관중 수를 비교해 보겠습니다.
# 데이터 정리 함수
def clean_data(data, year):
# 첫 번째 요약 행 및 NaN 행 제거
data_cleaned = data.dropna().reset_index(drop=True)
# 'Year' 열 추가
data_cleaned['Year'] = year
# '관중수' 열을 숫자형으로 변환
data_cleaned['관중수'] = data_cleaned['관중수'].str.replace(',', '').astype(int)
return data_cleaned
# 2023년 데이터 정리
data_2023_cleaned = clean_data(data_2023, 2023)
# '날짜' 열을 datetime 형식으로 변환
data_2023_cleaned['날짜'] = pd.to_datetime(data_2023_cleaned['날짜'], format='%Y/%m/%d')
# '날짜' 열에서 월 추출하여 'Month' 열 추가
data_2023_cleaned['Month'] = data_2023_cleaned['날짜'].dt.month
# 월별로 데이터 집계
data_2023_monthly = data_2023_cleaned.groupby('Month')['관중수'].sum().reset_index()
# Plotly를 사용하여 데이터 시각화
fig_2023 = px.bar(data_2023_monthly, x='Month', y='관중수',
labels={'관중수': '관중 수', 'Month': '월'},
title='2023년 월별 삼성 관중 수')
# 그래프 표시
fig_2023.show()
23 시즌도 22 시즌보다는 관중 수가 많아졌지만 7월과 10월이 다른 달보다 적은 것을 알 수 있습니다.
마지막으로 24 시즌 관중 수를 비교해 보겠습니다.
# 데이터 정리 함수
def clean_data(data, year):
# 첫 번째 요약 행 및 NaN 행 제거
data_cleaned = data.dropna().reset_index(drop=True)
# 'Year' 열 추가
data_cleaned['Year'] = year
# '관중수' 열을 숫자형으로 변환
data_cleaned['관중수'] = data_cleaned['관중수'].str.replace(',', '').astype(int)
return data_cleaned
# 2024년 데이터 정리
data_2024_cleaned = clean_data(data_2024, 2024)
# '날짜' 열을 datetime 형식으로 변환
data_2024_cleaned['날짜'] = pd.to_datetime(data_2024_cleaned['날짜'], format='%Y/%m/%d')
# '날짜' 열에서 월 추출하여 'Month' 열 추가
data_2024_cleaned['Month'] = data_2024_cleaned['날짜'].dt.month
# 월별로 데이터 집계
data_2024_monthly = data_2024_cleaned.groupby('Month')['관중수'].sum().reset_index()
# Plotly를 사용하여 데이터 시각화
fig_2024 = px.bar(data_2024_monthly, x='Month', y='관중수',
labels={'관중수': '관중 수', 'Month': '월'},
title='2024년 월별 삼성 관중 수')
# 그래프 표시
fig_2024.show()
24 시즌은 현재 진행 중이라 얼마나 변동이 있을지는 시즌이 끝나면 알 수 있을 것 같습니다.
5월까지 관중 수 비교해 보기
5월까지 관중 수는 얼마나 차이가 날지 비교해 보겠습니다.
# 데이터 정리 함수
def clean_data(data, year):
# 첫 번째 요약 행 및 NaN 행 제거
data_cleaned = data.dropna().reset_index(drop=True)
# 'Year' 열 추가
data_cleaned['Year'] = year
# '관중수' 열을 숫자형으로 변환
data_cleaned['관중수'] = data_cleaned['관중수'].str.replace(',', '').astype(int)
return data_cleaned
# 각 년도 데이터 정리
data_2022_cleaned = clean_data(data_2022, 2022)
data_2023_cleaned = clean_data(data_2023, 2023)
data_2024_cleaned = clean_data(data_2024, 2024)
# '날짜' 열을 datetime 형식으로 변환
data_2022_cleaned['날짜'] = pd.to_datetime(data_2022_cleaned['날짜'], format='%Y/%m/%d')
data_2023_cleaned['날짜'] = pd.to_datetime(data_2023_cleaned['날짜'], format='%Y/%m/%d')
data_2024_cleaned['날짜'] = pd.to_datetime(data_2024_cleaned['날짜'], format='%Y/%m/%d')
# '날짜' 열에서 월 추출하여 'Month' 열 추가
data_2022_cleaned['Month'] = data_2022_cleaned['날짜'].dt.month
data_2023_cleaned['Month'] = data_2023_cleaned['날짜'].dt.month
data_2024_cleaned['Month'] = data_2024_cleaned['날짜'].dt.month
# 5월까지만 데이터 필터링
data_2022_filtered = data_2022_cleaned[data_2022_cleaned['Month'] <= 5]
data_2023_filtered = data_2023_cleaned[data_2023_cleaned['Month'] <= 5]
data_2024_filtered = data_2024_cleaned[data_2024_cleaned['Month'] <= 5]
# 월별로 데이터 집계
data_2022_monthly = data_2022_filtered.groupby('Month')['관중수'].sum().reset_index()
data_2023_monthly = data_2023_filtered.groupby('Month')['관중수'].sum().reset_index()
data_2024_monthly = data_2024_filtered.groupby('Month')['관중수'].sum().reset_index()
# 연도별로 데이터프레임 병합
data_2022_monthly['Year'] = 2022
data_2023_monthly['Year'] = 2023
data_2024_monthly['Year'] = 2024
# 데이터 통합
combined_data = pd.concat([data_2022_monthly, data_2023_monthly, data_2024_monthly],
ignore_index=True)
# Plotly를 사용하여 데이터 시각화 (grouped bar chart 형식으로 변경)
fig = go.Figure()
fig.add_trace(go.Bar(x=data_2022_monthly['Month'], y=data_2022_monthly['관중수'],
name='2022', marker_color='blue'))
fig.add_trace(go.Bar(x=data_2023_monthly['Month'], y=data_2023_monthly['관중수'],
name='2023', marker_color='orange'))
fig.add_trace(go.Bar(x=data_2024_monthly['Month'], y=data_2024_monthly['관중수'],
name='2024', marker_color='pink'))
# 레이아웃 설정
fig.update_layout(
title='2022년, 2023년, 2024년 5월까지 월별 삼성 관중 수 비교',
xaxis=dict(title='월'),
yaxis=dict(title='관중 수'),
barmode='group'
)
# 그래프 표시
fig.show()
4월과 5월을 비교해 보았을 때 22 시즌과 23 시즌보다 24 시즌의 관중 수가 많은 것을 볼 수 있습니다.
요일 별 관중 수 시각화
달 별로 관중 수를 확인해 보았으니 이번에는 요일 별로 비교해 보겠습니다. 우선 22 시즌부터 보겠습니다.
# 데이터 정리 함수
def clean_data(data, year):
# 첫 번째 요약 행 및 NaN 행 제거
data_cleaned = data.dropna().reset_index(drop=True)
# 'Year' 열 추가
data_cleaned['Year'] = year
# '관중수' 열을 숫자형으로 변환
data_cleaned['관중수'] = data_cleaned['관중수'].str.replace(',', '').astype(int)
return data_cleaned
# 2022년 데이터 정리
data_2022_cleaned = clean_data(data_2022, 2022)
# 요일별로 데이터 집계
data_2022_weekly = data_2022_cleaned.groupby('요일')['관중수'].sum().reset_index()
# 요일 정렬을 위한 순서 설정
weekday_order = ['월', '화', '수', '목', '금', '토', '일']
data_2022_weekly['요일'] = pd.Categorical(data_2022_weekly['요일'], categories=weekday_order,
ordered=True)
data_2022_weekly = data_2022_weekly.sort_values('요일')
# Plotly를 사용하여 데이터 시각화
fig = px.bar(data_2022_weekly, x='요일', y='관중수',
labels={'관중수': '관중 수', '요일': '요일'},
title='2022년 요일별 삼성 관중 수 비교')
# 그래프 표시
fig.show()
토요일에 관중 수가 확실히 많은 것을 알 수 있습니다.
똑같은 방식으로 23 시즌과 24 시즌도 가져와보겠습니다.
23 시즌에는 월요일 경기도 있어서 월요일에도 관중 수가 나오는 것을 볼 수 있고 23 시즌과 24 시즌 모두 토요일이 관중 수가 가장 많지만 24 시즌에는 금요일과 일요일도 많은 관중이 있는 것을 볼 수 있습니다.
특정 기간 시각화
22 시즌에는 6월 30일부터 7월 23일까지 13연패라는 불명예 기록이 있었습니다. 이때의 관중 수를 비교해 보겠습니다.
# 데이터 정리 함수
def clean_data(data, year):
# 첫 번째 요약 행 및 NaN 행 제거
data_cleaned = data.dropna().reset_index(drop=True)
# 'Year' 열 추가
data_cleaned['Year'] = year
# '관중수' 열을 숫자형으로 변환
data_cleaned['관중수'] = data_cleaned['관중수'].str.replace(',', '').astype(int)
return data_cleaned
# 2022년 데이터 정리
data_2022_cleaned = clean_data(data_2022, 2022)
# '날짜' 열을 datetime 형식으로 변환
data_2022_cleaned['날짜'] = pd.to_datetime(data_2022_cleaned['날짜'], format='%Y/%m/%d')
# 특정 기간 (2022년 6월 30일 ~ 7월 24일) 데이터 필터링
start_date = '2022-06-30'
end_date = '2022-07-24'
data_filtered = data_2022_cleaned[(data_2022_cleaned['날짜'] >= start_date) &
(data_2022_cleaned['날짜'] <= end_date)]
# 데이터 집계 (날짜별 관중 수 합계) 및 관중 수가 0인 날 제거
data_filtered_daily = data_filtered.groupby('날짜')['관중수'].sum().reset_index()
data_filtered_daily = data_filtered_daily[data_filtered_daily['관중수'] > 0]
# 날짜 형식을 월/일로 변환
data_filtered_daily['날짜'] = data_filtered_daily['날짜'].dt.strftime('%m/%d')
# Plotly를 사용하여 데이터 시각화
fig = px.bar(data_filtered_daily, x='날짜', y='관중수',
labels={'관중수': '관중 수', '날짜': '날짜'},
title='2022년 6월 30일 ~ 7월 24일 관중 수 비교')
# 그래프 표시
fig.show()
성적이 좋지 않아 주말을 제외하면 5천 명 정도의 관중 수가 나오는 것을 알 수 있습니다.
'야구 분석 > Python' 카테고리의 다른 글
메이저리그 선수들의 WAR 예측하기 1 (0) | 2024.06.30 |
---|---|
삼성 라이온즈 성적 크롤링하기 (1) | 2024.06.09 |
삼성 라이온즈 관중 수 크롤링 (0) | 2024.06.01 |
24시즌 KBO 관중 수 시각화 (0) | 2024.05.29 |
타율이 높은 선수는 홈런도 많이 칠까? 2023 시즌 데이터로 본 상관관계 (0) | 2024.05.25 |