본 연구는 한국복지패널 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
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()
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대 이상 고령자 비율을 파이 차트로 시각화한 결과, 일부 지역에서 고령층 인구 비율이 높아 고령화 문제가 지역별로 차별적으로 나타남을 알 수 있었다.
-연령대별 장애 유형 분포 장애 유형별로 연령대에 따른 분포가 다르게 나타났다. 시각장애와 지체장애는 주로 중장년 및 고령층에서 많았고, 청각장애도 고령층에서 증가하는 반면, 정신장애는 상대적으로 젊은 층에서 더 많이 분포하였다. 이는 장애 유형별 맞춤형 복지 정책 개발의 필요성을 강조한다.