#03_03[python] 데이터 날짜변환 heatmap

2022. 1. 24. 18:10개발의 흔적/데이터분석

# 강의 수강생들 대상으로 즉문즉답 서비스 제공할 시, 가장 적절한 시간을 분석하는 의의

# 강의 수강데이터에서 수강생들이 가장 많이 강의를 끝내는 시간으로 결정

 

 

#위의 done_date 가 현재 string type -> 이를 토대로 각 년월일시분초를 pandas library를 이용해 나눠줄 것!

 

form = '%Y-%m-%dT%H:%M:%S.%f'      #위 done_date의 형태에 맞게 각 part 지정
enroll['done_date_time'] = pan.to_datetime(enroll['done_date'], format = form)
enroll

 

['done_date_time] column 생성

#위 done_date_time 칼럼은 각 년월일시분초가 각 항목에 맞게 인식된다

 

#이제 각 요일당 강의를 끝마치는 학생수 / 각 시간 당 강의를 끝마치는 학생수를 count 할 것!

 

 

enroll['done_day_name'] = enroll['done_date_time'].dt.day_name()   #done_date_time의 년월일로 day_name (요                                                                                                   일)을 계산해줌!
enroll['done_hour'] = enroll['done_date_time'].dt.hour                   #done_date_time의 시간만 불러와줌
enroll

 

요일과 시간이 table에 추가됨

weeks = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekdata = enroll.groupby('done_date_time_weekday')['user_id'].count().agg(weeks)
weekdata

 

#요일에 순차가 없으므로 weeks라는 list로 order주고 weekdate로 요일별 수강끝낸 학생(done_data) count 해준 가공자료 만듦

weekdata

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


hourdata

 

#hourdata도 위와 마찬가지로 만들어줌 (시간은 0부터 23까지 int로 저장된거니까 sort_index 해주면 정렬됨!)

 

 

 

 

 

#목표 과제 전에 월요일/화요일 시간별 수강자수 한번 비교해보자!

 

enroll_monday = enroll[enroll['done_day_name']=='Monday']
enroll_monday_final = enroll_monday.groupby('done_hour')['user_id'].count().sort_index()
enroll_monday_final

enroll_tuesday = enroll[enroll['done_day_name']=='Tuesday']
enroll_tuesday_final = enroll_tuesday.groupby('done_hour')['user_id'].count().sort_index()
enroll_tuesday_final

 

 

mt = plt.figure(figsize=(20,10))
plt.plot(enroll_monday_final.index, enroll_monday_final, label='Monday')
plt.plot(enroll_tuesday_final.index, enroll_tuesday_final, label='Tuesday')
plt.title('Monday vs Tuesday Hour students finish their lectures', size = 20)
plt.xlabel('hour')
plt.ylabel('students')
plt.xticks(np.arange(24))  #xticks에서 numpy arrange(size)로 범례지정 -> 이를 통해 x축이 1에서 23까지 1씩 증가                                                                                                      하며 표시됨
plt.legend()                   #위에 지정해준 각 plot의 label을 표시해줌
plt.show()
mt.savefig('./week03_task2.png')

 

 

 

#이제 찐 과제로 넘어가보자

#위의 weekdata 와 hourdata를 둘다 표시해야됨! how?

# x축에 (월~일) y축에 (0~23)들어가면 각 요일/시간에 맞는 학생수 어떻게 표시?

# -> 3차원 graph그려야지!  = z축을 heatmap으로 표시하면 가시적으로 표현가능!

 

 

#일단 weekdata 와 hourdata 묵자!

#pivot_table 등장!

 

enroll_pivot_table= pan.pivot_table(enroll, values='user_id', aggfunc = 'count', 
                index=['done_date_time_weekday'], columns = ['done_date_time_hour']).agg(weeks)

 

#pivot_table( data이름, values = '값 넣을 column' , aggfunc = values를 할 연산, index= row, colunms = columns)

# 월화수목금토일 list대로 정렬

enroll_pivot_table

 

가공 완료된 table

이제 table을 matplotlib 을 이용해 히트맵으로 시각화하자!

 

heatmap = plt.figure(figsize = (14, 5))
plt.pcolor(enroll_pivot_table)                                #heatmap 함수
plt.title('요일별 종료 시간 히트맵')
plt.xlabel('시간')
plt.ylabel('요일')
plt.xticks(np.arange(0.5, len(enroll_pivot_table.columns), 1), enroll_pivot_table.columns)  #위 그래프 xticks에 나                                                                                                                            타 날 위치 지정
plt.yticks(np.arange(0.5, len(enroll_pivot_table.index), 1), enroll_pivot_table.index)
plt.colorbar()                                                      # heatmap에 나타나는 color가 무슨의미인지 알려주는 칼라바
plt.show()
heatmap.savefig('./heatmap.png')

 

heatmap.png

#이로써 화요일 18시경이 수강생들이 강의를 가장 많이 하는 완료하는 시간대이므로

# 화요일 19시경에 즉문즉답 시간을 제공하는 것이 적절하다고 분석 할 수 있다!