class: center, middle, titular background-size: contain <img src="img/see_azul.jpeg" width="300px"/> # Capítulo 4: Análisis Exploratorio de Datos ## **PROGRAMA INTERNACIONAL DE ESTADÍSTICA APLICADA A LA INVESTIGACIÓN CIENTÍFICA** #### MÓDULO: MANEJO DE SOFTWARE <br> <br> Linda Cabrera Orellana #### Octubre, 2022 --- class: middle, center
# **ANÁLISIS EXPLORATORIO DE DATOS** ## CAPÍTULO 4 --- #
Contenido del Capítulo 4 - Creación de gráficos con `ggplot2` * ¿Qué es la visualización de datos? * Gramática de los gráficos * Data * Estética * Geometrías * Facetas * Práctica 4.1 * Más Estética * Práctica 4.2 * Transformaciones Estadísticas * Coordenadas y Escalas * Temas visuales * Práctica 4.3 --- #
Proceso del *tidyverse* <img src="img/tidyverse.png" width="100%" style="display: block; margin: auto;" /> --- #
Paquetes a utilizar .pull-left[ *
library(tidyverse) *
`library(ggplot2)` *
`library(tidyr)` ] .pull-right[ *
library(magrittr) *
library(datos) ] --- class: middle, center, inverse <img src="img/ggplot2.png" width="150px"> # Creación de gráficos con `ggplot2` --- class: middle, center # ¿Qué es la visualización de datos? ### La visualización de datos es una habilidad esencial para trabajar con datos, es una combinación de comprensión estadística y principios de diseño, así, la visualización de datos se trata de análisis de gráficos de datos y comunicación y percepción. --- background-image: url("img/ggplot2_grammar.png") background-size: contain --- #
Gramática de los gráficos - **Data:** datos sin procesar que desea trazar. - **Geometrías `geom_:`** formas geométricas que representarán los datos. - **Estética `aes()`:** estética de los objetos geométricos y estadísticos, como posición, color, tamaño, forma y transparencia. - **Escalas `scale_`:** asignaciones entre los datos y las dimensiones estéticas, como el rango de datos para trazar el ancho o los valores de los factores para los colores. - **Transformaciones estadísticas `stat_`:** resúmenes estadísticos de los datos, como cuantiles, curvas ajustadas y sumas. - **Sistema de coordenadas `coord_`:** transformación utilizada para mapear coordenadas de datos en el plano del rectángulo de datos. - **Facetas `facet_`:** disposición de los datos en una cuadrícula de gráficos. - **Temas visuales `theme()`:** los valores predeterminados visuales generales de una trama, como el fondo, las cuadrículas, los ejes, el tipo de letra predeterminado, los tamaños y los colores. .footnote[ [Referencias de ggplot2](https://ggplot2.tidyverse.org/reference/) | [ggplot2.tidyverse.org](https://ggplot2.tidyverse.org/) ] --- #
Data .pull-left[ Un **ggplot** necesita especificar mínimo tres cosas: los datos, la estética y una geometría. Siempre comenzamos a definir un objeto de trazado llamando a la **data** mediante `data %>% ggplot()` que simplemente le dice a `ggplot2` que vamos a trabajar con esos datos. ] .pull-right[ .panelset[ .panel[.panel-name[Código] Primero, cargamos el paquete `ggplot2` que es parte del `tidyverse`. ```r library(ggplot2) ``` ```r profesores2 %>% ggplot() ``` ] .panel[.panel-name[Gráfico] ![](4_Analisis_exploratorio_files/figure-html/graf3-1.png)<!-- --> ]] ] --- #
Data El paquete `datos` contiene algunos datasets que podemos consultarlos con `library(help = "datos")`. Usaremos los siguientes para realizar ejercicios: - **diamantes**: Precio de 50.000 diamantes - **paises**: Datos de [Gapminder](http://www.aomatos.com/2013/01/gapminder-para-una-vision-del-mundo-basada-en-hechos/), población, esperanza de vida y PIB per capita - **presidencial**: Periodos de 11 presidentes, desde Eisenhower a Obama - **millas**: Datos de economía de combustible de 1999 y 2008 para 38 modelos populares de automóviles - **economics**: del paquete `datasets` contiene series de tiempo de la economía de USA. --- #
Estética **Aesthetics** significa describir un objeto en nuestros gráficos. Sin estética no tenemos nada que mostrar en nuestros gráficos. Las variables del conjunto de datos se asignan a propiedades visuales de gráficos con **aesthetics mapping**. Depende del tipo de gráfico estadístico que estemos produciendo, pero generalmente mapeamos: * una variable que se mostrará en el eje `\(x\)` * una variable que se mostrará en el eje `\(y\)` (en algunos casos solo necesitamos mapear a un solo eje) * se pueden asignar otras variables al color, la forma, el tamaño, el color de relleno, etc. del objeto. --- background-image: url("img/aesthetics.png") background-size: contain --- #
Estética .pull-left[ En la mayoría de los casos, es posible que desee trazar una o dos variables: una en el eje `\(x\)` y otra en el eje `\(y\)`. Estas son estéticas posicionales y, por lo tanto, agregamos `aes(x = var1, y = var2)` a la llamada **ggplot()**. Sin embargo, también hay casos en los que hay que especificar una o incluso tres o más variables. ] .pull-right[ .panelset[ .panel[.panel-name[Código] ```r profesores2 %>% ggplot(aes(edad)) ``` ] .panel[.panel-name[Gráfico] ![](4_Analisis_exploratorio_files/figure-html/graf5-1.png)<!-- --> ]] ] --- #
Geometrías .pull-left[ Hay muchas geometrías diferentes (llamadas **geoms** porque cada función generalmente comienza con `geom_`) que se pueden agregar a un ggplot de forma predeterminada. Tenemos que decirle a `ggplot2` qué estilo queremos usar, por ejemplo, agregando geom_bar() para crear un diagrama de barras. ] .pull-right[ .panelset[ .panel[.panel-name[Código] ```r profesores2 %>% ggplot(aes(edad)) + geom_bar() ``` ] .panel[.panel-name[Gráfico] ![](4_Analisis_exploratorio_files/figure-html/graf7-1.png)<!-- --> ]] ] --- background-image: url("img/geoms.png") background-size: contain --- #
Facetas Las facetas dividen un conjunto en subconjuntos basados en los valores de uno o más variables categóricas. * **Facet** es un objeto que crea muchos gráficos pequeños que son variaciones de un solo gráfico. * Los datos se dividen en **grupos** (facetas) y los datos se trazan en sus propios gráficos usando el mismo sistema de coordenadas. * Tenemos dos opciones al generar facetas: * Gráfico dividido según filas y columnas: `facet_grid()` * Envolver subconjuntos en columnas: `facet_wrap()` --- background-image: url("img/facet.png") background-size: contain --- .panelset[ .panel[.panel-name[facet_grid1] .pull-left[ ```r profesores2 %>% ggplot(aes(edad)) + geom_bar() + facet_grid(.~niveldocencia) ``` ] .pull-right[ ![](4_Analisis_exploratorio_files/figure-html/fc2-1.png)<!-- --> ] ] .panel[.panel-name[facet_grid2] .pull-left[ ```r profesores2 %>% ggplot(aes(edad)) + geom_bar() + facet_grid(niveldocencia~.) ``` ] .pull-right[ ![](4_Analisis_exploratorio_files/figure-html/fc4-1.png)<!-- --> ] ] .panel[.panel-name[facet_grid3] .pull-left[ ```r profesores2 %>% ggplot(aes(edad)) + geom_bar() + facet_grid(niveldocencia~tiempo) ``` ] .pull-right[ ![](4_Analisis_exploratorio_files/figure-html/fc6-1.png)<!-- --> ] ] .panel[.panel-name[facet_wrap] .pull-left[ ```r profesores2 %>% ggplot(aes(edad)) + geom_bar() + facet_wrap(~niveldocencia) ``` ] .pull-right[ ![](4_Analisis_exploratorio_files/figure-html/fc8-1.png)<!-- --> ] ] ] --- background-color: var(--azul-claro) class: middle, center, inverse
## PRÁCTICA 4.1 --- #
Práctica 4.1 1. Observe el dataset [millas](https://www.rdocumentation.org/packages/datos/versions/0.5.0/topics/millas) y recrea el código R necesario para generar los siguientes gráficos: .pull-left[ ![](4_Analisis_exploratorio_files/figure-html/p1-1.png)<!-- --> ] .pull-right[ ![](4_Analisis_exploratorio_files/figure-html/p2-1.png)<!-- --> ] --- #
Más Estética .pull-left[ Los gráficos pueden tener más de una **geometría**, en este caso tienen un gráfico de puntos y de forma superpuesta un gráfico de líneas suavizadas. ```r millas %>% ggplot(aes(x = cilindrada, y = autopista)) + geom_point() + geom_smooth() ``` ] .pull-right[ ![](4_Analisis_exploratorio_files/figure-html/me2-1.png)<!-- --> ] --- #
Más Estética .pull-left[ Podemos visualizar más variables en las geometrías, agregando atributos **aesthetics** en la geometría. ```r millas %>% ggplot(aes(x = cilindrada, y = autopista)) + geom_point(aes(color = clase, shape = traccion)) + geom_smooth() ``` ] .pull-right[ ![](4_Analisis_exploratorio_files/figure-html/me4-1.png)<!-- --> ] --- #
Más Estética .pull-left[ Podemos transformar los datos de una de las geometrías para visualizar observaciones o variables que queremos. ```r millas %>% ggplot(aes(x = cilindrada, y = autopista)) + geom_point(aes(color = clase, shape = traccion)) + geom_smooth(data = filter(millas, fabricante == "toyota")) ``` ] .pull-right[ ![](4_Analisis_exploratorio_files/figure-html/me6-1.png)<!-- --> ] --- background-color: var(--azul-claro) class: middle, center, inverse
## PRÁCTICA 4.2 --- #
Práctica 4.2 1. Recrea el código R necesario para generar el siguiente gráfico ![](4_Analisis_exploratorio_files/figure-html/p3-1.png)<!-- --> --- #
Transformaciones estadísticas **Stats** son métodos que alteran la posición de las geometrías. Podemos representar más de una estadística en una figura. La capa de **Stats** representa una forma alternativa de crear una capa, ya que es una transformación del conjunto de datos original. Con las estadísticas, creamos variables adicionales (transformadas) para mapear la estética. Los métodos estadísticos más importantes disponibles para los gráficos se dividen en cinco clases: * **bin** (particiones y mallas - para histogramas) * **summary** (estadísticas básicas: media, mediana, desviación, …) * **region** (límites de intervalo y región) * **smooth** (regresión, smoothing, interpolación y estimación de densidad) * **link** (métodos para calcular bordes de gráficos basados en un conjunto de nodos o puntos) --- #
Transformaciones estadísticas Hay docenas de capas de **Stats** especificadas con un `stat_function`. La mayoría de los geoms y las estadísticas vienen en pares que casi siempre se usan en conjunto. La siguiente tabla contienen los pares entre geometrías y estadísticos que se usan en conjunto. .pull-left[ | geometría | estadístico | |---------------------|---------------------| | `geom_bar()` | `stat_count()` | | `geom_point()` | `stat_identity()`, `stat_sum()` | | `geom_line()` | `stat_identity()` | | `geom_bin2d()` | `stat_bin_2d()` | | `geom_boxplot()` | `stat_boxplot()` | | `geom_contour()` | `stat_contour()` | | `geom_count()` | `stat_sum()` | | `geom_density()` | `stat_density()` | | `geom_density_2d()` | `stat_density_2d()` | ] .pull-right[ | geometría | estadístico | |---------------------|---------------------| | `geom_hex()` | `stat_hex()` | | `geom_freqpoly()` | `stat_bin()` | | `geom_histogram()` | `stat_bin()` | | `geom_qq_line()` | `stat_qq_line()` | | `geom_qq()` | `stat_qq()` | | `geom_quantile()` | `stat_quantile()` | | `geom_smooth()` | `stat_smooth()` | | `geom_violin()` | `stat_violin()` | | `geom_sf()` | `stat_sf()` | ] --- .pull-left[ #
Transformaciones estadísticas Crearemos un subconjunto de datos para mostrar las diferencias entre gráficos que muestran datos tal como lucen y gráficos que muestran datos transformados. Escogeremos las observaciones del dataset `diamantes` que sean de corte "Bueno" y de color "D" (mejor). ```r buenosD <- diamantes %>% filter(corte=="Bueno" & color=="D") ``` Graficamos un `geom_point()`, `geom_line()` y `geom_smooth()` con nuestros datos `buenosD` ] .pull-right[ .panelset[ .panel[.panel-name[Código] ```r buenosD %>% ggplot(aes(x=quilate, y=precio)) + geom_point() + geom_line() + geom_smooth() ``` ] .panel[.panel-name[Gráfico] ![](4_Analisis_exploratorio_files/figure-html/te10-1.png)<!-- --> ] ] ] --- .pull-left[ #
Transformaciones estadísticas Cada `geom_` tiene por default un `stat` (pag.28), argumento que me sirve para convertir un gráfico que muestra datos como son a un gráfico de datos transformados. ```r ## Gráfico 1: geom_ buenosD %>% ggplot(aes(x=quilate, y=precio)) + geom_point() ## Gráfico 2: stat1 buenosD %>% ggplot(aes(x=quilate, y=precio)) + geom_point(stat = "identity") ## Gráfico 3: stat2 buenosD %>% ggplot(aes(x=quilate, y=precio)) + geom_point(stat = "smooth") ## Gráfico 4: stat3 buenosD %>% ggplot(aes(x=quilate, y=precio)) + geom_smooth(stat = "identity") ``` ] .pull-right[ .panelset[ .panel[.panel-name[geom_] ![](4_Analisis_exploratorio_files/figure-html/te12-1.png)<!-- --> ] .panel[.panel-name[stat1] ![](4_Analisis_exploratorio_files/figure-html/te13-1.png)<!-- --> ] .panel[.panel-name[stat2] ![](4_Analisis_exploratorio_files/figure-html/te14-1.png)<!-- --> ] .panel[.panel-name[stat3] ![](4_Analisis_exploratorio_files/figure-html/te15-1.png)<!-- --> ] ] ] --- .pull-left[ #
Transformaciones estadísticas También cada `stat` tiene por default un `geom_`, por ejemplo en el gráfico de barras (gráfico de transformación): ```r ## Gráfico de barras usando geom_bar() buenosD %>% ggplot(aes(x = claridad)) + geom_bar() ## Gráfico de barras usando stat_count() buenosD %>% ggplot(aes(x = claridad)) + stat_count() ## Gráfico de barras de proporción buenosD %>% ggplot(aes(x = claridad, y=stat(prop), group=1)) + stat_count() ``` ] .pull-right[ .panelset[ .panel[.panel-name[geom_] ![](4_Analisis_exploratorio_files/figure-html/te2-1.png)<!-- --> ] .panel[.panel-name[stat_] ![](4_Analisis_exploratorio_files/figure-html/te3-1.png)<!-- --> ] .panel[.panel-name[proporción] ![](4_Analisis_exploratorio_files/figure-html/te4-1.png)<!-- --> ] ] ] --- .pull-left[ #
Transformaciones estadísticas Puedes usar `stat_summary()` para resumir los valores de `\(y\)` para cada valor único de `\(x\)`, para así resaltar el resumen que se está computando: ```r buenosD %>% ggplot(aes(x = claridad, y = precio)) + geom_point(alpha=0.3, color="turquoise4") + stat_summary(fun.min = min, fun.max = max, fun=median, size=0.8, color="salmon") ``` ] .pull-right[ ![](4_Analisis_exploratorio_files/figure-html/te7-1.png)<!-- --> ] --- .pull-left[ #
Transformaciones estadísticas Graficaremos un histograma de frecuencias y un polígono de frecuencias con `geom_histogram()` y `geom_frefreqpoly()` ```r buenosD %>% ggplot(aes(x=precio)) + geom_histogram(aes(y=stat(count)), binwidth = 3000, color="ivory", fill="thistle3") + geom_freqpoly(aes(y=stat(count)), binwidth = 3000, color="purple", size =1) + geom_text(stat = "bin", binwidth= 3000, aes(label=stat(round(count,2)), y=stat(count)), nudge_y = 5) ``` ] .pull-right[ ![](4_Analisis_exploratorio_files/figure-html/te16-1.png)<!-- --> ] --- #
Coordenadas y Escalas Son conjuntos que ubican puntos en el espacio. Generalmente, vemos las coordenadas como esquemas para mapear elementos de conjuntos para objetos geométricos. Las coordenadas más conocidas son las **coordenadas cartesianas**, donde el punto es ubicado en un plano cartesiano por su distancia a dos rectas que se cortan. Hay diferentes **sistemas de coordenadas**. ¿Por qué usar diferentes sistemas? Una razón es simplificar la visualización de gráficos. Las transformaciones de coordenadas pueden cambiar algunos gráficos curvilíneos a lineales. ggplot2 proporciona diferentes sistemas de coordenadas. --- background-image: url("img/coordinate.png") background-size: contain --- #
Coordenadas y Escalas .panelset[ .panel[.panel-name[coord_flip] .pull-left[ ```r diamantes %>% ggplot(aes(x = corte, y = precio)) + geom_boxplot() ``` ![](4_Analisis_exploratorio_files/figure-html/ce1-1.png)<!-- --> ] .pull-right[ ```r diamantes %>% ggplot(aes(x = corte, y = precio)) + geom_boxplot() + coord_flip() ``` ![](4_Analisis_exploratorio_files/figure-html/ce2-1.png)<!-- --> ] ] .panel[.panel-name[coord_polar] .pull-left[ ```r diamantes %>% ggplot(aes(x = corte)) + geom_bar() + coord_flip() ``` ![](4_Analisis_exploratorio_files/figure-html/ce3-1.png)<!-- --> ] .pull-right[ ```r diamantes %>% ggplot(aes(x = corte)) + geom_bar() + coord_polar() ``` ![](4_Analisis_exploratorio_files/figure-html/ce4-1.png)<!-- --> ] ]] <!--- #
Coordenadas y Escalas ## Escalas Las **escalas** controlan los detalles de cómo los valores de los datos se traducen en propiedades visuales. Podemos anular las escalas predeterminadas para ajustar detalles como etiquetas de eje o claves de leyenda, o usar una traducción completamente diferente de datos a estética. En general, podemos usar escalas para: * modificar etiquetas de ejes, leyendas y gráficos, * escalas de uso general, * escalas de ubicación, * escalas de color y relleno, * escalas de forma, * escalas de tamaño, entre otras... #
Coordenadas y Escalas ## Escalas Uso con cualquier estética `aes()`: * alpha, color * fill * linetype * shape, size **scale_\*_continous()** asigna valores continuos a valores visuales **scale_\*_discrete()** asigna valores discretos a valores visuales #
Coordenadas y Escalas --> --- #
Temas visuales El tema se usa para controlar todos los elementos que no son datos en la trama. **ggplot2** proporciona valores predeterminados para la capa del tema (puede dejarlo como está). Puede anular el tema predeterminado, por ejemplo, con: - **theme_bw()** tema en blanco y negro - **theme()** función para ajustar la configuración de temas individuales - **element_** crea funciones para modificar la configuración del tema .pull-left[ Temas completos: `theme_grey()` `theme_bw()` `theme_light()` `theme_dark()` `theme_classic()` `theme_void()` ] .pull-right[ Elementos de un tema: `margin()` `element_blank()` `element_rect()` `element_line()` `element_text()` ... ] --- background-image: url("img/theme.png") background-size: contain --- .pull-left[ <img src="4_Analisis_exploratorio_files/figure-html/tv1-1.png" width="100%" style="display: block; margin: auto;" /> ] .pull-right[ ```r diamantes %>% ggplot(aes(x = corte, fill=corte)) + geom_bar(alpha=0.8) + scale_fill_brewer(palette = "Dark2") + geom_text(aes(label=..count..), stat = 'count', vjust=-0.5) + theme_minimal() + theme(legend.position = "bottom") + labs(x = "Corte del diamante", y = "Cantidad de diamantes", title = "La cantidad de diamantes por tipo de corte", subtitle = "Mayor cantidad de diamantes de corte ideal", caption = "Datos de R.com", fill = "Tipo de corte") ``` ] --- background-color: var(--azul-claro) class: middle, center, inverse
## PRÁCTICA 4.3 --- #
Práctica 4.3 1. Construir un gráfico de acuerdo a la gramática de los gráficos de `ggplot2`. 2. Guarda el gráfico en tu computadora en un archivo de extensión `.png`. --- #
Algunos sitios de interés * [Códigos visualizaciones desafío #30díasdegráficos](https://github.com/sporella/nightingale) * [#30DayMapChallenge](https://github.com/sporella/30daymap) * [Gráficos Estadísticos con R](https://cran.r-project.org/doc/contrib/grafi3.pdf) * [Gráficos avanzados con ggplot](https://rua.ua.es/dspace/bitstream/10045/69767/1/Modulo_4_-_Graficos_avanzados_con_ggplot2.pdf) --- class: middle, center, inverse <br> <br> # **¡FIN!** ## Análisis Exploratorio de Datos ### Síguenos .pull-left[ .center[ ### [@socecuest
](https://www.facebook.com/socecuest) ### [@see_estadistica
](https://www.instagram.com/see_estadistica/) ]] .pull-right[ .center[ ### [@see_estadistica
](https://twitter.com/see_estadistica) ### [@sosecuest
](https://t.me/sosecuest) ]]