Importamos una base de datos

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)

Tabla de frecuencia para una variable categórica nominal

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

Tabla de Frecuencias Usando el paquete summarytools

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

Exportar la tabla para editarla en una hoja de cálculo

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")

Tablas a partir de variables numéricas

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.

Tablas de frecuencias cruzadas

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")

Ejercicios

  1. Elabore las siguientes tablas de frecuencias en formato de presentación
  1. Calcule intervalos de clase para las siguientes variables y elabore las tablas correspondientes en formato de presentación
  1. Elabore las siguientes tablas de frecuencias cruzadas en formato de presentación