9-4. 연령대에 따른 월급 차이
1. 데이터 가져오기
library(foreign)
library(dplyr)
##
## 다음의 패키지를 부착합니다: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
library(readxl)
raw_welfare <- read.spss(file = "C:\\Users\\user\\Documents\\20220124\\Koweps_hpc10_2015_beta1.sav",
to.data.frame = T)
## Warning in read.spss(file =
## "C:\\Users\\user\\Documents\\20220124\\Koweps_hpc10_2015_beta1.sav", :
## C:\Users\user\Documents\20220124\Koweps_hpc10_2015_beta1.sav: Compression bias
## (0) is not the usual value of 100
welfare <- raw_welfare
2. 데이터 변수명 변경
welfare <- rename(welfare,
sex = h10_g3,
birth = h10_g4,
marriage = h10_g10,
religion = h10_g11,
income = p1002_8aq1,
code_job = h10_eco9,
code_region = h10_reg7)
3. 변수(age) 생성
welfare$birth <- ifelse(welfare$birth == 9999, NA, welfare$birth)
welfare$age <- 2015 - welfare$birth + 1
4. 파생변수 생성(연령대)
welfare <- welfare %>%
mutate(ageg = ifelse(age < 30, "young",
ifelse(age <= 59, "middle", "old")))
5. 연령대별 월급 평균표 생성
ageg_income <- welfare %>%
filter(!is.na(income)) %>%
group_by(ageg) %>%
summarise(mean_income = mean(income))
ageg_income
## # A tibble: 3 × 2
## ageg mean_income
## <chr> <dbl>
## 1 middle 281.
## 2 old 125.
## 3 young 164.
6. 그래프 생성
ggplot(data = ageg_income, aes(x = ageg, y = mean_income)) + geom_col()

9-5. 연령대 및 성별 월급 차이
1. 변수(sex) 생성
welfare$sex <- ifelse(welfare$sex == 9, NA, welfare$sex)
welfare$sex <- ifelse(welfare$sex == 1, "male", "female")
2. 변수(income) 생성
welfare$income <- ifelse(welfare$income %in% c(0, 9999), NA, welfare$income)
3. 연령대, 성별 월급 평균표 생성
sex_income <- welfare %>%
filter(!is.na(income)) %>%
group_by(ageg, sex) %>%
summarise(mean_income = mean(income))
## `summarise()` has grouped output by 'ageg'. You can override using the
## `.groups` argument.
sex_income
## # A tibble: 6 × 3
## # Groups: ageg [3]
## ageg sex mean_income
## <chr> <chr> <dbl>
## 1 middle female 188.
## 2 middle male 353.
## 3 old female 81.5
## 4 old male 174.
## 5 young female 160.
## 6 young male 171.
4. 그래프 생성
ggplot(data = sex_income, aes(x = ageg, y = mean_income, fill = sex)) +
geom_col() +
scale_x_discrete(limits = c("young", "middle", "old"))

5. 그래프 생성(성별 분리)
ggplot(data = sex_income, aes(x = ageg, y = mean_income, fill = sex)) +
geom_col(position = "dodge") +
scale_x_discrete(limits = c("young", "middle", "old"))

6. 성별,연령별 월급 평균표 생성
sex_age <- welfare %>%
filter(!is.na(income)) %>%
group_by(age, sex) %>%
summarise(mean_income = mean(income))
## `summarise()` has grouped output by 'age'. You can override using the `.groups`
## argument.
head(sex_age)
## # A tibble: 6 × 3
## # Groups: age [3]
## age sex mean_income
## <dbl> <chr> <dbl>
## 1 20 female 147.
## 2 20 male 69
## 3 21 female 107.
## 4 21 male 102.
## 5 22 female 140.
## 6 22 male 118.
7. 그래프 생성
ggplot(data = sex_age, aes(x = age, y = mean_income, col = sex)) + geom_line()

