본문 바로가기
학습노트/Python

[강의노트] Python - Pandas, matplotlib 활용1

by kime2 2024. 1. 17.
스파르타코딩클럽의 강의를 참고하여 작성하였습니다

데이터 분석 순서

1. 문제 정의 및 가설 설정하기

2. 데이터 분석 기본 세팅 하기 

3. 데이터 분석하기 

분석 결과 시각화 하기 

5. 최종 결론 내리기

 

 

목표

수강생들이 가장 많이 혹은 가장 적게 듣는 시간과 요일을 데이터 분석으로 찾기

 

2.  데이터 분석 기본 세팅 하기 

: Pandas 사용 선언 하기 > 데이터 가져오기 > 데이터 확인 및 표 읽기 > 공백란 제거하기

 

# 2. 데이터 분석 세팅하기
import pandas as pd # pd->데이터 분석 도구
sparta_data=pd.read_table('/content/access_detail.csv',sep=',')
sparta_data.head()
print(sparta_data.isnull().sum()) #null값 확인

 

 

3. 데이터 분석하기:  데이터 전처리 -> 분석하기

 

1) 데이터 전처리

필요한 데이터: 어떤 수강생이 언제 듣는지 알기 -> 수강생, 시간, 요일

(1) 현재 있는 데이터의 종류 확인: access_date -> str

type() : 데이터의 종류 확인

(2) 원하는 시간의 데이터 형태로 바꾸기: format='%Y-%m-%dT%H:%M:%S.%f'

pd.to_datetime() : 데이터를 날짜와 시간 데이터로 변경

(3) 요일 추가하기

[날짜컬럼].dt.day_name: 해당날짜의 요일 조회

print(type(sparta_data['access_date'][1])) #type() -> 데이터 종류 확인
#sparta_data 정보에서 access_data열의 첫번째만 확인

format='%Y-%m-%dT%H:%M:%S.%f'
sparta_data['access_date_time'] = pd.to_datetime(sparta_data['access_date'],format=format)
#sparta_data데이터에 access_date_time라는 열을 만들어서 기존 access_date데이터를 내가 지정한 format으로 바꿔서 저장해줘
#to_datetime() -> 날짜와 시간 데이터로 변경

sparta_data['access_date_time_weekday'] = sparta_data['access_date_time'].dt.day_name()
sparta_data.tail(5)

sparta_data에서 새롭게 추가된 컬럼

 

(4) 요일 별 접속한 수강생 수 구하기

groupby('컬럼명'): 데이터를 특정 기준으로 그룹화

count(): 해당데이터의 개수 세기

agg("변수"): 리스트에 따라 데이터 재배열

#weeks 변수 저장
weeks=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
weekdata = sparta_data.groupby('access_date_time_weekday')['user_id'].count()
#sparta_data에서 access_date_time_weekday컬럼의 데이터를 그룹화하여 각 그룹의 user_id'의 수를 집계하여 weekdata에 저장
weekdata

weekdata=weekdata.agg(weeks)
#week의 리스트에 따라 데이터를 재배열
배열 전 배열 후 

 

(5) 시간별 접속한 학생 수 전처리

[날짜컬럼].dt.hour : 해당 날짜의 시간값

sort_index():오름차순 정렬

sort_index(ascendinf=False) : 내림차순

sparta_data['access_date_time_hour'] = sparta_data['access_date_time'].dt.hour
#[날짜컬럼].dt.hour-> 해당 날짜의 시간값
hourdata = sparta_data.groupby('access_date_time_hour')['user_id'].count()
hourdata = hourdata.sort_index()
sparta_data['access_date_time']
sparta_data['access_date_time_hour']
hourdata.sort_index()

 

2) 분석하기

(0) 나눔폰트 설치하기

첫번 째 cell에 아래 코드를 붙여 넣고 실행 -> colab의 런타임 재시작(세션 다시 시작)

!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf

 

(1) matplotlib, numpy선언하기 + 나눔폰트 지정하기

#2)분석하기
import matplotlib.pyplot as plt
import numpy as np
plt.rc('font', family='NanumBarunGothic')
#matplotlib의 폰트를 Nanum 폰트로 지정

 

