# American Community Survey 5-year estimates (New Jersey)

Reporter's notebook for the one **survey** on this site. Everything else here is
an administrative count: a district reported a number and the number is the
number. ACS is a sample of households, so every figure arrives with a margin of
error, its race categories are a respondent's self-identification rather than a
registrar's record, and the instrument itself has been rebuilt underneath the
series twice in the span we hold. Read this page before putting an ACS figure
beside an NJDOE figure.

The public-facing explainer lives at
[`site/data/acs-5year/`](../../site/data/acs-5year/index.html) (rendered at
njschooldata.fyi/data/acs-5year/). The first surface to depend on it is the
[SOMSD demographics report](../../site/reports/somsd-demographics/index.html).

```toml ergo
[dataset]
ergo = "0.4"
slug = "acs-5year"
title = "American Community Survey 5-year estimates (New Jersey)"
publisher = "U.S. Census Bureau"
subject = "https://www.census.gov/programs-surveys/acs"
source_url = "https://www2.census.gov/programs-surveys/acs/summary_file/"
pitfall = "This is a survey, not a count: every estimate carries a 90% margin of error that at municipal scale by race routinely runs 15-25% of the estimate itself, and the Bureau rebuilt its race coding beginning with the 2020 survey year."
status = "live"
confidence = "A"
updated = "2026-08-12"
implementation = "https://github.com/lavallee/njschooldata"

[dataset.coverage]
period = "Sixteen 5-year vintages, 2005-2009 through 2020-2024 — but only 2009, 2014, 2019 and 2024 share no survey year with each other, so the series is four independent observations plus twelve overlapping ones"
grain = "acs_vintage x geography x variable, with estimate and 90% margin of error"
entities = "Seven summary levels statewide: 040 state, 050 county, 060 county subdivision, 140 tract, 950/960/970 school district (elementary / secondary / unified). 18,484 geographies and 5,731,487 source values in the series release"

[dataset.access]
keys = ["acs_vintage", "geo_id", "variable_id"]
```

## What it is

An annual rolling survey of about 3.5 million U.S. addresses. The 5-year file
pools sixty months of responses so that small geographies — a township, a school
district — get estimates at all. That pooling is the whole bargain: it buys
coverage of small places at the cost of currency (a "2024" figure describes
2020 through 2024) and at the cost of independence between adjacent vintages.

The tables this site reads:

| Table | What |
|---|---|
| `B01001` + `B` / `H` / `I` iterations | Population by sex and age; race iterations for Black alone, White alone not Hispanic, Hispanic |
| `B02001`, `B02009`, `B03002` | Race alone; race alone-or-in-combination; Hispanic origin by race |
| `B09001` | Population under 18 by age |
| `B14002` | School enrollment by level, **public against private** |
| `B14007` + `B` / `G` / `H` / `I` iterations | Population enrolled by single grade, with race iterations including Two or More Races |

## Where this data comes from

njschooldata downloads and parses nothing. Aquifer owns acquisition, the
table-based Summary File parsers, and the immutable release; this repo installs
an exact offline pin and resolves it through the dataset's own
`current.json` pointer — never a hardcoded release path. Release
`acs-5year-nj-series-2009-2024-v1` records `flat_file_parity = identical`: it was
verified against the publisher's flat files everywhere the two overlap.

Tract geography (summary level 140) is deliberately **not** harvested for the
series. Tract boundaries are redrawn at each decennial, so a sixteen-vintage
tract series would be three different geographies under one name.

---

### An ACS race category and an NJDOE race category are different measurements

