4 de marzo de 2020

R Ladies Medellín

Segundo encuentro

Agenda

  • Datos abiertos

  • ggplot2

  • Construcción de gráficos

Enlaces del taller

Enlaces del taller

Datos abiertos Colombia

Datos abiertos Medellín

Encuesta Juventud

Objetivo: Conocer y medir la realidad actual y futura de la juventud de la ciudad.

ggplot2

¡Manos a la obra!

Paquetes que estaremos usando:

Paquetes que estaremos usando:

  • readr: Proporciona una forma rápida y amigable de leer datos.
  • ggplot2: Crea visualizaciones elegantes de datos.
  • plotly: Crea gráficos interactivos.
  • dplyr : Manipula datos de una forma más fácil.
  • scales: Personaliza las escalas de los ejes de los gráficos.
  • RColorBrewer: Proporciona varias paletas de colores.

NOTA: para descargar un paquete puedes utilizar la función install.packages("nombre del paquete") y para usarlo o importarlo debes usar library(nombre del paquete).

Lectura de datos

library(readr)

Datos = read.csv2("https://raw.githubusercontent.com/RLadiesMedellin/Meetup2-Tallerggplot2/master/Data/EncuestaJuventud.csv", 
              header = TRUE, sep = ";", dec = ",")

head(Datos[,1:8], n = 5)
##   Edad RangoEdad   Sexo EstadoCivil TipoLocalidad  Comuna        Zona
## 1   18     18-21 Hombre  Soltero(a)        COMUNA Popular NORORIENTAL
## 2   24     22-26 Hombre  Soltero(a)        COMUNA Popular NORORIENTAL
## 3   18     18-21  Mujer  Soltero(a)        COMUNA Popular NORORIENTAL
## 4   22     22-26  Mujer  Soltero(a)        COMUNA Popular NORORIENTAL
## 5   19     18-21 Hombre  Soltero(a)        COMUNA Popular NORORIENTAL
##     Estrato
## 1 Estrato 2
## 2 Estrato 2
## 3 Estrato 2
## 4 Estrato 2
## 5 Estrato 2

Estructura de un gráfico de ggplot2

  • Los gráficos están formados por distintas capas de elementos gramaticales.

  • Las capas se vinculan entre sí a través de un mapeo estético (aesthetic mapping).

Graficando con ggplot2

La primera y segunda capa son esenciales a la hora de construir cualquier gráfico con ggplot2.

library(ggplot2)

ggplot(data = Datos, aes(x = Edad, y = GastoSemanalRumba)) #Capa base

Graficando con ggplot2

ggplot(data = Datos, aes(x = Edad, y = GastoSemanalRumba)) +
  geom_point() #Capa de puntos

Lo anterior es equivalente a:

ggplot(data = Datos) +
  geom_point(aes(x = Edad, y = GastoSemanalRumba)) #Capa de puntos

Agregando más capas…

ggplot(data = Datos, aes(x = Edad, y = GastoSemanalRumba)) +
  geom_point() + 
  facet_wrap(~ Sexo)

Agregando más capas…

ggplot(data = Datos, aes(x = Edad, y = GastoSemanalRumba)) +
  geom_point() + facet_wrap(~ Sexo) +
  stat_smooth(method = "lm", se = F, col = "red")

Agregando más capas…

ggplot(data = Datos, aes(x = Edad, y = GastoSemanalRumba)) +
  geom_point() + facet_wrap(~ Sexo) + stat_smooth(method = "lm", se = F, col = "red") + 
  scale_y_continuous("Gasto semanal en Rumba", breaks = seq(0,125000,10000))

Agregando más capas…

Finalmente, también podemos modificar el “tema” del gráfico:

ggplot(data = Datos, aes(x = Edad, y = GastoSemanalRumba)) + geom_point() +
  facet_wrap(~ Sexo) + stat_smooth(method = "lm", se = F, col = "red") + 
  scale_y_continuous("Gasto semanal en Rumba", breaks = seq(0,125000,10000)) +
  theme_bw()

Añadiendo más variables (I)…

Podemos personalizar más nuestro gráfico añadiendo más variables en los argumentos estéticos de color o tamaño.

ggplot(data = Datos, aes(x = Edad, y = GastoSemanalRumba, color = Sexo)) +
  geom_point()

Podemos añadir interactividad:

library(plotly)

Plot = ggplot(data = Datos, aes(x = Edad, y = GastoSemanalRumba, color = Sexo)) +
  geom_point()

ggplotly(Plot)

