R 교재 9장 직접해보기 과제
231p
library(foreign)
getwd()
## [1] "C:/Users/admin/Desktop/R/R 교재9장"
setwd("C:/Users/admin/Desktop/R/R 교재9장")
raw_welfare <- read.spss(file.choose(), to.data.frame = T)
## Warning in read.spss(file.choose(), to.data.frame = T):
## C:\Users\admin\Desktop\R\R 교재9장\Koweps_hpc10_2015_beta1.sav: Compression
## bias (0) is not the usual value of 100
welfare <- raw_welfare
library("dplyr")
## Warning: 패키지 'dplyr'는 R 버전 4.3.2에서 작성되었습니다
##
## 다음의 패키지를 부착합니다: '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")
## Warning: 패키지 'ggplot2'는 R 버전 4.3.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)
welfare$sex <- ifelse(welfare$sex == 9, NA, welfare$sex)
table(is.na(welfare$sex))
##
## FALSE
## 16664
welfare$sex <- ifelse(welfare$sex == 1, "male", "female")
welfare$income <- ifelse(welfare$income %in% c(0, 9999), NA, welfare$income)
welfare$birth <- ifelse(welfare$birth == 9999, NA, welfare$birth)
table(is.na(welfare$birth))
##
## FALSE
## 16664
welfare$age <- 2015 - welfare$birth + 1
연령별 및 성별에 따른 월급차이 분석하기
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.
ggplot(data=sex_age, aes(x=age, y=mean_income, col=sex)) + geom_line()

235p
직업별에 따른 월급 차이 분석하기
library(readxl)
list_job <- read_excel("Koweps_Codebook.xlsx", col_names = TRUE, sheet = 2)
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 매장 판매 종사자
job_income <- welfare %>% filter(!is.na(job) & !is.na(income)) %>% group_by(job) %>% summarise(mean_income = mean(income))
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.
월급을 내림차순으로 정렬하고 상위 10개 추출하기 및 그래프만들기
top10 <- job_income %>% arrange(desc(mean_income)) %>% head(10)
ggplot(data = top10, aes(x = reorder(job, mean_income), y = mean_income)) +
geom_col() +
coord_flip()

하위 10개 추출하기 및 그래프만들기
bottom10 <- job_income %>% arrange(mean_income) %>% head(10)
ggplot(data=bottom10, aes(x=reorder(job, -mean_income), y=mean_income)) + geom_col() + ylim(0, 850)

240p
성별에 따른 직업 빈도 분석하기
남자 직업 빈도 상위 10개
job_male <- welfare %>%
filter(!is.na(job) & sex == "male") %>%
group_by(job) %>%
summarise(n = n()) %>%
arrange(desc(n)) %>%
head(10)
여자 직업 빈도 상위 10개
job_female <- welfare %>%
filter(!is.na(job) & sex == "female") %>%
group_by(job) %>%
summarise(n = n()) %>%
arrange(desc(n)) %>%
head(10)
남자 직업 빈도 상위 10개_ 그래프만들기
ggplot(data = job_male, aes(x = reorder(job, n), y = n)) +
geom_col() +
coord_flip()

여자 직업 빈도 상위 10개_ 그래프만들기
ggplot(data = job_female, aes(x = reorder(job, n), y = n)) +
geom_col() +
coord_flip()

247p
종교 유무 이름 부여하기
welfare$religion <- ifelse(welfare$religion == 1, "yes", "no")
table(welfare$religion)
##
## no yes
## 8617 8047
이혼 여부 변수 만들기
welfare$group_marriage <- ifelse(welfare$marriage == 1, "marriage", ifelse(welfare$marriage == 3, "divorce", NA))
table(welfare$group_marriage)
##
## divorce marriage
## 712 8431
종교 유무에 따른 이혼율 차이
welfare <- welfare %>% mutate(ageg = ifelse(age<30, "young", ifelse(age<=59, "middle", "old")))
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.
divorce <- religion_marriage %>% filter(group_marriage == "divorce") %>% select(religion, pct)
ggplot(data=divorce, aes(x=religion, y=pct)) + geom_col()

250p
연령대별에 따른 이혼율 표 만들기
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_divorce <- ageg_marriage %>%
filter(ageg != "young" & group_marriage == "divorce") %>%
select(ageg, pct)
ggplot(data = divorce, aes(x = religion, y = pct)) +
geom_col()

연령대, 종교 유무, 결혼상태에 따른 이혼율 표 만들기
ageg_religion_marriage <- welfare %>%
filter(ageg != "young" & !is.na(group_marriage)) %>%
group_by(religion, ageg, group_marriage) %>%
summarise(n = n()) %>%
mutate(tot_group = sum(n)) %>%
mutate(pct = round(n/tot_group*100, 1))
## `summarise()` has grouped output by 'religion', 'ageg'. You can override using
## the `.groups` argument.
연령대, 종교 유무에 따른 이혼율 표 만들기
df_divorce <- ageg_religion_marriage %>%
filter(group_marriage == "divorce") %>%
select(religion, ageg, pct)
연령대, 종교유무에 따른 이혼율 표 만들기_그래프만들기
ggplot(data = df_divorce, aes(x = ageg, y = pct, fill = religion)) +
geom_col(position = "dodge")

254p
지역코드 목록 만들기
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 1 서울
## 3 1 서울
## 4 1 서울
## 5 1 서울
## 6 1 서울
지역별 연령대 차이 분석하기
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.
지역별 연령대 차이 분석하기_ 그래프만들기
ggplot(data = region_ageg, aes(x = region, y = pct, fill = ageg)) +
geom_col() +
coord_flip()

노년층 비율 높은순으로 막대 색깔 나열하기
list_order_old <- region_ageg %>%
filter(ageg == "old") %>%
arrange(pct)
order <- list_order_old$region
ggplot(data = region_ageg, aes(x = region, y = pct, fill = ageg)) +
geom_col() +
coord_flip() +
scale_x_discrete(limits = order)

연령대 순으로 막대 색깔 나열하기
region_ageg$ageg <- factor(region_ageg$ageg, levels = c("old", "middle", "young"))
class(region_ageg$ageg)
## [1] "factor"
levels(region_ageg$ageg)
## [1] "old" "middle" "young"
ggplot(data = region_ageg, aes(x = region, y = pct, fill = ageg)) +
geom_col() +
coord_flip() +
scale_x_discrete(limits = order)
