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")