Skip to content

Repository files navigation

Floodlines

Risk is not equally distributed. Neither is the money to address it.
An independent analysis of flood risk, social vulnerability, and FEMA mitigation funding across Vermont municipalities.

🔗 Live Dashboard
📖 Analysis Article

Table of Contents

Project Overview

Floodlines is an index-based spatial analysis of flood risk, social vulnerability, and FEMA mitigation funding across Vermont's 250+ towns. The central question: does mitigation funding align with flood risk and community need?

Vermont has experienced repeated, severe flood events, most notably Hurricane Irene (2011) and the historic flooding of 2023. Yet federal mitigation funding has not flowed evenly. Some high-risk, high-vulnerability towns have received little to nothing. Others have received substantial investment. This project builds a reproducible, methodologically transparent framework to measure that gap. More broadly, Floodlines explores the geography of institutional memory. Federal mitigation programs are designed around real constraints: disaster declarations, competitive grant processes, local administrative capacity, and documented losses. The result is not necessarily a system that ignores future risk, but one that often sees future risk through the lens of past experience.

Floodlines combines federal hazard models, flood insurance records, Census demographics, and mitigation funding data into a single framework for comparing where risk exists, where money has gone, and where the two diverge.

The analysis combines:

  • GIS preprocessing of flood zone, river corridor, and town boundary data
  • ACS demographic data for town-level social vulnerability (poverty, age, vehicle access, and more)
  • FEMA Hazard Mitigation Assistance (HMA) funding records, inflation-adjusted to 2025 dollars
  • NFIP insurance claims and policy data
  • FEMA National Risk Index (NRI) expected annual loss and composite risk scores
  • Index construction using rank-based normalization across multiple model specifications, with sensitivity analysis
  • An interactive web dashboard visualizing risk, vulnerability, need, gap, and quadrant assignment for every Vermont town

Key Findings

  • More than half of Vermont municipalities received no FEMA Hazard Mitigation Assistance funding.
  • Funding shows only weak alignment with forward-looking measures of flood risk and vulnerability.
  • Funding is more strongly associated with past insured flood losses than with modeled future risk.
  • The pattern persists across multiple risk models, normalization methods, and sensitivity tests.

Features

Interactive Dashboard:

  • Quadrant view classifying each town as underserved, aligned, historically invested, low priority, or no recorded investment
  • Choropleth map of all Vermont towns, switchable across six metrics: flood risk, social vulnerability, need index, mitigation funding, funding gap, and NFIP claims
  • River corridor, population, and funding context overlays
  • Model switcher (EAL, EAL per capita, FEMA NRI)
  • Relative-to-state-average toggle for contextualizing local values
  • Town-level detail panel with key statistics and percentile rankings
  • Scatter plot of need vs. funding, updating dynamically with the active model
  • Rankings table showing each town's percentile position across all key metrics
  • Responsive layout with mobile support

