Skip to content
// morris-labs
bayesiannashvillestatistics

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.

12 min read

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.

relative rate λ — Germantown property violations vs rest of county · λ=1 is parity0.01.02.03.0P(regime boundary here)1.0020182020202220242026
Property-violation requests inside the Germantown Historic Preservation District, as a rate relative to the rest of Davidson County. 95 months, June 2018 to July 2026. The posterior expects 2.90 changepoints across the series, yet no single month exceeds probability 0.288 — the bottom panel never gets near the 0.5 reporting threshold. That combination is the signature of drift, not of a step. Three observations sit above the axis ceiling and are marked with arrows — February 2021 (λ = 5.4), December 2021 (3.8) and June 2018 (3.1).
data table
monthobservedexpectedλ obsλ fit95% intervalP(boundary)
2018-0641.33.110.760.37–1.340.000
2018-0902.20.000.760.37–1.340.000
2018-1013.80.260.760.37–1.340.013
2018-1231.22.470.760.37–1.340.015
2019-0101.40.000.760.37–1.340.013
2019-0201.40.000.760.37–1.330.013
2019-0301.80.000.760.37–1.340.014
2019-0432.31.310.760.37–1.340.013
2019-0536.80.440.760.37–1.350.018
2019-0624.80.420.770.37–1.360.029
2019-0725.60.360.790.37–1.390.081
2019-0824.20.470.870.39–1.540.174
2019-0944.80.841.030.44–1.700.221
2019-1074.21.671.230.56–1.810.083
2019-11522.511.310.61–1.830.035
2019-1211.50.661.340.63–1.840.043
2020-0102.60.001.370.67–1.850.100
2020-0273.12.251.460.92–1.870.036
2020-0352.61.911.491.05–1.890.023
2020-0484.91.641.501.12–1.890.015
2020-05105.11.971.511.14–1.890.009
2020-0663.61.681.511.14–1.890.007
2020-0742.81.431.511.15–1.890.007
2020-0834.10.731.511.15–1.890.009
2020-0973.22.191.521.15–1.890.007
2020-1073.61.921.521.16–1.890.006
2020-1102.60.001.521.17–1.890.008
2020-1232.31.311.521.17–1.900.008
2021-0162.32.641.531.18–1.900.006
2021-0291.75.431.531.18–1.900.005
2021-0353.41.481.531.18–1.900.005
2021-04104.42.261.531.18–1.900.005
2021-05165.52.921.531.18–1.900.011
2021-0623.90.511.521.17–1.890.007
2021-0755.70.871.521.17–1.890.006
2021-0896.41.411.521.17–1.890.006
2021-09106.51.541.521.16–1.890.006
2021-1045.20.771.521.16–1.890.006
2021-1132.91.031.521.16–1.890.006
2021-12133.43.781.521.16–1.890.010
2022-0163.11.911.511.15–1.890.013
2022-0263.81.601.511.13–1.890.015
2022-03147.41.901.501.11–1.890.034
2022-04137.31.771.471.01–1.880.087
2022-051481.741.410.84–1.860.288
2022-06560.831.160.66–1.730.166
2022-07570.711.040.64–1.570.076
2022-08812.20.660.990.63–1.490.023
2022-0958.70.570.980.63–1.470.013
2022-1077.10.990.980.63–1.470.012
2022-1143.91.020.970.63–1.460.012
2022-1263.11.950.970.63–1.460.016
2023-0154.61.090.960.63–1.450.017
2023-02104.52.250.960.63–1.450.055
2023-0344.50.890.920.61–1.390.049
2023-0435.30.560.890.60–1.340.030
2023-0557.70.650.880.60–1.300.019
2023-0646.80.590.870.60–1.290.013
2023-0758.50.590.860.60–1.290.010
2023-081581.880.860.59–1.280.034
2023-0965.61.070.840.59–1.260.045
2023-1056.70.750.820.57–1.230.038
2023-1134.90.620.810.55–1.190.030
2023-1222.90.700.800.54–1.170.028
2024-0132.41.270.790.54–1.160.036
2024-0244.60.860.770.53–1.110.038
2024-0333.70.810.750.52–1.050.038
2024-04480.500.730.51–1.010.024
2024-0528.80.230.720.51–0.990.012
2024-06711.90.590.720.51–0.990.010
2024-0799.40.960.720.51–0.990.013
2024-0899.10.990.720.50–0.990.019
2024-0946.60.600.710.50–0.980.017
2024-10460.670.710.49–0.980.017
2024-1178.50.820.700.49–0.970.022
2024-1232.71.120.700.48–0.970.027
2025-0112.20.450.690.47–0.960.024
2025-0212.80.360.680.46–0.950.020
2025-03115.52.010.680.46–0.950.110
2025-0415.10.200.630.40–0.870.062
2025-05512.70.390.600.39–0.820.032
2025-061115.90.690.590.38–0.810.046
2025-076160.370.580.37–0.780.023
2025-0867.20.830.570.37–0.780.036
2025-09110.20.100.560.36–0.760.014
2025-1029.30.210.560.35–0.760.009
2025-1113.60.280.560.35–0.760.009
2025-12150.200.550.35–0.760.008
2026-0133.80.800.550.35–0.750.008
2026-0233.80.790.550.35–0.750.009
2026-03150.200.550.35–0.750.008
2026-0448.20.490.550.35–0.750.008
2026-05470.570.550.35–0.750.000
2026-06011.50.000.550.35–0.750.000
2026-071215.80.760.550.35–0.750.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.

