야구 분석/Python

삼성 라이온즈 관중 수 시각화

sam_j_s 2024. 6. 5. 02:39
728x90
반응형

주제

 

삼성 라이온즈 관중 수 크롤링

주제저번에 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'의 다른글

  • 현재글 삼성 라이온즈 관중 수 시각화

관련글