예전 글을 정리하던 중 실무에서도 기본적으로 사용할 수 있을 아주 좋은 예제를 발견하여 올려봅니다. 한국복지패널데이터에서 발간된 데이터를 이용한 예제입니다. 이 데이터는 한국보건사회연구원에서 가구의 경제활동을 연구해 정책 지원에 반영할 목적으로 발간한 자료입니다. 엄밀한 절차로 수집되었고, 아주 다양한 변수들이 있어서 데이터분석 연습하는데 아주 좋은 데이터입니다. 이 데이터를 이용해 우리나라 사람들이 어떻게 살아가는지 확인해봅시다 :)
먼저 데이터는 한국복지패널 사이트에 가시면 받아볼 수 있습니다. 저는 2016년 자료를 활용했습니다. sav 파일을 받으시면 되는데, 이것은 통계분석프로그램 SPSS 전용파일입니다. foreign 패키지를 이용해서 불러와줍니다.
##데이터 불러오기
install.packages("foreign")
#필요한 패키지 불러오기
library(foreign)
library(dplyr)
library(ggplot2)
library(readxl)
#데이터 불러오기
raw_welfare <- read.spss(file ="c:\\Rdata\\Data\\Koweps_hpc10_2015_beta1.sav", to.data.frame = T)
#dataframe형태로 불러와줘야 합니다. 그냥 불러오면 리스트 값으로 불러옵니다.
welfare <- raw_welfare
#데이터 검토. 데이터의 양이 워낙 커서 행과 열의 개수와 이름정도만 봐줍니다.
dim(welfare)
str(welfare)
summary(welfare)
데이터를 살펴보면 변수명이 코드로 되어 있습니다. 이런 경우에는 구조를 한 눈에 파악하기 위해 변수명을 수정해 줍니다. 보통 이러한 조사로 생성된 대규모의 데이터는 데이터의 특성을 설명해 놓은 코드북이 있습니다. 코드북을 보면 코드로 되어있는 변수명들이 무엇을 의미하는지 나타나 있습니다. 코드북을 보면서 데이터의 특성에 대해 감을 익히고 어떤 변수를 활용하여 분석할 것인지, 분석 방향에 대한 아이디어를 얻을 수 있습니다. 이번 프로젝트에서는 성별, 출생년도, 혼인상태, 종교, 월 평균 임금, 지역 코드, 직업 코드 7개를 활용할 것입니다.
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
)
이제 준비가 됐으니 분석을 시작해보겠습니다. 먼저 성별에 따른 월급 차이부터 알아보겠습니다. 예전보다는 나아졌다고 해도 여전히 직장 내의 남녀의 직장에서 받는 대우에는 여전히 차별이 존재할 텐데요. 그저 막연하게 그럴 것이다가 아니라, 데이터를 통해서 통계를 내보고 직접 근거를 찾아봅시다.
먼저 성별과 월급 두 변수를 검토하고 전처리한 뒤에 변수간의 관계를 분석하겠습니다.
table(welfare$sex)
able()을 이용하여 sex변수의 변주를 확인해보면 1,2로 구성되있고 1은 7578명, 2는 9086명이 존재합니다.
특별히 이상치가 발견되지 않기 때문에 전처리를 하지 않습니다.
1과 2로 되어있는 값에 각각 male, female로 바꾸고 그래프로 확인해봅니다.
welfare$sex <- ifelse(welfare$sex == 1, "male", "female")
table(welfare$sex)
qplot(welfare$sex)
성별의 전처리 작업이 완료됐습니다. 이제 동일한 절차로 월급 변수의 전처리 작업을 진행해보죠. 코드북을 보면 월급은 만 원 단위로 기록되어 있습니다. 성별과 같은 방법으로 분석할 건데요, 월급은 연속변수여서 table로 확인하면 너무 많은 항목이 출력됩니다. 그렇기에 이러한 연속변수는 summary()로 확인해야 특징을 파악하기 쉽습니다.
summary(welfare$income)
qplot(welfare$income)
요약통계량을 보면 0~2400만 원 사이의 값을 지니고, 122~316만원 사이에 가장 많이 분포하고 있습니다. 평균은 241.6만원이며, 중앙값은 192.5만원입니다. 그런데 그래프를 보시면 한쪽으로 너무 치우쳐져 보기가 불편합니다. 왜냐하면 qplot은 최댓값ᄁᆞ지 표현하도록 기본값이 설정되어 있기 때문인데요. 이러한 문제를 xlim()을 통하여 거의 대부분의 값이 분포하고 있는 0~1000까지만 표현되게 설정할 수 있습니다.
qplot(welfare$income) + xlim(0,1000)
표를 보시면 0~250만원에 가장 많이 분포하고 점차 빈도가 감소하는 것을 알 수 있습니다.
이제 전처리를 해보겠습니다. 코드북을 보면 월급을 1~9998 사이의 값을 지니고, 모름 또는 무응답은 9999로 코딩되어 있다는 것을 알 수 있습니다. 이 정보를 바탕으로 전처리 작업를 하겠습니다.
summary(welfare$income)
출력 결과를 보면 결측치가 12030개 있습니다. 하지만 0의 값도 결측지와 같기 때문에 0값과 9999의 값을 가질 경우 결측치 처리하겠습니다.
welfare$income <- ifelse(welfare$income %in% c(0,9999), NA, welfare$income)
table(is.na(welfare$income))
사용할 수 있는 값이 4620개 있다는 것을 알 수 있습니다.
이제 성별에 따른 월급 차이를 분석해보겠습니다. 두 변수의 전처리 작업이 완료 됐으니 변수 간 관계를 분석해봅시다.
sex_income <- welfare %>%
filter(!is.na(income)) %>%
group_by(sex) %>%
summarise(mean_income = mean(income)); sex_income
결과를 보시면 월급 평균이 남자는 312만원, 여자는 163만원으로 평균적으로 여성보다 남성의 월급이 약 150 만원 더 많다는 것을 알 수 있습니다.
다음은 나이와 월급의 관계를 알아보겠습니다. 이것을 통해 몇 살 때 월급을 가장 많이 받는 지 알 수 있습니다. 먼저 변수를 검토해봅시다.
summary(welfare$birth)
qplot(welfare$birth)
코드북을 보면 연도는 1900~2014사이의 값을 지니고, 모름/무응답은 9999로 코딩되어 있는 것을 알 수 있습니다. 이정보를 바탕으로 전처리를 해보죠.
table(is.na(welfare$birth))
특별히 결측값이 측정되지 않기 때문에 바로 파생변수를 만드는 단계로 넘어가겠습니다.
태어난 연도 변수를 이용해 나이변수를 만들어보겠습니다. 2015년에 조사가 진행됐으므로 2015년에 태어난 연도를 뺀 후 1을 더해 나이를 구하면 됩니다. 변수를 만들고 특징을 살펴보겠습니다.
welfare$age <- 2015 - welfare$birth +1
summary(welfare$age)
qplot(welfare$age)
이제 나이에 따른 월급을 분석해 봅시다. 먼저 나이별 월급 평균표를 만들겠습니다.
age_income <- welfare %>%
filter(!is.na(income)) %>%
group_by(age) %>%
summarise(mean_income = mean(income))
head(age_income)
그래프를 그려보겠습니다.
ggplot(data = age_income, aes(x = age, y = mean_income)) + geom_line()
그래프를 보시면, 20대 초반에는 약100만원 정도의 월급을 받고 이후 지속적으로 오르다가 50대 무렵 가장 많은 월급을 받고 이후 점차 감소하게 되는 형태를 띄는 것을 알 수 있습니다.
그렇다면 어떤 연령대의 월급이 가장 많은지도 알아봅시다. 먼저 연령대 변수를 만들어 봅시다. 30세 미만은 초년, 30 ~ 59세는 중년, 이후는 노년으로 정해보겠습니다.
welfare <- welfare %>%
mutate(ageg = ifelse(age < 30, "young",
ifelse(age <= 59, "middle", "old")))
table(welfare$ageg)
qplot(welfare$ageg)
이렇게 연령대 별로 인원수를 나눕니다. 이것을 이용해서 연령대별로 평균 월급이 다른지 알아보기 위해 연령대별 월급 평균을 알아보죠.
ageg_income <- welfare %>%
filter(!is.na(income)) %>%
group_by(ageg) %>%
summarise(mean_income = mean(income)); ageg_income
f1 <- ggplot(data = ageg_income, aes(x = ageg, y = mean_income)) + geom_col()
f2 <- f1 + scale_x_discrete(limits=c("young","middle","old")) #그래프 순서 보기 좋게 바꾸기
f2
표를 보시면 예상하셨다시피 중년의 월급이 가장 많고, 그 다음 초년, 노년 순입니다. 저는 노년층의 월급이 더 많을 것이라 예상했는데 그렇지 않군요.
다음은 지금까지 한 작업들의 종합이라고 할 수 있는 연령대 및 성별 월급차이를 알아보겠습니다. 먼저 연령대 및 성별의 월급 평균표를 만들어보겠습니다.
sex_income <- welfare %>%
filter(!is.na(income)) %>%
group_by(ageg, sex) %>%
summarise(mean_income = mean(income)); sex_income
ggplot(data = sex_income, aes(x = ageg, y = mean_income, fill = sex)) +
geom_col() +
scale_x_discrete(limits = c("young", "middle", "old"))
이렇게 하면 차이를 한눈에 확인하기가 쉽지 않습니다. 다른 방식으로 그래프를 그려보죠.
결과를 확인해보시면 초년에는 남녀의 월급차이가 거의 없지만 중년에는 2배정도 차이가나고 노년에는 그대로 차이가나고 있는 것을 알 수 있습니다. 이렇게해서 알 수 있는 것은 그저 단순히 남녀의 연령대 월급차이가 아니라 남성의 경우 초년과 노년의 월급차이가 크지 않지만, 여성의 경우 초년과 노년의 월급차이가 크다는 것을 알 수 있습니다. 이러한 결과를 가지고 더욱 파고든다면 유의미한 결과들을 얻을 수 있을 것입니다.
이번에는 연령대로 구분하지 않고 나이로 구분해보겠습니다. 선 그래프를 그려 나이별, 성별의 월급차이를 확인해봅시다.
sex_age <- welfare %>%
filter(!is.na(income)) %>%
group_by(age, sex) %>%
summarise(mean_income = mean(income)); sex_age
ggplot(data = sex_age, aes(x = age, y = mean_income, col = sex)) + geom_line() # 성별에 따라 다른 색으로 표현되도록 설정
이렇게 라인그래프로 보게되면 차이가 더욱 명확히 나옵니다. 아까 전의 연령대별 남녀의 월급차이에서 남자는 초년과 노년의 월급차이가 크지 않았지만 여자는 차이가 났었습니다. 이것을 이번그래프와 엮어서 확인해본다면, 20~30까지는 남녀의 월급이 동일하게 상승하는 것을 알 수 있습니다. 하지만 30을 기점으로 남자는 그대로 상승하고 여자는 줄어드는 것을 알 수 있는데요, 이는 보통 30전 후로 여자는 결혼을 하고 주부로 살아가는 것도 이유가 되겠네요. 이렇게 직접 데이터를 통해 그동안 그렇다더라 하는 정보들을 직접 확인해 볼 수 있었습니다. 비록 지금은 복잡한 데이터를 사용하지 않고 다양한 변수간의 비교를 하지 않아서 그렇지만, 조금 더 복잡하고 다양하게 비교하고 결론들을 도출해낸다면 미처 우리가 알지 못했던 다양한 사실들을 알 수 있을 것입니다. 다음 분석은 2부에서 마저 하도록 하겠습니다. :)
'데이터분석 및 프로젝트' 카테고리의 다른 글
한국복지패널데이터를 분석하여 봅시다 :) part2 (0) | 2020.01.23 |
---|---|
선형회귀분석에 대해 알아보고 코드를 음미해봅시다:) (0) | 2020.01.21 |
[정보이론] 위너-킨친 정리에 대해 알아봅시다:) (2) | 2020.01.19 |
기사를 크롤링하여 mysql에 넣어보자 :) (0) | 2020.01.19 |
Folium 지도에 heatmap을 이용하여 빈도수를 표현해보자 :) (0) | 2020.01.19 |