Skip to content

Instantly share code, notes, and snippets.

@MokeEire
Created October 30, 2021 04:13
Show Gist options
  • Save MokeEire/339d496389c8c680a72a9c43d5fd57bb to your computer and use it in GitHub Desktop.
Save MokeEire/339d496389c8c680a72a9c43d5fd57bb to your computer and use it in GitHub Desktop.
Visualizing Google Maps Trip Durations (distributions)
library(tidyverse)
library(lubridate)
library(ggdist)
library(distributional)
tibble::tribble(~departure_time, ~duration_min, ~duration_max,
"9:00am", lubridate::dminutes(65), dminutes(100),
#"9:15am", lubridate::dminutes(70), dminutes(100),
"9:30am", lubridate::dminutes(70), dminutes(110),
#"9:45am", lubridate::dminutes(70), dminutes(110),
"10:00am", lubridate::dminutes(75), dminutes(130),
#"10:15am", lubridate::dminutes(75), dminutes(130),
"10:30am", lubridate::dminutes(80), dminutes(130),
#"10:45am", lubridate::dminutes(80), dminutes(140),
"11:00am", lubridate::dminutes(80), dminutes(140),
"11:30am", lubridate::dminutes(80), dminutes(140),
"12:00pm", lubridate::dminutes(85), dminutes(140),
"12:30pm", lubridate::dminutes(85), dminutes(140),
"1:00pm", lubridate::dminutes(85), dminutes(140),
"1:30pm", lubridate::dminutes(85), dminutes(140),
"2:00pm", lubridate::dminutes(85), dminutes(140)) %>%
mutate(departure = ymd_hm(paste(today()+days(1), departure_time))) %>%
rowwise() %>%
mutate(duration_mean = dseconds(mean(c_across(contains("duration")))),
duration_sd = dseconds(sd(c_across(contains("duration")))),
duration_dist = dist_normal(as.integer(duration_mean), as.integer(duration_sd))) %>%
ggplot(., aes(x = departure, y = duration_mean, dist = dist_normal(as.integer(duration_mean), as.integer(duration_sd)),
ymin = duration_min, ymax = duration_max))+
stat_dist_halfeye(size = 4, stroke = 2, alpha = .95)+
geom_line(linetype = "dashed", size = 1, alpha = .7)+
scale_y_continuous(name = "Trip time", breaks = 60*60*0:3, labels = ~str_c(hour(seconds_to_period(dseconds(.))), "hr"))+
scale_x_time(name = "Departure time",labels = scales::label_time("%I:%M%p"),
breaks = scales::breaks_width("30 min"))+
labs(title = "Trip duration, by departure time",
subtitle = "Based on departure between 9:00am and 2:00pm")+
theme_minimal(base_size = 18)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment