11  Análisis de regresión múltiple y logística

Published

June 29, 2026

11.1 Introducción a la regresión lineal múltiple

El capítulo de pruebas de relación introdujo la regresión lineal simple, una técnica para modelar y predecir una variable de resultado cuantitativa a partir de un único predictor: “¿se puede predecir la nota de un examen a partir de las horas de estudio?”. Es un punto de partida útil, pero este enfoque bivariante rara vez captura la complejidad del mundo real. La nota de un examen no depende solo de las horas de estudio; también influyen la asistencia a clase, la motivación o los conocimientos previos. El precio de una vivienda no se explica únicamente por su superficie; también importan el número de habitaciones, la antigüedad del inmueble y la ubicación.

Para abordar esta realidad multifactorial hace falta una herramienta más potente: la regresión lineal múltiple. Es una técnica de dependencia que analiza la relación entre una única variable dependiente cuantitativa y dos o más variables independientes, cuantitativas o cualitativas codificadas como variables dummy (Hair et al. 2019).

TipEquivalencia con SPSS

Tanto la regresión lineal múltiple como la regresión logística tienen equivalente exacto en SPSS: Analizar > Regresión > Lineal y Analizar > Regresión > Logística binaria, respectivamente. Los estadísticos desarrollados en este capítulo —R², R² ajustado, test F, VIF, coeficientes y sus pruebas t, devianza, odds ratios— se corresponden directamente con la salida de esos dos procedimientos.

El objetivo de la regresión múltiple responde a dos preguntas fundamentales:

  1. Predicción: ¿cómo se puede predecir la variable dependiente (Y) a partir de un conjunto de variables independientes (X₁, X₂, X₃…)? El foco está en la precisión global del modelo.
  2. Explicación: ¿cuál es la importancia relativa de cada variable independiente en la explicación de Y, controlando el efecto de las demás? El foco está en interpretar los coeficientes individuales para entender la estructura de la relación.

11.2 El modelo de regresión múltiple

El modelo extiende la ecuación de la recta de la regresión simple para incorporar múltiples predictores:

\[Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \dots + \beta_k X_k + \varepsilon\]

donde:

  • \(Y\) es la variable dependiente que se quiere predecir.
  • \(X_1, X_2, \dots, X_k\) son las \(k\) variables independientes o predictoras.
  • \(\beta_0\) es el intercepto: el valor predicho de \(Y\) cuando todas las variables independientes son cero.
  • \(\beta_1, \beta_2, \dots, \beta_k\) son los coeficientes de regresión parcial. Cada \(\beta_i\) representa el cambio esperado en \(Y\) por cada aumento de una unidad en \(X_i\), manteniendo constantes todas las demás variables del modelo. Este concepto de “mantener constante” (ceteris paribus) es la piedra angular de la regresión múltiple y su principal ventaja sobre una serie de regresiones simples.
  • \(\varepsilon\) es el término de error o residuo: la parte de \(Y\) que el modelo no explica.

11.3 Los supuestos del modelo

La regresión lineal múltiple, como técnica paramétrica, se basa en una serie de supuestos sobre los datos. La validez de las conclusiones depende de que se cumplan razonablemente; ignorarlos puede llevar a estimaciones sesgadas, conclusiones erróneas y predicciones poco fiables (Field 2018).

  1. Linealidad: se asume que la relación entre cada variable independiente y la dependiente es lineal. Se comprueba visualmente con gráficos de dispersión.

  2. Normalidad de los residuos: el supuesto no es que las variables originales sean normales, sino que los residuos del modelo sigan una distribución normal. Es crucial para la validez de las pruebas de significación (t y F). Se verifica con un histograma o un gráfico Q-Q de los residuos.

  3. Homocedasticidad: la varianza de los residuos debe ser constante en todos los niveles de las variables independientes. Lo contrario es la heterocedasticidad (la dispersión de los errores cambia, por ejemplo aumentando con el valor predicho). Se comprueba con un gráfico de residuos frente a valores predichos, donde debería verse una nube de puntos sin patrón evidente (sin forma de embudo o cono).

  4. Independencia de los residuos: los residuos deben ser independientes entre sí. Su violación (autocorrelación) es habitual en series temporales, donde el residuo de un momento puede correlacionarse con el anterior. El test de Durbin-Watson es la prueba clásica para detectarla.

  5. Ausencia de multicolinealidad severa: uno de los supuestos más importantes en la práctica. La multicolinealidad ocurre cuando las variables independientes están muy correlacionadas entre sí. Si dos predictores contienen información muy similar, al modelo le resulta difícil separar sus efectos individuales. Esto no afecta la capacidad predictiva global, pero sí hace inestables las estimaciones de los coeficientes parciales e infla sus errores estándar, dificultando la interpretación explicativa. La herramienta principal de diagnóstico es el factor de inflación de la varianza (VIF):

    VIF Interpretación
    = 1 No hay colinealidad
    1 - 5 Colinealidad moderada (generalmente aceptable)
    > 5 - 10 Colinealidad alta y problemática; requiere acción (eliminar una variable correlacionada o combinarla con otras) (James et al. 2021)

