# The year your address started to matter — methodology

**Dataset:** `home_insurance_nonrenewal_risk.csv` · 6,684 rows · one row per county per year,
2018–2023.

Everything below is reproducible from `newsletter/data/issue-03/` in the reelgorithm repo:
run `fetch.py` (pulls all four public sources, no API keys), then `build.py` (writes this CSV and
`numbers.json`, which is where every number in the issue is read from).

---

## The question

American home insurance is widely described as a Florida-and-California problem. That framing is
about *disasters*. This analysis asks a different question: **how strongly does a county's measured
disaster risk actually predict whether insurers there stop renewing policies — and has that
relationship changed?**

## Sources

| # | Source | What it gives |
|---|---|---|
| 1 | **US Senate Budget Committee**, county-level homeowners insurance non-renewal file, Dec 2024 ([Zenodo mirror](https://zenodo.org/records/14829684)) | Non-renewals and policies in force, per county, per year, 2018–2023. 23 insurers responding of 41 requested, ≈65% of the national market, 249,128,984 policy-years. |
| 2 | **FEMA National Risk Index**, county table, read from FEMA's public ArcGIS feature service | Expected annual loss to buildings (dollars/year) and total building value, per county, plus per-hazard breakdowns. |
| 3 | **FEMA OpenFEMA** `DisasterDeclarationsSummaries` | Every federal disaster declaration 2018–2023, per county. |
| 4 | **US Census** 2020 county FIPS crosswalk | Joins (1) to (2) and (3). (1) is keyed on county *names*, the others on FIPS. |

> `hazards.fema.gov` returns 403 to scripted requests for the NRI flat file. The ArcGIS feature
> service is the same data from the same agency and answers normally.

## The risk measure

Modelled risk is expressed as **expected annual building loss per $10,000 of building value**:

```
modelled_annual_loss_per_10k = EAL_VALB / BUILDVALUE * 10000
```

This is deliberately a *rate*, not a dollar total. A total would simply rank counties by how much
property they contain, so Los Angeles would top every list and the measure would be a population
proxy. As a rate it is directly comparable to what an insurer prices: a pure loss cost.

## The panel

Restricted to counties with **≥5,000 policies in every one of the six years**: **1,114 counties**,
**38,039,370** policies in 2023. Small counties are excluded because a rate built on a few hundred
policies swings wildly for reasons that have nothing to do with risk.

**Risk deciles are assigned once**, on the time-invariant risk score, so a county never changes
decile. If deciles were re-sorted each year, any widening gap could be an artefact of the re-sort
rather than a real change in behaviour.

## Two join traps, both of which produced wrong numbers first

1. **Independent cities.** Virginia (and Maryland, Missouri, Nevada) have independent cities whose
   names duplicate a nearby county — `Franklin city` vs `Franklin County`. Normalising by stripping
   a trailing `" CITY"` merges them, which double-joins every such pair and drags 7-policy rows into
   the panel. `" COUNTY"`, `" PARISH"`, `" BOROUGH"`, `" CENSUS AREA"` and `" MUNICIPALITY"` are
   stripped; `" CITY"` is not.
2. **Duplicate spellings in the source.** The Senate file contains stray rows like `PRINCE GEORGES`
   (35 policies) beside the real `PRINCE GEORGE'S` (148,994), and `ANGELES` beside `LOS ANGELES`.
   These are the same county filed twice. Because the fields are counts, they are collapsed by
   summing. `build.py` asserts one row per county-year afterwards and fails loudly if not.

38 county-year rows (of 18,553) fail to match a FIPS code and are dropped. All are junk rows of the
kind above, or `Unknown`. Together they are 0.2% of rows and a negligible share of policies.

## Findings

**Correlation (Pearson) between modelled risk and non-renewal rate, same counties every year:**

| year | r |
|---|---|
| 2018 | **0.021** |
| 2019 | 0.169 |
| 2020 | 0.145 |
| 2021 | 0.238 |
| 2022 | **0.449** |
| 2023 | **0.477** |

In 2018 modelled risk explained **0.04%** of the variation in where insurers walked away. By 2023 it
explained **23%**.

**Risk-decile gap** (decile 10 minus decile 1, percentage points): **0.145** in 2018 → **1.061** in
2023, a 7.3× widening.

**Robustness — excluding Florida, Louisiana, California and Texas**, the four states usually blamed:
the riskiest decile was non-renewed at **0.98×** the safest decile's rate in 2018 (i.e. very slightly
*less* often) and **2.28×** in 2023. Note this cut leaves 54 counties and 974,627 policies in the top
decile — the smallest cell in the analysis, which is why it is reported as a check and never as the
headline.

**Declared disasters are a weaker predictor than modelled risk** (r² 0.13 vs 0.23 for 2023). 341
counties in the panel had no federally declared disaster at all in the six years and still account
for 18.5% of 2023 non-renewals.

## Limitations, stated plainly

1. **The risk index is not fully independent.** FEMA's NRI is built partly on historical loss
   records, so it encodes some of what insurers already knew. What makes the trend interpretable
   anyway is that the scores are **frozen** across the window: a constant cannot explain why its own
   correlation with non-renewal went from ~0 to 0.48.
2. **A non-renewal is a decision, not an outcome.** It records that an insurer declined to renew. It
   does not record whether the household went uninsured, moved to a state plan, or simply paid more
   elsewhere. Price is the missing column, and it is not in any public file.
3. **Barnstable County, Massachusetts contradicts the model.** It has the highest 2023 non-renewal
   rate of any large county in America (6.39%, against Miami-Dade's 4.29%) on a fifth-decile risk
   score. It is named in the issue rather than dropped.
4. **65% of the market, not a census.** 23 insurers responded of 41 asked, and non-response is not
   random.
5. **Correlation, not causation.** The reinsurance repricing of 2022–23 is offered as the mechanism
   because it matches the timing and is independently documented, not because this analysis
   identifies it. Note also that the correlation jumps in **2022**, while the largest reinsurance
   price move landed at the **January 2023** renewal; property-catastrophe rates were already
   hardening through 2022.

## Columns

| column | meaning |
|---|---|
| `state`, `county`, `county_fips` | county identity |
| `year` | 2018–2023 |
| `policies_in_force` | policies in force at year end + non-renewals |
| `non_renewals` | policies the insurer declined to renew |
| `non_renewal_rate_pct` | `non_renewals / policies_in_force × 100` |
| `modelled_annual_loss_per_10k` | FEMA NRI expected annual building loss per $10,000 of building value |
| `wildfire_loss_per_10k`, `hurricane_loss_per_10k` | the same, for those two perils only |
| `national_risk_decile` | 1 = safest tenth … 10 = riskiest tenth, fixed across years |
| `fema_declared_disasters_2018_2023` | count of federal DR/FM declarations, COVID-19 excluded |

Free, no form. If you find an error in it, reply to the issue — corrections get published.
