Mi análisis de datos

Author

Jacquelinne

Published

November 28, 2025

Actividad 1. Carga de datos y estructura

set.seed(123)  # Para reproducibilidad
n <- 400

# 1. Variables básicas ----------------------
id <- 1:n

# Sexo: 0/1 primero, luego etiquetas
sexo_bin <- rbinom(n, size = 1, prob = 0.55)  # ~55% mujeres (por ejemplo)
sexo <- ifelse(sexo_bin == 1, "F", "M")

# Edad: entre 18 y 30, con más concentración entre 18-24
edad <- round(rnorm(n, mean = 22, sd = 2.5))
edad[edad < 18] <- 18
edad[edad > 30] <- 30

# Grupo de edad
grupo_edad <- cut(
  edad,
  breaks = c(17, 20, 23, 26, 30),
  labels = c("18-20", "21-23", "24-26", "27-30"),
  right = TRUE
)

# Tipo de universidad
tipo_universidad <- sample(c("Pública", "Privada"),
                           size = n,
                           replace = TRUE,
                           prob = c(0.6, 0.4))

# Carrera
carreras_posibles <- c("Economía", "Administración", "Contaduría",
                       "Ingeniería", "Otra")
carrera <- sample(carreras_posibles,
                  size = n,
                  replace = TRUE,
                  prob = c(0.2, 0.25, 0.2, 0.2, 0.15))

# Trabaja (además de estudiar)
trabaja <- rbinom(n, size = 1, prob = 0.35)

# 2. Variables de hábitos (estudio, sueño, redes) --------------

# Horas de estudio: más o menos normal, truncada
horas_estudio <- rnorm(n, mean = 2.5, sd = 1.2)
horas_estudio[horas_estudio < 0] <- 0
horas_estudio[horas_estudio > 8] <- 8

# Horas de sueño: 4-9 horas
horas_sueno <- rnorm(n, mean = 6.8, sd = 1)
horas_sueno[horas_sueno < 4] <- 4
horas_sueno[horas_sueno > 9] <- 9

# Uso de redes sociales: 0-8 horas
uso_redes_horas <- rnorm(n, mean = 3.5, sd = 1.8)
uso_redes_horas[uso_redes_horas < 0] <- 0
uso_redes_horas[uso_redes_horas > 8] <- 8

# 3. Estrés y salud (Likert) -----------------------------------

# Nivel de estrés: queremos que aumente si:
#   - duerme poco
#   - usa muchas redes
#   - trabaja además de estudiar
#   - estudia mucho puede sumar algo de estrés también

# Índice “latente” de estrés
indice_estres <- 0.3 * (8 - horas_sueno) +
                 0.25 * uso_redes_horas +
                 0.2 * horas_estudio +
                 0.6 * trabaja +
                 rnorm(n, mean = 0, sd = 0.7)

# Escalar y llevar a 1-5
# Primero lo normalizamos aproximadamente
estres_z <- scale(indice_estres)
nivel_estres_cont <- 3 + as.numeric(estres_z)  # alrededor de 3
nivel_estres_cont[nivel_estres_cont < 1] <- 1
nivel_estres_cont[nivel_estres_cont > 5] <- 5

# Redondeamos a Likert (1–5)
nivel_estres <- round(nivel_estres_cont)
nivel_estres[nivel_estres < 1] <- 1
nivel_estres[nivel_estres > 5] <- 5

# Salud autopercibida: inversa del estrés + efecto del sueño
indice_salud <- 0.4 * (horas_sueno - 6) -
                0.3 * (nivel_estres - 3) +
                rnorm(n, mean = 0, sd = 0.7)

salud_z <- scale(indice_salud)
salud_autopercibida_cont <- 3 + as.numeric(salud_z)
salud_autopercibida_cont[salud_autopercibida_cont < 1] <- 1
salud_autopercibida_cont[salud_autopercibida_cont > 5] <- 5

salud_autopercibida <- round(salud_autopercibida_cont)
salud_autopercibida[salud_autopercibida < 1] <- 1
salud_autopercibida[salud_autopercibida > 5] <- 5

# Ítems de estrés (estres_1 a estres_4) correlacionados
# con nivel_estres pero con ruido
estres_1 <- pmin(pmax(round(nivel_estres + rnorm(n, 0, 0.6)), 1), 5)
estres_2 <- pmin(pmax(round(nivel_estres + rnorm(n, 0, 0.6)), 1), 5)
estres_3 <- pmin(pmax(round(nivel_estres + rnorm(n, 0, 0.6)), 1), 5)
estres_4 <- pmin(pmax(round(nivel_estres + rnorm(n, 0, 0.6)), 1), 5)

# 4. Promedio de notas (0-10) ----------------------------------

# Queremos que:
#   - más horas de estudio = más nota
#   - más horas de sueño (dentro de un rango razonable) = mejor nota
#   - más uso de redes = peor nota
#   - más estrés = peor nota
#   - trabajar también puede afectar (ligeramente) negativamente

# Construimos un "score" lineal
score_notas <- 6 +
  0.4 * horas_estudio +
  0.25 * (horas_sueno - 7) -
  0.2 * uso_redes_horas -
  0.3 * (nivel_estres - 3) -
  0.2 * trabaja +
  rnorm(n, mean = 0, sd = 0.7)

promedio_notas <- score_notas
promedio_notas[promedio_notas < 4] <- 4   # truncar a una escala razonable
promedio_notas[promedio_notas > 10] <- 10

# Redondeo a dos decimales
promedio_notas <- round(promedio_notas, 2)

# 5. Construcción del data.frame final -------------------------

datos <- data.frame(
  id,
  sexo,
  edad,
  grupo_edad,
  tipo_universidad,
  carrera,
  trabaja,
  horas_estudio,
  horas_sueno,
  uso_redes_horas,
  nivel_estres,
  salud_autopercibida,
  estres_1,
  estres_2,
  estres_3,
  estres_4,
  promedio_notas
)

# Convertir algunas a factor
datos$sexo            <- factor(datos$sexo)
datos$grupo_edad      <- factor(datos$grupo_edad,
                                levels = c("18-20", "21-23", "24-26", "27-30"))
datos$tipo_universidad<- factor(datos$tipo_universidad)
datos$carrera         <- factor(datos$carrera)
datos$trabaja         <- factor(datos$trabaja, levels = c(0,1),
                                labels = c("No", "Sí"))

# 6. Vista rápida ----------------------------------------------

str(datos)
'data.frame':   400 obs. of  17 variables:
 $ id                 : int  1 2 3 4 5 6 7 8 9 10 ...
 $ sexo               : Factor w/ 2 levels "F","M": 1 2 1 2 2 1 1 2 2 1 ...
 $ edad               : num  27 25 21 23 21 21 20 21 26 22 ...
 $ grupo_edad         : Factor w/ 4 levels "18-20","21-23",..: 4 3 2 2 2 2 1 2 3 2 ...
 $ tipo_universidad   : Factor w/ 2 levels "Privada","Pública": 1 1 2 1 2 1 2 2 1 2 ...
 $ carrera            : Factor w/ 5 levels "Administración",..: 4 1 2 3 3 1 5 1 4 4 ...
 $ trabaja            : Factor w/ 2 levels "No","Sí": 1 1 1 1 1 1 1 1 1 1 ...
 $ horas_estudio      : num  3.24 1.59 3.52 1.6 3.26 ...
 $ horas_sueno        : num  6.51 7.46 6.35 6.21 5.09 ...
 $ uso_redes_horas    : num  2.58 3.93 2.53 5.69 3.81 ...
 $ nivel_estres       : num  2 2 2 3 4 3 1 1 3 2 ...
 $ salud_autopercibida: num  3 3 2 4 2 3 4 5 4 4 ...
 $ estres_1           : num  1 2 1 4 3 3 1 2 3 2 ...
 $ estres_2           : num  2 3 2 3 4 4 1 1 4 2 ...
 $ estres_3           : num  2 2 2 2 3 4 1 1 2 3 ...
 $ estres_4           : num  2 2 2 2 5 3 1 1 3 3 ...
 $ promedio_notas     : num  6.52 6.34 5.95 5.28 5.74 6.75 6.67 8.68 4.66 6.09 ...