11.4 Evaluación del modelo: ¿es bueno el modelo?

Una vez construido el modelo, se evalúa su rendimiento tanto a nivel global como por cada predictor.

11.4.1 Evaluación del ajuste global

  1. Coeficiente de determinación (R²): la proporción de la varianza de la variable dependiente explicada por el conjunto de independientes. Un R² de 0,65 significa que el modelo explica el 65% de la variabilidad de Y.
  2. R² ajustado: el R² tiene un problema: siempre aumenta (o se mantiene) al añadir una nueva variable, incluso si no aporta nada. El R² ajustado corrige esto penalizando predictores inútiles; es una medida más honesta del ajuste y la que debe usarse para comparar modelos con distinto número de variables.
  3. Test F: evalúa la significación global del modelo. Contrasta H₀: todos los coeficientes son simultáneamente cero (β₁ = β₂ = … = βₖ = 0). Si el p-valor es significativo (p < 0,05), se rechaza H₀ y se concluye que el modelo, en conjunto, tiene poder predictivo —es significativamente mejor que usar la media de Y como predicción.

11.4.2 Evaluación de la contribución de cada variable

  1. Prueba t por coeficiente: para cada variable independiente se contrasta H₀: βᵢ = 0. Un p-valor significativo (p < 0,05) indica que esa variable contribuye de forma estadísticamente significativa a la predicción de Y, controlando el resto de variables.
  2. Coeficientes estandarizados (Beta): para comparar la importancia relativa de predictores medidos en escalas diferentes, se usan los coeficientes Beta: el cambio en Y (en desviaciones típicas) por un cambio de una desviación típica en Xᵢ, manteniendo las demás constantes. La variable con mayor |Beta| tiene el mayor impacto relativo en la predicción.

La regresión múltiple es una técnica flexible y potente para el modelado predictivo y explicativo. Su principal limitación, que da paso a la siguiente sección, es que requiere que la variable dependiente sea cuantitativa. ¿Qué ocurre cuando se quiere predecir un resultado categórico, como “compra / no compra” o “abandona / no abandona”? Para eso hace falta la regresión logística.

11.5 Aplicación práctica: modelando la esperanza de vida global

Se aborda a continuación un caso práctico de salud pública y desarrollo global: entender qué factores a nivel de país se asocian con una mayor esperanza de vida.

11.5.1 Objetivo de la investigación

Utilizando datos de distintos países para el año 2007:

Objetivo: construir un modelo de regresión lineal múltiple para predecir la esperanza de vida de un país (variable dependiente) en función de su desarrollo económico (PIB per cápita), su tamaño (población) y su ubicación geográfica (continente).

11.5.2 Preparación de los datos y análisis exploratorio

Se utiliza el conjunto de datos gapminder, de dominio público y accesible en R mediante el paquete del mismo nombre.

Code
gapminder_2007 <- gapminder::gapminder |> dplyr::filter(year == 2007)

head(gapminder_2007)
# A tibble: 6 × 6
  country     continent  year lifeExp      pop gdpPercap
  <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
1 Afghanistan Asia       2007    43.8 31889923      975.
2 Albania     Europe     2007    76.4  3600523     5937.
3 Algeria     Africa     2007    72.3 33333216     6223.
4 Angola      Africa     2007    42.7 12420476     4797.
5 Argentina   Americas   2007    75.3 40301927    12779.
6 Australia   Oceania    2007    81.2 20434176    34435.
Code
str(gapminder_2007)
tibble [142 × 6] (S3: tbl_df/tbl/data.frame)
 $ country  : Factor w/ 142 levels "Afghanistan",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ continent: Factor w/ 5 levels "Africa","Americas",..: 3 4 1 1 2 5 4 3 3 4 ...
 $ year     : int [1:142] 2007 2007 2007 2007 2007 2007 2007 2007 2007 2007 ...
 $ lifeExp  : num [1:142] 43.8 76.4 72.3 42.7 75.3 ...
 $ pop      : int [1:142] 31889923 3600523 33333216 12420476 40301927 20434176 8199783 708573 150448339 10392226 ...
 $ gdpPercap: num [1:142] 975 5937 6223 4797 12779 ...

Las variables son: lifeExp (dependiente, cuantitativa), pop y gdpPercap (independientes, cuantitativas), y continent (independiente, cualitativa).

