What is (are) your main question(s)? 본 보고서는 가구원 수가 한국 가정의 가처분소득에 어떤 영향을 미치는가라는 질문에서 출발합니다.
이를 위해 두 가지 측면에서 연구 질문을 설정하였습니다: 가구원 수가 많을수록, 해당 유형 가구의 평균 가처분소득이 증가하는가? 가구원 수가 많을수록, 1인당 가처분소득은 감소하는가? 가구 규모와 소득 간에 일정한 경향성(예: 선형 관계)이 존재하는가?
이 세 가지 질문은 각각 “소득의 총량 수준(평균)”과 “가구 내 소득 분배 효율성”이라는 두 가지 차원에서 접근하며, 가구 구조와 경제 상황 사이의 관계를 보다 입체적으로 이해하고자 합니다.특히 두 번째 질문은 ’1인당 소득’에 초점을 맞추고 있지만, 본질적으로는 ’소득 분배의 적절성’을 탐구하는 것으로, 이 연구 주제의 핵심에 해당합니다.
What is your story? 본 연구는 2024년 한국복지패널조사(KOWEPS) 데이터를 바탕으로, 가구원 수와 가처분소득 사이의 관계를 분석하였습니다. 특히 소득 총량의 평균 수준과 1인당 소득 분배 효율이라는 두 가지 측면에서 그 영향을 살펴보았습니다.
분석 결과는 다음과 같습니다: 가구원 수가 많을수록, 해당 유형 가구의 평균 가처분소득은 전체적으로 증가하는 경향을 보였습니다. 하지만 동시에, 1인당 가처분소득은 뚜렷한 하락 추세를 나타냈습니다. 이는 가구 규모가 커질수록 가구 전체의 수입은 증가할 수 있으나, 개개인에게 분배되는 실질 자원은 줄어들고 있음을 시사합니다. 이러한 결과는 한국 사회의 주거, 복지, 자녀 교육 비용 등과 같은 구조적 문제와도 밀접한 관련이 있습니다.
What does the final graphic show? 보고서의 마지막 인터랙티브 그래프는 가구원 수와 평균 가처분소득 간의 관계를 시각적으로 보여줍니다. 산점도에 회귀선을 추가하고, 이상값을 제거한 후 다음과 같은 경향이 나타났습니다: 가구원 수가 많아질수록, 해당 유형 가구의 평균 가처분소득은 다소 증가하는 경향을 보였습니다. 본 그래프는 인터랙티브한 방식으로 구현되어, 개별 가구 단위의 데이터 탐색이 가능하며, 회귀선을 통해 전체적인 추세를 쉽게 이해할 수 있도록 설계되었습니다.
이 보고서에서 사용한 데이터는 2024년
한국복지패널조사(KOWEPS)에서 수집된 자료입니다.
한국복지패널조사는 한국보건사회연구원과 서울대학교 사회복지연구소가
공동으로 수행하며,
한국 가구의 소득, 지출, 고용, 복지, 건강, 교육 등 다양한 사회·경제적
요소를 추적하는 국가 대표 패널조사입니다.
2024년 자료는 원래 .sav(SPSS) 형식으로 제공되며, 각 가구 혹은 가구원
1명을 기준으로 한 행(row)으로 구성되어 있습니다.
본 분석에서는 R에서 활용하기 위해 .csv 형식으로 변환하여
사용하였습니다.
전체 데이터는 300개 이상의 변수(columns)로 구성되어 있으며, 변수명은
h19_din, c19_fnum처럼 코드화된 형태로 되어
있어,
별도의 코드북(codebook)을 통해 변수 의미를 확인할 수
있습니다.
이번 분석에서는 다음 두 가지 변수를 중심으로 사용하였습니다:
- c19_fnum: 가구의 가구원 수, 즉 몇 명이 함께 거주하는지를
나타냄
- h19_din: 가구 단위의 연간 가처분소득으로, 세금과 공제를
제외하고 실제로 해당 가구 전체가 사용할 수 있는 연소득을 의미함.
이 변수는 개별 가구원 데이터에 동일하게 기입되어 있으나, 분석의
정확성을 위해 가구 ID 기준으로 중복 제거하여 사용함.
이를 통해 가구 규모에 따른 평균 소득 및 인당 소득을 비교하고,
가구 구조에 따른 경제적 격차를 시각적으로 탐색하고자
하였습니다.
Describe and show how you cleaned and reshaped the data
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ lubridate 1.9.4 ✔ tibble 3.2.1
## ✔ purrr 1.0.4 ✔ tidyr 1.3.1
## ✔ readr 2.1.5
## ── 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(scales)
##
## Attaching package: 'scales'
##
## The following object is masked from 'package:purrr':
##
## discard
##
## The following object is masked from 'package:readr':
##
## col_factor
library(ggplot2)
Describe and show how you analyzed the data
h19_data <- read_sav("koweps_h19_2024_beta1.sav")
hpc19_data <- read_sav("koweps_hpc19_2024_beta1.sav")
c19_data<- read_sav("koweps_c19_2024_beta1.sav")
write_csv(h19_data, "koweps_h19_2024.csv")
write_csv(hpc19_data, "koweps_hpc19_2024.csv")
write_csv(c19_data, "koweps_c19_2024.csv")
library(showtext)
## Loading required package: sysfonts
## Loading required package: showtextdb
font_add("apple", "/System/Library/Fonts/AppleGothic.ttf")
showtext_auto()
Describe and show how you created the first figure. Why did you choose this figure type? 첫 번째 그래프는 서로 다른 가구 규모(가구원 수)에 따라 가구 평균 총 가처분소득이 어떻게 달라지는지를 보여주며, 막대그래프(bar chart) 형태로 시각화하였습니다. 이 그래프 유형은 그룹 간 수치 차이를 비교하는 데 적합하며, 특히 “집단별 평균값 변화”를 표현할 때 효과적입니다.
그래프를 작성하기 위해 먼저 데이터를 필터링하고 hh_size를 기준으로 그룹화하여, 각 그룹에서 mean_income의 평균값을 계산했습니다. 이후 ggplot2::geom_col() 함수를 이용해 가구원 수에 따른 평균 가구소득을 막대그래프로 나타냈습니다. hh_size는 범주형 변수이고 mean_income은 수치형 변수이므로, 이와 같은 일대일 비교 구조에서는 막대그래프가 가장 직관적입니다.
library(dplyr)
# 1. 가족별 평균 또는 총소득 계산
h19_summary <- h19_data %>%
group_by(h19_id) %>%
summarise(mean_income = mean(h19_din, na.rm = TRUE)) # 또는 sum()
# 2. 가족 규모 정보 추출
c19_select <- c19_data %>%
select(h19_id, hh_size = c19_fnum) %>%
distinct(h19_id, .keep_all = TRUE)
# 3. 병합
income_data <- left_join(h19_summary, c19_select, by = "h19_id")
# 4. 시각화용 데이터 생성 및 그래프 출력
library(scales)
fig1_data <- income_data %>%
filter(!is.na(hh_size)) %>%
group_by(hh_size) %>%
summarise(mean_income = mean(mean_income, na.rm = TRUE), .groups = 'drop')
figure1 <- ggplot(fig1_data, aes(x = factor(hh_size), y = mean_income)) +
geom_col(fill = "steelblue") +
labs(x = "가구원 수 (Household Size)",
y = "평균 소득 (Average Income, 천원)",
title = "가구원 수에 따른 평균 가구소득") +
scale_y_continuous(labels = comma)
figure1
막대 색상은 스틸블루(steelblue) 계열을 선택하였는데, 이 색은 주요 데이터를 돋보이게 하면서도 시각적으로 자극적이지 않아, 전문적이고 읽기 쉬운 인상을 줍니다. 글꼴은 AppleGothic을 사용하여 한글과 영문의 시각적 안정성을 확보했습니다.
X축에는 가구원 수(1인, 2인, 3인 등)의 범주를, Y축에는 해당 가구 규모의 평균 소득을 배치하였고, 막대의 너비는 기본값을 사용하며 그래프 높이를 적절히 조정해 막대 간 차이가 쉽게 드러나도록 디자인했습니다. 전체적으로는 단순하면서도 뚜렷한 대비를 통해 가구 규모 증가가 소득 증가와 관련이 있는지를 쉽게 확인할 수 있도록 구성했습니다.
두 번째 그래프는 가구원 수에 따른 1인당 가처분소득의 분포를 보여주는 박스플롯(boxplot)입니다. 이는 서로 다른 가구 규모에서 개인이 얻는 소득의 차이와 변동성을 시각화하기에 매우 적절한 방식입니다.
그래프를 작성하기에 앞서 mutate() 함수를 이용해 per_capita_income 변수를 새로 만들었습니다. 이는 가구의 총소득을 인원 수로 나눈 값으로, 1인당 소득을 의미합니다. 이후 ggplot2::geom_boxplot() 함수를 사용해 각 가구 규모에 따른 1인당 소득의 중앙값, 사분위수 등을 시각화했습니다.
# 1인당 소득 변수 추가
income_data <- income_data %>%
filter(!is.na(hh_size), hh_size > 0) %>%
mutate(per_capita_income = mean_income / hh_size)
# Boxplot 시각화
figure2 <- ggplot(income_data, aes(x = factor(hh_size), y = per_capita_income)) +
geom_boxplot(fill = "lightgreen",outlier.shape = NA) +
labs(
title = "가구원 수에 따른 1인당 평균소득 분포",
x = "가구원 수",
y = "1인당 평균소득(천원)"
) +
theme(text = element_text(family = "apple")) + # 韩文字体设置
scale_y_continuous(labels = comma)
figure2
그래프의 박스 색상은 연녹색(lightgreen)을 사용했는데, 이는 시각적으로 부드럽고 안정적인 인상을 주며, 박스 구조의 계층적 정보(중앙값, IQR 등)를 돋보이게 하는 데 효과적입니다. 글꼴은 AppleGothic을 유지하여 한글 표시의 일관성을 확보했고, 극단값에 의한 시각적 왜곡을 방지하기 위해 outlier.shape = NA 옵션을 사용해 이상값은 표시하지 않았습니다.
X축은 가구원 수(범주형), Y축은 1인당 가처분소득(연속형)으로 설정하여, 각 가구 규모에서 개인이 누리는 경제적 자원의 차이를 명확히 강조하고자 하였습니다.
이 그래프는 가구원 수와 평균 가처분소득 사이의 관계를 탐색하기 위해 작성된 산점도 + 회귀선 시각화입니다. 두 변수 모두 연속형 수치이기 때문에, 산점도를 활용하면 개별 관측값의 분포와 전반적인 경향을 동시에 확인할 수 있습니다.
가독성과 상호작용성을 높이기 위해 plotly 패키지를 사용하여 인터랙티브 그래프로 구현하였고, 사용자가 마우스를 각 점 위에 올리면 해당 가구의 상세 정보를 확인할 수 있습니다.
그래프 작성 전에는 boxplot.stats() 함수를 이용해 이상값(outlier)을 식별 및 제거하였고, 이를 통해 너무 큰 값이나 작은 값이 회귀 결과에 영향을 미치지 않도록 하였습니다. 그 후 선형 회귀모형을 적용하고, 예측값(fitted values)을 추출하여 빨간색 선으로 시각화하였습니다.
# 1. 생성된 데이터에서 1인당 소득 파생
income_data <- income_data %>%
filter(!is.na(hh_size), hh_size > 0) %>%
mutate(per_capita_income = mean_income / hh_size)
# 2. boxplot 통계 기준을 이용해 이상값(outlier) 추출
outliers <- boxplot.stats(income_data$mean_income)$out
# 3. 이상값 제거한 새로운 데이터 생성
income_data_clean <- income_data %>%
filter(!mean_income %in% outliers)
# 4. 회귀선 계산을 위한 예측값(fitted value) 생성
reg_model <- lm(mean_income ~ hh_size, data = income_data_clean)
income_data_clean <- income_data_clean %>%
mutate(predicted_income = fitted(reg_model)) # 예측값 변수 추가
# 5. plotly를 활용한 인터랙티브 그래프 생성
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
plot_ly(data = income_data_clean,
x = ~hh_size,
y = ~mean_income,
type = 'scatter',
mode = 'markers',
marker = list(color = 'steelblue', size = 8, opacity = 0.6),
name = '개별 가구') %>%
add_lines(x = ~hh_size,
y = ~predicted_income,
name = '회귀선',
line = list(color = 'red')) %>%
layout(title = "가구원 수와 평균소득 간의 인터랙티브 관계 (이상값 제거)",
xaxis = list(title = "가구원 수"),
yaxis = list(title = "평균 가처분소득 (천원)"))
## A marker object has been specified, but markers is not in the mode
## Adding markers to the mode...
데이터 점은 파란색, 회귀선은 빨간색으로 설정하여 두 요소 간 시각적 대비를 명확히 하였습니다. 파란색은 중립적이면서도 눈에 잘 띄고, 빨간색은 분석의 핵심인 “추세선”에 주목하도록 유도합니다. 글꼴은 AppleGothic을 사용하여 한글 데이터도 안정적으로 표시되도록 하였고, 점의 크기와 투명도는 중첩 문제를 줄이기 위해 조정하였습니다.
전체적으로 이 그래프는 명확성, 대비, 상호작용성을 강조하여, 독자가 개별 차이와 전체 경향을 동시에 파악할 수 있도록 설계되었습니다.