Las visualizaciones son representaciones visuales de datos cuantitativos y cualitativos. No es suficiente contar con los datos para comprenderlos.

A partir de las visualizaciones, es posible resumir datos de manera sencilla e intuitiva, ver y comprender tendencias, valores atípicos y patrones en los datos, y hacer visibles los contrastes, ritmos y eventos que los datos expresan

Existen numerosas herramientas de visualización de datos a partir de elementos visuales como tablas, gráficos y mapas.

Para realizar gráficos, podemos utilizar la librería ggplot2 que forma parte de la colección tidyverse. Recuerden instalar previamente la librería con install.packages():

# install.packages("tidyverse")
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✔ ggplot2 3.3.5     ✔ purrr   0.3.4
## ✔ tibble  3.1.3     ✔ dplyr   1.0.9
## ✔ tidyr   1.1.3     ✔ stringr 1.4.0
## ✔ readr   2.1.2     ✔ forcats 0.5.1
## Warning: package 'readr' was built under R version 4.0.5
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()

Sobre el dataset

Vamos a trabajar con datos de uso de bicicletas públicas entre octubre 2021 y noviembre 2021. Los datos originales fueron obtenidos de BADATA.
Sobre los datos originales, se realizó un geoproceso para obtener los nombres del barrio y de la comuna donde se ubica la estación de origen y la estación de llegada. También se realizó un ruteo a partir de datos de OSM para calcular la distancia y la duración estimada.

El dataset puede descargarse desde Github.

bicicletas_raw <- read.csv("https://raw.githubusercontent.com/paulavidela/utdt_cienciadedatos/main/data/bicicletas-GCBA-oct-nov-2021.csv",  header=TRUE, stringsAsFactors=TRUE, encoding = "UTF-8")

En primer lugar vamos a inspeccionar nuestra base de datos:

names(bicicletas_raw)
##  [1] "periodo_recorrido"       "fecha_origen_recorrido" 
##  [3] "nombre_estacion_origen"  "barrio_estacion_origen" 
##  [5] "comuna_estacion_origen"  "fecha_destino_recorrido"
##  [7] "nombre_estacion_destino" "barrio_estacion_destino"
##  [9] "comuna_estacion_destino" "modelo_bicicleta"       
## [11] "duracion_calculada_min"  "duracion_osrm_min"      
## [13] "distancia_osrm_km"

Sobre las variables:
- periodo_recorrido: corresponde al año-mes del inicio del recorrido
- fecha_origen_recorrido: corresponde a la fecha del origen del recorrido
- nombre_estacion_origen: corresponde al nombre de la estación de origen del recorrido
- barrio_estacion_origen: corresponde al barrio de la estación de origen del recorrido
- comuna_estacion_origen: corresponde al comuna de la estación de origen del recorrido
- fecha_destino_recorrido: corresponde a la fecha del destino del recorrido
- nombre_estacion_destino: corresponde al nombre de la estación de destino del recorrido
- barrio_estacion_destino: corresponde al barrio de la estación de destino del recorrido
- comuna_estacion_destino: corresponde al comuna de la estación de destino del recorrido
- modelo_bicicleta: corresponde al modelo de la bicicleta elegida
- duracion_calculada_min: corresponde a la duración del recorrido en minutos (según origen-destino)
- duracion_osrm_min: corresponde a la duración del recorrido calculada por OSRM
- distancia_osrm_km: corresponde a la distancia recorrida según OSRM

