En el siguiente documento se proporciona un ejemplo de cómo puede hacerse el análisis descriptivo de los datos. No se pondrá pregunta de investigación y se seleecionarán variables sin un objetivo particular, pero te servirá para poder adentrarte en la base y hacer el análisis descriptivo de tus variables de interés acordes con tu pregunta de investigación.

Se ejemplificará con dos variables, una cuantitativa y otra cualitativa y con la evolución a través de los años.

# 1. Carga de las bases de datos originales (Asegúrate que los nombres coincidan con tus archivos)
M23 = read.csv("Datos_molec_2023-1.CSV")
M24 = read.csv("Datos_molec_2024-1.csv")

# 2. Definición de los NEMÓNICOS de las 9 variables seleccionadas:
# edad, p3_1 (Libros), p3_3 (Periódicos), p3_5 (Internet)
# p4 (Cantidad Libros), p10 (Cantidad Revistas)
# p16 (No Lee Gral), p17 (No Lee Rev), p18_1 (No Lee Per)
variables_elegidas = c("edad", "p3_1", "p3_3", "p3_5", "p4", "p10", "p16", "p17", "p18_1")


# Paso 1: Crear el subconjunto inicial solo con las 9 variables
M23_sub = M23[, variables_elegidas]

# Paso 2: Aplicar filtros de exclusión (Códigos de omisión/error)
M23_limpia = subset(M23_sub, 
                     edad != 99 &
                     p4 != 999 &
                     p10 != 999 &
                     p16 != 99 &
                     p17 != 99 &
                     p18_1 != 99)

# Paso 3: Eliminar filas con cualquier NA restante
M23_limpia = na.omit(M23_limpia)

# Revisión final de la base de 2023 limpia
cat("Estructura de la base 2023 limpia:\n")
## Estructura de la base 2023 limpia:
str(M23_limpia)
## 'data.frame':    1996 obs. of  9 variables:
##  $ edad : int  29 53 65 44 52 36 74 53 23 57 ...
##  $ p3_1 : int  2 2 2 2 2 2 1 2 1 2 ...
##  $ p3_3 : int  2 1 2 2 2 2 2 2 2 2 ...
##  $ p3_5 : int  2 2 2 2 1 2 2 1 1 2 ...
##  $ p4   : int  0 0 0 0 0 0 2 0 3 0 ...
##  $ p10  : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ p16  : int  0 1 0 0 0 0 0 0 0 0 ...
##  $ p17  : int  0 4 0 0 0 0 0 0 0 0 ...
##  $ p18_1: int  0 1 0 0 0 0 0 0 0 0 ...
cat("\nResumen de la base 2023 limpia (se busca que no haya NAs y las exclusiones se hayan aplicado):\n")
## 
## Resumen de la base 2023 limpia (se busca que no haya NAs y las exclusiones se hayan aplicado):
summary(M23_limpia)
edad p3_1 p3_3 p3_5 p4 p10 p16 p17 p18_1
Min. :18.00 Min. :0.000 Min. :0.000 Min. :0.00 Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. :0.0000 Min. :0.0000
1st Qu.:32.00 1st Qu.:1.000 1st Qu.:2.000 1st Qu.:1.00 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.:0.0000 1st Qu.:0.0000
Median :45.00 Median :2.000 Median :2.000 Median :2.00 Median : 0.000 Median : 0.000 Median : 0.0000 Median :0.0000 Median :0.0000
Mean :46.21 Mean :1.565 Mean :1.784 Mean :1.61 Mean : 1.381 Mean : 0.756 Mean : 0.5792 Mean :0.5842 Mean :0.2244
3rd Qu.:59.00 3rd Qu.:2.000 3rd Qu.:2.000 3rd Qu.:2.00 3rd Qu.: 2.000 3rd Qu.: 0.000 3rd Qu.: 0.0000 3rd Qu.:0.0000 3rd Qu.:0.0000
Max. :97.00 Max. :2.000 Max. :2.000 Max. :2.00 Max. :80.000 Max. :70.000 Max. :50.0000 Max. :6.0000 Max. :2.0000
# Paso 4: Guardar la base limpia de 2023
write.csv(x=M23_limpia, file="BaseLimpia_2023.csv", row.names=FALSE)
cat("\nLa base limpia y reducida de 2023 ha sido guardada como 'BaseLimpia_2023.csv'.\n")
## 
## La base limpia y reducida de 2023 ha sido guardada como 'BaseLimpia_2023.csv'.
# Crear la base limpia de 2024 con el mismo proceso
M24_sub = M24[, variables_elegidas]

