Mac용 한글폰트 준비
library(showtext)
## Loading required package: sysfonts
## Loading required package: showtextdb
font_add(family = "apple", regular = "/System/Library/Fonts/AppleGothic.ttf")
showtext_auto() # 모든 그래프에 적용
본 연구는 최근 한국 사회의 주거 불안정 문제가 가구의 정신건강(스트레스, 우울)과 삶의 만족도에 미치는 영향을 분석하는 것을 목표로 한다. 또한 소득, 고용 상태, 가구원 수 등 사회·경제적 조건이 이러한 관계를 어떻게 조절하는지 규명하고자 한다.
주거 안정성은 인간의 기본적 권리이며 행복한 삶의 필수 조건이다.
그러나 한국에서는 최근 몇 년 사이 전세사기 문제가 대규모로 발생하면서
수많은 세입자들이 평생 모은 돈을 잃거나 주거권을 상실하는 등 심각한
피해를 입었다.
특히 2023년과 2024년을 거치며 전국적으로 무자본 갭투자, 깡통전세, 허위
임대계약 등이 연이어 터지며 전세 제도의 구조적 한계가 드러났다.
한편, 새로운 정부 출범 이후 한국 부동산 시장에는 다양한 규제 완화와 주택 공급 확대 정책이 추진되고 있다. 정부는 대출 규제 완화, 재건축·재개발 활성화, 청년·신혼부부 대상 주택 공급 확대 등을 통해 시장 안정화를 도모하고 있으나, 단기적 효과에 대한 우려와 함께 서민·청년층의 주거 불안 해소에 대한 실효성 논란이 계속되고 있다.
이러한 복합적 상황 속에서 주거 만족도가 국민 개개인의 정신건강과 삶의 질에 어떤 영향을 주는지를 실증적으로 분석하는 것은 현재 한국 사회의 주거 복지 정책의 방향을 설정하는 데 중요한 기초자료가 될 것이다.
최종 그래픽은 주거 만족도 수준에 따라 우울감과 스트레스 정도가 어떻게 달라지고, 소득·고용·가구원 수와 같은 조건에 따라 그 차이가 얼마나 벌어지는지를 시각적으로 보여준다. 이를 통해 주거 불안이 곧 국민 정신건강 문제로 이어지고 있음을 강조하며, 안정적이고 실효성 있는 주거 정책의 필요성을 시사한다.
본 연구에 사용된 데이터는 한국복지패널조사(KOWEPS)의 최신 가구원 데이터(2024년 베타1 버전)이다. 한국복지패널조사는 한국보건사회연구원과 서울대학교 사회복지연구소가 공동으로 매년 수행하는 전국 대표 복지·소득·고용·주거 관련 종단조사로, 정책 결정 및 학술 연구에 폭넓게 활용되고 있다.
이번 분석에서는 특히 아래와 같은 주요 변수들을 활용하였다:
| 변수명 | 설명 |
|---|---|
| p1903_7 | 응답자가 자신의 현재 주거환경에 대해 느끼는 전반적인 만족도를 측정한 항목 |
| p1905_2 | 최근 일정 기간 동안 느낀 우울감 정도 |
| p1905_3 | 일상생활에서 경험하는 스트레스 수준 |
| h19_inc1 | 월평균 가구 소득 |
| p1902_1 | 응답자의 현재 경제활동 참여 여부 |
| h19_pind | 한 가구에 속한 전체 인원 수 |
데이터는 각 변수별 결측치를 제거한 뒤 분석에 적합한 형태로 재가공되었으며, 주거 만족도가 정신건강 및 삶의 질과 어떤 연관성을 갖는지를 다각도로 탐색할 수 있도록 구성되었다. 이를 통해 주거 불안 상황이 국민 개개인의 삶에 미치는 영향을 구체적 데이터로 입증하고자 한다.
library(haven)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.2 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.0.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(plotly)
##
## Attaching package: 'plotly'
##
## The following object is masked from 'package:ggplot2':
##
## last_plot
##
## The following object is masked from 'package:stats':
##
## filter
##
## The following object is masked from 'package:graphics':
##
## layout
data_raw <- read_sav("koweps_p19_2024_beta1.sav")
data <- data_raw %>%
select(
p1903_7, # 주거 만족도
p1905_2, # 우울
p1905_3, # 스트레스
p19_ws_c, # 근로소득
p1902_1, # 고용 상태
h19_pind # 가구원 수
) %>%
rename(
house_satisfaction = p1903_7,
depression = p1905_2,
stress = p1905_3,
income = p19_ws_c,
job_status = p1902_1,
household_size = h19_pind
) %>%
drop_na()
data
## # A tibble: 3,572 × 6
## house_satisfaction depression stress income job_status household_size
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 4 3 1 0.265 4 1
## 2 1 2 2 0.832 4 1
## 3 3 1 1 0.761 1 1
## 4 3 1 2 0.702 1 1
## 5 4 2 2 0.643 4 1
## 6 3 2 4 0.826 4 1
## 7 4 1 2 1.75 2 1
## 8 4 3 5 1.55 1 1
## 9 3 1 2 0.681 1 1
## 10 3 2 3 1.53 4 8
## # ℹ 3,562 more rows
boxplot(data$income, main = "근로소득 Boxplot", horizontal = TRUE)
summary(data$household_size)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 1.000 1.000 2.553 1.000 19.000
# IQR 및 상/하한 계산
Q1 <- quantile(data$income, 0.25)
Q3 <- quantile(data$income, 0.75)
IQR <- Q3 - Q1
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR
# 극단치 제외한 데이터셋 만들기
data_clean <- data %>%
filter(income >= lower_bound & income <= upper_bound)
# 결과 확인
summary(data_clean$income)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.009726 0.701360 1.130065 1.175963 1.529965 2.868106
boxplot(data_clean$income, main = "극단치 제거 후 근로소득 Boxplot", horizontal = TRUE)
glimpse(data_clean)
## Rows: 3,499
## Columns: 6
## $ house_satisfaction <dbl> 4, 1, 3, 3, 4, 3, 4, 4, 3, 3, 4, 4, 3, 4, 4, 4, 3, …
## $ depression <dbl> 3, 2, 1, 1, 2, 2, 1, 3, 1, 2, 4, 1, 4, 2, 2, 4, 3, …
## $ stress <dbl> 1, 2, 1, 2, 2, 4, 2, 5, 2, 3, 1, 1, 2, 1, 5, 3, 4, …
## $ income <dbl> 0.2654434, 0.8315130, 0.7613555, 0.7016779, 0.64303…
## $ job_status <dbl> 4, 4, 1, 1, 4, 4, 2, 1, 1, 4, 2, 2, 4, 1, 4, 1, 1, …
## $ household_size <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 1, 11, 1, 1, 1, 1, 7,…
mean_satisfaction <- mean(data_clean$house_satisfaction)
print(paste("평균 주거 만족도:", round(mean_satisfaction, 2)))
## [1] "평균 주거 만족도: 3.76"
correlation <- cor(data_clean$depression, data_clean$stress)
print(paste("우울-스트레스 상관계수:", round(correlation, 2)))
## [1] "우울-스트레스 상관계수: 0.34"
income_by_job <- data_clean %>%
group_by(job_status) %>%
summarise(mean_income = mean(income))
print(income_by_job)
## # A tibble: 5 × 2
## job_status mean_income
## <dbl> <dbl>
## 1 1 1.26
## 2 2 0.949
## 3 3 0.922
## 4 4 1.14
## 5 5 0.982
전체 데이터를 기준으로 주거 만족도가 하위 15%에
해당하는 사람들을 ‘주거불안층’으로 분류하였다.
quantile( ) 함수를 사용하여 주거 만족도의 15% 분위수(q15)를 계산하고, house_satisfaction이 이 분위수 이하이면 “Yes” (주거불안층), 초과이면 “No” (주거불안층 아님)으로 새 변수 unsecure를 생성하였다.
주거 만족도가 낮은 사람들을 특정 기준으로 구분해, 이들이 어떤 특징을 가지는지, 소득, 고용 상태, 가구 규모 등과 어떤 관계가 있는지 불안층과 그렇지 않은 층 간의 차이를 심층적으로 비교하기 위해 생성한 변수이다.
주거불안층(Yes): 933명
주거불안층 아님(No): 2,566명
## 주거 만족도 하위 30% → 주거불안층
q15 <- quantile(data_clean$house_satisfaction, 0.15)
data_clean <- data_clean %>%
mutate(unsecure = ifelse(house_satisfaction <= q15, "Yes", "No"))
table(data_clean$unsecure)
##
## No Yes
## 2566 933
목적
결과 해석
(Intercept): 절편은 3.75로, 모든 변수값이 0일 때 주거 만족도의
예상값.
income: 소득이 1 단위 증가할 때 주거 만족도는 0.0165만큼 증가
(p=0.40 → 통계적으로 유의하지 않음)
household_size: 가구원 수가 1명 늘어나면 주거 만족도는 0.0042
증가 (p=0.19 → 유의하지 않음)
job_status: 고용상태가 한 단계 올라갈 때 주거 만족도는 0.010 감소 (p=0.31 → 유의하지 않음)
R² = 0.001, p-value = 0.2996 → 모델이 주거 만족도를 설명하는 설명력이 극히 낮음.
시사점
model1 <- lm(data_clean$house_satisfaction ~ data_clean$income + data_clean$household_size + data_clean$job_status, data_clean = data_clean)
## Warning: In lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
## extra argument 'data_clean' will be disregarded
summary(model1)
##
## Call:
## lm(formula = data_clean$house_satisfaction ~ data_clean$income +
## data_clean$household_size + data_clean$job_status, data_clean = data_clean)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.8178 -0.7244 0.2347 0.2559 1.2863
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.749922 0.035416 105.882 <2e-16 ***
## data_clean$income 0.016473 0.019662 0.838 0.402
## data_clean$household_size 0.004162 0.003173 1.312 0.190
## data_clean$job_status -0.010399 0.010195 -1.020 0.308
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.75 on 3495 degrees of freedom
## Multiple R-squared: 0.001049, Adjusted R-squared: 0.0001913
## F-statistic: 1.223 on 3 and 3495 DF, p-value: 0.2996
목적
결과 해석
시사점
model2 <- lm(data_clean$depression ~ data_clean$house_satisfaction + data_clean$income + data_clean$job_status, data_clean = data_clean)
## Warning: In lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
## extra argument 'data_clean' will be disregarded
summary(model2)
##
## Call:
## lm(formula = data_clean$depression ~ data_clean$house_satisfaction +
## data_clean$income + data_clean$job_status, data_clean = data_clean)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.3725 -0.3496 -0.2202 0.7325 1.9608
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.399943 0.090970 26.382 < 2e-16 ***
## data_clean$house_satisfaction 0.002849 0.021342 0.133 0.89381
## data_clean$income -0.080695 0.024785 -3.256 0.00114 **
## data_clean$job_status -0.036232 0.012849 -2.820 0.00483 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.9465 on 3495 degrees of freedom
## Multiple R-squared: 0.004891, Adjusted R-squared: 0.004037
## F-statistic: 5.726 on 3 and 3495 DF, p-value: 0.0006619
목적
결과 해석
시사점
# 주거불안층을 0/1로 바꾸기
data_clean <- data_clean %>%
mutate(unsecure_bin = ifelse(unsecure == "Yes", 1, 0))
# 로지스틱 회귀 모델
model_logit <- glm(unsecure_bin ~ income + job_status + depression + stress + household_size, data = data_clean, family = binomial)
# 결과 확인
summary(model_logit)
##
## Call:
## glm(formula = unsecure_bin ~ income + job_status + depression +
## stress + household_size, family = binomial, data = data_clean)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.04905 0.15147 -6.926 4.34e-12 ***
## income -0.05890 0.05985 -0.984 0.3251
## job_status 0.05313 0.03054 1.740 0.0819 .
## depression -0.05673 0.04338 -1.308 0.1909
## stress 0.06253 0.02901 2.155 0.0311 *
## household_size -0.01776 0.01004 -1.768 0.0770 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 4058.1 on 3498 degrees of freedom
## Residual deviance: 4046.7 on 3493 degrees of freedom
## AIC: 4058.7
##
## Number of Fisher Scoring iterations: 4
fit <- lm(house_satisfaction ~ income, data = data_clean)
trend_df <- data.frame(
income = seq(
min(data_clean$income),
max(data_clean$income),
length.out = 100
)
)
trend_df$fit <- predict(fit, newdata = trend_df)
p <- plot_ly() %>%
# 산점도 trace
add_trace(
data = data_clean,
x = ~income,
y = ~house_satisfaction,
type = 'scatter',
mode = 'markers',
marker = list(opacity = 0.3),
name = "관측값"
) %>%
# 추세선 trace
add_trace(
data = trend_df,
x = ~income,
y = ~fit,
type = 'scatter',
mode = 'lines',
line = list(color = 'blue'),
name = "추세선"
) %>%
# Layout
layout(
title = "소득과 주거 만족도의 관계 (Plotly Native)",
xaxis = list(title = "소득"),
yaxis = list(title = "주거 만족도")
)
p
해당 산점도는 개별 응답자의 근로 소득 수준과 주거 만족도 간의 관계를 시각적으로 보여준다. 그래프에서 볼 수 있듯이, 소득이 높아질수록 주거 만족도가 다소 증가하는 경향이 있으나 그 상관성은 매우 약한 수준임을 알 수 있다. 이는 점들이 넓게 산포되어 있어 소득이라는 단일 변수만으로 주거 만족도를 완전히 설명하기 어렵다는 점을 의미한다. 특히 이번에는 정적 이미지 대신 인터랙티브 그래프로 구현하여 데이터 점에 마우스를 올려 개별 값과 특성을 직접 확인할 수 있도록 함으로써, 기존 산점도의 점 겹침 문제를 개선하고 세밀한 패턴 탐색이 가능하도록 하였다.
그래프는 두 연속형 변수 간의 관계를 직관적으로 보여주기에 산점도가 가장 적합하며, 선형 추세선을 추가하여 데이터가 전반적으로 어떤 방향성을 갖는지 쉽게 파악할 수 있도록 구성했다. 점들은 geom_point()에 투명도(alpha = 0.3)를 적용하여 밀집 구간에서도 분포를 명확히 구분할 수 있도록 했으며, geom_smooth(method = “lm”)를 통해 산점도만으로는 알아보기 어려운 전체적인 선형 경향을 파란색 추세선으로 강조하였다. 기본 색상을 사용하여 시각적 복잡성을 최소화하고 핵심 메시지인 소득과 만족도의 관계에 집중할 수 있도록 디자인했다.
ggplot(data_clean, aes(x = house_satisfaction, y = depression)) +
geom_point(alpha = 0.3) +
geom_smooth(method = "lm") +
labs(title = "주거 만족도와 우울의 관계", x = "주거 만족도", y = "우울 점수")
## `geom_smooth()` using formula = 'y ~ x'
이 산점도는 각 개인의 주거 만족도 점수와 우울 점수 간의 관계를 시각적으로 표현한 것이다. 그래프에 나타난 파란 선은 데이터를 기반으로 계산된 선형 회귀선을 의미하며, 전체적으로 기울기가 거의 없는 평평한 형태로 나타나 두 변수 간의 직접적인 관계가 매우 약함을 보여준다. 즉, 주거 만족도가 높다고 해서 우울 점수가 일관되게 낮아지거나 높아지는 뚜렷한 경향은 관찰되지 않는다. 이를 통해 우울 점수를 설명할 때는 주거 만족도 외에도 스트레스 수준, 사회적 지지 같은 다른 심리·사회적 요인들이 함께 고려되어야 함을 시사한다.
그래프는 두 연속형 변수의 상관 관계를 시각적으로 즉시 파악할 수 있도록 산점도를 활용했으며, 데이터의 흐름을 한눈에 파악할 수 있도록 선형 추세선을 함께 추가하였다. 산점도에는 geom_point()에 투명도(alpha = 0.3)를 적용하여 데이터 점이 밀집된 구간에서도 전체 분포가 잘 보이도록 했고, geom_smooth(method = “lm”)을 사용해 복잡한 데이터 패턴을 선형으로 간략히 요약하여 추세의 방향성을 직관적으로 전달하도록 설계하였다. 기본 ggplot2 테마와 색상을 그대로 활용해 불필요한 시각적 장식을 줄이고, 핵심 메시지에 집중할 수 있도록 시각적 단순성을 유지했다.
ggplot(data_clean, aes(x = house_satisfaction)) +
geom_histogram(fill = "steelblue", bins = 20, color = "white") +
labs(title = "주거 만족도 분포", x = "주거 만족도", y = "빈도")
이 히스토그램은 전체 가구원의 주거 만족도 점수(1점부터 5점까지)가 데이터에서 어떻게 분포하는지를 시각적으로 보여준다. 그래프를 보면 주거 만족도가 4점인 구간에 응답이 가장 많이 몰려 있으며, 낮은 점수대(1~2점)에는 상대적으로 응답자가 적게 분포해 있다. 이는 대다수의 사람들이 자신의 현재 주거 상태를 비교적 만족스럽다고 평가하고 있음을 시사하며, 전반적인 한국 가구의 주거 안정성이 일정 수준 이상 유지되고 있음을 엿볼 수 있다. 다만 일부 응답자가 낮은 점수를 선택한 것을 통해, 여전히 소수의 주거불안층이나 취약계층이 존재함을 간접적으로 확인할 수 있어 이들에 대한 심층적인 추가 분석이 필요할 수 있다.
히스토그램은 단일 변수의 전체적인 분포 형태를 직관적으로 확인하는 데 가장 적합한 그래프로, 데이터의 편향성, 중앙값, 분산 정도 등을 한눈에 파악할 수 있다는 장점이 있다. 이번 그래프에서는 이산형 점수(1~5)임에도 연속형 히스토그램으로 표현하여 응답 점수별 몰림 정도를 더 세밀하게 살펴볼 수 있도록 했다. 막대 색상을 steelblue로 지정해 신뢰와 안정감을 강조했고, 주거와 같은 안정적 생활 요소를 시각적으로 잘 표현할 수 있도록 했다. 또한 막대 경계선을 흰색으로 설정해 막대 간 구분을 선명하게 하고, bins = 20으로 세분화하여 응답 점수대별 세부 분포를 더욱 뚜렷하게 나타내도록 설계하였다.
ggplot(data_clean, aes(x = as.factor(job_status), y = income)) +
geom_boxplot(fill = "orange") +
labs(title = "고용 상태별 소득", x = "고용 상태", y = "소득")
이 박스플롯은 고용 상태에 따라 가구의 소득 분포가 어떻게 달라지는지를 한눈에 비교할 수 있도록 시각화한 것이다. 그래프를 살펴보면, 1번 그룹(정규직 혹은 주요 직업군)의 소득 중앙값이 다른 그룹보다 확연히 높게 나타나며, 상대적으로 안정적인 소득 구조를 보인다. 반면 2번과 3번 그룹(비정규직 또는 임시직)은 소득의 중앙값이 더 낮고, 상자와 수염이 넓게 퍼져 있어 소득 분포의 변동 폭이 큰 특징을 보여준다. 이러한 결과는 고용 안정성이 소득 수준에 긍정적인 영향을 미친다는 점을 데이터로 뒷받침해주며, 소득 격차가 고용 형태에 따라 구조적으로 발생할 수 있음을 시사한다.
박스플롯은 여러 범주형 그룹 간 연속형 변수의 분포를 비교하기에 가장 직관적인 그래프로, 중앙값, 사분위 범위, 이상치 등을 시각적으로 빠르게 파악할 수 있다. 이번 그래프에서는 상자의 채색을 주황색(orange)으로 지정해 시각적 주목성을 높였으며, 색 대비와 간결한 축 라벨을 통해 가독성을 높였다. 불필요한 배경 요소나 장식을 배제해 핵심 메시지인 고용 상태별 소득 분포 비교에 사용자의 시선을 집중시킬 수 있도록 설계하였다.
data_clean %>%
group_by(household_size) %>%
summarise(mean_satisfaction = mean(house_satisfaction)) %>%
ggplot(aes(x = as.factor(household_size), y = mean_satisfaction)) +
geom_col(fill = "forestgreen") +
labs(title = "가구원 수별 평균 주거 만족도", x = "가구원 수", y = "평균 주거 만족도")
이 그래프는 가구원 수에 따라 평균 주거 만족도가 어떻게 달라지는지를 보여준다. 각 막대는 특정 가구 규모에 속한 응답자들의 주거 만족도를 평균하여 나타낸 값으로, 가구 규모별 만족도 수준을 비교할 수 있도록 구성되었다. 전체적으로 대부분의 가구원 수 구간에서 주거 만족도는 3.7에서 4.0 정도로 비교적 높은 수준을 유지하고 있으며, 일부 가구원 수 구간에서 약간의 차이는 나타나지만 큰 편차는 발견되지 않는다. 이는 가구 규모가 커지거나 작아진다고 해서 주거 만족도에 극적인 변화가 발생하지는 않는다는 점을 시사한다.
막대그래프는 범주형 변수(가구원 수)와 연속형 변수(평균 주거 만족도)를 함께 비교할 때 가장 직관적인 시각화 방법으로 적합하다. 이번 그래프에서는 막대를 녹색(forestgreen)으로 지정하여 시각적으로 안정감을 주고, 가족이나 가구를 상징하는 따뜻한 느낌을 표현하도록 했다. 복잡한 장식을 배제하고 깔끔한 디자인을 적용함으로써 가구원 수별 만족도 차이를 쉽게 파악할 수 있도록 시각적 가독성을 높였다.
data_clean %>%
count(unsecure) %>%
ggplot(aes(x = unsecure, y = n, fill = unsecure)) +
geom_col() +
labs(title = "주거불안층 분포 (하위 15%)", x = "주거불안 여부", y = "빈도") +
theme_minimal()
이 그래프는 전체 데이터에서 주거 만족도가 하위 15%에 해당하는 사람들을 ’주거불안층(Yes)’으로 정의하고, 이들의 비율을 시각적으로 나타낸 것이다. 그래프를 통해 전체 인구 중에서 주거불안층이 차지하는 크기와 비율을 한눈에 직관적으로 확인할 수 있으며, 이를 통해 전체 데이터에서 낮은 주거 만족도를 가진 취약 계층의 상대적 규모를 쉽게 파악할 수 있다.
이 막대그래프는 두 그룹을 색상으로 구분하여 가독성을 높였다. 빨간색은 주거 만족도가 비교적 높은 그룹(No)을 의미하고, 청록색은 하위 15%에 해당하는 주거불안층(Yes)을 나타낸다. 두 색상 간의 대비를 통해 불필요한 격자나 장식 없이도 비율 차이를 강조하도록 디자인되었으며, 시각적 요소를 최소화하여 핵심 메시지인 주거불안층의 존재와 규모를 보다 선명하게 전달할 수 있도록 구성하였다.
# 예측용 데이터 만들기: stress를 1~5로 변화시키고 나머지 변수는 평균으로 고정
new_data <- data.frame(
stress = seq(min(data_clean$stress), max(data_clean$stress), length.out = 100),
income = mean(data_clean$income, na.rm = TRUE),
job_status = mean(data_clean$job_status, na.rm = TRUE),
depression = mean(data_clean$depression, na.rm = TRUE),
household_size = mean(data_clean$household_size, na.rm = TRUE)
)
# fitted probability + 신뢰구간
predicted <- predict(model_logit, newdata = new_data, type = "link", se.fit = TRUE)
new_data$prob <- plogis(predicted$fit)
new_data$lower <- plogis(predicted$fit - 1.96 * predicted$se.fit)
new_data$upper <- plogis(predicted$fit + 1.96 * predicted$se.fit)
# ggplot으로 시각화
ggplot(new_data, aes(x = stress, y = prob)) +
geom_line(color = "darkred", linewidth = 1.2) +
geom_ribbon(aes(ymin = lower, ymax = upper), fill = "pink", alpha = 0.3) +
labs(
title = "Stress 점수에 따른 주거불안층 예측 확률",
x = "Stress 점수",
y = "주거불안층 예측 확률"
) +
theme_minimal()
이 그래프는 로지스틱 회귀분석 결과를 바탕으로, 스트레스 점수가 높아질 때 개인이 주거불안층(unsecure_bin)에 속할 확률이 어떻게 변하는지를 시각적으로 보여준다. predict( ) 함수를 활용하여 스트레스 점수를 1부터 5까지의 범위로 변화시키며 예상 확률과 그 신뢰구간을 계산하고, 이를 선형 곡선과 함께 시각화하였다. 그래프의 곡선은 스트레스 점수가 높을수록 주거불안층에 속할 확률이 점차 증가하는 추세를 직관적으로 나타내며, 다른 변수들은 평균값으로 고정한 상태에서 스트레스 변수 하나만의 영향을 강조해 해석이 명확하도록 설계되었다. 이러한 시각적 구성은 스트레스 관리가 주거 안정성과 밀접하게 연결되어 있음을 독자가 직관적으로 이해할 수 있도록 돕는 데 목적이 있다.
선형 추정 곡선은 강렬한 붉은 계열(Dark Red) 색상을 사용하여 스트레스라는 경고 신호의 의미를 시각적으로 부각시켰고, 곡선을 둘러싼 신뢰구간은 같은 계열의 연한 핑크색으로 표현해 곡선을 방해하지 않으면서도 예측 불확실성을 명확히 전달하도록 하였다.
본 연구는 한국복지패널조사를 활용하여 한국인의 주거불안이 정신건강과 삶의 만족도에 미치는 영향을 실증적으로 분석하고, 이를 시각적으로 제시하였다. 분석과 그래프를 종합한 결과는 다음과 같다.
첫째, 평균 주거 만족도는 약 3.76점으로 대체로 만족 수준에 속하나, 전체 응답자 중 하위 15%에 해당하는 ’주거불안층’이 존재함을 확인하였다. 히스토그램을 통해 주거 만족도가 4점에 가장 집중되어 있고, 낮은 점수 응답은 소수이지만 존재하여 취약계층의 주거 불안 실태를 드러냈다.
둘째, 소득과 주거 만족도의 관계를 산점도와 선형 추세선으로 시각화한 결과, 소득이 높아질수록 주거 만족도는 다소 증가하는 경향을 보였으나, 관계성은 약했다. 회귀분석에서도 소득과 주거 만족도 간의 유의미한 직접 영향은 발견되지 않았다. 이는 단일 경제 변수로는 주거 만족도를 충분히 설명하기 어렵다는 점을 시사한다.
셋째, 우울감과 스트레스는 0.34의 양의 상관관계를 보여, 스트레스가 높을수록 우울감이 증가하는 경향이 있었다. 특히 주거 만족도와 우울감의 산점도를 보면, 추세선의 기울기가 거의 없는 형태로 나타나 두 변수 간 직접적인 관계는 약하다는 것을 확인하였다. 대신 소득과 고용 상태는 우울 점수를 낮추는 데 유의미한 변수로 나타나 경제적 안정성이 정신건강에 영향을 미침을 뒷받침한다.
넷째, 로지스틱 회귀분석과 주거불안층 예측 확률 그래프를 통해, 스트레스가 높아질수록 주거불안층에 속할 확률이 통계적으로 유의미하게 증가함을 확인하였다. 소득과 우울 점수는 주거불안층 여부를 직접적으로 설명하지 못했으나, 스트레스만은 강력한 예측 변수로 작용하였다. 이는 단순히 소득을 올리거나 고용을 안정시킨다고 해서 주거불안을 완전히 해소할 수 없으며, 정신적 안정 지원이 반드시 병행되어야 함을 시사한다.
다섯째, 고용 상태별 소득 박스플롯과 가구원 수별 주거 만족도 막대그래프를 통해, 고용 안정성이 높을수록 소득이 높고, 가구원 수는 주거 만족도에 큰 영향을 미치지 않는다는 점을 시각적으로 확인하였다.
종합하면, 본 연구는 전세사기와 같은 주거불안 문제가 단순한 경제 문제를 넘어 정신건강 문제로 연결되며, 특히 스트레스 수준과 주거불안은 밀접한 관련이 있음을 실증 데이터로 제시하였다. 이는 한국의 주거 복지 정책이 단기적인 대출 규제 완화나 공급 확대만으로는 충분하지 않으며, 심리·사회적 안정망과 정신건강 관리 정책을 포함한 다층적 대책이 필요함을 강조한다.
따라서 정부와 정책 입안자들은 주거불안층의 실질적 해소와 함께, 정신건강 지원, 스트레스 관리 프로그램, 피해자 상담 서비스 등을 포괄하는 종합적 주거 복지 모델을 설계해야 할 것이다. 이는 국민 삶의 질 향상과 사회적 비용 감소로 이어질 수 있을 것이다.