ULTIMA ACTUALIZACIÓN:

La última actualización de este artículo se realizó el 3 de November del 2019.

2 Subiendo una base de datos

Para subir una base de datos (BD), debes antes haber instalado una serie de paquetes que permiten leer la base de datos sin importar en que formato este. Existen varios paquetes que nos pueden ayudar con eso. En este tutorial trabajaremos con rio, que nos permite abrir distintos tipos de base de datos con facilidad.

Segundo, llamamos a nuestra base de datos.

IMPORTANTE antes de interacturar con folders (subir data, grabar resultados, gráficos, etc) tienes que establecer tu directorio de trabajo. La forma más rápida es con la rueda con la etiqueta “more” en el panel derecho.

La base de datos debe estar en nuestro espacio de trabajo.

La Base de Datos que usaremos es una muestra de 1000 casos de la base sumaria-2018.dta de ENAHO - PERU (Encuesta Nacional de Hogares del Peru) del 2017. Aquí esta el link de donde pueden descargarla en formato STATA. Tenemos informacion sobre ingresos, y gastos de los hogares en Perú.

Dado que tenemos el paquete rio, no necesitamos decirle a R que nuestra base de datos está en STATA, R lo entiende.

Vamos a usar la función import() y asignarle un nombre a nuestra base de datos. Lo llamaremos s2018. Abajo podemos ver las primeras 4 variables y primeras 10 observaciones.

Podemos usar head() en nuestra data para ver las primeras seis observaciones. Debido a que esta data cuenta con 158 columnas, usamos [,1:5] para que nos muestre sólo las 5 primeras.

##    aÑo mes nconglome conglome vivienda
## 1 2018  06    021521   007584      078
## 2 2018  02    033493   006483      274
## 3 2018  10    039710   010344      056
## 4 2018  08    000909   008845      136
## 5 2018  04    015685   009752      010
## 6 2018  09    018285   006146      027

Siempre es bueno mirar la base de datos con la cual estamos trabajando para darnos una idea mas concreta de que estamos haciendo. Primero debemos saber con que tipo de objeto estamos lidiando. La función str() nos brinda informaciòn útil sobre el objeto en cuestión y sus elementos. En el siguiente código, usamos [,1:6] para limitar la vista a las 6 primeras variables

## 'data.frame':    1000 obs. of  6 variables:
##  $ aÑo      : chr  "2018" "2018" "2018" "2018" ...
##   ..- attr(*, "label")= chr "año de la encuesta"
##   ..- attr(*, "format.stata")= chr "%4s"
##  $ mes      : chr  "06" "02" "10" "08" ...
##   ..- attr(*, "label")= chr "mes de ejecución de la encuesta"
##   ..- attr(*, "format.stata")= chr "%2s"
##  $ nconglome: chr  "021521" "033493" "039710" "000909" ...
##   ..- attr(*, "label")= chr "número de conglomerado (proveniente del marco)"
##   ..- attr(*, "format.stata")= chr "%6s"
##  $ conglome : chr  "007584" "006483" "010344" "008845" ...
##   ..- attr(*, "label")= chr "número de conglomerado"
##   ..- attr(*, "format.stata")= chr "%6s"
##  $ vivienda : chr  "078" "274" "056" "136" ...
##   ..- attr(*, "label")= chr "número de selección de vivienda"
##   ..- attr(*, "format.stata")= chr "%3s"
##  $ hogar    : chr  "11" "11" "11" "12" ...
##   ..- attr(*, "label")= chr "número secuencial del hogar"
##   ..- attr(*, "format.stata")= chr "%2s"

Vemos que las variables son de tipo ‘chr’, que quiere decir character o texto. Asimismo, podemos ver que cada variable cuenta con dos espacios de attr(), estos son sus atributos. Más adelante veremos qué son y cómo utilizarlos. También vemos que el objeto s2018 es un data.frame.

## [1] TRUE

En este caso s2018 es un objeto de tipo data.frame, por lo que tiene dos dimensiones, saber esto es importante por que así podemos manipularlas. La función dim() nos permite ver ambas. El primer número se refiere a la cantidad de observaciones o casos (las filas) y el segundo a la cantidad de variables (las columnas).

## [1] 1000  158

En el código debajo estamos seleccionando los 20 primeros casos (1:20), y las tres primeras variables (1:3). Conocer las dimensiones es útil para luego filtrar la base de datos.

