본문 바로가기

Function

공시지가 - 전국 모든 땅의 가격은 얼마나 높고 낮은가?

대표

국토교통부 지적통계에 따르면, 2018년 말 기준으로 전국의 필지는 38,786,795개가 있다.*** 우리나라는 1990년부터 모든 토지에 대해 개별공시지가를 산정해서 발표했는데, 작년 말에 처음으로 전국 모든 토지의 30년간 공시지가 변동 이력을 csv 형식으로 공개하기 시작했다. 

 

***. 국토부 통계누리 지적통계 참고

http://bitly.kr/MTojEnUl

 

 

국가공간정보 포털에 30년치가 한번에 올라와 있다

 

데이터는 국가공간정보 포털에 있다.

http://openapi.nsdi.go.kr/nsdi/eios/ServiceDetail.do?svcSe=F&svcId=F012&provOrg=NIDO

 

 

 

 

 

서울같은 경우는 엑셀로 이미 공개하고 있었지만 다른 시도의 데이터는 잘 찾기가 어려웠는데, 기존에 이 곳에서 조금씩 공개하다가 세 달 쯤 전에 처음으로 30년의 이력이 정리되어 올라왔다.

 

 

전국의 모든 30년 개별 공시지가 파일을 받아서 압축을 폴면 88.7GB가 된다.

그렇다. 메가가 아니라 기가다.  웬만한 PC에서 R 같은 프로그램에서 한번에 읽는것은 포기해야 한다.

 

 

파일 하나를 열어보자. 세종시가 500MB 정도로 가장 만만하니 그것을 열어본다.

 

앞의 고유번호는 PNU 코드. 법정동 지번주소가 19자리로 코드화 되어 있다. 용량은 크지만 대부분 겹치는 정보가 많기 때문에, 고유번호, 기준연도, 공시지가 정도만 추출해도 된다. 공시지가는 1제곱미터당 원화 가격이 표시되어 있다. 6920은 1제곱미터에 6920원이다. 천원 단위가 아니라 1원단위 맞아? 라고 생각한다면 서울에서 여덟자리 숫자를 흔하게 마주할 때 비로소 고개를 끄덕이게 될 것이다.

 

2000년 같은 경우 두 번 공시한 곳이 있고, 불완전환 PNU코드 등 데이터에 노이즈도 더러 있기 때문에 이런 부분들은 알아서 처리해주는 수 밖에 없다. 대략적으로 경향을 볼 때는 제거해버리면 편하고, 하나하나가 중요할 때는 어쩔 수 없이 찾아내서 수정해야 한다.

 

 

 

PNU 중심점을 추출해서 지도 위에 올려보자

 

여기서는 1990년, 2000년, 2010년, 2019년 네 해의 개별공시지가를 각각의 지도에 그려보려고 한다. 매 지도마다 대략 3800만개의 사각형들, 즉 7600만개의 삼각형을 그려서 땅으로부터 올리려고 하는데, 사실 웬만한 소프트웨어나 시각화 툴로는 엄두를 내지 못하는 양이지만, 그래도 지난번에 전국의 모든 건물과 산과 강과 도로를 그렸을 때보다는 많이 가벼운 양이다. 여기서는 C++에서 OpenGL로 작업했다. GTX 1660Ti 정도, 즉 비디오램이 6GB 정도 되는 30만원 정도의 카드를 꽂으면 한번에 전국 한장은 그릴 수 있다.

 

전국 PNU가 key값이 되어주므로 연도와 가격에 따라 필요한 데이터를 추출할 수 있다. 그런데 땅 위에 올리려면 PNU의 좌표값을 알아야 한다. 다행히도 같은 링크에 shp 파일이 예전부터 올라오고 있었다.

 

 

역시 압축을 모두 풀면 31.9GB에 이른다. 이런 작업은 결국 하나하나씩 시간을 들여 손품을 팔아야 하는데, 이런 생고생이 싫다면 기존의 툴들을 찾아서 익히고 코드를 짜서 해결해야 한다.

 

shp를 바로 읽어주는 라이브러리도 있을텐데, 이번에는 그냥 기존에 알던 방법들을 조합해서 해결했다.

 

GDAL에서 ogr2ogr을 사용해서 변환했다. 다음의 명령줄로 전체를 한 번에 UTMK좌표계의 geojson으로 변환할 수 있다. 명령어가 복잡해 보이지만 사실은 간단하다. 중간에 따옴표 안의 긴 내용은 proj4 형식의 좌표계 정의 부분이기 때문이다. 이 명령어는 해당 폴더 안에 들어가서 사용해야 한다. GDAL 설치와 기본적인 ogr2ogr 사용법은 검색하면 많이 나온다.

 

