연구 목적 및 배경 설명

돈을 모아 이루고 싶은 목표 중 많은 사람들이 ‘내 집 마련’을 얘기한다. 과거 사람들은 월세, 전세를 거쳐 최종적으로 자가를 주거생활에서 최종 정착지로 여기곤 했다. 그러나 최근 청년세대의 내 집 마련의 꿈 실현이 어려워지고 있다. 수도권의 경우 더욱 내 집마련을 포기하는 사람들이 늘고 있으며, ’2021 서울청년패널조사(1차)’ 보고서에 따르면 서울 청년들은 연소득에서 지출을 전혀 하지 않고 17년간 모아야 자가 마련이 가능하다고 한다. “대한민국 주거현황 데이터 분석 보고서: MZ세대를 중심으로”는 MZ세대로 불리는 특정 연령대 집단의 주거현황을 관찰한다. ’MZ세대’라는 명칭은 MZ세대의 특징을 반영한 것이 아닌, 특정 연령대를 지칭하기 위한 이름으로 사용한 용어이다. MZ세대에 해당하는 연령대인 20대 초반부터 40대 초반을 중심으로 점유형태, 주거면적, 집값(주택비용/보증금)과 집값 마련경로를 분석한 그래프를 담고 있다. 또한 월세, 전세, 자가로 나누어 점유형태별 차이도 관찰할 수 있다. 이를 통해 오늘날 사람들은 어디에서 어떻게 거주하고 있는지, 점유형태별로 얼마에, 어떻게 집을 마련하는 지와 같은 ’주거현황’에 관한 정보를 제공하여 구체적 계획 수립에 도움을 주고, 주거지원의 방향에 도움이 되고자 한다.

데이터에 대한 개괄적인 설명

분석에 사용한 데이터는 한국복지패널의 ’2022년 17차 한국복지패널조사(가구용, 가구원용, 복지인식설문용 머지데이터)’이다. 7개 권역별 지역구분, 가구주와의 관계, 태어난 연도, 주택유형, 주거면적, 집의 가격, 주택구입비용(보증금) 마련경로 1순위, 2순위 총 8가지의 변수를 사용했다. 독립변수는 지역, 나이, 점유형태이고, 종속변수는 점유형태, 주거면적, 집의 가격, 주택구입비용(보증금)마련경로 1순위, 2순위이다. 집을 구매하는 부분에 초점을 맞추었기 때문에 가구가 중복되는 것을 피하고자 조사 대상은 그 가구를 실질적으로 대표하는 사람인 가구주로 제한했다.

각각의 변수에 해당하는 변수명은 7개 권역별 지역구분 = “code_region” = “region” 가구주와의 관계 = “relation” 태어난 년도 = “birth” 점유형태 = “code_housingtype” = “housingtype” 주거면적 = “area” 집의 가격 = “houseprice” 주택구입비용(보증금)마련경로 1순위 = “code_1stprepare” 주택구입비용(보증금)마련경로 2순위 = “code_2stprepare” 로 설정했다.

데이터 정제 및 가공 과정

1. 전체적인 데이터 정제 및 가공

#복지패널데이터 불러오기
raw_welfare <- read.spss(file = "koweps_hpwc17_2022_Beta1.sav",
                     to.data.frame = T)
## Warning in read.spss(file = "koweps_hpwc17_2022_Beta1.sav", to.data.frame = T):
## koweps_hpwc17_2022_Beta1.sav: Compression bias (0) is not the usual value of
## 100
## Warning in read.spss(file = "koweps_hpwc17_2022_Beta1.sav", to.data.frame = T):
## koweps_hpwc17_2022_Beta1.sav: Very long string record(s) found (record type 7,
## subtype 14), each will be imported in consecutive separate variables
#복사본 만들기 
wel <- raw_welfare
#변수 선택하고 변수명 바꾸기
wel <- wel %>% select(code_region = h17_reg7,
                      relation = h17_g2,
                      birth = h17_g4,
                      area = h1706_5,
                      code_housingtype = h1706_3,
                      houseprice = h1706_6,
                      "code_1stprepare" = h1706_8,
                      "code_2stprepare" = h1706_9) %>% 
  
#조사대상 가구주로 설정
filter(relation == 10) 

2. code_region변수 정제 및 가공

#code_region 변수 검토
class(wel$code_region)
## [1] "numeric"
head(wel$code_region)
## [1] 1 1 1 1 2 1
# 이상치 확인
table(is.na(wel$code_region))
## 
## FALSE 
##  7865
table(wel$code_region)
## 
##    1    2    3    4    5    6    7 
##  903 1571 1373 1018  828  714 1458
#지역 항목 이름 부여 - 데이터 만들기
list_region <- data.frame(code_region = c(1:7),
                          region = c("서울",
                                     "수도권(인천/경기)",
                                     "부산/경남/울산",
                                     "대구/경북",
                                     "대전/충남",
                                     "강원/충북",
                                     "광주/전남/전북/제주도"))
list_region
##   code_region                region
## 1           1                  서울
## 2           2     수도권(인천/경기)
## 3           3        부산/경남/울산
## 4           4             대구/경북
## 5           5             대전/충남
## 6           6             강원/충북
## 7           7 광주/전남/전북/제주도
#지역 항목 이름 부여 - 데이터 결합하기
wel <- left_join(wel, list_region, by = "code_region")

wel %>% 
  select(code_region, region) %>% 
  head()
##   code_region            region
## 1           1              서울
## 2           1              서울
## 3           1              서울
## 4           1              서울
## 5           2 수도권(인천/경기)
## 6           1              서울
#region 변수 Factor타입으로 바꾸기
wel$region <- factor(wel$region, levels = c("서울",
                                     "수도권(인천/경기)",
                                     "부산/경남/울산",
                                     "대구/경북",
                                     "대전/충남",
                                     "강원/충북",
                                     "광주/전남/전북/제주도"))

