본문 바로가기

TIL 통합

12/21 일지 - 파이썬 히트맵 matplotlib.pyplot.pcolor, seaborn.heatmap 차이

일단은 데이터 전처리(어제 자료와 같음)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rc('font', family='NanumBarunGothic')

#한글 깨짐 방지! 실행하고서 런타인 세션 재시작
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf


#1. 불러오기 및 기본 가공 : 2~5 피봇테이블 및 히트맵 만드는 데 필수!
#1)불러오기
ycn = pd.read_csv('/content/illegal_parking.csv')

#2)단속일시 시간 칼럼 및 요일, 시간 칼럼 만들기
format = '%Y-%m-%dT%H-%M-%S.%f'
ycn['단속일시자료'] = pd.to_datetime(ycn['단속일시'], format=format, infer_datetime_format=True)
ycn['단속요일'] = ycn['단속일시자료'].dt.day_name()
ycn['단속시간'] = ycn['단속일시자료'].dt.hour

#3)요일 자료 정렬해줄 weeks 미리 형성
weeks = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']

 

pcolor와 heatmap 실행과정

*heatmap으로 히트맵을 생성할 때, 기존 테이블의 수치가 %가 아닐 경우 fmt='g'를 입력해줘야함(자세한 건 본문에)


#2. 양천구 전체
#1)요일 시간 피봇테이블 만들기
weeks = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
all_pivot = pd.pivot_table(ycn, values = '연번',
                               index = ['단속요일'],
                               columns= ['단속시간'],
                               aggfunc="count").agg(weeks)

#2)양천구 전체 히트맵 만들기 : seaborn.heatmap 사용
plt.figure(figsize = (14, 5))
plt.pcolor(all_pivot)
plt.xticks(np.arange(0, len(all_pivot.columns), 1), all_pivot.columns)
plt.yticks(np.arange(0, len(all_pivot.index), 1), all_pivot.index)
plt.title('양천구 요일별 단속 시간 히트맵')
plt.xlabel('시간')
plt.ylabel('요일')
plt.colorbar()
plt.show()

#3)양천구 전체 히트맵 만들기 : seaborn.heatmap 사용
plt.figure(figsize=(18, 5))

sns.heatmap(data = all_pivot,
            annot=True,
            vmin=0,
            vmax=2500,
            fmt='g', #<------수치가 %가 아닐 경우 'g' 입력 안 하면 출력 오류 발생
            cmap='Blues')
plt.title('양천구 전체 시간요일별 건수')
plt.xlabel('단속시간')
plt.ylabel('단속요일')
plt.yticks(rotation = 60)
plt.show()



#3.교육기관
#1)교육기관 여부 칼럼 만들기
ycn['교육기관'] = np.where(ycn['단속장소'].str.contains(r'(여고|학교|어린이집|유치원|초교|학원)'), '1', "0")
#<------------'단속장소'에서 '여고, 학교, 어린이집, 유치원, 초교, 학원' 중 하나라도 언급되는 케이스는 1로 표시, 그렇지 않으면 0으로 표시되는 "교육기관"칼럼 생성

#2)교육기관에 해당하는 행들만 뽑아서 새 테이블 만들고 인덱스 리셋
ycn_schools = ycn.query('교육기관 == "1"')   #<-------'교육기관' 칼럼이 1인 케이스(행)들만으로 테이블 생성
ycn_schools.reset_index()

#3)교육기관 피봇테이블 만들기
schools_pivot = pd.pivot_table(ycn_schools, values = '연번',
                               index = ['단속요일'],
                               columns= ['단속시간'],
                               aggfunc="count").agg(weeks)

#4)교육기관 히트맵 만들기 matplotlib.pyplot.pcolor 사용
plt.figure(figsize = (14, 5))
plt.pcolor(schools_pivot)
plt.xticks(np.arange(0, len(schools_pivot.columns), 1), schools_pivot.columns)
plt.yticks(np.arange(0, len(schools_pivot.index), 1), schools_pivot.index)
plt.title('교육기관 요일시간 교차 히트맵')
plt.xlabel('시간')
plt.ylabel('요일')
plt.colorbar()
plt.show()


#5)교육기관 히트맵 만들기 : seaborn.heatmap 사용
plt.figure(figsize=(12, 5))

sns.heatmap(data = schools_pivot,
            annot=True,
            vmin=0,
            vmax=250,
            fmt='g',  #<------수치가 %가 아닐 경우 'g'를 입력 안 하면 출력 오류 발생
            cmap='BuGn')
plt.title('교육기관 요일시간별 건수')
plt.xlabel('단속시간')
plt.ylabel('단속요일')
plt.yticks(rotation = 60)
plt.show()

 

 

fmt = 'g'를 입력 안 했을 시 출력물

 

 

fmt = 'g' 입력 했을 시 출력물
pcolor 출력물. 같은 피봇테이블 기반이지만 요일 순서가 다르게 출력되며, 찾아보니 수치 입력이 더 어렵다.