[디블로터] ④‘ggmap’으로 지도를 그려보자

가 +
가 -

디블로터 4주차에는 ‘ggmap'(지지맵)을 공부했습니다. 매주 알차게 참고했던 이민호 님의 ‘DATA AND VISUALIZATION‘ 깃허브에 있는 내용들은 얼추 다 봤습니다. R의 기초와 간단한 활용을 원하는 분이라면 깃허브에서 차근차근 살펴보는 것도 좋겠습니다. 이번 주에는 꿈꾸는 데이터 디자이너 2기의 ggmap 강의안을 참고해 공부했습니다.

R에서 지도를 이용한 매핑을 하는 일은 간단합니다. 우선 지도를 불러오고, 위·경도 데이터를 ‘지지플롯2’을 사용해 지도 위에 표시하면 됩니다. 우선 지도를 불러오기 위해서는 위도와 경도를 추출해야 합니다. 이 과정을 ‘지오코딩’이라고 합니다. 우리나라 지도를 불러와 볼까요?

install.packages(‘ggmap’)
library(ggmap)
geocode(‘Korea’, source = ‘google’)

이렇게 하면 위·경도를 얻을 수 있습니다. 보통 위치데이터를 얻을 때는 주소데이터를 얻게 될 경우가 많습니다. 장소를 물어볼 때 위도와 경도로 대답하는 사람이 별로 없는 것과 마찬가지죠. 지지맵에서는 ‘mutate_geocode’를 이용해 주소가 포함된 데이터 프레임에서 주소를 바탕으로 위도와 경도를 추가할 수 있습니다. 다음과 같이 사용합니다.

mutate_geocode(데이터 프레임, 주소가 적힌 열의 이름, source = ‘google’)

다만 실습 과정에서는 잘 안됐습니다. 주소가 한글이다보니 인코딩 문제가 종종 생기곤 했습니다. 저희는 스프레드시트를 활용해서 위·경도가 포함된 데이터를 만들었고, 그 상태의 데이터를 R로 가지고 왔습니다.

단순하게 위치 정보를 표시하는 매핑이라면 구글 퓨전테이블을 활용하는 방법도 좋습니다. 퓨전테이블에서는 주소가 있는 열을 선택하고 데이터 타입을 ‘위치'(location)로 바꾼 뒤 메뉴에서 지오코딩을 실행하면 됩니다. 구글 지도에 자동으로 위치를 찍어주고, 카드를 활용해 위치에 대한 설명을 곁들일 수 있습니다. 위치를 점으로 표시하는 피처맵 외에 히트맵 형태로 표시할 수도 있습니다.

dbloter_ggmap

본격적으로 지지맵을 이용해 지도를 그려보겠습니다. ‘qmap’이라는 함수를 이용합니다. 다음과 같습니다.

qmap(‘seoul’, zoom = 11, maptype = ‘roadmap’ )

줌은 값이 클수록 더 당겨서 지도를 불러옵니다. 맵타입은 ‘terrain’, ‘roadmap’, ‘satellite’, ‘hybrid’가 있습니다. 기본값은 ‘terrain’ 입니다. ‘color = ‘bw’’로 설정하면 흑백으로 가져옵니다. 보통 시각화를 할 때는 지도 위에 그래프를 얹는 형식이기 때문에 지도는 무채색으로 불러오는게 좋은 듯합니다.

wifimapping3

지도 위에 레이어를 얹어서 데이터를 표시할 수도 있습니다. 한 달쯤 전에 <블로터>에서 ‘통신 3사 무료 와이파이존 지도 만들어봤어요’ 라는 기사를 작성한 적이 있었는데요. 지도를 불러오고 위에 지지플롯2로 레이어를 얹어서 구현했습니다. 코드는 다음과 같습니다. 지지플롯2를 공부했던 경험을 되새겨보면 좋을 듯합니다.

seoul_map +
(seoul_map 이라는 변수에 지도를 저장해 뒀습니다)
geom_polygon(data = openwifi, aes(x = lon, y = lat, fill = ..level..), stat = ‘density2d’, alpha = 0.3)+
(서울시 공공데이터를 가져왔습니다. 위경도를 값으로 설정했습니다.)
scale_fill_gradient(low = ‘연한색’, high = ‘짙은색’)+
facet_wrap(~div)
(div 칼럼에는 어느 통신사인지가 나타나 있습니다. 통신사별로 그래프를 구분하기 위해 facet을 사용했습니다.)

이렇게 만든 지도와 그래프는 그림 파일이나 PDF 등으로 추출해 사용할 수 있습니다. 다만 이렇게 활용하는 지도는 정적인 이미지 자료이기 때문에 다소 아쉬운데요. 인터랙티브한 지도와 그래프를 활용하고 싶다면 ‘리플렛JS‘를 사용하면 됩니다. 리플렛JS는 인터랙티브한 맵을 만들 수 있는 오픈소스 자바스크립트 라이브러리입니다. 웹문서에 임베드해서 쓸 수 있다는 장점이 있습니다.

dbloter_ggmap2

R에서는 리플렛(leaflet) 패키지를 설치하면 활용할 수 있습니다. 방금 활용한 와이파이존 데이터를 리플렛에 뿌려보겠습니다. 코드는 다음과 같습니다.

leaflet(wifi_data) %>%
setView(lng = 경도, lat = 위도, zoom = 원하는 줌 레벨) %>%
addTiles() %>%
addCircles(lng = ~lon, lat = ~lat)

리플렛을 활용한 지도는 html로 빼올 수 있습니다.

디블로터 4주차 학습내용

  • ggmap
  • leaflet
  • 캐글과 머신러닝 기초

디블로터 5주차 학습내용 예정

  • ‘Doing Data Science’ 책 공부 시작
네티즌의견(총 1개)