Titanic - Quein Sobrevivó? - Parte 1

El Titanic se hundió el 15 de abril de 1912 después de chocar contra un iceberg durante su primer viaje. Desafortunadamente, no había suficientes botes salvavidas a bordo, lo que resultó en la muerte de 1.502 de los 2.224 pasajeros y tripulantes. Cuando el Titanic comenzó su viaje, fue considerado el mejor barco del mundo e insumergible.

Con el paso del tiempo y el análisis de los pasajeros que murieron y sobrevivieron, se descubrió que las personas con ciertas características tenían una mayor probabilidad de supervivencia. Esta publicación responde a estos hallazgos con la intención de crear un modelo de clasificación de árbol de decisión para predecir si alguien a bordo sobrevivió o murió. Por lo tanto, la supervivencia es la variable dependiente. Se utilizan variables independientes que incluyen título, edad, sexo, clase social y puerto de embarque. La publicación se divide en dos partes. La primera parte se centra en la preparación de datos, y la segunda se centra en el análisis de datos y la creación de modelos.

2) Paquetes

Se utilizan los siguientes paquetes.

library(dplyr)
library(tidyr)
library(ggplot2)
library(knitr)
library(DT)
library(purrr)
library(corrplot)
library(randomForest)
library(caret)
library(rpart)
library(rpart.plot)

3) Cargar Datos

En esta publicación se usan dos bases de datos - la primera para entrenar el modelo, y la segunda para ensayarlo.

La idea general de un model de classificación es para usar los datos de entrentenamiento para buscar patrones entre las variables independientes y la variable dependiente, con un modelo siendo creado.

El modelo luego se ensaya contra la segunda base de datos que contiene datos ocultos. Es decir tiene todas las variables independientes pero la variable dependiente se esconde. Cuando se ensaya el modelo contra los datos de ensayo el modelo busca los mismos patrones entre las variables independientes que existen en los datos de entrentamiento y los usa para predecir la variable dependiente.

Ambas bases de datos se pueden descargar.

setwd(dir = "~/Documents/Machine Learning/4. Proyectos/Titanic/data_sets/titanic")

ensayar <- read.csv("test.csv")

entrenar <- read.csv("train.csv")

3.1) Combinar Datos de Entrenamiento y Ensayo

Para poder conducir analisis de fondo ambas bases de datos se combinan en una nueva basede datos llamada total. Para que esto sea possible primero una nueva variable de supervivienca se agrega a la base de ensayar, asegurando que ambas bases de datos tengan 12 variables y se puedan combinar. En total hay 1.309 observaciones y 12 variables. Las variables son:

Variable Descripción
PassengerID Numero de identificación
Survived Sobrevivió (1) or muriò (0)
Pclass Clase social del pasajero
Name Nombre del pasajero
Sex Sexo del pasajero
Age Edad del pasajero
SibSp Numero de hermanos/esposa a bordo
Parch Numero de papas/hijos a bordo
Ticket Numero de pasaje
Fare Tarifa
Cabin Cabina
Embarked Puerto de embarque
ensayar$Survived <- NA

ensayar <- ensayar[,c(1,12,2,3,4,5,6,7,8,9,10,11)]

total <- rbind(entrenar, ensayar)
str(total)
## 'data.frame':    1309 obs. of  12 variables:
##  $ PassengerId: int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Survived   : int  0 1 1 1 0 0 0 0 1 1 ...
##  $ Pclass     : int  3 1 3 1 3 3 1 3 3 2 ...
##  $ Name       : Factor w/ 1307 levels "Abbing, Mr. Anthony",..: 109 191 358 277 16 559 520 629 417 581 ...
##  $ Sex        : Factor w/ 2 levels "female","male": 2 1 1 1 2 2 2 2 1 1 ...
##  $ Age        : num  22 38 26 35 35 NA 54 2 27 14 ...
##  $ 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     : Factor w/ 929 levels "110152","110413",..: 524 597 670 50 473 276 86 396 345 133 ...
##  $ 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/ 4 levels "","C","Q","S": 4 2 4 4 4 3 4 4 4 2 ...

4) Ingeniería de Carecterísticas

En esta sección los datos se preparan para que se puedan analizar mas adelante.

4.1) Valores Faltantes

En la base de datos hay cinco variables con valores faltantes: Cabin, Survivied, Age, Embarked, y Fare. Es necesario abordar estos valores faltantes ya que pueden impactar la efectividad del modelo. La única variable que no se trata para valores faltantes es Survived ya que es la variable dependiente y los valores faltantes corresponden a los datos de ensayo escondidos.

checkAllCols(total)
##            col   class  num numMissing numInfinite      avgVal minVal maxVal
## 1  PassengerId integer 1309          0           0 655.0000000      1   1309
## 2     Survived integer  891        418           0   0.3838384      0      1
## 3       Pclass integer 1309          0           0   2.2948816      1      3
## 4         Name  factor 1309          0          NA          NA     NA     NA
## 5          Sex  factor 1309          0          NA          NA     NA     NA
## 6          Age numeric 1046        263           0  29.8811377      0     80
## 7        SibSp integer 1309          0           0   0.4988541      0      8
## 8        Parch integer 1309          0           0   0.3850267      0      9
## 9       Ticket  factor 1309          0          NA          NA     NA     NA
## 10        Fare numeric 1308          1           0  33.2954793      0    512
## 11       Cabin  factor  295       1014          NA          NA     NA     NA
## 12    Embarked  factor 1307          2          NA          NA     NA     NA

4.2) Age

La tabla anterior muestra que hay 263 valores faltantes para Age (edad). Por lo tanto, se ingresa la edad promedio de todos los pasajeros para todos los valores faltantes.

