PM 트랙_강의/데이터 분석

파이썬(Python) 실습하기 - 수강생들이 강의 듣는 시간과 요일 분석

은하_carol 2025. 1. 8. 20:46

데이터 전처리

1. 라이브러리 사용 선언

import pandas as pd

 

2. 파일 읽어오기 및 확인

    • 파일 우측 클릭 후 [경로 복사]를 선택하면 파일 경로가 복사되어 사용 가능

sparta_date = pd.read_table('/content/access_detail.csv', sep = ',')
sparta_date.head()

실행 결과

  • 컬럼 정보
    • lecture_id: 수강 강의 Id
    • access_date: 접속 시간 날짜 및 시간
    • user_id: 유저 Id

 

3. 데이터 전처리

  • 현재 데이터 분석에 필요한 정보는 user_id(유저 Id)와 access_date(접속 시각 날짜 및 시간)
  • type() 함수는 데이터 타입을 확인하는 함수
# 작성 코드
print(type(sparta_data["access_date"][1]))

# 실행 결과
<class 'str'>
  • 문자열을 날짜 형태로 변경to_datetime() 함수 사용
  • 날짜 형식으로 변경된 데이터가 들어갈 컬럼명 지정
sparta_data['access_date_time'] = pd.to_datetime(sparta_data['access_date'], format = 'mixed')

실행 결과

  • 날짜 형식의 데이터로 구성된 추가 컬럼의 데이터 타입 확인
# 작성 코드
print(type(sparta_data['access_date_time'][0]))

# 실행 결과
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
  • dt.day_name() 함수는 날짜의 요일 확인 가능
sparta_data['access_date_time_weekday'] = sparta_data['access_date_time'].dt.day_name()
sparta_data.tail(5)

실행 결과

  • dt.hour는 시간 확인 가능 (괄호 작성하지 않음)
sparta_data['access_date_time_hour'] = sparta_data['access_date_time'].dt.hour
sparta_data.tail(5)

실행 결과

 

4. 데이터 그룹화하여 확인

  • 요일로 그룹화하여 각 요일별 접속 수강생 수 구하기
weeks = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekdata = sparta_data.groupby('access_date_time_weekday')['user_id'].count()
weekdata

실행 결과

  • 시간으로 그룹화하여 시간별 접속 수강생 수 구하기 (단, 시간 오름차순 정렬)
  • sort_index() 함수는 순서 정렬 시 사용 (기본 값 오름차순, 내림차순 시 sort_index(ascending = False) 사용)
hourdata = sparta_data.groupby('access_date_time_hour')['user_id'].count()
hourdata = hourdata.sort_index()
hourdata

실행 결과

 

데이터 시각화

0. 한글 깨짐 현상 해결

  • matplotlib을 활용하여 데이터 시각화 시 한글 표현할 때 깨짐 현상이 발생할 수 있다.

출처: https://velog.io/@seonydg/%EA%B5%AC%EA%B8%80-%EC%BD%94%EB%9E%A9Colab-%ED%95%9C%EA%B8%80-%EC%82%AC%EC%9A%A9-%ED%8C%A8%EC%B9%98%ED%95%9C%EA%B8%80-%EA%B9%A8%EC%A7%90-%ED%98%84%EC%83%81

  • 해결하는 방법은 간단하다. 아래 코드를 실행해 주면 끝이다.
!pip install koreanize-matplotlib

한글 깨짐 발생하지 않음

 

1. 라이브러리 사용 선언

import matplotlib.pyplot as plt
import numpy as np

 

2. 그래프 생성

  • 요일별 수강 완료 수강생 수
# 그래프 사이즈
plt.figure(figsize = (10, 5))

# 그래프 x축, y축
plt.bar(weekdata.index, weekdata)

# 그래프명
plt.title('요일별 수강 완료 수강생 수')

# 그래프 x축 레이블
plt.xlabel('요일')

# 그래프 y축 레이블
plt.ylabel('수강생(명)')

# x축 레이블을 90도로 변환 (45 입력 시 대각선 방향)
plt.xticks(rotation = 90)

# 그래프 출력
plt.show()

실행 결과

  • 시간별 수강 완료 사용자 수
# 그래프 사이즈 변경
plt.figure(figsize = (10, 5))

# 그래프 x축, y축
plt.plot(hourdata.index, hourdata)

# 그래프명
plt.title('시간별 수강 완료 사용자 수')

# 그래프 x축 레이블
plt.xlabel('시간')

# 그래프 y축 레이블
plt.ylabel('사용자(명)')

# x축 눈금 표시하기 (np.arange(숫자)는 0부터 입력한 숫자까지의 나열)
plt.xticks(np.arange(24))

# 그래프 출력
plt.show()

실행 결과

 

3. 히트맵 생성

  • 히트맵(heatmap): 을 뜻하는 히트(heat)와 지도를 뜻하는 맵(map)을 결합시킨 단어로, 데이터의 값을 컬러로 변환시켜 열 분포 형태로 보여 주어 시각적인 분석을 가능하게 하는 데이터 시각화 기법
  • 히트맵 생성 전 피벗 테이블이 필요한데, 이때 pivot_tabel() 함수 사용
    • values: 열에 들어가는 부분
    • index: 행에 들어가는 부분
    • aggfunc: 데이터 축약 시 사용할 함수
sparta_data_pivot_table = pd.pivot_table(sparta_data, values = 'user_id',
                                         index = ['access_date_time_weekday'],
                                         columns = ['access_date_time_hour'],
                                         aggfunc = "count").agg(weeks)
sparta_data_pivot_table

실행 결과

  • pcolor() 함수는 히트맵을 그려 주는 함수
  • np.arange(시작 숫자, 종료 숫자, 증가분) 함수는 시작 숫자부터 종료 숫자까지 증가분 차이만큼 나열
# 그래프 사이즈 변경
plt.figure(figsize = (14, 5))

# pcolor를 이용한 heatmap 그리기
plt.pcolor(sparta_data_pivot_table)

# 히트맵에서의 x축
plt.xticks(np.arange(0.5, len(sparta_data_pivot_table.columns), 1), sparta_data_pivot_table.columns)

# 히트맵에서의 y축
plt.yticks(np.arange(0.5, len(sparta_data_pivot_table.index), 1), sparta_data_pivot_table.index)

# 그래프명
plt.title('요일별 종료 시간 히트맵')

# 그래프 x축 레이블
plt.xlabel('시간')

# 그래프 y축 레이블
plt.ylabel('요일')

# plt.colorbar() 명령어를 추가하면 그래프 옆에 숫자별 색상 값을 나타내는 컬러바 생성
plt.colorbar()
plt.show()

실행 결과

 

4. 결론

  • 일주일 중 "화요일"과 "일요일에 수강생이 가장 많았고, "금요일"과 "수요일"에 가장 적었다.
  • 하루 중 18시대에 가장 접속률이 높았고, 21시부터 감소 추세를 보인다.
  • 요일별, 시간대별로 확인 결과 화요일 18시에 가장 많은 접속자가 있다는 것을 확인할 수 있다.