Lectura de los datos

M21 = read.csv("Datos_molec_2021-1.CSV", encoding = "latin1")
M24 = read.csv("Datos_molec_2024-1.csv", encoding = "latin1")

#dimensión  y duplicados
dim(M21)
## [1] 1948  108
dim(M24)
## [1] 2016  108
sum(duplicated(M21)) + sum(duplicated(M24))
## [1] 0

#base unicamente con las variables que nos interesan

se eligen las variables por su nombre y no por número de columna, por si cambia la posición de las columnas

M21selec = M21[ , c("sexo", "edad", "p1", "p3_1", "p4", "p8_1", "p8_2", "p26", "factor")]
M24selec = M24[ , c("sexo", "edad", "p1", "p3_1", "p4", "p8_1", "p8_2", "p26", "factor")]

#base con la columna del año
anio = c(rep("2021", length(M21selec$edad)), rep("2024", length(M24selec$edad)))
Datos = data.frame(anio, rbind(M21selec, M24selec))
dim(Datos)
## [1] 3964   10

Limpieza y variables nuevas

para la limpieza, segun el diccionario los ceros son (blanco por pase), estos y los valores fuera de rango se convierten en NA.

Datos$p3_1[Datos$p3_1 == 0] = NA          # no sabe leer
Datos$p4[Datos$p4 == 0] = NA              # blanco por pase
Datos$p8_1[Datos$p8_1 == 0] = NA
Datos$p8_2[Datos$p8_2 == 0] = NA
Datos$p26[Datos$p26 < 2 | Datos$p26 > 360] = NA   #rango válido del diccionario: 2 a 360

#definimos nuevas variables
Datos$sexo_f = factor(Datos$sexo, levels = c(1, 2), labels = c("Hombre", "Mujer"))
Datos$gedad = cut(Datos$edad, breaks = c(17, 29, 44, 59, Inf), labels = c("18-29", "30-44", "45-59", "60+"))
Datos$formato = NA
Datos$formato[Datos$p8_1 == 1 & Datos$p8_2 == 2] = "Solo digital"
Datos$formato[Datos$p8_1 == 2 & Datos$p8_2 == 1] = "Solo impreso"
Datos$formato[Datos$p8_1 == 1 & Datos$p8_2 == 1] = "Ambos"
Datos$formato = factor(Datos$formato, levels = c("Solo impreso", "Solo digital", "Ambos"))

#Guardamos la base
write.csv(Datos, "Datos_MOLEC_Limpia_2021_2024.csv", row.names = FALSE)

Subbases

Datos21 = subset(Datos, Datos$anio == "2021")
Datos24 = subset(Datos, Datos$anio == "2024")
Alf = subset(Datos, !is.na(Datos$p3_1))     #personas que saben leer
Libros = subset(Datos, Datos$p3_1 == 1)     #lectores de libros (es decir,base de p4 y formato)
Lect = subset(Datos, !is.na(Datos$p26))     #lectores de algún material (p26)
L21 = subset(Libros, Libros$anio == "2021")
L24 = subset(Libros, Libros$anio == "2024")
P21 = subset(Lect, Lect$anio == "2021")
P24 = subset(Lect, Lect$anio == "2024")

#datos faltantes

Registros = data.frame(c(nrow(Datos21), sum(Alf$anio == "2021"), nrow(L21), nrow(P21)),
                       c(nrow(Datos24), sum(Alf$anio == "2024"), nrow(L24), nrow(P24)))
names(Registros) = c("2021", "2024")
row.names(Registros) = c("Todos", "Saben leer", "Lectores de libros", "p26 válida")
Registros
2021 2024
Todos 1948 2016
Saben leer 1900 1969
Lectores de libros 803 809
p26 válida 1352 1350
vars = c("sexo", "edad", "p3_1", "p4", "p8_1", "p8_2", "p26", "formato")
Faltantes = data.frame(colSums(is.na(Datos21[ , vars])),
                       colSums(is.na(Datos24[ , vars])))
