Bicycle Traffic Patterns on Seattle’s Fremont Bridge

How usage changes over time and between weekdays and weekends

Author

Maximiliano Bange

Overview

This analysis explores how bicycle traffic across Seattle’s Fremont Bridge has changed over time, with a focus on differences between weekday and weekend usage. Using publicly available city data, I examined long-term trends and daily patterns to understand how commuting behavior compares to recreational cycling.

Data & Tools

The analysis was conducted in R using tidyverse for data manipulation and visualization, and lubridate for working with dates and time-based patterns.

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.1     ✔ stringr   1.5.2
✔ ggplot2   4.0.0     ✔ tibble    3.3.0
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.1.0     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(lubridate)

Load Data

Load 2012-2025 bicycle data from the Fremont Bridge:

bikes <- read_csv("fremont-bridge-counter.csv")
Warning: One or more parsing issues, call `problems()` on your data frame for details,
e.g.:
  dat <- vroom(...)
  problems(dat)
Rows: 112440 Columns: 4
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Date
dbl (3): Fremont Bridge Sidewalks, south of N 34th St Total, Fremont Bridge ...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
bikes |>
glimpse()
Rows: 112,440
Columns: 4
$ Date                                                                 <chr> "…
$ `Fremont Bridge Sidewalks, south of N 34th St Total`                 <dbl> 2…
$ `Fremont Bridge Sidewalks, south of N 34th St Cyclist West Sidewalk` <dbl> 1…
$ `Fremont Bridge Sidewalks, south of N 34th St Cyclist East Sidewalk` <dbl> 8…

This dataset is available from the Seattle Open Data Portal. Each record represents an hourly count of bicycles crossing the Fremont Bridge since 2012.

Limitations of this data:

  • Only one bridge is represented, so it doesn’t reflect city-wide cycling.
  • Direction of travel is inferred by sidewalk (north/south not exact).
  • Weather, maintenance, and sensor outages may influence counts.

Data Prep

Before analyzing trends, the data was cleaned and transformed to extract useful time variables such as year, month, and day of week. I also added a weekend indicator to distinguish commuting patterns from recreational use.

bikes <- bikes |>
  mutate(
    datetime = mdy_hms(Date, tz = "America/Los_Angeles", quiet = TRUE),
    date = as_date(datetime),
    year = year(datetime),
    month = month(datetime, label = TRUE, abbr = TRUE),
    wday = wday(datetime, label = TRUE, abbr = TRUE),
    is_weekend = wday %in% c("Sat", "Sun")
  )

Analysis of Weekdays vs. Weekends

To explore how cycling behavior differs between weekdays and weekends, I categorized each day by using wday() from lubridate and summed the total crossings.

bikes |>
  mutate(
    day_type = if_else(
      wday(date, label = TRUE) %in% c("Sat", "Sun"),
      "Weekend", "Weekday")) |>
group_by(day_type, year) |>
summarize(
  total_crossings = sum(`Fremont Bridge Sidewalks, south of N 34th St Total`, na.rm = TRUE),
  .groups = "drop"
) |>
ggplot(aes(x = year, y = total_crossings, fill = day_type)) +
geom_col(position = "dodge") +
scale_y_continuous(labels = scales::comma) +
labs(
  title = "Weekday vs. Weekend Bicycle Crossings on the Fremont Bridge",
  subtitle = "Comparing total crossings by year from 2012 to 2025",
  caption = "Data available at https://data.seattle.gov/Transportation/Fremont-Bridge-Bicycle-Counter/65db-xm6k/about_data",
  x = "Year",
  y = "Total Bicycle Crossings",
  fill = "Day Type"
) +
theme_minimal()
Warning: Removed 1 row containing missing values or values outside the scale range
(`geom_col()`).

A bar chart comparing total yearly bicycle crossings on the Fremont Bridge between weekdays and weekends. Weekday crossings are higher, reflecting commuter traffic, while weekends show increased rec use in summer months.

This comparison highlights a clear divide between weekday and weekend cycling behavior. Weekdays are dominated by commuter traffic, while weekends reflect more recreational use. Notably, weekend traffic shows a smaller decline during the COVID period compared to weekdays, suggesting that while commuting decreased due to remote work, recreational cycling remained relatively stable. This indicates that the overall dip in bicycle traffic was driven more by changes in work patterns than by a loss of interest in cycling.

Conclusions

We can see that this data unveils the patterns in Seattle’s biking culture. Weekdays are primarily overtaken by commuter traffic, while weekends are more casual and represent a “want over need” crowd. Even though overall biking slowed down around COVID, we can see that was largely due to people being put in positions where they had to work from home. Weekend riders still remained consistent and even spiked a bit, potentially due to people trying out new hobbies with their new found free time.

This highlights Seattle’s rich biking culture and shows that to more accurately gain insight into the number of people biking as a hobby in Seattle, it’s best to check out the weekend numbers to filter out the commuters. This doesn’t mean the commuters are fully out of the picture, because they do actually choose biking as a form of commuting. This analysis also shows how the Fremont Bridge serves as a very important path for commuters and how it’s a staple part of the biking culture in Seattle.