Usaremos el dataset mtcars
, incluido por defecto en
R.
# Dataset incluido en R
data(mtcars)
# Selección de variables
mtcars <- mtcars[, c("mpg", "am")]
mtcars$am <- factor(mtcars$am, labels = c("Automática", "Manual"))
head(mtcars)
## mpg am
## Mazda RX4 21.0 Manual
## Mazda RX4 Wag 21.0 Manual
## Datsun 710 22.8 Manual
## Hornet 4 Drive 21.4 Automática
## Hornet Sportabout 18.7 Automática
## Valiant 18.1 Automática
El objetivo de esta implementación es desarrollar y validar un modelo de regresión logística simple que permita describir y predecir la probabilidad de que un vehículo posea transmisión manual en función de su rendimiento de combustible, medido en millas por galón (mpg). Esta medida indica la cantidad de millas que un vehículo puede recorrer con un galón de combustible. Para ello, se estimarán los parámetros del modelo y se llevarán a cabo pruebas de hipótesis nula para determinar la significancia estadística del efecto de mpg sobre la variable dependiente binaria, evaluando así la capacidad del modelo para explicar y seleccionar esta relación de manera adecuada.
library(ggplot2)
ggplot(mtcars, aes(x = am)) +
geom_bar(fill = "steelblue") +
geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.5) +
labs(title = "Frecuencia de tipo de transmisión",
x = "Transmisión", y = "Frecuencia") +
theme_minimal()
Se observa que el 59,4 % de los autos (19 de 32) tienen transmisión automática, mientras que el 40,6 % (13 de 32) cuentan con transmisión manual. Esto indica que la transmisión automática es la más frecuente en este conjunto de datos.
ggplot(mtcars, aes(x = am, y = mpg)) +
geom_boxplot(fill = "lightgreen") +
labs(title = "mpg según tipo de transmisión",
x = "Transmisión", y = "mpg") +
theme_minimal()
Se observa que los autos con transmisión manual presentan un mayor rendimiento, con una mediana cercana a los 23 mpg, y varios valores que superan los 30 mpg. En contraste, los autos con transmisión automática tienen una mediana más baja, alrededor de 17-18 mpg, y sus valores están más concentrados entre 14 y 20 mpg. Además, la dispersión en los autos manuales es mayor, lo que indica una mayor variabilidad en su rendimiento.Por último, no se detecta la presencia de datos atípicos.
# Ajuste del modelo
modelo <- glm(am ~ mpg, data = mtcars, family = binomial)
# Resumen del modelo
summary(modelo)
##
## Call:
## glm(formula = am ~ mpg, family = binomial, data = mtcars)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -6.6035 2.3514 -2.808 0.00498 **
## mpg 0.3070 0.1148 2.673 0.00751 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 43.230 on 31 degrees of freedom
## Residual deviance: 29.675 on 30 degrees of freedom
## AIC: 33.675
##
## Number of Fisher Scoring iterations: 5
El modelo muestra que la variable mpg está significativamente asociado con el tipo de transmisión. A mayor mpg, mayor es la probabilidad de que el auto tenga transmisión manual. El coeficiente de mpg tiene un valor p de 0.00751, que es menor al umbral de significancia de 0.05, por lo tanto, es estadísticamente significativo. También observamos que la desvianza residual disminuye en comparación con la desvianza nula al incluir el predictor en el modelo, lo que sugiere un mejor ajuste. Sin embargo, esta reducción por sí sola no permite concluir definitivamente que el modelo es bueno, aunque complementa la evidencia de asociación entre mpg y el tipo de transmisión.
anova(modelo, test = "Chisq")
## Analysis of Deviance Table
##
## Model: binomial, link: logit
##
## Response: am
##
## Terms added sequentially (first to last)
##
##
## Df Deviance Resid. Df Resid. Dev Pr(>Chi)
## NULL 31 43.230
## mpg 1 13.555 30 29.675 0.0002317 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Se rechaza la hipótesis nula porque el p-valor (0.0002317) es menor a 0.05. Esto indica que el predictor mpg reduce significativamente la desviancia (es decir, el error del modelo) en comparación con el modelo nulo, por lo que mejora de forma significativa el ajuste del modelo.
Usando los coeficientes estimados por el modelo, se puede calcular manualmente la probabilidad de que un auto tenga transmisión manual. Para un valor de mpg = 25:
mpg_val <- 25
log_odds <- -6.6035 + 0.3070 * mpg_val
prob_manual <- 1 / (1 + exp(-log_odds))
cat("Log-odds:", round(log_odds, 3), "\n")
## Log-odds: 1.071
cat("Probabilidad de transmisión manual:", round(prob_manual, 3), "\n")
## Probabilidad de transmisión manual: 0.745
El valor de log-odds obtenido (1.071) indica que, para un vehículo con 25 mpg, el modelo predice una mayor probabilidad de tener transmisión manual que automática. Dado que el logit es positivo, se concluye que las odds están a favor de la transmisión manual. Esta interpretación concuerda con la probabilidad estimada (74.5%), y refleja el comportamiento del modelo ajustado: a medida que aumenta el mpg, aumentan tanto el logit como la probabilidad de transmisión manual.
mtcars$logit <- log(modelo$fitted.values / (1 - modelo$fitted.values))
plot(mtcars$mpg, mtcars$logit,
xlab = "mpg", ylab = "Logit (log-odds)",
main = "Relación lineal entre mpg y logit",
pch = 19, col = "blue")
abline(lm(logit ~ mpg, data = mtcars), col = "red")
Se confirma que el predictor mpg presenta una relación aproximadamente lineal con el logit de la variable respuesta. Esta observación respalda la validez del supuesto de linealidad en el logit, propio de la regresión logística, y sugiere que mpg es un predictor adecuado para este tipo de modelo.
# Nuevos valores de mpg para suavizar la curva
mpg_seq <- seq(min(mtcars$mpg), max(mtcars$mpg), length.out = 100)
# Predicción de probabilidades
probabilidades <- predict(modelo, newdata = data.frame(mpg = mpg_seq), type = "response")
# Graficar puntos reales
plot(mtcars$mpg, as.numeric(mtcars$am) - 1,
xlab = "mpg", ylab = "Probabilidad de transmisión manual",
main = "Curva logística ajustada",
col = ifelse(mtcars$am == "Manual", "darkred", "darkblue"),
pch = 19, ylim = c(0, 1))
# Curva logística
lines(mpg_seq, probabilidades, col = "green", lwd = 2)
# Predicciones de clase
prob <- predict(modelo, type = "response")
pred <- ifelse(prob >= 0.5, 1, 0)
real <- as.numeric(mtcars$am) - 1
# Matriz de confusión
conf <- table(Predicho = pred, Real = real)
print(conf)
## Real
## Predicho 0 1
## 0 17 6
## 1 2 7
# Cálculo de métricas
TP <- sum(pred == 1 & real == 1)
TN <- sum(pred == 0 & real == 0)
FP <- sum(pred == 1 & real == 0)
FN <- sum(pred == 0 & real == 1)
accuracy <- (TP + TN) / (TP + TN + FP + FN)
precision <- TP / (TP + FP)
recall <- TP / (TP + FN)
f1 <- 2 * (precision * recall) / (precision + recall)
# Resultados
cat("Accuracy:", round(accuracy, 2), "\n")
## Accuracy: 0.75
cat("Precision:", round(precision, 2), "\n")
## Precision: 0.78
cat("Recall:", round(recall, 2), "\n")
## Recall: 0.54
cat("F1 Score:", round(f1, 2), "\n")
## F1 Score: 0.64
El modelo logra una exactitud del 75%, lo cual indica un rendimiento aceptable en general. Sin embargo, la sensibilidad (recall) es moderadamente baja (0.54), lo que sugiere que el modelo no detecta correctamente todos los vehículos con transmisión manual. A pesar de esto, su precisión es buena (0.78), lo que indica que cuando predice transmisión manual, suele acertar.
El F1 Score de 0.64 indica un equilibrio razonable entre precisión y sensibilidad, aunque hay margen para mejorar la capacidad del modelo para detectar los casos positivos (manual). ## 4.4 Odds Ratio e Intervalos
# Odds Ratio
exp(coef(modelo))
## (Intercept) mpg
## 0.001355579 1.359379288
# Intervalos de confianza
exp(confint(modelo))
## Waiting for profiling to be done...
## 2.5 % 97.5 %
## (Intercept) 4.425443e-06 0.06255158
## mpg 1.129764e+00 1.79946863
El modelo indica que por cada unidad adicional en mpg, la probabilidad de que un vehículo tenga transmisión manual aumenta en un 36%, manteniendo todo lo demás constante. El intervalo de confianza al 95% para este efecto (1.13 a 1.80) no incluye 1, confirmando su significancia estadística.
El intercepto, cercano a cero, representa la odds cuando mpg es 0, un valor poco realista en este contexto, por lo que su interpretación es limitada.
En definitiva, mpg
es un predictor clave y
estadísticamente significativo para determinar la probabilidad de que un
vehículo tenga transmisión manual en el conjunto de datos estudiado.