R과 Google Spreadsheet로 주소를 위경도로 쉽게 변환해보기
"왜 군사분계선이 38선이라고 하는 줄 알아?"라고 누군가 물어본다면
순간 뜨끔할 수도 있다
아니다. 분명 뜨끔해할 것이다!
그 38선이 정말 왜 38선인 줄 모를 수도 있고, 38선이 위도인지 경도인지 헷갈릴 수도 있기 때문이다
예전에는 위도와 경도는 볼 때마다 헷갈렸다... (latitude, longitude에선 더더욱!)
사실 사는데 위도와 경도가 그렇게 필요한 개념은 아니다. 위도는 온도와 경도는 시간과 상관있다는 것만 알면 하루를 살아가는데 전혀 문제 될 것이 없다. 하지만, 데이터 시각화 혹은 데이터저널리즘에서 맵핑을 하고자 한다면 꼭 알아야 하는 개념은 틀림없다.
위도와 경도
예를 들어보자. 만약 전국의 구청 주소를 주고 지도 위에 해당 위치를 찍어보라고 한다면 근데 위도와 경도의 개념을 모른다면 어떻게 할까? 대략적으로 그 위치를 지도 위에 그린다(?!). 이건 마치 막대차트를 그릴 때 y값을 눈대중으로 표현하는 것과 같다. 명백한 오류를 범하는 것이다. 그렇기 때문에 좌표 정보계 맵핑에선 정확한 위치에 주소 데이터를 맵핑시켜야 하는데 필요한 것이 위도와 경도이다. 몇몇 툴에선 주소만 입력해도 위치를 표현시켜 주긴 하지만 그건 내부 로직에 의해 스스로 위경도로 변환해서 보여주는 것이기 때문에 기본으로 돌아가 맵핑을 하고자 한다. 암튼 이 글은 간단한 위경도 변환 방법을 쓰려고 했기 때문에 자세한 글은 다음에...(늘 서론이 길다...)
R을 활용한 변환
데이터저널리즘은 기본적으로 수집, 정제, 분석, 시각화의 프로세스를 거치기 때문에 각 과정과 관련된 패키지 중심으로 R을 활용하고 있다. (개인적으론, rvest, dplyr, reshape, ggplot2, ggmap 패키지) 그중에 위경도 변환과 관련된 건 ggmap 패키지이다. 위경도 변환과 맵핑이 가능한데 맵핑은 그다지 이쁘지 않아서 위경도 변환만 사용하는데 아주 쉽다. GitHub에 코드랑 샘플 데이터 올려놨어요!
> ##install.packages("ggmap")
> library(ggmap)
> data <- read.csv("places.csv", header = TRUE, fileEncoding = "utf-8") ## csv loading
> data$address <- enc2utf8(data$address) ##윈도우는 인코딩 한번 처리해줘야 함
> data$address <- as.character(data$address) ## make character data$address
> data_lonlat <- mutate_geocode(data, address, source='google') ##위경도 변환
> write.csv(data_lonlat, "cleaning_data.csv", row.names = TRUE) ##csv export
위의 코드는 재활용할 수도 있는데 본인의 데이터와 칼럼명만 바꿔주면 된다. 주소를 하나씩 Google Map API로 보내고 위경도를 반환받고 또 보내고 반환받고 이런 식이다. 암튼 여태 위경도 변환은 R에서 신나게 했었다. 참고로 하루에 2,500개만 변환이 가능하다. R을 활용하는 게 익숙하다면 그냥 ggmap을 사용하는 것을 추천드리고 싶다. 다른 칼럼들도 많을 것이고 정제 혹은 시각화도 계속 진행해야 한다면 연속성 있게 작업하는
것이 좋지 않을까? 위의 코드로 'cleaning_data.csv'로 저장하고 나면 주소 칼럼 옆에 lat과 lon칼럼이 자동으로 생성되고 그 안에 우리 위경도 이쁜이들이 곱게 들어와있는 것을 확인할 수 있다. 간혹 도로명주소 혹은 잘못된 주소는 NA로 반환하게 되는데 NA값들은 주소 데이터를 다시 한번 확인해보도록 하자. 혹시 R ggmap을 더 알고 싶다면 이민호 님의 블로그를 참고해 보시길!
Google Spreadsheet
사실 R이 익숙지 않다면 위의 코드를 가져가도 어렵다. (내가 처음에 R을 열었을 때 그 충격과 공포는 아직도 생생하니깐...) 그래서 열심히 리서치를 해보니 의외로 쉬운 방법이 있다. Google Spreadsheet는 안 되는 게 없는가 보다. 예전에 웹에 올라와있는 table, list 형 데이터를 스크래핑하기 위해 importHTML, importXML 함수로 큰 재미를 봤는데 또 그러한 기쁨을 찾았다
역시 Google Spreadsheet는 그 기대를 실망시키지 않는다. Geocoding이란 플러그인을 통해 R에서 위경도 변환 코드를 입력하지 않아도 몇 번의 클릭을 통해 주소를 위경도 데이터로 변환할 수 있다. 다시 위의 코드를 보니깐 한숨이 나온다. 후아.
튜터리얼은 아주 쉽다.
1. 구글 스프레드시트를 연다
2. 부가기능에서 Geocode by Awesome Table을 설치한다
3. 주소 column 파일을 import 한다
4. 부가기능에서 설치한 Geocode by Awesome Table을 실행한다
5. Start Geocoding 클릭
6. 시트와 칼럼을 선택해주고 Geocode! 버튼 클릭
7. latitude, longitude 칼럼이 자동으로 생성되고 해당 주소가 위경도로 변환되는걸 확인할 수 있다
그러면 아래와 같이 그냥 아주 막 들어온다. 뿐만 아니라 옵션에 그 위경도 값으로 맵핑까지 할 것인지도 친절하게 물어봐준다. 촤하하...
맵핑은 데이터시각화에서 자주 활용하는 유형 중 하나이고
d3.js가 됐든 cartoDB와 같은 맵핑 툴을 사용하든 위경도 데이터는 꼭 필요하다. 말 나온 김에 다음번 포스팅에는 cartoDB 튜터리얼을 올려볼까 싶다.
유용하게 활용하시길 바래요
Happy Mapping!