Analysis

32 - Shelter Equity

Equity and Strategic Planning

Coverage: Coverage window unavailable for this page.

Built 2026-03-03 02:23 UTC · Commit defd5c8

Page Navigation

Analysis Navigation

Data Provenance

flowchart LR
  32_shelter_equity(["32 - Shelter Equity"])
  f1_32_shelter_equity[/"data/bus-stop-usage/wprdc_stop_data.csv"/] --> 32_shelter_equity
  d1_32_shelter_equity(("numpy (lib)")) --> 32_shelter_equity
  d2_32_shelter_equity(("polars (lib)")) --> 32_shelter_equity
  d3_32_shelter_equity(("scipy (lib)")) --> 32_shelter_equity
  classDef page fill:#dbeafe,stroke:#1d4ed8,color:#1e3a8a,stroke-width:2px;
  classDef table fill:#ecfeff,stroke:#0e7490,color:#164e63;
  classDef dep fill:#fff7ed,stroke:#c2410c,color:#7c2d12,stroke-dasharray: 4 2;
  classDef file fill:#eef2ff,stroke:#6366f1,color:#3730a3;
  classDef api fill:#f0fdf4,stroke:#16a34a,color:#14532d;
  classDef pipeline fill:#f5f3ff,stroke:#7c3aed,color:#4c1d95;
  class 32_shelter_equity page;
  class d1_32_shelter_equity,d2_32_shelter_equity,d3_32_shelter_equity dep;
  class f1_32_shelter_equity file;

Findings

Findings: Shelter Equity

Summary

Only 7.3% of PRT bus stops have shelters, yet those sheltered stops serve 31% of total system ridership. Sheltered stops have 5x the median daily usage of unsheltered stops (34 vs 7 riders/day). The most striking gap is among regular bus stops, where just 7% have shelters despite serving the vast majority of riders. Several of the system's busiest stops -- including downtown intersections with 2,000+ daily boardings -- lack any shelter.

Key Numbers

  • 6,719 unique physical stops in the pre-pandemic weekday data
  • 491 (7.3%) have shelters; 6,228 do not
  • Sheltered stops: median 34.3/day, mean 162.6/day
  • Unsheltered stops: median 6.5/day, mean 28.9/day
  • Sheltered stops serve 30.7% of total system ridership despite being only 7% of stops
  • Mann-Whitney U test: p = 9.2e-84 (sheltered stops have significantly higher usage)
  • Bus mode: only 7% sheltered; Busway: 73%; Light Rail: 100%

Observations

  • Shelter placement correlates with usage but leaves major gaps. The top 20 unsheltered stops each see 1,200-2,800 daily riders. The busiest unsheltered stop (7th St at Penn Ave, 2,841/day) handles more riders than all but a handful of sheltered stops.
  • Downtown Pittsburgh has the biggest equity gap. Almost all top unsheltered stops are in the downtown/Oakland corridor (5th Ave, Liberty Ave, Wood St, Stanwix St). These are high-exposure locations where riders wait in weather.
  • PAAC and City of Pittsburgh own most shelters (197 and 174 respectively), with City shelters at higher-usage stops on average (204 vs 165/day).
  • Lamar (advertising) shelters skew low-usage: 100 shelters averaging only 26 riders/day, suggesting ad-driven placement rather than ridership-driven.
  • Heffner shelters also serve low-usage stops (avg 3/day), further suggesting non-ridership factors drive some shelter placement.
  • "Envision Downtown" and "Other" shelters serve the absolute highest-volume locations (2,913 and 1,090/day respectively), but account for only 5 stops total.

Discussion

The shelter coverage gap represents a tangible rider experience problem. The 20 busiest unsheltered stops collectively serve ~35,000 riders per day who wait without weather protection. Given Pittsburgh's climate (Analysis 28 showed snow days and freeze days significantly affect OTP), shelter absence at high-volume stops compounds the negative experience of unreliable service.

The divergence between shelter owners reveals different placement strategies. PAAC and City of Pittsburgh place shelters at moderately high-usage stops (165-204/day), following a ridership-informed approach. Lamar's advertising-driven placements (26/day average) prioritize visibility for ad revenue over rider need, and Heffner's placements (3/day) appear driven by factors entirely unrelated to ridership. This suggests the advertising-shelter model, while providing free infrastructure, does not align with transit equity goals.

The Pareto finding from Analysis 34 (2% of stops serve 50% of riders) frames the opportunity: sheltering just the top 150 unsheltered stops would reach a large share of unprotected riders. At typical shelter costs of $15-30K per installation, covering the top 20 unsheltered stops would cost $300-600K while protecting ~35,000 daily riders -- a strong return on investment.

The downtown equity gap is particularly striking because these stops are the most visible face of the transit system. Visitors and new riders encountering a 2,800-rider/day stop with no shelter receive a signal about the system's investment priorities. Addressing the downtown/Oakland gaps would improve both rider experience and public perception.

Caveats

  • The shelter field in the WPRDC data may not be fully up to date; some shelters may have been added or removed since the data was compiled.
  • "No Shelter" is the default -- stops with missing shelter data are treated as unsheltered, which may slightly overcount the unsheltered total.
  • Usage data is pre-pandemic (FY2019); current ridership patterns at specific stops may have shifted.
  • Light rail shows 100% coverage but only 1 stop appears in the data, so the mode comparison is limited for rail.

Output

Methods

Methods: Shelter Equity

Question

Are bus shelters equitably distributed relative to ridership? Which high-usage stops lack shelters, and does shelter coverage vary by mode or ownership?

Approach

  • Aggregate pre-pandemic weekday ridership to the physical-stop level (summing across routes) to get total daily usage per stop.
  • Classify each stop as sheltered or unsheltered using the shelter column; further break down by shelter owner.
  • Compare median and mean usage between sheltered vs unsheltered stops (Mann-Whitney U test).
  • Compute the share of total system ridership served by sheltered stops.
  • Identify the top high-usage unsheltered stops (ranked by daily ons+offs) as priority candidates for shelter installation.
  • Examine shelter coverage by mode (bus, busway, light rail) and stop type.
  • Generate charts: ridership distribution by shelter status, shelter owner breakdown, and a priority list of unsheltered high-usage stops.

Data

Name Description Source
wprdc_stop_data.csv Stop-level boardings/alightings, shelter status, stop type, mode Local CSV (data/bus-stop-usage/)

Output

  • output/shelter_equity_summary.csv -- per-stop summary with usage and shelter status
  • output/unsheltered_priority.csv -- top unsheltered stops ranked by usage
  • output/ridership_by_shelter.png -- box/violin plot comparing usage distributions
  • output/shelter_coverage_by_mode.png -- bar chart of shelter coverage rates by mode

Sources

NameTypeWhy It MattersOwnerFreshnessCaveat
data/bus-stop-usage/wprdc_stop_data.csv file Referenced via DATA_DIR path composition in analysis script. Local project data owner not specified. Snapshot file; refresh by rerunning its pipeline step. May lag upstream source updates.
numpy dependency Runtime dependency required for this page's pipeline or analysis code. Open-source Python ecosystem maintainers. Version pinned by project environment until dependency updates are applied. Library updates may change behavior or defaults.
polars dependency Runtime dependency required for this page's pipeline or analysis code. Open-source Python ecosystem maintainers. Version pinned by project environment until dependency updates are applied. Library updates may change behavior or defaults.
scipy dependency Runtime dependency required for this page's pipeline or analysis code. Open-source Python ecosystem maintainers. Version pinned by project environment until dependency updates are applied. Library updates may change behavior or defaults.