Github Code: Hoon0427/RPubs
1.’한국복지패널데이터’ 분석 준비하기
한국복지패널데이터는 한국보건사회연구원에서 가구의 경제활동을 연구해 정책 지원에 반영할 목적으로 발간하는 조사 자료입니다. 전국에서 7000여 가구를 선정해 2006년부터 매년 추적 조사한 자료로, 경제활동, 생활실태, 복지욕구 등 천여 개 변수로 구성되어 있습니다. 다양한 분야의 연구자와 정책전문가들이 복지패널데이터를 활용해 논문과 연구보고서를 발표하고있습니다. 복지패널데이터는 엄밀한 절차로 수집되었고, 다양한 변수를 담고 있기 때문에 데이터 분석을 연습하는 데 훌륭한 재료입니다. 데이터는 다양한 삶의 모습이 담겨 있습니다. 한국복지패널데이터를 분석하면 대한민국 사람들이 어떻게 살아가고 있는지 알 수 있습니다.
1) 파일 다운로드
깃허브(bit.ly/doit_rb)에서 Koweps_hpc10_2015_beta1.sav 파일을 다운로드해 프로젝트 폴더에 삽입합니다. 이 파일은 2016년에 발간된 복지패널데이터로, 6,914가구, 16,664명에 대한 정보를 담고있습니다.
2) 패키지 설치 및 로드하기
실습에 사용할 복지패널데이터는 통계분석 소프트웨어인 SPSS 전용 파일로 되어있습니다. foreign 패키지를 사용하면 SPSS, SAS, STATA 등 다양한 통계분석 소프트웨어의 파일을 불러올 수 있습니다.
3) 데이터 불러오기
foreign 패키지의 read.spss()를 이용해 복지패널데이터를 불러옵니다. 원본은 복구해야 할 상황에 대비해 그대로 두고 복사본을 만들어 분석에 활용하겠습니다.
## Warning in read.spss(file = "Koweps_hpc10_2015_beta1.sav", to.data.frame = T):
## Koweps_hpc10_2015_beta1.sav: Compression bias (0) is not the usual value of 100
4) 데이터 검토하기
데이터를 불러왔으니 데이터의 구조와 특징을 파악해 보겠습니다.
앞 장에서 예제로 사용했던 데이터들은 변수의 수가 적고 변수명이 이해할 수 있는 단어로 되어 있기 때문에 데이터 구조를 쉽게 파악할 수 있었습니다. 반면 복지패널데이터와 같은 대규모 데이터는 변수의 수가 많고 변수명이 코드로 되어 있는 경우가 많기 때문에 전체 구조를 한눈에 파악하기 어렵습니다. 이런 경우 데이터 전체를 한 번에 파악하기보다 변수명을 쉬운 단어로 바꾼 후 분석에 사용할 변수들을 각각 파악해야 합니다.
5) 변수명 바꾸기
분석에 사용할 몇 개의 변수를 이해하기 쉬운 변수명으로 바꾸겠습니다. 규모가 큰 조사자료는 보통 데이터의 특성을 설명해 놓은 코드북(Codebook)과 함께 제공됩니다. 코드북에는 코드로 된 각각의 변수명이 무엇을 의마하는지 나타나 있습니다. 코드북을 보면 데이터의 특성에 대해 감을 잡을 수 있고, 분석에 어떤 변수를 활용할 것인지, 분석 방향에 대한 아이디어를 얻을 수 있습니다.
한국복지패널 사이트에서 제공하는 코드북에서 실습에 사용할 변수의 일부를 선정해 깃허브에 공유해 두었습니다(Koweps_Codebook.xlsx). 다운로드해서 변수의 특성을 파악할 때 참고하세요.
먼저, 분석에 사용할 7개 변수의 이름을 쉬운 단어로 바꾸겠습니다.
데이터 분석 절차
분석을 하는 데 필요한 준비가 끝났습니다. 이제 앞에서 선정한 변수들을 이용해 분석을 하겠습니다. 9장은 여러 가지 분석 주제를 다루고 있습니다. 각 분석은 두 단계 절차로 진행합니다.
1단계 : 변수 검토 및 전처리
가장 먼저 분석에 사용할 변수들을 전처리합니다. 변수의 특성을 파악하고 이상치를 정제한 다음 파생변수를 만듭니다. 전처리는 분석에 활용할 변수 각각에 대해 실시합니다. 예를 들어 ’성별에 따른 월급 차이’를 분석한다면 성별, 월급 두 변수를 각각 전처리합니다.
2단계 : 변수 간 관계 분석
전처리가 완료되면 본격적으로 변수 간 관계를 파악하는 분석을 합니다. 데이터를 요약한 표를 만든 후 분석 결과를 쉽게 이해할 수 있는 그래프를 만듭니다.
2.성별에 따른 월급 차이 - “성별에 따라 월급이 다를까?”
과거에 비해 여성들이 활발하게 사회 진출을 한다고는 하지만 직장에서 받는 대우에는 여전히 차별이 존재합니다. 데이터 분석을 통해 성별에 따라 월급 차이가 있는지 알아보겠습니다.
먼저 성별과 월급 두 변수를 검토하고 전처리한 뒤 변수 간의 관계를 분석하겠습니다. 분석 절차를 요약하면 아래와 같습니다.
1단계 : 변수 검토 및 전처리
성별
월급
2단계 : 변수 간 관계 분석
성별 월급 평균표 만들기
그래프 만들기
1)변수 검토하기
class()로 sex 변수의 타입을 파악하고, table()로 각 범주에 몇 명이 있는지 알아보겠습니다. 출력 결과를 보면 sex는 numeric 타입이고 1과 2로 구성됩니다. 1은 7578명, 2는 9086명이 존재합니다.
## [1] "numeric"
##
## 1 2
## 7578 9086
2)전처리
코드북을 보면 성별 변수의 값이 1이면 남자, 2면 여자를 의미한다는 것을 알 수 있습니다. 모른다고 답하거나 응답하지 않았을 경우에는 9로 코딩되어 있습니다.
이 정보를 바탕으로 데이터에 이상치가 있는지 검토하고, 분석에서 이상치를 제외할 수 있도록 NA를 부여합니다. 값이 9일 경우도 성별을 알 수 없어 분석에서 제외해야 하므로 결측 처리합니다.
위 table()에서 볼 수 있듯이, 1과 2만 있고 9 또는 그 외의 값은 존재하지 않습니다. 이상치가 없기 때문에 이상치를 결측 처리하는 절차를 건너뛰어도 됩니다. 만약 이상치가 발견된다면 아래와 같이 이상치를 결측 처리한 후 결측치가 제대로 만들어졌는지 확인하는절차를 거쳐야 합니다.
# 이상치 결측 처리
welfare$sex <- ifelse(welfare$sex == 9, NA, welfare$sex)
# 결측치 확인
table(is.na(welfare$sex))##
## FALSE
## 16664
sex 변수의 값은 숫자 1과 2로 되어 있습니다. 값의 의미를 이해하기 쉽도록 문자 “male”과 “female”로 바꾸고, table(), qplot()을 이용해 바꾼 값이 반영됐는지 출력 결과를 확인합니다.
##
## female male
## 9086 7578
성별 변수의 전처리 작업이 완료됐습니다. 이제 동일한 절차로 월급 변수의 전처리 작업을 하겠습니다.
1)변수 검토하기
코드북을 보면 월급은 ’일한 달의 월 평균 임금’을 의미하며 1만 원 단위로 기록되어 있습니다. income 변수를 검토하고 qplot()으로 분포를 확인하겠습니다.
성별 변수는 범주 변수이기 때문에 table()로 각 범주의 빈도를 확인하면 특징을 파악할 수 있습니다. 하지만 월급 변수는 연속 변수이기 때문에 table()을 이용하면 너무 많은 항목이 출력됩니다. 연속 변수는 summary()로 요약 통계량을 확인해야 특징을 파악할 수 있습니다.
## [1] "numeric"
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.0 122.0 192.5 241.6 316.6 2400.0 12030
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 12030 rows containing non-finite values (stat_bin).
income은 numeric 타입이고, 0~2400만 원 사이의 값을 지니며, 122~316 만 원 사이에 가장 많이 분포하고 있습니다. 평균은 241.6 만 원, 중앙ㄱ밧은 평균보다 작은 192.5만 원으로, 전반적으로 낮은 값 쪽으로 치우쳐 있습니다.
qplot()은 최댓값까지 표현하도록 기본값이 설정되어 있습니다. 출력된 그래프를 보면 x축이 2500까지 있어서 대다수를 차지하는 0~1000 사이의 데이터가 잘 표현되지 않습니다. xlim()을 이용해 0~1000까지만 표현되게 설정하겠습니다.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 12051 rows containing non-finite values (stat_bin).
## Warning: Removed 2 rows containing missing values (geom_bar).
출력된 그래프를 보면 월급의 분포가 좀 더 잘 드러납니다. 0~250만 원 사이에 가장 많은 사람이 분포하고 그 뒤로는 점차 빈도가 감소한다는 것을 알 수 있습니다.
2)전처리
코드북을 보면 월급은 1~9998 사이의 값을 지니며, 모름 또는 무응답은 9999로 코딩되어 있다는 것을 알 수 있습니다. 이 정보를 바탕으로 전처리 작업을 하겠습니다.
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.0 122.0 192.5 241.6 316.6 2400.0 12030
출력 결과를 보면 최솟값이 0, 최댓값이 2400이고, 결측치가 12030개 있습니다. 직업이 없어서 월급을 받지 않는 응답자가 있기 때문에 결측치가 존재하는 것입니다. 따라서 월급 변수를 이용하는 분석을 할 경우 먼저 결측치를 제외해야 합니다.
코드북에는 월급이 1~9998 사이의 값을 지닌다고 되어 있는데 summary() 출력 결과에 최솟값이 0으로 나타나 있습니다. 이는 이상치가 존재한다는 것을 의미하므로, 값이 0이면 결측 처리해야 합니다. 값이 0이거나 9999일 경우 결측 처리하겠습니다. 그 후 다음 단계에서 성별과 월급의 고나계를 분설할 때 결측치를 제외하고 분석하겠습니다.
#이상치 결측 처리
welfare$income <- ifelse(welfare$income %in% c(0,9999), NA, welfare$income)
#결측치 확인
table(is.na(welfare$income))##
## FALSE TRUE
## 4620 12044
3.나이와 월급의 관계 - “몇 살 때 월급을 가장 많이 받을까?”
비정규직이 많아지면서 안정된 직장에 취업하는 것도 어려워졌지만, 젊은 세대를 더욱 힘들게 하는 것은 세대 간 소득 겨차가 심해서 사회가 불평등하게 느껴진다는 점입니다. 나이에 따라 월급이 어떻게 다른지 데이터 분석을 통해 알아보겠습니다.
먼저 나이 변수를 검토하고 전처리하겠습니다. 월급 변수 전처리는 앞 실습에서 완료했으니 생략하고 변수 간 관계를 분석하겠습니다.
분석절차
1단계 : 변수 검토 및 전처리
나이
월급
2단계 : 변수 간 관계 분석
나이에 따른 월급 평균표 만들기
그래프 만들기
나이 변수 검토 및 전처리
1)변수 검토하기
나이와 월급의 관계를 분석하려면 나이 변수가 있어야 합니다. 그런데 한국복지패널데이터에는 나이 변수는 없고 태어난 연도 변수만 있기 때문에 태어난 연도를 이용해서 나이 변수를 만들어야 합니다. 먼저 태어난 연도 변수를 검토한 후 나이 변수를 만들겠습니다.
## [1] "numeric"
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1907 1946 1966 1968 1988 2014
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
2)전처리
코드북을 보면 태어난 연도는 1900~2014 사이의 값을 지니고, 모름/무응답은 9999로 코딩되어 있는 것을 알 수 있습니다. 이 정보를 바탕으로 전처리 작업을 하겠습니다.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1907 1946 1966 1968 1988 2014
##
## FALSE
## 16664
출력된 결과를 보면 이상치와 결측치가 없습니다. 따라서 파생변수를 만드는 단계로 넘어가면 됩니다. 만약 이상치가 발견된다면 아래와 같이 전처리한 후 다음 작업을 진행해야 합니다.
# 이상치 결측 처리
welfare$birth <- ifelse(welfare$birth == 9999, NA, welfare$birth)
table(is.na(welfare$birth))##
## FALSE
## 16664
3)파생변수 만들기-나이
태어난 연도 변수를 이용해 나이변수를 만들겠습니다. 2015년에 조사가 진행됐으니 2015에서 태어난 연도를 뺀 후 1을 더해 나이를 구하면 됩니다. 변수를 만들고 summary(), qplot()을 이용해 특징을 살펴보겠습니다.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.00 28.00 50.00 48.43 70.00 109.00
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
나이와 월급의 관계 분석하기
월급 변수 처리는 2에서 완료했습니다. 나이와 월급 변수의 전처리 작업이 모두 끝났으니 이제 나이에 따른 월급을 분석할 차례입니다.
1)나이에 따른 월급 평균표 만들기
2)그래프 만들기
앞에서 만든 표를 이용해 그래프를 만들겠습니다. x축을 나이, y축을 월급으로 지정하고 나이에 따른 월급의 변화가 표현되도록 선 그래프를 만들겠습니다.
4.연령대에 따른 월급 차이 - “어떤 연령대의 월급이 가장 많을까?”
앞에서는 각 나이별 평균 월급을 분석했습니다. 이번에는 나이를 연령대로 분류해서 비교해 보겠습니다.
분석절차
1단계 : 변수 검토 및 전처리
연령대
월급
2단계 : 변수 간 관계 분석
연령대별 월급 평균표 만들기
그래프 만들기
연령대 변수 검토 및 전처리하기
파생변수 만들기 - 연령대
앞에서 만든 나이 변수를 이용해 연령대 변수를 만들겠습니다. 표의 기준에 따라 연령대 변수를 만든 후 각 범주에 몇 명이 있는지 살펴보겠습니다.
welfare <- welfare %>%
mutate(ageg = ifelse(age < 30, "young",
ifelse(age <= 59, "middle", "old")))
table(welfare$ageg)##
## middle old young
## 6049 6281 4334
연령대에 따른 월급 차이 분석하기
월급 변수 전처리는 2에서 완료했으니 생략하고 변수 간 관계를 분석하겠습니다.
1) 연령대별로 평균 월급이 다른지 알아보기 위해 연령대별 월급 평균표를 만들겠습니다. 분석 결과를 보면 월급 평균이 초년 163만 원, 중년 281만 원, 노년 125만 원 이라는 것을 알 수 있습니다.
ageg_income <- welfare %>%
filter(!is.na(income)) %>%
group_by(ageg) %>%
summarise(mean_income = mean(income))
ageg_income2)그래프 만들기
ggplot()은 막대를 변수의 알파벳 순으로 정렬하도록 기본값이 설정되어 있습니다. 막대가 초년 중년 노년의 나이 순으로 정렬되도록 설정하겠습니다. scale_x_discrete(limits = c())에 범주 순서를 지정하면 됩니다.
ggplot(data = ageg_income, aes(x = ageg, y = mean_income)) +
geom_col() +
scale_x_discrete(limits = c("young", "middle", "old"))표와 그래프를 보면 중년이 280만 원 정도로 가장 많은 월급을 받는다는 것을 알 수 있습니다. 노년은 125만 원 정도로 초년이 받는 163만 원보다 적은 월급을 받습니다.
5.연령대 및 성별 월급 차이 - “성별 월급 차이는 연령대별로 다를까?”
2에서는 데이터 전체를 이용해서 성별 월급 차이를 분석했습니다. 그런데 성별 월급 차이는 연령대에 따라 다른 양상을 보일 수 있습니다. 이번에는 성별 월급 차이가 연령대에 따라 다른지 분석해 보겠습니다. 연령대, 성별, 월급 변수 모두 앞에서 전처리 작업을 완료했으니 바로 변수 간 관계를 분석하겠습니다.
분석절차
1단계 : 변수 검토 및 전처리
연령대
성별
월급
2단계 : 변수 간 관계 분석
연령대 및 성별 월급 평균표 만들기
그래프 만들기
연령대 및 성별 월급 차이 분석하기
1)연령대 및 성별 월급 평균표 만들기
각 연령대에서 성별에 따른 월급 차이가 있는지 알아보기 위해 연령대 및 성별에 따른 월급 평균표를 만들겠습니다.
sex_income <- welfare %>%
filter(!is.na(income)) %>%
group_by(ageg, sex) %>%
summarise(mean_income = mean(income))
sex_income2)그래프 만들기
앞에서 만든 표를 이용해 그래프를 만들겠습니다. 막대가 연령대별로 표현되도록 x축에 ageg를 지정합니다. 막대가 성별에 따라 다른 색으로 표현되도록 fill에 sex를 지정합니다. 축 순서는 scale_x_discrete(limits=c())를 이용해 연령대 순으로 설정합니다.
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"))표와 출력된 그래프를 보면 성별 월급 차이의 양상이 연령대별로 다르다는 것을 알 수 있습니다. 초년에는 차이가 크지 않다가 중년에 크게 벌어져 남성이 166만 원가량 더 많습니다. 노년에는 차이가 줄어들지만 여전히 남성의 월급이 92만 원가량 더 많습니다.
앞 절에서 연령대별 월급을 분석했을 때 노년이 초년보다 적은 월급을 받는 것으로 나타났습니다. 하지만 성별로 나눈 이번 분석 결과를 보면 남성의 경우 노년과 초년 간 월급 차이가 크지 않다는 것을 알 수 있습니다. 노년이 초년보다 적은 월급을 받는 현상은 여성에서만 나타나고 있습니다. 또한 초년보다 중년이 더 많은 월급을 받는 현상도 주로 남성에서 나타나고, 여성은 큰 차이가 없다는 것을 알 수 있습니다.
나이 및 성별 월급 차이 분석하기
이번에는 연령대로 구분하지 않고 나이 및 성별 월급 평균표를 만들어 그래프로 표현하겠습니다. 그래프는 선 그래프로 만들고, 월급 평균 선이 성별에 따른 다른 색으로 표현되도록 aes()의 col 파라미터에 sex를 지정하겠습니다.
# 성별 연령별 월급 평균표 만들기
sex_age <- welfare %>%
filter(!is.na(income)) %>%
group_by(age, sex) %>%
summarise(mean_income = mean(income))
head(sex_age)출력된 그래프를 보면 남성의 월급은 50세 전후까지 지속적으로 증가하다가 급격하게 감소하는 반면, 여성은 30세 전후까지 약간 상승하다가 그 이후로는 지속적으로 완만하게 감소한다는 것을 알 수 있습니다. 성별 월급 격차는 30세부터 지속적으로 벌어져 50대 초반에 가장 크게 벌어지고, 이후로 점차 줄어들어 70대 후반이 되면 비슷한 수준이 된다는 것을 알 수 있습니다.
6.직업별 월급 차이 - “어떤 직업이 월급을 가장 많이 받을까?”
이번에는 직업별 월급을 분석해 보겠습니다. 먼저 직업 변수를 검토하고 전처리하겠습니다.
월급 변수 전처리 작업은 앞에서 완료했으니 생략하고 변수 간 관계를 분석하겠습니다.
분석절차
1단계 : 변수 검토 및 전처리
직업
월급
2단계 : 변수 간 관계 분석
직업별 월급 평균표 만들기
그래프 만들기
직업 변수 검토 및 전처리하기
1)변수 검토하기
먼저 직업을 나타낸 code_job 변수를 살펴보겠습니다.
## [1] "numeric"
##
## 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
code_job 변수는 직업 코드를 의미합니다. 복지패널데이터에서 직업은 이름이 아니라 직업분류코드로 입력되어 있습니다. 지금 상태로는 분석을 하더라도 코드가 어떤 직업을 의미하는지 알 수 없습니다. 따라서 직업 분류코드를 이용해 직업 명칭 변수를 만들어야 합니다.
2)전처리
직업분류코드 목록을 이용해 직업의 명칭으로 된 변수를 만들겠습니다. 먼저 직업분류코드 목록 데이터 프레임을 만들겠습니다., 깃허브(bit.ly/doit_rc)에서 Koweps_Codebook.xlsx를 다운로드해 프로젝트 폴더에 삽입한 후 불러오겠습니다. 이 파일의 ‘직종 코드’ 시트에 직업분류코드가 정리되어 있습니다.
엑셀 파일을 불러오기 readxl 패키지를 로드합니다. 첫 행을 변수명으로 가져오도록 설정하고, 엑셀 파일의 두 번째 시트에 있는 직업분류코드 목록을 불러오도록 sheet 파라미터에 2를 지정합니다.
library(readxl)
list_job <- read_excel("Koweps_Codebook.xlsx", col_names = T, sheet = 2)
head(list_job)## [1] 149 2
출력 결과를 보면 직업분류코드 목록이 코드와 직업명 두 변수로 구성되고, 직업이 149개로 분류된다는 것을 알 수 있습니다.
3)left_join()으로 job 변수를 welfare에 결합합니다. welfare와 list_job에 공통으로 들어 있는 code_job 변수를 기준으로 결합하면 됩니다. 결합이 완료되면 welfare의 code_job, job 변수 일부를 출력해 잘 결합됐는지 확인하겠습니다.
## Joining, by = "code_job"
welfare에 직업 명칭으로 된 job 변수가 결합된 것을 확인할 수 있습니다. 이제 이 변수를 이용해 직업별 월급 차이를 분석하면 됩니다.
직업별 월급 차이 분석하기
월급 변수에 대한 전처리는 02에서 완료했습니다. 월급, 직업 변수의 전처리가 끝났으니 이제 변수 간 관계를 분석하겠습니다.
1)직업별 월급 평균표 만들기
직업별 월급 평균을 구하겠습니다. 직업이 없거나 월급이 없는 사람은 분석 대상이 아니므로 제외합니다.
job_income <- welfare %>%
filter(!is.na(job) & !is.na(income)) %>%
group_by(job) %>%
summarise(mean_income = mean(income))
head(job_income)2)어떤 직업의 월급이 많은지 알아보기 위해 월급을 내림차순으로 정렬하고 상위 10개를 추출합니다.
3)그래프 만들기
이제 앞에서 만든 표를 이용해 그래프를 만들겠습니다. 직업 이름이 길기 때문에 그래프를 기본값으로 만들면 x축이 서로 겹쳐 알아볼 수 없습니다. coord_flip()을 추가해 막대를 오른쪽으로 90도 회전하겠습니다.
ggplot(data = top10, aes(x = reorder(job, mean_income), y = mean_income)) +
geom_col() +
coord_flip()출력된 표와 그래프를 보면 ‘금속 재료 공학 기술자 및 시험원’이 평균 845만 원으로 가장 많은 월급을 받고, 그 다음으로는 ’의료진료 전문가’, 의회의원 고위공무원 및 공공단체임원’, ’보험 및 금융 관리자’의 월급이 많다는 것을 알 수 있습니다.
4)이번에는 어떤 직업들의 월급이 적은지 알아보기 위해 월급이 하위 10위에 해당하는 직업을 추출하겠습니다. 그래프는 앞에서 만든 상위 10위 그래프와 비교할 수 있도록 y축을 0~850까지 표현되게 설정하겠습니다.
# 하위 10위 추출
bottom10 <- job_income %>%
arrange(mean_income) %>%
head(10)
# 그래프 만들기
ggplot(data = bottom10, aes(x = reorder(job, -mean_income),
y = mean_income)) +
geom_col() +
coord_flip() +
ylim(0,850)출력된 표와 그래프를 보면 ‘가사 및 육아 도우미’의 월급이 평균 80만 원으로 가장 적고, 그 뒤로는 ’임업관련 종사자’, ‘기타 서비스 관련 단순 종사원’, ’청소원 및 환경 미화원’의 월급이 적다는 것을 알 수 있습니다.
상,하위 분석 결과를 비교하면 가장 많은 월급을 받는 ’금속 재료 공학 기술자 및 시험원’이 ’가사 및 육아 도우미’의 열 배가 넘는 월급을 받는다는 것을 알 수 있습니다.
7.성별 직업 빈도 - “성별로 어떤 직업이 가장 많을까?”
성 평등이 상식인 세상이 됐지만 여전히 성별에 따라 다른 직업을 갖는 경향이 있습니다. 성별에 따라 어떤 직업이 많은지 분석해 보겠습니다. 성별, 직업 변수 전처리 작업은 앞에서 완료했으니 바로 변수 간 관계를 분석하겠습니다.
분석절차
1단계 : 변수 검토 및 전처리
성별
월급
2단계 : 변수 간 관계 분석
성별 월급 평균표 만들기
그래프 만들기
성별 직업 빈도 분석하기
성별 변수 전처리는 2, 직업 변수 전처리는 6에서 완료했으니 생략하고 변수 간 관계를 분석하겠습니다.
1)성별 직업 빈도표 만들기
각 성별로 직업별 빈도를 구해 상위 10개를 추출하겠습니다.
# 남성 직업 빈도 상위 10개 추출
job_male <- welfare %>%
filter(!is.na(job)&sex == "male") %>%
group_by(job) %>%
summarise(n = n()) %>%
arrange(desc(n)) %>%
head(10)
job_male# 여성 직업 빈도 상위 10개 추출
job_female <- welfare %>%
filter(!is.na(job)&sex == "female") %>%
group_by(job) %>%
summarise(n = n()) %>%
arrange(desc(n)) %>%
head(10)
job_female2)그래프 만들기
앞에서 만든 성별 직업 빈도표를 이용해 그래프를 만들겠습니다.
# 남성 직업 빈도 상위 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()출력된 표와 그래프를 보면 남성들이 가장 많이 가지고 있는 직업은 작물 재배 종사자, 자동차 운전원, 경영 관련 사무원, 영업 종사자라는 것을 알 수 있습니다. 여성들이 가장 많이 가지고 있는 직업은 작물 재배 종사자, 청소원 및 환경 미화원, 매장 판매 종사자, 제조관련 단순 종사원이라는 것을 알 수 있습니다.
8.종교 유무에 따른 이혼율 - “종교가 있는 사람들이 이혼을 덜 할까?”
이번에는 종교가 있는 사람들이 종교가 없는 사람들보다 이혼을 덜 하는지 분석해 보겠습니다. 먼저 종교, 혼인 상태 두 변수를 검토하고 전처리한 후 변수 간 관계를 분석하겠습니다.
분석절차
1단계 : 변수 검토 및 전처리
종교
혼인상태
2단계 : 변수 간 관계 분석
종교 유무에 따른 이혼율 표 만들기
그래프 만들기
종교 변수 검토 및 전처리하기
2)전처리
코드북의 종교 변수에 대한 정보를 바탕으로 전처리를 하겠습니다. 앞의 출력 결과를 보면 1과 2외에 다른 값이 존재하지 않습니다. 이상치를 결측 처리하는 작업은 생략하고 값의 의미를 이해할 수 있도록 종교 유무에 따라 문자를 부여하겠습니다. 출력 결과를 보면 종교가 있는 사람이 8047명, 종교가 없는 사람이 8617명이라는 것을 알 수 있습니다.
# 종교 유무 이름 부여
welfare$religion <- ifelse(welfare$religion == 1, "yes", "no")
table(welfare$religion)##
## no yes
## 8617 8047
혼인 상태 변수 검토 및 전처리하기
1)변수 검토하기
## [1] "numeric"
##
## 0 1 2 3 4 5 6
## 2861 8431 2117 712 84 2433 26
2)파생변수 만들기 - 이혼 여부
코드북의 혼인 상태 변수에 대한 정보를 보면 배우자가 있을 경우1, 이혼했을 경우 3으로 코딩되어 있습니다. 이 값을 이용해 이혼 여부를 나타내는 변수를 만들겠습니다.
# 이혼 여부 변수 만들기
welfare$group_marriage <- ifelse(welfare$marriage == 1, "marriage",
ifelse(welfare$marriage == 3, "divorce", NA))
table(welfare$group_marriage)##
## divorce marriage
## 712 8431
##
## FALSE TRUE
## 9143 7521
출력 결과를 보면 결혼 상태인 사람은 8431명, 이혼한 사람은 712명이라는 것을 알 수 있습니다. 둘 중 어디에도 속하지 않아 결측치로 분류된 경우가 7521명 있습니다. 이들은 이후 분석에서 제외하겠습니다.
종교 유무에 따른 이혼율 분석하기
1)종교 유무에 따른 이혼율 표 만들기
종교 유무에 따른 이혼율 표를 만들겠습니다. 먼저 종교 유무 및 결혼상태별로 나눠 빈도를 구한 뒤 각 종교 유무 집단의 전체 빈도로 나눠 비율을 구합니다. 비율은 round()를 이용해 소수점 첫째 자리까지 표현되도록 합니다.
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_marriagedplyr()의 count()는 집단별 빈도를 구하는 함수입니다. 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_marriage2)앞에서 만든 표에서 이혼에 해당하는 값만 추출해 이혼율 표를 만들겠습니다.
# 이혼 추출
divorce <- religion_marriage %>%
filter(group_marriage == "divorce") %>%
select(religion, pct)
divorce3)그래프 만들기
이혼율은 종교가 있는 경우 7.2%, 종교가 없는 경우 8.3%로 나타났습니다. 따라서 종교가 있는 사람들이 이혼을 덜 한다고 볼 수 있습니다.
연령대 및 종교 유무에 따른 이혼율 분석하기
앞에서는 전체를 대상으로 종교 유무에 따른 이혼율을 분석했습니다. 이번에는 종교 유무에 따른 이혼율이 연령대별로 다른지 알아보겠습니다.
1)연령대별 이혼율 표 만들기
우선 이혼율이 연령대에 따라 다른지 알아보겠습니다. 연령대 및 결혼 상태별 비율표를 만든 다음, 이혼한 경우를 추출해 이혼율 표를 만들겠습니다.
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_marriagecount()를 이용하고, 비율을 구하는 mutate()를 하나로 합쳐서 아래와 같은 방식으로도 비율표를 만들 수 있습니다.
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출력 결과를 보면 이혼율이 연령대별로 다르다는 것을 알 수 있습니다. 또한 초년의 경우 결혼하거나 이혼한 사례가 적다는 것을 알 수 있습니다. 초년은 사례가 부족해 다른 연령대와 비교하기에 적합하지 않으므로 이후 분석 잡업에서 제외하겠습니다.
2)연령대별 이혼율 그래프 만들기
앞에서 만든 표에서 초년을 제외하고, 이혼을 나타내는 값만 추출해 그래프를 만들겠습니다. 출력된 그래프를 보면 노년보다 중년의 이혼율이 더 높다는 것을 알 수 있습니다.
# 초년 제외, 이혼 추출
ageg_divorce <- ageg_marriage %>%
filter(ageg !="young" & group_marriage == "divorce") %>%
select(ageg,pct)
ageg_divorce3)연령대 및 종교 유무에 따른 이혼율 표 만들기
종교 유무에 따른 이혼율 차이가 연령대별로 다른지 알아보겠습니다. 먼저 연령대, 종교 유무, 결혼 상태별로 집단을 나눠 빈도를 구한 뒤, 각 집단 전체 빈도로 나눠 비율을 구합니다. 그런 다음, 이혼에 해당하는 값만 추출해 연령대 및 종교 유무별 이혼율 표를 만들겠습니다.
# 연령대, 종교 유무, 결혼 상태별 비율표 만들기
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_marriagecount()를 이용하고, 비율을 구하는 mutate()를 하나로 합쳐서 아래와 같은 방식으로도 비율표를 만들 수 있습니다.
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# 연령대 및 종교 유무별 이혼율 표 만들기
df_divorce <- ageg_religion_marriage %>%
filter(group_marriage == "divorce") %>%
select(ageg, religion, pct)
df_divorce4)연령대 및 종교 유무에 따른 이혼율 그래프 만들기
앞에서 만든 이혼율 표를 이용해 그래프를 만들겠습니다. 종교 유무에 따라 막대 색깔을 다르게 표현하기 위해 fill 파라미터에 religion을 지정합니다,. geom_col()의 position 파라미터를 “dodge”로 설정해 막대를 분리합니다.
출력된 표와 그래프를 보면 노년은 종교 유무에 따른 이혼율 차이가 0.1%로 작고, 오히려 종교가 있는 사람들의 이혼율이 더 높다는 것을 알 수 있습니다. 반면, 중년은 종교가 없는 사람들의 이혼율이 1.8% 더 높다는 것을 알 수 있습니다.
9.지역별 연령대 비율 - “노년층이 많은 지역은 어디일까?”
고령 사회가 되면서 노인들을 위한 시설을 마련하는 일이 점점 더 중요해지고 있습니다. 노인들을 위한 시설을 마련하려면 우선 어느 지역에 노인들이 많이 살고 있는지 알아야 합니다. 지역별 연령대 비율을 분석해 노년층이 많은 지역이 어디인지 알아보겠습니다.
분석절차
1단계 : 변수 검토 및 전처리
지역
연령대
2단계 : 변수 간 관계 분석
지역별 연령대 비율표 만들기
그래프 만들기
지역 변수 검토 및 전처리하기
1)변수 검토하기
## [1] "numeric"
##
## 1 2 3 4 5 6 7
## 2486 3711 2785 2036 1467 1257 2922
2)전처리
code_region 변수의 값은 7개 권역을 의미하는 지역 코드입니다. 먼저 코드북의 내용을 참조해 지역 코드 목록을 만들겠습니다. 그런 다음 지역 코드 목록과 welfare에 동시에 들어 있는 code_region 변수를 이용해 welfare에 지역명 변수를 추가하겠습니다.
# 지역 코드 목록 만들기
list_region <- data.frame(code_region = c(1:7),
region = c("서울",
"수도권(인천/경기",
"부산/경남/울산",
"대구/경북",
"대전/충남",
"강원/충북",
"광주/전남/전북/제주도"))
list_region## Joining, by = "code_region"
지역별 연령대 비율 분석하기
연령대 변수 전처리는 앞에서 완료했으니 생략하고 변수 간 관계를 분석하겠습니다.
1)지역별 연령대 비율표 만들기
지역별 연령대 비율표를 만들겠습니다. 지역 및 연령대별로 나눠 빈도를 구한 뒤, 각 지역의 전체 빈도로 나눠 비율을 구합니다.
region_ageg <- welfare %>%
group_by(region, ageg) %>%
summarise(n = n()) %>%
mutate(tot_group = sum(n)) %>%
mutate(pct = round(n/tot_group*100, 2))
head(region_ageg)count()를 이용하고, 비율을 구하는 mutate()를 하나로 합쳐서 아래와 같은 방식으로도 비율표를 만들 수 있습니다.
region_ageg <- welfare %>%
count(region, ageg) %>%
group_by(region) %>%
mutate(pct = round(n/sum(n)*100, 2))
head(region_ageg)2)그래프 만들기
앞에서 만든 표를 이용해 그래프를 만들겠습니다. 연령대 비율 막대를 서로 다른 색으로 표현하도록 aes의 fill 파라미터에 ageg를 지정합니다. 지역별로 비교하기 쉽도록 coord_flip()을 추가해서 그래프를 오른쪽으로 회전합니다.
3)노년층 비율 높은 순으로 막대 정렬하기
앞에서 만든 그래프는 막대가 밑에서부터 지역명 가나다 순으로 정렬되어 있습니다. 막대를 노년층 비율이 높은 순으로 정렬하겠습니다. 먼저 노년층 비율 순으로 지역명이 정렬된 변수를 만들어야 합니다. 앞에서 만든 표를 노년층 비율 순으로 정렬한 후 지역명만 추출해 변수를 만듭니다.
# 노년층 비율 내림차순 정렬
list_order_old <- region_ageg %>%
filter(ageg == "old") %>%
arrange(pct)
list_order_old## [1] 수도권(인천/경기 서울 대전/충남
## [4] 부산/경남/울산 광주/전남/전북/제주도 강원/충북
## [7] 대구/경북
## 7 Levels: 강원/충북 광주/전남/전북/제주도 대구/경북 ... 수도권(인천/경기
지역명이 노년층 비율 순으로 정렬된 order 변수를 활용해 그래프를 만들겠습니다. 앞에서 사용한 그래프 생성 코드에 scale_x_discrete()를 추가하고 limits 파라미터에 order 변수를 지정하면 됩니다. 출력된 그래프를 보면 막대가 노년층 비율이 높은 순으로 정렬된 것을 볼 수 있습니다.
ggplot(data = region_ageg, aes(x = region, y = pct, fill = ageg)) +
geom_col() +
coord_flip()+
scale_x_discrete(limits = order)4)연령대 순으로 막대 색깔 나열하기
앞에서 만든 그래프는 막대 색깔이 young(초년), old(노년), middle(중년) 순으로 나열되어 있습니다. 이를 초년, 중년, 노년의 순으로 나열되도록 설정하겠습니다. 막대 색깔을 순서대로 나열하려면 fill 파라미터에 지정할 변수의 범주(levels) 순서를 지정하면 됩니다. 현재 ageg 변수는 character 타입이기 때문에 levels가 없습니다.
## [1] "character"
## NULL
factor()를 이용해 ageg 변수를 factor 타입으로 변환하고, level 파라미터를 이용해 순서를 지정합니다.
region_ageg$ageg <- factor(region_ageg$ageg,
level = c("old", "middle", "young"))
class(region_ageg$ageg)## [1] "factor"
## [1] "old" "middle" "young"
그래프 생성 코드를 다시 실행하면 막대 색깔이 연령대 순으로 나열되어 지역별 연령대 비율 구성을 쉽게 파악할 수 있습니다. 출력된 그래프를 보면 노년층 비율이 대구/경북, 강원/충북, 광주/전남/제주도 순으로 높다는 것을 알 수 있습니다.
ggplot(data = region_ageg, aes(x = region, y = pct, fill = ageg)) +
geom_col() +
coord_flip()+
scale_x_discrete(limits = order)