relative rate λ — investor STR share vs rest of county · λ=1 is parity0.01.02.03.0P(regime boundary here)1.00201520172019202120232025
Investor short-term-rental permits in Davidson County as a share of all new STR permits, relative to the rest of the county. 135 months, April 2015 to June 2026. Three observations sit above the axis ceiling and are marked with arrows — April 2015 (λ = 6.9, in a month with only 32 expected permits), December 2020 (3.1) and August 2021 (3.3).
data table
monthobservedexpectedλ obsλ fit95% intervalP(boundary)
2015-04220326.881.811.39–2.690.000
2015-05159562.841.811.39–2.690.000
2015-061261091.161.811.39–2.690.217
2015-0787641.361.591.23–2.170.068
2015-0841311.321.531.20–1.870.043
2015-0943580.741.501.18–1.770.010
2015-1047381.241.501.18–1.760.009
2015-1149351.401.501.19–1.760.008
2015-1236281.291.501.19–1.760.007
2016-0142391.081.501.19–1.750.006
2016-0237440.841.491.19–1.750.006
2016-0350411.221.491.19–1.750.006
2016-0476541.411.501.19–1.750.005
2016-0572641.131.501.20–1.750.007
2016-0668581.171.501.20–1.750.008
2016-0760451.331.501.21–1.760.009
2016-0885541.571.511.23–1.760.008
2016-0998591.661.511.23–1.770.006
2016-1071521.361.511.23–1.770.007
2016-1159481.231.511.23–1.780.011
2016-1254341.591.521.24–1.780.011
2017-0194412.291.531.24–1.790.007
2017-0262331.881.531.24–1.800.001
2017-0356282.001.531.24–1.800.007
2017-0487441.981.521.23–1.790.986
2017-0510780.130.420.29–0.570.004
2017-0646660.700.420.29–0.560.002
2017-0713720.180.410.29–0.560.005
2017-0827770.350.410.29–0.560.005
2017-0912690.170.410.29–0.560.007
2017-1023680.340.410.29–0.560.008
2017-1125820.300.420.29–0.570.012
2017-1214470.300.420.29–0.570.015
2018-0136730.490.420.30–0.580.013
2018-0241590.690.420.30–0.580.008
2018-0333720.460.430.30–0.580.008
2018-0419710.270.430.30–0.590.013
2018-0546960.480.430.30–0.590.014
2018-0632770.420.430.30–0.600.018
2018-0732740.430.440.31–0.630.023
2018-0821920.230.450.31–0.650.096
2018-0920720.280.480.32–0.770.306
2018-1070750.930.600.36–0.910.062
2018-1134590.580.630.37–0.920.063
2018-1233670.490.650.39–0.930.093
2019-0150570.880.690.41–0.950.042
2019-0245610.740.700.42–0.950.030
2019-0347810.580.710.43–0.960.039
2019-0445770.580.730.46–0.970.055
2019-0563860.730.750.49–1.000.049
2019-0658700.830.780.51–1.040.036
2019-0774661.120.790.53–1.070.014
2019-0843510.840.800.53–1.080.014
2019-0924560.430.800.54–1.100.041
2019-1057501.140.820.55–1.190.023
2019-1136490.730.830.56–1.230.044
2019-1226470.550.860.57–1.350.185
2020-0172521.391.040.65–1.730.071
2020-0255401.381.080.66–1.780.043
2020-0332311.031.130.67–1.810.059
2020-04670.861.180.68–1.860.068
2020-05670.861.230.69–1.910.079
2020-0621161.311.310.70–1.970.074
2020-0723221.041.370.73–2.010.099
2020-0818141.291.470.77–2.080.100
2020-091672.291.570.83–2.140.066
2020-1020102.001.630.92–2.170.045
2020-1120102.001.671.10–2.180.032
2020-1231103.101.691.16–2.180.015
2021-0127161.691.701.18–2.180.012
2021-021863.001.711.19–2.190.009
2021-0340182.221.711.20–2.190.007
2021-0430191.581.711.20–2.190.006
2021-0525161.561.711.21–2.190.006
2021-0667282.391.711.21–2.190.005
2021-0733211.571.711.21–2.190.005
2021-0856173.291.711.20–2.180.009
2021-0941211.951.711.20–2.180.011
2021-1013380.341.701.19–2.180.006
2021-1159401.481.701.19–2.180.007
2021-1297422.311.711.19–2.180.008
2022-0179282.821.701.17–2.180.046
2022-02104482.171.661.03–2.170.582
2022-0335480.731.060.57–1.810.132
2022-0424280.860.950.56–1.650.079
2022-0518400.450.880.55–1.400.022
2022-0641311.320.870.55–1.340.030
2022-0730330.910.850.55–1.230.025
2022-0828510.550.840.54–1.200.012
2022-0920320.630.830.54–1.190.010
2022-1015250.600.830.54–1.190.010
2022-119280.320.830.54–1.180.011
2022-1210280.360.840.54–1.190.016
2023-0131380.820.840.55–1.190.017
2023-0234380.900.840.55–1.200.016
2023-0322340.650.850.55–1.200.021
2023-0421360.580.860.55–1.210.031
2023-0518360.500.870.56–1.230.059
2023-0624400.600.910.57–1.270.110
2023-0737291.280.970.62–1.360.068
2023-0833390.851.010.65–1.380.083
2023-0939341.151.050.69–1.420.064
2023-1037221.681.090.73–1.450.034
2023-1128231.221.110.75–1.460.029
2023-1220191.051.120.77–1.460.028
2024-0129281.041.130.79–1.460.028
2024-0231231.351.150.82–1.470.022
2024-0332211.521.160.84–1.480.016
2024-0423221.041.170.85–1.490.017
2024-0544361.221.170.87–1.490.014
2024-0618220.821.180.88–1.500.017
2024-0722171.291.180.89–1.510.016
2024-0830340.881.190.90–1.510.020
2024-0943221.961.200.92–1.530.012
2024-1041241.711.210.92–1.530.009
2024-1125241.041.210.92–1.530.010
2024-1223131.771.210.92–1.540.008
2025-0131201.551.210.93–1.540.007
2025-0226161.631.220.93–1.540.007
2025-0317111.541.220.93–1.540.007
2025-0429231.261.220.93–1.550.007
2025-051291.331.220.93–1.550.007
2025-0626141.861.220.94–1.550.006
2025-0728102.801.220.94–1.550.007
2025-0815151.001.220.93–1.550.007
2025-0922201.101.220.93–1.550.007
2025-1017141.211.220.93–1.550.007
2025-1124122.001.220.93–1.550.008
2025-1226151.731.210.93–1.550.009
2026-0129122.421.210.92–1.550.016
2026-0211150.731.200.90–1.550.015
2026-0319270.701.200.89–1.540.012
2026-0419171.121.190.86–1.540.000
2026-0513160.811.190.86–1.540.000
2026-066100.601.190.86–1.540.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:

