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.
# 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>
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
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>
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")
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)
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 %
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.