##     aÑo mes nconglome
## 1  2018  06    021521
## 2  2018  02    033493
## 3  2018  10    039710
## 4  2018  08    000909
## 5  2018  04    015685
## 6  2018  09    018285
## 7  2018  08    011964
## 8  2018  04    030180
## 9  2018  06    009642
## 10 2018  03    032546
## 11 2018  11    035275
## 12 2018  07    004174
## 13 2018  05    014759
## 14 2018  06    044238
## 15 2018  06    032325
## 16 2018  05    013461
## 17 2018  05    007615
## 18 2018  08    011434
## 19 2018  10    042844
## 20 2018  07    014755

Si eres ansioso y quieres ver toda la base de datos puedes usar el siguiente código:

Podriamos mirar una muestra de nuestra base de datos con la opcion head. Abajo, le pedimos que nos puestre las 300 primeras observaciones.

La función import() de rio permite subir archivos en distintos formatos. Existen otros paquetes como foreign que también hacen lo mismo. Pero rio me parece más conveniente.

3 Manipular y limpiar base de datos

En esta secciones aprenderemos algunas de los pasos mas frecuentes que hacemos al encontrarnos con una nueva base de datos: limpiar y manipular algunas variables para que pueda analizarse. Debemos limpiar nuestra base de datos por muchas razones; quizas para calcular las variables que queremos, para desacernos de grupos de observaciones que no nos interesan o para hacer mas fácil el juntar nuestra base de datos con otras.

3.1 Re-nombrar y etiquetar variables

Podemos llamar nuestras variables en la BD con la función names() o también ls()