Analysis Pipeline:

  • Reproducible ETL notebooks for all data sources (GIS, ACS, FEMA HMA, NFIP, NRI)
  • Index construction and model evaluation across 20 model specifications and two normalization methods
  • Sensitivity analysis (LOVO, weight perturbation, normalization comparison)
  • Quadrant and exclusion analysis
  • Spatial autocorrelation (Moran's I)
  • Exportable web data with raw scores, percentile ranks, and relative-to-mean values

Tools & Technologies

Frontend: JavaScript, Leaflet.js, D3.js, HTML/CSS
Backend: Python, Pandas, GeoPandas, NumPy, Jupyter Notebook
Spatial: GeoPandas, Shapely, libpysal, ESDA (Moran's I)
Statistics: scikit-learn, scipy, statsmodels
Data sources: U.S. Census / ACS, OpenFEMA, FEMA NFHL, Vermont ANR, FRED CPI
Hosting: GitHub Pages

Usage

Live dashboard:
🔗 https://johbry17.github.io/Floodlines/

Run the analysis locally:

  1. Clone the repository
  2. Install dependencies (Python 3.10+, standard geospatial stack):
    pip install pandas geopandas numpy matplotlib seaborn scikit-learn scipy statsmodels esda libpysal jupyterlab
  3. Run notebooks in order:
    • 01_etl_gis.ipynb — spatial preprocessing
    • 02_etl_acs.ipynb through 05_etl_fema_nri.ipynb — source ETL
    • 09_etl_final_merge.ipynb — merge all sources
    • 10_eda_overview.ipynb through 13_eda_hma_nfip.ipynb — exploratory analysis
    • 20_analysis_build_index.ipynb — index construction and model evaluation
    • 21_sensitivity_checks.ipynb — LOVO and weight sensitivity
    • 22_quadrant_and_exclusion_analysis.ipynb — quadrant assignment
    • 29_export_to_web.ipynb — generate town_stats.csv and town_boundaries.geojson

Gallery

ETL Infographic
Data sources and analytical workflow used in this study. Federal hazard, insurance, demographic, and mitigation datasets are integrated at the municipal level and transformed into comparative measures of need, funding, and funding alignment. Illustration: AI-generated

Default view — Quadrant map
Vermont towns classified as underserved, historically invested, aligned, low priority, or no recorded investment

Need index choropleth
Measuring Need: A rank-based composite of flood exposure and social vulnerability

Funding gap choropleth
Towns where need substantially exceeds FEMA HMA investment, highlighting the most underserved communities

Scatter plot — Need vs. Funding
Loose cloud confirming weak alignment between structural need and federal mitigation dollars, showing impact of different definitions of need

Town detail panel
Per-town statistics, percentile rankings, and quadrant classification for a selected community

NFIP claims overlay
Reactive benchmark layer showing where insured losses occurred vs. where modeled risk is highest

Church Waterline
A visual metaphor for the central question explored in Floodlines: when institutions measure risk through past disasters, future floods may arrive above the last high-water mark. Illustration: AI-generated.

Data & Methodology

Index construction:
The need index combines a flood risk component (FEMA EAL or river corridor exposure) and a social vulnerability component (poverty rate, percent elderly, percent households without a vehicle), normalized using percentile ranks across all Vermont towns. The gap index is defined as need minus scaled funding — positive values indicate towns that rank higher on modeled need than on funding received.

Model selection:
Three models were carried forward for the dashboard: core_EAL_model (primary — highest logit AUC at 0.70), eal_per_capita_model (robustness — most normalization-stable at Spearman 0.97), and fema_national_risk_index (benchmark — FEMA's own composite for external validity).

Claims-based models were excluded because their high need–funding correlation (~0.55) reflects a reactive rather than proactive pattern; their near-zero gap meaningfulness (~0.04) confirms the gap index adds no independent signal when claims drive the need score. Expanded vulnerability specifications (adding housing tenure, disability, mobile homes) were also excluded: increasing the variable count raised normalization sensitivity (mean rank difference 19–21 vs. 13–15 for core models) without improving logit AUC, violating the parsimony criterion. Similarly, rather than treating all land within a flood polygon as equally at risk, simple spatial exposure metrics — river corridor percentage and NFHL flood zone coverage — were replaced by FEMA Expected Annual Loss, which captures both hazard intensity and asset exposure.

Models were selected based on predictive performance, stability across normalization methods, interpretability, and comparability to established FEMA benchmarks.

Normalization:
Rank-based (percentile) normalization was chosen over z-scores for four reasons: robustness to extreme outliers in Vermont flood data, bounded [0,1] output interpretable to general audiences, comparability across variables with incompatible units and distributions, and confirmation from sensitivity analysis that the substantive findings are stable across both methods (need-index Spearman z vs. rank: 0.89–1.00).

Funding:
All FEMA HMA dollar amounts are inflation-adjusted to 2025 dollars using CPI-U (FRED). Only approved projects localizable to a specific town are included; county-wide, regional, and statewide projects (~37% of filtered HMA) are excluded, as are planning and administrative costs. Amounts reflect the federal share obligated (~75% of total project cost).

NFIP:
Claims reflect insured losses only. Fewer than 2% of Vermont housing units are covered by NFIP policies, so claims data systematically underrepresents flood exposure statewide.

References

License

MIT License © 2026 Bryan Johns. See LICENSE for details.

Acknowledgements

Thanks to the Vermont Agency of Natural Resources, FEMA, and the U.S. Census Bureau for making the underlying data publicly available. Thanks to the open-source geospatial community — GeoPandas, libpysal, Leaflet, D3, and OpenStreetMap — for the tools that made this analysis possible.

Author

Bryan Johns, June 2026
bryan.johns@informedwanderer.com | LinkedIn | GitHub | Portfolio
— Fluent in Data. Fluent in Human.

About

Mapping Vermont's FEMA flood mitigation funding gap — who bears the most risk, who gets the least help, and where the mismatch is greatest. Built with Python, Leaflet, and D3.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages