class: center middle main-title section-title-1 top-logo .small[ # Transformar y seleccionar variables ] .class-info[ <br> **Bloque N° 3**<br> 19 agosto 2021<br> **Análisis de datos estadísticos en R** <br> .pull-right.small[ **Profesora** Valentina Andrade de la Horra <br> **Ayudantes** Dafne Jaime y Nicolás Godoy .tiny[Universidad Diego Portales<br> ] ] ] --- class: title title-inv-1 # Contenidos Bloque 3 -- .box-2.medium.sp-after-half[**Básicos en manipulación**] .small.box-2[Operadores y tipos de datos] -- .box-3.medium.sp-after-half[**Seleccionar variables**] -- .box-4.medium.sp-after-half[**Filtrar**] -- .box-5.medium.sp-after-half[**Crear variables**] ??? - basics - select - filter - create --- class: center middle main-title section-title-1 top-logo name: basics # 1: Flujo del Rproject --- class: title title-inv-1 # Etapas del flujo .center[ ![:scale 70%](data:image/png;base64,#https://github.com/learn-R/slides/raw/main/img/01/flow-rproject.png)] -- - *Hoy* nosotras/os finalizaremos la parte de **procesamiento**. --- class: title title-inv-1 # Orden de un script de procesamiento .center[ ![:scale 80%](data:image/png;base64,#https://github.com/learn-R/slides/raw/main/img/02/orden-sintaxis.png)] --- .center[ ![](data:image/png;base64,#https://media2.giphy.com/media/ule4vhcY1xEKQ/giphy.gif)] Figura 1: Estudiantes de Análisis de datos en R haciendo el **paso 1 y 2.** --- class: center middle main-title section-title-1 top-logo # Paso 1: Cargar paquetes --- layout: true class: title title-1 --- # Paso 1: Cargar paquetes ```r *pacman::p_load(tidyverse, magrittr, car, sjmisc) ``` --- layout: false class: center middle section-title section-title-1 animated fadeIn # Paso 2: Importar datos --- # Consideraciones antes de importar datos Para **importar** los datos en R debemos tener en consideración tres cosas: .can-edit.key-likes[ 1. 2. 3. ] --- # Consideraciones antes de importar datos Para **importar** los datos en R debemos tener en consideración tres cosas: 1. Cómo se llaman los datos (en nuestro caso Casen en Pandemia 2020 STATA) 2. El formato de nuestros datos (en nuestro caso .sav) 3. El lugar de donde están alojados nuestros datos. --- # Paso 2: Importar datos ```r datos <- read_dta("../Rproject/input/Casen en Pandemia 2020 STATA.dta") ``` --- class: center middle main-title section-title-1 top-logo # Como resultado .box-inv-1[Nuevo objeto en el Enviroment] --- class: center middle section-title section-title-2 animated fadeIn # Paso 3: Procesar datos --- class: center title title-3 # Procesar datos Es un proceso **iterativo** .box-inv-1[explorar⏩ transformar ] -- .box-inv-8[transformar ⏩explorar] -- Por ello, si bien para manipular datos estaremos utilizando constantemente paquetes de `tidyverse`, también utilizaremos el paquete `base` y `sjmisc` para explorar nuestros datos --- # Explorar datos para procesar ```r # 1. Base dim(datos) # Nos entrega las dimensiones, es decir el numero de observaciones y el número de variables View(datos) # Visualizar objetos names(datos) # entrega los nombres de las variables que componen el dataset head(datos) # muestra las primeras filas presentes en el marco de datos # 2. sjmisc find_var(datos, "concepto") # Encontrar variables ``` --- layout: false class: center middle main-title section-title-2 top-logo # ¡Partamos el **paso 3**: procesar datos! --- # ¿Dónde? .box-inv-1[[Descargar el zip del bloque 3 el sitio del curso](https://learn-r-udp.netlify.app/content/03-content/)] --- class: title title-2 # 1. Recursos de la práctica - Datos: *Encuesta de Caracterización Socioeconómica (CASEN)* (2020). - Para ello, deben dirigirse al [siguiente enlace](https://drive.google.com/drive/folders/1Orgb3Qb9LcjTfjYMdIdy7SWd3xDMrTbG?usp=sharing) y descargar los zip. - [**Libro de códigos**](http://observatorio.ministeriodesarrollosocial.gob.cl/storage/docs/casen/2020/Libro_de_codigos_Base_de_Datos_Casen_en_Pandemia_2020.pdf) antes de trabajar una base de datos. --- layout: false class: center middle section-title-2 top-logo # Al explorar nuestros datos -- # Pudimos notar cierta información sobre las columnas que de a poco debemos asimilar --- layout: true class: title title-2 --- # Tipos de datos -- - Las que principalmente nos interesarán son los "vectores" -- - En nuestro "idioma", son las **variables**. -- - En general, una combinación de vectores da origen a una matriz (o **data frame** o "base de datos" [^1]) [^1]: *Un error omitido por muchas/os* --- # Tipos de datos: columnas Relación entre clase y nivel de medición de la variable - `numeric` - `character` - `factor` - hay varios más... --- # Operadores - Símbolos que no son de uso exclusivo en R ¡probablemente los conoces desde tus cursos de matemática! (*la suma, la resta*) - Ahora bien, no todos tienen el mismo significado que en otros softwares. - Tendrán distintos objetivos: relacionar, condicionar, excluir, repetir etc. Lo importante: buscan darle un **sentido** a la "orden" que le estamos dando a R. - Los utilizaremos cuando **filtremos** nuestros datos para personas de ciertas categorías, cuando **calculemos variables** nuevas (de manera aritmética o condicional) o, simplemente, cuando queramos hacer procesos "concatenados". --- class: title title-2 # Operadores relacionales Se usan para hacer comparaciones. Cuando en la *Tabla 1* nos referimos a `un valor`, esto refiere tambien a `variables` | Símbolo | Función | |---------:|:--------| | `<` | Un valor es menor que otro | | `>` | Un valor es mayor que otro | | `==` | Un valor es igual que otro [^1] | | `<=` | Un valor es menor o igual que otro | | `>=` | Un valor es mayor o igual que otro | | `!=` | Un valor es distinto o diferente que otro| | `%in%` | Un valor pertenece al conjunto designado [^2] | | `is.na()`| El valor es perdido o `NA` | | `!is.na()`| El valor es distinto de `NA` | --- # Tips - ¡Atención! Fíjate bien que `==` y `=` son distintos. En R `==` es indicar *"igual a"*, mientras que `=` es *asignar* (sinónimo de `<-`) - El operador `%in%` es **muy utilizado**, sirve para indicar que algo está dentro de una cadena de valores. --- # Operadores aritméticos Realizan operaciones, como la suma, resta, división, entre otros. | Símbolo | Función | |---------:|:--------| | `+` | Suma | | `-` | Resta| | `*` | Multiplicación | | `/` | División | | `^` | Elevado | --- # Operadores de asignación Hay dos formas de asignar: - `objetoA <- objetoB` - `objetoA = objetoB`. Ambas implican que lo que se este realizando en el *objetoB* implica que eso va a producir o generar al *objetoA*. La diferencia está en que la segunda opción es más utilizada dentro de las funciones pues su significado más bien es *"es"* --- # Operadores booleanos Describen relaciones **lógicas** o **condicionales** | Símbolo | Función | |---------:|:--------| | `&` | Indica un *y* lógico | | `"|"` | Indica un *o* lógico | | `xor()` | Excluye la condición | | `!` | Distinto de ... | | `any` | Ninguna de las condiciones serán utilizadas | | `all` | Todas las condiciones serán ocupadas | --- # Resumen ![](data:image/png;base64,#https://github.com/learn-R/slides/raw/main/img/02/01operad.png) Figura 1: Resumen de operadores --- layout: false class: center middle section-title-2 top-logo # Redoble de tambores, el más importante de la fiesta 🥁 --- layout: true class: title title-2 --- # Operador pipeline %>% - `%>%` (llamado `pipe`) no es un operador que esté contenido en las funciones base del lenguaje R (origen `magrittr` de `tidyverse`) - Es de los operadores **más útiles y utilizados** en R. -- **En el teclado** - `Ctrl + shift + M` Para Windows - `⌘ + shift + M` Para Mac --- # Operador pipeline %>% - Función: **concatenar** múltiples funciones y procesos. -- - ¿Cómo es eso? 🤨 -- - ¡Tranquila/o! Ya lo veremos 🧘🏽♂️ --- # ¡Ya queremos ir a practicar! 🏃🏽♀️🏃🏽 --- # Transformación y selección de variables con `dplyr()` -- 1. `select()` para seleccionar variables -- 2. `filter()` para filtrar observaciones -- 3. `mutate()` crear nuevas variables - `recode()`, `if_else()`, `case_when()` --- # `select()` para manipular variables - Para **seleccionar variables** ocuparemos `select()`. -- Si queremos incluir las variables `variable1`, `variable2` y `variable3` ```r select(datos, variable1, variable2, variable3) ``` -- Si queremos excluir anteponemos un menos `-variable1` ```r select(datos, -variable1) ``` --- # Formas de hacer `select()` 1. Por indexación ```r select(datos, 1,2) # la primera y la segunda columna select(datos, 1:4) # la primera hasta la cuarta columna ``` 2. por nombre de columna ```r select(datos, edad, sexo, o1) ``` --- # Trucos de `select()` 1. Renombrar en el mismo proceso de selección indicando `nuevo_nombre = nombre_original` en el proceso de selección ```r select(datos, edad, sexo, ocupacion = o1) ``` 2. Reordenar variables - `everything()` nos indica que ponga "todo el resto". ```r select(datos, id_persona, sexo, edad, everything()) ``` --- # Formas de hacer `select()` 3. Con patrones de texto: prefijos, sufijos o partes de *cómo están nombradas las variables*. - Poner textos y expresiones regulares entre **comillas**. - `starts_with()`: prefijo - `ends_with() `: sufijo - `contains()` : contiene una cadena de texto literal - `matches()` : coincide con una expresión regular --- # Formas de hacer `select()` ```r select(datos, starts_with("a"), ends_with("preg")) # También se pueden combinar con operadores logicos select(datos, starts_with("y1")&ends_with("preg")) select(datos, contains("pobre")|contains("vivienda")) select(datos, matches("pobreza_|vivienda")) ``` --- # Formas de hacer `select()` 4. Con condiciones lógicas - `select()` + `where()`: *"seleciona donde"*, ese *donde* responde a una condición que cumple cierta variable. - Por ejemplo, queremos seleccionar todas las variables que son carácteres (`is.character`): ```r select(datos, where(is.character)) ``` --- layout: false - Luego de la exploración de datos mediante a funciones como `find_var()` de `sjmisc` decidimos trabajar con las siguientes variables. - `edad` - `sexo` - `s13`: previsión de salud - `tot_per`: número de personas en el hogar - `ytoth`: ingresos totales del hogar - `o1`: ocupación - `y26d_total`: Monto del IFE - `y26d_hog`: ¿Alguien recibió el IFE? ¡Apliquémos conocimientos! ```r select(datos, edad, sexo, prev =592, ocupacion = o1, tot_per, ytoth, starts_with("y26d_")&matches("total|hog")) ``` --- layout: true class: title title-4 --- # Nuevo data set - Buena práctica trabajar solo con las columnas que utilizaremos para el análisis, principalmente pues disminuye el *uso de memoria* ```r datos_proc <- select(datos, edad, sexo, prev = 592, ocupacion = o1, tot_per, ytoth, starts_with("y26d_")&matches("total|hog")) ``` --- # ¡Ejercicio en grupos! -- - Seleccionen una variable de nivel educacional, region, sexo, la variable 700 y todas las que refieran a ingresos. - Indiquen cómo hicieron ese procedimiento - Con estos cambios, creen un nuevo objeto llamado `ejercicio` --- # ¿Qué pasa si quiero trabajar con un *subset* de casos? -- # La respuesta es `filter()` --- # `filter()` para manipular observaciones - La función `filter()` de `dplyr` escoge o extrae filas basados en sus valores, subdivide un data frame (*subset*) - Uso de los **operadores** -- ```r filter(datos, condicion_para filtrar) ``` Imaginemos que queremos filtrar valores mayores o iguales 3 **respecto a la variable1** ```r filter(datos, variable1 >= 3) ``` --- # Formas de `filter()` 1. Con números Imaginémos que queremos una base con las personas mayores de 15 años. ```r filter(datos_proc, edad >= 15) filter(datos_proc, edad >= 15 & tot_per <7) ``` -- Pero también que pertenezcan a hogares con menos de 7 personas. ```r filter(datos_proc, edad >= 15 & tot_per <7) ``` --- # Formas de `filter()` 2. Con carácteres - Importancia de explorar los datos 1. Fijarse bien cómo están escritos 2. Clase (ver si efectivamente son carácteres) - R es *sensible* a cómo está escrito el texto (*key sensitive*) --- # Truco - Cuando haya problemas aplicar `as_factor()` que permite conservar los niveles pero definiendo sus categorías de respuesta en base a la etiqueta que traen (el `lbl`) - Consejo útil sobre todo en bases que provienen de SPSS y STATA --- # Formas de `filter()` ```r datos_proc$sexo <- as_factor(datos_proc$sexo) ``` ```r filter(datos_proc, sexo == "Mujer") filter(datos_proc, sexo != "Hombre") ``` --- # Un clásico, y la solución: %in% - ¿Cómo se seleccionan dos condiciones en carácter? Con el operador `%in%` ```r datos_proc$prev <- as_factor(datos_proc$prev) filter(datos_proc, prev %in% c("Sistema Público FONASA", "ISAPRE")) ``` --- # Ejercicio - Con su data frame `ejercicio` filtren - Excluyan a las personas sin estudios - Filtren a la persona con máximos ingresos del hogar - Conserven a las personas de la RM y Valparaíso. --- class: center middle section-title-4 top-logo # ¿Y si quiero crear variables nuevas? -- .box-5[`mutate()`] --- # `mutate()` para transformación de variables - `mutate()` permite hacer operaciones para crear nuevas variables o transformar las ya existentes. ```r mutate(datos, nueva_variable = cálculo o condición) ``` --- # Formas de hacer `mutate()` 1. En base a cálculo ```r mutate(datos_proc, nueva_variable = 3+2) mutate(datos_proc, nueva_variable = 3+2, ingreso_percapita = ytoth/tot_per) ``` --- class: center middle section-title-4 top-logo # Aquí mucha mucha atención... -- # Viene la aplicación de %>% .box-inv-4[¿Qué pasa si queremos, luego de calcular nuestras nuevas variables, filtrar un ingreso per cápita menor o igual a $1.000.000] --- # `%>%` ```r datos %>% mutate(., nueva_variable = calculo ) %>% filter(., nueva_variable <= valor) ``` -- - Básicamente, el ` %>% ` permite "ingresar" nuestra base de datos como argumento para cada función e ir operándola en proceso --- # `%>%` ```r datos_proc %>% mutate(ingreso_percapita = ytoth/tot_per) %>% filter(ingreso_percapita <= 1000000) ``` -- **En el teclado** - `Ctrl + shift + M` Para Windows - `⌘ + shift + M` Para Mac --- layout: false class: center middle section-title-5 top-logo # Crear nuevas variables utilizando *además* otras funciones -- ## mutate(variable_nueva = alguna_funcion_genial) --- layout: true class: title title-5 # Opciones para recodificar. - `dplyr::recode()` y `car::recode()` - Con `dplyr::recode()`: recodificamos las categorías de respuesta de Mujer a Femenino y de Hombre a Masculino ```r datos_proc %>% mutate(sexo = dplyr::recode(sexo, "Mujer" = "Femenino", "Hombre" = "Masculino")) ``` - El problema de `recode()` que se utiliza dentro de `dplyr` es que si recodifico se pierde la etiqueta anterior. --- # Mi elección: `car::recode()` - **No olviden** los `::` por los posibles conflictos ```r car::recode(datos$variable, c('valor_orig1=nuevo_valor1;valor_org2=nuevo_valor2')) ``` --- # Mi elección: `car::recode()` ```r datos_proc %$% car::recode(.$y26d_hog, c('9=NA')) %>% head(.) ``` Aquí una versión de si la recodificación es hacia carácteres (mismo ejemplo que con `recode()` de `dplyr`) ```r datos_proc %$% car::recode(.$sexo, c('"Mujer"="Femenino";"Hombre"= "Masculino"'), as.factor = T) %>% head(.) ``` --- .small[ # `if_else()` variables condicionales ] La función `if_else()` permite construir variables en base a condiciones lógicas. Su estructura es la siguiente ```r if_else(condición,TRUE,FALSE) ``` --- .small[ # `if_else()` variables condicionales ] Crearemos una variable que *dummy* que indica si el respondente es *FONASA* o no lo es. ```r datos_proc %>% mutate(fonasa = if_else(prev == "Sistema Público FONASA", 1, 0)) ``` --- .small[ # `if_else()` variables condicionales ] - Uno/a puede ser *ingenioso* y ocuparla como **validador** ```r datos_proc %>% mutate(validador_ingreso = if_else(is.na(ytoth), FALSE, TRUE)) ``` - También para *imputar valores* ¿cómo sería? --- .small[ # `case_when()` variables con múltiples condiciones ] - Para *colapsar* categorías o construir categorías en base a varias condiciones es `case_when()` por lo lógico y *fácil* que es de entender ```r case_when(variable == condicion ~ valor1, variable == condicion ~ valor2, TRUE ~ NA_real) ``` - Donde, TRUE indica "todo el resto", y el NA dependerá de la clase del valor de recodificación --- .small[ # `case_when()` variables con múltiples condiciones ] Un ejemplo claro es cuando queremos construir *categorías de edad* ```r datos_proc %>% mutate(edad_tramo = case_when(edad <=39 ~ "Joven", edad > 39 & edad <=59 ~ "Adulto", edad > 59 ~ "Adulto mayor", TRUE ~ NA_character_)) %>% select(edad, edad_tramo) ``` - ¡Utilizamos operadores lógicos (`&`)! --- # ¡Resumen! ```r datos_proc %>% filter(edad >= 15 & tot_per <7) %>% mutate(ingreso_percapita = ytoth/tot_per, edad_tramo = case_when(edad <=39 ~ "Joven", edad > 39 & edad <=59 ~ "Adulto", edad > 59 ~ "Adulto mayor", TRUE ~ NA_character_), fonasa = if_else(prev == "Sistema Público FONASA", 1, 0), ocupacion = as_factor(ocupacion)) %>% select(sexo, edad_tramo, ocupacion, ingreso_percapita, ife = y26d_hog) ``` --- # ¡Resumen! ¡Ahora que estamos seguras/os sobre-escribimos la base! ```r datos_proc <- datos_proc %>% filter(edad >= 15 & tot_per <7) %>% mutate(ingreso_percapita = ytoth/tot_per, edad_tramo = case_when(edad <=39 ~ "Joven", edad > 39 & edad <=59 ~ "Adulto", edad > 59 ~ "Adulto mayor", TRUE ~ NA_character_), fonasa = if_else(prev == "Sistema Público FONASA", 1, 0), ocupacion = as_factor(ocupacion)) %>% select(sexo, edad_tramo, ocupacion, ingreso_percapita, ife = y26d_hog) ``` --- # Antes de guardar Podemos visualizar la base resultante a partir de `view_df()` de `sjPlot` ```r sjPlot::view_df(datos_proc) ``` --- # Paso 4: Guardar datos Para guardar la base de datos procesada, debes dirigir la ruta hacia tu Rproject ```r saveRDS(datos_proc, file = "../nombre_project/output/datos_proc.rds") ``` - Recuerda revisar el [practico N°2](example/02-practico) si no recuerdas como expoertar datos. --- layout: false class: center section-title section-title-5 animated fadeIn # En síntesis .box-2.medium.sp-after-half[**Básicos en manipulación**] .small.box-2[Operadores y tipos de datos] -- .box-3.medium.sp-after-half[**Seleccionar variables**] -- .box-4.medium.sp-after-half[**Filtrar**] -- .box-5.medium.sp-after-half[**Crear variables**] --- class: center middle main-title section-title-4 top-logo # ¡Y a no olvidar el flujo para el análisis! -- ## Nos permite hacernos amigas/os más rápido del programa --- .center[ ![:scale 80%](data:image/png;base64,#img/01/flow-rproject.png)] --- layout: false .box-1[¿Y eso era?] -- .box-inv-1[¡Ahora si que si! Nos vemos el próximo viernes en la última sesión] .center[ ![](img/01/monster-inc-2.gif)] --- layout: false class: center middle main-title section-title-1 top-logo .small[ # Transformar y seleccionar variables ] .class-info[ <br> **Bloque N° 3**<br> 19 agosto 2021<br> **Análisis de datos estadísticos en R** <br> .pull-right.small[ **Profesora** Valentina Andrade de la Horra <br> **Ayudantes** Dafne Jaime y Nicolás Godoy .tiny[Universidad Diego Portales<br> ] ] ] ??? https://c.tenor.com/7mxJp29REVkAAAAC/scaryfeet-monstersinc.gif