3. birth변수 정제 및 가공

#birth 변수 검토
class(wel$birth)
## [1] "numeric"
summary(wel$birth)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1922    1943    1954    1957    1969    2003
qplot(wel$birth)
## Warning: `qplot()` was deprecated in ggplot2 3.4.0.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

#이상치 확인
table(is.na(wel$birth))
## 
## FALSE 
##  7865

3-1. age 파생변수 만들기

2022년의 데이터이므로 2022년 당시 나이를 나타내는 변수를 만들었다.

#나이(age) 파생변수 만들기
wel$age <- 2022 - wel$birth + 1
summary(wel$age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   20.00   54.00   69.00   66.23   80.00  101.00
qplot(wel$age)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

3-2. age_group 파생변수 만들기

3-1에서 만든 나이 변수를 바탕으로 연령대를 나타내는 변수를 만들었다. 0세부터 79세까지는 10단위로 끊어서 항목을 만들었으며, 80세부터는 하나의 항목에 배치했다. 이 후 막대그래프로 연령대 분포를 확인했다.

#연령대(age_group) 파생변수 만들기
wel <- wel %>%
  mutate(age_group = ifelse(age < 20, "10s",
                       ifelse(age < 30, "20s", 
                              ifelse(age < 40, "30s",
                                     ifelse(age < 50, "40s",
                                            ifelse(age < 60, "50s",
                                                   ifelse(age < 70, "60s",
                                                          ifelse(age < 80, "70s", "old"))))))))

table(wel$age_group)
## 
##  20s  30s  40s  50s  60s  70s  old 
##  149  412  863 1131 1519 1739 2052
ggplot(data = wel, aes(x = age_group)) +
  geom_bar()

3-3. MZ 파생변수 만들기

3-1에서 만든 나이변수를 바탕으로 MZ세대에 해당하는 20세부터 44세를 대상으로 5단위로 끊어서 항목을 만들었고, 그 외에는 결측치로 대체했다. MZ세대 안에서 차이를 자세하게 관찰하기 위해 3-2의 age_group 변수보다 연령대를 세분화하여 할당했다. 3-2항목은 총 5개로 E20s, L20s 와 같은 형태인데, E20s은 20대 초반을, L20s는 20대 후반을 의미한다. 막대그래프로 연령대 분포를 확인했다.

#MZ세대 연령대(MZ) 파생변수 만들기
wel <- wel %>%
  mutate(MZ = ifelse(age >= 20 & age < 25, "E20s",
                       ifelse(age < 30, "L20s", 
                              ifelse(age < 35, "E30s",
                                     ifelse(age < 40, "L30s",
                                            ifelse(age < 45, "E40s", NA))))))

table(wel$MZ)
## 
## E20s E30s E40s L20s L30s 
##   19  188  393  130  224
#MZ변수 Factor 타입으로 바꾸기
wel$MZ <- factor(wel$MZ, levels = c("E20s",
                                     "L20s",
                                     "E30s",
                                     "L30s",
                                     "E40s"))


wel %>% 
  filter(!is.na(MZ)) %>% 
  ggplot(aes(x = MZ)) +
  geom_bar() 

4. area 변수 정제

#area 변수 검토
class(wel$area)
## [1] "numeric"
head(wel$area)
## [1] 92 33 73 92 46 59
#이상치 확인
table(is.na(wel$area))
## 
## FALSE 
##  7865
summary(wel$area)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    7.00   56.00   79.00   77.95   99.00  327.00
boxplot(wel$area)$stats

##      [,1]
## [1,]    7
## [2,]   56
## [3,]   79
## [4,]   99
## [5,]  162

4-1. 극단치 제거한 area2 파생변수 만들기

평균을 구할 때 극단치가 있으면 분석 결과가 왜곡될 수 있기 때문에 극단치를 제거하는 과정을 거쳐 area2변수를 만들었다. boxplot을 통해 상자그림을 크게 벗어난 값을 극단치로 간주했다. 기존 area 변수에 덮어쓰지 않은 이유는 주거면적만으로 봤을 때 극단치라고 보았던 대상이 면적을 집값으로 나눈 ’면적당집값’변수에서는 극단치가 아닐 수 있기 때문이다.

wel$area2 <- ifelse(wel$area < 7 | wel$area > 162, NA, wel$area)

4-2.제곱미터를 평수로 바꾸기

우리에게 익숙한 면적단위로 보기 위해서 제곱미터 단위의 면적을 평수로 나타내고자 한다. 1평은 약 3.3제곱미터 이므로 평수의 근삿값 결과를 얻기 위해 면적 값에 3.3을 나누었다.

wel$area <- round(wel$area/3.3,1)
wel$area2 <- round(wel$area2/3.3,1)
head(wel$area)
## [1] 27.9 10.0 22.1 27.9 13.9 17.9
head(wel$area2)
## [1] 27.9 10.0 22.1 27.9 13.9 17.9

5. code_housingtype변수 정제 및 가공

#code_housingtype 변수 검토
class(wel$code_housingtype)
## [1] "numeric"
head(wel$code_housingtype)
## [1] 1 3 1 1 5 3
#이상치 확인
table(is.na(wel$code_housetype))
## < table of extent 0 >
table(wel$code_housingtype)
## 
##    1    2    3    4    5    6 
## 4703  728 1354  123  844  113
#점유형태 항목 이름 부여 - 데이터 만들기
list_housingtype <- data.frame(code_housingtype = c(1:6),
                          housingtype = c("자가",
                                     "전세",
                                     "보증부 월세",
                                     "월세(사글세)",
                                     "비가구원 명의 주택",
                                     "기타"))
list_housingtype
##   code_housingtype        housingtype
## 1                1               자가
## 2                2               전세
## 3                3        보증부 월세
## 4                4       월세(사글세)
## 5                5 비가구원 명의 주택
## 6                6               기타
#점유형태 항목 이름 부여 - 데이터 결합하기
wel <- left_join(wel, list_housingtype, by = "code_housingtype")

wel %>% 
  select(code_housingtype, housingtype) %>% 
  head()
##   code_housingtype        housingtype
## 1                1               자가
## 2                3        보증부 월세
## 3                1               자가
## 4                1               자가
## 5                5 비가구원 명의 주택
## 6                3        보증부 월세
#housingtype변수 Factor 타입으로 바꾸기
wel$housingtype <- factor(wel$housingtype, levels = c("자가",
                                     "전세",
                                     "보증부 월세",
                                     "월세(사글세)",
                                     "비가구원 명의 주택",
                                     "기타"))

6. houseprice 변수 정제 및 가공

houseprice 변수에는 거주하는 집의 가격으로, 점유형태가 자가면 주택가격이, 전세면 전세금이, 보증부월세면 보증금의 값이 들어가 있다. 따라서 점유형태에 따라 ’집값’변수 속 금액이 의미하는 바가 달라진다는 점을 주의해야한다.

#houseprice 변수 검토
class(wel$houseprice)
## [1] "numeric"
head(wel$houseprice)
## [1] 1e+05 5e+02 4e+04 7e+04    NA 6e+03
#이상치 확인
table(is.na(wel$houseprice))
## 
## FALSE  TRUE 
##  6785  1080
summary(wel$houseprice)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##       0    4000   12000   22493   30000  650000    1080
A <- wel %>% 
  select(housingtype, houseprice) %>% 
  filter(housingtype == "자가")
  
boxplot(A$houseprice)$stats

##       [,1]
## [1,]    50
## [2,]  9000
## [3,] 20000
## [4,] 37000
## [5,] 78000
mean_price <- wel %>% 
  filter(housingtype == "자가") %>% 
  filter(houseprice >= 50 & houseprice <= 78000) %>% 
  summarise(mean_p1 = mean(houseprice))
#10만 단위가 넘는 숫자 데이터 정수로 표현하기 
options(scipen = 99)
head(wel$houseprice)
## [1] 100000    500  40000  70000     NA   6000

6-1. 극단치 제거한 houseprice2 파생변수 만들기

7. prepare 변수 정제 및 가공

#code_prepare1 변수 검토
class(wel$code_1stprepare)
## [1] "numeric"
head(wel$code_1stprepare)
## [1]  1  1  1  1 NA  3
#이상치 확인
table(is.na(wel$code_1stprepare))
## 
## FALSE  TRUE 
##  6785  1080
table(wel$code_1stprepare)
## 
##    1    2    3    4    5 
## 5849  196  104  635    1
#code_prepare2 변수 검토
class(wel$code_2stprepare)
## [1] "numeric"
head(wel$code_2stprepare)
## [1]  4 88  4 88 NA 88
#이상치 확인
table(is.na(wel$code_2stprepare))
## 
## FALSE  TRUE 
##  6785  1080
table(wel$code_1stprepare)
## 
##    1    2    3    4    5 
## 5849  196  104  635    1
# 주택구입비용(보증금)마련경로 항목 이름 부여 - 데이터 만들기
list_prepare1 <- data.frame(code_1stprepare = c(1:5),
                           "prepare1" = c("자기돈(상속인 경우 포함)",
                                     "무상으로 도움을 받음 ",
                                     "부모,형제,친척,친구 등으로 부터 빌림",
                                     "금융기관으로부터 빌림",
                                     "사채"))
list_prepare2 <- data.frame(code_2stprepare = c(1:5),
                           "prepare2" = c("자기돈(상속인 경우 포함)",
                                     "무상으로 도움을 받음 ",
                                     "부모,형제,친척,친구 등으로 부터 빌림",
                                     "금융기관으로부터 빌림",
                                     "사채"))

list_prepare1
##   code_1stprepare                             prepare1
## 1               1             자기돈(상속인 경우 포함)
## 2               2                무상으로 도움을 받음 
## 3               3 부모,형제,친척,친구 등으로 부터 빌림
## 4               4                금융기관으로부터 빌림
## 5               5                                 사채
list_prepare2
##   code_2stprepare                             prepare2
## 1               1             자기돈(상속인 경우 포함)
## 2               2                무상으로 도움을 받음 
## 3               3 부모,형제,친척,친구 등으로 부터 빌림
## 4               4                금융기관으로부터 빌림
## 5               5                                 사채
# 주택구입비용(보증금)마련경로 항목 이름 부여 - 데이터 결합하기
wel <- left_join(wel, list_prepare1, by = "code_1stprepare")

wel <- left_join(wel, list_prepare2, by = "code_2stprepare")

wel %>% 
  select(code_1stprepare, code_2stprepare, prepare1, prepare2) %>% 
  head()
##   code_1stprepare code_2stprepare                             prepare1
## 1               1               4             자기돈(상속인 경우 포함)
## 2               1              88             자기돈(상속인 경우 포함)
## 3               1               4             자기돈(상속인 경우 포함)
## 4               1              88             자기돈(상속인 경우 포함)
## 5              NA              NA                                 <NA>
## 6               3              88 부모,형제,친척,친구 등으로 부터 빌림
##                prepare2
## 1 금융기관으로부터 빌림
## 2                  <NA>
## 3 금융기관으로부터 빌림
## 4                  <NA>
## 5                  <NA>
## 6                  <NA>
#prepare변수 Factor 타입으로 바꾸기
wel$prepare1 <- factor(wel$prepare1, levels = c("자기돈(상속인 경우 포함)",
                                     "무상으로 도움을 받음 ",
                                     "부모,형제,친척,친구 등으로 부터 빌림",
                                     "금융기관으로부터 빌림",
                                     "사채"))

wel$prepare2 <- factor(wel$prepare2, levels = c("자기돈(상속인 경우 포함)",
                                     "무상으로 도움을 받음 ",
                                     "부모,형제,친척,친구 등으로 부터 빌림",
                                     "금융기관으로부터 빌림",
                                     "사채"))

데이터 분석

1. 연령대/지역별 점유형태 분석

1-1. 전 연령대별 점유형태 분석

연령대에 따른 점유형태를 분석했다. ageg_type에 연령대별 점유형태 비율을 할당하였다.

ageg_type <- wel %>% 
  count(age_group, housingtype) %>% 
  group_by(age_group) %>% 
  mutate(pct = round(n/sum(n)*100, 2))

head(ageg_type)
## # A tibble: 6 × 4
## # Groups:   age_group [1]
##   age_group housingtype            n   pct
##   <chr>     <fct>              <int> <dbl>
## 1 20s       자가                   5  3.36
## 2 20s       전세                  31 20.8 
## 3 20s       보증부 월세           75 50.3 
## 4 20s       월세(사글세)           5  3.36
## 5 20s       비가구원 명의 주택    18 12.1 
## 6 20s       기타                  15 10.1

1-2. MZ세대 연령대별 점유형태 분석

MZ세대 안에서 연령대를 세분화하여 이에 따른 점유형태를 분석했다. MZ_type에 연령대별 점유형태 비율을 할당하였다.

MZ_type <- wel %>% 
  count(MZ, housingtype) %>% 
  group_by(MZ) %>% 
  mutate(pct = round(n/sum(n)*100, 2))

head(MZ_type)
## # A tibble: 6 × 4
## # Groups:   MZ [1]
##   MZ    housingtype            n   pct
##   <fct> <fct>              <int> <dbl>
## 1 E20s  자가                   1  5.26
## 2 E20s  전세                   4 21.0 
## 3 E20s  보증부 월세            7 36.8 
## 4 E20s  월세(사글세)           2 10.5 
## 5 E20s  비가구원 명의 주택     1  5.26
## 6 E20s  기타                   4 21.0

1-3. 지역별 점유형태 분석 (전 연령대)

전체 연령대를 대상으로 지역에 따른 점유형태를 분석했다. region_type에 연령대별 점유형태 비율을 할당하였다.

region_type <- wel %>% 
  count(region, housingtype) %>% 
  group_by(region) %>% 
  mutate(pct = round(n/sum(n)*100, 2))

head(region_type)
## # A tibble: 6 × 4
## # Groups:   region [1]
##   region housingtype            n   pct
##   <fct>  <fct>              <int> <dbl>
## 1 서울   자가                 405 44.8 
## 2 서울   전세                 193 21.4 
## 3 서울   보증부 월세          243 26.9 
## 4 서울   월세(사글세)           8  0.89
## 5 서울   비가구원 명의 주택    43  4.76
## 6 서울   기타                  11  1.22

1-4. 지역별 점유형태 분석 (MZ세대)

MZ세대를 대상으로 지역에 따른 점유형태를 분석했다. region_type에 연령대별 점유형태 비율을 할당하였다.

region_typeMZ <- wel %>% 
  filter(!is.na(MZ)) %>% 
  count(region, housingtype) %>% 
  group_by(region) %>% 
  mutate(pct = round(n/sum(n)*100, 2))

head(region_typeMZ)
## # A tibble: 6 × 4
## # Groups:   region [1]
##   region housingtype            n   pct
##   <fct>  <fct>              <int> <dbl>
## 1 서울   자가                  40 26.8 
## 2 서울   전세                  50 33.6 
## 3 서울   보증부 월세           41 27.5 
## 4 서울   월세(사글세)           2  1.34
## 5 서울   비가구원 명의 주택    11  7.38
## 6 서울   기타                   5  3.36

1-5. ## 1-5. 연령대별 지역 비율 그래프 (MZ세대)

MZage_region <- wel %>% 
  filter(!is.na(MZ)) %>% 
  count(MZ, region) %>%
  group_by(MZ) %>% 
  mutate(pct = round(n/sum(n)*100,1))

head(MZage_region)
## # A tibble: 6 × 4
## # Groups:   MZ [1]
##   MZ    region                n   pct
##   <fct> <fct>             <int> <dbl>
## 1 E20s  서울                  3  15.8
## 2 E20s  수도권(인천/경기)     3  15.8
## 3 E20s  부산/경남/울산        5  26.3
## 4 E20s  대구/경북             2  10.5
## 5 E20s  대전/충남             1   5.3
## 6 E20s  강원/충북             2  10.5

2. 연령별 주거면적/주택마련비용

2-1. 연령별 주거면적 분석

전체 나이에 따른 주거 면적을 분석했다. age_area에 극단치를 제거한 주거면적 평균을 구한 뒤 나이별 주거면적 평균을 할당하였다.

age_area <- wel %>% 
  group_by(age) %>% 
  summarise(mean_area = mean(area2, na.rm = T))

head(age_area)
## # A tibble: 6 × 2
##     age mean_area
##   <dbl>     <dbl>
## 1    20     10.9 
## 2    21     14.4 
## 3    22      7.55
## 4    23      8.95
## 5    24     12.0 
## 6    25     10.7

위의 그래프에서 MZ세대에 해당하는 부분을 더 자세히 보기 위해 20세~44세를 대상으로 나이에 따른 주거면적을 분석했다. MZ_area에 연령대별 주거면적 평균을 할당하였다.

MZ_area <- wel %>% 
  filter(!is.na(area2) & !is.na(MZ)) %>% 
  group_by(age) %>% 
  summarise(mean_area = mean(area2))

head(MZ_area)
## # A tibble: 6 × 2
##     age mean_area
##   <dbl>     <dbl>
## 1    20     10.9 
## 2    21     14.4 
## 3    22      7.55
## 4    23      8.95
## 5    24     12.0 
## 6    25     10.7

2-2. MZ세대 연령대별 주택마련비용(집값) 분석

MZ세대 연령대별 점유형태에 따른 집값을 분석했다. age_price에 점유형태, 집값, 나이, MZ연령대의 변수만 추출하고 결측치가 있는 행을 제거한 데이터 프레임을 저장했다.

age_price <- wel %>% 
  select(housingtype, houseprice, age, MZ) %>% 
  na.omit()

head(age_price)
##    housingtype houseprice age   MZ
## 16        자가     100000  39 L30s
## 29        자가      68000  41 E40s
## 36        자가      17000  41 E40s
## 39        전세      35000  43 E40s
## 45        전세      23000  36 L30s
## 51 보증부 월세        500  40 E40s
age_price %>% 
  group_by(housingtype) %>% 
  summarise(mean_price = mean(houseprice)) ##문제있음 - 결측치 제거 생각하기 ...
## # A tibble: 3 × 2
##   housingtype mean_price
##   <fct>            <dbl>
## 1 자가            41941.
## 2 전세            16108.
## 3 보증부 월세      2713.

2-3. 연령대별 평당가격 분석

price_per_area에 MZ연령대, 집값, 주거면적, 점유형태 변수와 함께 1평당 집값을 나타내는 변수인 price_per변수를 만들어 넣었다.

price_per_area <- wel %>%
  filter(!is.na(MZ) & !is.na(houseprice)) %>% 
  select(MZ, houseprice, area, housingtype) %>% 
  mutate(price_per = round(houseprice/area, 2)) 

head(price_per_area)
##     MZ houseprice area housingtype price_per
## 1 L30s     100000 23.9        자가   4184.10
## 2 E40s      68000 29.1        자가   2336.77
## 3 E40s      17000 33.0        자가    515.15
## 4 E40s      35000 37.0        전세    945.95
## 5 L30s      23000 20.9        전세   1100.48
## 6 E40s        500  6.1 보증부 월세     81.97

3. 주택구입비용/보증금 마련경로 분석

MZ세대를 대상으로 전체 주택구입비용이나 보증금 마련 경로 1순위와 2순위를 분석하고, 점유형태(자가/ 전세/ 보증부 월세)에 따른 비용마련경로 1순위를 분석해 비교한다. prepare에 비용마련경로 1순위, 2순위, 점유형태, MZ연령대 변수만 추출하고 결측치가 있는 행을 제거한 데이터 프레임을 저장했다.

prepare <- wel %>% 
  select(prepare1, prepare2, housingtype, MZ) %>% 
  na.omit()

head(prepare)
##                    prepare1                             prepare2 housingtype
## 16 자기돈(상속인 경우 포함) 부모,형제,친척,친구 등으로 부터 빌림        자가
## 29    무상으로 도움을 받음              자기돈(상속인 경우 포함)        자가
## 36    금융기관으로부터 빌림             자기돈(상속인 경우 포함)        자가
## 39 자기돈(상속인 경우 포함)                금융기관으로부터 빌림        전세
## 45 자기돈(상속인 경우 포함)                무상으로 도움을 받음         전세
## 55    금융기관으로부터 빌림             자기돈(상속인 경우 포함)        전세
##      MZ
## 16 L30s
## 29 E40s
## 36 E40s
## 39 E40s
## 45 L30s
## 55 E30s

3-1. 주택구입비용/보증금 마련 경로 1,2순위 비교 분석

비용마련 경로 1순위와 2순위를 보기 위해 per_prepare1/2에 항목별 비율을 계산한 값인 pct변수를 만들어 넣는다.

per_prepare1 <- prepare %>% 
  count(prepare1) %>% 
  mutate(pct = round(n/sum(n)*100, 1))


per_prepare2 <- prepare %>% 
  count(prepare2) %>% 
  mutate(pct = round(n/sum(n)*100, 1))

head(per_prepare1)
##                               prepare1   n  pct
## 1             자기돈(상속인 경우 포함) 246 49.0
## 2                무상으로 도움을 받음   16  3.2
## 3 부모,형제,친척,친구 등으로 부터 빌림  19  3.8
## 4                금융기관으로부터 빌림 221 44.0
head(per_prepare2)
##                               prepare2   n  pct
## 1             자기돈(상속인 경우 포함) 228 45.4
## 2                무상으로 도움을 받음   26  5.2
## 3 부모,형제,친척,친구 등으로 부터 빌림  20  4.0
## 4                금융기관으로부터 빌림 228 45.4

3-2. 연령대별 주택구입비용/보증금 1,2순위 마련경로 비교 분석

MZprepare에 MZ세대에서 연령대로 분류한 5항목별 비용마련경로 순위 비율을 계산하여 할당한다.

MZprepare<- wel %>% 
  select(prepare1, MZ) %>% 
  na.omit() %>% 
  count(MZ, prepare1) %>% 
  group_by(MZ) %>% 
  mutate(pct = round(n/sum(n)*100, 1))

head(MZprepare)
## # A tibble: 6 × 4
## # Groups:   MZ [2]
##   MZ    prepare1                                   n   pct
##   <fct> <fct>                                  <int> <dbl>
## 1 E20s  "자기돈(상속인 경우 포함)"                 4  33.3
## 2 E20s  "무상으로 도움을 받음 "                    1   8.3
## 3 E20s  "부모,형제,친척,친구 등으로 부터 빌림"     3  25  
## 4 E20s  "금융기관으로부터 빌림"                    4  33.3
## 5 L20s  "자기돈(상속인 경우 포함)"                46  46.5
## 6 L20s  "무상으로 도움을 받음 "                   14  14.1
MZprepare2<- wel %>% 
  select(prepare1, prepare2, housingtype, MZ) %>% 
  na.omit() %>% 
  count(MZ, prepare2) %>% 
  group_by(MZ) %>% 
  mutate(pct = round(n/sum(n)*100, 1))

head(MZprepare2)
## # A tibble: 6 × 4
## # Groups:   MZ [2]
##   MZ    prepare2                                   n   pct
##   <fct> <fct>                                  <int> <dbl>
## 1 E20s  "자기돈(상속인 경우 포함)"                 4  66.7
## 2 E20s  "무상으로 도움을 받음 "                    2  33.3
## 3 L20s  "자기돈(상속인 경우 포함)"                23  74.2
## 4 L20s  "무상으로 도움을 받음 "                    1   3.2
## 5 L20s  "부모,형제,친척,친구 등으로 부터 빌림"     3   9.7
## 6 L20s  "금융기관으로부터 빌림"                    4  12.9

그래프 만들기

1. 연령대/지역별 점유형태 분석

1-1. 전 연령대별 점유형태 그래프

ageg_type$housingtype <- factor(ageg_type$housingtype, levels = c("기타", "비가구원 명의 주택", "월세(사글세)", "보증부 월세", "전세", "자가"))

ggplot(data = ageg_type, aes(x = age_group, y = pct, fill = housingtype)) +
  geom_col() +
  coord_flip() +
  ggtitle("전 연령대별 점유형태 비율")  +
  labs(x = "전체 연령대", y = "비율", fill = "점유형태") +
  geom_text(aes(label=paste0(round(pct,1), '%')),
            position=position_stack(vjust=0.5),
            color='black', size=3) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 15, color = "black"))