```toml ergo
[issue]
id = "acs-race-is-not-njdoe-race"
title = "ACS race is a householder's self-identification on a survey form; NJDOE race is what a school registrar recorded at enrollment — the two may not be divided by one another, and their multiracial categories disagree by roughly a factor of two"
effect = "misleads"
core = true
type = "definitional"
status = "mitigated"
detection = "For the South Orange-Maplewood geography in the 2020-2024 window, ACS table B14007G reports 1,395 +/- 272 multiracial resident students enrolled K-12 while NJDOE's fall enrollment records 644 Two-or-More students in the district for the matching school year. The single-race iterations disagree in the opposite direction. No reconciliation exists because the two instruments ask different people a different question at a different time."
misuse = "Computing a participation rate as NJDOE-race-count divided by ACS-race-count and presenting it as the share of a racial group attending public school. Presenting the difference between an ACS race estimate and an NJDOE race count as students who went somewhere. Combining the Black and Two-or-More categories on both sides makes the sides more comparable than the single-race lines are — it does not make them identical, and the report says so beside the chart."

[issue.scope]
tables = ["source_values"]
columns = ["variable_id"]
```

### The Bureau rebuilt its race coding beginning with the 2020 survey year

```toml ergo
[issue]
id = "race-coding-changed-in-2020"
title = "ACS write-in capture went from 30 to 200 characters and up to six detailed codes are now assigned per write-in area instead of two, beginning with the 2020 survey year — the change pushes respondents out of single-race categories and into Two or More Races, and it lands inside this series"
effect = "breaks"
core = true
type = "definitional"
status = "mitigated"
detection = "The publisher's own user note 2021-03 states the change and instructs that 'any data comparisons to prior race estimates should be made with caution.' A five-year vintage labelled 2024 covers survey years 2020-2024 and is entirely post-change; vintage 2019 covers 2015-2019 and is entirely pre-change; vintages 2020 through 2023 are mixtures. In the SOMSD geography the alone-or-in-combination minus alone gap for the Black population grows from 306 in the 2009 vintage to 1,558 in the 2024 vintage, with the steepest movement across the change."
misuse = "Reading a fall in a single-race estimate across 2020 as a fall in that population. Drawing one line through all sixteen vintages of a race-iteration table. The build carries both the alone and the alone-or-in-combination form for exactly this reason, and the report draws the seam on the chart rather than describing it in distant methodology text."

[issue.scope]
tables = ["source_values"]
columns = ["variable_id", "acs_vintage"]

[[issue.refs]]
title = "ACS user note 2021-03: Improvements to the Race Question"
url = "https://www.census.gov/programs-surveys/acs/technical-documentation/user-notes/2021-03.html"
```

### Consecutive vintages are not independent observations

```toml ergo
[issue]
id = "overlapping-vintages-are-not-independent"
title = "Adjacent 5-year vintages share four of their five survey years, so a trend line through all sixteen counts the same households up to five times and a year-over-year 'change' is mostly the same sample re-read"
effect = "misleads"
type = "uncertainty"
status = "mitigated"
detection = "The release's own metadata carries the rule: 'Consecutive five-year vintages share four survey years. Only 2009, 2014, 2019 and 2024 are mutually non-overlapping.' The vintages table records shared_years_with_previous per row."
misuse = "Fitting a trend across all sixteen windows, or reporting a vintage-over-vintage change as a change. The build tests differences only across the four independent windows and marks the other twelve on the chart with hollow dots so a reader can see which points are independent."

[issue.scope]
tables = ["vintages", "source_values"]
columns = ["acs_vintage", "shared_years_with_previous"]
```

### A difference smaller than its margin is not a difference

```toml ergo
[issue]
id = "moe-is-the-size-of-the-finding"
title = "A race-iteration estimate at municipal or school-district scale carries a margin of error routinely 15-25% of the estimate — often as large as the finding being drawn from it"
effect = "misleads"
core = true
type = "uncertainty"
status = "mitigated"
detection = "Black residents aged 5-17 in the South Orange-Maplewood geography, 2020-2024: 1,758 +/- 406, a coefficient of variation of 14%. Hispanic residents enrolled K-12 the same window: 1,193 +/- 309, CV 15.7%, which the Bureau's conventional bands put in 'use with caution'. The build computes a CV and a reliability band for every estimate it emits."
misuse = "Comparing two estimates by eye, or reporting a difference that does not exceed the margin of the difference (the root-sum-square of the two margins). Presenting an estimate without its margin. Every published difference on a consuming surface must state whether it clears its margin, and several visually obvious ones do not."

[issue.scope]
tables = ["source_values"]
columns = ["estimate_numeric", "moe_numeric"]

[[issue.refs]]
title = "ACS General Handbook ch. 7 — Understanding Error and Determining Statistical Significance"
url = "https://www.census.gov/content/dam/Census/library/publications/2018/acs/acs_general_handbook_2018_ch07.pdf"

[[issue.refs]]
title = "ACS General Handbook ch. 8 — Calculating Measures of Error for Derived Estimates"
url = "https://www.census.gov/content/dam/Census/library/publications/2020/acs/acs_general_handbook_2020_ch08.pdf"
```