summary(datos)
       id        sexo         edad       grupo_edad  tipo_universidad
 Min.   :  1.0   F:229   Min.   :18.00   18-20: 97   Privada:152     
 1st Qu.:100.8   M:171   1st Qu.:21.00   21-23:187   Pública:248     
 Median :200.5           Median :22.00   24-26:102                   
 Mean   :200.5           Mean   :22.15   27-30: 14                   
 3rd Qu.:300.2           3rd Qu.:24.00                               
 Max.   :400.0           Max.   :28.00                               
           carrera   trabaja  horas_estudio    horas_sueno    uso_redes_horas
 Administración:94   No:258   Min.   :0.000   Min.   :4.000   Min.   :0.000  
 Contaduría    :74   Sí:142   1st Qu.:1.713   1st Qu.:6.148   1st Qu.:2.324  
 Economía      :70            Median :2.589   Median :6.841   Median :3.374  
 Ingeniería    :94            Mean   :2.524   Mean   :6.858   Mean   :3.389  
 Otra          :68            3rd Qu.:3.306   3rd Qu.:7.684   3rd Qu.:4.495  
                              Max.   :6.568   Max.   :9.000   Max.   :8.000  
  nivel_estres  salud_autopercibida    estres_1        estres_2    
 Min.   :1.00   Min.   :1.000       Min.   :1.000   Min.   :1.000  
 1st Qu.:2.00   1st Qu.:2.000       1st Qu.:2.000   1st Qu.:2.000  
 Median :3.00   Median :3.000       Median :3.000   Median :3.000  
 Mean   :2.99   Mean   :2.982       Mean   :2.987   Mean   :2.985  
 3rd Qu.:4.00   3rd Qu.:4.000       3rd Qu.:4.000   3rd Qu.:4.000  
 Max.   :5.00   Max.   :5.000       Max.   :5.000   Max.   :5.000  
    estres_3        estres_4     promedio_notas 
 Min.   :1.000   Min.   :1.000   Min.   :4.000  
 1st Qu.:2.000   1st Qu.:2.000   1st Qu.:5.540  
 Median :3.000   Median :3.000   Median :6.300  
 Mean   :2.933   Mean   :2.993   Mean   :6.228  
 3rd Qu.:4.000   3rd Qu.:4.000   3rd Qu.:6.930  
 Max.   :5.000   Max.   :5.000   Max.   :8.680  
# 7. Guardar en CSV --------------------------------------------

write.csv(datos, file = "encuesta_salud_estudiantes.csv", row.names = FALSE)

1 Configuración inicial en R

Actividad 1. Carga de datos y estructura

  1. Importamos el archivo encuesa_salud_estudiantes.csv en R y lo asignamos al objeto datos.
datos <- read.csv("encuesta_salud_estudiantes.csv", header = TRUE)
  1. Mostramos la estructura del objeto usando la función str(datos).
str(datos)
'data.frame':   400 obs. of  17 variables:
 $ id                 : int  1 2 3 4 5 6 7 8 9 10 ...
 $ sexo               : chr  "F" "M" "F" "M" ...
 $ edad               : int  27 25 21 23 21 21 20 21 26 22 ...
 $ grupo_edad         : chr  "27-30" "24-26" "21-23" "21-23" ...
 $ tipo_universidad   : chr  "Privada" "Privada" "Pública" "Privada" ...
 $ carrera            : chr  "Ingeniería" "Administración" "Contaduría" "Economía" ...
 $ trabaja            : chr  "No" "No" "No" "No" ...
 $ horas_estudio      : num  3.24 1.59 3.52 1.6 3.26 ...
 $ horas_sueno        : num  6.51 7.46 6.35 6.21 5.09 ...
 $ uso_redes_horas    : num  2.58 3.93 2.53 5.69 3.81 ...
 $ nivel_estres       : int  2 2 2 3 4 3 1 1 3 2 ...
 $ salud_autopercibida: int  3 3 2 4 2 3 4 5 4 4 ...
 $ estres_1           : int  1 2 1 4 3 3 1 2 3 2 ...
 $ estres_2           : int  2 3 2 3 4 4 1 1 4 2 ...
 $ estres_3           : int  2 2 2 2 3 4 1 1 2 3 ...
 $ estres_4           : int  2 2 2 2 5 3 1 1 3 3 ...
 $ promedio_notas     : num  6.52 6.34 5.95 5.28 5.74 6.75 6.67 8.68 4.66 6.09 ...

El dataset contiene 400 observaciones y 17 variables. Entre las variables numéricas se incluyen: edad (int), horas_estudio (num) y promedio_notas (num). Entre las variables categóricas se encuentran: sexo (chr), grupo_edad (chr) y tipo_universidad (chr).

Actividad 2. Limpieza mínima

  1. Verifica si hay valores perdidos (NA) en las variables promedio_nota, horas_estudio, horas_sueno, uso_redes_horas y salud_autopercibida.
sapply(datos[, c("promedio_notas",
                 "horas_sueno",
                 "uso_redes_horas",
                 "horas_estudio",
                 "salud_autopercibida")],
       function(x) sum(is.na(x)))
     promedio_notas         horas_sueno     uso_redes_horas       horas_estudio 
                  0                   0                   0                   0 
salud_autopercibida 
                  0 

Ninguna de las variables analizadas presenta valores perdidos (NA). Esto significa que todas las observaciones en estas variables están completas, lo cual facilita su análisis estadístico sin necesidad de imputación o eliminación de filas.

  1. Describe que decisión tomarías si hubiera pocos valores perdidos (por ejemplo, eliminarlos) y que alternativa propondrías si hubiera muchos valores perdidos (sin necesidad de implementarla).

En caso de existir pocos valores perdidos, una opción válida sería eliminar las observaciones afectadas, ya que su impacto estadístico sería mínimo. En cambio, si la cantidad de valores perdidos fuera considerable, se recomendaría utilizar algún método como (media, mediana, modelos predictivos, etc.) para evitar la pérdida excesiva de información.

Actividad 3. Recodificación básica

  1. A partir de la variable sexo, crea una nueva variable factor llamada sexo con etiquetas “Masculino” y “Femenino.
summary(datos$sexo)
   Length     Class      Mode 
      400 character character 
head(datos$sexo)
[1] "F" "M" "F" "M" "M" "F"
table(datos$sexo)

  F   M 
229 171 
datos$sexo_factor <- factor(datos$sexo,
                            levels = c("M", "F"),
                            labels = c("Masculino", "Femenino"))

table(datos$sexo_factor)

Masculino  Femenino 
      171       229 

La variable sexo fue recodificada a un factor llamado sexo_factor, asignando las etiquetas “Masculino” y “Femenino” a los valores originales "M" y "F".