20대는 ’보증부 월세’가 50.3%, 전세가 20.8%를 차지했다. ’자가’의 비율은 3.43%로 6가지 점유형태 중 가장 작은 비중을 차지하는 것을 볼 수 있다. 30대부터는 ’자가’의 비율이 가장 높다. 또한 20대부터 70대까지 자가의 비율은 점점 늘어나고, 전세는 줄어 들고있다.

20대에서 30대로의 ’자가’의 증가율이 가장 높고, 그 다음 30대에서 40대가 두 번째로 높다. 이번 보고서의 중심 대상인 MZ세대에 해당하는 연령대인 20s, 30s, 40s에서 점유형태 비율의 차이가 크게 나는 것을 알 수 있다.

1-2. MZ세대 연령대별 점유형태 그래프

MZ_type$housingtype <- factor(MZ_type$housingtype, levels = c("기타", "비가구원 명의 주택", "월세(사글세)", "보증부 월세", "전세", "자가"))

MZ_type %>% 
  filter(!is.na(MZ)) %>% 
  ggplot(aes(x = MZ, y = pct, fill = housingtype)) +
  geom_col() +
  coord_flip() +
  scale_x_discrete(limit = c("E20s", "L20s", "E30s", "L30s", "E40s")) +
  labs(x = "연령대", y = "비율", fill = "점유형태") +
  geom_text(aes(label=paste0(round(pct,1), '%')),
            position=position_stack(vjust=0.5),
            color='black', size=2.5) +
  ggtitle("MZ세대 연령대별 점유형태 비율")  +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 15, color = "black"))