names(Faltantes) = c("2021", "2024")
Faltantes
2021 2024
sexo 0 0
edad 0 0
p3_1 48 47
p4 1145 1207
p8_1 1145 1207
p8_2 1145 1207
p26 596 666
formato 1145 1207

#análisis descriptivo

decidimos hacer el análisis para variables continuas: edad, libros leídos y minutos de lectura y posteriormente para discretas

library(e1071)

edad21 = Datos21$edad[!is.na(Datos21$edad)]
edad24 = Datos24$edad[!is.na(Datos24$edad)]
libros21 = L21$p4[!is.na(L21$p4)]
libros24 = L24$p4[!is.na(L24$p4)]
minutos21 = P21$p26[!is.na(P21$p26)]
minutos24 = P24$p26[!is.na(P24$p26)]

d1 = c(length(edad21),
       as.numeric(summary(edad21)),
       (max(edad21) + min(edad21)) / 2,
       sd(edad21),
       100 * sd(edad21) / mean(edad21),
       skewness(edad21),
       kurtosis(edad21))
d2 = c(length(edad24),
       as.numeric(summary(edad24)),
       (max(edad24) + min(edad24)) / 2,
       sd(edad24),
       100 * sd(edad24) / mean(edad24),
       skewness(edad24),
       kurtosis(edad24))
d3 = c(length(libros21),
       as.numeric(summary(libros21)),
       (max(libros21) + min(libros21)) / 2,
       sd(libros21),
       100 * sd(libros21) / mean(libros21),
       skewness(libros21),
       kurtosis(libros21))
d4 = c(length(libros24),
       as.numeric(summary(libros24)),
       (max(libros24) + min(libros24)) / 2,
       sd(libros24),
       100 * sd(libros24) / mean(libros24),
       skewness(libros24),
       kurtosis(libros24))
d5 = c(length(minutos21),
       as.numeric(summary(minutos21)),
       (max(minutos21) + min(minutos21)) / 2,
       sd(minutos21),
       100 * sd(minutos21) / mean(minutos21),
       skewness(minutos21),
       kurtosis(minutos21))
d6 = c(length(minutos24),
       as.numeric(summary(minutos24)),
       (max(minutos24) + min(minutos24)) / 2,
       sd(minutos24),
       100 * sd(minutos24) / mean(minutos24),
       skewness(minutos24),
       kurtosis(minutos24))

m = data.frame(d1, d2, d3, d4, d5, d6)
names(m) = c("Edad 2021", "Edad 2024", "Libros 2021", "Libros 2024", "Minutos 2021", "Minutos 2024")
row.names(m) = c("n", "Mínimo", "Q1", "Mediana", "Media", "Q3", "Máximo", "Rango Medio", "Desv Est", "CV (%)", "Sesgo", "Curtosis")
round(m, 2)
Edad 2021 Edad 2024 Libros 2021 Libros 2024 Minutos 2021 Minutos 2024
n 1948.00 2016.00 803.00 809.00 1352.00 1350.00
Mínimo 18.00 18.00 1.00 1.00 3.00 2.00
Q1 31.00 33.00 1.00 1.00 20.00 20.00
Mediana 43.00 46.00 2.00 2.00 30.00 30.00
Media 44.77 46.49 3.79 3.18 41.78 39.99
Q3 57.00 59.00 4.00 3.00 60.00 60.00
Máximo 94.00 94.00 60.00 70.00 300.00 360.00
Rango Medio 56.00 56.00 30.50 35.50 151.50 181.00
Desv Est 16.55 16.76 6.26 4.53 33.81 32.70
CV (%) 36.98 36.05 164.99 142.52 80.93 81.77
Sesgo 0.38 0.27 6.10 7.45 2.40 3.10
Curtosis -0.68 -0.81 44.95 81.89 8.09 16.55

#Gráficas

para el número de libros se usa escala logarítmica en el eje y porque la distribución es muy sesgada a la derecha.

