Python · Tableau
Transit Signal Priority Analysis
Measured whether transit signal priority actually improved WeGo bus schedule stability between February and May 2025, using roughly 1.2 million rows of stop-level data modeled in pandas.
The problem
Transit signal priority lets an approaching bus hold a green light a little longer. The intent is obvious. Whether it measurably helps is not, because buses run late for many reasons that have nothing to do with signals: boarding time, traffic, weather, and the simple fact that a bus already behind schedule collects more riders at every stop.
The question was whether the improvement survived once those other explanations were accounted for, rather than whether the after-period simply looked better than the before-period.
What I built
A reproducible pandas pipeline that took raw stop-level records and produced a clean, analysis-ready table, feeding Tableau views built for transit planners rather than for analysts.
Every step lives in code, so re-running the analysis on a new date range is a parameter change instead of an afternoon of manual work.
How it works
The core measure is schedule deviation: for each stop event, how far off the scheduled time the bus actually was. Aggregating that naively across a whole route hides everything interesting, so the analysis holds the comparison at the corridor and time-of-day level.
That grouping matters more than any single statistic. A corridor that runs freely at ten in the morning and seizes up at five in the afternoon will show almost no change in a daily average, while showing a very real change in the window that riders actually feel.
Cleaning consumed most of the effort. Roughly 1.2 million rows carried duplicate pings, impossible timestamps, and trips that ended before they started. Those get filtered explicitly and counted, so the volume of discarded data is visible instead of quietly shrinking the sample.
What it produced
Dashboards a planner can open and read directly, comparing before and after by corridor and by time of day, with the underlying counts shown so nobody has to take a percentage on faith.
The honest finding was that the effect was uneven. Signal priority helped meaningfully in some windows and did close to nothing in others, which is more useful for deciding where to expand it than a single headline number would have been.
Let's work together
I'm open to data analyst roles and freelance analytics work. Whether you have a question or just want to say hi, my inbox is always open.
Say hello