head(bicicletas_raw)
##   periodo_recorrido  fecha_origen_recorrido nombre_estacion_origen
## 1           2021-10 2021-10-09 16:03:42 UTC         002 - RETIRO I
## 2           2021-10 2021-10-09 14:53:58 UTC         002 - RETIRO I
## 3           2021-10 2021-10-09 10:30:22 UTC         002 - RETIRO I
## 4           2021-10 2021-10-09 15:00:35 UTC         002 - RETIRO I
## 5           2021-10 2021-10-09 17:47:07 UTC         002 - RETIRO I
## 6           2021-10 2021-10-09 15:09:20 UTC         002 - RETIRO I
##   barrio_estacion_origen comuna_estacion_origen fecha_destino_recorrido
## 1                 RETIRO                      1 2021-10-09 16:42:33 UTC
## 2                 RETIRO                      1 2021-10-09 15:08:53 UTC
## 3                 RETIRO                      1 2021-10-09 11:06:05 UTC
## 4                 RETIRO                      1 2021-10-09 16:36:00 UTC
## 5                 RETIRO                      1 2021-10-09 18:00:17 UTC
## 6                 RETIRO                      1 2021-10-09 16:02:43 UTC
##        nombre_estacion_destino barrio_estacion_destino comuna_estacion_destino
## 1 254 - PLAZA RAFAEL HERNANDEZ                BELGRANO                      13
## 2               032 - CATEDRAL             SAN NICOLAS                       1
## 3          292 - PLAZA BOLIVIA                 PALERMO                      14
## 4          006 - PARQUE LEZAMA               SAN TELMO                       1
## 5          237 - MADERO OFFICE           PUERTO MADERO                       1
## 6                  250 - FLENI                BELGRANO                      13
##   modelo_bicicleta duracion_calculada_min duracion_osrm_min distancia_osrm_km
## 1           ICONIC                     39             36.91              8.88
## 2           ICONIC                     15             10.56              2.01
## 3           ICONIC                     36             28.41              6.86
## 4           ICONIC                     95             20.38              4.36
## 5              FIT                     13              8.50              1.78
## 6           ICONIC                     53             35.91              8.66
str(bicicletas_raw)
## 'data.frame':    511597 obs. of  13 variables:
##  $ periodo_recorrido      : Factor w/ 2 levels "2021-10","2021-11": 1 1 1 1 1 1 1 1 1 1 ...
##  $ fecha_origen_recorrido : Factor w/ 470709 levels "2021-09-30 19:58:09 UTC",..: 58804 58297 56942 58337 59615 58402 58398 59285 56654 57474 ...
##  $ nombre_estacion_origen : Factor w/ 271 levels "001 - FACULTAD DE DERECHO",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ barrio_estacion_origen : Factor w/ 47 levels "AGRONOMIA","ALMAGRO",..: 29 29 29 29 29 29 29 29 29 29 ...
##  $ comuna_estacion_origen : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ fecha_destino_recorrido: Factor w/ 467136 levels "2021-10-01 00:00:10 UTC",..: 58335 57713 56540 58286 58919 58066 58073 58914 56232 56889 ...
##  $ nombre_estacion_destino: Factor w/ 273 levels "001 - FACULTAD DE DERECHO",..: 192 28 217 6 181 189 189 194 96 2 ...
##  $ barrio_estacion_destino: Factor w/ 47 levels "AGRONOMIA","ALMAGRO",..: 5 32 21 33 27 5 5 5 28 29 ...
##  $ comuna_estacion_destino: int  13 1 14 1 1 13 13 13 2 1 ...
##  $ modelo_bicicleta       : Factor w/ 2 levels "FIT","ICONIC": 2 2 2 2 1 2 1 2 1 2 ...
##  $ duracion_calculada_min : int  39 15 36 95 13 53 54 58 20 7 ...
##  $ duracion_osrm_min      : num  36.9 10.6 28.4 20.4 8.5 ...
##  $ distancia_osrm_km      : num  8.88 2.01 6.86 4.36 1.78 8.66 8.66 9.31 3.33 0 ...

Llama la atención la cantidad de niveles (levels) que tienen las fechas. Deberíamos convertir las fechas a formato fecha.

