본문 바로가기
프로그래밍

파이썬 연습 - Folium으로 고령자 지도 그리기

by choihyuunmin 2020. 11. 28.
728x90

1) 데이터

먼저 지역구별 고령인구를 확인하기 위해 서울시 열린데이터 광장의 '서울시 고령자현황(구별) 데이터'를 활용했고,

지역구가 나누어진 지도를 Folium 지도상에 표시하기 위해 

krksap.tistory.com/1751 이 게시글의 'skorea_municipalities_geo_simple.json' 파일을 이용했다.

서울시 열린데이터 광장의 json파일은 인식이 되지 않아 수정이 필요했는데

아직 거기까진 무리가 있기 떄문에 사용하기 좋게 수정되어 있는 파일을 가져왔다.

그리고 서울 지도위에 시각화를 진행해야 하기 때문에 서울의 좌표값을 준비했다.

2) 실행

 

먼저 folium을 설치해주고

 

고령인구 데이터를 가져왔다. 

기존 고령인구 데이터를 보기 좋게 자치구, 동, 총계, 남자와 여자 데이터만 추려내어 가져왔다.

총 425개의 데이터가 있음을 확인할 수 있다.

그 다음 나중에 json 파일과 매핑시키기 위해서 자치구별 인구를 합산했다.

※ csv데이터의 값 중 정수형에 천 단위 구분 기호(,) 가 들어있다면 데이터타입이 정수형(int)으로 나오지 않는다.(object)

반드시 구분 기호를 제거하고 실시!

이거는 '동' 단위별로 결측값이 생길 수 있기 때문에 결측값을 제거하는 과정에서 사용했던 방법이다. 

하지만 지역구별로 합계를 냈기 때문에 지금 이 과정에서는 생략해도 상관없다.

그래도 설명을 하자면 fillna를 통해 결측값을 제거하는데 method 는 pad방식 즉, 결측값의 위에 있는 값으로 채운다는 

뜻이다. 반대로 뒷방향으로 채우기 위해서는 method = 'bfill' 또는 'backfill'을 사용하면 된다.

다음은 json파일을 가져온다. json파일을 geo_str에 저장시키고 확인해보면 'feature' 안의 id에도 있고,

'feature' 안에 있는 'properties'의 안에 'name' 항목에도 들어있는 것을 확인할 수 있다. 잘 기억해두자.

서울시의 지도를 가져왔다. 미리 알아둔 서울의 좌표값을 입력하고, zoom_start를 통해서 지도를 확대하거나 

축소할 수 있다. 지금은 10.5로 지정해놓은 모습이고

이건 13으로 확대시킨 모습이다. zoom_start가 커지면 커질수록 지도는 확대되고 반대로 작아지면 축소된다.

이부분에서 4시간정도 헤맨거같다. 먼저 준비해둔 csv파일을 자치구별로 묶지 않아서 오류가 났었는데, 

fill_color 부분에서

'TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''' 에러가 뜨는 바람에 더 헤맨거 같다.

결론은, csv파일과 json파일을 잘 매핑해야 하는것 같다..

하나씩 설명하자면 ,  geo_data는 json 파일을 불러오는 거고 data에는 csv파일을 불러와 매핑한다.

columns는 csv파일에서 가져올 열을 설정하고 fill_color는 지도상에 데이터를 표시할 색상을 지정한다.

BuGn', 'BuPu', 'GnBu', 'OrRd', 'PuBu', 'PuBuGn', 'PuRd', 'RdPu', 'YlGn', 'YlGnBu', 'YlOrBr', 'YlOrRd' 이렇게 총 12가지

옵션이 있다. 

맨 밑의 key_on은 앞서 json에서 설명했던 것과 같이 자치구의 key값을 적어주면 된다.

여기에 몇 개의 항목이 더 있지만 아직 더 공부해야 하기 때문에 추후 업로드 해야겠다.

아무튼 저 코드를 실행시키게 되면

이렇게 영롱하고 예쁜 지도를 볼 수 있다. 6시간을 이 지도에 투자했다.. 아직 folium에 공부할 게 산더미지만 

그래도 결과물을 보니 뿌듯하다!