colores = c("blue", "pink")
par(mfrow = c(1, 3), cex.lab = 0.8, cex.main = 0.8)
boxplot(Datos$edad ~ Datos$anio,
        col = colores,
        main = "Edad",
        xlab = "Año", ylab = "Años")
boxplot(Libros$p4 ~ Libros$anio,
        log = "y",
        col = colores,
        main = "Libros leídos (p4)",
        xlab = "Año", ylab = "Libros (escala log)")
boxplot(Lect$p26 ~ Lect$anio,
        col = colores,
        main = "Minutos continuos (p26)",
        xlab = "Año", ylab = "Minutos")

Histograma

par(mfrow = c(2, 3))
hist(Datos21$edad, col = colores[1], main = "Edad \n 2021", xlab = "Años")
hist(Datos24$edad, col = colores[2], main = "Edad \n 2024", xlab = "Años")
hist(L21$p4[L21$p4 <= 20], breaks = 0:20, col = colores[1], main = "Libros leídos (hasta 20) \n 2021", xlab = "Número de libros")
hist(L24$p4[L24$p4 <= 20], breaks = 0:20, col = colores[2], main = "Libros leídos (hasta 20) \n 2024", xlab = "Número de libros")
hist(P21$p26, col = colores[1], main = "Minutos continuos \n 2021", xlab = "Minutos")
hist(P24$p26, col = colores[2], main = "Minutos continuos \n 2024", xlab = "Minutos")

Gráfica de dispersión: edad contra libros leídos

par(mfrow = c(1, 2))
plot(jitter(L21$edad), jitter(L21$p4, amount = 0.15), log = "y", pch = 20, col = colores[1],
     main = "Edad vs libros \n 2021", xlab = "Edad", ylab = "Libros (escala log)")
plot(jitter(L24$edad), jitter(L24$p4, amount = 0.15), log = "y", pch = 20, col = colores[2],
     main = "Edad vs libros \n 2024", xlab = "Edad", ylab = "Libros (escala log)")

r21 = cor(L21$edad, L21$p4, method = "spearman", use = "complete.obs")
r24 = cor(L24$edad, L24$p4, method = "spearman", use = "complete.obs")
data.frame(Año = c("2021", "2024"), Spearman = round(c(r21, r24), 3))
Año Spearman
2021 -0.157
2024 -0.210

Variables discretas: sexo, grupo de edad y formato de lectura

table(Datos$sexo_f, Datos$anio)
/ 2021 2024
Hombre 882 859
Mujer 1066 1157
round(100 * prop.table(table(Datos$sexo_f, Datos$anio), 2), 1)
/ 2021 2024
Hombre 45.3 42.6
Mujer 54.7 57.4
table(Datos$gedad, Datos$anio)
/ 2021 2024
18-29 422 375
30-44 604 594
45-59 525 551
60+ 397 496
round(100 * prop.table(table(Datos$gedad, Datos$anio), 2), 1)
/ 2021 2024
18-29 21.7 18.6
30-44 31.0 29.5
45-59 27.0 27.3
60+ 20.4 24.6
table(Libros$formato, Libros$anio)
/ 2021 2024
Solo impreso 597 613
Solo digital 161 153
Ambos 45 43
round(100 * prop.table(table(Libros$formato, Libros$anio), 2), 1)
/ 2021 2024
Solo impreso 74.3 75.8
Solo digital 20.0 18.9
Ambos 5.6 5.3

Gráfica de barras

par(mfrow = c(1, 3))
barplot(prop.table(table(Datos$anio, Datos$sexo_f), 1) * 100, beside = TRUE, col = colores,
        main = "Sexo (%)", ylab = "%", legend.text = c("2021", "2024"))
barplot(prop.table(table(Datos$anio, Datos$gedad), 1) * 100, beside = TRUE, col = colores,
        main = "Grupo de edad (%)", ylab = "%")
barplot(prop.table(table(Libros$anio, Libros$formato), 1) * 100, beside = TRUE, col = colores,
        main = "Formato (% de lectores)", ylab = "%")

Vinculación entre variables continuas y discretas

