연구 목적 및 배경 설명

본 연구는 한국복지패널 18차 데이터를 활용하여 성별, 연령대, 지역, 장애 여부(종류 및 등급 포함)에 따라 소득과 인구 분포의 차이를 분석하고자 한다. 이를 통해 장애인의 경제적 특성과 지역별 고령 인구 비율 등을 파악하고, 복지 정책 수립에 기여하는 것을 목표로 한다.

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

장애인의 경제적 상황과 비장애인과의 격차를 분석하기 위해, 전체 데이터를 장애 여부에 따라 구분하여 두 집단 간의 소득 분포, 연령대, 지역별 특성을 비교할 수 있도록 구성하였다. 사용된 변수는 개인의 성별, 연령, 월평균 소득, 거주 지역, 장애 여부, 장애 종류, 장애 등급 등의 핵심 변수로 구성되어 있으며, 해당 데이터를 바탕으로 다양한 시각화 기법(막대그래프, 선그래프, 파이차트)을 통해 실태를 직관적으로 파악할 수 있도록 분석을 진행하였다.

library(foreign)
library(dplyr)               
library(ggplot2)
library(readxl)
raw_welfare <- read.spss(file = "Koweps_hpda18_2023_beta2.sav",
                         to.data.frame = T)

welfare <- raw_welfare

데이터 분석에 앞서 head() 함수를 활용하여 데이터 일부 구조와 변수들의 분포 및 특성을 파악하였다.

head(welfare[, 1:10], 10) 
##    h18_id h18_ind h18_sn h18_merkey h_new h_new1 h18_cobf   p18_wsc   p18_wsl
## 1       2       1      1      20101     0      0       NA 0.2561823 0.2594646
## 2       3       1      1      30101     0      0       NA 0.4807533 0.3978644
## 3       4       1      1      40101     0      0       NA 0.2326184 0.2200942
## 4       6       1      1      60101     0      0       NA 0.5915964 0.5247572
## 5       6       1      1      60101     0      0       NA 0.9404808 0.8587302
## 6       6       1      1      60101     0      0       NA 1.0298206 2.7789598
## 7       6       1      1      60101     0      0       NA 0.1800806 0.1703850
## 8       6       1      1      60101     0      0       NA 0.2261069 0.2263376
## 9       8       1      1      80101     0      0       NA 0.1054185 0.1045237
## 10     10       1      1     100101     0      0       NA 0.7370947 0.6824844
##      p18_wgc
## 1  1353.0650
## 2  2539.1700
## 3  1228.6086
## 4  3124.6045
## 5  4967.2894
## 6  5439.1506
## 7   951.1225
## 8  1194.2171
## 9   556.7833
## 10 3893.0753

데이터 정제 및 가공 과정

연구에 맞는 데이터를 선택합니다. 데이터셋의 가독성과 분석 편의를 위해 원래 변수명을 직관적인 이름으로 변경했다. 변수명 변경 및 필요한 파생변수 생성했습니다.

welfare <- rename(welfare,
                  gender = h18_g3,         
                  birth = h18_g4,  
                  income = h18_pers_income1,
                  code_region = h18_reg7,
                  disability_type = h18_g8,
                  disability_grade = h18_g9,
                  elderly_household = h1801_13aq1)

데이터 분석을 위해 장애 유무(disabled), 나이(age), 연령대(ageg) 변수를 새롭게 생성하였으며, 연령대별 장애 유형 분포를 파악하기 위해 장애 유형이 존재하는 데이터를 대상으로 빈도수를 집계하였다.

welfare <- welfare %>%
  mutate(disabled = ifelse(disability_type == 5, 0, 1))

welfare <- welfare %>%
  mutate(
    age = 2023 - birth + 1,
    ageg = case_when(
      age < 30 ~ "20대 이하",
      age < 40 ~ "30대",
      age < 50 ~ "40대",
      age < 60 ~ "50대",
      age < 70 ~ "60대",
      TRUE ~ "70대 이상"
    )
  )

disability_age <- welfare %>%
  filter(!is.na(disability_type)) %>%
  group_by(ageg, disability_type) %>%
  summarise(count = n(), .groups = "drop")

데이터 분석

gender 변수의 각 값에 대해 빈도 수(도수 분포표)를 보여준다.

class(welfare$gender)
## [1] "numeric"
table(welfare$gender)
## 
##    1    2 
## 7144 8787

1-1 여성, 남성 비율 성별 변수의 이상값(9)을 결측 처리한 후, 값이 1과 2로 구성된 숫자형 변수를 ’male’과 ’female’이라는 문자형 변수로 변환-> 성별 분포를 시각적으로 확인하고 분석에 용이하도록 전처리하였였다.

welfare$gender <- ifelse(welfare$gender == 9, NA, welfare$gender)
table(is.na(welfare$gender))
## 
## FALSE 
## 15931
welfare$gender <- ifelse(welfare$gender == 1, "male", "female")
table(welfare$gender)
## 
## female   male 
##   8787   7144
qplot(welfare$gender)
## 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.

