Pontificia Universidad Católica del Perú
Facultad de Ciencias Sociales - Especialidad de Socioogía
En este instructivo mostraremos cómo utilizar el R para crear tablas de frecuencias y de estadísticos descriptivos, considerando el factor de expansión de la EHANO.
Para ello, en su directorio de trabajo debe tener las siguientes bases de datos de la ENAHO 2016:
Vamos a trabajar con el Módulo 1 de la ENAHO, sobre características de la vivienda.
library(haven)
modulo1 <- read_sav("https://www.dropbox.com/s/merao9aqthin0wk/Enaho01-2016-100.sav?dl=1")
## `curl` package not installed, falling back to using `url()`
Paso 1: Recodificamos la variable ESTRATO para crear la variable Área de residencia
library(car)
modulo1$urbano <- factor(recode(modulo1$ESTRATO, "1:5 = 1; 6:8=2"),
labels = c("Urbano", "Rural"))
Paso 2: Tablas de frecuencia aplicando factor de ponderación
Para generar tablas aplicando un factor de ponderación es necesario usar el comando xtabs. En este caso la tabla generada contiene números absolutos (conteos de hogares expandidos)
tabla_matp <-xtabs(FACTOR07~P102+DOMINIO+urbano, data = modulo1)
tabla_matp
## , , urbano = Urbano
##
## DOMINIO
## P102 1 2 3 4 5
## 1 5.802134e+05 3.673650e+05 1.383928e+05 6.358436e+04 2.204878e+05
## 2 5.185801e+03 2.394400e+03 3.748094e+02 3.269993e+03 1.882594e+03
## 3 3.203458e+05 9.105885e+04 7.459134e+03 7.789583e+04 1.767602e+05
## 4 2.106993e+03 5.043381e+02 8.293260e+01 2.421435e+04 1.354227e+05
## 5 3.487100e+04 6.541053e+03 1.858474e+03 7.521054e+02 2.735558e+02
## 6 0.000000e+00 1.789386e+02 0.000000e+00 4.636985e+02 2.814358e+03
## 7 3.270441e+03 2.001872e+04 8.903292e+03 1.101948e+03 2.178934e+03
## 8 2.021200e+03 1.580608e+04 2.691284e+03 0.000000e+00 5.049716e+02
## 9 5.977261e+04 1.483643e+04 5.583950e+03 1.231948e+03 1.684514e+03
## DOMINIO
## P102 6 7 8
## 1 4.186179e+05 2.797608e+05 2.185441e+06
## 2 2.633598e+04 5.142291e+03 1.967332e+04
## 3 3.029137e+05 7.520073e+04 1.238619e+05
## 4 9.783866e+02 1.408079e+04 0.000000e+00
## 5 4.234176e+02 1.668803e+04 3.172995e+04
## 6 1.106939e+03 8.034771e+02 2.868769e+03
## 7 5.874211e+03 2.024184e+05 2.555501e+05
## 8 1.046958e+03 8.940049e+02 5.028238e+03
## 9 1.403009e+04 2.248347e+04 2.964866e+04
##
## , , urbano = Rural
##
## DOMINIO
## P102 1 2 3 4 5
## 1 1.057912e+04 1.813008e+04 1.289382e+04 1.491887e+04 2.464351e+04
## 2 0.000000e+00 1.636786e+02 6.280003e+01 1.515414e+03 1.604445e+03
## 3 1.087028e+05 2.794668e+04 1.214739e+03 2.097710e+05 2.344716e+05
## 4 0.000000e+00 4.499617e+01 0.000000e+00 1.257552e+05 2.729563e+05
## 5 3.522528e+03 5.028941e+03 1.472480e+03 3.410192e+03 1.801243e+03
## 6 0.000000e+00 0.000000e+00 0.000000e+00 1.487780e+04 1.153544e+04
## 7 1.489850e+02 3.753573e+03 4.534668e+03 3.421200e+03 8.163146e+03
## 8 3.933280e+02 2.313360e+03 1.624538e+03 3.158036e+02 5.886621e+02
## 9 1.245601e+04 8.523892e+02 1.079205e+03 4.436952e+03 2.872781e+03
## DOMINIO
## P102 6 7 8
## 1 2.460767e+04 4.264212e+04 0.000000e+00
## 2 2.188277e+03 6.987865e+02 0.000000e+00
## 3 4.056672e+05 7.151361e+04 0.000000e+00
## 4 5.605571e+03 1.367105e+04 0.000000e+00
## 5 1.156628e+03 1.116518e+04 0.000000e+00
## 6 3.104768e+04 2.786140e+03 0.000000e+00
## 7 2.873440e+03 2.159145e+05 0.000000e+00
## 8 8.998301e+02 4.238127e+02 0.000000e+00
## 9 2.878701e+03 4.897937e+04 0.000000e+00
Paso 3: Convertimos la tabla en un data frame y utilizamos el comando dcast del paquete reshape2 para restructurar la tabla a nuestros requerimientos:
tabla2_matp <- as.data.frame(tabla_matp)
tabla2_matp
## P102 DOMINIO urbano Freq
## 1 1 1 Urbano 5.802134e+05
## 2 2 1 Urbano 5.185801e+03
## 3 3 1 Urbano 3.203458e+05
## 4 4 1 Urbano 2.106993e+03
## 5 5 1 Urbano 3.487100e+04
## 6 6 1 Urbano 0.000000e+00
## 7 7 1 Urbano 3.270441e+03
## 8 8 1 Urbano 2.021200e+03
## 9 9 1 Urbano 5.977261e+04
## 10 1 2 Urbano 3.673650e+05
## 11 2 2 Urbano 2.394400e+03
## 12 3 2 Urbano 9.105885e+04
## 13 4 2 Urbano 5.043381e+02
## 14 5 2 Urbano 6.541053e+03
## 15 6 2 Urbano 1.789386e+02
## 16 7 2 Urbano 2.001872e+04
## 17 8 2 Urbano 1.580608e+04
## 18 9 2 Urbano 1.483643e+04
## 19 1 3 Urbano 1.383928e+05
## 20 2 3 Urbano 3.748094e+02
## 21 3 3 Urbano 7.459134e+03
## 22 4 3 Urbano 8.293260e+01
## 23 5 3 Urbano 1.858474e+03
## 24 6 3 Urbano 0.000000e+00
## 25 7 3 Urbano 8.903292e+03
## 26 8 3 Urbano 2.691284e+03
## 27 9 3 Urbano 5.583950e+03
## 28 1 4 Urbano 6.358436e+04
## 29 2 4 Urbano 3.269993e+03
## 30 3 4 Urbano 7.789583e+04
## 31 4 4 Urbano 2.421435e+04
## 32 5 4 Urbano 7.521054e+02
## 33 6 4 Urbano 4.636985e+02
## 34 7 4 Urbano 1.101948e+03
## 35 8 4 Urbano 0.000000e+00
## 36 9 4 Urbano 1.231948e+03
## 37 1 5 Urbano 2.204878e+05
## 38 2 5 Urbano 1.882594e+03
## 39 3 5 Urbano 1.767602e+05
## 40 4 5 Urbano 1.354227e+05
## 41 5 5 Urbano 2.735558e+02
## 42 6 5 Urbano 2.814358e+03
## 43 7 5 Urbano 2.178934e+03
## 44 8 5 Urbano 5.049716e+02
## 45 9 5 Urbano 1.684514e+03
## 46 1 6 Urbano 4.186179e+05
## 47 2 6 Urbano 2.633598e+04
## 48 3 6 Urbano 3.029137e+05
## 49 4 6 Urbano 9.783866e+02
## 50 5 6 Urbano 4.234176e+02
## 51 6 6 Urbano 1.106939e+03
## 52 7 6 Urbano 5.874211e+03
## 53 8 6 Urbano 1.046958e+03
## 54 9 6 Urbano 1.403009e+04
## 55 1 7 Urbano 2.797608e+05
## 56 2 7 Urbano 5.142291e+03
## 57 3 7 Urbano 7.520073e+04
## 58 4 7 Urbano 1.408079e+04
## 59 5 7 Urbano 1.668803e+04
## 60 6 7 Urbano 8.034771e+02
## 61 7 7 Urbano 2.024184e+05
## 62 8 7 Urbano 8.940049e+02
## 63 9 7 Urbano 2.248347e+04
## 64 1 8 Urbano 2.185441e+06
## 65 2 8 Urbano 1.967332e+04
## 66 3 8 Urbano 1.238619e+05
## 67 4 8 Urbano 0.000000e+00
## 68 5 8 Urbano 3.172995e+04
## 69 6 8 Urbano 2.868769e+03
## 70 7 8 Urbano 2.555501e+05
## 71 8 8 Urbano 5.028238e+03
## 72 9 8 Urbano 2.964866e+04
## 73 1 1 Rural 1.057912e+04
## 74 2 1 Rural 0.000000e+00
## 75 3 1 Rural 1.087028e+05
## 76 4 1 Rural 0.000000e+00
## 77 5 1 Rural 3.522528e+03
## 78 6 1 Rural 0.000000e+00
## 79 7 1 Rural 1.489850e+02
## 80 8 1 Rural 3.933280e+02
## 81 9 1 Rural 1.245601e+04
## 82 1 2 Rural 1.813008e+04
## 83 2 2 Rural 1.636786e+02
## 84 3 2 Rural 2.794668e+04
## 85 4 2 Rural 4.499617e+01
## 86 5 2 Rural 5.028941e+03
## 87 6 2 Rural 0.000000e+00
## 88 7 2 Rural 3.753573e+03
## 89 8 2 Rural 2.313360e+03
## 90 9 2 Rural 8.523892e+02
## 91 1 3 Rural 1.289382e+04
## 92 2 3 Rural 6.280003e+01
## 93 3 3 Rural 1.214739e+03
## 94 4 3 Rural 0.000000e+00
## 95 5 3 Rural 1.472480e+03
## 96 6 3 Rural 0.000000e+00
## 97 7 3 Rural 4.534668e+03
## 98 8 3 Rural 1.624538e+03
## 99 9 3 Rural 1.079205e+03
## 100 1 4 Rural 1.491887e+04
## 101 2 4 Rural 1.515414e+03
## 102 3 4 Rural 2.097710e+05
## 103 4 4 Rural 1.257552e+05
## 104 5 4 Rural 3.410192e+03
## 105 6 4 Rural 1.487780e+04
## 106 7 4 Rural 3.421200e+03
## 107 8 4 Rural 3.158036e+02
## 108 9 4 Rural 4.436952e+03
## 109 1 5 Rural 2.464351e+04
## 110 2 5 Rural 1.604445e+03
## 111 3 5 Rural 2.344716e+05
## 112 4 5 Rural 2.729563e+05
## 113 5 5 Rural 1.801243e+03
## 114 6 5 Rural 1.153544e+04
## 115 7 5 Rural 8.163146e+03
## 116 8 5 Rural 5.886621e+02
## 117 9 5 Rural 2.872781e+03
## 118 1 6 Rural 2.460767e+04
## 119 2 6 Rural 2.188277e+03
## 120 3 6 Rural 4.056672e+05
## 121 4 6 Rural 5.605571e+03
## 122 5 6 Rural 1.156628e+03
## 123 6 6 Rural 3.104768e+04
## 124 7 6 Rural 2.873440e+03
## 125 8 6 Rural 8.998301e+02
## 126 9 6 Rural 2.878701e+03
## 127 1 7 Rural 4.264212e+04
## 128 2 7 Rural 6.987865e+02
## 129 3 7 Rural 7.151361e+04
## 130 4 7 Rural 1.367105e+04
## 131 5 7 Rural 1.116518e+04
## 132 6 7 Rural 2.786140e+03
## 133 7 7 Rural 2.159145e+05
## 134 8 7 Rural 4.238127e+02
## 135 9 7 Rural 4.897937e+04
## 136 1 8 Rural 0.000000e+00
## 137 2 8 Rural 0.000000e+00
## 138 3 8 Rural 0.000000e+00
## 139 4 8 Rural 0.000000e+00
## 140 5 8 Rural 0.000000e+00
## 141 6 8 Rural 0.000000e+00
## 142 7 8 Rural 0.000000e+00
## 143 8 8 Rural 0.000000e+00
## 144 9 8 Rural 0.000000e+00
library(reshape2)
matp <- dcast(tabla2_matp, urbano + P102 ~ DOMINIO)
## Using Freq as value column: use value.var to override.
matp
## urbano P102 1 2 3 4
## 1 Urbano 1 580213.421 367364.95140 138392.78665 63584.3569
## 2 Urbano 2 5185.801 2394.39981 374.80940 3269.9927
## 3 Urbano 3 320345.813 91058.85410 7459.13434 77895.8298
## 4 Urbano 4 2106.993 504.33810 82.93260 24214.3492
## 5 Urbano 5 34870.999 6541.05307 1858.47424 752.1054
## 6 Urbano 6 0.000 178.93864 0.00000 463.6985
## 7 Urbano 7 3270.441 20018.72320 8903.29185 1101.9481
## 8 Urbano 8 2021.200 15806.07994 2691.28389 0.0000
## 9 Urbano 9 59772.609 14836.42879 5583.95000 1231.9482
## 10 Rural 1 10579.121 18130.08453 12893.82483 14918.8655
## 11 Rural 2 0.000 163.67859 62.80003 1515.4137
## 12 Rural 3 108702.848 27946.68203 1214.73930 209771.0408
## 13 Rural 4 0.000 44.99617 0.00000 125755.1799
## 14 Rural 5 3522.528 5028.94078 1472.48023 3410.1919
## 15 Rural 6 0.000 0.00000 0.00000 14877.7981
## 16 Rural 7 148.985 3753.57313 4534.66753 3421.1999
## 17 Rural 8 393.328 2313.36003 1624.53823 315.8036
## 18 Rural 9 12456.010 852.38918 1079.20472 4436.9520
## 5 6 7 8
## 1 220487.8180 418617.9216 279760.8166 2185440.693
## 2 1882.5937 26335.9764 5142.2908 19673.322
## 3 176760.1520 302913.7030 75200.7330 123861.937
## 4 135422.7352 978.3866 14080.7894 0.000
## 5 273.5558 423.4176 16688.0281 31729.950
## 6 2814.3578 1106.9386 803.4771 2868.769
## 7 2178.9337 5874.2106 202418.4188 255550.133
## 8 504.9716 1046.9585 894.0049 5028.238
## 9 1684.5141 14030.0862 22483.4740 29648.656
## 10 24643.5085 24607.6742 42642.1221 0.000
## 11 1604.4453 2188.2773 698.7865 0.000
## 12 234471.5568 405667.2039 71513.6092 0.000
## 13 272956.2920 5605.5715 13671.0549 0.000
## 14 1801.2434 1156.6285 11165.1791 0.000
## 15 11535.4403 31047.6812 2786.1401 0.000
## 16 8163.1463 2873.4402 215914.4627 0.000
## 17 588.6621 899.8301 423.8127 0.000
## 18 2872.7813 2878.7013 48979.3730 0.000
Finalmente exportamos la tabla ya sea como archivo cvs o como html para abrirla en Excel y desde ahi calcular los totales y los porcentajes, y formatearla de acuerdo con el estilo del INEI:
write.csv(matp, file = "matp.csv")
library(xtable)
print(xtable(matp), type = "html", file = "matp.html")
Para calcular los estadísticos descriptivos ponderados utilizamos el paquete “Hmisc” que contiene los comandos:
Nóteses que no tenemos un comando para calcular directamente la desviación estándar ponderada. Se calcula la varianza usando el método “ML” (maximum likelihood estimate, o estimado de máxima verosimilitud para una distribución normal) que es el que emplea el SPSS para calcular la varianza con datos ponderados. La desviación estándar se obtiene sacando la raiz cuadrada de la varianza.
El comando “ddply” del paquete “plyr” nos sirve para crear la tabla por grupo.
library(Hmisc)
library(plyr)
tab.descr <- ddply(modulo1,~urbano+DOMINIO,summarise,
Media=wtd.mean(P106,FACTOR07, na.rm=T),
Desv=sqrt(wtd.var(P106,FACTOR07, method = "ML", na.rm=T)),
md = wtd.quantile(P106,FACTOR07, probs = 0.5, na.rm=T))
tab.descr
## urbano DOMINIO Media Desv md
## 1 Urbano 1 297.61062 292.57509 200
## 2 Urbano 2 276.71868 236.89611 200
## 3 Urbano 3 299.26220 268.42477 200
## 4 Urbano 4 258.29019 298.40765 150
## 5 Urbano 5 195.17442 227.50459 100
## 6 Urbano 6 273.68768 320.96795 160
## 7 Urbano 7 234.76938 226.27853 150
## 8 Urbano 8 610.70737 548.65485 450
## 9 Rural 1 98.80198 108.94361 50
## 10 Rural 2 131.51036 108.15995 100
## 11 Rural 3 145.04920 163.55935 90
## 12 Rural 4 49.19414 59.43278 30
## 13 Rural 5 55.10202 65.69439 30
## 14 Rural 6 47.07092 70.07223 30
## 15 Rural 7 61.94014 69.52710 50
Exportamos la tabla al formato CSV para trabajarlos en Excel:
write.csv(tab.descr, file = "tab_descr.csv")
Para los totales por dominio, por área de residencia y nacional, procedemos de la siguiente manera:
# Por dominio
tab.descr.dom <- ddply(modulo1,~DOMINIO,summarise,
Media=wtd.mean(P106,FACTOR07, na.rm=T),
Desv=sqrt(wtd.var(P106,FACTOR07, method = "ML", na.rm=T)),
md = wtd.quantile(P106,FACTOR07, probs = 0.5, na.rm=T))
tab.descr.dom
## DOMINIO Media Desv md
## 1 1 272.6218 284.0356 200
## 2 2 261.8545 231.3224 200
## 3 3 279.2802 262.4201 200
## 4 4 108.2792 191.2065 50
## 5 5 121.0916 177.6377 50
## 6 6 182.2426 275.3024 80
## 7 7 162.3699 197.6086 100
## 8 8 610.7074 548.6549 450
# Por área urbana o rural
tab.descr.res <- ddply(modulo1,~urbano,summarise,
Media=wtd.mean(P106,FACTOR07, na.rm=T),
Desv=sqrt(wtd.var(P106,FACTOR07, method = "ML", na.rm=T)),
md = wtd.quantile(P106,FACTOR07, probs = 0.5, na.rm=T))
tab.descr.res
## urbano Media Desv md
## 1 Urbano 400.29792 439.16995 250
## 2 Rural 59.65054 75.77429 40
# Nacional
wtd.mean(modulo1$P106, modulo1$FACTOR07, na.rm=T)
## [1] 311.8306
wtd.var(modulo1$P106, modulo1$FACTOR07, method = "ML", na.rm=T)
## [1] 166582
wtd.quantile(modulo1$P106, modulo1$FACTOR07, probs = 0.5, na.rm=T)
## 50%
## 180
Como se hizo previamente, podemos exportar esos resultados al Excel para elaborar la versión final de la tabla.