for %f in (*.shp) do ogr2ogr f GeoJSON -s_srs "+proj=tmerc +lat_0=38 +lon_0=127.0028902777778 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs +towgs84=-115.80,474.99,674.11,1.16,-2.31,-1.63,6.43" -t_srs EPSG:5179 "%~nf.geojson" "%f"

 

 

geojson은 텍스트 파일 이므로 메모장에서도 열 수 있다. 문자열을 다루는 것은 상대적으로 익숙하므로 위와 같이 shp를 geojson으로 변환한 후 작업했다.

 

 

국토부에서 공개한 파일은 개별 필지마다 온전한 경계지점이 있는 shape이다. 지금은 pnu마다 한 점만 필요하고 전국 스케일의 그림을 그릴 것이므로 시간이 없다면 개별 필지마다 아무 점이나 한 점을 추출해오면 된다. 그것이 찜찜하다면 각 필지마다 내부 중점을 따내야 하는데, QGIS 라면 realcentroid 플러그인 정도면 유용하고 빠르게 사용할 수 있다. 그럼에도 불구하고 전국 모든 시도에 대해 작업하는 것은 상당히 번거롭고 오래 걸리므로 결국 다시 코드 기반으로 변환하는 방식을 택했다.

 

여기서는 mapbox에서 깃헙에 공개한 라이브러리의 함수를 이용했다. 

https://github.com/mapbox/polylabel

 

mapbox/polylabel

A fast algorithm for finding the pole of inaccessibility of a polygon (in JavaScript and C++) - mapbox/polylabel

github.com

여러가지 언어로 되어 있는데 라이브러리 사용법은 그리 복잡하지 않다. 다만 c++의 경우 header-only 라이브러리처럼 간편하지는 않으므로 맵박스의 다른 라이브러리들을 같이 불러와야 한다.

 

그래서 2019년 shape파일의 PNU 중심점과, 앞에서 불러온 csv에서 추출한 PNU별 공시지가가 있다면 두 테이블을 join해서 시각화에 필요한 데이터를 완성할 수 있다. 아래와 같은 형식이다. 

 

 

 

 

전국 개별공시지가 시각화

 

그럼 이제 그려보자.

사실 코드를 짜서 그리는 일이 가장 복잡하므로 "더 이상의 자세한 설명은 생략한다"

 

 

 

사실 처음에는 전라북도를 들여다보고 있었는데, 기존에 서울에 대해서만 알고 있었기에 값들이 생경하게 다가왔다. 정말 천원 단위가 아니고 1원단위인지, 혹은 제곱미터당 가격이 맞는지 그래도 확인해보려고 서울만 한번 얹어봤다.

 

아래는 서울과 충청남도, 전라북도

아, 데이터는 맞구나.

서울은 끝이 안보인다.

그래 한번 끝을 보자.

 

 

아직도 끝이 조금 잘렸다. 가장 높은 곳이 명동, 오른쪽에 약간 낮아(?)보이는 곳이 강남역 부근이다.

 

 

이제 전국이 궁금해지기 시작한다.

그러므로 전국을 올려놓고, 1990년부터 10년마다 네 해의 공시지가를 그려보았다.

색도 약간 넣었다. 막대의 높이와 색은 모두 공시지가라는 동일한 정보를 중복해서 표현한다.

높이의 경우 로그스케일 같은 것을 사용하지 않고 그냥 그대로 가격과 높이가 비례하도록 했다.

 

 

 

 

 

 

 

 

 

 

네 해의 공시지가를 보았다.

중간중간에 도시도 아닌 곳에서 높은 아주 공시지가로 올라온 곳들이라고 해서 데이터가 모두 잘못된 것은 아니다. 어떤 곳을 전에 찾아본 적이 있는데, 광물이었나? 땅 속에 있는 자원과 관련된 곳이었던 것 같다.(기억이 확실치 않다)

 

비교가 잘 안되므로 한번 옆으로 붙여보겠다.

모바일에서는 아주 작게 보일 것이고, pc의 경우 클릭하면 화면이 클수록 크게 보인다.

 

 

서울의 경우 최대값 데이터가 잘못되었다고 생각했다. 2015년도만 해도 명동 네이쳐리퍼블릭이 8000만원대였기 때문이다. 그런데 알고 봤더니 바로 그 땅이 2019년에는 제곱미터당 1억 6천만원. 

찾아보니 이미 기사가 나왔다. 2018년과 2019년 사이에 해당 토지의 공시지가를 두 배로 상향했다고 한다.

강남은 2015년에 5000만원대였는데 작년에는 이미 2015년의 명동 가격을 넘었고, 명동은 그보다 더 많이 올라갔다.

 

 

 

확대해서 보면 이렇다. 필지 하나에 선 하나.

 

끝.