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

Published

October 7, 2025

Code
source("~/R/r-data/16.eda/script.R")

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

En nuestro recorrido por las pruebas de relación, exploramos la regresión lineal simple, una técnica que nos permitía modelar y predecir una variable de resultado cuantitativa a partir de un único predictor. Aprendimos a responder preguntas como: “¿Podemos predecir la nota de un examen a partir de las horas de estudio?”. Si bien es un punto de partida útil, 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 del alumno y sus 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 del barrio.

Para abordar esta realidad multifactorial, necesitamos una herramienta más potente. La regresión lineal múltiple es esa herramienta. Es una técnica de dependencia que nos permite analizar 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).

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

  1. Predicción: ¿Cómo podemos predecir la variable dependiente (Y) a partir de un conjunto de variables independientes (X₁, X₂, X₃…)? Aquí, 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 la variable dependiente, controlando el efecto de las demás? Aquí, 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 = β₀ + β₁X₁ + β₂X₂ + … + βₖXₖ + ε

Donde: * Y es la variable dependiente que queremos predecir. * X₁, X₂, …, Xₖ son las k variables independientes o predictoras. * β₀ es el intercepto o término constante. Representa el valor predicho de Y cuando todas las variables independientes son iguales a cero. * β₁, β₂, …, βₖ son los coeficientes de regresión parcial. Cada coeficiente βᵢ representa el cambio esperado en Y por cada aumento de una unidad en Xᵢ, manteniendo constantes todas las demás variables independientes 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. * ε es el término de error o residuo, que representa la parte de Y que no puede ser explicada por el modelo.

11.3 Los supuestos del modelo: la “revisión médica” de nuestra regresión

La regresión lineal múltiple, como técnica paramétrica, se basa en una serie de supuestos sobre los datos. La validez de nuestras conclusiones depende críticamente de que estos supuestos 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 variable dependiente es lineal. Esto se puede comprobar visualmente mediante gráficos de dispersión parciales.

  2. Normalidad de los Residuos: El supuesto no es que las variables (dependientes o independientes) sean normales, sino que los residuos (ε) del modelo sigan una distribución normal. Esto es crucial para la validez de las pruebas de significancia (t-tests y F-test). Se puede verificar con un histograma o un gráfico Q-Q de los residuos.

  3. Homocedasticidad (Varianza Constante de los Residuos): Se asume que la varianza de los residuos es constante en todos los niveles de las variables independientes. Lo contrario es la heterocedasticidad (cuando la dispersión de los errores cambia, por ejemplo, aumentando a medida que aumenta el valor predicho). Esto se comprueba visualmente con un gráfico de los residuos frente a los valores predichos, donde deberíamos ver una nube de puntos aleatoria sin patrones evidentes (como una forma de embudo o cono).

  4. Independencia de los Residuos: Se asume que los residuos son independientes entre sí. La violación de este supuesto (llamada autocorrelación) es un problema común en datos de series temporales, donde el valor de un residuo en un momento dado puede estar correlacionado con el valor del residuo anterior. El test de Durbin-Watson es una prueba clásica para detectarla.

  5. Ausencia de Multicolinealidad Severa: Este es uno de los supuestos más importantes en la práctica. La multicolinealidad ocurre cuando las variables independientes están altamente correlacionadas entre sí. Si dos predictores contienen información muy similar, al modelo le resulta difícil separar sus efectos individuales sobre la variable dependiente. Esto no afecta la capacidad predictiva global del modelo, pero sí hace que las estimaciones de los coeficientes de regresión parcial (los β) sean muy inestables y sus errores estándar se inflen, lo que dificulta la interpretación explicativa. La principal herramienta para diagnosticarla es el Factor de Inflación de la Varianza (VIF). Un VIF para una variable indica cuánto se infla la varianza de su coeficiente debido a la colinealidad. Las reglas generales son:

    • VIF = 1: No hay colinealidad.
    • 1 < VIF < 5: Colinealidad moderada (generalmente aceptable).
    • VIF > 5 o 10: Colinealidad alta y problemática, que requiere acción (ej. eliminar una de las variables correlacionadas o combinarla con otras) (James et al. 2021).

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

