Importar una base de datos en SPSS

Lo primero que vamos a hacer es importar una base de datos en formato SPSS. Trabajaremos com el estudio de Familia y Roles de Género 2012, realizado por el Instituto de Opinión Pública de la PUCP. Los archivos se puedes descargar desde este enlace haciendo clic con el botón derecho y escogiendo la opción de “abrir en otra pestaña”: IOP-PUCP 2012

Debe descargar (en formato original):

Y grabarlos en su directorio de trabajo del proyecto en RStudio que hayan creado

Podemos importar la base de datos de dos formas:

  1. Sin usar las etiquetas, sólo los códigos de los valores de las variables. Para leer los resultados necesitamos el libro de códigos o cuestionario de la encuesta. Es una opción que resulta práctica si luego queremos recodificar variables.
# Primero se necesita cargar el paquete foreign

library(foreign)


genero12 <- read.spss("IOP_1212_01_D.sav", to.data.frame = TRUE, 
                      use.value.labels = FALSE)

table(genero12$SEXO)
## 
##   1   2 
## 589 614
  1. Usando las etiquetas, nos resulta práctico si queremos hacer tablas sin necesidad de leer el libro de códigos, pero luego es más complejo para hacer algunas operaciones, como la recodificación de variables.
genero12.e <- read.spss("IOP_1212_01_D.sav", to.data.frame = TRUE, 
                      use.value.labels = TRUE)

table(genero12.e$SEXO)
## 
## Masculino  Femenino 
##       589       614

Explorar los datos

Conocer los nombres de las variables

names(genero12)
##   [1] "NRO"     "SEXO"    "GEDAD"   "EDAD"    "P1"      "P2"      "P3A"    
##   [8] "P3B"     "P3C"     "P3D"     "P4A"     "P4B"     "P4C"     "P5"     
##  [15] "P6A"     "P6B"     "P6C"     "P6D"     "P6E"     "P7A"     "P7B"    
##  [22] "P8A"     "P8B"     "P9A"     "P9B"     "P9C"     "P9D"     "P9E"    
##  [29] "P9F"     "P10"     "P10A"    "P11"     "P12"     "P13A"    "P13B"   
##  [36] "P14"     "P15"     "P16"     "P17"     "P18A"    "P18B"    "P18C"   
##  [43] "P18D"    "P19A"    "P19B"    "P20"     "P21"     "P22"     "P22A"   
##  [50] "P23"     "P24"     "P25"     "P26"     "P27"     "P28A"    "P28B"   
##  [57] "P29"     "P30"     "P31A"    "P31B"    "P31C"    "P31D"    "P31E"   
##  [64] "P31F"    "P32"     "P33A"    "P33B"    "P33C"    "P33D"    "P34"    
##  [71] "P35A"    "P35B"    "P35C"    "P35D"    "P35E"    "P35F"    "P35G"   
##  [78] "P36"     "P37"     "P38"     "P39"     "P40"     "P41"     "P42"    
##  [85] "P43"     "P44"     "P44A"    "P44B"    "P44C"    "P45A"    "P45B"   
##  [92] "P46A"    "P46B"    "P47"     "P48"     "P48A"    "P48B"    "P48C"   
##  [99] "P49"     "P50A"    "P50B"    "P50C"    "P50D"    "P50E"    "P50F"   
## [106] "P50G"    "P50H"    "P51A"    "P51B"    "P51C"    "P51D"    "P51E"   
## [113] "P51F"    "P51G"    "P51H"    "P51I"    "P51J"    "P51K"    "P52A"   
## [120] "P52B"    "P52C"    "P52D"    "P52E"    "P52F"    "P52G"    "P53A"   
## [127] "P53B"    "P53C"    "P53D"    "P53E"    "P53F"    "P53G"    "P54A"   
## [134] "P54B"    "P54C"    "P54D"    "P54E"    "P55A"    "P55B"    "P55C"   
## [141] "P55D"    "P55E"    "P55F"    "P56"     "P57"     "P58"     "P59A"   
## [148] "P59B"    "P59C"    "P59D"    "P59E"    "P59F"    "P59G"    "P59H"   
## [155] "P59I"    "P60A"    "P60B"    "P60C"    "P60D"    "P60E"    "P60F"   
## [162] "P61A"    "P61B"    "P61C"    "P61D"    "P61E"    "P62A"    "P62B"   
## [169] "P62C"    "P63A"    "P63B"    "P63C"    "P64A"    "P64B"    "P64C"   
## [176] "P64D"    "P64E"    "P64F"    "P64G"    "P64H"    "P65A"    "P65B"   
## [183] "P65C"    "P65D"    "P65E"    "P65F"    "P65G"    "P65H"    "P66A"   
## [190] "P66B"    "P67A"    "P67B"    "P67C"    "P68"     "P69"     "P70"    
## [197] "P71"     "P72"     "P72A"    "P73"     "P73A"    "P74"     "P75"    
## [204] "P76"     "P77"     "P78"     "P79"     "P80"     "P81A"    "P81B"   
## [211] "P81C"    "P81D"    "P81E"    "P82"     "P87"     "P89"     "P90"    
## [218] "P92"     "Región"  "Ambito"  "DOMINIO" "NSEGrup" "sumaNSE" "NSE"