Al verificar la distribución mediante table(datos$sexo_factor), se observa que en la base de datos hay 171 estudiantes masculinos y 229 estudiantes femeninos. Esto indica que la muestra contiene una mayor proporción de mujeres, lo cual es relevante para cualquier análisis que compare niveles de salud, estrés o rendimiento académico entre sexos. Verifica que R la reconozca como factor usando str() y table().

str(datos$sexo)
 chr [1:400] "F" "M" "F" "M" "M" "F" "F" "M" "M" "F" "M" "F" "M" "M" "F" ...
table(datos$sexo)

  F   M 
229 171 

Se creó la variable sexo_factor a partir de sexo, convirtiéndola en factor con las etiquetas “Masculino” y “Femenino”. La tabla de frecuencias muestra que hay 171 hombres y 229 mujeres en la muestra. Esto indica que la mayor parte de los participantes son mujeres (57%) frente a hombres (43%). Por lo tanto, la muestra presenta un ligero predominio del sexo femenino.

2 Estadística descriptiva y gráficos

Actividad 4. Medidas descriptiva

  1. Calcula para promedio_notas, horas_estudio y horas_sueno: media, mediana, desviación estándar, mínimo, máximo y cuartiles.
summary(datos[, c("promedio_notas", "horas_estudio", "horas_sueno")])
 promedio_notas  horas_estudio    horas_sueno   
 Min.   :4.000   Min.   :0.000   Min.   :4.000  
 1st Qu.:5.540   1st Qu.:1.713   1st Qu.:6.148  
 Median :6.300   Median :2.589   Median :6.841  
 Mean   :6.228   Mean   :2.524   Mean   :6.858  
 3rd Qu.:6.930   3rd Qu.:3.306   3rd Qu.:7.684  
 Max.   :8.680   Max.   :6.568   Max.   :9.000  
sd(datos$promedio_notas)
[1] 0.9655955
sd(datos$horas_estudio)
[1] 1.134729
sd(datos$horas_sueno)
[1] 1.039808

Para las tres variables se obtuvieron sus medidas principales.
En promedio_notas, las notas van desde 4.00 hasta 8.68, con una media de 6.23 y una mediana de 6.30. Esto muestra que las notas se concentran alrededor de ese nivel.

En horas_estudio, los valores van desde 0 hasta 6.57 horas al día, con una media de 2.52 y una mediana de 2.59. Esto indica que, en general, los estudiantes estudian pocas horas al día.

En horas_sueno, los estudiantes duermen entre 4 y 9 horas, con una media de 6.86 y una mediana de 6.84, lo cual refleja que la mayoría duerme entre 6 y 7 horas.

Las desviaciones estándar fueron:

  • promedio_notas: 0.97

  • horas_estudio: 1.13

  • horas_sueno: 1.04

Estas desviaciones ayudan a ver qué tan dispersos están los datos en cada variable.

  1. Interpreta en lenguaje sencillo:
  • ¿Cuál de las tres variables presenta mayor dispersión?

La variable con mayor dispersión es horas_estudio, porque tiene la desviación estándar más alta (1.13).
Esto significa que, entre las tres variables, es en las horas de estudio donde los estudiantes muestran más diferencia entre sí.

  • ¿Los estudiantes duermen, en promedio, más o menos de 7 horas?

El promedio de horas_sueno es 6.86, que es un valor menor a 7.
Por lo tanto, los estudiantes duermen en promedio menos de 7 horas al día.

Actividad 5. Distribuciones y forma

  1. Construye un histograma y un diagrama de caja (boxplot) para la variable promedio_notas.

Histograma de promedio_notas

hist(datos$promedio_notas,
     main = "Histograma de Promedio de Notas",
     xlab = "Promedio de notas",
     ylab = "Frecuencia")

Boxplot de promedio_notas

boxplot(datos$promedio_notas,
        main = "Diagrama de Caja de Promedio de Notas",
        ylab = "Promedio de notas")

  1. Comenta:
  • ¿La distribución parece aproximadamente simétrica, sesgada a la izquierda o a la derecha?
En el histograma, los valores se concentran alrededor de 6 y 7, y las barras de ambos lados bajan de forma parecida. Esto muestra que la distribución es bastante simétrica, sin inclinación fuerte hacia la izquierda o hacia la derecha.
  • ¿Se observan posibles valores atípicos (outliers)?

    En el boxplot no aparecen puntos sueltos fuera de los límites, lo que indica que no hay valores claramente atípicos. Las notas están dentro de un rango normal y no se ven observaciones extremas.

Actividad 6. Gráficos por grupos

  1. Elabora un diagrama de caja de promedio_notas por sexo_factor.
boxplot(promedio_notas ~ sexo_factor,
        data = datos,
        main = "Promedio de Notas por Sexo",
        xlab = "Sexo",
        ylab = "Promedio de notas")

  • ¿Qué grupo parece tener mayor promedio de notas?

En el boxplot se observa que la mediana de Femenino está un poco más alta que la de Masculino.
Esto indica que las mujeres tienen un promedio de notas ligeramente mayor que los hombres.
La diferencia no es muy grande, pero sí se nota que el grupo femenino está un poco más arriba.

  1. Realiza un gráfico de barras del valor medio de nivel_estres por carrera (o por sexo_factor si lo prefieres).

Por carrera:

library(dplyr)
Warning: package 'dplyr' was built under R version 4.4.3

Adjuntando el paquete: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
prom_estres <- datos %>%
  group_by(carrera) %>%
  summarise(media_estres = mean(nivel_estres))

barplot(prom_estres$media_estres,
        names.arg = prom_estres$carrera,
        las = 2,
        main = "Nivel de Estrés Promedio por Carrera",
        ylab = "Nivel de estrés promedio",
        cex.names = 0.8)

  • ¿Se observan diferencias claras en el nivel de estrés entre los grupos?

El gráfico de barras muestra que los promedios de estrés por carrera son muy parecidos.
Las barras tienen alturas casi iguales, así que no hay diferencias claras en el nivel de estrés entre los grupos. En general, todas las carreras presentan un nivel de estrés similar.

3 Contrastes de hipótesis paramétricos

Actividad 7. Comparación de medias entre dos grupos

  1. Plantea las hipótesis:
  • H0: No hay diferencia en el promedio de notas entre hombres y mujeres.

  • H1: Sí existe una diferencia en el promedio de notas entre hombres y mujeres.

  1. Revisa los supuestos de la prueba:
  • Normalidad aproximada de promedio_notas en cada grupo
    (puede ser con histogramas, Q-Q plots o prueba Shapiro-Wilk)

Normalidad

shapiro.test(datos$promedio_notas[datos$sexo_factor == "Masculino"])

    Shapiro-Wilk normality test

data:  datos$promedio_notas[datos$sexo_factor == "Masculino"]
W = 0.99421, p-value = 0.7404
shapiro.test(datos$promedio_notas[datos$sexo_factor == "Femenino"])

    Shapiro-Wilk normality test

data:  datos$promedio_notas[datos$sexo_factor == "Femenino"]
W = 0.98833, p-value = 0.05955

Homogeneidad de varianzas (var.test o prueba de Levene)

var.test(promedio_notas ~ sexo_factor, data = datos)

    F test to compare two variances

data:  promedio_notas by sexo_factor
F = 0.99281, num df = 170, denom df = 228, p-value = 0.9655
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.7512643 1.3197269
sample estimates:
ratio of variances 
         0.9928111 

Prueba t

t.test(promedio_notas ~ sexo_factor, data = datos)

    Welch Two Sample t-test