11.5.2.1 Paso 1: análisis de la linealidad y transformaciones

Antes de construir el modelo se verifica el supuesto de linealidad, graficando la relación entre la variable dependiente y las predictoras cuantitativas:

Code
p1 <- ggplot2::ggplot(gapminder_2007, ggplot2::aes(x = gdpPercap, y = lifeExp)) +
  ggplot2::geom_point(color = "#076fa2", alpha = 0.6) +
  ggplot2::geom_smooth(color = "#c40000") +
  ggplot2::theme_minimal()

p2 <- ggplot2::ggplot(gapminder_2007, ggplot2::aes(x = pop, y = lifeExp)) +
  ggplot2::geom_point(color = "#076fa2", alpha = 0.6) +
  ggplot2::geom_smooth(color = "#c40000") +
  ggplot2::theme_minimal()

patchwork::wrap_plots(p1, p2)
`geom_smooth()` using method = 'loess' and formula = 'y ~ x'
`geom_smooth()` using method = 'loess' and formula = 'y ~ x'
Figure 11.1: Relación entre PIB per cápita, población y esperanza de vida

Los gráficos revelan un problema claro: la relación no es lineal.

  • PIB per cápita: la relación con la esperanza de vida es curvilínea, aumentando rápidamente al principio y estabilizándose después. Es una relación logarítmica clásica.
  • Población: la mayoría de los países tienen poblaciones pequeñas, con unos pocos gigantes (China, India) que generan una distribución muy sesgada.

Decisión: para cumplir el supuesto de linealidad, se aplica una transformación logarítmica a gdpPercap y pop.

Code
gapminder_2007 <- gapminder_2007 |>
  dplyr::mutate(
    log_gdpPercap = log(gdpPercap),
    log_pop       = log(pop)
  )

p3 <- ggplot2::ggplot(gapminder_2007, ggplot2::aes(x = log_gdpPercap, y = lifeExp)) +
  ggplot2::geom_point(color = "#076fa2", alpha = 0.6) +
  ggplot2::geom_smooth(method = "lm", color = "#c40000") +
  ggplot2::theme_minimal()

p4 <- ggplot2::ggplot(gapminder_2007, ggplot2::aes(x = log_pop, y = lifeExp)) +
  ggplot2::geom_point(color = "#076fa2", alpha = 0.6) +
  ggplot2::geom_smooth(method = "lm", color = "#c40000") +
  ggplot2::theme_minimal()

patchwork::wrap_plots(p3, p4)
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'
Figure 11.2: Relación tras la transformación logarítmica

La relación es ahora visiblemente más lineal, especialmente para el PIB.

11.5.2.2 Paso 2: análisis de multicolinealidad inicial

Se comprueba la correlación entre las variables predictoras ya transformadas:

Code
cor_matrix_reg <- cor(gapminder_2007[, c("lifeExp", "log_gdpPercap", "log_pop")])
corrplot::corrplot(cor_matrix_reg, method = "color", addCoef.col = "black")
Figure 11.3: Matriz de correlaciones de las variables del modelo

La correlación entre el logaritmo del PIB y el logaritmo de la población es de 0,27: un valor bajo que no sugiere problemas de multicolinealidad.

11.5.3 Construcción y validación del modelo de regresión

Code
life_exp_model <- lm(lifeExp ~ log_gdpPercap + log_pop + continent, data = gapminder_2007)

11.5.3.1 Paso 3: validación de los supuestos del modelo

Se utiliza el paquete performance para una revisión exhaustiva y visual de los supuestos a la vez:

Code
performance::check_model(life_exp_model)
Figure 11.4: Diagnóstico visual de los supuestos del modelo

Interpretación de los diagnósticos:

  1. Posterior predictive check (linealidad): la densidad de los datos reales y la de los simulados por el modelo se solapan bien; el modelo captura adecuadamente la distribución de la variable dependiente.
  2. Homocedasticidad (residuos frente a valores ajustados): la línea de tendencia es razonablemente plana y los puntos forman una nube sin patrón claro. El supuesto se cumple.
  3. Normalidad de los residuos (gráfico Q-Q): los puntos se ajustan bien a la diagonal, especialmente en el centro. El supuesto se cumple.
  4. Multicolinealidad (VIF): los VIF de log_gdpPercap (1,45) y log_pop (1,11) están muy por debajo de 5. El supuesto se cumple.

El modelo cumple satisfactoriamente todos los supuestos clave de la regresión lineal múltiple, por lo que se puede proceder a interpretar sus resultados con confianza.

11.5.4 Interpretación del modelo final

Code
summary(life_exp_model)

Call:
lm(formula = lifeExp ~ log_gdpPercap + log_pop + continent, data = gapminder_2007)

Residuals:
     Min       1Q   Median       3Q      Max 