Ver la distribución de frecuencias de una variable

# De la batería de preguntas sobre acoso sexual callejero:

table(genero12$P64A)
## 
##   1   2 
## 320 866
table(genero12$P64A, exclude = NULL) # Para ver si hay casos con valores perdidos
## 
##    1    2 <NA> 
##  320  866   17
# Las horas dedicadas al trabajo doméstico

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

Seleccionar casos

Usando los corchetes:

# La primera fila y la primera columna:

genero12[1,1]
## [1] 1
# La priumera fila y la segunda columna:

genero12[1, 2]
## [1] 2
# Las 10 primeras filas y las tres primeras columnas:

as.matrix(genero12[c(1:10), c(1:3)])
##    NRO SEXO GEDAD
## 1    1    2     3
## 2    2    1     3
## 3    3    2     3
## 4    4    2     1
## 5    5    2     1
## 6    6    1     1
## 7    7    1     3
## 8    8    1     2
## 9    9    1     3
## 10  10    2     3
ejemplo3 <- genero12[c(1:10), c(1:3)]

# Un grupo de filas y otro de columnas

as.matrix(genero12[c(1,4,10, 11:15), c(2:4, 10, 40)])
##    SEXO GEDAD EDAD P3D P18A
## 1     2     3   55   2    2
## 4     2     1   20   2    2
## 10    2     3   53   3    3
## 11    2     2   43   3    8
## 12    1     3   68   2    3
## 13    2     1   27   3    2
## 14    1     1   21   4    3
## 15    1     2   42   2    2

Podemos seleccionar casos que cumplan con una condición:

  1. Las mujeres
mujeres <- genero12[genero12$SEXO == 2, ]
  1. Las mujeres menores de 30 años
mujeres30m <- genero12[genero12$SEXO== 2 & genero12$EDAD < 30, ]

También podemos seleccionar un grupo de variables, por ejemplo la batería de preguntas sobre acoso sexual callejero:

v.acoso.c <- genero12[, c(173:180)]

Usando el comando subset para casos que cumplan una condición

  1. Los hombres
hombres <- subset(genero12, SEXO == 1)
  1. Los hombres que viven en Lima
hombres.lima <- subset(genero12, SEXO == 1 & Ambito == 1)
  1. Las mujeres que NO viven en Lima
mujeres.p <- subset(genero12, SEXO == 2 & Ambito != 1)
  1. Las personas que son del Sur o del Centro y que tienen más de 30 años:
table(genero12$DOMINIO)
## 
##   1   2   3   4   5 
## 448 320 245 105  85
datos.sel <- subset(genero12, (DOMINIO == 3 | DOMINIO == 4) & EDAD > 30)

Ejercicios

  1. ¿Cuántas mujeres han experimentado silbidos en la calle o en el transporte público?
  2. ¿Cuántas mujeres entre 18 y 24 años han experimentado silbidos en la calle o en el transporte público?
  3. ¿Cuántas personas que viven fuera de Lima se consideran de origen quechua o Aymara?
  4. ¿Cuántos jóvenes menores de 25 años, que viven en Sur se consideran de origen Quechua o Aymara?, ¿Cuántos se consideran mestizos?

Recodificar Variables y poner etiquetas a valores

Usando los corchetes

Vamos a crear 5 grupos de edad:

  • 18 a 24
  • 25 a 34
  • 35 a 44
  • 45 a 55
  • Más de 55
genero12$gedad1[genero12$EDAD < 25] <- 1
genero12$gedad1[genero12$EDAD > 24 & genero12$EDAD < 35] <- 2
genero12$gedad1[genero12$EDAD > 34 & genero12$EDAD < 45] <- 3
genero12$gedad1[genero12$EDAD > 44 & genero12$EDAD < 55] <- 4
genero12$gedad1[genero12$EDAD > 54] <- 5

