1. 연구 목적 소개

본 연구의 목적은 한국복지패널데이터를 활용하여 소득과 가족관계 간의 관계를 분석하는 것이다. 구체적으로 가처분소득을 기반으로 한 가구의 경제적 상태가 가족관계 만족도에 어떠한 영향을 미치는지를 탐색한다. 현대 사회에서과소득 수준은 개인의 삶의 질뿐 아니라 가족 간 관계에도 큰 영향을 끼친다. 이에 소득 수준과 가족 관계 만족도의 상관관계를 살펴봄으로써 복지정책 수립 및 사회적 안정성 향상에 중요한 시사점을 제공할 수 있다.

  1. 패키지 설치
install.packages("haven")       # .sav 파일 불러오기
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
install.packages("tidyverse")   # 데이터 조작 및 시각화
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
install.packages("ggplot2")   # 기술통계
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
install.packages("psych")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
library(haven)       # .sav 파일 불러오기
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.3.0
## ✔ 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(psych)       # 기술통계
## 
## Attaching package: 'psych'
## 
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
  1. 데이터 설명

3-1. 파일 불러오기

데이터는 한국복지패널(KOWEPS)의 2024년도 최신 데이터를 활용하였다. 주요 파일은 다음과 같다:

•   koweps_c19_2024_beta1.sav 
•   koweps_h19_2024_beta1.sav 
•   koweps_hpc19_2024_beta1.sav
•   koweps_p19_2024_beta1.sav 
# 가구코어파일
c_file <- read_sav("koweps_c19_2024_beta1.sav")

# 가구파일
h_file <- read_sav("koweps_h19_2024_beta1.sav")

# 가구통합파일
hpc_file <- read_sav("koweps_hpc19_2024_beta1.sav")

# 개인파일
p_file <- read_sav("koweps_p19_2024_beta1.sav")

3-2. 주요 변수 요약

이번 분석에서 사용할 주요 변수는 다음과 같다: • 소득 관련 변수: • h19_din: 가처분소득 • h19_cin: 경상소득

•   가족관계 만족도 변수:
•   p1903_8: 가족관계 만족도

데이터의 전반적인 특성과 품질을 파악하기 위해 가구파일과 개인파일에서 분석에 필요한 변수들만 추출하여 데이터 크기를 줄이고, summary() 함수를 사용해 각 변수의 기본 통계량과 결측치를 하인하다.

# 가구파일에서 필요한 변수만 추출
h_data <- h_file %>%
  select(h19_din, h19_cin)

# 개인파일에서 필요한 변수만 추출
p_data <- p_file %>%
  select(p1903_8)

summary(h_data)
##     h19_din          h19_cin      
##  Min.   :-24161   Min.   :-22937  
##  1st Qu.:  1688   1st Qu.:  1724  
##  Median :  3394   Median :  3604  
##  Mean   :  4616   Mean   :  5076  
##  3rd Qu.:  6429   3rd Qu.:  7054  
##  Max.   : 64322   Max.   : 66314
summary(p_data)
##     p1903_8     
##  Min.   :1.000  
##  1st Qu.:4.000  
##  Median :4.000  
##  Mean   :3.911  
##  3rd Qu.:4.000  
##  Max.   :9.000  
##  NA's   :842

가구파일(h_data)과 개인파일(p_data)에서 추출한 변수들의 이름을 분석하기 쉽도록 영어로 변경하는 작업을 수행하다. h_data에서는 가처분소득과 경상소득 변수명을 각각 disposable_income과 regular_income으로 바꾸고, p_data에서는 가족관계 만족도와 가족생활 만족도, 배우자 관계 만족도, 자녀 관계 만족도, 형제자매 관계 만족도 변수명을 각각 이해하기 쉬운 영어 이름으로 변경한 뒤, 변경된 데이터프레임을 출력한다.

h_data1 <- h_data %>%
  rename(
    disposable_income = h19_din,
    regular_income = h19_cin)

p_data1 <- p_data %>%
  rename(family_rel_satisfaction = p1903_8)