data:  promedio_notas by sexo_factor
t = 0.11435, df = 367.07, p-value = 0.909
alternative hypothesis: true difference in means between group Masculino and group Femenino is not equal to 0
95 percent confidence interval:
 -0.1808767  0.2032123
sample estimates:
mean in group Masculino  mean in group Femenino 
               6.234094                6.222926 
  1. Si los supuestos se cumplen, realiza una prueba t para dos muestras independientes:
t.test(promedio_notas ~ sexo_factor, data = datos, var.equal = TRUE/FALSE)

    Two Sample t-test

data:  promedio_notas by sexo_factor
t = 0.11429, df = 398, p-value = 0.9091
alternative hypothesis: true difference in means between group Masculino and group Femenino is not equal to 0
95 percent confidence interval:
 -0.1809280  0.2032637
sample estimates:
mean in group Masculino  mean in group Femenino 
               6.234094                6.222926 
  1. Reporta el estadístico t, los grados de libertad, el valor-p y la conclusión en el contexto del problema.

    El resultado de la prueba t arrojó un estadístico t = 0.114, con df ≈ 398, y un valor-p = 0.909. Como el valor-p es mucho mayor que 0.05, no se rechaza la hipótesis nula, lo que significa que no hay evidencia de una diferencia significativa en el promedio de notas entre hombres y mujeres.

    Ambos grupos presentan medias muy similares (Masculino = 6.23, Femenino = 6.22).

  2. Si los supuestos no se cumplen claramente, comenta las limitaciones de la prueba.

En este caso los supuestos sí se cumplen:

  • Las pruebas de normalidad tuvieron valores-p mayores a 0.05.

  • La prueba de homogeneidad de varianzas también tuvo un valor-p alto (0.9655).

Por lo tanto, la prueba t es adecuada y sus resultados son confiables. Si no se hubieran cumplido, la limitación sería que la prueba t podría no ser válida y habría que usar una prueba no paramétrica como Mann-Whitney.)

Actividad 8. ANOVA de una vía

  1. Plantea las hipótesis:
  • H0: las medias de promedio_notas son iguales en todos los grupos.

  • H1: al menos una de las medias difiere.

  1. Ajusta un modelo ANOVA de una vía:
anova_univ <- aov(promedio_notas ~ tipo_universidad, data = datos)
summary(anova_univ)
                  Df Sum Sq Mean Sq F value Pr(>F)
tipo_universidad   1    0.3  0.3186   0.341  0.559
Residuals        398  371.7  0.9339               
  1. Reporta el estadístico F, los grados de libertad y el valor-p.

Los resultados del ANOVA indican que el tipo de universidad no está asociado con diferencias significativas en el promedio de notas. El valor-p de 0.559 muestra que las medias entre los estudiantes de universidades públicas y privadas son estadísticamente similares. Por lo tanto, con los datos disponibles, no se puede concluir que asistir a un tipo de universidad influya en el rendimiento académico promedio.

  1. Si el resultado es significativo, indica qué prueba post hoc utilizarías (por ejemplo, prueba de Tukey) y qué comparaciones realizarías (no es necesario ejecutarla).

Como el resultado no fue significativo, no es necesario realizar pruebas post hoc. Se incluiría una prueba de Tukey solo cuando el valor-p sea menor a 0.05.

4 Contrastes no param´etricos y escala Likert

Actividad 9. Comparación no paramétrica de dos grupos

  1. Plantea las hipótesis en términos de medianas o distribuciones:
  • H0: las distribuciones (o medianas) de nivel estres son iguales en ambos grupos.

  • H1: las distribuciones (o medianas) de nivel estres difieren.

  1. Aplica la prueba de Mann–Whitney (Wilcoxon de rango-suma):
wilcox.test(nivel_estres ~ sexo_factor, data = datos)

    Wilcoxon rank sum test with continuity correction

data:  nivel_estres by sexo_factor
W = 20361, p-value = 0.476
alternative hypothesis: true location shift is not equal to 0
  1. Reporta el estadístico de prueba, el valor-p y la conclusión en el contexto.

El estadístico de la prueba fue W = 20361 y el valor-p obtenido fue 0.476. Como este valor-p es mayor que 0.05, no se rechaza la hipótesis nula. En conclusión, no hay evidencia de que el nivel de estrés sea diferente entre hombres y mujeres; ambos grupos muestran distribuciones muy parecidas.

Actividad 10. Comparación no paramétrica de más de dos grupos

Analiza si la salud autopercibida (salud autopercibida) difiere entre los distintos grupos de edad (grupo edad).

  1. Plantea H0 y H1 para la prueba de Kruskal–Wallis.
    H0: las distribuciones (o medianas) de salud autopercibida son iguales en todos los grupos de edad.
    H1: al menos un grupo de edad tiene una distribución (o mediana) diferente.

  2. Aplica:

kruskal.test(salud_autopercibida ~ grupo_edad)

    Kruskal-Wallis rank sum test

data:  salud_autopercibida by grupo_edad
Kruskal-Wallis chi-squared = 1.6037, df = 3, p-value = 0.6586
  1. Reporta el estadístico de prueba, los grados de libertad y el valor-p.

La prueba de Kruskal-Wallis dio un estadístico chi-cuadrado = 1.6037, con 3 grados de libertad y un valor-p = 0.6586. Como el valor-p es bastante mayor que 0.05, no se rechaza la hipótesis nula. En conclusión, los grupos de edad no muestran diferencias claras en la salud autopercibida; todos los grupos reportan niveles muy parecidos.

  1. Si el resultado es significativo, explica qué prueba post hoc no paramétrica podrías utilizar (por ejemplo, pairwise.wilcox.test() con corrección de Bonferroni) y qué comparaciones realizarías.

Como el resultado no es significativo, no es necesario hacer pruebas post hoc.

Actividad 11. Bloque de ítems Likert de estrés

Considera los ítems estres 1, estres 2, estres 3 y estres 4, todos en escala 1–5 y relacionados con el estrés académico.

  1. Calcula la media y la desviación estándar de cada ítem por separado.

  2. Crea una nueva variable que resuma el estrés académico global, por ejemplo:
    estres_total = estres_1 + estres_2 + estres_3 + estres_4

**o bien la media de dichos ítems.**


::: {.cell}

```{.r .cell-code}
# 1. Media y desviación estándar de cada ítem
mean(datos$estres_1); sd(datos$estres_1)
```

::: {.cell-output .cell-output-stdout}

```
[1] 2.9875
```


:::

::: {.cell-output .cell-output-stdout}

```
[1] 1.131612
```


:::

```{.r .cell-code}
mean(datos$estres_2); sd(datos$estres_2)
```

::: {.cell-output .cell-output-stdout}

```
[1] 2.985
```


:::

::: {.cell-output .cell-output-stdout}

```
[1] 1.114846
```


:::

```{.r .cell-code}
mean(datos$estres_3); sd(datos$estres_3)
```

::: {.cell-output .cell-output-stdout}

```
[1] 2.9325
```


:::

::: {.cell-output .cell-output-stdout}

```
[1] 1.162464
```


:::

```{.r .cell-code}
mean(datos$estres_4); sd(datos$estres_4)
```

::: {.cell-output .cell-output-stdout}

```
[1] 2.9925
```


:::

::: {.cell-output .cell-output-stdout}

```
[1] 1.102489
```


:::

```{.r .cell-code}
# 2. Crear variable estres_total
datos$estres_total <- datos$estres_1 + datos$estres_2 + datos$estres_3 + datos$estres_4

# Revisar su distribución
summary(datos$estres_total)
```