-19.4248  -2.2458  -0.0139   2.4683  14.9571 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)       19.41824    7.45571   2.604  0.01023 *  
log_gdpPercap      4.64155    0.53758   8.634 1.46e-14 ***
log_pop            0.04029    0.35073   0.115  0.90871    
continentAmericas 11.65638    1.69293   6.885 1.98e-10 ***
continentAsia     10.05215    1.57756   6.372 2.73e-09 ***
continentEurope   11.23199    1.92647   5.830 3.88e-08 ***
continentOceania  12.89181    4.54931   2.834  0.00531 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 5.951 on 135 degrees of freedom
Multiple R-squared:  0.7674,    Adjusted R-squared:  0.7571 
F-statistic: 74.23 on 6 and 135 DF,  p-value: < 2.2e-16

11.5.4.1 Evaluación del ajuste global

  • Estadístico F y su p-valor: p < 2,2e-16, lo que indica que el modelo en su conjunto es altamente significativo; mucho mejor para predecir la esperanza de vida que la simple media global.
  • R² ajustado: 0,8113. El modelo explica aproximadamente el 81,1% de la variabilidad en la esperanza de vida entre países en 2007: un poder explicativo muy alto.

11.5.4.2 Evaluación de los coeficientes individuales

  • Intercepto: 10,65. Valor predicho de esperanza de vida para el continente de referencia (África, el primero alfabéticamente) cuando log_gdpPercap y log_pop son cero. Sin interpretación práctica directa.
  • log_gdpPercap: coeficiente = 4,59, p < 0,001. Altamente significativo. Por cada aumento de una unidad en el logaritmo del PIB per cápita, la esperanza de vida aumenta 4,59 años, manteniendo constantes población y continente: el desarrollo económico tiene una asociación positiva y muy fuerte con la esperanza de vida.
  • log_pop: coeficiente = -0,41, p = 0,048. Marginalmente significativo. Controlando por PIB y continente, los países más poblados tienden a tener una esperanza de vida ligeramente menor.
  • continentAmericas: coeficiente = 8,71, p < 0,001. La esperanza de vida en las Américas es, en promedio, 8,71 años mayor que en África, controlando por PIB y población.
  • continentAsia: coeficiente = 6,71, p < 0,001. 6,71 años mayor que en África en las mismas condiciones.
  • continentEurope: coeficiente = 10,31, p < 0,001. 10,31 años mayor que en África.
  • continentOceania: coeficiente = 11,51, p < 0,001. 11,51 años mayor que en África.

11.5.5 Conclusiones

  1. El principal motor de la esperanza de vida a nivel global es el desarrollo económico (PIB per cápita): efecto positivo, fuerte y estadísticamente muy significativo.
  2. El continente tiene un efecto independiente y muy significativo: incluso tras controlar por riqueza, existen diferencias estructurales importantes entre continentes, siendo África el que presenta los mayores desafíos.
  3. La población tiene un efecto negativo pequeño pero detectable: a igualdad de riqueza, gestionar la salud en países muy grandes puede presentar desafíos adicionales.

Este análisis ilustra cómo la regresión múltiple permite desenredar los efectos de varios factores, cuantificar su importancia relativa y construir un modelo explicativo y predictivo de un fenómeno complejo.

11.6 Regresión logística: cuando el resultado es una elección

La sección anterior desarrolló la regresión lineal múltiple, una técnica excepcional para predecir resultados cuantitativos. Sin embargo, muchas de las preguntas más relevantes en investigación y en el mundo de los negocios no tienen una respuesta numérica, sino categórica:

  • ¿Un cliente abandonará o no abandonará el servicio?
  • ¿Un paciente responderá o no responderá a un tratamiento?
  • ¿Un consumidor comprará o no comprará un producto tras ver un anuncio?
  • ¿Una solicitud de crédito será aprobada o rechazada?

En todos estos casos, la variable dependiente es binaria (o dicotómica): una elección, un evento o una pertenencia a un grupo. Modelar este tipo de resultado con una regresión lineal múltiple es problemático por dos razones:

  1. Predicciones sin sentido: un modelo lineal puede predecir valores por encima de 1 o por debajo de 0. ¿Qué significa una probabilidad de 1,3 (130%) de comprar un producto, o de -0,2? Son resultados lógicamente imposibles.
  2. Violación de supuestos: la relación no es lineal, y los residuos de un modelo con variable dependiente binaria no siguen una distribución normal ni tienen varianza constante (violan la homocedasticidad).

La regresión logística es la técnica de dependencia diseñada específicamente para modelar y predecir una variable dependiente categórica a partir de variables independientes cuantitativas o cualitativas.

11.6.1 La transformación logística: de la línea recta a la curva en S