##   [1] "aÑo"        "mes"        "nconglome"  "conglome"   "vivienda"  
##   [6] "hogar"      "ubigeo"     "dominio"    "estrato"    "percepho"  
##  [11] "mieperho"   "totmieho"   "ia01hd"     "ia02hd"     "ig03hd1"   
##  [16] "ig03hd2"    "ig03hd3"    "ig03hd4"    "ga03hd"     "ga04hd"    
##  [21] "sg23"       "sig24"      "sg25"       "sig26"      "sg42"      
##  [26] "sg421"      "sg422"      "sg423"      "sg42d"      "sg42d1"    
##  [31] "sg42d2"     "sg42d3"     "ingbruhd"   "ingnethd"   "pagesphd"  
##  [36] "ingindhd"   "ingauthd"   "insedthd"   "insedlhd"   "paesechd"  
##  [41] "ingseihd"   "isecauhd"   "ingexthd"   "ingtrahd"   "ingtexhd"  
##  [46] "ingrenhd"   "ingoexhd"   "g05hd"      "ig06hd"     "g05hd1"    
##  [51] "ig06hd1"    "g05hd2"     "ig06hd2"    "g05hd3"     "ig06hd3"   
##  [56] "g05hd4"     "ig06hd4"    "g05hd5"     "ig06hd5"    "g05hd6"    
##  [61] "ig06hd6"    "g07hd"      "ig08hd"     "ingtprhd"   "ingtpuhd"  
##  [66] "ingtpu01"   "ingtpu02"   "ingtpu03"   "ingtpu04"   "ingtpu05"  
##  [71] "gru11hd"    "gru12hd1"   "gru12hd2"   "gru13hd1"   "gru13hd2"  
##  [76] "gru13hd3"   "gru13hd4"   "gru14hd"    "gru14hd1"   "gru14hd2"  
##  [81] "gru14hd3"   "gru14hd4"   "gru14hd5"   "gru14hd6"   "gru21hd"   
##  [86] "gru22hd1"   "gru22hd2"   "gru23hd1"   "gru23hd2"   "gru23hd3"  
##  [91] "gru24hd"    "gru31hd"    "gru32hd1"   "gru32hd2"   "gru33hd1"  
##  [96] "gru33hd2"   "gru33hd3"   "gru34hd"    "gru41hd"    "gru42hd1"  
## [101] "gru42hd2"   "gru43hd1"   "gru43hd2"   "gru43hd3"   "gru44hd"   
## [106] "gru51hd"    "gru52hd1"   "gru53hd1"   "gru53hd2"   "gru53hd3"  
## [111] "gru53hd4"   "gru54hd"    "gru61hd"    "gru62hd1"   "gru62hd2"  
## [116] "gru63hd1"   "gru63hd2"   "gru63hd3"   "gru64hd"    "gru71hd"   
## [121] "gru72hd1"   "gru72hd2"   "gru73hd1"   "gru73hd2"   "gru73hd3"  
## [126] "gru74hd"    "gru81hd"    "gru82hd1"   "gru82hd2"   "gru83hd1"  
## [131] "gru83hd2"   "gru83hd3"   "gru83hd4"   "gru84hd"    "gru84hd1"  
## [136] "gru85hd1"   "gru86hd1"   "gru86hd2"   "gru87hd"    "ingotrhd"  
## [141] "ingmo1hd"   "ingmo2hd"   "inghog1d"   "inghog2d"   "gashog1d"  
## [146] "gashog21"   "gashog22"   "gashog23"   "gashog24"   "gashog26"  
## [151] "gashog25"   "gashog2d"   "ld"         "estrsocial" "linpe"     
## [156] "linea"      "pobreza"    "factor07"
##   [1] "aÑo"        "conglome"   "dominio"    "estrato"    "estrsocial"
##   [6] "factor07"   "g05hd"      "g05hd1"     "g05hd2"     "g05hd3"    
##  [11] "g05hd4"     "g05hd5"     "g05hd6"     "g07hd"      "ga03hd"    
##  [16] "ga04hd"     "gashog1d"   "gashog21"   "gashog22"   "gashog23"  
##  [21] "gashog24"   "gashog25"   "gashog26"   "gashog2d"   "gru11hd"   
##  [26] "gru12hd1"   "gru12hd2"   "gru13hd1"   "gru13hd2"   "gru13hd3"  
##  [31] "gru13hd4"   "gru14hd"    "gru14hd1"   "gru14hd2"   "gru14hd3"  
##  [36] "gru14hd4"   "gru14hd5"   "gru14hd6"   "gru21hd"    "gru22hd1"  
##  [41] "gru22hd2"   "gru23hd1"   "gru23hd2"   "gru23hd3"   "gru24hd"   
##  [46] "gru31hd"    "gru32hd1"   "gru32hd2"   "gru33hd1"   "gru33hd2"  
##  [51] "gru33hd3"   "gru34hd"    "gru41hd"    "gru42hd1"   "gru42hd2"  
##  [56] "gru43hd1"   "gru43hd2"   "gru43hd3"   "gru44hd"    "gru51hd"   
##  [61] "gru52hd1"   "gru53hd1"   "gru53hd2"   "gru53hd3"   "gru53hd4"  
##  [66] "gru54hd"    "gru61hd"    "gru62hd1"   "gru62hd2"   "gru63hd1"  
##  [71] "gru63hd2"   "gru63hd3"   "gru64hd"    "gru71hd"    "gru72hd1"  
##  [76] "gru72hd2"   "gru73hd1"   "gru73hd2"   "gru73hd3"   "gru74hd"   
##  [81] "gru81hd"    "gru82hd1"   "gru82hd2"   "gru83hd1"   "gru83hd2"  
##  [86] "gru83hd3"   "gru83hd4"   "gru84hd"    "gru84hd1"   "gru85hd1"  
##  [91] "gru86hd1"   "gru86hd2"   "gru87hd"    "hogar"      "ia01hd"    
##  [96] "ia02hd"     "ig03hd1"    "ig03hd2"    "ig03hd3"    "ig03hd4"   
## [101] "ig06hd"     "ig06hd1"    "ig06hd2"    "ig06hd3"    "ig06hd4"   
## [106] "ig06hd5"    "ig06hd6"    "ig08hd"     "ingauthd"   "ingbruhd"  
## [111] "ingexthd"   "inghog1d"   "inghog2d"   "ingindhd"   "ingmo1hd"  
## [116] "ingmo2hd"   "ingnethd"   "ingoexhd"   "ingotrhd"   "ingrenhd"  
## [121] "ingseihd"   "ingtexhd"   "ingtprhd"   "ingtpu01"   "ingtpu02"  
## [126] "ingtpu03"   "ingtpu04"   "ingtpu05"   "ingtpuhd"   "ingtrahd"  
## [131] "insedlhd"   "insedthd"   "isecauhd"   "ld"         "linea"     
## [136] "linpe"      "mes"        "mieperho"   "nconglome"  "paesechd"  
## [141] "pagesphd"   "percepho"   "pobreza"    "sg23"       "sg25"      
## [146] "sg42"       "sg421"      "sg422"      "sg423"      "sg42d"     
## [151] "sg42d1"     "sg42d2"     "sg42d3"     "sig24"      "sig26"     
## [156] "totmieho"   "ubigeo"     "vivienda"

Por ejemplo la variable inghog1d (posición 141) es el ingreso bruto anual queremos cambiar el nombre a “ingreso_bruto”.

La forma más rápida es:

Si no tenemos la ubicación, quizás son miles de variables, podemos también usar

Pedimos el nombre de variables denuevo

