Objetivo

El objetivo de este análisis es construir una red neuronal para predecir la supervivencia de los pasajeros del Titanic, utilizando datos sobre su edad, sexo y clase de pasajero. Este caso de estudio clásico nos permitirá explorar la capacidad predictiva de las redes neuronales en un problema de clasificación binaria real e histórico.


Carga de datos

# Cargamos las librerías necesarias
library(readr)
library(neuralnet)
library(ggplot2)
library(corrplot)
library(NeuralNetTools)

# Leemos el dataset del Titanic
datos <- read_csv("DatosTitanicEsp.csv")

# Visualizamos la estructura de los datos
head(datos)
## # A tibble: 6 × 12
##   Numero Vivio ClasePasajero Nombre Sexo   Edad Familiares FamiliaDirecta Ticket
##    <dbl> <dbl>         <dbl> <chr>  <chr> <dbl>      <dbl>          <dbl> <chr> 
## 1      1     0             3 Braun… male     22          1              0 A/5 2…
## 2      2     1             1 Cumin… fema…    38          1              0 PC 17…
## 3      3     1             3 Heikk… fema…    26          0              0 STON/…
## 4      4     1             1 Futre… fema…    35          1              0 113803
## 5      5     0             3 Allen… male     35          0              0 373450
## 6      6     0             3 Moran… male     NA          0              0 330877
## # ℹ 3 more variables: Costo <dbl>, Cabina <chr>, Puerto <chr>

Limpieza y preparación de datos

En primer lugar, verificamos si existen valores faltantes en nuestro conjunto de datos y procedemos a limpiarlos.

# Verificar valores NA en cada columna
cat("Valores NA en variable Vivio:", sum(is.na(datos$Vivio)), "\n")
## Valores NA en variable Vivio: 0
cat("Valores NA en variable Sexo:", sum(is.na(datos$Sexo)), "\n")
## Valores NA en variable Sexo: 0
cat("Valores NA en variable Edad:", sum(is.na(datos$Edad)), "\n")
## Valores NA en variable Edad: 177
cat("Valores NA en variable ClasePasajero:", sum(is.na(datos$ClasePasajero)), "\n")
## Valores NA en variable ClasePasajero: 0
# Eliminar registros con valores NA en la edad
datos <- datos[is.na(datos$Edad) == FALSE, ]

# Verificamos que ya no hay NA's en Edad
cat("Valores NA en variable Edad después de limpieza:", sum(is.na(datos$Edad)))
## Valores NA en variable Edad después de limpieza: 0

Transformación de variables

Necesitamos transformar la variable categórica Sexo a formato numérico para que pueda ser utilizada en la red neuronal.

# Convertir variable Sexo a valores numéricos (0 = hombre, 1 = mujer)
datos$Sexo[datos$Sexo == "male"] = 0
datos$Sexo[datos$Sexo == "female"] = 1

# Asegurarse que la variable sea de tipo numérico
datos$Sexo <- as.numeric(datos$Sexo)

# Visualizar los datos transformados
head(datos)
## # A tibble: 6 × 12
##   Numero Vivio ClasePasajero Nombre  Sexo  Edad Familiares FamiliaDirecta Ticket
##    <dbl> <dbl>         <dbl> <chr>  <dbl> <dbl>      <dbl>          <dbl> <chr> 
## 1      1     0             3 Braun…     0    22          1              0 A/5 2…
## 2      2     1             1 Cumin…     1    38          1              0 PC 17…
## 3      3     1             3 Heikk…     1    26          0              0 STON/…
## 4      4     1             1 Futre…     1    35          1              0 113803
## 5      5     0             3 Allen…     0    35          0              0 373450
## 6      7     0             1 McCar…     0    54          0              0 17463 
## # ℹ 3 more variables: Costo <dbl>, Cabina <chr>, Puerto <chr>

Análisis exploratorio de datos

Analizamos gráficamente la relación entre las variables explicativas y la supervivencia de los pasajeros.

# Visualización de supervivencia por sexo
ggplot(datos, aes(x = factor(Sexo), fill = factor(Vivio))) +
  geom_bar(position = "fill") +
  labs(title = "Tasa de supervivencia por sexo",
       x = "Sexo (0 = Hombre, 1 = Mujer)",
       y = "Proporción",
       fill = "Sobrevivió") +
  scale_fill_manual(values = c("0" = "red", "1" = "green"),
                    labels = c("0" = "No", "1" = "Sí"))

# Visualización de supervivencia por clase de pasajero
ggplot(datos, aes(x = factor(ClasePasajero), fill = factor(Vivio))) +
  geom_bar(position = "fill") +
  labs(title = "Tasa de supervivencia por clase",
       x = "Clase",
       y = "Proporción",
       fill = "Sobrevivió") +
  scale_fill_manual(values = c("0" = "red", "1" = "green"),
                    labels = c("0" = "No", "1" = "Sí"))

# Matriz de correlación
corr <- round(cor(datos[, c("Vivio", "Edad", "Sexo", "ClasePasajero")]), 2)
corrplot(corr, method = "number", type = "upper")


Creación de la red neuronal

Construimos una red neuronal para predecir la supervivencia a partir de las variables edad, sexo y clase de pasajero.

# Crear la red neuronal
red = neuralnet("Vivio ~ Edad + Sexo + ClasePasajero", 
                data = datos, 
                hidden = c(4,2),  # Dos capas ocultas con 4 y 2 neuronas respectivamente
                linear.output = FALSE,  
                act.fct = "logistic")  

# Visualizar la estructura de la red
plotnet(red)


Evaluación del modelo

A continuación, evaluamos la capacidad predictiva de nuestra red neuronal.

# Obtener las predicciones
predicciones = unlist(red$net.result)

# Crear tabla de comparación entre predicciones y valores reales
tabla = data.frame(PREDICCION = round(predicciones),
                   ORIGINAL = datos$Vivio,
                   IGUAL = round(predicciones) == datos$Vivio)

# Mostrar las primeras filas de la tabla
head(tabla)
##   PREDICCION ORIGINAL IGUAL
## 1          0        0  TRUE
## 2          1        1  TRUE
## 3          1        1  TRUE
## 4          1        1  TRUE
## 5          0        0  TRUE
## 6          0        0  TRUE
# Calcular totales de verdaderos y falsos
v <- sum(tabla$IGUAL == TRUE)
f <- sum(tabla$IGUAL == FALSE)
total <- v + f

# Calcular porcentajes
porcentaje_v <- (v / total) * 100
porcentaje_f <- (f / total) * 100

# Mostrar resultados
cat("Porcentaje de predicciones correctas (accuracy):", round(porcentaje_v, 2), "%\n")
## Porcentaje de predicciones correctas (accuracy): 82.49 %
cat("Porcentaje de predicciones incorrectas:", round(porcentaje_f, 2), "%\n")
## Porcentaje de predicciones incorrectas: 17.51 %

Conclusiones

Este análisis ha demostrado cómo podemos utilizar redes neuronales para predecir la supervivencia de los pasajeros del Titanic con una precisión cercana al 80%.

Los principales hallazgos son: - La variable Sexo tiene una fuerte correlación con la supervivencia, lo que confirma la política de “mujeres y niños primero”. - La clase del pasajero también influye significativamente en las probabilidades de sobrevivir. - La edad tiene una influencia más moderada en el resultado.

Este modelo podría mejorarse incluyendo variables adicionales como el número de familiares a bordo o el puerto de embarque, así como ajustando la arquitectura de la red neuronal para optimizar su capacidad predictiva.