Una vez construido el modelo, debemos evaluar su rendimiento tanto a nivel global como a nivel de cada predictor.

11.4.1 Evaluación del ajuste global del modelo

  1. Coeficiente de Determinación (R²): Es la medida más popular de ajuste. Representa la proporción de la varianza de la variable dependiente que es explicada por el conjunto de variables independientes. Un R² de 0.65 significa que nuestro modelo explica el 65% de la variabilidad en Y.
  2. R² Ajustado: El R² tiene un problema: siempre aumenta (o se mantiene igual) cada vez que añadimos una nueva variable al modelo, incluso si esta no aporta nada. El R² ajustado corrige este problema, penalizando la inclusión de predictores inútiles. Es una medida más honesta del ajuste del modelo y es la que se debe usar para comparar modelos con diferente número de variables.
  3. Test F: Esta prueba evalúa la significancia global del modelo. Contrasta la hipótesis nula de que todos los coeficientes de regresión son simultáneamente iguales a cero (H₀: β₁ = β₂ = … = βₖ = 0). Si el p-valor del test F es significativo (p < 0.05), rechazamos la H₀ y concluimos que nuestro modelo, en su conjunto, tiene poder predictivo; es decir, es significativamente mejor que simplemente usar la media de Y como predicción.

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

  1. Test t para cada Coeficiente: Para cada variable independiente, se realiza un t-test para contrastar la hipótesis nula de que su coeficiente es igual a cero (H₀: βᵢ = 0). Si el p-valor es significativo (p < 0.05), concluimos que esa variable tiene una contribución estadísticamente significativa a la predicción de Y, después de controlar el efecto de las demás variables.
  2. Coeficientes Estandarizados (Beta): Para comparar la importancia relativa de los predictores (que pueden estar medidos en diferentes escalas), se utilizan los coeficientes estandarizados (Beta). Estos coeficientes representan el cambio en Y (en desviaciones estándar) por un cambio de una desviación estándar en Xᵢ, manteniendo las demás constantes. La variable con el coeficiente Beta de mayor valor absoluto es la que tiene un mayor impacto relativo en la predicción.

En resumen, la regresión múltiple es una técnica extraordinariamente flexible y potente para el modelado predictivo y explicativo. Sin embargo, su poder viene acompañado de la responsabilidad de verificar rigurosamente sus supuestos para garantizar que las conclusiones extraídas sean válidas y fiables. Su principal limitación, que da paso a la siguiente sección, es que requiere que la variable dependiente sea cuantitativa. ¿Qué hacemos cuando queremos predecir un resultado categórico, como “compra / no compra” o “abandona / no abandona”? Para eso, necesitaremos la regresión logística.

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

Para este caso práctico, nos convertiremos en analistas de salud pública y desarrollo global. Nuestro objetivo será entender qué factores a nivel de país están asociados con una mayor esperanza de vida.

11.5.1 Objetivo de la investigación

Utilizando datos de diferentes países para el año 2007, el objetivo de este análisis es:

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

Utilizaremos el conjunto de datos gapminder, que es de dominio público y fácilmente accesible en R a través del paquete del mismo nombre.

Code
# Cargamos los datos y filtramos para el año 2007
gapminder_2007 <- gapminder %>% filter(year == 2007)

# Vemos la estructura de nuestros datos
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 ...

Nuestras 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, debemos verificar el supuesto de linealidad. Grafiquemos la relación entre nuestra variable dependiente y las predictoras cuantitativas.

Code
p1 <- ggplot(gapminder_2007, aes(x = gdpPercap, y = lifeExp)) + geom_point() + geom_smooth() + theme_minimal()
p2 <- ggplot(gapminder_2007, aes(x = pop, y = lifeExp)) + geom_point() + geom_smooth() + theme_minimal()