número de libros por año, por sexo y por grupo de edad.

#número de libros por año
n = tapply(!is.na(Libros$p4), Libros$anio, sum)
media = tapply(Libros$p4, Libros$anio, mean, na.rm = TRUE)
mediana = tapply(Libros$p4, Libros$anio, median, na.rm = TRUE)
desviacion = tapply(Libros$p4, Libros$anio, sd, na.rm = TRUE)
q1 = tapply(Libros$p4, Libros$anio, quantile, 0.25, na.rm = TRUE)
q3 = tapply(Libros$p4, Libros$anio, quantile, 0.75, na.rm = TRUE)
Medidas = data.frame(n, media, mediana, desviacion, q1, q3)
row.names(Medidas) = names(media)
round(Medidas, 2)
n media mediana desviacion q1 q3
2021 803 3.79 2 6.26 1 4
2024 809 3.18 2 4.53 1 3
#número de libros por sexo y año
grupo = paste(Libros$sexo_f, Libros$anio)
n = tapply(!is.na(Libros$p4), grupo, sum)
media = tapply(Libros$p4, grupo, mean, na.rm = TRUE)
mediana = tapply(Libros$p4, grupo, median, na.rm = TRUE)
desviacion = tapply(Libros$p4, grupo, sd, na.rm = TRUE)
q1 = tapply(Libros$p4, grupo, quantile, 0.25, na.rm = TRUE)
q3 = tapply(Libros$p4, grupo, quantile, 0.75, na.rm = TRUE)
Medidas = data.frame(n, media, mediana, desviacion, q1, q3)
row.names(Medidas) = names(media)
round(Medidas, 2)
n media mediana desviacion q1 q3
Hombre 2021 350 3.48 2 5.07 1 4
Hombre 2024 332 3.26 2 3.66 1 4
Mujer 2021 453 4.03 2 7.04 1 4
Mujer 2024 477 3.12 2 5.05 1 3
#número de libros por grupo de edad y año
grupo = paste(Libros$gedad, Libros$anio)
n = tapply(!is.na(Libros$p4), grupo, sum)
media = tapply(Libros$p4, grupo, mean, na.rm = TRUE)
mediana = tapply(Libros$p4, grupo, median, na.rm = TRUE)
desviacion = tapply(Libros$p4, grupo, sd, na.rm = TRUE)
q1 = tapply(Libros$p4, grupo, quantile, 0.25, na.rm = TRUE)
q3 = tapply(Libros$p4, grupo, quantile, 0.75, na.rm = TRUE)
Medidas = data.frame(n, media, mediana, desviacion, q1, q3)
row.names(Medidas) = names(media)
round(Medidas, 2)
n media mediana desviacion q1 q3
18-29 2021 219 4.26 3 6.83 2 4
18-29 2024 201 4.22 3 6.63 2 5
30-44 2021 234 3.94 3 6.52 1 4
30-44 2024 248 2.71 2 2.45 1 3
45-59 2021 196 3.46 2 5.70 1 3
45-59 2024 189 2.96 2 4.00 1 3
60+ 2021 154 3.33 2 5.65 1 3
60+ 2024 171 2.87 2 4.21 1 3
par(mfrow = c(1, 2), cex.lab = 0.8, cex.main = 0.8, mar = c(7.5, 4, 3, 1))
boxplot(Libros$p4 ~ Libros$anio * Libros$gedad, log = "y", col = colores,
        main = "Libros por edad (gris 2021, azul 2024)", ylab = "Libros (escala log)", xlab = "Grupo de edad", las = 2, cex.axis = 0.6)
boxplot(Libros$p4 ~ Libros$anio * Libros$sexo_f, log = "y", col = colores,
        main = "Libros por sexo (gris 2021, azul 2024)", ylab = "Libros (escala log)", xlab = "Sexo", las = 2, cex.axis = 0.6)

#Porcentaje que leyó libros