::: {.cell-output .cell-output-stdout}

```
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    4.0     9.0    12.0    11.9    15.0    20.0 
```


:::

```{.r .cell-code}
sd(datos$estres_total)
```

::: {.cell-output .cell-output-stdout}

```
[1] 3.966273
```


:::

```{.r .cell-code}
# Si querés la versión de promedio:
datos$estres_promedio <- rowMeans(datos[, c("estres_1","estres_2","estres_3","estres_4")])
summary(datos$estres_promedio)
```

::: {.cell-output .cell-output-stdout}

```
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   2.250   3.000   2.974   3.750   5.000 
```


:::

```{.r .cell-code}
sd(datos$estres_promedio)
```

::: {.cell-output .cell-output-stdout}

```
[1] 0.9915683
```


:::
:::
  1. Explica brevemente cómo interpretar un valor alto de estres_total.

    Un valor alto de estres_total significa que el estudiante respondió con valores altos en los cuatro ítems de estrés. Esto indica que la persona percibe un nivel más elevado de estrés académico. En cambio, valores bajos reflejan que el estudiante siente poco estrés. Esta medida sirve para resumir el estrés general combinando todas las preguntas del bloque.

  2. (Opcional) Menciona cómo podrías evaluar la consistencia interna del conjunto de ítems (por ejemplo, usando el alfa de Cronbach).

La consistencia interna del bloque de ítems se puede evaluar usando el alfa de Cronbach. Este indicador muestra qué tan bien funcionan los ítems juntos y si realmente están midiendo el mismo concepto de estrés académico. Un valor alto de alfa indica que los cuatro ítems están bien relacionados entre sí.

5 Modelos de regresión lineal

Actividad 12. Regresión lineal simple I

Ajusta un modelo de regresión lineal simple:

modelo1 <- lm(promedio_notas ~ horas_estudio, data = datos)
  1. Escribe la ecuación estimada del modelo:
    \[ \hat{Y} = 5.42159 + 0.31942 \times \text{horas\_estudio} \]

  2. Interpreta el coeficiente β̂1 en el contexto del problema.

El valor de β̂1 = 0.31942 significa que, por cada hora adicional de estudio al día, el promedio de notas aumenta en aproximadamente 0.32 puntos, en promedio.
Es decir, estudiar más horas está asociado con mejores calificaciones.

  1. Comenta el valor de R²:
    • ¿Qué porcentaje de la variabilidad de las notas explica este modelo?

    summary(modelo1)  # Para obtener coeficientes y R^2
    
    Call:
    lm(formula = promedio_notas ~ horas_estudio, data = datos)
    
    Residuals:
         Min       1Q   Median       3Q      Max 
    -2.63945 -0.62850  0.03278  0.64880  2.15003 
    
    Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
    (Intercept)    5.42159    0.10937  49.570  < 2e-16 ***
    horas_estudio  0.31942    0.03954   8.079 7.87e-15 ***
    ---
    Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
    
    Residual standard error: 0.8961 on 398 degrees of freedom
    Multiple R-squared:  0.1409,    Adjusted R-squared:  0.1387 
    F-statistic: 65.27 on 1 and 398 DF,  p-value: 7.866e-15

El R² = 0.1409 indica que el modelo explica alrededor del 14% de la variabilidad en las notas de los estudiantes.
Esto quiere decir que las horas de estudio sí tienen relación con las notas, pero todavía hay muchos otros factores que también influyen.

Actividad 13. Regresión lineal simple II

Repite el análisis usando horas_sueno como predictor:

modelo2 <- lm(promedio_notas ~ horas_sueno, data = datos)
summary(modelo2)  # Esto da coeficientes y R^2

Call:
lm(formula = promedio_notas ~ horas_sueno, data = datos)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.52898 -0.61751  0.03524  0.66708  2.11177 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   3.7226     0.2968  12.542  < 2e-16 ***
horas_sueno   0.3653     0.0428   8.536 2.96e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.8889 on 398 degrees of freedom
Multiple R-squared:  0.1547,    Adjusted R-squared:  0.1526 
F-statistic: 72.86 on 1 and 398 DF,  p-value: 2.962e-16
  1. Escribe la ecuación estimada del nuevo modelo.

    $$

    \hat{Y} = 3.7226 + 0.3653 \times \text{horas\_sueno}

    $$

  2. Compara el valor de R² de modelo1 y modelo2.

  • Modelo 1 (horas_estudio): R² = 0.1409

  • Modelo 2 (horas_sueno): R² = 0.1547

El modelo con horas_sueno explica un porcentaje ligeramente mayor de la variabilidad de las notas.

  1. Indica cuál de las dos variables (horas de estudio o horas de sueño) parece ser mejor predictor individual del promedio de notas.

Entre las dos variables, horas_sueno es un mejor predictor individual del promedio de notas, porque tiene un R² un poco más alto y un efecto positivo más fuerte en el modelo.

Actividad 14. Regresión lineal múltiple

Ajusta ahora un modelo con varios predictores:

modelo3 <- lm(promedio_notas ~ horas_estudio +
                                horas_sueno +
                                uso_redes_horas +
                                nivel_estres +
                                salud_autopercibida,
              data = datos)

summary(modelo3)   # Para obtener coeficientes, significancia y R^2

Call:
lm(formula = promedio_notas ~ horas_estudio + horas_sueno + uso_redes_horas + 
    nivel_estres + salud_autopercibida, data = datos)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.04981 -0.44270  0.00098  0.46928  1.50841 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)          5.19764    0.30414  17.090  < 2e-16 ***
horas_estudio        0.39779    0.03115  12.770  < 2e-16 ***
horas_sueno          0.24009    0.03925   6.118 2.29e-09 ***
uso_redes_horas     -0.13959    0.02270  -6.150 1.91e-09 ***
nivel_estres        -0.36348    0.04398  -8.265 2.16e-15 ***
salud_autopercibida -0.02028    0.04282  -0.474    0.636    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.6716 on 394 degrees of freedom
Multiple R-squared:  0.5223,    Adjusted R-squared:  0.5163 
F-statistic: 86.16 on 5 and 394 DF,  p-value: < 2.2e-16
  1. Escribe la forma general de la ecuación del modelo e identifica claramente cada coeficiente.

\[ \hat{Y} = 5.19764 + 0.39779 \cdot \text{horas\_estudio} + 0.24009 \cdot \text{horas\_sueno} - 0.13959 \cdot \text{uso\_redes\_horas} - 0.36348 \cdot \text{nivel\_estres} - 0.02028 \cdot \text{salud\_autopercibida} \]

  1. A partir del resumen del modelo (summary(modelo3)):
    • Identifica qué predictores son estadísticamente significativos (valor-p menor que 0.05).
    • Indica el signo (positivo o negativo) de cada coeficiente e interpreta dicho signo en el contexto.

Significativos (p < 0.05):

  • horas_estudio (+)

  • horas_sueno (+)

  • uso_redes_horas (–)

  • nivel_estres (–)

No significativo:

  • salud_autopercibida (p = 0.636)

Interpretación de cada signo

  • horas_estudio (+): estudiar más está asociado con mejores notas.

  • horas_sueno (+): dormir más también mejora el promedio.

  • uso_redes_horas (–): más horas en redes se relaciona con notas más bajas.

  • nivel_estres (–): mayor estrés se asocia con peor rendimiento.

  • salud_autopercibida: no muestra relación clara con las notas en este modelo.

  1. Compara el R² y el R² ajustado de modelo3 con los valores de los modelos simples (modelo1 y modelo2).
  • modelo1 (horas_estudio): R² = 0.1409

  • modelo2 (horas_sueno): R² = 0.1547

  • modelo3 (múltiple):

    • R² = 0.5223

    • R² ajustado = 0.5163