# install.packages("patchwork")
p1 + p2
`geom_smooth()` using method = 'loess' and formula = 'y ~ x'
`geom_smooth()` using method = 'loess' and formula = 'y ~ x'

Interpretación: 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. La esperanza de vida aumenta rápidamente al principio y luego se estabiliza a medida que el PIB crece. Esta 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 crean una distribución muy sesgada.

Decisión: Para corregir esto y cumplir el supuesto de linealidad, aplicaremos una transformación logarítmica a gdpPercap y pop.

Code
gapminder_2007 <- gapminder_2007 %>%
  mutate(
    log_gdpPercap = log(gdpPercap),
    log_pop = log(pop)
  )

# Volvemos a graficar con las variables transformadas
p3 <- ggplot(gapminder_2007, aes(x = log_gdpPercap, y = lifeExp)) + geom_point() + geom_smooth(method = "lm") + theme_minimal()
p4 <- ggplot(gapminder_2007, aes(x = log_pop, y = lifeExp)) + geom_point() + geom_smooth(method = "lm") + theme_minimal()

p3 + p4
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'

¡Mucho mejor! La relación ahora es visiblemente lineal, especialmente para el PIB.

11.5.2.2 Paso 2: análisis de multicolinealidad inicial

Ahora, comprobemos la correlación entre nuestras variables predictoras transformadas.

Code
cor_matrix_reg <- cor(gapminder_2007[, c("lifeExp", "log_gdpPercap", "log_pop")])
corrplot(cor_matrix_reg)

La correlación entre el log del PIB y el log 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

Con los datos preparados, construimos nuestro modelo.

Code
# Construimos el modelo lineal
modelo <- lm(lifeExp ~ log_gdpPercap + log_pop + continent, data = gapminder_2007)

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

Utilizaremos el paquete performance para una revisión exhaustiva y visual de todos los supuestos a la vez.

Code
# Realizamos el chequeo completo del modelo
check_model(modelo)

Interpretación de los diagnósticos: 1. Posterior predictive check (Linealidad): La línea azul (densidad de los datos reales) y las líneas grises (densidades de datos simulados por el modelo) se solapan muy bien. El modelo captura bien la distribución de la variable dependiente. 2. Homocedasticity (Residuals vs. Fitted): La línea roja es razonablemente plana y los puntos forman una nube sin un patrón claro (como un embudo). El supuesto de homocedasticidad se cumple. 3. Normality of Residuals (Q-Q Plot): Los puntos se ajustan muy bien a la línea diagonal, especialmente en el centro. El supuesto de normalidad de los residuos se cumple. 4. Multicollinearity (VIF): Los VIF para log_gdpPercap (1.45) y log_pop (1.11) están muy por debajo de 5. El supuesto de ausencia de multicolinealidad severa se cumple.

Conclusión de la validación: Nuestro modelo cumple satisfactoriamente con todos los supuestos clave de la regresión lineal múltiple. Podemos proceder a interpretar sus resultados con confianza.

11.5.4 Interpretación del modelo final

Ahora, examinemos la salida del modelo para entender los resultados.

Code
summary(modelo)

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 del modelo

  • F-statistic y p-value: El p-valor del test F es < 2.2e-16, lo que indica que el modelo en su conjunto es altamente significativo. Es mucho mejor para predecir la esperanza de vida que simplemente usar la media global.
  • Adjusted R-squared: Su valor es 0.8113. Esto significa que nuestro modelo explica aproximadamente el 81.1% de la variabilidad en la esperanza de vida entre los países en 2007. Este es un poder explicativo muy alto.

