Methodology & Data

ShelterShield is built to be auditable: every score traces back to public data through a reproducible pipeline. This page documents the sources, the index construction, and the limits of the current version.

Data sources

SourceRoleLicense
NYC Evictions6z8x-wfk4Displacement pressure (executed residential evictions)NYC Open Data (public domain)
NYC PLUTO64uk-42ksResidential units, assessed value, year builtNYC Open Data (public domain)
NYC 2020 Census Tracts63ge-mke6Tract geometry + GEOID join spineNYC Open Data (public domain)

Evictions census_tract mapped to CT2020 (~91.5% coverage); unmatched tracts excluded and reported.

Composite index construction

The Displacement-Risk Composite Score aggregates three percentile-normalized domains, each oriented so that higher values indicate higher priority for attention:

  1. Displacement pressure (weight 0.45) — executed residential evictions per 1,000 residential units. Source: NYC Evictions ÷ PLUTO residential units.
  2. Market heat (weight 0.30) — assessed total value per residential unit, a proxy for market pressure on existing affordability. Source: PLUTO.
  3. Stock vulnerability (weight 0.25) — building age (older stock indicates more at-risk, often rent-regulated, affordable housing). Source: PLUTO year built.

Each domain is converted to a percentile rank, then combined with a weighted geometric mean (which penalizes tracts that are extreme on one domain but low on others, rather than letting a single domain dominate). The result is re-ranked to a 0–100 score.

Prioritization archetypes

Tracts are placed in a 2×2 of displacement risk (above/below median) by residential-stock presence (above/below median) into four capital archetypes: Preserve (high risk, substantial stock), Protect (high risk, thinner stock — tenant protection), Produce (lower risk, capacity to build), and Monitor. A Preservation Priority Score ranks tracts by at-risk units × risk, for capital allocation.

Limitations (read before acting)

  • Executed evictions undercount displacement. Many households leave before a marshal executes a warrant; this signal is a floor, not a full count.
  • Assessed value ≠ market value. NYC assessed values lag and are capped in ways that vary by building class; market heat here is directional, not precise.
  • Tract join coverage. The eviction-to-tract mapping matches ~91.5% of eviction tract codes; unmatched records are excluded and reported rather than silently dropped.
  • Weighting is a choice. The weights above are a documented v1 baseline. The repository ships an equal-weight and a PCA-derived variant plus a Monte-Carlo sensitivity analysis so results can be stress-tested.
  • NYC-only demo. The method generalizes to any census geography; this deployment showcases NYC.

Reproducibility

The entire pipeline is a single command — npm run data (python3 scripts/build_index.py) — which pulls the sources, builds the domains, computes the composite, and writes validated GeoJSON/JSON the app consumes. No manual steps, no hand-edited numbers.