# Aplicar filtros de exclusión para 2024
M24_limpia = subset(M24_sub, 
                     edad != 99 &
                     p4 != 999 &
                     p10 != 999 &
                     p16 != 99 &
                     p17 != 99 &
                     p18_1 != 99)

# Eliminar filas con cualquier NA restante
M24_limpia = na.omit(M24_limpia)

# Revisión final de la base de 2024 limpia
cat("Estructura de la base 2024 limpia:\n")
## Estructura de la base 2024 limpia:
str(M24_limpia)
## 'data.frame':    2016 obs. of  9 variables:
##  $ edad : int  52 55 59 30 54 30 66 45 26 41 ...
##  $ p3_1 : int  2 2 2 2 2 2 2 2 2 2 ...
##  $ p3_3 : int  2 2 2 2 1 2 2 2 1 2 ...
##  $ p3_5 : int  2 2 2 2 2 1 2 2 1 1 ...
##  $ p4   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ p10  : int  0 0 0 0 0 0 0 0 2 0 ...
##  $ p16  : int  0 0 0 0 1 0 0 0 1 0 ...
##  $ p17  : int  0 0 0 0 4 0 0 0 4 0 ...
##  $ p18_1: int  0 0 0 0 1 0 0 0 1 0 ...
cat("\nResumen de la base 2024 limpia:\n")
## 
## Resumen de la base 2024 limpia:
summary(M24_limpia)
edad p3_1 p3_3 p3_5 p4 p10 p16 p17 p18_1
Min. :18.00 Min. :0.000 Min. :0.000 Min. :0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.0000 Min. :0.0000 Min. :0.0000
1st Qu.:33.00 1st Qu.:1.000 1st Qu.:2.000 1st Qu.:1.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.:0.0000 1st Qu.:0.0000
Median :46.00 Median :2.000 Median :2.000 Median :2.000 Median : 0.000 Median : 0.0000 Median : 0.0000 Median :0.0000 Median :0.0000
Mean :46.49 Mean :1.552 Mean :1.781 Mean :1.588 Mean : 1.275 Mean : 0.6349 Mean : 0.5749 Mean :0.5794 Mean :0.2163
3rd Qu.:59.00 3rd Qu.:2.000 3rd Qu.:2.000 3rd Qu.:2.000 3rd Qu.: 2.000 3rd Qu.: 0.0000 3rd Qu.: 0.0000 3rd Qu.:0.0000 3rd Qu.:0.0000
Max. :94.00 Max. :2.000 Max. :2.000 Max. :2.000 Max. :70.000 Max. :25.0000 Max. :60.0000 Max. :6.0000 Max. :2.0000
# Guardar la base limpia de 2024
write.csv(x=M24_limpia, file="BaseLimpia_2024.csv", row.names=FALSE)
cat("\nLa base limpia y reducida de 2024 ha sido guardada como 'BaseLimpia_2024.csv'.\n")
## 
## La base limpia y reducida de 2024 ha sido guardada como 'BaseLimpia_2024.csv'.

Preparación de los datos

Lectura de los datos

Datos_2023 = read.csv("BaseLimpia_2023.csv")

Datos_2024 = read.csv("BaseLimpia_2024.csv")