11.5.4.2 Evaluación de los coeficientes individuales

  • (Intercept): 10.65. Este es el valor predicho de la esperanza de vida para el continente de referencia (África, ya que es el primero alfabéticamente) cuando log_gdpPercap y log_pop son cero. No tiene una interpretación práctica directa.
  • log_gdpPercap: Coeficiente = 4.59, p-valor < 0.001. Es altamente significativo. Por cada aumento de una unidad en el logaritmo del PIB per cápita, la esperanza de vida aumenta en 4.59 años, manteniendo constantes la población y el continente. En términos simples: el desarrollo económico tiene una asociación positiva y muy fuerte con la esperanza de vida.
  • log_pop: Coeficiente = -0.41, p-valor = 0.048. Es marginalmente significativo (justo por debajo de 0.05). Indica que, controlando por el PIB y el continente, los países más poblados tienden a tener una esperanza de vida ligeramente menor.
  • continentAmericas: Coeficiente = 8.71, p-valor < 0.001. Significativo. 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-valor < 0.001. Significativo. La esperanza de vida en Asia es, en promedio, 6.71 años mayor que en África, controlando por PIB y población.
  • continentEurope: Coeficiente = 10.31, p-valor < 0.001. Significativo. La esperanza de vida en Europa es, en promedio, 10.31 años mayor que en África, controlando por PIB y población.
  • continentOceania: Coeficiente = 11.51, p-valor < 0.001. Significativo. La esperanza de vida en Oceanía es, en promedio, 11.51 años mayor que en África, controlando por PIB y población.

11.5.5 Conclusiones

Nuestro modelo de regresión lineal múltiple ha demostrado ser robusto y tener un gran poder explicativo. Las conclusiones principales son:

  1. El principal motor de la esperanza de vida a nivel global es el desarrollo económico (PIB per cápita). Su efecto es positivo, fuerte y estadísticamente muy significativo.
  2. El continente tiene un efecto independiente y muy significativo. Incluso después de controlar por el nivel de riqueza, existen diferencias estructurales importantes en la esperanza de vida entre continentes, siendo África el que presenta los mayores desafíos.
  3. El tamaño de la población tiene un efecto negativo pequeño pero detectable, sugiriendo que, 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 nos permite desenredar los efectos de múltiples 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

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

  • ¿Un cliente abandonará o no abandonará nuestro 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), representando una elección, un evento o una pertenencia a un grupo. Intentar modelar este tipo de resultado con una regresión lineal múltiple es problemático y conceptualmente erróneo por varias 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 una probabilidad de -0.2? Estos resultados son lógicamente imposibles.
  2. Violación de Supuestos: La relación no es lineal, y los residuos de un modelo con una variable dependiente binaria no siguen una distribución normal ni tienen una varianza constante (violan la homocedasticidad).

Para resolver estos problemas, necesitamos un tipo de modelo de regresión diferente. 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 un conjunto de variables independientes cuantitativas o cualitativas.

11.6.1 La transformación logística: de la línea recta a la curva “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 a los datos, el modelo ajusta una curva en forma de “S” que está acotada entre 0 y 1.

Curva Logística

Esta curva tiene la propiedad perfecta para nuestro propósito: no importa cuán grande o pequeño sea el valor de nuestras variables independientes, la salida del modelo siempre será un valor entre 0 y 1, que puede ser interpretado directamente como la probabilidad de que ocurra el evento de interés (Y=1).

Para lograr esto, 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.
  2. Odds: Se definen como 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, +∞).
  3. Logit (Log-Odds): Es el logaritmo natural de los odds: Logit(p) = ln(p / (1-p)). El rango del logit va de -∞ a +∞.

La gran ventaja de esta transformación es que el logit es lineal con respecto a las variables independientes. Por lo tanto, la ecuación del modelo de regresión logística es:

ln(p / (1-p)) = β₀ + β₁X₁ + β₂X₂ + … + βₖXₖ

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

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

La interpretación de los coeficientes (β) en la regresión logística es menos directa que en la lineal. Un coeficiente βᵢ representa el cambio en el log-odds de la variable dependiente por cada aumento de una unidad en Xᵢ, 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), también conocidos como “razón de momios”.

El Odds Ratio se calcula simplemente exponenciando el coeficiente: OR = exp(βᵢ). Su interpretación es mucho más clara:

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

