언어/R

5. 실습: 한국 복지 패널 데이터 분석 1

차가운오미자 2021. 6. 15. 18:18

0. 한국 복지 패널 데이터

는 다음 사이트에서 다운받을 수 있다. 

https://www.koweps.re.kr:442/data/data/list.do

다만, 데이터를 받기 위해서는 회원가입 후 로그인 해야 하며, 데이터를 사용하고자 하는 목적을 작성해야 한다.

이렇게 받은 데이터 파일들은 그냥 읽으면 뭔 소린지 절대 모른다. 그래서 이를 설명한 설명서를 읽어야 하는데, 이 설명서는 아래 링크에서 받는다.

https://www.koweps.re.kr:442/data/book/list.do

1. 사용할 데이터를 불러온다.

데이터 파일명은 Koweps_hpda15_2020_beta1.1.sav 이다. sav 파일은 spss 전용 파일로, R에서 사용하기 위해서는 foreign 패키지를 사용해야한다. foreign 패키지를 다운받고, 필요한 라이브러리들과 함께 로드했다.

 

* foreign 패키지 install 오류 -> 버전 문제

해결) https://chagaun-omija.tistory.com/55

 

[TS] foreign package is not available

R 버전 문제인 것 같아서 R을 업데이트 해보았다. 간단하게 바로 Rstudio 내 콘솔에서 업데이트 하는 방법이다. https://needjarvis.tistory.com/535 R 버전 업그레이드하기 R의 버전을 업데이트하기 위해서

chagaun-omija.tistory.com

 

read.spss(file="파일명", to.data.frame = T) 함수를 통해 데이터 파일을 불러와 raw_welfare에 저장해주었다. raw 파일을 만든 이유는 나중에 이 파일 원본을 계속 사용할 수 있도록 만든것. welfare에 raw_welfare를 복사해준다. 이 welfare 데이터프레임으로 데이터 분석을 할 것 이다.

※ read.spss()함수 안에 to.data.frame 패러미터를 T(true)로 해줘야 데이터 프레임으로 여지껏 배운 것들을 사용할 수 있다!

#sav는 spss 전용 파일이다 -> foeign package 이용해야함

install.packages("foreign")
install.packages("ggplot2")
install.packages("dplyr")
install.packages("readxl")
library(ggplot2)
library(dplyr)
library(foreign)
library(readxl)

raw_welfare <- read.spss(file = "Koweps_hpda15_2020_beta1.1.sav",
                         to.data.frame=T)
head(raw_welfare)

 

2. 데이터 특성 파악

데이터 전처리를 하기 전에 이 데이터가 어떤 데이터인지 알아야 한다. Koweps_hpc10_2015_beta1.sav 파일은 '한국복지패널데이터'로 전국 7000여 가구의 데이터로 2006년부터 경제활동, 생활실태, 복지 욕구 등 천 여개의 변수로 구성된 데이터이다.

 

위와 같이 head(), tail(), dim(), View(), str(), summary() 등의 함수로 welfare 데이터 프레임을 살펴본다. 하지만 변수가 너무 많아서 이 함수들만으로는 충분히 데이터를 파악할 수가 없다. 따라서 데이터와 함께 주어진 설명서를 봐야 한다.

 

보통 데이터와 함께 이 데이터에 대한 설명서를 같이 주는데 이번 프로젝트에서 사용할 안내서(코드북)은 다음 세 개 이다.

 

15차 머지데이터_변수명.xlsx

welfare데이터 프레임에 있는 변수명들이 무엇을 뜻하는지 알려준다.

Koweps_Codebook.xlsx

이건 따로, 이 프로젝트를 위해 만들 codebook 이다. 나중에 code_job이라는 변수를 사용할 때 code_job의 각 code들이 무엇을 뜻하는지 내용이 담겨있다.

 

 

 

3. 데이터 rename

이제 welfare 데이터를 사용하기 좋게 만드는 전처리 작업을 해야한다. 우선 사용할 변수들이 코드로 되어 있으므로, 이를 우리가 알아볼 수 있는 말로 바꿔주는 작업을 한다.

데이터명 <- rename(데이터명, 바꿀이름 = 기존이름)

welfare <- raw_welfare

welfare <- rename(welfare, 
                  sex = h15_g3,
                  edu1 = h15_g6,
                  birth = h15_g4,
                  marriage = h15_g10,
                  income1=h15_pers_income1,
                  code_job = h15_eco9,
                  code_region = h15_reg7)

head(welfare)

 

이제 본격적으로 몇 가지의 주제를 가지고 데이터를 분석해보도록 한다.

 

4. 성별에 따른 월급 차이 분석