### Residents enrolled minus students a district enrolls is a residual, not a private-school count

```toml ergo
[issue]
id = "resident-minus-enrolled-is-a-residual"
title = "The gap between ACS residents enrolled K-12 and a district's own enrollment holds private school, charter, out-of-district special-education placement, county vocational, homeschooling and survey non-response in one undivided number"
effect = "misleads"
type = "definitional"
status = "mitigated"
detection = "For SOMSD in 2020-2024 the gap on the combined Black-and-multiracial category is 961 +/- 490 students, while B14002 sizes the entire private and parochial sector serving both towns, all races, at 774 +/- 156. The two numbers are not the same quantity and the larger cannot be attributed to the smaller."
misuse = "Reporting the residual as private-school enrollment, or as families leaving the district. New Jersey requires no homeschool registration or reporting, so one component of this residual is structurally unobservable rather than merely unmeasured — a surface must say so rather than folding it silently into 'private'."

[issue.scope]
tables = ["source_values"]
columns = ["variable_id"]
```

### B14002 counts charter students as public

```toml ergo
[issue]
id = "charter-counts-as-public"
title = "ACS asks whether a child attends public or private school, so charter students answer public — while NJDOE counts them outside the resident district, which is the opposite side of the boundary"
effect = "context"
type = "definitional"
status = "mitigated"
detection = "B14002 offers respondents public and private only; there is no charter response option in the instrument."
misuse = "Treating the ACS private share as the whole of non-district enrollment. It is not — a charter family sits on the public side of B14002 and outside the district's own count at the same time. This is arguably the right reading (a charter family has not opted out of public education) but it must be stated, because the two files disagree about the same student."

[issue.scope]
tables = ["source_values"]
columns = ["variable_id"]
```

### The B14007 family does not exist before the 2012 vintage

```toml ergo
[issue]
id = "b14007-absent-before-2012"
title = "Enrollment by single grade with race iterations begins at the 2012 vintage, so the joined resident-against-enrolled measures run thirteen windows while the pure-ACS measures run all sixteen"
effect = "context"
type = "coverage"
status = "mitigated"
detection = "The release carries an absent_tables register: B14007 and its B/G/H/I iterations are recorded as 'not-published-in-vintage' for 2009, 2010 and 2011, sourced to each vintage's own published variables.json rather than inferred from a missing row."
misuse = "Rendering an absent table as a zero, or silently starting a chart at 2012 without saying why the earlier windows are missing. Absence and exemption must not look the same."

[issue.scope]
tables = ["absent_tables"]
columns = ["acs_vintage", "table_id", "reason"]
```

### The 2020 survey year was disrupted, and five windows contain it

```toml ergo
[issue]
id = "pandemic-affected-2020-survey-year"
title = "COVID-19 disrupted 2020 ACS collection badly enough that the Bureau released the 2020 1-year estimates only as an experimental product and revised its weighting methodology before judging the 2016-2020 5-year file fit for release"
effect = "context"
type = "coverage"
status = "monitor"
detection = "The Bureau's March 2022 statement on the revised 5-year estimation methodology, and its instruction to use caution when comparing 2016-2020 estimates to earlier ACS data. Survey year 2020 falls inside vintages 2020, 2021, 2022, 2023 and 2024 — five of the sixteen windows here. Published margins widen visibly across the same span: the Black-alone population estimate for SOMSD carries +/-845 in the 2019 vintage and +/-1,425 in 2024."
misuse = "Treating the widening of margins after 2019 as a change in the population rather than a change in what the survey could collect. Reading any single post-2020 vintage as equivalent in quality to a pre-2020 one."

[issue.scope]
tables = ["source_values"]
columns = ["acs_vintage", "moe_numeric"]

[[issue.refs]]
title = "Our Commitment to Quality: A Revised ACS Estimation Methodology in the Complexity of a Pandemic"
url = "https://www.census.gov/newsroom/blogs/random-samplings/2022/03/acs-5year-estimation-methodology.html"
```