El modelo múltiple explica más de la mitad de la variabilidad de las notas, mucho más que los modelos simples.

  1. Comenta si la inclusión de más variables mejora de forma importante la capacidad explicativa del modelo y si los resultados tienen sentido práctico.

Agregar más variables mejora bastante la capacidad explicativa del modelo. Esto tiene sentido porque el rendimiento académico depende de varios factores a la vez, no solo de horas de estudio o sueño. Los resultados reflejan relaciones lógicas: estudiar y dormir ayudan, mientras que el estrés y el uso excesivo de redes afectan negativamente.

Actividad 15. Diagnóstico de supuestos

  1. Genera el gráfico de residuos frente a los valores ajustados y el gráfico Q–Q de residuos del modelo múltiple.

    # Gráfico de residuos vs valores ajustados
    plot(modelo3, which = 1)

    # Gráfico Q-Q de los residuos
    plot(modelo3, which = 2)

  2. Comenta:
    • ¿Se aprecia una varianza aproximadamente constante de los residuos (homocedasticidad)?

En el gráfico de Residuos vs Fitted los puntos están dispersos sin formar una figura rara ni un patrón en forma de “cono”. La nube se ve bastante pareja arriba y abajo, así que la varianza parece más o menos constante. No se ve un problema serio de heterocedasticidad.
¿Los residuos parecen aproximadamente normales?

En el gráfico Q–Q, los puntos siguen bastante bien la línea diagonal, solo se despegan un poquito en las colas. Eso es normal en datos reales. Por eso, los residuos se ven aproximadamente normales, y la suposición se cumple razonablemente.

  1. Menciona posibles consecuencias si estos supuestos no se cumplieran.

Si los residuos no fueran normales o la varianza no fuera constante, las pruebas de significancia podrían ser menos confiables y algunas conclusiones del modelo podrían volverse dudosas. Pero en este caso no hay señales fuertes de problemas.

6 Regresión logística

Actividad 16. Creación de variable y descriptivos

Define una variable binaria estres_alto de la siguiente forma:

estres_alto = 1 si nivel_estres ≥ 4;
estres_alto = 0 si nivel_estres ≤ 3.

Actividad 16

# 1. Crear variable binaria
datos$estres_alto <- ifelse(datos$nivel_estres >= 4, 1, 0)

# Ver distribución
table(datos$estres_alto)

  0   1 
278 122 
# 2. Proporción de estudiantes con estrés alto
prop.table(table(datos$estres_alto))

    0     1 
0.695 0.305 
  1. Crea la variable estres_alto en R y verifica su distribución (por ejemplo, con table(estres_alto)).
Distribución de estres_alto\
Al crear la variable estres_alto, la distribución obtenida fue:

-    0 = 278 estudiantes

-   1 = 122 estudiantes

Esto muestra cuántos estudiantes tienen estrés bajo/moderado (0) y cuántos tienen estrés alto (1).
  1. Calcula la proporción de estudiantes con estres_alto = 1.

La proporción resultó:

  • estres_alto = 0 → 0.695 (69.5%)

  • estres_alto = 1 → 0.305 (30.5%)

Esto significa que aproximadamente el 30.5% de los estudiantes presentan estrés alto, mientras que el 69.5% no.

Actividad 17. Modelo de regresión logística

Ajusta un modelo de regresión logística binaria para explicar la probabilidad de tener estrés alto en función de algunas variables explicativas:

modelo_log <- glm(estres_alto ~ horas_estudio + horas_sueno + uso_redes_horas + salud_autopercibida,
                  data = datos, family = binomial)
  1. Indica, antes de ver los resultados, qué signo esperas en cada coeficiente:
    • Horas de estudio.
    • Horas de sueño.
    • Uso de redes sociales.
    • Salud autopercibida.

    • Horas de estudio: signo positivo, porque estudiar más debería aumentar el estrés alto.
    • Horas de sueño: signo negativo, porque dormir más reduce el estrés.

    • Uso de redes sociales: signo positivo, porque más uso suele aumentar el estrés.

    • Salud autopercibida: signo negativo, porque mejor salud se relaciona con menos estrés.

    modelo_log <- glm(estres_alto ~ horas_estudio +
                                     horas_sueno +
                                     uso_redes_horas +
                                     salud_autopercibida,
                      data = datos, family = binomial)
    
    summary(modelo_log)   # coeficientes y significancia
    
    Call:
    glm(formula = estres_alto ~ horas_estudio + horas_sueno + uso_redes_horas + 
        salud_autopercibida, family = binomial, data = datos)
    
    Coefficients:
                        Estimate Std. Error z value Pr(>|z|)    
    (Intercept)          1.46801    0.93399   1.572  0.11601    
    horas_estudio        0.52250    0.12333   4.236 2.27e-05 ***
    horas_sueno         -0.44231    0.14880  -2.972  0.00295 ** 
    uso_redes_horas      0.50167    0.09142   5.488 4.07e-08 ***
    salud_autopercibida -0.88752    0.16900  -5.251 1.51e-07 ***
    ---
    Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
    
    (Dispersion parameter for binomial family taken to be 1)
    
        Null deviance: 492.03  on 399  degrees of freedom
    Residual deviance: 362.93  on 395  degrees of freedom
    AIC: 372.93
    
    Number of Fisher Scoring iterations: 5
    # Odds ratios
    exp(coef(modelo_log))
            (Intercept)       horas_estudio         horas_sueno     uso_redes_horas 
              4.3405734           1.6862324           0.6425485           1.6514843 
    salud_autopercibida 
              0.4116749 
    # Intervalos de confianza opcionales
    exp(confint(modelo_log))
    Waiting for profiling to be done...
                            2.5 %     97.5 %
    (Intercept)         0.7014693 27.6118574
    horas_estudio       1.3328503  2.1645346
    horas_sueno         0.4773195  0.8569151
    uso_redes_horas     1.3884191  1.9887057
    salud_autopercibida 0.2919581  0.5673375
  2. Interpreta al menos uno de los coeficientes estimados (por ejemplo, el de salud_autopercibida) en términos de log-odds.

El coeficiente de salud_autopercibida es –0.88752, lo que significa que por cada punto adicional en salud autopercibida (es decir, sentirse más sano), los log-odds de tener estrés alto disminuyen en 0.8875.\
En pocas palabras: a mejor salud, menor probabilidad de estar en estrés alto.
  1. Calcula los odds ratios mediante exp(coef(modelo_log)) y comenta su interpretación para uno de los predictores.

El odds ratio para salud_autopercibida es 0.4117.
Esto significa que cada punto adicional en salud autopercibida reduce los chances de tener estrés alto en un 59% aproximadamente (porque 1 – 0.4117 = 0.588).
Así, mejor salud autopercibida está fuertemente asociada con menos estrés alto.

