Loading the scorecard…
Rush hour
— mph
20 busiest routes, 7–9 AM and 4–6 PM
Midday
— mph
Same routes, 10 AM–2 PM
Evening rush
— mph
Same routes, 4–6 PM
Other routes
— mph
— other frequent all-day routes at rush hour
What the data shows
The busiest buses are slower
The 20 routes that carry the most riders average — mph at rush hour, counting time at stops and red lights. The city’s other frequent all-day routes, — of them, average — mph at the same hours. — of the 20 busiest routes run slower at rush hour than the typical other route, and — rank in the slower half of the network.
The evening rush is the problem. Morning rush speeds (— mph) are close to midday (— mph). Between 4 and 6 PM the same buses slow to — mph, and the 4 PM hour is the slowest of the day on these routes.
The — is the slowest route on the list at — mph during rush hour. The — lose the most, running about — slower at rush than at midday.
Downtown is where buses crawl. In the Loop, buses average — mph in the evening rush. Outside downtown, the slowest half-miles at rush hour include —.
Fewer stops help. On the same stretches of Ashland, Western and Cottage Grove, express buses that stop about every half mile run — faster than the local in both rush hours.
The scorecard
Twenty routes, ranked by riders
Select a column heading to sort. Speeds are average miles per hour with stops included. The line in each row traces that route’s speed from 5 AM to 11 PM on an average weekday.
Speeds compare the same street segments in every period (see Method). Riders: average weekday boardings, Sep 2025–Aug 2026. Rush: 7–9 AM and 4–6 PM. Change: rush vs midday, with a 95% interval from resampling days. End to end: approximate minutes to ride the route’s main pattern at rush-hour speed. Slowest half-mile: the slowest pair of quarter-mile segments at rush hour on either main direction, at least a mile from the ends of the line, stops included, named by nearest grid streets.
Rush hour vs midday
How much slower at rush hour?
Each line runs from a route’s midday speed to its rush-hour speed. Switch to the morning or evening rush to see which one does the damage.
Through the day
The 4 PM slowdown
Average speed by hour on weekdays, counting all service in each hour. The busiest routes trail the other frequent routes all day, and both bottom out in the 4 PM hour.
Every route, every hour
Each cell is one route’s average speed in that hour. Colors use the same scale as the map below. Focus the chart and use arrow keys to explore cells; Home and End go to the first and last cells.
Where
Where the bus crawls
Average speed every ~220 meters along the 20 routes, both directions and all routes combined in each cell. Switch periods to watch the evening slowdown spread.
All 20 routes combined, by hour
Drag across the chart or use arrow keys to choose an hour.
Cells with fewer than 40 measurements in the period are not drawn. The hourly view counts all service in each hour. Gray route badges indicate little or no service; “few buses” means fewer than 100 measurements in that region. A cell near the end of a route can reflect a bus turning around, and a cell at a busy stop includes boarding time. Focus the map and use arrow keys to explore nearby cells; Home and End go to the first and last cells.
A natural experiment
Express buses on the same streets
Three corridors run a rush-hour express that stops about every half mile beside the local. Compared on the stretches both buses serve, the express is faster in the morning and the evening rush alike, so wider stop spacing is worth real time even in traffic. Express buses barely run at midday, so there is no midday comparison.
Why it matters
Speed is the service
A route that takes less time to run can come more often with the same buses and drivers, so slow streets cost riders twice: once in the trip itself and again in the wait. Riding the whole — takes about — minutes at rush hour versus — at midday.
The city already has a plan to buy that time back. CTA and CDOT’s Better Streets for Buses plan (2023) sets out bus lanes, signal priority and stop changes, and the Bus Priority Corridor Study (October 2025) covers Pulaski, Western and Cottage Grove, three routes on this list. In 2017 the Active Transportation Alliance reported a median CTA route speed of 9.1 mph for 2015 (Back on the Bus). Its method differs from this one, so treat the comparison as context, not a trend line.
Can you trust it?
Data quality and robustness
The archive was profiled before any scorecard query was written. These checks shaped the rules below.
Which days count
What the cleaning removed
Does the day selection matter?
Top-20 speeds under three day lists. No route moves by more than — mph.
Method
How the speeds are measured
What “average speed” means here
CTA Bus Tracker reports each bus’s distance along its route pattern in feet. Speed is that distance divided by the time between GPS fixes: total miles ÷ total hours. It counts time at stops, at red lights and in traffic, which is the time a rider spends on board. It leaves out layovers at the ends of the line, where buses wait on purpose. Transit agencies call this commercial or operating speed. It is not a rider’s full trip time, which also includes walking and waiting.
The same streets in every period
Some trips only run at certain hours. Rush-hour 20 Madison buses continue into slow downtown blocks, for example, and some routes serve their outer ends more at midday. Pooling every measurement by period would mix those differences in with traffic. So each route is measured on a fixed set of ~220 meter segments observed in the morning, midday and evening. Each segment gets the same distance weight in every period. These segments cover — of the distance the 20 routes travel. Without this step, the 20 Madison would appear to slow down 9% at rush hour instead of 3%.
Speeds are pooled as total distance over total time rather than an average of segment speeds, which would overweight short, fast intervals. Each segment is assigned to a time window by its midpoint in Chicago time.
The rules, and why
Checks
A prototype written during profiling and this pipeline produce identical speeds before the fixed-segment step, and a reviewer re-running the pipeline route by route reproduced every figure. A different method, timing each complete trip between points half a mile from either end, agrees with the published speeds within −1.3% to +3.5% on routes 4, 9, 36, 66 and 146. The 95% intervals come from resampling the 20 service days 4,000 times.
Limits
- Five weeks in early fall, with school in session and no snow. Winter and summer speeds will differ.
- No schedule data, so this cannot say whether buses run on time or how speeds compare with what the CTA plans.
- Route speeds are bus-weighted, not rider-weighted. A slow stretch with few riders counts the same as a crowded one.
- Detours appear as they happened. Route 8 ran on Division near Halsted, and route 47 switched to longer patterns on October 17.
- Map cells pool both directions and every route through the cell. A cell near a terminal can show a bus turning around, and a cell at a busy stop includes boarding time.
- The hourly charts use all service in each hour, including trips that only run at some hours.
- The ridership cutoff is close: #20 (47th, 9,545 weekday riders) leads #21 (Fullerton) and #22 (Outer DuSable Lake Shore Express) by about 2%.
Reproduce it
Data, code and SQL
Everything on this page is built by one DuckDB query file and one Python script from public data. Raw positions come from the Chicago Transit Alerts daily archive, collected from CTA Bus Tracker by chicago-transit-insights, and ingested with the chicago-transit-duckdb skill, which checks every file’s SHA-256 and row count.
The scorecard SQL (scorecard.sql)