Se establecera un modelo que permita calcular la probabilidad de obtener un bueno promedio, dependiendo de las horas de estudio. La variable promedio, sera 1 si el promedio es superior a 3.5 y 0 si el promedio es inferior e igual a 3.5.
1. Preparación de los datosPrimero se carga la base de datos ubicada en el computador, despues convertimos la variable promedio en binaria y despues la volvemos factor. De igual forma convertimos a factores las otras variables categoricas de la base de datos.
# Cargamos base de datos
library(readxl)
Ejemplo3 <- read_excel("C:/Users/house/OneDrive/Escritorio/Nueva carpeta/Especialización/Especialización/Curso 2/3. Modelos de regresión/Clase 3/Trabajo en clase/Ejemplo3.xlsx")
# Creamos la variable binaria: 1 si promedio >= 3.5, 0 si < 3.5
Ejemplo3$promedio_binario1 <- ifelse(Ejemplo3$promedio >= 3.5, 1, 0)
# Convertirla en factor
Ejemplo3$promedio_binario2 <- factor(Ejemplo3$promedio_binario1, levels = c(0, 1), labels = c("Bajo", "Alto"))
# Convertir variables categóricas a factores
Ejemplo3$`asiste a clases` <- factor(Ejemplo3$`asiste a clases`)
Ejemplo3$`tiene apoyo academico` <- factor(Ejemplo3$`tiene apoyo academico`)
Ejemplo3$`tener celular`<- factor(Ejemplo3$`tener celular`)
# Verificar
str(Ejemplo3)
## tibble [36 × 12] (S3: tbl_df/tbl/data.frame)
## $ horas frente a pantallas: num [1:36] 4.56 3.91 2.86 5.31 7.19 ...
## $ horas sueño : num [1:36] 3 2 1 6 8 8 9 5 6 6 ...
## $ hora estudio : num [1:36] 2 3 1.5 4 3.5 5 6 2.5 7 8 ...
## $ promedio : num [1:36] 2.5 2 1 3 4 4.5 5 3.5 3 3.2 ...
## $ tener celular : Factor w/ 2 levels "No","Sí": 2 2 2 2 2 2 1 1 1 1 ...
## $ horas estudio : num [1:36] 5 2 4 2 1 3 2 3 1 1 ...
## $ asiste a clases : Factor w/ 2 levels "No","Sí": 2 1 1 2 2 1 2 1 2 2 ...
## $ tiene apoyo academico : Factor w/ 2 levels "No","Sí": 1 2 1 1 2 1 1 1 2 1 ...
## $ nivel de estrés : num [1:36] 3 4 4 4 4 1 2 4 2 5 ...
## $ uso de celular : num [1:36] 0 5.1 0.5 0.3 7 2.3 6.1 2.9 7 0.2 ...
## $ promedio_binario1 : num [1:36] 0 0 0 0 1 1 1 1 0 0 ...
## $ promedio_binario2 : Factor w/ 2 levels "Bajo","Alto": 1 1 1 1 2 2 2 2 1 1 ...
2. Representación de las observaciones
Representar las observaciones es útil para intuir si la variable independiente escogida está relacionada con la variable respuesta y, por lo tanto, puede ser un buen predictor.
| Promedio | 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | Sum |
|---|---|---|---|---|---|---|---|---|---|
| Bajo | 2 (15.4%) | 2 (15.4%) | 2 (15.4%) | 0 (0%) | 7 (53.8%) | 0 (0%) | 0 (0%) | 0 (0%) | 13 (100%) |
| Alto | 0 (0%) | 0 (0%) | 0 (0%) | 4 (17.4%) | 0 (0%) | 6 (26.1%) | 11 (47.8%) | 2 (8.7%) | 23 (100%) |
| Sum | 2 (15.4%) | 2 (15.4%) | 2 (15.4%) | 4 (17.4%) | 7 (53.8%) | 6 (26.1%) | 11 (47.8%) | 2 (8.7%) | 36 (200%) |
Como se observa en las tablas de frecuencia y el boxplot, el número de estudiantes varía según las horas de sueño. Seis estudiantes duermen de 2 a 3 horas, mientras que la mayoría (30 de 36) duermen entre 5 y 9 horas. El promedio de estudiantes con rendimiento bajo es menor en comparación con quienes tienen un rendimiento alto. En vista de estos datos, es razonable considerar las horas de sueño como una variable predictora del rendimiento académico.
3. Ajuste del modelo de regresión logística simple
Se ajusta un modelo de regresión logística con el proposito de estimar la probabilidad de obtener un promedio alto o bajo. En ese sentido, la variable de respuesta es la variable promedio donde esta es 1 si es mayor e igual a 3.5 y 0 si es menor a 3.5, de igual forma la variable predictora sera horas de estudio.
modelo_logistico <- glm(promedio_binario2 ~ `horas sueño`, data = Ejemplo3, family = "binomial")
summary(modelo_logistico)
##
## Call:
## glm(formula = promedio_binario2 ~ `horas sueño`, family = "binomial",
## data = Ejemplo3)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -6.7186 2.6947 -2.493 0.01266 *
## `horas sueño` 1.1921 0.4268 2.794 0.00521 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 47.092 on 35 degrees of freedom
## Residual deviance: 25.948 on 34 degrees of freedom
## AIC: 29.948
##
## Number of Fisher Scoring iterations: 6
4. Interpretación del modelo logístico simple
Modelo Ajustado
\[\text{logit} \left(p\right)=β_0+β_1\text{(horas de sueño)}=-6.71+1.19\text{(horas de sueño)}\] \[\text{Log}\left(\frac{p}{1-p}\right)= \text{logit} \left(p\right)\] Probabilidad
Representa la probabilidad de que un estudiante tenga un promedio alto basado en sus horas de sueño.
\[p = \frac{1}{1+e^{\left(-β_0-β_1\text{(horas de sueño)}\right)}}=\frac{1}{1+e^{\left(6.71-1.19\text{(horas de sueño)}\right)}}\] Odds
Son la razón entre la probabilidad de que un estudiante obtenga un promedio alto \(p\) y la probabilidad de que obtenga un promedio bajo \(1-p\), dado un número de horas de sueño.
\[\text{Odds}=\frac{p}{1-p} = e^{β_0+β_1\text{(horas de sueño)}}=e^{-6.71+1.19\text{(horas de sueño)}}\]
Analisis de Coeficientes
\(β_1\) (Intercepto):
(−6.71) es el log-odds de tener un promedio alto cuando las horas de sueño son 0.
La probabilidad de tener un promedio alto con 0 horas de sueño sería solo del 0.12%
probabilidad <- 1/(1+exp(6.71))
probabilidad
## [1] 0.001217181
\[\text{p} = \frac{1}{1+e^\left(6.71\right)} = 0.0012 = 0.12% \]
odd_intercepto <-exp(-6.71)
odd_intercepto
## [1] 0.001218664
\[odd = e^{-6.71} = 0.001218664 \]
\(β_1\)(Coeficiente de horas de sueño):
El coeficiente es positivo y significativo, ya que \(p-value < 0.05\). En ese sentido, por cada hora adicional de sueño, el log-odds (logaritmo de las odds) de tener un promedio alto aumenta en 1.1921 unidades.
Por cada hora adicional de sueño, la probabilidad de obtener una nota alta es del 76%
probabilidad2 <- 1/(1+exp(-1.1921))
probabilidad2
## [1] 0.7671164
\[\text{p} = \frac{1}{1+e^\left(-1.19\right)} = 0.7671 = 76\% \]
odd_horas <-exp(-1.1921)
odd_horas
## [1] 0.3035831
\[odd = e^{-1.1921} = 0.3035831 \]
Analisis de Desviancia
La desviancia es similar al residuo, pero adaptado a modelos más complejos, donde a menor desviancia mejor es el ajuste del modelo a los datos.
\[\text{Deviance}= -2*\text{log-verosimilitud del modelo}\]En ese contexto, null deviance es la representación de la desviación del modelo sin predictores y residual deviance, con los predictores. Por lo tanto, en el presente modelo el valor null deviance es del 47.092, mientras que residual deviance es de 25.948, donde se observa que la variabilidad del modelo solo con el intercepto es mayor en comparación a la del modelo con un unico predictor (Horas de sueño). Por lo tanto, el modelo ajustado es significativamente mejor que el modelo nulo, ya que, la inclusion de la variable Horas de sueño proporciona una mejora significativa al modelo.
5. Prediciones
Calculamos la probabilidad estimada para cada observación y la clasificamos como “Alto” si la probabilidad es mayor a 0.5, de igual forma se calculan los odds en la tabla.
\[p =\frac{1}{1+e^{\left(6.71-1.19\text{(horas de sueño)}\right)}}\]
# Probabilidades predichas
probabilidades <- predict(modelo_logistico, type = "response")
# Clasificación binaria
pred_clase <- ifelse(probabilidades > 0.5, "Alto", "Bajo")
# Calcular odds
odds <- round(probabilidades / (1 - probabilidades), 3)
# Mostrar tabla con todo
tabla_predicciones <- data.frame(
"Horas de sueño" = Ejemplo3$`horas sueño`,
Probabilidad = round(probabilidades, 3),
Odds = odds,
Clasificación = pred_clase
)
# Las 6 primeras predicciones
head(tabla_predicciones)
## Horas.de.sueño Probabilidad Odds Clasificación
## 1 3 0.041 0.043 Bajo
## 2 2 0.013 0.013 Bajo
## 3 1 0.004 0.004 Bajo
## 4 6 0.607 1.544 Alto
## 5 8 0.944 16.752 Alto
## 6 8 0.944 16.752 Alto
Probabilidades Predichas
La probabilidad de que un estudiante obtenga un buen promedio varía según las horas de sueño. De acuerdo con la tabla, un estudiante que duerme 3 horas tiene solo un 0.041 de probabilidad de obtener un promedio alto, lo que indica una baja probabilidad de buen desempeño académico con tan pocas horas de descanso. En cambio, estudiante que duerme 8 horas tiene más probabilidad de 0.944 de obtener un promedio alto, lo que refleja alta probabilidad de éxitos académico con más horas de sueño. Este patrón sugiere que un mayor tiempo de descanso está asociado con un mejor rendimiento académico.
Odds
Los odds, en este caso representan la relación entre la probabilidad de éxitos (obtener un promedio alto) y la probabilidad de fracaso (obtener un promedio bajo). En ese sentido, a medida que aumentan las horas de sueño, los odds también lo hacen, lo que indica que es más probable que un estudiante alcance un promedio alto. Como se observa en la tabla, un estudiante que duerme 3 horas tiene un odd de 0.043, lo que refleja una probabilidad muy baja de obtener un promedio alto frente a la posibilidad de obtener uno bajo. En contraste, con 8 horas de sueño, los odds aumentan a 16.7, evidenciando un incremento considerable en la probabilidad de éxito académico.
6. Visualización del modelo
Graficamos la curva logística ajustada sobre los puntos observados para visualizar la relación entre las horas de sueño y la probabilidad estimada del promedio.
library(ggplot2)
ggplot(Ejemplo3, aes(x = `horas sueño`, y = as.numeric(promedio_binario2) - 1)) +
geom_point(aes(color = promedio_binario2), size = 2) +
scale_color_manual(values = c("Bajo" = "#EE6A50", "Alto" = "#3A5FCD")) +
stat_smooth(method = "glm", method.args = list(family = "binomial"), se = FALSE, color = "#548B54") +
labs(
title = "PROBABILIDAD DE UN PROMEDIO ALTO SEGÚN LAS HORA DE SUEÑO",
x = "HORAS DE SUEÑO",
y = "PROBABILIDAD",
color = "PROMEDIO"
) +
theme_light()
## `geom_smooth()` using formula = 'y ~ x'
De acuerdo con la gráfica anterior, al categorizar la variable dependiente “promedio” en dos niveles, como promedios altos (mayores o iguales a 3.5) y promedios bajos (menores a 3.5), se observa que existe una probabilidad del 50% de que los estudiantes tengan un promedio alto o bajo, respectivamente.
7. Matriz de Confusión
Comparación de las predicciones con las observaciones. Si la probabilidad predicha del promedio es igual a 0.5 se asigna al nivel 1 (Promedio alto), si es menor se asigna al nivel 0 (Promedio bajo).
## Observacion
## Prediccion Bajo Alto
## Alto 7 19
## Bajo 6 4
De acuerdo con la matriz confusión, su representación en la gráfica de calor y el resumen de resultados, se observa que el modelo detecta bien los promedios altos. En total, clasificó correctamente 19 casos con promedios altos (Verdaderos Positivos), mientras que solo en 4 ocasiones no logró identificarlos, resultando en falsos negativos. Por otro lado, el modelo cometió 7 errores al predecir promedios altos cuando en realidad eran bajos (Falsos Positivos). Finalmente, logró indentificar correctamente 6 promedios bajos (Verdaderos Negativos). Es decir, que el modelo es más eficaz para identificar correctamente los promedios altos que los bajos.
RESUMEN DE LA MATRIZ DE CONFUSIÓN
| Norma de la Matriz de Confusion | ||||
| Detalle con tipo de caso y descripcion | ||||
| Observacion | Prediccion | Tipo de Caso | Descripcion | Frecuencia |
|---|---|---|---|---|
| Bajo | Alto | Falso Positivo (FP) | Predijo alto y era bajo | 7 |
| Bajo | Bajo | Verdadero Negativo (VN) | Predijo bajo y era bajo | 6 |
| Alto | Alto | Verdadero Positivo (VP) | Predijo alto y era alto | 19 |
| Alto | Bajo | Falso Negativo (FN) | Predijo bajo y era alto | 4 |
8. Métricas de desempeño predictivo (basadas en la matriz de confusión)
A partir de la matriz de confusión, podemos calcular manualmente: Precisión (accuracy), Sensibilidad (recall), Especificidad y F1-score
| Tabla de Métricas de Desempeño | |||
| Clasificación de Promedio: Alta vs Baja | |||
| Métrica | Valor (%) | Descripción | Fórmula |
|---|---|---|---|
| sensitivity | 82.61% | Capacidad de identificar correctamente los promedios altos. | \( \frac{VP}{VP + FN} \) |
| specificity | 46.15% | Capacidad de identificar correctamente los promedios bajos. | \( \frac{VN}{VN + FP} \) |
| precision | 73.08% | Indica la proporción de casos predichos como positivos que realmente lo eran | \( \frac{VP}{VP + FP} \) |
| f1_score | 77.55% | Equilibrio entre precisión y sensibilidad. | \( \frac{2 \cdot Precision \cdot Sensibilidad}{Precision + Sensibilidad} \) |
| accuracy | 69.44% | Mide la proporción total de aciertos (positivos y negativos correctamente clasificados) sobre el total de casos. | \( \frac{VP + VN}{sum(matrizconfusion)} \) |
Análisis de las métricas del desempeño predictivo
Sensibilidad (Recall): El 82.61% de los promedios altos fueron correctamente identificados.
Especificidad: Indica que solo el 46.15% de los promedios bajos fueron correctamente identificados.
Precisión positiva(Precision) : De todas las predicciones que el modelo hizo como altas, el 73% realmente lo eran.
F1-score: El 77.55% refleja buen equilibrio entre precisión y sensibilidad, lo que indica un buen desempeño del modelo.
Precisión global(Accuracy) : De todas las predicciones realizadas, un 69.44% fueron correctas, tanto de promedios altos, como de promedios bajos.
9. Métricas de ajuste del modelo
Estas se usan para comparar modelos o evaluar qué tan bien el modelo se ajusta a los datos observados: AIC (Akaike Information Criterion) y Desviancia (Deviance)
modelo_logistico <- glm(promedio_binario2 ~ `horas sueño`, data = Ejemplo3, family = "binomial")
modelo_logistico2 <- glm(promedio_binario2 ~ `horas sueño` + `tiene apoyo academico`, data = Ejemplo3, family = "binomial")
# AIC
AIC(modelo_logistico)
## [1] 29.94785
AIC(modelo_logistico2)
## [1] 31.94519
# Desviancia
summary(modelo_logistico)$deviance
## [1] 25.94785
summary(modelo_logistico2)$deviance
## [1] 25.94519
Análisis de las métricas en el ajuste del modelo
10. Ajuste del umbral
Se realiza un histograma con el proposito de revisar la frecuencia y la probabilidad de los datos.
hist(probabilidades, breaks = 10, col = "lightblue", main = "Distribución de probabilidades predichas", xlab = "Probabilidad de ser manual")
De acuerdo con la el histograma de barras, se evidencia que la mayor cantidad de datos se encuentra entre las probabilidades 0.6 a 0.7 y de 0.8 a 1.
## Umbral Accuracy sensitivity specificity precision F1
## 1 0.6 0.694 0.826 0.462 0.731 0.776
## 2 0.7 0.889 0.826 1.000 1.000 0.905
## 3 0.8 0.889 0.826 1.000 1.000 0.905
## 4 0.9 0.722 0.565 1.000 1.000 0.722
En la tabla se encuentran los umbrales que presentan la mayor cantidad de casos, donde los umbrales del 0.7 al 0.8 son los que mejor se ajustan al modelo logistico.
11. Umbral ajustado
En ese sentido, si la probabilidad predicha del promedio es igual a 0.8 se asigna al nivel 1 (Promedio alto), si es menor e igual se asigna al nivel 0 (Promedio bajo).
## Observacion
## Prediccion Bajo Alto
## Alto 7 19
## Bajo 6 4
RESUMEN DE LA MATRIZ DE CONFUSIÓN
| Norma de la Matriz de Confusion | ||||
| Detalle con tipo de caso y descripcion | ||||
| Observacion | Prediccion | Tipo de Caso | Descripcion | Frecuencia |
|---|---|---|---|---|
| Bajo | Alto | Falso Positivo (FP) | Predijo alto y era bajo | 0 |
| Bajo | Bajo | Verdadero Negativo (VN) | Predijo bajo y era bajo | 13 |
| Alto | Alto | Verdadero Positivo (VP) | Predijo alto y era alto | 19 |
| Alto | Bajo | Falso Negativo (FN) | Predijo bajo y era alto | 4 |
11. Metricas con el umbral ajustado
| Tabla de Métricas de Desempeño | |||
| Clasificación de Promedio: Alta vs Baja | |||
| Métrica | Valor (%) | Descripción | Fórmula |
|---|---|---|---|
| sensitivity | 82.61% | Capacidad de identificar correctamente los promedios altos. | \( \frac{VP}{VP + FN} \) |
| specificity | 100.00% | Capacidad de identificar correctamente los promedios bajos. | \( \frac{VN}{VN + FP} \) |
| precision | 100.00% | Indica la proporción de casos predichos como positivos que realmente lo eran | \( \frac{VP}{VP + FP} \) |
| f1_score | 90.48% | Equilibrio entre precisión y sensibilidad. | \( \frac{2 \cdot Precision \cdot Sensibilidad}{Precision + Sensibilidad} \) |
| accuracy | 88.89% | Mide la proporción total de aciertos (positivos y negativos correctamente clasificados) sobre el total de casos. | \( \frac{VP + VN}{sum(matrizconfusion)} \) |
Seleccionando el umbral 0.8, se determina que la especificidad del umbral es del 100%, es decir que el modelo clasifica correctamente los promedios bajos. Por otra parte, el modelo se equivoca clasificando los promedios altos, ya que la sensibilidad corresponde al 82.61%, asimismo la precisión de los umbrales fue del 100%, lo cual indica que los promedios altos se clasificaron de manera correcta, ahora el valor del f1_score establece que existe equilibrio del 91% entre la precisión y la sensibilidad, por ultimo la precisión global del modelo (accuracy) fue del 88.89%, indicando que el modelo presentó errores en la clasificación, pero el desempeño fue bueno.