데이터 인사이트

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

[빅데이터 분석] 나성호의 R 부동산 데이터 분석 특강 (5회) : 지도 서비스에서 위도와 경도 데이터 수집

작성자
관리자
작성일
2020-10-26 14:29
조회
4060

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

지도 서비스에서 위도와 경도 데이터 수집

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

?안녕하세요? 나성호입니다. 지난 연재에서 ‘수집한 데이터에 대해 탐색적 데이터 분석을 실행하여 데이터에 대해 이해해보는 내용’을 다루었습니다. 간단하지만 그래프를 그리는 방법도 몇 가지 소개해드렸습니다.

우리가 다루고 있는 것이 아파트 실거래가 데이터이므로 지리적 특성을 지니고 있다고 할 수 있습니다. 따라서 실거래가를 추정하는 회귀모형을 적용해보기에 앞서 아파트의 도로명주소를 기준으로 위도와 경도 좌표를 새로 수집하고, 지도 위에 시각화하는 방법을 소개해드릴까 합니다. 이번에도 지난 시간에 저장했던 RDS 파일을 읽고 ‘result’ 객체에 할당하겠습니다.



[그림 1] RDS 파일 불러오기
?

? 다음 카카오맵 API 활용법

R에서 ‘주소' 정보로 위도와 경도 좌표를 얻을 수 있는 방법은 여러 가지가 있습니다. 제가 2016년에 처음으로 지도 시각화에 도전했을 때에는 `ggmap`이라는 패키지를 통해 위도와 경도 좌표를 수집하곤 했습니다. 문제는 일별 한도가 2500건이라는 것이었죠. 그래서 한창 지도 시각화를 하던 당시에는 하루에도 몇 천개의 주소로 위도와 경도 좌표를 얻어야 했던 때라 다른 좋은 방법이 없는지 대안을 찾곤 했는데요. 그때 알게 된 것이 바로 ‘네이버 지도 API’였습니다.

하지만 당시에는 R에서 ‘네이버 지도 API’를 이용하는 코드를 짤 수 있는 실력이 없어서 파이썬을 이용해야 했습니다. 파이썬으로 위도와 경도 좌표를 수집한 다음 텍스트 파일로 저장하고, 이 파일을 다시 R에서 불러와 시각화 작업을 한 것이죠. 지금 생각하면 불과 몇 년 전 일이지만 일을 참 정말 어렵게 했구나 하는 생각이 듭니다.

당시 ‘네이버 지도 API’는 일별 한도를 10만 건이나 제공했기에 저에게는 꽤 훌륭한 서비스였습니다. 2017년 이후로 한동안 ‘네이버 지도 API’를 사용하지 않았다가, 올해 4월에 ‘네이버 파파고 API NMT 번역’ 서비스를 사용하게 되면서 알게 되었는데요. ‘네이버 지도 API’가 올해 3월에 서비스를 종료되었다는 것이었습니다. 하지만 아직 슬퍼할 이유는 없습니다. 왜냐하면 우리에게는 ‘다음 카카오맵 API’가 있으니까요. 일별 한도는 무려 30만 건이나 됩니다. 물론 개인이 일별 한도 30만 건을 채우는 것이 쉬워 보이지 않습니다.

