Inspiration

  • Rising cost pressures don’t hit cities evenly; neighborhood-level patterns are what matter for policy and investment.
  • We wanted a transparent, data-driven way to compare Jacksonville to its peers and spotlight tracts at risk of displacement.
  • Our goal: turn fragmented housing, income, transportation, and walkability data into an actionable, explainable index.

What it does

  • Computes city- and tract-level affordability risk scores using PCA components and/or configurable weights.
  • Lets users filter tracts by thresholds (%, counts, or $) and instantly visualize where conditions exceed targets.
  • Surfaces tract-specific top contributing factors so users can see why a score is high.
  • Benchmarks Jacksonville against peer cities and highlights neighborhoods for targeted support.

How we built it

  • Data: Housing affordability, income distributions, SNAP/public assistance, transportation access, walkability; normalized and aligned at tract level.
  • Modeling: PCA to learn dominant affordability dimensions; optional manual weighting for policy scenarios.
  • Frontend: Next.js + React, Leaflet map, shadcn/ui for the ui components; custom percent/dollar filter logic with auto-denominators, chatbot using local ollama model
  • Backend: Endpoints to serve city/tract stats, PCA scores, components, scaler parameters, and feature order; cached for fast map interaction.

Challenges we ran into

  • Harmonizing feature names across sources (percent vs. count vs. dollar) and ensuring consistent denominators.
  • Making filters both powerful and intuitive (multi-criteria AND/OR logic, between-ranges, auto-denominator fallbacks).
  • Ensuring tract-level PCA explanations were stable and meaningful (robust scaling, feature matching, sign consistency).

Accomplishments that we're proud of

  • A fast, interactive map that remains responsive under multi-filter queries.
  • Clear tract-level explanations of drivers behind high risk—not just a score.
  • A flexible pipeline where PCA can be blended and tuned for different stakeholder needs.

What we learned

  • Good UX for public data tools requires opinionated defaults (e.g., auto-denominators, sensible ranges) with expert overrides.
  • PCA is powerful for signal discovery, but human-readable feature names and careful scaling are essential for explainability.
  • Neighborhood-level insights change conversations—citywide averages mask critical disparities.

What’s next for CityScale

  • Add time-series to track risk trajectories and evaluate impact of policy changes.
  • Incorporate eviction filings, LIHTC expirations, and development pipeline data for earlier risk flags.
  • Ship downloadable tract briefs and an API so partners can embed the index in their workflows.
  • Expand fairness/robustness checks and add confidence bands around scores per tract.
  • Fine tune housing index model with the help of PhD level SMEs
  • Add other models to understand data better
  • Improve chatbot to fine tune responses and create more valuable insight about the data
  • Deploy to cloud infrastructure to allow for widespread use
  • Partner with city staff, survey residents in selected tracts, visit neighborhood sites to find more raw findings to refine data set
  • Create an app version for homeowners or renters to understand where is affordable in their city
Share this project:

Updates