스파르타코딩클럽의 강의를 참고하여 작성하였습니다
데이터 분석 순서
1. 문제 정의 및 가설 설정하기
2. 데이터 분석 기본 세팅 하기
3. 데이터 분석하기
4 분석 결과 시각화 하기
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시에 접속자가 제일 많았다 |
'학습노트 > Python' 카테고리의 다른 글
[강의노트] Python - 데이터전처리: Pandas(3) - 실습 (0) | 2024.01.25 |
---|---|
[강의노트] Python - 데이터전처리: pandas(1) (1) | 2024.01.23 |
[강의노트] Python 분석 - 상관계수 실습 (0) | 2024.01.16 |
[강의노트] Python 분석- 상관계수(2), barplot (2) | 2024.01.14 |
[강의노트] Python 분석 - 상관계수(1) (1) | 2024.01.14 |