brunch

You can make anything
by writing

C.S.Lewis

by 김범준 Jan 12. 2018

창원시 아파트 매매가 분석

1년 전 조별과제

사실 이게 작년에 비즈니스 애널리틱스 들으면서 하던 조별과제 내용인데, 그냥 썩혀놓긴 아까우니 한번 정리해서 브런치에도 공유해볼까 해서. 같이 하던 형이 1학년 때부터 알던 분이었는데 우연히 창원이 고향이라는 공통점에서 이 주제를 시작하게 되었다ㅋ 아파트를 대상으로, 집 값(매매가)에 영향을 끼치는 여러 요인을 데이터 기반으로 살펴보고 이에 대한 분석, 모델링을 통해 예측까지 하는 것이 목표이다. 말하자면 머신러닝의 회귀 모델을 구현하는 것이다.


백지상태에서 시작하는 것이지만 꼭 그렇지도 않다. 요즘 공공데이터 API가 그럭저럭 나와있는데, 특히 공공데이터포털의 국토교통부 실거래가 정보에서는 아파트 전월세 자료, 아파트매매 실거래자료를 얻을 수 있고, 공동주택관리비에서는 공동주택 기본 정보를 얻을 수 있다. 여기서 Key를 발급받아 API를 하나씩 날리면 데이터를 얻어 csv 등으로 저장할 수 있다. 


사실 공공데이터의 API가 아주 친절하게 나와있다고 하기는 힘들지만 조금 삽질하다 보면 그럭저럭 dataset을 확보할 수 있다. 언제나 그렇듯이 dataset을 준비하는 건 정말 번거롭지만, 양질의 dataset이 되도록 잘 가공하는 것은 머신러닝 모델링의 성능 향상을 위해서도 중요하다. 유의해야 할 점이 있다면, 한 번에 데이터를 다운로드하는 것보다 여러 번에 걸쳐 다운로드하는 방법이 일단 안전하다는 부분이라던가, XML을 Pandas dataframe으로 변환할 때 비어 있는 값이 생기면 column이 밀릴 수 있으니 조심하자. 나처럼 처음부터 다시 해야 한다..


최종적으로 merge 된 dataset이다. text로 된 아파트 주소나 이름은 각각을 구별하거나, 혹은 특정 주소별로 분석할 때 쓰일 수 있다. value로 되어 있는 아파트 나이, 동수 및 세대수, 계단식 혹은 복도식 여부, 면적, 층 위치 등은 회귀 모델을 만들기 위한 feature로 활용할 수 있다.


우선 heat map을 얻어보았다. value로 된 항목들을 column으로 나타냈을 때 서로 간의 상관관계를 나타낸 것이다. 우리가 원하는 것은 아파트의 매매가(price)에 영향을 주는 요인을 확인하는 것이므로 마지막 행을 보면 된다. 면적(area)이 상관계수 0.72로 가장 설명력이 높은데, 사실 직관적으로도 쉽게 이해할 수 있는 결과로, 예를 들면 20평 아파트보다는 30평 아파트가 비싸다는 것이다. 한편 동수(kaptDongCnt) 및 호수(ho_cnt)도 각각 상관계수 0.39, 0.37로 나타났으며, 창원시에서는 대체로 동이 많은 대단지 아파트가 비싼 경향이 있다고 이해할 수 있다. 그 외에도 corridor_yn, stair_yn이 상관계수 각각 -0.26, 0.20을 갖는다는 점을 통해 복도식보다는 계단식이 비싼 경향이 있다는 등, 아파트 매매가에 영향을 미치는 요인을 하나씩 확인해나갈 수 있다.


한편 heat map을 다시 살펴보면 price 외에도 apt_year와 tran_year가 상관계수 0.96으로 크게 나타났는데, 이는 각각이 현재 아파트 나이와 당시의 아파트 나이를 나타내고 있으며, 2010년~2017년 상반기의 dataset이기 때문이다. 다중공선성이라는 이슈도 있으니, 매매가 추정이라는 목적성을 고려하여, apt_year 항목을 없앤 나머지 feature들을 활용하고자 한다.


모델링의 경우 앞서 다룬 항목들을 feature로 활용하여 price를 target으로 하는 회귀 모델을 구현할 것이다. train dataset, test dataset을 각각 0.7,  0.3 비율로 나누고 여러 가지 회귀 모델을 구현해보며 Pearson correlation coefficient(흔히 말하는 R제곱)를 통해 평가하려고 한다. scikit-learn을 주로 활용하였는데, 코드 한 줄만 딱 넣으면 되니 구현이 되니 얼마나 좋은가.. 심지어 이 모델 저 모델 바꿔가는 것도 코드 몇 개만 바꾸면 된다!


모델링 결과를 정리해보았다. 심심해서 scikit-learn에 회귀 모델 있는 건 거의 다 돌려봤는데, Random Forest와 kNN에서 상관계수 0.9 이상으로 상당히 설명력이 있는 모델을 얻을 수 있었다. 앞서 언급한 것처럼 면적, 동수, 복도식 여부, 현재 아파트 나이와 같이 feature를 아파트의 물리적인 정보로 뽑았음에도 이 정도로 모델링이 가능하다는 것은 꽤 흥미롭다. 가격이라는 것이 결국 사람의 수요로 정해진다고 생각하면, 사람들이 아파트를 선택하는 데 있어서 브랜드나 디자인과 같은 감성적인 부분보다는 실질적이고 합리적인 요소를 잘 따져보는 것이 아닐까라고 생각한다.


가장 성능이 좋았던 Random Forest 모델을 통해 실제 값과 예측 값을 그래프로 표현하였다. 성능이 좋다 보니 거의 y=x에 가깝게 실제 값과 예측 값이 비슷하게 나온다. 한편 실제값<예측값인 아파트의 경우 가격이 저평가된 것으로 이해할 수 있다. 이러한 방식으로 창원시의 싸고 좋은 매물을 발견하면 부동산 업자나 창원 시민에게 도움이 되지 않을까 싶다.


물론 꽤 좋은 모델이 나왔지만, 좀 더 발전시킬만한 부분도 고민해볼 수 있겠다. 아파트의 물리적인 정보 외에도 사회적으로 구성되는 정보도 반영할 수 있지 않을까 하는 것들. 실제로 기준 금리(bass_rate)를 feature로 사용한 것도 그러한 시도이다. 특히 지역적인 정보가 반영해볼 만한데, 말하자면 text로 된 column인 주소(어떤 동읍면인지)를 value로 변환하기 위해 해당 지역에 점수를 매기는 방법으로, 예를 들어 해당 지역에 있는 패스트푸드점의 개수를 활용하여 얼마나 번화한 지역인지를 표현한다거나, 인구 분포를 반영한다거나 하는 시도 등등. 그 외에도 지금 보니 month나 floor와 같은 정보는 연속적인 값이라기보다는 카테고리의 값으로 이해해서 one-hot encoding을 했어야 했는데 싶은 생각도 드는데..

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari