How the Town Pages Stay Accurate & Neutral

What every town's pages are built from, the measures this site builds itself, the known problems in the state's data, and how to check any of it.

Why this page exists

Every Connecticut town on this site has the same set of pages, built from the same statewide data. Each chart names its source and states its caveats beside it. This page collects the method behind all of them in one place: what the pages are built from, which figures this site computes itself rather than copying from a publisher, what is known to be wrong or missing in the source data, and how a reader can check any of it.

Colchester has a separate page, Colchester’s accuracy & neutrality page, because its hand-built pages rest on the town’s own budget books as well as on the statewide data described here.

What these pages are, and are not

  • They use statewide data only. Every figure comes from a file the state or the federal government publishes for all towns at once: the Office of Policy and Management’s Municipal Fiscal Indicators and mill-rate files, the State Department of Education’s EdSight, the Census Bureau’s American Community Survey, and others named on the data sources page.
  • No town’s own budget book has been read for these pages. A town’s adopted budget, its line items and its own explanations are not on them. Colchester’s hand-built pages are the exception, and they are marked as such.
  • Spending is audited spending, not the adopted budget. The figures are what a town reported spending after the year closed, across all its governmental funds. See audited actuals and the adopted budget.
  • The same code writes every town’s page. Each page is one shared template. The sentences above each chart are written in the reader’s browser from the data file, not typed per town, so no town gets a description the others would not get from the same figures.
  • A page describes; it does not grade. A rank is a position in a sorted list, printed with its denominator and the statewide median. See statewide ranks.

Measures this site builds itself

Most figures on a town page are copied from a published field. The ones below are not: this site computes them. Each is disclosed on the chart that uses it; this is the full list in one place.

MeasureHow it is builtWhat it is not
Spending, used where a budget would be OPM Municipal Fiscal Indicators (ej6f-y2wf): audited expenditures across all governmental funds. Not the budget the town adopted, and gross of grant money a local budget never appropriates. More
Property tax levy The net grand list taxed at the posted real-estate mill rate on its non-vehicle share and at the capped motor-vehicle rate on its vehicle share, all from the same fiscal year. Not what the town collected. It leaves out unpaid taxes and credits granted after the list is set. More
Levy per resident, and as a share of income The levy above ÷ population; that figure ÷ median household income from the most recent ACS five-year release. Not any household’s bill. It spreads commercial, land and vehicle property over every resident, and divides a per-resident figure by a per-household income from a different period. More
Group medians Each town’s own figure is computed first; the median is taken across those figures, with the subject town left out of its own group. Not a group total, and not the figure for any fixed town from year to year. More
Rule-based peer set Derived by Data/build_peer_sets.py from a stated formula over published state data. Not a grouping any agency publishes. It is this site’s choice, published so anyone can re-run it or change the weights. More
Outlier flag A figure is flagged when it falls in the lowest or highest tenth of all towns reporting it. Not a judgement that the figure is too high or too low. It says only that few towns report a figure that far from the middle.

Known problems in the source data

These are problems in the files the state publishes, found while collecting them. The site does not correct the state’s figures. It either carries a figure as missing or prints both versions, and says which it did. The counts below are read from the data files each time the site is built.

Two OPM files disagree about some mill rates

OPM publishes a town’s mill rate in two places: the mill-rate file (emyx-j53e) and the Municipal Fiscal Indicators. Where both cover the same town and year, they disagree in 5 town-years. Neither file is preferred. The charts use the mill-rate file, or OPM’s adopted-budget summary where the mill-rate file has no rate (see the next section), and the disagreement is listed here with the dataset the site’s value came from.

TownFiscal yearRate this site usesFromFiscal Indicators
New LondonFY 2017-1843.17emyx-j53e44.26
New LondonFY 2018-1943.62emyx-j53e43.17
NorwalkFY 2020-2123.956emyx-j53e23.88
NorwalkFY 2021-2223.9pcg4-s5rc23.97
NorwalkFY 2022-2324.69pcg4-s5rc24.54

A mill rate of zero

The mill-rate file records a rate of exactly zero for 4 town-years. No town levies at a rate of zero, so those cells are carried as missing, not charted as 0. Where OPM’s adopted-budget summary (pcg4-s5rc) publishes a rate for a year the mill-rate file leaves empty or at zero, the cell is filled from that summary and names it as its source. 4 cells are filled this way: Colchester FY 2022-23; Norwalk FY 2021-22; Norwalk FY 2022-23; Norwalk FY 2023-24.

Towns missing from the spending-by-function detail

The breakdown of spending by function (public safety, public works and so on) comes from OPM’s Uniform Chart of Accounts file (e2qt-k238), which covers FY 2019-20 through FY 2022-23. The state omits some town-years from it entirely. Those years are left out of the charts, not drawn as zero. 39 towns have at least one year missing. 2 have no year at all, so there is no function detail to chart for them: Danbury, East Lyme.