Variables de interés

  • Año: diferentes archivos de INEGI
    • Variable cualitativa, toma los valores de 2023, 2024
  • Pregunta 4: ¿Cuántos libros leyó en los últimos doce meses?
    • Nombre de la variable en la base de datos: p4
    • Número de columna: 22 (en datos originales), 5 (en datos limpios)
    • Variable numérica, puede tomar valores de 0 a 99
  • Pregunta 34c: ¿Sus padres o tutores le leían?
    • Nombre de la variable en la base de datos:34_3
    • Número de columna: 92
    • Variable cualitativa, puede tomar los valores:
      • 1 = Sí
      • 2 = No
      • 3 = no lo recuerda
      • 0 = blanco por pase u omisión.

El análisis descriptivo

Variable continua: ¿Cuántos libros leyó en los últimos doce meses?

Medidas Descriptivas Completas

Para las medidas de forma (sesgo y curtosis), se requiere la biblioteca e1071, instálala en el menú superior: Tools/install Packages

library(e1071)

# Medidas descriptivas completas para libros leídos (p4)
# 2023
d23 = c(as.numeric(summary(M23_limpia[,5])),
        (max(M23_limpia[ ,5])-min(M23_limpia[ ,5]))/2,
        sd(M23_limpia[ ,5]),
        mean(M23_limpia[ ,5])/sd(M23_limpia[ ,5]),
        skewness(M23_limpia[ ,5]),
        kurtosis(M23_limpia[ ,5]))

# 2024
d24 = c(as.numeric(summary(M24_limpia[,5])),
        (max(M24_limpia[ ,5])-min(M24_limpia[ ,5]))/2,
        sd(M24_limpia[ ,5]),
        mean(M24_limpia[ ,5])/sd(M24_limpia[ ,5]),
        skewness(M24_limpia[ ,5]),
        kurtosis(M24_limpia[ ,5]))

# Tabla comparativa
m = data.frame(d23, d24)
names(m) = c("2023","2024")
row.names(m) = c("Minimo","Q1","Mediana","Media","Q3","Máximo","Rango Medio", "Desv Est", "CV", "Sesgo", "Curtosis")
round(m,2)
2023 2024
Minimo 0.00 0.00
Q1 0.00 0.00
Mediana 0.00 0.00
Media 1.38 1.27
Q3 2.00 2.00
Máximo 80.00 70.00
Rango Medio 40.00 35.00
Desv Est 4.04 3.26
CV 0.34 0.39
Sesgo 11.06 9.38
Curtosis 171.66 143.56

Medidas para Edad

# Medidas descriptivas para edad
# 2023
edad23 = c(as.numeric(summary(M23_limpia[,1])),
           (max(M23_limpia[ ,1])-min(M23_limpia[ ,1]))/2,
           sd(M23_limpia[ ,1]),
           mean(M23_limpia[ ,1])/sd(M23_limpia[ ,1]),
           skewness(M23_limpia[ ,1]),
           kurtosis(M23_limpia[ ,1]))

# 2024
edad24 = c(as.numeric(summary(M24_limpia[,1])),
           (max(M24_limpia[ ,1])-min(M24_limpia[ ,1]))/2,
           sd(M24_limpia[ ,1]),
           mean(M24_limpia[ ,1])/sd(M24_limpia[ ,1]),
           skewness(M24_limpia[ ,1]),
           kurtosis(M24_limpia[ ,1]))

# Tabla comparativa para edad
edad_tabla = data.frame(edad23, edad24)
names(edad_tabla) = c("2023","2024")
row.names(edad_tabla) = c("Minimo","Q1","Mediana","Media","Q3","Máximo","Rango Medio", "Desv Est", "CV", "Sesgo", "Curtosis")
round(edad_tabla,2)
2023 2024
Minimo 18.00 18.00
Q1 32.00 33.00
Mediana 45.00 46.00
Media 46.21 46.49
Q3 59.00 59.00
Máximo 97.00 94.00
Rango Medio 39.50 38.00
Desv Est 16.63 16.76
CV 2.78 2.77
Sesgo 0.26 0.27
Curtosis -0.82 -0.81