summary(bicicletas_raw)
##  periodo_recorrido             fecha_origen_recorrido
##  2021-10:246419    2021-11-26 15:55:38 UTC:     6    
##  2021-11:265178    2021-10-04 14:11:18 UTC:     5    
##                    2021-10-05 18:22:00 UTC:     5    
##                    2021-10-06 15:38:16 UTC:     5    
##                    2021-10-15 20:24:22 UTC:     5    
##                    2021-10-20 20:25:52 UTC:     5    
##                    (Other)                :511566    
##                    nombre_estacion_origen barrio_estacion_origen
##  014 - PACIFICO               :  6894     PALERMO    : 98039    
##  009 - PARQUE LAS HERAS       :  5512     RECOLETA   : 53619    
##  160 - GODOY CRUZ Y LIBERTADOR:  5401     BALVANERA  : 33400    
##  005 - PLAZA ITALIA           :  5337     CABALLITO  : 28047    
##  096 - CARLOS GARDEL          :  5333     SAN NICOLAS: 26794    
##  147 - CONSTITUCIÓN           :  5178     (Other)    :269219    
##  (Other)                      :477942     NA's       :  2479    
##  comuna_estacion_origen            fecha_destino_recorrido
##  Min.   : 1.000         2021-11-17 19:42:12 UTC:     6    
##  1st Qu.: 2.000         2021-11-26 18:57:54 UTC:     6    
##  Median : 6.000         2021-10-05 14:10:45 UTC:     5    
##  Mean   : 7.459         2021-10-05 15:08:14 UTC:     5    
##  3rd Qu.:14.000         2021-10-05 16:24:27 UTC:     5    
##  Max.   :15.000         2021-10-25 20:31:01 UTC:     5    
##  NA's   :2479           (Other)                :511565    
##                   nombre_estacion_destino barrio_estacion_destino
##  014 - PACIFICO               :  6660     PALERMO    : 97560     
##  160 - GODOY CRUZ Y LIBERTADOR:  5548     RECOLETA   : 53610     
##  009 - PARQUE LAS HERAS       :  5533     BALVANERA  : 33526     
##  096 - CARLOS GARDEL          :  5415     CABALLITO  : 27389     
##  147 - CONSTITUCIÓN           :  5262     SAN NICOLAS: 26506     
##  005 - PLAZA ITALIA           :  5089     (Other)    :270507     
##  (Other)                      :478090     NA's       :  2499     
##  comuna_estacion_destino modelo_bicicleta duracion_calculada_min
##  Min.   : 1.000          FIT   :227668    Min.   :   1.00       
##  1st Qu.: 2.000          ICONIC:283929    1st Qu.:  10.00       
##  Median : 6.000                           Median :  16.00       
##  Mean   : 7.431                           Mean   :  20.45       
##  3rd Qu.:14.000                           3rd Qu.:  25.00       
##  Max.   :15.000                           Max.   :7258.00       
##  NA's   :2499                                                   
##  duracion_osrm_min distancia_osrm_km
##  Min.   : 0.00     Min.   : 0.000   
##  1st Qu.: 7.17     1st Qu.: 1.500   
##  Median :11.18     Median : 2.360   
##  Mean   :12.63     Mean   : 2.737   
##  3rd Qu.:16.71     3rd Qu.: 3.660   
##  Max.   :74.71     Max.   :17.280   
## 

Observamos algunas curiosidades:
- las comunas (que son categorías, hay solo 15 en la Ciudad Autónoma de Buenos Aires) son tratadas como valores continuos
- la duración máxima de viajes es de 7258 minutos (¡más de 120hs!)
- hay registros que no tienen barrio/comuna

Vamos a preprocesar los datos para tener una base más limpia. Para eso vamos a filtrar los recorridos sin barrio/comuna y de duración mayor a 6hs (360 min) utilizando la función filter(). Además vamos a transformar las comuna a factor utilizando las funciones mutate() y as_factor().

bicicletas <- bicicletas_raw %>%
  filter(!is.na(barrio_estacion_origen) 
         & !is.na(barrio_estacion_destino) 
         & duracion_calculada_min <= 360)  %>%
  mutate(comuna_estacion_origen = as_factor(comuna_estacion_origen), 
         comuna_estacion_destino = as_factor(comuna_estacion_destino))

Primeros pasos en ggplot

ggplot()

¡Tenemos nuestro primer gráfico en R! El problema es que está vacío… Vamos a incorporar información.

ggplot(bicicletas)

Aún no ocurrió nada… Necesitamos incorporar una capa de geometría. Empecemos con los histogramas.

Histograma

Un histograma toma como entrada solo una variable numérica. La variable se divide en varios contenedores y el número de observaciones por contenedor está representado por la altura de la barra. Es posible representar la distribución de varias variables en un mismo eje usando esta técnica. (Fuente: Data-to-viz)
Para nuestro primer histograma, vamos a tomar como variable numérica la hora de inicio.

ggplot(bicicletas) + 
  geom_histogram(aes(x = duracion_calculada_min))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

