knitr::opts_chunk$set(
  echo = FALSE,      # hide code chunks by default for stakeholders
  message = FALSE,
  warning = FALSE,
  fig.width = 8,
  fig.height = 5,
  dpi = 300)

1 Executive Summary

2 Methodology

Data sources Divvy bike-share trip data for 2019 and 2020, downloaded as CSV files.

Data preparation steps

  1. Standardized column names to the 2020 schema.
  2. Stacked quarterly files, dropping deprecated latitude/longitude and demographic columns.
  3. Cleaned member type labels and removed outlier/maintenance trips.
  4. Added calendar fields (date, weekday) and calculated ride_length.

A complete, reproducible script is contained in the Appendix.

3 Key Findings

3.1 Ride Length Comparison

Average and Median Ride Duration by User Type
User Type Average Duration Median Duration Ride Count
casual 89.5 23.2 67877
member 13.3 8.5 720312

3.2 Ride Volume by Weekday

3.3 Average Duration by Weekday

3.4 Ride Start-Time Distribution

3.5 Top Casual Rider Stations

4 Recommendations

  1. Convert casual riders to members – promote discounted weekend membership plans at lakefront-adjacent stations.
  2. Re-deploy capacity – add docks/bike capacity at top casual stations during summer weekends to meet demand spikes.
  3. Targeted marketing – push in-app notifications highlighting scenic routes to casual riders during peak leisure hours.
  4. Infrastructure partnerships – collaborate with the city to improve signage and bike lanes near tourist areas to further encourage casual ridership.

5 Next Steps

Appendix: Full Reproducible Code

#  Set echo = TRUE so technical readers can review full script
#  (The code above in setup chunk is repeated here for transparency)