La siguiente sintaxis se usa para calcular la edad promedio y agregarla a la base de datos. Además, se crea una nueva variable que agrupa las edades en las siguientes clases:

  • Edad < 13
  • Edad >= 13 & Edad < 18
  • Edad >= 18 & Edad < 40
  • Edad >= 40 & Edad < 60
  • Edad >= 60
total <- total %>% mutate(Age = ifelse(is.na(Age), mean(total$Age, na.rm = T), Age), 
                          `Age Group` = case_when(Age < 13 ~ "Age.0012", 

                                 Age >= 13 & Age < 18 ~ "Age.1317",
                                 
                                 Age >= 18 & Age <40 ~ "Age.1839",

                                 Age >= 40 & Age < 60 ~ "Age.4059",

                                 Age >= 60 ~ "Age.60Ov"))

4.3) Emarked

A puesto que hay solo dos observaciones con valores faltantes para Embarked (Puerto de Embarque), se ingresa el punto más común (Southampton) en ambas observaciones.

levels(total$Embarked)
## [1] ""  "C" "Q" "S"
table(total$Embarked)
## 
##       C   Q   S 
##   2 270 123 914
levels(total$Embarked)[1] <- c("S")

4.4) Fare

Hay una observación con un valor faltante en la variable de Fare (tarifa), la que queda en fila 1.044. Es probable que las variables de Pclasss (Clase) y Embarked (Puerto de Embarque) impactaran la variable Fare. Pasajero 1.044 ‘Mr Thomas Storey’ estaba en clase 3 y embarcó en Southampton. Por lo tanto, para remplazar el valor faltante se usa la tarifa promedio para todos los pasajeros que estaban en clase 3 y embarcaron en Southampton. El resultado es £14,44 que se ingresa para observación 1.044.

mean_fare_calculation <- total %>% filter(Pclass == '3' & Embarked == 'S') %>% filter(!PassengerId == 1044)

mean(mean_fare_calculation$Fare)
## [1] 14.43542
total[1044, 10] <- 14.43542

4.5) Name

El nombre de cada pasajero se separa en una nueva variable para Title. La tabla a la continuación muestra que los títulos más comunes eran Master, Miss, Mr, y Mrs con una representación del 97,40% de los pasajeros.

Unos de los títulos menos comunes se agrupan juntos en una nueva clase que se llama ‘rare_title’. Además, los títulos de Mlle y Ms se agregan a la clase de Miss, y el título de Mme se agrega a la clase de Mrs.

total$Title <- gsub('(.*, )|(\\..*)', '', total$Name)

table_titles_total <- table(total$Sex, total$Title)

table_titles_total
##         
##          Capt Col Don Dona  Dr Jonkheer Lady Major Master Miss Mlle Mme  Mr Mrs
##   female    0   0   0    1   1        0    1     0      0  260    2   1   0 197
##   male      1   4   1    0   7        1    0     2     61    0    0   0 757   0
##         
##           Ms Rev Sir the Countess
##   female   2   0   0            1
##   male     0   8   1            0
rare_title <- c('Dona', 'Lady', 'the Countess','Capt', 'Col', 'Don', 
                'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer')

total$Title[total$Title %in% rare_title] <- 'Rare Title'
total$Title[total$Title == 'Mlle'] <- 'Miss'
total$Title[total$Title == 'Ms'] <- 'Miss'
total$Title[total$Title == 'Mme'] <- 'Mrs'

table(total$Sex, total$Title)
##         
##          Master Miss  Mr Mrs Rare Title
##   female      0  264   0 198          4
##   male       61    0 757   0         25

4.6) Familia

Con las variables de SibSp y Parch es possible saber si un pasajero tenía familia en el Titanic. SibSp cuenta hermanos y parejas, y Parch cuenta papas y hijos. Una nueva variable llamada ‘Family_size’ se crea para contar los tomaños de las familias.

total$Family_size <- total$SibSp + total$Parch + 1

4.7) Supervivencia

Como ya se ha explicado la variable de Survived tiene valores faltantes ya que es la variable dependiente, y los valores faltantes son de los datos de ensayo. Por lo tanto, no es necesario abordar los valores faltantes de esta variable. Sin embargo, la tasa de supervivencia para los datos de entrenamiento se analizan.

En la tabla a la continuación se puede ver que hay una tasa de supervivencia del 38,38% en los datos de entrenamiento.

total$group <- ifelse(total$PassengerId <= 891, "entrenar", "ensayar")
total %>% filter(group == "entrenar") %>% group_by(Survived) %>% count() %>% mutate(percentage_all = (n/1309) * 100) %>% mutate(percentage_entrenar = (n/891) * 100)
## # A tibble: 2 x 4
## # Groups:   Survived [2]
##   Survived     n percentage_all percentage_entrenar
##      <int> <int>          <dbl>               <dbl>
## 1        0   549           41.9                61.6
## 2        1   342           26.1                38.4

4.8) Cabin

Cabin (cabina) es la variable con la mayor cantidad de valores faltantes, con 1.014 en total. Por lo tanto, esta variable no se usa en el modelo.

Conclusión

Esta publicación ha introducido este proyecto que tiene el objetivo de crear un modelo de clasificación de árbol de decisión para predecir si alguien en el Titanic sobrevivió o murió. Esta primera parte se ha enfocado en la preparación de los datos, con los datos ahora listos para posterior análisis y creación de modelos. Se guarda la base de datos para su uso en parte dos de este proyecto.

write.csv(total, file = "total2.csv")
James Attwood
James Attwood
Científico de Datos

Relacionado