A diferencia de otros paquetes de tidyverse que usan el pipe ‘%>%’ del paquete magrittr, ggplot tiene otra lógica: las capas de información se suman.
Es importante determinar el aes(): son los atributos estéticos, es decir son las variables (columnas) por las que vamos a graficar.

El gráfico no parece ser muy significativo: la mayoría de los recoridos duran menos de 120 min. Vamos a filtrar esos datos.
Vamos a suponer que un recorrido lógico dura como mucho 6 horas (360 min)

bicicletas_120min <- bicicletas %>%
  filter(duracion_calculada_min <= 120)

Veamos ahora el gráfico

ggplot(bicicletas_120min) + 
  geom_histogram(aes(x = duracion_calculada_min))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Vemos que la mayoría de los recorridos duran menos de 40min: en su mayoría parecerían ser viajes cortos.

Podemos mejorar nuestro gráfico agregando por ejemplo títulos. Para eso, vamos a utilizar la función labs()

ggplot(bicicletas_120min) + 
  geom_histogram(aes(x = duracion_calculada_min)) + 
  labs(title = "Distribución de viajes según duración", 
       subtitle = "Recorridos en bicicleta de menos de 2hs realizados entre octubre y noviembre 2021", 
       y = "Cantidad", 
       x = "Duración (min)", 
       caption = "Fuente: BADATA")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

También podemos cambiar el fondo aplicando otro tema con las funciones que inician con theme_...().
Por ejemplo:
- theme_minimal()
- theme_dark()
- theme_light()
- theme_bw()
- theme_classic()

ggplot(bicicletas_120min) + 
  geom_histogram(aes(x = duracion_calculada_min)) + 
  labs(title = "Distribución de viajes según duración", 
       subtitle = "Recorridos en bicicleta de menos de 2hs realizados entre octubre y noviembre 2021", 
       y = "Cantidad", 
       x = "Duración (min)", 
       caption = "Fuente: BADATA")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Para hacer estos últimos gráficos, generamos un nuevo objeto: bicicletas_120min. Podríamos haber evitado generar el objeto, y realizar el filtro dentro del mismo código del gráfico:

ggplot(bicicletas %>%
  filter(duracion_calculada_min <= 120)) + 
  geom_histogram(aes(x = duracion_calculada_min)) + 
  labs(title = "Distribución de viajes según duración", 
       subtitle = "Recorridos en bicicleta de menos de 2hs realizados entre octubre y noviembre 2021", 
       y = "Cantidad", 
       x = "Duración (min)", 
       caption = "Fuente: BADATA")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

También podríamos haber realizado el filtro y luego concatenado el gráfico (podemos concatenar ggplot utilizando el pipe)

bicicletas %>%
  filter(duracion_calculada_min <= 120) %>%
  ggplot() + 
  geom_histogram(aes(x = duracion_calculada_min)) + 
  labs(title = "Distribución de viajes según duración", 
       subtitle = "Recorridos en bicicleta de menos de 2hs realizados entre octubre y noviembre 2021", 
       y = "Cantidad", 
       x = "Duración (min)", 
       caption = "Fuente: BADATA")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

El resultado que se obtiene es exactamente el mismo.

Gráfico de barras

Un gráfico de barras muestra la relación entre una variable numérica y categórica. Cada entidad de la variable categórica se representa como una barra. El tamaño de la barra representa su valor numérico. A menudo es necesario ordenar las barras y proporcionar una buena anotación. (Fuente: Data-to-viz)

Vamos a tomar como variable categórica la comuna de la estación de origen.

ggplot(bicicletas) + 
  geom_bar(aes(x = comuna_estacion_origen ))

Para profundizar, veamos que ocurre con los barrios.

ggplot(bicicletas) + 
  geom_bar(aes(x = barrio_estacion_origen ))

El gráfico es poco claro. Podemos girar los ejes con la función coord_flip() para simplificar la lectura.

ggplot(bicicletas) + 
  geom_bar(aes(x = barrio_estacion_origen ))+
  coord_flip()

El gráfico se leería mejor si los datos estuviesen ordenados.

viajes_x_barrio <- bicicletas %>%
  group_by(barrio_estacion_origen, comuna_estacion_origen) %>%
  summarise(n = n())