Actividad 18. Evaluación del modelo

  1. Obtén las probabilidades predichas del modelo con:

    predict(modelo_log, type = "response")
              1           2           3           4           5           6 
    0.252431461 0.155570106 0.498246799 0.243607888 0.741976364 0.285868579 
              7           8           9          10          11          12 
    0.005208753 0.037704999 0.226499551 0.059848572 0.040613462 0.228329681 
             13          14          15          16          17          18 
    0.158239824 0.273831934 0.106371430 0.946569957 0.029234543 0.032215511 
             19          20          21          22          23          24 
    0.049219434 0.079336136 0.373440380 0.150108294 0.286301439 0.114938366 
             25          26          27          28          29          30 
    0.152062444 0.042906301 0.093792831 0.108710620 0.740002755 0.016541560 
             31          32          33          34          35          36 
    0.509924235 0.695983867 0.836704424 0.051033689 0.117622628 0.235382194 
             37          38          39          40          41          42 
    0.022882870 0.153567152 0.445359657 0.134005343 0.469279520 0.741264939 
             43          44          45          46          47          48 
    0.034131080 0.072196540 0.179365342 0.278459579 0.654794824 0.643932655 
             49          50          51          52          53          54 
    0.208457440 0.314434213 0.765453989 0.272238346 0.164324978 0.334313307 
             55          56          57          58          59          60 
    0.296178465 0.166265085 0.344433075 0.439973139 0.196118912 0.494482101 
             61          62          63          64          65          66 
    0.469288043 0.173368546 0.437957467 0.428092687 0.346177903 0.526524976 
             67          68          69          70          71          72 
    0.185007814 0.411195548 0.018328501 0.156152246 0.167359874 0.186913923 
             73          74          75          76          77          78 
    0.169784078 0.545004668 0.197168277 0.018505118 0.168152101 0.111122133 
             79          80          81          82          83          84 
    0.361713959 0.165620592 0.137064158 0.071278362 0.308388644 0.007484583 
             85          86          87          88          89          90 
    0.128994499 0.038490470 0.222107499 0.491264500 0.030024370 0.105067066 
             91          92          93          94          95          96 
    0.456802421 0.857213200 0.339424653 0.196599795 0.239853812 0.129460332 
             97          98          99         100         101         102 
    0.171646542 0.167877598 0.193190376 0.626430359 0.306124492 0.729328393 
            103         104         105         106         107         108 
    0.523873025 0.059583529 0.221980030 0.402851861 0.050039749 0.049816644 
            109         110         111         112         113         114 
    0.119521160 0.378740871 0.516008401 0.007421501 0.464682609 0.070456201 
            115         116         117         118         119         120 
    0.817213042 0.198239422 0.148597717 0.186818224 0.336716808 0.300682076 
            121         122         123         124         125         126 
    0.072340574 0.091402380 0.724968146 0.958469407 0.252555467 0.962266650 
            127         128         129         130         131         132 
    0.828189889 0.178940646 0.755406405 0.307038975 0.012239446 0.788026267 
            133         134         135         136         137         138 
    0.111789678 0.417286101 0.162272762 0.175209761 0.137964408 0.119039904 
            139         140         141         142         143         144 
    0.515550466 0.035327300 0.218254565 0.185268014 0.039177700 0.007185077 
            145         146         147         148         149         150 
    0.038397986 0.138334935 0.281252776 0.395490893 0.006691105 0.239298530 
            151         152         153         154         155         156 
    0.384127051 0.136903458 0.436242313 0.811368112 0.626862836 0.088280421 
            157         158         159         160         161         162 
    0.043502510 0.036654753 0.165240661 0.201040538 0.558108188 0.738549840 
            163         164         165         166         167         168 
    0.203165483 0.144505471 0.066007437 0.677225036 0.643829967 0.080159939 
            169         170         171         172         173         174 
    0.273678896 0.287105322 0.114098057 0.024264055 0.027403188 0.062865747 
            175         176         177         178         179         180 
    0.093252396 0.062447669 0.089818857 0.418791034 0.144799200 0.236674775 
            181         182         183         184         185         186 
    0.847500478 0.052000316 0.045724781 0.815868421 0.304333413 0.005122890 
            187         188         189         190         191         192 
    0.097688990 0.181746214 0.319773485 0.166885503 0.069065967 0.496466052 
            193         194         195         196         197         198 
    0.184426167 0.795881512 0.588481650 0.297577937 0.251417331 0.238766811 
            199         200         201         202         203         204 
    0.122216471 0.400806187 0.845181352 0.310241139 0.481558003 0.236890208 
            205         206         207         208         209         210 
    0.089672170 0.256475798 0.414295484 0.334674808 0.018258394 0.680377595 
            211         212         213         214         215         216 
    0.051833139 0.667869493 0.160032619 0.757535255 0.697089418 0.108759629 
            217         218         219         220         221         222 
    0.703294352 0.010261400 0.315011009 0.584727152 0.298166783 0.418788424 
            223         224         225         226         227         228 
    0.107631904 0.109291862 0.174113707 0.417479368 0.927616093 0.268062593 
            229         230         231         232         233         234 
    0.292381858 0.027379884 0.329453340 0.141716830 0.890432147 0.901797428 
            235         236         237         238         239         240 
    0.131010715 0.433372696 0.444639584 0.343224999 0.060551428 0.244154868 
            241         242         243         244         245         246 
    0.047817614 0.555546170 0.101106956 0.036747411 0.043201267 0.085295838 
            247         248         249         250         251         252 
    0.157521097 0.097581427 0.389641111 0.476695259 0.861328167 0.035359617 
            253         254         255         256         257         258 
    0.023116350 0.479241763 0.252904708 0.499115598 0.044567714 0.072599721 
            259         260         261         262         263         264 
    0.291407234 0.748930238 0.100619375 0.613569847 0.495663957 0.326335459 
            265         266         267         268         269         270 
    0.099797709 0.635395803 0.417739158 0.227286539 0.014902038 0.064782320 
            271         272         273         274         275         276 
    0.119570533 0.010848746 0.288079878 0.064896858 0.085673937 0.019306492 
            277         278         279         280         281         282 
    0.049570997 0.517279566 0.112062061 0.156079770 0.120424101 0.427950485 
            283         284         285         286         287         288 
    0.021148832 0.197801213 0.192178456 0.046887612 0.189290821 0.497052093 
            289         290         291         292         293         294 
    0.587305477 0.597459016 0.529113141 0.082210484 0.554616017 0.701171555 
            295         296         297         298         299         300 
    0.147701155 0.378555080 0.497312124 0.545350846 0.141112088 0.036360764 
            301         302         303         304         305         306 
    0.019411231 0.398654338 0.031128717 0.249830591 0.270302100 0.963103255 
            307         308         309         310         311         312 
    0.700429659 0.716036813 0.385440079 0.009732697 0.018185930 0.506344042 
            313         314         315         316         317         318 
    0.213532772 0.182268996 0.036241081 0.227268602 0.511299337 0.902692663 
            319         320         321         322         323         324 
    0.650008958 0.073517239 0.634776628 0.011592923 0.410568306 0.571345483 
            325         326         327         328         329         330 
    0.319120092 0.031494190 0.760018333 0.085412628 0.508088908 0.732437253 
            331         332         333         334         335         336 
    0.882221144 0.121008168 0.349332091 0.310951389 0.314446017 0.860779753 
            337         338         339         340         341         342 
    0.537782116 0.167547589 0.832832028 0.760816890 0.183549582 0.251860128 
            343         344         345         346         347         348 
    0.019075464 0.912768903 0.234360466 0.086183076 0.173642504 0.300635254 
            349         350         351         352         353         354 
    0.051791327 0.007345362 0.050092893 0.281243699 0.178694588 0.363619808 
            355         356         357         358         359         360 
    0.468557855 0.412642009 0.249712613 0.099002806 0.249256229 0.028171820 
            361         362         363         364         365         366 
    0.360533350 0.171919601 0.616518624 0.134238755 0.351197211 0.100308229 
            367         368         369         370         371         372 
    0.899416879 0.517951682 0.725487952 0.374169357 0.223235774 0.270297282 
            373         374         375         376         377         378 
    0.154245669 0.164012168 0.383378394 0.570057349 0.605120571 0.903537367 
            379         380         381         382         383         384 
    0.257484959 0.007613047 0.026925736 0.027673039 0.011990232 0.875151357 
            385         386         387         388         389         390 
    0.031250344 0.634184485 0.573639843 0.063514672 0.283039292 0.251566534 
            391         392         393         394         395         396 
    0.295326612 0.102522458 0.294694068 0.262262297 0.546010417 0.100072177 
            397         398         399         400 
    0.144967441 0.779550022 0.191970517 0.779813226 
    # 1. Probabilidades predichas
    prob_pred <- predict(modelo_log, type = "response")
    head(prob_pred)
            1         2         3         4         5         6 
    0.2524315 0.1555701 0.4982468 0.2436079 0.7419764 0.2858686 
    # 2. Clasificación usando punto de corte 0.5
    pred_clase <- ifelse(prob_pred >= 0.5, 1, 0)
    
    # 3. Matriz de confusión
    tabla_confusion <- table(Predicho = pred_clase, Real = datos$estres_alto)
    tabla_confusion
            Real
    Predicho   0   1
           0 252  60
           1  26  62
    # Proporción de clasificaciones correctas
    prop_correctas <- sum(diag(tabla_confusion)) / sum(tabla_confusion)
    prop_correctas
    [1] 0.785

