En esta presentación examinaremos los siguientes temas:
Para seguir los procedimientos mostrados en esta presentación, primero deberá descagar y descomprimir el archivo r_import.zip que encontrará en el siguiente enlace web:
https://sites.google.com/a/pucp.pe/data_est/archivos
Deberá guardar y descomprimir el contenido del archivo zip en su directorio de trabajo de R especificado al iniciar su sesión.
Si logró con éxito descomprimir los archivos contenidos en el enlace anterior, en su directorio de trabajo deberá encontrar los siguientes archivos:
Estos son algunos de los formatos más usuales para guardar bases de datos con las cuales podemos realizar algunos análisis estadísticos. En las siguientes diapositivas les mostraremos cómo cargar datos desde estos formatos.
Si tuvo éxito en el paso anterior, podrá cargar los datos en formato R usando el siguiente comando (recuerde que los archivos deben estar guardados en su directorio de trabajo, de lo contrario deberá especificar la ruta completa del archivo en su disco duro):
load("genero.rda")
Con ese comando usted está cargando un data frame en R que contiene la base de datos llamada “genero”.
Para explorar el contenido del archivo género puede usar:
head(genero)
## NRO SEXO EDAD edideal_muj edideal_hom DOMINIO NSEGrup
## 1 1 Femenino 55 25 30 Lima-Callao A/B
## 2 2 Masculino 62 26 30 Lima-Callao A/B
## 3 3 Femenino 70 28 30 Lima-Callao A/B
## 4 4 Femenino 20 30 35 Lima-Callao A/B
## 5 5 Femenino 18 25 30 Lima-Callao A/B
## 6 6 Masculino 25 25 30 Lima-Callao C
Ello le muestra los seis primeros registros o casos de la base de datos o data frame.
Podemos ver el contenido la base de datos utilizando el comando:
str(genero)
## 'data.frame': 1203 obs. of 7 variables:
## $ NRO : num 1 2 3 4 5 6 7 8 9 10 ...
## $ SEXO : Factor w/ 2 levels "Masculino","Femenino": 2 1 2 2 2 1 1 1 1 2 ...
## $ EDAD : num 55 62 70 20 18 25 46 38 52 53 ...
## $ edideal_muj: num 25 26 28 30 25 25 30 35 25 26 ...
## $ edideal_hom: num 30 30 30 35 30 30 35 38 25 28 ...
## $ DOMINIO : Factor w/ 5 levels "Lima-Callao",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ NSEGrup : Factor w/ 3 levels "A/B","C","D/E": 1 1 1 1 1 2 3 2 2 2 ...
Para más detalles sobre esta base de datos pueden acceder a la información completa a través del portal IOP-Data:
http://iop-data.pucp.edu.pe/busqueda/encuesta/71?
Las variables de la base de datos “genero” son:
Para importar una base de datos en Excel, lo más recomendable es guardar el archivo Excel en un formato delimitado por comas (csv).
Entre los archivos que se les pidió descomprimir, hay una version de la base de datos en Excel (genero.xls). Abra ese archivo en Excel y pida la opción “Guardar como” y seleccione como tipo de archivo “CSV (delimitado por comas)”.
Al usar esta opción es importante tomar en cuenta cuál es el separador de decimales que está utilizando en su computadora. El formato estándar es usar el punto como separador de decimales, pero algunas personas prefieren usar las comas como separador de decimales. En este último caso, la conversión de Excel a CSV puede variar. En este ejemplo, estamos suponiendo que el estándar utilizado es la separación de decimales con el punto y que el sistema operativo empleado es el Windows.
El formato de archivo separado por comas es un estándar bastante difundido. Guarda las bases de datos en archivos donde en cada fila se almacena la información de un casos y los campos o variables están separados por comas. Estos archivos pueden leerse desde cualquier editor de textos.
Entre los archivos descomprimidos usted econtrará uno llamado “genero.csv”. Para cargar el archivo al R deberá utilizar el siguiente comando:
genero2 <- read.csv("genero.csv")
Esto almacenará la base de datos en un objeto de R tipo data frame llamado “genero2”. Le hemos puesto el sufijo “2” para diferenciarlo de “genero creado previamente”. Puede usar los comandos head(genero2) o names(genero2) para explorar el contenido de este data frame.
Para importar un archivo de SPSS primero debemos cargar el paquete “foreign”. Los paquetes en R son programas especiales de R que contienen funciones especificas, en este caso el paquete “foreign” sirve para importar datos en diveros formatos.
Los paquetes del R se almacenan en lo que se llama la “librería” (library) de R. El programa de base de R vienen con un conjunto de paquetes pre-instalados (entre ellos el “foreign”), sin embargo en algunos casos es necesario descargar un paquede desde un CRAN e instalarlo en el R. Para mayor información sobre cómo instalar paquetes en R recomendamos revisar el siguiente link:
http://www.statmethods.net/interface/packages.html
Vamos a importar el archivo “genero.sav” y guardarlo en un objeto tipo data frame que se llame “genero3”:
library(foreign)
genero3 <- as.data.frame(read.spss("genero.sav"))
## Warning in read.spss("genero.sav"): genero.sav: Unrecognized record type
## 7, subtype 18 encountered in system file
## Warning in read.spss("genero.sav"): genero.sav: Unrecognized record type
## 7, subtype 24 encountered in system file
## re-encoding from latin1
head(genero, 2) # Base de datos en formato R
## NRO SEXO EDAD edideal_muj edideal_hom DOMINIO NSEGrup
## 1 1 Femenino 55 25 30 Lima-Callao A/B
## 2 2 Masculino 62 26 30 Lima-Callao A/B
head(genero2, 2) # Base de datos importada desde csv
## NRO SEXO EDAD edideal_muj edideal_hom DOMINIO NSEGrup
## 1 1 2 55 25 30 1 1
## 2 2 1 62 26 30 1 1
head(genero3, 2) # Base de datos importada desde spss
## NRO SEXO EDAD edideal_muj edideal_hom DOMINIO NSEGrup
## 1 1 Femenino 55 25 30 Lima-Callao A/B
## 2 2 Masculino 62 26 30 Lima-Callao A/B
Para invocar una variable específica de un data frame debemos usar la expresión: dataframe$variable. Por ejemplo :
str(genero$DOMINIO)
## Factor w/ 5 levels "Lima-Callao",..: 1 1 1 1 1 1 1 1 1 1 ...
class(genero2$DOMINIO)
## [1] "integer"
Ojo que el R sí diferencia entre mayúsculas y minúsculas.
Vamos a convertir la variable “SEXO” del data frame “genero2” en un factor con su correspondientes etiquetas. Nótese que las etiquetas (labels) deben especificarse en el orden que corresponden a sus códigos.
genero2$SEXO <- factor(genero2$SEXO, labels=c("Femenino", "Masculino"))
str(genero2$SEXO)
## Factor w/ 2 levels "Femenino","Masculino": 2 1 2 2 2 1 1 1 1 2 ...
Sigamos conviertiendo las demás variables categóricas del data frame “genero2” en factores con sus respectivas etiquetas:
genero2$DOMINIO <- factor(genero2$DOMINIO,
labels=c("Lima-Callao", "Norte", "Sur",
"Centro", "Oriente"))
genero2$NSEGrup <- factor(genero2$NSEGrup,
labels=c("A/B", "C", "D/E"))
head(genero2)
## NRO SEXO EDAD edideal_muj edideal_hom DOMINIO NSEGrup
## 1 1 Masculino 55 25 30 Lima-Callao A/B
## 2 2 Femenino 62 26 30 Lima-Callao A/B
## 3 3 Masculino 70 28 30 Lima-Callao A/B
## 4 4 Masculino 20 30 35 Lima-Callao A/B
## 5 5 Masculino 18 25 30 Lima-Callao A/B
## 6 6 Femenino 25 25 30 Lima-Callao C
Cuando se registran datos en una investigación es posible que no se logre obtener la información de algunas variables para determinados casos. En las encuestas ello suele suceder cuando el entrevistado no quiere o no sabe responder una pregunta (los “no sabe / no responde”).
En muchos casos se suele excluir este tipo de respuestas del análisis, registrándolas como “valores perdidos”
En el caso de la base de datos de “genero” que estamos usando, si revisan el cuestionario en IOP-Data, notarán que para la pregunta “Edad ideal para que una mujer se case”, el código “99” identifica a las respuestas del tipo “No sabe / No responde”. Al pedir una tabla de frecuencias de esta variable, podemos notar que hay 42 casos que tienen como respuesta el código “99”.
table(genero$edideal_muj)
##
## 15 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
## 1 12 3 101 6 37 31 40 393 72 71 101 22 207 1 12 7 1
## 35 36 38 40 60 99
## 34 3 1 4 1 42
En el R, el código para valores perdidos es “NA”. En el caso de la variable de edad ideal para que una mujer se case, podemos indicar que el valor “99” es un valor perdido de la siguiente manera:
genero$edideal_muj[genero$edideal_muj==99] <- NA
table(genero$edideal_muj)
##
## 15 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
## 1 12 3 101 6 37 31 40 393 72 71 101 22 207 1 12 7 1
## 35 36 38 40 60
## 34 3 1 4 1
Nótese que al pedir la tabla de frecuencias de la variable, ya no aparecen los casos que son “NA”.
Podemos saber cuántos valores perdidos tiene una variable creando un vector lógico que idenfique a los valores perdidos:
perdidos.v1 <- is.na(genero$edideal_muj)
table(perdidos.v1)
## perdidos.v1
## FALSE TRUE
## 1161 42
# También podemos hacerlo de la siguiente manera:
table(is.na(genero$edideal_muj))
##
## FALSE TRUE
## 1161 42
Hay 42 casos perdidos para la variable edideal_muj
Si queremos seleccionar o identificar un grupo de casos de un data frame, una alternativa es la siguiente:
Ejemplo 1: Los datos del tercer registro de la base de datos genero
genero[3, ]
## NRO SEXO EDAD edideal_muj edideal_hom DOMINIO NSEGrup
## 3 3 Femenino 70 28 30 Lima-Callao A/B
Ejemplo 2: Los seis primeros registros de la tercera variable de la base de datos:
head(genero[, 3])
## [1] 55 62 70 20 18 25
Ejemplo 3: El genero del 10º registro de la base de datos:
genero[10, 2]
## [1] Femenino
## Levels: Masculino Femenino
Podemos guardar el resultado de una selecciónn en un nuevo objeto, por ejemplo si queremos seleccionar todos los registros pero sólo de la variable edad, podemos:
edad <- genero[, 3]
head(edad)
## [1] 55 62 70 20 18 25
Vamos a recodificar la variable DOMINIO de la base de datos género en una nueva variable que tenga dos categorías: “Lima y Callao” y “Provincia”
class(genero$DOMINIO)
## [1] "factor"
levels(genero$DOMINIO)
## [1] "Lima-Callao" "Norte" "Sur" "Centro" "Oriente"
Para ello, primero vamos a convertir la variable dominio en un vector numérico temporal
dominio.t <- as.numeric(genero$DOMINIO)
Luego, crearemos un vector vacío donde vamos a recodificar los valores correspondientes a los códigos originales de la variable dominio. El nuevo vector será luego transformado en un factor.
dominio2 <- vector() # Se crea un vector vacío
dominio2[dominio.t == 1] <- "Lima y Callao"
dominio2[dominio.t > 1] <- "Provincia"
dominio2 <- as.factor(dominio2)
Finalmente, integraremos la nueva variable recodificada en el data frame
genero$dominio2 <- dominio2
table(genero$DOMINIO)
##
## Lima-Callao Norte Sur Centro Oriente
## 448 320 245 105 85
table(genero$dominio2)
##
## Lima y Callao Provincia
## 448 755
Otra manera de recodificar la misma variable con los mismos resultados es la siguiente:
dominio.t2 <- as.numeric(genero$DOMINIO)
dominio3<- ifelse(dominio.t2 > 1, c("Provincia"), c("Lima y Callao"))
table(dominio3)
## dominio3
## Lima y Callao Provincia
## 448 755
Podemos convertir vectores numéricos en factores para agrupar los valores de una variable cuantitativa en intervalos de clase categóricos, por ejemplo, grupos de edad.
gedad <- vector()
gedad[genero$EDAD < 25] <- 1
gedad[genero$EDAD >= 25 & genero$EDAD < 35] <- 2
gedad[genero$EDAD >= 35 & genero$EDAD < 45] <- 3
gedad[genero$EDAD >= 45] <- 4
genero$gedad <- as.factor(gedad)
levels(genero$gedad) <- c("18 a 24", "25 a 34", "35 a 44", "45 a más")
table(genero$gedad)
##
## 18 a 24 25 a 34 35 a 44 45 a más
## 256 284 255 408
Otra forma de hacerlo es usando el comando “cut” para establecer puntos de corte para los intervalos
gedad2 <- cut(genero$EDAD, breaks=c(17, 24, 34, 44, 100),
include.lowest=TRUE)
table(gedad2)
## gedad2
## [17,24] (24,34] (34,44] (44,100]
## 256 284 255 408
table(genero$gedad)
##
## 18 a 24 25 a 34 35 a 44 45 a más
## 256 284 255 408
Para mayores detalles sobre el comando “cut” puede solicitar la ayuda correspondiente mediante:
help(cut)
En el R es simple calcular una nueva variable. Por ejemplo, queremos ver si para los entrevistados, la edad ideal para que un hombre se case es mayor o menor que la edad ideal para que una mujer se case. Esto puede hacerse de la siguiente manera:
dif.idealH_M <- genero$edideal_hom - genero$edideal_muj
En este caso la variable dif-idealH-M mide la diferencia entre la edad ideal para casarse de un hombre y de una mujer. Si el número es positivo, significa que el entrevistado opina que la edad ideal para que un hombre se case debe ser mayor que la de la mujer. Si el número es negativo, siginifica lo inverso.