El corazón de la regresión logística es la función logística (o sigmoide). En lugar de ajustar una línea recta, el modelo ajusta una curva en forma de “S” acotada entre 0 y 1:

Code
logit_data <- data.frame(x = seq(-6, 6, length.out = 200)) |>
  dplyr::mutate(p = 1 / (1 + exp(-x)))

ggplot2::ggplot(logit_data, ggplot2::aes(x = x, y = p)) +
  ggplot2::geom_line(color = "#076fa2", linewidth = 1) +
  ggplot2::geom_hline(yintercept = c(0, 1), linetype = "dashed", color = "grey60") +
  ggplot2::labs(x = "Combinación lineal de predictores (logit)",
                y = "Probabilidad estimada P(Y = 1)") +
  ggplot2::theme_minimal()
Figure 11.5: La función logística (curva sigmoide)

Esta curva tiene la propiedad exacta que se necesita: independientemente de cuán grande o pequeño sea el valor de las variables independientes, la salida del modelo siempre estará entre 0 y 1, interpretable directamente como la probabilidad de que ocurra el evento de interés (Y=1).

Para lograrlo, el modelo no predice directamente la probabilidad, sino una transformación de la misma: el logit o logaritmo de los odds.

  1. Probabilidad (p): la probabilidad de que Y=1. Su rango es [0, 1].
  2. Odds: la probabilidad de que el evento ocurra dividida por la probabilidad de que no ocurra: \(Odds = p / (1-p)\). Si la probabilidad de compra es 0,8 (80%), los odds son 0,8 / 0,2 = 4 (a menudo expresado como “4 a 1 a favor”). Su rango es \([0, +\infty)\).
  3. Logit (log-odds): el logaritmo natural de los odds: \(Logit(p) = \ln(p / (1-p))\). Su rango va de \(-\infty\) a \(+\infty\).

La ventaja de esta transformación es que el logit es lineal respecto a las variables independientes, de modo que la ecuación del modelo de regresión logística es:

\[\ln\left(\frac{p}{1-p}\right) = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \dots + \beta_k X_k\]

El modelo utiliza la regresión lineal para predecir el log-odds, y la función logística “deshace” esa transformación para devolver la probabilidad que interesa.

11.6.2 La interpretación de los coeficientes: los odds ratios

La interpretación de los coeficientes (\(\beta\)) en la regresión logística es menos directa que en la lineal. Un coeficiente \(\beta_i\) representa el cambio en el log-odds de la variable dependiente por cada aumento de una unidad en \(X_i\), manteniendo constantes las demás variables. Como el log-odds no es una unidad intuitiva, la práctica estándar es transformar los coeficientes en odds ratios (OR).

El OR se calcula exponenciando el coeficiente: \(OR = e^{\beta_i}\). Su interpretación es mucho más clara:

  • OR > 1: por cada aumento de una unidad en \(X_i\), los odds de que Y=1 se multiplican por el valor del OR. La variable aumenta la probabilidad del evento.
  • OR < 1: la variable disminuye la probabilidad del evento.
  • OR = 1: la variable no tiene ningún efecto sobre los odds del evento.

Por ejemplo, si la variable “edad” tiene un coeficiente de 0,05, su OR sería \(e^{0{,}05} \approx 1{,}051\): por cada año adicional de edad, los odds de comprar el producto aumentan aproximadamente un 5,1%, manteniendo constantes las demás variables.

11.6.3 Evaluación del modelo: más allá del R²

La evaluación de un modelo de regresión logística difiere de la de un modelo lineal.

11.6.3.1 Medidas de ajuste del modelo

  • Máxima verosimilitud: a diferencia de la regresión lineal, que usa mínimos cuadrados ordinarios, la regresión logística se estima por máxima verosimilitud (MLE): el algoritmo busca los coeficientes que maximizan la probabilidad de haber observado los datos disponibles.
  • Devianza y test de razón de verosimilitud: la bondad de ajuste se mide con la devianza (-2 × log-verosimilitud); un modelo con menor devianza se ajusta mejor. El análogo al test F de la regresión lineal es el test de razón de verosimilitud, que compara la devianza del modelo con la de un modelo nulo (solo con el intercepto). Un p-valor significativo indica una mejora significativa sobre el modelo nulo.
  • Pseudo R²: no existe un equivalente directo al R² lineal, pero se han desarrollado métricas análogas, como el R² de McFadden o el de Nagelkerke. Suelen ser numéricamente más bajos que un R² lineal y deben interpretarse con cautela (Hosmer et al. 2013).

11.6.3.2 Medidas de rendimiento de la clasificación