h_data1
## # A tibble: 7,499 × 2
##    disposable_income regular_income
##                <dbl>          <dbl>
##  1             1354            1558
##  2             2874.           2947
##  3             2519            2531
##  4             6204            6468
##  5              934.            935
##  6             2729.           2737
##  7             2719            2731
##  8              941             941
##  9             8755            9295
## 10             3665            4037
## # ℹ 7,489 more rows
p_data1
## # A tibble: 13,557 × 1
##    family_rel_satisfaction
##                      <dbl>
##  1                       3
##  2                       4
##  3                       3
##  4                       4
##  5                       1
##  6                      NA
##  7                      NA
##  8                       4
##  9                       2
## 10                       4
## # ℹ 13,547 more rows

데이터 결합

data <- bind_rows(h_data1, p_data1)
data
## # A tibble: 21,056 × 3
##    disposable_income regular_income family_rel_satisfaction
##                <dbl>          <dbl>                   <dbl>
##  1             1354            1558                      NA
##  2             2874.           2947                      NA
##  3             2519            2531                      NA
##  4             6204            6468                      NA
##  5              934.            935                      NA
##  6             2729.           2737                      NA
##  7             2719            2731                      NA
##  8              941             941                      NA
##  9             8755            9295                      NA
## 10             3665            4037                      NA
## # ℹ 21,046 more rows

결측치가 있는 행 제거

data <- data %>% drop_na()

기술통계 확인

summary(data)
##  disposable_income regular_income family_rel_satisfaction
##  Min.   : NA       Min.   : NA    Min.   : NA            
##  1st Qu.: NA       1st Qu.: NA    1st Qu.: NA            
##  Median : NA       Median : NA    Median : NA            
##  Mean   :NaN       Mean   :NaN    Mean   :NaN            
##  3rd Qu.: NA       3rd Qu.: NA    3rd Qu.: NA            
##  Max.   : NA       Max.   : NA    Max.   : NA
describe(data)
## Converted non-numeric matrix input to numeric.  Are you sure you wanted to do this. Please check your data
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
##                          vars n mean sd median trimmed mad min  max range skew
## disposable_income*          1 0  NaN NA     NA     NaN  NA Inf -Inf  -Inf   NA
## regular_income*             2 0  NaN NA     NA     NaN  NA Inf -Inf  -Inf   NA
## family_rel_satisfaction*    3 0  NaN NA     NA     NaN  NA Inf -Inf  -Inf   NA
##                          kurtosis se
## disposable_income*             NA NA
## regular_income*                NA NA
## family_rel_satisfaction*       NA NA
  1. 데이터 분석 및 시각화

4-1. 데이터 분석

가처분소득(disposable_income)을 기준으로 소득 수준을 분류하기 위해 작성되었다. 구체적으로, 가처분소득이펴평균인 4,616 이하인 경우 “low”, 그보다 높은 경우 “high”로 구분하여 disposable_income_sum이라는 새로운 범주형 변수를 생성하였다. 소득 수준에 따른 집단 간 차이를 비교·분석하기 위해 소득 집단을 이분화하는 것이다. 이후 table() 함수를 사용하여 각 소득 그룹의 관측치 개수를 확인하여 데이터 분포를 점검하였다.

h_data1<- h_data1 %>%
  mutate(disposable_income_sum = ifelse(disposable_income <= 4616, "low","high"))

# 데이터 획인
table(h_data1$disposable_income_sum)
## 
## high  low 
## 2846 4653

가족관계 만족도(family_rel_satisfaction) 변수를 이용하여 만족도를 두 그룹으로 분류하는 작업을 수행한다. 구체적으로, 가족관계 만족도 값이 1점 또는 2점인 경우 “low”로, 그 외의 경우 “high”로 분류하여 family_rel_satisfaction_sum이라는 새로운 범주형 변수를 생성하였다. 이 작업의 목적은 낮은 만족도와 높은 만족도로 그룹을 나누어, 이후 분석에서 만족도 수준에 따른 차이를 비교·분석할 수 있도록 데이터를 준비하는 것이다.

p_data1 <- p_data1 %>%
  mutate(family_rel_satisfaction_sum = ifelse((family_rel_satisfaction == 1 | family_rel_satisfaction == 2), "low","high"))