## `summarise()` has grouped output by 'barrio_estacion_origen'. You can override
## using the `.groups` argument.
head(viajes_x_barrio)
## # A tibble: 6 × 3
## # Groups:   barrio_estacion_origen [6]
##   barrio_estacion_origen comuna_estacion_origen     n
##   <fct>                  <fct>                  <int>
## 1 AGRONOMIA              15                      1946
## 2 ALMAGRO                5                      25564
## 3 BALVANERA              3                      33278
## 4 BARRACAS               4                       8540
## 5 BELGRANO               13                     24249
## 6 BOCA                   4                       5698

Ahora si, vamos a visualizarlo

ggplot() + 
  geom_bar(data = viajes_x_barrio, aes(x = reorder(barrio_estacion_origen, n), weight = n ))+
  coord_flip()

Vamos a agregar colores y títulos

ggplot() + 
  geom_bar(data = viajes_x_barrio, 
           aes(x = reorder(barrio_estacion_origen, n),
               weight = n , 
               fill = n))+
  coord_flip()+ 
  labs(title = "Cantidad de recorridos según barrio de origen", 
       subtitle = "Viajes en bicicleta realizados entre octubre y noviembre 2021", 
       y = "Cantidad", 
       x = "Barrio",
       fill = "Cantidad",
       caption = "Fuente: BADATA") + 
  theme_light()

Podemos transformar la escala de colores. Por ejemplo, podriamos invertir la escala de colores que viene por defecto

ggplot() + 
  geom_bar(data = viajes_x_barrio, 
           aes(x = reorder(barrio_estacion_origen, n),
               weight = n , 
               fill = n))+
  coord_flip()+ 
  labs(title = "Cantidad de recorridos según barrio de origen", 
       subtitle = "Viajes en bicicleta realizados entre octubre y noviembre 2021", 
       y = "Cantidad", 
       x = "Barrio",
       fill = "Cantidad",
       caption = "Fuente: BADATA") + 
  scale_fill_continuous(trans = 'reverse') + 
  theme_light()

Las escalas de color funcionan de la siguiente manera:
- todas comienza con scale_
- la siguiente palabra corresponde al tipo de variable que da el color. En nuestro caso, se trata de fill. Entonces deberíamos utilizar una función del tipo: scale_fill_
- por último, el tipo de paleta que queremos utilizar: algunos ejemplos son vidiris, brewer, gradient, continous entre otros.

Probemos utilizando otra escala de color.

ggplot() + 
  geom_bar(data = viajes_x_barrio, 
           aes(x = reorder(barrio_estacion_origen, n),
               weight = n , 
               fill = n))+
  coord_flip()+ 
  labs(title = "Cantidad de recorridos según barrio de origen", 
       subtitle = "Viajes en bicicleta realizados entre octubre y noviembre 2021", 
       y = "Cantidad", 
       x = "Barrio",
       fill = "Cantidad",
       caption = "Fuente: BADATA") + 
  theme_light() +
  scale_fill_viridis_c(direction = -1)

¿Qué ocurre si ajustamos el color?

ggplot() + 
  geom_bar(data = viajes_x_barrio, 
           aes(x = reorder(barrio_estacion_origen, n),
               weight = n , 
               color = n))+
  coord_flip()+ 
  labs(title = "Cantidad de recorridos según barrio de origen", 
       subtitle = "Viajes en bicicleta realizados entre octubre y noviembre 2021", 
       y = "Cantidad", 
       x = "Barrio",
       color = "Cantidad",
       caption = "Fuente: BADATA") + 
  theme_light() +
  scale_color_viridis_c(direction = -1)

Color es para ajustar el perímetro de la geometría (en el caso de los puntos aplica a todo el punto). Relleno (fill) es para ajustar el relleno de la geometría.

Podríamos ajustar el relleno por una variable y mantener el color del perímetro fijo.

ggplot() + 
  geom_bar(data = viajes_x_barrio, 
           aes(x = reorder(barrio_estacion_origen, n),
               weight = n , 
               fill = n), 
           color = "black")+
  coord_flip()+ 
  labs(title = "Cantidad de recorridos según barrio de origen", 
       subtitle = "Viajes en bicicleta realizados entre octubre y noviembre 2021", 
       y = "Cantidad", 
       x = "Barrio",
       fill = "Cantidad",
       caption = "Fuente: BADATA") + 
  theme_light() +
  scale_fill_viridis_c(direction = -1)

