오랜만에 돌아왔습니다!
책을 다시금 블로그로 포스팅하는데도 되게 오래걸리는 것 같네요,, 물론 쉬엄쉬엄 하기도 했지만!
오늘부터는 책에 있는 데이터 분석 프로젝트에 대해 포스팅을 시작해보려 합니다. 9장 내에 총 9개의 분석 프로젝트가 있어서, 3개의 작은 챕터씩 한 포스트에 다뤄보겠습니다!
#9-1 '한국복지패널데이터' 준비하기
먼저, 9장의 프로젝트를 시작하기 전 '한국복지패널데이터'를 준비하겠습니다!
책에 나와있는 깃허브 혹은 한국복지패널 사이트에 가입 후 데이터를 무료로 다운로드할 수 있습니다. 데이터는 보통의 통계분석 소프트웨어(SPSS, SAS, STATA) 전용 파일로 제공됩니다!
우리는 SPSS 전용 파일을 받았기 때문에 foreign 패키지를 사용하여 SPSS, SAS, STATA 등 다양한 소프트웨어의 파이리을 불러올 수 있습니다!
이와 같이 foreign 패키지를 설치하고, SPSS 파일을 불러오고, 전처리를 위해 dplyr 패키지를 불러오고, 시각화를 위해 ggplot2를, 엑셀 파일을 불러오기 위해 readxl을 사용하면 됩니다!
다음은 데이터를 불러오겠습니다!
foreign 패키지의 read.spss()를 이용해 불러오면 되고, 복사본까지 만들고 사용하겠습니다!
raw_welfare <- read.spss(file = "Koweps_hpc10_2015_beta1.sav",
+ to.data.frame = T) # spss 파일을 데이터 프레임 형태로 변환하는 기능
welfare <- raw_welfare #복사본 만들기
위와 같이 파라미터를 사용하여 SPSS 파일을 데이터 프레임으로 변환하고, 이를 설정하지 않으면 데이터를 리스트 형태로 불러오기 때문에 상황에 맞게 사용할 수 있어야됩니다!
다음은, 분석에 사용할 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)
rename(데이터명, 변경 = 기존)의 형태로 새로 지정해주면 완성되는거 기억하시죠!
이렇게 분석을 하는 데 필요한 준비가 끝났기 때문에, 분석을 하기 전 필요한 단계에 대해 알아보겠습니다!
step1) 변수 검토 및 전처리
가장 먼저 분석에 사용할 변수들을 전처리합니다. 특성을 파악하고 이상치를 정제한 다음 파생변수를 만드는 등 우리가 분석에 활용할 변수 각각에 대해 실시하면 됩니다!
(*전처리는 이상치를 제거하고 우리가 분석에 활용할 데이터들을 얻어내는 것들!)
step2) 변수 간 관계 분석
전처리가 완료되면 복격적으로 변수 간 관계를 파악하는 분석을 합니다. 데이터를 요약한 표를 만든 후 분석 결과를 쉽게 이해할 수 있는 그래프를 만듭니다!
이제 정말 분석을 시작해보겠습니다!
#9-2 성별에 따른 월급 차이 - "성별에 따라 월급이 다를까?"
step1) 변수 검토 및 전처리(성별, 월급)
-변수 검토하기 : class()로 변수의 타입이 정수인지 문자인지 실수인지 파악할 수 있고, table()로 각 범주에 몇 명이 있는지 파악할 수 있습니다.
> class(welfare$sex) #변수 타입 파악 : numeric(정수)
[1] "numeric"
> table(welfare$sex) #범주에 몇 명 있는지 파악, 이상치 파악
1 2
7578 9086
class() 결과 정수임을 알 수 있었고, table() 결과 1이라는 범주에는 7578명, 2라는 범주에는 9086명이 있음을 알 수 있습니다.
-전처리
코드북을 보았을 때, 성별 변수의 값이 1이면 남자, 2면 여자, 모름/무응답은 9로 코딩되어 있음을 알 수 있었습니다.
이 정보를 바탕으로 데이터에 이상치가 있는지 확인하고, 만약 이상치가 존재한다면 결측치로 대체 후 제외하고 분석할 수 있어야 합니다!
이전에 table을 통해 1과 2만 존재함을 알 수 있었고, 만약 이상치가 존재한다면 다음과 같이 코드를 짜면 됩니다!
welfare$sex <- ifelse(welfare$sex == 9, NA, welfare$sex)
table(is.na(welfare$sex))
FALSE
16664
한 번 더 확인을 위해 is.na를 활용할 수 있습니다!
다음은, 1과 2만으로 나타나있는 값들을 각각의 성별 문자에 맞춰 변경해보겠습니다. 두 가지 범주만 존재하기 때문에, ifelse를 활용하여 yes or no의 형태로 바꿔보겠습니다.
welfare$sex <- ifelse(welfare$sex == 1, "male", "female")
> table(welfare$sex)
female male
9086 7578
1일 경우에 male, 그가 아닐 경우에 female로 만들고 table 함수를 활용하여 잘 반영되었는지 확인해보았습니다!
다음은, 월급 변수 검토 및 전처리 과정을 거쳐보겠습니다!
-변수 검토하기
코드북에 월급은 '일한 달의 월 평균 임금'을 의미하면 1만 원 단위로 기록되어 있기에 income 변수를 검토하고 분포를 확인하겠습니다!
성별 변수의 경우 범주 변수(1 or 2)이기 때문에 table()로 확인했지만, 월급의 경우 연속변수이기에 summary()로 요약 통계량을 확인해야 특징을 파악할 수 있습니다!
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
class()를 활용하여 확인한 변수의 타입은 정수, summary()를 활용하여 확인한 요약통계량은 위와 같습니다.
이렇게 많은 데이터의 연속적인 변수의 경우 qplot()으로 그래프를 확인하고, 원하는 양의 데이터만 분석할 줄 알아야합니다.
보시다시피 0~2500까지의 값들을 갖지만, 1000을 기준으로 거의 존재하지 않는 값들이 많기에 이를 1000으로 제한을 두고 분석을 해보겠습니다.
qplot(welfare$income)+
+ xlim(0,1000)
보기도 편하고 월급의 분포가 좀 더 잘 드러나는 것을 확인할 수 있습니다!
-전처리 : 코드북 상에 월급은 1~9998 사이의 값을 지니며, 모름 또는 무응답은 9999로 코딩되어 있다는 것을 알 수 있었습니다.
이를 통해 0 또는 9999의 값은 NA로 처리하고, 이를 제외하고 분석할 수 있어야합니다.
welfare$income <- ifelse(welfare$income == 0 | welfare$income == 9999, NA, welfare$income)
> table(is.na(welfare$income))
FALSE TRUE
4620 12044
이렇게 결측치가 12044개 존재함 을 알 수 있고, 모든 분석이 끝이 났습니다!
이제 이 두 변수들을 활용하여 성별에 따른 월급 평균표를 만들고, 그래프를 통해 확인할 수 있어야합니다.
sex_income <- welfare %>%
+ filter(!is.na(income)) %>%
+ group_by(sex) %>%
+ summarise(mean_income = mean(income))
> sex_income
# A tibble: 2 × 2
sex mean_income
<chr> <dbl>
1 female 163.
2 male 312.
sex_income이라는 새로운 변수명을 지정할 때, welfare 내에서 income에 결측치가 없는 행들을 뽑아내고, 이들을 group_by로 성별에 따라 분리한 후 summarise하면 우리는 새로운 성별에 따른 월급 평균을 알 수 있습니다!
이렇게 분석한 데이터들을 한 눈에 보기 쉽게 ggplot으로 막대 그래프를 만들어보겠습니다.
ggplot(data = sex_income, aes(x = sex, y = mean_income)) + geom_col()
이전에 한 것들이라 상대적으로 쉽게 느껴집니다!
이렇게 분석된 것들을 통해 남자는 312만원, 여자는 163만원의 평균 소득을 가지며, 평균적으로 남성이 더 높다는 것을 알 수 있었습니다!
#9-3 나이와 월급의 관계 - "몇 살 때 월급을 가장 많이 받을까?"
다음은, 나이와 월급의 관계에 대해 분석을 해보겠습니다.
성별과 월급의 관계를 분석한 것과 동일하게 나이와 월급 변수에 대한 검토 및 전처리 절차를 거치고, 요약표를 만든 후 그래프를 확인해보겠습니다!
월급 변수는 이전에 검토 및 전처리 절차를 거쳤기에, 나이 변수에 대한 검토와 전처리 절차를 다뤄보겠습니다!
step1) 나이 변수 검토 및 전처리
- 변수 검토하기
한국복지패널데이터에는 나이 변수는 존재하지 않고, 태어난 연도 변수만 존재합니다! 이를 통해 검토를 하고 전처리 과정에서 우리가 사용할 수 있게끔 연도 변수를 나이로 바꿔야겠다는 생각! 가져야합니다!
class(welfare$birth)
[1] "numeric"
태어난 연도 변수를 class 함수로 알아보았을 때, 정수로 나오는 것을 알 수 있습니다.
다음으로, 연도 변수 또한 연속적인 변수이기 때문에, summary 함수를 통해 그 분포를 알아보는 과정을 거쳐야합니다.
summary(welfare$birth)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1907 1946 1966 1968 1988 2014
5가지 분석 데이터를 얻을 수 있었고, 이를 qplot 함수로 알아보겠습니다.
이렇게 일반적인 변수 검토 과정을 거쳤습니다. 다음은 전처리 과정을 알아보겠습니다.
- 전처리
코드북에는 모름 / 무응답 : 9999를 제외하고 1900~2014까지의 범위를 가진 데이터가 코딩되어있습니다.
이 정보를 통해 결측치가 존재하는 지 확인해보겠습니다.
table(is.na(welfare$birth))
FALSE
16664
빈도를 확인하는 함수인 table 함수와 NA가 존재하는지 확인하는 is.na 함수를 조합하여 결측치의 빈도를 확인한 결과, 결측치는 없는 것을 알 수 있으며, 만약 이상치가 발견된다면, ifelse를 활용하여 결측치로 처리하고 진행하면 됩니다.
welfare$birth <- ifelse(welfare$birth == 9999, NA, welfare$birth)
위와 같은 코드를 활용하여 결측치로 처리하면 됩니다!
이전에도 언급하였듯이 연도 변수만 존재하기 때문에 이 변수를 활용하여 나이라는 파생변수를 만들어야합니다.
단순히 사칙연산을 활용하여 welfare$birth 함수에 연산을 한 후 새로운 welfare$age라는 변수로 하나 만들어보겠습니다.
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
summary를 활용하여 파생변수에 대한 검토 또한 마쳤으며, qplot을 통해 그 분포를 알아보겠습니다.
이렇게 전처리 과정까지 쉽게 마쳤습니다.
step2) 나이와 월급의 관계 분석하기
나이에 따른 월급의 평균표를 만들어야 합니다.
filter 함수를 활용하여 월급에 결측치가 없는 것들을 추출하고, group_by 함수를 활용하여 나이 별로 분리를 진행하고 summarise 함수를 활용하여 나이에 따른 월급의 평균표를 만들면 됩니다.
age_income <- welfare %>%
+ filter(!is.na(income)) %>%
+ group_by(age) %>%
+ summarise(mean_income = mean(income))
head(age_income)
# A tibble: 6 × 2
age mean_income
<dbl> <dbl>
1 20 121.
2 21 106.
3 22 130.
4 23 142.
5 24 134.
6 25 145.
이후 head 함수를 활용하여 6행까지의 대략적인 요약표를 확인할 수 있습니다.
마지막으로 그래프를 만들어야합니다.
나이에 따른 월급을 확인하는 것이기에, 데이터는 방금 만들었던 age_income, x축은 age로, y축을 mean_income으로 지정후 선 그래프를 얻겠습니다.(*나이가 들어감에 따라 월급이 어떻게 변하는 지 확인하는 취지로, 시간에 따른 변화를 알아보는 것이므로 선 그래프를 지정하였습니다.)
ggplot(data = age_income, aes(x = age, y = mean_income)) + geom_line()
이렇게 선 그래프를 만들어 나이에 따른 월급의 변화를 보았을 때, 20대 초반에 100만원 가량에서 40~60대 사이에 높은 분포를 보이면서 이후 감소하는 추세임을 알 수 있었습니다.
다음에 이어서 포스팅하겠습니다!
감사합니다!
'R' 카테고리의 다른 글
데이터 분석 시작기-17 (데이터 분석 프로젝트_3) (0) | 2023.02.07 |
---|---|
데이터 분석 시작기-16 (데이터 분석 프로젝트_2) (0) | 2023.02.06 |
데이터 분석 시작기-14 (그래프 만들기) (0) | 2023.02.01 |
데이터 분석 시작기-13 (데이터 정제- 이상치 제거) (0) | 2023.01.31 |
데이터 분석 시작기-12 (데이터 정제- 결측치 제거 및 대체) (0) | 2023.01.30 |