# 데이터 획인
table(p_data1$family_rel_satisfaction_sum)
## 
##  high   low 
## 12284   431
p_data1
## # A tibble: 13,557 × 2
##    family_rel_satisfaction family_rel_satisfaction_sum
##                      <dbl> <chr>                      
##  1                       3 high                       
##  2                       4 high                       
##  3                       3 high                       
##  4                       4 high                       
##  5                       1 low                        
##  6                      NA <NA>                       
##  7                      NA <NA>                       
##  8                       4 high                       
##  9                       2 low                        
## 10                       4 high                       
## # ℹ 13,547 more rows

전체 표본에서 소득 수준별 인구 분포를 파악하고, 이후 시각화 및 비교 분석을 위한 기초 통계 정보를 생성하는 것을 목적으로 가처분소득 수준(disposable_income_sum)에 따른 각 그룹의 빈도수와 비율을 산출하다.

# % 산출
h_data_pct <- h_data1 %>% 
  group_by(disposable_income_sum) %>% 
  summarise(n = n()) %>% 
  mutate(pct = round(n/7499*100, 1)) %>% 
  arrange(desc(pct))

h_data_pct
## # A tibble: 2 × 3
##   disposable_income_sum     n   pct
##   <chr>                 <int> <dbl>
## 1 low                    4653    62
## 2 high                   2846    38

4-2. 시각화

가처분소득 수준별 비율을 파이 차트로 시각화한다. 소득 수준(disposable_income_sum)을 기준으로 각 그룹의 비율(pct)을 표시하고, 색상과 레이블을 추가하여 소득 분포를 직관적으로 보여준다. 이를 통해 고소득과 저소득 집단의 비율 차이를 쉽게 파악할 수 있다.

ggplot(data = h_data_pct, aes(x = '', y = pct, fill = disposable_income_sum)) +
  geom_bar(stat = 'identity', color = "white") +
  geom_text(aes(label = paste0(round(pct, 1), "%")),
            position = position_stack(vjust = 0.5),
            size = 5) +
  scale_fill_discrete(limits = c("high","low" )) +
  scale_fill_manual(values = c("high" = "lightcyan2", 
                               "low"  = "skyblue")) +
  theme_void() +
  coord_polar('y', start = 0) +
  labs(fill = "가처분소득", 
       title = "소득")
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.

다음에 가족관계 만족도 수준별 응답자 수를 집계하고, 이를 막대그래프로 시각화한다. group_by()와 summarise()를 통해 만족도 수준별 응답자 수(family_rel_satisfaction_sum_n)를 계산하고, geom_col()을 사용해 막대그래프를 작성하였다. 그래프에는 막대 위에 응답자 수를 표시하여 보다 쉽게 비교할 수 있도록 하였다. 목적은 가족관계 만족도가 ’low’와 ’high’로 어떻게 분포되어 있는지를 시각적으로 확인하는 것이다.

p_data1
## # A tibble: 13,557 × 2
##    family_rel_satisfaction family_rel_satisfaction_sum
##                      <dbl> <chr>                      
##  1                       3 high                       
##  2                       4 high                       
##  3                       3 high                       
##  4                       4 high                       
##  5                       1 low                        
##  6                      NA <NA>                       
##  7                      NA <NA>                       
##  8                       4 high                       
##  9                       2 low                        
## 10                       4 high                       
## # ℹ 13,547 more rows
p_data2 <- p_data1 %>% 
  group_by(family_rel_satisfaction_sum) %>% 
           summarise(family_rel_satisfaction_sum_n = n())

ggplot(data = p_data2, aes(x = family_rel_satisfaction_sum, y = family_rel_satisfaction_sum_n, fill = family_rel_satisfaction_sum)) +
  geom_col() +
  labs(x = "만족도", 
       y = "사람", fill = "만족도", 
       title = "가족관계 만족도") + 
  geom_text(aes(label = family_rel_satisfaction_sum_n), vjust = 0.1)

만족도 그룹별 분포를 파악하여 전체 중에서 각 만족도 수준의 비율을 확인하기 위해 p_data1 데이터에서 가족관계 만족도 그룹(family_rel_satisfaction_sum)별 인원 수와 비율을 계산하고 정리한다.