round(tapply(Alf$p3_1 == 1, Alf$anio, mean) * 100, 1)
## 2021 2024 
## 42.3 41.1
pct_edad = tapply(Alf$p3_1 == 1, list(Alf$gedad, Alf$anio), mean) * 100
pct_sexo = tapply(Alf$p3_1 == 1, list(Alf$sexo_f, Alf$anio), mean) * 100
round(pct_edad, 1)
2021 2024
18-29 52.6 53.9
30-44 39.0 42.3
45-59 38.2 34.7
60+ 41.5 36.8
round(pct_sexo, 1)
2021 2024
Hombre 40.6 39.3
Mujer 43.7 42.4
par(mfrow = c(1, 2))
barplot(t(pct_edad), beside = TRUE, col = colores, ylim = c(0, 65),
        main = "% que leyó libros por edad", ylab = "%", legend.text = c("2021", "2024"))
barplot(t(pct_sexo), beside = TRUE, col = colores, ylim = c(0, 65),
        main = "% que leyó libros por sexo", ylab = "%")

#Minutos continuos de lectura (p26) por grupo

#Minutos continuos de lectura por año
n = tapply(Lect$p26, Lect$anio, length)
media = tapply(Lect$p26, Lect$anio, mean)
mediana = tapply(Lect$p26, Lect$anio, median)
desviacion = tapply(Lect$p26, Lect$anio, sd)
q1 = tapply(Lect$p26, Lect$anio, quantile, 0.25)
q3 = tapply(Lect$p26, Lect$anio, quantile, 0.75)
Medidas = data.frame(n, media, mediana, desviacion, q1, q3)
row.names(Medidas) = names(media)
round(Medidas, 1)
n media mediana desviacion q1 q3
2021 1352 41.8 30 33.8 20 60
2024 1350 40.0 30 32.7 20 60
#Minutos continuos de lectura por sexo y año
grupo = paste(Lect$sexo_f, Lect$anio)
n = tapply(Lect$p26, grupo, length)
media = tapply(Lect$p26, grupo, mean)
mediana = tapply(Lect$p26, grupo, median)
desviacion = tapply(Lect$p26, grupo, sd)
q1 = tapply(Lect$p26, grupo, quantile, 0.25)
q3 = tapply(Lect$p26, grupo, quantile, 0.75)
Medidas = data.frame(n, media, mediana, desviacion, q1, q3)
row.names(Medidas) = names(media)
round(Medidas, 1)
n media mediana desviacion q1 q3
Hombre 2021 628 40.2 30 31.8 20 60
Hombre 2024 585 42.0 30 33.6 20 60
Mujer 2021 724 43.2 30 35.5 20 60
Mujer 2024 765 38.4 30 31.9 20 60
#Minutos continuos de lectura por grupo de edad y año
grupo = paste(Lect$gedad, Lect$anio)
n = tapply(Lect$p26, grupo, length)
media = tapply(Lect$p26, grupo, mean)
mediana = tapply(Lect$p26, grupo, median)
desviacion = tapply(Lect$p26, grupo, sd)
q1 = tapply(Lect$p26, grupo, quantile, 0.25)
q3 = tapply(Lect$p26, grupo, quantile, 0.75)
Medidas = data.frame(n, media, mediana, desviacion, q1, q3)
row.names(Medidas) = names(media)
round(Medidas, 1)
n media mediana desviacion q1 q3
18-29 2021 342 42.7 30 33.3 20 60
18-29 2024 299 45.9 30 40.1 20 60
30-44 2021 440 38.3 30 27.9 20 45
30-44 2024 424 36.7 30 27.2 20 45
45-59 2021 338 41.4 30 38.2 20 60
45-59 2024 352 40.0 30 33.2 20 60
60+ 2021 232 47.6 30 37.1 25 60
60+ 2024 275 38.6 30 30.2 20 60
par(mfrow = c(1, 2), cex.lab = 0.8, cex.main = 0.8, mar = c(7.5, 4, 3, 1))
boxplot(Lect$p26 ~ Lect$anio * Lect$gedad, col = colores,
        main = "Minutos por edad (gris 2021, azul 2024)", ylab = "Minutos", xlab = "Grupo de edad", las = 2, cex.axis = 0.6)