E20s에서는 보증부 월세, 전세, 월세(사글세)의 순서로 비율이 높고 자가의 경우 가장 작다.

wel %>% 
 group_by(MZ) %>% 
  summarise(n = n())
## # A tibble: 6 × 2
##   MZ        n
##   <fct> <int>
## 1 E20s     19
## 2 L20s    130
## 3 E30s    188
## 4 L30s    224
## 5 E40s    393
## 6 <NA>   6911

그러나 20대 초반의 표본이 다른 연령대에 비해 현저히 작기 때문에 E20s항목을 관찰하고 분석하는 것에 한계가 있어 다른 연령대와의 비교에서 제외하고 본다면

연령대가 높아질 수록 ’자가’의 비율이 증가하고, ’보증부 월세’의 비율이 감소하고 있다.

1-3. 지역별 점유형태 그래프 (전 연령대)

region_type$housingtype <- factor(region_type$housingtype, levels = c("기타", "비가구원 명의 주택", "월세(사글세)", "보증부 월세", "전세", "자가"))

ggplot(data = region_type, aes(x = region, y = pct, fill = housingtype)) +
  geom_col() +
  coord_flip() +
  labs(x = "지역", y = "비율", fill = "점유형태") +
  geom_text(aes(label=paste0(round(pct,1), '%')),
            position=position_stack(vjust=0.5),
            color='black', size=2.5) +
  ggtitle("지역별 점유형태 비율 (전 연령대)")  +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 15, color = "black"))

