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
| 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
| 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)
| 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))
Variables discretas: sexo, grupo de edad y formato de lectura
table(Datos$sexo_f, Datos$anio)
| Hombre |
882 |
859 |
| Mujer |
1066 |
1157 |
round(100 * prop.table(table(Datos$sexo_f, Datos$anio), 2), 1)
| Hombre |
45.3 |
42.6 |
| Mujer |
54.7 |
57.4 |
table(Datos$gedad, Datos$anio)
| 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)
| 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)
| Solo impreso |
597 |
613 |
| Solo digital |
161 |
153 |
| Ambos |
45 |
43 |
round(100 * prop.table(table(Libros$formato, Libros$anio), 2), 1)
| 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)
| 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)
| 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)
| 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)
| 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)
| 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)
| 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)
| 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)
| 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)
| 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)
| 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)
| 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)
| 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)
| % 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 |