class: center, middle, inverse, title-slide .title[ # Seminario de Instrumentos Computacionales ] .subtitle[ ## R - Clase 4 ] .author[ ### Cristian Bonavida ] --- <style> p.caption { font-size: 0.6em; } </style> <style> div.remark-slide-content { padding: 1em; /*default is 1em 4em*/ } .dataTables_wrapper { font-size: .5em; } </style> <style> pre { white-space: pre !important; overflow-y: auto !important; max-height: 45vh !important; } </style> <style type="text/css"> .remark-code, .remark-inline-code { background: #f0f0f0; } .remark-code { font-size: 18px; } .huge .remark-code { /*Change made here*/ font-size: 125% !important; } .inter .remark-code { /*Change made here*/ font-size: 75% !important; } .tiny .remark-code { /*Change made here*/ font-size: 60% !important; } </style> ## Repaso Clase 3 --- ## Donde estamos parados? <div class="figure" style="text-align: center"> <img src="inputs/Clase4/workflow.png" alt="https://r4ds.hadley.nz/" width="70%" height="50%" /> <p class="caption">https://r4ds.hadley.nz/</p> </div> --- ## Visualizar Generar visualizaciones no es solamente "hacer un gráfico lindo" -- Es mas que eso, implica **comunicar una idea**, una información, un dato, de manera clara y lo mas precisa posible. -- El objetivo de esta parte no es solo aprender como armar un gráfico bien presentado, sino también entender cómo pensar en los inputs que necesito para lo que quiero comunicar y cuál es la mejor manera de expresarlo. -- Como toda buena idea, vamos a ir de lo general a lo específico, definiendo primero la base y puliendo a cada paso. -- **Vamos a graficar en forma de cascada** --- ## Visualizar: ggplot() Esta es la lógica que propone `ggplot` una de los paquetes de la familia `tidyverse()` -- Si existe un consenso en R, es que ggplot es LA librería para graficar. -- Así que vamos a aprender cómo usarlar. -- Para conectar y luego recordar los pasos para graficar les propongo el ejercicio de pensar el **análogo con un pintura...** --- background-image: url("inputs/Clase4/IA_ggplot_landscape.jpg") class: middle, center background-size: cover IA redesign of a landscape with ggplot aesthetic --- ## Visualizar: ggplot() Esta es la lógica que propone `ggplot` una de los paquetes de la familia `tidyverse()` Si existe un consenso en R, es que ggplot es LA librería para graficar. Así que vamos a aprender cómo usarlar. Para conectar y luego recordar los pasos para graficar les propongo el ejercicio de pensar el **análogo con un pintura...** <br /> Por donde empiezan si quieren dibujar o pintar algo. -- Bueno casi siempre definiendo qué quiero hacer... --- ## Visualizar: ggplot() Bien, en nuestro primer gráfico vamos a visualizar la relación entre años de educación y salario y lo haremos con la EPH. -- En este caso la base está guardada en el formato nativo de R, con la extension `RDS`, por lo que la función `readRDS()` nos permite cargar la base -- ```r eph_ind <- readRDS("datos/Clase4/eph_R.RDS") %>% select(pais, ano, edad, nivel, aedu, ocupado, ila, region_est1, pondera) ``` Ahora ya sabemos lo que vamos a tratar de mostrar. -- Siguiendo la analogía con una pintura, para empezar a pintar necesitamos **un espacio**, un lienzo un pedazo de tela. -- Bien, generemos eso. -- Un grafico comienza justamente con la función `ggplot()` y con la especificación del primer argumento - `data=` -- : la base de datos que contiene la información a visualizar --- ## Visualizar: ggplot() .pull-left[ ```r ggplot(data=eph_ind) ``` ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-4-1.png" width="504" /> ] Ya tenemos nuestro lienzo en blanco, sobre él vamos a ir agregando distintas capas y tramas secuencialmente --- ## Visualizar: ggplot() El siguiente paso es pensar en las proporciones, en una referencia para la medida de lo que vamos a graficar -- En terminos de ggplot esto implica **definir los ejes**. Para ello, definimos el argumento `mapping()` que determina cómo las variables en nuestra base de datos se corresponden con los atributos visuales que requiere ggplot. -- Esos argumentos visuales reciben el nombre de **aesthethics** y en nuestra función se invocan mediante `aes()` -- Repasemos los argumentos hasta aquí: - `data=` - `maaping = aes()` -- <br /> Sumemoslo a nuestro espacio en blanco --- ## Visualizar: ggplot() El eje x serán los años de educación del individuo y en el eje y tendremos el salario. .pull-left[ ```r ggplot(data=eph_ind, * mapping = aes(x=aedu, y=ila)) ``` Ya tenemos definido el espacio y las proporciones ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-5-1.png" width="504" /> ] --- ## Visualizar: ggplot() Empecemos a pintar, demos los primeros trazos -- ¿Qué tipo de trazo nos sirve más para lo que queremos mostrar? ¿Un punto, una línea, una forma? -- Ahora viene el momento de elegir e indicar cómo vamos a representar las observaciones de los datos -- . La manera de hacerlo en R es definiendo un **`geom`** -- ¿un qué? -- Un *"Objeto Geométrico"* que nos permite representar los datos en una visualización -- Existen muchos tipos distintos, y de hecho las personas identifican qué tipo de gráfico están usando por el `geom_` que elijen. -- Veamos los más tipicos que existen: - `geom_point()` - `geom_line()` - `geom_bar()` - `geom_histogram()` - `geom_density()` - `geom_boxplot()` --- ## Visualizar: ggplot() Dijimos que ibamos a mostrar la relación entre salario y educación. Tenemos miles de individuos en la base. Para graficar los valores de estas dos variables para cada individuo podemos hacerlo con un punto. -- Entonces `geom_point()` será nuestra primer elección. -- .pull-left[ ```r ggplot( data=eph_ind, mapping = aes(x=aedu, y=ila)) + * geom_point() ``` ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-6-1.png" width="504" /> ] --- ## Visualizar: ggplot() Dijimos que ibamos a mostrar la relación entre salario y educación. Tenemos miles de individuos en la base. Para graficar los valores de estas dos variables para cada individuo podemos hacerlo con un punto. Entonces `geom_point()` será nuestra primer elección. .pull-left[ ```r ggplot( data=eph_ind, mapping = aes(x=aedu, y=ila)) + * geom_point() ``` Una vez que definimos cuales son los *datos* y el *aesthetic* cerramos la función `ggplot()` Y la forma de conectarlo con el `geom_` a aplicar es mediante el signo `+` ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-7-1.png" width="504" /> ] --- ## Visualizar: ggplot() Nos ocurre algo habitual cuando graficamos, los valores raros o *outliers* terminan por **distorsionar las dimensiones**. -- Calculando un percentil extremo (95-100 por ejemplo) podemos deshacernos de este tipo de valores raros -- .pull-left[ .inter[ ```r # 98th percentil outlier <- quantile(eph_ind$ila, 0.98, na.rm=T) ggplot( * data=eph_ind %>% * filter(ila < outlier), mapping = aes(x=aedu, y=ila)) + geom_point() ``` ] <br /> Bien, los ejes ya que no queda distorsionados por los valores raros y el grueso de los datos se distribuye mejor ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-8-1.png" width="504" /> ] --- ## Visualizar: ggplot() Esta realción podría, o no, ser diferente por grupos. Por ejemplo, para distintas regiones del país. Para representar esta posible heterogeneidad quisiéramos diferenciar las observaciones por colores indicativos de cada región. -- El atributo `color` dentro de la definición de `aes()` hace este trabajo -- .pull-left[ .inter[ ```r # 98th percentil outlier <- quantile(eph_ind$ila, 0.98, na.rm=T) ggplot( data=eph_ind %>% filter(ila < outlier), * mapping = aes(x=aedu, y=ila, color=region_est1)) + geom_point() ``` ] ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-9-1.png" width="504" /> ] --- ## Visualizar: ggplot() Dado que tenemos muchas observaciones con distinto niveles de ingreso para cada año de educación, los puntos se solapan unos con otros y es dificil entender qué mensajes podemos rescatar del gráfico. -- Para comunicar la idea, necesitamos cambiar el input. -- Podemos calcular el promedio de ingreso para cada año de educación y para cada región. Esto ya sabemos como hacerlo -- ```r eph_reg <- eph_ind %>% filter(ila < outlier) %>% group_by(region_est1, aedu) %>% summarise( ila = weighted.mean(ila, pondera, na.rm=T) ) ``` --- ## Visualizar: ggplot() Ahora probemos la misma visualización pero con estos datos .pull-left[ .inter[ ```r ggplot( data=eph_reg, mapping = aes(x=aedu, y=ila, color=region_est1)) + geom_point() ``` ] <br /> Bien! Mucho mejor ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-11-1.png" width="504" /> ] --- ## Visualizar: ggplot() Empezemos a sumar detalles a nuestro gráfico. -- Cambiemos la leyenda para que la etiqueta sea *"Región"* y no que de con el nombre original de la variable -- .pull-left[ .inter[ ```r ggplot( data=eph_reg %>% filter(ila < outlier), mapping = aes(x=aedu, y=ila, color=region_est1)) + geom_point() + * labs(color = "Región") ``` ] Cada nuevo atributo lo agregamos con `+` ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-12-1.png" width="504" /> ] --- ## Visualizar: ggplot() Y si en vez de diferenciar por colores, queremos diferenciar cada región con un trama o forma distinta? -- Podemos! Basta cambiar `color()` por `shape()` .pull-left[ .inter[ ```r ggplot( data=eph_reg, * mapping = aes(x=aedu, y=ila, shape=region_est1)) + geom_point()+ * labs(shape= "Región") ``` ] Y ahora debemos indicar que el `labs` aplica sobre el atributo `shape` en vez de color como antes ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-13-1.png" width="504" /> ] --- ## Visualizar: ggplot() Volviendo a nuesto intento original, de mostrar la relación entre educación e ingresos a nivel individual, un scatter no era la opción mas adecuada para observaciones a nivel de inviduo. -- Esto ocurre a menudo con los graficos, **depende lo que queremos mostrar** un tipo de grafico se adecua mejor o es más indicado -- Con datos por individuo modelando un ajuste, se puede mostrar esa relación y la diferencia entre regiones más claramente .pull-left[ .inter[ ```r ggplot( data=eph_ind %>% filter(ila < outlier), mapping = aes(x=aedu, y=ila, color=region_est1)) + * geom_smooth() + labs(colour = "Region") ``` ] `geom_smooth()` es la manera de graficar el ajuste entre dos variables ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-14-1.png" width="504" /> ] --- ## Visualizar: ggplot() Bien, ya encontramos dos maneras distintas de representar lo que queriamos. Ahora, sigamos sumando detalles y mejorando el gráfico, indiquemos por ejemplo más adecuadamente los ejes La función `xlab()` e `ylab()` hacen este trabajo de manera simple: .pull-left[ .inter[ ```r ggplot( data=eph_ind %>% filter(ila < outlier), mapping = aes(x=aedu, y=ila, color=region_est1)) + geom_smooth() + labs(colour = "Region") + * xlab("Años de educación") + * ylab("Ingreso Laboral") ``` ] ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-15-1.png" width="504" /> ] --- ## Visualizar: ggplot() Si no especificamos nada, R por sí solo determina cuál es el tipo de ajuste, pero entre los argumentos podemos declarar un modelo. Por ejemplo, para un ajuste lineal: .pull-left[ .inter[ ```r ggplot( data=eph_ind %>% filter(ila < outlier), mapping = aes(x=aedu, y=ila, color=region_est1)) + * geom_smooth(method = lm, formula = 'y ~ x') + labs(colour = "Region") + xlab("Años de educación") + ylab("Ingreso Laboral") ``` ] ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-16-1.png" width="504" /> ] --- ## Visualizar: ggplot() Como toda función, conociendo sus argumentos propios podemos ir customizando el output. Este es un trabajo específico que debemos hacer con cada `geom_` que elejimos, para poder explotar toda la versatilidad que ofrece R Por ejemplo, para omitir el intervalo de confianza especificamos el argumento `se` como `FALSE` y .pull-left[ .inter[ ```r ggplot( data=eph_ind %>% filter(ila < outlier), mapping = aes(x=aedu, y=ila, color=region_est1)) + * geom_smooth(method = lm, formula = 'y ~ x', se = FALSE) + labs(colour = "Region") + xlab("Años de educación") + ylab("Ingreso Laboral") ``` ] ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-17-1.png" width="504" /> ] --- ## Visualizar: ggplot() Rapidamente uno puede tentarse a sentirse **abrumado** por las múltiples opciones de configuración y atributos disponibles -- Esto es completamente normal -- Hagamos un breve repaso: -- Los argumentos básicos para ggplot son: - `data=` - `maaping = aes()` -- Una vez especificados estos debemos definir un - `geom_` --- ## Visualizar: ggplot() Dentro de `aes()` debemos especificar si o si - `maaping = aes()` - `eje x` - `eje y` -- Y luego podemos incorporar una serie de atributos - `maaping = aes()` - `color=` - `shape=` - `fill=` - `linetype=` -- Cuya función es aplicar una especie de `"by"`, es decir realizar una distinción por alguna categoría que especificamos mediante una variable -- Por ejemplo, `color=region` realiza el gráfico indicado distinguiendo por regiones mediante colores --- ## Visualizar: ggplot() Ahora bien, hay dos **niveles** para definir `aes()`: -- **GLOBAL** VS **LOCAL** -- .pull-left[ Cuando lo definimos a nivel **GLOBAL** cada elemento subsiguiente **hereda** ese atributo -- Entonces se aplica a todos los `geom_()` que definamos luego, y vale por sobre el resto ] .pull-right[ Pero también cada `geom_()` puede recibir un argumento `aes()`, en este caso su alcance es a nivel **LOCAL** -- Dentro de ese objeto geométrico y no aplica al resto de los elementos, pero sí respeta lo que haya sido definido a nivel global previamente ] --- ## Visualizar: ggplot() -- .pull-left[ **GLOBAL** .inter[ ```r ggplot( data=eph_reg %>% filter(ila < outlier), * mapping = aes(x=aedu, y=ila, color=region_est1)) + geom_point() + geom_smooth(method = lm, formula = 'y ~ x', se = FALSE) + labs(color = "Región") ``` ] En este caso la diferenciación por color aplica a todo lo que viene por debajo, es decir tanto a `geom_point()`, como a `geom_smooth()` ] .pull-right[ **LOCAL** .inter[ ```r ggplot( data=eph_reg %>% filter(ila < outlier), mapping = aes(x=aedu, y=ila)) + * geom_point(aes(color=region_est1)) + geom_smooth(method = lm, formula = 'y ~ x', se = FALSE) + labs(color = "Región") ``` ] En este caso la diferenciación por color solo aplica y vale dentro `geom_point()`, mientras a que `geom_smooth()` no aplica este atributo ] --- ## Visualizar: ggplot() .pull-left[ **GLOBAL** <img src="RClase4_files/figure-html/unnamed-chunk-18-1.png" width="504" /> ] .pull-right[ **LOCAL** <img src="RClase4_files/figure-html/unnamed-chunk-19-1.png" width="504" /> ] --- ## Visualizar: ggplot() Bien, ya está clara la distinción entre los alcances y niveles del `aes()` -- Ahora es MUY importante distinguir que -- `aes(color= )` != `color= ` -- Porque -- `aes(color=variable)` != `color=valor` -- Ejemplo -- `aes(color=region_est1)` != `color="red"` -- De la misma manera -- `aes(shape=region_est1)` != `shape=23` --- ## Visualizar: ggplot() .pull-left[ **MAPPING AESTHETIC** .inter[ ```r ggplot( data=eph_reg %>% filter(ila < outlier), mapping = aes(x=aedu, y=ila)) + * geom_point(aes(color=region_est1)) + labs(color = "Región") ``` ] En este caso el atributo `color` entra en el **aesthetic** y por tanto le corresponde una variable de la base de datos -- La cantidad de valores distintos de esa variable, define la cantidad de colores que se toma de la paleta estandar de ggplot ] .pull-right[ **CHOOSING COLOR** .inter[ ```r ggplot( data=eph_reg %>% filter(ila < outlier), mapping = aes(x=aedu, y=ila)) + * geom_point(color="red") + labs(color = "Región") ``` ] En este caso `color` simplemente, toma una valor (*"red"*) de los multiples valores posibles -- No estamos mapeando ninguna variable del dataframe a la visualización, solamente eligiendo un color determinado para todos los puntos ] --- ## Visualizar: ggplot() .pull-left[ **MAPPING AESTHETIC** <img src="RClase4_files/figure-html/unnamed-chunk-20-1.png" width="504" /> ] .pull-right[ **CHOOSING COLOR** <img src="RClase4_files/figure-html/unnamed-chunk-21-1.png" width="504" /> ] --- ## Visualizar: ggplot() .pull-left[ **MAPPING AESTHETIC** .inter[ ```r ggplot( data=eph_reg %>% filter(ila < outlier), mapping = aes(x=aedu, y=ila)) + * geom_point(aes(shape=region_est1)) + labs(color = "Región") ``` ] ] .pull-right[ **CHOOSING SHAPE** .inter[ ```r ggplot( data=eph_reg %>% filter(ila < outlier), mapping = aes(x=aedu, y=ila)) + * geom_point(shape=23) + labs(color = "Región") ``` ] ] --- ## Visualizar: ggplot() .pull-left[ **MAPPING AESTHETIC** <img src="RClase4_files/figure-html/unnamed-chunk-22-1.png" width="504" /> ] .pull-right[ **CHOOSING SHAPE** <img src="RClase4_files/figure-html/unnamed-chunk-23-1.png" width="504" /> ] --- ## Visualizar: ggplot() Bien, ya nos vamos ordenando de a poco -- Pero... cómo saber que `shape=23` es el triangulito??? <br /> -- El lado bueno de R es que es realmente versatil y permite casi cualquier personalización en los graficos -- Esto por supuesto implica que haya realmente muchas opciones para `color`, `fill`, `shape`, `linetype`, `linewidth` <br /> -- El secreto es tener un buen resumen o compilado amigable ([como este](https://cran.r-project.org/web/packages/ggplot2/vignettes/ggplot2-specs.html)) o como [cheatsheet](https://posit.co/wp-content/uploads/2022/10/data-visualization-1.pdf) de ggplot que ayuda mucho --- ## Visualizar: ggplot() Opciones de `color` y `fill` -- <img src="inputs/Clase4/color.png" width="25%" height="25%" style="display: block; margin: auto;" /> Para ver en detalle [aquí](https://r-graph-gallery.com/ggplot2-color.html) . Además R ofrece 657 colores distintos, que pueden explorar tipeando en la consola `colors()` Pero también pueden definir y crear cualquier color que quieran con el [código hex](https://www.rapidtables.com/web/color/RGB_Color.html) y pasarlo como valor --- ## Visualizar: ggplot() Opciones de `shape` -- <img src="inputs/Clase4/shape.png" width="30%" height="30%" style="display: block; margin: auto;" /> Para algunos tips y ejemplos con shapes puede visitar [esta página](https://www.datanovia.com/en/blog/ggplot-point-shapes-best-tips/) --- ## Visualizar: ggplot() Opciones de `lynetype` -- <img src="inputs/Clase4/linetype.png" width="35%" height="35%" style="display: block; margin: auto;" /> --- ## Visualizar: ggplot() Para terminar, recordemos algo que ya sabemos -- Cada `geom_()` tiene, además, la posibilidad de especificar y usar sus argumentos propios -- Por ejemplo `method = lm` o `formula = 'y ~ x'` es un argumento propio y exclusivo `geom_smooth()`, que no podemos pasarle a otra `geom_` <br> -- Es importante revisar siempre la [referencia y la documentación](https://ggplot2.tidyverse.org/reference/) para poder explotar al máximo cada las funcionalidades de ggplot -- Dar con el argumento adecuado es tan valioso como generar correctamente la base de datos, por eso tomense su tiempo para leer y encontrarlos a la hora de graficar --- ## Visualizar: ggplot() Bien, con esta puesta a punto y todo el material a la mano, sigamos. -- Para seguir explorando otras opciones de visualización, probemos con una relación distinta. -- Analicemos si existió una expansión educativa a lo largo de los años. -- Para eso generemos la variable cohorte de nacimiento y luego, en base a esta, una variable de década y calculemos el promedio de años de educación para cada una ```r eph_coh <- eph_ind %>% filter(edad %in% (25:75)) %>% mutate(cohorte = ano - edad) %>% mutate(decada = case_when(cohorte %in% (1940:1949) ~ 1940, cohorte %in% (1950:1959) ~ 1950, cohorte %in% (1960:1969) ~ 1960, cohorte %in% (1970:1979) ~ 1970, cohorte %in% (1980:1989) ~ 1980, cohorte %in% (1990:1999) ~ 1990)) eph_coh_años <- eph_coh %>% group_by(decada) %>% summarise( aedu = weighted.mean(aedu, pondera, na.rm=T) ) ``` --- ## Visualizar: ggplot() Para representar la evolución de los años de educación grafiquemos una linea que pase por este valor para cada cohorte En nuestro `eje x ` declaramos entonces la década y en el `eje y` la medida de educación. Dado que queremos una línea el geom adecuado es `geom_line()` .pull-left[ .inter[ ```r ggplot( data=eph_coh_años, * mapping = aes(x=decada, y=aedu)) + * geom_line() + xlab("Decada Nacimiento") + ylab("Años de educación Promedio") ``` ] ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-28-1.png" width="504" /> ] --- ## Visualizar: ggplot() Podemos customizar la linea, especificando un color y tamaño. -- De nuevo aquí, precisamos conocer cuáles son los argumentos que nos habilitan este tipo de modificaciones Hasta ahora solo generamos el output del gráfico, pero una gran facilidad de ggplot() es que podemos guardarlos en un objeto: .pull-left[ .inter[ ```r my_plot <- ggplot( data=eph_coh_años, mapping = aes(x=decada, y=aedu)) + * geom_line(size=1.5, color="blue") + xlab("Decada Nacimiento") + ylab("Años de educación Promedio") *my_plot ``` ] En el objeto *my_plot* guardamos toda la configuración del gráfico ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-29-1.png" width="504" /> ] --- ## Visualizar: ggplot() Si combinamos `geom_line()` con `geom_point()` podemos generar una linea que conecta los puntos de los datos. -- Dentro de esta última función ademas podemos especificar el tipo de forma que queremos, el color y otros atributos .pull-left[ .inter[ ```r my_plot <- ggplot( data=eph_coh_años, mapping = aes(x=decada, y=aedu)) + * geom_line(size=1.5, color="blue") + * geom_point(shape=21, color="black", * fill="#69b3a2", size=6) + xlab("Decada Nacimiento") + ylab("Años de educación Promedio") my_plot ``` ] ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-30-1.png" width="504" /> ] --- ## Visualizar: ggplot() Al principio dijimos que visualizar es más que generar un gráfico lindo. Analicemos el último gráfico. El aumento que vemos parece muy marcado y el mensaje puede ser de una marcada evolución de punta a punta. Sin embargo hay que considerar la escala en el eje y. Si cambiamos esta escala la historia que contamos es mas moderada. .pull-left[ .inter[ ```r ggplot( data=eph_coh_años, mapping = aes(x=decada, y=aedu)) + * geom_line(size=1.5, color="blue") + * geom_point(shape=21, color="black", * fill="#69b3a2", size=6) + xlab("Decada Nacimiento") + ylab("Años de educación Promedio") + * ylim(0,15) ``` ] Visualizar correctamente implica tener en cuenta estos aspectos para comunicar un mensaje adecuado ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-31-1.png" width="504" /> ] --- ## Visualizar: ggplot() Al guardar los gráfico, una vez definidos `aes()` y `geom_`, podemos agregar nuevos atributos al objeto de forma directa Esto nos ahorra escribir todo el gráfico nuevamente, además de permitirnos volver a correrlo cuando querramos solo llamando al objeto .pull-left[ .inter[ ```r my_plot <- my_plot + * ylim(0,15) + * labs(title = "Expansión educativa en Argentina", * subtitle = "Evolución de Años de educación promedio") + theme(axis.text = element_text( angle = 90, color="#69b3a2", size=14) ) my_plot ``` ] Para sumar atributos lo hacemos igual que antes con el `+` Como si estuviéramos continuando con la especificación previa ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-32-1.png" width="504" /> ] --- ## Visualizar: ggplot() Otra manera de analizar la expansión educativa, es calculando la proporción de personas que alcanzan cada nivel -- Un gráfico de barras diferenciando por categorías nos permitiría visualizar cómo han ido cambiando la cantidad de personas en cada peldaño de la escalera educativa -- Para ello, necesitamos calcular la cantidad de personas para cada nivel educativo en cada década y luego expresar esa cantidad en términos del total de personas de una misma década. -- Con los contenidos de la clase 2 y 3 podemos hacerlo sin problema ```r eph_coh_nivel <- eph_coh %>% group_by(decada, nivel) %>% summarise(pob = sum(pondera, na.rm=T)) %>% group_by(decada) %>% mutate(share = round(pob*100/sum(pob), digits=2), cum = cumsum(share)) ``` --- ## Visualizar: ggplot() Si pensamos en un gráfico de barra, la manera de instrumentarlo es con `geom_bar()` o `geom_col()` -- Ambos son muy similares, aunque `geom_col()` representa los valores que ya se encuentran calculado en los datos, mientras que `geom_bar()` cuenta directamente los casos que corresponden a cada grupo del eje x -- .pull-left[ .inter[ ```r educ_p <- ggplot( data=eph_coh_nivel, mapping = aes(x=decada, y= share, fill=nivel)) + * geom_col() educ_p ``` ] En nuestro caso aplicamos `geom_col()` y le indicamos de rellenar las barras en con las distintas categoríaas educativas Para saber cuál conviene usar según el tipo de datos recomiendo revisar al [documentación](https://ggplot2.tidyverse.org/reference/geom_bar.htmlhttps://ggplot2.tidyverse.org/reference/geom_bar.html) ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-34-1.png" width="504" /> ] --- ## Visualizar: ggplot() Notamos que nos quedan los niveles invertidos, una vez mas debemos investigar los argumentos en la [documentación](https://ggplot2.tidyverse.org/reference/geom_bar.htmlhttps://ggplot2.tidyverse.org/reference/geom_bar.html) para encontrar que con el argumento `position` y `reverse = TRUE` logramos exactamente esto .pull-left[ .inter[ ```r educ_p <- ggplot( data=eph_coh_nivel, mapping = aes(x=decada, y=share, fill=nivel)) + * geom_col(position = position_fill( * reverse = TRUE)) educ_p ``` ] ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-35-1.png" width="504" /> ] --- ## Visualizar: ggplot() Por qué definimos `fill=` y no `color=` en este caso? -- Porque color refiere al borde y fill al interior: .pull-left[ .inter[ ```r educ_p_no <- ggplot( data=eph_coh_nivel, mapping = aes(x=decada, y=share, * color=nivel)) + geom_col(position = position_fill( reverse = TRUE)) educ_p_no ``` ] ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-36-1.png" width="504" /> ] --- ## Visualizar: ggplot() Agreguemos detalles a la versión correcta. Los valores para cada cohorte en el eje x, leyendas cortas y otra paleta de colores. Gran parte de estas opciones están agrupadas en la familia de funciones que empiezan con `scale_` y lo que sigue es el elemento que queremos intervenir. .pull-left[ .inter[ ```r educ_p + ylab("Porcentaje") + xlab("Decada de Nacimiento") + scale_x_continuous(breaks = seq(1940,1990,10) ) + scale_fill_viridis_d(name="Logro Educativo", labels = c("Nunca", "Prim. Incomp", "Prim. Comp.", "Sec. Incomp", "Sec. Comp", "Sup. Incomp", "Sup. Comp")) ``` ] ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-37-1.png" width="504" /> ] --- ## Visualizar: ggplot() Agreguemos detalles a la versión correcta. Los valores para cada cohorte en el eje x, leyendas cortas y otra paleta de colores. Gran parte de estas opciones están agrupadas en la familia de funciones que empiezan con `scale_` y lo que sigue es el elemento que queremos intervenir. .pull-left[ .inter[ ```r educ_p + ylab("Porcentaje") + xlab("Decada de Nacimiento") + scale_x_continuous(breaks = seq(1940,1990,10) ) + scale_fill_viridis_d(name="Logro Educativo", labels = c("Nunca", "Prim. Incomp", "Prim. Comp.", "Sec. Incomp", "Sec. Comp", "Sup. Incomp", "Sup. Comp")) ``` - `scale_x_continuos` refiere a opciones para las escalas del eje x que es continuo - `scale_fill_viridis_d` llama a la paleta `viridis` y permite configurar los elementos relacionados a la variable que define el `fill` ] ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-38-1.png" width="504" /> ] --- ## Visualizar: ggplot() Bien, avanzamos un poco más y es un buen momento para reordenar elementos -- Hemos visto funciones **por fuera de `aes()` y `geom_()`** que nos permiten agregar elementos los graficos y personalizarlos -- Recordemos: - `labs()` - `title()` - `subtitle()` - `guides()` - `xlim()` - `xlab` / `ylab()` - `theme(axis.text = element_text() )` -- Algunas de estas a veces cumplen la misma función y cualquiera de las dos es una forma correcta --- ## Visualizar: ggplot() .pull-left[ .tiny[ ```r ggplot( data=eph_coh_años, mapping = aes(x=decada, y=aedu)) + geom_line(size=1.5, color="blue") + geom_point(shape=21, color="black", fill="#69b3a2", size=6) + * xlab("Decada Nacimiento") + * ylab("Años de educación Promedio") + * labs(title = "Expansión educativa en Argentina", * subtitle = "Evolución de Años de educación promedio") ``` <img src="RClase4_files/figure-html/unnamed-chunk-39-1.png" width="504" /> ] ] .pull-right[ .tiny[ ```r ggplot( data=eph_coh_años, mapping = aes(x=decada, y=aedu)) + geom_line(size=1.5, color="blue") + geom_point(shape=21, color="black", fill="#69b3a2", size=6) + * labs(title = "Expansión educativa en Argentina", * subtitle = "Evolución de Años de educación promedio", * x = "Decada Nacimiento", * y = "Años de educación Promedio") ``` <img src="RClase4_files/figure-html/unnamed-chunk-40-1.png" width="504" /> ] ] --- ## Visualizar: ggplot() En la última slide introducimos el elemento `scales`, que nos permitía customizar **con mayor grado de detalle** y versatilidad diversos elementos que habíamos intervenido antes con otras funciones, -- Como el caso de los ejes -- Pero también sobre atributos como color, fill, shape, linetype, linewidth -- Personalmente me gusta pensar en `scales` como una forma menos directa, para mas completa de intervenir en una mayor cantidad de aspectos que hacen a estos atributos. -- Nuevamente nos pasa lo mismo, **no hay una sola manera de hacer las cosas** y ambas pueden estar bien -- Lo que sí suele ocurrir es que alguna se adecua mejor al contexto y lo que necesitamos, o simplemente nos resulta mas intuitiva -- En esto *es up-to-you* --- ## Visualizar: ggplot() Lo que sí, si dedicen que es lo mas adecuado, sea cual fuera, no pueden dejar de darle una mirada a la referencia. -- En el caso de `scale`, es mas extensa pero en este material está perfectamente ordenada y explicada: -- [ggplot2: Elegant Graphics for Data Analysis](https://ggplot2-book.org/scales.html) -- Recominedo tener siempre a mano. <br> -- Un tip: A veces tener no intentar cubrir todo de una vez, o cubrirlo teóricamente -- Mas bien una postura funcional, tomar lo que necesitamos según lo que necesitan en ese momento, y la continuas iteraciones, con prueba y error van a hacer que vayan abarcando cada vez los temas. --- ## Visualizar: ggplot() Por último introducimos el concepto de paleta de colores .pull-left[ Una paleta no es mas que una familia de colores que están agrupados por algún criterio y que están *ready-to-use* Llamando una paleta, como hicimos al definir `virids`, automáticamente estaremos incorporando una serie de colores asociados a ella En caso de no definir ninguna paleta, R usará la que tiene por default Ustedes mismos pueden definir su propia paleta o cargar alguna qeu ya está predefinida. En R una de las mas usadas RColorBrewer ] .pull-right[ <img src="inputs/Clase4/rcolorbrewer.png" width="60%" height="90%" style="display: block; margin: auto;" /> ] --- ## Visualizar: ggplot() .pull-left[ .tiny[ Brewer Palete ```r #install.packages("RColorBrewer") library(RColorBrewer) educ_p + ylab("Porcentaje") + * xlab("Decada de Nacimiento") + scale_x_continuous(breaks = seq(1940,1990,10) ) + * scale_fill_brewer(palette="Dark2") ``` <img src="RClase4_files/figure-html/unnamed-chunk-42-1.png" width="504" /> ] ] .pull-right[ .tiny[ Paleta manual ```r educ_p + ylab("Porcentaje") + xlab("Decada de Nacimiento") + scale_x_continuous(breaks = seq(1940,1990,10) ) + * scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9", * "#62DAA6", "#D697D8", "#9D3EC6", "#4393C3")) ``` <img src="RClase4_files/figure-html/unnamed-chunk-43-1.png" width="504" /> ] ] --- ## Visualizar: ggplot() Para finalizar exploremos algunas visualizaciones más, que podemos generar cuando queremso representar la distribución de una variable Para ello usaremos una nueva base como prueba, con datos de México para 2006. Esta base está en formato `.dta` por lo que necesitamos de la libreria `haven` y la función `read_dta()` ```r library(haven) mex_06 <- read_dta("datos/Clase4/mex06_cedlas.dta") %>% filter(!is.na(ipcf) & ipcf!=0) ``` Graficamos un histograma para el ipcf, empleando `geom_histogram()`. Para graficar una distribución, no intervenimos la base, o generamos alguna medida resumen, por grupos por ejemplo, como en el caso anterior. -- Directamente referimos en ggplot a la base con las observaciones a nivel individual. Lo que queremos justamente es ver cómo los valores de variable de interés se distribuyen entre todas las observaciones. --- ## Visualizar: ggplot() Es por eso que el argumento `[w=pondera]` indica que cada observación debe expandirse según la cantidad de individuos que representa. -- El termino `stat(count) / sum(count)` irá dentro de `aes()` ya que define al eje y, indicando que queremos un histograma en proporciones y no en valores absolutos. .pull-left[ .inter[ ```r ggplot(data=mex_06, aes(x=ipcf, weight=pondera)) + geom_histogram(aes(y = stat(count) / sum(count)), bins = 100, color="black", fill="grey") + labs(y="proporción", x="ingreso per cápita familiar") ``` ] ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-45-1.png" width="504" /> ] --- ## Visualizar: ggplot() Nos ocurre la misma distorsión que antes por los valores raros o *outliers*. Esto hace que toda la distribución esté corrida hacia la izquierda Filtremos individuos con ipcf menor a 1500 para evitarlo .pull-left[ .inter[ ```r ggplot(data=mex_06 %>% filter(ipcf < 15000), aes(x=ipcf, weight=pondera)) + geom_histogram(aes(y = stat(count) / sum(count)), bins = 100, color="black", fill="grey") + labs(y="proporción", x="ingreso per cápita familiar") ``` ] ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-46-1.png" width="504" /> ] --- ## Visualizar: ggplot() El siguiente histograma puede ayudarnos a entender por qué es tan común tomarle logaritmos a las variables de ingreso cuando realizamos una estimación Vemoas cómo la distribución se centra y se modera el problema de los valores raros, sin filtrarlos .pull-left[ .inter[ ```r ggplot(data=mex_06, aes(x=log(ipcf), weight=pondera)) + geom_histogram(aes(y = stat(count) / sum(count)), bins = 100, color="black", fill="grey") + scale_x_continuous(breaks = seq(0,15,5))+ labs(y="proporción", x="Log del ingreso per cápita familiar") ``` ] ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-47-1.png" width="504" /> ] --- ## Visualizar: ggplot() Por supuesto, podemos probar con mas o menos bins y ver cómo cambia la figura .pull-left[ .inter[ ```r ggplot(data=mex_06, aes(x=log(ipcf), weight=pondera)) + geom_histogram(aes(y = stat(count) / sum(count)), bins = 20, color="black", fill="grey") + scale_x_continuous(breaks = seq(0,15,5))+ labs(y="proporción", x="Log del ingreso per cápita familiar") ``` ] ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-48-1.png" width="504" /> ] --- ## Visualizar: ggplot() Cuantoas mayores bins fijemos, mas se parece nuestro grafico a una grafico de densidad .pull-left[ .inter[ ```r ggplot(data=mex_06, aes(x=log(ipcf), weight=pondera)) + geom_histogram(aes(y = ..density..), bins = 200, color="black", fill="gray") + geom_density(kernel="gaussian", color="blue3", size=0.7) + labs(y="densidad", x="logaritmo del ingreso per capita familiar") ``` ] ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-49-1.png" width="504" /> ] --- ## Visualizar: ggplot() Los gráficos de densidad son una forma muy directa de analizar la distribución de una variable, y de comparar esa distribución por grupos Veamos un ejemplo, graficando las funciones de densidad del logaritmo del ipcf para las regiones Noroeste y Sur de México. .pull-left[ .inter[ ```r ggplot( data=mex_06 %>% filter(region==1 | region==6), aes(x=log(ipcf), weight=pondera, fill=factor(region))) + geom_density(color="black", alpha = 0.4, size=0.7) + scale_fill_discrete(name="Región", labels=c("Noroeste", "Sur")) + labs(y="densidad", x="logaritmo del ingreso per cápita familiar") ``` ] La función de densidad se logra con `geom_density ` ] .pull-right[ - En `fill=` especificamos la variable región - Queremos solo la región 1 (Noreste) y 6 (Sur), por eso filtramos la base - Dado que region es una variable del tipo numérico, empleamos `factor()` para tratarla como una categórica - `geom_vline()` incorpora una line vertical, que intercepta el eje x en el valor de pobreza en 2006 - Usamos `scale_fill_discrete` para las leyendas y títulos de región ] --- ## Visualizar: ggplot() Los gráficos de densidad son una forma muy directa de analizar la distribución de una variable, y de comparar esa distribución por grupos Veamos un ejemplo, graficando las funciones de densidad del logaritmo del ipcf para las regiones Noroeste y Sur de México. .pull-left[ .inter[ ```r ggplot( data=mex_06 %>% filter(region==1 | region==6), aes(x=log(ipcf), weight=pondera, fill=factor(region))) + geom_density(color="black", alpha = 0.4, size=0.7) + scale_fill_discrete(name="Región", labels=c("Noroeste", "Sur")) + labs(y="densidad", x="logaritmo del ingreso per cápita familiar") ``` ] Con `alpha=` regulamos la transparencia del relleno ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-51-1.png" width="504" /> ] --- ## Visualizar: ggplot() ¿Qué mensajes surgen de este gráfico? -- Las dos distribuciones son claramente diferentes. La distribución del Sur está desplazada a la izquierda, por tanto los individuos de esa región tienen menores ingresos que en el Noroeste Con `geom_vline()` agreguemos una linea vertical que intercepte al eje x en el valor de pobreza en México en 2006 .pull-left[ .inter[ ```r lp=log(608.245) ggplot( data=mex_06 %>% filter(region==1 | region==6), aes(x=log(ipcf), weight=pondera, fill=factor(region))) + geom_density(color="black", alpha = 0.4, size=0.7) + scale_fill_discrete(name="Región", labels=c("Noroeste", "Sur")) + geom_vline(xintercept=lp) + labs(y="densidad", x="logaritmo del ingreso per cápita familiar") ``` ] Una densidad mayor caerá por debajo de la línea de pobreza fijada en la region Sur ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-52-1.png" width="504" /> ] --- ## Visualizar: ggplot() Un Análogo de las funciones de densidad, que informan sobre la distribución de dos variables son los box-plot En ggplot estos se grafican con `geom_box()`. Si replicamos la comparación anterior deberíamos ver que en la región Noreste la media es mas alta y la caja del box-plot está mas comprimida alrededor de ese valor, igual que la densidad .pull-left[ .inter[ ```r ## Figura 2.17 - Box Plot en log por regiones con outliers ggplot( mex_06 %>% filter(region==1 | region==6), aes(x=factor(region), y=log(ipcf), weight=pondera, fill=factor(region))) + geom_boxplot(alpha=0.4) + theme(legend.position="none") + scale_x_discrete(labels = c("Noroeste","Sur")) + labs(x="Región", y ="log ipcf") ``` ] ] .pull-right[ <img src="RClase4_files/figure-html/unnamed-chunk-53-1.png" width="504" /> ] --- ## Visualizar: ggplot() recursos extra Dos material que compilan de manera ordenada y amigable todos los recursos y opciones de ggplot son estos, que recomiendo para profundizar y para tener a mano como consulta al momento de escribir los códigos -[Ggplot Book: Elegant Graphics for Data Analysis](https://ggplot2-book.org/scales.html) -[The R Graph Gallery](https://r-graph-gallery.com/index.html) -- Y por supuesto la cheat-sheet de ggplot - [Ggplot cheatsheet](https://posit.co/wp-content/uploads/2022/10/data-visualization-1.pdf)