성별에 따른 월급 차이를 분석하기 위해서는 성별(sex)와 월급(income) 변수를 사용해야 한다. 이 변수들을 사용하기 전에는 이 변수들을 전처리하는 과정이 필수적이다. 전처리는 알아보기 쉽게 renaming, 이상치 처리, 결측치 처리 등이다.

(1) 우선적으로 sex 변수에 대해 알아보고 전처리를 한다.
### 4.

class(welfare$sex)
table(welfare$sex)

class(), table() 함수를 통해 이 변수가 어떻게 생겼는지를 파악한다. class()함수는 이 변수가 어떤 type인지를 알려준다. 그리고 table()함수는 이 변수가 어떤 항목을 가지고 있는지, 그리고 각 항목 당 몇 개의 instance를 가지고 있는지를 보여준다.

1, 2이라는 항목은 한 번에 알아보기 힘들다. 코드북에 보면 1은 남자, 2는 여자다. 따라서 1을 'male'로, 2를 'female'로 바꿔준다. 이땐 ifelse()를 사용해주었다.

welfare$sex <- ifelse(welfare$sex == 1, "male", "female")
table(welfare$sex)

table을 봤을 때 1, 2 (남자, 여자) 외에는 없으므로 이상치는 없다. NA도 없으므로 결측치도 없다.

 

여기까지 sex에 대한 전처리를 완료했다. 이번에는

(2) income에 대한 전처리를 해준다.

class(welfare$income)
table(welfare$income)
summary(welfare$income)
# NA 가 약 10934임
# 0인 사람은 결측치로 처리한다. 3rd Qu. 값이 5448임을 감안해서 6000이상은 결측치처리
welfare$income <- ifelse(welfare$income <=0|welfare$income>6000, NA, welfare$income)
qplot(welfare$income)
table(is.na(welfare$income))

income의 최댓값은 51840이다. 0 이하는 income도 이상치로 판단하고 이상치인 데이터를 ifelse()함수를 이용해 NA로 바꾸어주었다. 그리고 income변수에 NA가 몇 개인지 확인하기 위해 table(is.na())를 사용해보았다.

 

table을 보면 income은 수가 매우 다양해서 한 눈에 들어오지 않는다. 따라서 summary와 막대그래프를 그려보았다.

 

결측치를 제거하는 일은 filter()를 사용해야 하는데, 결측치 제거는 실질적인 데이터 분석 때 해보기로 한다.

 

(3) 데이터 분석
sex_income <- welfare %>% 
  filter(!is.na(income)) %>% 
  group_by(sex) %>% 
  summarize(mean_income = mean(income))

 

%>% 을 이용해 welfare를 분석하고 추출할 내용을 sex_income이라는 새로운 변수에 저장해주었다. 새로운 변수에 저장하는 이유는 나중에 이것을 가지고 그래프를 그릴 수 있도록 하기 위해서이다.

 

(1) 우선 filter(!is.na())를 이용해서 결측치를 제거해주었다.

(2) 그리고 sex로 그룹을 나누어서

(3) summarize(mean())을 이용해서 sex별 income의 평균을 구해 mean_income이라는 sex_income안의 변수에 저장해준다.

 

결과는 다음과 같다.

여자의 평균 월급은 1836, 남자의 평균 월급은 1607 이다. 이번에는 이 결과값으로 그래프를 그려본다.

ggplot(data=sex_income, aes(x=sex, y=mean_income))+geom_col()

5. 나이/연령대/성별에 따른 임금차이 분석

이번에는

 

(1) 나이에 따른 임금 차이 (2) 연령대에 따른 임금차이 (3) 연령대별 성별에 따른 임금차이

 

이렇게 세 가지를 분석해보도록 한다. 이를 한데 묶은 이유는 앞에서 사용한 것들은 뒤에서 계속 사용해야 하기 때문이다. (뒤에 나오겠지만 age 파생변수를 만들고 이를가지고 ageg(연령대) 파생변수를 만들고, 거기에 sex로 구분을 해야하기 때문에)

 

일단 데이터를 불러오는 것, 성별, 임금, 출생년도 등의 변수들을 rename하는 것을 위에서 했으니 생략하고 진행해보기로 한다.

 

1. 'age' 파생변수를 만들고, 나이에 따른 임금 차이 알아보기

주어진 데이터에는 '나이'항목이 따로 존재하지 않는다. 따라서 나이를 나타내는 age라는 파생변수를 직접 만들어 welfare에 추가한다. 이를 위해선 '출생년도 (birth)' 항목을 이용하는데, 파생변수를 만들기 전에 birth 항목을 살펴봐야 한다.

##### 나이에 따른 월급 차이 분석
class(welfare$birth)
table(welfare$birth)
summary(welfare$birth)

#결측치 있는지 확인
table(is.na(welfare$birth))

이번에도 table만 봐서는 알수 없다 (출생년도가 1900년부터 2015년까지이기 때문에) 따라서 summary를 살펴본다.

