주택 부동산 매매가 2번째 분석물로써, 이번에는 주택 매매가의 추세를 가늠할 수 있는 시계열 분석을 진행 하였다. 주택 이외의 외부변수인 인구의 변화, 정책, 경제의 성장, 주택 공급량 변화 등은 향후 부동산 시장의 추세를 예측하는 데 도움이 될것이라 생각한다. 머신러닝 알고리즘을 활용하여 어떤 변수들이 얼마 만큼의 영향을 추세에 영향을 끼치는지 알아보았다.
library(tidyverse)
library(ggplot2)
library(dplyr)
library(lubridate)
library(knitr)
library(funModeling)
library(corrplot)
library(recipes)
library(ranger)
library(vip)
library(fpp2)
library(patchwork)
# 월별 서울 아파트 매매 가격 지수
price_raw <- read.csv("./dataset/price.csv", fileEncoding = "euc-kr", encoding = "utf-8")
# 월별 서울 전세가격 지수
jeonse_raw <- read.csv("./dataset/jeonse.csv", fileEncoding = "euc-kr", encoding = "utf-8")
# 월별 국고채3년 금리
interest_raw <- read.csv("./dataset/interest.csv", fileEncoding = "euc-kr", encoding = "utf-8")
# 월별 서울, 경기 취업자 수
employ_raw <- read.csv("./dataset/employed.csv", fileEncoding = "euc-kr", encoding = "utf-8")
# 연도별 서울, 경기 20대~60대 인구
pop_raw <- read.csv("./dataset/pop.csv", fileEncoding = "euc-kr", encoding = "utf-8")
# 월별 지방 -> 수도권 20대~60대 순유입 인구
inflow_raw <- read.csv("./dataset/inflow.csv", fileEncoding = "euc-kr", encoding = "utf-8")
# 통화량(M2)
m2_raw <- read.csv("./dataset/m2.csv", fileEncoding = "euc-kr", encoding = "utf-8")
# 월별 서울, 경기 주택건설인허가실적
supply_raw <- read.csv("./dataset/supply.csv", fileEncoding = "euc-kr", encoding = "utf-8")
# 분기별 실질GDP
gdp_raw <- read.csv("./dataset/gdp.csv", fileEncoding = "euc-kr", encoding = "utf-8")
# 월별 서울, 경기 주택담보대출량
loan_raw <- read.csv("./dataset/loan.csv", fileEncoding = "euc-kr", encoding = "utf-8")
(출처 : KB)
서울의 월별 아파트 매매 가격 지수를 알아보았다.
head(price_raw)
## X 총지수.2019.01.100. 단독주택.2019.01.100. 연립주택.2019.01.100.
## 1 1/1/1986 34.656 61.347 43.053
## 2 2/1/1986 34.656 61.347 42.925
## 3 3/1/1986 34.708 61.513 42.733
## 4 4/1/1986 34.449 61.097 42.733
## 5 5/1/1986 34.293 60.848 41.837
## 6 6/1/1986 34.137 60.682 41.709
## 아파트.2019.01.100. 아파트.서울..2019.01.100. 총지수.서울..2019.01.100.
## 1 20.973 17.153 30.044
## 2 20.973 17.183 30.044
## 3 20.935 17.153 30.002
## 4 20.819 17.034 29.837
## 5 20.664 16.945 29.588
## 6 20.548 16.766 29.381
price <- price_raw %>%
select(X, price = 아파트.서울..2019.01.100.) %>%
mutate(X = mdy(X)) %>%
rename(date = X)
head(price)
## date price
## 1 1986-01-01 17.153
## 2 1986-02-01 17.183
## 3 1986-03-01 17.153
## 4 1986-04-01 17.034
## 5 1986-05-01 16.945
## 6 1986-06-01 16.766
(출처 : KB)
전세는 매매의 일정부분 대체재로서 또한 매매가의 예측지표로서 전세가격지수를 이용 했다.
head(jeonse_raw)
## X 총지수.2019.01.100. 단독주택.2019.01.100. 연립주택.2019.01.100.
## 1 1986-01-01 17.601 35.506 18.059
## 2 1986-02-01 17.853 35.731 18.155
## 3 1986-03-01 18.273 36.553 18.823
## 4 1986-04-01 18.651 37.151 19.158
## 5 1986-05-01 18.693 37.151 19.301
## 6 1986-06-01 18.651 37.151 19.301
## 아파트.2019.01.100. 아파트.서울..2019.01.100. 총지수.서울..2019.01.100.
## 1 10.793 9.782 16.755
## 2 11.104 10.195 17.066
## 3 11.446 10.550 17.573
## 4 11.695 10.787 18.002
## 5 11.726 10.875 18.040
## 6 11.664 10.787 17.963
jeonse <- jeonse_raw %>%
select(date = X, jeonse = 아파트.서울..2019.01.100.) %>%
mutate(date = ymd(date))
head(jeonse)
## date jeonse
## 1 1986-01-01 9.782
## 2 1986-02-01 10.195
## 3 1986-03-01 10.550
## 4 1986-04-01 10.787
## 5 1986-05-01 10.875
## 6 1986-06-01 10.787
(출처 : 한국은행)
금리가 낮아지면 시중에 더 많은 돈이 풀리게 된다. 이 돈이 부동산 시장으로 흘러들어 갈 경우 부동산 가격 상승을 유발할 수 있는 측면에서 금리 변수를 추가 하였다.
head(interest_raw[, 1:10])
## X2006.01 X2006.02 X2006.03 X2006.04 X2006.05 X2006.06 X2006.07 X2006.08
## 1 5.02 4.87 4.93 4.95 4.78 4.89 4.89 4.77
## X2006.09 X2006.10
## 1 4.69 4.62
interest <- interest_raw %>%
gather(date, interest) %>%
mutate(date = str_remove(date, "X")) %>%
separate(date, into = c("year", "month")) %>%
mutate(date = make_date(year, month)) %>%
select(-year, -month)
head(interest)
## interest date
## 1 5.02 2006-01-01
## 2 4.87 2006-02-01
## 3 4.93 2006-03-01
## 4 4.95 2006-04-01
## 5 4.78 2006-05-01
## 6 4.89 2006-06-01
(출처 : 통계청)
고용이 증가하면 그 지역 사회의 경제력이 더 좋아진다고 예상할 수 있다. 수도권 경제력을 측정하는 지표로서 서울, 경기 지역의 취업자 수를 이용하였다.
head(employ_raw[, 1:10])
## 시도별 X2006..01 X2006..02 X2006..03 X2006..04 X2006..05 X2006..06
## 1 서울특별시 4978 4946 4973 5015 5032 5049
## 2 경기도 4937 4911 5012 5127 5183 5184
## X2006..07 X2006..08 X2006..09
## 1 5029 4979 5015
## 2 5210 5140 5161
employ <- employ_raw %>%
gather(date, employed_pop, - 시도별) %>%
mutate(date = str_remove_all(date, "X|\\.\\.")) %>%
group_by(date) %>%
summarise(employed_pop = sum(employed_pop)) %>%
separate(date, into = c("year", "month"), sep = 4) %>%
mutate(date = make_date(year, month)) %>%
select(-year, -month)
head(employ)
## # A tibble: 6 x 2
## employed_pop date
## <int> <date>
## 1 9915 2006-01-01
## 2 9857 2006-02-01
## 3 9985 2006-03-01
## 4 10142 2006-04-01
## 5 10215 2006-05-01
## 6 10233 2006-06-01
(출처 : 통계청)
보통 결혼 적령기인 20대 후반 ~ 30대 중반 사람들이 부동산 시장에 처음으로 유입되는 것으로 가정 하였다. 실수요층의 증가는 주택수요의 상승을 이끌 것 이다. 각 연령대별로 지역, 전용면적 등에 따라 분포가 달라질 것으로 예상된다.
head(pop_raw)
## 시점 행정구역.시군구.별 성별 X20...24세 X25...29세 X30...34세 X35...39세
## 1 1993 서울특별시 계 1201646.0 1176752.5 1145515.5 978447.5
## 2 1993 경기도 계 639346.5 766934.5 860136.5 611632.5
## 3 1994 서울특별시 계 1173824.5 1188686.0 1113834.0 996806.5
## 4 1994 경기도 계 647862.5 793839.5 891293.0 698281.5
## 5 1995 서울특별시 계 1120988.0 1185737.0 1063702.0 996358.0
## 6 1995 경기도 계 646260.5 817085.0 912503.0 778948.0
## X40...44세 X45...49세 X50...54세 X55...59세 X60...64세 X65...69세
## 1 737962.0 624287.0 546278.5 369585.0 238462.0 166935.5
## 2 357936.5 282955.5 278483.0 237453.0 173066.0 127026.5
## 3 742804.0 635706.5 547091.0 388504.5 245979.0 170752.0
## 4 403312.5 310524.5 289587.5 256417.5 187848.0 135984.5
## 5 768648.5 644392.5 540786.5 401565.5 257720.5 175920.5
## 6 464046.5 335167.0 295287.5 266053.5 201286.5 143785.5
pop <- pop_raw %>%
select(-행정구역.시군구.별, -성별) %>%
gather(age, pop, -c(시점)) %>%
group_by(시점, age) %>%
summarise(pop = sum(pop)) %>%
ungroup %>%
mutate(age = str_remove_all(age, "X|\\.\\.\\.|세"),
age = str_remove(age, "([0-9]{3})$")) %>%
group_by(시점, age) %>%
summarise(pop = sum(pop)) %>%
ungroup %>%
mutate(age = recode_factor(age,
`2` = "20대",
`3` = "30대",
`4` = "40대",
`5` = "50대",
`6` = "60대")) %>%
spread(age, pop) %>%
rename(year = 시점,
pop_20 = `20대`,
pop_30 = `30대`,
pop_40 = `40대`,
pop_50 = `50대`,
pop_60 = `60대`)
head(pop)
## # A tibble: 6 x 6
## year pop_20 pop_30 pop_40 pop_50 pop_60
## <int> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1993 3784680. 3595732 2003141 1431800. 705490
## 2 1994 3804212. 3700215 2092348. 1481600. 740564.
## 3 1995 3770070. 3751511 2212254. 1503693 778713
## 4 1996 3742298. 3781366. 2350016. 1535360 830320.
## 5 1997 3713602. 3805223 2470915 1590350. 882832.
## 6 1998 3639160 3830002 2592110. 1651359 934618.
일정 부분 정보의 왜곡이 있을 수 있으나 월간 데이터로 구성된 다른 데이터셋과의 호환 및 데이터 활용도를 높이기 위해 연간 수도권 인구수를 평균법으로 분할하여 월간 자료로 변형한다.
# 연간자료를 월별 자료로 바꾸기 위한 함수 생성
pop_f <- function(x){
m <- NULL
for (i in 1:(length(x)-1)) {
m <- append(m, seq(x[i], x[i+1], length.out = 13))
}
m <- unique(m)
m <- m[-1]
return(m)
}
pop_monthly <- data.frame(
year = rep(1994:2020, each = 12),
month = rep(1:12, times = 27),
pop_20 = pop_f(pop$pop_20),
pop_30 = pop_f(pop$pop_30),
pop_40 = pop_f(pop$pop_40),
pop_50 = pop_f(pop$pop_50),
pop_60 = pop_f(pop$pop_60)
) %>%
mutate(date = make_date(year, month)) %>%
select(-year, -month)
head(pop_monthly)
## pop_20 pop_30 pop_40 pop_50 pop_60 date
## 1 3786307 3604439 2010575 1435950 708412.8 1994-01-01
## 2 3787935 3613146 2018009 1440100 711335.6 1994-02-01
## 3 3789563 3621853 2025443 1444250 714258.4 1994-03-01
## 4 3791191 3630560 2032877 1448400 717181.2 1994-04-01
## 5 3792818 3639267 2040310 1452550 720104.0 1994-05-01
## 6 3794446 3647974 2047744 1456700 723026.8 1994-06-01
`
(출처 : 통계청)
최근 지방에서 수도권으로의 중,장년층의 인구 유입이 증가하는 추세를 확인할 수 있다. 이 현상은 최근의 부동산 가격 상승세에 일정 부분 설명력을 가질 것으로 예상되어 어느정도의 영향을 가질 지 기대되는 변수이다.
head(inflow_raw[, 1:10])
## 행정구역.시군구.별 연령별 X2006..01 X2006..02 X2006..03 X2006..04
## 1 서울특별시 20 - 24세 1901 3732 2744 1900
## 2 서울특별시 25 - 29세 861 1494 1275 918
## 3 서울특별시 30 - 34세 -910 -929 -1660 -1522
## 4 서울특별시 35 - 39세 -166 116 -805 -898
## 5 서울특별시 40 - 44세 376 832 -368 -440
## 6 서울특별시 45 - 49세 102 340 -498 -595
## X2006..05 X2006..06 X2006..07 X2006..08
## 1 1831 1662 1533 2408
## 2 949 416 539 617
## 3 -1614 -1946 -1199 -1506
## 4 -962 -976 -705 -781
## 5 -492 -100 31 -84
## 6 -436 -312 -148 -222
inflow <- inflow_raw %>%
gather(date, inflow, -c(행정구역.시군구.별, 연령별)) %>%
mutate(연령별 = case_when(연령별 == "20 - 24세" ~ "20대",
연령별 == "25 - 29세" ~ "20대",
연령별 == "30 - 34세" ~ "30대",
연령별 == "35 - 39세" ~ "30대",
연령별 == "40 - 44세" ~ "40대",
연령별 == "45 - 49세" ~ "40대",
연령별 == "50 - 54세" ~ "50대",
연령별 == "55 - 59세" ~ "50대",
연령별 == "60 - 64세" ~ "60대",
연령별 == "65 - 69세" ~ "60대")) %>%
rename(age = 연령별) %>%
group_by(age, date) %>%
summarise(inflow = sum(inflow)) %>%
ungroup %>%
mutate(age = factor(age),
date = str_remove(date, "X")) %>%
separate(date, into = c("year", "month"), convert = T) %>%
spread(age, inflow) %>%
rename(inflow_20 = `20대`,
inflow_30 = `30대`,
inflow_40 = `40대`,
inflow_50 = `50대`,
inflow_60 = `60대`) %>%
mutate(date = make_date(year, month)) %>%
select(-year, -month)
head(inflow)
## # A tibble: 6 x 6
## inflow_20 inflow_30 inflow_40 inflow_50 inflow_60 date
## <int> <int> <int> <int> <int> <date>
## 1 6605 1183 1273 212 111 2006-01-01
## 2 9586 1871 1538 168 14 2006-02-01
## 3 9497 782 291 -223 -46 2006-03-01
## 4 7143 225 -362 -415 -271 2006-04-01
## 5 6615 119 -507 -300 -232 2006-05-01
## 6 7015 -51 -63 137 73 2006-06-01
(출처 : 한국은행)
금리가 낮아질 때와 마찬가지로 통화량의 증가는 시중에 더 많은 돈이 풀리는 것을 뜻 한다. 통화량의 증가는 물가 상승을 유발하며, 자산의 내재가치와는 무관하게 자산의 가격을 상승 시키는 요인이다. 만약 통화 팽창 정책으로 인해 통화량이 대폭 증가 했다면, 시중에 풀린 돈 중 일부가 부동산 시장으로 흘러가 이 또한 주택 매매가의 상승을 초래할 것으로 예상된다.
head(m2_raw[, 1:10])
## X2005.12 X2006.01 X2006.02 X2006.03 X2006.04 X2006.05
## 1 1,021,448.70 1,024,480.20 1,035,663.80 1,040,062.10 1,049,856.30 1,064,381.40
## X2006.06 X2006.07 X2006.08 X2006.09
## 1 1,082,235.00 1,076,369.60 1,086,334.60 1,112,597.10
m2 <- m2_raw %>%
gather(date, m2) %>%
mutate(date = str_remove(date, "X"),
m2 = parse_number(m2)) %>%
separate(date, into = c("year", "month"), convert = T) %>%
mutate(date = make_date(year, month)) %>%
select(-year, -month)
head(m2)
## m2 date
## 1 1021449 2005-12-01
## 2 1024480 2006-01-01
## 3 1035664 2006-02-01
## 4 1040062 2006-03-01
## 5 1049856 2006-04-01
## 6 1064381 2006-05-01
(출처 :국토교통부)
부동산가격이 상승하는 것은 증가하는 수요에 비해 주택공급량이 부족하기 때문 일 수 있다. 주택공급량이 어떻게 달라지는지, 증가하는 수도권 인구수를 감당할 수 있는 정도의 충분한 공급량이 건설되고 있는 지 확인해 보고자 한다.
head(supply_raw[, 1:10])
## 지역 X200601월 X200602월 X200603월 X200604월 X200605월 X200606월 X200607월
## 1 서울 3,644 957 2,384 2,040 2,474 6,386 6,317
## 2 경기 11,212 6,630 4,303 5,533 2,672 6,757 9,521
## X200608월 X200609월
## 1 356 1,126
## 2 10,937 5,044
supply <- supply_raw %>%
gather(date, supply, -지역) %>%
mutate(supply = parse_number(supply),
date = parse_number(date)) %>%
separate(date, into = c("year", "month"), sep = 4, convert = T) %>%
group_by(year, month) %>%
summarise(supply = sum(supply)) %>%
ungroup %>%
mutate(date = make_date(year, month)) %>%
select(-year, -month)
head(supply)
## # A tibble: 6 x 2
## supply date
## <dbl> <date>
## 1 14856 2006-01-01
## 2 7587 2006-02-01
## 3 6687 2006-03-01
## 4 7573 2006-04-01
## 5 5146 2006-05-01
## 6 13143 2006-06-01
(출처 : 한국은행)
국가 경제력을 측정하는 대표적인 지표인 GDP(국내총생산)을 추가하였다. GDP의 증가는 곧 국민소득의 증가를 의미한다. 소득이 증가하면 일정부분 이상의 소비력이 부동산 시장으로 흘러들어갈 것으로 예상된다.
head(gdp_raw[, 1:10])
## X2006.1 X2006.2 X2006.3 X2006.4 X2007.1 X2007.2 X2007.3
## 1 299,314.80 301,501.60 306,367.70 308,755.40 313,924.10 319,355.90 323,104.60
## X2007.4 X2008.1 X2008.2
## 1 330,073.80 331,402.00 333,136.80
gdp <- gdp_raw %>%
gather(date, gdp) %>%
mutate(gdp = parse_number(gdp),
date = str_remove(date, "X")) %>%
separate(date, into = c("year", "quarter"), convert = T)
head(gdp)
## year quarter gdp
## 1 2006 1 299314.8
## 2 2006 2 301501.6
## 3 2006 3 306367.7
## 4 2006 4 308755.4
## 5 2007 1 313924.1
## 6 2007 2 319355.9
분기별로 제공되는 국내총생산 지수 또한 평균법을 통해 월간 데이터로 변형 함으로써 다른 데이터와의 호환성을 높였다.
gdp_f <- function(x) {
m <- NULL
for(i in 1:(length(x)-1)) {
m <- append(m, seq(x[i], x[i+1], length.out = 4))
}
m <- unique(m)
return(m)
}
gdp_monthly <- data.frame(
year = append(append(rep(2006, times = 10), rep(2007:2020, each = 12)), rep(2021, 3)),
month = append(append(3:12, rep(1:12, times = 14)), 1:3),
gdp = gdp_f(gdp$gdp)
) %>%
mutate(date = make_date(year, month)) %>%
select(-year, -month)
head(gdp_monthly)
## gdp date
## 1 299314.8 2006-03-01
## 2 300043.7 2006-04-01
## 3 300772.7 2006-05-01
## 4 301501.6 2006-06-01
## 5 303123.6 2006-07-01
## 6 304745.7 2006-08-01
(출처 : 한국은행)
젊은 층에서 자신의 소득을 표현할 때의 수단이었던 ’영끌’이라는 표현이 부동산시장과 관련하여 자신의 가용 자산 및 대출을 끌어올 수 있을 만큼 활용하여 부동산을 구매한다는 의미로 처음 신문에 등장했던 때가 2018년 9월 경이었다. 주택 담보 대출량은 주택 수요에 대한 사람들의 열망, 심리적인 부분에 대해 어느정도 설명력을 가질 수 있을 것이라 생각된다.
head(loan_raw[, 1:10])
## 항목명2 단위 변환 X2006.01 X2006.02 X2006.03 X2006.04 X2006.05
## 1 서울 십억원 원자료
## 2 서울 % 전기대비증감률 N/A N/A N/A N/A N/A
## 3 경기 십억원 원자료
## 4 경기 % 전기대비증감률 N/A N/A N/A N/A N/A
## X2006.06 X2006.07
## 1
## 2 N/A N/A
## 3
## 4 N/A N/A
loan <- loan_raw %>%
gather(date, loan, -c(항목명2, 단위, 변환)) %>%
spread(변환, loan) %>%
select(-단위, -전기대비증감률) %>%
mutate(원자료 = ifelse(원자료 == "", NA, 원자료)) %>%
mutate(date = str_remove(date, "X")) %>%
separate(date, into = c("year", "month"), convert = T) %>%
rename(loan = 원자료) %>%
filter(!is.na(loan)) %>%
mutate(loan = parse_number(loan)) %>%
group_by(year, month) %>%
summarise(loan = sum(loan)) %>%
ungroup %>%
mutate(date = make_date(year, month)) %>%
select(-year, -month)
head(loan)
## # A tibble: 6 x 2
## loan date
## <dbl> <date>
## 1 185838. 2007-12-01
## 2 186251. 2008-01-01
## 3 185029. 2008-02-01
## 4 185550. 2008-03-01
## 5 187178. 2008-04-01
## 6 188516. 2008-05-01
all <- price %>%
filter(date >= ymd("2008-02-01")) %>%
left_join(jeonse, by = "date") %>%
left_join(interest, by = "date") %>%
left_join(employ, by = "date") %>%
left_join(pop_monthly, by = "date") %>%
left_join(m2, by = "date") %>%
left_join(gdp_monthly, by = "date") %>%
left_join(supply, by = "date") %>%
left_join(loan, by = "date") %>%
left_join(inflow, by = "date")
glimpse(all)
## Rows: 158
## Columns: 19
## $ date <date> 2008-02-01, 2008-03-01, 2008-04-01, 2008-05-01, 2008-06-~
## $ price <dbl> 78.620, 79.708, 81.282, 81.968, 82.388, 82.589, 82.582, 8~
## $ jeonse <dbl> 56.820, 57.211, 57.575, 57.682, 57.703, 57.744, 57.742, 5~
## $ interest <dbl> 5.06, 5.15, 4.98, 5.28, 5.70, 5.96, 5.77, 5.81, 5.09, 4.9~
## $ employed_pop <int> 10259, 10429, 10513, 10600, 10625, 10611, 10507, 10544, 1~
## $ pop_20 <dbl> 3331574, 3328484, 3325393, 3322303, 3319213, 3316122, 331~
## $ pop_30 <dbl> 4084599, 4080643, 4076687, 4072730, 4068774, 4064818, 406~
## $ pop_40 <dbl> 3724219, 3729124, 3734028, 3738932, 3743836, 3748740, 375~
## $ pop_50 <dbl> 2390534, 2401611, 2412687, 2423763, 2434839, 2445915, 245~
## $ pop_60 <dbl> 1479227, 1484853, 1490479, 1496105, 1501731, 1507357, 151~
## $ m2 <dbl> 1315172, 1316505, 1350862, 1362826, 1368552, 1375994, 139~
## $ gdp <dbl> 330959.3, 331402.0, 331980.3, 332558.5, 333136.8, 334042.~
## $ supply <dbl> 5102, 4810, 19920, 10555, 8338, 11991, 11984, 4819, 9750,~
## $ loan <dbl> 185028.8, 185550.4, 187177.9, 188515.5, 189266.5, 191239.~
## $ inflow_20 <int> 6408, 7214, 5976, 4852, 3193, 2990, 3752, 3154, 3625, 332~
## $ inflow_30 <int> -374, -1571, -424, -749, -1214, -527, -461, -420, -39, 18~
## $ inflow_40 <int> 255, -1029, -594, -743, -726, -508, -151, -239, -142, -13~
## $ inflow_50 <int> -342, -461, -310, -543, -729, -385, -118, -247, -144, -15~
## $ inflow_60 <int> -218, -407, -806, -295, -384, -359, -213, -59, -69, -164,~
주택 시장은 각 정권의 정책의 영향을 크게 받을 것이라는 가정 하에 시기별 집권 대통령을 변수로 추가 하였다.
all <- all %>%
mutate(regime = case_when(
date <= ymd("2013-02-01") ~ "이명박",
date >= ymd("2017-05-01") ~ "문재인",
TRUE ~ "박근혜"
))
all %>%
ggplot(aes(date, price)) +
geom_line(aes(color = regime), size = 1) +
geom_vline(xintercept = ymd("2015-01-01"), color = "red", linetype = "dashed") +
labs(color = NULL,
y = "가격지수",
title = "각 정권별 서울의 아파트 매매가 지수") +
theme(plot.title = element_text(size = 18))
아파트 매매 가격은 2015년을 기점으로 하락세에서 상승세로 전환되었음을 알 수 있다.
all %>%
ggplot(aes(date)) +
geom_line(aes(y = jeonse, color = "전세가"), size = 1) +
geom_line(aes(y = price, color = "매매가"), size = 1, alpha = 0.7) +
geom_vline(xintercept = ymd("2015-01-01"), color = "red", linetype = "dashed") +
labs(y = "가격지수",
color = NULL,
title = "매매가 지수 vs. 전세가 지수") +
theme(plot.title = element_text(size = 18))
전세가가 매매가에 비해 꾸준히 상승하고 있음을 알 수 있다.
대출 금리가 낮아질 수록 주택 담보 대출을 받기가 유리해진다. 따라서 금리가 낮아지는 것은 주택 수요를 높이는 요소일 수 있다.
all %>%
ggplot(aes(date, interest)) +
geom_line() +
labs(y = "금리",
title = "국고채(3년) 금리 변화") +
geom_smooth(se = F) +
theme(plot.title = element_text(size = 18))
금리는 꾸준히 하향 곡선을 타고 있었음을 알 수 있다.
지역사회에 취업자 수가 증가 한다는 것은 그 지역의 소득이 증가한 다는 시그널이다. 소득이 증가하면 주택 수요 또한 증가할 것이다.
all %>%
ggplot(aes(date, employed_pop)) +
geom_line() +
geom_smooth(se = F)
all %>%
mutate(year = year(date)) %>%
group_by(year) %>%
summarise(mean_employed = mean(employed_pop, na.rm = T)) %>%
mutate(rate_employed = append(NA, 100*diff(log(mean_employed)))) %>%
ggplot(aes(year)) +
geom_bar(data = . %>%
filter(year >= 2017),
stat = "identity", aes(y = rate_employed, fill = "문재인")) +
geom_bar(data = . %>%
filter(year >= 2013 & year <2017),
stat = "identity", aes(y = rate_employed, fill = "박근혜")) +
geom_bar(data = . %>%
filter(year <= 2012),
stat = "identity", aes(y = rate_employed, fill = "이명박")) +
labs(y = "증감율(%)",
fill = NULL,
title = "각 정권별 수도권 취업자 수 증감율 변화") +
theme(plot.title = element_text(size = 18))
수도권의 취업자 수 변화를 시기별로 그래프로 나타내었다. 취업자 수의 변화와 그 지역 부동산 가격의 변화 간에 상관관계가 없어 보인다. 하지만 취업자 수 변화에 따른 주택 수요 효과는 일정기간의 시차를 두고 나타날 수 있음을 고려해 볼 수 있다.
all %>%
ggplot(aes(x = date)) +
geom_line(aes(y = pop_20, color = "20대"), size = 1) +
geom_line(aes(y = pop_30, color = "30대"), size = 1) +
geom_line(aes(y = pop_40, color = "40대"), size = 1) +
geom_line(aes(y = pop_50, color = "50대"), size = 1) +
geom_line(aes(y = pop_60, color = "60대"), size = 1) +
geom_vline(xintercept = ymd("2015-01-01"), color = "red", linetype = "dashed") +
scale_y_continuous(labels = scales::label_comma()) +
labs(color = NULL,
y = "인구수",
title = "연간 세대별 평균 수도권 인구수 변화") +
theme(plot.title = element_text(size = 18))
세대별로 수도권 지역의 인구가 어떻게 달라지는 지 알아보았다. 30대는 인구는 2000년 대 중반을 꾸준히 감소 하고 있고 50대와 60대 인구는 큰 폭으로 상승하고 있음을 알 수 있다.
통화량의 추이를 시각화 하였다. 통화량이 증가하면 물가 상승을 유발하고 이는 곧 주택 시장의 가격을 변화시키는 중요한 요인이 될 수 있다.
all %>%
mutate(year = year(date)) %>%
ggplot(aes(year, m2)) +
geom_bar(stat = "summary", fun = mean) +
labs(y = "통화량",
title = "연간 통화량 변화량") +
theme(plot.title = element_text(size = 16))
통화량 절대량을 연간 변화율로 바꾸어 보았다.
all %>%
mutate(year = year(date)) %>%
group_by(year) %>%
summarise(m2_mean = mean(m2)) %>%
ungroup %>%
mutate(m2_change = append(NA, 100* diff(log(m2_mean)))) %>%
ggplot(aes(year, m2_change)) +
geom_bar(data = . %>%
filter(year >= 2017),
stat = "identity", aes(y = m2_change, fill = "문재인")) +
geom_bar(data = . %>%
filter(year >= 2013 & year <2017),
stat = "identity", aes(y = m2_change, fill = "박근혜")) +
geom_bar(data = . %>%
filter(year <= 2012),
stat = "identity", aes(y = m2_change, fill = "이명박")) +
labs(y = "변화율(%)",
fill = NULL,
title = "통화량 증가율") +
scale_x_continuous(minor_breaks = scales::breaks_width(1)) +
scale_y_continuous(labels = scales::label_percent(scale = 1)) +
theme(plot.title = element_text(size = 18))
GDP는 국가 전체의 소득 증가를 의미할 수 있다. GDP가 증가하면 부동산 시장에 유입되는 자금 또한 증가할 것이다.
GDP의 연간 성장율을 정권 별로 시각화 하였다.
all %>%
mutate(year = year(date)) %>%
group_by(year) %>%
summarise(gdp_mean = mean(gdp)) %>%
ungroup %>%
mutate(gdp_change = append(NA, 100* diff(log(gdp_mean)))) %>%
ggplot(aes(year)) +
geom_bar(data = . %>%
filter(year >= 2017),
stat = "identity", aes(y = gdp_change, fill = "문재인")) +
geom_bar(data = . %>%
filter(year >= 2013 & year <2017),
stat = "identity", aes(y = gdp_change, fill = "박근혜")) +
geom_bar(data = . %>%
filter(year <= 2012),
stat = "identity", aes(y = gdp_change, fill = "이명박")) +
labs(y = "성장율(%)",
fill = NULL,
title = "각 정권별 GDP 성장율 변화") +
theme(plot.title = element_text(size = 18))
2015년 주택 건설 인허가 실적이 대폭 상승한 후로 점점 감소 하고 있다.
all %>%
mutate(year = year(date)) %>%
ggplot(aes(year)) +
geom_bar(data = . %>%
filter(year >= 2017 & year <2021),
stat = "summary", fun= mean, aes(y = supply, fill = "문재인")) +
geom_bar(data = . %>%
filter(year >= 2013 & year <2017),
stat = "summary", fun= mean, aes(y = supply, fill = "박근혜")) +
geom_bar(data = . %>%
filter(year <= 2012),
stat = "summary", fun= mean, aes(y = supply, fill = "이명박")) +
geom_vline(xintercept = 2015, color = "red", linetype = "dashed") +
labs(y = "평균 주택 건설 인허가 실적",
title = "각 정권별 수도권 연간 평균 주택건설인허가실적",
fill = NULL) +
scale_x_continuous(breaks = scales::breaks_width(5)) +
theme(plot.title = element_text(size = 18))
all %>%
mutate(year = year(date)) %>%
filter(year <= 2020) %>%
group_by(year, regime) %>%
summarise(mean_supply = mean(supply)) %>%
ungroup %>%
slice(-6) %>%
group_by(regime) %>%
summarise(연평균_주택보급량 = mean(mean_supply))
## `summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
## # A tibble: 3 x 2
## regime 연평균_주택보급량
## <fct> <dbl>
## 1 이명박 17589.
## 2 박근혜 22626.
## 3 문재인 21202.
각 정권별 연평균 주택 건설 인허가 실적은 이명박 정부 시절 약 17,000 채, 박근혜 정부 시절 약 22,000 채, 현 문재인 정부 시절 약 21,000 채 씩 보급된 것을 알 수 있다. 주택 매매가의 상승이 2015년 부터 시작 된 것과 마찬가지로주택 건설 인허가 실적 또한 그 이전에 비해 대폭 상승 하였다.
all %>%
mutate(year = year(date)) %>%
group_by(year) %>%
summarise(`20대` = mean(inflow_20),
`30대` = mean(inflow_30),
`40대` = mean(inflow_40),
`50대` = mean(inflow_50),
`60대` = mean(inflow_60)) %>%
gather(age, inflow, -year) %>%
ggplot(aes(year)) +
geom_line(aes(y = inflow, color = age), size = 1) +
geom_hline(yintercept = 0, color = "grey70", linetype = "solid") +
geom_vline(xintercept = 2015, color = "red", linetype = "dashed") +
labs(y = "순유입",
color = NULL,
title = "세대별 수도권 순 유입 인구") +
theme(plot.title = element_text(size = 18))
연령대별 지방에서 수도권으로의 순유입 인구는 2015년을 전후로 20대와 30대에서 반전되는 양상을 보이고 있다. 20대는 2015년 이전 순유입은 감소추세에 있었으나 2015년 이후 증가세로 돌아섰다. 30대 에서는 수도권에서 지방으로 꾸준히 순유출 되고 있었으나 2015년 이후 순유출이 점점 감소하다가 2017년 이후에는 아예 순유입으로 돌아서는 양상을 보인다.
date 변수를 연, 월, 분기 등의 시간 변수로 바꾼 뒤 적절한 데이터 타입으로 변환 하였다.
all <- all %>%
mutate(year = year(date),
month = factor(month(date)),
quarter = factor(quarter(date)))
수치형 변수들의 왜도를 확인하였다. supply 변수와 price변수의 왜도에 대해서 추후에 log변환 한다.
profiling_num(all) %>%
select(variable, skewness) %>%
arrange(desc(abs(skewness))) %>%
head()
## variable skewness
## 1 supply 2.7950439
## 2 price 1.4735855
## 3 inflow_20 0.9157942
## 4 pop_50 -0.6880625
## 5 interest 0.6200314
## 6 pop_60 0.6134995
모델링 대상 데이터를 2008년 ~ 2020년 까지로 제한하고 date 변수를 제거 하였다.
all <- all %>%
filter(year <= 2020) %>%
select(-date)
glimpse(all)
## Rows: 155
## Columns: 22
## $ price <dbl> 78.620, 79.708, 81.282, 81.968, 82.388, 82.589, 82.582, 8~
## $ jeonse <dbl> 56.820, 57.211, 57.575, 57.682, 57.703, 57.744, 57.742, 5~
## $ interest <dbl> 5.06, 5.15, 4.98, 5.28, 5.70, 5.96, 5.77, 5.81, 5.09, 4.9~
## $ employed_pop <int> 10259, 10429, 10513, 10600, 10625, 10611, 10507, 10544, 1~
## $ pop_20 <dbl> 3331574, 3328484, 3325393, 3322303, 3319213, 3316122, 331~
## $ pop_30 <dbl> 4084599, 4080643, 4076687, 4072730, 4068774, 4064818, 406~
## $ pop_40 <dbl> 3724219, 3729124, 3734028, 3738932, 3743836, 3748740, 375~
## $ pop_50 <dbl> 2390534, 2401611, 2412687, 2423763, 2434839, 2445915, 245~
## $ pop_60 <dbl> 1479227, 1484853, 1490479, 1496105, 1501731, 1507357, 151~
## $ m2 <dbl> 1315172, 1316505, 1350862, 1362826, 1368552, 1375994, 139~
## $ gdp <dbl> 330959.3, 331402.0, 331980.3, 332558.5, 333136.8, 334042.~
## $ supply <dbl> 5102, 4810, 19920, 10555, 8338, 11991, 11984, 4819, 9750,~
## $ loan <dbl> 185028.8, 185550.4, 187177.9, 188515.5, 189266.5, 191239.~
## $ inflow_20 <int> 6408, 7214, 5976, 4852, 3193, 2990, 3752, 3154, 3625, 332~
## $ inflow_30 <int> -374, -1571, -424, -749, -1214, -527, -461, -420, -39, 18~
## $ inflow_40 <int> 255, -1029, -594, -743, -726, -508, -151, -239, -142, -13~
## $ inflow_50 <int> -342, -461, -310, -543, -729, -385, -118, -247, -144, -15~
## $ inflow_60 <int> -218, -407, -806, -295, -384, -359, -213, -59, -69, -164,~
## $ regime <fct> 이명박, 이명박, 이명박, 이명박, 이명박, 이명박, 이명박, ~
## $ year <dbl> 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 200~
## $ month <fct> 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, ~
## $ quarter <fct> 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 1, 1, 1, 2, 2, 2, 3, 3, ~
recipe 패키지를 이용해 log변환과 표준화 작업을 수행한다. 또한 각 정권별 영향의 차이를 파악하기 위해 regime변수를 One-hot 인코딩 하였다.
recipe <- all %>%
recipe(price ~.) %>%
step_log(supply) %>%
step_center(all_numeric(), -all_outcomes()) %>%
step_scale(all_numeric(), -all_outcomes()) %>%
step_dummy(regime) %>%
prep(training = all)
allE <- bake(recipe, new_data = all)
반응변수 price에 대해서도 log 변환을 수행한다.
allE$price <- log(allE$price)
성과평가를 위해 데이터 세트를 훈련용 데이터와 테스트용 데이트로 7:3 분할 한다.
set.seed(210508)
train_id <- sample(nrow(allE), 0.7*nrow(allE))
train <- allE[train_id, ]
test <- allE[-train_id, ]
훈련용 데이터세트에 랜덤포레스트 모델을 훈련 시키고 성과평가를 수행 하였다.
rf <- ranger(
price ~.,
data = train,
num.trees = 500,
mtry = 7,
min.node.size = 1,
replace = FALSE,
sample.fraction = 0.8,
verbose = F,
seed = 210508,
respect.unordered.factors = "order",
importance = "impurity"
)
훈련용 데이터셋
pred_train <- exp(predict(rf, train)$predictions)
# 모델 예측값의 accuracy measures
accuracy(pred_train, exp(train$price))
## ME RMSE MAE MPE MAPE
## Test set 0.008013667 0.1535324 0.08161109 0.004670374 0.09140054
테스트용 데이터셋
pred_test <- exp(predict(rf, test)$predictions)
# 모델 예측값의 accuracy measures
accuracy(pred_test, exp(test$price))
## ME RMSE MAE MPE MAPE
## Test set -0.06808092 0.5692499 0.383512 -0.1007017 0.4329737
vip(rf, num_features = 20) +
labs(title = "아파트 매매가에 가장 높은 영향을 미치는 외부요인들",
y = "중요도") +
theme(plot.title = element_text(size = 18))
모델링 결과에 따르면 가계의 주택 담보 대출량, 아파트 매매의 대체재라 볼 수 있는 전세가격지수, 30대, 50대, 60대 인구, 소득지표인 GDP, 가계의 주택 담보 대출량, 통화량 등이 아파트 매매가격에 가장 큰 영향을 미치는 요인이라 볼 수 있다. 여기서 가장 주목할 점은 결국 주택수요에 가장 큰 영향을 미치는 요소는 인구의 변화임을 알 수 있다. 또한 3개의 정권 중 현 문재인 정권이 다른 정권에 비해 비교적 큰 영향을 미쳤다는 것을 알 수 있다.
이번 분석을 통해 가장 흥미로웠던 점은 2015년을 기점으로 많은 지표에서 변화가 시작되었다는 것이다. 주택공급량이 2015년 폭발적으로 늘어났고, 지방에서 수도권으로의 인구이동 또한 20대와 30대를 중심으로 늘어나고 있다. 그리고 주택 매매가는 2015년을 기점으로 상승세로 전환 되었다.