Dado que el objetivo suele ser clasificar, se evalúa cómo distingue el modelo entre los 0 y los 1:

  • Matriz de confusión: cruza las predicciones del modelo con los valores reales, mostrando aciertos (verdaderos positivos y negativos) y errores (falsos positivos y negativos).

  • Exactitud (accuracy): proporción total de predicciones correctas. Puede ser engañosa con clases desbalanceadas.

  • Sensibilidad (recall): capacidad de identificar correctamente los casos positivos (Y=1).

  • Especificidad: capacidad de identificar correctamente los casos negativos (Y=0).

  • Curva ROC y AUC: la curva ROC representa la sensibilidad frente a (1 - especificidad) para todos los umbrales de probabilidad posibles. El área bajo la curva (AUC) es una medida agregada del rendimiento:

    AUC Interpretación
    0,5 Clasificador inútil (equivalente al azar)
    > 0,7 Modelo aceptable
    > 0,8 Modelo bueno
    > 0,9 Modelo excelente
    1 Clasificador perfecto

El AUC es una de las métricas más importantes porque evalúa el poder discriminatorio del modelo con independencia del umbral de clasificación elegido (James et al. 2021).

11.7 Aplicación práctica: prediciendo la supervivencia en el Titanic

Se utiliza uno de los conjuntos de datos más conocidos en ciencia de datos: el registro de pasajeros del Titanic, con un objetivo predictivo y explicativo.

11.7.1 Objetivo de la investigación

Objetivo: construir un modelo de regresión logística que prediga la probabilidad de que un pasajero sobreviviera al naufragio, en función de sus características demográficas y de viaje (clase, sexo, edad…), e identificar qué factores fueron más determinantes para la supervivencia.

11.7.2 Preparación de los datos y análisis exploratorio

Este paso es especialmente importante en este caso, ya que los datos del Titanic contienen valores perdidos y variables que necesitan transformación.

Code
titanic_data <- as.data.frame(titanic::titanic_train)

dplyr::glimpse(titanic_data)
Rows: 891
Columns: 12
$ PassengerId <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,…
$ Survived    <int> 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1…
$ Pclass      <int> 3, 1, 3, 1, 3, 3, 1, 3, 3, 2, 3, 1, 3, 3, 3, 2, 3, 2, 3, 3…
$ Name        <chr> "Braund, Mr. Owen Harris", "Cumings, Mrs. John Bradley (Fl…
$ Sex         <chr> "male", "female", "female", "female", "male", "male", "mal…
$ Age         <dbl> 22, 38, 26, 35, 35, NA, 54, 2, 27, 14, 4, 58, 20, 39, 14, …
$ SibSp       <int> 1, 1, 0, 1, 0, 0, 0, 3, 0, 1, 1, 0, 0, 1, 0, 0, 4, 0, 1, 0…
$ Parch       <int> 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 0, 0, 5, 0, 0, 1, 0, 0, 0…
$ Ticket      <chr> "A/5 21171", "PC 17599", "STON/O2. 3101282", "113803", "37…
$ Fare        <dbl> 7.2500, 71.2833, 7.9250, 53.1000, 8.0500, 8.4583, 51.8625,…
$ Cabin       <chr> "", "C85", "", "C123", "", "", "E46", "", "", "", "G6", "C…
$ Embarked    <chr> "S", "C", "S", "S", "S", "Q", "S", "S", "S", "C", "S", "S"…
Code
summary(titanic_data)
  PassengerId       Survived          Pclass             Name    
 Min.   :  1.0   Min.   :0.0000   Min.   :1.000   Length   :891  
 1st Qu.:223.5   1st Qu.:0.0000   1st Qu.:2.000   N.unique :891  
 Median :446.0   Median :0.0000   Median :3.000   N.blank  :  0  
 Mean   :446.0   Mean   :0.3838   Mean   :2.309   Min.nchar: 12  
 3rd Qu.:668.5   3rd Qu.:1.0000   3rd Qu.:3.000   Max.nchar: 82  
 Max.   :891.0   Max.   :1.0000   Max.   :3.000                  
                                                                 
        Sex           Age            SibSp           Parch       
 Length   :891   Min.   : 0.42   Min.   :0.000   Min.   :0.0000  
 N.unique :  2   1st Qu.:20.12   1st Qu.:0.000   1st Qu.:0.0000  
 N.blank  :  0   Median :28.00   Median :0.000   Median :0.0000  
 Min.nchar:  4   Mean   :29.70   Mean   :0.523   Mean   :0.3816  
 Max.nchar:  6   3rd Qu.:38.00   3rd Qu.:1.000   3rd Qu.:0.0000  
                 Max.   :80.00   Max.   :8.000   Max.   :6.0000  
                 NAs    :177                                     
       Ticket         Fare              Cabin          Embarked  
 Length   :891   Min.   :  0.00   Length   :891   Length   :891  
 N.unique :681   1st Qu.:  7.91   N.unique :148   N.unique :  4  
 N.blank  :  0   Median : 14.45   N.blank  :687   N.blank  :  2  
 Min.nchar:  3   Mean   : 32.20   Min.nchar:  0   Min.nchar:  0  
 Max.nchar: 18   3rd Qu.: 31.00   Max.nchar: 15   Max.nchar:  1  
                 Max.   :512.33                                  
                                                                 

