class: center, middle, titular background-size: contain <img style="border-radius: 50%;" src="img/masapp.jpg" width="250px"/> # Capítulo 4: Análisis Exploratorio de Datos ## **CAPACITACIÓN** #### LINDA CABRERA ORELLANA<br>FERNANDA JURADO MANTILLA #### Noviembre, 2022 --- # Contenido del Capítulo 4 .pull-left[ - Creación de gráficos con `ggplot2` * Gramática de los gráficos * Data * Estética * Geometrías * Facetas * Práctica 4.1 * Más Estética * Transformaciones Estadísticas * Coordenadas y Escalas * Temas visuales ] .pull-right[ - Análisis exploratorio de datos * Variables numéricas * Variables categóricas * Varias variables numéricas * Variables numéricas con una categórica - Gráficos dinámicos con `plotly` ] --- ## Paquetes a utilizar *
`library(tidyverse)` *
`library(readr)` *
`library(dplyr)` *
`library(ggplot2)` *
`library(magrittr)` *
`library(plotly)` --- class: middle, center, inverse
# Creación de gráficos con `ggplot2` --- background-image: url("img/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. <br> <br> <br> <br> .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. Primero, cargamos el paquete `ggplot2` que es parte del `tidyverse`. ```r library(ggplot2) ``` ```r ventas %>% ggplot() ``` ] .pull-right[ ![](4_EDA_files/figure-html/graf3-1.png)<!-- --> ] --- ## 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. ```r ventas %>% ggplot(aes(x=TOTAL_VENTAS, y=TOTAL_COMPRAS)) ``` ] .pull-right[ ![](4_EDA_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_point()` para crear un gráfico de puntos o gráfico de dispersión. ```r ventas %>% ggplot(aes(x=TOTAL_VENTAS, y=TOTAL_COMPRAS)) + geom_point() ``` ] .pull-right[ ![](4_EDA_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 ventas %>% filter(mes=="Ene" | mes=="Feb" | mes=="Mar" | mes=="Abr") %>% ggplot(aes(x=TOTAL_VENTAS, y=TOTAL_COMPRAS)) + geom_point() + facet_grid(.~mes) ``` ] .pull-right[ ![](4_EDA_files/figure-html/fc2-1.png)<!-- --> ] ] .panel[.panel-name[facet_grid2] .pull-left[ ```r ventas %>% filter(mes=="Ene" | mes=="Feb" | mes=="Mar" | mes=="Abr") %>% ggplot(aes(x=TOTAL_VENTAS, y=TOTAL_COMPRAS)) + geom_point() + facet_grid(mes~.) ``` ] .pull-right[ ![](4_EDA_files/figure-html/fc4-1.png)<!-- --> ] ] .panel[.panel-name[facet_grid3] .pull-left[ ```r ventas %>% filter((mes=="Ene" | mes=="Feb" | mes=="Mar" | =="Abr") & (provincia=="PICHINCHA" | provincia=="GUAYAS" | provincia=="AZUAY")) %>% ggplot(aes(x=TOTAL_VENTAS, y=TOTAL_COMPRAS)) + geom_point() + facet_grid(provincia~mes) ``` ] .pull-right[ ![](4_EDA_files/figure-html/fc6-1.png)<!-- --> ] ] .panel[.panel-name[facet_wrap] .pull-left[ ```r ventas %>% filter(mes=="Ene" | mes=="Feb" | mes=="Mar" | mes=="Abr") %>% ggplot(aes(x=TOTAL_VENTAS, y=TOTAL_COMPRAS)) + geom_point() + facet_wrap(~mes) ``` ] .pull-right[ ![](4_EDA_files/figure-html/fc8-1.png)<!-- --> ] ] ] --- background-color: var(--azul-claro) class: middle, center, inverse
## PRÁCTICA 4.1 --- #
Práctica 4.1 1. Recrea el código R necesario para generar los siguientes gráficos: .pull-left[ ![](4_EDA_files/figure-html/p1-1.png)<!-- --> ] .pull-right[ ![](4_EDA_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 ventas %>% filter((mes=="Ene" | mes=="Feb" | mes=="Mar" | mes=="Abr") & (provincia=="PICHINCHA" | provincia=="GUAYAS" | provincia=="AZUAY")) %>% ggplot(aes(x = TOTAL_VENTAS, y = TOTAL_COMPRAS)) + geom_point() + geom_smooth() ``` ] .pull-right[ ![](4_EDA_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 ventas %>% filter((mes=="Ene" | mes=="Feb" | mes=="Mar" | mes=="Abr") & (provincia=="PICHINCHA" | provincia=="GUAYAS" | provincia=="AZUAY")) %>% ggplot(aes(x = TOTAL_VENTAS, y = TOTAL_COMPRAS)) + geom_point(aes(color = provincia, shape = mes)) + geom_smooth() ``` ] .pull-right[ ![](4_EDA_files/figure-html/me4-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 contiene 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()` | ] --- ## Transformaciones estadísticas .pull-left[ Mostraremos las diferencias entre gráficos que muestran datos tal como lucen y gráficos que muestran datos transformados (statistics layer). Analizaremos la información del cantón ESMERALDAS: ```r esmeraldas <- ventas %>% filter(canton=="ESMERALDAS") ``` Graficamos un `geom_point()`, `geom_line()` y `geom_smooth()` con nuestros datos `buenosD` ```r esmeraldas %>% ggplot(aes(x=TOTAL_COMPRAS, y=TOTAL_VENTAS)) + geom_point() + geom_line() + geom_smooth() ``` ] .pull-right[ ![](4_EDA_files/figure-html/te10-1.png)<!-- --> ] --- ## Transformaciones estadísticas: `geom_point()` .pull-left[ Cada `geom_` tiene por default un `stat` (pag.21), argumento que me sirve para convertir un gráfico que muestra datos como son a un gráfico de datos transformados. Graficando sólo un gráfico de puntos: ```r esmeraldas %>% ggplot(aes(x=TOTAL_COMPRAS, y=TOTAL_VENTAS)) + geom_point() ``` ] .pull-right[ ![](4_EDA_files/figure-html/te12-1.png)<!-- --> ] --- ## Transformaciones estadísticas: `geom_point(stat = "identity")` .pull-left[ Graficando un gráfico de puntos transformado con "identity": ```r esmeraldas %>% ggplot(aes(x=TOTAL_COMPRAS, y=TOTAL_VENTAS)) + geom_point(stat = "identity") ``` **¡NO HAY DIFERENCIA!** ] .pull-right[ ![](4_EDA_files/figure-html/te14-1.png)<!-- --> ] --- ## Transformaciones estadísticas: `geom_point(stat = "smooth")` .pull-left[ Graficando un gráfico de puntos transformado con "smooth": ```r esmeraldas %>% ggplot(aes(x=TOTAL_COMPRAS, y=TOTAL_VENTAS)) + geom_point(stat = "smooth") ``` Ahora si hay diferencia, los puntos toman la forma de un `geom_smooth()` o líneas suavizadas. ] .pull-right[ ![](4_EDA_files/figure-html/te16-1.png)<!-- --> ] --- ## Transformaciones estadísticas: `geom_smooth(stat = "identity")` .pull-left[ Graficando un gráfico smooth (lineas suavizadas) transformado con "identity": ```r esmeraldas %>% ggplot(aes(x=TOTAL_COMPRAS, y=TOTAL_VENTAS)) + geom_smooth(stat = "identity") ``` Aunque `geom_smooth()` suaviza las líneas, el argumento `stat = "identity"` forza a que la línea siga los datos como son. ] .pull-right[ ![](4_EDA_files/figure-html/te18-1.png)<!-- --> ] --- ## Transformaciones estadísticas: `geom_bar()` .pull-left[ 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() ## transacciones EXPORTACIONES ## mayores a 5'000,000 ventas %>% filter(EXPORTACIONES>5000000) %>% ggplot(aes(x = provincia)) + geom_bar() ``` ] .pull-right[ ![](4_EDA_files/figure-html/te2-1.png)<!-- --> ] --- ## Transformaciones estadísticas: `stat_count()` .pull-left[ Podemos hacer el mismo gráfico anterior que usamos `geom_bar()` pero usando `stat_count()`: ```r ## Gráfico de barras usando geom_bar() ## transacciones EXPORTACIONES ## mayores a 5'000,000 ventas %>% filter(EXPORTACIONES>5000000) %>% ggplot(aes(x = provincia)) + stat_count() ``` ] .pull-right[ ![](4_EDA_files/figure-html/te4-1.png)<!-- --> ] --- ## Transformaciones estadísticas: `stat_count()` .pull-left[ Podemos hacer un gráfico de barras en proporciones con `stat_count()`: ```r ## Muestra un gráfico de barras de proporciones, ## en lugar de un recuento ## especificar en el eje y = stat(prop) y group=1 ventas %>% filter(EXPORTACIONES>5000000) %>% ggplot(aes(x = provincia, y = stat(prop), group = 1)) + stat_count() ``` ] .pull-right[ ![](4_EDA_files/figure-html/te6-1.png)<!-- --> ] --- ## Transformaciones estadísticas: `stat_summary()` .pull-left[ 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 ventas %>% filter(EXPORTACIONES>5000000) %>% ggplot(aes(x = provincia, y = TOTAL_VENTAS)) + geom_jitter(alpha=0.5, size=3, color="orchid4") + stat_summary(fun.min = min, fun.max = max, fun=median, size=1, color="rosybrown2") ``` ] .pull-right[ ![](4_EDA_files/figure-html/te19-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 ventas %>% filter(EXPORTACIONES>5000000) %>% ggplot(aes(x = provincia, y = TOTAL_VENTAS)) + geom_boxplot() ``` ![](4_EDA_files/figure-html/ce1-1.png)<!-- --> ] .pull-right[ ```r ventas %>% filter(EXPORTACIONES>5000000) %>% ggplot(aes(x = provincia, y = TOTAL_VENTAS)) + geom_boxplot() + coord_flip() ``` ![](4_EDA_files/figure-html/ce2-1.png)<!-- --> ] ] .panel[.panel-name[coord_polar] .pull-left[ ```r ventas %>% filter(EXPORTACIONES>5000000) %>% ggplot(aes(x = provincia)) + geom_bar() ``` ![](4_EDA_files/figure-html/ce3-1.png)<!-- --> ] .pull-right[ ```r ventas %>% filter(EXPORTACIONES>5000000) %>% ggplot(aes(x = provincia)) + geom_bar() + coord_polar() ``` ![](4_EDA_files/figure-html/ce4-1.png)<!-- --> ] ]] --- ## 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 --- background-image: url("img/grafico1.png") background-size: contain --- ## Temas: predeterminados .pull-left[ ```r ventas %>% filter(EXPORTACIONES>5000000) %>% ggplot(aes(x=TOTAL_COMPRAS, y=TOTAL_VENTAS)) + geom_point() + theme_classic() ``` ] .pull-right[ ![](4_EDA_files/figure-html/tv2-1.png)<!-- --> ] --- ## Temas: colores .panelset[ .panel[.panel-name[Código] ```r ventas %>% filter(EXPORTACIONES>5000000) %>% ggplot(aes(x=TOTAL_COMPRAS, y=TOTAL_VENTAS, color = provincia)) + geom_point() + theme_classic() ``` ] .panel[.panel-name[Gráfico] ![](4_EDA_files/figure-html/tv4-1.png)<!-- --> ] ] --- ## Temas: colores .panelset[ .panel[.panel-name[Código] ```r library(RColorBrewer) ventas %>% filter(EXPORTACIONES>5000000) %>% ggplot(aes(x=TOTAL_COMPRAS, y=TOTAL_VENTAS, color = provincia)) + geom_point() + scale_color_brewer(palette = "Paired") ``` ] .panel[.panel-name[Gráfico] ![](4_EDA_files/figure-html/tv6-1.png)<!-- --> ] ] --- ## Temas: etiquetas .panelset[ .panel[.panel-name[Código] ```r ventas %>% filter(EXPORTACIONES>5000000) %>% ggplot(aes(x=TOTAL_COMPRAS, y=TOTAL_VENTAS, color = provincia)) + geom_point() + scale_color_brewer(palette = "Paired") + labs(x = "Total de Compras", y = "Total de Ventas", title = "Total de Compras vs Total de Ventas", subtitle = "Exportaciones mayores a USD 5'000,000", caption = "Fuente: https://www.sri.gob.ec/datasets", color = "Provincia") ``` ] .panel[.panel-name[Gráfico] ![](4_EDA_files/figure-html/tv8-1.png)<!-- --> ] ] --- ## Temas: escalas y coordenadas .panelset[ .panel[.panel-name[Código] ```r ## cambiar escala a millones y etiquetas grafico <- ventas %>% filter(EXPORTACIONES>5000000) %>% ggplot(aes(x=TOTAL_COMPRAS/1000000, y=TOTAL_VENTAS/1000000, color = provincia)) + geom_point() + scale_color_brewer(palette = "Paired") + labs(x = "Total de Compras (en millones)", y = "Total de Ventas (en millones)", title = "Total de Compras vs Total de Ventas", subtitle = "Exportaciones mayores a USD 5'000,000", caption = "Fuente: https://www.sri.gob.ec/datasets", color = "Provincia") grafico ``` ] .panel[.panel-name[Gráfico] ![](4_EDA_files/figure-html/tv10-1.png)<!-- --> ] ] --- ## Temas: escalas y coordenadas .panelset[ .panel[.panel-name[Código] ```r ## cambiar escala de puntos con size y cambiar etiqueta grafico <- ventas %>% filter(EXPORTACIONES>5000000) %>% ggplot(aes(x=TOTAL_COMPRAS/1000000, y=TOTAL_VENTAS/1000000, color = provincia, size = EXPORTACIONES/1000000)) + geom_point() + scale_color_brewer(palette = "Paired") + labs(x = "Total de Compras (en millones)", y = "Total de Ventas (en millones)", title = "Total de Compras vs Total de Ventas", subtitle = "Exportaciones mayores a USD 5'000,000", caption = "Fuente: https://www.sri.gob.ec/datasets", color = "Provincia", size = "Exportaciones") grafico ``` ] .panel[.panel-name[Gráfico] <img src="img/ejgraf1.png" width="100%" style="display: block; margin: auto;" /> ] ] --- ## Temas: escalas y coordenadas .panelset[ .panel[.panel-name[Código] ```r ## cambiar escala de puntos con scale_size() y alpha grafico + scale_size( #modifica la escala de la variable exportaciones breaks = floor(seq(1, 800, length.out = 5)), #los límites del 1 al 800, lo divide en 5 grupos limits = c(1, 800), #los límites de los valores range = c(2, 25), #radio de los puntos labels = function(x) { #para la redacción en la leyenda paste0("$", x, "M") }) ## darle transparencia a los puntos geom_point(alpha=0.5) ``` ] .panel[.panel-name[Gráfico] <img src="img/ejgraf2.png" width="100%" style="display: block; margin: auto;" /> ] ] --- ## Temas: leyendas .panelset[ .panel[.panel-name[Código] ```r ## modificar leyendas con theme() grafico + theme(legend.position = "bottom", #posición de las leyendas en la parte inferior legend.box = "vertical", #se acomodaron la leyenda de equipos y salarios de forma vertical legend.background = element_blank(), #fondo de las leyendas legend.key = element_rect(fill = "grey92", color = "grey92")) #key es la base de las geometrías de las leyendas ``` ] .panel[.panel-name[Gráfico] <img src="img/ejgraf3.png" width="80%" style="display: block; margin: auto;" /> ] ] --- ## Temas: formato de textos .panelset[ .panel[.panel-name[Código] ```r ## modificar formatos de textos con theme() grafico + theme(legend.position = "bottom", #posición de las leyendas en la parte inferior legend.box = "vertical", #se acomodaron la leyenda de equipos y salarios de forma vertical legend.background = element_blank(), #fondo de las leyendas legend.key = element_rect(fill = "grey92", color = "grey92"), #key es la base de las geometrías de las leyendas text = element_text(colour = "grey45", size = 13), plot.title = element_text(face = "bold", size = 20, colour = "grey30"), #formato del título del gráfico plot.subtitle = element_text(size = 18, colour = "grey40"), #formato del subtítulo del gráfico plot.caption = element_text(size = 10), axis.text = element_text(color = "grey40")) ``` ] .panel[.panel-name[Gráfico] <img src="img/ejgraf4.png" width="90%" style="display: block; margin: auto;" /> ] ] --- ## Temas: ejes y paneles .panelset[ .panel[.panel-name[Código] ```r ## modificar ejes y paneles con theme() grafico + theme(legend.position = "bottom", #posición de las leyendas en la parte inferior legend.box = "vertical", #se acomodaron la leyenda de equipos y salarios de forma vertical legend.background = element_blank(), #fondo de las leyendas legend.key = element_rect(fill = "grey92", color = "grey92"), #key es la base de las geometrías de las leyendas text = element_text(colour = "grey45", size = 13), plot.title = element_text(face = "bold", size = 20, colour = "grey30"), #formato del título del gráfico plot.subtitle = element_text(size = 18, colour = "grey40"), #formato del subtítulo del gráfico plot.caption = element_text(size = 10), axis.text = element_text(color = "grey40"), plot.background = element_rect(fill = "grey92"), #fondo de todo el gráfico panel.grid.minor = element_blank()) ``` ] .panel[.panel-name[Gráfico] <img src="img/ejgraf5.png" width="90%" style="display: block; margin: auto;" /> ] ] --- class: middle, center, inverse
# Análisis exploratorio de datos --- ## Análisis exploratorio de datos El análisis exploratorio es un enfoque en el que se "deja hablar a los datos" para que ellos nos den las pistas necesarias para construir modelos o incluso desarrollar supuestos o conclusiones. Conocer los datos "como a la palma de tu mano", este es el primer beneficio del EDA, algo útil seas analista comercial, de marketing, científico, ingeniero o cualquier puesto donde analizar datos sea fundamental. Por conocer, nos referimos a: Comprende las correlaciones entre los elementos, descubrir la estructura subyacente de los datos, detectar valores atípicos y anomalías, etc. Por "dejar a los datos hablar" nos referimos a permitir que los datos sugieran los modelos que se adaptan mejor a ellos datos, encontrar variables importantes o más relacionadas, desarrollar modelos parsimoniosos, etc. --- ## Análisis exploratorio de datos - Permite entender los datos - Sirve para examinar las variables y sus interacciones antes de aplicar las técnicas - Es util para encontrar errores en el set de datos - Se realiza mediante estadísticos descriptivos y principalmente gráficos - Suele ser un proceso iterativo: - se plantea una pregunta - se grafica o se crea una tabla para responder - se obtiene una idea o una nueva pregunta del paso anterior - Proporciona pistas o intuición --- ## Variables numéricas .pull-left[ ### Histograma de frecuencias Para explorar variables continuas graficaremos un histograma de frecuencias con `geom_histogram()`. ```r ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% ggplot(aes(x=VN_tar12)) + geom_histogram(binwidth = 2500, color = "black", fill = "chartreuse4") + scale_x_continuous(breaks = seq(0, 20000, 2500)) + scale_y_continuous(breaks = seq(0, 800, 100)) + labs(x = "Ventas con tarifa 12% (USD)", y = "Frecuencia", title = "Ventas con tarifa 12% - Histograma") + theme(text = element_text(colour = "grey45", size = 10), plot.title = element_text(face = "bold", size = 14, colour = "grey30"), plot.background = element_rect(fill = "grey92"), panel.grid.minor = element_blank()) + coord_flip() ``` ] .pull-right[ ![](4_EDA_files/figure-html/aed2-1.png)<!-- --> ] --- ## Variables numéricas .pull-left[ ### Polígono de frecuencias Para explorar variables continuas también podemos usar un polígono de frecuencias con `geom_frefreqpoly()`. Es más útil si lo usamos junto al `geom_histogram()`. ```r grafico + geom_freqpoly(binwidth = 2500, size = 1, color = "chocolate1") ``` ] .pull-right[ ![](4_EDA_files/figure-html/aed4-1.png)<!-- --> ] --- ## Variables numéricas .pull-left[ ### Gráfico de texto Para explorar variables continuas también podemos usar un gráfico de texto con `geom_text()`. En este caso lo usaremos para ubicar las etiquetas a los gráficos anteriores junto al `geom_histogram()` y `geom_freqpoly()`. ```r grafico + geom_text(stat = "bin", # para usar binwidth binwidth= 2500, aes(label=stat(round(count,2)), # etiquetas de los textos y=stat(count)), nudge_y = 30, # posición de etiquetas color = "grey50", size = 3) ``` ] .pull-right[ ![](4_EDA_files/figure-html/aed6-1.png)<!-- --> ] --- ## Variables numéricas .pull-left[ ### Rug plot Un diagrama de alfombra (rug plot) es una visualización compacta diseñada para complementar una visualización en 2D con las dos distribuciones marginales en 1D. Para explorar variables continuas también podemos complementar el histograma con un `geom_rug()`. ```r grafico + geom_rug(alpha=0.1, color = "purple") ``` ] .pull-right[ ![](4_EDA_files/figure-html/aed8-1.png)<!-- --> ] --- ## Variables numéricas .pull-left[ ### Mapa de calor O podríamos querer hacer un mapa de calor así: ```r ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% ggplot(aes(x=VN_tar12, y="")) + geom_bin2d() + scale_x_continuous(breaks = seq(0, 20000, 2500)) + scale_fill_gradient(low = "chocolate1", high = "black") + labs(x = "Ventas con tarifa 12% (USD)", title = "Ventas con tarifa 12% - Mapa de calor") + theme(text = element_text(colour = "grey45", size = 10), plot.title = element_text(face = "bold", size = 14, colour = "grey30"), plot.background = element_rect(fill = "grey92"), panel.grid.minor = element_blank()) ``` ] .pull-right[ ![](4_EDA_files/figure-html/aed10-1.png)<!-- --> ] --- ## Variables numéricas .pull-left[ ### Gráfico de cajas El gráfico de cajas permite visualizar los quartiles de nuestra variable: ```r ventas %>% filter(VN_tar12>2500 & VN_tar12<100000) %>% ggplot(aes(x=VN_tar12, y="")) + geom_boxplot(fill = "chocolate1") + scale_x_continuous(breaks = seq(0, 100000, 10000)) + labs(x = "Ventas con tarifa 12% (USD)", title = "Ventas con tarifa 12% - Grafico de cajas") + theme(text = element_text(colour = "grey45", size = 10), plot.title = element_text(face = "bold", size = 14, colour = "grey30"), plot.background = element_rect(fill = "grey92"), panel.grid.minor = element_blank()) ``` ] .pull-right[ ![](4_EDA_files/figure-html/aed12-1.png)<!-- --> ] --- ## Variables numéricas .pull-left[ ### Gráfico de cajas Podemos agregar estadísticos al gráfico de cajas con `stat_summary()`: ```r ventas %>% filter(VN_tar12>2500 & VN_tar12<100000) %>% ggplot(aes(x=VN_tar12, y="")) + geom_boxplot(fill = "chocolate1") + stat_summary(fun = mean, shape = 18, size = 2, color = "chartreuse4") + scale_x_continuous(breaks = seq(0, 100000, 10000)) + labs(x = "Ventas con tarifa 12% (USD)", title = "Ventas con tarifa 12% - Grafico de cajas") + theme(text = element_text(colour = "grey45", size = 10), plot.title = element_text(face = "bold", size = 14, colour = "grey30"), plot.background = element_rect(fill = "grey92"), panel.grid.minor = element_blank()) ``` ] .pull-right[ ![](4_EDA_files/figure-html/aed14-1.png)<!-- --> ] --- ## Variables numéricas .pull-left[ ### Gráfico de fluctuación A nuestro boxplot le podemos agregar capas como jitter que grafica la posición de cada observación y nos permite ver dónde se concentran: ```r ventas %>% filter(VN_tar12>2500 & VN_tar12<100000) %>% ggplot(aes(x=VN_tar12, y="")) + geom_boxplot(fill = "chocolate1", alpha = 0.5) + geom_jitter(color = "chartreuse4", alpha = 0.2) + scale_x_continuous(breaks = seq(0, 100000, 10000)) + labs(x = "Ventas con tarifa 12% (USD)", title = "Ventas con tarifa 12% - Grafico de cajas") + theme(text = element_text(colour = "grey45", size = 10), plot.title = element_text(face = "bold", size = 14, colour = "grey30"), plot.background = element_rect(fill = "grey92"), panel.grid.minor = element_blank()) ``` ] .pull-right[ ![](4_EDA_files/figure-html/aed16-1.png)<!-- --> ] --- ## Variables numéricas .pull-left[ ### Diagrama de violín A nuestro boxplot le podemos agregar capas como violín que grafica la concentración de las observaciones: ```r ventas %>% filter(VN_tar12>2500 & VN_tar12<100000) %>% ggplot(aes(x=VN_tar12, y="")) + geom_boxplot(fill = "chocolate1", alpha = 0.5) + geom_violin(fill = "chartreuse4", alpha = 0.3, color = NA) + scale_x_continuous(breaks = seq(0, 100000, 10000)) + labs(x = "Ventas con tarifa 12% (USD)", title = "Ventas con tarifa 12% - Grafico de cajas") + theme(text = element_text(colour = "grey45", size = 10), plot.title = element_text(face = "bold", size = 14, colour = "grey30"), plot.background = element_rect(fill = "grey92"), panel.grid.minor = element_blank()) ``` ] .pull-right[ ![](4_EDA_files/figure-html/aed18-1.png)<!-- --> ] --- ## Estadísticos y descriptivos .panelset[ .panel[.panel-name[Código] .pull-left[ ```r g1 <- ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% ggplot(aes(x=VN_tar12)) + geom_histogram(binwidth = 2500, color = "chartreuse2", fill = "chartreuse4") + geom_text(stat = "bin", binwidth= 2500, aes(label=stat(round(count,2)), y=stat(count)), nudge_y = 30, color = "grey50", size = 3) + scale_x_continuous(breaks = seq(0, 20000, 2500)) + scale_y_continuous(breaks = seq(0, 800, 100)) + labs(x = "Ventas con tarifa 12% (USD)", y = "Frecuencia", title = "Ventas con tarifa 12% - Histograma") + theme(text = element_text(colour = "grey45", size = 10), plot.title = element_text(face = "bold", size = 14, colour = "grey30"), plot.background = element_rect(fill = "grey92"), panel.grid.minor = element_blank()) ``` ] .pull-right[ ```r g2 <- ventas %>% filter(VN_tar12>2500 & VN_tar12<100000) %>% ggplot(aes(x=VN_tar12, y="")) + geom_boxplot(fill = "chocolate1") + stat_summary(fun = mean, shape = 18, size = 2, color = "chartreuse4") + theme_void() + theme(plot.background = element_rect(fill = "grey92", color = "grey92"), panel.grid.minor = element_blank()) library(cowplot) plot_grid(g1, g2, ncol = 1, rel_heights = c(9, 1), align = 'v') ``` ] ] .panel[.panel-name[Gráfico] <img src="img/grADE1.png" width="100%" style="display: block; margin: auto;" /> ] ] --- ## Variables categóricas .pull-left[ ### Gráfico de barras ```r ventas %>% filter(EXPORTACIONES>5000000) %>% ggplot(aes(x = provincia)) + geom_bar(aes(fill = provincia) ) + geom_text(stat = "count", aes(label=stat(round(count,2)), y=stat(count)), nudge_y = 5, color = "grey50", size = 4) + labs(x = "Provincias", y = "Frecuencia", title = "Cantidad de transacciones globales por provincia") + theme(text = element_text(colour = "grey45", size = 10), plot.title = element_text(face = "bold", size = 14, colour = "grey30"), plot.background = element_rect(fill = "grey92"), panel.grid.minor = element_blank(), axis.text.x = element_text(angle = 90, size = 7), legend.position = "none") ``` ] .pull-right[ ![](4_EDA_files/figure-html/vc2-1.png)<!-- --> ] --- ## Variables categóricas .pull-left[ ### Lollipop ```r ventas %>% filter(EXPORTACIONES>5000000) %>% group_by(provincia) %>% summarise(Frec = n()) %>% ggplot(aes(x = provincia, y = Frec)) + geom_point(size = 5, color = "chartreuse4") + geom_segment(aes(xend = provincia, y = 0, yend = Frec), color = "chartreuse4", size = 1) + labs(x = "Provincias", y = "Frecuencia", title = "Cantidad de transacciones globales por provincia") + theme(text = element_text(colour = "grey45", size = 10), plot.title = element_text(face = "bold", size = 14, colour = "grey30"), plot.background = element_rect(fill = "grey92"), panel.grid.minor = element_blank(), axis.text.x = element_text(angle = 90, size = 7)) ``` ] .pull-right[ ![](4_EDA_files/figure-html/vc4-1.png)<!-- --> ] --- ## Variables categóricas .pull-left[ ### Gráfico de pastel Para hacer un gráfico de pastel necesitamos `geom_bar()` y un `coord_polar()` y trabajar con datos resumidos con `group_by()` y `summarise()`: ```r ventas %>% filter(EXPORTACIONES>5000000) %>% group_by(provincia) %>% summarise(Frec = n()) %>% mutate(Prop= round(Frec/ sum(Frec),2) ) %>% ggplot(aes(x = "", y=Prop, fill = provincia)) + geom_bar(stat = "identity", color="white") + coord_polar("y", start = 0) ``` ] .pull-right[ ![](4_EDA_files/figure-html/vc6-1.png)<!-- --> ] --- ## Variables categóricas .pull-left[ ### Gráfico de pastel Para agregar texto al gráfico de pastel necesitamos que la variable sea de tipo factor para poder ordenar las observaciones: ```r ventas$provincia <- factor( ventas$provincia, levels = c("MANABI", "EL ORO", "SUCUMBIOS", "ZAMORA CHINCHIPE", "GUAYAS", "TUNGURAHUA", "ESMERALDAS", "COTOPAXI", "CARCHI", "PICHINCHA", "MORONA SANTIAGO", "LOJA", "LOS RIOS", "SANTA ELENA", "NAPO", "GALAPAGOS", "AZUAY", "ORELLANA", "CA�AR", "CHIMBORAZO", "PASTAZA", "IMBABURA", "BOLIVAR", "SANTO DOMINGO DE LOS TSACHILAS")) class(ventas$provincia) ``` ] .pull-right[ ```r ## agregamos etiquetas con geom_text() ventas %>% filter(EXPORTACIONES>5000000) %>% group_by(provincia) %>% summarise(Frec = n()) %>% arrange(-Frec) %>% mutate(Prop= round((Frec/ sum(Frec)),2), PosLab= cumsum(Prop) - 0.5*Prop) %>% ggplot(aes(x = "", y=Prop, fill = reorder(provincia, Frec))) + geom_bar(stat = "identity", color="white") + coord_polar("y", start = 0) + geom_text(aes(y = PosLab, label = scales::percent(Prop)), color = "white", size = 3) ``` ] --- ## Variables categóricas ### Gráfico de pastel Para agregar texto al gráfico de pastel: <img src="img/GRPIE1.png" width="70%" style="display: block; margin: auto;" /> --- ## Variables categóricas .pull-left[ ### Gráfico de pastel ```r grafico + geom_text(aes(y = PosLab, label = scales::percent(Prop)), color = "white", size = 3, nudge_x = 0.15) + labs(title = "Cantidad de transacciones globales por provincia", fill = "Provincia", x = "", y = "") + theme(text = element_text(colour = "grey45", size = 10), plot.title = element_text(face = "bold", size = 14, colour = "grey30"), plot.background = element_rect(fill = "grey92"), panel.grid.minor = element_blank(), panel.grid.major = element_blank(), axis.text.x = element_blank(), legend.position = "bottom", legend.background = element_blank(), legend.key = element_rect(fill = "grey92", color = "grey92")) ``` ] .pull-right[ <img src="img/GRPIE2.png" width="90%" style="display: block; margin: auto;" /> ] --- ## Variables categóricas .pull-left[ ### Gráfico de barras apiladas El gráfico de barras apiladas muestra el tamaño relativo (como recuento, porcentaje u otra variable numérica) de una variable categórica, subdividida por colores en función de un subgrupo. ```r ventas %>% filter(EXPORTACIONES>5000000) %>% group_by(provincia) %>% summarise(Frec = n()) %>% arrange(-Frec) %>% mutate(Prop= round((Frec/ sum(Frec)),3), PosLab= cumsum(Prop) - 0.6*Prop) %>% ggplot(aes(x = "", y=Prop, fill = reorder(provincia, Frec))) + geom_bar(stat = "identity", color="white") + geom_text(aes(y = PosLab, label = scales::percent(Prop)), color = "white", size = 3, nudge_x = 0.15) ``` ] .pull-right[ ![](4_EDA_files/figure-html/vc14-1.png)<!-- --> ] --- ## Variables categóricas .pull-left[ ### Gráfico de barras apiladas Instalamos el paquete `scales` para modificar el eje `\(y\)` con porcentajes: ```r library(scales) grafico + scale_y_continuous(label= percent_format()) ``` ] .pull-right[ ![](4_EDA_files/figure-html/vc16-1.png)<!-- --> ] --- ## Variables categóricas .pull-left[ ### Gráfico de barras apiladas Etiquetas y tema: ```r grafico + labs(title = "Cantidad de transacciones globales por provincia", fill = "Provincia", x = "", y = "") + theme(text = element_text(colour = "grey45", size = 10), plot.title = element_text(face = "bold", size = 14, colour = "grey30"), plot.background = element_rect(fill = "grey92"), panel.grid.minor = element_blank(), panel.grid.major = element_blank(), axis.text.x = element_blank(), legend.position = "bottom", legend.background = element_blank(), legend.key = element_rect(fill = "grey92", color = "grey92")) ``` ] .pull-right[ ![](4_EDA_files/figure-html/vc18-1.png)<!-- --> ] --- ## Variables categóricas ### Gráfico de barras apiladas Gráfico de barras apiladas horizontal: ![](4_EDA_files/figure-html/vc19-1.png)<!-- --> --- ## Variables categóricas .pull-left[ ### Gráfico de cascada Un gráfico en cascada, también denominado gráfico puente, es un tipo especial de gráfico de columnas que le ayuda a identificar cómo un valor inicial se ve afectado por un aumento y una disminución de los datos intermedios, lo que lleva a un valor final. ```r library(waterfalls) ventas %>% filter(EXPORTACIONES>5000000) %>% group_by(provincia) %>% summarise(Frec = n()) %>% arrange(-Frec) %>% mutate(Prop= round((Frec/ sum(Frec))*100,2), PosLab= cumsum(Prop) - 0.6*Prop) %>% select(provincia, Prop) %>% waterfall(values = Prop, calc_total = TRUE) ``` ] .pull-right[ ![](4_EDA_files/figure-html/vc21-1.png)<!-- --> ] --- ## Variables categóricas .pull-left[ ### Gráfico de cascada Estética del gráfico: ```r grafico %>% waterfall(values = Prop, calc_total = TRUE, fill_by_sign = FALSE, fill_colours = c("pink", "pink1", "pink2", "pink3", "plum", "plum1", "plum2", "plum3", "pink4", "plum4"), total_rect_color = "orchid4", rect_border = NA, total_rect_border_color = NA) ``` ] .pull-right[ ![](4_EDA_files/figure-html/vc23-1.png)<!-- --> ] --- ## Variables categóricas .pull-left[ ### Gráfico de cascada Tema del gráfico: ```r grafico + labs(title = "Cantidad de transacciones globales por provincia", fill = "Provincia") + theme(text = element_text(colour = "grey45", size = 10), plot.title = element_text(face = "bold", size = 14, colour = "grey30"), plot.background = element_rect(fill = "grey92"), panel.grid.minor = element_blank(), legend.position = "bottom", legend.background = element_blank(), legend.key = element_rect(fill = "grey92", color = "grey92")) ``` ] .pull-right[ ![](4_EDA_files/figure-html/vc25-1.png)<!-- --> ] --- ## Varias Variables numéricas .pull-left[ ### Gráfico de dispersión El gráfico de dispersión se usa para averiguar la intensidad de la relación entre dos variables numéricas. El eje `\(X\)` representa la variable independiente, mientras que el eje `\(Y\)` representa la variable dependiente. En R lo generamos con `geom_point()`. ```r # gráfico de dispersión simple ventas %>% filter(provincia=="PICHINCHA" | provincia=="GUAYAS" | provincia=="AZUAY") %>% ggplot(aes(x = TOTAL_VENTAS, y = TOTAL_COMPRAS)) + geom_point() ``` ] .pull-right[ ![](4_EDA_files/figure-html/vvn2-1.png)<!-- --> ] --- ## Varias Variables numéricas .pull-left[ ### Gráfico de dispersión Cuando hay mucha superposición de los puntos es mejor agregar transparencia a los datos: ```r # transaparencia de puntos con alpha ventas %>% filter(provincia=="PICHINCHA" | provincia=="GUAYAS" | provincia=="AZUAY") %>% ggplot(aes(x = TOTAL_VENTAS, y = TOTAL_COMPRAS)) + geom_point(alpha = 0.2) ``` ] .pull-right[ ![](4_EDA_files/figure-html/vvn4-1.png)<!-- --> ] --- ## Varias Variables numéricas .pull-left[ ### Gráfico smooth Este gráfico `geom_smooth()` agrega una línea de tendencia sobre una gráfica existente: ```r # agregamos una línea de suavizado para ver la tendencia ventas %>% filter(provincia=="PICHINCHA" | provincia=="GUAYAS" | provincia=="AZUAY") %>% ggplot(aes(x = TOTAL_VENTAS, y = TOTAL_COMPRAS)) + geom_point(alpha = 0.2) + geom_smooth() ``` ] .pull-right[ ![](4_EDA_files/figure-html/vvn6-1.png)<!-- --> ] --- ## Varias Variables numéricas .pull-left[ ### Mapas de calor hexagonales Una forma de representar mejor las frecuencias para cuando se tienen muchos datos es el uso de mapas de calor hexagonales con `geom_hex()`: ```r ventas %>% filter(provincia=="PICHINCHA" | provincia=="GUAYAS" | provincia=="AZUAY") %>% ggplot(aes(x = TOTAL_VENTAS, y = TOTAL_COMPRAS)) + geom_hex() ``` ] .pull-right[ ![](4_EDA_files/figure-html/vvn8-1.png)<!-- --> ] --- ## Varias Variables numéricas .pull-left[ ### Mapas de calor hexagonales Podemos modificar el tamaño de los hexágonos con `bins`: ```r ventas %>% filter(provincia=="PICHINCHA" | provincia=="GUAYAS" | provincia=="AZUAY") %>% ggplot(aes(x = TOTAL_VENTAS, y = TOTAL_COMPRAS)) + geom_hex(bins = 60) ``` ] .pull-right[ ![](4_EDA_files/figure-html/vvn10-1.png)<!-- --> ] --- ## Variables numéricas con una categórica Incluiremos una nueva variable en nuestro conjunto de datos: ```r ventas <- ventas %>% mutate(region = case_when(provincia=="MANABI" ~ "COSTA", provincia=="EL ORO" ~ "COSTA", provincia=="GUAYAS" ~ "COSTA", provincia=="ESMERALDAS" ~ "COSTA", provincia=="LOS RIOS" ~ "COSTA", provincia=="SANTA ELENA" ~ "COSTA", provincia=="SANTO DOMINGO DE LOS TSACHILAS" ~ "COSTA", provincia=="TUNGURAHUA" ~ "SIERRA", provincia=="AZUAY" ~ "SIERRA", provincia=="BOLIVAR" ~ "SIERRA", provincia=="CARCHI" ~ "SIERRA", provincia=="COTOPAXI" ~ "SIERRA", provincia=="CHIMBORAZO" ~ "SIERRA", provincia=="IMBABURA" ~ "SIERRA", provincia=="LOJA" ~ "SIERRA", provincia=="PICHINCHA" ~ "SIERRA", provincia=="MORONA SANTIAGO" ~ "ORIENTE", provincia=="NAPO" ~ "ORIENTE", provincia=="ORELLANA" ~ "ORIENTE", provincia=="PASTAZA" ~ "ORIENTE", provincia=="SUCUMBIOS" ~ "ORIENTE", provincia=="ZAMORA CHINCHIPE" ~ "ORIENTE", provincia=="GALAPAGOS" ~ "INSULAR", TRUE ~ "SIERRA")) ``` --- ## Variables numéricas con una categórica .pull-left[ ### Histograma El histograma es la representación gráfica de un grupo de datos estadísticos. El histograma apilado es muy usual pero no recomendado porque no facilita la comparación entre categorías: ```r ## Histograma apilado ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% ggplot(aes(x = VN_tar12, fill = region)) + geom_histogram() ## guardar el tema tema_nuevo <- theme(text = element_text(colour = "grey45", size = 10), plot.title = element_text(face = "bold", size = 14, colour = "grey30"), plot.background = element_rect(fill = "grey92"), panel.grid.minor = element_blank(), legend.background = element_blank()) ``` ] .pull-right[ ![](4_EDA_files/figure-html/vvn13-1.png)<!-- --> ] --- ## Variables numéricas con una categórica .pull-left[ ### Histograma Agregamos temas y etiquetas: ```r ## temas y etiquetas ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% ggplot(aes(x = VN_tar12, fill = region)) + geom_histogram() + labs(x = "Ventas con tarifa 12% (USD)", y = "Frecuencia", title = "Ventas con tarifa 12% - Histograma", fill = "Region") + tema_nuevo ``` ] .pull-right[ ![](4_EDA_files/figure-html/vvn15-1.png)<!-- --> ] --- ## Variables numéricas con una categórica .pull-left[ ### Histograma Se realiza una mejor comparación entre categorías con las barras una a lado de la otra: ```r # histograma con barras laterales position = "dodge" ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% ggplot(aes(x = VN_tar12, fill = region)) + geom_histogram(position = "dodge") + labs(x = "Ventas con tarifa 12% (USD)", y = "Frecuencia", title = "Ventas con tarifa 12% - Histograma", fill = "Region") + tema_nuevo ``` ] .pull-right[ ![](4_EDA_files/figure-html/vvn17-1.png)<!-- --> ] --- ## Variables numéricas con una categórica .pull-left[ ### Histograma Es mejor separar las categorías con `facet_grid()` o `facet_wrap()`: ```r # histogramas de forma separada ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% ggplot(aes(x = VN_tar12, fill = region)) + geom_histogram(position = "dodge") + facet_grid(region ~ .) + labs(x = "Ventas con tarifa 12% (USD)", y = "Frecuencia", title = "Ventas con tarifa 12% - Histograma", fill = "Region") + tema_nuevo ``` ] .pull-right[ ![](4_EDA_files/figure-html/vvn19-1.png)<!-- --> ] --- ## Variables numéricas con una categórica .pull-left[ ### Histograma Para no tener histogramas achatados se puede usar `scales = "free"`: ```r # para no tener histogramas achatados scales = "free" ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% ggplot(aes(x = VN_tar12, fill = region)) + geom_histogram(position = "dodge") + facet_grid(region ~ ., scales = "free") + labs(x = "Ventas con tarifa 12% (USD)", y = "Frecuencia", title = "Ventas con tarifa 12% - Histograma", fill = "Region") + tema_nuevo ``` ] .pull-right[ ![](4_EDA_files/figure-html/vvn21-1.png)<!-- --> ] --- ## Variables numéricas con una categórica .pull-left[ ### Histograma Podemos tener una composición total del gráfico con `position = "fill"` y `scale_y_continuous(labels = percent_format())`: ```r ## Obtener una composición total del gráfico ## con position = "fill" y scale_y_continuous() library(scales) ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% ggplot(aes(x = VN_tar12, fill = region)) + geom_histogram(position = "fill") + scale_y_continuous(labels = percent_format()) + labs(x = "Ventas con tarifa 12% (USD)", y = "Frecuencia", title = "Ventas con tarifa 12% - Histograma", fill = "Region") + tema_nuevo ``` ] .pull-right[ ![](4_EDA_files/figure-html/vvn23-1.png)<!-- --> ] --- ## Variables numéricas con una categórica .pull-left[ ### Histograma Si tienen pocas categorías se puede jugar con la transparencia de los histogramas: ```r ## Transparencia de histogramas ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% ggplot(aes(x = VN_tar12)) + geom_histogram(aes(fill = region), position = "identity", alpha = 0.5) + labs(x = "Ventas con tarifa 12% (USD)", y = "Frecuencia", title = "Ventas con tarifa 12% - Histograma", fill = "Region") + tema_nuevo ``` ] .pull-right[ ![](4_EDA_files/figure-html/vvn25-1.png)<!-- --> ] --- ## Variables numéricas con una categórica .pull-left[ ### Gráfico de densidad Un gráfico de densidad visualiza la distribución de datos cuantitativos en un intervalo o período de tiempo continuo. Este gráfico es una variación de un histograma que usa suavizado de kernel para trazar valores, lo que permite distribuciones más suaves suavizando el ruido. En R lo generamos con `geom_density()`: ```r ## gráfico de densidad con transparencia ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% ggplot(aes(x = VN_tar12, fill = region)) + geom_density(alpha = 0.5) + labs(x = "Ventas con tarifa 12% (USD)", y = "Densidad", title = "Ventas con tarifa 12% - Densidad", fill = "Region") + tema_nuevo ``` ] .pull-right[ ![](4_EDA_files/figure-html/vvn27-1.png)<!-- --> ] --- ## Variables numéricas con una categórica .pull-left[ ### Gráfico de líneas verticales Podemos agregar estadísticos al gráfico de densidad mediante un gráfico de líneas verticales con `geom_vline()`: ```r ## calculando estadísticos para el gráfico ventas_medias <- ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% group_by(region) %>% summarise(MEDIA = mean(VN_tar12, na.rm= TRUE)) ## agregamos geom_vline() ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% ggplot(aes(x = VN_tar12, fill = region)) + geom_density(alpha = 0.5) + geom_vline(data = ventas_medias, aes(xintercept = MEDIA, colour= region), linetype= "dashed", size= 1) + labs(x = "Ventas con tarifa 12% (USD)", y = "Densidad", title = "Ventas con tarifa 12% - Densidad", fill = "Region") + tema_nuevo ``` ] .pull-right[ ![](4_EDA_files/figure-html/vvn29-1.png)<!-- --> ] --- ## Variables numéricas con una categórica .pull-left[ ### Gráfico de texto Podemos agregar estadísticos al gráfico de densidad y de líneas verticales con `geom_text()`: ```r ## incluir los valores de medias en texto con geom_text() ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% ggplot(aes(x = VN_tar12, fill = region)) + geom_density(alpha = 0.5, lwd = 0.2) + geom_vline(data = ventas_medias, aes(xintercept = MEDIA, colour= region), linetype= "dashed", size= 1) + geom_text(data = ventas_medias, aes(x=MEDIA - 150, label= paste("Media: USD ", round(MEDIA,2)), y=0.00009, colour= region), angle=90) + labs(x = "Ventas con tarifa 12% (USD)", y = "Densidad", title = "Ventas con tarifa 12% - Densidad", fill = "Region") + tema_nuevo ``` ] .pull-right[ ![](4_EDA_files/figure-html/vvn31-1.png)<!-- --> ] --- ## Variables numéricas con una categórica .pull-left[ ### Diagrama de violín El diagrama de violín grafica la concentración de las observaciones con `geom_violin()`: ```r ## gráfico de violín ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% ggplot(aes(x = region, y = VN_tar12)) + geom_violin(aes(fill = region, color = region), alpha = 0.5) + coord_flip() + labs(x = "Region", y = "Ventas con tarifa 12% (USD)", title = "Ventas con tarifa 12%") + tema_nuevo ``` ] .pull-right[ ![](4_EDA_files/figure-html/vvn33-1.png)<!-- --> ] --- ## Variables numéricas con una categórica .pull-left[ ### Gráfico de cajas Podemos conseguir información más útil agregando un gráfico de cajas con `geom_boxplot` al gráfico de violin anterior: ```r ## gráfico de cajas sin outliers ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% ggplot(aes(x = region, y = VN_tar12)) + geom_violin(aes(fill = region, color = region), alpha = 0.5) + geom_boxplot( aes(fill = region), color= "#5B5B5B", width=.2, outlier.colour=NA) + coord_flip() + labs(x = " ", y = "Ventas con tarifa 12% (USD)", title = "Ventas con tarifa 12%") + tema_nuevo ``` ] .pull-right[ ![](4_EDA_files/figure-html/vvn35-1.png)<!-- --> ] --- ## Variables numéricas con una categórica .pull-left[ ### Gráfico de cajas Agregamos una capa estadística: ```r ## agregar capa estadística ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% ggplot(aes(x = region, y = VN_tar12)) + geom_violin(aes(fill = region, color = region), alpha = 0.5) + geom_boxplot( aes(fill = region), color= "#5B5B5B", width=.2, outlier.colour=NA) + stat_summary(fun=mean, geom="point", shape=15, size=2, color= "gold") + coord_flip() + labs(x = "Region", y = "Ventas con tarifa 12% (USD)", title = "Ventas con tarifa 12%") + tema_nuevo ``` ] .pull-right[ ![](4_EDA_files/figure-html/vvn37-1.png)<!-- --> ] --- class: middle, center, inverse
# Gráficos dinámicos con `plotly` --- ## Gráficos html .pull-left[ Web oficial: [https://plotly.com/r/](https://plotly.com/r/) ```r library(plotly) ## gráfico dinámico de un gráfico de densidad g1 <- ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% ggplot(aes(x = VN_tar12, fill = region)) + geom_density(alpha = 0.5) + labs(x = "Ventas con tarifa 12% (USD)", y = "Densidad", title = "Ventas con tarifa 12% - Densidad", fill = "Region") + tema_nuevo ggplotly(g1) ``` ] .pull-right[
] --- ## Gráficos html .pull-left[ ```r ## gráfico dinámico de un histograma g2 <- ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% ggplot(aes(x=VN_tar12)) + geom_histogram(binwidth = 2500, color = "black", fill = "chartreuse4") + geom_freqpoly(binwidth = 2500, size = 1, color = "chocolate1") + geom_text(stat = "bin", binwidth= 2500, aes(label=stat(round(count,2)), y=stat(count)), nudge_y = 30, color = "grey50", size = 3) + scale_x_continuous(breaks = seq(0, 20000, 2500)) + scale_y_continuous(breaks = seq(0, 800, 100)) + labs(x = "Ventas con tarifa 12% (USD)", y = "Frecuencia", title = "Ventas con tarifa 12% - Histograma") + theme(text = element_text(colour = "grey45", size = 10), plot.title = element_text(face = "bold", size = 14, colour = "grey30"), plot.background = element_rect(fill = "grey92"), panel.grid.minor = element_blank()) ggplotly(g2) ``` ] .pull-right[
] --- ## Gráficos html .pull-left[ ```r ## indicar el texto en las etiquetas ggplotly(g2, tooltip = "y") ``` ] .pull-right[
] --- ## Gráficos html .pull-left[ ```r ## gráfico dinámico de un gráfico de cajas g3 <- ventas %>% filter(VN_tar12>2500 & VN_tar12<20000) %>% ggplot(aes(x = region, y = VN_tar12)) + geom_violin(aes(fill = region, color = region), alpha = 0.5) + geom_boxplot( aes(fill = region), color= "#5B5B5B", width=.2, outlier.colour=NA) + coord_flip() + labs(x = " ", y = "Ventas con tarifa 12% (USD)", title = "Ventas con tarifa 12%") + tema_nuevo ggplotly(g3) ``` ] .pull-right[
] --- ## Gráficos html .pull-left[ ```r ## gráficos animados con gganimate library(gganimate) anime <- ventas %>% filter(EXPORTACIONES>5000000) %>% group_by(mes, provincia) %>% summarise(Frec = n()) %>% ggplot(aes(x = provincia, y = Frec)) + geom_point(size = 5, color = "chartreuse4") + geom_segment(aes(xend = provincia, y = 0, yend = Frec), color = "chartreuse4", size = 1) + labs(x = "Provincias", y = "Frecuencia", title = "Cantidad de transacciones globales por provincia", subtitle = "Mes: {current_frame}") + theme(text = element_text(colour = "grey45", size = 10), plot.title = element_text(face = "bold", size = 14, colour = "grey30"), plot.background = element_rect(fill = "grey92"), panel.grid.minor = element_blank(), axis.text.x = element_text(angle = 90, size = 7)) + transition_manual(mes) animate(anime, renderer = gifski_renderer()) ``` ] .pull-right[ ![](4_EDA_files/figure-html/gd10-1.gif)<!-- --> ] --- # 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) * Tukey, John (1977), Exploratory Data Analysis, Addison-Wesley. * Velleman, Paul and Hoaglin, David (1981), The ABC's of EDA: Applications, Basics, and Computing of Exploratory Data Analysis, Duxbury. * Wilkinson (2005). The Grammar of Graphics. 2nd ed. Statistics and Computing. Springer. * Wickham (2010). A Layered Grammar of Graphics. Journal of Computational and Graphical Statistics --- class: middle, center, inverse <br> <br> # Análisis Exploratorio de Datos ## **CAPÍTULO 4** <br> <br> .center[ ### [@MasappEC
](https://www.facebook.com/MasappEC/) ### [@Masappdata
](https://twitter.com/Masappdata) ] .pull-right[ Para dudas y preguntas:
Linda Cabrera O. (+34 924 609 588)
Fernanda Jurado M. (+593 99 432 3324) ]