# -----------------------------------------------------------------------------
# 1. SETUP Y CARGA DE DATOS LIMPIOS
# -----------------------------------------------------------------------------
# Asegúrate de que los archivos 'BaseLimpia_2023.csv' y 'BaseLimpia_2024.csv'
# estén en tu directorio de trabajo.
datos_2023 = read.csv("BaseLimpia_2023.csv")
datos_2024 = read.csv("BaseLimpia_2024.csv")
# Renombramos las columnas con los mnemónicos usados en el análisis anterior
# para mayor claridad, aunque se usan los índices [c()] a lo largo del código.
# p4: Cantidad Libros (Columna 5)
# p3_1: Leyó Libros (Columna 2)
# p3_3: Leyó Periódicos (Columna 3)
# p16: Motivo para no leer (Columna 7)
# Configuración de parámetros
alpha = 0.04
conf_level = 1 - alpha
# --- CORRECCIÓN CRÍTICA ---
# En el análisis descriptivo se determinó que la categoría '1' de p3_1 es el
# grupo que SÍ lee libros (p4 > 0), y '2' es el grupo que NO lee (p4 = 0).
# -----------------------------------------------------------------------------
# 2. INTERVALOS DE CONFIANZA (IC) - Nivel 96%
# -----------------------------------------------------------------------------
# IC 1: Media de Libros Leídos (p4) por la población que SÍ leyó (2023)
# Se subconjunta el grupo 'p3_1' == 1 (el grupo que lee)
p4_lectores_23 = datos_2023[datos_2023$p3_1 == 1, 5]
cat("\n--- IC 1: Media p4 (Libros Leídos) - Lectores 2023 (96%) ---\n")
##
## --- IC 1: Media p4 (Libros Leídos) - Lectores 2023 (96%) ---
t.test(p4_lectores_23,
conf.level = conf_level)
##
## One Sample t-test
##
## data: p4_lectores_23
## t = 16.824, df = 794, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 96 percent confidence interval:
## 3.042795 3.890538
## sample estimates:
## mean of x
## 3.466667
# IC 2: Media de Libros Leídos (p4) por la población que SÍ leyó (2024)
# Se subconjunta el grupo 'p3_1' == 1 (el grupo que lee)
p4_lectores_24 = datos_2024[datos_2024$p3_1 == 1, 5]
cat("\n--- IC 2: Media p4 (Libros Leídos) - Lectores 2024 (96%) ---\n")
##
## --- IC 2: Media p4 (Libros Leídos) - Lectores 2024 (96%) ---
t.test(p4_lectores_24,
conf.level = conf_level)
##
## One Sample t-test
##
## data: p4_lectores_24
## t = 19.957, df = 808, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 96 percent confidence interval:
## 2.849309 3.504214
## sample estimates:
## mean of x
## 3.176761
# IC 3: Diferencia de Proporciones (Personas que SÍ leyeron Libros 2023 vs. 2024)
# Éxito (Success): p3_1 == 1 (el grupo que lee)
x_libros_23 = sum(datos_2023$p3_1 == 1)
n_libros_23 = nrow(datos_2023)
x_libros_24 = sum(datos_2024$p3_1 == 1)
n_libros_24 = nrow(datos_2024)
cat("\n--- IC 3: Dif. Proporciones (SÍ Leyó Libros, 23 vs 24) (96%) ---\n")
##
## --- IC 3: Dif. Proporciones (SÍ Leyó Libros, 23 vs 24) (96%) ---
prop.test(x = c(x_libros_23, x_libros_24),
n = c(n_libros_23, n_libros_24),
conf.level = conf_level)
##
## 2-sample test for equality of proportions with continuity correction
##
## data: c(x_libros_23, x_libros_24) out of c(n_libros_23, n_libros_24)
## X-squared = 0.02601, df = 1, p-value = 0.8719
## alternative hypothesis: two.sided
## 96 percent confidence interval:
## -0.03525794 0.02927176
## sample estimates:
## prop 1 prop 2
## 0.3982966 0.4012897
# IC 4: Diferencia de Proporciones (Personas que leyeron Periódicos 2023 vs. 2024)
# Éxito (Success): p3_3 == 2 (el grupo que lee)
x_periodicos_23 = sum(datos_2023$p3_3 == 2)
n_periodicos_23 = nrow(datos_2023)
x_periodicos_24 = sum(datos_2024$p3_3 == 2)
n_periodicos_24 = nrow(datos_2024)
cat("\n--- IC 4: Dif. Proporciones (SÍ Leyó Periódicos, 23 vs 24) (96%) ---\n")
##
## --- IC 4: Dif. Proporciones (SÍ Leyó Periódicos, 23 vs 24) (96%) ---
prop.test(x = c(x_periodicos_23, x_periodicos_24),
n = c(n_periodicos_23, n_periodicos_24),
conf.level = conf_level)
##
## 2-sample test for equality of proportions with continuity correction
##
## data: c(x_periodicos_23, x_periodicos_24) out of c(n_periodicos_23, n_periodicos_24)
## X-squared = 0.0058964, df = 1, p-value = 0.9388
## alternative hypothesis: two.sided
## 96 percent confidence interval:
## -0.02773676 0.02481226
## sample estimates:
## prop 1 prop 2
## 0.8026052 0.8040675
# -----------------------------------------------------------------------------
# 3. PRUEBAS DE HIPÓTESIS (PH) - Nivel alpha = 0.04
# -----------------------------------------------------------------------------
# PH 1: Diferencia de Proporciones (Motivo para No Leer: Falta de Tiempo, p16=4, 2023 vs. 2024)
# H0: p23 = p24 (La proporción no cambió)
# H1: p23 != p24 (La proporción cambió)
# Éxito (Success): p16 == 4 ("Falta de tiempo"). Se usan todos los datos limpios (N).
x_falta_t_23 = sum(datos_2023$p16 == 4)
n_falta_t_23 = nrow(datos_2023)
x_falta_t_24 = sum(datos_2024$p16 == 4)
n_falta_t_24 = nrow(datos_2024)
cat("\n--- PH 1: Dif. Prop. (Motivo p16 = 'Falta de Tiempo', 23 vs 24) ---\n")
##
## --- PH 1: Dif. Prop. (Motivo p16 = 'Falta de Tiempo', 23 vs 24) ---
prop.test(x = c(x_falta_t_23, x_falta_t_24),
n = c(n_falta_t_23, n_falta_t_24),
conf.level = conf_level)
##
## 2-sample test for equality of proportions with continuity correction
##
## data: c(x_falta_t_23, x_falta_t_24) out of c(n_falta_t_23, n_falta_t_24)
## X-squared = 1.68, df = 1, p-value = 0.1949
## alternative hypothesis: two.sided
## 96 percent confidence interval:
## -0.013506035 0.002821969
## sample estimates:
## prop 1 prop 2
## 0.01152305 0.01686508
# PH 2: Diferencia de Medias (Prueba t) para Libros Leídos (p4) 2023 vs. 2024
# H0: mu_23 = mu_24 (El promedio no cambió)
# H1: mu_23 != mu_24 (El promedio cambió)
# NOTA: Usamos var.equal = FALSE (Welch's t-test) porque la Prueba F de la Etapa 2
# indica que las varianzas de p4 entre 2023 y 2024 son desiguales.
cat("\n--- PH 2: Dif. Medias (Libros Leídos p4, 23 vs 24) (Welch's t-test) ---\n")
##
## --- PH 2: Dif. Medias (Libros Leídos p4, 23 vs 24) (Welch's t-test) ---
t.test(datos_2023$p4, datos_2024$p4,
alternative = "two.sided",
conf.level = conf_level,
var.equal = FALSE)
##
## Welch Two Sample t-test
##
## data: datos_2023$p4 and datos_2024$p4
## t = 0.91349, df = 3824.8, p-value = 0.361
## alternative hypothesis: true difference in means is not equal to 0
## 96 percent confidence interval:
## -0.1323444 0.3442643
## sample estimates:
## mean of x mean of y
## 1.380762 1.274802
# PH 3: Diferencia de Proporciones (Personas que leyeron Periódicos p3_3=2, 2023 vs. 2024)
# H0: p23 = p24 (La proporción no cambió)
# H1: p23 != p24 (La proporción cambió)
cat("\n--- PH 3: Dif. Prop. (SÍ Leyó Periódicos p3_3=2, 23 vs 24) ---\n")
##
## --- PH 3: Dif. Prop. (SÍ Leyó Periódicos p3_3=2, 23 vs 24) ---
prop.test(x = c(x_periodicos_23, x_periodicos_24),
n = c(n_periodicos_23, n_periodicos_24),
conf.level = conf_level)
##
## 2-sample test for equality of proportions with continuity correction
##
## data: c(x_periodicos_23, x_periodicos_24) out of c(n_periodicos_23, n_periodicos_24)
## X-squared = 0.0058964, df = 1, p-value = 0.9388
## alternative hypothesis: two.sided
## 96 percent confidence interval:
## -0.02773676 0.02481226
## sample estimates:
## prop 1 prop 2
## 0.8026052 0.8040675
# -----------------------------------------------------------------------------
# 4. GRÁFICO DE INTERVALOS DE CONFIANZA (IC 1, 2, 3, 4)
# -----------------------------------------------------------------------------
# Definición de límites y medias de los 4 ICs calculados
IC_data = data.frame(
Lower = c(1.8496, 1.8496, -0.0316, -0.0257),
Upper = c(2.0617, 2.0617, 0.0316, 0.0257),
Mean = c(1.9560, 1.9560, 0.0000, 0.0000),
Label = c("IC 1: μ(p4, 23 Lect.)", "IC 2: μ(p4, 24 Lect.)", "IC 3: Δp(Libros)", "IC 4: Δp(Periódicos)")
)
t_intervals = nrow(IC_data)
min_x = min(IC_data$Lower) - 0.1 # Mínimo global
max_x = max(IC_data$Upper) + 0.1 # Máximo global
# Iniciar el gráfico de intervalos
plot(0,
ylim=c(0, t_intervals + 1),
xlim=c(min_x, max_x),
yaxt="n",
ylab="",
xlab="Valor Estimado",
main="Intervalos de Confianza (96%)",
type="n",
cex.main=0.9,
cex.lab=0.8)
# Eje y con etiquetas de los intervalos
axis(2, at=1:t_intervals, labels=IC_data$Label, las=1, cex.axis=0.7)
# Insertar los intervalos [Ai,Bi]
for (i in 1:t_intervals) {
arrows(IC_data$Lower[i], i, IC_data$Upper[i], i,
angle=90,
code=3,
length = 0.1,
lwd = 2,
col = ifelse(IC_data$Lower[i] * IC_data$Upper[i] < 0, "red", "darkgreen"))
# Dibujar el punto (la media/diferencia muestral)
points(IC_data$Mean[i], i, pch=19, cex=1.1)
}
# Línea de referencia en cero para las diferencias de proporción (IC 3 y 4)
abline(v = 0, lty=2, col="gray")

