데이터 인사이트

데이터 전문가 칼럼
데이터 전문가가 전하는 데이터 노하우

[빅데이터 분석] 나성호의 R 부동산 데이터 분석 특강 (6회) : 수집한 지리정보를 활용한 지도 위 시각화

작성자
관리자
작성일
2020-10-26 14:45
조회
110

나성호의 R 부동산 데이터 분석 특강 (6회)

수집한 지리정보를 활용한 지도 위 시각화

 
나성호는 금융회사에서 데이터 분석을 직접 수행하는 마케터로 17년 동안 근무했다. 지금은 데이터 마이닝 박사 과정에 재학중이며, 머신러닝을 강의하고 있다.
 

안녕하세요? 나성호입니다. 지난 연재에서 ‘카카오맵 API를 활용하여 지리정보를 수집하는 방법'에 대해 다뤘습니다. 지리정보를 얻게 되면 다음으로 할 수 있는 것이 지도 위 시각화입니다. 즉, 원하는 지역의 지도를 불러온 다음 분석 데이터의 경도와 위도 좌표를 기준으로 지도 위에 적당한 표시를 함으로써 데이터의 패턴을 파악할 수 있는 것이죠.

지금 우리가 다루고 있는 데이터가 2019년에 거래된 서울특별시의 아파트 매매 거래금액 데이터이므로 서울특별시 지도 위에 아파트 단지별로 매매금액의 평균을 표시할 수 있습니다. 관련 패키지인 `ggmap`을 설치했다고 가정하고 패키지를 호출하는 것부터 시작해보도록 하겠습니다.



[그림 1] 필요한 패키지 호출하기
 

• 구글 맵 API Key 발급 방법

최근에 `ggmap` 패키지를 설치했다면 아마도 3.0.0 버전일 것입니다. RStudio에서 `ggmap` 패키지 함수를 실행할 때 2.6.1 버전까지는 구글 맵 API Key를 인증하는 과정이 필요 없었는데요. 2.7.0 버전부터는 구글 맵 API Key를 미리 발급받은 다음 패키지의 함수를 실행하기 전에 구글 맵 API Key를 등록해야만 합니다. 사실 개인 사용자 입장에서는 매우 불편해진 것이 맞습니다. 하지만 R이 오픈 소스이기에 이렇게라도 해야 지도 시각화가 가능하니 어쩔 수 없이 따라야 하겠지요.

따라서 이번 연재는 구글 맵 API Key를 발급받는 방법부터 소개하고자 합니다. 이번 연재에서 소개해드리는 내용을 실습하시기 전에 주의해야 할 점은, 구글 맵 API Key를 발급받는 과정에서 자신의 신용카드 정보를 등록을 해야 한다는 점입니다.

물론 신용카드 정보를 등록하기만 할 뿐 실제로 카드 결제를 해야 하는 것은 아닙니다. 그렇지만 온라인 사이트에 자신의 신용카드 정보를 등록해야 한다는 점에서 찜찜한 기분이 드는 것은 어쩔 수 없을 것입니다. 아무튼 지금부터 구글 맵 API Key를 발급받고 관련 코드 실습을 따라해보는 것은 전적으로 본인이 결정하기 바랍니다.