### Coverage is not equal across racial groups

```toml ergo
[issue]
id = "differential-coverage-by-race"
title = "The 2020 Post-Enumeration Survey measured a statistically significant 3.30% net undercount of the Black or African American population against a net overcount of the non-Hispanic White population — differential coverage is a measured property of the federal statistical system, not a hypothesis"
effect = "context"
type = "coverage"
status = "monitor"
detection = "Census Bureau press release CB22-CN.02, March 2022, reporting 2020 PES coverage results by race and Hispanic origin. ACS is a different instrument from the decennial census but is weighted to population controls descending from it."
misuse = "Presenting an ACS race estimate as an unbiased count, or attributing the whole of an apparent decline in a minority population to demography when part of the measured level is coverage. The direction of the bias is known; its size at a two-township scale is not published and must not be invented."

[issue.scope]
tables = ["source_values"]
columns = ["variable_id"]

[[issue.refs]]
title = "Census Bureau Releases Estimates of Undercount and Overcount in the 2020 Census"
url = "https://www.census.gov/newsroom/press-releases/2022/2020-census-estimates-of-undercount-and-overcount.html"
```

### The next break is already scheduled

```toml ergo
[issue]
id = "spd15-revision-lands-ahead"
title = "OMB's March 2024 revision to Statistical Policy Directive 15 — the first since 1997 — moves federal collection to one combined race-and-ethnicity question and adds a Middle Eastern or North African category, which will break both ACS and, in time, NJDOE race series"
effect = "context"
type = "definitional"
status = "monitor"
detection = "Federal Register 2024-06469, effective 28 March 2024 for new record-keeping and reporting requirements. The Department of Education maintains its own SPD 15 implementation notice, so the NJDOE side of this site's race joins will move too."
misuse = "Extending any race series across the adoption year without a seam once the revised categories reach these files. Planning a surface that assumes today's seven NJDOE race categories and six ACS iterations are permanent."

[issue.scope]
tables = ["source_values"]
columns = ["variable_id"]

[[issue.refs]]
title = "Revisions to OMB's Statistical Policy Directive No. 15"
url = "https://www.federalregister.gov/documents/2024/03/29/2024-06469/revisions-to-ombs-statistical-policy-directive-no-15-standards-for-maintaining-collecting-and"
```

---

## History

**2026-08-03 — archived.** An earlier consumer experiment carried five Aquifer
measures for 557 ACS statistical school-district geographies as a local mart. No
renderer, catalog loader, warehouse family, publication command or public route
consumed it, and it joined nothing: all 744 district rows in
`data/entity_slugs.csv` had a blank reserved `census_geoid`, so the mart recorded
`census-geography-only` for every row. The adapter, resolver, lock and
self-referential test were retired together.

**2026-08-12 — live again, on a different footing.** The re-adoption conditions
that page set out have been met. The join is no longer by name or by a blank
reserved column: it runs through the NCES LEAID, parsed from an identifier
(ACS `native_geoid` 3415330 → CCD 3415330 → NJDOE 13-4900) using the
`nces-ccd-directory` bridge release, which resolves South Orange-Maplewood in
all eleven of its editions at a stable identifier. And there is a named
reader-facing use: the SOMSD demographics report, which is the first surface on
this site to put a survey estimate beside an administrative count and therefore
the first that needed this page to exist.

The bridge reaches back to the 2014-15 CCD edition, so **joined** measures run
ten vintages (2015-2024) and **pure-ACS** measures run all sixteen. A row of any
joined mart before vintage 2015 must say it has no bridge rather than resolve
through a later edition.
