천선생의 삶
[Kaggle] 타이타닉 생존자 예측 2부 - Feature Engineering 본문
안녕하세요. 천선생입니다.
1부 시리즈에서는 모든 변수들에 대한 탐색을 진행하고, 특징을 파악하는 EDA를 간단히 진행했습니다.
이번 포스트에서는, 파악한 특징을 기반으로 Feature Engineering 을 진행하도록 하겠습니다!
- Feature Engineering IDEA 정리
Feature Engineering IDEA 1. Age
특정 나이대, 즉 영유아의 생존률이 상대적으로 굉장히 높은 것을 확인할 수 있었습니다.
영유아 여부에 따른 Binomial variable을 만들 수 있을 것 같습니다.
Feature Engineering IDEA 2. SibSp & Parch
동승객에 대한 정보는, 곧 동승그룹에 대한 정보로 치환이 가능합니다.
즉, SibSp + Parch + 1(본인) = 동승그룹의 인원수로 변환이 가능할 것으로 생각됩니다.
Feature Engineering IDEA 3. Ticket
같은 티켓번호를 갖고 있다는 것은, 가까운 사이라는 것을 의미할 것입니다.
즉 티켓번호가 단일일때, 같은 것이 2개(couple)일때, 3개 이상(Family)일때로 나누어 범주화하도록하겠습니다.
Feature Engineering IDEA 4. Fare 1
자료의 분포에 있어서 금액이라는 특성상, 굉장히 큰 값들이 존재합니다.
이 값들의 영향력을 줄이기 위하여 Log-Transformation을 진행하겠습니다.
단, 0인 값이 존재하기때문에 모든 값에 1을 더하고, 변환을 진행하겠습니다.
Feature Engineering IDEA 5. Fare 2
Fare에서 0값을 갖고 있는 몇개의 관측치가 발견되었습니다.
이 관측치를 따로 뽑아 종속변수와의 관계를 확인해본 결과, 생존자의 비율이 작은 것을 확인할 수 있었습니다.
따라서 이 특징을 활용한 Binomial variable을 추가할 수 있을 것 같습니다.
Feature Engineering IDEA 6. Cabin
관측하지 못한 자료가 지나치게 많습니다. 변수 자체의 삭제를 고려해야 할 것 같습니다.
이상으로 6가지의 변수처리 아이디어를 정리하였습니다.
지금부터는, 이에 따른 Feature Engineering을 진행하겠습니다.
그 이전에 Cleansing이 완료된(결측값이 모두 처리된) 데이터를 확인해보겠습니다.
# Clean data 구조 재확인
str(data)
# 'data.frame': 1309 obs. of 11 variables:
# $ PassengerId: int 1 2 3 4 5 6 7 8 9 10 ...
# $ Pclass : Ord.factor w/ 3 levels "1"<"2"<"3": 3 1 3 1 3 3 1 3 3 2 ...
# $ Sex : Factor w/ 2 levels "female","male": 2 1 1 1 2 2 2 2 1 1 ...
# $ Age : num 22 38 26 35 35 ...
# $ SibSp : int 1 1 0 1 0 0 0 3 0 1 ...
# $ Parch : int 0 0 0 0 0 0 0 1 2 0 ...
# $ Ticket : chr "21171" "17599" "3101282" "113803" ...
# $ Fare : num 7.25 71.28 7.92 53.1 8.05 ...
# $ Cabin : Factor w/ 187 levels "","A10","A14",..: 1 83 1 57 1 1 131 1 1 1 ...
# $ Embarked : Factor w/ 3 levels "C","Q","S": 3 1 3 3 3 2 3 3 3 1 ...
# $ Survived : Factor w/ 2 levels "No","Yes": 1 2 2 2 1 1 1 1 2 2 ...
- IDEA1. 영유아 변수 만들기
EDA에서 히스토그램 및 데이터로 확인해본 결과, 5세이하의 그룹을 영유아로 판단하여 Baby 변수를 만들겠습니다.
# Baby 변수 만들기
data$Baby <- as.factor(ifelse((data$Age <= 5), 1, 0))
ifelse함수를 활용하여 간단히 변수를 만드는 모습입니다.
- IDEA.2 구성원수 변수 만들기
SibSp + Parch + 1 = Group_size 인 새로운 변수 Group_size를 선언하겠습니다.
그 이후, Single과 Small 그리고 Large로 Level을 지정하겠습니다.
# Group_size 변수 만들기
data$Group_size <- data$SibSp + data$Parch + 1
# sapply를 활용한 각 변수들의 변환
data$Group_size <- sapply(data$Group_size, function(x) {
if (x == 1) {
res <- 'Single'
} else if(x < 5) {
res <- 'Small'
} else {
res <- 'Large'
}
return(res)
})
# level을 지정한 팩터변수 생성
data$Group_size <- factor(data$Group_size, levels = c('Single', 'Small', 'Large'))
table(data$Group_size)
# Single Small Large
# 790 437 82
범주형 변수를 성공적으로 만들었음을 확인합니다.
- IDEA.3 동일한 티켓번호
티켓번호가 단일일때, 같은 것이 2개(couple)일때, 3개 이상(Family)일때로 나누어 범주화하도록하겠습니다.
미리 저장해둔, not_unique_Ticket 변수를 활용하도록 하겠습니다.
# T_Group 변수 만들기
table(not_unique_Ticket)
# not_unique_Ticket
# 2 3 4 5 6 7 8 11
# 134 49 17 7 4 5 2 1
couple_T <- names(not_unique_Ticket)[not_unique_Ticket == 2]
# couple_T : 동일한 이름이 2개인 티켓의 이름(Ticket 값)
Family_T <- names(not_unique_Ticket)[not_unique_Ticket >= 3]
# Family_T : 동일한 이름이 3개 이상 티켓의 이름(Ticket 값)
# T_Group이라는 변수에서 조건에 해당하는 row에 각 값을 입력합니다.
data$T_Group[data$Ticket %in% couple_T] <- 'Couple_T'
data$T_Group[data$Ticket %in% Family_T] <- 'Family_T'
data$T_Group[is.na(data$T_Group)] <- 'Single_T'
# T_Group 변수를 팩터로 변환합니다.
data$T_Group <- factor(data$T_Group, levels = c('Single_T', 'Couple_T', 'Family_T'))
table(data$T_Group, useNA = 'always')
# Single_T Couple_T Family_T
# 705 268 336 0
# Ticket 변수는 이제 삭제합니다.
data$Ticket <- NULL
T_Group 변수를 성공적으로 생성하고 기존의 Ticket 변수는 삭제하겠습니다.
- IDEA.4 요금 변수분포의 변경
금액이라는 변수의 특성상 한쪽에 치우쳤으며, 굉장히 큰 값들이 많이 존재합니다.
따라서 Log_Transformation을 활용하여 편차를 줄여주도록 하겠습니다.
이때, 0값을 갖는 관측치가 존재하므로 이를 IDEA 5에서 다루도록 합니다.
# Fare 변수의 Log_Transformation
data$Fare <- log(data$Fare + 1)
ggplot(data = data) +
geom_histogram(aes(x = Fare), binwidth = 0.3)
- IDEA.5 요금 변수에서, 0값을 갖는 관측치 분할
요금변수에서 0값을 갖는 관측치가 존재합니다.
이는 승무원의 경우(혹은 무임승차지만 승무원으로 하겠습니다.)로 생각할 수 있습니다.
따라서 0을 갖는 관측치에 대해서, 구분할 수 있게 해주는 Crew 변수를 파생시키겠습니다.
# Crew 변수 만들기
data$Crew[(data$Fare == 0)] <- 1
data$Crew[is.na(data$Crew)] <- 0
data$Crew <- as.factor(data$Crew)
table(data$Crew, useNA = 'always')
# 0 1
# 1292 17 0
- IDEA.6 NA값이 지나치게 많은 변수의 삭제
Cabin 변수는 처음에는 탐색하지 못했지만, 확인결과 NA값이 굉장히 많은 변수임을 확인할 수 있었습니다.
결측치의 비율이 너무 크기때문에 변수자체를 삭제하도록 하겠습니다.
# Cabin 변수 삭제하기
data$Cabin <- NULL
- 마치며
이로써 미리 확인한 변수들에 대하여 Feature Engineering 을 모두 마무리했습니다.
실제로 모형의 성능향상(이 문제의 경우 정확도 향상)을 위하여, 수많은 Feature Engineering 과정을 겪어야 합니다.
그러나 모든 경우를 포스트에 담기 어렵기 때문에 극히 일부분만 진행하였으며,
'이러한 과정으로 분석이 진행된다.' 라는 정도로 받아들이시면 될 것 같습니다.
더욱 깊은 내용을 원하시는 분들은 Kaggle의 타이타닉 페이지로 접속하여, 커널을 읽어보시는 것을 추천드립니다.
이어서 다음 포스트에서는, 정리한 데이터를 기반으로 Modeling이 진행되는 과정에 대해 다루겠습니다.
'Kaggle > Titanic' 카테고리의 다른 글
[Kaggle] 타이타닉 생존자 예측 3부 - Modeling (3) | 2019.07.30 |
---|---|
[Kaggle] 타이타닉 생존자 예측 1부 - EDA(3) (0) | 2019.07.23 |
[Kaggle] 타이타닉 생존자 예측 1부 - EDA(2) (0) | 2019.07.22 |
[Kaggle] 타이타닉 생존자 예측 1부 - EDA(1) (0) | 2019.07.21 |
[Kaggle] 타이타닉 생존자 예측 - 시작하기 전에 해야할 일은? (0) | 2019.07.17 |