Vamos a importar la base de datos del Estudio de Familia y Roles de Genero 2012, usando las etiquetas de los valores
library(foreign)
genero12 <- read.spss("IOP_1212_01_D.sav", to.data.frame = TRUE,
use.value.labels = TRUE)
Función simple para una tabla de frecuencias:
Pgta. 11: Quién debería pagar por la licencia de maternidad
Tabla en frecuencias absolutas:
tab.p11 <- table(genero12$P11)
tab.p11
##
## El gobierno El empleador
## 411 265
## Tanto el gobierno como el empleador Otras fuentes
## 378 6
## No sabe / No contesta
## 10
Tabla en frecuencias relativas (porcentajes):
tab.p11p <- prop.table(tab.p11)*100
tab.p11p
##
## El gobierno El empleador
## 38.4112150 24.7663551
## Tanto el gobierno como el empleador Otras fuentes
## 35.3271028 0.5607477
## No sabe / No contesta
## 0.9345794
library(summarytools)
tab.p11.v2 <- freq(genero12$P11)
tab.p11.v2
## Frequencies
## genero12$P11
## Type: Factor
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------------------------------------- ------ --------- -------------- --------- --------------
## El gobierno 411 38.41 38.41 34.16 34.16
## El empleador 265 24.77 63.18 22.03 56.19
## Tanto el gobierno como el empleador 378 35.33 98.50 31.42 87.61
## Otras fuentes 6 0.56 99.07 0.50 88.11
## No sabe / No contesta 10 0.93 100.00 0.83 88.94
## <NA> 133 11.06 100.00
## Total 1203 100.00 100.00 100.00 100.00
Para ello vamos a usar el paquete xtable
Exportamos la primera tabla que creamos en formato html y abrimos el archivo desde una hoja de cálculo para darle el formato definitivo a la tabla:
tab.p11
##
## El gobierno El empleador
## 411 265
## Tanto el gobierno como el empleador Otras fuentes
## 378 6
## No sabe / No contesta
## 10
library(xtable)
print(xtable(tab.p11, caption = "Pregunta 11"), type = "html",
file = "tabla_p11.html")
Para construir tablas de frecuencias de variables numéricas, debemos agrupar los valores de la variable en intervalos y convertirlos en categorías ordenadas.
Por ejemplo la variable P19A: Horas de dedicadas a labores domésticas. Primero observamos la distribución en “bruto” de la variable:
table(genero12$P19A)
##
## 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 20 21
## 76 10 30 29 36 13 48 89 28 7 38 1 22 1 148 20 5 22 16 116
## 22 23 24 25 26 28 30 34 35 36 40 42 43 44 45 48 49 50 56 60
## 1 2 11 10 1 107 19 1 65 5 3 61 2 2 1 8 16 2 49 2
## 63 64 66 70 72 77 80 81 84 91 100 112 140 168
## 7 3 1 27 6 1 1 1 22 1 2 1 1 4
Posteriormente podemos agruparla en intervalos usando la función recode del paquete car, por ejemplo, las horas dedicadas al trabajo doméstico:
library(car)
genero12$P19ar <- factor(recode(genero12$P19A, "0=1; 1:14=2; 15:28=3; 29:42=4; 43:hi=5"),
labels = c("Ninguna", "Entre 1 y 14", "Entre 15 y 28",
"Entre 29 y 42", "Más de 42"))
tab.p19a <- table(genero12$P19ar)
tab.p19a
##
## Ninguna Entre 1 y 14 Entre 15 y 28 Entre 29 y 42 Más de 42
## 76 500 311 154 160
prop.table(tab.p19a)*100
##
## Ninguna Entre 1 y 14 Entre 15 y 28 Entre 29 y 42 Más de 42
## 6.32806 41.63197 25.89509 12.82265 13.32223
Otra posibilidad para construir intervalos es utilizar la función cut para calcular intervalos de clase de una variable cuantitativa.
Por ejemplo en el caso de la variable edad, podemos construir 6 intervalos de clase del mismo tamaño, para ello se divide el rango entre 6 y se usa el valor resultante para calcular los intervalos:
table(genero12$EDAD)
##
## 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
## 55 43 39 28 38 32 21 32 25 20 37 40 40 18 25 28 19 31 32 22 26 18 32 15 29 19
## 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
## 31 34 22 17 22 15 29 13 21 14 12 8 14 16 8 9 20 5 15 11 6 10 13 10 5 5
## 70 71 72 73 74 75 76 77 80 81 82 83 84 87 92
## 12 6 4 4 3 8 2 1 2 1 4 4 1 1 1
Como se ve el rango es de 18 a 92, es decir: 92-18 = 74, si queremos calcular 6 intervalos del mismo tamaño, cada uno tendría una amplitud de:
74/6
## [1] 12.33333
Usando el comando cut, tendríamos:
edad.v1 <- cut(genero12$EDAD, breaks = 6)
table(edad.v1)
## edad.v1
## (17.9,30.3] (30.3,42.7] (42.7,55] (55,67.3] (67.3,79.7] (79.7,92.1]
## 450 295 257 137 50 14
El paréntesis indica que el intervalo está “abierto” a la izquierda y el corchete que está cerrado a la derecha. Por ejemplo, en el caso del primer intervalo, incluye los números mayores a 17.9 (pero no ese mismo) hasta el 30.3; el siguiente intervalo incluye los números mayores a 30.3 hasta 42.7.
Como la variable edad tiene puntuaciones discretas (sin decimales), podemos cambiar las etiquetas de los valores:
levels(edad.v1) <- c("18 a 30", "31 a 42", "43 a 55", "56 a 67", "58 a 79", "80 a 92")
table(edad.v1)
## edad.v1
## 18 a 30 31 a 42 43 a 55 56 a 67 58 a 79 80 a 92
## 450 295 257 137 50 14
Otra posibilidad es especificar los cortes de los intervalos, por ejemplo cortes de 10 años:
edad.v2 <- cut(genero12$EDAD, breaks = c(18, 30, 40, 50, 60, 70, 80, 92))
table(edad.v2)
## edad.v2
## (18,30] (30,40] (40,50] (50,60] (60,70] (70,80] (80,92]
## 395 251 233 135 92 30 12
El problema en este caso, es que no se está incluyendo el extremo inferior del primer intervalo (se están excluyendo los 18 años de edad), ello se soluciona incluyendo el valor mínimo en el primer intervalo:
edad.v2 <- cut(genero12$EDAD, breaks = c(18, 30, 40, 50, 60, 70, 80, 92),
include.lowest = T)
table(edad.v2)
## edad.v2
## [18,30] (30,40] (40,50] (50,60] (60,70] (70,80] (80,92]
## 450 251 233 135 92 30 12
Como se aprecia, los últimos intervalos tienen pocos casos, podríamos juntar los dos últimos:
edad.v3 <- cut(genero12$EDAD, breaks = c(18, seq(25,65, by=10), 92),
include.lowest = T)
table(edad.v3)
## edad.v3
## [18,25] (25,35] (35,45] (45,55] (55,65] (65,92]
## 288 283 258 173 114 87
El comando seq(25,65, by = 10) crea una secuencia de números del 25 al 65 con saltos de 10.
Las tablas de frecuencias cruzadas nos permiten comparar la distribución de una variable de análisis según las categorías de otra variable de control. También se conocen como tablas de contingencia. Por ejemplo, si queremos comparar el indicador de acoso sexual callejero según sexo o grupos de edad:
Primero vamos a calcular el indicador de acoso sexual callejero. Como estamos usando la base de datos que contiene las etiquetas de los valores, debemos convertirla en números y usar la sintaxis “corta” que vimos en la presentación de la semana pasada:
v.acoso.c <- genero12[, c(173:180)]
library(dplyr)
v.acoso.c <- v.acoso.c %>% mutate_if(is.factor, as.numeric)
v.acoso.c.2 <- v.acoso.c %>%
mutate_all(~recode(., '2'=0, .missing=0))
i.acoso <- rowSums(v.acoso.c.2)
i.acoso[i.acoso > 1] <- 1
genero12$i.acoso <- factor(i.acoso, labels = c("No", "Sí"))
table(genero12$i.acoso)
##
## No Sí
## 693 510
Una vez que tenemos el índice de acoso sexual callejero, podemos armar nuestra tabla de frecuencias cruzadas, según el género del entrevistado. Usando el comando table la primera variable será aquella cuyas categorías se muestran en las filas, la segunda en las columnas.
tab.acoso_sex <- table(genero12$i.acoso, genero12$SEXO)
tab.acoso_sex
##
## Masculino Femenino
## No 403 290
## Sí 186 324
El comando prop.table, nos permite calcular porcentajes de esta table de tres maneras:
prop.table(tab.acoso_sex)*100 # Total de toda la tabla
##
## Masculino Femenino
## No 33.49958 24.10640
## Sí 15.46135 26.93267
prop.table(tab.acoso_sex, 1)*100 # Total de cada fila
##
## Masculino Femenino
## No 58.15296 41.84704
## Sí 36.47059 63.52941
prop.table(tab.acoso_sex, 2)*100 # Total de cada columna
##
## Masculino Femenino
## No 68.42105 47.23127
## Sí 31.57895 52.76873
Al momento de decidir cómo calcular los porcentajes debemos tener en cuenta la siguiente regla: los porcentajes de una tabla de frecuencias cruzadas deben calcularse en función de las categorías de la variable de control
En tal sentido, ya que el indicador de acoso sexual callejero es nuestra variable de análisis y el género del entrevistado es nuestra variable de control, en este caso los porcentajes deben calcularse de la siguiente manera:
prop.table(tab.acoso_sex, 2)*100 # Total de cada columna
##
## Masculino Femenino
## No 68.42105 47.23127
## Sí 31.57895 52.76873
Si queremos exportar nuestra tabla a una hoja de cálculo para darle un formato más apropiado para su presentación, lo recomendable es exportar la tabla de frecuencias absolutas y realizar los cálculos de los porcentajes en la hoja de cálculo:
tab.acoso_sex
##
## Masculino Femenino
## No 403 290
## Sí 186 324
print(xtable(tab.acoso_sex), type = "html", file = "tab_acoso_sex.html")