[공공데이터 포털 Open API]국토교통부 상업업무용 부동산 거래정보 EDA

2020. 11. 26. 15:41Project/지하철 데이터를 활용한 서울 상가거래 예측

※ 최대한 보기 편하도록 jupyter notebook을 그대로 올리고자 하였으나, 종종 업로드 길이문제, 혹은 jupyter notebook상 preview에서 지원하지 않는 시각화로 인해서 코드블럭을 사용하고 있습니다.


데이터셋

todayisbetterthanyesterday.tistory.com/86?category=858543

 

[공공데이터 포털 Open API] - Python을 활용해서 공공데이터 포털 국토교통부 데이터 로드 (글자 깨

from lxml import html from urllib.parse import urlencode, quote_plus, unquote import xml.etree.ElementTree as ET import requests, bs4 import pandas as pd # parameter for request # pageNo를 다르게 주..

todayisbetterthanyesterday.tistory.com

 공공데이터 포털의 OpenAPI를 통해서 받은 "국토교통부 상업업무용 부동산 거래정보" 데이터이다. 이를 활용한 EDA를 진행하고자 한다. 

 ( 만약 데이터를 직접 받기 어려우시다면, 요청시 메일을 통해 직접 보내드리겠습니다.) 

 

여기에는 위도 경도 정보가 담겨있지 않다.

서울_행정동_중앙좌표값.csv
0.02MB

 위의 csv파일은 행정동별 중앙값을 kakao API를 통해서 정리해놓은 것이다. polygon형태가 아니라, 행정동의 테두리를 만드는 시각화를 진행하진 못하지만, 특정 법정동(행정동)의 지표로 활용할 수 있다. 

 이 데이터를 공공데이터 포털을 통해 만든 dataframe에 df.join문을 통해서 쉽게 연결시킬 수 있다. 이는 간단한 문제이기에 직접하길 권장한다. 

시각화를 통한 EDA

# library load

import datetime
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib

import matplotlib as mpl
import matplotlib.font_manager as fm
import matplotlib.colors as mcolors
mpl.rcParams['axes.unicode_minus'] = False

# 한글깨짐 발생 - font 찾기
[(f.name, f.fname) for f in fm.fontManager.ttflist if 'Nanum' in f.name]

plt.rcParams["font.family"] = 'NanumGothic'
plt.rcParams["font.size"] = 10
plt.rcParams["figure.figsize"] = (14,4)
# data load

house = pd.read_csv("상업업무용 부동산 거래내역_위경도.csv",encoding = 'cp949',thousands=',')
house.drop(["Unnamed: 0"],axis = 1, inplace = True)

 위의 데이터는 제 local에 위의 링크의 방법으로 저장한 csv파일입니다. 

시기별 전체 상업업무용 부동산 거래횟수

plt.figure(figsize=(40,10))
matplotlib.rc('xtick', labelsize=10) 
matplotlib.rc('ytick', labelsize=10)
 
house.groupby('년').count().iloc[:,:1].rename(columns={'월':'년도별 거래횟수'}).plot(kind='bar',title='년도별 상가 거래횟수')
house.groupby(['년','월']).count().iloc[:,:1].rename(columns={'일':'월별 거래횟수'}).plot(kind='bar',title='월별 상가 거래횟수')
house.groupby(['년','월','일']).count().iloc[:,:1].rename(columns={'건축년도':'일별 거래횟수'}).plot(title='일별 상가 거래횟수')

 위의 데이터를 보면 년도별 증감추세를 알 수 있다. 두 번째 그래프로 보아, 보통 상가의 거래가 봄,여름에 더 많이 발생하는 주기성을 확인해볼 수 있다. 하지만, 이 특성은 2018년 이후로 잘 드러나지 않는 것 같다. 

# folium library install
!pip install folium   

# method to solve encoding problem 
!pip install git+https://github.com/python-visualization/branca.git@master  

 library의 추가 다운로드가 필요하다. 아래는 folium 라이브러리를 사용할 때, 팝업에 한글이 깨지는 것을 방지하기 위해 추가설치를 할 필요가 있다. 

지역별 전체 상업업무용 부동산 거래횟수

house.head()

# pivot table을 통한 연도별/지역별 전체 상업업무용 거래횟수
pd.set_option('display.max_column', 500)
pd.pivot_table(house,index=['년'],columns = ['법정동'],values = ['시군구'],aggfunc = len).style.highlight_max()

 이를통해 한눈에 쉽게 어떤 동이 어떤 해에 가장 많이 거래되었는지 한 눈에 확인할 수 있다. 

 이를 지도로 시각화해보면 아래와 같다.

- folium.flugins.ScrollZoomToggler

import folium
from folium import plugins

def make_map_folium(df,year = 0) :    
    
    map_osm = folium.Map(location=[37.566651, 126.978428], zoom_start=12)
    plugins.ScrollZoomToggler().add_to(map_osm)
    
    if year == 0 :
        latlng = df[['위도','경도']].to_numpy()
    else : 
        df = df[df['년'] == year]
        latlng = df[['위도','경도']].to_numpy()
    
    popups = [str(i) for i in range(len(latlng))]   
    marker = plugins.MarkerCluster(latlng, popup = popups)
    marker.add_to(map_osm)

    return map_osm

 지도의 연도별 서울 전역의 거래량을 확인하기 위해 plugins.scrollzoomtoggler 방식으로 데이터를 살펴보고자 한다. 그리고 이를 함수화 하였다. 

 parameter는 데이터프레임과, year로 만약 dataframe에 존재하는 year가 없다면 0으로 삽입하여 전체년도를 확인하면 된다. 

print('전체')
make_map_folium(house)

 위는 스크롤 또는 지도에 표시된 '+'키를 통해서 저 수들을 통합 및 분해 할 수 있다. 이를 통해 지역별 부동산 거래 발생건수를 쉽게 확인할 수 있다. 

 그리고 아래의 결과처럼 위치를 이동하며, 확대하며, 축소하며 자세한 결과를 확인할 수 있다. 

print(2015)
make_map_folium(house,2015)

print(2016)
make_map_folium(house,2016)

print(2017)
make_map_folium(house,2017)

print(2018)
make_map_folium(house,2018)

print(2019)
make_map_folium(house,2019)

 위의 결과를 통해서 원하는 지역을 scroll하여 거래횟수가 연도별로 어떻게 변화하는지 확인할 수 있다. 

 이 과정은 특정 한 두 지역을 볼 때는 비효율적이라고 생각하지만, 서울 전역의 부분적 특성을 확인할 때는 효율적이라고 생각한다. 

 다음은 용도 지역에 해당하는 정보이다. 

용도지역

용도지역은 해당 지역이 해당 용도로 구성된다는 것이지, 해당 거래의 건물이 해당 용도로 사용된다는 뜻이 아님. 즉, 주거지역 내에서 상가용도라면 상가로 사용해야함. 즉, 지역이 주거지역으로 구분되어있다고 하더라도 해당 거래는 상가건물 거래를 뜻한다. (조사 및 데이터가 잘못되지 않았다면)

  • 용적률 기준

  • 제1종전용주거지역 : 50퍼센트 이상 100퍼센트 이하

  • 제2종전용주거지역 : 50퍼센트 이상 150퍼센트 이하

  • 제1종일반주거지역 : 100퍼센트 이상 200퍼센트 이하

  • 제2종일반주거지역 : 100퍼센트 이상 250퍼센트 이하

  • 제3종일반주거지역 : 100퍼센트 이상 300퍼센트 이하

  • 준주거지역 : 200퍼센트 이상 500퍼센트 이하

  • 중심상업지역 : 200퍼센트 이상 1천500퍼센트 이하

  • 일반상업지역 : 200퍼센트 이상 1천300퍼센트 이하

  • 근린상업지역 : 200퍼센트 이상 900퍼센트 이하

  • 유통상업지역 : 200퍼센트 이상 1천100퍼센트 이하

  • 자연녹지지역 : 50퍼센트 이상 100퍼센트 이하

pd.pivot_table(house,index=['용도지역'],columns = ['년'],values = ['시군구'],aggfunc = len)

 위의 데이터는 상가업무용 부동산 거래횟수를 용도지역에 따라 년도별 Count를 한 것으로 당연하게 일반상업이 가장 높다. 그리고 일반주거지역에 존재하는 상가도 많은 거래가 되는 것을 볼 수 있으며, 일반주거의 경우, 점차 거래횟수가 줄어드는 것을 확인할 수 있다. 

 

용도지역별 연도별 건물면적 평균

pd.pivot_table(house,index=['용도지역'],columns = ['년'],values = ['건물면적']).style.highlight_max()

용도지역별 연도별 거래금액 평균

pd.pivot_table(house,index=['용도지역'],columns = ['년'],values = ['거래금액']).style.highlight_max()

 

 이상으로 데이터에 대해서 간단한 사실들을 알아보았다. 다음은 CNN과 LSTM을 통해서 부동산 거래 정보 예측을 하는 모델을 만들고자한다.