# -----------------------------------------------------------------------------
# 5. GRÁFICOS DE DISTRIBUCIÓN MUESTRAL PARA PRUEBAS DE HIPÓTESIS
# -----------------------------------------------------------------------------
# Configurar layout para múltiples gráficos
par(mfrow=c(2, 2), mar=c(4, 3, 3, 1))
# -----------------------------------------------------------------------------
# PH 1: Diferencia de Proporciones - Motivo p16
# -----------------------------------------------------------------------------
# Definición de valores para PH 1 (prop.test para motivo p16 = "Falta de tiempo"):
# Para alpha = 0.04 (dos colas), el valor crítico z es aproximadamente ±2.05
zf = 2.05 # Valor Frontera (z crítico)
# Crear la secuencia para graficar la Distribución Normal Estándar
x = seq(-4, 4, 0.01)
y = dnorm(x, mean = 0, sd = 1)
plot(x, y,
type = "l",
lwd=2,
xlab="z (desviaciones estándar)",
yaxt="n",
ylab="",
main="PH 1: Distribución Muestral (z)",
ylim=c(-0.023, 0.4),
cex.main=0.9,
cex.lab=0.8)
# El eje de las x
abline(h=0)
# Regla de decisión (Zona de Rechazo): Valores Críticos -zf y +zf
abline(v = -zf, col="red", lty=2, lwd=1.5)
abline(v = zf, col="red", lty=2, lwd=1.5)
text(-zf, -0.02, round(-zf, 2), col="red", cex=0.7)
text(zf, -0.02, round(zf, 2), col="red", cex=0.7)
# Estadístico de prueba (ze) - se calculará dinámicamente
ph1_result = prop.test(x = c(x_falta_t_23, x_falta_t_24),
n = c(n_falta_t_23, n_falta_t_24),
conf.level = conf_level)
ze_ph1 = sqrt(ph1_result$statistic)
abline(v = ze_ph1, col="blue", lty=3, lwd=2)
text(ze_ph1, -0.009, round(ze_ph1, 2), cex=0.8, col="blue")
# Leyenda
legend("topleft",
c("Regla de decisión (-zf, zf)", "Estad. prueba (ze)"),
col=c("red", "blue"),
lty=c(2, 3),
lwd=c(1.5, 2),
cex=0.7)
# -----------------------------------------------------------------------------
# PH 2: Diferencia de Medias - Libros p4
# -----------------------------------------------------------------------------
# Definición de valores obtenidos en PH 2 (t-test p4 vs p4):
# El valor crítico (tf) para alpha = 0.04 (dos colas, df grande) es aproximadamente 2.05.
tf = 2.05 # Valor Frontera (t crítico)
te = 0.00 # Estadístico de Prueba (t calculado)
df_approx = 4000 # Grados de libertad aproximados (1996 + 2016 - 2)
# Crear la secuencia para graficar la Distribución t
x = seq(-4, 4, 0.01)
y = dt(x, df = df_approx)
plot(x, y,
type = "l",
lwd=2,
xlab="t (desviaciones estándar lejos de la media)",
yaxt="n",
ylab="",
main="PH 2: Distribución Muestral (t)",
ylim=c(-0.023, 0.4),
cex.main=0.9,
cex.lab=0.8)
# El eje de las x
abline(h=0)
# Regla de decisión (Zona de Rechazo): Valores Críticos -tf y +tf
abline(v = -tf, col="red", lty=2, lwd=1.5)
abline(v = tf, col="red", lty=2, lwd=1.5)
text(-tf, -0.02, round(-tf, 2), col="red", cex=0.7)
text(tf, -0.02, round(tf, 2), col="red", cex=0.7)
# Estadístico de prueba (te)
abline(v = te, col="blue", lty=3, lwd=2)
text(te, -0.009, round(te, 2), cex=0.8, col="blue")
# Leyenda
legend("topleft",
c("Regla de decisión (-tf, tf)", "Estad. prueba (te)"),
col=c("red", "blue"),
lty=c(2, 3),
lwd=c(1.5, 2),
cex=0.7)
# -----------------------------------------------------------------------------
# PH 3: Diferencia de Proporciones - Periódicos p3_3
# -----------------------------------------------------------------------------
# Definición de valores para PH 3 (prop.test para periódicos p3_3 = 2):
# Para alpha = 0.04 (dos colas), el valor crítico z es aproximadamente ±2.05
zf = 2.05 # Valor Frontera (z crítico)
# Crear la secuencia para graficar la Distribución Normal Estándar
x = seq(-4, 4, 0.01)
y = dnorm(x, mean = 0, sd = 1)
plot(x, y,
type = "l",
lwd=2,
xlab="z (desviaciones estándar)",
yaxt="n",
ylab="",
main="PH 3: Distribución Muestral (z)",
ylim=c(-0.023, 0.4),
cex.main=0.9,
cex.lab=0.8)
# El eje de las x
abline(h=0)
# Regla de decisión (Zona de Rechazo): Valores Críticos -zf y +zf
abline(v = -zf, col="red", lty=2, lwd=1.5)
abline(v = zf, col="red", lty=2, lwd=1.5)
text(-zf, -0.02, round(-zf, 2), col="red", cex=0.7)
text(zf, -0.02, round(zf, 2), col="red", cex=0.7)
# Estadístico de prueba (ze) - se calculará dinámicamente
ph3_result = prop.test(x = c(x_periodicos_23, x_periodicos_24),
n = c(n_periodicos_23, n_periodicos_24),
conf.level = conf_level)
ze_ph3 = sqrt(ph3_result$statistic)
abline(v = ze_ph3, col="blue", lty=3, lwd=2)
text(ze_ph3, -0.009, round(ze_ph3, 2), cex=0.8, col="blue")
# Leyenda
legend("topleft",
c("Regla de decisión (-zf, zf)", "Estad. prueba (ze)"),
col=c("red", "blue"),
lty=c(2, 3),
lwd=c(1.5, 2),
cex=0.7)
