Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

천선생의 삶

[Kaggle] 타이타닉 생존자 예측 1부 - EDA(2) 본문

Kaggle/Titanic

[Kaggle] 타이타닉 생존자 예측 1부 - EDA(2)

천선생 2019. 7. 22. 12:00

안녕하세요. 천선생입니다.

 

 지난 포스트에서는 Survived, PassengerId, Pclass, Name 변수에 대한 탐색을 다뤘는데요.

지나셨다면 링크를 통하여 확인하시길 바랍니다!

https://cheon9.tistory.com/20

 

[Titanic] 타이타닉 분석하기 1부 - EDA(1)

안녕하세요. 천선생입니다. 타이타닉 분석하기 1부에서는 각 변수를 탐색하며 데이터에 대한 이해도를 쌓고, 전체적인 분석에 대한 계획을 짜기 위하여 진행하는 EDA 에 대한 설명을 하도록 하겠습니다. 이번 포스..

cheon9.tistory.com

이번 포스트에서는 Sex, Age, Sibsp / Parch 변수에 대한 탐색을 다루도록 하겠습니다.

 

- Sex : 성별

 Sex 변수는 각 승객의 성별을 의미합니다. 즉 factor로 올바른 형태를 갖고있습니다.

# 성별별 빈도수를 확인하겠습니다.
table(data$Sex)
# 남성이 여성에 비해 2배가량의 인원인 것으로 확인되었습니다. 시각화를 통해 알아보도록 하겠습니다.


ggplot(data = data) +
    geom_bar(aes(x = Sex, fill = Sex))

출력된 Sex의 Barplot

- 종속변수와의 관계

 Sex 변수는 범수형 변수입니다. 즉 Cross tableChisq.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)

좌 : bin값을 10으로 설정한 그림 / 우 : bin 값을 1로 설정한 그림

 특정 나이에 많은 사람이 몰려있는 것을 확인할 수 있습니다! 평균값을 확인해보겠습니다.

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)

좌 : bin값을 10으로 설정한 그림 / 우 : bin 값을 1로 설정한 그림

 이전 분포에 비하여, 고르게 결측값을 대치했음을 확인할 수 있습니다.

 

- 종속변수와의 관계

 Age 변수는 수치형 변수입니다. 즉 Boxplot의 확대형인 ViolinPlot을 활용하여 관계를 확인해보겠습니다.

# Knn-Imputation을 진행한 데이터로 분석을 이어갑니다.
data <- knn_impute_data

# 생존여부에 따른 Age의 분포를 비교합니다.
data[1:split_num, ] %>%
  ggplot() +
    geom_violin(aes(x = Survived, y = Age, fill = Survived))

생존여부로 나눈 Age의 분포 비교

분포의 차이가 생존여부에 따라서 일정부분 존재함을 확인할 수 있습니다.

 

 이번에는 나이대별로 나누어 생존비율을 비교하도록 하겠습니다.

복잡해 보이지만 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 포스트에서 다시 정리하도록 하겠습니다!

최종 목표를 마지막으로 포스트를 마치도록 하겠습니다.

'타이타닉 데이터의 승객 정보를 활용하여 생존여부를 예측해본다!'

Comments