9-6. 직업별 월급 차이
1. 데이터 불러오기
library(readxl)
list_job <- read_excel("C:\\Users\\user\\Documents\\20220124\\Koweps_Codebook.xlsx", col_names = T, sheet = 2)
2. 데이터 확인
head(list_job)
## # A tibble: 6 × 2
## code_job job
## <dbl> <chr>
## 1 111 의회의원 고위공무원 및 공공단체임원
## 2 112 기업고위임원
## 3 120 행정 및 경영지원 관리자
## 4 131 연구 교육 및 법률 관련 관리자
## 5 132 보험 및 금융 관리자
## 6 133 보건 및 사회복지 관련 관리자
3. welfare와 직업명 합치기
welfare <- left_join(welfare, list_job, by = "code_job")
welfare %>%
filter(!is.na(code_job)) %>%
select(code_job, job) %>%
head(10)
## code_job job
## 1 942 경비원 및 검표원
## 2 762 전기공
## 3 530 방문 노점 및 통신 판매 관련 종사자
## 4 999 기타 서비스관련 단순 종사원
## 5 312 경영관련 사무원
## 6 254 문리 기술 및 예능 강사
## 7 510 영업 종사자
## 8 530 방문 노점 및 통신 판매 관련 종사자
## 9 286 스포츠 및 레크레이션 관련 전문가
## 10 521 매장 판매 종사자
4. 직업별로 월급 평균표 생성
job_income <- welfare %>%
filter(!is.na(job) & !is.na(income)) %>%
group_by(job) %>%
summarise(mean_income = mean(income))
head(job_income)
## # A tibble: 6 × 2
## job mean_income
## <chr> <dbl>
## 1 가사 및 육아 도우미 80.2
## 2 간호사 241.
## 3 건설 및 광업 단순 종사원 190.
## 4 건설 및 채굴 기계운전원 358.
## 5 건설 전기 및 생산 관련 관리자 536.
## 6 건설관련 기능 종사자 247.
5. 상위 10개 추출
top10 <- job_income %>%
arrange(desc(mean_income)) %>%
head(10)
top10
## # A tibble: 10 × 2
## job mean_income
## <chr> <dbl>
## 1 금속 재료 공학 기술자 및 시험원 845.
## 2 의료진료 전문가 844.
## 3 의회의원 고위공무원 및 공공단체임원 750
## 4 보험 및 금융 관리자 726.
## 5 제관원 및 판금원 572.
## 6 행정 및 경영지원 관리자 564.
## 7 문화 예술 디자인 및 영상 관련 관리자 557.
## 8 연구 교육 및 법률 관련 관리자 550.
## 9 건설 전기 및 생산 관련 관리자 536.
## 10 석유 및 화학물 가공장치 조작원 532.
6. 그래프 생성(상위 10개)
ggplot(data = top10, aes(x = reorder(job, mean_income), y = mean_income)) +
geom_col() +
coord_flip()

7. 하위 10개 추출
bottom10 <- job_income %>%
arrange(mean_income) %>%
head(10)
bottom10
## # A tibble: 10 × 2
## job mean_income
## <chr> <dbl>
## 1 가사 및 육아 도우미 80.2
## 2 임업관련 종사자 83.3
## 3 기타 서비스관련 단순 종사원 88.2
## 4 청소원 및 환경 미화원 88.8
## 5 약사 및 한약사 89
## 6 작물재배 종사자 92
## 7 농립어업관련 단순 종사원 102.
## 8 의료 복지 관련 서비스 종사자 104.
## 9 음식관련 단순 종사원 108.
## 10 판매관련 단순 종사원 117.
8. 그래프 생성(하위 10개)
ggplot(data = bottom10, aes(x = reorder(job, -mean_income),
y = mean_income)) +
geom_col() +
coord_flip() +
ylim(0, 850)

9-7. 성별 직업 빈도
1. 남성 직업 상위 10개 추출
job_male <- welfare %>%
filter(!is.na(job) & sex == "male") %>%
group_by(job) %>%
summarise(n = n()) %>%
arrange(desc(n)) %>%
head(10)
job_male
## # A tibble: 10 × 2
## job n
## <chr> <int>
## 1 작물재배 종사자 640
## 2 자동차 운전원 251
## 3 경영관련 사무원 213
## 4 영업 종사자 141
## 5 매장 판매 종사자 132
## 6 제조관련 단순 종사원 104
## 7 청소원 및 환경 미화원 97
## 8 건설 및 광업 단순 종사원 95
## 9 경비원 및 검표원 95
## 10 행정 사무원 92
2. 여성 직업 상위 10개 추출
job_female <- welfare %>%
filter(!is.na(job) & sex == "female") %>%
group_by(job) %>%
summarise(n = n()) %>%
arrange(desc(n)) %>%
head(10)
job_female
## # A tibble: 10 × 2
## job n
## <chr> <int>
## 1 작물재배 종사자 680
## 2 청소원 및 환경 미화원 228
## 3 매장 판매 종사자 221
## 4 제조관련 단순 종사원 185
## 5 회계 및 경리 사무원 176
## 6 음식서비스 종사자 149
## 7 주방장 및 조리사 126
## 8 가사 및 육아 도우미 125
## 9 의료 복지 관련 서비스 종사자 121
## 10 음식관련 단순 종사원 104
3. 그래프 생성(남성)
ggplot(data = job_male, aes(x = reorder(job, n), y = n)) +
geom_col() +
coord_flip()