1-2. 평균 소득 소득 변수의 이상값(0, 9999)을 결측 처리한 뒤, 성별에 따른 평균 소득을 계산하여 막대그래프로 시각화하여 남성과 여성 간의 평균 소득 차이를 확인할 수 있었다.

class(welfare$income)
## [1] "numeric"
summary(welfare$income)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##       0    2956    4020    4796    6035   61110   13034
qplot(welfare$income)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 13034 rows containing non-finite outside the scale range
## (`stat_bin()`).

welfare$income <- ifelse(welfare$income %in% c(0, 9999), NA, welfare$income)
table(is.na(welfare$income))
## 
## FALSE  TRUE 
##  2882 13049
gender_income <- welfare %>% 
  filter(!is.na(income)) %>% 
  group_by(gender) %>% 
  summarise(mean_income = mean(income))
gender_income
## # A tibble: 2 × 2
##   gender mean_income
##   <chr>        <dbl>
## 1 female       3747.
## 2 male         5523.
ggplot(data = gender_income, aes(x = gender, y = mean_income)) + geom_col()

2.성별 & 장애 여부에 따른 월소득 평균

income_by_disability <- welfare %>%
  group_by(disabled) %>%
  summarise(mean_income = mean(income, na.rm = TRUE),
            sd_income = sd(income, na.rm = TRUE),
            count = n())
print(income_by_disability)
## # A tibble: 2 × 4
##   disabled mean_income sd_income count
##      <dbl>       <dbl>     <dbl> <int>
## 1        0       4626        NA      7
## 2        1       4821.     3038. 15924

2-1.장애 여부별 월소득 장애인과 비장애인의 평균 소득 차이를 시각적으로 비교하기 위해 막대그래프를 사용하였다.

ggplot(income_by_disability, aes(x = factor(disabled, labels = c("비장애인", "장애인")), 
                                  y = mean_income, fill = factor(disabled))) +
  geom_bar(stat = "identity", width = 0.6) +
  labs(title = "장애 유무에 따른 평균 소득",
       x = "장애 유무", y = "평균 소득 (원)") +
  scale_fill_manual(values = c("#4E79A7", "#F28E2B")) +
  theme_minimal()

3.연령대 비율 연령대와 성별에 따른 인원 수와 각 성별이 차지하는 비율을 계산하여, 전체 인구 분포의 구조적 특성을 파악하고 시각화를 위한 기반 데이터를 생성하였다.

gender_ageg_dist <- welfare %>%
  group_by(ageg, gender) %>%
  summarise(count = n(), .groups = "drop") %>%
  group_by(ageg) %>%
  mutate(percent = round(count / sum(count) * 100, 2))
print(gender_ageg_dist)
## # A tibble: 12 × 4
## # Groups:   ageg [6]
##    ageg      gender count percent
##    <chr>     <chr>  <int>   <dbl>
##  1 20대 이하 female  1594    50.4
##  2 20대 이하 male    1567    49.6
##  3 30대      female   627    49.5
##  4 30대      male     639    50.5
##  5 40대      female   863    50.2
##  6 40대      male     856    49.8
##  7 50대      female   979    49.4
##  8 50대      male    1003    50.6
##  9 60대      female  1361    55.9
## 10 60대      male    1074    44.1
## 11 70대 이상 female  3363    62.6
## 12 70대 이상 male    2005    37.4
  1. 지역 코드 목록 만들기 지역 코드를 사람이 이해하기 쉬운 지역명으로 변환하기 위해 매핑 테이블(list_region)을 생성하였다.
class(welfare$code_region)
## [1] "numeric"
table(welfare$code_region)
## 
##    1    2    3    4    5    6    7 
## 1849 3524 2743 1895 1688 1357 2875
list_region <- data.frame(code_region = c(1:7),
                          region = c("서울",
                                     "수도권(인천/경기)",
                                     "부산/경남/울산",
                                     "대구/경북",
                                     "대전/충남",
                                     "강원/충북",
                                     "광주/전남/전북/제주도"))
welfare <- left_join(welfare, list_region, by = "code_region")

welfare %>% 
  select(code_region, region) %>% 
  head
##   code_region    region
## 1           1      서울
## 2           4 대구/경북
## 3           1      서울
## 4           1      서울
## 5           1      서울
## 6           1      서울

4-1. 지역별 연령대 비율표 지역과 연령대별 인원 수를 집계하고, 각 지역 내 연령대별 비율을 계산하였다.

region_ageg <- welfare %>% 
  group_by(region,ageg) %>% 
  summarise(n = n()) %>% 
  mutate(tot_group = sum(n),
         pct = round(n/tot_group*100, 2))