전체 지역에서 ’자가’보다는 ’전세’나 ’보증부 월세’의 점유형태가 많다.

서울에서 ’자가’는 44.9%로 다른 지역에 비해 가장 낮은 비율이며, ’전세’는 21.4%, ’보증부 월세’는 26.9%로 다른 지역에 비해 비율이 가장 크다. 서울 다음으로 수도권에서 ’자가’의 비율이 낮으며, ’전세’와 ’보증부 월세’의 비중이 높다. 이와 반대로 광주/전남/전북/제주도에서는 ’자가’의 비율이 65.6%로 가장 높으며, ’전세’의 비율 4.5%로 가장 낮다.

1-4. 지역별 점유형태 그래프 (MZ세대)

ggplot(data = region_typeMZ, aes(x = region, y = pct, fill = housingtype)) +
  geom_col() +
  coord_flip() +
  labs(x = "지역", y = "비율", fill = "점유형태") +
  geom_text(aes(label=paste0(round(pct,1), '%')),
            position=position_stack(vjust=0.5),
            color='black', size=2.5) +
  ggtitle("지역별 점유형태 비율 (MZ세대)") +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 15, color = "black"))

20세에서 44세만을 대상으로 분석한 그래프에서는 서울에서 ’자가’는 26.9%로 다른 지역에 비해 가장 낮은 비율이며, ’전세’는 33.6%, ’보증부 월세’는 27.5%로 다른 지역에 비해 비율이 크다. 따라서 서울은 ’자가’보다는 ’전세’나 ’보증부 월세’의 점유형태가 많다.

