기타/개인,팀프로젝트

250819_실증 데이터로 전처리 연습하기 (24년도 어린이대공원 일일 입장객수)

baektree 2025. 8. 19. 21:31

전처리를 학습하면서 관련 코드를 체화할 수 있는 가장 빠른 방법은 실제 데이터로 실습하는 것이라 한다.

그래서 24년도 서울어린이대공원 일일 이용객수 현황으로 전처리를 실습해 보았다. (출처: 공공데이터포털)

해당 데이터를 고른 이유는 어린이 대공원을 자주 가보기도 했고, 데이터 현황이 궁금하기도해서이다.

 

나의 전처리 목표는 두가지 

1. 평균 어느 요일에 입장객이 몰릴까?
2. 어느 월에 입장객이 가장 많을까?  

 

이를 확인하기 위해 강의를 통해 배운 코드를 적용해보았다. 

 


 

1. 관련 라이브러리 import, 데이터 불러오기

# 데이터 분석을 위해 관련 라이브러리 불러오기 
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# 한글폰트 설정
plt.rc("font", family="Malgun Gothic")
plt.rc("axes", unicode_minus=False)

# 폰트가 선명하게 보이도록 retina 설정 -- 고해상도 출력 포맷 옵션
from matplotlib_inline.backend_inline import set_matplotlib_formats
set_matplotlib_formats("retina")

# 파일 불러오기
#해당 파일은 CP949 인코딩으로 저장
#그러나 파이썬은 기본적으로 UTF-8으로 파일을 읽음 (파일의 실제 인코딩 != 파이썬에서 읽어오는 디폴트 인코딩)
#따라서 매개변수에 cp949로 읽으라고 지정
path = "data\서울시설공단_서울어린이대공원 일별 이용객수 현황_20241231.csv" 
df = pd.read_csv(path, encoding="cp949")
df.shape
  • 인코딩은 사람이 읽는 문자를 컴퓨터가 이해하는 숫자(바이트)로 변환하는 과정이다.
  • 해당 파일은 공공데이터.csv로 보통 인코딩 방식이 cp949라고 한다. 
  • 하지만 파이썬의 소스 코드 파일의 디폴트 인코딩은 utf-8이다. 
  • 따라서 pandas.read_csv()로 파일을 불러올 때, encoding = cp949 이라는 매개변수를 지정해줘야한다.

 

2. 데이터 탐색 및 결측치 처리 등

# 컬럼, non-null 개수, 데이터 타입, 용량
df.info()

# 결측치 시각화 --> 결측치 없음
df.isnull().sum().plot.barh(figsize=(8, 9))

# 사용할 컬럼만 선택, 필터링
columns = ['일자', '요일', '입장인원']
df = df[columns].copy()
  • 데이터 원본을 보존하기 위해 항상 .copy()를 쓰는 습관일 들이는 게 좋다.

 

3. 해당하는 데이터 값만 필터링해서 새로운 df로 만들기

# 토요일만 추출
df_sat = df[df['요일'] == '토요일'].copy()
df_sat.head(3)
df_sat.shape #총 52번의 토요일이 있었음.

# 요일만 추출
df_sun = df[df['요일'] == '일요일'].copy()
df_sun.head(3)
df_sun.shape #총 52번의 일요일이 있었음.

 

4. 데이터 분석 및 시각화 (요일별 입장객수 추이)

#요일별 입장인원 평균 확인 (groupby 활용)
df_week = df.groupby(by='요일')['입장인원'].mean().reset_index()

#요일별 입장입원 평균 확인(pivot 활용)
pivot = pd.pivot_table(data = df,
                       index = '요일', #요일 별 행
                       values = '입장인원', #집계할 값
                       aggfunc= 'mean').reset_index() #평균

#요일별 평규 입장인원 시각화
sns.barplot(data = df_week.sort_values("입장인원", ascending=False), x="요일", y="입장인원")

  • .reset_index()하면 시리즈를 데이터 프레임으로 만들 수 있다. 
  • .sort_values("입장인원", ascending=False)는 입장인원을 기준으로 값을 내림차순으로 정렬한다는 의미이다. 
  • 24년도 어린이 대공원 요일별 평균 방문객수를 보면 일요일과 토요일이 가장 많고 월요일이 가장 적음을 알 수 있다.
  • 이는 주말에 입장객수가 평일 대비 1.5배임을 뜻한다.
  • 일요일과 토요일의 차이는 거의 없다.

 

 

 

 

5. 데이터 분석 및 시각화 (월별 입장객수 추이)

# 목표 : 월 단위 총 입장인원 수 시각화

# 1월 ~ 12월까지 파싱
#datetime전용 접근자 dt, dt를 통해 시리즈에서  년, 월, 일 뽑을 수 있음.
df['일자'] = pd.to_datetime(df['일자'])
df['연'] = df['일자'].dt.year 
df['월'] = df['일자'].dt.month 
df['일'] = df['일자'].dt.day
df['요일(숫자)'] = df['일자'].dt.weekday # (월=0, 화=1)
df['요일(영어)'] = df['일자'].dt.day_name() # Monday, Tuesday
df.head(3)

# 월 단위로 입장인원 총계
visitor = df.groupby(by= '월')['입장인원'].sum().reset_index() #.reset_index()할 경우 데이터프레임으로 바꿈 
visitor.head(3)

# 입장인원이 가장 많은달부터 내림차순 정렬
visitor_sorted = visitor.sort_values(by='입장인원', ascending=False)

# 시각화
plt.figure(figsize=(15, 4))
sns.barplot(data=visitor_sorted, x="월", y="입장인원")
plt.title("월별 입징인원", fontsize=14)
plt.show()

# 꺾은선 그래프 시각화
plt.figure(figsize=(15, 4))
sns.lineplot(data=visitor, x="월", y="입장인원", marker="o")
plt.title("24년도 어린이 대공원 월별 입장인원 추이", fontsize=14)
plt.ylabel("입장인원")
plt.show()

  • pd.to_datetime(df['일자'])를 통해 datetime 으로 변환할 수 있다.
  • dt는 datetime 전용 접근자로 dt를 통해 년,월,일 등을 datetime에서 뽑을 수 있다. 
  • df.day_name()은 요일을 추출 할 수 있다. 
  • 24년중 월별 입장객 총계가 많았던 달은 4월이다. 4월 한달동안 100만의 입장객이 서울시 어린이대공원을 찾았다. 
  • 추측컨데 날이 선선하고 벚꽃이 펴 나들이 하기 좋은 월이었기 때문이지 않았을까 생각된다. 
  • 가장 입장객이 적었던 월은 1월(약 35만)로 추운 날씨 때문에 어린이 대공원을 방문하기 보단 대체 나들이 장소(스키장, 썰매장 등)로 몰리지 않았을까 해석된다.