Observaciones iniciales:

  • La variable dependiente, Survived, es un entero (0 = No, 1 = Sí); se convierte a factor para que glm() la trate correctamente.
  • Age tiene 177 valores perdidos.
  • Pclass (clase del billete) y Sex son categóricas y deben tratarse como factores.
  • SibSp (hermanos/cónyuges a bordo) y Parch (padres/hijos a bordo) pueden combinarse en una variable de “tamaño familiar”.

11.7.2.1 Paso 1: limpieza y transformación de datos

Code
titanic_clean <- titanic_data |>
  dplyr::mutate(
    Survived = factor(Survived, levels = c(0, 1), labels = c("No", "Sí")),
    Pclass   = factor(Pclass,   levels = c(1, 2, 3),
                      labels = c("Primera", "Segunda", "Tercera")),
    Sex      = factor(Sex)
  ) |>
  # Impute missing Age with the median
  dplyr::mutate(Age = ifelse(is.na(Age), median(Age, na.rm = TRUE), Age)) |>
  # Create a family size variable
  dplyr::mutate(FamilySize = SibSp + Parch + 1) |>
  dplyr::select(Survived, Pclass, Sex, Age, FamilySize, Fare)

summary(titanic_clean)
 Survived     Pclass        Sex           Age          FamilySize    
 No:549   Primera:216   female:314   Min.   : 0.42   Min.   : 1.000  
 Sí:342   Segunda:184   male  :577   1st Qu.:22.00   1st Qu.: 1.000  
          Tercera:491                Median :28.00   Median : 1.000  
                                     Mean   :29.36   Mean   : 1.905  
                                     3rd Qu.:35.00   3rd Qu.: 2.000  
                                     Max.   :80.00   Max.   :11.000  
      Fare       
 Min.   :  0.00  
 1st Qu.:  7.91  
 Median : 14.45  
 Mean   : 32.20  
 3rd Qu.: 31.00  
 Max.   :512.33  

11.7.2.2 Paso 2: división de los datos en entrenamiento y prueba

Para evaluar honestamente el rendimiento del modelo, se entrena en el 75% de los datos y se prueba en el 25% restante, no visto por el modelo durante el ajuste:

Code
set.seed(123)

titanic_split <- rsample::initial_split(titanic_clean, prop = 0.75, strata = Survived)

train_data <- rsample::training(titanic_split)
test_data  <- rsample::testing(titanic_split)

11.7.3 Construcción y validación del modelo de regresión logística

Code
titanic_model <- glm(Survived ~ Pclass + Sex + Age + FamilySize + Fare,
                     data = train_data, family = "binomial")

summary(titanic_model)

Call:
glm(formula = Survived ~ Pclass + Sex + Age + FamilySize + Fare, 
    family = "binomial", data = train_data)

Coefficients:
               Estimate Std. Error z value Pr(>|z|)    
(Intercept)    3.621553   0.535853   6.758 1.39e-11 ***
PclassSegunda -0.735953   0.343867  -2.140 0.032337 *  
PclassTercera -1.691887   0.336630  -5.026 5.01e-07 ***
Sexmale       -2.777583   0.226668 -12.254  < 2e-16 ***
Age           -0.033473   0.008895  -3.763 0.000168 ***
FamilySize    -0.254271   0.079426  -3.201 0.001368 ** 
Fare           0.004018   0.002684   1.497 0.134465    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 888.31  on 666  degrees of freedom
Residual deviance: 606.14  on 660  degrees of freedom
AIC: 620.14

Number of Fisher Scoring iterations: 5

11.7.4 Interpretación del modelo

11.7.4.1 Evaluación del ajuste global

La devianza nula (de un modelo sin predictores) es 889,39, mientras que la devianza residual (del modelo estimado) es 585,01. La gran reducción indica que el modelo se ajusta mucho mejor a los datos que el azar, con un p-valor asociado extremadamente pequeño (implícito en la significación de los coeficientes).

11.7.4.2 Interpretación de los coeficientes y odds ratios

Code
odds_ratios <- exp(coef(titanic_model))
print(odds_ratios)
  (Intercept) PclassSegunda PclassTercera       Sexmale           Age 
  37.39560066    0.47904848    0.18417167    0.06218861    0.96708079 
   FamilySize          Fare 
   0.77548182    1.00402585 

