본문 바로가기
Daily

[Study] 아파트 호재 분석(2020-03-07)

by dovah. 2020. 3. 7.
반응형

부동산 호재가 아파트 매매가에 얼마나 영향을 끼칠까?

 

라는 궁금증에서 친구들과 시작하게 되었다.

 

우선 데이터 수집처부터 확인했다.

 

1. 공공데이터 수집

 

공공데이터를 통해서 아파트 매매 실거래 데이터를 확인할 수 있었다.

 

해당 데이터를 수집하기 위해서 API 활용 신청하고 데이터 수집을 진행했다.

 

공공데이터 활용 신청의 경우 신청한 후 거의 바로 ServiceKey가 발급되는데, 실제로 API를 연결해서 사용하려면 1~2시간 정도의 대기 시간이 필요했다.

 

이후 내가 확인하고 싶은 지역의 법정동 코드를 알아야한다.

법정동 코드는 https://www.code.go.kr/stdcode/regCodeL.do에서 확인할 수 있다.

 

 

서비스 키 발급과 법정동 코드를 알면 아래의 코드로 데이터를 수집할 수 있다.

import requests
import pandas as pd
import time
import xml.etree.ElementTree as ET
from tqdm import tqdm
service_key = '####'

geo_code = ['11110']

year_list =  [str(x) for x in list(range(2006, 2021))]
month_list = [str(x).zfill(2) for x in list(range(1, 13))]
period_list = []
for year in year_list:
    for month in month_list:
        period_list.append(year+month)


data_list = []
x = 0

temp_url = 'http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade?&LAWD_CD={g}&DEAL_YMD={d}'
for geo in geo_code:
    for period in tqdm(period_list):
        url = temp_url.format(g=geo, d=period)

        url 
        r = requests.get(url+service_key)
        temp_text = r.text
        root = ET.fromstring(temp_text)
        
        temp_data = pd.DataFrame()
        col_list = ['거래금액', '건축년도', '년', '법정동', '아파트', '월', '일', '전용면적', '전용면적', '지번', '지역코드','층']
        
        for col in col_list:
            temp_list = [i.text for i in root.iter(col)]
            temp_data[col] = temp_list

        data_list.append(temp_data)
        
        x +=1
        
        if x == 5:
            time.sleep(10)
            x = 0
            print('break time')

data = pd.concat(data_list)
data.to_pickle('d:/apart_trade_data.pkl')

 

2. 뉴스 데이터 수집

 

뉴스 데이터의 경우 네이버에서 제공하는 부동산 탭에서의 데이터를 크롤링했다.

 

해당 데이터의 경우 수집 담당이 내가 아니었기 때문에 자세한 사항은 패스!

 

 

3. 뉴스 데이터 전처리

 

실제로 호재 뉴스를 파악하기 위해서 키워드 분석을 진행하고자 했다.

 

한글 분석을 하기 위해서 나는 soynlp를 사용했는데 soynlp에서는 기본적으로 명사 추출, 단어 추출, 토큰 나이저 등이 한글에 특화되어 만들어졌다.

 

특히, 명사 추출기 중에서 'NewsNounExtractor'가 별도로 있어 해당 기능을 통해서 키워드 추출하고자 했다. 명사 추출기 외에도 정규 표현식을 통해서 폭넓은 명사를 추출하고자 했다.

 

from krwordrank.word import KRWordRank
import re

def word_num(value):
    temp_list = re.findall(r'[0-9]{0,}[가-힣]+', value)
    return ' '.join(temp_list)

new_city['content_re'] = new_city['content'].apply(word_num)
content_list = new_city['content_re'].tolist()

from soynlp.noun import NewsNounExtractor
noun_extractor = NewsNounExtractor()
nouns = noun_extractor.train_extract(content_list)
newsnoun_list = list(nouns.keys())

 

키워드 추출 이후에는 word2 vec을 통해서 단어 간 유사도를 도출하고 유사도를 바탕으로 단어 클러스터링을 진행했다.

 

from gensim.models.word2vec import Word2Vec


noun_word_list = [[noun for noun in x.split(' ') if noun in newsnoun_list] for x in content_list ]
embedding_model = Word2Vec(noun_word_list, size=100, window = 5, min_count=2, workers=3, iter=1000, sg=1, sample=1e-3)

 

 

텍스트 마이닝인 것에 비해 별도의 불용어 선정 과정을 진행하지 않았는데 그 이유는 클러스터링에서 클러스터의 수를 늘려 진행하면 불필요한 단어들끼리 하나의 클러스터에 모이지 않을까 하는 생각이었다.

 

 

현재 진행한 부분은 여기까지인데, 역시 단어 전처리 과정이 불명확하다보니 클러스터링을 해도 대체로 잘 나오는 수준일 뿐이다.

 

이후 과정은 크게 두가지 관점에서 초점을 맞춰 진행하려고 한다.

 

우선 단어 전처리 과정의 고도화이다.

아무리 뛰어난 라이브러리들을 사용해도 결국 손으로 다듬어줘야하는 부분이 존재했다. 텍스트 데이터 가운데 비교적 처리가 잘 되어있는 뉴스 데이터라 크게 신경을 쓰지 않았는데, 기자라고 해서 모두가 완벽한 것 같진 않다.

 

그리고 주요 토픽 추출이다.

이 부분은 여러 관점에서 시도해볼 필요가 있는데, 우선 시간대별 토픽의 변화와 아파트 매매가 추이를 비교하는 방법과 아파트 매매가가 일정 수준 이상의 변동이 있을 때, 그 시기 전후의 토픽을 추출하는 방식이다.

 

 

 

 

 

 

 

반응형

댓글