Añadiendo más variables (II)…

ggplot(data = Datos) +
  geom_point(aes(x = Edad, y = GastoSemanalRumba, size = GastoSemanalTransporte),
             alpha = 0.5)

Ahora es tu turno…

Trata de escribir un código para obtener un gráfico como el siguiente:

Solución:

ggplot(data = Datos, aes(x = Edad, y = GastoSemanalRumba, colour = Sexo)) +
  geom_point(size = 2) + 
  theme_dark() +
  scale_x_continuous(breaks = seq(14,26,2)) +
  labs(y = "Gasto semanal en Rumba") +
  facet_wrap(~ Estrato) 

Usando otros tipos de gráficos…

Podemos utilizar otras opciones geométricas (geoms):

ggplot(data = Datos, aes(x = Sexo, y = GastoSemanalRumba)) +
  geom_boxplot()

Cambiemos un poco el aspecto del gráfico anterior…

ggplot(data = Datos, aes(x = Sexo, y = GastoSemanalRumba, fill = Sexo)) +
  geom_boxplot() + 
  theme_bw() + #Tema de fondo del gráfico
  theme(legend.position="top", plot.title = element_text(face = "bold", 
                                                         size =12,
                                                         hjust = 0.5), 
        plot.subtitle = element_text(size = 10, hjust = 0.5)) + 
  labs(y = "Gastos semanales en pesos",
       title = "Gastos semanales en rumba vs sexo", subtitle = "Taller ggplot2",
       caption = "Encuesta Juventud | MEDATA")

Cambiemos un poco el aspecto del gráfico anterior…

Podemos editar más características:

ggplot(data = Datos, aes(x = Sexo, y = GastoSemanalRumba, fill = Sexo)) + 
  geom_boxplot()+ 
  theme_bw() + theme(legend.position="top", plot.title = element_text(face = "bold",
                                                         size = 12,hjust = 0.5),
                     plot.subtitle = element_text(size = 10, hjust = 0.5),
                     axis.text.x = element_text(size = 12, angle = 45,
                                                colour = "blue", vjust = 0.5)) + 
  labs(y = "Gastos semanales en pesos", title = "Gastos semanales en rumba vs sexo",
       subtitle = "Taller ggplot2", caption = "Encuesta Juventud | MEDATA")

Percepción sobre las oportunidades para estudiar:

library(scales)
library(dplyr)

Datos %>% group_by(ValoracionOportunidadesDeLaCiudadParaEstudiar) %>% 
  summarise(Frecuencia = n()) %>% 
  ggplot(aes(x= ValoracionOportunidadesDeLaCiudadParaEstudiar, y= Frecuencia)) + 
   geom_bar(stat = "identity", width = 0.5, fill = "#702899") +
   theme_bw() + labs(x = "Oportunidades para estudiar")

Función coord_flip:

Datos %>% group_by(ValoracionOportunidadesDeLaCiudadParaEstudiar) %>% 
  summarise(Frecuencia = n()) %>%
  ggplot(aes(x= ValoracionOportunidadesDeLaCiudadParaEstudiar, y= Frecuencia)) +
  geom_bar(stat = "identity", width = 0.5, fill = "#702899") + theme_bw() +
  labs(x = "Oportunidades para estudiar") + coord_flip()

¿Cómo ordenar categorías del eje X y agregar etiquetas de datos?

Datos %>% 
  group_by(ValoracionOportunidadesDeLaCiudadParaEstudiar) %>% 
  summarise(Frecuencia = n()) %>% 

 ggplot(aes(x= ValoracionOportunidadesDeLaCiudadParaEstudiar, y= Frecuencia)) + 
   geom_bar(stat = "identity", width = 0.5, fill = "#702899") +
   theme_bw() +
   labs(x = "Oportunidades para estudiar")+
   geom_text(size = 3.5,aes(label = Frecuencia), vjust = -0.5)+ 
   scale_y_continuous(breaks = seq(0,4000,500)) +
   scale_x_discrete(limits = c("Muy desfavorable", "Desfavorable",
                               "Ni favorable/ Ni desfavorable",
                               "Favorable", "Muy favorable")) 

¿Cómo ordenar categorías del eje X y agregar etiquetas de datos?

Percepción sobre las oportunidades para estudiar por sexo:

Esto podemos hacerlo utilizando la función facet_wrap.