구글 맵 API Key를 발급받기로 마음먹었다면 크롬 브라우저에서 구글 어카운트로 로그인한 상태로 구글 맵 플랫폼 사이트(https://cloud.google.com/maps-platform/?hl=ko)에 접속합니다. 사이트에 접속하면 [그림 2]와 같은 이미지가 보이면 가정 먼저 해야 할 것은 화면 왼편에 보이는 파란색 버튼인 ‘시작하기'를 클릭하는 것입니다. 그러면 [그림 3]처럼 구글 맵 플랫폼 사용 설정 팝업 메뉴가 생성됩니다.


[그림 2] 구글 맵 플랫폼 사이트 이미지



[그림 3] 구글 맵 플랫폼 사용 설정 팝업 이미지


[그림 3]에서 ‘지도' 버튼을 체크하고 팝업 메뉴의 오른쪽 하단에 있는 ‘계속' 버튼을 클릭하면 프로젝트 정보를 입력하는 팝업 메뉴로 이동합니다. 이 글을 읽고 있는 독자 여러분께서 기존에 생성해 놓은 구글 맵 프로젝트가 없다고 가정하고 설명을 이어나가겠습니다.



[그림 4] 프로젝트 설정 팝업 이미지


[그림 4]와 같이 팝업 메뉴의 중간에 있는 ‘Enter new project name’ 메뉴의 텍스트 입력창에 원하는 프로젝트 이름을 입력해야 하는데 저는 ‘My Map Project’라고 입력했습니다. 그러고나서 ‘구글 맵 API의 Terms of Service’에 동의한다는 의미로 ‘Yes’를 클릭합니다.



[그림 5] 결제 계정 만들기 팝업 이미지


이제 결제 계정을 만들 차례입니다. 구글 맵 플랫폼은 결제 계정을 생성할 때 12개월 동안 무료로 사용할 수 있도록 300 달러에 해당하는 크레딧을 무료로 제공합니다. 따라서 구글 맵 플랫폼을 생성했다면 1년간 무료로 사용할 수 있다는 의미입니다. 아울러 무료 사용 기간이 종료되었다 하더라도 본인의 동의 없이 신용카드 결제가 진행되지 않습니다.

사전에 무료기간 종료에 대한 내용이 알람으로 전달되고 구글 맵 플랫폼 서비스를 유료로 사용할지 여부는 그 때 결정하면 됩니다. 따라서 저는 안심하고 신용카드 정보를 입력해도 될 것이라고 판단하고 있습니다.



[그림 6] 결제 계정 생성 (1/3)


[그림 6]부터 [그림 8]까지 결제 계정을 생성하는 과정에서 입력해야 할 내용을 캡처한 것입니다. 저는 구글 어카운트를 여러 개 사용하기 때문에 구글 맵 플랫폼도 실제로는 여러 개를 사용하고 있습니다. 그러니까 구글 어카운트 한 개당 12개월을 무료로 사용할 수 있다는 의미입니다.

실제로 이번 연재를 준비하면서 기존에 사용하고 있는 구글 맵 플랫폼 무료 사용 기간이 한 달도 채 남지 않았다는 것을 알게 되었고, 3번째 구글 아이디로 접속하여 결제 계정을 새로 생성했는데 또 다시 12개월을 무료로 사용할 수 있다는 것을 알게 되었습니다.

[그림 7]과 [그림 8]에는 개인 정보를 입력해야 하므로 부득이하게 개인 정보를 가렸습니다. 아마도 신용카드를 사용하지 않는 학생이라면 [그림 8]의 신용카드 결제 정보를 입력할 수 없을 수도 있을 것 같습니다만, 그것까지 제가 고려할 수 있는 문제는 아닌 것 같습니다. 다만 제가 확실하게 말씀드릴 수 있는 것은 이런 과정을 통해 구글 맵 API Key를 발급받으면 RStudio에서 `ggmap` 패키지를 이용하여 지도 시각화를 할 수 있다는 것입니다.


[그림 7] 결제 계정 생성 (2/3)



[그림 8] 결제 계정 생성 (3/3)


이제 구글 맵 API 사용을 위한 플랫폼 결제 계정 생성을 모두 완료했다고 가정하겠습니다. 이후로는 총 세 번의 안내 팝업이 생성되는데요. 첫 번째 팝업은 결제 계정이 생성되었다는 내용입니다. ‘다음'을 클릭합니다.

두 번째 팝업은 [그림 9]처럼 구글 맵 플랫폼을 사용 설정을 위한 팝업입니다. ‘다음'을 클릭하면 구글 맵 API Key를 안내하는 팝업이 세 번째로 생성되는데요. 이 팝업에서 보이는 API Key를 복사한 다음 RStudio로 이동하여 R 환경변수에 추가해주어야 합니다.


[그림 9] 구글 맵 플랫폼 사용 설정 팝업

 



[그림 10] 구글 맵 API Key 안내 팝업


지금까지의 작업으로 구글 맵 API Key 발급이 모두 완료되었으니 지난 연제에서 소개해드린 것을 복습하는 의미에서 R 환경변수에 구글 맵 API Key를 추가하는 실습을 진행하도록 하겠습니다. R 환경변수 파일을 열려면 `usethis` 패키지를 사용해야 합니다. 아래 스크립트를 확인하시기 바랍니다.



[그림 11] R 환경변수에 구글 맵 API Key 추가하기


R 환경변수에 구글 맵 API Key를 등록한 다음 현재 주석으로 처리되어 있는 [그림 11]의 10번 행을 실행하여 콘솔창에 자신의 구글 맵 API Key가 정상적으로 출력되는지 확인하시기 바랍니다. 지금까지 잘 따라오셨다면 이제 `ggmap` 패키지를 호출하겠습니다. 앞에서 언급한 바 있지만 `ggmap` 패키지의 함수를 사용하려면 반드시 구글 맵 API Key를 등록해야 합니다.


[그림 12] `ggmap` 패키지 호출하고 구글 맵 API Key 등록하기



[그림 13] 구글 맵 API Key을 등록하지 않았을 때 geocode() 함수 에러 메시지

만약 [그림 12]의 17행을 실행하지 않은 상태에서 `ggmap` 패키지의 geocode() 함수를 실행하면 [그림 13]과 같이 콘솔창에 다음과 같은 에러 메시지가 보입니다. 하지만 구글 맵 API Key를 등록한 상태라면 [그림 14]와 같이 정상적으로 경도와 위도 좌표를 반환합니다.



[그림 14] geocode() 함수가 정상적으로 실행된 결과
 

• RStudio에서 지도 시각화

지난 연재글에서 ‘경복궁' 도로명주소로 경도와 위도 좌표를 얻는 예제 코드를 소개해드렸는데요. 이번에는 그 지리정보를 기준으로 지도 이미지(위성사진)를 불러오는 작업을 해보겠습니다. `ggmap` 패키지의 qmap() 함수를 이용하면 지정한 위경도 좌표를 중심으로 지도 이미지를 불러올 수 있습니다. 참고로 다음 지도 API를 통해 수집한 경복궁의 경도는 126.9768, 위도는 37.5759 입니다.



[그림 15] 경복궁 위경도 좌표로 지도 이미지 불러오기


위 코드를 보면서 qmap() 함수의 사용법에 대해 간단하게 소개해드리겠습니다. 먼저 `location` 인자에는 경도(longitude)와 위도(latitude) 좌표를 차례로 입력합니다. `zoom` 인자에는 1~21에 해당하는 숫자를 입력합니다. 입력된 숫자가 클수록 지도가 확대되어 출력됩니다. 재미삼아 1을 입력해보세요. 전 세계 지도가 보일 것입니다.

`maptype` 인자에는 불러올 지도의 형태를 지정하는데요. 저는 주로 ‘satellite’나 ‘hybrid’를 사용합니다. 이밖에 ‘toner’, ‘watercolor’, ‘terrain-background’, ‘toner-lite’ 등이 있으니 직접 실행해 보고 좋아하는 형태의 지도를 사용하기 바랍니다. 마지막으로 `source` 인자의 기본값은 ‘google’이므로 생략해도 됩니다.



[그림 16] RStudio Plots 창에 출력된 경복궁 지도 이미지


[그림 16]을 보니 경복궁 출입문을 중심으로 위성사진이 예쁘게 출력되었습니다. 이제 여러분도 관심 있는 지역의 지도를 불러올 수 있겠죠? 자신의 살고 있는 지역을 중심으로 지도 이미지 불러오기를 직접 해보시면 재미있을 것입니다. 이제 서울특별시 강남구 아파트 단지별 평균 거래금액을 지도 위에 시각화할 준비를 모두 마쳤습니다. 지난 연재에서 생성한 RDS 데이터를 불러와서 일부 전처리부터 실행하겠습니다.



[그림 17] 서울특별시 강남구 아파트 단지별 평균 거래금액 데이터 전처리

RDS 파일을 읽어 df 객체에 할당합니다. 그리고 현재 문자 벡터로 저장되어 있는 ‘경도’와 ‘위도’ 컬럼을 숫자 벡터로 변환합니다. 여러 벡터에 대해 같은 함수를 실행하기 위해 apply() 함수를 사용할 수도 있지만 `purrr` 패키지의 map_df() 함수를 사용하는 것이 조금 더 알기 쉬울 수 있다는 장점이 있어 이 함수를 사용했습니다.

마지막으로 ‘경도’와 ‘위도’의 중위수를 계산하여 중심좌표로 지정합니다. 평균 대신 중위수를 사용하는 이유는 만약 지리 정보가 한 곳에 집중되어 있으면 좌표의 평균은 해당 지역에 쏠리게 되므로 지도의 중심으로 사용하기 곤란한 경우가 종종 발생하기 때문입니다. 중심좌표까지 지정했다면 이제 그 좌표를 중심으로 하는 지도 이미지를 불러올 차례입니다.



[그림 18] 중심좌표를 기준으로 지도 이미지 불러오기


경복궁의 지리정보로 지도 이미지를 불러왔던 코드와는 다르게 ‘zoom’을 13으로 낮추었더니 지도의 축척이 작아졌습니다(small scale). 아울러 ‘maptype’을 ‘hybrid’로 변경하였더니 지도 위에 지역명이 추가로 출력되는 것을 알 수 있습니다.

그런데 [그림 19]와 같이 한강 이북 지역이 일부 보이는 상태라면 df에 포함된 전체 아파트 단지를 지도 위에 표시하려고 해도 강남구의 남쪽 아파트 단지의 일부가 지도 위에 표시되지 않을 것 같습니다. 따라서 우선 현재 설정된 지도 위에 관련 정보를 표시하는 것을 시도한 다음 일부 데이터가 지도 위에 표시되지 않는다는 것을 확인하게 되면 ‘zoom’의 숫자를 낮추는 방식으로 조절해야 합니다.



[그림 19] 서울특별시 강남구 아파트 단지 지리정보로 지도 이미지 불러오기


지도 위에 아파트 단지의 좌표를 점으로 출력하려면 qmap() 함수로 불러온 지도 이미지에 `ggplot2` 패키지의 geom_point() 함수로 레이어를 추가하는 방식을 사용하면 됩니다. ‘zoom’이 13인 상태에서 아파트 단지를 점으로 추가했더니 딱 1개만 제외되는 것을 확인할 수 있었습니다. 이런 경우, ‘zoom’을 12로 낮추면 전체 아파트 단지를 모두 출력할 수 있습니다. 하지만 지도의 축척이 더 작아지므로 시각화 효과가 떨어집니다.

다음으로 고려할 수 있는 방법으로는 중심좌표를 조금씩 옮기는 것입니다. 그러니까 경도를 오른쪽(+0.01), 위도를 아래쪽(-0.01)으로 조금씩 이동시키면 전체 아파트 단지가 지도 위에 표시될 것 같습니다. 마지막으로 아파트 단지별 매매가격을 기준으로 색상을 변경하도록 설정하면 더욱 효과적인 시각화가 가능합니다.



[그림 20] 서울특별시 강남구 아파트 단지별 평균 거래금액 지도 위 시각화 코드


[그림 20]의 54행은 테두리 색(color)을 그라데이션으로 지정할 때 분석가가 원하는 색상을 정할 수 있다는 것을 의미합니다. 사실 이 부분은 디자인적인 감각이 있는 사람이 더 잘할 것입니다. 저는 디자인 감각이 전혀 없어서 뭘 어떻게 하면 좋을지 잘 모르겠습니다.

아무튼 현재 코드로는 단지평균 컬럼의 값이 클수록 ‘red’, 작을수록 ‘yellow’로 색상에 가까워지도록 그라데이션을 설정했기 때문에 필연적으로 범례가 생성됩니다. 하지만 범례가 생기면 전체 지도의 모습이 이전 이미지와 달라지기 때문에 범례를 제거하는 방법을 고려해볼 수 있습니다. 그럴 때는 55행을 추가하여 범례를 제거할 수 있습니다.

[그림 21]을 보면 압구정동, 청담동, 대치동, 개포동 지역의 단지별 평균 거래금액이 높다는 것을 확인할 수 있습니다. 개포동 지역은 아직 재건축이 진행되고 있는 지역이므로 추후 경과를 지켜보는 것이 좋겠습니다.



[그림 21] 서울특별시 강남구 아파트 단지별 평균 거래금액 지도 위 시각화 결과


이상으로 지리 정보를 이용하여 지도 위에 시각화하는 방법에 대해 알아봤습니다. 앞으로 남은 연재에서는 다양한 머신러닝 알고리즘을 이용하여 아파트 매매 거래금액 결정모형을 만들고 성능을 비교하는 내용을 다루고자 합니다. 그런데 아직 문제가 더 있습니다. 현재 데이터에서 입력변수로 사용할 만한 데이터가 위도와 경도 좌표 정도 밖에 없습니다. 따라서 단지별 정보를 추가로 수집하기 위해 한국감정원에서 운영하고 있는 공동주택관리정보시스템(http://www.k-apt.go.kr/)의 아파트 단지 정보를 크롤링하는 방법을 다음 연재에서 소개해드리겠습니다. 감사합니다. (다음 회에 계속)



출처 : 한국데이터산업진흥원

제공 : 데이터 전문가 지식포털 DBguide.net