También podríamos ajustar cada parámetro según una variable. En ese caso, las variables van dentro de los atributos estéticos aes()

ggplot() + 
  geom_bar(data = viajes_x_barrio, 
           aes(x = reorder(barrio_estacion_origen, n),
               weight = n , 
               fill = n, 
               color = comuna_estacion_origen))+
  coord_flip()+ 
  labs(title = "Cantidad de recorridos según barrio de origen", 
       subtitle = "Viajes en bicicleta realizados entre octubre y noviembre 2021", 
       y = "Cantidad", 
       x = "Barrio",
       fill = "Cantidad",
       caption = "Fuente: BADATA") + 
  theme_light() +
  scale_fill_distiller(palette = "Greys", direction = -1)

El gráfico queda un poco desprolijo, al final vamos a ver como mejorarlo.

Gráfico de dispersión

Un diagrama de dispersión muestra la relación entre 2 variables numéricas. Para cada punto de datos, el valor de su primera variable se representa en el eje X, el segundo en el eje Y. (Fuente: Data-to-viz)

Nuestro dataset cuenta con pocas variables numéricas. Vamos a tomar la hora de inicio y la duración del recorrido.

ggplot(bicicletas) + 
  geom_point(aes(x = distancia_osrm_km, y = duracion_osrm_min))

Vamos a generar una nueva variable que relacione la comuna de origen y la comuna de destino. Para eso, utilizamos nuevamente la función mutate()

ggplot(bicicletas) + 
  geom_point(aes(x = distancia_osrm_km, 
                 y = duracion_osrm_min, 
                 color = comuna_estacion_origen))

Veamos el comportamiento para la comuna 13

bicicletas %>%
  filter(comuna_estacion_origen == 13) %>%
  ggplot() + 
  geom_point(aes(x = distancia_osrm_km, 
                 y = duracion_osrm_min, 
                 color = barrio_estacion_origen), 
             alpha = 0.5) + 
  labs(title = "Relación entre la duración y la distancia", 
     subtitle = "Según OSRM para recorridos realizados entre octubre y noviembre 2021", 
     y = "Distancia (km)", 
     x = "Duración (min)",
     color = "Barrio",
     caption = "Fuente: BADATA") + 
  theme_light() 

Otra forma de buscar diferencias dentro de una misma variable es con un facetado. Este nos permite “separar” las distintas categorías

bicicletas %>%
  filter(comuna_estacion_origen == 13) %>%
  ggplot() + 
  geom_point(aes(x = distancia_osrm_km, 
                 y = duracion_osrm_min, 
                 color = barrio_estacion_origen), 
             alpha = 0.5) + 
  labs(title = "Relación entre la duración y la distancia", 
     subtitle = "Según OSRM para recorridos realizados entre octubre y noviembre 2021", 
     y = "Distancia (km)", 
     x = "Duración (min)",
     color = "Barrio",
     caption = "Fuente: BADATA") + 
  theme_light()  + 
  facet_wrap(~barrio_estacion_origen)

Veamos como se relaciona la duración estimada por OSRM vs la duración calculada

ggplot(bicicletas) + 
  geom_point(aes(x = duracion_calculada_min, 
                 y = duracion_osrm_min), 
             alpha = 0.05) 

Una gran cantidad de viajes tienen una duración según OSRM de 0min pero una duración calculada. Es muy probable que se trate de recorridos circulares.

Probemos filtrar los viajes circulares y aquellos viajes de menos 75min (no hay viajes estimados por OSRM con menos de 75min)

ggplot(bicicletas %>%
         filter(duracion_calculada_min <= 75,
                as.character(nombre_estacion_origen) != as.character(nombre_estacion_destino))) + 
  geom_point(aes(x = duracion_calculada_min, 
                 y = duracion_osrm_min), 
             alpha = 0.05) 

La relación no parece muy evidente…

Mapa de calor (heatmap)

Un mapa de calor es un gráfico donde los valores individuales se contienen en una matríz. (Fuente: Data-to-viz)