Datos %>% group_by(ValoracionOportunidadesDeLaCiudadParaEstudiar, Sexo) %>%
  summarise(Frecuencia = n()) %>% 
  ggplot(aes(x= ValoracionOportunidadesDeLaCiudadParaEstudiar, y= Frecuencia)) + 
   geom_bar(stat = "identity", width = 0.5, fill = "#702899") +
   theme_bw() +
   labs(x = "Oportunidades para estudiar")+
   geom_text(size = 3.5,aes(label = Frecuencia), vjust = -0.5)+ 
   scale_y_continuous(breaks = seq(0,4000,500)) +
   scale_x_discrete(limits = c("Muy desfavorable", "Desfavorable",
                               "Ni favorable/ Ni desfavorable",
                               "Favorable", "Muy favorable")) +
   facet_wrap(~ Sexo) #También podemos jugar con el argumento scales

Percepción sobre las oportunidades para estudiar por sexo:

Mejoremos el aspecto de las etiquetas del eje X:

Datos %>% group_by(ValoracionOportunidadesDeLaCiudadParaEstudiar, Sexo) %>%
  summarise(Frecuencia = n()) %>% 
  ggplot(aes(x= ValoracionOportunidadesDeLaCiudadParaEstudiar, y= Frecuencia)) + 
   geom_bar(stat = "identity", width = 0.5, fill = "#702899") +
   theme_bw() +
   labs(x = "Oportunidades para estudiar")+
   geom_text(size = 3.5,aes(label = Frecuencia), vjust = -0.5)+ 
   scale_y_continuous(breaks = seq(0,4000,500)) +
   scale_x_discrete(limits = c("Muy desfavorable", "Desfavorable",
                               "Ni favorable/ Ni desfavorable",
                               "Favorable", "Muy favorable"),
                    labels = c("Muy \ndesfavorable", "Desfavorable",
                               "Ni favorable \nNi desfavorable",
                               "Favorable", "Muy \nfavorable")) +
   facet_wrap(~ Sexo) 

Mejoremos el aspecto de las etiquetas del eje X:

Ahora es tu turno…

Realiza un diagrama de barras que relacione la variable “Estudia” con la variable “Trabaja”.

Solución

Datos %>% group_by(Estudia, Trabaja) %>%
  summarise(Frecuencia = n()) %>% 
  ggplot(aes(x= Estudia, y= Frecuencia, fill = Trabaja)) + 
   geom_bar(stat = "identity", width = 0.5, position = "dodge") +
   theme_bw() 

Histograma

ggplot(Datos, aes(x=Edad))+
  geom_histogram(breaks = seq(14,26,1), fill="#702899", color="black", bins = 10) +
  theme_bw() + 
  labs(y = "Frecuencia") + 
  scale_x_continuous(breaks = seq(14,26,2))

Agregando líneas y texto…

ggplot(Datos, aes(x=Edad))+
  geom_histogram(breaks = seq(14,26,1), fill="#702899", color="black", bins = 10) +
  theme_bw() + labs(y = "Frecuencia") + scale_x_continuous(breaks = seq(14,26,2)) +
  geom_vline(xintercept = 18,linetype="dashed", size=1.5, colour="#b82b14") +
  annotate("text", label = "Mayores de edad", x = 22, y = 1600, size = 6, 
           colour = "#b82b14") 

Capa de densidad en el histograma:

ggplot(Datos, aes(x=Edad))+
  geom_histogram(breaks = seq(14,26,1), aes(y =..density..),
                 fill="#702899", color="black", bins = 10) +
  geom_density(fill="gray", alpha = 0.5, lwd = 0.7) +
  theme_bw() + labs(y = "Densidad") + 
  scale_x_continuous(breaks = seq(14,26,2)) 

Paletas de colores

library(RColorBrewer) #Paleta de colores
ggplot(Datos, aes(x=Edad, colour = Sexo, fill = Sexo))+
  geom_histogram(breaks = seq(14,26,1), bins = 10, position = "dodge", alpha = 0.7)+
  theme_bw() + labs(y = "Frecuencia") + scale_x_continuous(breaks = seq(14,26,2)) +
  scale_color_brewer(palette="Dark2") +
  scale_fill_brewer(palette="Dark2")

Otras capas geométricas que podemos utilizar:

Algunos ejemplos adicionales:

Cheat Sheet

Recuerda seguirnos en redes sociales para estar atentos a nuestros próximos eventos:

  • Twitter: @RLadiesMedellin
  • Facebook: R-Ladies Medellín
  • Instagram: rladiesmedellin2
  • Meetup: R-Ladies Medellín
  • Github: RLadiesMedellin

Agradecimientos

¡Muchas gracias!