Medidas para Revistas (p10)

# Medidas descriptivas para revistas leídas
# 2023
rev23 = c(as.numeric(summary(M23_limpia[,6])),
          (max(M23_limpia[ ,6])-min(M23_limpia[ ,6]))/2,
          sd(M23_limpia[ ,6]),
          mean(M23_limpia[ ,6])/sd(M23_limpia[ ,6]),
          skewness(M23_limpia[ ,6]),
          kurtosis(M23_limpia[ ,6]))

# 2024
rev24 = c(as.numeric(summary(M24_limpia[,6])),
          (max(M24_limpia[ ,6])-min(M24_limpia[ ,6]))/2,
          sd(M24_limpia[ ,6]),
          mean(M24_limpia[ ,6])/sd(M24_limpia[ ,6]),
          skewness(M24_limpia[ ,6]),
          kurtosis(M24_limpia[ ,6]))

# Tabla comparativa para revistas
rev_tabla = data.frame(rev23, rev24)
names(rev_tabla) = c("2023","2024")
row.names(rev_tabla) = c("Minimo","Q1","Mediana","Media","Q3","Máximo","Rango Medio", "Desv Est", "CV", "Sesgo", "Curtosis")
round(rev_tabla,2)
2023 2024
Minimo 0.00 0.00
Q1 0.00 0.00
Mediana 0.00 0.00
Media 0.76 0.63
Q3 0.00 0.00
Máximo 70.00 25.00
Rango Medio 35.00 12.50
Desv Est 2.73 1.70
CV 0.28 0.37
Sesgo 14.68 5.30
Curtosis 323.03 45.63

Análisis de Correlación

# Análisis de correlación entre variables cuantitativas
# Crear matriz de correlación para 2023
correlacion_2023 = cor(M23_limpia[,c(1,5,6)], use="complete.obs")
print("Matriz de correlación 2023:")
## [1] "Matriz de correlación 2023:"
round(correlacion_2023, 3)
edad p4 p10
edad 1.000 -0.112 -0.029
p4 -0.112 1.000 0.150
p10 -0.029 0.150 1.000
# Crear matriz de correlación para 2024
correlacion_2024 = cor(M24_limpia[,c(1,5,6)], use="complete.obs")
print("Matriz de correlación 2024:")
## [1] "Matriz de correlación 2024:"
round(correlacion_2024, 3)
edad p4 p10
edad 1.000 -0.116 -0.029
p4 -0.116 1.000 0.220
p10 -0.029 0.220 1.000
# Gráfico de correlación
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.4.3
## corrplot 0.95 loaded
par(mfrow=c(1,2))
corrplot(correlacion_2023, method="color", type="upper", 
         title="Correlaciones 2023", mar=c(0,0,1,0))
corrplot(correlacion_2024, method="color", type="upper", 
         title="Correlaciones 2024", mar=c(0,0,1,0))

Gráficos

Gráfico de Caja y bigote - Análisis de Outliers

Para poder comparar fácilmente los años, se pone la misma escala en todos los gráficos. Los boxplots permiten identificar valores atípicos (outliers) y analizar la distribución de los datos.

colores = rainbow(2)
par(mfrow=c(1,2), cex.lab=0.8, cex.main=0.8)

# Boxplots para libros leídos
boxplot(M23_limpia[,5],
        col = colores[1],
        horizontal = TRUE,
        main = "Número de libros leídos \n 2023",
        ylim=c(0,100),
        xlab="Número de libros")
boxplot(M24_limpia[,5],
        col = colores[2],
        horizontal = TRUE,
        main = "Número de libros leídos \n 2024",
        ylim=c(0,100),
        xlab="Número de libros")

Boxplots para Edad

par(mfrow=c(1,2), cex.lab=0.8, cex.main=0.8)
boxplot(M23_limpia[,1],
        col = colores[1],
        horizontal = TRUE,
        main = "Edad \n 2023",
        xlab="Edad")