이와 반대로 광주/전남/전북/제주도에서는 ’자가’의 비율이 42.9%로 가장 높으며, ’전세’의 비율 17.1%로 가장 낮다. 따라서 광주/전남/전북/제주도에서는 ’전세’나 ’보증부 월세’보다 ’자가’의 점유형태가 많다.

1-5. 연령대별 지역 비율 그래프 (MZ세대)

ggplot(data = MZage_region, aes(x = MZ, y = pct, fill = region)) +
  geom_col() +
  coord_flip() +
  labs(x = "연령대", y = "비율", fill = "지역") +
  geom_text(aes(label=paste0(round(pct,1), '%')),
            position=position_stack(vjust=0.5),
            color='black', size=2.5) +
  ggtitle("연령대별 지역 비율 그래프 (MZ세대)") +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 15, color = "black"))

각 연령대가 여러 지역에 골고루 거주하고 있다.

2. 연령별 주거면적/주택마련비용

2-1. 연령별 평균주거면적 분석

p <- ggplot(data = age_area, aes(x = age, y = mean_area)) +
  geom_line() +
  geom_smooth() +
  labs(x = "나이", y = "주거면적(단위: 평)") +
  ggtitle("전 연령별 평균 주거면적 (단위: 평)")  +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 15, color = "black")) 

