Bicycle Network Analysis and Bicycle Commute Mode Share

biking transportation American Community Survey

Do better bike networks lead to more bike commuters?

Harald Kliems https://haraldkliems.netlify.app/
2024-07-01

People for Bikes just published the city rankings from their Bicycle Network Analysis (BNA). Like every year, people will complain about their city scoring too high or too low, or they’ll identify problems with the methodology of the rating. One criticism I have encountered is that the BNA doesn’t take into account actual bike ridership.

There are many good reasons for that, but I was curious: How does a city’s BNA score compare to their bicycle commute mode share? People for Bikes are very transparent about their methods and data, and so this was an easy question to answer. Just download the spreadsheet with the BNA scores, download bicycle commute data from the American Community Survey and plot them against each other.

Show code
library(tidyverse)
library(tidycensus)
library(hrbrthemes)
extrafont::loadfonts()

# # AcS data for commuting
# places_bike_commute <- get_acs(geography = "place", table = "S0801", year = 2022)
# 
# saveRDS(places_bike_commute,"places_bike_commute.RDS")
places_bike_commute <- readRDS(file = "data/places_bike_commute.RDS")

# BNA ratings
bna <- read_csv("data/city-ratings-v24.4.csv")


# data cleaning
bna_plot <- places_bike_commute %>% 
  mutate(GEOID = as.numeric(GEOID)) %>% 
  filter(variable == "S0801_C01_011") %>% 
  filter(estimate > moe) %>% 
  inner_join(bna, by = join_by(GEOID == census_fips_code)) %>% 
  select(NAME, city, census_population, estimate, moe, bna_overall_score, pop_size, state) %>% 
  mutate(pop_size = case_match(pop_size, "large" ~ "large (>300k population)",
                               "medium" ~ "medium (50k-300k population)",
                               "small" ~ "small (<50k population)"),
         name_label = paste0(city, ", ", state),
         NAME = str_remove(NAME, " city"))
  

# plot

bna_plot %>% 
ggplot(aes(bna_overall_score, estimate), group = pop_size) +
  geom_point(aes(color = pop_size), alpha = .5) +
  geom_smooth(method = "lm") +
  labs(x = "BNA score", y = "Bike commute share (%)",
       title = "BNA Score and Bike Commute Mode Share",
       caption = "Data: People for Bikes; American Community Survey 5-year estimates 2018-2022\nPlaces where the mode share estimate is smaller than the margin of error were excluded\nVisualization: Harald Kliems") +
  theme_ipsum_rc() +
  ggrepel::geom_label_repel(data = bna_plot %>% filter(name_label %in% c("Madison, WI", "Davis, CA", "Portland, OR", "Leadville, CO", "Mackinac Island, MI", "Chicago, IL", "Milwaukee, WI", "Mount Hope, OH", "Washburn, WI")), aes(label = name_label)) +
  geom_point(data = bna_plot %>% filter(name_label %in% c("Madison, WI", "Davis, CA", "Portland, OR", "Leadville, CO", "Mackinac Island, MI", "Chicago, IL", "Milwaukee, WI", "Mount Hope, OH", "Washburn, WI")), color = "red") +
  facet_wrap(~ pop_size, scales = "free_y") +
  scale_color_ipsum() +
  theme(legend.position = "none")

Note the different y-axis scales for each city size category. Highlighted are a few cities:

Overall it appears that BNA score and bike commute mode share are positively correlated. We can’t draw any causal conclusions from this, and the plot shows that there is a lot of variability.


  1. There appears to be a large Amish population in the area, which would explain the high bike mode share.↩︎

Citation

For attribution, please cite this work as

Kliems (2024, July 1). Harald Kliems: Bicycle Network Analysis and Bicycle Commute Mode Share. Retrieved from https://haraldkliems.netlify.app/posts/2024-07-01-bicycle-network-analysis-and-bicycle-commute-mode-share/

BibTeX citation

@misc{kliems2024bicycle,
  author = {Kliems, Harald},
  title = {Harald Kliems: Bicycle Network Analysis and Bicycle Commute Mode Share},
  url = {https://haraldkliems.netlify.app/posts/2024-07-01-bicycle-network-analysis-and-bicycle-commute-mode-share/},
  year = {2024}
}