Por ejemplo, si modelamos la probabilidad de comprar un producto y la variable “edad” tiene un coeficiente de 0.05, su Odds Ratio sería exp(0.05) ≈ 1.051. La interpretación sería: “Por cada año adicional de edad, los odds de comprar el producto aumentan en 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 es diferente a la de un modelo lineal.

11.6.3.1 Medidas de ajuste del modelo

  • Máxima Verosimilitud (Maximum Likelihood): A diferencia de la regresión lineal que usa Mínimos Cuadrados Ordinarios (OLS), la regresión logística se estima mediante Máxima Verosimilitud (MLE). El algoritmo busca los coeficientes (β) que maximizan la probabilidad de haber observado los datos que tenemos.
  • Devianza y Test de Razón de Verosimilitud: La “bondad de ajuste” se mide a través de la devianza (-2 * Log-Likelihood). Un modelo con menor devianza se ajusta mejor a los datos. El análogo al test F global de la regresión lineal es el Test de Razón de Verosimilitud, que compara la devianza de nuestro modelo con la de un modelo nulo (solo con el intercepto). Un p-valor significativo indica que nuestro modelo es una mejora significativa sobre el modelo nulo.
  • Pseudo R²: No existe un equivalente directo al R² en la regresión logística. Sin embargo, se han desarrollado varias métricas análogas, como el R² de McFadden o el R² de Nagelkerke. Estos “Pseudo R²” miden la mejora del modelo sobre el nulo, pero sus valores suelen ser más bajos que los de un R² lineal y deben interpretarse con cautela (Hosmer, Lemeshow, and Sturdivant 2013).

11.6.3.2 Medidas de rendimiento de la clasificación

Dado que el objetivo a menudo es clasificar, evaluamos como el modelo distingue entre los 0s y los 1s.

  • Matriz de Confusión: Es una tabla que cruza las predicciones del modelo con los valores reales. Nos permite ver los Aciertos (Verdaderos Positivos, Verdaderos Negativos) y los Errores (Falsos Positivos, Falsos Negativos).
  • Métricas de Clasificación: A partir de la matriz de confusión, se calculan métricas clave:
    • Accuracy (Exactitud): Proporción total de predicciones correctas. Puede ser engañosa si las clases están desbalanceadas.
    • Sensitivity (Sensibilidad o Recall): Capacidad del modelo para identificar correctamente los casos positivos (Y=1).
    • Specificity (Especificidad): Capacidad del modelo para identificar correctamente los casos negativos (Y=0).
  • Curva ROC y AUC: La Curva ROC (Receiver Operating Characteristic) es un gráfico que 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 del modelo.
    • AUC = 1: Clasificador perfecto.
    • AUC = 0.5: Clasificador inútil (equivalente a lanzar una moneda).
    • AUC > 0.7: Generalmente se considera un modelo aceptable.
    • AUC > 0.8: Se considera un modelo bueno.
    • AUC > 0.9: Se considera un modelo excelente.

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

En resumen, la regresión logística es la herramienta estándar para problemas de clasificación binaria. Nos permite no solo predecir la pertenencia a una categoría, sino también entender qué factores aumentan o disminuyen la probabilidad de que ocurra un evento, convirtiéndola en una técnica fundamental tanto para la predicción como para la inferencia.

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

Para ilustrar el poder y el proceso de la regresión logística, utilizaremos uno de los conjuntos de datos más famosos en el mundo de la ciencia de datos: el registro de pasajeros del Titanic. Nuestro objetivo será puramente predictivo y explicativo.

11.7.1 Objetivo de la investigación

El hundimiento del Titanic es una tragedia histórica, pero los datos de sus pasajeros nos ofrecen una oportunidad única para modelar un evento binario: la supervivencia.

Construir un modelo de regresión logística para predecir la probabilidad de que un pasajero sobreviviera al naufragio, basándonos en sus características demográficas y de viaje (clase, sexo, edad, etc.). Además, buscaremos entender qué factores fueron los más determinantes para la supervivencia.

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

Comenzaremos cargando los datos y preparándolos para el modelado. Este paso es especialmente crucial en este caso, ya que los datos del Titanic contienen valores perdidos y variables que necesitan ser transformadas.

