# ========================================
# 1) Paquetes y datos
# ========================================
library(tidyverse)
## Warning: package 'ggplot2' was built under R version 4.4.3
## Warning: package 'purrr' was built under R version 4.4.3
## Warning: package 'lubridate' was built under R version 4.4.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.4     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(scales)
## Warning: package 'scales' was built under R version 4.4.3
## 
## Adjuntando el paquete: 'scales'
## 
## The following object is masked from 'package:purrr':
## 
##     discard
## 
## The following object is masked from 'package:readr':
## 
##     col_factor
library(dplyr)
datos <- read.csv("datos_MOLEC_clean.csv", stringsAsFactors = FALSE)
# ========================================
# 2) Limpieza y variables simples
# ========================================
datos <- datos %>%
  mutate(
    nivel_aprobado = recode(as.character(nivel_aprobado),
      "0"="Ninguno","1"="Preescolar","2"="Primaria",
      "3"="Secundaria","4"="Preparatoria","5"="Normal básica",
      "6"="Carrera técnica","7"="Profesional","8"="Maestría",
      "9"="Doctorado","99"="No sabe", .default="Otro"
    ),
    condicion_actividad = recode(as.character(condicion_actividad),
      "1"="trabajo con ingresos","2"="trabajo sin pago","3"="tenía trabajo",
      "4"="busca trabajo","5"="espera trabajo","6"="estudiante",
      "7"="quehaceres del hogar","8"="jubilado/pensionado","9"="incapacitado",
      "10"="otra situación","99"="no especificado", .default="Otro"
    ),
  no_lectura_motivo = recode(as.character(no_lectura_motivo),
    "1" = "Falta interés/gusto",
    "2" = "Prefiere otras actividades",
    "3" = "Falta de tiempo",
    "4" = "Falta de dinero",
    "5" = "Problemas de salud",
    "6" = "otro",
    .default = "pase"
  ),
    year = as.integer(year),
    lee  = ifelse(libros_leidos_12m_num > 0, 1, 0),
    lee_f = factor(lee, levels = c(0,1), labels = c("No","Sí"))
  ) %>%
  mutate(
    educacion_grupo = case_when(
      nivel_aprobado %in% c("Ninguno","Preescolar") ~ "Sin educación",
      nivel_aprobado %in% "Primaria" ~ "Básica",
      nivel_aprobado %in% c("Secundaria","Preparatoria","Normal básica","Carrera técnica") ~ "Media",
      nivel_aprobado %in% c("Profesional","Maestría","Doctorado") ~ "Superior y Posgrado",
      TRUE ~ NA_character_
    ),
    actividad_grupo = case_when(
      condicion_actividad %in% c("trabajo con ingresos","trabajo sin pago","tenía trabajo") ~ "Trabaja",
      condicion_actividad %in% "estudiante" ~ "Estudia",
      condicion_actividad %in% c("busca trabajo","espera trabajo","quehaceres del hogar",
                                 "jubilado/pensionado","incapacitado","otra situación",
                                 "no especificado","Otro") ~ "No trabaja",
      TRUE ~ NA_character_
    ),
  ) %>%
  filter(year %in% c(2020, 2022, 2024)) %>%
  drop_na(libros_leidos_12m_num, educacion_grupo, actividad_grupo)

theme_set(theme_minimal(base_size = 12))
# ========================================
# 3) Parámetros comunes
# ========================================
alpha <- 0.04
conf  <- 1 - alpha
zcrit <- qnorm(1 - alpha/2)

Intervalos de confianza

# 1) IC de medias de libros leídos por nivel de estudio

res_edu <- datos %>%
  group_by(educacion_grupo) %>%
  summarise(
    n = n(),
    media = mean(libros_leidos_12m_num),
    sd = sd(libros_leidos_12m_num),
    se = sd/sqrt(n),
    t_crit = qt(1 - alpha/2, df = n - 1),
    IC_li = media - t_crit * se,
    IC_ls = media + t_crit * se,
    .groups = "drop"
  )

print(res_edu)
## # A tibble: 4 × 8
##   educacion_grupo         n  media    sd     se t_crit  IC_li IC_ls
##   <chr>               <int>  <dbl> <dbl>  <dbl>  <dbl>  <dbl> <dbl>
## 1 Básica               1024 0.603  2.76  0.0861   2.06 0.425  0.780
## 2 Media                3064 1.04   2.77  0.0500   2.05 0.933  1.14 
## 3 Sin educación         141 0.0922 0.357 0.0300   2.07 0.0299 0.154
## 4 Superior y Posgrado  1780 2.87   6.03  0.143    2.06 2.57   3.16
res_edu$educacion_grupo <- factor(res_edu$educacion_grupo,
  levels = c("Sin educación", "Básica", "Media", "Superior y Posgrado")
)

ggplot(res_edu, aes(x = educacion_grupo, y = media)) +
  geom_point(size=3, color="blue") +
  geom_errorbar(aes(ymin=IC_li, ymax=IC_ls), width=0.2, color="darkblue") +
  geom_text(aes(label = round(media, 2)),
            vjust = -2.0, size = 3) +
  labs(title="Promedio de libros leídos por nivel educativo (96% IC)",
       x="Nivel educativo", y="Media de libros") +
  theme_minimal()