# % 산출
p_data_pct <- p_data1 %>% 
  group_by(family_rel_satisfaction_sum) %>% 
  summarise(n = n()) %>% 
  mutate(pct = round(n/13557*100, 1)) %>% 
  arrange(desc(pct))

p_data_pct
## # A tibble: 3 × 3
##   family_rel_satisfaction_sum     n   pct
##   <chr>                       <int> <dbl>
## 1 high                        12284  90.6
## 2 <NA>                          842   6.2
## 3 low                           431   3.2

가처분소득 그룹과 가족관계 만족도 그룹 간의 관계를 분석하기 위해 두 데이터를 ID를 기준으로 병합한 후, 교차 빈도와 비율을 계산하여 히트맵으로 시각화한다. 이를 통해 소득 수준에 따른 가족관계 만족도의 분포를 한눈에 파악할 수 있다.

library(tidyverse)

h_data1$id <- 1:nrow(h_data1)
p_data1$id <- 1:nrow(p_data1)
merged_data <- inner_join(h_data1, p_data1, by = "id")

# 교차표 생성
heatmap_data <- merged_data %>%
  group_by(disposable_income_sum, family_rel_satisfaction_sum) %>%
  summarise(n = n()) %>%
  mutate(pct = round(n / sum(n) * 100, 1))
## `summarise()` has grouped output by 'disposable_income_sum'. You can override
## using the `.groups` argument.
# 히트맵 그리기
ggplot(heatmap_data, aes(x = disposable_income_sum, y = family_rel_satisfaction_sum, fill = pct)) +
  geom_tile(color = "white") +
  geom_text(aes(label = paste0(pct, "%")), color = "black", size = 5) +
  scale_fill_gradient(low = "skyblue", high = "lightcyan2") +
  labs(title = "소득 그룹과 가족관계 만족도 히트맵",
       x = "가처분소득 그룹",
       y = "가족관계 만족도 그룹",
       fill = "%") +
  theme_minimal()

그위 그래프와 내용은 비슷한데 소득 그룹에 따른 가족관계 만족도의 분포 차이를 확인하기 위해 바이올린 플롯으로 시각화한다.

library(tidyverse)

# 먼저 h_data1 과 p_data1 을 병합해야 합니다 (id 붙이기)
h_data1$id <- 1:nrow(h_data1)
p_data1$id <- 1:nrow(p_data1)
merged_data <- inner_join(h_data1, p_data1, by = "id")

# 바이올린 플롯 그리기
ggplot(merged_data, aes(x = disposable_income_sum, y = family_rel_satisfaction, fill = disposable_income_sum)) +
  geom_violin(trim = FALSE, color = "black") +
  scale_fill_manual(values = c("high" = "lightcyan2", "low" = "skyblue")) +
  labs(title = "소득 그룹별 가족관계 만족도 분포 (바이올린 플롯)",
       x = "가처분소득 그룹",
       y = "가족관계 만족도") +
  theme_minimal()
## Warning: Removed 462 rows containing non-finite outside the scale range
## (`stat_ydensity()`).

  1. 결론

본 연구에서는 가처분소득과 가족관계 만족도 간의 관계를 분석하였다. 분석 결과, 소득이 높은 그룹이 전반적으로 가족관계 만족도가 더 높은 경향을 보였으며, 소득 수준에 따라 가족관계 만족도의 분포와 차이가 분명히 나타났다. 이러한 결과는 경제적 여건이 가족관계의 질에 긍정적인 영향을 미칠 수 있음을 시사한다.

가족의 만족도 향상을 위해서는 단순히 소득 증대뿐만 아니라, 경제적 안정성을 높일 수 있는 복지 정책과 가족 지원 프로그램이 필요하다. 특히 저소득층 가구에 대한 맞춤형 지원을 강화하고, 가족관계 스트레스 완화를 위한 상담 및 교육 서비스를 확대하는 것이 중요하다. 이를 통해 경제적 불평등이 가족관계 만족도의 격차로 이어지는 문제를 완화하고, 사회 전반의 가족 행복도를 증진할 수 있을 것이다.