Code
# Cargamos los datos de entrenamiento del paquete
datos_titanic <- as.data.frame(titanic_train)

# Vistazo inicial a la estructura y los valores perdidos
glimpse(datos_titanic)
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(datos_titanic)
  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   Class :character  
 Median :446.0   Median :0.0000   Median :3.000   Mode  :character  
 Mean   :446.0   Mean   :0.3838   Mean   :2.309                     
 3rd Qu.:668.5   3rd Qu.:1.0000   3rd Qu.:3.000                     
 Max.   :891.0   Max.   :1.0000   Max.   :3.000                     
                                                                    
     Sex                 Age            SibSp           Parch       
 Length:891         Min.   : 0.42   Min.   :0.000   Min.   :0.0000  
 Class :character   1st Qu.:20.12   1st Qu.:0.000   1st Qu.:0.0000  
 Mode  :character   Median :28.00   Median :0.000   Median :0.0000  
                    Mean   :29.70   Mean   :0.523   Mean   :0.3816  
                    3rd Qu.:38.00   3rd Qu.:1.000   3rd Qu.:0.0000  
                    Max.   :80.00   Max.   :8.000   Max.   :6.0000  
                    NA's   :177                                     
    Ticket               Fare           Cabin             Embarked        
 Length:891         Min.   :  0.00   Length:891         Length:891        
 Class :character   1st Qu.:  7.91   Class :character   Class :character  
 Mode  :character   Median : 14.45   Mode  :character   Mode  :character  
                    Mean   : 32.20                                        
                    3rd Qu.: 31.00                                        
                    Max.   :512.33                                        
                                                                          

Observaciones iniciales: * Nuestra variable dependiente, Survived, es un entero (0 = No, 1 = Sí). La convertiremos a un factor para que glm la trate correctamente. * La variable Age tiene 177 valores perdidos (NA). * Pclass (clase del billete) y Sex son categóricas y deben ser tratadas como factores. * SibSp (hermanos/cónyuges a bordo) y Parch (padres/hijos a bordo) pueden combinarse para crear una variable de “tamaño familiar”.

11.7.2.1 Paso 1: limpieza y transformación de datos

Procederemos a limpiar y preparar nuestro conjunto de datos.

Code
titanic_limpio <- datos_titanic %>%
  # 1. Convertir variables a factores
  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)
  ) %>%
  # 2. Imputar valores perdidos en 'Age' con la mediana
  mutate(Age = ifelse(is.na(Age), median(Age, na.rm = TRUE), Age)) %>%
  # 3. Crear la variable 'FamilySize'
  mutate(FamilySize = SibSp + Parch + 1) %>%
  # 4. Seleccionar las variables que usaremos en el modelo
  select(Survived, Pclass, Sex, Age, FamilySize, Fare)

# Verificamos que ya no hay valores perdidos
summary(titanic_limpio)
 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 de nuestro modelo, lo entrenaremos en una parte de los datos (el 75%) y lo probaremos en la parte restante (el 25%), que el modelo nunca habrá “visto”.

Code
set.seed(123) # Para que la división sea reproducible
titanic_split <- initial_split(titanic_limpio, prop = 0.75, strata = Survived)

# Creamos los data frames de entrenamiento y prueba
train_data <- training(titanic_split)
test_data  <- testing(titanic_split)

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

Con los datos listos, procedemos a construir y evaluar nuestro modelo.

Code
# Construimos el modelo logístico usando la función glm()
# La fórmula indica que queremos predecir 'Survived' a partir de las demás variables
modelo_titanic <- glm(Survived ~ Pclass + Sex + Age + FamilySize + Fare, 
                      data = train_data, 
                      family = "binomial")

# Vemos un resumen detallado del modelo
summary(modelo_titanic)

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 del modelo

  • Devianza: La devianza nula (de un modelo sin predictores) es 889.39, mientras que la devianza residual (de nuestro modelo) es 585.01. La gran reducción indica que nuestro modelo se ajusta mucho mejor a los datos que el azar. El p-valor asociado a esta reducción (no mostrado directamente, pero implícito en la significancia de los coeficientes) es extremadamente pequeño.