Ejemplo de las primeras observaciones:

  • 0.2524

  • 0.1556

  • 0.4982

  • 0.2436

  • 0.7420

0.2859

2. Clasificación con punto de corte 0.5

Se clasificó como:

  • 1 (estrés alto) si probabilidad ≥ 0.5

  • 0 (no estrés alto) si probabilidad < 0.5

3. Matriz de confusión

La matriz obtenida fue:

Predicho \ Real 0 1
0 252 60
1 26 62

Proporción global de aciertos

La proporción de casos correctamente clasificados fue:

0.785
[1] 0.785

Eso equivale al 78.5% de aciertos.}

El modelo logra clasificar correctamente el 78.5% de los estudiantes, lo cual indica que sí es útil para predecir si un estudiante tendrá estrés alto, aunque todavía comete algunos errores principalmente al identificar casos de estrés alto.

7 Manipulación de datos y análisis multivariante exploratorio

Actividad 19. Manipulación de datos

library(ggplot2)
Warning: package 'ggplot2' was built under R version 4.4.3
# Crear data frame con las probabilidades predichas
datos$prob_pred <- predict(modelo_log, type = "response")

# Gráfico de probabilidad vs horas de sueño
ggplot(datos, aes(x = horas_sueno, y = prob_pred)) +
  geom_point(alpha = 0.4) +
  geom_smooth(method = "loess", se = FALSE, color = "blue") +
  labs(title = "Probabilidad predicha de estrés alto según horas de sueño",
       x = "Horas de sueño",
       y = "Probabilidad predicha") +
  theme_minimal()
`geom_smooth()` using formula = 'y ~ x'

  1. Crea un subconjunto de datos llamado datos_filtrados que incluya únicamente a los estudiantes que:

    • Duermen al menos 6 horas (horas_sueno ≥ 6)

    • Estudian al menos 2 horas al día (horas_estudio ≥ 2)

datos_filtrados <- subset(datos, horas_sueno >= 6 & horas_estudio >= 2)
  1. Calcula el promedio de promedio_notas y de nivel_estres en datos_filtrados.
mean(datos_filtrados$promedio_notas)
[1] 6.586948
mean(datos_filtrados$nivel_estres)
[1] 2.976526
  1. Compara estos promedios con los correspondientes en el conjunto total datos. Comenta alguna diferencia relevante.

Primero los promedios del total:

mean(datos$promedio_notas)
[1] 6.2277
mean(datos$nivel_estres)
[1] 2.99

En el subconjunto datos_filtrados (estudiantes que duermen ≥6 horas y estudian ≥2 horas al día), los promedios obtenidos fueron:

  • Promedio de notas: 6.586948

  • Nivel de estrés: 2.976526

En el conjunto total datos, los promedios son:

  • Promedio de notas: 6.2277

  • Nivel de estrés: 2.99

Al comparar ambos grupos, se observa que los estudiantes que duermen al menos 6 horas y estudian al menos 2 horas al día tienen un promedio de notas más alto (6.59 vs. 6.23).
En cuanto al estrés, el valor promedio es ligeramente menor (2.98 vs. 2.99), aunque la diferencia es mínima.

Esto sugiere que mantener hábitos más saludables (dormir suficiente y estudiar regularmente) se asocia con un mejor rendimiento académico, mientras que el nivel de estrés se mantiene prácticamente igual.

Actividad 20. Análisis de componentes principales (opcional / bonus)

1. Selecciona un conjunto de variables numéricas que consideres de interés, por ejemplo: horas_estudio, horas_sueno, uso_redes_horas, nivel_estres, salud_autopercibida.

2. Estandariza estas variables y obtiene los dos primeros componentes principales mediante la función prcomp.

vars <- datos[, c("horas_estudio", "horas_sueno",
                  "uso_redes_horas", "nivel_estres",
                  "salud_autopercibida")]

# PCA estandarizado
pca <- prcomp(vars, scale. = TRUE)

3. Interpreta brevemente qué variables contribuyen más a cada componente principal.

summary(pca)
Importance of components:
                          PC1    PC2    PC3     PC4     PC5
Standard deviation     1.4306 1.0468 1.0071 0.68533 0.61113
Proportion of Variance 0.4093 0.2192 0.2029 0.09394 0.07469
Cumulative Proportion  0.4093 0.6285 0.8314 0.92531 1.00000
pca$rotation
                           PC1       PC2           PC3        PC4        PC5
horas_estudio       -0.1549051 0.5305924  0.7692406339 -0.1992916  0.2510534
horas_sueno          0.5092756 0.4400283 -0.0524666526  0.7274967  0.1225124
uso_redes_horas     -0.2486600 0.5949784 -0.6364359841 -0.2844726  0.3133584
nivel_estres        -0.5766857 0.2845913  0.0002290037  0.3465814 -0.6828783
salud_autopercibida  0.5676659 0.2997588 -0.0215704265 -0.4795708 -0.5978684

Según los resultados, el PC1 es una combinación donde el estrés aumenta hacia un lado (carga negativa en nivel_estres) y la salud y el sueño aumentan hacia el otro (cargas positivas). Esto sugiere que el PC1 representa un eje que va de “más estrés” a “mejor salud y mayor descanso”.

En el PC2, las variables que más pesan son uso_redes_horas y horas_estudio, ambas con cargas positivas altas. Esto indica que el PC2 diferencia principalmente a quienes estudian y usan más redes sociales frente a quienes realizan menos de ambas.

Con esto, los dos componentes capturan patrones generales:
PC1 ….. estrés vs bienestar.
PC2 ….. intensidad de estudio y uso de redes.

En conclusión:

En el PC1, las variables que más aportan son nivel_estres (negativo) y salud_autopercibida y horas_sueno (positivas), así que este componente diferencia entre estudiantes con más estrés versus estudiantes con mejor salud y más sueño.

En el PC2, las cargas más altas son uso_redes_horas y horas_estudio, por lo que este componente separa a quienes estudian y usan redes más tiempo frente a quienes lo hacen menos.