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")
)