11.7.4.2 Interpretación de los coeficientes y odds ratios

Para una interpretación más intuitiva, calculamos los Odds Ratios (OR).

Code
# Calculamos los OR exponenciando los coeficientes
odds_ratios <- exp(coef(modelo_titanic))
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 importantes: * Sexmale: El OR es 0.07. Esto significa que, manteniendo constantes las demás variables, los odds de supervivencia para un hombre eran solo el 7% de los odds de supervivencia para una mujer. Dicho de otro modo, los odds de supervivencia de una mujer eran 1 / 0.07 ≈ 14 veces los de un hombre. Este es, con diferencia, el predictor más fuerte. * PclassSegunda y PclassTercera: Los OR son 0.23 y 0.06 respectivamente. La categoría de referencia es “Primera” clase. Esto significa que los odds de supervivencia en segunda clase eran un 77% más bajos que en primera, y en tercera clase eran un 94% más bajos. Viajar en una clase superior aumentaba drásticamente las probabilidades de sobrevivir. * Age: El OR es 0.96. Por cada año adicional de edad, los odds de supervivencia se multiplicaban por 0.96, lo que equivale a una disminución del 4%, manteniendo el resto constante. Ser más joven era una ventaja. * FamilySize: El OR es 0.72. Por cada miembro adicional en la familia, los odds de supervivencia disminuían en un 28%. Esto puede reflejar la dificultad de evacuar con grupos grandes.

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

Ahora, usemos nuestro modelo para predecir la supervivencia en el conjunto de prueba y veamos como funciona.

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

Code
# Puede que necesites instalar el paquete: install.packages("caret")
# También puede pedir instalar dependencias como e1071, lo cual es normal.

# 1. Predecir las probabilidades en el conjunto de prueba
pred_prob <- predict(modelo_titanic, newdata = test_data, type = "response")

# 2. Convertir probabilidades en clases (Sí/No) usando un umbral de 0.5
pred_class <- ifelse(pred_prob > 0.5, "Sí", "No") %>% factor(levels = c("No", "Sí"))

# 3. Crear la matriz de confusión
# Esta función ahora será encontrada gracias a library(caret)
conf_matrix <- 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: * Accuracy (Exactitud): El modelo clasificó correctamente al 83.41% de los pasajeros en el conjunto de prueba. * Sensitivity (Sensibilidad): El modelo identificó correctamente al 74.42% de los pasajeros que realmente sobrevivieron. * Specificity (Especificidad): El modelo identificó correctamente al 88.71% de los pasajeros que no sobrevivieron.

Estos son resultados muy sólidos para un modelo relativamente simple.

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

El AUC nos dará una medida global del poder discriminatorio del modelo.

Code
library(pROC)

# Creamos el objeto ROC
roc_curve <- roc(test_data$Survived, pred_prob)
Setting levels: control = No, case = Sí
Setting direction: controls < cases
Code
# Calculamos el AUC
auc_value <- auc(roc_curve)

# Graficamos la curva ROC
ggroc(roc_curve) +
  ggtitle(paste0("Curva ROC (AUC = ", round(auc_value, 3), ")")) +
  theme_minimal()

Interpretación: El AUC es de 0.876, un valor considerado “excelente”. Esto confirma que nuestro modelo tiene una gran capacidad para distinguir entre un pasajero que sobreviviría y uno que no.

11.7.6 Conclusiones

Nuestro modelo de regresión logística ha sido exitoso tanto en su capacidad explicativa como predictiva. Hemos confirmado 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, con los pasajeros más jóvenes y con familias más pequeñas teniendo una ligera ventaja.

Desde el punto de vista del modelado, este caso práctico demuestra el flujo de trabajo completo para un problema de clasificación: desde la limpieza de datos y la ingeniería de características 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.