데이터 인사이트

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

[빅데이터 분석] 나성호의 R 부동산 데이터 분석 특강 (7회) : 웹 크롤링으로 아파트단지별 상세정보 수집

작성자
관리자
작성일
2020-10-26 15:06
조회
272

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

웹 크롤링으로 아파트단지별 상세정보 수집

 
나성호는 금융회사에서 데이터 분석을 직접 수행하는 마케터로 17년 동안 근무했다. 지금은 데이터 마이닝 박사 과정에 재학중이며, 머신러닝을 강의하고 있다.
안녕하세요? 나성호입니다. 지난 연재에서 구글맵 API를 활용해 지도 위 시각화 방법에 대해 알아보았습니다. 지금까지 우리가 분석하려는 2019년 1~10월에 거래된 서울특별시 강남구 아파트 매매 실거래가 데이터의 이모저모를 살펴봤습니다. 이번 연재의 종착지는 다양한 머신러닝 알고리즘을 활용하여 아파트 매매금액 결정모형을 하나씩 만들어보고, 가장 우수한 성능을 보이는 모형이 어떤 것인지 소개해드리는 것인데요.

지금 우리가 가지고 있는 데이터로는 입력변수로 활용할 수 있는 컬럼이 매우 부족한 상황입니다. 따라서 이번 회 연재에서는 인터넷에서 아파트단지별 상세정보를 수집하는 방법을 소개해 드릴까 합니다. 현재 인터넷에서 아파트단지 정보를 제공하고 있는 웹사이트는 여러 군데가 있지만, 그 중에서 가장 다양한 정보를 포함하고 있는 곳 중 하나는 한국감정원에서 운영하고 있는 ‘공동주택관리정보시스템’(http://www.k-apt.go.kr/)이라고 할 수 있겠습니다.

• 공동주택관리정보시스템 살펴보기

 [그림 1]은 공동주택관리정보시스템의 메인 화면입니다. 화면 왼쪽 모서리에 국토교통부와 한국감정원이 보이고, 화면 상단에는 이 웹사이트에서 제공하는 메뉴가 잘 정리되어 있습니다. 먼저 ‘K-apt소개' 메뉴를 클릭하면 ‘공동주택 관리비의 투명성 제고 및 건전한 관리문화 정착도모'를 위해 ‘공동주택관리 정보를 공개' 하고 ‘전자입찰을 운영'하는 시스템이라고 ‘공동주택관리정보시스템'을 소개하고 있습니다.



[그림 1] 한국감정원의 ‘공동주택관리정보시스템' 메인 화면


우리는 아파트단지별 세부 정보를 수집하는 것이 목적이므로 ‘단지정보’를 클릭해보겠습니다. 화면이 바뀌면서 왼편에는 서울특별시 지도가 보이고 오른편에는 지역을 선택할 수 있도록 메뉴가 잘 정리되어 있습니다. [그림 2]에서 보이는 것처럼 ‘발생월기준'은 가장 최근 정보로 자동 설정되는 것 같습니다. 그 아래에 있는 ‘조회조건' 메뉴를 통해 원하는 지역을 선택할 수 있는데요. 예를 들어 ‘서울특별시', ‘강남구'를 선택하면 [그림 2]와 같이 14개 법정동 목록이 출력됩니다.



[그림 2] ‘단지정보' 메뉴로 이동


[그림 2]에서 ‘개포동'을 클릭하면 [그림 3]과 같이 해당 지역의 아파트단지 목록이 출력됩니다. 개포동에는 총 17개의 아파트단지 정보가 포함되어 있습니다. 역시 왼편에는 지도가 보이는데요. 이번에는 각 아파트단지에 파란색 기호가 추가되어 있습니다. 아파트단지를 선택하려면 지도 위 파란색 기호를 클릭하거나 오른쪽에 있는 아파트단지 목록에서 조회하고자 하는 아파트단지를 클릭하면 됩니다.



[그림 3] 서울특별시 강남구 개포동 아파트단지 목록


[그림 3]에서 ‘LG개포자이아파트'를 클릭하면 해당 아파트단지의 상세정보 페이지로 이동하는데요. 여러 개의 세부 정보가 개별 웹 페이지로 정리되어 있습니다. 그 중에서 [그림 4]는 ‘기본정보’ 페이지를, [그림 5]는 ‘관리시설정보’ 페이지를 캡처한 이미지입니다.

[그림 4]와 같이 아파트단지 ‘기본정보' 페이지는 아파트단지명을 시작으로, 법정동주소, 분양형태, 난방방식, 연면적, 동수/세대수, 시공사/시행사, 단지분류, 도로명주소, 복도유형, 사용승인일, 주거전용면적 및 면적별 세대현황 등을 포함하고 있습니다.

그리고 [그림 5]의 ‘관리시설정보' 페이지는 일반관리, 경비관리, 청소관리, 소독관리 등 관리사항 및 시설사항과 주변사항이 담겨 있습니다. 특히 시설사항에는 건물구조, 주차대수, CCTV 대수, 급수방식, 승강기종류/대수 등이 포함되어 있습니다. 주변사항에는 대중교통과 편의시설 및 교육시설이 소개되어 있습니다. 이처럼 한국감정원에서 운영하고 있는 공동주택관리정보시스템에는 개별 아파트단지에 대해 매우 상세한 정보를 포함하고 있습니다.


[그림 4] 아파트단지의 ‘기본정보' 페이지



[그림 5] 아파트단지의 ‘관리시설정보' 페이지


지금까지 살펴본 것처럼 공동주택관리정보시스템에는 개별 아파트단지별로 상세정보를 포함하고 있으므로, 이 사이트를 크롤링하여 앞에서 소개한 여러 데이터를 수집하게 되면 서울특별시 강남구 아파트 매매금액 결정모형에 사용할 수 있는 입력변수를 확보하게 됩니다.

그런데 웹 페이지를 크롤링하기 전에 미리 확인해야 할 것이 있습니다. 공공데이터포털의 오픈 API처럼 데이터를 제공할 목적으로 만들어진 사이트와 달리 일반적인 웹 페이지는 ‘robots.txt’를 통해 크롤링을 허용하는 범위를 명시해놓고 있습니다. 따라서 이 부분을 먼저 확인해야 합니다.

공동주택관리시스템의 ‘robots.txt’를 확인하려면 먼저 메인화면으로 이동한 다음, 웹 브라우저 주소창에서 ‘/robots.txt’를 추가해주면 됩니다. 따라서 http://www.k-apt.go.kr/robots.txt와 같은 URL 주소로 이동하면 [그림 6]과 같은 내용이 웹 브라우저에 출력됩니다.

가장 위에 출력된 것은 모든 User-agent에 아래 내용이 적용된다는 것을 의미합니다. 그리고 아래 내용에는 허용(Allow) 또는 허용하지 않는(Disallow) 경로(path)가 명시되어 있는데요. 이 웹 페이지에는 ‘허용하지 않는' 여러 개의 경로(path)만 명시되어 있으므로 아래 목록을 제외하면 웹 크롤링을 시도해도 될 것 같습니다. 다행히도 우리가 수집하려는 정보가 ‘/kaptinfo’에 포함되어 있습니다. 만약 ‘/kaptinfo’가 허용하지 않는 목록에 있었다면 아마도 이번 연재글을 쓰지 못했을 것 같습니다.

몇 개월 전까지 이 사이트에 ‘robots.txt’ 자체가 없었는데요. 이번 연재를 하면서 다시 확인해보니 최근에 ‘robots.txt’가 추가된 것을 알게 되었습니다. 그래서 혹시나 웹 크롤링을 허용하지 않으면 어쩌나 하고 조마조마 했습니다.



[그림 6] 공동주택관리정보시스템의 'robots.txt'


이제 웹 크롤링 코드를 소개해드려야 하는데요. 사실 이걸 두고 고민을 좀 많이 했습니다. 제가 웹 크롤러 코드를 공개하는 것은 어려운 일이 아니지만, 코드를 한 줄 한 줄 설명하려면 꽤 오랜 시간이 걸립니다. 그래서 상세한 주석을 추가한 웹 크롤러 코드를 소개해드리는 정도로 마무리할까 합니다. 대신에 제가 수집한 데이터는 깃허브 저장소(https://github.com/MrKevinNa/r_real_estate)에 공유했습니다. 독자 여러분께서 혜량하여 주시면 감사하겠습니다.

깃허브 저장소에 올린 파일 목록을 소개해드립니다.

- apt_price_2019_df.RDS : 2019년 1~10월에 거래된 서울특별시 강남구 아파트단지별 평균 매매금액 및 지리정보가 저장된 파일 (323행 5열)
- area.RDS : 우리나라 법정동 코드가 저장된 파일 (5048행 4열)
- aptList.RDS : 서울특별시 강남구 소재 아파트단지 목록이 저장된 파일 (168행 10열)
- aptInfo.RDS : 서울특별시 강남구 소재 아파트단지 상세정보가 저장된 파일 (157행 24열)



[그림 7] 웹 크롤링 코드 1 : area.RDS 파일을 읽고 서울특별시 강남구 지역만 선택하기


공동주택관리정보시스템에서는 법정동코드를 이용하여 각 지역별 데이터를 수집할 수 있습니다. 그리고 법정동코드는 ‘행정표준코드관리시스템(https://www.code.go.kr)’에서 내려받을 수 있습니다. 제가 공개한 깃허브 저장소에서 ‘area.RDS’ 파일을 내려받은 다음, 위 코드를 실행하면 5048행 4열의 데이터프레임이 생성되는데요. 현재 우리나라의 법정동이 5048개라는 것을 의미합니다. 이 중에서 서울특별시 강남구에 속한 법정동만 골라 `area` 객체에 덮어쓰면 14행만 남습니다.

[그림 8]은 서울특별시 강남구 소재 14개 법정동별로 아파트단지 목록을 수집하는 것입니다. 앞에서 개포동에 17개 아파트단지가 포함되어 있다는 것을 소개해드린 바 있습니다. 공동주택관리정보시스템에는 강남구에만 총 168개 아파트단지가 있는데요. 아래 코드를 실행하면 14개 법정동별로 아파트단지 목록을 수집합니다.



[그림 8] 웹 크롤링 코드 2 : 서울특별시 강남구 소개 아파트단지 목록 수집하기

[그림 8]의 코드에서 특이한 점은 HTTP 요청(Request)을 10초에 한 번씩 실행하는 것으로 설정해야 한다는 것입니다. 예전에는 1초에 한 번씩 실행해도 되었지만 최근 웹 사이트가 개편한 것으로 보입니다. 만약 중간에 잠시 멈춤(pause) 기능을 추가하지 않으면 웹 데이터 수집이 불가능하므로 주의하셔야 합니다.



[그림 9] 웹 크롤링 코드 3 : 아파트단지 상세정보 수집하는 사용자 정의 함수 만들기 1

지금까지의 작업으로 아파트단지 목록을 수집하였다면 이제 ‘KAPT_CODE’ 컬럼을 이용하여 아파트단지별 상세정보를 수집할 수 있게 되었습니다. 한 번의 HTTP 요청(Request)으로도 많은 정보를 얻을 수 있지만, 불필요한 정보를 수집하는 것은 오히려 이후 작업에 방해만 될 수 있으므로 이후 작업에 필요하다고 판단되는 컬럼만 선별하여 수집합니다. 이때, 사용자 정의 함수를 미리 만들어 놓으면 다음 코드가 깔끔해집니다. 사용자 정의 함수에는 수집하려는 컬럼을 명시해 놨습니다. [그림 10]에서 보는 바와 같이 사용자 정의 함수를 실행하면 상세정보 21개 컬럼에 세대수 합계 및 법정동주소와 도로명주소까지 아파트단지별로 총 24개 컬럼을 갖는 객체를 생성할 수 있습니다.



[그림 10] 웹 크롤링 코드 4 : 아파트단지 상세정보 수집하는 사용자 정의 함수 만들기 2


[그림 10]의 122~125행을 실행하면 전체 세대정보의 합계를 계산하여 `count` 객체에 할당하게 되는데요. 만약 `count` 객체가 생성되지 않으면 NA 값을 대신 생성하도록 처리하였습니다. 이와 같이 하는 이유는 어떤 아파트단지에서 세대정보가 포함되지 않으면 해당 아파트단지의 정보를 모두 수집할 수 없게 되기 때문입니다. 이런 작업은 반복문을 실행하면서 확인할 수 있으므로 상당한 인내심이 필요한 작업이라 할 수 있습니다.



[그림 11] 웹 크롤링 코드 5 : 아파트단지 상세정보 수집하는 사용자 정의 함수 만들기 3

[그림 11]과 같이 사용자 정의 함수를 완성하게 되면 앞에서 언급한 바와 같이 총 24개 컬럼을 생성하게 되는데요. 만약 사용자 정의 함수대로 데이터를 수집할 수 없게 되면 [그림 12]의 반복문 실행 도중 에러가 발생하게 되므로 전체 반복문 실행이 중단됩니다. 따라서 반복문 안에 tryCatch() 함수를 추가함으로써 중간에 에러가 발생하는 경우, 현재 아파트단지에 대한 실행은 건너 뛰고 다음 아파트단지의 상세정보 수집을 실행하도록 설정해 놓아야 합니다.


[그림 12] 웹 크롤링 코드 6 : 반복문으로 아파트단지 상세정보 수집하기



[그림 13] 웹 크롤링 코드 7 : 수집한 아파트단지 상세정보 전처리하기 1

서울특별시 강남구 소재 168개 아파트단지에 대한 상세정보를 모두 수집하였다면 이제 일부 컬럼에 대해서 전처리를 실행해야 할 때입니다. 모든 컬럼이 문자형 벡터로 저장되어 있으므로 이 중에서 범주형 벡터와 숫자형 벡터로 구분하여 실행해야 합니다. 특히 범주형 벡터 중에서 이상한 값이 포함되어 있거나 불필요하게 여러 개의 레벨(levels)로 되어 있으면, 이를 2~3개의 범주로 변경해주는 것이 좋습니다. 왜냐하면 범주의 수를 줄임으로써 나중에 회귀모형을 만들었을 때 더미변수가 적게 생성되므로 회귀모형을 해석하는 것이 좀 더 수월해지기 때문입니다.



[그림 14] 웹 크롤링 코드 8 : 수집한 아파트단지 상세정보 전처리하기 2


숫자형 벡터에 대해서는 결측값(NA)만 제거해주는 것으로 정리하였습니다. 결측값은 지금과 같이 소수인 경우 제거해주는 것이 가장 깔끔한 방법이 될 것입니다. 만약 결측값의 비중이 제법 큰 경우라면 평균이나 중위수 같은 값으로 단순 대체(Imputation)하거나 아니면 다중 대체 방식을 사용해야 합니다.

아파트단지 상세정보에 대해 전처리 과정을 마무리했더니 168행이 157행으로 줄었습니다. 지난 연재글에서 아파트단지별 평균 매매금액으로 정리해둔 것이 총 323행이므로 그 중 절반도 안 되는 아파트단지 정보만 겨우 수집할 수 있게 되었습니다. 그래도 위도와 경도만으로 아파트금액을 추정하는 것보다는 나을 것입니다.



[그림1 5] 웹 크롤링 코드 9 : 수집한 아파트단지 상세정보 전처리하기 3


이상으로 한국감정원이 운영하는 공동주택관리정보시스템에서 서울특별시 강남구 소재 아파트단지별 상세정보를 수집하는 방법에 대해 소개해드렸습니다. 이제 남은 3회 연재글에서는 아파트단지별 가격 및 상세정보 데이터세트를 병합한 다음, 3가지 회귀모형을 적합하는 방법에 대해 소개해드리겠습니다. 감사합니다. (다음 회에 계속)



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

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