4. 그래프 생성(여성)
ggplot(data = job_female, aes(x = reorder(job, n), y = n)) +
geom_col() +
coord_flip()

9-8. 종교 유무에 따른 이혼율
1. 변수 생성 (종교 유무)
welfare$religion <- ifelse(welfare$religion == 1, "yes", "no")
2. 변수 생성 (이혼 여부)
welfare$group_marriage <- ifelse(welfare$marriage == 1, "marriage",
ifelse(welfare$marriage == 3, "divorce", NA))
3. 종교 유무에 따른 이혼율 표 생성
religion_marriage <- welfare %>%
filter(!is.na(group_marriage)) %>%
group_by(religion, group_marriage) %>%
summarise(n = n()) %>%
mutate(tot_group = sum(n)) %>%
mutate(pct = round(n/tot_group*100, 1))
## `summarise()` has grouped output by 'religion'. You can override using the
## `.groups` argument.
religion_marriage
## # A tibble: 4 × 5
## # Groups: religion [2]
## religion group_marriage n tot_group pct
## <chr> <chr> <int> <int> <dbl>
## 1 no divorce 384 4602 8.3
## 2 no marriage 4218 4602 91.7
## 3 yes divorce 328 4541 7.2
## 4 yes marriage 4213 4541 92.8
4. 이혼만 추출
divorce <- religion_marriage %>%
filter(group_marriage == "divorce") %>%
select(religion, pct)
divorce
## # A tibble: 2 × 2
## # Groups: religion [2]
## religion pct
## <chr> <dbl>
## 1 no 8.3
## 2 yes 7.2
5. 그래프 생성
ggplot(data = divorce, aes(x = religion, y = pct)) + geom_col()

6. 연령대별 이혼율 표 생성
ageg_marriage <- welfare %>%
filter(!is.na(group_marriage)) %>%
group_by(ageg, group_marriage) %>%
summarise(n = n()) %>%
mutate(tot_group = sum(n)) %>%
mutate(pct = round(n/tot_group*100, 1))
## `summarise()` has grouped output by 'ageg'. You can override using the
## `.groups` argument.
ageg_marriage
## # A tibble: 6 × 5
## # Groups: ageg [3]
## ageg group_marriage n tot_group pct
## <chr> <chr> <int> <int> <dbl>
## 1 middle divorce 437 4918 8.9
## 2 middle marriage 4481 4918 91.1
## 3 old divorce 273 4165 6.6
## 4 old marriage 3892 4165 93.4
## 5 young divorce 2 60 3.3
## 6 young marriage 58 60 96.7
7. 초년을 제외한 이혼만 추출
ageg_divorce <- ageg_marriage %>%
filter(ageg != "young" & group_marriage == "divorce") %>%
select(ageg, pct)
ageg_divorce
## # A tibble: 2 × 2
## # Groups: ageg [2]
## ageg pct
## <chr> <dbl>
## 1 middle 8.9
## 2 old 6.6
8. 그래프 생성
ggplot(data = ageg_divorce, aes(x = ageg, y = pct)) + geom_col()

