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)