# 2) IC de medias de libros leídos por condicion de actividad
res_act <- datos %>%
  group_by(actividad_grupo) %>%
  summarise(
    n = n(),
    media = mean(libros_leidos_12m_num),
    sd = sd(libros_leidos_12m_num),
    se = sd/sqrt(n),
    t_crit = qt(1 - alpha/2, df = n - 1),
    IC_li = media - t_crit * se,
    IC_ls = media + t_crit * se,
    .groups = "drop"
  )

print(res_act)
## # A tibble: 3 × 8
##   actividad_grupo     n media    sd     se t_crit IC_li IC_ls
##   <chr>           <int> <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl>
## 1 Estudia           213  4.23  6.25 0.429    2.07 3.34   5.12
## 2 No trabaja       2032  1.12  3.33 0.0738   2.06 0.964  1.27
## 3 Trabaja          3764  1.52  4.26 0.0694   2.05 1.38   1.67
res_act$actividad_grupo <- factor(res_act$actividad_grupo,
  levels = c("No trabaja", "Trabaja","Estudia")
)

ggplot(res_act, aes(x = actividad_grupo, y = media)) +
  geom_point(size=3, color="green") +
  geom_errorbar(aes(ymin=IC_li, ymax=IC_ls), width=0.2, color="darkgreen") +
  geom_text(aes(label = round(media, 2)),
            vjust = -2.0, size = 3) +
  labs(title="Promedio de libros leídos por condición de actividad (96% IC)",
       x="Condición de actividad", y="Media de libros") +
  theme_minimal()

#Diferencia de libros entre personas con y sin educación

# Creamos la variable para agrupar
datos <- datos %>%
  mutate(con_educacion = ifelse(educacion_grupo == "Sin educación",
                                "Sin educación", "Con educación"))

# Vemos cuántas personas hay en cada grupo y sus promedios
datos %>%
  group_by(con_educacion) %>%
  summarise(
    cantidad = n(),
    promedio_libros = mean(libros_leidos_12m_num, na.rm = TRUE),
    desviacion = sd(libros_leidos_12m_num, na.rm = TRUE)
  )
## # A tibble: 2 × 4
##   con_educacion cantidad promedio_libros desviacion
##   <chr>            <int>           <dbl>      <dbl>
## 1 Con educación     5868          1.52        4.14 
## 2 Sin educación      141          0.0922      0.357
# Prueba t de una cola: Con educación > Sin educación
resultado <- t.test(libros_leidos_12m_num ~ con_educacion,
                    data = datos,
                    alternative = "greater",
                    conf.level=0.96, # Una cola derecha
                    var.equal = FALSE)         # Welch (no asumimos varianzas iguales)

print(resultado)
## 
##  Welch Two Sample t-test
## 
## data:  libros_leidos_12m_num by con_educacion
## t = 23.014, df = 2014.2, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Con educación and group Sin educación is greater than 0
## 96 percent confidence interval:
##  1.315143      Inf
## sample estimates:
## mean in group Con educación mean in group Sin educación 
##                  1.51567825                  0.09219858
t_stat <- resultado$statistic    # Estadístico t calculado
df <- resultado$parameter        # Grados de libertad

# Valor crítico t (cola derecha)
t_crit <- qt(1 - alpha, df)

# Secuencia de valores para la distribución t
x <- seq(-25, 25, length=400)
y <- dt(x, df)


plot(x, y, type="l", lwd=2, xlab="t", ylab="Densidad", 
     main="Prueba t de Student (una cola derecha)\nCon educación > Sin educación")

# Sombrear la zona de rechazo (cola derecha)
polygon(c(x[x>t_crit], t_crit, max(x)), 
        c(y[x>t_crit], 0, 0), col=rgb(1,0,0,0.2))

# Agregar líneas verticales
abline(v=t_crit, col="red", lwd=2, lty=2)       # Valor crítico
abline(v=t_stat, col="blue", lwd=2)             # t calculado

# Agregar leyenda
legend("topright", legend=c("Valor crítico", "Estadístico t"), 
       col=c("red","blue"), lty=2:1, lwd=2)

ic_medias <- datos %>%
  group_by(con_educacion) %>%
  summarise(
    n = n(),
    media = mean(libros_leidos_12m_num, na.rm = TRUE),
    sd = sd(libros_leidos_12m_num, na.rm = TRUE)
  ) %>%
  mutate(
    t_crit = qt(1 - alpha/2, df = n - 1),              # valor crítico t
    error = t_crit * sd / sqrt(n),                     # margen de error
    LI = media - error,
    LS = media + error
  )

ggplot(ic_medias, aes(x = con_educacion, y = media)) +
  geom_point(size = 3, color = "orange") +
  geom_errorbar(aes(ymin = LI, ymax = LS), width = 0.2, color = "orange", lwd = 1) +
  geom_text(aes(label = round(media, 2)),
            vjust = -2.0, size = 3) +
  labs(
    title = "Intervalos de confianza (96%) de libros leídos por grupo educativo",
    x = "Nivel educativo",
    y = "Media de libros leídos"
  ) +
  theme_minimal()

