---
title: "Introducción a R para Ciencias Sociales. Aplicación práctica en la EPH"
subtitle: "Clase 3 - Tidyverse y Tasas básicas del Mercado de Trabajo"
date: "20/08/2019"
output:
  html_notebook:
    toc: yes
    toc_float: yes
  html_document:
    toc: yes
---

> Reiniciar R

# Estructuración de Bases de Datos
         

A lo largo de esta clase, trabajaremos con el paquete [Tidyverse](https://www.tidyverse.org/). El mismo agrupa una serie de paquetes que tienen una misma lógica en su diseño y por ende funcionan en armonía.     
Entre ellos usaremos principalmente __dplyr__ y __tidyr__ para realizar transformaciones sobre nuestro set de datos, y __ggplot__ para realizar gráficos (éste último se verá en la clase 3).

A continuación cargamos la librería a nuestro ambiente. Para ello debe estar previamente instalada en nuestra pc.
```{r, warning=FALSE,message=FALSE}
library(tidyverse)
library(openxlsx)
```

## Carga de Informacion

La función __list.files__ nos permite observar los archivos que contiene una determinada carpeta             

```{r}
list.files("../Fuentes/")
```
La función __read.table__ nos permite levantar los archivos de extensión ".txt"               
La función __read.xlsx__ nos permite levantar los archivos de extensión ".xlsx"                 

Levantamos la base individual del primer trimestre de 2017, y un listado que contiene los Nombres y Códigos de los Aglomerados EPH.
```{r}
Individual_t117 <-
  read.table("../Fuentes/usu_individual_t117.txt",
  sep = ";",
  dec = ",",
  header = TRUE,
  fill = TRUE )
  
  
Aglom <- read.xlsx("../Fuentes/Aglomerados EPH.xlsx")
```


Para mostrar el funcionamiento básico de tydyverse, crearemos un pequeño subset de datos de la base Individual de la EPH. A partir del lenguaje base, especificaremos conservar las primeras 5000 filas, y una serie de variables de interés, tales como el código identificador del aglomerado, sexo, edad, y ponderación de cada registro.
```{r}
Datos  <- Individual_t117[1:5000,
c("AGLOMERADO","CH04","CH06","PONDERA")]
Datos
```
Téngase en cuenta que los resultados de estos ejercicios no serán representativos dado que se trata de un recorte de la base.

## Dplyr

El caracter principal para utilizar este paquete es ```%>%``` , _pipe_ (de tubería).

Los ```%>%``` toman el set de datos a su izquierda, y los transforman mediante los comandos a su derecha, en los cuales los elementos de la izquierda están implícitos. Es decír, que una vez específicado el DataFrame con el cual se trabaja, no será necesario nombrarlo nuevamente para referirse a una determinada variable/columna del mismo.

Veamos las principales funciones que pueden utilizarse con la lógica de este paquete:

### filter

Permite filtrar la tabla acorde al cumplimiento de condiciones lógicas
 
```{r}
pepito <- Datos %>% 
  filter(CH04==1 , CH06>=50)

```
Nótese que en este caso al separar con una  ```,``` las condiciones se exige el cumplimiento de ambas. En caso de desear que se cumpla al menos una  condición debe utilizarse el caracter ```|```
```{r}
Datos %>% 
    filter(CH04==1| CH06>=50)

```

### rename
Permite renombrar una columna de la tabla. Funciona de la siguiente manera: 
 ```Data %>% rename( nuevo_nombre = viejo_nombre )``` 
```{r}
Datos <- Datos %>% 
  rename(EDAD = CH06)
Datos

```
Nótese que a diferencia del ejemplo de la función __filter__ donde utilizábamos __==__ para comprobar una condición lógica, en este caso se utiliza sólo un __=__ ya que lo estamos haciendo es _asignar_ un nombre.

### mutate
Permite agregar una variable a la tabla (especificando el nombre que tomará esta), que puede ser el resultado de operaciones sobre otras variables de la misma tabla.       

En caso de especificar el nombre de una columna existente, el resultado de la operación realizada "sobrescribirá" la información de la columna con dicho nombre
```{r}
Datos <- Datos %>% 
  mutate(Edad_Cuadrado=EDAD^2)
Datos
```

### case_when
Permite definir una variable, la cual toma un valor particular para cada condición establecida. En caso de no cumplir ninguna de las condiciones establecidas la variable tomara valor __NA__.         
Su funcionamiento es el siguiente:      
```case_when(condicion1 ~ "Valor1",condicion2 ~ "Valor2",condicion3 ~ "Valor3")```

```{r}
Datos <- Datos %>% 
  mutate(Grupos_Etarios = case_when(EDAD  < 18   ~ "Menores",
                                 EDAD  %in%  18:65   ~ "Adultos",
                                 EDAD  > 65 ~ "Adultos Mayores"))
Datos
```

### select
Permite especificar la serie de columnas que se desea conservar de un DataFrame. También pueden especificarse las columnas que se desean descartar (agregándoles un _-_). Muy útil para agilizar el trabajo en bases de datos de gran tamaño.
```{r}
Datos %>% 
  select(CH04,PONDERA)


Datos %>% 
  select(3:ncol(.))

```

### arrange
Permite ordenar la tabla por los valores de determinada/s variable/s. Es útil cuando luego deben hacerse otras operaciones que requieran del ordenamiento de la tabla
```{r}
Datos <- Datos %>% 
  arrange(CH04,EDAD)
Datos
```

### summarise
Crea una nueva tabla que resume la información original. Para ello, definimos las variables de resumen y las formas de agregación.
```{r}
valor <- mean(Datos$EDAD)
weighted.mean(Datos$EDAD,Datos$PONDERA)

Datos %>% 
  mutate(Edad2=case_when(EDAD <0 ~ 0.5,
                          TRUE ~  as.numeric(EDAD)))
  #        
  # summarise(Edad_prom = mean(EDAD),
  #           Edad_prom_pond = weighted.mean(x = EDAD,w = PONDERA))

```

### group_by
Esta función permite realizar operaciones de forma agrupada. Lo que hace la función es "separar" a la tabla según los valores de la variable indicada y realizar las operaciones que se especifican a  continuación, de manera independiente para cada una de las "subtablas". En nuestro ejemplo, sería útil para calcular el promedio de edad según  _sexo_ 
```{r}
Datos %>% 
  group_by(CH04) %>%
  summarise(Edad_Prom = weighted.mean(EDAD,PONDERA))
```
Notese que los ```%>%``` pueden usarse encadenados para realizar numerosos procedimientos sobre un dataframe original.
Veamos un ejemplo con multiples encadenamietnos
```{r}
Encadenado <- Datos %>% 
  filter(Grupos_Etarios == "Adultos") %>% 
  mutate(Sexo = case_when(CH04 == 1 ~ "Varon",
                          CH04 == 2 ~ "Mujer")) %>% 
  select(-Edad_Cuadrado)
  
Encadenado
```

## Joins

Otra implementación muy importante del paquete dplyr son las funciones para unir tablas (joins)


![fuente: http://rstudio-pubs-static.s3.amazonaws.com/227171_618ebdce0b9d44f3af65700e833593db.html](img/joins.png)         

###left_join    

Veamos un ejemplo de la función __left_join__ (una de las más utilizadas en la práctica).       
Para ello utilizaremos el Dataframe _Aglom_ con los códigos y los nombres de los aglomerados EPH
```{r}
Aglom
```

```{r}
Datos_join <- Datos %>% 
  left_join(.,Aglom, by = "AGLOMERADO")
Datos_join

Poblacion_Aglomerados <- Datos_join %>% 
  filter(AGLOMERADO != 5) %>% 
  group_by(Nom_Aglo) %>% 
  summarise(Varones = sum(PONDERA[CH04==1]),
            Mujeres = sum(PONDERA[CH04==2]))

Poblacion_Aglomerados

```

## Tidyr
El paquete tidyr esta pensado para facilitar el emprolijamiento de los datos.     
<br> 

###pivot_longer
Nos permite pivotear los datos en columnas hacia una única variable. El *"longer"* refiere a que ahora nuestro dataframe va a tener más filas (y menos columnas)  
```{r}
pob.aglo.long <- Poblacion_Aglomerados %>% 
  pivot_longer(cols = 2:3,names_to = "Sexo",values_to = "Poblacion")

pob.aglo.long
```
###pivot_wider
Es el opuesto de **pivot_longer**. Nos permite pivotear los datos de una  variable para obtener múltiples columnas en función de alguna variable categórica que clasifique a la anterior. El "wider" refiere a que ahora nuestro dataframe va a tener menos filas (y más columnas)  
```{r}
pob.aglo.long %>% 
  pivot_wider(names_from = "Sexo",values_from = "Poblacion")
  
```


__Gather__ (Versión anterior del pivot_longer) es una función que nos permite pasar los datos de forma horizontal a una forma vertical. 

__spread__ (Versión anterior del pivot_wider) es una función que nos permite pasar los datos de forma vertical a una forma horizontal.

![fuente: http://www.gis-blog.com/data-management-with-r-tidyr-part-1/](img/spreadVSgather.png)

### Gather y Spread
La función gather nos permite transformar múltiples variables hacia una sola, generando una columna que identificará como categoría lo que antes era una variable. Este tipo de procesamientos será fundamental a la hora de realizar gráficos.

```{r}

Datos_gather <- Poblacion_Aglomerados %>%  
  gather(.,
   key   = Grupo,
   value = Total, 
   2:3)  

Datos_gather
```
La función spread realiza el procedimiento inverso, y puede ser util para presentar los datos en forma de tabla de manera más prolija.  
```{r}
Datos_Spread <- Datos_gather %>% 
  spread(.,       # el . llama a lo que esta atras del %>% 
  key = Grupo,    #la llave es la variable cuyos valores van a dar los nombres de columnas
  value = Total) #los valores con que se llenan las celdas

Datos_Spread  
```


# Tasas del Mercado de Trabajo
Luego de abordar las principales funciones necesarias para operar sobre las bases de datos, trabajaremos a continuación con toda la base del 1er Trimestre de 2017 de la EPH. El ejercicio principal consistirá en calcular la __tasa de empleo__, definida como:            

- Tasa de empleo:  $\frac{Ocupados}{Población}$ 
      
En la carpeta de _FUENTES_ del curso, se encuentra el archivo  *"EPH_Registro"* que contiene las codificación de cada una de las variables de la base, y el archivo *"EPH_Concpetos_Actividad"* que contiene las definiciones de los Estados ocupacionales a partir de los cuales se construyen las tasas básicas.   

## Tasa de Empleo

Creamos una tabla con los niveles de:

- Población
- Ocupados

Estos niveles nos van a permitir calcular la tasa de forma sencilla.      

 - Población: Si contaramos cuantos registros tiene la base, simplemente tendríamos el numero de individuos muestral de la EPH, por ende debemos **sumar los valores de la variable PONDERA**, para contemplar a cuantas personas representa cada individuo encuestado. 
 - Ocupados: En este caso, debemos agregar un **filtro** al procedimiento anterior, ya que unicamente queremos sumar los ponderadores de aquellas personas que se encuentran ocupadas. (La lógica seria: "Suma los valores de la columna PONDERA, solo para aquellos registros donde el ESTADO == 1")    
 
```{r}
Poblacion_ocupados <- Individual_t117 %>% 
  summarise(Poblacion         = sum(PONDERA),
            Ocupados          = sum(PONDERA[ESTADO == 1]))

Poblacion_ocupados
```
La función  ``` summarise() ``` nos permite crear multiples variables de resumen al mismo tiempo,  simplemente separando con una ``` , ``` cada uno de ellas. A su vez, se pueden crear variables, a partir de las variables creadas por la propia función. De esta forma, podemos, directamente calcular la **tasa de empleo** a partir del total poblacional y de ocupados.   
```{r}
Empleo <- Individual_t117 %>% 
  summarise(Poblacion         = sum(PONDERA),
            Ocupados          = sum(PONDERA[ESTADO == 1]),
            Tasa_Empleo    = Ocupados/Poblacion)

Empleo
```

En caso de querer expresar los resultados como porcentajes, utilizamos la función __sprintf__. Para ello debemos utilizar __mutate__ para transformar la columna Tasa_Empleo
```{r}
Empleo %>% 
  mutate(Tasa_Empleo_Porc = sprintf("%1.1f%%",100*Tasa_Empleo))
```
Nótese que en este caso, para poder añadir el %, la función transforma a la variable en un Character, por ende debe tenerse en cuenta que se pierde la información del numero completo.


# Exportar resultados a  Excel
Como vieramos en la clase 1, la función __write.xlsx__ de la libreria _openxlsx_ nos permite exportar los dos dataframes a un mismo archivo. Cabe aclarar que existen numerosas funciones y librerías alternativas para exportar resultados a un excel. En este caso, optamos por _openxlsx_ ya que resulta una de las más sencillas para exportar rapidamente los resultados. Otras librerías permiten también dar formato a las tablas que se exportan, definir si deseamos sobreescribir archivos en caso de que ya existan, etc. 

```{r eval=FALSE, warining = FALSE}
Lista_a_exportar <- list("Tasa de Empleo"  = Empleo,
                         "Poblacion Aglos" = Poblacion_Aglomerados)

write.xlsx(x = Lista_a_exportar,file = "../Resultados/ejercicioclase3.xlsx")

```

