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()
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))
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.
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.
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.
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…
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
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.
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))