‘다음 카카오맵 API’를 이용하려면 당연히 다음 카카오 ID가 있어야 합니다. 카카오톡을 사용하는 분이라면 누구나 다음 카카오 ID를 가지고 있을 것이라 생각되지만, 아직 ID를 발급받지 않은 분이라면 ID부터 만들어야 합니다. 자, 이제 ‘다음 카카오 개발자’ 페이지(https://developers.kakao.com)로 이동하겠습니다. ‘다음 카카오 개발자 페이지’로 이동하면 [그림 2]와 같은 화면이 열립니다. 여러 개의 노란색 아이콘 중에서 오른쪽에 ‘지도/로컬'이 보입니다. 하지만 지금은 ‘앱'을 만들어야 하므로 나중에 확인하도록 하겠습니다.



[그림 2] 다음 카카오 개발자 메인 페이지


[그림 2]처럼 화면 아래에 있는 ‘앱 개발 시작하기' 버튼을 클릭하면 카카오 로그인 화면으로 이동합니다. 자신의 카카오 ID와 비밀번호로 로그인하면 [그림 3]처럼 ‘내 애플리케이션' 페이지로 이동하게 됩니다.



[그림 3] 내 애플리케이션 페이지


[그림 3]에서 왼쪽에 보이는 ‘앱 만들기'를 클릭하면 [그림 4]로 이동합니다. 여기에서 만들고자 하는 ‘앱 이름'과 ‘회사명'을 기입하시면 됩니다. ‘아이콘'은 선택사항입니다. 아이콘이 있으면 넣고 없으면 생략할 수 있습니다.



[그림 4] 내 애플리케이션 만들기


[그림 4]에서 화면 아래에 있는 ‘앱 만들기'를 클릭하면 새로운 앱이 생성됩니다.



[그림 5] 새로 만든 앱의 키 발급


[그림 5]를 보면 새로 발급된 앱에서 사용할 수 있는 4개의 키가 발급되었음을 알 수 있습니다. 우리는 이 중에서 2번째인 ‘REST API 키’를 사용할 계획입니다. 지난 2회 연재글에서 공공데이터 포털 API 키를 R 환경변수에 추가하는 방법에 대해 소개해드렸는데요. 다음 카카오맵 ‘REST API 키’도 R 환경변수에 추가하여 편리하게 사용하도록 하겠습니다. 추가하는 방법은 아래 [그림 6]을 참고하시기 바랍니다.



[그림 6] R 환경변수에 다음 카카오맵 API Key 추가하기
?

? 카카오맵 REST API 사용법

여기까지 잘 따라오셨으면 이제 카카오맵 REST API를 사용하는 방법에 대해 살펴봐야 합니다. 앞에서 [그림 2]의 다음 카카오 개발자 메인 페이지에서 오른쪽에 ‘지도/로컬' 아이콘이 있다ㄱ호 소개해드렸는데요. 이제 다음 카카오 개발자 메인 페이지로 이동하여 ‘지도/로컬' 아이콘을 클릭하면 [그림 7]로 이동합니다. 4가지 항목 중에서 우리는 REST API를 사용할 것이므로 ‘REST API’ 버튼을 클릭하면 ‘REST API’ 매뉴얼 화면으로 이동합니다. 지난 번에 공공데이터 포털 API를 사용해본 경험이 있으므로 쉽게 이해할 수 있겠죠?



[그림 7] 카카오맵 소개 페이지


카카오맵 REST API로는 다음과 같은 6가지 작업을 할 수 있습니다.

· 주소 검색
· 좌표 → 행정구역정보 변환
· 좌표 → 주소 변환
· 좌표계 변환
· 키워드로 장소 검색
· 카테고리로 장소 검색

우리가 하려고 하는 것은 주소를 기준으로 위도와 경도 좌표를 얻는 것이므로 ‘주소 검색'을 사용하면 됩니다.



[그림 8] 카카오맵 REST API 중 ‘주소 검색’ 관련 매뉴얼


[그림 8]에서 REST API 사용방법에 대해 확인해보겠습니다. 먼저 ‘Request’ 항목을 주목해주세요. R 코드와 다르게 생겼지만 이해하는 데 큰 어려움은 없습니다. 그러니까 ‘GET’ 방식으로 Request를 하는데요. 요청 URL은 ‘https://dapi.kakao.com/v2/local/search/address.json’이고, `query string`에는 `query` 파라미터만 사용됩니다. 위도와 경도 좌표를 얻고자 하는 ‘주소 정보'를 할당합니다. 마지막으로 `header`에 `Authorization`을 추가해주어야 하는데 우리가 앞서 발급받았던 ‘REST Key’를 여기에 할당하면 됩니다. R 코드로 작성하면 다음과 같습니다.



[그림 9] 카카오맵 REST API로 ‘주소 검색’하기


`query` 인자에 할당한 주소는 ‘경복궁' 도로명 주소입니다. 다음 연재에서 이 주소의 위도와 경도 좌표를 이용한 지도 위 시각화를 소개해드릴 예정입니다. 서울에서 위성사진으로 뚜렷하게 확인할 수 있는 장소가 몇 군데 있지만 지금 생각으로는 ‘경복궁’을 보여드리면 좋겠다 싶었습니다. 아무래도 ‘청와대' 위성사진을 보여드리는 것은 곤란하니까요. 다른 지역에 더 큰 관심이 있는 분은 개인적으로 확인해 보시기 바랍니다.


[그림 10] HTTP 응답 결과 확인하기



[그림 11] 콘솔 창에 출력된 결과


[그림 10]의 24행을 실행하면 [그림 11]과 같이 콘솔(console)창에 결과가 출력되는데요. 상태코드(Status)는 ‘200’으로 정상이고 콘텐트형태(Content-Type)는 ‘application/json’으로 되어 있습니다. 그러니까 HTTP 응답 결과로 JSON 타입의 데이터를 받았다는 것을 의미합니다. 그러면 jsonlite 패키지의 fromJSON() 함수를 사용하여 간단하게 데이터를 정리할 수 있습니다.



[그림 12] HTTP 응답 객체에서 JSON 타입 데이터 정리하고 구조 확인하기


[그림 12]의 33행을 실행한 결과가 길기 때문에 여기에서 모두 보여드릴 수 없지만 간략하게 설명하자면, `coord` 객체는 원소가 2개인 리스트입니다. [그림 8]의 마지막 줄에서 ‘응답 바디는 JSON 객체로 meta와 documents로 구성됩니다'라고 소개되어 있습니다. 그러니까 `coord`로 정리한 객체의 원소가 바로 meta와 documents가 됩니다. meta에는 우리가 찾는 내용이 없으므로 생략합니다. documents는 컬럼이 6개짜리 데이터프레임인데요. 그 중에서 `x`와 `y`가 바로 경복궁의 ‘경도'와 ‘위도'입니다. 따라서 아래와 같이 해당 좌표만 출력해볼 수 있습니다.



[그림 13] 위도와 경도만 출력


지금까지 했던 작업을 토대로 아파트단지 주소로 반복문을 실행하면 해당 아파트단지의 위도와 경도 좌표를 수집할 수 있습니다. 그런데 이런 번거로운 작업을 하는 이유는 분명합니다. 우리가 이미 수집해 놓은 공공데이터 포털 ‘아파트 실거래가' 데이터에서 ‘거래금액'을 목표변수로 사용하고 나면, 입력변수로 사용할 수 있는 데이터로는 ‘전용면적’과 ‘층' 밖에 없습니다.

물론 전용면적이 클수록, 층이 높을수록 거래금액이 높겠지만 아파트 거래금액은 지리적인 영향도 받습니다. 같은 강남구라고 해도 근처에 좋은 학교가 있는지, 좋은 학원이 있는지 여부에 따라 거래금액이 달라지기 때문입니다.

입력변수로 지리 정보를 사용하면 좋을 텐데 우리가 가지고 있는 데이터의 ‘법정동’이나 ‘지번', ‘지역코드'는 명목형 변수이기 때문에 회귀모형으로 적합하면 무수히 많은 더미변수를 갖게 됩니다. 결과를 해석하는 과정에서 까다롭게 느껴질 것이지만, 위도와 경도를 입력변수로 추가하면 지리 정보를 포함한 더 깔끔한 회귀모형을 만들 수 있을 것입니다.

다만 우리가 수집해 놓은 데이터에는 같은 주소를 사용하는 행이 많습니다. 이런 경우 위계모형을 사용하는 것을 고려할 수 있습니다. 하지만 문제를 좀더 단순하게 하기 위해 아파트 거래건별로 단위면적당 평균 거래금액 컬럼을 생성한 다음, 다시 아파트단지의 지번주소별 평균 거래금액을 만드는 방법을 선택하는 게 좋은 대안이 될 것입니다. 그렇게 되면 개별 아파트 거래건의 ‘전용면적'과 ‘층'이라는 입력변수는 버려야 하겠죠. 대신 아파트단지별로 전용면적당 평균 거래금액을 추정하는 모형을 만들어 볼 수 있을 것입니다.



[그림 14] 분석 데이터 변환하기


[그림 14]의 43~48행은 dplyr 패키지의 여러 함수를 사용하여 아파트단지별 단위면적당 평균 거래금액을 생성하는 코드입니다. 이를 위해 dplyr 또는 tidyverse 패키지를 호출하면 됩니다. 44행은 ‘법정동’과 ‘지번’ 컬럼을 붙여 ‘지번주소'라는 새로운 컬럼을 생성하라는 의미이고, 45행은 ‘거래금액’을 ‘전용면적’으로 나누어 ‘면적평균(금액)' 컬럼을 생성하라는 의미입니다. 이어서 필요한 컬럼(‘아파트’, ‘지번주소’, ‘면적평균’)만 남긴 다음 ‘아파트’, ‘지번주소’ 기준으로 ‘단지평균(금액)’ 컬럼을 생성하면 됩니다. `df` 객체는 326행, 3열의 데이터프레임이 됩니다. 이제 `df`의 ‘지번주소' 컬럼으로 ‘위도'와 ‘경도'를 수집하는 반복문을 실행합니다.


[그림 15] 위도와 경도를 저장할 컬럼 생성하기



[그림 16] 반복문으로 아파트단지별 위도와 경도 좌표 수집하기


[그림 16]에서 66~78행은 반복문을 실행하는 도중 에러가 발생하면 해당 행은 생략하고 다음 행을 실행하도록 설정한 것입니다. 만약 이런 설정을 추가하지 않으면 반복문 실행 도중다.

반복문 실행 도중 에러가 발생하면 78행의 안내문구를 출력하도록 설정했는데요. 실제로 이번 작업을 해보니 일부 건에 대해 에러가 발생했음을 알 수 있습니다. 반복문 실행이 종료된 다음 83행을 실행해보니 `df` 객체의 ‘위도’ 컬럼값이 NA인 행은 모두 3건이었습니다. 아마도 해당 아파트단지의 지번주소가 예전 주소였거나 또는 잘못 입력되었던 것으로 판단됩니다.

일반적으로 이런 경우가 발생하면 해당 아파트단지의 정확한 주소를 일일이 검색하여 업데이트를 하는 것이 맞지만, 이번 예제에서는 3건을 모두 지우고 다음 작업을 위해 RDS로 저장하는 것으로 마무리하겠습니다.



[그림 17] 위도 좌표가 NA인 행 삭제하고 RDS로 저장하기
?

? 맺음말: 전용면적당 평균 거래금액의 시각화

이상으로 다음 카카오맵 API를 활용하여 지번주소로 위도와 경도 좌표를 수집하는 방법에 대해 알아봤습니다. 다음 연재에서는 구글맵 API Key를 발급받고 ggmap 패키지로 지도 위에 시각화하는 방법을 소개해 드리겠습니다. 위도와 경도를 이용하여 2차원 지도 위에 아파트단지 전용면적당 평균 거래금액을 시각적으로 표시하면 어떤 패턴을 발견할 수도 있습니다. 다음 연재를 기대해주세요. 감사합니다. (다음 회에 계속)

?

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

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