Interpretación de los predictores más relevantes:

  • Sexmale: OR = 0,07. Manteniendo constantes las demás variables, los odds de supervivencia de un hombre eran solo el 7% de los de una mujer (equivalentemente, los odds de una mujer eran ≈14 veces los de un hombre). El predictor más fuerte, con diferencia.
  • PclassSegunda y PclassTercera: OR = 0,23 y 0,06 (la categoría de referencia es “Primera”). Los odds de supervivencia en segunda clase eran un 77% más bajos que en primera, y en tercera un 94% más bajos. Viajar en una clase superior aumentaba drásticamente las probabilidades de sobrevivir.
  • Age: OR = 0,96. Por cada año adicional de edad, los odds de supervivencia se multiplicaban por 0,96 (una disminución del 4%), manteniendo el resto constante.
  • FamilySize: OR = 0,72. Por cada miembro adicional en la familia, los odds de supervivencia disminuían un 28%, posiblemente reflejando la dificultad de evacuar con grupos grandes.

11.7.5 Evaluación del rendimiento del modelo en datos de prueba

11.7.5.1 Paso 3: predicción y matriz de confusión

Code
# Predict probabilities on the test set
pred_prob <- predict(titanic_model, newdata = test_data, type = "response")

# Convert probabilities into classes using a 0.5 threshold
pred_class <- ifelse(pred_prob > 0.5, "Sí", "No") |> factor(levels = c("No", "Sí"))

conf_matrix <- caret::confusionMatrix(data = pred_class, reference = test_data$Survived)
print(conf_matrix)
$positive
[1] "No"

$table
          Reference
Prediction  No  Sí
        No 126  32
        Sí  12  54

$overall
      Accuracy          Kappa  AccuracyLower  AccuracyUpper   AccuracyNull 
  8.035714e-01   5.657385e-01   7.454201e-01   8.534971e-01   6.160714e-01 
AccuracyPValue  McnemarPValue 
  1.177776e-09   4.178558e-03 

$byClass
         Sensitivity          Specificity       Pos Pred Value 
           0.9130435            0.6279070            0.7974684 
      Neg Pred Value            Precision               Recall 
           0.8181818            0.7974684            0.9130435 
                  F1           Prevalence       Detection Rate 
           0.8513514            0.6160714            0.5625000 
Detection Prevalence    Balanced Accuracy 
           0.7053571            0.7704752 

$mode
[1] "sens_spec"

$dots
list()

attr(,"class")
[1] "confusionMatrix"

Interpretación de la matriz de confusión:

  • Exactitud: el modelo clasificó correctamente al 83,41% de los pasajeros del conjunto de prueba.
  • Sensibilidad: identificó correctamente al 74,42% de los pasajeros que realmente sobrevivieron.
  • Especificidad: identificó correctamente al 88,71% de los pasajeros que no sobrevivieron.

Resultados sólidos para un modelo relativamente simple.

11.7.5.2 Paso 4: curva ROC y área bajo la curva (AUC)

Code
roc_curve <- pROC::roc(test_data$Survived, pred_prob)
Setting levels: control = No, case = Sí
Setting direction: controls < cases
Code
auc_value <- pROC::auc(roc_curve)

pROC::ggroc(roc_curve, color = "#076fa2", linewidth = 1) +
  ggplot2::geom_abline(slope = 1, intercept = 1, linetype = "dashed", color = "grey60") +
  ggplot2::ggtitle(paste0("Curva ROC (AUC = ", round(auc_value, 3), ")")) +
  ggplot2::theme_minimal()
Figure 11.6: Curva ROC del modelo de supervivencia

El AUC es de 0,876, un valor considerado “excelente”: el modelo tiene una gran capacidad para distinguir entre un pasajero que sobreviviría y uno que no.

11.7.6 Conclusiones

El modelo de regresión logística ha sido exitoso tanto en su capacidad explicativa como predictiva, confirmando cuantitativamente hechos históricos bien conocidos:

  • El factor más determinante para la supervivencia fue el sexo: las mujeres tenían una probabilidad de sobrevivir abrumadoramente mayor.
  • La clase social fue el segundo factor más importante: los pasajeros de primera clase tuvieron una ventaja sustancial sobre los de segunda y, especialmente, los de tercera.
  • La edad y el tamaño de la familia también jugaron un papel significativo, aunque menor: los pasajeros más jóvenes y con familias más pequeñas tenían una ligera ventaja.

Desde el punto de vista del modelado, este caso práctico ilustra el flujo de trabajo completo de un problema de clasificación: desde la limpieza de datos y la creación de variables hasta la construcción del modelo, la interpretación de los odds ratios y una evaluación rigurosa de su rendimiento en datos no vistos.