(2)그래프 그리기

  • 시각화: 요일별 수강생수의 바 그래프
  • 사용데이터: weekdata = sparta_data.groupby('access_date_time_weekday')['user_id'].count()
  • 요일별 그룹화하여 사용자아이디를 계수한 데이터
#그래프 사이즈
plt.figure(figsize=(10,5))
#그래프 x축 y축
plt.bar(weekdata.index, weekdata)
#그래프 명
plt.title('요일별 수강 완료 수강생 수')
#x축 레이블
plt.xlabel('요일')
#y축 레이블
plt.ylabel('수강생(명)')
#x축 레이블 90도 변환
plt.xticks(rotation=90)
#그래프 출력
plt.show()

 

데이터 시각화

 

 

*그래프 변형

산점도
plt.scatter(weekdata.index, weekdata)
plt.title('요일별 수강 완료 수강생 수')
plt.xlabel('요일')
plt.ylabel('수강생(명)')
선그래프
plt.figure(figsize=(10,5))
plt.plot(weekdata.index,weekdata)
plt.title('요일별 수강 완료 수강생 수')
plt.xlabel('요일')
plt.ylabel('사용자(명)')
plt.xticks(np.arange(8))
plt.show()
   
   

 

 

  • 시각화: 시간별 수강생수의 라인 그래프
  • 사용데이터: hourdata = sparta_data.groupby('access_date_time_hour')['user_id'].count()
  • 시간별 그룹화하여 사용자아이디를 계수한 데이터
  • np.arange(): 괄호에 명시된 간격으로 배열을 생성
plt.figure(figsize=(10,5))
plt.plot(hourdata.index,hourdata)
plt.title('시간별 수강 완료 사용자 수')
plt.xlabel('시간')
plt.ylabel('사용자(명)')
plt.xticks(np.arange(24))
plt.show()

 

데이터 그래프

 

plt.figure(figsize=(10,5))
plt.bar(hourdata.index, hourdata)
plt.title('시간별 수강 완료 수강생 수')
plt.xlabel('시간')
plt.ylabel('수강생(명)')
plt.show()

 


시간별 요일별 수강생 수 분석하기

1. 분석: 피벗테이블

#피벗테이블 만들기
#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

 

2. 시각화: 히트맵

💡히트맵이란
히트 맵(heat map)은 열을 뜻하는 히트(heat)와 지도를 뜻하는 맵(map)을 결합시킨 단어로,
색상으로 표현할 수 있는 다양한 정보를 일정한 이미지위에 열분포 형태의 비쥬얼한 그래픽으로 출력하는 것이 특징

💡주의
히트맵은 X변수와 Y변수 2가지를 선택할 수 있는데,
X변수로 그룹을 나우어야 하기 때문에 문자형 데이터(factor,character형)
Y변수는 수치 데이터로 나태내야 하기 때문에 수치형데이터(integer,numeric형)
#히트맵으로 요일별 접속시간 나타내기
#그래프 사이즈 변경
plt.figure(figsize=(14,5))
#pcolor를 이용하여 heatmap그리기
plt.pcolor(sparta_data_pivot_table)
#히트맵에서 x축
#np.arange(): 0.5부터 sparta_data_pivot_table.columns의 길이만큼 ,1씩
#피벗테이블이기 때문에 격자가 가운데 와야 함
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.show()

 

 

참고

  • np.arange(): 괄호에 명시된 간격으로 배열을 생성
적당: plt.xticks(np.arange(24))
-> 0~23
과함: plt.xticks(np.arange(50))
-> 데이터보다 범위가 많다: 0~49
부족: plt.xticks(np.arange(5))
-> 데이터보다 범위가 적다:0~4
  • np.arange(100) -> 0~99 까지

  • np.arange(1,100,25) -> 1~100까지 25의 간격으로

결론

수강생들이 가장 많이 혹은 가장 적게 듣는 시간과 요일은 

요일별로 보았을 때 일주일 중 화요일, 일요일에 가장 많은 수강생이 접속했고, 
수요일, 금요일에 수강생이 제일 적었ㄷ다

일별 접속 시간의 추이를 보면 
저녁시간인 18시쯤 접속이 제일 많고 21시부터 감소했다
요일별, 시간별 모두 확인한 결과 화요일 18시에 접속자가 제일 많았다