Vamos a calcular la cantidad de viajes según comuna de origen y comuna de destino para cada periodo (año-mes)

comunas_od <- bicicletas %>%
  group_by(periodo_recorrido, comuna_estacion_origen, comuna_estacion_destino) %>%
  summarise(cantidad = n())
## `summarise()` has grouped output by 'periodo_recorrido',
## 'comuna_estacion_origen'. You can override using the `.groups` argument.
ggplot(comunas_od) +
  geom_tile(aes(x = comuna_estacion_origen, y = comuna_estacion_destino, fill = cantidad))

Cambiemos la escala de color

ggplot(comunas_od) +
  geom_tile(aes(x = comuna_estacion_origen, y = comuna_estacion_destino, fill = cantidad)) + 
  scale_fill_viridis_c(option = "A", direction = -1)

La diagonal muestra una predominancia de viajes desde y hacia la misma comuna. Las comunas 1 y 14 presentan una gran cantidad de viajes. Hay pares también notorios como las comunas 14-2

Gráfico de cajas

Un diagrama de caja da un buen resumen de una o varias variables numéricas. La línea que divide la caja en 2 partes representa la mediana de los datos. El final del cuadro muestra los cuartiles superior e inferior. Las líneas extremas muestran el valor más alto y más bajo excluyendo los valores atípicos. (Fuente: Data-to-viz)

ggplot() + 
  geom_boxplot(data = bicicletas, aes(x= modelo_bicicleta, y = duracion_calculada_min))

Vamos a realizar este gráfico, para valores de menos de 100min.

bicicletas %>%
  filter(duracion_calculada_min <= 100 ) %>% 
  ggplot() + 
  geom_boxplot( aes(x = modelo_bicicleta, y = duracion_calculada_min)) 

Vemos que no hay casi variación en la duración de los recorridos según tipo de bicicleta.

¿Cómo varía según la comuna de origen?

bicicletas %>%
  filter(duracion_calculada_min <= 100 ) %>% 
  ggplot() + 
  geom_boxplot( aes(x = comuna_estacion_origen, y = duracion_calculada_min)) 

En la comuna 8 los viajes son más largos.

Configuraciones particulares

Podemos realizar algunos ajustes particulares a la estética de los gráficos. Tomemos el siguiente gráfico

ggplot() + 
  geom_bar(data = viajes_x_barrio, 
           aes(x = reorder(barrio_estacion_origen, n),
               weight = n , 
               fill = n, 
               color = comuna_estacion_origen))+
  coord_flip()+ 
  labs(title = "Cantidad de recorridos según barrio de origen", 
       subtitle = "Viajes en bicicleta realizados entre octubre y noviembre 2021", 
       y = "Cantidad", 
       x = "Barrio",
       fill = "Cantidad",
       caption = "Fuente: BADATA") + 
  theme_light() +
  scale_fill_distiller(palette = "Greys", direction = -1)

Vamos a utilizar la función theme() para realizar más configuraciones

# para evitar notación científica
options(scipen = 20)
ggplot() + 
  geom_col(data = viajes_x_barrio, 
           aes(x = reorder(barrio_estacion_origen, n),
               y = n , 
               fill = n, 
               color = comuna_estacion_origen))+
  coord_flip()+ 
  labs(title = "Cantidad de recorridos según barrio de origen", 
       subtitle = "Viajes en bicicleta realizados entre octubre y noviembre 2021", 
       y = "Cantidad", 
       x = "Barrio",
       color = "Comuna",
       caption = "Fuente: BADATA") + 
  theme_light() +
  scale_fill_distiller(palette = "Greys", direction = 1,guide = "none") + 
  scale_y_continuous(breaks = seq(0, 100000, 20000)) +
  guides(color=guide_legend(title.position = "top", nrow=1)) +
  theme(panel.background = element_rect(fill = "white", color = "gray10", linetype = "dashed"), 
        legend.position = "bottom", 
        legend.key.size = unit(0.4, 'cm'), 
        legend.title = element_text(size = 6), 
        legend.text = element_text(size = 6), 
        axis.text.x = element_text(colour = "black",size = 6), 
        axis.text.y = element_text(colour = "black",size = 6))