relative rate λ — Madison trash & recycling vs rest of county · λ=1 is parity0.00.51.01.5P(regime boundary here)1.0020172019202120232025
Trash and recycling requests in the Madison planning area as a rate relative to the rest of Davidson County. 108 months, August 2017 to July 2026. The single boundary sits at the August/September 2018 seam with probability 0.994.
data table
monthobservedexpectedλ obsλ fit95% intervalP(boundary)
2017-081158.80.190.190.13–0.270.000
2017-09447.90.080.190.13–0.270.000
2017-101347.90.270.190.13–0.270.003
2017-11646.60.130.190.13–0.270.003
2017-12541.70.120.190.13–0.270.003
2018-01360.70.050.190.13–0.270.003
2018-021160.10.180.190.13–0.270.003
2018-031062.10.160.200.13–0.270.003
2018-04955.60.160.200.13–0.270.004
2018-051190.80.120.200.13–0.270.006
2018-061686.90.180.200.13–0.270.000
2018-072176.50.280.200.13–0.270.006
2018-083095.40.310.200.13–0.270.994
2018-09977782.81.251.211.03–1.370.000
2018-10554417.51.331.211.03–1.370.000
2018-11279209.91.331.211.03–1.370.236
2018-12207193.81.071.130.88–1.330.199
2019-01269262.31.021.070.85–1.290.128
2019-022992691.111.030.84–1.270.266
2019-031882320.810.940.82–1.110.038
2019-041962380.820.930.82–1.070.009
2019-05239250.70.950.930.82–1.070.008
2019-06213229.30.930.930.82–1.070.006
2019-07254274.10.930.930.82–1.060.005
2019-08269311.30.860.930.82–1.060.003
2019-09252262.80.960.920.82–1.060.004
2019-10296259.91.140.920.82–1.060.008
2019-11235205.11.150.920.82–1.060.022
2019-12151159.30.950.920.82–1.050.023
2020-01202211.20.960.920.82–1.050.028
2020-02147181.10.810.910.82–1.040.018
2020-03286266.11.070.910.82–1.040.050
2020-04244290.50.840.900.81–1.020.030
2020-05281313.50.900.890.81–1.010.030
2020-06368339.41.080.890.81–1.010.133
2020-07447562.40.800.870.80–0.970.039
2020-08240271.40.880.860.80–0.960.040
2020-09182215.10.850.850.79–0.950.035
2020-10208222.20.940.850.79–0.950.046
2020-11162229.10.710.850.79–0.940.023
2020-12210246.80.850.840.79–0.940.021
2021-01208254.10.820.840.79–0.930.017
2021-02180201.60.890.840.79–0.930.019
2021-032182490.880.840.79–0.920.020
2021-04217274.50.790.840.79–0.920.015
2021-05201249.30.810.830.79–0.920.012
2021-06301330.40.910.830.79–0.920.016
2021-07236263.90.890.830.79–0.910.019
2021-08279291.10.960.830.78–0.910.031
2021-09273358.10.760.830.78–0.890.018
2021-10198240.20.820.820.78–0.880.017
2021-11195210.70.930.820.78–0.870.022
2021-12230302.20.760.820.78–0.860.015
2022-01164248.60.660.820.78–0.860.008
2022-02193364.70.530.820.78–0.860.003
2022-031922400.800.820.78–0.860.003
2022-04243256.70.950.820.78–0.860.003
2022-05202251.80.800.820.78–0.860.003
2022-06215265.90.810.820.78–0.860.003
2022-07250279.70.890.820.78–0.860.003
2022-08278330.90.840.820.78–0.860.003
2022-09182232.60.780.820.78–0.860.003
2022-10161187.60.860.820.78–0.860.003
2022-11215225.90.950.820.78–0.860.003
2022-12201265.40.760.820.78–0.860.003
2023-01263292.40.900.820.78–0.860.004
2023-02138232.70.590.820.78–0.860.002
2023-03261286.30.910.820.78–0.860.003
2023-04201235.60.850.820.78–0.860.003
2023-05201267.40.750.820.78–0.860.002
2023-06175223.20.780.820.78–0.860.002
2023-07138222.70.620.820.78–0.860.002
2023-08257268.60.960.820.78–0.860.002
2023-09133211.20.630.820.78–0.860.002
2023-10135178.80.760.820.78–0.860.002
2023-11131168.10.780.820.78–0.860.002
2023-12156167.90.930.820.78–0.860.002
2024-01159179.30.890.820.78–0.860.002
2024-02139169.10.820.820.78–0.860.002
2024-03121158.50.760.820.78–0.860.002
2024-04122177.40.690.820.78–0.860.002
2024-05127176.30.720.820.78–0.860.002
2024-06150191.80.780.820.78–0.850.002
2024-07142209.20.680.820.78–0.850.001
2024-08172219.90.780.820.78–0.850.001
2024-09115155.30.740.820.78–0.850.001
2024-10130194.40.670.820.78–0.850.001
2024-11134152.70.880.820.78–0.850.001
2024-12180251.50.720.820.78–0.850.002
2025-01226265.80.850.820.78–0.860.002
2025-02190222.40.850.820.78–0.860.002
2025-03136200.60.680.820.78–0.850.002
2025-04185251.10.740.820.78–0.860.002
2025-05143214.90.670.820.78–0.860.002
2025-06157190.40.820.820.78–0.860.002
2025-07166209.50.790.820.78–0.860.003
2025-08153177.70.860.820.78–0.860.003
2025-09172148.11.160.820.78–0.860.002
2025-10142130.61.090.820.78–0.860.002
2025-11110116.60.940.820.78–0.860.002
2025-12142148.20.960.820.78–0.860.002
2026-01157167.80.940.820.78–0.860.002
2026-02276324.40.850.820.78–0.860.003
2026-03207279.40.740.820.78–0.860.003
2026-04125196.70.640.820.78–0.860.003
2026-051551870.830.820.78–0.860.000
2026-06235272.40.860.820.78–0.860.000
2026-07244320.30.760.820.78–0.860.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.