천선생의 삶
[Kaggle] 타이타닉 생존자 예측 1부 - EDA(2) 본문
안녕하세요. 천선생입니다.
지난 포스트에서는 Survived, PassengerId, Pclass, Name 변수에 대한 탐색을 다뤘는데요.
지나셨다면 링크를 통하여 확인하시길 바랍니다!
이번 포스트에서는 Sex, Age, Sibsp / Parch 변수에 대한 탐색을 다루도록 하겠습니다.
- Sex : 성별
Sex 변수는 각 승객의 성별을 의미합니다. 즉 factor로 올바른 형태를 갖고있습니다.
# 성별별 빈도수를 확인하겠습니다.
table(data$Sex)
# 남성이 여성에 비해 2배가량의 인원인 것으로 확인되었습니다. 시각화를 통해 알아보도록 하겠습니다.
ggplot(data = data) +
geom_bar(aes(x = Sex, fill = Sex))
- 종속변수와의 관계
Sex 변수는 범수형 변수입니다. 즉 Cross table과 Chisq.test로 종속변수와의 관계를 확인하도록 하겠습니다.
with(data, table(Sex, Survived))
# Survived
# Sex No Yes
# female 81 233
# male 468 109
with(data, chisq.test(Sex, Survived))
# Pearson's Chi-squared test with Yates' continuity correction
#
# data: Sex and Survived
# X-squared = 260.72, df = 1, p-value < 2.2e-16
#서로 독립이라는 귀무가설을 기각하였습니다. 서로 연관성이 있다고 할 수 있습니다.
종속변수와 연관이 있음을 확인할 수 있습니다.
- Age : 나이
Age 변수는 각 승객의 나이를 의미합니다. Numeric형태를 유지하고 있습니다.
연속형 변수를 탐색하는 경우, 해당 변수의 분포를 이해하는 것이 굉장히 중요합니다.
따라서 Histogram을 통하여 Age변수의 분포를 확인해보도록 하겠습니다.
#bin값을 10 / 1 로 지정하여 2개의 Histogram을 그립니다.
bin_10_age <- ggplot(data = data) +
geom_histogram(aes(x = Age),binwidth = 10) +
labs(title = 'bin : 10')
bin_1_age <- ggplot(data = data) +
geom_histogram(aes(x = Age),binwidth = 1) +
labs(title = 'bin : 1')
# ggplot 객체를 한 페이지에 출력하기 위한 함수입니다.
# gridExtra 패키지에 존재합니다.
grid.arrange(bin_10_age, bin_1_age, ncol = 2)
특정 나이에 많은 사람이 몰려있는 것을 확인할 수 있습니다! 평균값을 확인해보겠습니다.
mean(data$Age)
# [1] 29.88114
# 결측값을 대체할 때 사용한 값에 가장 많이 위치한 분포를 보임을 알 수 있습니다.
특정 나이에 지나치게 몰린 양상은 올바르지 못한 양상이며 이는 결측값을 평균값으로 대치하며 생긴 현상입니다!
즉, 다른 어떠한 방법을 통해 결측값을 대치할 지에 대한 고민이 필요합니다.
주변 값을 참고하여, 결측값을 대치하는 K-nn 알고리즘을 사용하도록 하겠습니다.
# 평균값에 해당하느 Age값을 NA로 다시 반환합니다.
data[which(data$Age == mean(data$Age)), 'Age'] <- NA
# Knn imputation에서 K값은 default인 10을 사용하도록 하겠습니다.
# DMwR 패키지에 존재하는 KnnImputation 함수를 사용하겠습니다.
knn_impute_data <- knnImputation((data %>% select(-Survived)))
knn_impute_data$Survived <- data$Survived
bin_10_age_knn <- ggplot(data = knn_impute_data) +
geom_histogram(aes(x = Age),binwidth = 10) +
labs(title = 'bin : 10')
bin_1_age_knn <- ggplot(data = knn_impute_data) +
geom_histogram(aes(x = Age),binwidth = 1) +
labs(title = 'bin : 1')
grid.arrange(bin_10_age_knn, bin_1_age_knn, ncol = 2)
이전 분포에 비하여, 고르게 결측값을 대치했음을 확인할 수 있습니다.
- 종속변수와의 관계
Age 변수는 수치형 변수입니다. 즉 Boxplot의 확대형인 ViolinPlot을 활용하여 관계를 확인해보겠습니다.
# Knn-Imputation을 진행한 데이터로 분석을 이어갑니다.
data <- knn_impute_data
# 생존여부에 따른 Age의 분포를 비교합니다.
data[1:split_num, ] %>%
ggplot() +
geom_violin(aes(x = Survived, y = Age, fill = Survived))
분포의 차이가 생존여부에 따라서 일정부분 존재함을 확인할 수 있습니다.
이번에는 나이대별로 나누어 생존비율을 비교하도록 하겠습니다.
복잡해 보이지만 dplyr 패키지의 파이프(%>%)연산자를 잘 따라오시면 어렵지 않게 이해하실 수 있을것 같습니다.
#나이대별로 나누어, 생존비율을 비교하도록 합니다.
data[1:split_num, ] %>% #Survived 값을 갖는 데이터만 사용합니다.
mutate(Age_group = cut(Age, c(seq(0, 80, by = 5)))) %>% # Age 변수를 쪼개어 Age_group 변수를 생성합니다.
group_by(Age_group) %>%
summarise(Survive = sum(as.numeric(Survived)-1, na.rm = T), # 각 Age_group별 생존자의 합을 구합니다.
count = n()) %>%
mutate(Survive_rat = Survive / count) %>% # 계산한 Survive와 count를 활용하여 생존자 비율을 구합니다.
ggplot() + # 만들어낸 데이터 프레임을 통하여 Age_group별 비율을 나타내는 barplot을 그립니다.
geom_col(aes(x = Age_group, y = Survive_rat, fill = Age_group)) +
theme(axis.text.x = element_text(angle = 60, # x값들을 기울여 표현합니다.
hjust = 1))
Feature Engineering IDEA 1.
특정 나이대, 즉 영유아의 생존률이 상대적으로 굉장히 높은 것을 확인할 수 있었습니다.
영유아 여부에 따른 binomial variable을 만들 수 있을 것 같습니다.
- SibSp / Parch : 동승객에 대한 정보
SibSp 변수와 Parch 변수는 동승객과의 가족관계에 대한 정보입니다.
다음은 주최측에서 제시해준 2개의 변수의 정보입니다.
SibSp : 동승한 형제자매의 수
- Sibiling = 형제, 자매, 의붓형제, 의붓자매
- Spoust = 남편, 부인 (미망인 혹은 약혼자는 무시한다.)
Parch : 동승한 부모자녀의 수
- Parant = 아버지, 어머니
- Child = 딸, 아들, 의붓딸, 의붓아들
*일부 어린이들은 보모만 동승한 채로 탑승했음 (parch = 0으로 부여)
table 함수를 통하여, 각 변수가 어떻게 생겼는지 확인해보도록 하겠습니다.
# SibSp의 모양을 확인합니다.
table(data$SibSp)
# 0 1 2 3 4 5 8
# 891 319 42 20 22 6 9
# Parch의 모양을 확인합니다.
table(data$Parch)
# 0 1 2 3 4 5 6 9
# 1002 170 113 8 6 6 2 2
Feature Engineering IDEA 2.
동승객에 대한 정보는, 곧 동승그룹에 대한 정보로 치환이 가능합니다.
즉, SibSp + Parch + 1(본인) = 동승그룹의 인원수로 변환이 가능할 것으로 생각됩니다.
- 마치며
이번 포스트에서는 Sex, Age, Sibsp / Parch 변수에 대한 탐색을 다뤘습니다.
다음 포스트에서는 Ticket, Fare, Cabin, Embarked 변수에 대한 탐색을 다루도록 하겠습니다.
또한 Feature Engineering IDEA를 필요한 변수 아래에 적어주었는데요.
이 부분은 EDA가 끝난 이후 2부, Feature Engineering 포스트에서 다시 정리하도록 하겠습니다!
최종 목표를 마지막으로 포스트를 마치도록 하겠습니다.
'타이타닉 데이터의 승객 정보를 활용하여 생존여부를 예측해본다!'
'Kaggle > Titanic' 카테고리의 다른 글
[Kaggle] 타이타닉 생존자 예측 2부 - Feature Engineering (0) | 2019.07.26 |
---|---|
[Kaggle] 타이타닉 생존자 예측 1부 - EDA(3) (0) | 2019.07.23 |
[Kaggle] 타이타닉 생존자 예측 1부 - EDA(1) (0) | 2019.07.21 |
[Kaggle] 타이타닉 생존자 예측 - 시작하기 전에 해야할 일은? (0) | 2019.07.17 |
[Kaggle] 타이타닉 생존자 예측 - 분석을 준비하며 (0) | 2019.07.13 |