ggplotly(p)
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

연령에 따른 주거면적의 전체적인 추이이다. 청년 시절 낮은 수치에서 시작해서 전반적으로 상승세를 보이다가 50세부터 하락하는 것을 알 수 있다. 평균주거면적이 가장 좁은 연령은 22세로 7.55평이며, 가장 넓은 연령은 97의 29.09평이나 97세의 표본이 4개라는 점에서 그 다음으로 넓은 46세가 27.99평이 있다.

wel %>%
  filter(age == 97) %>% 
  select(age, area)
##   age area
## 1  97 32.1
## 2  97 32.1
## 3  97 20.0
## 4  97 32.1
P <- ggplot(data = MZ_area, aes(x = age, y = mean_area)) +
  geom_line() +
  geom_smooth() +
  labs(x = "나이", y = "주거면적 (단위: 평)") +
  ggtitle("MZ연령별 주거면적 (단위: 평)")  +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 15, color = "black")) 

ggplotly(P)
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

20세부터 44세까지의 주거면적의 전체적인 추이를 더 자세히 볼 수 있다. 전반적으로 상승세이다.

2-2. MZ세대 연령대별 주택마련비용(집값) 그래프

q <- age_price %>% 
  ggplot(aes(x = MZ, y = houseprice, fill = housingtype)) +
  geom_boxplot() +
  scale_x_discrete(limit = c("E20s", "L20s", "E30s", "L30s", "E40s")) +
  ylim(0,75000) +
  labs(x = "연령대", y = "집값(단위: 만 원)", fill = "점유형태") +
  scale_fill_discrete(limit = c("자가", "전세", "보증부 월세")) +
  ggtitle("MZ연령대별 집값/보증금 (단위: 만 원)")  +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 15, color = "black")) +
  facet_wrap(~housingtype, ncol = 3)
ggplotly(q)
## Warning: Removed 40 rows containing non-finite values (`stat_boxplot()`).

연령대별 집값의 분포 차이를 볼 수 있다. 전반적으로 연령대가 높아질 수록 집값이 더 높은 집에서 거주한다. 세 점유형태 모두에서 30대초반이 20대후반보다 거주하고 있는 집값 분포가 넓고 가격이 높다. 점유형태에 따른 집값의 분포 차이도 볼 수 있는데, ‘자가’의 가격대가 가장 높고, 보증금은 ’전세’, ‘보증금 월세’ 순서로 가격대가 더 높다.

Q <- age_price %>% 
  filter(housingtype == "자가") %>%
  ggplot(aes(x = MZ, y = houseprice)) +
  geom_boxplot() +
  ylim(0, 200000) +
  scale_x_discrete(limit = c("E20s", "L20s", "E30s", "L30s", "E40s")) +
  labs(x = "연령대", y = "주택가격") +
  ggtitle("MZ연령대별 집값 (자가) (단위: 만 원)")  +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 15, color = "black"))

ggplotly(Q)
## Warning: Removed 1 rows containing non-finite values (`stat_boxplot()`).

’자가’에 거주하는 MZ세대 사람들의 연령대별 집값의 분포 차이를 볼 수 있다. 천오백만원부터 19억까지 있다. 전반적으로 연령대가 높아질 수록 거주하고 있는 집의 전세금 분포가 넓고 가격이 높다.

R <- age_price %>% 
  filter(housingtype == "전세") %>%
  ggplot(aes(x = MZ, y = houseprice)) +
  geom_boxplot() +
  scale_x_discrete(limit = c("E20s", "L20s", "E30s", "L30s", "E40s")) +
  ylim(0,63000) +
  labs(x = "연령대", y = "전세금") +
  ggtitle("MZ연령대별 집값 (전세) (단위: 만 원)")  +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 15, color = "black"))