## `summarise()` has grouped output by 'region'. You can override using the
## `.groups` argument.
head(region_ageg)
## # A tibble: 6 × 5
## # Groups:   region [1]
##   region    ageg          n tot_group   pct
##   <chr>     <chr>     <int>     <int> <dbl>
## 1 강원/충북 20대 이하   220      1357 16.2 
## 2 강원/충북 30대         95      1357  7   
## 3 강원/충북 40대        113      1357  8.33
## 4 강원/충북 50대        156      1357 11.5 
## 5 강원/충북 60대        242      1357 17.8 
## 6 강원/충북 70대 이상   531      1357 39.1

4-2.지역별연령대 비율 지역별 연령대 분포를 시각화하여 인구 구성의 지역적 특성을 분석하였다.

ggplot(data = region_ageg, aes(x = region, y = pct, fill = ageg)) +
  geom_col() +
  coord_flip()

4-3.지역별 노인 비율 각 지역별 60대 이상 고령자의 비율을 계산하여, 이를 원그래프로 시각화하였다. 이를 통해 지역별 고령 인구 분포의 차이를 직관적으로 파악할 수 있었다.

elderly_region <- welfare %>%
  mutate(is_elderly = ifelse(age >= 60, 1, 0)) %>%
  group_by(region) %>%
  summarise(
    elderly_ratio = mean(is_elderly)
  )

elderly_region %>%
  mutate(region = factor(region, levels = region[order(-elderly_ratio)])) %>%
  ggplot(aes(x = "", y = elderly_ratio, fill = region)) +
  geom_col(width = 1) +
  coord_polar(theta = "y") +
  labs(title = "지역별 60대 이상 비율") +
  theme_void()

  1. 연령대별 장애 유형 분포 각 연령대 내 장애 종류별 비율을 계산하여, 장애 유형 분포의 연령별 특징을 분석하기 위한 데이터 전처리를 수행하였다.
disability_age_filtered <- welfare %>%
  filter(disabled == 1, !is.na(ageg), !is.na(disability_type))

count_data <- welfare %>%
  filter(disabled == 1, !is.na(ageg), !is.na(disability_type)) %>%
  group_by(ageg, disability_type) %>%
  summarise(count = n(), .groups = "drop")

prop_data <- count_data %>%
  group_by(ageg) %>%
  mutate(prop = count / sum(count)) %>%
  ungroup()

5-1.연령대별 장애 유형인원수 연령대별로 각 장애 유형의 인원 수 변화를 시각화하기 위해 선 그래프를 생성하였다.

disability_labels <- c("시각장애", "청각장애", "지체장애", "정신장애")
welfare <- welfare %>%
  mutate(disability_name = factor(disability_type,
                                  levels = c(1, 2, 3, 4),
                                  labels = c("시각장애", "청각장애", "지체장애", "정신장애")))

count_data <- welfare %>%
  filter(!is.na(disability_name), !is.na(ageg)) %>%
  group_by(ageg, disability_name) %>%
  summarise(count = n(), .groups = "drop")

ggplot(count_data, aes(x = ageg, y = count, group = disability_name, color = disability_name)) +
  geom_line(size = 1) +
  geom_point(size = 3) +
  labs(title = "연령대별 장애 유형 인원수",
       x = "연령대", y = "인원수", color = "장애 유형") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

total_data <- welfare %>%
  filter(!is.na(ageg)) %>%
  group_by(ageg) %>%
  summarise(total = n(), .groups = "drop")

prop_data <- count_data %>%
  left_join(total_data, by = "ageg") %>%
  mutate(prop = count / total) %>%
  filter(!is.na(disability_name), !is.na(ageg))

ggplot(prop_data, aes(x = ageg, y = prop, group = disability_name, color = disability_name)) +
  geom_line(size = 1) +
  geom_point(size = 3) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  labs(title = "연령대별 장애 유형 분포 (비율)",
       x = "연령대", y = "비율", color = "장애 유형") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

#결론

-성별 및 연령대 분포 성별은 남녀 비율이 균형을 이루고 있으며, 연령대는 20대 이하부터 70대 이상까지 다양하게 분포해 있다. 지역별로도 연령대별 인구 비율에 차이가 있어, 일부 지역은 고령층 비중이 높았다.

-장애 유무와 소득 차이 장애인은 비장애인에 비해 평균 소득이 낮은 경향이 나타났다. 이는 장애인의 경제적 어려움과 복지 지원 필요성을 시사한다.

-지역별 고령자 비율 지역별 60대 이상 고령자 비율을 파이 차트로 시각화한 결과, 일부 지역에서 고령층 인구 비율이 높아 고령화 문제가 지역별로 차별적으로 나타남을 알 수 있었다.

-연령대별 장애 유형 분포 장애 유형별로 연령대에 따른 분포가 다르게 나타났다. 시각장애와 지체장애는 주로 중장년 및 고령층에서 많았고, 청각장애도 고령층에서 증가하는 반면, 정신장애는 상대적으로 젊은 층에서 더 많이 분포하였다. 이는 장애 유형별 맞춤형 복지 정책 개발의 필요성을 강조한다.