본문 바로가기

Python 입문

데이터 분석1-4. 요일/시간 분석

1. 목적

강의별 수강한 날짜/시간 데이터를 전처리해서 인사이트를 얻고자 한다.

 

2. 준비: 설치

라이브러리를 불러온다. numpy는 수학적 계산을 도와준다고 한다.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = "AppleGothic"

 

3. 준비: 데이터 확인

1-2 이탈 분석에서 활용했던 데이터를 가져오고

sparta_data = pd.read_csv('./data/enrolleds_detail.csv')

날짜/시간별(done_date) 유저수(user_id)를 확인해서, 강의를 많이 듣는 시점을 찾아보기로 한다.

 

4. 준비: 데이터 가공

done_date열에 있는 데이터가 텍스트 형식인데, 활용 가능한 날짜/시간 형식으로 변환한다.

Pandas 라이브러리에 있는 기능을 활용하면(pd.to_datetime) 편리하다.

형식은 정의를 해줘야 하는데(format) 순서대로 년-월-일 그리고 시:분:초.소숫점 이하까지로 정의한다.

 

format = '%Y-%m-%dT%H:%M:%S.%f'
sparta_data['done_date_time'] = pd.to_datetime(sparta_data['done_date'], format=format)

 

5. 요일별 데이터 확인

특정 날짜의 요일을 찾아서 새로운 열에 기입하고
sparta_data['done_date_time_weekday'] = sparta_data['done_date_time'].dt.day_name()

요일 기준으로 데이터를 만든다.

weekdata = sparta_data.groupby('done_date_time_weekday')['user_id'].count()

요일 순서가 뒤죽박죽이므로 순서를 정의해준다.

weeks = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekdata = weekdata.agg(weeks)

그리고 그래프를 그려보면, 어느 요일에서 튀는지 확인할 수 있다.

plt.figure(figsize=(8,5))
plt.bar(weekdata.index, weekdata)
plt.title('요일별 수강 완료 수강생 수')
plt.xlabel('요일')
plt.ylabel('수강생(명)')
plt.xticks(rotation=90)
plt.show()

 

6. 시간별 데이터 확인

데이터에서 시간을 찾아서 새로운 열에 기입하고

sparta_data['done_date_time_hour'] = sparta_data['done_date_time'].dt.hour

시간 기준으로 데이터를 만든다.

hourdata = sparta_data.groupby('done_date_time_hour')['user_id'].count()

 

시간은 0시~23시로 명확하므로 인덱스 값 기준으로 정렬한다.
hourdata = hourdata.sort_index()

그래프를 그려보면 가로축 시간이 0, 5, 10, 15, 20 등과 같이 단순화된 것을 확인할 수 있다.

plt.figure(figsize=(10,5))
plt.plot(hourdata.index, hourdata)
plt.title('시간별 수강 완료 사용자 수')
plt.xlabel('시간')
plt.ylabel('사용자(명)')

 

시간을 모두 보여주려면 어레이 리스트를 전부 입력해줄 수도 있지만

plt.xticks([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24])

불러왔던  Numpy 라이브러리를 활용하여 0~23시(총 24개) 숫자가 순차적으로 돌 수 있도록 처리한다.

plt.xticks(np.arange(24))

7. 요일 및 시간별 데이터 확인

5~6번에서 각각 확인했던 데이터를 취합해서 인사이트를 얻을 수 있을지 피벗 테이블을 만들어 본다.

 

요일 및 시간별 수강생을 세어줄 것이므로 값에 넣어주고 values='user_id'

수강생 수를 세야 하므로 함수는 aggfunc='count'

요일별(인덱스)-열 / 시간별-행으로 구성될 수 있도록 가로/세로 값을 잡아주고

요일별로 정렬해준다.

 

sparta_data_pivot_table = pd.pivot_table(sparta_data, values='user_id', aggfunc='count',
               index=['done_date_time_weekday'],
               columns=['done_date_time_hour']).agg(weeks)

Pandas로 만든 피벗 테이블

색다르게 히트맵을 그려보면, 가로/세로축 값이 원하는 대로 나타나지 않는다.

plt.figure(figsize=(14,5))
plt.pcolor(sparta_data_pivot_table)
plt.title('요일별 종료 시간 히트맵')
plt.xlabel('시간')
plt.ylabel('요일')
plt.show()

가로축 시간은 0~23시 전부 보일 수 있도록 np.arange 함수를 이용해

피벗 데이블의 가로(.columns) 데이터 처음부터 끝까지 돌면서(len 함수) 가로축 값을 생성할 수 있도록 한다.

세로축도 동일하게 입력하고, 시간은 히트맵 네모칸의 중간에 표기될 수 있도록 0 -> 0.5로 숫자를 바꿔준다.

노란색이 가장 높은 값인지를 알 수 있도록 숫자에 따른 색깔 명암도를 표시해줄 수 있는 바 그래프도 추가한다.

 

plt.figure(figsize=(14,5))
plt.pcolor(sparta_data_pivot_table)
plt.xticks(np.arange(0.5,len(sparta_data_pivot_table.columns),1),sparta_data_pivot_table.columns)
plt.yticks(np.arange(0.5,len(sparta_data_pivot_table.index),1),sparta_data_pivot_table.index)
plt.title('요일별 종료 시간 히트맵')
plt.xlabel('시간')
plt.ylabel('요일')
plt.colorbar()
plt.show()

'Python 입문' 카테고리의 다른 글

2023 점프 투 파이썬 - 2주차  (1) 2023.07.02
데이터 분석1-3. 워드 클라우드  (0) 2021.06.26
데이터 분석1-2. 이탈 분석  (0) 2021.06.26
데이터 분석 1-1. 상권 분석  (0) 2021.06.16
Matplotlib 연습  (0) 2021.05.23