ggplotly(R)

’전세’로 거주하는 MZ세대 사람들의 연령대별 전세금의 분포 차이를 볼 수 있다. 110만원부터 6억 3천까지 있다. 전반적으로 연령대가 높아질 수록 거주하고 있는 집의 전세금 분포가 넓고 가격이 높다.

Z <- age_price %>% 
  filter(housingtype == "보증부 월세") %>%
  ggplot(aes(x = MZ, y = houseprice)) +
  geom_boxplot() +
  scale_x_discrete(limit = c("E20s", "L20s", "E30s", "L30s", "E40s")) +
  ylim(0,35500) +
  labs(x = "연령대", y = "보증금") +
  ggtitle("MZ연령대별 집값 (보증부 월세) (단위: 만 원)")  +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 15, color = "black"))

ggplotly(Z)

’보증부 월세’로 거주하는 MZ세대 사람들의 연령대별 보증금의 분포 차이를 볼 수 있다. 20만원부터 2억 5천까지 있다. 30대 초반이 20대 후반보다 보증금 분포가 더 넓고 가격이 높다.

2-3. 연령대별 평당가격 그래프

pp <- price_per_area %>% 
  ggplot(aes(x = MZ, y = price_per, color = housingtype)) +
  geom_boxplot() +
  ylim(0, 1500) +
  scale_x_discrete(limit = c("E20s", "L20s", "E30s", "L30s", "E40s")) +
  labs(x = "연령대", y = "1평당가격", color = "점유형태") +
  ggtitle("MZ연령대별 1평당가격 (단위: 만 원)")  +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 15, color = "black")) +
  facet_wrap(~housingtype, ncol = 3)

ggplotly(pp)
## Warning: Removed 157 rows containing non-finite values (`stat_boxplot()`).

면적이 넓을 수록 가격이 높아지기 때문에 두 종속변수를 한 번에 보기 위해 ‘1평당집값’ 변수를 만들어 MZ세대 연령대별 1평당가격 분포 차이를 볼 수 있다. 30대 초반이 20대 후반보다 1평당가격 분포가 더 넓고 가격이 높다.

3. 주택구입비용/보증금 마련 경로 그래프

3-1. 순위별 그래프

ggplot(data = per_prepare1, aes(x = '', y = pct, fill = prepare1))+
  geom_bar(stat='identity')+
  theme_void()+
  coord_polar('y', start=0 )+
  geom_text(aes(label=paste0(round(pct,1), '%')),
            position=position_stack(vjust=0.5),
            color='black', size=2.5) +
  labs(fill = "1순위") +
  ggtitle("주택구입비용/보증금 마련경로 (1순위)") +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 15, color = "black"))

주택구입비용 또는 보증금 1순위 마련경로는 자기돈이 49%로 가장 높았고, 금융기관으로부터 빌리는 경우가 44%로 두 번째로 높다.

ggplot(data = per_prepare2, aes(x = '', y = pct, fill = prepare2))+
  geom_bar(stat='identity')+
  theme_void()+
  coord_polar('y', start=0 ) +
  geom_text(aes(label=paste0(round(pct,1), '%')),
            position=position_stack(vjust=0.5),
            color='black', size=4) +
  labs(fill = "2순위") +
  ggtitle("주택구입비용/보증금 마련경로 (2순위)") +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 15, color = "black"))

주택구입비용 또는 보증금 2순위 마련경로는 자기돈과 금융기관으로부터 빌리는 경우가 45.4%로 공동으로 큰 비중을 차지했다.

3-2. 연령대별 주택구입비용/보증금 1순위 마련경로 그래프

ggplot(data = MZprepare, aes(x = '', y = pct, fill = prepare1)) +
  geom_bar(stat='identity')+
  theme_void() +
  coord_polar('y', start=0 )+
  geom_text(aes(label=paste0(round(pct,1), '%')),
            position=position_stack(vjust=0.5),
            color='black', size=3) +
  ggtitle("주택구입비용/보증금 마련경로 (MZ연령별)") +
  labs(fill = "마련경로") +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 15, color = "black")) +
  facet_wrap(~MZ, nrow = 3) 

MZ세대 연령대별 주택구입비용/보증금 마련 1순위 경로를 알 수 있다. 연령대가 높아질 수록 ’자기돈’으로 마련하는 비율이 높아지고 ’금융기관으로부터 빌림’과 ’부모, 친구, 형제, 친척, 친구 등으로부터 빌림’의 비율은 낮아진다.

결론

전체 경향으로는 연령대가 높아질 수록 자가의 비율이 늘어나고 전세는 줄어든다. MZ세대를 중심으로 관찰해보면 20대, 30대, 40대의 점유형태별 비율변화가 가장 크게 나타난다. 주거면적, 집값, 평당집값 모두 20대에서 40대 초반 사이에서 연령대가 증가할 수록 높아지는 추세이다. 사회초년생이면서 1인 가구에서 시작해서 가구원의 수가 늘어나고, 소득이 증가하는 것이 그 원인일 수 있다고 생각한다. 그러나 현재 20대의 청년들 중 1인가구체제를 유지하는 비율이 높아진다면 나이의 증가에 따른 주거면적, 집값의 상승폭이 줄어들거나 극단적으로는 더이상 정비례관계를 유지하지 않을 수도 있다. 주택구입비용/보증금을 마련하기 위해서 사람들은 ’상속을 포함한 자기돈’과 ’금융기관으로부터 빌림’의 경로를 주로 이용하고 있다. MZ세대 안에서는 연령대가 높아질 수록 자기돈으로 마련하는 비율이 높아진다.