본문 바로가기

Theory/DataScience

Python seaborn heatmap으로 보는 서울시 구별 범죄현황 (feat. pivot)

이번에는 Python에서 seaborn의 heatmap을 익혀볼겸 서울시 구별 범죄현황 데이터를 다뤄보겠습니다. 이 내용은 몇 년전에 제가 지은 책(파이썬으로 데이터 주무르기)에 있는 내용입니다. 그 내용을 조금 다듬어서 오늘 이야기해보려고 합니다.~

먼저 구글에서 이쁘게 검색하고~

위 사이트에서 관서별 5대 범죄 발생 검거현황을 클릭~

위 사이트에서 다운로드 받습니다. 다운로드를 받아서 압축을 풀고 2018년 데이터를 소스코드와 같은 폴더에 두도록 하죠~

먼저 raw 데이터를 읽어봅니다.

이 데이터는 경찰서 이름, 각 경찰서마다 5대 범죄, 각 범죄마다 발생/검거가 나눠 기록되어 있습니다.~

이 데이터를 정리하는 마법같은 명령어가 pivot_table입니다~~~^^ 이 명령을 위와 같이 사용하면 raw 데이터가 깔끔하게 정리가 됩니다. pivot_table을 사용할때는 index와 columns에 들어갈 내용을 지정해주면 끝납니다. 중복된 내용에 대해 지정할 함수를 여기서는 합계(np.sum)를 사용하라고 했습니다.

그런데 pivot_table의 결과는 멀티컬럼,인덱스를 가집니다.

이걸 정리하기 위해. 지금 관심있는 데이터인 발생건수만 대상으로 해서

저런 방법으로 컬럼이름을 정리했습니다.

지금은 구별로~ 정리를 하고 싶습니다. 그래서 구별로 두 개의 경찰서가 있는 경우만 위의 코드를 이용해서 정리합니다.

이제 경찰서별 구이름이 잘 만들어 졌네요~

그리고 원래 데이터프레임에 넣어둡니다.

이제 다시 pivot_table을 이용해서 구 이름으로 데이터를 다시 한 번 더 정리합니다. 역시 aggfunc에 np.sum을 사용했기때문에 구별 데이터는 합쳐집니다.

이 상태에서 2018년 기준 서울시 살인건수를 보면 영등포, 강서, 강남, 관악, 순으로 많네요. 폭력은 강남, 송파, 영등포, 구로, 마포구 순입니다.

이제 5대 범죄별로 높낮이가 너무 다른 숫자를 컬럼별로 최대값 1, 최솟값 0으로 만들어줍니다. 어차피 다들 0보다 큰 수라서 그냥 각 컬럼별 max 값으로 나눠줍니다.

그리고, 정렬의 기준도 만들겸 종합 범죄 점수도 만들겸 5대범죄의 평균값으로 하나의 대푯값(범죄)으로 봅니다.

범죄라는 대푯값에서는 강남, 영등포구, 관악, 마포구가 범죄 발생이 높은 구이네요~

이제 matplotlib에서 한글 대응하는 코드를 실행하고~ (윈도우 유저는 f_path를 다른게 잡아야합니다)

heatmap을 사용합니다.^^

짠~ 어떤가요. 2018년 서울시 구별 5대범죄 현황입니다. 이번 글에 대한 동영상 해설도 첨부합니다~


반응형