Looking for Germantown in two million service requests
I ran a Bayesian changepoint model over nine years of Nashville 311 data to find the moment my old neighbourhood changed. There was no moment.
I was in Nashville for university from 2008 to 2013. I went back recently, and the city I walked around was not the one I remembered. Germantown especially — I knew it as warehouses and a handful of restaurants, and it is now something else entirely.
That is an unsatisfying thing to know only anecdotally. So I went looking for it in the data.
Metro publishes every hubNashville service request: 2,047,228 of them, geocoded, July 2017 to now. Potholes, trash pickup, public-safety complaints, property violations. If a neighbourhood changes character, I reasoned, the things residents ask the city for should change with it — and unlike my memory, the record has dates on it.
I did not want to pick those dates myself. That is what the model is for.
Not picking the date
The usual way to answer “when did this change?” is to guess. You pick a moment that seems meaningful, split the series there, compare the halves. The date does all the work, and you chose the date, so mostly you have measured your own expectations.
A Bayesian changepoint model inverts that. You hand it a count series and it returns a posterior over every possible way of carving that series into regimes — how many boundaries there are, where they fall, and what the level is inside each one. You never name a date. The date is the output.
The Bayesian part earns its keep in the “where”. A test tells you whether a break you already nominated is significant. What I wanted was a distribution over where the boundary is — a model that can say “something moved, around September, and I am 99% sure it moved at all” and equally can say “nothing here, and I am confident about that too.”
Three decisions make the output mean anything:
Relative rates, not counts. Every series is λ = observed ÷ expected, where
the expectation is what this place would have logged had it behaved like the
rest of the county — and each unit’s control excludes itself. Metro retired
and added request categories repeatedly over nine years, changed intake
channels, and absorbed a pandemic. A changepoint in a raw neighbourhood count
would mostly be detecting Metro’s own taxonomy edits. Under a relative rate,
citywide changes move numerator and denominator together and cancel. So does
seasonality, which matters when tall-grass complaints swing threefold between
January and May.
Exact inference. At ~110 months the posterior over all segmentations is computable exactly by forward–backward recursion in O(n²). Gamma is conjugate to Poisson, so each segment’s marginal likelihood is closed form. No MCMC, no convergence diagnostics, no sampler to tune — and the numbers reproduce exactly, which matters when you intend to argue with them.
Overdispersion, or everything is a changepoint. This is the one that decides whether the thing is usable at all. Real 311 counts are far burstier than Poisson — one storm, one apartment complex, one furious neighbour filing nine times in a week. Fed raw to a Poisson model, that burstiness reads as evidence of regime change and the model will shatter a perfectly flat series into a dozen segments. Counts are scaled by an estimated dispersion φ first. The test that matters most is the boring one: a stationary series with φ = 4 must come back with zero expected changepoints.
First attempt: the wrong geography
I started with a citywide scan — 890 series, 126 geographic units across seven boundary systems, eight metrics each. Ask it about Germantown and you get this, because Germantown is not one of the units:
| Month | Metric | λ before → after | p |
|---|---|---|---|
| 2018-06 | Trash and recycling | 1.30 → 1.00 (−24%) | 0.67 |
| 2020-01 | Public safety | 1.76 → 0.62 (−65%) | 0.86 |
| 2021-11 | Share of county volume | 0.06 → 0.05 (−19%) | 0.51 |
That is ZIP 37208 — two coin-flips and one break the classifier flags as systemic, meaning it lands in a month when units all over the county moved at once. Germantown is about twenty blocks; 37208 also contains Buena Vista, Hope Gardens and much of North Nashville, none of which changed the way Germantown did. Whatever happened was being averaged into oblivion.
The obvious objection to stopping there: 311 is geocoded. 1,395,956 of the 2,047,228 requests carry a usable lat/lon. The limit was my choice of aggregation unit, not the instrument.
Drawing the boundary
So I drew Germantown — or rather, used the boundary Metro already maintains: the Germantown Historic Preservation District zoning overlay, established by ordinance BL2007-19. Roughly 0.9 × 1.0 km. Not a shape I invented to get an answer I liked.
Point-in-polygon against that overlay gives 5,145 requests between August 2017 and July 2026. Same model, same relative rates, same thresholds as the citywide scan, with the control being the rest of the county’s geocoded requests — numerator and denominator have to come from the same population, or the 32% without coordinates leaks back in as a trend.
Seven metrics had the volume to model. Here is every one of them:
| Metric | months | events | φ | E[#changepoints] | detected |
|---|---|---|---|---|---|
| Property violations | 95 | 482 | 2.48 | 2.90 | none |
| Property maintenance | 90 | 228 | 1.59 | 1.97 | none |
| Share of county volume | 108 | 5,145 | 5.05 | 1.93 | none |
| Streets and sidewalks | 108 | 1,386 | 3.06 | 1.91 | 1, unstable |
| Trash and recycling | 108 | 1,364 | 1.92 | 1.77 | none |
| Public safety | 80 | 1,203 | 2.36 | 1.33 | none |
| Slow resolution (>7 days) | 108 | 1,044 | 1.73 | 0.96 | none |
Nothing. One break clears p ≥ 0.5 — streets and sidewalks, May 2024, +55% — and it collapses when the segment-length prior is changed, which by this project’s own rule makes it an artefact of the prior rather than a feature of the data.
At the right resolution, with the right boundary, 311 says Germantown never changed.
Except it plainly did
Look at the fitted rates by year rather than at the boundaries:
| Metric (λ vs rest of county) | 2017 | peak | 2026 |
|---|---|---|---|
| Share of county volume | 0.281% | — | 0.441% |
| Public safety | 0.54 | — | 1.33 |
| Streets and sidewalks | 1.29 | — | 1.96 |
| Trash and recycling | 1.25 | — | 0.70 |
| Property violations | 0.76 | 1.52 (2020) | 0.55 |
| Property maintenance | 0.89 | 1.09 (2020) | 0.48 |
Germantown’s share of all county service requests rose 57%, and it rose in every single year — 0.281, 0.300, 0.335, 0.345, 0.358, 0.376, 0.379, 0.387, 0.405, 0.441 — without one reversal. Public-safety requests went from roughly half the county rate to a third above it. Trash complaints fell by 44%. Property complaints arc up through 2020 and then fall away to half where they started.
These are not small movements. The model found no changepoints in them because there are no changepoints in them. They are ramps.
data table
| month | observed | expected | λ obs | λ fit | 95% interval | P(boundary) |
|---|---|---|---|---|---|---|
| 2018-06 | 4 | 1.3 | 3.11 | 0.76 | 0.37–1.34 | 0.000 |
| 2018-09 | 0 | 2.2 | 0.00 | 0.76 | 0.37–1.34 | 0.000 |
| 2018-10 | 1 | 3.8 | 0.26 | 0.76 | 0.37–1.34 | 0.013 |
| 2018-12 | 3 | 1.2 | 2.47 | 0.76 | 0.37–1.34 | 0.015 |
| 2019-01 | 0 | 1.4 | 0.00 | 0.76 | 0.37–1.34 | 0.013 |
| 2019-02 | 0 | 1.4 | 0.00 | 0.76 | 0.37–1.33 | 0.013 |
| 2019-03 | 0 | 1.8 | 0.00 | 0.76 | 0.37–1.34 | 0.014 |
| 2019-04 | 3 | 2.3 | 1.31 | 0.76 | 0.37–1.34 | 0.013 |
| 2019-05 | 3 | 6.8 | 0.44 | 0.76 | 0.37–1.35 | 0.018 |
| 2019-06 | 2 | 4.8 | 0.42 | 0.77 | 0.37–1.36 | 0.029 |
| 2019-07 | 2 | 5.6 | 0.36 | 0.79 | 0.37–1.39 | 0.081 |
| 2019-08 | 2 | 4.2 | 0.47 | 0.87 | 0.39–1.54 | 0.174 |
| 2019-09 | 4 | 4.8 | 0.84 | 1.03 | 0.44–1.70 | 0.221 |
| 2019-10 | 7 | 4.2 | 1.67 | 1.23 | 0.56–1.81 | 0.083 |
| 2019-11 | 5 | 2 | 2.51 | 1.31 | 0.61–1.83 | 0.035 |
| 2019-12 | 1 | 1.5 | 0.66 | 1.34 | 0.63–1.84 | 0.043 |
| 2020-01 | 0 | 2.6 | 0.00 | 1.37 | 0.67–1.85 | 0.100 |
| 2020-02 | 7 | 3.1 | 2.25 | 1.46 | 0.92–1.87 | 0.036 |
| 2020-03 | 5 | 2.6 | 1.91 | 1.49 | 1.05–1.89 | 0.023 |
| 2020-04 | 8 | 4.9 | 1.64 | 1.50 | 1.12–1.89 | 0.015 |
| 2020-05 | 10 | 5.1 | 1.97 | 1.51 | 1.14–1.89 | 0.009 |
| 2020-06 | 6 | 3.6 | 1.68 | 1.51 | 1.14–1.89 | 0.007 |
| 2020-07 | 4 | 2.8 | 1.43 | 1.51 | 1.15–1.89 | 0.007 |
| 2020-08 | 3 | 4.1 | 0.73 | 1.51 | 1.15–1.89 | 0.009 |
| 2020-09 | 7 | 3.2 | 2.19 | 1.52 | 1.15–1.89 | 0.007 |
| 2020-10 | 7 | 3.6 | 1.92 | 1.52 | 1.16–1.89 | 0.006 |
| 2020-11 | 0 | 2.6 | 0.00 | 1.52 | 1.17–1.89 | 0.008 |
| 2020-12 | 3 | 2.3 | 1.31 | 1.52 | 1.17–1.90 | 0.008 |
| 2021-01 | 6 | 2.3 | 2.64 | 1.53 | 1.18–1.90 | 0.006 |
| 2021-02 | 9 | 1.7 | 5.43 | 1.53 | 1.18–1.90 | 0.005 |
| 2021-03 | 5 | 3.4 | 1.48 | 1.53 | 1.18–1.90 | 0.005 |
| 2021-04 | 10 | 4.4 | 2.26 | 1.53 | 1.18–1.90 | 0.005 |
| 2021-05 | 16 | 5.5 | 2.92 | 1.53 | 1.18–1.90 | 0.011 |
| 2021-06 | 2 | 3.9 | 0.51 | 1.52 | 1.17–1.89 | 0.007 |
| 2021-07 | 5 | 5.7 | 0.87 | 1.52 | 1.17–1.89 | 0.006 |
| 2021-08 | 9 | 6.4 | 1.41 | 1.52 | 1.17–1.89 | 0.006 |
| 2021-09 | 10 | 6.5 | 1.54 | 1.52 | 1.16–1.89 | 0.006 |
| 2021-10 | 4 | 5.2 | 0.77 | 1.52 | 1.16–1.89 | 0.006 |
| 2021-11 | 3 | 2.9 | 1.03 | 1.52 | 1.16–1.89 | 0.006 |
| 2021-12 | 13 | 3.4 | 3.78 | 1.52 | 1.16–1.89 | 0.010 |
| 2022-01 | 6 | 3.1 | 1.91 | 1.51 | 1.15–1.89 | 0.013 |
| 2022-02 | 6 | 3.8 | 1.60 | 1.51 | 1.13–1.89 | 0.015 |
| 2022-03 | 14 | 7.4 | 1.90 | 1.50 | 1.11–1.89 | 0.034 |
| 2022-04 | 13 | 7.3 | 1.77 | 1.47 | 1.01–1.88 | 0.087 |
| 2022-05 | 14 | 8 | 1.74 | 1.41 | 0.84–1.86 | 0.288 |
| 2022-06 | 5 | 6 | 0.83 | 1.16 | 0.66–1.73 | 0.166 |
| 2022-07 | 5 | 7 | 0.71 | 1.04 | 0.64–1.57 | 0.076 |
| 2022-08 | 8 | 12.2 | 0.66 | 0.99 | 0.63–1.49 | 0.023 |
| 2022-09 | 5 | 8.7 | 0.57 | 0.98 | 0.63–1.47 | 0.013 |
| 2022-10 | 7 | 7.1 | 0.99 | 0.98 | 0.63–1.47 | 0.012 |
| 2022-11 | 4 | 3.9 | 1.02 | 0.97 | 0.63–1.46 | 0.012 |
| 2022-12 | 6 | 3.1 | 1.95 | 0.97 | 0.63–1.46 | 0.016 |
| 2023-01 | 5 | 4.6 | 1.09 | 0.96 | 0.63–1.45 | 0.017 |
| 2023-02 | 10 | 4.5 | 2.25 | 0.96 | 0.63–1.45 | 0.055 |
| 2023-03 | 4 | 4.5 | 0.89 | 0.92 | 0.61–1.39 | 0.049 |
| 2023-04 | 3 | 5.3 | 0.56 | 0.89 | 0.60–1.34 | 0.030 |
| 2023-05 | 5 | 7.7 | 0.65 | 0.88 | 0.60–1.30 | 0.019 |
| 2023-06 | 4 | 6.8 | 0.59 | 0.87 | 0.60–1.29 | 0.013 |
| 2023-07 | 5 | 8.5 | 0.59 | 0.86 | 0.60–1.29 | 0.010 |
| 2023-08 | 15 | 8 | 1.88 | 0.86 | 0.59–1.28 | 0.034 |
| 2023-09 | 6 | 5.6 | 1.07 | 0.84 | 0.59–1.26 | 0.045 |
| 2023-10 | 5 | 6.7 | 0.75 | 0.82 | 0.57–1.23 | 0.038 |
| 2023-11 | 3 | 4.9 | 0.62 | 0.81 | 0.55–1.19 | 0.030 |
| 2023-12 | 2 | 2.9 | 0.70 | 0.80 | 0.54–1.17 | 0.028 |
| 2024-01 | 3 | 2.4 | 1.27 | 0.79 | 0.54–1.16 | 0.036 |
| 2024-02 | 4 | 4.6 | 0.86 | 0.77 | 0.53–1.11 | 0.038 |
| 2024-03 | 3 | 3.7 | 0.81 | 0.75 | 0.52–1.05 | 0.038 |
| 2024-04 | 4 | 8 | 0.50 | 0.73 | 0.51–1.01 | 0.024 |
| 2024-05 | 2 | 8.8 | 0.23 | 0.72 | 0.51–0.99 | 0.012 |
| 2024-06 | 7 | 11.9 | 0.59 | 0.72 | 0.51–0.99 | 0.010 |
| 2024-07 | 9 | 9.4 | 0.96 | 0.72 | 0.51–0.99 | 0.013 |
| 2024-08 | 9 | 9.1 | 0.99 | 0.72 | 0.50–0.99 | 0.019 |
| 2024-09 | 4 | 6.6 | 0.60 | 0.71 | 0.50–0.98 | 0.017 |
| 2024-10 | 4 | 6 | 0.67 | 0.71 | 0.49–0.98 | 0.017 |
| 2024-11 | 7 | 8.5 | 0.82 | 0.70 | 0.49–0.97 | 0.022 |
| 2024-12 | 3 | 2.7 | 1.12 | 0.70 | 0.48–0.97 | 0.027 |
| 2025-01 | 1 | 2.2 | 0.45 | 0.69 | 0.47–0.96 | 0.024 |
| 2025-02 | 1 | 2.8 | 0.36 | 0.68 | 0.46–0.95 | 0.020 |
| 2025-03 | 11 | 5.5 | 2.01 | 0.68 | 0.46–0.95 | 0.110 |
| 2025-04 | 1 | 5.1 | 0.20 | 0.63 | 0.40–0.87 | 0.062 |
| 2025-05 | 5 | 12.7 | 0.39 | 0.60 | 0.39–0.82 | 0.032 |
| 2025-06 | 11 | 15.9 | 0.69 | 0.59 | 0.38–0.81 | 0.046 |
| 2025-07 | 6 | 16 | 0.37 | 0.58 | 0.37–0.78 | 0.023 |
| 2025-08 | 6 | 7.2 | 0.83 | 0.57 | 0.37–0.78 | 0.036 |
| 2025-09 | 1 | 10.2 | 0.10 | 0.56 | 0.36–0.76 | 0.014 |
| 2025-10 | 2 | 9.3 | 0.21 | 0.56 | 0.35–0.76 | 0.009 |
| 2025-11 | 1 | 3.6 | 0.28 | 0.56 | 0.35–0.76 | 0.009 |
| 2025-12 | 1 | 5 | 0.20 | 0.55 | 0.35–0.76 | 0.008 |
| 2026-01 | 3 | 3.8 | 0.80 | 0.55 | 0.35–0.75 | 0.008 |
| 2026-02 | 3 | 3.8 | 0.79 | 0.55 | 0.35–0.75 | 0.009 |
| 2026-03 | 1 | 5 | 0.20 | 0.55 | 0.35–0.75 | 0.008 |
| 2026-04 | 4 | 8.2 | 0.49 | 0.55 | 0.35–0.75 | 0.008 |
| 2026-05 | 4 | 7 | 0.57 | 0.55 | 0.35–0.75 | 0.000 |
| 2026-06 | 0 | 11.5 | 0.00 | 0.55 | 0.35–0.75 | 0.000 |
| 2026-07 | 12 | 15.8 | 0.76 | 0.55 | 0.35–0.75 | 0.000 |
This is the part I did not expect to be the finding. The posterior expects 2.90 changepoints in that series and cannot put more than 0.288 probability on any particular month. That is not the model failing. It is the model correctly describing a quantity that moved continuously: the evidence for change is spread across dozens of months instead of concentrated in one.
The project’s own test suite pins this behaviour deliberately — fed synthetic gradual drift, the model returns about four and a half weak boundaries rather than one confident break. Many low-probability changepoints mean drift. I had been reading that table as a caveat. It turned out to be the answer.
What a real step looks like
For contrast, the same model on the same city, when something genuinely does happen at a moment.
Metro Council prohibited new non-owner-occupied short-term-rental permits in R and RS residential zoning in May 2017. I gave the model counts and nothing else — no dates, no context, no hint that 2017 is interesting.
data table
| month | observed | expected | λ obs | λ fit | 95% interval | P(boundary) |
|---|---|---|---|---|---|---|
| 2015-04 | 220 | 32 | 6.88 | 1.81 | 1.39–2.69 | 0.000 |
| 2015-05 | 159 | 56 | 2.84 | 1.81 | 1.39–2.69 | 0.000 |
| 2015-06 | 126 | 109 | 1.16 | 1.81 | 1.39–2.69 | 0.217 |
| 2015-07 | 87 | 64 | 1.36 | 1.59 | 1.23–2.17 | 0.068 |
| 2015-08 | 41 | 31 | 1.32 | 1.53 | 1.20–1.87 | 0.043 |
| 2015-09 | 43 | 58 | 0.74 | 1.50 | 1.18–1.77 | 0.010 |
| 2015-10 | 47 | 38 | 1.24 | 1.50 | 1.18–1.76 | 0.009 |
| 2015-11 | 49 | 35 | 1.40 | 1.50 | 1.19–1.76 | 0.008 |
| 2015-12 | 36 | 28 | 1.29 | 1.50 | 1.19–1.76 | 0.007 |
| 2016-01 | 42 | 39 | 1.08 | 1.50 | 1.19–1.75 | 0.006 |
| 2016-02 | 37 | 44 | 0.84 | 1.49 | 1.19–1.75 | 0.006 |
| 2016-03 | 50 | 41 | 1.22 | 1.49 | 1.19–1.75 | 0.006 |
| 2016-04 | 76 | 54 | 1.41 | 1.50 | 1.19–1.75 | 0.005 |
| 2016-05 | 72 | 64 | 1.13 | 1.50 | 1.20–1.75 | 0.007 |
| 2016-06 | 68 | 58 | 1.17 | 1.50 | 1.20–1.75 | 0.008 |
| 2016-07 | 60 | 45 | 1.33 | 1.50 | 1.21–1.76 | 0.009 |
| 2016-08 | 85 | 54 | 1.57 | 1.51 | 1.23–1.76 | 0.008 |
| 2016-09 | 98 | 59 | 1.66 | 1.51 | 1.23–1.77 | 0.006 |
| 2016-10 | 71 | 52 | 1.36 | 1.51 | 1.23–1.77 | 0.007 |
| 2016-11 | 59 | 48 | 1.23 | 1.51 | 1.23–1.78 | 0.011 |
| 2016-12 | 54 | 34 | 1.59 | 1.52 | 1.24–1.78 | 0.011 |
| 2017-01 | 94 | 41 | 2.29 | 1.53 | 1.24–1.79 | 0.007 |
| 2017-02 | 62 | 33 | 1.88 | 1.53 | 1.24–1.80 | 0.001 |
| 2017-03 | 56 | 28 | 2.00 | 1.53 | 1.24–1.80 | 0.007 |
| 2017-04 | 87 | 44 | 1.98 | 1.52 | 1.23–1.79 | 0.986 |
| 2017-05 | 10 | 78 | 0.13 | 0.42 | 0.29–0.57 | 0.004 |
| 2017-06 | 46 | 66 | 0.70 | 0.42 | 0.29–0.56 | 0.002 |
| 2017-07 | 13 | 72 | 0.18 | 0.41 | 0.29–0.56 | 0.005 |
| 2017-08 | 27 | 77 | 0.35 | 0.41 | 0.29–0.56 | 0.005 |
| 2017-09 | 12 | 69 | 0.17 | 0.41 | 0.29–0.56 | 0.007 |
| 2017-10 | 23 | 68 | 0.34 | 0.41 | 0.29–0.56 | 0.008 |
| 2017-11 | 25 | 82 | 0.30 | 0.42 | 0.29–0.57 | 0.012 |
| 2017-12 | 14 | 47 | 0.30 | 0.42 | 0.29–0.57 | 0.015 |
| 2018-01 | 36 | 73 | 0.49 | 0.42 | 0.30–0.58 | 0.013 |
| 2018-02 | 41 | 59 | 0.69 | 0.42 | 0.30–0.58 | 0.008 |
| 2018-03 | 33 | 72 | 0.46 | 0.43 | 0.30–0.58 | 0.008 |
| 2018-04 | 19 | 71 | 0.27 | 0.43 | 0.30–0.59 | 0.013 |
| 2018-05 | 46 | 96 | 0.48 | 0.43 | 0.30–0.59 | 0.014 |
| 2018-06 | 32 | 77 | 0.42 | 0.43 | 0.30–0.60 | 0.018 |
| 2018-07 | 32 | 74 | 0.43 | 0.44 | 0.31–0.63 | 0.023 |
| 2018-08 | 21 | 92 | 0.23 | 0.45 | 0.31–0.65 | 0.096 |
| 2018-09 | 20 | 72 | 0.28 | 0.48 | 0.32–0.77 | 0.306 |
| 2018-10 | 70 | 75 | 0.93 | 0.60 | 0.36–0.91 | 0.062 |
| 2018-11 | 34 | 59 | 0.58 | 0.63 | 0.37–0.92 | 0.063 |
| 2018-12 | 33 | 67 | 0.49 | 0.65 | 0.39–0.93 | 0.093 |
| 2019-01 | 50 | 57 | 0.88 | 0.69 | 0.41–0.95 | 0.042 |
| 2019-02 | 45 | 61 | 0.74 | 0.70 | 0.42–0.95 | 0.030 |
| 2019-03 | 47 | 81 | 0.58 | 0.71 | 0.43–0.96 | 0.039 |
| 2019-04 | 45 | 77 | 0.58 | 0.73 | 0.46–0.97 | 0.055 |
| 2019-05 | 63 | 86 | 0.73 | 0.75 | 0.49–1.00 | 0.049 |
| 2019-06 | 58 | 70 | 0.83 | 0.78 | 0.51–1.04 | 0.036 |
| 2019-07 | 74 | 66 | 1.12 | 0.79 | 0.53–1.07 | 0.014 |
| 2019-08 | 43 | 51 | 0.84 | 0.80 | 0.53–1.08 | 0.014 |
| 2019-09 | 24 | 56 | 0.43 | 0.80 | 0.54–1.10 | 0.041 |
| 2019-10 | 57 | 50 | 1.14 | 0.82 | 0.55–1.19 | 0.023 |
| 2019-11 | 36 | 49 | 0.73 | 0.83 | 0.56–1.23 | 0.044 |
| 2019-12 | 26 | 47 | 0.55 | 0.86 | 0.57–1.35 | 0.185 |
| 2020-01 | 72 | 52 | 1.39 | 1.04 | 0.65–1.73 | 0.071 |
| 2020-02 | 55 | 40 | 1.38 | 1.08 | 0.66–1.78 | 0.043 |
| 2020-03 | 32 | 31 | 1.03 | 1.13 | 0.67–1.81 | 0.059 |
| 2020-04 | 6 | 7 | 0.86 | 1.18 | 0.68–1.86 | 0.068 |
| 2020-05 | 6 | 7 | 0.86 | 1.23 | 0.69–1.91 | 0.079 |
| 2020-06 | 21 | 16 | 1.31 | 1.31 | 0.70–1.97 | 0.074 |
| 2020-07 | 23 | 22 | 1.04 | 1.37 | 0.73–2.01 | 0.099 |
| 2020-08 | 18 | 14 | 1.29 | 1.47 | 0.77–2.08 | 0.100 |
| 2020-09 | 16 | 7 | 2.29 | 1.57 | 0.83–2.14 | 0.066 |
| 2020-10 | 20 | 10 | 2.00 | 1.63 | 0.92–2.17 | 0.045 |
| 2020-11 | 20 | 10 | 2.00 | 1.67 | 1.10–2.18 | 0.032 |
| 2020-12 | 31 | 10 | 3.10 | 1.69 | 1.16–2.18 | 0.015 |
| 2021-01 | 27 | 16 | 1.69 | 1.70 | 1.18–2.18 | 0.012 |
| 2021-02 | 18 | 6 | 3.00 | 1.71 | 1.19–2.19 | 0.009 |
| 2021-03 | 40 | 18 | 2.22 | 1.71 | 1.20–2.19 | 0.007 |
| 2021-04 | 30 | 19 | 1.58 | 1.71 | 1.20–2.19 | 0.006 |
| 2021-05 | 25 | 16 | 1.56 | 1.71 | 1.21–2.19 | 0.006 |
| 2021-06 | 67 | 28 | 2.39 | 1.71 | 1.21–2.19 | 0.005 |
| 2021-07 | 33 | 21 | 1.57 | 1.71 | 1.21–2.19 | 0.005 |
| 2021-08 | 56 | 17 | 3.29 | 1.71 | 1.20–2.18 | 0.009 |
| 2021-09 | 41 | 21 | 1.95 | 1.71 | 1.20–2.18 | 0.011 |
| 2021-10 | 13 | 38 | 0.34 | 1.70 | 1.19–2.18 | 0.006 |
| 2021-11 | 59 | 40 | 1.48 | 1.70 | 1.19–2.18 | 0.007 |
| 2021-12 | 97 | 42 | 2.31 | 1.71 | 1.19–2.18 | 0.008 |
| 2022-01 | 79 | 28 | 2.82 | 1.70 | 1.17–2.18 | 0.046 |
| 2022-02 | 104 | 48 | 2.17 | 1.66 | 1.03–2.17 | 0.582 |
| 2022-03 | 35 | 48 | 0.73 | 1.06 | 0.57–1.81 | 0.132 |
| 2022-04 | 24 | 28 | 0.86 | 0.95 | 0.56–1.65 | 0.079 |
| 2022-05 | 18 | 40 | 0.45 | 0.88 | 0.55–1.40 | 0.022 |
| 2022-06 | 41 | 31 | 1.32 | 0.87 | 0.55–1.34 | 0.030 |
| 2022-07 | 30 | 33 | 0.91 | 0.85 | 0.55–1.23 | 0.025 |
| 2022-08 | 28 | 51 | 0.55 | 0.84 | 0.54–1.20 | 0.012 |
| 2022-09 | 20 | 32 | 0.63 | 0.83 | 0.54–1.19 | 0.010 |
| 2022-10 | 15 | 25 | 0.60 | 0.83 | 0.54–1.19 | 0.010 |
| 2022-11 | 9 | 28 | 0.32 | 0.83 | 0.54–1.18 | 0.011 |
| 2022-12 | 10 | 28 | 0.36 | 0.84 | 0.54–1.19 | 0.016 |
| 2023-01 | 31 | 38 | 0.82 | 0.84 | 0.55–1.19 | 0.017 |
| 2023-02 | 34 | 38 | 0.90 | 0.84 | 0.55–1.20 | 0.016 |
| 2023-03 | 22 | 34 | 0.65 | 0.85 | 0.55–1.20 | 0.021 |
| 2023-04 | 21 | 36 | 0.58 | 0.86 | 0.55–1.21 | 0.031 |
| 2023-05 | 18 | 36 | 0.50 | 0.87 | 0.56–1.23 | 0.059 |
| 2023-06 | 24 | 40 | 0.60 | 0.91 | 0.57–1.27 | 0.110 |
| 2023-07 | 37 | 29 | 1.28 | 0.97 | 0.62–1.36 | 0.068 |
| 2023-08 | 33 | 39 | 0.85 | 1.01 | 0.65–1.38 | 0.083 |
| 2023-09 | 39 | 34 | 1.15 | 1.05 | 0.69–1.42 | 0.064 |
| 2023-10 | 37 | 22 | 1.68 | 1.09 | 0.73–1.45 | 0.034 |
| 2023-11 | 28 | 23 | 1.22 | 1.11 | 0.75–1.46 | 0.029 |
| 2023-12 | 20 | 19 | 1.05 | 1.12 | 0.77–1.46 | 0.028 |
| 2024-01 | 29 | 28 | 1.04 | 1.13 | 0.79–1.46 | 0.028 |
| 2024-02 | 31 | 23 | 1.35 | 1.15 | 0.82–1.47 | 0.022 |
| 2024-03 | 32 | 21 | 1.52 | 1.16 | 0.84–1.48 | 0.016 |
| 2024-04 | 23 | 22 | 1.04 | 1.17 | 0.85–1.49 | 0.017 |
| 2024-05 | 44 | 36 | 1.22 | 1.17 | 0.87–1.49 | 0.014 |
| 2024-06 | 18 | 22 | 0.82 | 1.18 | 0.88–1.50 | 0.017 |
| 2024-07 | 22 | 17 | 1.29 | 1.18 | 0.89–1.51 | 0.016 |
| 2024-08 | 30 | 34 | 0.88 | 1.19 | 0.90–1.51 | 0.020 |
| 2024-09 | 43 | 22 | 1.96 | 1.20 | 0.92–1.53 | 0.012 |
| 2024-10 | 41 | 24 | 1.71 | 1.21 | 0.92–1.53 | 0.009 |
| 2024-11 | 25 | 24 | 1.04 | 1.21 | 0.92–1.53 | 0.010 |
| 2024-12 | 23 | 13 | 1.77 | 1.21 | 0.92–1.54 | 0.008 |
| 2025-01 | 31 | 20 | 1.55 | 1.21 | 0.93–1.54 | 0.007 |
| 2025-02 | 26 | 16 | 1.63 | 1.22 | 0.93–1.54 | 0.007 |
| 2025-03 | 17 | 11 | 1.54 | 1.22 | 0.93–1.54 | 0.007 |
| 2025-04 | 29 | 23 | 1.26 | 1.22 | 0.93–1.55 | 0.007 |
| 2025-05 | 12 | 9 | 1.33 | 1.22 | 0.93–1.55 | 0.007 |
| 2025-06 | 26 | 14 | 1.86 | 1.22 | 0.94–1.55 | 0.006 |
| 2025-07 | 28 | 10 | 2.80 | 1.22 | 0.94–1.55 | 0.007 |
| 2025-08 | 15 | 15 | 1.00 | 1.22 | 0.93–1.55 | 0.007 |
| 2025-09 | 22 | 20 | 1.10 | 1.22 | 0.93–1.55 | 0.007 |
| 2025-10 | 17 | 14 | 1.21 | 1.22 | 0.93–1.55 | 0.007 |
| 2025-11 | 24 | 12 | 2.00 | 1.22 | 0.93–1.55 | 0.008 |
| 2025-12 | 26 | 15 | 1.73 | 1.21 | 0.93–1.55 | 0.009 |
| 2026-01 | 29 | 12 | 2.42 | 1.21 | 0.92–1.55 | 0.016 |
| 2026-02 | 11 | 15 | 0.73 | 1.20 | 0.90–1.55 | 0.015 |
| 2026-03 | 19 | 27 | 0.70 | 1.20 | 0.89–1.54 | 0.012 |
| 2026-04 | 19 | 17 | 1.12 | 1.19 | 0.86–1.54 | 0.000 |
| 2026-05 | 13 | 16 | 0.81 | 1.19 | 0.86–1.54 | 0.000 |
| 2026-06 | 6 | 10 | 0.60 | 1.19 | 0.86–1.54 | 0.000 |
One bar clears the threshold, at the April/May 2017 seam, p = 0.986. The fitted rate drops from λ = 1.52 to 0.42, a 73% collapse. April recorded 87 investor permits against 44 expected; May recorded 10 against 78. That is what a step looks like when the model is sure — and it is nothing like Germantown.
It also finds a second boundary in February 2022, p = 0.58, that I cannot tie to any documented event. I am leaving it in the chart. Changepoint models find things, and not everything they find has a name you can look up.
And what a false step looks like
The third shape, and the one that would have fooled me. The clearest “local change” in the entire citywide scan is Madison, September 2018:
data table
| month | observed | expected | λ obs | λ fit | 95% interval | P(boundary) |
|---|---|---|---|---|---|---|
| 2017-08 | 11 | 58.8 | 0.19 | 0.19 | 0.13–0.27 | 0.000 |
| 2017-09 | 4 | 47.9 | 0.08 | 0.19 | 0.13–0.27 | 0.000 |
| 2017-10 | 13 | 47.9 | 0.27 | 0.19 | 0.13–0.27 | 0.003 |
| 2017-11 | 6 | 46.6 | 0.13 | 0.19 | 0.13–0.27 | 0.003 |
| 2017-12 | 5 | 41.7 | 0.12 | 0.19 | 0.13–0.27 | 0.003 |
| 2018-01 | 3 | 60.7 | 0.05 | 0.19 | 0.13–0.27 | 0.003 |
| 2018-02 | 11 | 60.1 | 0.18 | 0.19 | 0.13–0.27 | 0.003 |
| 2018-03 | 10 | 62.1 | 0.16 | 0.20 | 0.13–0.27 | 0.003 |
| 2018-04 | 9 | 55.6 | 0.16 | 0.20 | 0.13–0.27 | 0.004 |
| 2018-05 | 11 | 90.8 | 0.12 | 0.20 | 0.13–0.27 | 0.006 |
| 2018-06 | 16 | 86.9 | 0.18 | 0.20 | 0.13–0.27 | 0.000 |
| 2018-07 | 21 | 76.5 | 0.28 | 0.20 | 0.13–0.27 | 0.006 |
| 2018-08 | 30 | 95.4 | 0.31 | 0.20 | 0.13–0.27 | 0.994 |
| 2018-09 | 977 | 782.8 | 1.25 | 1.21 | 1.03–1.37 | 0.000 |
| 2018-10 | 554 | 417.5 | 1.33 | 1.21 | 1.03–1.37 | 0.000 |
| 2018-11 | 279 | 209.9 | 1.33 | 1.21 | 1.03–1.37 | 0.236 |
| 2018-12 | 207 | 193.8 | 1.07 | 1.13 | 0.88–1.33 | 0.199 |
| 2019-01 | 269 | 262.3 | 1.02 | 1.07 | 0.85–1.29 | 0.128 |
| 2019-02 | 299 | 269 | 1.11 | 1.03 | 0.84–1.27 | 0.266 |
| 2019-03 | 188 | 232 | 0.81 | 0.94 | 0.82–1.11 | 0.038 |
| 2019-04 | 196 | 238 | 0.82 | 0.93 | 0.82–1.07 | 0.009 |
| 2019-05 | 239 | 250.7 | 0.95 | 0.93 | 0.82–1.07 | 0.008 |
| 2019-06 | 213 | 229.3 | 0.93 | 0.93 | 0.82–1.07 | 0.006 |
| 2019-07 | 254 | 274.1 | 0.93 | 0.93 | 0.82–1.06 | 0.005 |
| 2019-08 | 269 | 311.3 | 0.86 | 0.93 | 0.82–1.06 | 0.003 |
| 2019-09 | 252 | 262.8 | 0.96 | 0.92 | 0.82–1.06 | 0.004 |
| 2019-10 | 296 | 259.9 | 1.14 | 0.92 | 0.82–1.06 | 0.008 |
| 2019-11 | 235 | 205.1 | 1.15 | 0.92 | 0.82–1.06 | 0.022 |
| 2019-12 | 151 | 159.3 | 0.95 | 0.92 | 0.82–1.05 | 0.023 |
| 2020-01 | 202 | 211.2 | 0.96 | 0.92 | 0.82–1.05 | 0.028 |
| 2020-02 | 147 | 181.1 | 0.81 | 0.91 | 0.82–1.04 | 0.018 |
| 2020-03 | 286 | 266.1 | 1.07 | 0.91 | 0.82–1.04 | 0.050 |
| 2020-04 | 244 | 290.5 | 0.84 | 0.90 | 0.81–1.02 | 0.030 |
| 2020-05 | 281 | 313.5 | 0.90 | 0.89 | 0.81–1.01 | 0.030 |
| 2020-06 | 368 | 339.4 | 1.08 | 0.89 | 0.81–1.01 | 0.133 |
| 2020-07 | 447 | 562.4 | 0.80 | 0.87 | 0.80–0.97 | 0.039 |
| 2020-08 | 240 | 271.4 | 0.88 | 0.86 | 0.80–0.96 | 0.040 |
| 2020-09 | 182 | 215.1 | 0.85 | 0.85 | 0.79–0.95 | 0.035 |
| 2020-10 | 208 | 222.2 | 0.94 | 0.85 | 0.79–0.95 | 0.046 |
| 2020-11 | 162 | 229.1 | 0.71 | 0.85 | 0.79–0.94 | 0.023 |
| 2020-12 | 210 | 246.8 | 0.85 | 0.84 | 0.79–0.94 | 0.021 |
| 2021-01 | 208 | 254.1 | 0.82 | 0.84 | 0.79–0.93 | 0.017 |
| 2021-02 | 180 | 201.6 | 0.89 | 0.84 | 0.79–0.93 | 0.019 |
| 2021-03 | 218 | 249 | 0.88 | 0.84 | 0.79–0.92 | 0.020 |
| 2021-04 | 217 | 274.5 | 0.79 | 0.84 | 0.79–0.92 | 0.015 |
| 2021-05 | 201 | 249.3 | 0.81 | 0.83 | 0.79–0.92 | 0.012 |
| 2021-06 | 301 | 330.4 | 0.91 | 0.83 | 0.79–0.92 | 0.016 |
| 2021-07 | 236 | 263.9 | 0.89 | 0.83 | 0.79–0.91 | 0.019 |
| 2021-08 | 279 | 291.1 | 0.96 | 0.83 | 0.78–0.91 | 0.031 |
| 2021-09 | 273 | 358.1 | 0.76 | 0.83 | 0.78–0.89 | 0.018 |
| 2021-10 | 198 | 240.2 | 0.82 | 0.82 | 0.78–0.88 | 0.017 |
| 2021-11 | 195 | 210.7 | 0.93 | 0.82 | 0.78–0.87 | 0.022 |
| 2021-12 | 230 | 302.2 | 0.76 | 0.82 | 0.78–0.86 | 0.015 |
| 2022-01 | 164 | 248.6 | 0.66 | 0.82 | 0.78–0.86 | 0.008 |
| 2022-02 | 193 | 364.7 | 0.53 | 0.82 | 0.78–0.86 | 0.003 |
| 2022-03 | 192 | 240 | 0.80 | 0.82 | 0.78–0.86 | 0.003 |
| 2022-04 | 243 | 256.7 | 0.95 | 0.82 | 0.78–0.86 | 0.003 |
| 2022-05 | 202 | 251.8 | 0.80 | 0.82 | 0.78–0.86 | 0.003 |
| 2022-06 | 215 | 265.9 | 0.81 | 0.82 | 0.78–0.86 | 0.003 |
| 2022-07 | 250 | 279.7 | 0.89 | 0.82 | 0.78–0.86 | 0.003 |
| 2022-08 | 278 | 330.9 | 0.84 | 0.82 | 0.78–0.86 | 0.003 |
| 2022-09 | 182 | 232.6 | 0.78 | 0.82 | 0.78–0.86 | 0.003 |
| 2022-10 | 161 | 187.6 | 0.86 | 0.82 | 0.78–0.86 | 0.003 |
| 2022-11 | 215 | 225.9 | 0.95 | 0.82 | 0.78–0.86 | 0.003 |
| 2022-12 | 201 | 265.4 | 0.76 | 0.82 | 0.78–0.86 | 0.003 |
| 2023-01 | 263 | 292.4 | 0.90 | 0.82 | 0.78–0.86 | 0.004 |
| 2023-02 | 138 | 232.7 | 0.59 | 0.82 | 0.78–0.86 | 0.002 |
| 2023-03 | 261 | 286.3 | 0.91 | 0.82 | 0.78–0.86 | 0.003 |
| 2023-04 | 201 | 235.6 | 0.85 | 0.82 | 0.78–0.86 | 0.003 |
| 2023-05 | 201 | 267.4 | 0.75 | 0.82 | 0.78–0.86 | 0.002 |
| 2023-06 | 175 | 223.2 | 0.78 | 0.82 | 0.78–0.86 | 0.002 |
| 2023-07 | 138 | 222.7 | 0.62 | 0.82 | 0.78–0.86 | 0.002 |
| 2023-08 | 257 | 268.6 | 0.96 | 0.82 | 0.78–0.86 | 0.002 |
| 2023-09 | 133 | 211.2 | 0.63 | 0.82 | 0.78–0.86 | 0.002 |
| 2023-10 | 135 | 178.8 | 0.76 | 0.82 | 0.78–0.86 | 0.002 |
| 2023-11 | 131 | 168.1 | 0.78 | 0.82 | 0.78–0.86 | 0.002 |
| 2023-12 | 156 | 167.9 | 0.93 | 0.82 | 0.78–0.86 | 0.002 |
| 2024-01 | 159 | 179.3 | 0.89 | 0.82 | 0.78–0.86 | 0.002 |
| 2024-02 | 139 | 169.1 | 0.82 | 0.82 | 0.78–0.86 | 0.002 |
| 2024-03 | 121 | 158.5 | 0.76 | 0.82 | 0.78–0.86 | 0.002 |
| 2024-04 | 122 | 177.4 | 0.69 | 0.82 | 0.78–0.86 | 0.002 |
| 2024-05 | 127 | 176.3 | 0.72 | 0.82 | 0.78–0.86 | 0.002 |
| 2024-06 | 150 | 191.8 | 0.78 | 0.82 | 0.78–0.85 | 0.002 |
| 2024-07 | 142 | 209.2 | 0.68 | 0.82 | 0.78–0.85 | 0.001 |
| 2024-08 | 172 | 219.9 | 0.78 | 0.82 | 0.78–0.85 | 0.001 |
| 2024-09 | 115 | 155.3 | 0.74 | 0.82 | 0.78–0.85 | 0.001 |
| 2024-10 | 130 | 194.4 | 0.67 | 0.82 | 0.78–0.85 | 0.001 |
| 2024-11 | 134 | 152.7 | 0.88 | 0.82 | 0.78–0.85 | 0.001 |
| 2024-12 | 180 | 251.5 | 0.72 | 0.82 | 0.78–0.85 | 0.002 |
| 2025-01 | 226 | 265.8 | 0.85 | 0.82 | 0.78–0.86 | 0.002 |
| 2025-02 | 190 | 222.4 | 0.85 | 0.82 | 0.78–0.86 | 0.002 |
| 2025-03 | 136 | 200.6 | 0.68 | 0.82 | 0.78–0.85 | 0.002 |
| 2025-04 | 185 | 251.1 | 0.74 | 0.82 | 0.78–0.86 | 0.002 |
| 2025-05 | 143 | 214.9 | 0.67 | 0.82 | 0.78–0.86 | 0.002 |
| 2025-06 | 157 | 190.4 | 0.82 | 0.82 | 0.78–0.86 | 0.002 |
| 2025-07 | 166 | 209.5 | 0.79 | 0.82 | 0.78–0.86 | 0.003 |
| 2025-08 | 153 | 177.7 | 0.86 | 0.82 | 0.78–0.86 | 0.003 |
| 2025-09 | 172 | 148.1 | 1.16 | 0.82 | 0.78–0.86 | 0.002 |
| 2025-10 | 142 | 130.6 | 1.09 | 0.82 | 0.78–0.86 | 0.002 |
| 2025-11 | 110 | 116.6 | 0.94 | 0.82 | 0.78–0.86 | 0.002 |
| 2025-12 | 142 | 148.2 | 0.96 | 0.82 | 0.78–0.86 | 0.002 |
| 2026-01 | 157 | 167.8 | 0.94 | 0.82 | 0.78–0.86 | 0.002 |
| 2026-02 | 276 | 324.4 | 0.85 | 0.82 | 0.78–0.86 | 0.003 |
| 2026-03 | 207 | 279.4 | 0.74 | 0.82 | 0.78–0.86 | 0.003 |
| 2026-04 | 125 | 196.7 | 0.64 | 0.82 | 0.78–0.86 | 0.003 |
| 2026-05 | 155 | 187 | 0.83 | 0.82 | 0.78–0.86 | 0.000 |
| 2026-06 | 235 | 272.4 | 0.86 | 0.82 | 0.78–0.86 | 0.000 |
| 2026-07 | 244 | 320.3 | 0.76 | 0.82 | 0.78–0.86 | 0.000 |
Trash requests jump +485% with probability 0.994. In the same month, streets and sidewalks requests fall −69%. The same signature repeats across four independent geographies covering the same ground: ZIP 37115 (+483% trash, −71% streets), Council District 9 (+462%, −72%), the MADISON police precinct (+241%, −60%).
Read naively that is a garbage crisis and a collapse in road maintenance, in the same place, in the same month. It is neither. Requests moved from one workflow to another — the same work, reclassified. Nothing changed for anyone living in Madison except which queue their complaint landed in.
Two more artefacts dominate the raw ranking, and both look exactly like news:
Coverage onset. Council District 8 logged almost no trash requests until April 2018, then plenty: λ 0.047 → 1.11, a +2,249% change that ranks first in the county. District 33 does the same thing in the same month (+1,159%). Nothing happened in either district. They were absent from the trash workflow, and then they were present.
Systemic months. In September 2025, 33 distinct units break at once across 59 series. In January 2026, 24 units. Half a county does not change character in the same month.
The scan turns up 409 candidate breaks. Each is re-fitted under three different segment-length priors, and a break surviving only one is treated as an artefact of the prior — which removes 45. Of the 364 that survive: 201 local, 156 systemic, 6 coverage onsets, 1 coverage loss. So 163 of 364 — nearly 45% — of what the model finds is the dataset changing, not the city.
What I actually learned
I went looking for the moment Germantown changed. There isn’t one. Not in this record, and — I now think — not in the world either. Neighbourhoods do not usually turn over on a date. They ramp, over a decade, which is exactly long enough that you don’t notice until you leave for a while and come back.
The honest limits, which I would rather state than bury:
311 measures reporting, not conditions. It records the relationship between residents and the city’s complaint system. Germantown turning from warehouses into townhouses does not generate a service request. New restaurants do not. Rents do not. The 57% rise in its share of county requests is consistent with more residents, more affluent residents, more willingness to call — and 311 cannot separate those.
“Public safety” is not crime. It is a 311 request category. I went in loosely thinking of it as a crime signal and it is nothing of the sort. Metro does publish real incident data — 917,709 records with NIBRS offense codes from 2019 — which is a different post.
A field that goes missing looks exactly like a trend. A separate strand of
this work produced a lovely result about digital self-service converging on a
corridor, which I retracted: request_origin coverage decayed per-department
(Trash fell 88% → 64% between 2019 and 2023 while first-call intake stayed at
100%). Restricted to request types with stable coverage, the effect vanishes.
The relative-rate design cancels anything that moves a unit and its control
together; differential missingness moves them apart.
The model did its job. It told me, clearly and with calibrated uncertainty, that my question had a false premise. I wanted a date. What was actually there was a slope.
The changepoint engine is about 200 lines of Python with no dependencies. Exact inference over segmentations is a smaller thing to implement than its reputation suggests, and the test suite that pins the false-positive case is more of it than the inference is.