boxplot(M24_limpia[,1],
        col = colores[2],
        horizontal = TRUE,
        main = "Edad \n 2024",
        xlab="Edad")

Boxplots para Revistas

par(mfrow=c(1,2), cex.lab=0.8, cex.main=0.8)
boxplot(M23_limpia[,6],
        col = colores[1],
        horizontal = TRUE,
        main = "Número de revistas leídas \n 2023",
        xlab="Número de revistas")
boxplot(M24_limpia[,6],
        col = colores[2],
        horizontal = TRUE,
        main = "Número de revistas leídas \n 2024",
        xlab="Número de revistas")

Histogramas - Análisis de Distribución

Los histogramas permiten analizar la forma de la distribución de los datos, identificar si es simétrica o asimétrica, y ver dónde se concentran más los datos.

# Histogramas para libros leídos
par(mfrow=c(1,2))
hist(M23_limpia[,5], col = colores[1], main = "Distribución de libros leídos \n 2023", 
     xlab="Número de libros", ylab="Frecuencia", breaks=20)
hist(M24_limpia[,5], col = colores[2], main = "Distribución de libros leídos \n 2024", 
     xlab="Número de libros", ylab="Frecuencia", breaks=20)

Histogramas para Edad

par(mfrow=c(1,2))
hist(M23_limpia[,1], col = colores[1], main = "Distribución de edad \n 2023", 
     xlab="Edad", ylab="Frecuencia", breaks=15)
hist(M24_limpia[,1], col = colores[2], main = "Distribución de edad \n 2024", 
     xlab="Edad", ylab="Frecuencia", breaks=15)

Histogramas para Revistas

par(mfrow=c(1,2))
hist(M23_limpia[,6], col = colores[1], main = "Distribución de revistas leídas \n 2023", 
     xlab="Número de revistas", ylab="Frecuencia", breaks=15)
hist(M24_limpia[,6], col = colores[2], main = "Distribución de revistas leídas \n 2024", 
     xlab="Número de revistas", ylab="Frecuencia", breaks=15)

Gráficos de Densidad

# Gráficos de densidad para análisis más detallado
par(mfrow=c(1,2))
plot(density(M23_limpia[,5]), main="Densidad de libros leídos \n 2023", 
     xlab="Número de libros", col="blue", lwd=2)
plot(density(M24_limpia[,5]), main="Densidad de libros leídos \n 2024", 
     xlab="Número de libros", col="red", lwd=2)

Interpreta

Describe:

  • Sesgo de la distribución de la variable
  • Datos atípicos
  • Comportamiento general de la población (centralización, variación, posición y forma)
  • Interpreta gráficos y medidas a la vez y relacionándolos entre sí

Variables Cualitativas: Análisis Descriptivo Completo

Análisis de Variables Cualitativas Disponibles en Datos Limpios

NOTA: Las siguientes variables cualitativas están disponibles en los datos limpios: p3_1 (Leyó libros), p3_3 (Leyó periódicos), p3_5 (Leyó páginas de internet), p16 (Motivo para no leer), p17 (Motivo para no leer revistas), p18_1 (Motivo para no leer periódicos).

Tablas de Frecuencia para Variables de Lectura

# Tabla de frecuencia para p3_1 (Leyó libros) - 2023
freq_libros_23 = table(M23_limpia[,2])
prop_libros_23 = prop.table(freq_libros_23)
tabla_libros_23 = cbind(freq_libros_23, prop_libros_23)
colnames(tabla_libros_23) = c("Frecuencia", "Proporción")
print("Leyó libros - 2023:")
## [1] "Leyó libros - 2023:"
round(tabla_libros_23, 3)
Frecuencia Proporción
0 37 0.019
1 795 0.398
2 1164 0.583
# Tabla de frecuencia para p3_1 (Leyó libros) - 2024
freq_libros_24 = table(M24_limpia[,2])
prop_libros_24 = prop.table(freq_libros_24)
tabla_libros_24 = cbind(freq_libros_24, prop_libros_24)
colnames(tabla_libros_24) = c("Frecuencia", "Proporción")
print("Leyó libros - 2024:")
## [1] "Leyó libros - 2024:"
round(tabla_libros_24, 3)
Frecuencia Proporción
0 47 0.023
1 809 0.401
2 1160 0.575

