Inspiration

My grandma travels to the polyclinic every Friday, and I wanted to build something that makes that trip easier for her and for seniors like her. On a map, her trip looks simple. In practice, the walk to the bus stop is long and there's an overhead bridge on the way. That got us asking how Singapore measures transport accessibility, and the usual measures turn out to be built around the average commuter. A 600m walk is nothing at 30 and can be too far at 80 with a walking aid, and a bridge without a lift stops a wheelchair user completely. We wanted planners to see the city the way our grandparents move through it.

What it does

We score every town on how well seniors can reach care (Active Ageing Centres, polyclinics, hospitals) and transport (bus stops, MRT exits, cycling paths). Then we flag where the gap between seniors and the average commuter is largest. A second layer runs simulated elderly personas (independent, walking aid, wheelchair user) on real trips. It shows what blocks them, and planners can test a new lift, sheltered link or bus stop before anything is built.

How we built it

This round is a proposal, so most of our work went into finding the data and designing a pipeline we can actually run on Databricks.

  • Data: HDB elderly population by town, LTA bus stops and MRT exits, the cycling path network, and Active Ageing Centre and clinic locations. All of it is Singapore open data.
  • Pipeline: Lakeflow jobs ingest the data on a schedule into Delta Lake, moving from raw (Bronze) to cleaned and geo-joined (Silver) to scores and priority rankings (Gold). Unity Catalog handles permissions, lineage and versioning.
  • Track 1, scoring: PySpark buffer analysis draws walking-distance rings around every service and measures how much of each town falls inside. We run it once with commuter radii and once with shorter elderly radii.

$$ \text{Accessibility Score} = 0.6 \times \text{Care coverage} + 0.4 \times \text{Transport coverage} $$

$$ \text{Elderly Gap} = \text{Commuter Score} - \text{Elderly Score} $$

$$ \text{Priority Index} = (100 - \text{Score}) \times \text{65+ population} $$

  • Track 2, simulation: each persona has editable limits for walking distance, shelter and barrier-free access. A trip passes if the route stays within those limits. If it fails, we log the reason, for example "no lift at overhead bridge".
  • Outputs: an AI/BI dashboard shows current coverage, the Master Plan 2025 overlay and the gap view. A planner app holds the what-if sandbox, with every run logged in MLflow as an audit trail.

What we learned

Mostly, we learned how to look for open datasets. We dug through data.gov.sg, LTA DataMall and SingStat, and found that "open" doesn't mean "ready". Some datasets bury the useful information inside an HTML description column. Some haven't been updated since 2024, and the eldercare dataset doesn't say what type each facility is. We also learned how a medallion architecture (Bronze, Silver, Gold) keeps messy public data organised. We learned that accessibility depends on who is walking, too.

Challenges we faced

  • Granularity: elderly population data is published by town, not by block, so we can't see exactly where seniors live within a town.
  • Missing data: there's no clean pedestrian network or full bus route layer, and polyclinic locations had to be sourced separately.
  • Defining the score: there's no ground truth for "accessible", so we made the weights and walking radii editable assumptions instead of pretending they're fixed.
  • Scope: we had big ideas, from a SimCity-style sandbox to making planners do an Amazing Race in wheelchairs. Cutting them down to two tracks we can actually build was harder than coming up with them.

Built With

  • data
Share this project:

Updates

Submission history