table(genero12$gedad1)
## 
##   1   2   3   4   5 
## 256 284 255 199 209

Ahora podemos etiquetas los valores

genero12$gedad1 <- factor(genero12$gedad1, labels = c("De 18 a 24", "25 a 34",
                                               "35 a 44", "45 a 54",
                                               "55 a más"))


table(genero12$gedad1)
## 
## De 18 a 24    25 a 34    35 a 44    45 a 54   55 a más 
##        256        284        255        199        209

Usando el comando recode del paquete car

library(car)
## Loading required package: carData
genero12$gedad2 <- recode(genero12$EDAD, "lo:24 = 1; 25:34 = 2; 
                          35:44 = 3; 45:54 = 4; 55:hi = 5")


table(genero12$gedad2)
## 
##   1   2   3   4   5 
## 256 284 255 199 209
genero12$gedad2 <- factor(genero12$gedad2, labels = c("De 18 a 24", "25 a 34",
                                               "35 a 44", "45 a 54",                                                          "55 a más"))


table(genero12$gedad2)
## 
## De 18 a 24    25 a 34    35 a 44    45 a 54   55 a más 
##        256        284        255        199        209
## Tabla en porcentajes:

prop.table(table(genero12$gedad2))*100
## 
## De 18 a 24    25 a 34    35 a 44    45 a 54   55 a más 
##   21.28013   23.60765   21.19701   16.54198   17.37323

Ejercicios

  • Recodifique la variable “Edad ideal para que una mujer se case” en cuatro intervalos de edad. Usted decida los intervalos.
  • Recodifique la variable “Edad ideal para que un hombre se case” en los mismos cuatro intervalos que la variable anterior.
  • Haga una tabla de frecuencias en porcentajes de las distribuciones de las variables recodificadas

El Índice de Acoso Sexual Callejero

Vamos a generar una variable que nos indique si las personas han experimentado alguna (cualquiera) de las situaciones de acoso sexual callejero descritas en las variables P64A hasta la P64H.

Para eso vamos a convertir todas las respuestas NO y NS/NR en cero, luego sumaremos todas las variables recodificadas. Finalmente, en la variable sumada, haremos otro cambio: todos los valores iguales o superiores a 1, los cambiaremos a 1.

Método largo

Recodificar variables por variable. La función recode se encuentra también en otro paquete, llamado dplyr, para especificar que queremos usar la función recode el paquete car debemos escribir la función como se indica a continuación:

table(genero12$P64A, exclude = NULL)
## 
##    1    2 <NA> 
##  320  866   17
p64a.r <- car::recode(genero12$P64A, "2=0; NA = 0")

table(p64a.r)
## p64a.r
##   0   1 
## 883 320

De ahí procedemos a recodificar todas las otras variables:

p64b.r <- car::recode(genero12$P64B, "2=0; NA = 0")
p64c.r <- car::recode(genero12$P64C, "2=0; NA = 0")
p64d.r <- car::recode(genero12$P64D, "2=0; NA = 0")
p64e.r <- car::recode(genero12$P64E, "2=0; NA = 0")
p64f.r <- car::recode(genero12$P64F, "2=0; NA = 0")
p64g.r <- car::recode(genero12$P64G, "2=0; NA = 0")
p64h.r <- car::recode(genero12$P64H, "2=0; NA = 0")

Luego sumamos las variables:

i.acoso <- p64a.r + p64b.r + p64c.r + p64d.r + p64e.r + p64f.r + p64g.r + 
  p64h.r

table(i.acoso)
## i.acoso
##   0   1   2   3   4   5   6   7   8 
## 693 116 106 115  75  47  25  17   9
i.acoso[i.acoso > 1] <- 1 

table(i.acoso)
## i.acoso
##   0   1 
## 693 510

Finalmente adjuntamos la variable creada a nuestro data frame:

genero12$i.acoso <- i.acoso

Método “corto” o más eficiente

Podemos usar otras funciones más avanzadas para recodificar variables en bloque. Primero creamos un objeto con las variables con las que vamos a trabajar:

names(genero12)
##   [1] "NRO"     "SEXO"    "GEDAD"   "EDAD"    "P1"      "P2"      "P3A"    
##   [8] "P3B"     "P3C"     "P3D"     "P4A"     "P4B"     "P4C"     "P5"     
##  [15] "P6A"     "P6B"     "P6C"     "P6D"     "P6E"     "P7A"     "P7B"    
##  [22] "P8A"     "P8B"     "P9A"     "P9B"     "P9C"     "P9D"     "P9E"    
##  [29] "P9F"     "P10"     "P10A"    "P11"     "P12"     "P13A"    "P13B"   
##  [36] "P14"     "P15"     "P16"     "P17"     "P18A"    "P18B"    "P18C"   
##  [43] "P18D"    "P19A"    "P19B"    "P20"     "P21"     "P22"     "P22A"   
##  [50] "P23"     "P24"     "P25"     "P26"     "P27"     "P28A"    "P28B"   
##  [57] "P29"     "P30"     "P31A"    "P31B"    "P31C"    "P31D"    "P31E"   
##  [64] "P31F"    "P32"     "P33A"    "P33B"    "P33C"    "P33D"    "P34"    
##  [71] "P35A"    "P35B"    "P35C"    "P35D"    "P35E"    "P35F"    "P35G"   
##  [78] "P36"     "P37"     "P38"     "P39"     "P40"     "P41"     "P42"    
##  [85] "P43"     "P44"     "P44A"    "P44B"    "P44C"    "P45A"    "P45B"   
##  [92] "P46A"    "P46B"    "P47"     "P48"     "P48A"    "P48B"    "P48C"   
##  [99] "P49"     "P50A"    "P50B"    "P50C"    "P50D"    "P50E"    "P50F"   
## [106] "P50G"    "P50H"    "P51A"    "P51B"    "P51C"    "P51D"    "P51E"   
## [113] "P51F"    "P51G"    "P51H"    "P51I"    "P51J"    "P51K"    "P52A"   
## [120] "P52B"    "P52C"    "P52D"    "P52E"    "P52F"    "P52G"    "P53A"   
## [127] "P53B"    "P53C"    "P53D"    "P53E"    "P53F"    "P53G"    "P54A"   
## [134] "P54B"    "P54C"    "P54D"    "P54E"    "P55A"    "P55B"    "P55C"   
## [141] "P55D"    "P55E"    "P55F"    "P56"     "P57"     "P58"     "P59A"   
## [148] "P59B"    "P59C"    "P59D"    "P59E"    "P59F"    "P59G"    "P59H"   
## [155] "P59I"    "P60A"    "P60B"    "P60C"    "P60D"    "P60E"    "P60F"   
## [162] "P61A"    "P61B"    "P61C"    "P61D"    "P61E"    "P62A"    "P62B"   
## [169] "P62C"    "P63A"    "P63B"    "P63C"    "P64A"    "P64B"    "P64C"   
## [176] "P64D"    "P64E"    "P64F"    "P64G"    "P64H"    "P65A"    "P65B"   
## [183] "P65C"    "P65D"    "P65E"    "P65F"    "P65G"    "P65H"    "P66A"   
## [190] "P66B"    "P67A"    "P67B"    "P67C"    "P68"     "P69"     "P70"    
## [197] "P71"     "P72"     "P72A"    "P73"     "P73A"    "P74"     "P75"    
## [204] "P76"     "P77"     "P78"     "P79"     "P80"     "P81A"    "P81B"   
## [211] "P81C"    "P81D"    "P81E"    "P82"     "P87"     "P89"     "P90"    
## [218] "P92"     "Región"  "Ambito"  "DOMINIO" "NSEGrup" "sumaNSE" "NSE"    
## [225] "gedad1"  "gedad2"  "i.acoso"

Las variables que forman parte del indice de acoso son las que están entre las columnas 173 a 180, con ellas creamos un data frame aparte:

v.acoso.c <- genero12[, c(173:180)]

Vamos a emplear funciones que están en el paquete dplyr para modificar el data frame generado:

library(dplyr)

v.acoso.c.2 <- v.acoso.c %>%
  mutate_all(~recode(., '2'=0, .missing=0))

Ahora sumamos los valores de cada fila:

i.acoso2 <- rowSums(v.acoso.c.2) 

i.acoso2[i.acoso2 > 1] <- 1

genero12$i.acoso2 <- i.acoso2

Comparamos los resultados de ambos métodos:

table(genero12$i.acoso)
## 
##   0   1 
## 693 510
table(genero12$i.acoso2)
## 
##   0   1 
## 693 510

Ejercicio

  • Descargue la base de datos el estudio “Roles de Gobierno y Violencia de Género 2016” del IOP-PUCP en el siguiente enlace haciendo clic con el botón derecho y escogiendo la opción de “abrir en otra pestaña”: Estudio 2016 IOP
  • Identifique las variables del índice de Acoso Sexual Callejero y calcule el índice correspondiente.
  • Compare los resultados del indice de acoso para las mujeres entre el 2012 y 2016, ¿hay cambios?