코드북에 보면 이상치는 9999로 표시했다고 나와있는데, summary에 보면 Max값이 2014이므로 이상치는 없다.

table(is.na())를 통해 봐도 TRUE가 없으므로 결측치도 없다.

 

그럼 이제 파생변수 age를 만들어준다.

welfare$age <- 2021-welfare$birth+1
summary(welfare$age)

이제 나이에 따른 임금을 분석해본다.

income의 결측치를 filter()로 제거해주고, age로 그룹핑한 후에 summarize()를 통해 age별 income의 평균값을 구해 income_mean에 저장해주었다. table()로 age_income을 프린트해보면 age가 너무 다양해서 잘 보이지 않는다. 

age_income <- welfare %>% 
  filter(!is.na(income1)) %>% 
  group_by(age) %>% 
  select(age, income1) %>% 
  summarize(income_mean = mean(income1))
table(age_income)
ggplot(data=age_income, aes(x=age, y=income_mean))+geom_col()

ggplot과 geom_col()을 통해 막대그래프를 그려보면 더 확연히 보인다.

(위의 코드에서 select()는 필요없다.)

 

2. ageg 파생변수 생성 & 연령대별 임금차이 분석하기
table(welfare$age)
welfare$ageg <- ifelse(welfare$age >= 60, "old", ifelse(welfare$age>=30, "middle", "young"))
table(welfare$ageg)

연령대별 소득을 알아보기 위해서 연령대를 나타내는 파생변수 'ageg'를 만들어본다. ageg를 만들어낼 age 변수는 위에서 다 확인했고 이상치, 결측치 모두 없으므로 age의 전처리는 생략한다.

 

60세 이상은 old

30세이상 60세 미만은 middle

30세 미만은 young

 

ageg에 위의 세 type을 넣기 위해 ifelse()문을 중복했다.

ageg 파생변수가 잘 만들어졌는지 확인하기 위해 table() 함수를 이용해 확인해보았다.

filter()를 이용해 income의 결측치를 제거하고

ageg로 그룹핑 한 후

summarize(mean())을 이용해 ageg별 임금 평균을 구해보았다.

 

결과는 다음과 같다 :

 

3. 연령대별 성별에 따른 임금차이 분석하기

이번에는 좀 더 어렵게 연령대, 성별, 임금 세 가지의 변수를 사용하여 분석해본다. 변수들은 이미 위에서 다 전처리가 되었으므로, 분석만 하면 된다.

income의 결측치를 제거하고

ageg_sex_income <- welfare %>% 
  filter(!is.na(income1)) %>% 
  group_by(ageg,sex) %>% 
  summarise(income_mean = mean(income1))
ageg_sex_income
ggplot(data=ageg_sex_income, aes(x=ageg, y=income_mean, fill=sex))+geom_col()+scale_x_discrete(limits=c("young", "middle", "old"))

ageg와 sex 두 가지로 그룹핑 했다

그리고 각 그룹에 대해 임금의 평균을 구해보았다.

이번 그래프는 좀 더 추가된 것이 많다.

aes()안의 fill = sex 색 구분을 sex로 하겠다는 뜻이고,

+scale_x_discrete(limits=c("young", "middle", "old)  young, middle, old 순으로 막대를 그리라는 뜻이다.

 

그래프를 그릴 때 들어갈 수 있는 또 다른 패러미터 몇 개가 더 있다.

 

(1) x=reorder(변수, 기준변수)

region_income <- welfare %>% 
  filter(!is.na(income1)) %>% 
  group_by(code_region) %>% 
  summarize(income_mean = mean(income1))
region_income
ggplot(data=region_income, aes(x=reorder(code_region, income_mean), y=income_mean))+geom_col()

위는 x에 reorder(code_region, income_mean) 이라는 함수를 추가해주었는데, 이는 code_region을 income_mean에 따라 나열하라는 뜻이다.

 

(2) +coord_flip()

ggplot(data=job_female, aes(x=job, y=num))+geom_col()+coord_flip()

위에는 뒤에 +coord_flip() 이라는 설정이 추가되었는데 이는 플롯의 크기에 맞춰 x축과 y축을 조정하라는 뜻이다.

 

포스트가 너무 길어서 1, 2로 나누었음

이후 내용은 [3일차] 실습; 한국 복지 패널 데이터 분석 2 에서 보기

 

 

'언어 > R' 카테고리의 다른 글

6. 실습: 한국 복지 패널 데이터 분석 2  (0) 2021.06.15
[TS] foreign package is not available  (0) 2021.06.15
4. 그래프 그리기  (0) 2021.06.15
3. 데이터 전처리  (0) 2021.06.15
2. 미국 인구 데이터(midwest) 실습  (0) 2021.06.15