9. 연령대, 종교 유무, 결혼 여부에 따른 표 생성
ageg_religion_marriage <- welfare %>%
filter(!is.na(group_marriage) & ageg != "young") %>%
group_by(ageg, religion, group_marriage) %>%
summarise(n = n()) %>%
mutate(tot_group = sum(n)) %>%
mutate(pct = round(n/tot_group*100, 1))
## `summarise()` has grouped output by 'ageg', 'religion'. You can override using
## the `.groups` argument.
ageg_religion_marriage
## # A tibble: 8 × 6
## # Groups: ageg, religion [4]
## ageg religion group_marriage n tot_group pct
## <chr> <chr> <chr> <int> <int> <dbl>
## 1 middle no divorce 260 2681 9.7
## 2 middle no marriage 2421 2681 90.3
## 3 middle yes divorce 177 2237 7.9
## 4 middle yes marriage 2060 2237 92.1
## 5 old no divorce 123 1884 6.5
## 6 old no marriage 1761 1884 93.5
## 7 old yes divorce 150 2281 6.6
## 8 old yes marriage 2131 2281 93.4
10. 연령대, 종교 유무에 따른 이혼율 표 생성
df_divorce <- ageg_religion_marriage %>%
filter(group_marriage == "divorce") %>%
select(ageg, religion, pct)
df_divorce
## # A tibble: 4 × 3
## # Groups: ageg, religion [4]
## ageg religion pct
## <chr> <chr> <dbl>
## 1 middle no 9.7
## 2 middle yes 7.9
## 3 old no 6.5
## 4 old yes 6.6
11. 그래프 생성
ggplot(data = df_divorce, aes(x = ageg, y = pct, fill = religion )) +
geom_col(position = "dodge")

9-9. 지역별 연령대 비율
1. 지역 코드 목록 생성
list_region <- data.frame(code_region = c(1:7),
region = c("서울",
"수도권(인천/경기)",
"부산/경남/울산",
"대구/경북",
"대전/충남",
"강원/충북",
"광주/전남/전북/제주도"))
list_region
## code_region region
## 1 1 서울
## 2 2 수도권(인천/경기)
## 3 3 부산/경남/울산
## 4 4 대구/경북
## 5 5 대전/충남
## 6 6 강원/충북
## 7 7 광주/전남/전북/제주도
2. welfare에 변수 만들기(지역명)
welfare <- left_join(welfare, list_region, by = "code_region")
welfare %>%
select(code_region, region) %>%
head
## code_region region
## 1 1 서울
## 2 1 서울
## 3 1 서울
## 4 1 서울
## 5 1 서울
## 6 1 서울
3. 지역별 연령대 비율표 생성
region_ageg <- welfare %>%
group_by(region, ageg) %>%
summarise(n = n()) %>%
mutate(tot_group = sum(n)) %>%
mutate(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 [2]
## region ageg n tot_group pct
## <chr> <chr> <int> <int> <dbl>
## 1 강원/충북 middle 417 1257 33.2
## 2 강원/충북 old 555 1257 44.2
## 3 강원/충북 young 285 1257 22.7
## 4 광주/전남/전북/제주도 middle 947 2922 32.4
## 5 광주/전남/전북/제주도 old 1233 2922 42.2
## 6 광주/전남/전북/제주도 young 742 2922 25.4
4. 그래프 생성
ggplot(data = region_ageg, aes(x = region, y = pct, fill = ageg)) +
geom_col() +
coord_flip()

5. 노년층의 비율이 높은 순으로 나열
list_order_old <- region_ageg %>%
filter(ageg == "old") %>%
arrange(pct)
list_order_old
## # A tibble: 7 × 5
## # Groups: region [7]
## region ageg n tot_group pct
## <chr> <chr> <int> <int> <dbl>
## 1 수도권(인천/경기) old 1109 3711 29.9
## 2 서울 old 805 2486 32.4
## 3 대전/충남 old 527 1467 35.9
## 4 부산/경남/울산 old 1124 2785 40.4
## 5 광주/전남/전북/제주도 old 1233 2922 42.2
## 6 강원/충북 old 555 1257 44.2
## 7 대구/경북 old 928 2036 45.6
6. 변수 생성 (지역명 순서)
order <- list_order_old$region
order
## [1] "수도권(인천/경기)" "서울" "대전/충남"
## [4] "부산/경남/울산" "광주/전남/전북/제주도" "강원/충북"
## [7] "대구/경북"
7. 그래프 생성 (지역명 순서)
ggplot(data = region_ageg, aes(x = region, y = pct, fill = ageg)) +
geom_col() +
coord_flip() +
scale_x_discrete(limits = order)

8. 연령대 순서로 색 나열
region_ageg$ageg <- factor(region_ageg$ageg,
level = c("old", "middle", "young"))
ggplot(data = region_ageg, aes(x = region, y = pct, fill = ageg)) +
geom_col() +
coord_flip() +
scale_x_discrete(limits = order)
