class: center, middle, inverse, title-slide # R para Ciencia de Datos ## Capítulo 7: Análisis exploratorio de datos (EDA) ### Roberto Villegas-Diaz (GH: villegar) ### 2021-01-26 y 2021-02-02 --- ## Contenidos * 7.1 Introducción * 7.2 Preguntas * 7.3 Variación * 7.4 Valores faltantes * 7.5 Covariación * 7.6 Patrones y modelos * 7.7 Argumentos en ggplot2 <!-- * 7.8 Aprendiendo más --> --- ## Recordatorio Para poder ejecutar los ejercicios en este libro, los siguientes paquetes tienen que ser instalados: ```r if (!require(tidyverse)) install.packages("tidyverse") if (!require(datos)) install.packages("datos") ``` --- ## 7.1 Introducción 1. Generar preguntas 2. Intentar responder usando gráficos, transformaciones y modelado. 3. Usar lo aprendido y refinar las preguntas y/o generar nuevas interrogantes. .center[  ] .footnote[Fuente: https://diginomica.com] --- ## 7.2 Preguntas __Preguntas útiles:__ 1. ¿Qué tipo de variación existe dentro de cada una de mis variables? 2. ¿Qué tipo de covariación ocurre entre mis diferentes variables? __Vocabulario:__ - Variable: unidad - Valor: estado - Observación: conjunto - Datos tabulares: conjunto --- ## 7.3 Variación .center[  ] .footnote[Fuente: https://tinystats.github.io] --- ## 7.3 Variación (2) ```r ggplot(data = diamantes) + geom_bar(mapping = aes(x = corte)) ``` <img src="figuras/unnamed-chunk-2-1.svg" width="100%" style="display: block; margin: auto;" /> --- ## 7.3 Variación (3) ```r ggplot(data = diamantes) + geom_histogram(mapping = aes(x = quilate), binwidth = 0.5) ``` <img src="figuras/unnamed-chunk-3-1.svg" width="100%" style="display: block; margin: auto;" /> --- ## 7.3 Variación (4) ```r diamantes %>% dplyr::count(corte) #> # A tibble: 5 x 2 #> corte n #> * <ord> <int> #> 1 Regular 1610 #> 2 Bueno 4906 #> 3 Muy bueno 12082 #> 4 Premium 13791 #> 5 Ideal 21551 diamantes %>% dplyr::count(ggplot2::cut_width(quilate, 0.5)) #> # A tibble: 11 x 2 #> `cut_width(quilate, 0.5)` n #> * <fct> <int> #> 1 [-0.25,0.25] 785 #> 2 (0.25,0.75] 29498 #> 3 (0.75,1.25] 15977 #> 4 (1.25,1.75] 5313 #> 5 (1.75,2.25] 2002 #> 6 (2.25,2.75] 322 #> # … with 5 more rows ``` --- ## 7.3 Variación (5) ```r diamantes %>% filter(quilate < 3) %>% ggplot(mapping = aes(x = quilate, colour = corte)) + geom_freqpoly(binwidth = 0.1) ``` <img src="figuras/unnamed-chunk-5-1.svg" width="100%" style="display: block; margin: auto;" /> --- ## 7.3 Variación (6): Valores inusuales ```r ggplot(diamantes) + geom_histogram(mapping = aes(x = y), binwidth = 0.5) ``` <img src="figuras/unnamed-chunk-6-1.svg" width="100%" style="display: block; margin: auto;" /> --- ## 7.3 Variación (7): Valores inusuales ```r ggplot(diamantes) + geom_histogram(mapping = aes(x = y), binwidth = 0.5) + coord_cartesian(ylim = c(0, 50)) ``` <img src="figuras/unnamed-chunk-7-1.svg" width="100%" style="display: block; margin: auto;" /> --- ## 7.3 Variación (8): Valores inusuales ```r inusual <- diamantes %>% filter(y < 3 | y > 20) %>% select(precio, x, y, z) %>% arrange(y) inusual ## # A tibble: 9 x 4 ## precio x y z ## <int> <dbl> <dbl> <dbl> ## 1 5139 0 0 0 ## 2 6381 0 0 0 ## 3 12800 0 0 0 ## 4 15686 0 0 0 ## 5 18034 0 0 0 ## 6 2130 0 0 0 ## 7 2130 0 0 0 ## 8 2075 5.15 31.8 5.12 ## 9 12210 8.09 58.9 8.06 ``` <!-- --- --> <!-- ## 7.3 Variación (9): Valores inusuales --> <!-- --- --> <!-- ## 7.3 Variación (10): Valores inusuales --> <!-- --- --> <!-- ## 7.3 Variación (11): Valores inusuales --> <!-- --- --> <!-- ## 7.3 Variación (8): Valores inusuales --> --- ### 7.3.4 Ejercicios 1. Explora la distribución de cada una de las variables `x`, `y`, y `z`en el set de datos `diamantes`. ¿Qué aprendiste? Piensa en un diamante y cómo decidirías qué dimensiones corresponden a la longitud, ancho y profundidad. 2. Explora la distribución de `precio`. ¿Ves algo inusual o sorprendente? (Sugerencia: Piensa detenidamente en `binwidth` y asegúrate de usar un rango largo de valores.) 3. ¿Cuántos diamantes tienen 0.99 quilates? ¿Cuántos son de 1 quilate? ¿Qué piensas que puede ser la causa de dicha diferencia? 4. Compara y contrasta `coord_cartesian()` contra `xlim()` o `ylim()` en cuanto a acercar la imagen en un histograma. ¿Qué pasa si no modificas el valor de `binwidth`? ¿Qué pasa si intentas acercar la imagen de manera que solo aparezca la mitad de una barra? --- ## 7.4 Valores faltantes 1. Desechar observaciones (filas) con valores inusuales. ```r diamantes2 <- diamantes %>% filter(between(y, 3, 20)) ``` 2. Reemplazar valores inusuales con valores faltantes, `NA`. ```r diamantes2 <- diamantes %>% mutate(y = ifelse(y < 3 | y > 20, NA, y)) ``` --- ## 7.4 Valores faltantes (2) #### if-else si `<condición>` hago `X`, sino hago `Y` Ejemplos: ```r i <- 1:10 ifelse(i %% 2 == 0, "par", "impar") ## [1] "impar" "par" "impar" "par" "impar" "par" "impar" "par" "impar" ## [10] "par" ``` --- ## 7.4 Valores faltantes (3) ```r ggplot(data = diamantes2, mapping = aes(x = x, y = y)) + geom_point(na.rm = TRUE) ``` <img src="figuras/unnamed-chunk-12-1.svg" width="100%" style="display: block; margin: auto;" /> --- ## 7.4 Valores faltantes (4) ```r datos::vuelos %>% mutate( cancelados = is.na(horario_salida), hora_programada = salida_programada %/% 100, minuto_programado = salida_programada %% 100, salida_programada = hora_programada + minuto_programado / 60 ) %>% ggplot(mapping = aes(salida_programada)) + geom_freqpoly(mapping = aes(colour = cancelados), binwidth = 1/4) ``` <img src="figuras/unnamed-chunk-13-1.svg" width="100%" style="display: block; margin: auto;" /> --- ### 7.4.1 Ejercicios 1. ¿Qué sucede con los valores faltantes en un histograma? ¿Qué pasa con los valores faltantes en una gráfica de barras? ¿Cuál es la razón detrás de esta diferencia? 2. ¿Qué efecto tiene usar `na.rm = TRUE` en `mean()` (media) y `sum()` (suma)? --- ## 7.5 Covariación "... tendencia de los valores de dos o más variables a variar simultáneamente ..." .center[ ] .footnote[ Fuente: https://tinystats.github.io __Variación:__ dentro `X` __Covariación:__ entre `X`, `Y`, `...` ] --- ## 7.5 Covariación (2) #### Una variable categórica y una variable continua ```r ggplot(data = diamantes, mapping = aes(x = precio, y = ..density..)) + geom_freqpoly(mapping = aes(colour = corte), binwidth = 500) ``` <img src="figuras/unnamed-chunk-14-1.svg" width="100%" style="display: block; margin: auto;" /> --- ## 7.5 Covariación (3) ```r ggplot(data = diamantes, mapping = aes(x = corte, y = precio)) + geom_boxplot() ``` <img src="figuras/unnamed-chunk-15-1.svg" width="100%" style="display: block; margin: auto;" /> --- ## 7.5 Covariación (4) ```r ggplot(data = millas) + geom_boxplot(mapping = aes(x = reorder(clase, autopista, FUN = median), y = autopista)) + coord_flip() ``` <img src="figuras/unnamed-chunk-16-1.svg" width="100%" style="display: block; margin: auto;" /> --- ### 7.5.1.1 Ejercicios 1. Usa lo que has aprendido para mejorar la visualización de los tiempos de salida de los vuelos cancelados versus los no cancelados. 2. ¿Qué variable del conjunto de datos de diamantes es más importante para predecir el precio de un diamante? ¿Cómo está correlacionada esta variable con el corte? ¿Por qué la combinación de estas dos relaciones conlleva que los diamantes de menor calidad sean más costosos? 3. Instala el paquete __ggstance__, y crea un diagrama de caja horizontal. ¿Cómo se compara esto a usar `coord_flip()`? 4. Un problema con los diagramas de caja es que fueron desarrollados en un tiempo en que los set de datos eran más pequeños y por ende tienden a mostrar un número muy grande de “valores atípicos”. Una estrategia para remediar este problema es el diagrama __letter value__. Instala el paquete __lvplot__, e intenta usar `geom_lv()` para mostrar la distribución de precio vs corte. ¿Qué observas? ¿Cómo interpretas los gráficos? 5. Compara y contrasta `geom_violin()` con un `geom_histogram()` dividido en facetas, o un `geom_freqpoly()` codificado por colores. ¿Cuáles son las ventajas y desventajas de cada método? 6. Si tu set de datos es pequeño, a veces resulta útil usar `geom_jitter()` para ver la relación entre una variable continua y una categórica. El paquete `ggbeeswarm` provee de un número de métodos similares a `geom_jitter()`. Enlístalos y describe brevemente qué hace cada uno. --- ## 7.5 Covariación (5) #### Dos variables categóricas ```r ggplot(data = diamantes) + geom_count(mapping = aes(x = corte, y = color)) ``` <img src="figuras/unnamed-chunk-17-1.svg" width="100%" style="display: block; margin: auto;" /> --- ## 7.5 Covariación (6) ```r diamantes %>% count(color, corte) %>% ggplot(mapping = aes(x = color, y = corte)) + geom_tile(mapping = aes(fill = n)) ``` <img src="figuras/unnamed-chunk-18-1.svg" width="100%" style="display: block; margin: auto;" /> --- ### 7.5.2.1 Ejercicios 1. ¿Cómo podrías cambiar la escala del conjunto de datos anterior para mostrar de manera más clara la distribución del corte dentro del color, o del color dentro de la variable corte? 2. Usa `geom_tile()` junto con _dplyr_ para explorar la variación del retraso promedio de los vuelos en relación al destino y mes del año. ¿Qué hace que este gráfico sea difícil de leer? ¿Cómo podrías mejorarlo? 3. ¿Por qué es un poco mejor usar `aes(x = color, y = corte)` en lugar de `aes(x = corte, y = color)` en el ejemplo anterior? --- ## 7.5 Covariación (7) #### Dos variables continuas ```r ggplot(data = diamantes) + geom_point(mapping = aes(x = quilate, y = precio), alpha = 1 / 100) ``` <img src="figuras/unnamed-chunk-19-1.svg" width="100%" style="display: block; margin: auto;" /> --- ## 7.5 Covariación (8) ```r # install.packages("hexbin") ggplot(data = diamantes) + geom_hex(mapping = aes(x = quilate, y = precio)) ``` <img src="figuras/unnamed-chunk-20-1.svg" width="100%" style="display: block; margin: auto;" /> --- ## 7.5 Covariación (9) ```r ggplot(data = diamantes, mapping = aes(x = quilate, y = precio)) + geom_boxplot(mapping = aes(group = cut_width(quilate, 0.1))) ``` <img src="figuras/unnamed-chunk-21-1.svg" width="100%" style="display: block; margin: auto;" /> --- ### 7.5.3.1 Ejercicios 1. En lugar de resumir la distribución condicional con un diagrama de caja, podrías usar un polígono de frecuencia. ¿Qué deberías considerar cuando usas `cut_width()` en comparación con `cut_number()`? ¿Qué impacto tiene este parámetro en la visualización bidimensional de `quilate` y `precio`? 2. Visualiza la distribución de `quilate`, segmentada según la variable `precio`. 3. ¿Cómo es la distribución del precio de diamantes muy grandes en comparación con aquella de diamantes más pequeños? ¿Es como esperabas, o te resulta sorprendente? 4. Combina dos de las técnicas que has aprendido para visualizar la distribución combinada de las variables `corte`, `quilate` y `precio`. 5. Los gráficos bidimensionales revelan observaciones atípicas que podrían no ser visibles en gráficos unidimensionales. Por ejemplo, algunos puntos en la gráfica a continuación tienen una combinación inusual de valores `x` y `y`, que hace que algunos puntos sean valores atípicos aún cuando sus valores x e y parecen normales cuando son examinados de manera individual. ```r ggplot(data = diamantes) + geom_point(mapping = aes(x = x, y = y)) + coord_cartesian(xlim = c(4, 11), ylim = c(4, 11)) ``` ¿Por qué es mejor usar un diagrama de dispersión que un diagrama basado en rangos en este caso? <!-- --- --> <!-- ## 7.5 Covariación (10) --> <!-- --- --> <!-- ## 7.5 Covariación (11) --> --- ## 7.6 Patrones y modelos - ¿Este patrón podría ser mera coincidencia? - ¿Cómo podrías describir la relación sugerida por este patrón? - ¿Qué tan fuerte es la relación sugerida por este patrón? - ¿Qué otras variables podrían afectar la relación? - ¿Cambia esta relación si examinas de manera individual distintos subgrupos de datos? .center[  ] .footnote[Fuente: https://images.assetsdelivery.com] --- ## 7.6 Patrones y modelos (2) ```r ggplot(data = faithful) + geom_point(mapping = aes(x = eruptions, y = waiting)) ``` <img src="figuras/unnamed-chunk-23-1.svg" width="100%" style="display: block; margin: auto;" /> <!-- --- --> <!-- ## 7.6 Patrones y modelos (3) --> <!-- --- --> <!-- ## 7.6 Patrones y modelos (4) --> <!-- --- --> <!-- ## 7.6 Patrones y modelos (5) --> <!-- --- --> <!-- ## 7.6 Patrones y modelos (6) --> --- ## 7.7 Argumentos en ggplot2 Forma explícita: ```r ggplot(data = faithful, mapping = aes(x = eruptions)) + geom_freqpoly(binwidth = 0.25) ``` Forma "reducida": ```r ggplot(faithful, aes(eruptions)) + geom_freqpoly(binwidth = 0.25) ``` Manipulación y graficación: ```r diamantes %>% count(corte, claridad) %>% ggplot(aes(claridad, corte, fill = n)) + geom_tile() ``` <!-- --- --> <!-- ## 7.8 Aprendiendo más --> --- class: center, inverse, middle # ¿Preguntas?