tabla1 <- table(datos$educacion_grupo, datos$lee)
tabla2 <- table(datos$actividad_grupo, datos$lee)

tabla1
##                      
##                          0    1
##   Básica               781  243
##   Media               2017 1047
##   Sin educación        130   11
##   Superior y Posgrado  635 1145
tabla2
##             
##                 0    1
##   Estudia      22  191
##   No trabaja 1303  729
##   Trabaja    2238 1526
chi1 <- chisq.test(tabla1, correct = FALSE)
chi2 <- chisq.test(tabla2, correct = FALSE)

print(chi1); print(chi2)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla1
## X-squared = 651.16, df = 3, p-value < 2.2e-16
## 
##  Pearson's Chi-squared test
## 
## data:  tabla2
## X-squared = 231.27, df = 2, p-value < 2.2e-16
datos_barras <- datos %>% drop_na(educacion_grupo, actividad_grupo, lee_f)

# (a) Nivel educativo vs Lector
ggplot(datos_barras, aes(x = educacion_grupo, fill = lee_f)) +
  geom_bar(position = "fill") +
  scale_y_continuous(labels = scales::percent) +
  labs(
    title = "Proporción de lectores por nivel educativo",
    x = "Nivel educativo",
    y = "Proporción",
    fill = "Lee"
  ) +
  geom_text(
    aes(
      label = paste0(round((..count..) / tapply(..count.., ..x.., sum)[as.character(..x..)] * 100, 1), "%")
    ),
    stat = "count", position = position_fill(vjust = 0.5), size = 3
  ) +
  theme_minimal(base_size = 12) +
  theme(axis.text.x = element_text(angle = 20, hjust = 1))
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# (b) Actividad vs Lector
ggplot(datos_barras, aes(x = actividad_grupo, fill = lee_f)) +
  geom_bar(position = "fill") +
  scale_y_continuous(labels = scales::percent) +
  labs(
    title = "Proporción de lectores por condición de actividad",
    x = "Condición de actividad",
    y = "Proporción",
    fill = "Lee"
  ) +
  geom_text(
    aes(
      label = paste0(round((..count..) / tapply(..count.., ..x.., sum)[as.character(..x..)] * 100, 1), "%")
    ),
    stat = "count", position = position_fill(vjust = 0.5), size = 3
  )  +
  theme_minimal(base_size = 12) +
  theme(axis.text.x = element_text(angle = 20, hjust = 1))

# Nivel de significancia
alpha <- 0.04        # → confianza = 96%
z <- qnorm(1 - alpha/2)  # valor z = 2.05 aprox.

# Filtramos solo no lectores
no_lectores <- datos %>%
  filter(lee == 0, !is.na(no_lectura_motivo), no_lectura_motivo != "pase")


# Calculamos proporciones e intervalos de confianza por motivo
ic_motivos <- no_lectores %>%
  count(no_lectura_motivo, name = "x") %>%
  mutate(
    n = sum(x),
    p = x / n,
    error = z * sqrt((p * (1 - p)) / n),
    LI = p - error,
    LS = p + error
  )

ic_motivos
##            no_lectura_motivo   x    n         p       error          LI
## 1            Falta de dinero  25 1757 0.0142288 0.005802747 0.008426052
## 2            Falta de tiempo 781 1757 0.4445077 0.024346701 0.420160982
## 3        Falta interés/gusto 461 1757 0.2623791 0.021554734 0.240824321
## 4 Prefiere otras actividades 232 1757 0.1320433 0.016587030 0.115456226
## 5         Problemas de salud 258 1757 0.1468412 0.017342048 0.129499159
##           LS
## 1 0.02003155
## 2 0.46885438
## 3 0.28393379
## 4 0.14863029
## 5 0.16418325
# Ordenamos motivos de menor a mayor proporción para que se vea ordenado
ic_motivos <- ic_motivos %>%
  arrange(p) %>%
  mutate(no_lectura_motivo = factor(no_lectura_motivo, levels = no_lectura_motivo))

# Gráfico
ggplot(ic_motivos, aes(x = no_lectura_motivo, y = p)) +
  geom_col(fill = "steelblue", alpha = 0.8) +  # barras de proporciones
  geom_errorbar(aes(ymin = LI, ymax = LS), width = 0.2, color = "black") +  # IC 96%
  geom_text(aes(label = scales::percent(p, accuracy = 0.1)), 
            vjust = -0.5, size = 3.5) +  # muestra porcentaje encima de las barras
  labs(
    title = "Proporción de motivos de no lectura (con IC del 96%)",
    x = "Motivo principal de no lectura",
    y = "Proporción de personas"
  ) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  theme_minimal(base_size = 12) +
  theme(
    axis.text.x = element_text(angle = 30, hjust = 1),
    plot.title = element_text(face = "bold")
  )