Gráficos para Variables Cualitativas

prop_libros_23
0 1 2
0.0185371 0.3982966 0.5831663
# Gráficos de barras para variables de lectura
par(mfrow=c(2,2))

# Gráfico de barras para p3_1 (Leyó libros)
barplot(prop_libros_23, main="Leyó libros - 2023", 
        col=c("lightblue", "lightcoral"), 
        names.arg=c("NA", "No", "Sí")
        )
barplot(prop_libros_24, main="Leyó libros - 2024", 
        col=c("lightblue", "lightcoral"), 
        names.arg=c("NA", "No", "Sí")
        )

# Gráficos de pastel
pie(prop_libros_23, main="Leyó libros - 2023", 
    col=c("lightblue", "lightcoral"), 
    labels=c("NA", "No", "Sí"))
pie(prop_libros_24, main="Leyó libros - 2024", 
    col=c("lightblue", "lightcoral"), 
    labels=c("NA", "No", "Sí"))

Análisis de Periódicos (p3_3)

# Tabla de frecuencia para p3_3 (Leyó periódicos)
freq_periodicos_23 = table(M23_limpia[,3])
prop_periodicos_23 = prop.table(freq_periodicos_23)
tabla_periodicos_23 = cbind(freq_periodicos_23, prop_periodicos_23)
colnames(tabla_periodicos_23) = c("Frecuencia", "Proporción")
print("Leyó periódicos - 2023:")
## [1] "Leyó periódicos - 2023:"
round(tabla_periodicos_23, 3)
Frecuencia Proporción
0 37 0.019
1 357 0.179
2 1602 0.803
freq_periodicos_24 = table(M24_limpia[,3])
prop_periodicos_24 = prop.table(freq_periodicos_24)
tabla_periodicos_24 = cbind(freq_periodicos_24, prop_periodicos_24)
colnames(tabla_periodicos_24) = c("Frecuencia", "Proporción")
print("Leyó periódicos - 2024:")
## [1] "Leyó periódicos - 2024:"
round(tabla_periodicos_24, 3)
Frecuencia Proporción
0 47 0.023
1 348 0.173
2 1621 0.804

Análisis de Internet (p3_5)

# Tabla de frecuencia para p3_5 (Leyó páginas de internet)
freq_internet_23 = table(M23_limpia[,4])
prop_internet_23 = prop.table(freq_internet_23)
tabla_internet_23 = cbind(freq_internet_23, prop_internet_23)
colnames(tabla_internet_23) = c("Frecuencia", "Proporción")
print("Leyó páginas de internet - 2023:")
## [1] "Leyó páginas de internet - 2023:"
round(tabla_internet_23, 3)
Frecuencia Proporción
0 37 0.019
1 705 0.353
2 1254 0.628
freq_internet_24 = table(M24_limpia[,4])
prop_internet_24 = prop.table(freq_internet_24)
tabla_internet_24 = cbind(freq_internet_24, prop_internet_24)
colnames(tabla_internet_24) = c("Frecuencia", "Proporción")
print("Leyó páginas de internet - 2024:")
## [1] "Leyó páginas de internet - 2024:"
round(tabla_internet_24, 3)
Frecuencia Proporción
0 47 0.023
1 737 0.366
2 1232 0.611

Interpreta

Describe:

  • Proporción en cada categoría
  • Cambio de la proporción en función del tiempo
  • Interpreta gráficos y medidas a la vez y relacionándolos

Análisis Bivariado: Variables Cuantitativas vs Cualitativas

