한국복지패널데이터
Blossomed_in
한국복지패널 데이터
데이터 준비하기
깃허브(http://bit.ly/2rvvixu)에서에서){.uri} 2016년에 발간된 복지패널 데이터 다운로드
패키지 설치 및 로드
#install.packages("foreign")
library(foreign)
#install.packages("dplyr")
library(dplyr)
#install.packages("ggplot2")
library(ggplot2)
#install.packages("readxl")
library(readxl)
데이터 불러오기
raw_welfare = read.spss(file = "C:/rproject/doit_welfare/데이터/Koweps_hpc10_2015_beta1.sav", to.data.frame = T)
to.data.frame = T는 SPSS 파일을 데이터 프레임 형태로 변환하는 기능
복사본 만들기
welfare = raw_welfare
데이터 검토하기
head(welfare)
tail(welfare)
View(welfare)
dim(welfare)
str(welfare)
summary(welfare)
변수명 바꾸기
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) #지역_코드
rename() -> 변수명을 변경하는 함수
데이터 분석 절차
1단계 : 변수 검토 및 전처리
2단계 : 변수 간 관계 분석
성별에 따른 월급 차이
변수 검토하기
class(welfare$sex)
## [1] "numeric"
table(welfare$sex)
##
## 1 2
## 7578 9086
class() -> 변수의 타입파악
table() -> 각 범주에 몇 명이 있는지 파악
전처리(데이터 코드북 확인) - 이상치 확인
table(welfare$sex)
##
## 1 2
## 7578 9086
이상치 결측 처리
welfare$sex = ifelse(welfare$sex == 9, NA, welfare$sex)
결측치 확인
table(is.na(welfare$sex))
##
## FALSE
## 16664
성별 항목별 이름 부여
welfare$sex = ifelse(welfare$sex == 1, "male", "female")
table(welfare$sex)
##
## female male
## 9086 7578
qplot(welfare$sex)
월급 변수 검토하기
class(welfare$income)
## [1] "numeric"
summary(welfare$income)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.0 122.0 192.5 241.6 316.6 2400.0 12030
qplot(welfare$income)
qplot(welfare$income) + xlim(0, 1000)
xlim()함수를 활용하여 0~1000까지 표현하여 분포가 더 잘 드러나도록 표현
전처리 - 이상치 확인
summary(welfare$income) # 결측치가 12,030개 존재
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.0 122.0 192.5 241.6 316.6 2400.0 12030
이상치 결측 처리
welfare$income = ifelse(welfare$income %in% c(0, 9999), NA, welfare$income)
%in% ? -> 백터 내 특정값 포함 여부 확인하는 연산자
결측치 확인
table(is.na(welfare$income))
##
## FALSE TRUE
## 4620 12044
성별에 따른 월급 차이 분석하기
성별 월급 평균표 만들기
sex_income = welfare %>%
filter(!is.na(income)) %>%
group_by(sex) %>%
summarise(mean_income = mean(income))
sex_income
## # A tibble: 2 x 2
## sex mean_income
## <chr> <dbl>
## 1 female 163.
## 2 male 312.
#그래프 만들기
ggplot(data = sex_income, aes(x = sex, y = mean_income)) + geom_col()
나이와 월급의 관계
변수 검토하기
class(welfare$birth)
## [1] "numeric"
summary(welfare$birth)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1907 1946 1966 1968 1988 2014
qplot(welfare$birth)
전처리
# 이상치 확인
summary(welfare$birth)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1907 1946 1966 1968 1988 2014
# 결측치 확인
table(welfare$birth)
##
## 1907 1911 1914 1915 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928
## 1 1 1 1 1 3 5 10 13 19 27 22 38 34 52 57
## 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944
## 65 94 121 174 160 195 224 256 269 279 300 293 261 354 264 232
## 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960
## 196 231 269 191 208 207 154 224 169 196 201 209 194 199 204 248
## 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976
## 216 219 205 205 214 193 199 229 221 244 254 230 240 256 229 203
## 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992
## 189 193 205 185 176 182 158 110 119 130 92 139 135 132 169 149
## 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008
## 122 167 179 189 198 193 209 217 190 186 171 168 146 168 154 161
## 2009 2010 2011 2012 2013 2014
## 131 151 153 117 117 31
# 이상치 결측 처리
welfare$birth = ifelse(welfare$birth == 9999, NA, welfare$birth)
table(is.na(welfare$birth))
##
## FALSE
## 16664
파생변수 만들기 - 나이
welfare$age = 2015 - welfare$birth + 1
summary(welfare$age)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.00 28.00 50.00 48.43 70.00 109.00
qplot(welfare$age)
나이와 월급에 관계 분석하기
나이에 따른 월급 평균표 만들기
age_income = welfare %>%
filter(!is.na(income)) %>%
group_by(age) %>%
summarise(mean_income = mean(income))
head(age_income)
## # A tibble: 6 x 2
## age mean_income
## <dbl> <dbl>
## 1 20 121.
## 2 21 106.
## 3 22 130.
## 4 23 142.
## 5 24 134.
## 6 25 145.
# 그래프 만들기
ggplot(data = age_income, aes(x = age, y = mean_income)) + geom_line()
연령대에 따른 월급 차이
연령대 변수 검토 및 전처리 파생변수 만들기 - 연령대
welfare = welfare %>% mutate(ageg = ifelse(age < 30, "young", ifelse(age <= 59, "middle", "old")))
table(welfare$ageg)
##
## middle old young
## 6049 6281 4334
qplot(welfare$ageg)
mutate()함수는 파생변수를 만드는 함수
연령대에 따른 월급차이 분석하기
ageg_income = welfare %>% filter(!is.na(income)) %>%
group_by(ageg) %>%
summarise(mean_income = mean(income))
ageg_income
## # A tibble: 3 x 2
## ageg mean_income
## <chr> <dbl>
## 1 middle 282.
## 2 old 125.
## 3 young 164.
## 그래프 만들기
ggplot(data = ageg_income, aes(x = ageg, y = mean_income)) + geom_col()
# ggplot은 알파벳 순으로 정렬 -> 나이순으로 재정렬
ggplot(data = ageg_income, aes(x = ageg, y = mean_income)) + geom_col() +
scale_x_discrete(limits = c("young", "middle", "old"))
scale_x_discrete(limits = c())는 범주 순서를 지정할 수 있다.
연령대 및 성별 월급차이 분석하기
연령대 및 성별 월급 평균표 만들기
sex_income = welfare %>%
filter(!is.na(income)) %>%
group_by(ageg, sex) %>%
summarise(mean_income = mean(income))
sex_income
## # A tibble: 6 x 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.
# 그래프 만들기
ggplot(data = sex_income, aes(x = ageg, y = mean_income, fill = sex)) +
geom_col() +
scale_x_discrete(limits = c("young", "middle", "old"))
# geom_col() position 피라미터를 "dodge"로 설정해 막대를 분리해보자.
ggplot(data = sex_income, aes(x = ageg, y = mean_income, fill = sex)) +
geom_col(position = "dodge") +
scale_x_discrete(limits = c("young", "middle", "old"))
나이 및 성별 월급차이 분석하기
성별 연령별 월급 평균표 만들기
sex_age = welfare %>%
filter(!is.na(income)) %>%
group_by(age, sex) %>%
summarise(mean_income = mean(income))
sex_age
## # A tibble: 134 x 3
## # Groups: age [69]
## 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 23 female 139.
## 8 23 male 153.
## 9 24 female 126.
## 10 24 male 158.
## # ... with 124 more rows
head(sex_age)
## # A tibble: 6 x 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()
직업별 월급 차이
직업변수 검토 및 전처리하기
class(welfare$code_job)
## [1] "numeric"
table(welfare$code_job)
##
## 111 120 131 132 133 134 135 139 141 149 151 152 153 159 211 212
## 2 16 10 11 9 3 7 10 35 20 26 18 15 16 8 4
## 213 221 222 223 224 231 232 233 234 235 236 237 239 241 242 243
## 3 17 31 12 4 41 5 3 6 48 14 2 29 12 4 63
## 244 245 246 247 248 251 252 253 254 259 261 271 272 273 274 281
## 4 33 59 77 38 14 111 24 67 109 4 15 11 4 36 17
## 283 284 285 286 289 311 312 313 314 320 330 391 392 399 411 412
## 8 10 26 16 5 140 260 220 84 75 15 4 13 87 47 12
## 421 422 423 429 431 432 441 442 510 521 522 530 611 612 613 620
## 124 71 5 14 20 33 154 197 192 353 5 106 1320 11 40 2
## 630 710 721 722 730 741 742 743 751 752 753 761 762 771 772 773
## 20 29 30 22 16 27 3 34 34 5 49 69 27 11 61 86
## 774 780 791 792 799 811 812 819 821 822 823 831 832 841 842 843
## 7 17 5 21 45 16 1 6 9 9 23 5 17 32 10 4
## 851 852 853 854 855 861 862 863 864 871 873 874 875 876 881 882
## 19 13 7 33 9 3 14 17 31 2 257 34 37 2 2 3
## 891 892 899 910 921 922 930 941 942 951 952 953 991 992 999 1011
## 8 19 16 102 31 74 289 325 99 125 122 73 45 12 141 2
## 1012
## 17
# 전처리
library(readxl)
list_job = read_excel("C:/rproject/doit_welfare/Koweps_Codebook.xlsx", col_names = T, sheet = 2)
head(list_job)
## # A tibble: 6 x 2
## code_job job
## <dbl> <chr>
## 1 111 의회의원 고위공무원 및 공공단체임원
## 2 112 기업고위임원
## 3 120 행정 및 경영지원 관리자
## 4 131 연구 교육 및 법률 관련 관리자
## 5 132 보험 및 금융 관리자
## 6 133 보건 및 사회복지 관련 관리자
dim(list_job)
## [1] 149 2
# left_join()함수를 이용하여 job변수를 welfar에 결합하기
welfare = left_join(welfare, list_job, id = "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))
head(job_income)
## # A tibble: 6 x 2
## job mean_income
## <chr> <dbl>
## 1 가사 및 육아 도우미 80.2
## 2 간호사 241.
## 3 건설 및 광업 단순 종사원 190.
## 4 건설 및 채굴 기계운전원 358.
## 5 건설 전기 및 생산 관련 관리자 536.
## 6 건설관련 기능 종사자 247.
# 어떤 직업의 월급이 많은지 내림차순 정렬
top10 = job_income %>%
arrange(desc(mean_income)) %>%
head(10)
top10
## # A tibble: 10 x 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.
# 그래프 만들기
ggplot(data = top10, aes(x = reorder(job, mean_income), y = mean_income)) +
geom_col() +
coord_flip()
coord_flip() 사용하여 막대를 오른쪽으로 90도 회전
reorder()함수는 어떤 기준으로 정렬할지 설정(기본은 오름차순, -를 붙이면 내림차순)
하위 10위 추출
bottom10 = job_income %>%
arrange(mean_income) %>%
head(10)
bottom10
## # A tibble: 10 x 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.
## 그래프 만들기
ggplot(data = bottom10, aes(x = reorder(job, -mean_income), y = mean_income)) +
geom_col() +
coord_flip() +
ylim(0, 850)
성별 직업 빈도 분석하기
성별 직업 빈도표 만들기
# 남성 직업 빈도 상위 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 x 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
# 여성 직업 빈도 상위 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 x 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
# 그래프 만들기
# 남성 직업 빈도 상위 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()
종교 유무에 따른 이혼율
# 종교 변수 검토 및 전처리
class(welfare$religion)
## [1] "numeric"
table(welfare$religion)
##
## 1 2
## 8047 8617
# 전처리
# 종교 유무 이름 부여
welfare$religion = ifelse(welfare$religion == 1, "yes", "no")
table(welfare$religion)
##
## no yes
## 8617 8047
qplot(welfare$religion)
# 혼인 상태 변수 검토 및 전처리
# 변수 검토하기
class(welfare$marriage)
## [1] "numeric"
table(welfare$marriage)
##
## 0 1 2 3 4 5 6
## 2861 8431 2117 712 84 2433 26
# 파생변수 만들기
# 이혼 여부 변수 만들기
welfare$group_marriage = ifelse(welfare$marriage == 1, "marriage",
ifelse(welfare$marriage == 3, "divorce", NA))
table(welfare$group_marriage)
##
## divorce marriage
## 712 8431
table(is.na(welfare$group_marriage))
##
## FALSE TRUE
## 9143 7521
qplot(welfare$group_marriage)
# 종교 유무에 따른 이혼율 표 만들기
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))
religion_marriage
## # A tibble: 4 x 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
# count()함수는 집단별 빈도를 구하는 함수, 비율을 구하는 mutate()를 하나로 합쳐서 아래와 같은 방식으로 비율표를 만들 수 있다.
religion_marriage = welfare %>%
filter(!is.na(group_marriage)) %>%
count(religion, group_marriage) %>%
group_by(religion) %>%
mutate(pct = round(n/sum(n)*100, 1))
religion_marriage
## # A tibble: 4 x 4
## # Groups: religion [2]
## religion group_marriage n pct
## <chr> <chr> <int> <dbl>
## 1 no divorce 384 8.3
## 2 no marriage 4218 91.7
## 3 yes divorce 328 7.2
## 4 yes marriage 4213 92.8
# 앞에서 만든 표에서 이혼에 해당하는 값 추출헤 이혼표 작성
# 이혼추출
divorce = religion_marriage %>%
filter(group_marriage == "divorce") %>%
select(religion, pct)
divorce
## # A tibble: 2 x 2
## # Groups: religion [2]
## religion pct
## <chr> <dbl>
## 1 no 8.3
## 2 yes 7.2
# 그래프 만들기
ggplot(data = divorce, aes(x = religion, y = pct)) + geom_col()
# 연령대 및 종교 유무에 따른 이혼율 분석하기
# 연령대별 이혼율 표 만들기
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))
ageg_marriage
## # A tibble: 6 x 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
ageg_marriage = welfare %>%
filter(!is.na(group_marriage)) %>%
count(ageg, group_marriage) %>%
group_by(ageg) %>%
mutate(pct = round(n/sum(n)*100, 1))
ageg_marriage
## # A tibble: 6 x 4
## # Groups: ageg [3]
## ageg group_marriage n pct
## <chr> <chr> <int> <dbl>
## 1 middle divorce 437 8.9
## 2 middle marriage 4481 91.1
## 3 old divorce 273 6.6
## 4 old marriage 3892 93.4
## 5 young divorce 2 3.3
## 6 young marriage 58 96.7
# 연령대별 이혼율 그래프 만들기
# 초년 제외, 이혼 추출
ageg_divorce = ageg_marriage %>%
filter(ageg != "young" & group_marriage == "divorce") %>%
select(ageg, pct)
ageg_divorce
## # A tibble: 2 x 2
## # Groups: ageg [2]
## ageg pct
## <chr> <dbl>
## 1 middle 8.9
## 2 old 6.6
# 그래프 만들기
ggplot(data = ageg_divorce, aes(x = ageg, y = pct)) + geom_col()
# 연령대 및 종교 유무에 따른 이혼율 표 만들기
# 연령대, 종교 유무, 결혼 상태별 비율표 만들기
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))
ageg_religion_marriage
## # A tibble: 8 x 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
#
ageg_religion_marriage = welfare %>%
filter(!is.na(group_marriage) & ageg != "young") %>%
count(ageg, religion, group_marriage) %>%
group_by(ageg, religion) %>%
mutate(pct = round(n/sum(n)*100, 1))
ageg_religion_marriage
## # A tibble: 8 x 5
## # Groups: ageg, religion [4]
## ageg religion group_marriage n pct
## <chr> <chr> <chr> <int> <dbl>
## 1 middle no divorce 260 9.7
## 2 middle no marriage 2421 90.3
## 3 middle yes divorce 177 7.9
## 4 middle yes marriage 2060 92.1
## 5 old no divorce 123 6.5
## 6 old no marriage 1761 93.5
## 7 old yes divorce 150 6.6
## 8 old yes marriage 2131 93.4
# 연령대 및 종교 유무별 이혼율 표 만들기
df_divorce = ageg_religion_marriage %>%
filter(group_marriage == "divorce") %>%
select(ageg, religion, pct)
df_divorce
## # A tibble: 4 x 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
# 연령대 및 종교 유무에 따른 이혼율 그래프 만들기
ggplot(data = df_divorce, aes(x = ageg, y = pct, fill = religion)) +
geom_col(position = "dodge")
지역별 연령대 비율
지역 변수 검토 및 전처리
class(welfare$code_region)
## [1] "numeric"
table(welfare$code_region)
##
## 1 2 3 4 5 6 7
## 2486 3711 2785 2036 1467 1257 2922
# 전처리 - 지역 코드 목록 만들기
list_region = data.frame(code_region = c(1:7),
region = c("서울",
"수도권",
"부산/경남/울산",
"대구/경북",
"대전/충남",
"강원/충북",
"광주/전남/전북/제주도"))
## code_region에 7개의 권역을 의미하는 지역 코드입니다. 먼저 코드북의 내용을 참조해 지역 코드목록을 만든 다음 지역 코드 목록과 welfare에 동시에 들어 있는 code_region 변수를 이용해 welfare에 지역명 변수를 추가 하였습니다.
list_region
## code_region region
## 1 1 서울
## 2 2 수도권
## 3 3 부산/경남/울산
## 4 4 대구/경북
## 5 5 대전/충남
## 6 6 강원/충북
## 7 7 광주/전남/전북/제주도
# 지역명 변수추가
library(dplyr)
welfare = left_join(welfare, list_region, id = "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))
region_ageg
## # A tibble: 21 x 5
## # Groups: region [7]
## 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
## 7 대구/경북 middle 637 2036 31.3
## 8 대구/경북 old 928 2036 45.6
## 9 대구/경북 young 471 2036 23.1
## 10 대전/충남 middle 548 1467 37.4
## # ... with 11 more rows
#
region_ageg = welfare %>%
count(region, ageg) %>%
group_by(region) %>%
mutate(pct = round(n/sum(n)*100, 2))
region_ageg
## # A tibble: 21 x 4
## # Groups: region [7]
## region ageg n pct
## <chr> <chr> <int> <dbl>
## 1 강원/충북 middle 417 33.2
## 2 강원/충북 old 555 44.2
## 3 강원/충북 young 285 22.7
## 4 광주/전남/전북/제주도 middle 947 32.4
## 5 광주/전남/전북/제주도 old 1233 42.2
## 6 광주/전남/전북/제주도 young 742 25.4
## 7 대구/경북 middle 637 31.3
## 8 대구/경북 old 928 45.6
## 9 대구/경북 young 471 23.1
## 10 대전/충남 middle 548 37.4
## # ... with 11 more rows
# 그래프 만들기
library(ggplot2)
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)
list_order_old
## # A tibble: 7 x 4
## # Groups: region [7]
## region ageg n pct
## <chr> <chr> <int> <dbl>
## 1 수도권 old 1109 29.9
## 2 서울 old 805 32.4
## 3 대전/충남 old 527 35.9
## 4 부산/경남/울산 old 1124 40.4
## 5 광주/전남/전북/제주도 old 1233 42.2
## 6 강원/충북 old 555 44.2
## 7 대구/경북 old 928 45.6
# 지역명 순서 변수 만들기
order = list_order_old$region
order
## [1] "수도권" "서울" "대전/충남"
## [4] "부산/경남/울산" "광주/전남/전북/제주도" "강원/충북"
## [7] "대구/경북"
ggplot(data = region_ageg, aes(x = region, y = pct, fill = ageg)) +
geom_col() +
coord_flip() +
scale_x_discrete(limits = order)
# 연령대별 순으로 막대 색깔 나열하기
class(region_ageg$ageg)
## [1] "character"
levels(region_ageg$ageg)
## NULL
# factor()를 이용해 ageg 변수를 factor 타입으로 변환하고, level 피라미터를 이용해 순서를 지정
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)
'데이터 분석 > 쉽게 배우는 R 데이터 분석' 카테고리의 다른 글
인터랙티브 그래프 만들기 (0) | 2021.01.24 |
---|---|
대한민국 시도별 인구, 결핵 환자 수 단계 구분도 만들기 (0) | 2021.01.24 |
ggiraphExtra - 미국 주별 강력 범죄율 단계 구분도 만들기 (0) | 2021.01.20 |
댓글