## [1] "ingotrhd"      "ingreso_bruto" "ingmo2hd"      "inghog1d"     
## [5] "inghog2d"      "gashog1d"

Etiquetas

Si subimos la base de datos desde STATA, estas pueden tener etiquetas.

Por ejemplo, veamos la etiqueta de nuestra variables “ingreso_bruto”

## [1] "ingreso monetario (bruto)"

Queremos cambiarla a “ingreso monetario (bruto) anual”

## [1] "ingreso monetario (bruto) anual"

3.2 Recodificar variables

Ahora recodificaremos los valores de la variable con que estamos trabajando.

Usamos la funcion abajo para ver los valores y las etiquetas de la variable que creamos.

##     a     b     c     d     e rural 
##     1     2     3     4     5     6

Queremos recodificar los valores de rural de 6 a 0.

Si pedimos una tabla vemos que el cambio se realizo:

## 
##   0   1   2   3   4   5 
## 383  17  34  81 226 259

Pero las etiquetas siguen mostrando el orden anterior

##     a     b     c     d     e rural 
##     1     2     3     4     5     6
##     a     b     c     d     e rural 
##     0     2     3     4     5     6

3.3 Generar variables (categorica, dicotomica, average de grupo)

Ahora vamos a generar distintos tipos de variables. Empecemos con una variable dicotomica. Vamos a usar informacion sobre el ingreso reportado

3.4 Variable categóricas

Generemos una variable que toma el valor de 1 si es que el informante gana más de 800 soles y 0 si es menos o igual. Creamos una variable vacia y le incluimos los argumentos:

  • Forma 1:
## 
##   0   1 
##  16 984
  • Forma 2:
## 
##   0   1 
##  16 984
  • Forma 3: USANDO DPLYR para crear nuevas variables

Dplyr es un paquete que es muy útil para manipular data, es relativamente nuevo y cada vez está siendo más usado.

Dplyr y Tydir son muy populares, así que es bueno ir familiarizandose con ellos.

Lo especial de Dplyr es que tiene sus propias funciones y además que conecta funciones usando %>%. De esa manera puede ser más eficiente con el espacio de trabajo, evitando crear muchos objetos.

En este caso la función es mutate

## 
##   0   1 
##  16 984

3.5 Medidas por grupo.

Por ejemplo queremos calcular el promedio de cada grupo. Usaremos dplyr para calcular el promedio de ingreso y la desviación estandar por cada ubigeo (municipalidad)

  • Podemos concatenar funciones. Primero hemos “agrupado” la base de datos, luego hemos calculado el promedio, y la desviación estandard en base a la variable de agrupación.
  • arrange() es para ordernar los ubigeos
  • select() para quedarnos con algunas variables (son más de 150)
  • head() para pedir los 6 primeros casos.
## Adding missing grouping variables: `ubigeo`
## # A tibble: 6 x 6
## # Groups:   ubigeo [3]
##   ubigeo aÑo   mes   nconglome promedio   desv
##   <chr>  <chr> <chr> <chr>        <dbl>  <dbl>
## 1 010101 2018  10    007100      80756. 43287.
## 2 010101 2018  06    007066      80756. 43287.
## 3 010112 2018  12    007151      22392     NA 
## 4 010201 2018  08    006599      10520.  4929.
## 5 010201 2018  04    006618      10520.  4929.
## 6 010201 2018  08    006641      10520.  4929.

Ahora bien los cambios no se han guardado en la base de datos para hacerlo debemos remplazar el objeto o crear uno nuevo.

4 Merge y append bases de datos

  • Creemos una base de datos que contenga el ingreso promedio por distrito. Similar a nuestro ejercicio anterior pero ahora la base será un objeto aparte.
## # A tibble: 6 x 3
##   ubigeo promedio   desv
##   <chr>     <dbl>  <dbl>
## 1 010101   80756. 43287.
## 2 010112   22392     NA 
## 3 010201   10520.  4929.
## 4 010202    3746.  2255.
## 5 010203   17275     NA 
## 6 010205   11892  14875.

La diferencia aquí es que hemos usado summarise en lugar de mutate. Ya que no estamos agregando una variable a la base. Estamos creando una nueva base.

## [1] 514

Ahora juntemos las bases de datos. El proceso es más conocido como “merge” o “join”

##   hogar minimo  promedio
## 1    11      1 20971.317
## 2    11      1  4007.568
## 3    11      1  8651.279
## 4    12      1 39084.833
## 5    11      1  4224.000
## 6    11      1 30128.250

Existen diferentes tipos de “join”

  • left_join()
  • rigth_join()
  • inner_join()