Análisis de Libros Leídos por Categorías de Lectura

Gráficos Bivariados

# Boxplots de libros leídos por categoría de lectura
par(mfrow=c(1,2))
boxplot(M23_limpia[,5] ~ M23_limpia[,2], 
        main="Libros leídos por categoría de lectura \n 2023",
        xlab="Leyó libros", ylab="Número de libros",
        col=c("lightblue", "lightcoral"))
boxplot(M24_limpia[,5] ~ M24_limpia[,2], 
        main="Libros leídos por categoría de lectura \n 2024",
        xlab="Leyó libros", ylab="Número de libros",
        col=c("lightblue", "lightcoral"))

Análisis de Edad por Categorías de Lectura

# Análisis de edad por si leyó libros

# 2023
edad_por_lectura_23 = tapply(M23_limpia[,1], M23_limpia[,2], function(x) {
  c("Media"=mean(x), "Mediana"=median(x), "Desv Est"=sd(x), "Minimo"=min(x), "Maximo"=max(x))
})
names(edad_por_lectura_23) = c("p3_1: 0 (NA/Omitido)", "p3_1: 1 (NO leyó)", "p3_1: 2 (SÍ leyó)")
print("Edad por categoría de lectura - 2023:")
## [1] "Edad por categoría de lectura - 2023:"
print(edad_por_lectura_23)
## $`p3_1: 0 (NA/Omitido)`
##    Media  Mediana Desv Est   Minimo   Maximo 
## 63.83784 65.00000 15.87016 18.00000 91.00000 
## 
## $`p3_1: 1 (NO leyó)`
##    Media  Mediana Desv Est   Minimo   Maximo 
## 43.69686 41.00000 16.71083 18.00000 88.00000 
## 
## $`p3_1: 2 (SÍ leyó)`
##    Media  Mediana Desv Est   Minimo   Maximo 
## 47.37027 47.00000 16.13703 18.00000 97.00000
# 2024
edad_por_lectura_24 = tapply(M24_limpia[,1], M24_limpia[,2], function(x) {
  c("Media"=mean(x), "Mediana"=median(x), "Desv Est"=sd(x), "Minimo"=min(x), "Maximo"=max(x))
})
names(edad_por_lectura_24) = c("p3_1: 0 (NA/Omitido)", "p3_1: 1 (NO leyó)", "p3_1: 2 (SÍ leyó)")
print("Edad por categoría de lectura - 2024:")
## [1] "Edad por categoría de lectura - 2024:"
print(edad_por_lectura_24)
## $`p3_1: 0 (NA/Omitido)`
##    Media  Mediana Desv Est   Minimo   Maximo 
## 63.63830 65.00000 16.88764 25.00000 89.00000 
## 
## $`p3_1: 1 (NO leyó)`
##    Media  Mediana Desv Est   Minimo   Maximo 
## 43.41038 41.00000 16.72217 18.00000 89.00000 
## 
## $`p3_1: 2 (SÍ leyó)`
##    Media  Mediana Desv Est   Minimo   Maximo 
## 47.94569 47.00000 16.17051 18.00000 94.00000

Gráficos Comparativos por Años

# Gráfico comparativo de medias por año
medias_comparativas = data.frame(
  Año = c("2023", "2024"),
  Leyó_libros = c(mean(M23_limpia[M23_limpia[,2]==1, 5]), 
                  mean(M24_limpia[M24_limpia[,2]==1, 5])),
  No_leyó_libros = c(mean(M23_limpia[M23_limpia[,2]==2, 5]), 
                     mean(M24_limpia[M24_limpia[,2]==2, 5]))
)

# Gráfico de barras comparativo
barplot(as.matrix(medias_comparativas[,2:3]), 
        beside=TRUE, 
        main="Comparación de libros leídos por categoría y año",
        xlab="Categoría", ylab="Promedio de libros",
        col=c("lightblue", "lightcoral"),
        legend.text=c("2023", "2024"))