boxplot(Lect$p26 ~ Lect$anio * Lect$sexo_f, col = colores,
        main = "Minutos por sexo (gris 2021, azul 2024)", ylab = "Minutos", xlab = "Sexo", las = 2, cex.axis = 0.6)

#Formato de lectura de libros

Porcentaje de cada formato, ya sea digita o fisico dentro de cada grupo

round(100 * prop.table(table(L21$gedad, L21$formato), 1), 1)
/ Solo impreso Solo digital Ambos
18-29 65.8 28.3 5.9
30-44 70.9 23.5 5.6
45-59 78.6 14.8 6.6
60+ 86.4 9.7 3.9
round(100 * prop.table(table(L24$gedad, L24$formato), 1), 1)
/ Solo impreso Solo digital Ambos
18-29 63.2 27.9 9.0
30-44 73.0 22.2 4.8
45-59 81.0 15.9 3.2
60+ 88.9 7.0 4.1
round(100 * prop.table(table(L21$sexo_f, L21$formato), 1), 1)
/ Solo impreso Solo digital Ambos
Hombre 76.0 18.9 5.1
Mujer 73.1 21.0 6.0
round(100 * prop.table(table(L24$sexo_f, L24$formato), 1), 1)
/ Solo impreso Solo digital Ambos
Hombre 74.1 19.3 6.6
Mujer 76.9 18.7 4.4
par(mfrow = c(1, 2))
barplot(t(prop.table(table(L21$gedad, L21$formato), 1)) * 100, col = c("pink", "blue", "green"),
        main = "Formato por edad 2021", ylab = "%", legend.text = TRUE, args.legend = list(x = "bottomright", cex = 0.7))
barplot(t(prop.table(table(L24$gedad, L24$formato), 1)) * 100, col = c("pink", "blue", "green"),
        main = "Formato por edad 2024", ylab = "%")

#Comparación entre años

comp = data.frame(c(mean(Alf$p3_1[Alf$anio == "2021"] == 1) * 100,
                    median(L21$p4, na.rm = TRUE),
                    mean(L21$p4, na.rm = TRUE),
                    median(P21$p26),
                    mean(P21$p26),
                    mean(L21$p8_1 == 1, na.rm = TRUE) * 100,
                    mean(L21$p8_2 == 1, na.rm = TRUE) * 100,
                    mean(L21$formato == "Solo digital", na.rm = TRUE) * 100,
                    mean(Datos21$edad, na.rm = TRUE)),
                  c(mean(Alf$p3_1[Alf$anio == "2024"] == 1) * 100,
                    median(L24$p4, na.rm = TRUE),
                    mean(L24$p4, na.rm = TRUE),
                    median(P24$p26),
                    mean(P24$p26),
                    mean(L24$p8_1 == 1, na.rm = TRUE) * 100,
                    mean(L24$p8_2 == 1, na.rm = TRUE) * 100,
                    mean(L24$formato == "Solo digital", na.rm = TRUE) * 100,
                    mean(Datos24$edad, na.rm = TRUE)))
names(comp) = c("2021", "2024")
row.names(comp) = c("% que leyó libros", "Mediana de libros", "Media de libros", "Mediana de minutos",
                    "Media de minutos", "% algún libro digital", "% algún libro impreso", "% solo digital", "Edad media")
comp$Cambio = comp[ , 2] - comp[ , 1]
round(comp, 2)
2021 2024 Cambio
% que leyó libros 42.26 41.09 -1.18
Mediana de libros 2.00 2.00 0.00
Media de libros 3.79 3.18 -0.62
Mediana de minutos 30.00 30.00 0.00
Media de minutos 41.78 39.99 -1.78
% algún libro digital 25.65 24.23 -1.43
% algún libro impreso 79.95 81.09 1.14
% solo digital 20.05 18.91 -1.14
Edad media 44.77 46.49 1.72