The 37 towns missing some years
  • Andover: FY 2020-21, FY 2021-22, FY 2022-23
  • Ansonia: FY 2019-20
  • Bloomfield: FY 2019-20
  • Bolton: FY 2020-21
  • Bozrah: FY 2019-20, FY 2020-21
  • Bridgewater: FY 2020-21
  • Colebrook: FY 2020-21
  • Derby: FY 2019-20
  • East Haven: FY 2019-20, FY 2020-21
  • Easton: FY 2019-20, FY 2020-21
  • Enfield: FY 2020-21
  • Hamden: FY 2019-20
  • Hebron: FY 2019-20
  • Mansfield: FY 2020-21
  • Marlborough: FY 2021-22, FY 2022-23
  • Meriden: FY 2019-20
  • Middletown: FY 2022-23
  • New Britain: FY 2020-21
  • New Canaan: FY 2019-20
  • New Haven: FY 2020-21, FY 2022-23
  • Norfolk: FY 2019-20, FY 2020-21, FY 2021-22
  • North Branford: FY 2019-20, FY 2020-21
  • North Canaan: FY 2019-20, FY 2020-21, FY 2021-22
  • North Haven: FY 2019-20, FY 2020-21
  • Prospect: FY 2019-20, FY 2021-22
  • Seymour: FY 2019-20, FY 2020-21
  • Southington: FY 2019-20, FY 2020-21
  • Stamford: FY 2022-23
  • Stonington: FY 2019-20
  • Warren: FY 2020-21
  • West Hartford: FY 2020-21
  • West Haven: FY 2019-20, FY 2020-21
  • Westbrook: FY 2019-20, FY 2021-22, FY 2022-23
  • Wethersfield: FY 2019-20, FY 2021-22, FY 2022-23
  • Willington: FY 2019-20, FY 2020-21
  • Wilton: FY 2019-20, FY 2020-21
  • Woodbury: FY 2020-21

School staffing categories

Staffing counts are positions districts report to the state under fixed categories. A line that steps up or down in one year can be a change in hiring or a change in how positions were reported, and the count alone does not say which. The site does not adjust for either. See reported school staffing.

General education paraprofessionals: large one-year jumps in many districts, with two readings. In the state’s “general education – paraprofessional instructional assistants” category, 72 of the 163 districts in this site’s staffing files show at least one one-year rise of 80% or more and at least 3 full-time equivalents (105 jumps in all). They fall in 18 different school years, with no more than 10 in any one year. A single statewide change in how the category is counted would put most of them in the same year. The State Department of Education has published no note describing a change. These counts are read from the staffing files each time the site is built.

A jump that size can be read two ways:

  • A district recoding its own staff. In 41 of the 105 jumps, another category in the same district fell by at least half as much in the same year, which fits positions moving between categories.
  • New positions. In the other 64, nothing fell to match. That fits new hiring, and it also fits recoding the counts alone cannot see. Colchester is one: its category went from 33 to 89 full-time equivalents in 2024-25, in the year federal COVID-relief school funding (ESSER III) had to be committed, by September 30, 2024. Finding F14 in METHODOLOGY.md reads it as new positions; the ESSER link is an inference from timing and dollar size, and no document examined for this site ties the positions to ESSER line by line. Separately, the state reported a 12% statewide rise in this category between the 2018-19 and 2021-22 school years (press release PR-102, May 16, 2023).

For any one district, the site does not say which reading fits. The full tables, and a question to the State Department of Education, are in Data/requests/csde-paraprofessional.md and the project’s data dictionary. A jump in this one category also moves a district’s total staffing, so a total that jumps in the same year should be read with it.

What is checked, and how

  • The data files are checked against each other. Data/validate_payloads.py is run after a data file is refreshed and before it is published. It checks that each file has 169 towns, that each town’s files name the right town, that fields are not mostly empty, that group medians are computed town by town, and that two files carrying the same figure agree. Where they do not, it reports the disagreement rather than choosing a side, which is where the mill-rate table above comes from.
  • The wording is reviewed before it is published. Changes to published prose go through the budget-review checklist, which looks for claims without a source and for loaded or one-sided wording. That review can flag a sentence; a person decides what changes.
  • A template change is checked on every town. Because one template writes every town’s page, the project’s rule is to check a change across all of them for missing figures, empty tables and broken values, not on one sample town.

What these checks cannot do: confirm that the state’s own figures are right. If a town filed a wrong number with OPM, these pages show that number. Where two state files disagree, the site can say so, but it cannot say which is correct.

How to check any of it

  • Every chart names its dataset. The source note under each chart gives the dataset identifier, which links to the publisher’s own copy.
  • Every data file can be downloaded. The chart catalog lists every file the charts read, and each town page’s footer links that town’s own files. Each file carries a metadata block naming its source and dataset identifier and describing what was done to it; most also record when they were pulled.
  • The collection scripts are public. The scripts that fetch and build each file are in the Data/ folder of the project repository, so any file can be rebuilt from the source.
  • Every term is defined once. How the numbers work explains each measure and lists the charts that depend on it.

Who wrote this

This is an independent, volunteer project by John Farrell, a Colchester resident. It is not an official product of any town or state agency, and it is not connected to any party or campaign. The pages for other towns were built so that residents there can see their own town on the same basis, not to argue for or against any town’s decisions.

If a figure looks wrong, please say so: john.e.farrell@gmail.com. Corrections are recorded, with the date, in the project’s change log.