diff --git a/.gitignore b/.gitignore index be202da9..215e37ce 100644 --- a/.gitignore +++ b/.gitignore @@ -113,6 +113,9 @@ paper/paper_files/ scratch/ *.pkl +# Claude Code local state (agent worktrees are not repo content) +.claude/ + # First-estimates ceremony-owned pre-publication state. runs/first_estimates_attempt.claim runs/first_estimates_retry.claim diff --git a/data/external/employer_firm_target_sources.md b/data/external/employer_firm_target_sources.md index 5b2d1c76..a8c57ff2 100644 --- a/data/external/employer_firm_target_sources.md +++ b/data/external/employer_firm_target_sources.md @@ -1,6 +1,6 @@ # Employer-firm target extract provenance -Provenance sidecar for the four committed aggregate extracts that +Provenance sidecar for the committed aggregate extracts that feed the employer-firm extension's calibration targets and gate references (E1/E2/E7/E11/E12; issue #192, ADR 0003, workstream B). All are small, tidy derivatives of published public aggregate files — @@ -92,5 +92,133 @@ are keyless and authoritative. firm-size-coded contribution as published. 2025Q1 firm-size cells are suppressed in this release (status flag 5) and load as NaN. - **Unit caveat:** job counts, as for QWI. Origin-x-destination - size-ladder flows (E11's J2JOD reference) are a later, separate - extract. + size-ladder flows are in `j2jod_us_firmsize_od_2015on.csv` (entry + 6 below). + +## 5. `j2j_us_sexage_2015on.csv` — J2J flows by sex x age group + +Fetched on **2026-07-17** (extracts 5 and 6 are the second wave, +flagged in PR #223's method findings; same fetch script). + +- **Source URL:** https://lehd.ces.census.gov/data/j2j/R2026Q1/us/j2j/j2j_us_sa_f_gn_ns_oslp_u.csv.gz + (release-stamped, not `latest_release`; see the QWI note above) +- **Release:** R2026Q1, V4.14.0 (`version_j2j.txt`: J2J US + 2000:2-2025:1, `j2jpu_us_20260312_1118`); sex x age worker detail + (`sa`), no firm characteristics (`f`), not seasonally adjusted, + state/local/private ownership (`oslp`) +- **Raw sha256:** `0e043fc8796bd3e11231ff6d174fdfebed926c9d40da4f069a3ad31eed55aba0` +- **Transformation:** pure row/column filter, no re-aggregation: + the all-industry margin (`industry == "00"`) only, the full + sex (0/1/2) x age (A00-A08) grid margins included, 2015Q1 onward; + 12 flow measures with status flags. The full NAICS-sector detail + would breach the 1 MB extract cap, so it is not committed; the + raw sector file stays available at the pinned URL. Sex and + age-group labels joined from the LEHD schema + (https://lehd.ces.census.gov/data/schema/latest/label_agegrp.csv, + sha256 `eb478c6eda6c12a57609afaf89bbb42dd4d9fb2ee883f6dd0399fb717b27889b`). +- **Naming caveat:** the age x sex tabulation is LEHD's `sa` + crossing; LEHD's `se` crossing is sex x *education* (the gate-E2 + registration's "se" shorthand refers to sex x age, i.e. `sa`). +- **Unit caveats:** job counts, not persons (see the QWI entry); + ownership is `oslp` here versus `op` for the QWI extract, so + levels are not directly comparable across the two. 2025Q1 + separation-side measures carry status flag -1 (not computable + until the next quarter is released) and load as NaN. + +## 6. `j2jod_us_firmsize_od_2015on.csv` — J2J flows by origin x destination firm size + +- **Source:** LED Extraction Tool query API, + https://ledextract.ces.census.gov (POST the pinned JSON request in + `scripts/fetch_employer_firm_targets.py` to `/j2j/download`, then + GET `/j2j/download.csv?` from the 303 redirect). + The LEHD flat J2JOD files (`j2jod_us_d_fs_*`) publish only the + one-sided firm-size margins — the full origin x destination cross + is not in any flat file — and the Census data API + (`api.census.gov`) still requires a key (probed 2026-07-17), so + the LED Extraction Tool is the pinned keyless source. +- **Release: not reported by the tool; inferred.** The extraction + tool exposes no release identifier. Its `/j2j/schema` reports + `V4.14.0`, which is the *software* version and is **identical for + R2026Q1 and R2026Q2** (`version_j2jod.txt`: R2026Q1 = + `j2jodpu_us_20260312_1118`, 2000:2-2025:1; R2026Q2 = + `j2jodpu_us_20260618_1116`, 2000:2-2025:2), so it cannot + distinguish them. An earlier revision of this entry claimed the + schema version "matches R2026Q1" and therefore pinned the release; + that inference does not hold. What is verified: the values served + for 2015Q1-2025Q1 are unchanged across the R2026Q1 → R2026Q2 + rotation (checked 2026-07-23, all 1,476 rows), so the extract is + release-stable over its own window whichever release served it. + National, all industries, not seasonally adjusted, ownership A00 + (state/local government plus private — the tool's reported + `ownercode`; equivalent to `oslp`). +- **Archived response:** `raw/led_j2jod_us_fsfs_2015on.csv.gz` + (gzip of the tool's CSV as served 2026-07-23; raw sha256 + `7afad9f408319c54e7e7d802b068723e346f49c840d4fe861e7e55d9528d3944`). + Committed because the tool re-runs the query against whatever + release is current, so the 2015Q1-2016Q1 detail window — the only + window in which this cross is published at all (next bullet but + one) — is not re-fetchable in perpetuity. The archive is the + builder's default input; a live re-query is the verification path. +- **Integrity pin: content, not bytes.** `LED_J2JOD_CONTENT_SHA256` + = `c52ec512bc3f478d6426efb7b03cccbe1edc952309214030ed53eb42f7a83354`, + taken over the response canonicalised (columns sorted, rows sorted + by year/quarter/firmsize_orig/firmsize, fixed float format). The + byte digest is recorded but **not** enforced. + + Why: the byte digest originally pinned here + (`adbd16e2...`, fetched 2026-07-17) stopped matching on + 2026-07-23 while every one of the 1,476 rows was unchanged, value + for value. The tool had reordered its measure columns — + `EE,AQHire,EES,AQHireS,J2J,J2JS` where it previously emitted + `EE,AQHire,J2J,EES,AQHireS,J2JS`. A pin that fires on cosmetic + reordering trains the maintainer to re-pin on sight, which is + exactly how a genuine revision would slip through; so byte drift + is now reported and tolerated, and content drift raises. +- **Transformation:** column subset and sort only, no + re-aggregation: the full 6 x 6 firm-size grid (codes 0-5 on both + origin and destination sides), 2015Q1-2025Q1 (ordinal quarters + 8060-8100), six flow measures (EE, AQHire, J2J = EE + AQHire, and + their stable variants) with status flags. +- **Detail-window caveat (important for E11):** the full 5 x 5 + origin x destination detail is released only for + **2015Q1-2016Q1**; from 2016Q2 on every national detail cell + carries status flag 11 ("aggregate of cells not released because + component cells do not meet publication standards") and loads as + NaN. The tool aggregates the state-level OD tabulations to the + national level, and a state coverage gap from 2016Q2 blocks the + aggregate; the same suppression governs the J2J Explorer, so no + keyless public source carries the later cross. The one-sided + margins (code 0 on either axis) remain published through 2025Q1. + E11's origin x destination shape reference is therefore the + 2015Q1-2016Q1 window; later quarters constrain the margins only. +- **Margin caveat (corrected 2026-07-23; the earlier version of this + bullet was directionally wrong).** The code-0 margins are the + tool's aggregates of the firm-size-coded tabulation (status flag + 10/12) and they do **not** sit systematically below the flat-file + `d_fs` margins. Checked against + `j2jod_us_d_fs_gn_ns_oslp_u` (R2026Q1) across all 41 quarters, on + the all-demographics / all-industry / all-firm-age national cell: + + | comparison | quarters tool > flat | deviation range | mean | + |---|---|---|---| + | all-size EE margin | 37 / 41 | −1.00% to +2.02% | +0.75% | + | per-size margins (orig and dest, sizes 1-5) | — | −3.20% to +3.67% | — | + + The single 2015Q1 figure previously quoted (3,985,308 here versus + 3,988,566 in the flat file, −0.08%) is real but unrepresentative, + and the explanation attached to it — the flat file's inclusion of + public-sector "N" flows — is not what drives the gap: a + size-N exclusion would bias the tool's margin *downward* in every + quarter, and it is above in 37 of 41. The deviations run both ways + and are dominated by independent noise infusion applied to the two + tabulations. + + **This matters at floor scale.** E11's post-2016Q1 constraints are + margins-only, so a ±2-3% cross-source wobble on the quantity being + gated is itself an empirical noise datum for the E11 floor build, + not a footnote. Reproduce with + `scripts/check_j2jod_margin_agreement.py`. +- Detail cells that fail publication standards (status flag 11) + load as NaN — common in the small-x-large corners. +- **Unit caveat:** job counts, as for QWI/J2J; firm size is + administrative national March employment on both sides. diff --git a/data/external/j2j_us_sexage_2015on.csv b/data/external/j2j_us_sexage_2015on.csv new file mode 100644 index 00000000..2d7e685f --- /dev/null +++ b/data/external/j2j_us_sexage_2015on.csv @@ -0,0 +1,1108 @@ +year,quarter,sex,sex_label,agegrp,agegrp_label,MainB,MainE,MHire,MSep,EEHire,EESep,AQHire,AQSep,J2JHire,J2JSep,NEHire,ENSep,sMainB,sMainE,sMHire,sMSep,sEEHire,sEESep,sAQHire,sAQSep,sJ2JHire,sJ2JSep,sNEHire,sENSep +2015,1,0,All Sexes,A00,All Ages (14-99),124416927,124811536,12057838,11382638,3988566,3988775,1940867,2000330,5929433,5984392,7354230,6967042,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,0,All Sexes,A01,14-18,2418446,2708674,803857,498244,125835,125836,69571,111019,195405,237630,652005,362195,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,0,All Sexes,A02,19-21,5428713,5547322,1361219,1199800,415690,415720,202154,283825,617844,699582,862805,744992,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,0,All Sexes,A03,22-24,7459783,7555110,1413374,1269417,509608,509636,236218,262074,745827,771388,807513,712703,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,0,All Sexes,A04,25-34,27382001,27472706,3187552,3015405,1217370,1217439,539381,554603,1756752,1770826,1774127,1685338,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,0,All Sexes,A05,35-44,26554573,26649869,2146050,2004296,775670,775696,365989,342868,1141658,1117698,1242179,1147893,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,0,All Sexes,A06,45-54,27520148,27566951,1721033,1641703,580367,580417,304012,264308,884379,842793,1036693,991121,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,0,All Sexes,A07,55-64,20859090,20689387,1015156,1174179,287519,287540,173110,140944,460629,427478,667345,838271,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,0,All Sexes,A08,65-99,6794173,6621516,409597,579593,76506,76492,50433,40690,126939,116997,311563,484529,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,1,Male,A00,All Ages (14-99),62895777,63149879,6336804,5965112,2133477,2133602,1077565,1091846,3211043,3222119,3881726,3628906,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,1,Male,A01,14-18,1095711,1244379,386187,231602,54872,54875,32904,51267,87776,106483,321270,172767,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,1,Male,A02,19-21,2621485,2697078,690300,597728,206030,206052,106825,145142,312855,351344,450568,375293,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,1,Male,A03,22-24,3669530,3729404,723240,644772,256526,256545,127258,140023,383783,396461,426986,367241,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,1,Male,A04,25-34,13984934,14053390,1705473,1600796,662469,662525,303473,309222,965943,970919,951765,883726,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,1,Male,A05,35-44,13661887,13707903,1148546,1082304,432326,432327,208360,193305,640686,624870,656350,610265,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,1,Male,A06,45-54,13945346,13967550,914839,879347,318431,318454,171490,148826,489920,465930,549260,527167,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,1,Male,A07,55-64,10403974,10321350,545840,623532,160301,160308,98604,81033,258905,240702,357024,439787,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,1,Male,A08,65-99,3512909,3428824,222379,305030,42523,42516,28651,23027,71174,65410,168503,252660,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,2,Female,A00,All Ages (14-99),61521150,61661657,5721034,5417527,1855089,1855174,863302,908485,2718391,2762273,3472504,3338136,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,2,Female,A01,14-18,1322735,1464295,417670,266642,70963,70961,36666,59752,107629,131146,330736,189428,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,2,Female,A02,19-21,2807228,2850244,670919,602072,209661,209668,95329,138683,304989,348239,412237,369700,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,2,Female,A03,22-24,3790253,3825706,690135,624646,253083,253090,108960,122051,362043,374928,380526,345462,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,2,Female,A04,25-34,13397067,13419316,1482079,1414609,554901,554914,235908,245381,790809,799907,822362,801612,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,2,Female,A05,35-44,12892686,12941966,997504,921992,343344,343368,157629,149563,500972,492828,585828,537628,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,2,Female,A06,45-54,13574801,13599402,806194,762356,261936,261964,132523,115482,394459,376863,487433,463954,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,2,Female,A07,55-64,10455116,10368037,469316,550646,127218,127232,74505,59911,201723,186776,310322,398483,1,1,1,1,1,1,1,1,1,1,1,1 +2015,1,2,Female,A08,65-99,3281264,3192691,187218,274563,33983,33976,21782,17663,55765,51587,143060,231869,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,0,All Sexes,A00,All Ages (14-99),124730876,126976005,15767486,13080629,4862972,4863034,2001044,2163685,6864571,7016092,10004720,7750413,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,0,All Sexes,A01,14-18,2374533,3404242,1668647,601759,194253,194162,91133,106271,285389,301189,1419276,397319,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,0,All Sexes,A02,19-21,5372113,6303797,2355851,1308078,566195,566231,281201,242567,847409,808126,1631816,704020,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,0,All Sexes,A03,22-24,7398107,7699771,1846428,1473053,643992,644022,265598,293754,909681,936232,1081510,779238,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,0,All Sexes,A04,25-34,27482646,27759609,3799584,3415632,1453506,1453548,563815,622933,2017532,2073378,2122062,1840671,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,0,All Sexes,A05,35-44,26633463,26735883,2439555,2281371,902053,902129,345891,392764,1248079,1293281,1398889,1291659,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,0,All Sexes,A06,45-54,27548190,27589243,1947278,1868107,671143,671220,266312,296310,937549,964838,1165011,1118863,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,0,All Sexes,A07,55-64,21025501,20788911,1170934,1395160,336299,336242,144985,161530,481295,496464,768982,1001226,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,0,All Sexes,A08,65-99,6896322,6694548,539208,737471,95531,95478,42109,47556,137637,142584,417175,617417,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,1,Male,A00,All Ages (14-99),63085477,64682213,8507229,6699767,2628731,2629216,1092402,1103764,3721683,3726499,5461758,3859451,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,1,Male,A01,14-18,1084140,1615652,836840,289699,92317,92319,41596,48909,133919,141635,720694,193259,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,1,Male,A02,19-21,2605540,3113866,1209259,651677,282266,282402,143008,121282,425305,403484,860179,354069,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,1,Male,A03,22-24,3645762,3850101,973619,735607,328569,328648,141529,144321,470166,472274,590815,386376,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,1,Male,A04,25-34,14042941,14284940,2085654,1790551,801602,801715,314015,323793,1115805,1123616,1176896,932237,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,1,Male,A05,35-44,13699275,13820414,1348001,1199226,509057,509156,195127,203244,704315,711145,772829,648760,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,1,Male,A06,45-54,13956060,14045784,1074567,965301,371932,372027,149819,152457,521845,522729,651044,558170,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,1,Male,A07,55-64,10485250,10439699,662749,699583,189552,189538,83430,84643,273011,273358,441072,484131,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,1,Male,A08,65-99,3566509,3511757,316540,368123,53437,53412,23879,25115,77317,78257,248230,302448,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,2,Female,A00,All Ages (14-99),61645399,62293792,7260257,6380862,2234242,2233818,908642,1059922,3142888,3289594,4542963,3890962,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,2,Female,A01,14-18,1290393,1788591,831807,312060,101937,101843,49537,57362,151471,159554,698582,204060,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,2,Female,A02,19-21,2766573,3189931,1146592,656401,283929,283830,138193,121286,422104,404642,771637,349951,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,2,Female,A03,22-24,3752345,3849669,872809,737445,315424,315375,124069,149433,439515,463958,490695,392862,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,2,Female,A04,25-34,13439705,13474669,1713931,1625080,651904,651833,249800,299140,901727,949763,945166,908433,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,2,Female,A05,35-44,12934188,12915469,1091554,1082145,392996,392973,150764,189520,543764,582136,626060,642899,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,2,Female,A06,45-54,13592131,13543460,872710,902806,299211,299193,116493,143853,415704,442109,513967,560693,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,2,Female,A07,55-64,10540251,10349212,508185,695578,146747,146705,61555,76887,208284,223106,327910,517095,1,1,1,1,1,1,1,1,1,1,1,1 +2015,2,2,Female,A08,65-99,3329813,3182791,222668,369348,42094,42066,18230,22441,60319,64327,168946,314969,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,0,All Sexes,A00,All Ages (14-99),126965293,126802087,14821557,14692435,5298212,5297818,2163668,2100936,7462027,7391894,8671908,8836314,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,0,All Sexes,A01,14-18,2964731,3032623,1241635,1160982,216049,215918,87987,149730,303949,366392,992944,920348,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,0,All Sexes,A02,19-21,6169201,5707866,1623248,2085974,584121,583550,234959,306108,819011,889346,950684,1405530,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,0,All Sexes,A03,22-24,7576387,7688363,1836985,1677079,690938,691155,296161,275392,986988,965677,1033388,920742,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,0,All Sexes,A04,25-34,27757899,28002628,4014857,3658074,1631598,1631834,633199,571729,2264965,2200969,2137775,1896632,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,0,All Sexes,A05,35-44,26728689,26909231,2570067,2324392,1000788,1000762,396356,346775,1397302,1346475,1411405,1235061,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,0,All Sexes,A06,45-54,27571674,27639383,1946615,1838234,719496,719501,299115,262228,1018714,979925,1106103,1042323,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,0,All Sexes,A07,55-64,21188511,21000119,1125732,1300835,356857,356772,166484,144593,523351,500463,700008,890084,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,0,All Sexes,A08,65-99,7008201,6821874,462418,646865,98366,98327,49407,44382,147747,142646,339600,525596,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,1,Male,A00,All Ages (14-99),64666860,64436494,7496354,7609439,2743975,2743176,1104075,1084923,3848048,3824149,4377195,4607612,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,1,Male,A01,14-18,1405029,1409822,582594,573291,97195,97162,39835,68909,136991,166464,472543,465210,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,1,Male,A02,19-21,3037057,2781531,801510,1058522,285393,285182,118181,151840,403522,437065,480897,732566,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,1,Male,A03,22-24,3785647,3811318,892905,851831,336939,336882,144693,140233,481544,476885,510918,484761,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,1,Male,A04,25-34,14271940,14370347,2057918,1912578,856870,856712,328839,303190,1185739,1158529,1090620,994134,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,1,Male,A05,35-44,13819710,13878296,1319641,1233285,537810,537640,205401,183386,743284,720148,709810,653446,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,1,Male,A06,45-54,14039660,14057911,1000641,965725,382631,382600,153860,137241,536556,518606,563893,547565,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,1,Male,A07,55-64,10637473,10549130,591653,673731,193310,193197,87152,76260,280481,268845,365958,455313,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,1,Male,A08,65-99,3670343,3578139,249492,340476,53826,53801,26112,23864,79930,77609,182555,274616,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,2,Female,A00,All Ages (14-99),62298433,62365593,7325202,7082996,2554237,2554642,1059593,1016013,3613979,3567744,4294713,4228702,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,2,Female,A01,14-18,1559702,1622801,659041,587691,118854,118756,48152,80821,166958,199928,520402,455137,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,2,Female,A02,19-21,3132144,2926335,821738,1027452,298727,298367,116777,154268,415489,452281,469787,672964,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,2,Female,A03,22-24,3790740,3877046,944080,825248,353999,354273,151468,135159,505444,488792,522470,435981,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,2,Female,A04,25-34,13485958,13632281,1956938,1745496,774727,775122,304359,268539,1079225,1042440,1047156,902498,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,2,Female,A05,35-44,12908979,13030935,1250426,1091106,462978,463121,190955,163389,654018,626328,701595,581614,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,2,Female,A06,45-54,13532014,13581472,945975,872509,336865,336901,145255,124987,482158,461319,542210,494758,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,2,Female,A07,55-64,10551038,10450989,534080,627104,163547,163575,79332,68333,242870,231619,334050,434770,1,1,1,1,1,1,1,1,1,1,1,1 +2015,3,2,Female,A08,65-99,3337858,3243734,212926,306389,44539,44526,23294,20518,67816,65037,157045,250980,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,0,All Sexes,A00,All Ages (14-99),126842623,126585492,13474583,13490444,4669965,4664732,2101054,2074282,6770246,6733424,8079115,8331916,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,0,All Sexes,A01,14-18,2692863,3007531,1021203,689626,179841,179658,126311,99200,306101,279516,810606,495403,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,0,All Sexes,A02,19-21,5530294,5675475,1499920,1313553,483883,483286,305374,223638,789207,706986,933104,786334,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,0,All Sexes,A03,22-24,7546860,7626490,1549410,1423189,589826,589236,278277,250128,868015,839016,866414,784622,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,0,All Sexes,A04,25-34,27998092,28013794,3590297,3495983,1436190,1434854,581399,571967,2017441,2005187,1955057,1937912,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,0,All Sexes,A05,35-44,26897701,26845492,2354981,2369132,895208,893958,350164,382133,1245247,1275242,1330527,1383840,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,0,All Sexes,A06,45-54,27656092,27482790,1827550,1982484,657814,656904,264933,312384,922581,967401,1066898,1242901,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,0,All Sexes,A07,55-64,21392420,21062173,1119224,1448132,332941,332629,148628,181623,481454,513034,723569,1054207,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,0,All Sexes,A08,65-99,7128303,6871746,512000,768345,94262,94207,45967,53208,140200,147042,392940,646698,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,1,Male,A00,All Ages (14-99),64430764,63830916,6709443,7237942,2430077,2427537,1085508,1145615,3515222,3569240,3971132,4568712,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,1,Male,A01,14-18,1247307,1375894,471054,336322,79448,79399,57872,46935,137307,126637,380053,250660,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,1,Male,A02,19-21,2690305,2734816,729742,670112,235447,235242,150599,117098,386012,352381,462321,415908,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,1,Male,A03,22-24,3733882,3740821,760115,736439,290866,290558,141611,133673,432451,424161,432131,423513,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,1,Male,A04,25-34,14352531,14274113,1834860,1885392,761523,760875,308202,320585,1069639,1080416,985874,1063584,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,1,Male,A05,35-44,13871774,13747448,1186781,1301856,482640,481965,185397,216392,667993,697584,648011,773650,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,1,Male,A06,45-54,14063891,13889370,911235,1084745,348510,348065,138750,176671,487163,523405,519124,696064,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,1,Male,A07,55-64,10739152,10510351,560335,793028,180187,180010,78339,104060,258476,283263,352256,582207,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,1,Male,A08,65-99,3731923,3558102,255322,430048,51455,51423,24740,30201,76181,81395,191362,363125,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,2,Female,A00,All Ages (14-99),62411859,62754576,6765140,6252502,2239889,2237195,1015546,928667,3255024,3164183,4107983,3763204,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,2,Female,A01,14-18,1445556,1631637,550148,353303,100393,100259,68439,52265,168794,152879,430554,244742,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,2,Female,A02,19-21,2839989,2940660,770178,643442,248436,248044,154775,106540,403196,354605,470783,370426,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,2,Female,A03,22-24,3812977,3885668,789294,686750,298960,298678,136666,116455,435564,414856,434283,361109,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,2,Female,A04,25-34,13645561,13739681,1755437,1610591,674667,673979,273197,251383,947801,924772,969183,874328,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,2,Female,A05,35-44,13025927,13098044,1168200,1067276,412567,411993,164768,165741,577254,577658,682515,610190,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,2,Female,A06,45-54,13592201,13593420,916315,897738,309304,308839,126184,135712,435418,443996,547774,546838,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,2,Female,A07,55-64,10653268,10551822,558889,655105,152754,152619,70289,77563,222977,229771,371314,472000,1,1,1,1,1,1,1,1,1,1,1,1 +2015,4,2,Female,A08,65-99,3396380,3313644,256678,338297,42807,42785,21227,23007,64020,65647,201578,283573,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,0,All Sexes,A00,All Ages (14-99),126628788,127107812,12421916,11654192,4089042,4081146,2077257,2046046,6163830,6113632,7607280,7131553,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,0,All Sexes,A01,14-18,2675499,2986371,883375,555169,143315,142795,84502,124688,227705,267302,710127,399810,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,0,All Sexes,A02,19-21,5514085,5643301,1377444,1203083,420341,419259,219865,285418,639694,703011,874696,744146,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,0,All Sexes,A03,22-24,7487101,7598793,1422820,1261946,511333,510284,250574,257970,761358,766295,818236,706119,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,0,All Sexes,A04,25-34,28019856,28117657,3286384,3103653,1252709,1250880,580485,567108,1832286,1814047,1836850,1738905,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,0,All Sexes,A05,35-44,26845576,26936310,2194404,2055632,791358,789861,384921,351385,1175933,1139484,1273544,1182943,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,0,All Sexes,A06,45-54,27489653,27542223,1740900,1656314,586213,585218,314893,265677,900983,848327,1049846,998937,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,0,All Sexes,A07,55-64,21422643,21267320,1065258,1210038,300140,299495,186733,148633,486943,446884,701059,858095,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,0,All Sexes,A08,65-99,7174375,7015838,451332,608358,83632,83353,55284,45168,138927,128282,342922,502598,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,1,Male,A00,All Ages (14-99),63833184,64135231,6488409,6068244,2149598,2145189,1148233,1100189,3296306,3237548,4015255,3719963,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,1,Male,A01,14-18,1217982,1375182,423145,259526,62555,62348,39394,58049,101912,120365,348981,192065,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,1,Male,A02,19-21,2651715,2732760,691786,592603,204559,204176,115101,143408,319374,346957,453820,372165,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,1,Male,A03,22-24,3666186,3735964,724412,635493,254100,253598,133608,135805,387374,388589,431889,362234,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,1,Male,A04,25-34,14262404,14340252,1750374,1635081,671408,670303,325208,312355,995982,980296,988130,911501,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,1,Male,A05,35-44,13748750,13794156,1166543,1101318,431666,430584,218206,194978,649656,624215,675415,631490,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,1,Male,A06,45-54,13891118,13919046,920181,880190,315344,314746,178155,146268,493404,459332,557981,532059,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,1,Male,A07,55-64,10686032,10608557,570128,643377,164189,163832,107104,84226,271355,247276,375861,454976,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,1,Male,A08,65-99,3708996,3629315,241841,320657,45779,45602,31455,25101,77248,70516,183179,263473,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,2,Female,A00,All Ages (14-99),62795604,62972581,5933507,5585948,1939445,1935957,929024,945856,2867524,2876084,3592025,3411590,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,2,Female,A01,14-18,1457517,1611189,460230,295642,80760,80447,45107,66639,125793,146938,361145,207745,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,2,Female,A02,19-21,2862370,2910540,685658,610480,215782,215083,104764,142009,320320,356054,420876,371981,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,2,Female,A03,22-24,3820915,3862829,698408,626453,257233,256686,116966,122164,373983,377706,386347,343886,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,2,Female,A04,25-34,13757452,13777406,1536010,1468573,581302,580578,255276,254753,836304,833750,848720,827403,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,2,Female,A05,35-44,13096826,13142154,1027861,954314,359693,359277,166714,156407,526277,515270,598130,551453,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,2,Female,A06,45-54,13598535,13623177,820719,776124,270869,270472,136738,119409,407579,388994,491866,466877,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,2,Female,A07,55-64,10736611,10658763,495130,566661,135952,135663,79629,64407,215589,199607,325197,403119,1,1,1,1,1,1,1,1,1,1,1,1 +2016,1,2,Female,A08,65-99,3465378,3386524,209491,287701,37854,37752,23829,20068,61679,57765,159743,239125,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,0,All Sexes,A00,All Ages (14-99),127090290,129101817,15772982,13239911,4899050,4894272,2045565,2255990,6947664,7151586,9963490,7885277,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,0,All Sexes,A01,14-18,2630188,3676212,1726624,660446,213433,213288,103308,121729,316666,335215,1445506,436861,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,0,All Sexes,A02,19-21,5496226,6397084,2335717,1323953,569617,569163,284262,254561,853826,823671,1602487,720028,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,0,All Sexes,A03,22-24,7448530,7700951,1796129,1471255,636631,636237,261129,301554,898255,937693,1044007,788400,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,0,All Sexes,A04,25-34,28125384,28308715,3788765,3476317,1464539,1463086,576020,649376,2041820,2113152,2107646,1896877,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,0,All Sexes,A05,35-44,26960844,27020934,2435908,2296143,901103,900170,354185,403496,1255977,1304070,1396706,1309517,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,0,All Sexes,A06,45-54,27513292,27514911,1917127,1851243,665668,664974,267639,302432,933816,967577,1141527,1110311,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,0,All Sexes,A07,55-64,21594131,21355347,1199255,1403856,346107,345622,152346,170127,498674,515764,784511,997316,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,0,All Sexes,A08,65-99,7321696,7127664,573457,756699,101952,101733,46675,52716,148630,154443,441100,625967,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,1,Male,A00,All Ages (14-99),64138871,65541799,8412994,6760029,2602433,2601818,1100033,1142755,3704034,3744904,5395627,3955840,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,1,Male,A01,14-18,1204362,1743416,863881,317911,100575,100646,47555,56006,148095,156785,733437,213442,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,1,Male,A02,19-21,2657065,3145512,1186211,654332,279785,279922,142053,125948,421818,405822,838345,360773,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,1,Male,A03,22-24,3657767,3834707,938526,728654,319219,319402,137065,146444,456486,465730,568272,390724,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,1,Male,A04,25-34,14334613,14514653,2058446,1814238,795527,795298,316980,335778,1113142,1131323,1161410,966283,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,1,Male,A05,35-44,13815688,13900364,1328709,1202952,498339,498037,196682,207315,695423,705490,766260,665415,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,1,Male,A06,45-54,13910966,13961004,1038903,954839,361331,361109,147386,154445,508959,515568,627579,560187,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,1,Male,A07,55-64,10774512,10712954,668569,709164,191406,191257,86327,89022,277869,280259,443875,491353,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,1,Male,A08,65-99,3783900,3729187,329749,377938,56252,56147,25984,27798,82242,83927,256449,307663,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,2,Female,A00,All Ages (14-99),62951419,63560019,7359988,6479883,2296617,2292454,945532,1113236,3243630,3406682,4567863,3929437,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,2,Female,A01,14-18,1425826,1932795,862744,342535,112858,112643,55753,65723,168571,178430,712069,223419,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,2,Female,A02,19-21,2839161,3251572,1149505,669621,289832,289241,142209,128613,432008,417849,764142,359255,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,2,Female,A03,22-24,3790763,3866243,857603,742602,317412,316835,124064,155110,441769,471963,475736,397676,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,2,Female,A04,25-34,13790771,13794062,1730320,1662079,669012,667788,259039,313599,928678,981829,946236,930594,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,2,Female,A05,35-44,13145156,13120570,1107199,1093191,402765,402133,157503,196182,560554,598580,630446,644101,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,2,Female,A06,45-54,13602325,13553907,878223,896403,304337,303865,120254,147988,424857,452009,513948,550124,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,2,Female,A07,55-64,10819619,10642393,530686,694692,154701,154365,66019,81105,220805,235505,340636,505963,1,1,1,1,1,1,1,1,1,1,1,1 +2016,2,2,Female,A08,65-99,3537796,3398477,243708,378761,45700,45586,20691,24917,66389,70516,184651,318305,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,0,All Sexes,A00,All Ages (14-99),129142698,128988856,15256111,15181976,5515833,5513336,2254645,2125889,7771997,7652003,8933989,9098700,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,0,All Sexes,A01,14-18,3211258,3239573,1302624,1257877,241425,241343,101663,161677,343197,403037,1028730,985685,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,0,All Sexes,A02,19-21,6267244,5791537,1660040,2136514,611980,610989,247860,303311,860247,915236,966425,1422575,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,0,All Sexes,A03,22-24,7573014,7696830,1851133,1684632,705110,705969,303071,268045,1008230,975663,1043203,915834,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,0,All Sexes,A04,25-34,28285738,28554374,4133031,3771708,1691147,1690847,659679,577976,2351370,2273377,2213155,1954853,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,0,All Sexes,A05,35-44,27066868,27259310,2646973,2404983,1037834,1037143,407648,351533,1445761,1391420,1458621,1280272,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,0,All Sexes,A06,45-54,27524789,27603560,1975899,1871486,737690,737123,304897,264199,1042746,1003194,1122951,1058754,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,0,All Sexes,A07,55-64,21753689,21572858,1179958,1358137,380442,379886,175166,150543,555584,531252,730423,920767,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,0,All Sexes,A08,65-99,7460099,7270814,506452,696639,110204,110036,54662,48604,164862,158824,370481,559958,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,1,Male,A00,All Ages (14-99),65568799,65346916,7682395,7818571,2821338,2819359,1142909,1099274,3964882,3924629,4511734,4736016,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,1,Male,A01,14-18,1521262,1506960,610497,617566,108148,108125,45993,74337,154192,182417,489275,495526,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,1,Male,A02,19-21,3072290,2810984,814365,1074751,295133,294782,123579,150647,418873,445840,486845,736974,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,1,Male,A03,22-24,3769302,3802156,896713,849924,340419,340632,146275,136723,486666,478016,515665,480279,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,1,Male,A04,25-34,14491723,14606124,2111985,1959971,879719,879196,341002,306766,1220896,1188118,1131382,1021117,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,1,Male,A05,35-44,13931497,13998484,1352610,1267110,549151,548646,209793,186327,759103,736346,736584,676652,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,1,Male,A06,45-54,13972131,13995959,1007812,975838,385105,384759,155711,138407,540907,524054,572500,556356,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,1,Male,A07,55-64,10912704,10825608,618431,705482,203752,203397,91730,80045,295499,283878,382870,475059,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,1,Male,A08,65-99,3897890,3800641,269983,367930,59913,59823,28825,26023,88746,85960,196611,294054,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,2,Female,A00,All Ages (14-99),63573900,63641941,7573716,7363405,2694494,2693977,1111736,1026615,3807116,3727374,4422255,4362684,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,2,Female,A01,14-18,1689996,1732613,692127,640312,133277,133218,55669,87340,189005,220620,539455,490159,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,2,Female,A02,19-21,3194954,2980553,845675,1061763,316847,316207,124281,152664,441374,469396,479580,685602,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,2,Female,A03,22-24,3803712,3894674,954420,834708,364691,365338,156796,131322,521564,497647,527537,435556,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,2,Female,A04,25-34,13794016,13948250,2021046,1811737,811428,811652,318677,271210,1130474,1085259,1081773,933736,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,2,Female,A05,35-44,13135372,13260826,1294363,1137873,488683,488497,197855,165206,686658,655075,722037,603620,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,2,Female,A06,45-54,13552658,13607601,968087,895648,352586,352364,149186,125792,501839,479140,550451,502398,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,2,Female,A07,55-64,10840984,10747250,561528,652655,176690,176489,83436,70498,260085,247374,347553,445709,1,1,1,1,1,1,1,1,1,1,1,1 +2016,3,2,Female,A08,65-99,3562209,3470174,236470,328709,50291,50214,25836,22581,76116,72864,173870,265904,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,0,All Sexes,A00,All Ages (14-99),129029215,128534127,13078956,13372268,4498313,4497221,2126750,2152293,6626295,6647705,7867153,8355059,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,0,All Sexes,A01,14-18,2878532,3175252,1031601,715446,186374,186236,138237,107416,324482,293333,811830,512590,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,0,All Sexes,A02,19-21,5607872,5712687,1435693,1290389,467132,466402,303512,230146,770538,696097,888509,778453,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,0,All Sexes,A03,22-24,7550149,7593220,1460731,1373717,555197,555094,270970,253564,826205,808314,817737,769274,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,0,All Sexes,A04,25-34,28526470,28485901,3488950,3459497,1385055,1384758,587594,591938,1973096,1976221,1909951,1948146,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,0,All Sexes,A05,35-44,27296190,27218712,2293396,2343747,858786,858520,355491,395663,1214804,1254026,1307099,1389058,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,0,All Sexes,A06,45-54,27618313,27430999,1751596,1930621,621539,621783,265961,320808,887810,942525,1029748,1222429,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,0,All Sexes,A07,55-64,21956302,21612829,1102459,1452584,327053,327229,154775,194227,481935,521472,711859,1058181,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,0,All Sexes,A08,65-99,7595388,7304526,514531,806268,97177,97199,50210,58531,147424,155718,390420,676928,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,1,Male,A00,All Ages (14-99),65346196,64705107,6558663,7133130,2335614,2335081,1100804,1177519,3436436,3511874,3920024,4547955,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,1,Male,A01,14-18,1334161,1457586,479768,348551,82601,82565,63174,50976,145713,133408,384233,258745,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,1,Male,A02,19-21,2718403,2751147,702904,654151,227580,227363,150144,119637,377626,346785,444216,407656,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,1,Male,A03,22-24,3723329,3719054,720852,708056,274679,274614,138137,134737,412761,409194,411293,411514,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,1,Male,A04,25-34,14574499,14484080,1793855,1856593,733417,733250,311864,329351,1045277,1062412,975694,1062268,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,1,Male,A05,35-44,14018599,13898031,1163302,1277147,459878,459696,188788,221247,648806,680890,648202,770173,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,1,Male,A06,45-54,14001266,13833956,880182,1049185,328221,328297,139499,178785,467799,507073,509520,678841,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,1,Male,A07,55-64,11012221,10785462,558762,791909,176367,176432,82341,109740,258715,286208,354264,581787,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,1,Male,A08,65-99,3963716,3775792,259038,447539,52870,52864,26856,33046,79739,85903,192602,376971,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,2,Female,A00,All Ages (14-99),63683019,63829020,6520293,6239138,2162699,2162140,1025945,974774,3189859,3135831,3947129,3807103,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,2,Female,A01,14-18,1544371,1717666,551833,366896,103772,103671,75063,56441,178769,159925,427598,253845,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,2,Female,A02,19-21,2889468,2961540,732789,636238,239551,239039,153367,110509,392911,349311,444293,370797,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,2,Female,A03,22-24,3826820,3874166,739879,665661,280518,280480,132833,118827,413445,399120,406445,357759,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,2,Female,A04,25-34,13951971,14001821,1695094,1602904,651639,651508,275730,262587,927820,913809,934257,885879,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,2,Female,A05,35-44,13277590,13320682,1130095,1066599,398908,398824,166702,174415,565998,573137,658897,618885,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,2,Female,A06,45-54,13617047,13597044,871414,881436,293318,293486,126461,142024,420011,435452,520228,543588,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,2,Female,A07,55-64,10944081,10827367,543697,660675,150685,150797,72434,84487,223220,235264,357595,476394,1,1,1,1,1,1,1,1,1,1,1,1 +2016,4,2,Female,A08,65-99,3631672,3528734,255493,358729,44307,44335,23354,25485,67685,69814,197817,299956,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,0,All Sexes,A00,All Ages (14-99),128509336,129031114,12966158,12109179,4372695,4368491,2148599,2122688,6528089,6488859,7844845,7311848,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,0,All Sexes,A01,14-18,2818348,3128066,933343,602231,160019,159314,91764,136383,252111,296094,738332,429134,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,0,All Sexes,A02,19-21,5560592,5702728,1432056,1238135,449313,447862,225852,293420,675862,741369,896797,752290,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,0,All Sexes,A03,22-24,7434680,7550256,1446414,1277740,532126,531553,252835,260019,785657,791268,821217,703589,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,0,All Sexes,A04,25-34,28446794,28556319,3439813,3234638,1342525,1342603,598727,590715,1942986,1932308,1896860,1782398,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,0,All Sexes,A05,35-44,27253732,27361735,2304177,2140677,846026,845959,397968,363447,1245195,1208685,1324909,1214652,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,0,All Sexes,A06,45-54,27421293,27489074,1800603,1693412,621113,620682,321827,271846,944098,892064,1072455,1003990,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,0,All Sexes,A07,55-64,21951909,21803764,1129320,1262284,327501,326680,198884,156344,527146,482763,734941,883430,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,0,All Sexes,A08,65-99,7621986,7439173,480431,660062,94073,93838,60742,50514,155034,144308,359334,542364,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,1,Male,A00,All Ages (14-99),64691981,65039706,6777400,6288570,2304454,2303302,1176862,1137083,3484594,3439535,4141972,3788427,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,1,Male,A01,14-18,1287266,1444619,448157,282541,70556,70298,42939,63537,113636,134035,363456,206488,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,1,Male,A02,19-21,2673771,2761884,717841,608722,219679,219201,117504,147561,337500,366854,463563,374099,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,1,Male,A03,22-24,3634848,3710106,737769,641312,265569,265448,134053,136388,399923,401701,434076,357820,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,1,Male,A04,25-34,14452506,14543665,1832671,1698994,721736,722239,333137,323301,1055683,1045099,1020190,926261,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,1,Male,A05,35-44,13921844,13980869,1226513,1143555,462781,462891,222866,200579,686213,663173,703008,642704,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,1,Male,A06,45-54,13831278,13870159,951172,896113,333595,333342,179416,149603,513613,482769,569828,530889,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,1,Male,A07,55-64,10955312,10883913,605001,670216,179544,179054,112582,87832,292542,266805,394518,466171,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,1,Male,A08,65-99,3935156,3844490,258276,347117,50994,50830,34364,28282,85484,79098,193332,283995,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,2,Female,A00,All Ages (14-99),63817354,63991408,6188758,5820609,2068241,2065189,971738,985605,3043495,3049324,3702873,3523421,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,2,Female,A01,14-18,1531083,1683447,485186,319689,89463,89016,48825,72846,138475,162059,374876,222646,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,2,Female,A02,19-21,2886821,2940844,714215,629413,229634,228661,108349,145858,338363,374516,433233,378191,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,2,Female,A03,22-24,3799832,3840149,708645,636428,266556,266105,118782,123631,385734,389567,387141,345770,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,2,Female,A04,25-34,13994288,14012654,1607142,1535644,620789,620365,265590,267414,887304,887209,876670,856137,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,2,Female,A05,35-44,13331888,13380867,1077664,997122,383246,383068,175102,162868,558982,545512,621901,571947,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,2,Female,A06,45-54,13590015,13618914,849432,797299,287518,287340,142411,122243,430485,409295,502627,473101,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,2,Female,A07,55-64,10996597,10919851,524319,592069,147957,147625,86302,68512,234605,215957,340422,417260,1,1,1,1,1,1,1,1,1,1,1,1 +2017,1,2,Female,A08,65-99,3686829,3594683,222155,312945,43079,43008,26378,22233,69549,65210,166002,258369,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,0,All Sexes,A00,All Ages (14-99),128973187,131045122,16202163,13685082,5156879,5147135,2122577,2282159,7274495,7429656,10170956,8060905,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,0,All Sexes,A01,14-18,2748544,3858767,1839362,709973,237626,236439,114094,128290,351312,363966,1534563,462531,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,0,All Sexes,A02,19-21,5553795,6486006,2400814,1361474,600134,598486,293555,255010,892754,852997,1638547,726639,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,0,All Sexes,A03,22-24,7397099,7652834,1796275,1478120,651427,650226,263089,295175,913999,945102,1038216,780919,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,0,All Sexes,A04,25-34,28513833,28704836,3878586,3579234,1535912,1533735,598746,655844,2133533,2190165,2138303,1924636,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,0,All Sexes,A05,35-44,27422674,27473163,2498124,2383564,949581,948582,366961,410866,1315784,1360013,1417141,1344460,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,0,All Sexes,A06,45-54,27458803,27457846,1936842,1888995,693240,692233,273522,302693,966226,995384,1139220,1118330,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,0,All Sexes,A07,55-64,22129339,21880863,1245031,1466702,374608,373653,160360,177106,534459,551024,803284,1030776,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,0,All Sexes,A08,65-99,7749100,7530807,607128,817018,114351,113781,52250,57175,166427,171005,461683,672613,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,1,Male,A00,All Ages (14-99),65036807,66536318,8689542,6977161,2769362,2767155,1136823,1149970,3903482,3917964,5525154,4000566,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,1,Male,A01,14-18,1262164,1837894,924906,343486,113818,113482,52638,59345,166247,172500,781835,225713,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,1,Male,A02,19-21,2686641,3193000,1221563,673889,297340,297075,146777,125955,443596,422842,857230,362419,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,1,Male,A03,22-24,3629875,3812243,943759,733096,331260,331128,137617,142902,468542,473936,565651,383179,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,1,Male,A04,25-34,14513230,14710149,2120080,1869126,843948,843444,327245,337676,1170557,1181573,1181624,971241,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,1,Male,A05,35-44,14024675,14116387,1371557,1245414,530122,529961,202603,209454,732362,739873,780579,674481,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,1,Male,A06,45-54,13866077,13926486,1057948,970664,380036,379850,150534,153096,530293,533270,630632,556142,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,1,Male,A07,55-64,11051937,10996259,697686,735974,209482,209178,90156,91417,299378,300770,456083,499702,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,1,Male,A08,65-99,4002208,3943899,352044,405512,63356,63038,29254,30126,92506,93199,271521,327689,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,2,Female,A00,All Ages (14-99),63936380,64508804,7512620,6707921,2387517,2379980,985754,1132188,3371013,3511692,4645802,4060339,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,2,Female,A01,14-18,1486381,2020873,914456,366488,123808,122957,61456,68944,185065,191467,752728,236818,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,2,Female,A02,19-21,2867155,3293005,1179252,687585,302794,301411,146777,129055,449158,430155,781317,364220,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,2,Female,A03,22-24,3767224,3840591,852516,745024,320167,319099,125472,152273,445457,471166,472565,397740,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,2,Female,A04,25-34,14000603,13994687,1758506,1710108,691965,690292,271501,318168,962976,1008592,956679,953395,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,2,Female,A05,35-44,13397998,13356776,1126567,1138150,419459,418621,164358,201412,583422,620139,636562,669978,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,2,Female,A06,45-54,13592726,13531360,878894,918331,313204,312383,122989,149597,435934,462114,508588,562189,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,2,Female,A07,55-64,11077402,10884604,547346,730728,165126,164475,70204,85689,235081,250253,347201,531075,1,1,1,1,1,1,1,1,1,1,1,1 +2017,2,2,Female,A08,65-99,3746892,3586908,255084,411507,50994,50743,22996,27049,73921,77805,190162,344924,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,0,All Sexes,A00,All Ages (14-99),131024559,130681125,15097027,15191413,5494952,5491882,2276753,2190605,7775399,7690720,8784899,9122526,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,0,All Sexes,A01,14-18,3376624,3340754,1306585,1324805,250189,249147,107688,175881,357488,424850,1021548,1042062,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,0,All Sexes,A02,19-21,6358071,5818054,1621420,2165120,607276,605100,248804,313882,855933,919020,931699,1452038,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,0,All Sexes,A03,22-24,7543669,7631196,1780188,1649715,681850,682061,297093,270927,979191,953852,995999,905133,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,0,All Sexes,A04,25-34,28645281,28875569,4069433,3739676,1676917,1677505,663777,593892,2342532,2274488,2161217,1936410,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,0,All Sexes,A05,35-44,27556628,27739318,2638106,2400463,1035747,1035866,414566,361416,1451456,1399413,1449499,1276230,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,0,All Sexes,A06,45-54,27415333,27494998,1947434,1836959,732860,732704,303808,266175,1037421,1000386,1098800,1029746,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,0,All Sexes,A07,55-64,22246216,22084321,1201988,1357802,391735,391371,181653,156292,573673,548326,740175,909325,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,0,All Sexes,A08,65-99,7882737,7696916,531872,716873,118377,118127,59363,52138,177704,170386,385963,571582,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,1,Male,A00,All Ages (14-99),66525024,66202795,7615402,7846447,2839587,2838461,1147465,1134419,3988353,3977553,4420251,4742384,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,1,Male,A01,14-18,1607041,1558139,612856,653968,112681,112342,49200,81504,161681,193771,485891,526409,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,1,Male,A02,19-21,3119982,2826179,795128,1089773,294835,294077,123637,156224,418366,450369,467675,750486,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,1,Male,A03,22-24,3755439,3769473,862502,834508,332386,332410,142922,138470,475301,471269,489794,473475,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,1,Male,A04,25-34,14667924,14761126,2085946,1952841,882878,883249,341395,315376,1224956,1200303,1100485,1010524,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,1,Male,A05,35-44,14165361,14226774,1351456,1269638,553750,553822,211677,191901,765960,746925,729221,674047,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,1,Male,A06,45-54,13908804,13933385,995522,961465,387416,387238,153643,139583,541406,527712,557290,539592,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,1,Male,A07,55-64,11178013,11099482,628566,706571,211372,211232,93761,83576,305213,295248,385063,468481,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,1,Male,A08,65-99,4122461,4028237,283427,377682,64270,64091,31230,27785,95470,91957,204831,299370,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,2,Female,A00,All Ages (14-99),64499535,64478330,7481625,7344966,2655366,2653422,1129288,1056186,3787047,3713167,4364648,4380142,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,2,Female,A01,14-18,1769583,1782615,693730,670837,137509,136805,58487,94378,195807,231080,535656,515653,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,2,Female,A02,19-21,3238088,2991875,826293,1075346,312441,311023,125167,157658,437567,468651,464024,701552,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,2,Female,A03,22-24,3788231,3861722,917686,815208,349464,349651,154171,132458,503890,482583,506204,431658,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,2,Female,A04,25-34,13977358,14114443,1983487,1786835,794039,794256,322382,278516,1117576,1074185,1060732,925885,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,2,Female,A05,35-44,13391267,13512544,1286650,1130824,481997,482044,202890,169516,685497,652488,720278,602183,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,2,Female,A06,45-54,13506530,13561612,951913,875494,345444,345466,150165,126593,496015,472674,541510,490154,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,2,Female,A07,55-64,11068203,10984839,573422,651232,180364,180139,87892,72716,268460,253078,355112,440844,1,1,1,1,1,1,1,1,1,1,1,1 +2017,3,2,Female,A08,65-99,3760276,3668679,248445,339191,54108,54036,28134,24353,82235,78429,181132,272212,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,0,All Sexes,A00,All Ages (14-99),130683186,130385152,13562608,13642991,4752837,4754337,2187870,2143332,6945851,6902422,8080566,8393205,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,0,All Sexes,A01,14-18,2973671,3285549,1087452,756874,203302,203045,151009,115000,354284,318632,849922,536587,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,0,All Sexes,A02,19-21,5642702,5769090,1477695,1311622,490096,489796,314869,233507,805371,723671,906485,778054,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,0,All Sexes,A03,22-24,7484688,7557548,1478116,1361595,569611,570022,273386,247705,843538,818158,821640,746447,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,0,All Sexes,A04,25-34,28822074,28834390,3603487,3517579,1457916,1458972,602007,589899,2061611,2050284,1949071,1940124,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,0,All Sexes,A05,35-44,27802156,27756265,2390869,2405207,911284,911471,365020,392930,1277474,1305296,1346837,1401462,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,0,All Sexes,A06,45-54,27469335,27311986,1796447,1940693,653251,653701,267392,310735,921469,965110,1040869,1205716,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,0,All Sexes,A07,55-64,22447897,22112088,1164572,1503289,357993,357941,160381,192535,518824,550789,740089,1080293,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,0,All Sexes,A08,65-99,8040662,7758237,563971,846131,109385,109389,53805,61022,163279,170482,425654,704522,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,1,Male,A00,All Ages (14-99),66178561,65632027,6815674,7294224,2490275,2492892,1132904,1174319,3626492,3670537,4013794,4564996,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,1,Male,A01,14-18,1382039,1513391,508134,369729,90721,90663,69555,54584,160279,145486,404303,271457,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,1,Male,A02,19-21,2737134,2782592,726684,666216,241458,241642,155840,120800,397584,362610,453683,406090,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,1,Male,A03,22-24,3690188,3702004,731551,703833,283864,284251,139401,131853,423607,416343,413033,399419,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,1,Male,A04,25-34,14716459,14653041,1857489,1893096,779653,780853,319366,329062,1100109,1110867,991417,1055865,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,1,Male,A05,35-44,14259397,14154674,1214795,1311846,491812,492154,194043,220432,686599,713313,664997,774637,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,1,Male,A06,45-54,13917658,13768156,904346,1053803,348283,348758,140216,173317,489013,522685,512192,666176,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,1,Male,A07,55-64,11275485,11049034,590669,822133,194871,194967,85835,109848,280990,305150,366126,595201,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,1,Male,A08,65-99,4200202,4009134,282005,473568,59613,59605,28648,34421,88310,94084,208043,396151,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,2,Female,A00,All Ages (14-99),64504625,64753126,6746934,6348767,2262562,2261445,1054966,969013,3319359,3231884,4066771,3828209,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,2,Female,A01,14-18,1591632,1772157,579318,387146,112581,112383,81453,60415,194005,173146,445619,265130,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,2,Female,A02,19-21,2905569,2986499,751011,645406,248638,248154,159029,112707,407787,361061,452802,371965,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,2,Female,A03,22-24,3794500,3855543,746565,657762,285746,285771,133985,115852,419931,401815,408606,347028,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,2,Female,A04,25-34,14105615,14181349,1745997,1624483,678262,678119,282641,260837,961502,939416,957654,884258,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,2,Female,A05,35-44,13542759,13601591,1176074,1093361,419472,419316,170978,172498,590874,591984,681840,626825,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,2,Female,A06,45-54,13551677,13543830,892100,886889,304969,304943,127176,137417,432456,442425,528677,539540,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,2,Female,A07,55-64,11172412,11063054,573902,681157,163122,162974,74546,82687,237834,245639,373963,485092,1,1,1,1,1,1,1,1,1,1,1,1 +2017,4,2,Female,A08,65-99,3840461,3749103,281967,372563,49772,49784,25157,26601,74969,76398,217611,308370,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,0,All Sexes,A00,All Ages (14-99),130414891,130875442,13237333,12444828,4605203,4598155,2146571,2191558,6751863,6792579,7899096,7403981,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,0,All Sexes,A01,14-18,2925015,3244232,969418,629264,172015,171340,99646,143911,271838,315681,764637,444094,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,0,All Sexes,A02,19-21,5616780,5765941,1454880,1254370,466681,465055,230308,298291,697162,763598,905239,751162,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,0,All Sexes,A03,22-24,7416577,7527772,1441815,1278171,545775,544986,248585,259174,794354,804282,806970,691175,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,0,All Sexes,A04,25-34,28795879,28878742,3497303,3318677,1411852,1410522,598021,610175,2009673,2021383,1888683,1795199,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,0,All Sexes,A05,35-44,27827707,27918001,2368446,2221049,896623,895471,396728,380005,1293364,1275991,1338923,1241703,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,0,All Sexes,A06,45-54,27295024,27352178,1815443,1720481,647373,646622,312370,277641,959705,924742,1063510,1002775,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,0,All Sexes,A07,55-64,22448151,22286694,1171030,1318374,357504,356954,197499,166859,554984,524151,746963,906474,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,0,All Sexes,A08,65-99,8089759,7901883,518997,704441,107380,107205,63414,55503,170783,162752,384170,571400,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,1,Male,A00,All Ages (14-99),65643285,65968186,6916068,6459927,2440020,2437801,1176678,1169861,3616832,3609364,4155166,3819423,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,1,Male,A01,14-18,1340896,1498859,463198,297301,75772,75600,46508,67344,122357,143133,374717,216044,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,1,Male,A02,19-21,2704603,2793843,728069,619029,229902,229425,119188,149477,349200,379069,465306,373750,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,1,Male,A03,22-24,3627837,3700844,736617,643472,274399,274242,131958,136223,406382,410576,426282,351201,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,1,Male,A04,25-34,14620955,14703103,1865934,1743253,763808,763580,333429,332603,1097166,1096623,1013409,927331,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,1,Male,A05,35-44,14196748,14252195,1261303,1182395,492445,491814,222819,207949,715269,700054,708747,651530,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,1,Male,A06,45-54,13760682,13797265,957646,907060,348915,348670,174255,151965,523152,500910,562389,525668,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,1,Male,A07,55-64,11216020,11141279,625670,695867,196051,195833,112692,93721,308758,289756,399379,474321,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,1,Male,A08,65-99,4175544,4080797,277632,371550,58729,58637,35827,30579,94548,89243,204938,299578,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,2,Female,A00,All Ages (14-99),64771606,64907256,6321265,5984900,2165183,2160354,969894,1021697,3135032,3183216,3743930,3584558,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,2,Female,A01,14-18,1584119,1745373,506220,331963,96243,95740,53138,76567,149481,172548,389920,228051,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,2,Female,A02,19-21,2912176,2972098,726811,635341,236779,235630,111119,148814,347963,384530,439933,377411,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,2,Female,A03,22-24,3788740,3826928,705199,634699,271376,270744,116627,122950,387972,393706,380689,339973,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,2,Female,A04,25-34,14174924,14175639,1631369,1575424,648044,646942,264592,277572,912507,924759,875274,867868,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,2,Female,A05,35-44,13630958,13665805,1107143,1038655,404178,403657,173909,172057,578095,575937,630176,590173,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,2,Female,A06,45-54,13534341,13554913,857798,813421,298458,297952,138116,125676,436553,423832,501121,477108,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,2,Female,A07,55-64,11232131,11145415,545361,622507,161454,161122,84807,73138,246226,234396,347584,432153,1,1,1,1,1,1,1,1,1,1,1,1 +2018,1,2,Female,A08,65-99,3914216,3821086,241365,332891,48651,48568,27586,24924,76235,73509,179232,271821,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,0,All Sexes,A00,All Ages (14-99),130832813,133024141,16625974,13962561,5380675,5385299,2191270,2353416,7577395,7737484,10331828,8107411,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,0,All Sexes,A01,14-18,2862348,3988851,1893499,747997,253174,253377,121041,136515,374288,388936,1570286,482930,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,0,All Sexes,A02,19-21,5636710,6569772,2423968,1381385,614676,615495,298872,261393,913709,875879,1643416,730386,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,0,All Sexes,A03,22-24,7368643,7623275,1788801,1469680,658508,659817,261942,296411,921137,955701,1021856,765106,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,0,All Sexes,A04,25-34,28835359,29040550,3964965,3646955,1602681,1604420,618158,672070,2222697,2276979,2148353,1923656,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,0,All Sexes,A05,35-44,27990601,28066722,2602422,2455070,1003273,1003821,384007,426727,1388544,1430952,1458511,1361692,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,0,All Sexes,A06,45-54,27305150,27326554,1973662,1898681,719906,720342,278886,309483,999730,1030150,1144738,1102434,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,0,All Sexes,A07,55-64,22608299,22389678,1315509,1502487,401640,401396,171025,186874,573027,588329,841781,1038813,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,0,All Sexes,A08,65-99,8225703,8018738,663149,860306,126818,126632,57338,63944,184263,190558,502886,702394,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,1,Male,A00,All Ages (14-99),65970025,67491510,8871293,7124653,2883898,2889127,1169759,1185303,4056493,4073328,5574154,4031244,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,1,Male,A01,14-18,1315038,1890664,945152,363442,120579,120900,56141,63529,176779,184001,793719,237928,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,1,Male,A02,19-21,2728811,3232916,1230246,683915,304862,305763,148799,129024,453778,434300,856731,364248,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,1,Male,A03,22-24,3616430,3796583,937850,729161,335499,336540,137326,143904,473166,480134,555025,375054,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,1,Male,A04,25-34,14672262,14865910,2156699,1907166,879682,881615,336852,345910,1217577,1227619,1177613,972514,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,1,Male,A05,35-44,14302210,14399880,1417337,1282089,556540,557038,210128,217270,767327,774385,795819,684847,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,1,Male,A06,45-54,13782348,13849364,1070368,974171,392873,393485,152721,155429,546024,548939,628181,547629,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,1,Male,A07,55-64,11307470,11263541,732748,756709,223686,223705,96134,96711,319970,320371,474645,506138,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,1,Male,A08,65-99,4245457,4192652,380893,428001,70177,70080,31659,33526,101872,103579,292421,342887,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,2,Female,A00,All Ages (14-99),64862787,65532631,7754680,6837908,2496777,2496172,1021511,1168113,3520902,3664156,4757674,4076166,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,2,Female,A01,14-18,1547311,2098187,948347,384556,132595,132476,64901,72986,197509,204935,776567,245002,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,2,Female,A02,19-21,2907899,3336856,1193722,697469,309814,309732,150073,132369,459931,441579,786685,366138,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,2,Female,A03,22-24,3752213,3826692,850952,740520,323009,323276,124616,152507,447970,475567,466831,390052,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,2,Female,A04,25-34,14163096,14174640,1808266,1739789,722999,722805,281306,326160,1005120,1049360,970740,951143,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,2,Female,A05,35-44,13688391,13666842,1185084,1172981,446733,446783,173879,209457,621217,656567,662692,676845,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,2,Female,A06,45-54,13522803,13477190,903293,924510,327033,326857,126165,154054,453707,481211,516557,554805,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,2,Female,A07,55-64,11300828,11126137,582760,745778,177954,177691,74892,90162,253057,267958,367136,532675,1,1,1,1,1,1,1,1,1,1,1,1 +2018,2,2,Female,A08,65-99,3980246,3826086,282256,432305,56641,56553,25679,30418,82391,86979,210465,359506,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,0,All Sexes,A00,All Ages (14-99),133030374,132739599,15623616,15653852,5775543,5769488,2348941,2270798,8123070,8055636,9003352,9297486,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,0,All Sexes,A01,14-18,3499068,3471411,1358364,1367264,265018,264702,114773,185225,379900,450199,1056918,1069482,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,0,All Sexes,A02,19-21,6452853,5919586,1649954,2187889,624045,622276,255325,320383,879345,943778,942444,1457008,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,0,All Sexes,A03,22-24,7516779,7614253,1785951,1645502,695599,695731,298693,269773,994074,967429,989598,888323,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,0,All Sexes,A04,25-34,29002375,29225829,4180154,3854632,1758649,1757670,680982,614720,2439514,2377529,2185581,1969762,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,0,All Sexes,A05,35-44,28142825,28331982,2765513,2517122,1103942,1102756,430593,379285,1534231,1485230,1499647,1322762,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,0,All Sexes,A06,45-54,27282026,27378698,2011484,1881177,769515,768397,310831,275174,1079959,1045913,1121480,1037182,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,0,All Sexes,A07,55-64,22745677,22595036,1281673,1424071,425543,424909,191498,167285,616667,593320,780657,939444,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,0,All Sexes,A08,65-99,8388772,8202804,590523,776194,133232,133046,66246,58953,199379,192238,427026,613523,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,1,Male,A00,All Ages (14-99),67500959,67192711,7856315,8067604,2981671,2978220,1183297,1171320,4162555,4157856,4511169,4822725,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,1,Male,A01,14-18,1655582,1614579,638099,671077,118567,118569,52742,85481,171302,204117,504945,537827,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,1,Male,A02,19-21,3166581,2878758,809950,1098378,303469,302820,126925,159133,430188,462497,473690,751250,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,1,Male,A03,22-24,3741249,3763289,866146,830370,340161,339990,144080,137618,483956,478548,486709,462508,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,1,Male,A04,25-34,14835351,14916711,2135289,2013084,925738,925008,350228,326241,1275369,1254055,1106185,1028948,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,1,Male,A05,35-44,14447581,14504575,1408213,1328987,587637,586740,219443,200023,806603,788570,749378,699154,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,1,Male,A06,45-54,13830991,13860609,1020301,980010,404512,404012,156149,143024,560218,548356,563521,541221,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,1,Male,A07,55-64,11443151,11369065,665933,738028,229330,228951,99001,88263,327998,317890,402262,481547,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,1,Male,A08,65-99,4380471,4285127,312385,407670,72258,72129,34730,31537,106921,103823,224478,320270,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,2,Female,A00,All Ages (14-99),65529416,65546887,7767301,7586248,2793872,2791268,1165644,1099478,3960515,3897780,4492183,4474762,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,2,Female,A01,14-18,1843485,1856832,720266,696187,146451,146133,62031,99744,208599,246082,551973,531655,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,2,Female,A02,19-21,3286272,3040828,840004,1089511,320576,319456,128401,161250,449157,481281,468754,705758,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,2,Female,A03,22-24,3775530,3850964,919805,815132,355438,355741,154613,132155,510118,488881,502889,425815,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,2,Female,A04,25-34,14167024,14309119,2044865,1841548,832911,832662,330754,288479,1164144,1123474,1079396,940814,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,2,Female,A05,35-44,13695244,13827407,1357300,1188135,516305,516016,211150,179262,727628,696660,750269,623609,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,2,Female,A06,45-54,13451035,13518090,991183,901167,365003,364386,154682,132151,519741,497557,557959,495961,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,2,Female,A07,55-64,11302526,11225972,615740,686044,196213,195958,92497,79022,288669,275430,378396,457897,1,1,1,1,1,1,1,1,1,1,1,1 +2018,3,2,Female,A08,65-99,4008301,3917677,278138,368523,60974,60917,31516,27416,92458,88415,202548,293253,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,0,All Sexes,A00,All Ages (14-99),132774181,132511992,13999301,14035601,5010303,5007216,2268358,2170919,7278557,7180508,8238484,8507994,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,0,All Sexes,A01,14-18,3095131,3417341,1129317,786650,216922,216545,159527,117625,376405,333941,876110,552965,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,0,All Sexes,A02,19-21,5738785,5868223,1501140,1330890,504442,503706,321083,233796,825384,737528,913957,782139,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,0,All Sexes,A03,22-24,7489727,7560094,1475304,1362054,580290,580061,273219,245348,853368,825638,808662,735226,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,0,All Sexes,A04,25-34,29183827,29196124,3699347,3611816,1535334,1534855,622717,597207,2158130,2133154,1963761,1951393,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,0,All Sexes,A05,35-44,28403746,28370446,2504377,2503903,974073,973283,382841,401434,1357085,1375372,1391290,1431730,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,0,All Sexes,A06,45-54,27353186,27217882,1844767,1966201,684951,684842,276778,309646,961813,994953,1054903,1196892,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,0,All Sexes,A07,55-64,22946855,22617935,1229271,1560051,388395,388206,171413,199584,559771,587941,771077,1104105,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,0,All Sexes,A08,65-99,8562925,8263947,615778,914035,125896,125718,60780,66279,186601,191982,458722,753545,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,1,Male,A00,All Ages (14-99),67180964,66678203,7017167,7456707,2614493,2613530,1170915,1178561,3784872,3793189,4087817,4598027,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,1,Male,A01,14-18,1433418,1570783,527574,382673,96727,96645,73236,55263,169897,151782,417214,278714,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,1,Male,A02,19-21,2788118,2834361,736305,674494,247644,247461,158883,120741,406363,368160,456780,408453,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,1,Male,A03,22-24,3693867,3706219,730838,703443,290586,290591,139281,129960,429733,420589,406494,392407,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,1,Male,A04,25-34,14877594,14816927,1900515,1935438,816808,816769,330292,330380,1146974,1147686,997797,1058929,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,1,Male,A05,35-44,14539603,14446740,1269097,1355403,522971,522571,202108,222502,725105,745440,686531,785182,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,1,Male,A06,45-54,13843205,13711995,923498,1056214,361854,361746,144026,170634,505878,532633,517769,654766,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,1,Male,A07,55-64,11539309,11323266,621430,842742,209767,209665,90568,111842,300311,321600,380753,600418,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,1,Male,A08,65-99,4465851,4267911,307909,506301,68135,68084,32520,37238,100611,105298,224479,419158,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,2,Female,A00,All Ages (14-99),65593217,65833789,6982134,6578894,2395810,2393685,1097443,992357,3493685,3387319,4150666,3909967,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,2,Female,A01,14-18,1661713,1846558,601742,403977,120195,119900,86291,62362,206509,182159,458896,274251,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,2,Female,A02,19-21,2950667,3033862,764835,656396,256798,256244,162200,113054,419020,369368,457177,373686,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,2,Female,A03,22-24,3795860,3853874,744466,658611,289704,289471,133938,115389,423635,405048,402168,342819,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,2,Female,A04,25-34,14306232,14379197,1798832,1676379,718526,718086,292424,266827,1011155,985468,965964,892463,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,2,Female,A05,35-44,13864143,13923705,1235279,1148501,451102,450712,180732,178932,631981,629932,704759,646548,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,2,Female,A06,45-54,13509980,13505887,921269,909988,323097,323096,132752,139012,455934,462321,537134,542126,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,2,Female,A07,55-64,11407546,11294669,607841,717309,178627,178541,80845,87742,259460,266340,390324,503688,1,1,1,1,1,1,1,1,1,1,1,1 +2018,4,2,Female,A08,65-99,4097075,3996036,307870,407734,57761,57634,28260,29040,85990,86684,234243,334387,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,0,All Sexes,A00,All Ages (14-99),132482769,132813183,13192994,12561889,4641281,4633128,2169033,2236052,6811409,6864104,7810365,7472123,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,0,All Sexes,A01,14-18,3036907,3340620,974368,648306,174898,174135,101371,148345,275765,321802,766597,459287,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,0,All Sexes,A02,19-21,5732895,5862064,1443154,1262366,463386,461832,230786,304129,693591,764772,896264,760356,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,0,All Sexes,A03,22-24,7418254,7520942,1401218,1249076,532370,531740,246124,256719,778473,787622,781664,674982,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,0,All Sexes,A04,25-34,29141241,29190471,3458537,3322871,1415395,1413739,603422,620031,2019318,2032515,1846200,1793466,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,0,All Sexes,A05,35-44,28428891,28503836,2381728,2258467,912619,911242,404229,389823,1317420,1300554,1331653,1259021,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,0,All Sexes,A06,45-54,27179310,27221852,1790665,1717212,652756,651961,310788,280679,964199,932359,1032668,993548,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,0,All Sexes,A07,55-64,22933832,22768000,1195361,1350788,373589,372580,203757,174895,577752,547248,752805,922138,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,0,All Sexes,A08,65-99,8611439,8405398,547963,752803,116268,115901,68556,61429,184892,177232,402513,609325,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,1,Male,A00,All Ages (14-99),66654381,66862296,6839390,6507049,2436550,2432630,1178613,1189678,3615240,3620186,4080336,3867254,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,1,Male,A01,14-18,1388245,1540020,464557,304130,76317,76105,47009,68715,123126,144547,375511,221844,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,1,Male,A02,19-21,2764970,2840133,716502,620969,226332,225865,119189,152277,345193,377678,457368,378820,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,1,Male,A03,22-24,3630768,3694455,710508,627069,266047,265825,129986,134807,395969,400249,409236,343440,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,1,Male,A04,25-34,14774879,14825264,1826239,1738295,756931,755950,333838,337221,1090775,1092583,981299,929563,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,1,Male,A05,35-44,14480530,14514864,1254923,1199670,494281,493559,224361,212156,718862,705521,699002,665496,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,1,Male,A06,45-54,13691499,13711088,936402,904569,348567,348046,171396,152498,520216,500455,541960,523499,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,1,Male,A07,55-64,11481424,11397711,635997,715595,204178,203613,114286,97591,318627,301121,400544,485662,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,1,Male,A08,65-99,4442066,4338760,294262,396752,63897,63666,38548,34413,102474,98031,215416,318930,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,2,Female,A00,All Ages (14-99),65828387,65950887,6353603,6054841,2204731,2200499,990420,1046374,3196169,3243918,3730029,3604869,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,2,Female,A01,14-18,1648662,1800600,509811,344176,98582,98030,54362,79630,152638,177255,391086,237443,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,2,Female,A02,19-21,2967925,3021931,726652,641396,237053,235966,111597,151852,348399,387093,438897,381535,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,2,Female,A03,22-24,3787487,3826487,690710,622007,266323,265914,116137,121913,382504,387372,372428,331542,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,2,Female,A04,25-34,14366362,14365207,1632297,1584577,658465,657789,269584,282810,928543,939932,864901,863903,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,2,Female,A05,35-44,13948360,13988972,1126805,1058797,418338,417683,179868,177667,598558,595034,632651,593525,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,2,Female,A06,45-54,13487811,13510763,854263,812642,304189,303914,139393,128182,443984,431904,490708,470049,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,2,Female,A07,55-64,11452407,11370289,559364,635193,169410,168967,89471,77304,259125,246127,352261,436476,1,1,1,1,1,1,1,1,1,1,1,1 +2019,1,2,Female,A08,65-99,4169373,4066638,253701,356052,52371,52236,30008,27016,82418,79201,187098,290395,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,0,All Sexes,A00,All Ages (14-99),132705380,134862114,16776513,14121261,5469486,5463554,2235205,2387679,7703894,7855557,10392983,8186350,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,0,All Sexes,A01,14-18,2951547,4075427,1913392,769761,262036,261275,124981,140958,386743,402206,1579889,497928,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,0,All Sexes,A02,19-21,5714232,6636910,2422153,1387534,620571,619555,304258,262815,924225,882657,1635439,733679,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,0,All Sexes,A03,22-24,7384683,7625913,1764047,1458610,656229,655728,260164,296048,916321,952160,1002206,759166,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,0,All Sexes,A04,25-34,29131512,29351775,3987662,3650725,1621696,1620066,628073,678126,2249939,2299829,2156077,1913327,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,0,All Sexes,A05,35-44,28540444,28617663,2656357,2500822,1025436,1024769,393040,436029,1418545,1461766,1488072,1384551,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,0,All Sexes,A06,45-54,27175913,27188134,1973191,1902587,725469,724921,282187,311386,1007719,1036988,1139295,1100778,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,0,All Sexes,A07,55-64,23061297,22838813,1351178,1537006,418864,418373,179055,193684,597831,612373,858968,1055066,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,0,All Sexes,A08,65-99,8745752,8527480,708532,914216,139184,138867,63447,68634,202572,207578,533036,741856,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,1,Male,A00,All Ages (14-99),66840239,68334655,8894936,7164169,2891521,2890923,1189949,1191145,4081522,4084103,5594652,4070530,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,1,Male,A01,14-18,1353061,1924489,948591,371100,123492,123392,57391,65143,180805,188522,793948,243683,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,1,Male,A02,19-21,2765657,3269985,1225824,678228,303384,303294,151623,127619,454758,431053,854228,362029,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,1,Male,A03,22-24,3622455,3798832,920579,715607,329219,329350,136100,141795,465300,471322,545475,369493,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,1,Male,A04,25-34,14789080,14995106,2157654,1894482,877864,877545,341720,346860,1219797,1225206,1183727,965331,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,1,Male,A05,35-44,14546467,14642181,1436295,1299919,561179,561178,214199,219932,775514,781544,809791,698129,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,1,Male,A06,45-54,13699746,13752464,1056579,972903,389610,389646,153318,155026,543042,544983,619121,549828,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,1,Male,A07,55-64,11551731,11496776,743549,776152,230013,229917,100035,99300,330017,329362,479063,518792,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,1,Male,A08,65-99,4512042,4454821,405867,455778,76761,76600,35563,35472,112290,112112,309300,363245,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,2,Female,A00,All Ages (14-99),65865141,66527459,7881577,6957092,2577964,2572631,1045256,1196534,3622372,3771454,4798331,4115819,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,2,Female,A01,14-18,1598486,2150938,964801,398661,138544,137882,67589,75815,205937,213685,785941,254245,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,2,Female,A02,19-21,2948576,3366925,1196329,709306,317188,316261,152636,135196,469467,451604,781210,371649,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,2,Female,A03,22-24,3762227,3827081,843469,743002,327010,326377,124064,154253,451021,480838,456731,389673,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,2,Female,A04,25-34,14342432,14356669,1830008,1756243,743831,742522,286354,331266,1030143,1074623,972350,947996,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,2,Female,A05,35-44,13993977,13975482,1220063,1200903,464257,463591,178841,216097,643031,680222,678281,686422,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,2,Female,A06,45-54,13476167,13435670,916613,929684,335859,335275,128869,156360,464677,492005,520175,550950,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,2,Female,A07,55-64,11509566,11342037,607629,760854,188851,188456,79021,94384,267814,283011,379905,536274,1,1,1,1,1,1,1,1,1,1,1,1 +2019,2,2,Female,A08,65-99,4233710,4072659,302665,458438,62424,62267,27883,33162,90282,95466,223737,378610,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,0,All Sexes,A00,All Ages (14-99),134862049,134544577,15645832,15704770,5804235,5796593,2384124,2306950,8192061,8118919,8979220,9299876,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,0,All Sexes,A01,14-18,3586228,3561721,1381724,1386812,269182,268430,119493,189686,388947,458490,1075453,1083216,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,0,All Sexes,A02,19-21,6518230,5969122,1642252,2197318,621937,619870,256788,325656,879175,946762,936070,1465653,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,0,All Sexes,A03,22-24,7521281,7628714,1772613,1622456,686170,686255,299591,268996,985987,957099,984666,873699,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,0,All Sexes,A04,25-34,29283603,29531744,4168932,3817520,1764386,1762831,686214,620400,2451773,2388378,2163810,1924754,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,0,All Sexes,A05,35-44,28688460,28874324,2784710,2538368,1117533,1116434,439692,388705,1558086,1508322,1499834,1325699,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,0,All Sexes,A06,45-54,27176165,27258466,1986861,1872190,766901,765884,313005,276469,1080445,1044522,1097719,1028113,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,0,All Sexes,A07,55-64,23170673,23007932,1293794,1450093,435147,434219,198161,173578,633449,608884,781857,953690,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,0,All Sexes,A08,65-99,8917408,8712554,614947,820015,142979,142671,71179,63462,214198,206461,439812,645052,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,1,Male,A00,All Ages (14-99),68337661,68007616,7792563,8033730,2949213,2944601,1190174,1184684,4141459,4136988,4478064,4815642,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,1,Male,A01,14-18,1690517,1654426,647921,675912,119537,119345,54622,87423,174263,206911,513722,541030,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,1,Male,A02,19-21,3201912,2903863,797458,1097526,297653,296791,125738,161092,423616,458464,467459,755100,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,1,Male,A03,22-24,3744902,3773441,851344,809856,330067,329856,142385,136376,472652,467060,482200,451857,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,1,Male,A04,25-34,14949507,15046254,2108539,1971472,913937,912882,350988,326579,1265613,1242099,1090448,999431,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,1,Male,A05,35-44,14685283,14739313,1402354,1327695,584629,583740,222196,204256,807287,789658,745478,699177,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,1,Male,A06,45-54,13749368,13767369,994868,967592,394701,394079,155784,143786,550779,538952,548053,538349,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,1,Male,A07,55-64,11664322,11578329,665725,751357,231308,230743,101646,91391,333031,322709,400127,492234,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,1,Male,A08,65-99,4651851,4544623,324354,432320,77382,77165,36816,33782,114218,111136,230575,338466,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,2,Female,A00,All Ages (14-99),66524388,66536961,7853269,7671040,2855021,2851992,1193950,1122266,4050602,3981931,4501157,4484234,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,2,Female,A01,14-18,1895711,1907295,733803,710900,149645,149085,64872,102263,214684,251580,561731,542186,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,2,Female,A02,19-21,3316318,3065259,844794,1099792,324284,323079,131050,164564,455559,488299,468611,710554,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,2,Female,A03,22-24,3776380,3855273,921269,812599,356103,356399,157206,132620,513335,490038,502465,421842,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,2,Female,A04,25-34,14334096,14485490,2060393,1846048,850449,849949,335227,293821,1186160,1146280,1073362,925323,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,2,Female,A05,35-44,14003177,14135011,1382356,1210673,532904,532694,217495,184449,750799,718664,754356,626522,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,2,Female,A06,45-54,13426798,13491097,991993,904598,372199,371805,157221,132682,529666,505570,549665,489765,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,2,Female,A07,55-64,11506351,11429603,628068,698735,203839,203477,96515,82188,300418,286176,381730,461456,1,1,1,1,1,1,1,1,1,1,1,1 +2019,3,2,Female,A08,65-99,4265557,4167932,290593,387696,65597,65505,34364,29679,99980,95325,209236,306586,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,0,All Sexes,A00,All Ages (14-99),134544572,134280369,14091698,14146175,5048823,5044310,2302726,1976213,7352710,7026606,8291560,8592076,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,0,All Sexes,A01,14-18,3176668,3520037,1156740,794584,221367,221260,163302,101752,384523,322967,899019,557308,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,0,All Sexes,A02,19-21,5799862,5940872,1509374,1328711,505966,505434,326263,205203,832475,710977,921768,780434,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,0,All Sexes,A03,22-24,7496960,7571518,1457491,1344090,573511,573340,272739,215676,846417,789656,800933,726307,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,0,All Sexes,A04,25-34,29464079,29469056,3691807,3616531,1544520,1543374,627666,542722,2172655,2088472,1949163,1951671,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,0,All Sexes,A05,35-44,28929304,28890390,2537920,2543581,989891,988545,391826,373823,1381931,1363686,1406327,1456968,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,0,All Sexes,A06,45-54,27256968,27116576,1838701,1966163,684605,683691,278220,286482,962928,971123,1048723,1199801,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,0,All Sexes,A07,55-64,23324520,22986943,1251357,1592417,395833,395568,177354,187494,573275,583484,784017,1128769,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,0,All Sexes,A08,65-99,9096211,8784978,648307,960099,133129,133099,65355,63060,198505,196241,481609,790816,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,1,Male,A00,All Ages (14-99),67979068,67447572,7013867,7483956,2593780,2591543,1183399,1073913,3778534,3667913,4107763,4654927,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,1,Male,A01,14-18,1468728,1618085,540414,384034,98011,97973,74900,48386,172834,146307,428595,279217,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,1,Male,A02,19-21,2817896,2872164,736865,667884,245460,245298,160743,106445,406370,351863,460297,405124,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,1,Male,A03,22-24,3701771,3715089,716913,689251,282543,282360,138026,114882,420733,397491,401568,387714,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,1,Male,A04,25-34,14994715,14921416,1879707,1927587,809880,809588,330500,300188,1140923,1110758,985558,1061452,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,1,Male,A05,35-44,14765216,14662396,1274631,1369916,520917,520134,206078,206693,727277,727389,694004,803182,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,1,Male,A06,45-54,13763296,13625360,913388,1052662,354911,354310,144852,157396,499944,512128,514916,659282,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,1,Male,A07,55-64,11729746,11504319,627905,858825,209957,209745,93487,104530,303515,314420,387190,616806,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,1,Male,A08,65-99,4737700,4528743,324043,533797,72102,72135,34812,35393,106938,107557,235634,442150,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,2,Female,A00,All Ages (14-99),66565504,66832797,7077830,6662219,2455043,2452767,1119326,902299,3574176,3358693,4183797,3937149,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,2,Female,A01,14-18,1707939,1901952,616326,410550,123356,123287,88401,53366,211689,176660,470424,278091,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,2,Female,A02,19-21,2981965,3068708,772509,660827,260506,260136,165520,98758,426105,359113,461471,375310,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,2,Female,A03,22-24,3795189,3856428,740579,654838,290967,290980,134713,100794,425684,392165,399365,338594,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,2,Female,A04,25-34,14469364,14547640,1812100,1688944,734640,733786,297166,242534,1031732,977715,963605,890220,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,2,Female,A05,35-44,14164088,14227994,1263288,1173665,468975,468411,185748,167129,654654,636297,712323,653786,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,2,Female,A06,45-54,13493672,13491216,925313,913501,329695,329381,133368,129086,462984,458994,533807,540519,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,2,Female,A07,55-64,11594775,11482624,623452,733592,185877,185823,83866,82964,269760,269064,396827,511963,1,1,1,1,1,1,1,1,1,1,1,1 +2019,4,2,Female,A08,65-99,4358512,4256235,324264,426302,61027,60964,30543,27666,91566,88685,245975,348666,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,0,All Sexes,A00,All Ages (14-99),133621428,128033619,11819182,17609038,4442457,4436112,1969490,1895770,6415477,6328340,6827185,12465991,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,0,All Sexes,A01,14-18,3110754,2946502,820621,972449,161912,161100,87553,166374,249515,327450,636110,785854,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,0,All Sexes,A02,19-21,5748382,5296054,1243999,1676711,432199,431039,200741,281379,633100,711490,756383,1187140,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,0,All Sexes,A03,22-24,7404373,7016791,1232178,1606600,499468,498871,215622,216974,715378,715197,673286,1050767,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,0,All Sexes,A04,25-34,29257933,28109361,3116108,4286851,1349796,1348547,546884,495435,1897846,1843092,1621345,2779428,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,0,All Sexes,A05,35-44,28820718,27962182,2193273,3105989,886921,885709,375450,313920,1263189,1199240,1198199,2087654,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,0,All Sexes,A06,45-54,27009125,26276602,1629751,2431828,626436,625883,287316,223334,914364,848943,920365,1692201,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,0,All Sexes,A07,55-64,23168452,22224193,1088761,2106614,366196,365693,190747,141151,557313,506568,668829,1641026,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,0,All Sexes,A08,65-99,9101689,8201933,494491,1421994,119528,119270,65177,57203,184772,176360,352668,1241921,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,1,Male,A00,All Ages (14-99),67105175,64728652,6145866,8625250,2289503,2285705,1071401,1005002,3362745,3288481,3615979,6033836,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,1,Male,A01,14-18,1422430,1373748,400614,442852,71140,70822,40987,77889,112137,148724,320080,361499,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,1,Male,A02,19-21,2776358,2603269,626087,788173,208818,208369,104199,137138,313100,345088,394653,557747,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,1,Male,A03,22-24,3627463,3471157,625919,776424,245369,244919,114790,112743,360277,357309,356389,508477,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,1,Male,A04,25-34,14799975,14301522,1642858,2153624,708910,707956,302616,271964,1012057,979263,869596,1376038,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,1,Male,A05,35-44,14630410,14259734,1154672,1553712,469740,468888,207877,172253,678102,640838,636636,1026051,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,1,Male,A06,45-54,13569743,13261093,849567,1193471,325954,325589,157936,121777,484242,447133,487653,818688,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,1,Male,A07,55-64,11592099,11178598,579585,1028686,195355,195102,106316,79261,301892,274149,360038,790107,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,1,Male,A08,65-99,4686696,4279530,266564,688308,64217,64059,36681,31976,100938,95976,190932,595231,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,2,Female,A00,All Ages (14-99),66516252,63304967,5673315,8983788,2152954,2150407,898090,890768,3052732,3039859,3211206,6432155,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,2,Female,A01,14-18,1688323,1572754,420007,529598,90772,90279,46566,88485,137378,178726,316029,424355,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,2,Female,A02,19-21,2972024,2692785,617913,888538,223382,222669,96542,144241,320000,366402,361730,629393,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,2,Female,A03,22-24,3776910,3545634,606259,830176,254099,253952,100832,104231,355102,357888,316897,542290,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,2,Female,A04,25-34,14457958,13807839,1473249,2133228,640886,640591,244268,223471,885789,863828,751748,1403390,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,2,Female,A05,35-44,14190308,13702449,1038600,1552277,417181,416821,167573,141666,585087,558402,561563,1061604,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,2,Female,A06,45-54,13439382,13015509,780184,1238357,300482,300294,129380,101557,430122,401810,432712,873514,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,2,Female,A07,55-64,11576353,11045595,509176,1077929,170841,170590,84431,61890,255421,232419,308791,850919,1,1,1,1,1,1,1,1,1,1,1,1 +2020,1,2,Female,A08,65-99,4414994,3922403,227927,733686,55311,55211,28496,25227,83834,80384,161737,646691,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,0,All Sexes,A00,All Ages (14-99),127224334,124862804,11420418,13580760,3028546,3024574,1887661,2093352,4920193,5116006,7690349,10040844,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,0,All Sexes,A01,14-18,2560820,3356598,1385572,552765,148433,148085,143699,106358,292841,254121,1171656,394225,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,0,All Sexes,A02,19-21,5105305,5513037,1632366,1150190,327231,327287,280836,230855,609171,557286,1199677,791519,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,0,All Sexes,A03,22-24,6824496,6666667,1126796,1244404,334576,334502,222087,257585,557031,591919,721121,868698,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,0,All Sexes,A04,25-34,27863835,27021991,2543840,3335350,867328,866285,499830,598587,1367998,1464563,1521897,2348686,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,0,All Sexes,A05,35-44,27863553,27210629,1822168,2456997,589871,588868,315758,384231,905971,972916,1114040,1767183,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,0,All Sexes,A06,45-54,26147959,25596166,1391733,1944700,423221,422682,223703,276563,647154,699179,875918,1434564,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,0,All Sexes,A07,55-64,22367280,21615328,981476,1749521,250696,249887,143069,175085,393933,424952,668466,1421080,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,0,All Sexes,A08,65-99,8491086,7882389,536467,1146833,87190,86976,58680,64086,146095,151070,417574,1014890,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,1,Male,A00,All Ages (14-99),64355187,63614273,6200528,6831334,1650290,1648970,1000350,1060947,2652422,2707965,4225882,4956240,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,1,Male,A01,14-18,1187196,1612406,712102,270861,74021,74060,66973,48484,141314,122324,608316,192666,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,1,Male,A02,19-21,2508489,2754066,847596,570378,167144,167439,136212,111198,303858,278181,635234,390484,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,1,Male,A03,22-24,3374016,3337492,603688,620851,176094,176356,114704,123530,291002,299711,396243,427894,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,1,Male,A04,25-34,14171898,13821491,1405388,1726518,484268,483885,274050,312480,758663,795915,848980,1189664,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,1,Male,A05,35-44,14225005,13960210,1001574,1253186,328038,327426,173384,200100,501575,527276,618367,880459,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,1,Male,A06,45-54,13204835,12991584,760189,970134,231448,231135,121954,140913,353480,371811,486169,700546,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,1,Male,A07,55-64,11256848,10954397,553743,859247,140478,140022,80272,90772,220812,230665,382919,684561,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,1,Male,A08,65-99,4426902,4182625,316248,560159,48799,48648,32801,33470,81718,82081,249653,489967,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,2,Female,A00,All Ages (14-99),62869147,61248531,5219890,6749426,1378256,1375603,887311,1032404,2267771,2408041,3464467,5084604,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,2,Female,A01,14-18,1373625,1744192,673470,281904,74412,74025,76726,57875,151528,131797,563340,201558,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,2,Female,A02,19-21,2596816,2758970,784770,579812,160088,159848,144624,119657,305312,279104,564442,401036,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,2,Female,A03,22-24,3450480,3329175,523107,623553,158482,158147,107383,134055,266029,292207,324878,440804,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,2,Female,A04,25-34,13691938,13200500,1138452,1608832,383060,382400,225780,286107,609335,668649,672917,1159022,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,2,Female,A05,35-44,13638548,13250418,820594,1203812,261833,261443,142374,184131,404396,445640,495673,886724,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,2,Female,A06,45-54,12943124,12604581,631544,974566,191773,191548,101749,135651,293674,327368,389749,734018,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,2,Female,A07,55-64,11110433,10660931,427733,890274,110218,109865,62797,84313,173120,194287,285547,736518,1,1,1,1,1,1,1,1,1,1,1,1 +2020,2,2,Female,A08,65-99,4064184,3699763,220219,586673,38391,38329,25878,30616,64377,68989,167921,524923,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,0,All Sexes,A00,All Ages (14-99),124923010,126498914,15298015,13402499,4490740,4479399,2098526,1938362,6588548,6416906,10037245,8495281,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,0,All Sexes,A01,14-18,2952762,3533430,1570120,980046,249400,248247,89503,155188,338526,402786,1276416,710523,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,0,All Sexes,A02,19-21,5411801,5467061,1706387,1624826,521405,519490,224756,276558,745652,795385,1107535,1050731,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,0,All Sexes,A03,22-24,6550706,6850974,1664309,1317806,529903,529570,261016,224391,790681,753872,1049701,750842,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,0,All Sexes,A04,25-34,26944125,27335969,3766880,3268562,1315344,1312719,608773,522188,1924318,1835180,2253991,1863930,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,0,All Sexes,A05,35-44,27282226,27556508,2595503,2256130,840756,838367,389400,327947,1230284,1166597,1607439,1341661,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,0,All Sexes,A06,45-54,25614101,25808534,1924479,1690481,579616,578278,279090,232129,858916,810603,1233381,1048213,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,0,All Sexes,A07,55-64,21914696,21830685,1350602,1415864,336681,335538,179405,146692,516046,482120,940436,1026725,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,0,All Sexes,A08,65-99,8252596,8115753,719735,848783,117634,117190,66584,53268,184125,170362,568346,702658,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,1,Male,A00,All Ages (14-99),63661629,64148439,7497886,6872477,2288523,2282694,1065029,996615,3352489,3277461,4880356,4394994,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,1,Male,A01,14-18,1414811,1638030,715813,489509,111500,111166,40259,71038,151588,181875,586242,368220,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,1,Male,A02,19-21,2698717,2667080,801504,823576,249271,248655,108913,136415,357897,384619,522120,551067,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,1,Male,A03,22-24,3280046,3388201,784794,659598,256076,255811,124333,113006,380193,368567,496153,387265,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,1,Male,A04,25-34,13775079,13936270,1896387,1688225,687043,685522,317652,275664,1004484,960803,1124713,961773,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,1,Male,A05,35-44,14006821,14104766,1301551,1174312,441955,440424,203555,172949,645444,613222,794635,699034,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,1,Male,A06,45-54,13005656,13065379,948655,871689,299362,298668,142388,120980,441744,419552,601115,543976,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,1,Male,A07,55-64,11108366,11049753,677761,726098,179522,178906,93114,77918,272584,256690,465252,522501,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,1,Male,A08,65-99,4372133,4298958,371420,439471,63795,63542,34815,28646,98556,92133,290126,361157,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,2,Female,A00,All Ages (14-99),61261381,62350476,7800129,6530021,2202217,2196705,1033497,941747,3236059,3139445,5156889,4100287,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,2,Female,A01,14-18,1537951,1895400,854307,490537,137900,137080,49243,84151,186938,220912,690174,342303,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,2,Female,A02,19-21,2713084,2799981,904883,801250,272134,270835,115843,140143,387755,410766,585415,499664,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,2,Female,A03,22-24,3270659,3462773,879515,658208,273827,273759,136683,111385,410488,385305,553548,363577,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,2,Female,A04,25-34,13169046,13399699,1870493,1580337,628301,627197,291121,246524,919834,874377,1129278,902157,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,2,Female,A05,35-44,13275405,13451741,1293952,1081818,398801,397944,185845,154998,584840,553375,812804,642626,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,2,Female,A06,45-54,12608445,12743155,975824,818792,280254,279610,136702,111150,417172,391052,632267,504237,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,2,Female,A07,55-64,10806329,10780932,672841,689766,157159,156632,86291,68774,243462,225430,475184,504224,1,1,1,1,1,1,1,1,1,1,1,1 +2020,3,2,Female,A08,65-99,3880462,3816795,348315,409312,53840,53648,31770,24622,85569,78229,278220,341501,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,0,All Sexes,A00,All Ages (14-99),126747766,127295807,14016882,13238267,4439730,4437133,1942877,1888693,6383220,6325273,8886576,8368720,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,0,All Sexes,A01,14-18,3172576,3556157,1213519,809921,233514,233187,132055,126033,365260,358852,938156,559962,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,0,All Sexes,A02,19-21,5353775,5607402,1574077,1277291,484804,484738,279727,212841,764223,697514,1011719,757697,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,0,All Sexes,A03,22-24,6751822,6950104,1476042,1236851,515067,515234,228711,208619,743748,723780,886353,688318,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,0,All Sexes,A04,25-34,27298536,27547318,3591695,3273151,1320459,1319186,530509,502536,1851440,1821737,2095728,1858322,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,0,All Sexes,A05,35-44,27661910,27747991,2460787,2341169,844528,843522,332278,343727,1177231,1187302,1487003,1413436,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,0,All Sexes,A06,45-54,25874586,25848072,1802081,1809516,582636,582478,234317,259421,817280,841922,1122443,1155501,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,0,All Sexes,A07,55-64,22141612,21858933,1255698,1536156,340922,341009,150222,174078,491220,514999,850322,1133701,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,0,All Sexes,A08,65-99,8492950,8179830,642983,954212,117800,117778,55059,61438,172820,179166,494851,801783,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,1,Male,A00,All Ages (14-99),64251731,64173836,6932958,6926809,2254456,2254689,998683,1004360,3255140,3258770,4387423,4468113,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,1,Male,A01,14-18,1464632,1623314,553438,387079,100495,100489,59974,56998,160376,157332,436749,279362,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,1,Male,A02,19-21,2607601,2706906,749126,633928,229401,229664,137261,105771,366681,335377,490201,389677,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,1,Male,A03,22-24,3334048,3409887,715109,623776,250188,250514,114763,107595,365113,358053,435715,358926,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,1,Male,A04,25-34,13901891,13972770,1823770,1725467,688185,688072,279705,273938,968687,961983,1061120,993255,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,1,Male,A05,35-44,14159390,14137470,1238285,1250074,441434,441242,175412,188844,617396,630107,741053,768158,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,1,Male,A06,45-54,13093131,13020805,893585,960585,300333,300252,122245,141096,422978,441398,551939,626023,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,1,Male,A07,55-64,11200568,11010752,632051,821329,180213,180261,79721,96053,260102,276287,422653,611163,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,1,Male,A08,65-99,4490469,4291932,327595,524570,64206,64195,29603,34065,93808,98233,247992,441550,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,2,Female,A00,All Ages (14-99),62496035,63121970,7083924,6311458,2185274,2182445,944193,884333,3128081,3066503,4499153,3900607,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,2,Female,A01,14-18,1707943,1932843,660081,422841,133019,132698,72081,69035,204884,201521,501408,280600,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,2,Female,A02,19-21,2746174,2900496,824951,643363,255403,255075,142466,107070,397541,362138,521518,368020,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,2,Female,A03,22-24,3417773,3540216,760933,613075,264879,264720,113948,101024,378635,365728,450638,329392,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,2,Female,A04,25-34,13396645,13574548,1767925,1547684,632274,631114,250804,228597,882753,859754,1034609,865068,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,2,Female,A05,35-44,13502519,13610521,1222502,1091096,403094,402281,156866,154883,559835,557195,745950,645278,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,2,Female,A06,45-54,12781455,12827267,908495,848931,282303,282226,112072,118325,394302,400524,570504,529478,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,2,Female,A07,55-64,10941045,10848181,623647,714827,160709,160748,70501,78025,231118,238712,427669,522538,1,1,1,1,1,1,1,1,1,1,1,1 +2020,4,2,Female,A08,65-99,4002481,3887898,315388,429642,53594,53583,25456,27373,79012,80933,246859,360233,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,0,All Sexes,A00,All Ages (14-99),127381014,127765720,12361032,11642946,3992409,3979541,1893043,2022761,5893447,5999730,7633789,7240080,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,0,All Sexes,A01,14-18,3180874,3534631,1049294,667715,193325,191814,110799,162990,304374,355057,813716,459615,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,0,All Sexes,A02,19-21,5511184,5577377,1355027,1241810,427836,425375,212811,307210,641299,732367,845785,776052,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,0,All Sexes,A03,22-24,6840986,6930149,1285369,1148698,456709,455382,210426,233572,667896,688415,747546,656296,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,0,All Sexes,A04,25-34,27496596,27529483,3130797,3004759,1190539,1187874,509419,538505,1702046,1725424,1751738,1714768,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,0,All Sexes,A05,35-44,27806971,27881752,2199698,2065443,768679,766928,346733,337418,1117087,1103881,1292356,1216183,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,0,All Sexes,A06,45-54,25894870,25974080,1642081,1524972,536251,534743,261584,235648,799280,770029,1002127,924373,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,0,All Sexes,A07,55-64,22110095,21978307,1139502,1255569,312619,311335,177406,149632,490860,460766,758481,891570,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,0,All Sexes,A08,65-99,8539439,8359940,559264,733980,106451,106091,63866,57786,170604,163792,422040,601223,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,1,Male,A00,All Ages (14-99),64215046,64413558,6296219,5968322,2051502,2045495,1007163,1062057,3062503,3106317,3929277,3729371,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,1,Male,A01,14-18,1443844,1609379,484416,308327,81043,80545,49187,72868,130364,153547,387028,221107,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,1,Male,A02,19-21,2656006,2695011,658055,600684,201995,201158,105821,150163,308140,351258,424248,383186,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,1,Male,A03,22-24,3351197,3402225,638509,569649,223866,223276,107892,120684,332106,343730,382616,330751,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,1,Male,A04,25-34,13935251,13972142,1631405,1556520,628593,627277,277774,292519,907293,919298,920839,882701,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,1,Male,A05,35-44,14173319,14208958,1143564,1084715,409308,408251,190545,182888,600679,590874,673196,638014,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,1,Male,A06,45-54,13044679,13081323,845387,795058,280344,279486,142532,127712,423590,407022,520008,484896,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,1,Male,A07,55-64,11136173,11064585,598085,664171,168739,168092,98000,83293,267159,251289,397812,470708,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,1,Male,A08,65-99,4474577,4379935,296798,389197,57614,57409,35412,31929,93173,89301,223531,318007,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,2,Female,A00,All Ages (14-99),63165968,63352163,6064813,5674624,1940907,1934046,885880,960705,2830944,2893414,3704512,3510709,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,2,Female,A01,14-18,1737030,1925252,564878,359388,112282,111268,61612,90122,174010,201511,426688,238508,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,2,Female,A02,19-21,2855178,2882366,696972,641126,225841,224218,106990,157046,333159,381109,421537,392866,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,2,Female,A03,22-24,3489789,3527924,646860,579050,232843,232106,102534,112888,335790,344685,364930,325545,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,2,Female,A04,25-34,13561345,13557341,1499392,1448239,561946,560597,231644,245986,794753,806125,830899,832067,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,2,Female,A05,35-44,13633652,13672795,1056133,980728,359371,358676,156189,154530,516409,513007,619160,578169,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,2,Female,A06,45-54,12850191,12892757,796693,729914,255907,255257,119052,107936,375691,363007,482119,439476,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,2,Female,A07,55-64,10973922,10913722,541418,591398,143880,143243,79405,66339,223701,209477,360670,420861,1,1,1,1,1,1,1,1,1,1,1,1 +2021,1,2,Female,A08,65-99,4064861,3980005,262466,344783,48837,48682,28454,25857,77431,74492,198509,283216,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,0,All Sexes,A00,All Ages (14-99),127842961,130559363,17300416,14089591,5600639,5590967,2028538,2387622,7632240,7997357,10819920,8078918,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,0,All Sexes,A01,14-18,3158837,4452240,2202627,897154,344373,343552,137926,169414,482339,513476,1786189,541686,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,0,All Sexes,A02,19-21,5487667,6321848,2367744,1448122,663308,661950,312545,279981,975182,943956,1566597,753835,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,0,All Sexes,A03,22-24,6836584,7082817,1752408,1448301,657243,656575,240330,296357,897917,954981,1001566,754577,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,0,All Sexes,A04,25-34,27466997,27670122,3949393,3626745,1620620,1618680,545859,668158,2167915,2292566,2128167,1904553,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,0,All Sexes,A05,35-44,27948406,28097685,2716660,2480012,1030051,1028183,341654,425278,1372649,1457160,1539484,1366980,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,0,All Sexes,A06,45-54,26002452,26134545,2019808,1820609,712649,711376,237589,294083,950951,1008097,1194634,1040835,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,0,All Sexes,A07,55-64,22235604,22166698,1460910,1483800,420933,419575,152996,183818,574220,605024,963332,1010397,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,0,All Sexes,A08,65-99,8706414,8633407,830866,884849,151461,151076,59640,70533,211068,222096,639950,706055,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,1,Male,A00,All Ages (14-99),64471734,66134834,8980240,7081161,2888613,2885745,1064780,1182814,3953467,4078140,5699758,4017334,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,1,Male,A01,14-18,1429225,2064013,1056164,419614,152813,152540,61035,77771,213828,230514,873078,262844,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,1,Male,A02,19-21,2646352,3085893,1166637,695648,314332,314056,151935,133829,465738,448861,797301,369538,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,1,Male,A03,22-24,3351716,3523347,896039,699431,323908,323868,123511,140379,447334,465217,532745,361707,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,1,Male,A04,25-34,13931887,14122189,2107495,1857755,862662,862163,296318,340361,1159304,1205542,1153329,951633,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,1,Male,A05,35-44,14254638,14371905,1443764,1280545,553069,552390,185325,214450,738641,768833,823523,691179,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,1,Male,A06,45-54,13102007,13204122,1060736,922863,372912,372529,128536,145693,501585,519531,637015,520621,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,1,Male,A07,55-64,11198312,11207950,787491,751919,226327,225792,85142,93420,311499,320063,524865,502281,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,1,Male,A08,65-99,4557596,4555414,461915,453386,82591,82406,32977,36911,115539,119579,357902,357531,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,2,Female,A00,All Ages (14-99),63371227,64424529,8320175,7008430,2712026,2705222,963758,1204808,3678773,3919217,5120162,4061584,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,2,Female,A01,14-18,1729611,2388227,1146464,477540,191561,191011,76891,91643,268512,282963,913111,278842,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,2,Female,A02,19-21,2841314,3235954,1201107,752473,348977,347894,160609,146152,509444,495094,769295,384297,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,2,Female,A03,22-24,3484868,3559470,856368,748870,333335,332708,116818,155978,450583,489764,468822,392870,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,2,Female,A04,25-34,13535111,13547932,1841898,1768990,757958,756517,249542,327797,1008611,1087024,974838,952920,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,2,Female,A05,35-44,13693767,13725780,1272896,1199467,476983,475792,156329,210828,634008,688327,715962,675801,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,2,Female,A06,45-54,12900445,12930423,959072,897746,339737,338847,109052,148390,449366,488567,557619,520214,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,2,Female,A07,55-64,11037293,10958749,673419,731880,194607,193783,67854,90398,262721,284961,438467,508116,1,1,1,1,1,1,1,1,1,1,1,1 +2021,2,2,Female,A08,65-99,4148818,4077993,368952,431462,68869,68670,26662,33622,95528,102517,282048,348524,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,0,All Sexes,A00,All Ages (14-99),130718970,131813286,17655390,16168978,6294209,6283946,2391035,2407268,8692675,8707152,10431137,9342121,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,0,All Sexes,A01,14-18,3971993,4096469,1696500,1550505,363579,363296,145799,234184,510159,597497,1285974,1153966,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,0,All Sexes,A02,19-21,6256658,5880078,1797912,2154162,680160,678589,276860,336787,957746,1016844,1032168,1390257,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,0,All Sexes,A03,22-24,7013675,7249489,1899994,1614997,721777,722360,300923,276525,1023216,1000740,1078300,842397,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,0,All Sexes,A04,25-34,27624319,28145423,4528533,3885460,1861055,1859028,678344,637066,2541647,2501361,2419295,1908179,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,0,All Sexes,A05,35-44,28173415,28589576,3145275,2645755,1201023,1198409,430341,402373,1632888,1604120,1759263,1354825,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,0,All Sexes,A06,45-54,26199206,26475659,2250554,1918468,819699,817531,297219,275496,1117932,1095429,1294454,1026567,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,0,All Sexes,A07,55-64,22438664,22439651,1541253,1510820,478155,476393,188274,174867,666895,652509,974234,976207,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,0,All Sexes,A08,65-99,9041040,8936940,795369,888811,168761,168339,73275,69970,242191,238651,587448,689724,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,1,Male,A00,All Ages (14-99),66222016,66692051,8697599,8064816,3128961,3124342,1185014,1199836,4316821,4330582,5170520,4702952,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,1,Male,A01,14-18,1835648,1895506,797124,728132,156813,156749,66172,103977,223276,260703,621229,557764,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,1,Male,A02,19-21,3043234,2851446,861535,1042913,316221,315662,133266,159381,449675,475646,511486,693632,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,1,Male,A03,22-24,3486381,3592548,908977,784754,341430,341637,141582,135651,483169,477974,528319,421663,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,1,Male,A04,25-34,14088966,14352699,2277091,1961719,951895,951288,345152,327147,1297975,1280631,1218204,958920,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,1,Male,A05,35-44,14421045,14594573,1560100,1352488,615115,613614,217350,207024,833083,821977,864903,697270,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,1,Male,A06,45-54,13237863,13354969,1104417,965857,410802,409842,147404,139337,558589,550102,635221,522854,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,1,Male,A07,55-64,11344936,11343730,776172,764895,246595,245691,95724,90292,342522,336483,489278,492547,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,1,Male,A08,65-99,4763942,4706580,412182,464058,90089,89860,38365,37027,128532,127066,301880,358302,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,2,Female,A00,All Ages (14-99),64496954,65121235,8957792,8104163,3165248,3159604,1206021,1207432,4375854,4376570,5260616,4639169,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,2,Female,A01,14-18,2136345,2200964,899375,822373,206766,206547,79627,130207,286883,336795,664745,596202,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,2,Female,A02,19-21,3213424,3028632,936377,1111250,363939,362928,143595,177406,508071,541198,520682,696625,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,2,Female,A03,22-24,3527294,3656941,991018,830243,380347,380723,159341,140875,540047,522766,549981,420734,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,2,Female,A04,25-34,13535354,13792724,2251442,1923741,909160,907741,333192,309919,1243672,1220731,1201092,949259,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,2,Female,A05,35-44,13752370,13995003,1585175,1293267,585908,584795,212991,195350,799806,782143,894360,657554,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,2,Female,A06,45-54,12961343,13120690,1146137,952611,408897,407690,149815,136159,559343,545327,659233,503713,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,2,Female,A07,55-64,11093727,11095921,765081,745926,231560,230702,92550,84575,324373,316026,484956,483660,1,1,1,1,1,1,1,1,1,1,1,1 +2021,3,2,Female,A08,65-99,4277098,4230360,383187,424752,78673,78478,34910,32943,113659,111585,285568,331422,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,0,All Sexes,A00,All Ages (14-99),131968986,132604218,16324361,15369903,5881669,5873949,2407313,2436695,8296649,8331378,9653107,8985882,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,0,All Sexes,A01,14-18,3702984,4031492,1384956,1036107,307831,307401,205854,165413,514173,474099,1035217,706922,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,0,All Sexes,A02,19-21,5759090,5921179,1646128,1447449,578896,578609,339188,260508,918680,841143,989943,824809,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,0,All Sexes,A03,22-24,7146253,7315884,1634143,1425386,640832,640915,281018,261796,922563,905016,914426,741830,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,0,All Sexes,A04,25-34,28115495,28423033,4268610,3866923,1763065,1761389,645755,658511,2411100,2426101,2299007,1987844,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,0,All Sexes,A05,35-44,28639310,28814565,3008310,2771262,1159581,1156789,406390,453874,1567505,1614619,1690598,1515099,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,0,All Sexes,A06,45-54,26551121,26568415,2137497,2080859,794877,793249,278161,332854,1074163,1128877,1226938,1206041,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,0,All Sexes,A07,55-64,22716839,22474887,1469432,1692631,469963,469047,178647,220434,649311,691146,924072,1157361,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,0,All Sexes,A08,65-99,9337893,9054763,775285,1049286,166625,166551,72300,83304,239153,250377,572906,845976,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,1,Male,A00,All Ages (14-99),66747716,66723773,8010426,7920889,2946007,2943922,1199857,1271820,4148934,4225934,4741538,4741527,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,1,Male,A01,14-18,1706079,1858357,647768,487655,134133,134028,90958,75475,225282,210023,497484,344492,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,1,Male,A02,19-21,2789578,2860253,791591,707422,273961,274046,159769,128746,433941,403665,488462,415479,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,1,Male,A03,22-24,3533893,3603668,796417,712633,311559,311785,137430,133725,449234,446560,454541,382786,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,1,Male,A04,25-34,14323837,14417574,2139188,2009775,905820,905616,331192,350592,1237948,1259354,1148030,1050581,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,1,Male,A05,35-44,14620384,14625917,1480387,1454381,594180,593247,209330,242857,804175,838122,821288,814283,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,1,Male,A06,45-54,13387650,13332914,1034498,1077642,396045,395422,140627,175420,537110,572243,591742,644200,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,1,Male,A07,55-64,11476653,11306093,727838,892554,240933,240427,92262,119100,333467,360411,454432,620226,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,1,Male,A08,65-99,4909642,4718997,392739,578827,89377,89353,38289,45905,127777,135556,285558,469480,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,2,Female,A00,All Ages (14-99),65221270,65880446,8313935,7449014,2935661,2930027,1207456,1164876,4147714,4105444,4911569,4244355,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,2,Female,A01,14-18,1996905,2173135,737188,548452,173698,173373,114896,89938,288891,264076,537733,362429,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,2,Female,A02,19-21,2969512,3060927,854537,740028,304935,304563,179419,131762,484739,437479,501481,409330,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,2,Female,A03,22-24,3612360,3712216,837726,712753,329273,329130,143588,128071,473330,458456,459885,359044,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,2,Female,A04,25-34,13791658,14005459,2129422,1857148,857245,855774,314563,307919,1173152,1166747,1150977,937264,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,2,Female,A05,35-44,14018926,14188648,1527923,1316880,565401,563543,197059,211017,763330,776497,869310,700816,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,2,Female,A06,45-54,13163471,13235501,1102999,1003217,398832,397827,137534,157434,537052,556634,635197,561841,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,2,Female,A07,55-64,11240186,11168795,741594,800078,229030,228620,86385,101335,315844,330735,469639,537135,1,1,1,1,1,1,1,1,1,1,1,1 +2021,4,2,Female,A08,65-99,4428251,4335766,382546,470459,77248,77198,34011,37399,111377,114820,287348,376497,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,0,All Sexes,A00,All Ages (14-99),132651228,133822061,14897560,13334803,5175185,5165729,2439446,2387504,7617435,7563258,8872724,7721196,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,0,All Sexes,A01,14-18,3639196,4011359,1193000,796416,233227,232458,146916,181710,380021,414708,918742,548723,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,0,All Sexes,A02,19-21,5798745,5962410,1503268,1292369,489748,488447,257527,312993,747387,802491,929612,766802,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,0,All Sexes,A03,22-24,7231092,7398360,1487410,1270606,556586,555978,264319,263503,821177,820437,842315,676238,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,0,All Sexes,A04,25-34,28367845,28660877,3869098,3463986,1561730,1559548,665427,650461,2228184,2213134,2082927,1794757,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,0,All Sexes,A05,35-44,28826624,29097640,2785460,2435913,1040352,1038720,458108,421866,1499080,1462608,1574246,1307570,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,0,All Sexes,A06,45-54,26641170,26818381,2005984,1778909,717892,716349,335733,292239,1054099,1009986,1163441,990700,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,0,All Sexes,A07,55-64,22714916,22625706,1364835,1431554,425155,424151,224981,188324,650483,613216,859940,950883,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,0,All Sexes,A08,65-99,9431639,9247327,688505,865050,150493,150078,86436,76408,237004,226678,501502,685523,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,1,Male,A00,All Ages (14-99),66746809,67363713,7526034,6748241,2629819,2625817,1273540,1231528,3905079,3862849,4532839,3924773,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,1,Male,A01,14-18,1668416,1855620,567533,371266,102055,101834,66253,83526,168308,185616,449403,263269,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,1,Male,A02,19-21,2798536,2891108,735533,625495,234614,234253,127378,153535,362133,388345,468544,376553,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,1,Male,A03,22-24,3555386,3652627,741773,624928,272262,272006,134468,134646,406917,407199,433495,337061,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,1,Male,A04,25-34,14380684,14546621,1983771,1771009,812863,811944,353791,343118,1167255,1156816,1074482,910995,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,1,Male,A05,35-44,14639372,14768385,1420374,1258622,542198,541439,245369,221934,787893,764533,803950,676942,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,1,Male,A06,45-54,13368886,13454655,1011050,904665,364550,363828,177076,151978,541864,516524,593092,508783,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,1,Male,A07,55-64,11425176,11380078,703819,738602,220890,220347,121553,101209,342625,321960,446568,492298,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,1,Male,A08,65-99,4910354,4814620,362180,453653,80387,80167,47652,41582,128083,121857,263303,358870,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,2,Female,A00,All Ages (14-99),65904419,66458348,7371526,6586563,2545366,2539912,1165906,1155975,3712356,3700409,4339885,3796424,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,2,Female,A01,14-18,1970780,2155739,625467,425150,131172,130624,80663,98184,211713,229092,469340,285454,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,2,Female,A02,19-21,3000210,3071302,767735,666875,255134,254195,130149,159458,385254,414146,461067,390248,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,2,Female,A03,22-24,3675706,3745733,745637,645678,284325,283972,129850,128856,414260,413238,408820,339177,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,2,Female,A04,25-34,13987161,14114257,1885327,1692977,748867,747604,311636,307343,1060929,1056318,1008444,883762,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,2,Female,A05,35-44,14187252,14329255,1365085,1177291,498155,497281,212739,199931,711187,698075,770295,630627,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,2,Female,A06,45-54,13272284,13363727,994934,874244,353342,352521,158657,140261,512235,493462,570349,481916,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,2,Female,A07,55-64,11289741,11245628,661015,692952,204265,203804,103428,87115,307857,291257,413371,458585,1,1,1,1,1,1,1,1,1,1,1,1 +2022,1,2,Female,A08,65-99,4521286,4432707,326325,411396,70107,69911,38784,34826,108921,104821,238198,326653,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,0,All Sexes,A00,All Ages (14-99),133835854,136314320,18154246,15144139,6124457,6110106,2391224,2660300,8516256,8783916,11037658,8542866,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,0,All Sexes,A01,14-18,3592295,4730639,2113398,952557,329362,328348,156963,187471,486193,515362,1704501,608419,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,0,All Sexes,A02,19-21,5867952,6717542,2390181,1444750,647350,645762,316378,289949,963058,936155,1588955,763270,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,0,All Sexes,A03,22-24,7288261,7530792,1796987,1495564,677682,676696,267560,317213,945306,994953,1018223,777140,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,0,All Sexes,A04,25-34,28598717,28877931,4278573,3872770,1786902,1783409,658404,741970,2445980,2530023,2264328,1970052,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,0,All Sexes,A05,35-44,29125444,29290293,3023136,2761368,1191645,1188815,426162,489664,1618208,1681809,1657692,1472438,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,0,All Sexes,A06,45-54,26884255,26964577,2167741,2018699,819433,817535,294776,336226,1114472,1156288,1220889,1120500,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,0,All Sexes,A07,55-64,22849464,22708762,1512431,1608930,489365,487505,192029,210639,681461,699737,938458,1058283,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,0,All Sexes,A08,65-99,9629468,9493784,871799,989501,182720,182037,78952,87166,261578,269590,644612,772765,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,1,Male,A00,All Ages (14-99),67393522,68970383,9401452,7574885,3163140,3157956,1234061,1304599,4397300,4469275,5803894,4211488,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,1,Male,A01,14-18,1653266,2231756,1040266,455069,153652,153267,71702,87339,225233,240437,852464,295624,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,1,Male,A02,19-21,2841975,3300903,1192875,697970,313018,312532,154558,138880,467178,451719,818153,372303,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,1,Male,A03,22-24,3591901,3765043,925670,726049,338493,338311,136603,149885,475049,488714,543667,371845,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,1,Male,A04,25-34,14510466,14727162,2252395,1973882,947605,946480,347244,371972,1295164,1320721,1203773,977790,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,1,Male,A05,35-44,14795109,14920814,1581988,1407432,630994,629922,224395,242441,855622,873988,874204,734570,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,1,Male,A06,45-54,13493358,13570733,1120013,1007039,422238,421482,153305,163202,575669,585877,642489,551700,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,1,Male,A07,55-64,11497625,11473464,805040,804782,258481,257634,103212,105779,361734,364184,508024,520026,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,1,Male,A08,65-99,5009822,4980508,483206,502662,98659,98328,43042,45100,141651,143634,361121,387630,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,2,Female,A00,All Ages (14-99),66442332,67343937,8752793,7569254,2961317,2952150,1157163,1355701,4118956,4314641,5233763,4331379,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,2,Female,A01,14-18,1939029,2498883,1073132,497487,175710,175081,85261,100132,260960,274925,852037,312795,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,2,Female,A02,19-21,3025976,3416639,1197306,746780,334332,333229,161821,151069,495880,484435,770802,390968,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,2,Female,A03,22-24,3696360,3765749,871317,769515,339189,338385,130958,167328,470257,506239,474556,405295,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,2,Female,A04,25-34,14088250,14150769,2026178,1898888,839297,836929,311160,369998,1150816,1209301,1060555,992262,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,2,Female,A05,35-44,14330335,14369479,1441148,1353936,560651,558894,201767,247223,762587,807821,783488,737868,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,2,Female,A06,45-54,13390897,13393844,1047728,1011661,397195,396053,141471,173024,538803,570411,578400,568799,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,2,Female,A07,55-64,11351839,11235298,707391,804148,230883,229870,88817,104860,319726,335553,430434,538257,1,1,1,1,1,1,1,1,1,1,1,1 +2022,2,2,Female,A08,65-99,4619646,4513276,388592,486839,84060,83709,35909,42066,119927,125956,283491,385135,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,0,All Sexes,A00,All Ages (14-99),136361150,136941015,17721873,16797094,6639483,6630891,2661435,2432797,9303317,9077269,10159070,9588436,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,0,All Sexes,A01,14-18,4204615,4280774,1653253,1554276,344519,343818,162615,221759,506539,565719,1263066,1175686,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,0,All Sexes,A02,19-21,6642856,6216964,1758616,2178766,677652,675703,286161,326462,963513,1002835,996682,1406980,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,0,All Sexes,A03,22-24,7451396,7632045,1879974,1657589,733694,734498,321742,271445,1055426,1007379,1049481,869161,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,0,All Sexes,A04,25-34,28820354,29252772,4583198,4038522,1961217,1959586,751094,643980,2713699,2608250,2376065,1955461,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,0,All Sexes,A05,35-44,29314858,29664566,3255028,2823789,1315622,1313890,494240,419872,1810864,1736891,1749645,1411333,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,0,All Sexes,A06,45-54,27050899,27236592,2266881,2030049,891419,889696,339731,287479,1231830,1179385,1240197,1062689,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,0,All Sexes,A07,55-64,22958086,22877102,1500515,1558636,519478,518270,215432,184118,735170,703438,895844,981094,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,0,All Sexes,A08,65-99,9918085,9780202,824408,955467,195881,195431,90419,77683,286277,273372,588090,726033,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,1,Male,A00,All Ages (14-99),68998603,69128329,8711003,8443229,3311422,3305452,1306153,1225587,4618326,4537386,5012034,4884964,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,1,Male,A01,14-18,1979356,2009810,787356,747004,154680,154457,75086,101068,229500,255533,613924,577654,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,1,Male,A02,19-21,3254614,3033493,851948,1069143,321213,320405,138529,157534,459576,478177,498194,710796,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,1,Male,A03,22-24,3722243,3794046,903948,818115,352214,352303,151161,135399,503305,488297,514207,442301,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,1,Male,A04,25-34,14690674,14873887,2278696,2048620,1000562,999036,376286,333808,1377351,1335121,1173658,995902,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,1,Male,A05,35-44,14942940,15069914,1603767,1444721,669328,668054,245231,216373,914969,885930,854191,732415,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,1,Male,A06,45-54,13613897,13677528,1105097,1022742,442886,441686,164785,145257,607928,588002,606057,546460,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,1,Male,A07,55-64,11598582,11550359,754153,793041,266511,265790,108282,95176,374901,361485,450102,500555,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,1,Male,A08,65-99,5196296,5119293,426039,499843,104029,103721,46792,40973,150795,144840,301700,378880,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,2,Female,A00,All Ages (14-99),67362548,67812686,9010870,8353865,3328061,3325439,1355282,1207210,4684991,4539883,5147036,4703472,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,2,Female,A01,14-18,2225259,2270964,865897,807272,189839,189361,87529,120691,277039,310186,649142,598032,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,2,Female,A02,19-21,3388242,3183470,906668,1109623,356439,355298,147631,168928,503936,524658,498487,696183,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,2,Female,A03,22-24,3729153,3837999,976025,839474,381480,382194,170581,136046,552121,519082,535275,426860,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,2,Female,A04,25-34,14129679,14378886,2304502,1989902,960655,960551,374809,310172,1336348,1273129,1202407,959559,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,2,Female,A05,35-44,14371919,14594651,1651261,1379068,646294,645836,249008,203499,895895,850961,895454,678918,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,2,Female,A06,45-54,13437001,13559064,1161784,1007307,448534,448010,174946,142222,623902,591383,634140,516229,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,2,Female,A07,55-64,11359504,11326743,746362,765595,252967,252479,107150,88942,360269,341952,445742,480538,1,1,1,1,1,1,1,1,1,1,1,1 +2022,3,2,Female,A08,65-99,4721790,4660908,398370,455624,91852,91710,43627,36711,135481,128532,286389,347153,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,0,All Sexes,A00,All Ages (14-99),136975593,136725995,14627073,14648900,5211592,5208734,2429033,2400428,7646685,7610763,8634782,8892923,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,0,All Sexes,A01,14-18,3867361,4179301,1287768,949218,265510,265465,194147,152061,459803,416689,976873,661198,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,0,All Sexes,A02,19-21,6065428,6176097,1492608,1342753,507608,507446,327436,250078,835538,756726,904690,790279,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,0,All Sexes,A03,22-24,7539775,7605367,1436529,1335435,557620,557945,275606,255110,833811,812911,801296,733347,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,0,All Sexes,A04,25-34,29179009,29202415,3739453,3646591,1540960,1540422,650451,650576,2193389,2191948,2001250,1980042,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,0,All Sexes,A05,35-44,29693843,29692496,2714589,2676764,1042012,1040890,423569,453080,1466848,1494830,1516780,1527291,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,0,All Sexes,A06,45-54,27318435,27208376,1909713,2002031,711194,710600,290268,329578,1002360,1041069,1085976,1203583,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,0,All Sexes,A07,55-64,23118101,22802786,1299841,1615451,422365,421783,187481,221290,610379,643668,803449,1123290,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,0,All Sexes,A08,65-99,10193640,9859157,746573,1080658,164324,164182,80075,88654,244556,252922,544468,873894,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,1,Male,A00,All Ages (14-99),69121306,68673557,7226217,7600809,2639460,2638206,1224995,1257553,3867119,3896517,4266136,4712225,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,1,Male,A01,14-18,1809244,1951697,609854,457145,119472,119540,88252,70628,207768,189803,472836,327943,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,1,Male,A02,19-21,2956320,2997374,723464,667030,245058,245095,157316,125414,402569,370152,448141,403970,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,1,Male,A03,22-24,3740572,3756323,705403,675968,274846,274929,137218,131881,412329,406724,399945,382461,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,1,Male,A04,25-34,14824735,14777867,1883310,1904316,798993,798895,337295,346750,1137171,1146084,1002452,1048518,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,1,Male,A05,35-44,15086744,15013899,1346173,1408899,536919,536469,218688,242301,756168,779127,745121,822118,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,1,Male,A06,45-54,13711573,13603250,935005,1041414,358097,357702,146940,173565,505441,531709,531096,643266,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,1,Male,A07,55-64,11664978,11460224,646521,855027,218258,217902,97024,118646,315510,336831,396487,603403,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,1,Male,A08,65-99,5327140,5112922,376487,591010,87817,87674,42262,48369,130162,136087,270059,480545,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,2,Female,A00,All Ages (14-99),67854286,68052439,7400856,7048091,2572132,2570528,1204038,1142875,3779566,3714245,4368646,4180699,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,2,Female,A01,14-18,2058117,2227604,677914,492073,146037,145925,105895,81433,252035,226886,504037,333254,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,2,Female,A02,19-21,3109108,3178724,769143,675723,262550,262351,170120,124664,432969,386573,456549,386309,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,2,Female,A03,22-24,3799203,3849044,731126,659467,282774,283016,138388,123230,421482,406187,401351,350887,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,2,Female,A04,25-34,14354274,14424548,1856143,1742275,741968,741528,313156,303827,1056218,1045864,998798,931524,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,2,Female,A05,35-44,14607100,14678597,1368416,1267865,505092,504422,204881,210779,710680,715703,771659,705173,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,2,Female,A06,45-54,13606862,13605126,974708,960616,353096,352898,143328,156013,496920,509360,554880,560316,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,2,Female,A07,55-64,11453123,11342561,653320,760424,204107,203881,90457,102643,294868,306836,406962,519887,1,1,1,1,1,1,1,1,1,1,1,1 +2022,4,2,Female,A08,65-99,4866500,4746235,370085,489648,76507,76508,37813,40286,114393,116835,274409,393348,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,0,All Sexes,A00,All Ages (14-99),136746613,137385499,14274016,13266327,4886661,4882196,2397975,2305247,7291302,7193561,8591094,7926731,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,0,All Sexes,A01,14-18,3777412,4142628,1171872,776856,223219,222590,134391,172807,357932,395139,902769,537651,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,0,All Sexes,A02,19-21,6052342,6218934,1478352,1259994,478897,478040,246677,297555,726000,775595,914525,745350,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,0,All Sexes,A03,22-24,7499688,7629265,1411649,1235002,525947,525858,256269,249181,782729,775471,803493,671686,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,0,All Sexes,A04,25-34,29134021,29263539,3606423,3381680,1435596,1434817,655752,625028,2093099,2062083,1972370,1836844,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,0,All Sexes,A05,35-44,29724476,29859881,2666418,2460848,980975,980261,456700,413269,1439119,1395239,1528332,1387282,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,0,All Sexes,A06,45-54,27280946,27347421,1922238,1810300,680413,679933,331757,285058,1013284,966177,1126818,1056327,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,0,All Sexes,A07,55-64,23029216,22882755,1309090,1433845,406304,405734,224727,183883,631836,590278,827752,970911,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,0,All Sexes,A08,65-99,10248511,10041074,707974,907803,155309,154963,91703,78467,247303,233580,515035,720678,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,1,Male,A00,All Ages (14-99),68675982,68976568,7232503,6785031,2502144,2499145,1257699,1202006,3763439,3704737,4395340,4081233,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,1,Male,A01,14-18,1755558,1934376,558052,367450,99321,99151,61747,81175,161177,180228,440655,261561,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,1,Male,A02,19-21,2935976,3025096,726141,616944,232977,232629,123952,147553,357119,380279,460471,369735,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,1,Male,A03,22-24,3697452,3773994,709664,613986,261348,261190,132124,129131,393694,390567,415366,337420,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,1,Male,A04,25-34,14733656,14815182,1857809,1736636,752483,751897,349557,331746,1103010,1084934,1020963,936318,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,1,Male,A05,35-44,15036608,15092117,1364447,1280759,512354,511676,244677,219907,757874,732539,784968,726764,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,1,Male,A06,45-54,13636495,13655174,971687,935938,347822,347370,174946,150058,523434,498063,575563,554913,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,1,Male,A07,55-64,11571024,11482665,672718,753096,213035,212642,120609,99686,334090,312694,426791,513515,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,1,Male,A08,65-99,5309213,5197965,371985,480221,82804,82591,50087,42751,133040,125433,270565,381007,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,2,Female,A00,All Ages (14-99),68070631,68408931,7041513,6481296,2384516,2383051,1140276,1103241,3527864,3488824,4195754,3845498,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,2,Female,A01,14-18,2021854,2208252,613820,409406,123898,123439,72643,91632,196755,214911,462115,276091,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,2,Female,A02,19-21,3116366,3193838,752211,643050,245920,245411,122725,150002,368881,395316,454055,375615,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,2,Female,A03,22-24,3802236,3855271,701985,621016,264599,264668,124145,120050,389035,384904,388127,334266,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,2,Female,A04,25-34,14400366,14448357,1748613,1645043,683113,682919,306195,293282,990089,977149,951407,900526,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,2,Female,A05,35-44,14687868,14767765,1301971,1180088,468621,468585,212023,193362,681245,662701,743364,660518,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,2,Female,A06,45-54,13644451,13692248,950551,874362,332591,332564,156811,135000,489850,468113,551255,501414,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,2,Female,A07,55-64,11458192,11400091,636373,680748,193270,193093,104118,84197,297746,277584,400961,457397,1,1,1,1,1,1,1,1,1,1,1,1 +2023,1,2,Female,A08,65-99,4939298,4843109,335989,427582,72505,72372,41616,35715,114263,108146,244470,339671,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,0,All Sexes,A00,All Ages (14-99),137335107,139059159,16784274,14582907,5373086,5364483,2308903,2485163,7688516,7863966,10474727,8706622,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,0,All Sexes,A01,14-18,3719954,4857168,2078724,909707,307870,307949,149466,166146,457991,474401,1684408,585867,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,0,All Sexes,A02,19-21,6095955,6931010,2324162,1373825,598446,598419,299700,262519,898857,862096,1556978,738884,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,0,All Sexes,A03,22-24,7513723,7695470,1656436,1418353,603025,602390,253064,294438,856946,898290,956943,773148,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,0,All Sexes,A04,25-34,29189680,29274270,3809308,3625456,1517787,1515248,632676,687944,2152316,2207532,2092909,1987490,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,0,All Sexes,A05,35-44,29893856,29897016,2736150,2658995,1029462,1027645,417497,464320,1448088,1495025,1552857,1525725,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,0,All Sexes,A06,45-54,27386112,27338710,1968548,1964210,712950,711195,287910,320533,1001545,1033920,1142888,1168990,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,0,All Sexes,A07,55-64,23109924,22874788,1374295,1576076,429333,427958,187676,202150,617433,631449,869260,1082286,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,0,All Sexes,A08,65-99,10425903,10190726,836652,1056285,174213,173679,80914,87113,255339,261252,618484,844233,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,1,Male,A00,All Ages (14-99),68973625,70178337,8734906,7311275,2778170,2774633,1205414,1224708,3986261,4005246,5549980,4319051,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,1,Male,A01,14-18,1728844,2305409,1028168,439993,145997,146149,69813,78259,216112,224533,844614,287551,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,1,Male,A02,19-21,2963930,3414594,1160378,665196,289865,289901,148244,126894,438310,417240,802861,361898,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,1,Male,A03,22-24,3709443,3851335,856409,688913,301536,301261,130938,139093,432782,440906,513459,371313,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,1,Male,A04,25-34,14775324,14898145,2014758,1844374,805152,804157,336174,346033,1142110,1152008,1123095,988716,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,1,Male,A05,35-44,15121191,15170025,1442375,1357433,545055,544253,222505,231672,768063,777235,830110,766926,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,1,Male,A06,45-54,13680526,13691441,1025960,988635,368325,367585,151876,156467,520491,524936,609157,584776,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,1,Male,A07,55-64,11600416,11526513,737948,793470,228005,227375,101741,101559,329931,329493,475392,536972,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,1,Male,A08,65-99,5393952,5320874,468909,533260,94235,93952,44122,44732,138462,138896,351292,420899,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,2,Female,A00,All Ages (14-99),68361481,68880821,8049368,7271632,2594916,2589850,1103489,1260455,3702255,3858720,4924747,4387571,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,2,Female,A01,14-18,1991110,2551759,1050556,469715,161873,161800,79652,87888,241879,249869,839794,298316,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,2,Female,A02,19-21,3132026,3516416,1163784,708629,308581,308519,151455,135625,460547,444856,754117,376986,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,2,Female,A03,22-24,3804280,3844135,800027,729439,301489,301129,122126,155344,424164,457384,443484,401834,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,2,Female,A04,25-34,14414356,14376124,1794549,1781082,712635,711091,296502,341912,1010206,1055524,969814,998774,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,2,Female,A05,35-44,14772665,14726991,1293775,1301562,484407,483392,194992,232648,680026,717791,722747,758799,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,2,Female,A06,45-54,13705585,13647270,942589,975575,344625,343610,136033,164067,481054,508985,533731,584214,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,2,Female,A07,55-64,11509508,11348275,636346,782606,201328,200583,85935,100591,287502,301956,393868,545314,1,1,1,1,1,1,1,1,1,1,1,1 +2023,2,2,Female,A08,65-99,5031951,4869852,367743,523025,79978,79727,36792,42381,116877,122356,267192,423334,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,0,All Sexes,A00,All Ages (14-99),139078623,138987058,15911419,15744414,5617879,5606683,2487343,2290452,8118969,7909362,9413858,9507936,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,0,All Sexes,A01,14-18,4331296,4277399,1497216,1526801,304048,303462,144740,204577,449945,508408,1142288,1180079,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,0,All Sexes,A02,19-21,6843757,6340713,1583151,2097239,588015,586081,257714,300835,847541,887651,910333,1396494,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,0,All Sexes,A03,22-24,7610861,7728626,1684401,1529998,626481,626496,298331,254639,926220,882408,964174,844832,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,0,All Sexes,A04,25-34,29187850,29496890,4037536,3636390,1621518,1618286,696596,601593,2321936,2223724,2191945,1892705,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,0,All Sexes,A05,35-44,29941227,30193096,2927025,2612085,1102674,1100470,469066,399808,1574183,1503072,1647636,1407697,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,0,All Sexes,A06,45-54,27418714,27535148,2059304,1904373,752774,751264,324117,276633,1078611,1029812,1178133,1071049,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,0,All Sexes,A07,55-64,23129770,23001073,1362278,1478890,444792,443514,206565,175902,652385,620441,836796,971924,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,0,All Sexes,A08,65-99,10615148,10414112,760508,958637,177576,177110,90214,76466,268147,253846,542552,743155,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,1,Male,A00,All Ages (14-99),70186038,70004806,7857054,7946100,2807151,2800219,1227322,1162168,4041041,3968127,4679471,4867955,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,1,Male,A01,14-18,2051190,2013954,713221,739830,138672,138514,67653,93830,206826,232514,553715,582437,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,1,Male,A02,19-21,3363244,3103770,769688,1032135,280955,280200,125978,145014,407790,425530,455535,705718,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,1,Male,A03,22-24,3805912,3846324,806791,754307,299521,299188,140169,127123,440381,426868,470615,429342,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,1,Male,A04,25-34,14848375,14980106,2014036,1846955,828083,825864,350390,313348,1180383,1141051,1091575,966127,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,1,Male,A05,35-44,15198846,15288620,1454540,1342221,561579,560041,234594,208694,797377,770060,817863,735567,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,1,Male,A06,45-54,13730988,13766936,1014984,967356,375542,374656,158298,141898,534593,517427,585237,556083,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,1,Male,A07,55-64,11652119,11579800,690140,760045,228951,228175,103869,92087,333290,320777,425406,502723,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,1,Male,A08,65-99,5535363,5425297,393654,503252,93848,93579,46370,40174,140400,133900,279524,389958,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,2,Female,A00,All Ages (14-99),68892585,68982252,8054365,7798314,2810728,2806464,1260021,1128284,4077927,3941235,4734387,4639981,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,2,Female,A01,14-18,2280105,2263446,783994,786971,165376,164948,77087,110747,243119,275895,588573,597642,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,2,Female,A02,19-21,3480513,3236943,813464,1065105,307060,305881,131736,155820,439751,462121,454799,690776,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,2,Female,A03,22-24,3804948,3882302,877610,775691,326960,327308,158162,127515,485839,455540,493559,415490,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,2,Female,A04,25-34,14339475,14516784,2023500,1789435,793435,792421,346205,288244,1141552,1082672,1100370,926578,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,2,Female,A05,35-44,14742381,14904476,1472485,1269864,541095,540429,234472,191114,776806,733012,829773,672130,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,2,Female,A06,45-54,13687726,13768213,1044319,937017,377232,376608,165819,134735,544017,512385,592896,514966,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,2,Female,A07,55-64,11477651,11421274,672138,718845,215841,215339,102696,83816,319095,299663,411390,469201,1,1,1,1,1,1,1,1,1,1,1,1 +2023,3,2,Female,A08,65-99,5079785,4988815,366854,455385,83729,83530,43844,36292,127748,119946,263028,353197,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,0,All Sexes,A00,All Ages (14-99),138999073,138597200,13792226,13979846,4675108,4664961,2285554,2226537,6963807,6898045,8354253,8774925,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,0,All Sexes,A01,14-18,3855217,4138831,1191409,881753,233823,233433,178866,133833,413192,367036,911440,625908,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,0,All Sexes,A02,19-21,6197393,6294834,1396618,1259165,455897,454940,301981,226187,758407,681348,858886,759100,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,0,All Sexes,A03,22-24,7622461,7690811,1351590,1247281,500123,499573,257502,232480,757936,732637,774566,704796,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,0,All Sexes,A04,25-34,29409687,29411069,3490909,3423090,1369510,1366653,607188,599866,1977332,1968738,1933352,1936058,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,0,All Sexes,A05,35-44,30218005,30175702,2570881,2577023,938443,935726,402982,428627,1341937,1366022,1482895,1533982,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,0,All Sexes,A06,45-54,27610694,27477479,1819878,1938172,642623,640957,279040,311830,921917,953979,1067995,1209646,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,0,All Sexes,A07,55-64,23249162,22914719,1228120,1566230,379663,378912,179208,207616,559115,587203,776919,1117412,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,0,All Sexes,A08,65-99,10836454,10493754,742822,1087130,155028,154767,78787,86098,233972,241082,548199,888023,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,1,Male,A00,All Ages (14-99),69981712,69457202,6841669,7305007,2375620,2370862,1161394,1181345,3539242,3555078,4149840,4685297,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,1,Male,A01,14-18,1808053,1932596,561859,426897,105621,105541,81718,63248,187574,168712,438091,311706,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,1,Male,A02,19-21,3031952,3064969,678720,630402,221627,221332,144955,114787,366887,336267,425847,390521,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,1,Male,A03,22-24,3785152,3801778,663631,633837,246473,246188,128430,121024,375157,367477,386677,369209,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,1,Male,A04,25-34,14924518,14872836,1769200,1797786,712571,711349,316619,324491,1029757,1036792,977635,1031573,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,1,Male,A05,35-44,15302111,15217922,1287572,1363824,485423,483948,210909,232002,696684,716643,740250,830071,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,1,Male,A06,45-54,13796219,13677964,897906,1016852,324733,323849,143303,166095,468275,490416,528199,652655,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,1,Male,A07,55-64,11696801,11478943,613246,837074,196875,196478,94012,112874,291062,309646,385059,607241,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,1,Male,A08,65-99,5636906,5410193,369536,598335,82297,82178,41448,46824,123845,129125,268081,492321,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,2,Female,A00,All Ages (14-99),69017361,69139998,6950557,6674839,2299489,2294100,1124160,1045192,3424565,3342967,4204414,4089627,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,2,Female,A01,14-18,2047164,2206235,629551,454857,128202,127893,97148,70586,225618,198324,473349,314201,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,2,Female,A02,19-21,3165440,3229865,717898,628762,234270,233609,157027,111399,391519,345081,433039,368579,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,2,Female,A03,22-24,3837309,3889033,687959,613444,253650,253385,129072,111456,382779,365160,387889,335586,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,2,Female,A04,25-34,14485169,14538233,1721709,1625304,656938,655305,290569,275375,947575,931946,955718,904485,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,2,Female,A05,35-44,14915894,14957780,1283308,1213199,453020,451777,192073,196625,645253,649379,742646,703911,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,2,Female,A06,45-54,13814474,13799516,921972,921321,317890,317108,135737,145736,453642,463563,539795,556991,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,2,Female,A07,55-64,11552361,11435776,614874,729156,182788,182435,85196,94742,268053,277557,391860,510171,1,1,1,1,1,1,1,1,1,1,1,1 +2023,4,2,Female,A08,65-99,5199548,5083561,373286,488796,72731,72590,37339,39274,110127,111957,280117,395702,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,0,All Sexes,A00,All Ages (14-99),138538071,139123122,13537429,12633253,4422854,4408874,2226558,2160343,6655759,6570917,8333197,7756197,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,0,All Sexes,A01,14-18,3730408,4055144,1056055,703486,191741,190638,117660,154230,309437,345496,819756,495435,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,0,All Sexes,A02,19-21,6160350,6316772,1375524,1168712,421976,420152,223427,274461,645629,695265,867816,710567,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,0,All Sexes,A03,22-24,7585786,7708478,1317689,1150119,472112,470714,233775,229805,706296,700775,764185,641506,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,0,All Sexes,A04,25-34,29305332,29442757,3391081,3171876,1292907,1289486,604750,581795,1899518,1871358,1909872,1773238,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,0,All Sexes,A05,35-44,30185988,30329411,2566618,2365195,900139,897310,431923,397089,1333630,1294485,1513413,1372186,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,0,All Sexes,A06,45-54,27535428,27620395,1862563,1740145,624153,622660,314417,273390,939742,896087,1124440,1041803,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,0,All Sexes,A07,55-64,23140886,23001900,1264008,1387370,372876,371537,211498,173075,585165,544541,816040,957477,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,0,All Sexes,A08,65-99,10893892,10648264,703890,946350,146950,146377,89108,76498,236343,222911,517674,763985,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,1,Male,A00,All Ages (14-99),69419853,69800114,6959935,6451719,2276429,2268836,1183331,1134597,3464183,3404343,4345286,3976554,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,1,Male,A01,14-18,1733430,1894645,505752,333652,85534,85151,54989,72088,140579,157522,402443,241171,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,1,Male,A02,19-21,2997116,3084804,680272,572717,205791,205046,113896,136630,319934,341956,440831,352582,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,1,Male,A03,22-24,3743512,3819589,667059,573013,234944,234108,121454,119519,356732,353770,398838,323071,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,1,Male,A04,25-34,14811577,14925711,1778191,1628421,681101,679187,327347,312781,1009731,992047,1014148,902145,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,1,Male,A05,35-44,15228273,15316602,1340779,1228380,473467,471800,234103,213400,708630,685266,799531,714217,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,1,Male,A06,45-54,13706522,13756734,960347,896406,321581,320720,167825,144889,490146,465635,589440,542064,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,1,Male,A07,55-64,11589096,11521060,659075,722403,195661,194830,115130,93926,311329,288753,429681,500716,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,1,Male,A08,65-99,5610327,5480968,368460,496727,78349,77994,48587,41363,127101,119394,270376,400587,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,2,Female,A00,All Ages (14-99),69118219,69323008,6577494,6181534,2146425,2140038,1043227,1025746,3191576,3166575,3987910,3779643,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,2,Female,A01,14-18,1996978,2160499,550303,369833,106207,105486,62671,82141,168858,187974,417313,254263,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,2,Female,A02,19-21,3163234,3231968,695252,595995,216185,215105,109531,137832,325695,353309,426985,357985,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,2,Female,A03,22-24,3842274,3888889,650631,577106,237168,236607,112320,110286,349564,347004,365348,318435,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,2,Female,A04,25-34,14493755,14517046,1612891,1543454,611806,610299,277404,269014,889787,879311,895724,871094,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,2,Female,A05,35-44,14957715,15012809,1225839,1136814,426672,425510,197819,183689,624999,609219,713883,657969,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,2,Female,A06,45-54,13828907,13863660,902217,843739,302572,301940,146592,128501,449596,430451,535001,499738,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,2,Female,A07,55-64,11551790,11480841,604932,664967,177215,176707,96368,79149,273836,255789,386359,456761,1,1,1,1,1,1,1,1,1,1,1,1 +2024,1,2,Female,A08,65-99,5283565,5167297,335430,449624,68601,68384,40521,35135,109241,103517,247298,363398,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,0,All Sexes,A00,All Ages (14-99),139021617,140761138,16091182,13892783,4973278,4969669,2164235,2326674,7138956,7296308,10168510,8406162,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,0,All Sexes,A01,14-18,3614682,4675282,1922188,821798,270754,271096,132440,144475,403532,414832,1558997,533411,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,0,All Sexes,A02,19-21,6200064,7041166,2261784,1296545,555437,555688,277251,241154,832870,796240,1527269,702188,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,0,All Sexes,A03,22-24,7598440,7784121,1579244,1337845,557583,557410,233422,274187,791409,831283,922810,736022,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,0,All Sexes,A04,25-34,29333884,29482665,3631944,3391531,1399993,1399101,587718,640760,1988163,2040404,2037862,1874057,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,0,All Sexes,A05,35-44,30343150,30394789,2655626,2536874,960584,959731,401590,441910,1362204,1402148,1542351,1472433,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,0,All Sexes,A06,45-54,27669025,27648443,1907131,1883738,665495,664543,276386,307785,941936,972758,1129163,1134703,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,0,All Sexes,A07,55-64,23222376,22978017,1308044,1526573,396163,395258,176563,191581,572690,587007,837234,1064729,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,0,All Sexes,A08,65-99,11039996,10756654,825221,1097878,167267,166842,78866,84822,246151,251636,612823,888618,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,1,Male,A00,All Ages (14-99),69768541,70982351,8435636,7003565,2594095,2593776,1137940,1158198,3733604,3750880,5424513,4188324,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,1,Male,A01,14-18,1680113,2215654,949474,398745,128990,129311,61480,68000,190646,196949,780740,262653,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,1,Male,A02,19-21,3026630,3478135,1132073,632125,271170,271541,137476,117105,408818,388312,788944,345891,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,1,Male,A03,22-24,3757630,3899551,819067,650929,279225,279354,121423,129870,400913,408976,496728,354351,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,1,Male,A04,25-34,14867868,15028872,1948334,1741239,750842,751029,316039,326936,1067412,1077904,1110612,939470,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,1,Male,A05,35-44,15336583,15416217,1419937,1305290,514695,514442,216200,223284,731109,737696,837184,744894,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,1,Male,A06,45-54,13785927,13811241,1005045,955220,348194,347774,146652,152795,495005,500590,607566,570650,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,1,Male,A07,55-64,11634271,11553859,704574,769001,211104,210725,95942,96918,307080,307605,459169,529109,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,1,Male,A08,65-99,5679520,5578822,457131,551016,89875,89599,42729,43290,132622,132849,343570,441307,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,2,Female,A00,All Ages (14-99),69253077,69778787,7655547,6889218,2379183,2375894,1026294,1168476,3405352,3545428,4743997,4217838,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,2,Female,A01,14-18,1934568,2459628,972714,423054,141764,141785,70960,76475,212886,217883,778257,270758,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,2,Female,A02,19-21,3173435,3563031,1129711,664420,284268,284146,139775,124049,424052,407929,738325,356297,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,2,Female,A03,22-24,3840810,3884570,760177,686916,278358,278056,111999,144317,390497,422306,426082,381671,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,2,Female,A04,25-34,14466016,14453793,1683610,1650293,649151,648072,271678,313823,920751,962501,927251,934587,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,2,Female,A05,35-44,15006567,14978573,1235688,1231584,445890,445289,185390,218627,631095,664452,705167,727539,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,2,Female,A06,45-54,13883098,13837202,902086,928518,317300,316769,129734,154989,446931,472168,521597,564054,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,2,Female,A07,55-64,11588105,11424158,603470,757572,185059,184533,80621,94663,265610,279402,378065,535620,1,1,1,1,1,1,1,1,1,1,1,1 +2024,2,2,Female,A08,65-99,5360477,5177832,368090,546862,77392,77242,36137,41532,113529,118787,269253,447311,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,0,All Sexes,A00,All Ages (14-99),140665276,140512717,15118042,15097348,5231372,5220420,2325836,2164117,7557515,7391015,9061289,9260824,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,0,All Sexes,A01,14-18,4141514,4079211,1373193,1414161,270637,269916,124468,182751,394932,452312,1056475,1102188,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,0,All Sexes,A02,19-21,6925205,6419394,1508503,2033619,543571,541282,235601,286747,779041,828072,883285,1374818,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,0,All Sexes,A03,22-24,7698501,7809974,1600984,1456396,580999,580934,277730,239280,858594,820867,929725,817838,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,0,All Sexes,A04,25-34,29356679,29680683,3832098,3434202,1509357,1507056,647102,564889,2156883,2074485,2115754,1810074,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,0,All Sexes,A05,35-44,30412588,30671218,2813615,2510465,1038832,1036502,446070,383939,1485130,1422190,1609713,1372942,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,0,All Sexes,A06,45-54,27720496,27839190,1974192,1832508,706743,705233,311334,265300,1018227,971694,1147226,1047695,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,0,All Sexes,A07,55-64,23221186,23068634,1279699,1432638,411219,410064,195798,166235,607043,576839,793403,960838,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,0,All Sexes,A08,65-99,11189108,10944413,735757,983360,170013,169433,87733,74977,257664,244558,525708,774431,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,1,Male,A00,All Ages (14-99),70935011,70763746,7522945,7640094,2630092,2623709,1158553,1107968,3789503,3734396,4543916,4747314,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,1,Male,A01,14-18,1958384,1918659,654283,684112,123108,122860,58089,83862,181169,206546,512212,543335,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,1,Male,A02,19-21,3411431,3150270,734293,1001679,260331,259351,115474,139504,375862,398888,442121,695768,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,1,Male,A03,22-24,3853204,3894432,769876,718632,278256,277937,130674,119925,408982,398129,456641,415363,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,1,Male,A04,25-34,14957597,15111137,1934933,1753689,777787,776228,330106,297927,1108285,1075266,1068849,926471,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,1,Male,A05,35-44,15437137,15542234,1417596,1297989,535007,533608,225725,202720,760960,737077,811491,719108,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,1,Male,A06,45-54,13846617,13889950,981930,934211,354307,353357,154712,137541,509150,491348,577079,545804,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,1,Male,A07,55-64,11672798,11590816,649392,734962,211675,211062,98984,87281,310710,298556,404360,495873,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,1,Male,A08,65-99,5797843,5666248,380642,514820,89622,89306,44788,39208,134384,128587,271163,405592,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,2,Female,A00,All Ages (14-99),69730265,69748971,7595097,7457254,2601280,2596711,1167283,1056149,3768012,3656619,4517373,4513510,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,2,Female,A01,14-18,2183130,2160551,718910,730048,147530,147056,66379,98889,213763,245766,544263,558854,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,2,Female,A02,19-21,3513774,3269125,774210,1031940,283240,281932,120127,147243,403179,429184,441164,679050,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,2,Female,A03,22-24,3845297,3915542,831108,737764,302744,302997,147056,119354,449612,422738,473084,402475,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,2,Female,A04,25-34,14399082,14569546,1897165,1680514,731570,730828,316997,266962,1048598,999219,1046905,883604,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,2,Female,A05,35-44,14975451,15128984,1396020,1212476,503825,502894,220344,181218,724170,685113,798222,653834,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,2,Female,A06,45-54,13873878,13949240,992261,898297,352436,351877,156622,127759,509077,480346,570147,501891,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,2,Female,A07,55-64,11548388,11477818,630307,697676,199544,199001,96814,78954,296333,278282,389043,464965,1,1,1,1,1,1,1,1,1,1,1,1 +2024,3,2,Female,A08,65-99,5391265,5278165,355115,468540,80391,80127,42945,35769,123281,115971,254545,368839,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,0,All Sexes,A00,All Ages (14-99),140499545,139978638,13358600,13685550,4432200,4422366,2163425,2077001,6596096,6500693,8179380,8708948,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,0,All Sexes,A01,14-18,3666671,3971178,1122444,790760,209606,208593,159894,112954,369413,321648,868851,560330,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,0,All Sexes,A02,19-21,6247914,6386829,1368727,1189333,425256,424120,288392,204499,713738,628579,861705,720119,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,0,All Sexes,A03,22-24,7709283,7798172,1308799,1183604,469775,469073,242154,210530,712040,679677,762266,672141,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,0,All Sexes,A04,25-34,29565203,29579001,3363819,3287914,1296826,1294371,570173,553921,1867232,1848640,1885292,1875551,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,0,All Sexes,A05,35-44,30696374,30616292,2513148,2562635,904399,902345,387772,411576,1292254,1314307,1461851,1548560,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,0,All Sexes,A06,45-54,27914068,27735171,1772601,1942118,615875,614398,268169,301538,884145,916219,1049653,1235425,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,0,All Sexes,A07,55-64,23329313,22935077,1177863,1579805,359115,358401,169562,198369,528687,556941,749266,1147294,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,0,All Sexes,A08,65-99,11370719,10956917,731198,1149381,151348,151065,77309,83614,228585,234682,540497,949529,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,1,Male,A00,All Ages (14-99),70719124,70163419,6690647,7195747,2275542,2269574,1108919,1109515,3384012,3380611,4101156,4669279,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,1,Male,A01,14-18,1716388,1851235,531011,385392,95001,94591,73108,53654,168063,148305,418930,281307,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,1,Male,A02,19-21,3064410,3119511,670179,599861,208572,208165,139903,104840,348516,313052,430314,373255,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,1,Male,A03,22-24,3835529,3865980,647465,603622,232992,232503,121127,110077,354135,342717,383779,352844,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,1,Male,A04,25-34,15039222,15004176,1725101,1738577,682460,680753,300811,301699,983173,982862,964701,1004086,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,1,Male,A05,35-44,15555421,15456210,1275441,1369501,474267,472942,205190,224017,679317,697344,738744,843821,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,1,Male,A06,45-54,13917395,13781039,886807,1026913,315085,314102,139169,161952,454159,476328,526841,669771,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,1,Male,A07,55-64,11711529,11466324,591369,844777,187051,186576,89139,108022,276119,294785,373909,622889,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,1,Male,A08,65-99,5879230,5618944,363275,627105,80112,79942,40471,45254,120530,125218,263938,521306,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,2,Female,A00,All Ages (14-99),69780421,69815219,6667952,6489803,2156659,2152792,1054507,967486,3212084,3120083,4078225,4039669,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,2,Female,A01,14-18,1950283,2119943,591433,405368,114605,114002,86786,59300,201350,173343,449921,279023,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,2,Female,A02,19-21,3183504,3267318,698548,589472,216684,215955,148489,99659,365222,315527,431391,346865,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,2,Female,A03,22-24,3873754,3932192,661334,579982,236783,236570,121027,100453,357905,336960,378487,319296,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,2,Female,A04,25-34,14525980,14574824,1638718,1549337,614366,613617,269362,252222,884059,865778,920591,871464,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,2,Female,A05,35-44,15140953,15160082,1237707,1193133,430132,429403,182582,187559,612937,616963,723108,704738,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,2,Female,A06,45-54,13996673,13954132,885794,915206,300790,300296,129000,139586,429986,439892,522812,565655,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,2,Female,A07,55-64,11617784,11468753,586495,735029,172064,171825,80423,90347,252568,262156,375357,524405,1,1,1,1,1,1,1,1,1,1,1,1 +2024,4,2,Female,A08,65-99,5491489,5337974,367923,522276,71235,71123,36838,38360,108056,109464,276559,428223,1,1,1,1,1,1,1,1,1,1,1,1 +2025,1,0,All Sexes,A00,All Ages (14-99),139836605,140000341,12770341,12263417,4193521,4182606,2076610,,6272897,,7809750,7599959,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,0,All Sexes,A01,14-18,3559170,3861467,959716,625100,167327,166709,98681,,266035,,747820,441643,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,0,All Sexes,A02,19-21,6238093,6385414,1322292,1118240,393327,392162,201735,,595206,,840265,687165,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,0,All Sexes,A03,22-24,7669603,7769257,1243054,1094496,440527,439536,211190,,651956,,720516,616584,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,0,All Sexes,A04,25-34,29448857,29499238,3183860,3045167,1221088,1218522,558071,,1779866,,1779603,1716984,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,0,All Sexes,A05,35-44,30615858,30691563,2451922,2315478,869251,867011,414537,,1284375,,1433190,1348860,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,0,All Sexes,A06,45-54,27782732,27811074,1778129,1710097,601777,600192,303847,,906129,,1065758,1031427,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,0,All Sexes,A07,55-64,23161829,22954810,1175757,1368788,354996,353872,202162,,557520,,750048,954661,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,0,All Sexes,A08,65-99,11360464,11027518,655611,986050,145227,144602,86386,,231810,,472550,802635,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,1,Male,A00,All Ages (14-99),70052658,70187803,6595499,6321035,2190786,2184143,1110032,,3303290,,4072701,3922019,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,1,Male,A01,14-18,1649773,1802986,462721,295869,75136,74950,46307,,121503,,369452,213897,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,1,Male,A02,19-21,3042811,3123352,656922,553437,194836,194285,103614,,298639,,427433,343698,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,1,Male,A03,22-24,3791812,3855549,632834,548888,222241,221647,110284,,332746,,376929,311282,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,1,Male,A04,25-34,14923484,14982886,1680405,1582249,654171,652592,303732,,958544,,945085,881149,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,1,Male,A05,35-44,15456099,15502688,1287543,1215737,465040,463595,225894,,691428,,756283,707344,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,1,Male,A06,45-54,13797203,13812683,919145,889074,313447,312334,163165,,477076,,557745,541435,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,1,Male,A07,55-64,11571850,11462512,613585,719024,188806,188047,110198,,299287,,393215,502851,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,1,Male,A08,65-99,5819626,5645146,342345,516757,77109,76693,46837,,124067,,246559,420362,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,2,Female,A00,All Ages (14-99),69783947,69812538,6174842,5942382,2002735,1998463,966578,,2969608,,3737049,3677940,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,2,Female,A01,14-18,1909396,2058481,496995,329231,92191,91759,52374,,144532,,378368,227747,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,2,Female,A02,19-21,3195282,3262062,665371,564803,198491,197877,98121,,296568,,412832,343467,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,2,Female,A03,22-24,3877791,3913708,610220,545608,218286,217889,100906,,319210,,343587,305301,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,2,Female,A04,25-34,14525373,14516352,1503455,1462918,566917,565930,254339,,821322,,834518,835835,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,2,Female,A05,35-44,15159759,15188876,1164379,1099741,404211,403416,188643,,592946,,676907,641516,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,2,Female,A06,45-54,13985529,13998391,858984,821023,288331,287858,140682,,429053,,508013,489992,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,2,Female,A07,55-64,11589979,11492297,562172,649765,166190,165825,91965,,258234,,356833,451810,1,1,1,1,1,1,1,-1,1,-1,1,1 +2025,1,2,Female,A08,65-99,5540838,5382372,313266,469293,68118,67909,39549,,107743,,225991,382273,1,1,1,1,1,1,1,-1,1,-1,1,1 diff --git a/data/external/j2jod_us_firmsize_od_2015on.csv b/data/external/j2jod_us_firmsize_od_2015on.csv new file mode 100644 index 00000000..ba97616d --- /dev/null +++ b/data/external/j2jod_us_firmsize_od_2015on.csv @@ -0,0 +1,1477 @@ +year,quarter,firmsize_orig,firmsize,firmsize_orig_label,firmsize_label,EE,AQHire,J2J,EES,AQHireS,J2JS,sEE,sAQHire,sJ2J,sEES,sAQHireS,sJ2JS +2015,1,0,0,All Firm Sizes,All Firm Sizes,3985308,1939277,5924585,2283394,974400,3257794,1,1,10,1,1,10 +2015,1,0,1,All Firm Sizes,0-19 Employees,601144,360681,961825,338936,190341,529277,1,1,10,1,1,10 +2015,1,0,2,All Firm Sizes,20-49 Employees,382912,185386,568298,208530,86204,294734,1,1,10,1,1,10 +2015,1,0,3,All Firm Sizes,50-249 Employees,642927,292945,935872,357814,137604,495418,1,1,10,1,1,10 +2015,1,0,4,All Firm Sizes,250-499 Employees,240066,107856,347922,133506,50017,183523,1,1,10,1,1,10 +2015,1,0,5,All Firm Sizes,500+ Employees,1926216,907318,2833534,1108763,460893,1569656,1,1,10,1,1,10 +2015,1,1,0,0-19 Employees,All Firm Sizes,540509,407379,947888,313803,204474,518277,1,1,10,1,1,10 +2015,1,1,1,0-19 Employees,0-19 Employees,186628,156934,343562,113994,91637,205631,10,10,10,10,10,10 +2015,1,1,2,0-19 Employees,20-49 Employees,73037,50372,123409,41320,23762,65082,10,10,10,10,10,10 +2015,1,1,3,0-19 Employees,50-249 Employees,83487,57057,140544,46929,25841,72770,10,10,10,10,10,10 +2015,1,1,4,0-19 Employees,250-499 Employees,24583,17023,41606,13712,7363,21075,10,10,10,10,10,10 +2015,1,1,5,0-19 Employees,500+ Employees,154721,112119,266840,85363,48410,133773,10,10,10,10,10,10 +2015,1,2,0,20-49 Employees,All Firm Sizes,363884,190899,554783,206793,90409,297202,1,1,10,1,1,10 +2015,1,2,1,20-49 Employees,0-19 Employees,80812,44374,125186,46749,22531,69280,10,10,10,10,10,10 +2015,1,2,2,20-49 Employees,20-49 Employees,61197,30932,92129,35056,15701,50757,10,10,10,10,10,10 +2015,1,2,3,20-49 Employees,50-249 Employees,69481,34578,104059,39557,16134,55691,10,10,10,10,10,10 +2015,1,2,4,20-49 Employees,250-499 Employees,19429,10222,29651,10886,4431,15317,10,10,10,10,10,10 +2015,1,2,5,20-49 Employees,500+ Employees,121151,64490,185641,66337,28292,94629,10,10,10,10,10,10 +2015,1,3,0,50-249 Employees,All Firm Sizes,606604,294354,900958,347988,142908,490896,1,1,10,1,1,10 +2015,1,3,1,50-249 Employees,0-19 Employees,91864,47714,139578,52127,23516,75643,10,10,10,10,10,10 +2015,1,3,2,50-249 Employees,20-49 Employees,71880,32910,104790,40382,15572,55954,10,10,10,10,10,10 +2015,1,3,3,50-249 Employees,50-249 Employees,142017,66930,208947,83192,34939,118131,10,10,10,10,10,10 +2015,1,3,4,50-249 Employees,250-499 Employees,41348,19885,61233,23425,9422,32847,10,10,10,10,10,10 +2015,1,3,5,50-249 Employees,500+ Employees,238568,117234,355802,134130,54056,188186,10,10,10,10,10,10 +2015,1,4,0,250-499 Employees,All Firm Sizes,230019,106350,336369,131029,50793,181822,1,1,10,1,1,10 +2015,1,4,1,250-499 Employees,0-19 Employees,27480,13677,41157,14941,6381,21322,10,10,10,10,10,10 +2015,1,4,2,250-499 Employees,20-49 Employees,21461,9419,30880,11821,4219,16040,10,10,10,10,10,10 +2015,1,4,3,250-499 Employees,50-249 Employees,44170,19144,63314,25011,9098,34109,10,10,10,10,10,10 +2015,1,4,4,250-499 Employees,250-499 Employees,24219,12311,36530,14734,7183,21917,10,10,10,10,10,10 +2015,1,4,5,250-499 Employees,500+ Employees,104251,48263,152514,58526,21948,80474,10,10,10,10,10,10 +2015,1,5,0,500+ Employees,All Firm Sizes,2091631,871883,2963514,1178511,447201,1625712,1,1,10,1,1,10 +2015,1,5,1,500+ Employees,0-19 Employees,199567,89851,289418,101805,42039,143844,10,10,10,10,10,10 +2015,1,5,2,500+ Employees,20-49 Employees,146760,57350,204110,74549,24800,99349,10,10,10,10,10,10 +2015,1,5,3,500+ Employees,50-249 Employees,288445,108342,396787,153428,48154,201582,10,10,10,10,10,10 +2015,1,5,4,500+ Employees,250-499 Employees,124177,45732,169909,66680,20271,86951,10,10,10,10,10,10 +2015,1,5,5,500+ Employees,500+ Employees,1260661,543144,1803805,734039,296503,1030542,10,10,10,10,10,10 +2015,2,0,0,All Firm Sizes,All Firm Sizes,4867789,1996453,6864242,2814775,902513,3717288,1,1,10,1,1,10 +2015,2,0,1,All Firm Sizes,0-19 Employees,854203,375541,1229744,460689,169555,630244,1,1,10,1,1,10 +2015,2,0,2,All Firm Sizes,20-49 Employees,481254,194405,675659,261492,84107,345599,1,1,10,1,1,10 +2015,2,0,3,All Firm Sizes,50-249 Employees,779101,304827,1083928,435842,135108,570950,1,1,10,1,1,10 +2015,2,0,4,All Firm Sizes,250-499 Employees,278376,110759,389135,158263,49260,207523,1,1,10,1,1,10 +2015,2,0,5,All Firm Sizes,500+ Employees,2254516,925426,3179942,1349887,418696,1768583,1,1,10,1,1,10 +2015,2,1,0,0-19 Employees,All Firm Sizes,688467,324649,1013116,378305,160683,538988,1,1,10,1,1,10 +2015,2,1,1,0-19 Employees,0-19 Employees,245600,118263,363863,138889,63013,201902,10,10,10,10,10,10 +2015,2,1,2,0-19 Employees,20-49 Employees,91282,39956,131238,49480,19038,68518,10,10,10,10,10,10 +2015,2,1,3,0-19 Employees,50-249 Employees,104645,46213,150858,56118,21750,77868,10,10,10,10,10,10 +2015,2,1,4,0-19 Employees,250-499 Employees,30435,13913,44348,16231,6439,22670,10,10,10,10,10,10 +2015,2,1,5,0-19 Employees,500+ Employees,193825,95577,289402,104072,44706,148778,10,10,10,10,10,10 +2015,2,2,0,20-49 Employees,All Firm Sizes,470729,196950,667679,257722,91225,348947,1,1,10,1,1,10 +2015,2,2,1,20-49 Employees,0-19 Employees,117631,48887,166518,63301,22732,86033,10,10,10,10,10,10 +2015,2,2,2,20-49 Employees,20-49 Employees,75835,29216,105051,42364,13886,56250,10,10,10,10,10,10 +2015,2,2,3,20-49 Employees,50-249 Employees,87462,34836,122298,48248,16357,64605,10,10,10,10,10,10 +2015,2,2,4,20-49 Employees,250-499 Employees,24088,10002,34090,13188,4542,17730,10,10,10,10,10,10 +2015,2,2,5,20-49 Employees,500+ Employees,151283,67768,219051,82172,30516,112688,10,10,10,10,10,10 +2015,2,3,0,50-249 Employees,All Firm Sizes,767037,305550,1072587,430650,140508,571158,1,1,10,1,1,10 +2015,2,3,1,50-249 Employees,0-19 Employees,137968,56492,194460,73544,24878,98422,10,10,10,10,10,10 +2015,2,3,2,50-249 Employees,20-49 Employees,92104,35086,127190,50467,15893,66360,10,10,10,10,10,10 +2015,2,3,3,50-249 Employees,50-249 Employees,170733,62552,233285,98189,29871,128060,10,10,10,10,10,10 +2015,2,3,4,50-249 Employees,250-499 Employees,49056,19084,68140,27864,8870,36734,10,10,10,10,10,10 +2015,2,3,5,50-249 Employees,500+ Employees,292473,122648,415121,164867,55844,220711,10,10,10,10,10,10 +2015,2,4,0,250-499 Employees,All Firm Sizes,289903,113120,403023,162615,50834,213449,1,1,10,1,1,10 +2015,2,4,1,250-499 Employees,0-19 Employees,42445,17429,59874,22118,7259,29377,10,10,10,10,10,10 +2015,2,4,2,250-499 Employees,20-49 Employees,28053,10666,38719,15030,4592,19622,10,10,10,10,10,10 +2015,2,4,3,250-499 Employees,50-249 Employees,54116,19970,74086,30101,9001,39102,10,10,10,10,10,10 +2015,2,4,4,250-499 Employees,250-499 Employees,28164,10087,38251,16856,5053,21909,10,10,10,10,10,10 +2015,2,4,5,250-499 Employees,500+ Employees,127434,51190,178624,72240,22944,95184,10,10,10,10,10,10 +2015,2,5,0,500+ Employees,All Firm Sizes,2439001,989880,3428881,1449479,423702,1873181,1,1,10,1,1,10 +2015,2,5,1,500+ Employees,0-19 Employees,281701,125260,406961,147727,47529,195256,10,10,10,10,10,10 +2015,2,5,2,500+ Employees,20-49 Employees,179626,75160,254786,96376,28749,125125,10,10,10,10,10,10 +2015,2,5,3,500+ Employees,50-249 Employees,339460,134100,473560,190185,54717,244902,10,10,10,10,10,10 +2015,2,5,4,500+ Employees,250-499 Employees,138239,55035,193274,79077,23015,102092,10,10,10,10,10,10 +2015,2,5,5,500+ Employees,500+ Employees,1422166,565757,1987923,885427,252985,1138412,10,10,10,10,10,10 +2015,3,0,0,All Firm Sizes,All Firm Sizes,5311346,2166087,7477433,3053384,1148121,4201505,1,1,10,1,1,10 +2015,3,0,1,All Firm Sizes,0-19 Employees,839840,376369,1216209,440787,188567,629354,1,1,10,1,1,10 +2015,3,0,2,All Firm Sizes,20-49 Employees,501720,199101,700821,264081,98143,362224,1,1,10,1,1,10 +2015,3,0,3,All Firm Sizes,50-249 Employees,814172,309348,1123520,445859,156052,601911,1,1,10,1,1,10 +2015,3,0,4,All Firm Sizes,250-499 Employees,295371,113264,408635,162589,56390,218979,1,1,10,1,1,10 +2015,3,0,5,All Firm Sizes,500+ Employees,2436289,980519,3416808,1404088,507287,1911375,1,1,10,1,1,10 +2015,3,1,0,0-19 Employees,All Firm Sizes,800510,343239,1143749,406016,174126,580142,1,1,10,1,1,10 +2015,3,1,1,0-19 Employees,0-19 Employees,266307,119558,385865,139243,63505,202748,10,10,10,10,10,10 +2015,3,1,2,0-19 Employees,20-49 Employees,104965,41084,146049,51878,20231,72109,10,10,10,10,10,10 +2015,3,1,3,0-19 Employees,50-249 Employees,121099,48031,169130,59664,23642,83306,10,10,10,10,10,10 +2015,3,1,4,0-19 Employees,250-499 Employees,35592,14590,50182,17375,6951,24326,10,10,10,10,10,10 +2015,3,1,5,0-19 Employees,500+ Employees,235142,104817,339959,113484,49954,163438,10,10,10,10,10,10 +2015,3,2,0,20-49 Employees,All Firm Sizes,509367,207497,716864,272897,103237,376134,1,1,10,1,1,10 +2015,3,2,1,20-49 Employees,0-19 Employees,115700,48735,164435,60456,24046,84502,10,10,10,10,10,10 +2015,3,2,2,20-49 Employees,20-49 Employees,79555,30023,109578,43000,15163,58163,10,10,10,10,10,10 +2015,3,2,3,20-49 Employees,50-249 Employees,93097,35429,128526,50297,17493,67790,10,10,10,10,10,10 +2015,3,2,4,20-49 Employees,250-499 Employees,26569,10377,36946,13985,5032,19017,10,10,10,10,10,10 +2015,3,2,5,20-49 Employees,500+ Employees,169972,73829,243801,87633,35354,122987,10,10,10,10,10,10 +2015,3,3,0,50-249 Employees,All Firm Sizes,823122,322717,1145839,453982,161699,615681,1,1,10,1,1,10 +2015,3,3,1,50-249 Employees,0-19 Employees,133751,56608,190359,69517,26979,96496,10,10,10,10,10,10 +2015,3,3,2,50-249 Employees,20-49 Employees,95201,35984,131185,50876,17548,68424,10,10,10,10,10,10 +2015,3,3,3,50-249 Employees,50-249 Employees,178268,63838,242106,100635,33002,133637,10,10,10,10,10,10 +2015,3,3,4,50-249 Employees,250-499 Employees,53770,19585,73355,29525,9780,39305,10,10,10,10,10,10 +2015,3,3,5,50-249 Employees,500+ Employees,320476,131737,452213,172687,63860,236547,10,10,10,10,10,10 +2015,3,4,0,250-499 Employees,All Firm Sizes,301794,119245,421039,167149,58360,225509,1,1,10,1,1,10 +2015,3,4,1,250-499 Employees,0-19 Employees,39059,17420,56479,20147,8028,28175,10,10,10,10,10,10 +2015,3,4,2,250-499 Employees,20-49 Employees,27638,10852,38490,14415,5200,19615,10,10,10,10,10,10 +2015,3,4,3,250-499 Employees,50-249 Employees,55060,20175,75235,30334,9965,40299,10,10,10,10,10,10 +2015,3,4,4,250-499 Employees,250-499 Employees,29352,10103,39455,17166,5177,22343,10,10,10,10,10,10 +2015,3,4,5,250-499 Employees,500+ Employees,135944,55025,190969,74168,26104,100272,10,10,10,10,10,10 +2015,3,5,0,500+ Employees,All Firm Sizes,2524062,983204,3507266,1482168,511342,1993510,1,1,10,1,1,10 +2015,3,5,1,500+ Employees,0-19 Employees,258285,117624,375909,135337,55847,191184,10,10,10,10,10,10 +2015,3,5,2,500+ Employees,20-49 Employees,177488,71423,248911,93435,33769,127204,10,10,10,10,10,10 +2015,3,5,3,500+ Employees,50-249 Employees,338684,126286,464970,186337,61773,248110,10,10,10,10,10,10 +2015,3,5,4,500+ Employees,250-499 Employees,140174,52192,192366,78033,25210,103243,10,10,10,10,10,10 +2015,3,5,5,500+ Employees,500+ Employees,1497643,570841,2068484,907327,304419,1211746,10,10,10,10,10,10 +2015,4,0,0,All Firm Sizes,All Firm Sizes,4686235,2102303,6788538,2670905,968560,3639465,1,1,10,1,1,10 +2015,4,0,1,All Firm Sizes,0-19 Employees,686334,339563,1025897,382184,160577,542761,1,1,10,1,1,10 +2015,4,0,2,All Firm Sizes,20-49 Employees,413989,185519,599508,225188,81752,306940,1,1,10,1,1,10 +2015,4,0,3,All Firm Sizes,50-249 Employees,705689,293957,999646,392843,132069,524912,1,1,10,1,1,10 +2015,4,0,4,All Firm Sizes,250-499 Employees,270545,112466,383011,149972,50204,200176,1,1,10,1,1,10 +2015,4,0,5,All Firm Sizes,500+ Employees,2365176,1042268,3407444,1343454,466647,1810101,1,1,10,1,1,10 +2015,4,1,0,0-19 Employees,All Firm Sizes,722655,393700,1116355,387602,167941,555543,1,1,10,1,1,10 +2015,4,1,1,0-19 Employees,0-19 Employees,219983,116598,336581,124633,57138,181771,10,10,10,10,10,10 +2015,4,1,2,0-19 Employees,20-49 Employees,89668,44590,134258,47908,18583,66491,10,10,10,10,10,10 +2015,4,1,3,0-19 Employees,50-249 Employees,108801,54611,163412,57636,22024,79660,10,10,10,10,10,10 +2015,4,1,4,0-19 Employees,250-499 Employees,34572,17818,52390,17711,7039,24750,10,10,10,10,10,10 +2015,4,1,5,0-19 Employees,500+ Employees,242319,141967,384286,121118,53614,174732,10,10,10,10,10,10 +2015,4,2,0,20-49 Employees,All Firm Sizes,440533,219112,659645,237443,97596,335039,1,1,10,1,1,10 +2015,4,2,1,20-49 Employees,0-19 Employees,92624,45383,138007,51507,21352,72859,10,10,10,10,10,10 +2015,4,2,2,20-49 Employees,20-49 Employees,63997,28786,92783,35366,13528,48894,10,10,10,10,10,10 +2015,4,2,3,20-49 Employees,50-249 Employees,78501,35188,113689,43167,15628,58795,10,10,10,10,10,10 +2015,4,2,4,20-49 Employees,250-499 Employees,23792,11076,34868,12661,4646,17307,10,10,10,10,10,10 +2015,4,2,5,20-49 Employees,500+ Employees,166090,88072,254162,84423,36238,120661,10,10,10,10,10,10 +2015,4,3,0,50-249 Employees,All Firm Sizes,720602,327781,1048383,401685,148694,550379,1,1,10,1,1,10 +2015,4,3,1,50-249 Employees,0-19 Employees,108541,51721,160262,60069,23843,83912,10,10,10,10,10,10 +2015,4,3,2,50-249 Employees,20-49 Employees,77492,33477,110969,43149,15103,58252,10,10,10,10,10,10 +2015,4,3,3,50-249 Employees,50-249 Employees,153069,60895,213964,87870,28975,116845,10,10,10,10,10,10 +2015,4,3,4,50-249 Employees,250-499 Employees,48135,20297,68432,26626,9233,35859,10,10,10,10,10,10 +2015,4,3,5,50-249 Employees,500+ Employees,307123,147195,454318,165709,63481,229190,10,10,10,10,10,10 +2015,4,4,0,250-499 Employees,All Firm Sizes,272903,116836,389739,152759,53538,206297,1,1,10,1,1,10 +2015,4,4,1,250-499 Employees,0-19 Employees,32188,15013,47201,17704,7043,24747,10,10,10,10,10,10 +2015,4,4,2,250-499 Employees,20-49 Employees,23036,9785,32821,12443,4224,16667,10,10,10,10,10,10 +2015,4,4,3,250-499 Employees,50-249 Employees,47822,18851,66673,27114,8799,35913,10,10,10,10,10,10 +2015,4,4,4,250-499 Employees,250-499 Employees,26690,9960,36650,15916,5049,20965,10,10,10,10,10,10 +2015,4,4,5,250-499 Employees,500+ Employees,132103,57985,190088,71838,25265,97103,10,10,10,10,10,10 +2015,4,5,0,500+ Employees,All Firm Sizes,2344742,934929,3279671,1361612,442714,1804326,1,1,10,1,1,10 +2015,4,5,1,500+ Employees,0-19 Employees,216408,98868,315276,117884,45475,163359,10,10,10,10,10,10 +2015,4,5,2,500+ Employees,20-49 Employees,150305,62367,212672,80310,27410,107720,10,10,10,10,10,10 +2015,4,5,3,500+ Employees,50-249 Employees,302267,114652,416919,167050,52150,219200,10,10,10,10,10,10 +2015,4,5,4,500+ Employees,250-499 Employees,131186,49174,180360,72851,22231,95082,10,10,10,10,10,10 +2015,4,5,5,500+ Employees,500+ Employees,1459051,568570,2027621,862767,271029,1133796,10,10,10,10,10,10 +2016,1,0,0,All Firm Sizes,All Firm Sizes,4096713,2079746,6176459,2329524,1034590,3364114,1,1,10,1,1,10 +2016,1,0,1,All Firm Sizes,0-19 Employees,621343,381667,1003010,348177,200454,548631,1,1,10,1,1,10 +2016,1,0,2,All Firm Sizes,20-49 Employees,400367,201481,601848,215931,94184,310115,1,1,10,1,1,10 +2016,1,0,3,All Firm Sizes,50-249 Employees,660287,311506,971793,363659,146345,510004,1,1,10,1,1,10 +2016,1,0,4,All Firm Sizes,250-499 Employees,239161,115012,354173,132675,53505,186180,1,1,10,1,1,10 +2016,1,0,5,All Firm Sizes,500+ Employees,1974956,980300,2955256,1126618,488381,1614999,1,1,10,1,1,10 +2016,1,1,0,0-19 Employees,All Firm Sizes,560868,421085,981953,322634,211394,534028,1,1,10,1,1,10 +2016,1,1,1,0-19 Employees,0-19 Employees,193348,162025,355373,,,,10,10,10,11,11,11 +2016,1,1,2,0-19 Employees,20-49 Employees,76094,52640,128734,,,,10,10,10,11,11,11 +2016,1,1,3,0-19 Employees,50-249 Employees,85880,58516,144396,,,,10,10,10,11,11,11 +2016,1,1,4,0-19 Employees,250-499 Employees,24841,17478,42319,,,,10,10,10,11,11,11 +2016,1,1,5,0-19 Employees,500+ Employees,160885,117986,278871,,,,10,10,10,11,11,11 +2016,1,2,0,20-49 Employees,All Firm Sizes,382533,207020,589553,214653,97906,312559,1,1,10,1,1,10 +2016,1,2,1,20-49 Employees,0-19 Employees,84478,48067,132545,,,,10,10,10,11,11,11 +2016,1,2,2,20-49 Employees,20-49 Employees,65202,34032,99234,,,,10,10,10,11,11,11 +2016,1,2,3,20-49 Employees,50-249 Employees,72892,37738,110630,,,,10,10,10,11,11,11 +2016,1,2,4,20-49 Employees,250-499 Employees,20008,10765,30773,,,,10,10,10,11,11,11 +2016,1,2,5,20-49 Employees,500+ Employees,128060,70136,198196,,,,10,10,10,11,11,11 +2016,1,3,0,50-249 Employees,All Firm Sizes,634311,310895,945206,359103,148345,507448,1,1,10,1,1,10 +2016,1,3,1,50-249 Employees,0-19 Employees,95712,50906,146618,,,,10,10,10,11,11,11 +2016,1,3,2,50-249 Employees,20-49 Employees,75702,35993,111695,,,,10,10,10,11,11,11 +2016,1,3,3,50-249 Employees,50-249 Employees,146093,69882,215975,,,,10,10,10,11,11,11 +2016,1,3,4,50-249 Employees,250-499 Employees,42112,21136,63248,,,,10,10,10,11,11,11 +2016,1,3,5,50-249 Employees,500+ Employees,251839,123160,374999,,,,10,10,10,11,11,11 +2016,1,4,0,250-499 Employees,All Firm Sizes,236295,113699,349994,133782,54043,187825,1,1,10,1,1,10 +2016,1,4,1,250-499 Employees,0-19 Employees,28330,15095,43425,,,,10,10,10,11,11,11 +2016,1,4,2,250-499 Employees,20-49 Employees,21882,10243,32125,,,,10,10,10,11,11,11 +2016,1,4,3,250-499 Employees,50-249 Employees,44931,19929,64860,,,,10,10,10,11,11,11 +2016,1,4,4,250-499 Employees,250-499 Employees,24318,12604,36922,,,,10,10,10,11,11,11 +2016,1,4,5,250-499 Employees,500+ Employees,108689,51990,160679,,,,10,10,10,11,11,11 +2016,1,5,0,500+ Employees,All Firm Sizes,2123686,958594,3082280,1189432,484385,1673817,1,1,10,1,1,10 +2016,1,5,1,500+ Employees,0-19 Employees,202602,97695,300297,,,,10,10,10,11,11,11 +2016,1,5,2,500+ Employees,20-49 Employees,152060,64443,216503,,,,10,10,10,11,11,11 +2016,1,5,3,500+ Employees,50-249 Employees,294357,118676,413033,,,,10,10,10,11,11,11 +2016,1,5,4,500+ Employees,250-499 Employees,122446,50718,173164,,,,10,10,10,11,11,11 +2016,1,5,5,500+ Employees,500+ Employees,1275771,597253,1873024,,,,10,10,10,11,11,11 +2016,2,0,0,All Firm Sizes,All Firm Sizes,4944853,2031672,6976525,2815679,912368,3728047,1,1,10,1,1,10 +2016,2,0,1,All Firm Sizes,0-19 Employees,847251,372093,1219344,452774,167365,620139,1,1,10,1,1,10 +2016,2,0,2,All Firm Sizes,20-49 Employees,489294,197098,686392,261227,84651,345878,1,1,10,1,1,10 +2016,2,0,3,All Firm Sizes,50-249 Employees,783020,305938,1088958,432154,134341,566495,1,1,10,1,1,10 +2016,2,0,4,All Firm Sizes,250-499 Employees,282882,114656,397538,158812,50131,208943,1,1,10,1,1,10 +2016,2,0,5,All Firm Sizes,500+ Employees,2315769,953838,3269607,1358372,428078,1786450,1,1,10,1,1,10 +2016,2,1,0,0-19 Employees,All Firm Sizes,693702,326535,1020237,374625,159688,534313,1,1,10,1,1,10 +2016,2,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2016,2,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2016,2,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2016,2,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2016,2,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2016,2,2,0,20-49 Employees,All Firm Sizes,480173,202831,683004,258352,92728,351080,1,1,10,1,1,10 +2016,2,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2016,2,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2016,2,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2016,2,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2016,2,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2016,2,3,0,50-249 Employees,All Firm Sizes,774389,313225,1087614,426452,142476,568928,1,1,10,1,1,10 +2016,2,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2016,2,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2016,2,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2016,2,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2016,2,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2016,2,4,0,250-499 Employees,All Firm Sizes,289190,116855,406045,160470,52666,213136,1,1,10,1,1,10 +2016,2,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2016,2,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2016,2,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2016,2,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2016,2,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2016,2,5,0,500+ Employees,All Firm Sizes,2492366,999484,3491850,1457264,427844,1885108,1,1,10,1,1,10 +2016,2,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2016,2,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2016,2,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2016,2,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2016,2,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2016,3,0,0,All Firm Sizes,All Firm Sizes,5575781,2268906,7844687,3202348,1200717,4403065,1,1,10,1,1,10 +2016,3,0,1,All Firm Sizes,0-19 Employees,856750,381264,1238014,453188,191206,644394,1,1,10,1,1,10 +2016,3,0,2,All Firm Sizes,20-49 Employees,521206,205131,726337,276236,101424,377660,1,1,10,1,1,10 +2016,3,0,3,All Firm Sizes,50-249 Employees,850032,324711,1174743,466594,163357,629951,1,1,10,1,1,10 +2016,3,0,4,All Firm Sizes,250-499 Employees,310679,120837,431516,171869,60216,232085,1,1,10,1,1,10 +2016,3,0,5,All Firm Sizes,500+ Employees,2595596,1039775,3635371,1485384,534726,2020110,1,1,10,1,1,10 +2016,3,1,0,0-19 Employees,All Firm Sizes,827552,354780,1182332,423707,180049,603756,1,1,10,1,1,10 +2016,3,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2016,3,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2016,3,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2016,3,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2016,3,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2016,3,2,0,20-49 Employees,All Firm Sizes,535489,219497,754986,287528,109303,396831,1,1,10,1,1,10 +2016,3,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2016,3,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2016,3,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2016,3,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2016,3,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2016,3,3,0,50-249 Employees,All Firm Sizes,859508,335716,1195224,474622,168152,642774,1,1,10,1,1,10 +2016,3,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2016,3,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2016,3,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2016,3,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2016,3,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2016,3,4,0,250-499 Employees,All Firm Sizes,319026,123766,442792,177369,61235,238604,1,1,10,1,1,10 +2016,3,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2016,3,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2016,3,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2016,3,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2016,3,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2016,3,5,0,500+ Employees,All Firm Sizes,2669616,1036514,3706130,1557430,535507,2092937,1,1,10,1,1,10 +2016,3,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2016,3,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2016,3,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2016,3,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2016,3,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2016,4,0,0,All Firm Sizes,All Firm Sizes,4515769,2130018,6645787,2489263,969249,3458512,1,1,10,1,1,10 +2016,4,0,1,All Firm Sizes,0-19 Employees,654024,337924,991948,355034,158960,513994,1,1,10,1,1,10 +2016,4,0,2,All Firm Sizes,20-49 Employees,394063,185233,579296,209081,81052,290133,1,1,10,1,1,10 +2016,4,0,3,All Firm Sizes,50-249 Employees,686789,300889,987678,369106,133649,502755,1,1,10,1,1,10 +2016,4,0,4,All Firm Sizes,250-499 Employees,261263,114355,375618,140111,50263,190374,1,1,10,1,1,10 +2016,4,0,5,All Firm Sizes,500+ Employees,2289110,1066167,3355277,1249998,468186,1718184,1,1,10,1,1,10 +2016,4,1,0,0-19 Employees,All Firm Sizes,692767,385408,1078175,362583,163507,526090,1,1,10,1,1,10 +2016,4,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2016,4,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2016,4,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2016,4,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2016,4,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2016,4,2,0,20-49 Employees,All Firm Sizes,426093,220358,646451,225532,96488,322020,1,1,10,1,1,10 +2016,4,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2016,4,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2016,4,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2016,4,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2016,4,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2016,4,3,0,50-249 Employees,All Firm Sizes,695941,327420,1023361,374951,146271,521222,1,1,10,1,1,10 +2016,4,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2016,4,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2016,4,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2016,4,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2016,4,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2016,4,4,0,250-499 Employees,All Firm Sizes,260880,118408,379288,140116,53348,193464,1,1,10,1,1,10 +2016,4,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2016,4,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2016,4,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2016,4,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2016,4,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2016,4,5,0,500+ Employees,All Firm Sizes,2262518,964039,3226557,1264751,445728,1710479,1,1,10,1,1,10 +2016,4,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2016,4,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2016,4,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2016,4,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2016,4,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,1,0,0,All Firm Sizes,All Firm Sizes,4404653,2173696,6578349,2509523,1076253,3585776,1,1,10,1,1,10 +2017,1,0,1,All Firm Sizes,0-19 Employees,656647,379841,1036488,369263,196307,565570,1,1,10,1,1,10 +2017,1,0,2,All Firm Sizes,20-49 Employees,430743,204109,634852,232668,93513,326181,1,1,10,1,1,10 +2017,1,0,3,All Firm Sizes,50-249 Employees,715879,319661,1035540,395855,146956,542811,1,1,10,1,1,10 +2017,1,0,4,All Firm Sizes,250-499 Employees,262366,122504,384870,144341,56147,200488,1,1,10,1,1,10 +2017,1,0,5,All Firm Sizes,500+ Employees,2128086,1057904,3185990,1216463,532470,1748933,1,1,10,1,1,10 +2017,1,1,0,0-19 Employees,All Firm Sizes,590861,424176,1015037,342455,211466,553921,1,1,10,1,1,10 +2017,1,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,1,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,1,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,1,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,1,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,1,2,0,20-49 Employees,All Firm Sizes,411532,211397,622929,232399,98691,331090,1,1,10,1,1,10 +2017,1,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,1,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,1,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,1,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,1,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,1,3,0,50-249 Employees,All Firm Sizes,681309,314446,995755,386779,147166,533945,1,1,10,1,1,10 +2017,1,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,1,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,1,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,1,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,1,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,1,4,0,250-499 Employees,All Firm Sizes,259212,116518,375730,145964,54049,200013,1,1,10,1,1,10 +2017,1,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,1,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,1,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,1,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,1,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,1,5,0,500+ Employees,All Firm Sizes,2288249,1037003,3325252,1285368,526569,1811937,1,1,10,1,1,10 +2017,1,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,1,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,1,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,1,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,1,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,2,0,0,All Firm Sizes,All Firm Sizes,5202997,2116023,7319020,2942059,963997,3906056,1,1,10,1,1,10 +2017,2,0,1,All Firm Sizes,0-19 Employees,884918,384020,1268938,472079,174727,646806,1,1,10,1,1,10 +2017,2,0,2,All Firm Sizes,20-49 Employees,517560,208318,725878,274201,90987,365188,1,1,10,1,1,10 +2017,2,0,3,All Firm Sizes,50-249 Employees,834719,322528,1157247,456590,143283,599873,1,1,10,1,1,10 +2017,2,0,4,All Firm Sizes,250-499 Employees,303025,120130,423155,167582,53483,221065,1,1,10,1,1,10 +2017,2,0,5,All Firm Sizes,500+ Employees,2435187,991762,3426949,1419297,452647,1871944,1,1,10,1,1,10 +2017,2,1,0,0-19 Employees,All Firm Sizes,723291,332474,1055765,390508,164188,554696,1,1,10,1,1,10 +2017,2,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,2,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,2,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,2,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,2,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,2,2,0,20-49 Employees,All Firm Sizes,506779,210083,716862,270966,96771,367737,1,1,10,1,1,10 +2017,2,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,2,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,2,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,2,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,2,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,2,3,0,50-249 Employees,All Firm Sizes,822227,324326,1146553,450903,148934,599837,1,1,10,1,1,10 +2017,2,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,2,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,2,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,2,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,2,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,2,4,0,250-499 Employees,All Firm Sizes,309887,122915,432802,169580,55701,225281,1,1,10,1,1,10 +2017,2,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,2,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,2,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,2,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,2,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,2,5,0,500+ Employees,All Firm Sizes,2615529,1054564,3670093,1517885,459321,1977206,1,1,10,1,1,10 +2017,2,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,2,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,2,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,2,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,2,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,3,0,0,All Firm Sizes,All Firm Sizes,5529195,2291508,7820703,3146907,1196497,4343404,1,1,10,1,1,10 +2017,3,0,1,All Firm Sizes,0-19 Employees,848308,381026,1229334,445793,189257,635050,1,1,10,1,1,10 +2017,3,0,2,All Firm Sizes,20-49 Employees,519568,207769,727337,272465,101081,373546,1,1,10,1,1,10 +2017,3,0,3,All Firm Sizes,50-249 Employees,853526,329986,1183512,464157,163938,628095,1,1,10,1,1,10 +2017,3,0,4,All Firm Sizes,250-499 Employees,314714,122660,437374,170056,59829,229885,1,1,10,1,1,10 +2017,3,0,5,All Firm Sizes,500+ Employees,2569836,1050781,3620617,1459553,531241,1990794,1,1,10,1,1,10 +2017,3,1,0,0-19 Employees,All Firm Sizes,818926,353352,1172278,415069,177200,592269,1,1,10,1,1,10 +2017,3,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,3,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,3,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,3,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,3,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,3,2,0,20-49 Employees,All Firm Sizes,536993,220556,757549,285463,108060,393523,1,1,10,1,1,10 +2017,3,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,3,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,3,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,3,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,3,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,3,3,0,50-249 Employees,All Firm Sizes,861791,340574,1202365,471508,168492,640000,1,1,10,1,1,10 +2017,3,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,3,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,3,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,3,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,3,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,3,4,0,250-499 Employees,All Firm Sizes,318809,127275,446084,174433,61770,236203,1,1,10,1,1,10 +2017,3,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,3,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,3,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,3,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,3,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,3,5,0,500+ Employees,All Firm Sizes,2629360,1048643,3678003,1522326,531574,2053900,1,1,10,1,1,10 +2017,3,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,3,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,3,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,3,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,3,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,4,0,0,All Firm Sizes,All Firm Sizes,4784048,2195404,6979452,2661536,982773,3644309,1,1,10,1,1,10 +2017,4,0,1,All Firm Sizes,0-19 Employees,690443,344314,1034757,380083,160161,540244,1,1,10,1,1,10 +2017,4,0,2,All Firm Sizes,20-49 Employees,426035,195288,621323,228980,83852,312832,1,1,10,1,1,10 +2017,4,0,3,All Firm Sizes,50-249 Employees,741865,314826,1056691,403771,138057,541828,1,1,10,1,1,10 +2017,4,0,4,All Firm Sizes,250-499 Employees,282025,120804,402829,152938,52295,205233,1,1,10,1,1,10 +2017,4,0,5,All Firm Sizes,500+ Employees,2415174,1098085,3513259,1330802,474725,1805527,1,1,10,1,1,10 +2017,4,1,0,0-19 Employees,All Firm Sizes,727490,398124,1125614,386795,167309,554104,1,1,10,1,1,10 +2017,4,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,4,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,4,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,4,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,4,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,4,2,0,20-49 Employees,All Firm Sizes,454511,228893,683404,243796,99146,342942,1,1,10,1,1,10 +2017,4,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,4,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,4,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,4,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,4,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,4,3,0,50-249 Employees,All Firm Sizes,745100,342771,1087871,407299,150527,557826,1,1,10,1,1,10 +2017,4,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,4,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,4,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,4,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,4,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,4,4,0,250-499 Employees,All Firm Sizes,283345,125375,408720,154010,55721,209731,1,1,10,1,1,10 +2017,4,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,4,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,4,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,4,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,4,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2017,4,5,0,500+ Employees,All Firm Sizes,2386577,988541,3375118,1341565,452684,1794249,1,1,10,1,1,10 +2017,4,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2017,4,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2017,4,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2017,4,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2017,4,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,1,0,0,All Firm Sizes,All Firm Sizes,4643463,2148275,6791738,2635746,1053349,3689095,1,1,10,1,1,10 +2018,1,0,1,All Firm Sizes,0-19 Employees,675073,383294,1058367,379583,201161,580744,1,1,10,1,1,10 +2018,1,0,2,All Firm Sizes,20-49 Employees,450788,210068,660856,242697,97255,339952,1,1,10,1,1,10 +2018,1,0,3,All Firm Sizes,50-249 Employees,755828,328437,1084265,416105,153262,569367,1,1,10,1,1,10 +2018,1,0,4,All Firm Sizes,250-499 Employees,275293,121833,397126,151489,56018,207507,1,1,10,1,1,10 +2018,1,0,5,All Firm Sizes,500+ Employees,2272661,1013175,3285836,1293238,492751,1785989,1,1,10,1,1,10 +2018,1,1,0,0-19 Employees,All Firm Sizes,616745,430292,1047037,355867,218148,574015,1,1,10,1,1,10 +2018,1,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,1,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,1,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,1,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,1,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,1,2,0,20-49 Employees,All Firm Sizes,437874,216477,654351,245382,102359,347741,1,1,10,1,1,10 +2018,1,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,1,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,1,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,1,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,1,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,1,3,0,50-249 Employees,All Firm Sizes,723713,323285,1046998,407979,152813,560792,1,1,10,1,1,10 +2018,1,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,1,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,1,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,1,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,1,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,1,4,0,250-499 Employees,All Firm Sizes,267483,121680,389163,151431,57131,208562,1,1,10,1,1,10 +2018,1,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,1,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,1,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,1,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,1,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,1,5,0,500+ Employees,All Firm Sizes,2421218,984742,3405960,1354029,481732,1835761,1,1,10,1,1,10 +2018,1,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,1,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,1,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,1,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,1,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,2,0,0,All Firm Sizes,All Firm Sizes,5441842,2182014,7623856,3081508,989549,4071057,1,1,10,1,1,10 +2018,2,0,1,All Firm Sizes,0-19 Employees,908669,389983,1298652,486132,177375,663507,1,1,10,1,1,10 +2018,2,0,2,All Firm Sizes,20-49 Employees,541073,214785,755858,286565,93199,379764,1,1,10,1,1,10 +2018,2,0,3,All Firm Sizes,50-249 Employees,877532,334789,1212321,481842,148563,630405,1,1,10,1,1,10 +2018,2,0,4,All Firm Sizes,250-499 Employees,316075,122327,438402,176185,53811,229996,1,1,10,1,1,10 +2018,2,0,5,All Firm Sizes,500+ Employees,2564370,1029929,3594299,1494535,467623,1962158,1,1,10,1,1,10 +2018,2,1,0,0-19 Employees,All Firm Sizes,747471,340471,1087942,405713,168044,573757,1,1,10,1,1,10 +2018,2,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,2,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,2,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,2,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,2,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,2,2,0,20-49 Employees,All Firm Sizes,533910,218509,752419,286889,100278,387167,1,1,10,1,1,10 +2018,2,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,2,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,2,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,2,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,2,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,2,3,0,50-249 Employees,All Firm Sizes,866363,339108,1205471,476262,154792,631054,1,1,10,1,1,10 +2018,2,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,2,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,2,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,2,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,2,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,2,4,0,250-499 Employees,All Firm Sizes,320286,122756,443042,177017,55386,232403,1,1,10,1,1,10 +2018,2,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,2,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,2,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,2,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,2,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,2,5,0,500+ Employees,All Firm Sizes,2738535,1087353,3825888,1587400,471555,2058955,1,1,10,1,1,10 +2018,2,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,2,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,2,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,2,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,2,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,3,0,0,All Firm Sizes,All Firm Sizes,5833308,2370111,8203419,3327851,1237671,4565522,1,1,10,1,1,10 +2018,3,0,1,All Firm Sizes,0-19 Employees,877522,386698,1264220,461934,191863,653797,1,1,10,1,1,10 +2018,3,0,2,All Firm Sizes,20-49 Employees,545259,214860,760119,286532,104228,390760,1,1,10,1,1,10 +2018,3,0,3,All Firm Sizes,50-249 Employees,898211,342210,1240421,489917,171150,661067,1,1,10,1,1,10 +2018,3,0,4,All Firm Sizes,250-499 Employees,330497,127473,457970,181234,62589,243823,1,1,10,1,1,10 +2018,3,0,5,All Firm Sizes,500+ Employees,2740247,1096478,3836725,1558845,554727,2113572,1,1,10,1,1,10 +2018,3,1,0,0-19 Employees,All Firm Sizes,850207,361700,1211907,432604,182589,615193,1,1,10,1,1,10 +2018,3,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,3,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,3,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,3,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,3,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,3,2,0,20-49 Employees,All Firm Sizes,565918,229339,795257,300620,112204,412824,1,1,10,1,1,10 +2018,3,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,3,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,3,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,3,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,3,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,3,3,0,50-249 Employees,All Firm Sizes,911704,354629,1266333,499217,175172,674389,1,1,10,1,1,10 +2018,3,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,3,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,3,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,3,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,3,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,3,4,0,250-499 Employees,All Firm Sizes,333633,130408,464041,183755,64128,247883,1,1,10,1,1,10 +2018,3,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,3,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,3,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,3,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,3,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,3,5,0,500+ Employees,All Firm Sizes,2796396,1089357,3885753,1623676,553331,2177007,1,1,10,1,1,10 +2018,3,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,3,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,3,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,3,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,3,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,4,0,0,All Firm Sizes,All Firm Sizes,5051098,2267476,7318574,2821473,1030223,3851696,1,1,10,1,1,10 +2018,4,0,1,All Firm Sizes,0-19 Employees,710451,350033,1060484,393137,164187,557324,1,1,10,1,1,10 +2018,4,0,2,All Firm Sizes,20-49 Employees,445684,199856,645540,239730,86701,326431,1,1,10,1,1,10 +2018,4,0,3,All Firm Sizes,50-249 Employees,776057,321458,1097515,425331,142532,567863,1,1,10,1,1,10 +2018,4,0,4,All Firm Sizes,250-499 Employees,296091,122292,418383,161533,53809,215342,1,1,10,1,1,10 +2018,4,0,5,All Firm Sizes,500+ Employees,2579920,1147729,3727649,1425966,506735,1932701,1,1,10,1,1,10 +2018,4,1,0,0-19 Employees,All Firm Sizes,762628,404800,1167428,406213,171568,577781,1,1,10,1,1,10 +2018,4,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,4,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,4,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,4,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,4,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,4,2,0,20-49 Employees,All Firm Sizes,484126,236264,720390,259825,103084,362909,1,1,10,1,1,10 +2018,4,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,4,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,4,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,4,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,4,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,4,3,0,50-249 Employees,All Firm Sizes,786359,351793,1138152,432067,156450,588517,1,1,10,1,1,10 +2018,4,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,4,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,4,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,4,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,4,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,4,4,0,250-499 Employees,All Firm Sizes,293660,125210,418870,160610,55865,216475,1,1,10,1,1,10 +2018,4,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,4,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,4,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,4,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,4,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2018,4,5,0,500+ Employees,All Firm Sizes,2528579,1034885,3563464,1427625,483885,1911510,1,1,10,1,1,10 +2018,4,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2018,4,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2018,4,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2018,4,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2018,4,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,1,0,0,All Firm Sizes,All Firm Sizes,4676152,2172740,6848892,2662877,1063634,3726511,1,1,10,1,1,10 +2019,1,0,1,All Firm Sizes,0-19 Employees,666314,375395,1041709,373504,195623,569127,1,1,10,1,1,10 +2019,1,0,2,All Firm Sizes,20-49 Employees,449903,208586,658489,242182,96105,338287,1,1,10,1,1,10 +2019,1,0,3,All Firm Sizes,50-249 Employees,753497,327526,1081023,416614,154071,570685,1,1,10,1,1,10 +2019,1,0,4,All Firm Sizes,250-499 Employees,286177,124001,410178,159062,57409,216471,1,1,10,1,1,10 +2019,1,0,5,All Firm Sizes,500+ Employees,2295865,1039139,3335004,1309777,504849,1814626,1,1,10,1,1,10 +2019,1,1,0,0-19 Employees,All Firm Sizes,614219,428540,1042759,356105,216113,572218,1,1,10,1,1,10 +2019,1,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,1,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,1,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,1,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,1,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,1,2,0,20-49 Employees,All Firm Sizes,436882,217382,654264,245747,102311,348058,1,1,10,1,1,10 +2019,1,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,1,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,1,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,1,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,1,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,1,3,0,50-249 Employees,All Firm Sizes,720778,326816,1047594,408813,155278,564091,1,1,10,1,1,10 +2019,1,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,1,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,1,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,1,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,1,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,1,4,0,250-499 Employees,All Firm Sizes,277706,117025,394731,157839,54683,212522,1,1,10,1,1,10 +2019,1,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,1,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,1,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,1,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,1,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,1,5,0,500+ Employees,All Firm Sizes,2440465,1005896,3446361,1362959,492865,1855824,1,1,10,1,1,10 +2019,1,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,1,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,1,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,1,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,1,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,2,0,0,All Firm Sizes,All Firm Sizes,5519742,2227459,7747201,3148556,1006565,4155121,1,1,10,1,1,10 +2019,2,0,1,All Firm Sizes,0-19 Employees,905404,388783,1294187,486587,175431,662018,1,1,10,1,1,10 +2019,2,0,2,All Firm Sizes,20-49 Employees,544152,217918,762070,290594,93932,384526,1,1,10,1,1,10 +2019,2,0,3,All Firm Sizes,50-249 Employees,880432,336631,1217063,488374,148540,636914,1,1,10,1,1,10 +2019,2,0,4,All Firm Sizes,250-499 Employees,326731,127529,454260,182950,56395,239345,1,1,10,1,1,10 +2019,2,0,5,All Firm Sizes,500+ Employees,2617722,1062503,3680225,1534305,480653,2014958,1,1,10,1,1,10 +2019,2,1,0,0-19 Employees,All Firm Sizes,749273,340064,1089337,411202,167253,578455,1,1,10,1,1,10 +2019,2,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,2,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,2,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,2,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,2,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,2,2,0,20-49 Employees,All Firm Sizes,538303,222414,760717,290809,102021,392830,1,1,10,1,1,10 +2019,2,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,2,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,2,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,2,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,2,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,2,3,0,50-249 Employees,All Firm Sizes,868486,342045,1210531,482188,156252,638440,1,1,10,1,1,10 +2019,2,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,2,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,2,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,2,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,2,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,2,4,0,250-499 Employees,All Firm Sizes,333796,128876,462672,186532,58268,244800,1,1,10,1,1,10 +2019,2,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,2,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,2,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,2,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,2,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,2,5,0,500+ Employees,All Firm Sizes,2789798,1118372,3908170,1624233,481375,2105608,1,1,10,1,1,10 +2019,2,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,2,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,2,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,2,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,2,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,3,0,0,All Firm Sizes,All Firm Sizes,5859008,2403753,8262761,3359194,1268592,4627786,1,1,10,1,1,10 +2019,3,0,1,All Firm Sizes,0-19 Employees,872426,387155,1259581,461798,194371,656169,1,1,10,1,1,10 +2019,3,0,2,All Firm Sizes,20-49 Employees,545257,217974,763231,286738,106796,393534,1,1,10,1,1,10 +2019,3,0,3,All Firm Sizes,50-249 Employees,890364,341330,1231694,489479,172859,662338,1,1,10,1,1,10 +2019,3,0,4,All Firm Sizes,250-499 Employees,333395,129243,462638,185369,65112,250481,1,1,10,1,1,10 +2019,3,0,5,All Firm Sizes,500+ Employees,2760764,1117790,3878554,1574653,571962,2146615,1,1,10,1,1,10 +2019,3,1,0,0-19 Employees,All Firm Sizes,841892,362442,1204334,431689,185570,617259,1,1,10,1,1,10 +2019,3,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,3,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,3,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,3,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,3,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,3,2,0,20-49 Employees,All Firm Sizes,567600,232768,800368,303903,116418,420321,1,1,10,1,1,10 +2019,3,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,3,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,3,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,3,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,3,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,3,3,0,50-249 Employees,All Firm Sizes,905035,357099,1262134,500563,179825,680388,1,1,10,1,1,10 +2019,3,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,3,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,3,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,3,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,3,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,3,4,0,250-499 Employees,All Firm Sizes,343961,134456,478417,191724,66994,258718,1,1,10,1,1,10 +2019,3,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,3,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,3,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,3,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,3,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,3,5,0,500+ Employees,All Firm Sizes,2818700,1107643,3926343,1638308,568188,2206496,1,1,10,1,1,10 +2019,3,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,3,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,3,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,3,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,3,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,4,0,0,All Firm Sizes,All Firm Sizes,5083380,2309581,7392961,2696094,967417,3663511,1,1,10,1,1,10 +2019,4,0,1,All Firm Sizes,0-19 Employees,707528,348699,1056227,356000,144258,500258,1,1,10,1,1,10 +2019,4,0,2,All Firm Sizes,20-49 Employees,442701,202473,645174,217925,78147,296072,1,1,10,1,1,10 +2019,4,0,3,All Firm Sizes,50-249 Employees,758526,320234,1078760,392373,130725,523098,1,1,10,1,1,10 +2019,4,0,4,All Firm Sizes,250-499 Employees,293163,124620,417783,155902,52316,208218,1,1,10,1,1,10 +2019,4,0,5,All Firm Sizes,500+ Employees,2624377,1180481,3804858,1394214,486595,1880809,1,1,10,1,1,10 +2019,4,1,0,0-19 Employees,All Firm Sizes,752047,404074,1156121,367429,155333,522762,1,1,10,1,1,10 +2019,4,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,4,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,4,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,4,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,4,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,4,2,0,20-49 Employees,All Firm Sizes,481787,241275,723062,239025,95203,334228,1,1,10,1,1,10 +2019,4,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,4,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,4,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,4,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,4,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,4,3,0,50-249 Employees,All Firm Sizes,776592,358111,1134703,403010,147355,550365,1,1,10,1,1,10 +2019,4,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,4,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,4,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,4,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,4,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,4,4,0,250-499 Employees,All Firm Sizes,298815,134427,433242,157943,56546,214489,1,1,10,1,1,10 +2019,4,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,4,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,4,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,4,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,4,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2019,4,5,0,500+ Employees,All Firm Sizes,2574241,1055555,3629796,1396437,457593,1854030,1,1,10,1,1,10 +2019,4,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2019,4,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2019,4,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2019,4,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2019,4,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,1,0,0,All Firm Sizes,All Firm Sizes,4471714,1962923,6434637,2601017,1007875,3608892,1,1,10,1,1,10 +2020,1,0,1,All Firm Sizes,0-19 Employees,617679,317007,934686,361275,173674,534949,1,1,10,1,1,10 +2020,1,0,2,All Firm Sizes,20-49 Employees,408073,177366,585439,228981,86853,315834,1,1,10,1,1,10 +2020,1,0,3,All Firm Sizes,50-249 Employees,708906,291884,1000790,402078,143375,545453,1,1,10,1,1,10 +2020,1,0,4,All Firm Sizes,250-499 Employees,268068,113950,382018,150815,55252,206067,1,1,10,1,1,10 +2020,1,0,5,All Firm Sizes,500+ Employees,2232292,973059,3205351,1290286,495625,1785911,1,1,10,1,1,10 +2020,1,1,0,0-19 Employees,All Firm Sizes,579273,366365,945638,344063,192006,536069,1,1,10,1,1,10 +2020,1,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,1,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,1,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,1,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,1,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,1,2,0,20-49 Employees,All Firm Sizes,411712,191459,603171,238569,94688,333257,1,1,10,1,1,10 +2020,1,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,1,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,1,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,1,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,1,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,1,3,0,50-249 Employees,All Firm Sizes,687652,290311,977963,399279,144795,544074,1,1,10,1,1,10 +2020,1,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,1,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,1,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,1,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,1,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,1,4,0,250-499 Employees,All Firm Sizes,262894,110066,372960,152380,54630,207010,1,1,10,1,1,10 +2020,1,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,1,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,1,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,1,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,1,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,1,5,0,500+ Employees,All Firm Sizes,2342302,939367,3281669,1335230,483182,1818412,1,1,10,1,1,10 +2020,1,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,1,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,1,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,1,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,1,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,2,0,0,All Firm Sizes,All Firm Sizes,2998111,1881847,4879958,1721936,855945,2577881,1,1,10,1,1,10 +2020,2,0,1,All Firm Sizes,0-19 Employees,505363,365913,871276,276406,166098,442504,1,1,10,1,1,10 +2020,2,0,2,All Firm Sizes,20-49 Employees,278369,181154,459523,151917,79849,231766,1,1,10,1,1,10 +2020,2,0,3,All Firm Sizes,50-249 Employees,460131,268044,728175,256607,120527,377134,1,1,10,1,1,10 +2020,2,0,4,All Firm Sizes,250-499 Employees,166329,95507,261836,92913,42819,135732,1,1,10,1,1,10 +2020,2,0,5,All Firm Sizes,500+ Employees,1472361,899210,2371571,859312,404511,1263823,1,1,10,1,1,10 +2020,2,1,0,0-19 Employees,All Firm Sizes,372481,302785,675266,204558,150265,354823,1,1,10,1,1,10 +2020,2,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,2,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,2,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,2,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,2,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,2,2,0,20-49 Employees,All Firm Sizes,268015,209065,477080,147917,97924,245841,1,1,10,1,1,10 +2020,2,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,2,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,2,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,2,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,2,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,2,3,0,50-249 Employees,All Firm Sizes,470270,303630,773900,262520,139853,402373,1,1,10,1,1,10 +2020,2,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,2,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,2,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,2,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,2,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,2,4,0,250-499 Employees,All Firm Sizes,188564,107479,296043,105192,48831,154023,1,1,10,1,1,10 +2020,2,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,2,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,2,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,2,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,2,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,2,5,0,500+ Employees,All Firm Sizes,1562004,888787,2450791,913399,382925,1296324,1,1,10,1,1,10 +2020,2,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,2,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,2,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,2,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,2,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,3,0,0,All Firm Sizes,All Firm Sizes,4504794,2106838,6611632,2677182,1137127,3814309,1,1,10,1,1,10 +2020,3,0,1,All Firm Sizes,0-19 Employees,724124,364043,1088167,412813,193520,606333,1,1,10,1,1,10 +2020,3,0,2,All Firm Sizes,20-49 Employees,422376,196661,619037,239499,103150,342649,1,1,10,1,1,10 +2020,3,0,3,All Firm Sizes,50-249 Employees,678342,306639,984981,396094,163532,559626,1,1,10,1,1,10 +2020,3,0,4,All Firm Sizes,250-499 Employees,245077,111205,356282,142809,57909,200718,1,1,10,1,1,10 +2020,3,0,5,All Firm Sizes,500+ Employees,2133188,970831,3104019,1241326,499209,1740535,1,1,10,1,1,10 +2020,3,1,0,0-19 Employees,All Firm Sizes,633135,280531,913666,337471,147727,485198,1,1,10,1,1,10 +2020,3,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,3,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,3,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,3,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,3,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,3,2,0,20-49 Employees,All Firm Sizes,424368,193737,618105,243018,101030,344048,1,1,10,1,1,10 +2020,3,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,3,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,3,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,3,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,3,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,3,3,0,50-249 Employees,All Firm Sizes,692178,318638,1010816,407546,166974,574520,1,1,10,1,1,10 +2020,3,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,3,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,3,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,3,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,3,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,3,4,0,250-499 Employees,All Firm Sizes,261656,124272,385928,154145,63839,217984,1,1,10,1,1,10 +2020,3,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,3,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,3,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,3,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,3,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,3,5,0,500+ Employees,All Firm Sizes,2220094,1014491,3234585,1315456,531967,1847423,1,1,10,1,1,10 +2020,3,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,3,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,3,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,3,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,3,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,4,0,0,All Firm Sizes,All Firm Sizes,4472385,1934098,6406483,2444202,988073,3432275,1,1,10,1,1,10 +2020,4,0,1,All Firm Sizes,0-19 Employees,618217,295129,913346,339647,156301,495948,1,1,10,1,1,10 +2020,4,0,2,All Firm Sizes,20-49 Employees,369365,160689,530054,195728,80121,275849,1,1,10,1,1,10 +2020,4,0,3,All Firm Sizes,50-249 Employees,647405,263228,910633,351926,134814,486740,1,1,10,1,1,10 +2020,4,0,4,All Firm Sizes,250-499 Employees,252888,100748,353636,136599,51075,187674,1,1,10,1,1,10 +2020,4,0,5,All Firm Sizes,500+ Employees,2387154,1022137,3409291,1280693,504302,1784995,1,1,10,1,1,10 +2020,4,1,0,0-19 Employees,All Firm Sizes,633374,314490,947864,320283,145228,465511,1,1,10,1,1,10 +2020,4,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,4,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,4,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,4,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,4,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,4,2,0,20-49 Employees,All Firm Sizes,402347,190347,592694,208541,95326,303867,1,1,10,1,1,10 +2020,4,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,4,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,4,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,4,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,4,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,4,3,0,50-249 Employees,All Firm Sizes,663417,294742,958159,358900,152666,511566,1,1,10,1,1,10 +2020,4,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,4,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,4,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,4,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,4,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,4,4,0,250-499 Employees,All Firm Sizes,256645,108719,365364,140018,56510,196528,1,1,10,1,1,10 +2020,4,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,4,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,4,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,4,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,4,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2020,4,5,0,500+ Employees,All Firm Sizes,2343566,937814,3281380,1295757,482816,1778573,1,1,10,1,1,10 +2020,4,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2020,4,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2020,4,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2020,4,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2020,4,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,1,0,0,All Firm Sizes,All Firm Sizes,4027481,1891939,5919420,2200794,914271,3115065,1,1,10,1,1,10 +2021,1,0,1,All Firm Sizes,0-19 Employees,581507,323788,905295,322382,163816,486198,1,1,10,1,1,10 +2021,1,0,2,All Firm Sizes,20-49 Employees,369446,170322,539768,192902,75565,268467,1,1,10,1,1,10 +2021,1,0,3,All Firm Sizes,50-249 Employees,624073,270457,894530,335061,124875,459936,1,1,10,1,1,10 +2021,1,0,4,All Firm Sizes,250-499 Employees,234097,101952,336049,125597,47162,172759,1,1,10,1,1,10 +2021,1,0,5,All Firm Sizes,500+ Employees,2047655,950158,2997813,1105500,459646,1565146,1,1,10,1,1,10 +2021,1,1,0,0-19 Employees,All Firm Sizes,507937,344186,852123,287112,161625,448737,1,1,10,1,1,10 +2021,1,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,1,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,1,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,1,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,1,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,1,2,0,20-49 Employees,All Firm Sizes,352854,181343,534197,193680,81172,274852,1,1,10,1,1,10 +2021,1,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,1,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,1,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,1,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,1,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,1,3,0,50-249 Employees,All Firm Sizes,600667,275258,875925,331047,129388,460435,1,1,10,1,1,10 +2021,1,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,1,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,1,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,1,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,1,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,1,4,0,250-499 Employees,All Firm Sizes,230444,98693,329137,126488,46376,172864,1,1,10,1,1,10 +2021,1,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,1,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,1,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,1,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,1,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,1,5,0,500+ Employees,All Firm Sizes,2180488,929220,3109708,1156666,459802,1616468,1,1,10,1,1,10 +2021,1,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,1,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,1,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,1,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,1,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,2,0,0,All Firm Sizes,All Firm Sizes,5711727,2019040,7730767,3307865,859265,4167130,1,1,10,1,1,10 +2021,2,0,1,All Firm Sizes,0-19 Employees,929052,356367,1285419,516962,156399,673361,1,1,10,1,1,10 +2021,2,0,2,All Firm Sizes,20-49 Employees,557287,194805,752092,306742,78837,385579,1,1,10,1,1,10 +2021,2,0,3,All Firm Sizes,50-249 Employees,888668,297493,1186161,510033,125407,635440,1,1,10,1,1,10 +2021,2,0,4,All Firm Sizes,250-499 Employees,320223,108788,429011,186155,46496,232651,1,1,10,1,1,10 +2021,2,0,5,All Firm Sizes,500+ Employees,2795352,981834,3777186,1636733,410584,2047317,1,1,10,1,1,10 +2021,2,1,0,0-19 Employees,All Firm Sizes,739817,297280,1037097,411249,140763,552012,1,1,10,1,1,10 +2021,2,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,2,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,2,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,2,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,2,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,2,2,0,20-49 Employees,All Firm Sizes,525958,190124,716082,292840,84237,377077,1,1,10,1,1,10 +2021,2,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,2,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,2,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,2,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,2,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,2,3,0,50-249 Employees,All Firm Sizes,862152,299093,1161245,494046,132115,626161,1,1,10,1,1,10 +2021,2,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,2,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,2,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,2,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,2,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,2,4,0,250-499 Employees,All Firm Sizes,329360,110080,439440,189419,47210,236629,1,1,10,1,1,10 +2021,2,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,2,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,2,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,2,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,2,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,2,5,0,500+ Employees,All Firm Sizes,3026540,1054469,4081009,1770027,418100,2188127,1,1,10,1,1,10 +2021,2,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,2,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,2,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,2,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,2,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,3,0,0,All Firm Sizes,All Firm Sizes,6417839,2415787,8833626,3691889,1273376,4965265,1,1,10,1,1,10 +2021,3,0,1,All Firm Sizes,0-19 Employees,924211,379531,1303742,498287,195399,693686,1,1,10,1,1,10 +2021,3,0,2,All Firm Sizes,20-49 Employees,573838,210275,784113,304256,104503,408759,1,1,10,1,1,10 +2021,3,0,3,All Firm Sizes,50-249 Employees,942865,333338,1276203,527351,171002,698353,1,1,10,1,1,10 +2021,3,0,4,All Firm Sizes,250-499 Employees,350243,125581,475824,197419,63492,260911,1,1,10,1,1,10 +2021,3,0,5,All Firm Sizes,500+ Employees,3156084,1177311,4333395,1792516,596277,2388793,1,1,10,1,1,10 +2021,3,1,0,0-19 Employees,All Firm Sizes,898276,351133,1249409,460814,180601,641415,1,1,10,1,1,10 +2021,3,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,3,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,3,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,3,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,3,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,3,2,0,20-49 Employees,All Firm Sizes,590954,220631,811585,314730,111232,425962,1,1,10,1,1,10 +2021,3,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,3,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,3,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,3,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,3,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,3,3,0,50-249 Employees,All Firm Sizes,952310,344010,1296320,532215,175857,708072,1,1,10,1,1,10 +2021,3,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,3,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,3,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,3,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,3,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,3,4,0,250-499 Employees,All Firm Sizes,354915,129131,484046,201874,65197,267071,1,1,10,1,1,10 +2021,3,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,3,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,3,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,3,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,3,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,3,5,0,500+ Employees,All Firm Sizes,3200096,1187393,4387489,1854896,605117,2460013,1,1,10,1,1,10 +2021,3,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,3,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,3,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,3,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,3,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,4,0,0,All Firm Sizes,All Firm Sizes,5986687,2419203,8405890,3381896,1127373,4509269,1,1,10,1,1,10 +2021,4,0,1,All Firm Sizes,0-19 Employees,791736,361701,1153437,442805,172764,615569,1,1,10,1,1,10 +2021,4,0,2,All Firm Sizes,20-49 Employees,488366,203836,692202,264761,89420,354181,1,1,10,1,1,10 +2021,4,0,3,All Firm Sizes,50-249 Employees,857391,329045,1186436,477320,150105,627425,1,1,10,1,1,10 +2021,4,0,4,All Firm Sizes,250-499 Employees,331565,124332,455897,187134,58033,245167,1,1,10,1,1,10 +2021,4,0,5,All Firm Sizes,500+ Employees,3226296,1267929,4494225,1798691,575005,2373696,1,1,10,1,1,10 +2021,4,1,0,0-19 Employees,All Firm Sizes,837198,419890,1257088,450707,181065,631772,1,1,10,1,1,10 +2021,4,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,4,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,4,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,4,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,4,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,4,2,0,20-49 Employees,All Firm Sizes,532083,243913,775996,285590,107453,393043,1,1,10,1,1,10 +2021,4,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,4,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,4,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,4,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,4,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,4,3,0,50-249 Employees,All Firm Sizes,873502,359352,1232854,488566,165966,654532,1,1,10,1,1,10 +2021,4,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,4,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,4,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,4,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,4,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,4,4,0,250-499 Employees,All Firm Sizes,337812,128405,466217,189514,59873,249387,1,1,10,1,1,10 +2021,4,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,4,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,4,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,4,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,4,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2021,4,5,0,500+ Employees,All Firm Sizes,3141271,1145291,4286562,1781168,542299,2323467,1,1,10,1,1,10 +2021,4,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2021,4,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2021,4,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2021,4,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2021,4,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,1,0,0,All Firm Sizes,All Firm Sizes,5250106,2450953,7701059,2970989,1191533,4162522,1,1,10,1,1,10 +2022,1,0,1,All Firm Sizes,0-19 Employees,725814,402487,1128301,407668,209097,616765,1,1,10,1,1,10 +2022,1,0,2,All Firm Sizes,20-49 Employees,467643,216520,684163,251236,99191,350427,1,1,10,1,1,10 +2022,1,0,3,All Firm Sizes,50-249 Employees,785567,342022,1127589,437887,161024,598911,1,1,10,1,1,10 +2022,1,0,4,All Firm Sizes,250-499 Employees,298620,130237,428857,167043,61288,228331,1,1,10,1,1,10 +2022,1,0,5,All Firm Sizes,500+ Employees,2729237,1252061,3981298,1532998,598035,2131033,1,1,10,1,1,10 +2022,1,1,0,0-19 Employees,All Firm Sizes,693453,451551,1145004,399843,227122,626965,1,1,10,1,1,10 +2022,1,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,1,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,1,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,1,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,1,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,1,2,0,20-49 Employees,All Firm Sizes,469242,234615,703857,261729,109638,371367,1,1,10,1,1,10 +2022,1,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,1,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,1,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,1,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,1,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,1,3,0,50-249 Employees,All Firm Sizes,770507,351201,1121708,436206,168045,604251,1,1,10,1,1,10 +2022,1,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,1,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,1,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,1,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,1,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,1,4,0,250-499 Employees,All Firm Sizes,290720,129291,420011,164876,61042,225918,1,1,10,1,1,10 +2022,1,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,1,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,1,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,1,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,1,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,1,5,0,500+ Employees,All Firm Sizes,2796342,1192790,3989132,1543559,571922,2115481,1,1,10,1,1,10 +2022,1,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,1,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,1,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,1,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,1,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,2,0,0,All Firm Sizes,All Firm Sizes,6243476,2389107,8632583,3593136,1058325,4651461,1,1,10,1,1,10 +2022,2,0,1,All Firm Sizes,0-19 Employees,980033,406708,1386741,529352,184253,713605,1,1,10,1,1,10 +2022,2,0,2,All Firm Sizes,20-49 Employees,576269,218012,794281,310368,91569,401937,1,1,10,1,1,10 +2022,2,0,3,All Firm Sizes,50-249 Employees,942315,343346,1285661,532274,148835,681109,1,1,10,1,1,10 +2022,2,0,4,All Firm Sizes,250-499 Employees,349304,128113,477417,199865,55614,255479,1,1,10,1,1,10 +2022,2,0,5,All Firm Sizes,500+ Employees,3122950,1188788,4311738,1830593,519869,2350462,1,1,10,1,1,10 +2022,2,1,0,0-19 Employees,All Firm Sizes,838893,372955,1211848,468017,183636,651653,1,1,10,1,1,10 +2022,2,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,2,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,2,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,2,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,2,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,2,2,0,20-49 Employees,All Firm Sizes,570905,228524,799429,314354,103159,417513,1,1,10,1,1,10 +2022,2,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,2,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,2,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,2,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,2,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,2,3,0,50-249 Employees,All Firm Sizes,921365,346222,1267587,523884,155309,679193,1,1,10,1,1,10 +2022,2,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,2,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,2,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,2,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,2,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,2,4,0,250-499 Employees,All Firm Sizes,348325,125030,473355,198698,55496,254194,1,1,10,1,1,10 +2022,2,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,2,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,2,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,2,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,2,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,2,5,0,500+ Employees,All Firm Sizes,3282284,1229227,4511511,1897395,511169,2408564,1,1,10,1,1,10 +2022,2,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,2,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,2,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,2,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,2,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,3,0,0,All Firm Sizes,All Firm Sizes,6773350,2692350,9465700,3960509,1421865,5382374,1,1,10,1,1,10 +2022,3,0,1,All Firm Sizes,0-19 Employees,956209,408725,1364934,518977,207826,726803,1,1,10,1,1,10 +2022,3,0,2,All Firm Sizes,20-49 Employees,585967,226553,812520,315209,111702,426911,1,1,10,1,1,10 +2022,3,0,3,All Firm Sizes,50-249 Employees,972436,363007,1335443,549660,185339,734999,1,1,10,1,1,10 +2022,3,0,4,All Firm Sizes,250-499 Employees,364214,138988,503202,207195,69919,277114,1,1,10,1,1,10 +2022,3,0,5,All Firm Sizes,500+ Employees,3353859,1320458,4674317,1941213,672264,2613477,1,1,10,1,1,10 +2022,3,1,0,0-19 Employees,All Firm Sizes,967740,403378,1371118,515022,210819,725841,1,1,10,1,1,10 +2022,3,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,3,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,3,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,3,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,3,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,3,2,0,20-49 Employees,All Firm Sizes,620354,246813,867167,340628,125415,466043,1,1,10,1,1,10 +2022,3,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,3,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,3,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,3,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,3,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,3,3,0,50-249 Employees,All Firm Sizes,987370,377141,1364511,559748,193234,752982,1,1,10,1,1,10 +2022,3,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,3,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,3,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,3,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,3,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,3,4,0,250-499 Employees,All Firm Sizes,366587,137898,504485,207953,69046,276999,1,1,10,1,1,10 +2022,3,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,3,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,3,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,3,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,3,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,3,5,0,500+ Employees,All Firm Sizes,3374972,1301349,4676321,1974169,653700,2627869,1,1,10,1,1,10 +2022,3,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,3,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,3,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,3,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,3,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,4,0,0,All Firm Sizes,All Firm Sizes,5257157,2437070,7694227,2925250,1130772,4056022,1,1,10,1,1,10 +2022,4,0,1,All Firm Sizes,0-19 Employees,715869,364263,1080132,395999,173982,569981,1,1,10,1,1,10 +2022,4,0,2,All Firm Sizes,20-49 Employees,441819,206884,648703,235256,90675,325931,1,1,10,1,1,10 +2022,4,0,3,All Firm Sizes,50-249 Employees,771427,336141,1107568,421670,153253,574923,1,1,10,1,1,10 +2022,4,0,4,All Firm Sizes,250-499 Employees,293657,126751,420408,161246,57232,218478,1,1,10,1,1,10 +2022,4,0,5,All Firm Sizes,500+ Employees,2751936,1256145,4008081,1508972,565004,2073976,1,1,10,1,1,10 +2022,4,1,0,0-19 Employees,All Firm Sizes,779825,428687,1208512,423411,188350,611761,1,1,10,1,1,10 +2022,4,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,4,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,4,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,4,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,4,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,4,2,0,20-49 Employees,All Firm Sizes,478798,243546,722344,258288,109851,368139,1,1,10,1,1,10 +2022,4,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,4,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,4,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,4,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,4,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,4,3,0,50-249 Employees,All Firm Sizes,771019,358384,1129403,424311,164654,588965,1,1,10,1,1,10 +2022,4,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,4,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,4,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,4,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,4,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,4,4,0,250-499 Employees,All Firm Sizes,291722,129231,420953,160147,59602,219749,1,1,10,1,1,10 +2022,4,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,4,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,4,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,4,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,4,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2022,4,5,0,500+ Employees,All Firm Sizes,2710970,1160593,3871563,1502401,541622,2044023,1,1,10,1,1,10 +2022,4,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2022,4,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2022,4,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2022,4,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2022,4,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,1,0,0,All Firm Sizes,All Firm Sizes,4939710,2409065,7348775,2845410,1197075,4042485,1,1,10,1,1,10 +2023,1,0,1,All Firm Sizes,0-19 Employees,666178,375913,1042091,383665,199139,582804,1,1,10,1,1,10 +2023,1,0,2,All Firm Sizes,20-49 Employees,456349,217516,673865,249645,101781,351426,1,1,10,1,1,10 +2023,1,0,3,All Firm Sizes,50-249 Employees,769212,351148,1120360,431868,168203,600071,1,1,10,1,1,10 +2023,1,0,4,All Firm Sizes,250-499 Employees,284370,132459,416829,162970,64956,227926,1,1,10,1,1,10 +2023,1,0,5,All Firm Sizes,500+ Employees,2501940,1214247,3716187,1427101,593893,2020994,1,1,10,1,1,10 +2023,1,1,0,0-19 Employees,All Firm Sizes,617335,454872,1072207,368311,236347,604658,1,1,10,1,1,10 +2023,1,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,1,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,1,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,1,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,1,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,1,2,0,20-49 Employees,All Firm Sizes,449258,230010,679268,255227,111022,366249,1,1,10,1,1,10 +2023,1,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,1,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,1,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,1,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,1,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,1,3,0,50-249 Employees,All Firm Sizes,746342,346174,1092516,426594,169871,596465,1,1,10,1,1,10 +2023,1,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,1,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,1,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,1,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,1,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,1,4,0,250-499 Employees,All Firm Sizes,280063,126914,406977,161920,61560,223480,1,1,10,1,1,10 +2023,1,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,1,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,1,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,1,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,1,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,1,5,0,500+ Employees,All Firm Sizes,2634699,1166631,3801330,1485112,571249,2056361,1,1,10,1,1,10 +2023,1,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,1,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,1,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,1,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,1,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,2,0,0,All Firm Sizes,All Firm Sizes,5443275,2298634,7741909,3104311,1094205,4198516,1,1,10,1,1,10 +2023,2,0,1,All Firm Sizes,0-19 Employees,850848,373389,1224237,461284,178221,639505,1,1,10,1,1,10 +2023,2,0,2,All Firm Sizes,20-49 Employees,520383,215500,735883,277799,97579,375378,1,1,10,1,1,10 +2023,2,0,3,All Firm Sizes,50-249 Employees,855656,346070,1201726,473958,161588,635546,1,1,10,1,1,10 +2023,2,0,4,All Firm Sizes,250-499 Employees,304857,125881,430738,173787,60137,233924,1,1,10,1,1,10 +2023,2,0,5,All Firm Sizes,500+ Employees,2637507,1125414,3762921,1528261,530825,2059086,1,1,10,1,1,10 +2023,2,1,0,0-19 Employees,All Firm Sizes,705682,332590,1038272,390652,172409,563061,1,1,10,1,1,10 +2023,2,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,2,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,2,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,2,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,2,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,2,2,0,20-49 Employees,All Firm Sizes,515280,221545,736825,279333,105744,385077,1,1,10,1,1,10 +2023,2,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,2,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,2,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,2,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,2,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,2,3,0,50-249 Employees,All Firm Sizes,832208,348037,1180245,462485,166091,628576,1,1,10,1,1,10 +2023,2,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,2,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,2,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,2,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,2,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,2,4,0,250-499 Employees,All Firm Sizes,308826,127091,435917,174497,61354,235851,1,1,10,1,1,10 +2023,2,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,2,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,2,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,2,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,2,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,2,5,0,500+ Employees,All Firm Sizes,2825753,1187288,4013041,1633883,541679,2175562,1,1,10,1,1,10 +2023,2,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,2,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,2,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,2,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,2,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,3,0,0,All Firm Sizes,All Firm Sizes,5679397,2505341,8184738,3317672,1353943,4671615,1,1,10,1,1,10 +2023,3,0,1,All Firm Sizes,0-19 Employees,801281,369767,1171048,437528,191768,629296,1,1,10,1,1,10 +2023,3,0,2,All Firm Sizes,20-49 Employees,509233,215227,724460,273756,108434,382190,1,1,10,1,1,10 +2023,3,0,3,All Firm Sizes,50-249 Employees,853471,354900,1208371,477407,183790,661197,1,1,10,1,1,10 +2023,3,0,4,All Firm Sizes,250-499 Employees,306040,128464,434504,174110,67265,241375,1,1,10,1,1,10 +2023,3,0,5,All Firm Sizes,500+ Employees,2704993,1194882,3899875,1556794,620946,2177740,1,1,10,1,1,10 +2023,3,1,0,0-19 Employees,All Firm Sizes,784639,349203,1133842,416042,184852,600894,1,1,10,1,1,10 +2023,3,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,3,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,3,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,3,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,3,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,3,2,0,20-49 Employees,All Firm Sizes,535493,232283,767776,292882,119225,412107,1,1,10,1,1,10 +2023,3,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,3,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,3,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,3,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,3,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,3,3,0,50-249 Employees,All Firm Sizes,859743,363099,1222842,481094,188454,669548,1,1,10,1,1,10 +2023,3,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,3,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,3,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,3,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,3,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,3,4,0,250-499 Employees,All Firm Sizes,311972,131706,443678,178192,68453,246645,1,1,10,1,1,10 +2023,3,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,3,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,3,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,3,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,3,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,3,5,0,500+ Employees,All Firm Sizes,2790059,1214445,4004504,1639693,633880,2273573,1,1,10,1,1,10 +2023,3,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,3,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,3,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,3,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,3,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,4,0,0,All Firm Sizes,All Firm Sizes,4686818,2286142,6972960,2662807,1097108,3759915,1,1,10,1,1,10 +2023,4,0,1,All Firm Sizes,0-19 Employees,625815,326802,952617,355474,160768,516242,1,1,10,1,1,10 +2023,4,0,2,All Firm Sizes,20-49 Employees,402619,196564,599183,219609,89114,308723,1,1,10,1,1,10 +2023,4,0,3,All Firm Sizes,50-249 Employees,714960,327772,1042732,396134,153332,549466,1,1,10,1,1,10 +2023,4,0,4,All Firm Sizes,250-499 Employees,260913,118786,379699,148215,56786,205001,1,1,10,1,1,10 +2023,4,0,5,All Firm Sizes,500+ Employees,2407782,1165926,3573708,1345005,544853,1889858,1,1,10,1,1,10 +2023,4,1,0,0-19 Employees,All Firm Sizes,673906,376930,1050836,372551,169848,542399,1,1,10,1,1,10 +2023,4,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,4,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,4,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,4,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,4,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,4,2,0,20-49 Employees,All Firm Sizes,438504,230237,668741,241252,106786,348038,1,1,10,1,1,10 +2023,4,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,4,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,4,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,4,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,4,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,4,3,0,50-249 Employees,All Firm Sizes,717524,349793,1067317,399486,165290,564776,1,1,10,1,1,10 +2023,4,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,4,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,4,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,4,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,4,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,4,4,0,250-499 Employees,All Firm Sizes,263605,124439,388044,149280,60512,209792,1,1,10,1,1,10 +2023,4,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,4,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,4,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,4,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,4,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2023,4,5,0,500+ Employees,All Firm Sizes,2391232,1088841,3480073,1359774,530804,1890578,1,1,10,1,1,10 +2023,4,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2023,4,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2023,4,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2023,4,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2023,4,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,1,0,0,All Firm Sizes,All Firm Sizes,4437907,2221566,6659473,2604995,1157724,3762719,1,1,10,1,1,10 +2024,1,0,1,All Firm Sizes,0-19 Employees,603197,347315,950512,355010,191414,546424,1,1,10,1,1,10 +2024,1,0,2,All Firm Sizes,20-49 Employees,409693,200954,610647,228287,98393,326680,1,1,10,1,1,10 +2024,1,0,3,All Firm Sizes,50-249 Employees,705044,334707,1039751,399571,168133,567704,1,1,10,1,1,10 +2024,1,0,4,All Firm Sizes,250-499 Employees,252060,121858,373918,146716,62808,209524,1,1,10,1,1,10 +2024,1,0,5,All Firm Sizes,500+ Employees,2221076,1103385,3324461,1297201,569138,1866339,1,1,10,1,1,10 +2024,1,1,0,0-19 Employees,All Firm Sizes,563427,401504,964931,340290,214373,554663,1,1,10,1,1,10 +2024,1,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,1,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,1,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,1,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,1,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,1,2,0,20-49 Employees,All Firm Sizes,408455,217427,625882,237246,110401,347647,1,1,10,1,1,10 +2024,1,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,1,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,1,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,1,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,1,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,1,3,0,50-249 Employees,All Firm Sizes,694767,333958,1028725,398169,170405,568574,1,1,10,1,1,10 +2024,1,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,1,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,1,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,1,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,1,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,1,4,0,250-499 Employees,All Firm Sizes,249127,121147,370274,146794,63067,209861,1,1,10,1,1,10 +2024,1,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,1,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,1,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,1,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,1,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,1,5,0,500+ Employees,All Firm Sizes,2330366,1066894,3397260,1348486,552906,1901392,1,1,10,1,1,10 +2024,1,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,1,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,1,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,1,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,1,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,2,0,0,All Firm Sizes,All Firm Sizes,5000391,2149166,7149557,2916011,1049055,3965066,1,1,10,1,1,10 +2024,2,0,1,All Firm Sizes,0-19 Employees,775807,347595,1123402,431383,170487,601870,1,1,10,1,1,10 +2024,2,0,2,All Firm Sizes,20-49 Employees,473525,200824,674349,258895,93316,352211,1,1,10,1,1,10 +2024,2,0,3,All Firm Sizes,50-249 Employees,792088,329252,1121340,445648,156602,602250,1,1,10,1,1,10 +2024,2,0,4,All Firm Sizes,250-499 Employees,278225,116498,394723,160896,56794,217690,1,1,10,1,1,10 +2024,2,0,5,All Firm Sizes,500+ Employees,2421423,1044770,3466193,1440766,506667,1947433,1,1,10,1,1,10 +2024,2,1,0,0-19 Employees,All Firm Sizes,649014,311447,960461,367142,163583,530725,1,1,10,1,1,10 +2024,2,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,2,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,2,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,2,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,2,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,2,2,0,20-49 Employees,All Firm Sizes,474361,210147,684508,263562,103394,366956,1,1,10,1,1,10 +2024,2,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,2,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,2,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,2,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,2,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,2,3,0,50-249 Employees,All Firm Sizes,784177,337967,1122144,443398,163581,606979,1,1,10,1,1,10 +2024,2,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,2,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,2,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,2,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,2,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,2,4,0,250-499 Employees,All Firm Sizes,282218,119297,401515,163375,59445,222820,1,1,10,1,1,10 +2024,2,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,2,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,2,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,2,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,2,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,2,5,0,500+ Employees,All Firm Sizes,2569298,1087174,3656472,1524830,512041,2036871,1,1,10,1,1,10 +2024,2,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,2,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,2,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,2,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,2,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,3,0,0,All Firm Sizes,All Firm Sizes,5254119,2332072,7586191,3143717,1301044,4444761,1,1,10,1,1,10 +2024,3,0,1,All Firm Sizes,0-19 Employees,729250,340154,1069404,404629,181600,586229,1,1,10,1,1,10 +2024,3,0,2,All Firm Sizes,20-49 Employees,463804,199140,662944,255742,104084,359826,1,1,10,1,1,10 +2024,3,0,3,All Firm Sizes,50-249 Employees,793041,334094,1127135,450326,177583,627909,1,1,10,1,1,10 +2024,3,0,4,All Firm Sizes,250-499 Employees,283065,120993,404058,166127,65850,231977,1,1,10,1,1,10 +2024,3,0,5,All Firm Sizes,500+ Employees,2512982,1109336,3622318,1493828,600038,2093866,1,1,10,1,1,10 +2024,3,1,0,0-19 Employees,All Firm Sizes,717280,321619,1038899,388707,173880,562587,1,1,10,1,1,10 +2024,3,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,3,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,3,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,3,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,3,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,3,2,0,20-49 Employees,All Firm Sizes,492856,216345,709201,276762,115046,391808,1,1,10,1,1,10 +2024,3,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,3,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,3,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,3,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,3,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,3,3,0,50-249 Employees,All Firm Sizes,807030,347369,1154399,460514,185669,646183,1,1,10,1,1,10 +2024,3,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,3,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,3,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,3,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,3,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,3,4,0,250-499 Employees,All Firm Sizes,286534,124557,411091,167929,67205,235134,1,1,10,1,1,10 +2024,3,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,3,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,3,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,3,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,3,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,3,5,0,500+ Employees,All Firm Sizes,2570000,1113249,3683249,1552704,603918,2156622,1,1,10,1,1,10 +2024,3,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,3,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,3,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,3,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,3,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,4,0,0,All Firm Sizes,All Firm Sizes,4411959,2156061,6568020,2567324,1057578,3624902,1,1,10,1,1,10 +2024,4,0,1,All Firm Sizes,0-19 Employees,584578,305083,889661,338091,152974,491065,1,1,10,1,1,10 +2024,4,0,2,All Firm Sizes,20-49 Employees,371709,183222,554931,207679,86089,293768,1,1,10,1,1,10 +2024,4,0,3,All Firm Sizes,50-249 Employees,674769,314808,989577,381168,150125,531293,1,1,10,1,1,10 +2024,4,0,4,All Firm Sizes,250-499 Employees,245243,112641,357884,143017,55423,198440,1,1,10,1,1,10 +2024,4,0,5,All Firm Sizes,500+ Employees,2282886,1099811,3382697,1314438,525379,1839817,1,1,10,1,1,10 +2024,4,1,0,0-19 Employees,All Firm Sizes,626249,350913,977162,351222,160931,512153,1,1,10,1,1,10 +2024,4,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,4,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,4,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,4,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,4,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,4,2,0,20-49 Employees,All Firm Sizes,405410,216552,621962,228944,103292,332236,1,1,10,1,1,10 +2024,4,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,4,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,4,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,4,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,4,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,4,3,0,50-249 Employees,All Firm Sizes,684820,337386,1022206,387341,163052,550393,1,1,10,1,1,10 +2024,4,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,4,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,4,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,4,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,4,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,4,4,0,250-499 Employees,All Firm Sizes,247217,116047,363264,144175,57369,201544,1,1,10,1,1,10 +2024,4,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,4,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,4,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,4,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,4,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2024,4,5,0,500+ Employees,All Firm Sizes,2257158,1017094,3274252,1324058,506676,1830734,1,1,10,1,1,10 +2024,4,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2024,4,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2024,4,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2024,4,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2024,4,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2025,1,0,0,All Firm Sizes,All Firm Sizes,4161176,2058002,6219178,2492622,1102224,3594846,1,1,10,1,1,10 +2025,1,0,1,All Firm Sizes,0-19 Employees,578616,329276,907892,345741,184463,530204,1,1,10,1,1,10 +2025,1,0,2,All Firm Sizes,20-49 Employees,379091,183038,562129,215868,92373,308241,1,1,10,1,1,10 +2025,1,0,3,All Firm Sizes,50-249 Employees,662704,307595,970299,382091,157325,539416,1,1,10,1,1,10 +2025,1,0,4,All Firm Sizes,250-499 Employees,243284,112467,355751,144666,58573,203239,1,1,10,1,1,10 +2025,1,0,5,All Firm Sizes,500+ Employees,2074930,1021639,3096569,1242969,546130,1789099,1,1,10,1,1,10 +2025,1,1,0,0-19 Employees,All Firm Sizes,530005,367808,897813,323014,199147,522161,1,1,10,1,1,10 +2025,1,1,1,0-19 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2025,1,1,2,0-19 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2025,1,1,3,0-19 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2025,1,1,4,0-19 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2025,1,1,5,0-19 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2025,1,2,0,20-49 Employees,All Firm Sizes,377660,197105,574765,223684,101694,325378,1,1,10,1,1,10 +2025,1,2,1,20-49 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2025,1,2,2,20-49 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2025,1,2,3,20-49 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2025,1,2,4,20-49 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2025,1,2,5,20-49 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2025,1,3,0,50-249 Employees,All Firm Sizes,648991,311830,960821,380775,161818,542593,1,1,10,1,1,10 +2025,1,3,1,50-249 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2025,1,3,2,50-249 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2025,1,3,3,50-249 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2025,1,3,4,50-249 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2025,1,3,5,50-249 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2025,1,4,0,250-499 Employees,All Firm Sizes,237000,110795,347795,143912,58887,202799,1,1,10,1,1,10 +2025,1,4,1,250-499 Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2025,1,4,2,250-499 Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2025,1,4,3,250-499 Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2025,1,4,4,250-499 Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2025,1,4,5,250-499 Employees,500+ Employees,,,,,,,11,11,11,11,11,11 +2025,1,5,0,500+ Employees,All Firm Sizes,2190348,992112,3182460,1295120,533903,1829023,1,1,10,1,1,10 +2025,1,5,1,500+ Employees,0-19 Employees,,,,,,,11,11,11,11,11,11 +2025,1,5,2,500+ Employees,20-49 Employees,,,,,,,11,11,11,11,11,11 +2025,1,5,3,500+ Employees,50-249 Employees,,,,,,,11,11,11,11,11,11 +2025,1,5,4,500+ Employees,250-499 Employees,,,,,,,11,11,11,11,11,11 +2025,1,5,5,500+ Employees,500+ Employees,,,,,,,11,11,11,11,11,11 diff --git a/data/external/raw/led_j2jod_us_fsfs_2015on.csv.gz b/data/external/raw/led_j2jod_us_fsfs_2015on.csv.gz new file mode 100644 index 00000000..fc46060d Binary files /dev/null and b/data/external/raw/led_j2jod_us_fsfs_2015on.csv.gz differ diff --git a/docs/adr/0003-employer-firm-extension.md b/docs/adr/0003-employer-firm-extension.md index b80236e7..5eb3280b 100644 --- a/docs/adr/0003-employer-firm-extension.md +++ b/docs/adr/0003-employer-firm-extension.md @@ -1,15 +1,58 @@ -# ADR 0003: Employer-firm extension — C1 spell schema and C2 canonical firm-size banding +# ADR 0003: Employer-firm extension — IC1 spell schema and IC2 canonical firm-size banding -**Status:** Accepted — C1 and C2 frozen 2026-07-16. From this +**Status:** Accepted — IC1 and IC2 frozen 2026-07-16. From this point the contracts change only by joint PR between workstreams A and B ([populace-dynamics#192](https://github.com/PolicyEngine/populace-dynamics/issues/192)). +**Amendment 1 (naming, no semantic change).** The interface +contracts were originally named `C1`/`C2`/`C3`. They are renamed +`IC1`/`IC2`/`IC3` — *interface contract* — with no change to any +column, band, code mapping, or gate definition. This is a +joint-PR change because it edits frozen contract text, not because +anything in the contracts moved; the numbering is preserved 1:1, so +every prior reference maps by prefixing `I`. + +**Why, and why this side moves.** In this repository a bare "C1" +already meant four different things: + +| sense | example | can it be renamed? | +|---|---|---| +| gate_w1 **fingerprints** `c1`/`c2` | `gates.yaml` `fingerprints.c1` (PPI↔NRA) | **No** — inside `gate_w1`, which is `locked: true`. Renaming needs a public amendment plus a fresh referee round | +| SSA Trustees **table** II.C1 | `data/external/ssa_tr_2014_ii_c1.*` | No — an external publisher's table label | +| RNG **substream** C3 | household-composition `nonfamily_bridge` | Unrelated component; renaming is churn for no gain | +| **interface contracts** C1/C2/C3 | this ADR | **Yes** — the only set that is repo-internal, pre-lock, and ours | + +The collision was flagged on #192 before the C3 referee round with +the note that it would confuse referees. It is fixed now rather +than later for one reason: `IC3` (the employer gate block) is +about to be written into `gates.yaml`, which already contains +`fingerprints.c1` and `fingerprints.c2`. Once a block named `C3` +locks alongside them, renaming either set costs an amendment and a +fresh referee round — the exact cost this table shows the +fingerprint side already carries. + +Prior discussion (issue #192, the ADR history, merged PR bodies) +uses the old names and is not rewritten; this note is the mapping. + +**Boundary: history keeps the old names, live documents are +renamed.** The plan (`docs/plans/employer-firm-plan.html`), cited by +the Context section below as the operative split, is a live document +and is renamed with this amendment, so a referee following the ADR's +own link does not meet unmapped names. The unrenamed senses in the +table above (the locked `gates.yaml` fingerprints, the SSA table +labels, the RNG substream) remain as they are, by the reasons given. +Production-source docstrings sealed by the published first-estimates +replay ceremony also retain their historical `C1`/`C2` wording. They +are not operative contract text and are interpreted through this +one-to-one mapping; cosmetic edits would invalidate the sealed replay +identity. New source text uses the `IC` names. + **Sign-off:** @vahid-ahmadi (Workstream B, author) · @daphnehanse11 (Workstream A) — the joint sign-off is recorded by the merge of the freeze PR: authorship by one workstream owner plus approval by the other. First scheduled amendment (pre-registered below): -the C1 ``hours_band``/monthly-hours column once phase-1 establishes +the IC1 ``hours_band``/monthly-hours column once phase-1 establishes SIPP's supportable hours granularity. ## Context @@ -17,15 +60,15 @@ SIPP's supportable hours granularity. The employer-firm plan (`docs/plans/employer-firm-plan.html`) splits the extension into workstream A (person side: SIPP spells, CPS hosts, imputation) and workstream B (firm side: external targets, banding, -calibration, register), meeting at three interface contracts. C1 (the -spell schema) and C2 (canonical firm-size banding and its semantics) +calibration, register), meeting at three interface contracts. IC1 (the +spell schema) and IC2 (canonical firm-size banding and its semantics) freeze in week 1. This ADR records both, plus the target/gate partition rule, folding in the four contract-affecting findings from the week-1 review on issue #192. ## Decision -### C2 — canonical firm-size banding +### IC2 — canonical firm-size banding 1. **Semantics (review finding F5).** The canonical firm-size variable means **administrative enterprise size**: total @@ -33,7 +76,7 @@ the week-1 review on issue #192. counts it. Survey labels are noisy measures of that quantity — CPS ASEC firm size (worker-reported, all locations, previous calendar year's longest job — under either the raw Census `NOEMP` - or the IPUMS `FIRMSIZE` coding; see C2.5) is the primary training + or the IPUMS `FIRMSIZE` coding; see IC2.5) is the primary training label; SIPP 2014+ `EJB1_EMPSIZE` (establishment size) is a proxy chain. SUSB is therefore the correct E1 reference. 2. **Bands are headcount bands.** Five canonical bands with edges at @@ -43,7 +86,7 @@ the week-1 review on issue #192. both QWI (20-49 / 50-249) and the detailed SUSB classes (40-49 / 50-74) support it. FTE-denominated thresholds (the ACA cut is 50 full-time equivalents at 30 hours/week, not headcount) are - resolved by a person-side hours join — out of C2 scope. + resolved by a person-side hours join — out of IC2 scope. 3. **Mappings are total but explicitly ambiguous where the source is coarse.** Every raw code from every source maps to exactly one `BandSpan` (a contiguous run of canonical bands with an `exact` @@ -65,7 +108,7 @@ the week-1 review on issue #192. replication (weighted code shares by year vs. SUSB) is committed as `runs/noemp_band_evidence_v1.json` with its build script and pinning tests (#211) — the reported-anchor convention, since it - is derived evidence rather than a source extract — for the C3 + is derived evidence rather than a source extract — for the IC3 record. 5. **The person-side coding is explicit, not inferred (seam with #194).** The raw Census ASEC person file carries `NOEMP` @@ -85,7 +128,7 @@ the week-1 review on issue #192. emit `CanonicalBand` directly), never feed `NOEMP` integers to the `ipums_firmsize` route. -### C1 — job-spell schema +### IC1 — job-spell schema One tidy table, written by workstream A, read by workstream B: @@ -96,7 +139,7 @@ One tidy table, written by workstream A, read by workstream B: | `start_period` | period | first period of the spell | | `end_period` | period | last period; open spells use a sentinel | | `industry` | str | NAICS major (sector) group | -| `firm_size_band` | enum | canonical band per C2 (`CanonicalBand`) | +| `firm_size_band` | enum | canonical band per IC2 (`CanonicalBand`) | | `class_of_worker` | enum | private / federal / state-local government / self-employed / unpaid family | | `earnings_share` | float | share of the person's period earnings from this job | | `primary_job` | bool | phase 0 is primary-job-only | @@ -111,7 +154,7 @@ One tidy table, written by workstream A, read by workstream B: from the SUSB/QWI calibration universe; self-employed spells have no defined `firm_size_band`. - **Geography joins from the person table.** QWI/J2J targets are - state-level; C1 deliberately carries no geography column. The + state-level; IC1 deliberately carries no geography column. The state of a spell is the host person's state at `start_period`, joined on `person_id` — the join key lives on the person table, not the spell table. @@ -122,9 +165,9 @@ One tidy table, written by workstream A, read by workstream B: compliance, issue #192 — the 80-hours-per-month test of 7 CFR 273.24 and the 3-in-36 countable-month clock need month-resolved hours, not spell start/end plus annual earnings). - C1 as frozen carries no hours column, so it **cannot yet serve + IC1 as frozen carries no hours column, so it **cannot yet serve monthly-hours consumers**; a `hours_band` (or monthly hours) - column is the first scheduled C1 amendment, to be added by joint + column is the first scheduled IC1 amendment, to be added by joint PR once workstream A's phase-1 spell imputation establishes what hours granularity SIPP can support. Consumers must not proxy monthly compliance from annual quantities in the meantime. @@ -146,10 +189,10 @@ phase-0 QRF therefore comes from a named bridge, not an implicit one: bridge, aged forward. 2. **Proxy chain:** SIPP 2014+ establishment size x tenure, mapped through the establishment-to-enterprise noise model implied by - the C2 semantics. + the IC2 semantics. 3. **Pre-registered caveat:** the ASEC reference-period mismatch (`FIRMSIZE` = last calendar year's longest job; tenure supplement - = current job) is carried into the C3 gate notes as a known + = current job) is carried into the IC3 gate notes as a known label-misalignment term. ### Target/gate partition rule @@ -161,7 +204,7 @@ firm-size x sector flow margins committed under `data/external/`; gates E1/E2/E7/E11 score on held-out dimensions of the same sources (the sex/age demographic axes of QWI, the firm-age axis, and the state axis) that calibration never touches. The exact cell lists lock -with C3 after the floor runs. +with IC3 after the floor runs. Three unit rules recorded now (issue #192 review, point 4; branch review finding 3): @@ -171,7 +214,7 @@ review finding 3): so calibrating person-spells to QWI cells carries a wedge on the order of the multiple-jobholding rate (~5%, time-varying). A job-count -> person-count adjustment is an explicit pre-registered - C3 item, not a footnote. + IC3 item, not a footnote. - **QWI publishes mean earnings (`EarnS`), never medians**; E7 is stated on means. - **J2J's employer universe is broader than SUSB/QWI's.** The @@ -182,7 +225,7 @@ review finding 3): sectors (notably 61 Educational Services and 62 Health Care). Any E11 cell definition must either restate J2J on a private-comparable basis or carry this scope difference as a pre-registered caveat; - the choice locks with C3. + the choice locks with IC3. ## Consequences @@ -193,8 +236,8 @@ review finding 3): workstreams push directly to each other's branches when useful (reader fixes, rebases, contract-text corrections — this has run in both directions and worked). The norm the freeze makes - explicit: a change that touches contract semantics (C1 columns, - C2 bands/codings, gate definitions) requires the *other* + explicit: a change that touches contract semantics (IC1 columns, + IC2 bands/codings, gate definitions) requires the *other* workstream owner's approval on the PR even when the commit was pushed directly, so pre-registration always records who decided, not just who typed. @@ -204,6 +247,6 @@ review finding 3): references, analogous to the NCHS/Census/ONS files — never scored model output. Raw microdata is never committed. - No change to `gates.yaml`. Employer gates E1-E12 lock as a new - block (C3) after noise-floor runs and a referee round, via the - standard amendment process; no one-shot candidate runs before C3 + block (IC3) after noise-floor runs and a referee round, via the + standard amendment process; no one-shot candidate runs before IC3 locks. diff --git a/docs/adr/0004-linkage-qc.md b/docs/adr/0004-linkage-qc.md new file mode 100644 index 00000000..1e776fd6 --- /dev/null +++ b/docs/adr/0004-linkage-qc.md @@ -0,0 +1,479 @@ +# ADR 0004: Employer-firm linkage QC requirements for IC3 + +**Status:** Proposed — input to the IC3 referee round; this document +locks no IC3 threshold. IC1 and IC2 are treated as frozen and immutable +for this work under the workstream directive and the freeze record in +[populace-dynamics#215](https://github.com/PolicyEngine/populace-dynamics/pull/215). +This ADR does not amend their schema, semantics, or readers. + +## Context + +The employer-firm plan on +[issue #192](https://github.com/PolicyEngine/populace-dynamics/issues/192) +requires noise floors before thresholds, a referee round before the IC3 +gate block locks, and no one-shot candidate run before that lock. The +same ordering must govern the worker-to-employer or worker-to-firm-type +assignment itself. A downstream E-cell cannot certify a model if the +links used to construct the cell have unknown quality. + +Here, **link** includes any accepted worker-to-employer, employer- +attachment, or worker-to-firm-type assignment consumed by an E-cell. +That includes an assigned IC2 `CanonicalBand` or industry type; it does +not turn a statistical imputation into an identified firm ID. A **link +unit** is the unit on which a decision is accepted or withheld. Paired +and run-level moments may require a stricter derived unit, as specified +below. + +The frozen contract seam remains the IC1 spell fields +`person_id`, `spell_id`, `start_period`, `end_period`, `industry`, +`firm_size_band`, `class_of_worker`, `earnings_share`, and +`primary_job`. The implemented IC2 seam is the banding functions in +`src/populace_dynamics/firms/banding.py`. Linkage-QC decisions, +adjudication labels, match scores, and linkage weights therefore live +in versioned sidecars keyed to IC1 rows; they are not new IC1 columns. +`spell_type` is also not an IC1 field. Where needed below, transition +type is derived from adjacent spell rows plus the versioned person-month +observation/nonemployment frame; IC1 spells alone do not identify exits, +entries, or censoring. + +### Evidence behind the precision-first rule + +LIFE-M scales carefully reviewed hand links with supervised learning. +Its published workflow used independent double review, three new +independent reviewers for disagreements, a held-out test half, and +ten-fold cross-validation within the training half. It selected +thresholds to maximize recall subject to a project-specific +**"97% precision rate"** +and evaluated that training-selected cutoff out of sample. This ADR +adopts that ordering and separation, not LIFE-M's numeric 97% choice. +See Bailey et al. (2023), sections IV.C-IV.D and Figure 5, and the +[LIFE-M linking description](https://life-m.org/linking/). + +The final abstract of Bailey, Cole, Henderson, and Massey (2020) +reports that trained reviewers rejected **"15 to 37 percent"** of +links from widely used automated methods and that the combined +problems studied attenuated an intergenerational-income-elasticity +estimate by **"up to 29 percent."** Sections III.B, IV, VI.C, and VII +show why these are not merely lost-sample problems: false links can be +systematic, estimates usually moved toward zero in their case study, +and removing false links brought estimates across algorithms together. +The authors consequently recommend putting more weight on precision +than on increasing the match count. Those numeric findings describe +their historical-data exercises, not an employer-firm floor to import. + +Bailey, Cole, and Massey (online 2019; print 2020), section III.B and +Table 4, separately show how application-specific inverse-propensity +weights can improve balance between a linked sample and its reference +population on included observables. They also state the load-bearing +limits: common support and the paper's unconfoundedness/properly +specified propensity-score assumption are required, and balance on +omitted or unobserved characteristics is not guaranteed. Weighting +therefore complements the precision floor; it does not repair false +positive links. + +## Decision + +### 1. Precision first, before every IC3 threshold + +1. **Every link-producing component used by a gated E-cell must have + an independent audit artifact.** For categorical assignments, the + artifact reports the audit-design- and survey-weighted matrix of + adjudicated true class by assigned class, including no-counterpart, + abstain/unlinked, and indeterminate outcomes. It also reports + accepted-assignment precision, + end-to-end and stage-specific recall, false-negative and abstention + rates, and all numerators and denominators, overall and for every + pre-registered gate-relevant stratum. If it reports a pairwise + false-positive rate, it must define the candidate-pair universe; + `1 - precision` is the false-discovery rate, not that pairwise rate. + Point estimates and one-sided confidence bounds are both required. +2. **The precision floor is pre-registered before E-cell thresholds.** + IC3 must name the assignment, eligible universe, link unit, floor + `P_floor`, confidence level, required strata, pooling rule, and + failure disposition before it names any threshold for an E-cell + that consumes that assignment. Recall is always published. Whether + recall also gates is an explicit IC3 referee decision, not an + after-the-fact response to results. +3. **Passing uses a confidence bound, not the observed proportion.** + The lower one-sided confidence bound for precision must be at least + `P_floor` overall and at every stratum or derived-unit level that + IC3 designates operative. Oversampled strata are combined only with + their recorded sample inclusion weights. +4. **No threshold shopping follows a linkage failure.** A failed or + unevaluable applicable floor makes the linked E-cell invalid. It is + not a model miss that can be cured by widening the E-cell tolerance, + dropping an inconvenient stratum, or selecting a different weighted + result. A registered candidate with any required invalid cell cannot + pass the employer block. +5. **The audit precedes the one-shot run.** Linkage-QC results and the + immutable adjudication manifest must be on the IC3 record before a + candidate may consume the matcher. A materially changed matcher, + cutoff, candidate-generation rule, source vintage, or target + vocabulary requires a new versioned audit or the pre-registered + transport test; it never inherits a pass silently. + +### 2. Hand-adjudication sample + +The IC3 block must register the following sample design before labels +are opened. + +1. **Frame and two audit arms.** Define the complete eligible universe, + candidate-generation rules, accepted-link rule, true no-counterpart + cases, and abstentions. Draw (a) an accepted-assignment arm, which + identifies false positives and precision, and (b) an eligible-universe + truth-search arm containing accepted, rejected, and no-link cases. + The second arm uses an independent exhaustive search or external + reference that can find a true counterpart omitted by candidate + generation; reviewing only the matcher's candidate set is not an + end-to-end recall study. Report candidate-generation recall separately + from selector/cutoff recall. Because a unit may enter both arms, IC3 + registers the dual-frame overlap and combined-inclusion estimator so + it is neither omitted nor counted twice. +2. **Stratification follows the moments the matcher feeds.** For the + accepted arm, stratify at minimum by the five assigned IC2 + `CanonicalBand` values (plus withheld or unresolved assignments), + assigned NAICS major industry, and the derived spell/transition class + relevant to the battery: stay, job-to-job, exit, or entry, crossed + with `primary_job` where that changes the estimand. Rare E11 origin- + destination size pairs and E12 firm types are deliberately + oversampled. Because rejected and no-link units lack an assigned or + known-true class before review, the universe arm uses a separate + pre-link stratification frame observed for every eligible unit, then + reports recall by adjudicated true band, industry, and transition + domain. IC3 publishes any pooling of sparse strata before adjudication + and retains every arm-specific inclusion probability. +3. **Target size is powered at the floor.** IC3 registers `P_floor`, a + substantively meaningful design precision `P_design > P_floor`, + one-sided size `alpha`, power `1 - beta`, and its multiplicity rule. + For independent, equal-probability accepted assignments within a + simple-random operative stratum, the target is the smallest number + `n` for which an integer critical count `c` exists such that + + `Pr[X >= c | X ~ Binomial(n, P_floor)] <= alpha` + + and + + `Pr[X >= c | X ~ Binomial(n, P_design)] >= 1 - beta`. + + Repeated spells, pairs, and runs are not independent Bernoulli draws. + A worker-, firm-, or time-clustered, unequal-probability, finite, or + dual-frame design instead uses design-based analytic or simulation + power with the registered clustering unit, inclusion weights, finite- + population correction where material, and anticipated design effect. + The target includes unusable-record, indeterminate, and nonresponse + inflation. If multiple strata must clear, IC3 distinguishes simultaneous + confidence coverage from an intersection-union pass rule and computes + the **joint** probability that every required stratum passes at + `P_design`; powering each stratum separately at `1 - beta` is not + enough. A round number without the applicable calculation is not a + target-size justification. The eligible-universe truth-search arm has + its own registered target, based on expected true-counterpart + prevalence and a desired recall-bound width or, if recall gates, an + analogous floor-and-power calculation. It must contain enough + independently searched true links to make false-negative uncertainty + informative. +4. **Blind, independent coding.** Two trained coders independently see + the same source evidence and candidate set, but not the matcher's + score, cutoff, accepted choice, downstream outcome, or the other + coder's decision. They code `link`, `no link`, or `insufficient + evidence` under a frozen manual. A third coder or standing panel + adjudicates disagreements without majority labels being disclosed + first. Before labels open, IC3 registers whether an indeterminate, + unusable-evidence, or nonresponse case counts conservatively as + incorrect, enters partial-identification bounds, or makes the floor + unevaluable; hard cases may not be dropped from denominators after + their labels are known. The artifact reports each rate, its effect on + precision and recall denominators, agreement, disagreement, coder/ + manual versions, and final dispositions. Coders first calibrate on + separate, vetted cases excluded from both audit arms; blinded + audit/gold repeats measure + continuing coder accuracy as well as agreement. The registered + precision test either propagates estimated reference-label error or + publishes the sensitivity bound needed to clear the floor. The label + is **hand-adjudicated reference truth**, not a claim of infallible + ground truth. +5. **Provenance is committed and immutable.** Commit a privacy-safe + manifest containing the frame query and vintage, stratum definitions, + random seed, selected-row hashes or access-controlled immutable IDs, + inclusion probabilities, evidence and coding-manual versions, coder + assignment protocol, adjudication rule, counts, and artifact hashes. + Raw restricted records and direct identifiers remain outside git. + Any replacement or exclusion is logged; the sample is never silently + refreshed. +6. **No train-test leakage.** Neither adjudication arm, its final labels, + nor disagreement dispositions may train, tune, select features for, + set a cutoff for, or otherwise adapt the matcher it scores. A leaked + sample is retired from evaluation and replaced under a new manifest. + +#### First-lock scope, ownership, and sidecar location + +The first IC3 lock applies this audit to **E4/E5 SIPP-internal employer +attachment only**. Within-panel `EJB` job-ID attachment is an assignment +for which hand-adjudicable reference evidence can exist. The full +five-band × NAICS-major × transition-class × `primary_job` grid is +phased behind the first lock. E9 transition classes, E11 ordered pairs, +and any later-promoted gate must clear a new audit at promotion time; +none inherits an E4/E5 pass. + +Workstream A (`@daphnehanse11`) owns the E4/E5 adjudication frame, +coding manual, coder-panel operation, and privacy-safe audit manifest. +Workstream B (`@vahid-ahmadi`) owns the firm-side sidecar schema, +versioning rules, and firm-side audit artifacts. Versioned sidecars +join IC1 on `person_id` and `spell_id`; they never amend IC1. Before the +first audit opens labels, the reusable schema and versioning contract +must be committed at +`docs/design/employer_linkage_qc_sidecar.schema.json`. Privacy-safe +manifests and results must use +`runs/employer_linkage_qc__v.json`. Restricted evidence, +direct identifiers, coder identities, and access-controlled lookup +keys remain outside git. + +### 3. Linkage-bias reweighting on observables + +1. **Name the target population and identification assumption.** Each + linked analysis declares its actual analysis unit (assignment, pair, + transition, run, or firm/type cluster), the eligible reference + population it is intended to represent, and the pre-link observables + `X` available for both linked and unlinked units. + Candidate observables include source/vintage, age, sex, state, + `class_of_worker`, `primary_job`, industry information known before + the assignment, earnings/tenure measures, missingness, and transition + opportunity. For each E-cell outcome `Y`, the registered identification + claim is usable-link inclusion independent of `Y` conditional on `X`, + plus positivity on the target support. It is an assumption to defend, + not a result of a balance test. Post-link outcomes cannot be used to + manufacture balance. +2. **Estimate and publish actual inclusion propensities.** Fit and + version `s_i = Pr(L_i = 1 | X_i)`, where `L_i` denotes inclusion in + the usable linked subsample of the complete eligible universe at the + E-cell's analysis unit. A person-level score does not automatically + weight a pair, run, or cluster; IC3 models that unit's inclusion or + pre-registers and justifies a joint construction from component + scores. Publish the model specification, training + population, out-of-sample diagnostics, propensity distributions for + linked and reference units, overlap/common-support checks, covariate + balance before and after weighting, weight distribution, and effective + sample size. Trimming, stabilization, normalization, and capping rules + are pre-registered. +3. **Use a weight derived for the sampling construction.** For actual + inclusion propensity `s_i`, full-population inverse-probability + weighting uses `1 / s_i`, subject to the registered base design. + Bailey, Cole, and Massey instead append a linked-sample copy to a + reference-population copy and fit + `r_i = Pr(D_i = linked copy | X_i)` in that stack. For this density- + ratio construction only, their normalized inverse-odds weight is + `[(1 - r_i) / r_i] [q / (1 - q)]`, where `q` is the linked-copy + share of the stack. `s_i` and `r_i` are not interchangeable. The + linkage adjustment multiplies the pre-existing survey/design/ + opportunity weight; it does not replace that base weight. IC3 derives + and registers the applicable form before seeing the E-cell. +4. **Publish weighted and unweighted with valid uncertainty.** Every + E-cell consuming links publishes both, labels the registered operative + version + (`unweighted` or `linkage_ipw`), and explains its estimand. The + `unweighted` label means base-weighted without the linkage adjustment, + not equal-record weighting that discards a source survey design. The + adjudication sample-inclusion weight and the linkage-propensity weight + are distinct and must not be conflated. Intervals and gate statistics + account for estimated propensities, base survey/design weights, any + audit weights entering the estimator, trimming or stabilization, and + repeated-person, firm/type, and time clustering. A point estimate and + effective sample size alone are insufficient. +5. **Treat overlap failure as scope failure.** Extreme weights, absent + common support, or material residual imbalance are reported, not + hidden by ad hoc trimming. If the registered weighting diagnostic + fails, the weighted cell is invalid. The unweighted diagnostic remains + visible but cannot be substituted as the gate after results are known. + Support-based trimming changes the target population, which must be + renamed and reported rather than presented as the original estimand. + These weights mitigate selection on included observables only; they + do not correct a wrong link, establish balance on unobservables, or + turn a firm type into an observed firm identity. + +### 4. Battery wiring and invalidation + +An overall floor failure invalidates every linked cell using that +matcher version. A required-stratum failure invalidates every cell whose +estimand includes that stratum, unless IC3 pre-registers a genuinely +disjoint matcher and estimand. A passing marginal link floor does not by +itself certify a pair or a run: IC3 must either audit the derived unit +directly or register and justify a conservative composition rule. + +| cell | linkage unit and required QC | weighting and failure disposition | +|---|---|---| +| **E4 — retention pairs** | Audit endpoint assignments and, if IC3 makes it operative, the derived same-employer/same-attribute decision. The audit strata include age, industry, IC2 band, transition month, and `primary_job` status used by the cell. | Publish pair-opportunity estimates unweighted and with linkage-IPW. If any IC3-designated endpoint or pair-level floor fails, all affected E4 retention cells are invalid. | +| **E5 — attachment runs** | If IC3 designates a run-level floor, audit the full multi-window run label, including false continuation and false break errors. A per-month pass alone cannot certify a run because error compounds with length. | Weight the eligible run opportunity, not each observed linked month as if independent. If any IC3-designated endpoint or run-level floor fails, the affected E5 run-length cells are invalid. | +| **E9 — earnings-change coherence** | Derive stay, job-to-job, exit, and entry from adjacent IC1 spells plus the versioned person-month observation/nonemployment frame. Audit any IC3-designated transition floor; for job-to-job cells, audit both origin and destination firm-size/industry assignments. | Define propensity and composite weight on the eligible transition opportunity, then publish both versions within class. A failed IC3-designated origin, destination, or transition-class floor invalidates the corresponding E9 cells; the referee cannot replace them post hoc with a different definition. | +| **E11 — firm-size flow ladder** | For any per-record audit, the unit is an origin-destination job-to-job pair and the joint ordered IC2-band assignment is audited. An unresolved `BandSpan` is not a correct categorical assignment merely because it contains the eventual band. A separately registered held-out aggregate destination-band distribution may gate under the boundary below. | Model inclusion and weight at the ordered-pair opportunity for per-record claims. A failed IC3-designated origin, destination, or transition-class floor invalidates the corresponding per-record E11 cells. An aggregate E11 gate certifies only reproduction of its registered aggregate distribution. | +| **E12 — variance and coworker structure** | Phase 2 must audit worker-to-firm-type assignment and any generated same-firm or coworker co-assignment at the exact unit the E12 estimand uses. Type agreement alone cannot validate a claim about an identified firm. | Model inclusion at the worker pair, co-assignment, or cluster unit used by the decomposition; a worker-only propensity is insufficient without a justified composition. Publish both versions. If truth, floor, or support fails, every E12 cell using it is invalid and phase 2 is a no-go. | + +E3 and E8 do not ordinarily require a worker-to-firm link, and E10 +re-runs the existing locked PSID earnings gates without a new noise +floor. They are not blanket exemptions: if a final IC3 implementation +constructs any of them from accepted employer or firm-type assignments, +the precision-first law applies. Linkage failure never weakens E10 or +changes an existing PSID threshold. + +### 5. Phase scope and real seams + +#### Phase 1 — spell hazards, no two-sided register + +Phase 1 has within-panel employer attachment and firm attributes on +spells, not an observed two-sided worker-firm roster. The SIPP reader's +`EJB{n}_JOBID` is a within-panel attachment key. Its spell collapse +currently carries raw `empsize_code`; `sipp_empsize_to_canonical` in +`banding.py` preserves source-band ambiguity through `BandSpan`, while +the frozen IC1 seam ultimately carries one `CanonicalBand`. Therefore: + +1. QC scores the **final accepted assignment consumed by the E-cell**, + after any ambiguity resolution, not the raw SIPP code or a claim that + an ambiguous span is exact. +2. An exact SIPP interval-to-band map establishes only numeric interval + nesting. SIPP measures establishment size, so it does not by itself + validate administrative enterprise size. +3. Sidecars join to IC1 with `person_id` and `spell_id`. They do not add + `job_id`, `firm_id`, match score, adjudication status, or weights to + frozen IC1. +4. E4/E5 score retention and attachment, E9 scores transition-conditioned + earnings changes, and E11 scores firm-size flows only after their + applicable link and reweighting requirements above are evaluable. +5. A QRF-imputed enterprise-size band on a CPS host has no admissible + per-record truth frame. CPS `NOEMP` is the training label and has a + reference-period mismatch; SIPP measures establishment rather than + enterprise size; public LEHD/SUSB data have no person-level link to + CPS; and pre-redesign SIPP is an aged self-report on a different + sample. More fundamentally, a draw from a conditional distribution + is not a claim that an observed host has one adjudicable true class. + Therefore: + + > Per-record or individual-outcome cells conditioning on imputed + > firm-size bands are validated distributionally (calibration fit to + > SUSB margins plus held-out-axis stability) and are report-only in + > every phase; they gate only if an external person-level truth source + > materializes, at which point they enter through the standard + > promotion ceremony (new floor + ADR 0004 audit). + + This per-record status is permanent for the current evidence regime, + not a provisional deferral. Calibration fit is a build check and may + not be described as independent validation. + + A genuinely held-out aggregate distribution such as E11's + destination-size margin may gate when it is disjoint from every + calibration target and IC3 locks its exact statistic, population, cell + list, floor, and automatic demotion rule before fitting. Such a gate + certifies aggregate-distribution reproduction only. It does **not** + validate any worker's assigned band, true worker-employer linkage, + worker sorting, coworker structure, or firm effects. This boundary + implements the HIPSM-first synthetic-firm decision recorded on + [issue #282](https://github.com/PolicyEngine/populace-dynamics/issues/282): + aggregate validation is admissible now, while true-linked validation + remains a future promotion requirement. + +The pre-IC3 floor draft on +[PR #212](https://github.com/PolicyEngine/populace-dynamics/pull/212) +does not satisfy or conflict with this ADR: it estimates sampling noise +in E3/E4/E5/E8/E9 after the linkage inputs are defined. Its half-splits +cannot reveal a common linkage bias. The seam artifact on +[PR #214](https://github.com/PolicyEngine/populace-dynamics/pull/214) +likewise remains a separate prerequisite: it compares SIPP and J2J rate +levels, but does not estimate precision or recall for a worker-to-firm- +type assignment. + +#### Phase 2 — BLM firm types, still not observed firms + +Phase 2 proposes a BLM-style register of firm **types** (industry x +size x state), not identified enterprises or a public worker-firm +roster. E12 is especially sensitive to false assignments because a bad +worker-to-firm or coworker link moves covariance between the within- and +between-firm components. Bailey, Cole, Henderson, and Massey (2020), +section VI.C and Figure 7, show that false links often attenuated their +intergenerational-income-elasticity estimates and that removing them +reconciled estimates. Their broader result also warns that systematic +error can make the bias algorithm-dependent rather than always +attenuating. + +For that reason, a phase-2 E12 story must identify an admissible +hand-adjudication frame for the actual assignment unit and clear its +precision floor. If public margins cannot support that truth, IC3 records +the limitation as a phase-2 no-go; calibration fit to aggregates is not +a substitute. The register may support firm-type policy claims only at +the level it identifies. It may not relabel type agreement as firm- +identity or coworker validation. + +### 6. Items for the IC3 referee round — deliberately unresolved + +The referee round must decide and pre-register the following. This ADR +does not resolve them: + +1. The numeric precision floor or floors; `P_design`, `alpha`, power, + confidence interval, multiplicity correction, and whether recall has + an operative floor. +2. Within the first-lock E4/E5 scope fixed in section 2, the permissible + evidence, exact truth labels, privacy-safe manifest details, and + numeric coder-panel design; for later phases, the E9/E11 frames and + whether an E12 truth source exists at all. Imputed CPS enterprise-size + bands follow section 5's permanent report-only degradation rule and + are not an unresolved hand-adjudication frame. +3. Beyond E11's required ordered pair and the actual co-assignment unit + used by E12, which endpoint, pair, transition, and run levels gate; + how a passing endpoint result composes, if at all; and which sparse + strata may be pooled before the powered sample target is calculated. +4. The target reference population, propensity model and observables, + overlap and balance tolerances, weight stabilization/trimming rule, + and the pre-registered operative weighting for E4, E5, E9, E11, and + E12. +5. The exact calibration/gate cell partition, including held-out axes; + the job-count-to-person-count adjustment for phase 0; the private- + comparable versus caveat treatment of J2J's broader employer + universe; and the ASEC firm-size/tenure reference-period mismatch. +6. PR #212's measurement choices: E3 quantile gaps versus weighted-ECDF + gaps, and E9 stay IQR versus a broader distributional distance. The + integer and wave-constant heaping degeneracies remain on the record. +7. PR #214's cross-wave SIPP job-ID consistency check and the final + ruling on J2J rate levels, SIPP persistence, and seam-aware hazard + estimation. +8. The E12 estimand and entity: firm type versus generated pseudo-firm, + the minimum evidence for within/between variance and coworker + correlation, and the phase-2 identification/go-no-go standard. +9. Long-window tenure evidence from PSID/NLSY and any transport test for + applying one adjudication result across source vintages or populations. + +The settled IC1 fields, IC2 semantics and five bands, explicit +`NOEMP`/`FIRMSIZE` coding, class-of-worker universe, and person-table +geography join are outside this list. Reopening them requires the joint +IC1/IC2 amendment process, not the IC3 referee round. + +## Consequences + +- IC3 gains a linkage-quality input gate before its model-fit gates. + E4, E5, E9, E11, and E12 cannot certify a candidate from unaudited or + floor-failing assignments. +- Every link-consuming cell exposes the observable-selection question + by publishing linkage-IPW and unweighted estimates together, with one + operative version chosen before the candidate result is seen. +- The required evidence is carried in sidecars and reported artifacts; + IC1, IC2, `gates.yaml`, readers, and banding code are unchanged. +- Exact floor values, E-cell thresholds, and operative weighting choices + remain decisions for the IC3 referee round. + +## References + +- Bailey, Martha, Peter Z. Lin, A. R. Shariq Mohammed, Paul Mohnen, + Jared Murray, Mengying Zhang, and Alexa Prettyman. 2023. + ["The Creation of LIFE-M: The Longitudinal, Intergenerational Family + Electronic Micro-Database Project."](https://doi.org/10.1080/01615440.2023.2239699) + *Historical Methods* 56 (3): 138-159. +- Bailey, Martha J., Connor Cole, Morgan Henderson, and Catherine Massey. + 2020. ["How Well Do Automated Linking Methods Perform? Lessons from US + Historical Data."](https://doi.org/10.1257/jel.20191526) + *Journal of Economic Literature* 58 (4): 997-1044. The 29-percent + figure above follows the + [final AEA abstract](https://www.aeaweb.org/articles?id=10.1257/jel.20191526), + while the + [earlier deposited author manuscript](https://pmc.ncbi.nlm.nih.gov/articles/PMC8294155/) + reports 20 percent in its abstract, introduction, and section VI.C. +- Bailey, Martha, Connor Cole, and Catherine Massey. 2019 online / 2020 + print. ["Simple Strategies for Improving Inference with Linked Data: A + Case Study of the 1850-1930 IPUMS Linked Representative Historical + Samples."](https://doi.org/10.1080/01615440.2019.1630343) + *Historical Methods* 53 (2): 80-93. diff --git a/docs/design/e4_e5_audit_manifest.md b/docs/design/e4_e5_audit_manifest.md new file mode 100644 index 00000000..e4dbc0b7 --- /dev/null +++ b/docs/design/e4_e5_audit_manifest.md @@ -0,0 +1,292 @@ +# E4/E5 minimal-audit manifest (ADR 0004 instantiation, pre-lock) + +**Status: REGISTERED DESIGN, sample not yet drawn.** This is +Workstream A's §12.2 pre-lock artifact for the C3 block (#230 §9.1): +the complete ADR 0004 adjudication design for the first-lock scope — +**SIPP-internal employer attachment**, the assignment E4 (retention +pairs) and E5 (attachment runs) consume. The numeric slots marked +`REFEREE` are ADR 0004 §6.1 items; the sample is drawn only after the +referee round fills them, by the committed draw script, under the +seed registered here. Owner: @daphnehanse11 (frame + coder-panel +operation, per #230 §9.3). Prerequisite order is ADR 0004 (#224), +then the cross-wave provenance artifact (#235), then this manifest. +The exact prerequisite heads are merged into this branch; neither is +a movable forward reference here. + +## 1. The assignment under audit + +E4/E5 treat two job records in adjacent reference months as **the +same employer** iff they share a within-panel `EJB` job ID +(`populace_dynamics.data.sipp_jobs`, pu2023, reference year 2022). +The "matcher" is therefore Census's dependent-interview job-ID +assignment as consumed by the reader — not a model we train. What +hand adjudication can verify from the public-use record: whether the +month-*m* and month-*m+1* job records describe the same employer, +using industry code, occupation code, class of worker, work +arrangement, establishment-size code, monthly earnings, and the +`BMONTH`/`EMONTH` spell edges. This is the "hand-adjudicable truth +demonstrably exists" claim of #230 §9.1, made concrete. + +**Scope mapping (registered)**: the pair-level arms (a)/(b) certify +**E4** — retention is a pair-level assignment. **E5** consumes +*runs* — maximal chains of pair-links — where error compounds with +length and enters as **false continuation** (a wrong link extends a +run) or **false break** (a missed link splits one). E5 is certified +by the run arm (c) below, at run level; pair precision alone does +not license E5 and is never composed into a run claim by an +independence assumption. + +## 2. Frame and the two arms (ADR 0004 §2.1) + +- **Eligible universe**: all ordered adjacent-month pairs + (person, month *m*, month *m+1*), *m* = 1..11 plus the Dec→Jan + cross-file pair, where the person holds ≥1 job in month *m* and is + present in the panel in month *m+1* (presence from the + person-month universe — exits to nonemployment are in-universe; + sample leavers are not). This is exactly the #235 population; + the check's counts (384,747 within-wave job-holdings; 10,828 at + the seam) size the frame. +- **Candidate generation**: within-person only — all ≤7 job slots of + month *m+1* are visible to the coder. Candidate-generation recall + is 1 by construction (SIPP cannot attach a person's job to another + person's employer record), so candidate-recall and selector-recall + collapse; this is registered as a structural property, not + measured. +- **Accepted-assignment arm (a)**: pairs where a month-*m* job's ID + recurs in month *m+1* (the "stay" assignment). Coders judge + same-employer vs not → **precision** of ID-based attachment. +- **Truth-search arm (b)**: pairs where a month-*m* job's ID does + NOT recur (separations). Coders search all month-*m+1* job records + for a true same-employer counterpart → **recall** (the missed + attachments are exactly #235's re-key class; its signature rate, + 17.5% at the seam vs 2.4% within-wave, is the prevalence prior for + powering this arm). +- **Run arm (c)** (E5): the unit is the **run** — a maximal chain of + same-ID adjacent-month pair-links. A sampled run is coded in full: + every internal pair-link (the arm-(a) task) plus both terminal + transitions (the arm-(b) task, searching beyond each end for a + true counterpart). The run label then derives deterministically + from its link labels: `correctly_delimited`, `over_extended` (≥1 + internal false continuation), `truncated` (≥1 terminal false + break), or `both`; `insufficient_evidence` on any constituent link + makes the run indeterminate (conservative, per §5). Run-level + error is thus measured **directly**, with the + false-continuation/false-break decomposition the ADR 0004 §4 E5 + row requires — the composition from links to runs is observed, not + assumed independent. Cost accounting: a run of length *L* costs + *L*−1 internal + ≤2 terminal codings, so this arm's budget is set + in link-codings, not runs. +- **Dual-frame overlap**: a person-pair can contribute a stay job to + arm (a) and a separated job to arm (b); the unit of audit is the + **job-pair**, not the person-pair, so the arms partition job-pairs + and no combined-inclusion estimator is needed. Registered as such. + Arm (c) samples runs, whose constituent links are coded under the + same protocol but enter **only** the arm-(c) estimator — link + codings are not recycled into arms (a)/(b) (a deliberate + efficiency loss that keeps every estimator's inclusion + probabilities single-frame). + +## 3. Stratification (ADR 0004 §2.2, scoped per #230 §9.1) + +First-lock scope excludes firm-size-conditional cells, so the +C2-band stratification of the full ADR grid does not apply (its +strata are registered for promotion-time audits, not this one). +Operative strata: + +- **Arm (a)** (precision): {within-wave, seam} × {age 16–44, + 45+} — 4 strata. Seam pairs are deliberately oversampled (they are + the risk locus established by #214/#235 and are only ~2.7% of the + frame). +- **Arm (b)** (recall): {within-wave, seam} × {re-key signature + present, absent} — 4 strata. The signature (same industry + class + of worker + earnings within 20%; parameters **frozen** in + `scripts/build_crosswave_jobid_check.py` before any label exists) + concentrates the plausible false negatives, so signature-present + strata are oversampled. +- **Arm (c)** (run level): {run length 2–3, 4–11, full-year 12} × + {seam-adjacent, not} — 6 strata, where *seam-adjacent* means the + run contains or terminates at the Dec→Jan cross-file pair. + Full-year and seam-adjacent strata are oversampled: full-year runs + carry the E5 gate quantity (`full_year_run_share`), and the seam + is where #235 locates the false-break risk. +- **Pooling (rule registered now, not at draw time)**: a stratum + pools only when its **frame count** — known before any label + exists — cannot meet its powered target at sampling fraction ≤ 1. + Pooling collapses axes in this fixed order: the age split (arm a), + the signature split (arm b), length band 2–3 into 4–11 (arm c) — + and **never across the within-wave/seam axis**, the registered + risk axis. The draw artifact publishes each applied pooling with + the triggering frame count; every inclusion probability is + retained; no pooling decision may follow first sight of any label. + +## 4. Power and target sizes (ADR 0004 §2.3) + +Registered parameters — `REFEREE` slots per ADR 0004 §6.1: + +| Parameter | Value | +|---|---| +| `P_floor` (precision) | REFEREE | +| `P_design` | REFEREE | +| `alpha` (one-sided) | REFEREE | +| `1 - beta` | REFEREE | +| Multiplicity rule | REFEREE | +| Recall: gates or reported-with-bound | REFEREE | +| `P_floor_run` (share of runs correctly delimited, one-sided lower bound) | REFEREE | +| Run-arm link-coding budget ceiling | REFEREE | +| `q_link_design` (link-level indeterminate rate used for sizing) | REFEREE | +| Calibration-repeat agreement floor and failure action | REFEREE | +| False-continuation / false-break decomposition | registered: always reported separately, each with its own bound | + +**No-revisit clause (registered)**: every `REFEREE` slot in this +table — including whether arm-(b) recall gates or is +reported-with-bound — must be filled **before the sample is +drawn**. After the draw no slot may be revised, and in particular +the gating status of arm (b) may not change once any arm-(b) label +exists. A revision proposed after labels exist is void and triggers +the §7 retire-and-reissue remedy. + +**Power procedure (registered)**: power is computed by simulation +that resamples **workers** — the registered clustering unit — from +the *actual frame*, which exists before the draw (#235 sizes it). +The design effect is therefore **measured from the frame's +cluster-size distribution, not assumed**. Indeterminate inflation is +arm-specific. Arms (a)/(b), whose units are individual link codings, +use the referee-filled `q_link_design`. For each arm-(c) run with +`k_r` constituent coding opportunities (internal links plus the +observed terminal opportunities), the registered planning probability +is + +`q_run,r = 1 - (1 - q_link_design)^k_r`. + +The arm-(c) simulation applies that probability to the actual run-length +distribution in each stratum; it never applies a scalar link-level +inflation to runs. This is a sizing model, not an assumption that +constituent adjudication outcomes are independent in the reported +estimator. The result artifact reports realized run-level indeterminacy +directly. + +**Fail-closed pre-draw trigger (registered)**: if any arm-(c) stratum's +powered target after the formula above exceeds either its frame count +or the referee-filled link-coding budget, the draw does not occur and +the design returns to the referee before any audit label exists. It may +not silently omit full-year or seam runs, replace the formula with 10%, +or license E5 from pair precision. A calibration rate observed after +the draw never authorizes a supplemental sample or target revision; it +is reported and may produce the already-registered graded stop. + +**Worked example** (illustrative only, not a proposal): for a +simple-random operative stratum, `P_floor = 0.95`, +`P_design = 0.99`, `alpha = 0.05`, `1 − beta = 0.80` gives +`n = 124`, critical count `c = 122` (smallest binomial solution); +(0.90, 0.97) gives `n = 76, c = 73`. These independent-Bernoulli +`n` are floor illustrations only; registered targets come from the +worker-resampling simulation above. Four strata at the example +numbers imply an arm-(a) total near 550 adjudications before +inflation. + +**Arm (b) target (registered formula)**: per stratum, the +true-counterpart prevalence prior `π` is the #235 excess rate for +that stratum (E→E-conditional 15.1% at the seam; 2.4% within-wave +baseline). If the referee rules reported-with-bound, `n` solves +`z_{1−α} · sqrt(π(1−π)/n) · sqrt(deff) ≤ w` for the registered +half-width `w`; if recall gates, the same binomial floor machinery +as arm (a) applies with the registered `R_floor`. Illustration: +`π = 0.15`, `w = 0.05`, one-sided `α = 0.05`, `deff = 1` gives +`n ≈ 138` before inflation. + +**Arm (c) target**: powered for `P_floor_run` by the same +worker-resampling simulation, with the budget expressed in +link-codings (a full-year run costs 11 internal + ≤2 terminal +codings) and capped by the registered ceiling above. + +## 5. Coding protocol (ADR 0004 §2.4) + +- **Outcome blinding**: coders see both months' job-record fields with all + `EJB` job IDs **masked**, and never see the matcher outcome + (same/different ID), the #235 signature flag, any downstream gate + quantity, or the other coder's decision. +- **Condition blinding is unattainable**: the job-record evidence needed + to adjudicate an employer attachment can reveal whether a sheet came + from a stay or separation arm. The design therefore makes no + condition-blinding claim. It relies on outcome masking and coders + external to the assignment implementation. The draw artifact names + the holder of the ID-unmasking key; that holder cannot code a sheet. +- **Labels**: `same_employer`, `different_employer`, + `insufficient_evidence`, under a frozen coding manual + (`docs/design/e4_e5_coding_manual_v1.md`, to be committed before + labels open; version hash registered in the draw artifact). +- **Disagreements**: adjudicated by a third coder without disclosure + of the split; dispositions logged. +- **Indeterminates** (registered now, before labels): + `insufficient_evidence` counts **conservatively against** the + audited assignment — as incorrect in arm (a) precision and as a + missed true counterpart in arm (b) recall bounds — with the + partial-identification bounds also reported. Hard cases are never + dropped after labels are known. +- **Calibration**: coders first train on vetted cases excluded from + all three arms; blinded repeats (10% of assignments) measure + continuing accuracy and agreement. The referee-filled agreement + floor and its failure action are fixed before the draw and may not + be revised after a repeat label exists. +- The precision test publishes the sensitivity bound to + reference-label error per ADR 0004 (the label is hand-adjudicated + reference truth, not infallible ground truth). + +## 6. Provenance (ADR 0004 §2.5) + +The prerequisite cross-wave artifact is +`runs/crosswave_jobid_check_draft_v0.json`, SHA-256 +`33d4a7be88b417cb980ad4b12e65e1310eabd541a4926673e2414eead20941f1`; +its builder is `scripts/build_crosswave_jobid_check.py`, SHA-256 +`3887d392e3d978e2c5788e9e03557101129d9f759917037b756dba6e3ed0cb33`, +last changed at `35926fe708bea8a9b5cc22791505f245c8ad35be`. +Those committed objects pin the frame counts and signature parameters +used here. + +The draw artifact (`runs/e4_e5_audit_draw_v1.json`, committed when +the sample is drawn) will contain: reader version and pu-file +sha256s, frame query (this document's §2 verbatim), stratum +definitions and inclusion probabilities, the random seed +(**registered now: 20260717**), sha256 of each selected job-pair's +public-use identifiers, coding-manual and evidence-sheet versions, +coder-assignment protocol, and counts. The draw script itself must be +committed and reviewed before execution and pin the RNG algorithm, +sorted frame-key order, deterministic stratum allocation, and one-draw +rule in addition to the seed. Replacements or exclusions are logged; +the sample is never silently refreshed. All fields are public-use- +derived; no restricted data exists in this design. + +## 7. No leakage (ADR 0004 §2.6) + +Nothing here trains a matcher (Census assigns the IDs), but two +freezes are registered so audit labels cannot leak backward: + +1. The #235 re-key-signature parameters (industry + class of worker + + earnings tolerance) are frozen at their committed values; they + may stratify this audit but may never be re-tuned on its labels. +2. Audit labels and dispositions may not inform any reader-side + attachment heuristic, imputation feature, or phase-1 hazard + specification. If a leak occurs, the sample retires and a new + manifest issues. + +## 8. Deliverables and sequence + +1. This manifest (pre-lock, per #230 §12.2) — the registered design. +2. Referee round fills the §4 slots. +3. `scripts/build_e4_e5_audit_draw.py` draws the sample under seed + 20260717 → `runs/e4_e5_audit_draw_v1.json` + the blinded evidence + sheets. +4. Coding manual v1 commits; calibration round runs; panel codes. +5. `runs/e4_e5_audit_v1.json` reports arm-(a) precision, arm-(b) + recall, and arm-(c) run-delimitation rates (with the + false-continuation/false-break decomposition) with confidence + bounds, agreement, dispositions. **Sequence (pinned + per the #230 round-1 referee review, S4, matching ADR 0004 + §1.5)**: this manifest is the pre-lock artifact; the C3 block + may lock with the audit *designed but undrawn*; the audit + **results must exist before the first one-shot candidate run** + that scores any E4/E5 cell. Passing uses the one-sided bound, + never the observed proportion. A failed floor invalidates the + E4/E5 cells — no candidate can then pass the block — and the + audit artifact publishes regardless of result: a designed stop + is a graded, publishable outcome, not a re-scoping event. diff --git a/docs/design/ic3_employer_gate_block.md b/docs/design/ic3_employer_gate_block.md new file mode 100644 index 00000000..2ba46bd3 --- /dev/null +++ b/docs/design/ic3_employer_gate_block.md @@ -0,0 +1,1132 @@ +# IC3 employer gate block — thresholds, partitions, and rulings + +- **Design id**: `2026-07-17-ic3-employer-gate-block` +- **Status**: **DRAFT FOR REFEREE — NOT RATIFIED. Revision 6**, + responding to the round-1 adversarial review of 2026-07-17 + (verdict: NOT RATIFIABLE AS DRAFTED — 5 blocking, 6 should-fix). + Blocking items B1, B3, B4, B5 and should-fix S1 are addressed. + **B2 remains open**: the refereed block YAML is still a required + pre-lock artifact (§12.2a). The IC rename (#277) and its final + design filename are composed at their current head, so that YAML + must use `ic3` names from its first commit. §13 records every remaining + decision and distinguishes a workstream decision from referee + ratification. All current prerequisite heads are composed below, + but their external PR approval and merge requirements are not + satisfied by branch composition. Nothing in this + document binds until the lock ceremony flips it (§12). This document + edits no `gates.yaml` cell, moves no threshold, builds no floor, and + writes no test. Every number labelled PROPOSED is a proposal to the + referee round, not a lock. +- **Plan**: issue #192 (E1–E12 battery, two-workstream split, protocol + rules: disjoint calibration/gate cells, floors before thresholds, no + one-shot candidate runs before IC3 locks). +- **Contracts**: ADR 0003 (`docs/adr/0003-employer-firm-extension.md`, + IC1 spell schema and IC2 banding, **frozen**); ADR 0004 + (`docs/adr/0004-linkage-qc.md`, linkage QC). The three #224 adoption + requirements are now in the ADR text on the exact composed head, + not supplied by a comment-thread amendment. +- **Composed prerequisite record** (exact heads, all ancestors of this + revision): master `044d2fc`; IC rename #277 `35499f1`; J2J/J2JOD + references #228 `50404cb`; Workstream A v1 floor promotion #212 + `55ddae0`; Workstream B v1 floor promotion #223 `b4c5b6f`; ADR + 0004 #224 `32f8fed`; cross-wave evidence #235 `d13e8c4`; E4/E5 + registered design #236 `85bcf90`; byte-faithful seam anchor #274 + `42a92cc`. +- **Floor-promotion readiness is not implied by composition.** #212 + is now a reproducible pre-lock anchor: all three builders were + rerun from the exact Census-hosted vintages, every previously + recorded measured value reproduced exactly, source-input and + measurement-environment sidecars were recorded, and E9 now reports + distinct-person counts (stay 16,286; J2J 524). #212 is open and + non-draft; #223 remains draft. Both remain unmerged evidence + pending current-head approval and merge. #212 also leaves the + deployment-scale conversion and threshold choices to the referee. + Neither composition is approval, merge, or ratification. +- **Available evidence pins** (branch-composition pins, not lock-time + merge ratification): + + | Source | Current path | SHA-256 | Lock-time merged pin | + |---|---|---|---| + | #228 E2 reference | `data/external/j2j_us_sexage_2015on.csv` | `6ca16b98b3e809ebf4493f6884c75bee712c727cce16ddc219e0fca97e7edf60` | PENDING merge | + | #228 E11 reference | `data/external/j2jod_us_firmsize_od_2015on.csv` | `0f83df008ae498643b66ecf25187170014988f5fb1f761c84cf9882376e3bef6` | PENDING merge | + | #235 cross-wave artifact | `runs/crosswave_jobid_check_draft_v0.json` | `33d4a7be88b417cb980ad4b12e65e1310eabd541a4926673e2414eead20941f1` | PENDING promotion/merge | + | #235 builder | `scripts/build_crosswave_jobid_check.py` | `3887d392e3d978e2c5788e9e03557101129d9f759917037b756dba6e3ed0cb33` | PENDING merge | + | #236 registered design | `docs/design/e4_e5_audit_manifest.md` | `d37b3ce014532e16e009cd5cf8b025601c029fd0bde48ac593c993d51025d103` | PENDING merge | + | #274 seam anchor | `runs/seam_reconciliation_draft_v0.json` | `622ff4117a073c36698ed1e7d1828a6a0399471bfd0c06520e0da5ac2cd98e83` | PENDING promotion/merge | + | #274 builder | `scripts/build_seam_reconciliation.py` | `61d9c99efcfdf2469caa5787499f853d0321128c56187553d5a5c87d69536f0f` | PENDING merge | + | #212 E4/E5 artifact | `runs/sipp_spell_floors_v1.json` | `500b68034c9a301eb823e1d8f7584cf6c7654bf536247827353b0941d1d026ae` | PENDING approval/merge | + | #212 E4/E5 builder | `scripts/build_sipp_spell_floors.py` | `8ce7e41a9af71767672c39f7933ccde3c2eeaa0aa4f7044c5113f7430439d1dc` | PENDING approval/merge | + | #212 E4/E5 environment/input sidecars | `runs/sipp_spell_floors_v1.{env,inputs}.json` | `124adfc94e32c157886d40b405c4495a4e7a4e935f4bf940a551c551ca6eaba7` / `68a039b0951698b9031d8c29a064a4e2a287f2e2f54552726bf6ed502d7cbe7d` | PENDING approval/merge | + | #212 E3 artifact | `runs/tenure_floors_v1.json` | `08e67e5d362bbd0c1703c85fdb40624de094561f385eceb6d0a9eea4772cc6ff` | PENDING approval/merge | + | #212 E3 builder | `scripts/build_tenure_floors.py` | `fda07dec53ab11c41aab2b7f92dc0c18ecad0f3843d70256bb2f140351b273b1` | PENDING approval/merge | + | #212 E3 environment/input sidecars | `runs/tenure_floors_v1.{env,inputs}.json` | `68df172eb5266ba4771b7d6d8d3c0812fb6e3f2d63486b1104b886abf1e822a2` / `7e0577e3cbce04363017b8bb1c168915d887368a1cc17b57e801998faed754e3` | PENDING approval/merge | + | #212 E8/E9 artifact | `runs/sipp_e8_e9_floors_v1.json` | `b360f04fc785eeb11c8e77e4128bdb8a98d31501a11f048fa2df4e86b1f7e059` | PENDING approval/merge | + | #212 E8/E9 builder | `scripts/build_sipp_e8_e9_floors.py` | `3b2209de9b10cf680f5a074ea0c56077b03ebda68a4a614f2e20f0d0c2455272` | PENDING approval/merge | + | #212 E8/E9 environment/input sidecars | `runs/sipp_e8_e9_floors_v1.{env,inputs}.json` | `b206213d87d4287234d2c5f0838e3237ec7945d6ed8cc2c48db7be1f9cd52258` / `ab5486e0e4b17f881208b6108f618bc6984ed56e13604bd11206c28cbbaee019` | PENDING approval/merge | + | #223 aggregate artifact | `runs/employer_firm_floors_v1.json` | `eb58474b42166d51ccbe80a1c58d33ffb8a60a4a5ac097290fecc6c2a8b92f17` | PENDING approval/merge | + | #223 aggregate builder | `scripts/build_employer_firm_floors.py` | `a748975e787f3b255df611ebcf9cb3808c7b0e88866d9aa10ebe320864900a72` | PENDING approval/merge | +- **Authors**: joint Workstream A (@daphnehanse11) / Workstream B + (@vahid-ahmadi) per the #192 interface-contract schedule (IC3 is the + jointly-authored employer gate block). + +## 1. Scope and shape of the block + +This is the pre-registration draft for the `gates.employer` block +(E1–E12) that will be added to `gates.yaml` by amendment PR after the +referee round. It follows the repo's locked-gate schema conventions: +per-gate `thresholds` derived from committed floor artifacts as +`floor mean + k × floor sd` with machine-checkable derivations +(the `tests/test_gates_derivations.py` pattern), floor runs cited by +path, thin-cell exclusions pre-registered, and `locked: false` until +ratification. + +Two structural rules carry over from #192 and ADR 0003 unchanged: + +1. **Floors before thresholds.** Every gated cell cites a committed + floor artifact; cells with no derivable floor cannot gate + (consequences for E1-sector, E11-detail, E12 below). +2. **No one-shot candidate runs before IC3 locks.** Registration of + employer-block candidates (issue #42 convention) opens only after + the amendment PR merges with `locked: true`. + +## 2. Proposed threshold policy (uniform, PROPOSED) + +For every gated cell: + +``` +threshold_cell = max( floor_mean_cell + k × floor_sd_cell, + substantive_tolerance_gate ) +``` + +- `k = 4` PROPOSED **as a policy choice, not as precedent-following** + (corrects S1). The locked band is **1.8–8**, not 4.2–8: `gates.yaml` + carries k = 4.2 (`:221`), 8 (`:297`), **1.8** (`:327`), **1.9** + (`:333`) and 4 (`:493`), plus negative/band ks for minima and + two-sided metrics. **Two locked ks sit below the proposed 4**, so + precedent does not support 4 as conservative — it brackets it. + The argument that does survive is the aggregated-sd one, and only + partially: the B-side floors aggregate 24–36 year-pairs, but the + SIPP-side floors aggregate 5 seeds *exactly as gate-1's did*, so + for E3/E4/E5/E8/E9 there is no aggregation distinction from + gate-1 at all and k = 4 is a bare policy choice against a band + that reaches 1.8. Recorded as such. The referee round may set k + per-gate; the Workstream A response of 2026-07-17 repeated the + 4.2–8 misquote and is corrected by the same edit (acknowledged + 2026-07-22). +- The `substantive_tolerance` term prevents degenerate-floor cells + (several tenure quantile-gap floors and the E9-stay median floor are + exactly 0.0 — see §4) from imposing a zero tolerance no model can + meet; it is a per-gate scientific-relevance bound, every value + PROPOSED in the table below. +- Cells flagged `thin` in the floor artifacts (E4/E5/E8/E9: + `THIN_CELL_PERSONS = 200`; B-side: min denominator < 10,000 jobs) + are report-only, pre-registered now. +- Verdict rule: a gated gate passes iff **all** its non-thin cells + pass; report-only gates publish pass/fail per cell but do not block. + +## 3. Per-gate proposals + +Summary table (all numbers PROPOSED; "floor basis" names the committed +statistic the threshold derives from): + +| Gate | Moment | Reference | Floor artifact | Recommended floor basis | First-lock status | +|---|---|---|---|---|---| +| E1 | employment share by firm-size band (× sector) | SUSB 2022 | #223 `e1` | SUSB noise-flag CV bounds + BDS YoY margin floor (coarsened `20_99`) | **report-only** — B1: every SUSB-derived margin is a deterministic function of a calibration target | +| E2 | hire/sep/J2J rates by sex × age | LEHD J2J `sa` (#228) | #223 `runs/employer_firm_floors_v1.json`, `e2.by_sex_age` | ex-pandemic YoY \|log ratio\|, PENDING referee choice | **proposed gated** only after floor approval/merge | +| E3 | tenure quantiles by age | CPS tenure supplement 2020/22/24 | #212 `runs/tenure_floors_v1.json` | **ECDF max-gap** (heaping-robust), PENDING referee choice | **proposed gated** only after approval/merge | +| E4 | employer-retention pairs by age × sex | SIPP holdout | #212 `runs/sipp_spell_floors_v1.json`, `e4_retention_by_age_sex` | \|log rate ratio\|, PENDING referee choice | **proposed gated** only after approval/merge and linkage-QC prerequisite (§9) | +| E5 | multi-window attachment runs by age | SIPP holdout | #212 `runs/sipp_spell_floors_v1.json`, `e5_runs_by_age` | \|log share ratio\|, PENDING referee choice | **proposed gated** only after approval/merge and linkage-QC prerequisite (§9) | +| E6 | hire/sep flow rates by firm-size (× sector) | QWI | #223 `e6_e7` | ex-pandemic YoY \|log ratio\| | **report-only** — B1: the size margin is a linear functional of the calibrated size × sector cells | +| E7 | mean earnings (`EarnS`) by firm-size | QWI | #223 `e6_e7` | **aggregate-relative** EarnS floor | **gated** | +| E8 | nonemployment incidence/duration by age | SIPP holdout | #212 `runs/sipp_e8_e9_floors_v1.json`, `e8_nonemployment_by_age` | \|log share ratio\| (any/long), PENDING referee choice | **proposed gated** only after approval/merge | +| E9 | earnings-change dist. by transition type | SIPP holdout | #212 `runs/sipp_e8_e9_floors_v1.json`, `e9_transitions` | j2j: median + IQR gaps, PENDING referee choice; stay: none | **j2j proposed gated after approval/merge; whole stay cell report-only** (B5) | +| E10 | regression gate: locked PSID gates still pass | existing `gates.yaml` | existing gate-1/2 floors | unchanged | **gated** (always) | +| E11 | aggregate J2J flows by origin × destination size | LEHD J2JOD (#228) | #223 `runs/employer_firm_floors_v1.json`, `e11.destination_size_margin` | margin temporal basis PENDING referee choice; detail: none derivable | **aggregate margins proposed gated after floor approval/merge; 5-quarter detail report-only** (§7); certifies no person link | +| E12 | aggregate assignment audit plus linkage/sorting aspiration | public grouped margins / future linked source | #223 `e12` deferral; linkage floor unavailable | strict claims split (§8) | **strong E12 deferred**; aggregate audit may certify observable margins only | + +Per-gate detail follows. + +### E1 — employment share by firm-size × sector (SUSB) + +- **Cells**: five canonical IC2 bands (`LT10`…`B500_PLUS`) × NAICS + sector, from `data/external/susb_us_sector_size_2022.csv`; + calibration consumes the same source's *margins*, so the E1 gate + axis must be the residual structure (see §10). +- **Floor problem** (#223 `method_findings.e1_no_sector_replicate`): + the committed SUSB extract is a single 2022 cross-section — no + same-source temporal/resampling floor exists for size × sector. + The committed composite is (a) SUSB published noise-flag CV bounds + per cell (G ⇒ CV ≤ 2%, H ⇒ ≤ 5%, J ⇒ unbounded) and (b) a BDS + year-over-year national size-margin stability floor, stated on the + coarsened partition keeping `20_99` whole + (`method_findings.e1_bds_straddle`; `bds_fsize_to_canonical` is + inexact across the 50 edge). +- **Recommendation (revised under B1): E1 does not gate at first + lock.** The previous draft gated the national size margin on the + BDS-stability + CV composite, on the reasoning that the coarsened + BDS partition "is not something calibration targets". It is — + exactly, not approximately: per #223's committed groups `1_9` = + LT10 and `10_19` + `20_99` = B10_49 + B50_99 once `20_99` is kept + whole, so the coarsened margin is a **merge** of the SUSB margins + calibration consumes. Scoring it measures source agreement and + calibration convergence, neither of which a candidate can move. + House precedent is directly on point: `gates.yaml` + `not_certified.stock_margins` — "the trivially-passable-stock + problem". Both the margin and the size × sector cross publish + report-only, with the CV/BDS composite floor retained as the + published diagnostic; noise-flag-J cells stay excluded. +- **What would make E1 gate**, registered for the referee (§10.6): + either calibration stops consuming SUSB size × sector margins (a + joint-PR change to frozen ADR 0003, trading calibration fit for + gate power), or a genuinely held-out firm-side axis is committed + with a floor. The old "CV bounds alone as the floor term" + alternative does not help — it changes the floor, not the fact + that the statistic is a function of the targets. +- **Substantive tolerance**: 5% relative share error PROPOSED + (ECPS-convention "±5% of administrative statistics"). + +### E2 — hire/separation/J2J rates by sex × age (LEHD J2J) + +- **Reference**: the #228 `j2j_us_sexage_2015on.csv` extract + (national, 2015Q1–2025Q1; note LEHD `se` is sex×education — sex×age + is the `sa` tabulation, verified empirically and test-pinned). + This is a held-out **gate axis** per ADR 0003: calibration touches + firm-size × sector flow margins only, never the demographic axes. +- **Floor**: #223 `runs/employer_firm_floors_v1.json` + `e2.by_sex_age` floors all 27 sex × age cells from the #228 + extract, with the 2 × 8 non-margin cross pooled separately so + aggregate margins are not double-counted. The same artifact also + retains the aggregate-side firm-size cells. Full and ex-pandemic + variants are both committed per + `method_findings.cycle_signal_in_floors`; the referee still selects + the operative basis. #223 marks the earlier missing-axis finding + `SUPERSEDED`, not silently removed. +- **Recommendation**: **ex-pandemic** YoY \|log ratio\| floors + (e.g. firmsize1 hire rate: full 0.0565 ± 0.0549 vs ex-pandemic + 0.0273 ± 0.0211). Rationale: the full-sample floor treats the + 2020–2021 shock as noise and would roughly double every tolerance; + a model should not get credit for pandemic-sized errors in normal + years. The **full-sample** variant stays on the record as the + referee alternative (argument for it: candidates will be scored on + periods that include shocks). +- **Unit caveat** (ADR 0003): J2J counts jobs, not persons, and the + #228 extract is ownership `oslp`; §11 carries the disposition. +- **Substantive tolerance**: 10% relative rate error PROPOSED. + +### E3 — tenure distribution by age (CPS tenure supplement) + +- **Cells**: BLS age bands × supplement years 2020/2022/2024 + (`PTST1TN`, `PWTENWGT`; reader per #205). +- **Degeneracy finding** (#212 `runs/tenure_floors_v1.json`, + `heaping_caveat`): reported tenure heaps on integers, so + half-vs-half quantile-gap floors are exactly zero in 36/63 cells — + a degenerate threshold basis. +- **Recommendation**: state E3 on the **weighted-ECDF max-gap** + (heaping-robust; non-degenerate in every cell, e.g. 2020 25–34: + 0.018 ± 0.0059). The quantile-gap formulation stays committed as + the referee alternative, but adopting it would require an + arbitrary substantive tolerance to paper over the zeros. +- **Floor rule across years** (registered in the block YAML as + `year_rule` / `derivations.floor_selection: per_cell_own_year`): + the cells are the full 3 × 7 = **21** (year, band) pairs, and each + cell's threshold derives from **its own year's** floor + (`by_year...floor_ecdf_max_gap`). Floors are not + pooled, averaged, or worst-of'd across years — #212 floors each + supplement year separately, so per-year is the only rule its + evidence base supports. Stated here because a bare cell-count pin + with a free `` placeholder would harden the ambiguity rather + than resolve it. +- **Substantive tolerance**: ECDF max-gap 0.02 PROPOSED (comparable + to the largest observed adult-band floor means). + +### E4 — employer-retention pairs by age × sex (SIPP holdout) + +- **Cells**: 6 age bands × sex, monthly same-employer retention + (#212 `e4_retention_by_age_sex`; person-disjoint sha256 + half-splits, seeds 0–4, WPFINWGT-weighted; all 12 cells non-thin, + floors 0.0003–0.0020 \|log ratio\|). +- **Recommendation**: gate on \|log rate ratio\| with the uniform + policy. Because retention rates sit near 1, the floor is tiny; + the substantive tolerance term (PROPOSED: \|log ratio\| 0.005, + ≈ 0.5% of the retention rate) is the operative bound in most cells + — deliberately: retention is exactly the moment a chained model + understates. +- **Prerequisites**: the §6 seam ruling (half-splits share SIPP's + seam structure — `seam_caveat` in the artifact) and the §9 + first-lock linkage audit (E4 is in the minimal-viable-audit scope). + +### E5 — multi-window attachment runs by age (SIPP holdout) + +- **Cells**: 6 age bands, full-year same-employer run share + (#212 `e5_runs_by_age`; floors 0.011–0.049 \|log ratio\|, all + non-thin). This is the employer analogue of the gate-1 runs view: + window-2 moments cannot see chained-persistence understatement, so + E5 is the load-bearing persistence gate and must be **gated**, not + report-only. +- **Recommendation**: uniform policy on \|log share ratio\|; + substantive tolerance \|log ratio\| 0.05 PROPOSED. Same §6/§9 + prerequisites as E4 (E5 is the second member of the + minimal-viable-audit scope). + +### E6 — worker-flow rates by firm-size × sector (QWI) + +- **Cells**: QWI firm-size groups (mapped through + `firms/banding.py`; `firmsize1` "0–19" is an inexact + `LT10+B10_49` span, recorded) × sector, hire and separation rates + (#223 `e6_e7`; 36 YoY pairs, full and ex-pandemic committed). +- **Recommendation (revised under B1): E6 does not gate at first + lock.** The previous draft had the reasoning inverted: it demoted + the sector × size cells for being "close to the calibration + margin" when those cells **are** the calibration targets, and + gated their job-weighted aggregate — the size margin — where the + per-cell miss terms average out. Under calibration convergence + that aggregate passes by construction; under non-convergence it + reports calibration residual. Both publish report-only with + ex-pandemic floors retained as diagnostics. +- **Substantive tolerance**: 10% relative rate error PROPOSED. + +### E7 — mean earnings by firm-size (QWI `EarnS`) + +- **Unit rule** (ADR 0003, restated §11): QWI publishes **mean** + monthly earnings of full-quarter employees, never medians; E7 is + stated on means. +- **Finding** (#223 `method_findings.e7_nominal_trend`): raw EarnS + YoY variation embeds aggregate nominal wage growth — a trend, not + noise. Both the raw and the **aggregate-relative** (cell relative + to the all-size aggregate) floors are committed. +- **Unratified proposal — REFEREE/PENDING**: gate on the + **aggregate-relative** EarnS + moment (the size *gradient* of earnings, which is what firm-size + policy needs) with its ex-pandemic floor; the raw-level cell is + report-only. Referee alternative: gate raw levels with a + deflation rule (requires choosing a deflator — a new registered + input). +- **Substantive tolerance**: 5% relative gradient error PROPOSED. + +### E8 — nonemployment incidence and duration by age (SIPP holdout) + +- **Cells**: 6 age bands × {any-nonemployment share, long + (multi-month) nonemployment share} + (#212 `runs/sipp_e8_e9_floors_v1.json`; floors 0.05–0.20 + \|log ratio\|, all non-thin; censoring-free 12-month-observed + restriction recorded in the artifact and carried into the cell + definition). +- **Recommendation**: uniform policy on \|log share ratio\|; + substantive tolerance \|log ratio\| 0.10 PROPOSED. E8 needs no + worker-to-firm link (ADR 0004 §4), so it has no linkage + prerequisite. + +### E9 — earnings-change distribution by transition type (SIPP holdout) + +- **Cells**: transition classes {stay, j2j} × {median log change, + IQR log change} (#212 `e9_transitions`; entry/exit earnings-change + cells are not defined — one side has no earnings). +- **Degeneracy finding** (`stay_median_heaping_caveat`): within-job + SIPP monthly earnings are wave-constant under dependent + interviewing, so the stay median log-change heaps at exactly 0 and + its floor is degenerate (0.0/0.0) — same failure class as the E3 + integer heaping. +- **Recommendation (revised under B5): the stay cell does not gate + at first lock — both its statistics are report-only.** The + previous draft gated stay on the IQR, presenting it as the + non-degenerate escape from the median's 0.0/0.0 floor. It is not: + `runs/sipp_e8_e9_floors_v1.json` + `e9_transitions.earnings_change.stay.floor_abs_iqr_gap` is + **also** `{mean: 0.0, sd: 0.0}`, so the "IQR-only" gate was 100% + the hand-set 0.02 with no stated basis — a hand-set number + gating alone, which the campaign rule forbids. Both stay + statistics publish as report-only identity checks (a model + reporting a nonzero stay median or a non-degenerate stay IQR is + informative, and worth seeing, but neither can gate against a + degenerate floor). The referee's alternative — defend 0.02 — + was available and is declined: the honest defence would have to + be a substantive claim about how much within-job earnings + variation a model may invent, and SIPP cannot measure that + quantity at all under dependent interviewing, so any number + would be invented rather than derived. Gate **j2j on both** median + (0.2264, floor 0.0766 ± 0.0345) and IQR (1.069, floor + 0.0842 ± 0.0522). Referee alternative for stay: a full + distributional distance (e.g. the harness energy-distance block) + — richer, but no floor is committed for it, so it cannot gate at + first lock (floors-before-thresholds). +- Note the j2j cell counts 545 unweighted pairs — above the thin + flag but the thinnest gated cell in the block; recorded. +- **Prerequisite**: §9 (E9 consumes transition classification). + Its firm-size-conditional variants are **not** in the first lock + are **permanently report-only** under §9.1 Tier 0 (no admissible + truth frame — permanent, not awaiting ratification). + +### E10 — regression gate (locked PSID gates) + +- **Definition**: after the spell layer attaches, every already + locked PSID earnings gate (`gates.gate_1` and successors) must + still pass, under its existing thresholds and floors, unchanged. +- **No new floor, no new threshold, nothing PROPOSED**: E10 + re-scores existing locked cells. +- **Hard rule** (ADR 0004 §4, adopted): **linkage failure never + weakens E10**. An invalid or failed employer-side cell cannot be + traded against, or used to reinterpret, any PSID threshold; E10 is + gated from the first lock and in every subsequent phase. + +### E11 — J2J flows by origin × destination firm size — see §7. + +### E12 — within/between-firm variance and coworker correlation — see §8. + +## 4. Degenerate-floor register + +For the referee's convenience, the committed degeneracies the block +must not gate on directly: + +1. **E3 tenure quantile gaps**: exactly 0.0 in 36/63 cells (integer + heaping) → ECDF max-gap is an unratified proposal (#212). +2. **E9 stay median AND stay IQR**: *both* floors exactly 0.0/0.0 + (wave-constant reporting under dependent interviewing) → the + whole stay cell is report-only (#212; corrected under B5 — the + previous version of this register listed only the median and + presented the IQR as the non-degenerate escape, which it is + not). +3. **E1 sector axis**: no floor derivable from committed extracts + (single-vintage SUSB) → report-only (#223). +4. **E11 detail cells**: no floor derivable (five-quarter published + window, no YoY pair structure) → report-only (#228, §7). +5. **E12**: no reference extract at all → deferred (#223, §8). + +Distinct from all five, and not a floor degeneracy: **E9/E11 +firm-size-conditional cells** have no admissible *truth frame* +(§9.1). The five above are cells whose floor cannot be measured; +those are cells whose target quantity has no per-record referent at +all. They are **permanently** report-only — the status must carry +that permanence explicitly, since "report-only" elsewhere in this +block means "unratified pending evidence", which these can never +become. + +## 5. Views and cell registration (schema sketch) + +Following the `views:` convention of `gates.yaml`, the amendment PR +registers (names PROPOSED): + +- `sipp_job_spells` — loader `populace_dynamics.data.sipp_jobs`, + pu2023 (ref. year 2022), person-disjoint holdout, WPFINWGT; + feeds E4/E5/E8/E9; floor paths are + `runs/sipp_spell_floors_v1.json` and + `runs/sipp_e8_e9_floors_v1.json`. Their current artifact, builder, + environment, and input digests are recorded above. The exact-vintage + rebuild reproduced every prior measured value and recorded the E9 + distinct-person counts. They still cannot enter block YAML before + current-head review, approval, merge, and referee resolution of the + registered scale and threshold choices. +- `cps_tenure` — CPS Jan supplements 2020/2022/2024; feeds E3; + floor path `runs/tenure_floors_v1.json`, with current artifact, + builder, environment, and input digests above. The exact-vintage + rebuild reproduced every prior measured value; current-head review, + approval, merge, and referee threshold choice remain required. +- `employer_firm_targets` — the committed + `data/external/{susb,bds,qwi,j2j,j2jod,j2j_sexage}_us_*.csv` + extracts (external references, never scored model output); + feeds E1/E2/E6/E7/E11; floor path + `runs/employer_firm_floors_v1.json`, with artifact, builder, and + every consumed extract digest pinned by #223. It remains a + pre-lock, not-ratified anchor pending current-head review and merge. + +## 6. The seam ruling (formal proposal, from #214) + +`runs/seam_reconciliation_draft_v0.json` measured, on linked SIPP +job-months: within-wave monthly separation ≈ 1.7–1.8% (means 0.0171 +file-year 2022, 0.0182 file-year 2023) against a Dec→Jan across-wave +seam rate of **9.45%**, while the J2J national benchmark's +monthly-equivalent main-job separation rate runs ≈ 3.5–4.6%. The +artifact's concept deltas (jobs-vs-persons, main-job-vs-all-jobs, +UI-covered universe, the 1−(1−q)^{1/3} approximation) are carried +into the record, including the naming note that SIPP's ~0.35% +person-level direct J2J rate and Census J2J's separation benchmark +are different universes, not a contradiction. + +**Proposed ruling (to be ratified by this referee round — the +artifact itself is marked NOT RATIFIED):** + +1. **J2J is truth for rate LEVELS** (separation/hire/J2J levels in + E2/E6 gate against the LEHD references, not against SIPP's + seam-distorted levels). +2. **SIPP is truth for persistence STRUCTURE** (E4/E5/E8/E9 + conditional and distributional shape — J2J publishes no + within-person structure). +3. **Phase-1 hazards are estimated seam-aware**: wave-frequency + estimation with within-wave interpolation, so the 5.5× within-wave + vs seam contrast never enters a hazard as if it were a real + monthly time-pattern. + +**Cross-wave check delivered, operative interpretation PENDING.** +#235 is a disclosed re-analysis, not a pre-registration. From its +committed counts, excess re-key signature is 15.12% on E→E +separations (`PASS_WITH_CORRECTION_BAND` under the unratified bands) +and 9.36% after scaling to all separations (`PASS`). The one-sided +95% uppers are 17.65% and 10.92%, respectively. Its author-proposed +15%/30% bands and operative population remain `REFEREE`; this +control document chooses neither. This is the first item in Vahid's +2026-07-30 continuation comment and must be settled before promotion. + +Whichever population is chosen, the scale direction is explicit: +E→E-conditional excess may be multiplied by the observed E→E share +of all seam separations to produce the all-separations excess. +The inverse operation is not an evidentiary correction, and neither +quantity is a correction to the measured 9.45% seam separation rate. +The seam ruling above therefore remains proposed, with its confidence +framing PENDING the population and band decisions. + +## 7. E11 — the window decision (explicit referee choice) + +Material finding from #228, test-pinned (`test_j2jod_detail_window`): +the national origin × destination firm-size cross in J2JOD is +published **only 2015Q1–2016Q1** — five quarters. From 2016Q2 every +detail cell carries status flag 11 (a state coverage gap propagated +to the national aggregate; J2J Explorer suppresses identically). +The one-sided margins run through 2025Q1. + +Vahid's 2026-07-30 synthetic-layer decision records the strict +claims boundary: grouped size/industry employment, mean-earnings, +and flow reproduction can support an **aggregate assignment audit**; +it cannot establish true linkage, coworker sorting, within/between +variance, firm effects, or spillovers. E11 is therefore an +aggregate-only statistic under either option below. A pass never +means that a SIPP/CPS worker has the correct firm or coworkers. + +The referee round must still choose between: + +- **(a) Aggregate margins-gated + detail report-only.** Gate the + origin-size and destination-size margins (the `ee_hire_rate` / + `ee_separation_rate` cells whose destination-margin floor is + composed at #223 + `runs/employer_firm_floors_v1.json.e11.destination_size_margin`), + on the referee-selected raw-count versus aggregate-relative and + full versus ex-pandemic temporal basis; score the full 6×6 detail + on the 2015Q1–2016Q1 + window **report-only**. Rationale: a five-quarter window supports + no temporal-stability floor (floors-before-thresholds forbids + gating it), and a gate pinned to a nine-year-old suppressed + vintage would be an evidentially weak lock; but the detail window + is still the only published look at the size ladder, so it stays + on the record. +- **(b) Detail-gated on the five-quarter window.** Requires the + referee to accept a non-temporal floor basis (e.g. noise-infusion + margin slack) and the vintage staleness; on the record as the + alternative. + +Under (a), ADR 0004's E11 ordered-pair linkage rules attach to the +report-only detail cells and to the margins-gate's origin/destination +assignments respectively; the joint-pair audit becomes operative only +if (b) is chosen or the detail cell is later promoted. + +For first lock, no person-level E11 origin/destination assignment is +certified. The gate-eligible object in (a) is the grouped flow margin +itself, held out under §10; linkage QC cannot be inferred from its +aggregate fit. + +## 8. E12 — two-tier claims boundary; strong form deferred + +Vahid's decision record on issue #282 adopts the “both” posture with +a strict scope: + +1. **Aggregate assignment audit**: a future, separately floored audit + may certify reproduction of observable grouped size/industry + employment, mean-earnings, and flow margins. It certifies those + margins only. Its exact statistic, calibration/gate partition, and + noise floor remain `PENDING`; no aggregate E12 threshold is + introduced by this revision. +2. **Linkage/sorting E12**: true coworker assignment, + within/between-firm variance, worker sorting, firm effects, and + spillovers require linked employer-employee evidence and an audit at + the co-assignment unit. No current public source can power that + test. This strong form remains a registered aspiration and a + no-go boundary for those claims. + +Thus strong E12 is **deferred** in the first IC3 block: definition +recorded, no threshold, no floor, and no `locked: true` claim. +Passing E11 or any later aggregate audit may support grouped-margin +representativeness; it may not be cited as observed linkage, +firm-identity, coworker, variance-decomposition, causal firm-effect, +or spillover validation. The synthetic firm register remains usable +for explicitly firm-size-keyed policy analysis under that limitation. + +## 9. Linkage-QC integration (ADR 0004 as amended) + +ADR 0004 is adopted **with the three changes from the Workstream B +review** (PR #224 review comment), which this block operationalizes: + +1. **Minimal viable audit scope for the first lock.** The full + two-arm, five-band × NAICS-major × transition-class × primary_job + powered audit would move the lock well past the #192 schedule. + First lock therefore audits **E4/E5 SIPP-internal employer + attachment only** — the assignment where hand-adjudicable truth + demonstrably exists (within-panel `EJB` job-ID attachment, with + the §6 cross-wave ID check as its natural companion artifact). + The full grid (E9 transition classes, E11 ordered pairs) phases + in behind it; a gate promoted later (e.g. E11 detail) must clear + its ADR 0004 audit at promotion time, never inherit the E4/E5 + pass. +2. **Phase-1 imputed-band adjudicability — answered in §9.1, not + left to the round.** The draft previously carried this as a + blocking open item (§13 item 6). It is now answered, because the + answer determines what the referee is being asked to ratify: no + admissible per-record truth frame exists, and per-record + adjudication is not a well-posed question for a draw-based + imputation at all. The degradation ladder for E9/E11 + firm-size-conditional cells is registered in §9.1. First lock + still scopes those conditional cells out (§3-E9, §7) — but now + for a stated reason rather than by avoidance. +3. **Named owners.** Workstream B (@vahid-ahmadi) owns the + **firm-side sidecar specification** (schema, versioning; sidecars + join IC1 on `person_id`/`spell_id`, never amend IC1) and the + firm-side audit artifacts. Workstream A (@daphnehanse11) owns the + E4/E5 SIPP-internal adjudication frame and coder-panel operation. + Numeric `P_floor`, `P_design`, α, power, and the recall-gating + decision are referee items (ADR 0004 §6.1), not owner decisions. + +Unchanged ADR 0004 rules restated as binding on this block: audit +precedes the one-shot run; passing uses the one-sided confidence +bound, not the observed proportion; a failed floor invalidates the +cell (no threshold shopping); linkage failure never weakens E10. + +### 9.0 Linkage-bias reweighting (ADR 0004 §3) + +**Closes blocking item B4.** #224 is three-part by its own title — +precision floors, adjudication samples, **linkage-bias +reweighting** — and the previous draft operationalized the first +two and silently dropped the third, while §13 claimed to enumerate +"every decision this draft leaves to the referee". First-lock +scoping to E4/E5 narrows the strata; it does not repeal §3. E4 and +E5 are link-consuming gated cells, so ADR 0004 §3.4 binds them: +every link-consuming cell publishes **weighted and unweighted**, +with the operative version chosen **before candidate results are +seen**. + +Instantiated at first-lock scope, from Workstream A's offer +(2026-07-22) with the B-side registrations added: + +- **Analysis unit**: E4 uses the adjacent-month job-pair; E5 uses the + maximal same-ID run registered by #236. A pair-level score cannot + automatically weight a run. **Clustering**: worker for both units + (a person contributes many pairs/runs; they are not independent). +- **Target reference populations**: E4 targets all eligible + adjacent-month job-pairs in the #235 population—384,747 + within-wave job holdings plus 10,828 seam holdings, retained as + separate risk strata. E5 targets the corresponding maximal-run + frame defined in #236. Neither target is the adjudicated subsample; + reweighting carries audit results from each sampled arm to its + registered frame and never pools across the seam axis. +- **Candidate observables `X`**: age band, sex, industry section, + establishment-size code (IC2 span, inexactness carried), earnings + tercile, multi-job flag, and the **seam-vs-within indicator**; + E5 additionally includes pre-link run-length stratum — + the last is load-bearing, since #214/#235 establish the seam as + the dimension along which attachment behaviour differs most. +- **Weight construction**: separate pair- and run-unit inclusion + propensities over their registered `X`, with the functional form + and any trimming left REFEREE. Audit sample-inclusion weights and + later linkage-bias weights remain distinct. +- **Overlap/balance tolerances, trimming percentile, propensity + specification**: REFEREE (ADR 0004 §6.4) — added to §13 as item + 17. +- **Operative version** (weighted vs unweighted) for E4, E5 and — + when they promote — E9, E11, E12: REFEREE, registered **before** + any candidate scores exist, per §3.4. Added to §13 as item 18. +- **Publication rule**: both versions publish for every + link-consuming cell regardless of which is operative; a divergence + between them is itself a reportable finding, not a nuisance to be + resolved silently. + +Not in first-lock scope but registered so promotion cannot skip it: +E9, E11 and E12 acquire their own §3 instantiation at promotion +time, never inheriting this one (the §9 no-inheritance rule). + +### 9.1 Imputed firm-size bands: no admissible truth frame + +**The finding.** There is no admissible per-record truth frame for a +QRF-imputed firm-size band on a CPS host, and the deeper problem is +that ADR 0004's machinery presupposes something the imputation does +not produce. + +**Why no candidate source qualifies.** Four exist and each fails on +its own terms: + +| candidate | why it cannot serve as truth | +|---|---| +| CPS ASEC `NOEMP` | it **is** the training label. Scoring an imputation against its own label measures fit, not accuracy — and `NOEMP` describes the *preceding calendar year's longest job*, not the spell being scored (ADR 0003 reference-period mismatch), so it is not even a description of the right object | +| SIPP `EJB{n}_EMPSIZE` | measures **establishment** size, not enterprise size (#192 finding 1) — a different quantity, not a noisier reading of the same one. Also a different sample: SIPP persons are not the CPS hosts being scored | +| LEHD / SUSB administrative firm size | the true quantity, but there is no public linkage from an administrative employer record to a public-use CPS person. This is the same wall E12 hits (§8) | +| pre-redesign SIPP (2008 panel) | worker-reported all-locations firm size, representative and jointly observed with tenure — the ADR 0003 conditioning bridge. Still a *self-report* (a noisy measure), aged to 2008-2013, and again a different sample from the CPS hosts | + +**Why the question is ill-posed, not merely unanswerable.** ADR 0004 +is written for an *assignment*: a matcher claims that this record and +that record are the same employer, and a coder can in principle +adjudicate whether they are. Precision and recall are defined +because each unit has a true class. + +A QRF imputation makes no such claim. It draws a band from a +conditional distribution given the host's covariates. The draw is not +an assertion that this person worked at a firm of that size; it is a +realization chosen so that the *population* carries the right joint +distribution. There is no fact of the matter about an individual +draw to be right or wrong about, so "precision of the imputed band" +has no referent — even with perfect administrative data in hand, a +correctly specified imputation would score arbitrarily badly per +record, and a degenerate one that always emitted the modal band +would score better. + +Reporting a per-record precision for imputed bands would therefore +be worse than reporting nothing: it would be a number that improves +as the model gets worse. + +**The consequence that actually binds.** A gate on a +firm-size-conditional cell, where the conditioning band is imputed +and the reference margin is one the model was calibrated to, tests +the **calibration**, not the model. It passes by construction. This +is the trap the ladder below exists to prevent, and it is a +different failure from the E12 identification gap: E12 lacks a +reference; this lacks an *independent* one. + +**Registered degradation ladder.** What person-level E9/E11 outcomes +conditioning on an imputed band degrade to, in force from first lock: + +- **Tier 0 — permanent report-only, per the round-1 disposition.** + The rule below is carried **verbatim** from Workstream A's §13 + item 6 response, per the referee's round-1 disposition + ("Workstream A's permanent-report-only-with-degradation-rule is + the right shape; carry the rule verbatim into the draft YAML, not + the comment thread"): + + > "Cells conditioning on imputed firm-size bands are validated + > distributionally (calibration fit to SUSB margins plus + > held-out-axis stability) and are report-only in every phase; + > they gate only if an external person-level truth source + > materializes, at which point they enter through the standard + > promotion ceremony (new floor + ADR 0004 audit)." + + The later 2026-07-30 #282 decision clarifies the scope: this + permanent disposition binds person-level cells whose interpretation + requires the imputed band to be correct for that person. It does not + prevent a genuinely held-out **aggregate** grouped-margin audit from + certifying reproduction of that margin under §7/§8. Such an + aggregate pass still certifies no individual assignment. + + The word doing the work is **permanent**: report-only here does + not mean "awaiting ratification", it means the cell has no + admissible referent and no amount of further evidence of the + present kind changes that. The status label must say so, or a + later reader will mistake it for the ordinary unratified case. + + *(Drafting note, for the referee: an earlier revision of this + section proposed excluding these cells under a distinct + `no_admissible_truth_frame` status rather than publishing them + report-only, on the reasoning that report-only implies a + measurement whose status is merely unratified. That is a labelling + disagreement, not a substantive one, and the round-1 disposition + settles it toward report-only. It is recorded here rather than + dropped because the concern it encodes — that "report-only" reads + as provisional — is exactly what the permanence wording above + must defeat.)* +- **Tier 1 — calibration identity, never called validation.** The + imputed band marginal must reproduce its SUSB/QWI calibration + target. This is a build check: it is near-tautological, it is + registered as such, and it may not be cited as evidence the band + imputation is correct. +- **Tier 2 — aggregate audit on a genuinely disjoint margin.** A + grouped firm-size statistic becomes gate-eligible only against a + reference margin **not used in calibration**, per the ADR 0003 + disjoint partition already registered in §10. E11's origin × + destination ladder is the live example: the size *margins* are + calibration targets, so the ladder's off-diagonal structure is the + only part carrying independent information. Promotion also + requires a committed floor first (floors-before-thresholds), which + §7 shows the five-quarter detail window does not currently + support. Tier 2 certification stops at aggregate reproduction and + never promotes the underlying person-level band assignment. +- **Tier 3 — full per-record adjudication: only with a linked + reference.** Gated on the same condition as E12 (§8). If a linked + employer-employee reference ever becomes available, ADR 0004's + audit machinery becomes applicable *and required* at promotion + time; a cell promoted then never inherits the E4/E5 pass (§9 item + 1). + +**Scope note.** This section is about *imputed* bands only. E4/E5 +SIPP-internal employer attachment is unaffected: that is a genuine +assignment with hand-adjudicable truth, which is exactly why §9 item +1 scopes the first-lock audit to it. + +**What the referee is asked to ratify** (replacing the old §13 item +6): the ill-posedness finding, the four-source refutation, and the +four-tier ladder. The ladder's Tier 0 carries Workstream A's rule +verbatim per the round-1 disposition; what is newly asked of the +round is (a) the ill-posedness argument as the *stated basis* for +that rule — round 1 accepted the shape without one on the record — +and (b) Tier 2's rule that a calibrated margin can never serve as +the reference for a cell conditioned on it, which is the same +partition-integrity principle as blocking item B1 applied to +conditioning variables rather than to gated statistics. + +## 10. Calibration/gate cell partition (exhaustive, E1-E12) + +**Re-issued in full to close blocking item B1(ii).** The previous +version listed two calibration families and four gate axes and +omitted E6 and E7 on both sides — an enumeration that cannot +support a mutation test, because a gate with no registered cells +has nothing to mutate. This version enumerates every gate, its +disposition, and the reason it is or is not disjoint from fitting. + +### 10.1 The ONLY quantifier (binds every fitting stage) + +Registered as binding, not as description: + +> **No stage that fits, calibrates, reweights, or tunes any part of +> the employer layer may consume any statistic listed in §10.3, on +> any source, at any aggregation, in any phase.** "Stage" means +> `microcalibrate` reweighting, phase-1 transition-hazard +> calibration, QRF hyperparameter selection, and any post-hoc +> alignment or raking step, whether or not it is called +> calibration. + +The old §10 constrained `microcalibrate` alone. #192 phase 1 has +hazards "calibrated to QWI/J2J", so hazard calibration was an +unregistered consumer — which left the E2 sex × age and E11-margin +holdouts unenforceable exactly where they matter. The quantifier +above closes that; the draft YAML (B2) carries the §10.3 list in +machine-checkable form so a dropped, added, or renamed cell fails a +test. + +**Corollary, registered explicitly** (§9.1): a statistic is not +held out merely because calibration did not target it *by name*. A +deterministic function of calibration targets — a margin, a merge, +a coarsening, any linear functional — is a calibration target. This +is the test B1 applied to E1 and E6, and it is the test §10.3 must +be read under. + +### 10.2 Calibration inputs (consumed by fitting; never gated) + +- **SUSB employment margins**: canonical size band × NAICS sector + (`susb_us_sector_size_2022.csv`), SUSB universe (private, ex + NAICS 92, crop/animal production, non-employers; `class_of_worker` + scoping per IC1). +- **QWI flow margins**: firm-size × sector hire and separation rates + (`qwi_us_firmsize_sector_2015on.csv`, ownership `op`). +- **Every deterministic function of the above**, per §10.1's + corollary — including the national size margins of both, and the + BDS coarsened partition (`1_9` = LT10 exact; `10_19` + `20_99` = + B10_49 + B50_99 exact once `20_99` is kept whole), which is a + merge of the SUSB margins calibration consumes. +- **Phase-1 hazard-calibration references**: the J2J/QWI *national + flow levels* used to set hazard rates per the #214 seam ruling + (J2J for levels). Registered here as a fitting input so §10.1 + binds it. + +### 10.3 Gated cells (held out from every fitting stage) + +| gate | gated cell family | disjointness basis | +|---|---|---| +| E2 | sex × age hire/sep/J2J rates (#228 `sa` extract) | demographic axes; no fitting stage consumes a sex- or age-crossed statistic | +| E3 | tenure ECDF max-gap by age (CPS supplement) | different source; not a calibration input | +| E4 | employer-retention pairs by age × sex (SIPP holdout) | different source, held-out persons | +| E5 | multi-window attachment runs by age (SIPP holdout) | different source, held-out persons | +| E7 | **aggregate-relative** `EarnS` gradient by firm size | calibration consumes QWI *flow* margins (hire/sep), never `EarnS`; earnings is an untouched axis of the same file | +| E8 | nonemployment incidence/duration by age (SIPP holdout) | different source, held-out persons | +| E9 | j2j earnings-change median + IQR (SIPP holdout) | different source, held-out persons | +| E10 | the locked PSID gates, re-scored | PSID; disjoint by construction | +| E11 | aggregate destination-size EE flow **margins** (J2JOD) | J2JOD is not a calibration input; certifies aggregate reproduction only (§7) | + +**E11 caveat, registered rather than assumed.** J2JOD margins are +not consumed by fitting *as committed*, but they are close kin to +the QWI/J2J flow margins that are. They stay gate-eligible on the +condition that §10.2's hazard-calibration references are pinned to +the QWI/J2J extracts and never extended to J2JOD. If a future +phase calibrates to J2JOD, E11 margins move to §10.4 by this +rule, without a further referee round. + +### 10.4 Report-only at first lock (not gated) + +| gate | cell family | why not gated | +|---|---|---| +| **E1** | national size margin **and** size × sector cross | **B1**: both are deterministic functions of the SUSB margins calibration consumes. The coarsened BDS partition is an exact merge of them, so scoring it tests source agreement and calibration convergence — neither of which a candidate can influence. House precedent: `gates.yaml` `not_certified.stock_margins`, "the trivially-passable-stock problem". The CV/BDS composite floor is retained as a published diagnostic | +| **E6** | size margin **and** size × sector cells | **B1**: the size margin is a job-weighted aggregate of the calibrated size × sector cells — a linear functional of calibration targets. Under convergence it passes by construction; under non-convergence it measures calibration residual. The old draft had this inverted, demoting the sector cells (the literal targets) while gating their aggregate, where miss terms average out. Floors retained as diagnostics | +| E7 | raw `EarnS` levels | nominal trend, not noise (#223); the gradient carries the signal | +| E9 | stay median **and** stay IQR | both floors degenerate — see §4 and §11.4 (B5) | +| E11 | 5-quarter origin × destination detail | no temporal replicate: one YoY pair per cell (#223 v1 `e11.detail_window`) | +| E9/E11 | any person-level outcome conditioned on that person's imputed firm-size band | §9.1 Tier 0 — no admissible per-record truth frame, **permanently** report-only | +| — | firm-age axis (QWI/BDS) | held-out axis registered, but no committed extract or floor | +| — | state axis (QWI state-level) | held-out axis registered, no committed extract or floor | + +### 10.5 Deferred (cannot lock) + +| gate | status | +|---|---| +| E12 strong linkage/sorting form | no adjudicable linked reference exists (§8); strict claims no-go attaches | +| E12 aggregate form | statistic, disjoint partition, floor, and threshold all PENDING a later promotion (§8) | + +### 10.6 What B1 costs, stated plainly + +Demoting E1 and E6 leaves the first lock gating **E2, E3, E4, E5, +E7, E8, E9(j2j), E10, E11(margins)** — nine gates, of which only +E2, E7 and E11-margins are firm-side. The employer block's +firm-side gating power at first lock is therefore thinner than the +#192 plan implied, and this document should not disguise that: the +alternative on offer is not a stronger block but a block whose +firm-side gates pass by construction. + +Two routes exist to restore firm-side power, both out of scope for +first lock and both registered here as the honest options: (a) stop +calibrating to QWI flow margins and gate them instead — a joint-PR +change to the frozen IC2/ADR 0003 partition, trading calibration +fit for gate power; (b) commit a genuinely held-out firm-side +reference (firm-age or state axis) with a floor, promoting through +the standard ceremony. + +## 10A. Substantive-tolerance basis register (B5) + +Under `threshold = max(floor mean + 4·sd, substantive_tolerance)` +the hand-set term **is the operative threshold** wherever the floor +is small or degenerate. Round 1 found seven tolerances with no +stated basis. The campaign rule is that a hand-set number may gate +only as an explicitly disclosed policy choice **with a rationale**, +so each is given one here or the cell stops gating. + +| tolerance | value | operative? | basis | +|---|---|---|---| +| E1 | 5% relative share | n/a — report-only under B1 | ECPS convention ("±5% of administrative statistics"). Retained for the published diagnostic | +| E2 | 10% relative rate | rarely (floors 0.055–0.097 dominate) | a 10% error in a demographic-specific hire/separation rate changes the implied annual turnover of that group by ~1pp at observed levels — below the smallest published J2J demographic gradient the model is meant to reproduce. Disclosed policy choice | +| E3 | 0.02 ECDF gap | often | largest adult-band ECDF floors (#212); a 2pp shift in the tenure CDF at any point is ~0.4 years at observed density — within the CPS supplement's own rounding | +| E4 | 0.005 \|log ratio\| | most cells (floors 0.0003–0.0020) | anti-**understatement** posture, stated: the E4 floors are so tight that floor+4·sd would gate on differences no consumer could act on. 0.005 is ~0.5% relative retention error. Deliberately the binding term | +| E5 | 0.05 \|log share ratio\| | sometimes (floors 0.011–0.049) | one order of magnitude above the E4 bound, reflecting that multi-window run shares compound single-window error over the window length (ADR 0004 §4's compounding argument, applied to tolerance rather than to audit) | +| E6 | 10% relative rate | n/a — report-only under B1 | as E2. Retained for the diagnostic | +| E7 | 5% relative gradient | sometimes (floors 0.005–0.012 relative) | the firm-size earnings gradient is the quantity firm-size policy reads; 5% of the observed large-vs-small gradient is smaller than the gap between adjacent canonical bands, so a passing model preserves band ordering | +| E8 | 0.10 \|log share ratio\| | sometimes (floors 0.05–0.20) | nonemployment incidence drives benefit-eligibility spells; 10% relative error on an age-band incidence is ~1pp at observed levels, below the ASEC-vs-SIPP level disagreement for the same concept | +| E9 j2j | none set | no (floors 0.0766 / 0.0842 dominate) | not needed; floors are non-degenerate | +| E9 stay | **withdrawn** | — | was 100% operative against a degenerate floor with no basis; cell demoted to report-only (§3-E9, B5) | +| B-side thin flag | 10,000 jobs | — | below | + +**The 10,000-job thin flag** (§13 item 15's B side, previously "a +draft choice"). Reference calculation: treat a cell's YoY \|log +ratio\| as if the flow count were binomial in the denominator — +`sd ≈ sqrt(2(1-p)/(Np))`. At a typical p ≈ 0.10 separation rate: + +| N (jobs) | implied \|log ratio\| sd | +|---|---| +| 2,000 | 0.095 | +| 5,000 | 0.060 | +| **10,000** | **0.042** | +| 20,000 | 0.030 | +| 50,000 | 0.019 | + +The measured B-side floors run 0.035–0.097. So at N = 10,000 the +pure count-noise term (0.042) is already the same size as the +smallest floors we measure, and below 10,000 it exceeds them — +meaning the "floor" would be measuring the denominator rather than +the source's temporal stability, which is what it is for. + +**Stated honestly**: LEHD cells are noise-infused population +counts, not samples, so this is an order-of-magnitude analogy and +not a derivation. It is offered as the *disclosed basis for a +policy choice*, which is what the campaign rule requires — not as a +sampling result. The A-side 200-person rule has a directly +comparable rationale on the record (Workstream A, 2026-07-17: at +p ≈ 0.5 a 200-person half gives a half-vs-half \|log ratio\| sd +near 0.14). + +## 11. The three unit rules (ADR 0003) — IC3 dispositions + +1. **QWI/J2J cells count jobs, not persons.** Phase 0 is + primary-job-only, so person-spells vs job-count cells carry a + wedge on the order of the multiple-jobholding rate (~5%, + time-varying). **Disposition (PROPOSED)**: a pre-registered + jobs/person adjustment factor, published per cell alongside its + source (CPS multiple-jobholding rate series), applied to E2/E6/E11 + comparisons before scoring. **Scale direction is fixed** by the + recorded Workstream A decision: inflate person-denominated model + cells to the job-denominated QWI/J2J scale, never deflate the + administrative job references to persons. The exact formula, + series, and vintage remain REFEREE/PENDING in the amendment + record—an explicit pre-registration item, not a footnote. +2. **QWI publishes mean earnings (`EarnS`), never medians.** + **Disposition**: E7 stated on means (§3-E7); no median-based + employer earnings gate exists in the block. +3. **J2J ownership `oslp` vs QWI `op` vs SUSB (no government).** + NAICS 92 is dropped from the J2J extracts, but state/local + employment embedded in sectors 61/62 remains. **Unratified + disposition — REFEREE/PENDING**: carry the scope difference as a + pre-registered per-cell caveat on E2/E11. The #228 comparison + cannot identify an excluded-public-`N` adjustment: the LED tool + margin is above the flat file in 37/41 quarters and the deviations + are two-sided, consistent with independent noise infusion, + rather than restating J2J on a private-comparable basis — a + restatement would require a new extract and re-floor. + The restatement option stays on the record as the referee + alternative (§13 item 13). + +## 12. Registration and lock ceremony + +Per repo convention (gate-1 precedent PR #33/#39; `gate_m6` ceremony +in `docs/design/m6_projection_engine.md`): + +1. This document circulates for the **referee round** (adversarial + review; every §13 item answered on the record). +2. Required pre-lock artifacts land **and are immutable** + (closes blocking item B3): + - **COMPOSED at `b4c5b6f`, not approved/merged #223**: + `runs/employer_firm_floors_v1.json`, with artifact, builder, + and all six consumed-input digests pinned. Composition supplies + the exact current evidence for review; it does not satisfy the + current-head approval or merge requirement. + - **COMPOSED at `55ddae0`, reconciled, not approved/merged #212**: + the three + exact v1 paths plus current artifact, builder, input-sidecar, and + measurement-environment pins listed above. Exact-vintage rebuilds + reproduced every prior measured value and E8/E9 records the exact + stay/J2J distinct-person counts. Current-head approval and merge, + deployment-scale conversion, and referee threshold choices remain + required before these can enter the lock. + - **COMPOSED at `d13e8c4`, not merged/promoted #235**: current draft + `runs/crosswave_jobid_check_draft_v0.json`. Promotion reconciles + its internal `draft_v1` label and lands + `runs/crosswave_jobid_check_v1.json`; this control revision does + not rename it. + - **COMPOSED at `85bcf90`, not merged #236**: + `docs/design/e4_e5_audit_manifest.md`, registered and undrawn. + - **COMPOSED at `42a92cc`, not merged/promoted #274**: byte-faithful + `runs/seam_reconciliation_draft_v0.json` and builder. The later + v1 pin/amendment must not rewrite the restored draft anchor. + - Promotion of #235 and #274 draft artifacts to reviewed, + sha256-pinned v1 paths. The three #212 files already carry + reconciled v1 names and current provenance pins, but still require + approval and merge. + - **COMPOSED at `32f8fed`, not merged #224**, with the three + adopted changes folded into `docs/adr/0004-linkage-qc.md`'s + text. A locked block + whose normative ADR exists only as a branch file amended by + comment thread is not a locked contract. + - **Every cited prerequisite PR merged to master** (#212, #223, + #224, #228, #235, #236, #274, #277) and **every consumed artifact + sha256-pinned at its merge commit**. The draft's evidence base + is currently "cited by branch pending merge" over force-pushable + refs; the round-1 as-reviewed pin list is the record of what + round 1 saw, and the amendment PR must pin what the *lock* + sees. + - **COMPOSED at `35499f1`, not merged #277**: the block YAML is + authored once under final IC1/IC2/IC3 names after that + prerequisite merges, rather than renamed after being refereed. +2a. **The refereed block YAML** (closes blocking item B2, part 1). + A committed `docs/design/ic3_employer_gate_block_draft.yaml` — + enumerated cells for every gate, `derivations` blocks in the + `tests/test_gates_derivations.py` pattern, the §10.3/§10.4 + partition in machine-checkable form, `locked: false` — is a + pre-lock artifact, refereed in this round's continuation and + carried **verbatim with exactly the lock-time deltas** at the + flip (the gate_m6 precedent, `gates.yaml:5327-5332`). Prose plus + PROPOSED numbers is not a refereeable block: transcription + errors, silent cell additions and derivation drift would first + appear in the amendment PR, unrefereed. + +2b. **Referee verification before merge** (B2, part 2). The + campaign ceremony is draft → adversarial referee → fixes → + **verification** → ratify-by-merge. M6 ran an explicit referee + re-check before its flip. §12.3's cross-workstream approval is a + party check and does not substitute. The amendment PR carries an + M6-style lock table: builder script commits, artifact sha256s, + the complete authorized edit surface, and guard tests including + cell-count mutation pins. + +3. A single **amendment PR to `gates.yaml`** adds the employer block + with referee-resolved numbers, machine-checkable derivations + (`tests/test_gates_derivations.py` pattern), and `locked: true`; + authorship by one workstream owner plus approval by the other + (the ADR 0003 cross-workstream approval norm). Merge of that PR + is the ratification event; nothing in this draft binds before it. +4. **No one-shot candidate runs before the lock.** Employer-block + candidates register on issue #42 only after the amendment PR + merges. Subsequent changes to locked thresholds require a public + amendment plus a fresh referee round. + +## 13. Open questions for the referee round + +Every decision this draft leaves to the referee, enumerated: + +1. **Threshold policy — REFEREE/PENDING**: set the common or + gate-specific `k`, and ratify every substantive tolerance in §3. +2. **Temporal-floor basis — REFEREE/PENDING #223**: choose + ex-pandemic or full-sample floors for E2/E6/E7/E11 margins. +3. **E1 treatment — WORKSTREAM DECISION RECORDED; REFEREE + VERIFICATION PENDING**: Vahid recorded national coarsened-margin + and sector report-only treatment. Confirm that disposition and + the calibrated-margin versus gated-stability partition in §10. +4. **E3 formulation — REFEREE/PENDING**: choose ECDF max-gap or + quantile gaps and, if needed, a substantive patch for heaping + zeros. The recorded filename/per-year-cell correction does not + decide the statistic. +5. **E9 stay formulation — WORKSTREAM DECISION RECORDED; REFEREE + VERIFICATION PENDING**: Vahid recorded withdrawal of the 0.02 + stay tolerance and report-only treatment for both stay + statistics. No stay statistic gates unless a later floor and + substantive basis are approved. +6. **Phase-1 imputed-band adjudicability — WORKSTREAM DECISION + RECORDED; REFEREE VERIFICATION PENDING**: Vahid recorded the + permanent person-level report-only disposition and degradation + ladder in §9.1. The later E12 decision permits only a disjoint, + aggregate audit of observable grouped margins; it does not + restore person-level truth or certify worker–firm assignment. + This item remains numbered for #224 traceability. +7. **Linkage-QC design and numerics — REFEREE/PENDING #236**: + ratify the pair-level E4 and maximal-run E5 populations, + `P_floor`, `P_floor_run`, `P_design`, budget/run ceiling, + arm-specific `q_link`, α, power, multiplicity, whether recall + gates, repeat-agreement/action rules, and the E4/E5-first scope. +8. **Blinding and draw mechanics — REFEREE/PENDING #236**: approve + custody, seed commitment, audit-frame freeze, sample draw, + unblinding order, and immutable evidence publication before any + audit draw occurs. +9. **Seam ruling — REFEREE/PENDING**: select the operative + population and correction bands from #235, then ratify or amend + the J2J-levels / SIPP-persistence / seam-aware interpretation. +10. **E11 scope and floor — REFEREE/PENDING #223**: decide the + aggregate margin statistic, temporal basis, and threshold. + Five-quarter detail remains report-only, and no E11 result + certifies a person-level worker–firm link. +11. **E12 claims boundary — WORKSTREAM DECISION RECORDED; REFEREE + VERIFICATION PENDING**: Vahid recorded both a future strict + aggregate audit and deferral of strong linkage/sorting claims. + The aggregate statistic, disjoint partition, floor, and + threshold remain REFEREE/PENDING; firm effects, variance, + sorting, coworker/spillover, and person-level assignment claims + remain no-go. +12. **Jobs/person scale — DIRECTION RECORDED; DETAILS + REFEREE/PENDING #212**: job-based QWI/J2J references are not + deflated. If a person-scale candidate is compared to them, the + candidate cells are inflated by an approved observed + jobs-per-person factor. Ratify the exact formula, series, + vintage, and deployment conversion. #212 is composed here and + records the separate 50/50-to-20% deployment-scale gap; it does + not supply or ratify this jobs-per-person factor. +13. **`oslp` versus `op` scope — REFEREE/PENDING**: choose a + per-cell caveat or private-comparable restatement of the J2J + references. +14. **Held-out firm-age and state axes — REFEREE/PENDING**: confirm + report-only registration at first lock and promotion + conditions. +15. **Thin-cell rules — REFEREE/PENDING #223**: ratify + `THIN_CELL_PERSONS = 200` for SIPP and the proposed 10,000-job + B-side minimum denominator. +16. **ASEC reference-period mismatch — REFEREE/PENDING**: confirm + its treatment as a known label-misalignment note on affected + cells. +17. **Linkage-bias reweighting — REFEREE/PENDING**: separately + specify pair- and run-population propensities, overlap and + balance tolerances, trimming, and audit selection weights. +18. **Operative weighting version — REFEREE/PENDING**: register + weighted or unweighted E4/E5 as operative, and do the same + before any later E9/E11/E12 promotion, before candidate scores + exist. +19. **B1's cost — REFEREE/PENDING**: confirm that first-lock + firm-side gating rests on E2, E7, and aggregate E11 margins + only, or direct a registered route to restore firm-side power. +20. **Deployment split/scale — REFEREE/PENDING #212**: ratify the + conversion from the registered 50/50 half split to the intended + 20% holdout deployment scale, including rounding and strata. +21. **Draft gate block — REFEREE/PENDING**: after every item above + is answered and every prerequisite is merged at an approved + digest, approve a separate mechanical YAML amendment. This + draft does not modify `gates.yaml`, lock IC3, or authorize a + candidate run. diff --git a/docs/plans/employer-firm-plan.html b/docs/plans/employer-firm-plan.html index 413453ea..56480a6b 100644 --- a/docs/plans/employer-firm-plan.html +++ b/docs/plans/employer-firm-plan.html @@ -255,11 +255,11 @@

Targets, register & calibration

INTERFACE CONTRACTS — frozen week 1, changed only by joint PR
    -
  • C1 · Spell schema. One table: person_id, spell_id, start_period, end_period, industry (major), firm_size_band, earnings_share, primary_job. A writes it, B reads it. Firm-size bands use the canonical banding B defines (C2). Multi-job resolved primary-job-only in phase 0.
  • -
  • C2 · Canonical firm-size banding + semantics. B proposes the band set reconcilable across NOEMP / SIPP-establishment / SUSB-enterprise, and the decision of what the variable means (administrative firm size, per review F5). A trains to it; documented in the ADR.
  • -
  • C3 · Gate pre-registration. Jointly authored employer gate block (E1–E12 thresholds after floor runs), split ownership as above, one referee round, locked before any candidate runs. Neither side's model work may start a one-shot run until C3 locks.
  • +
  • IC1 · Spell schema. One table: person_id, spell_id, start_period, end_period, industry (major), firm_size_band, earnings_share, primary_job. A writes it, B reads it. Firm-size bands use the canonical banding B defines (IC2). Multi-job resolved primary-job-only in phase 0.
  • +
  • IC2 · Canonical firm-size banding + semantics. B proposes the band set reconcilable across NOEMP / SIPP-establishment / SUSB-enterprise, and the decision of what the variable means (administrative firm size, per review F5). A trains to it; documented in the ADR.
  • +
  • IC3 · Gate pre-registration. Jointly authored employer gate block (E1–E12 thresholds after floor runs), split ownership as above, one referee round, locked before any candidate runs. Neither side's model work may start a one-shot run until IC3 locks.
-

Sync points: week 1 (freeze C1/C2), week 4 (lock C3), week 10 (joint phase-2 go/no-go with Max). Everything else is asynchronous — A can build readers/imputation against fixture spells; B can build the target pipeline and register against a synthetic spell file conforming to C1.

+

Sync points: week 1 (freeze IC1/IC2), week 4 (lock IC3), week 10 (joint phase-2 go/no-go with Max). Everything else is asynchronous — A can build readers/imputation against fixture spells; B can build the target pipeline and register against a synthetic spell file conforming to IC1.

Precedents — what similar projects did

@@ -277,8 +277,8 @@

Precedents — what similar projects did

Milestones

- - + + diff --git a/runs/crosswave_jobid_check_draft_v0.json b/runs/crosswave_jobid_check_draft_v0.json new file mode 100644 index 00000000..65fbad9a --- /dev/null +++ b/runs/crosswave_jobid_check_draft_v0.json @@ -0,0 +1,68 @@ +{ + "artifact": "crosswave_jobid_check", + "version": "draft_v1", + "status": "DRAFT - pre-lock artifact for the #230 section-6 seam ruling. DISCLOSED RE-ANALYSIS, not pre-registration: the first committed estimator (inner-join population, conditioned 6.06% seam rate) returned PASS_WITH_CORRECTION_BAND; a population defect (exits to nonemployment silently dropped, contradicting the documented design) was found and fixed, and the corrected estimator re-ran. Both runs are disclosed here; the 15/30 bands are author-proposed and UNRATIFIED (referee item), as is the operative scoring population.", + "issue": "230", + "inputs": { + "pu2022.csv.gz": { + "sha256": "5e0ec8a992f8f0a1dce6024c89c3230cb679f25f38fb2d5c6b5714ba03f08ba6", + "bytes": 116680931 + }, + "pu2023.csv": { + "sha256": "5c30439e365fc26483318ef61d1d8f4bb2f0e9d6bb47c22c06756a7698733ee2", + "bytes": 3726010471 + } + }, + "sipp_jobs_reader_commit": "a059193e4fad80ceb1c2e1f4177aa5c69abb1048", + "question": "are EJB job IDs longitudinally consistent across the pu2022->pu2023 boundary, or is part of the 9.45% seam separation rate a re-keying (linkage) artifact?", + "within_wave_baseline": { + "jobs_held": 384747, + "separations": 6800, + "to_nonemployment": 3276, + "to_employment": 3524, + "rekey_signature": 85, + "rekey_signature_strict": 78, + "sep_rate": 0.0177, + "rekey_signature_share_of_seps": 0.0125 + }, + "across_wave_seam": { + "jobs_held": 10828, + "separations": 1023, + "sep_rate": 0.0945, + "to_nonemployment": 390, + "to_employment": 633, + "rekey_signature": 111, + "rekey_signature_strict": 92, + "rekey_signature_share_of_seps": 0.1085 + }, + "rekey_signature_definition": "a vanished job whose person holds a next-month job matching it on industry code, class of worker, and earnings within 20% (|log ratio| < 0.1823); computed identically at the seam and within-wave. The excess is computed on the E->E-CONDITIONAL baseline (signature count / separations-to-employment on each side), then optionally scaled by the seam E->E share for the all-separations population \u2014 the per-all-seps rekey_signature_share_of_seps fields are descriptive only (referee note, #230 round 1 S3)", + "bounds": { + "gross_id_survival_identity": { + "value": 0.9055, + "note": "definitional identity (1 - seam sep rate), NOT evidence \u2014 it would be unchanged if every seam separation were a re-key; retained only as context" + }, + "excess_rekey_share_ee_population": 0.1512, + "excess_rekey_share_all_separations": 0.0936, + "one_sided_95_upper_ee_population": 0.1765, + "one_sided_95_upper_all_separations": 0.1092, + "structural_ee_cap_share_of_seam_seps": 0.6188 + }, + "verdict_rule": "author-proposed, UNRATIFIED (referee item): PASS if excess re-key share < 15%; PASS_WITH_CORRECTION_BAND if 15-30%; REFER_BACK if >30%. The operative scoring population (E->E separations only, arguably the conservative reading since re-keying is a within-continuing-employment phenomenon, vs all seam separations, since E->N separations cannot be ID artifacts) is ALSO a referee item \u2014 the verdict differs between them.", + "verdict_by_population": { + "ee_population": "PASS_WITH_CORRECTION_BAND", + "all_separations": "PASS", + "operative": "REFEREE" + }, + "caveats": { + "composition_mismatch": "the within-wave coincidence baseline has a different separation mix (E->N share 0.482 within-wave vs 0.381 at the seam)", + "nan_matching": "the re-key signature treats missing industry/class/earnings as matching (pd.notna guards), biasing the signature upward where item nonresponse differs across the boundary; the strict variant below treats missing as mismatch", + "seam_denominator": "person presence at the seam is keyed on SSUID+PNUM - the same cross-file linkage under test; a person whose ID re-keyed would leave the denominator as a sample leaver rather than appear as a separation, so person-level re-keying is NOT bounded by this artifact (jobs_held 10,828 at the seam vs ~17,500 per within-wave pair reflects sample rotation plus any such loss)" + }, + "strict_nan_variant": { + "note": "missing industry/class/earnings treated as MISMATCH (main variant treats missing as compatible)", + "seam_signature_share": 0.1453, + "within_signature_share": 0.0221, + "excess_ee_population": 0.1232, + "excess_all_separations": 0.0762 + } +} diff --git a/runs/employer_firm_floors_v1.json b/runs/employer_firm_floors_v1.json new file mode 100644 index 00000000..97546639 --- /dev/null +++ b/runs/employer_firm_floors_v1.json @@ -0,0 +1,2729 @@ +{ + "artifact": "employer_firm_floors", + "version": "v1", + "status": "PRE-LOCK REFERENCE - NOT RATIFIED; IC3 not locked; no thresholds. v1 marks the artifact sha256-pinned and reproduction-tested (#230 section 12.2 item 2), which is a pinning event, not a ratification: the numbers here bind nothing until the IC3 amendment PR merges", + "input_extract_sha256": { + "susb_us_sector_size_2022.csv": "b2db9502cf71480f4284cbeb8b78f31e8eb77f63963f679c167bfd40ade9d5e0", + "bds_us_firm_size_1978_2022.csv": "0cbfec27392d4d328ddf8be9800c30a65d954d3a50ef170e9c98fc4babc82b31", + "qwi_us_firmsize_sector_2015on.csv": "a173e5995cd7afeeb82e8afa543ab6e1a1d8c1b4089c4e50a947696e98e47dbd", + "j2j_us_firmsize_sector_2015on.csv": "118d4a0fd4c2c7cd3dab98bb81d1c8df668d5d0c83ebf9d7e3fd09240fd62e82", + "j2j_us_sexage_2015on.csv": "6ca16b98b3e809ebf4493f6884c75bee712c727cce16ddc219e0fca97e7edf60", + "j2jod_us_firmsize_od_2015on.csv": "0f83df008ae498643b66ecf25187170014988f5fb1f761c84cf9882376e3bef6" + }, + "issue": "192", + "workstream": "B", + "sources": { + "susb": "data/external/susb_us_sector_size_2022.csv", + "bds": "data/external/bds_us_firm_size_1978_2022.csv", + "qwi": "data/external/qwi_us_firmsize_sector_2015on.csv", + "j2j": "data/external/j2j_us_firmsize_sector_2015on.csv", + "j2j_sexage": "data/external/j2j_us_sexage_2015on.csv", + "j2jod": "data/external/j2jod_us_firmsize_od_2015on.csv", + "provenance": "data/external/employer_firm_target_sources.md" + }, + "method": "temporal-stability floors on published administrative aggregates: year-over-year same-quarter |log ratio| per cell (QWI/J2J, 2015Q1 on; same-quarter comparison absorbs seasonality in the not-seasonally-adjusted extracts), year-over-year |log share ratio| for the BDS size margin (2012-2022), and published noise-flag CV bounds for the single-vintage SUSB table; banding via populace_dynamics.firms.banding only; thin flag at minimum cell denominator < 10000 jobs (draft choice)", + "unit_rules": [ + "QWI/J2J cells count jobs, not persons (ADR 0003): the job-to-person adjustment (~ multiple-jobholding rate, ~5%) is a pre-registered IC3 item", + "QWI EarnS is MEAN monthly earnings of full-quarter employees; QWI never publishes medians; E7 is stated on means", + "J2J extract ownership is oslp (state/local + private) while QWI is private-only (op) and SUSB excludes government; NAICS 92 is dropped from the J2J extract but state/local employment embedded in other sectors (esp. 61, 62) remains \u2014 E2/E11 cells must restate on a private-comparable basis or carry this scope caveat (locks with IC3)" + ], + "method_findings": { + "e1_no_sector_replicate": "the committed SUSB extract is a single 2022 cross-section: a same-source temporal or resampling floor on the size x sector cells is degenerate. The E1 floor is therefore composed of the published SUSB noise-flag CV bounds per cell plus a BDS year-over-year stability floor that exists only for the national size margin \u2014 the sector axis has no stability floor derivable from committed extracts", + "e1_bds_straddle": "the BDS '20 to 99' category straddles the canonical 50 edge (banding.bds_fsize_to_canonical is inexact there), so the BDS margin floor is stated on a coarsened partition (20_99 kept whole), not on the five canonical bands", + "e2_sex_age_axis_built": "SUPERSEDES draft_v0's 'e2_no_age_sex_axis'. E2's registered sex x age axis is now floored from the committed J2J sex x age extract (#228): the full 3 x 9 grid at the all-industry margin, 2015Q1-2025Q1, same |log YoY ratio| machinery as the firm-size axis, reported per cell and pooled over the 2 x 8 non-margin cells. The firm-size x sector floors remain the aggregate-side references they always were; the two E2 axes are now on one footing. Naming correction carried from the earlier draft: LEHD's sex x age tabulation is 'sa'; 'se' is sex x EDUCATION, and the draft_v0 finding named the wrong one", + "e11_extract_committed_but_no_temporal_replicate": "SUPERSEDES draft_v0's 'e11_no_od_extract', which is now factually stale: the origin x destination firm-size cross IS committed (#228, the full 6 x 6 grid). The obstacle is temporal, not availability. The national detail is published only for 2015Q1-2016Q1 (status flag 11 from 2016Q2), so same-quarter year-over-year pairing yields at most ONE pair per detail cell \u2014 a gap with no dispersion, hence no mean + k*sd floor on the cross. The destination-size margins run through 2025Q1 and are floored in the e11 block. A second, independent bound on any margin threshold comes from cross-source disagreement: the LED tool's margins and the LEHD flat file's differ by up to ~3% in either direction (e11.cross_source_margin_disagreement)", + "release_revision_noise_unfloored": "a third floorable concept, recorded and NOT built: vintage-to-vintage revision noise. LEHD revises across releases, and none of the floors here see that \u2014 every extract is a single release (R2026Q1). Observed during the #228 review: LEHD rotated to R2026Q2 mid-round and the J2JOD values for 2015Q1-2025Q1 were unchanged across the rotation (all 1,476 rows), which is one datum, on one series, over one rotation \u2014 suggestive that revision noise is small for these aggregates, not evidence that it is zero. Building it needs two release-stamped vintages of the same series committed; the IC3 referee round should decide whether E1/E2/E6/E7/E11 thresholds must carry a revision allowance on top of the temporal floor", + "e12_deferred": "E12 (AKM moments) has no committed extract: AKM variance decompositions require linked employer-employee microdata, and the published decompositions are research outputs rather than a recurring aggregate release. No floor is buildable; E12 is deferred and does not gate the first IC3 lock. True-linked validation remains deferred pending a committed, provenance-pinned reference extract. Reproducing aggregate size/industry employment, mean-earnings, or flow margins cannot certify true worker-firm linkage, coworker sorting, within/between-firm variance, firm effects, or spillovers. Those stronger Phase 2 claims remain a no-go until a true-linked reference is adjudicable", + "cycle_signal_in_floors": "temporal-stability floors on published aggregates include true business-cycle variation (2020-2021 most visibly) as well as source noise; both the full-sample and ex-pandemic figures are committed rather than choosing one \u2014 the IC3 referee round picks the formulation with both on the record", + "floors_not_monotone_in_disaggregation": "an empirical finding from the sex x age build, and a trap for the threshold policy: the temporal floor is NOT monotone in disaggregation. Of the 26 non-aggregate sex x age cells, the number whose ex-pandemic floor is TIGHTER than the all-sexes all-ages cell is 13 (hire), 10 (separation), 6 (j2j hire), 7 (j2j separation). The pattern is interpretable -- the 45-99 age cells are the most stable and the 19-34 cells the least, while the aggregate carries compositional shift the older cells do not -- but the consequence is procedural: a floor measured on a margin CANNOT be used as a conservative bound for the cells beneath it. Every gated cell needs its own floor, or the threshold policy must say explicitly which cell's floor governs (IC3 open question 1)", + "e11_margin_trend": "the E11 destination-size margins are EE flow COUNTS, so their year-over-year variation carries aggregate flow growth (a trend, not noise) exactly as raw EarnS carries nominal wage growth. Both are committed: 'ee' (raw counts) and 'ee_rel' (share of the quarter's all-size EE total, which divides the common trend out). The relative variant is far TIGHTER than the raw one: across the five destination bands its floor mean is 4.5x to 9.5x smaller (e.g. firmsize1 0.1054 raw vs 0.0233 relative), and 3.4x to 6.6x smaller on the ex-pandemic window. Most of the raw floor is the aggregate flow trend, which is exactly what the relative variant removes; the IC3 referee round picks the formulation, as for E7", + "e7_nominal_trend": "raw EarnS YoY variation embeds aggregate nominal wage growth (a trend, not noise); the aggregate-relative EarnS floor is committed alongside the raw one, both on the record" + }, + "e1": { + "susb_2022_share_by_sector_band": { + "11": { + "B100_499": { + "employment": 29243, + "share": 0.17341, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B10_49": { + "employment": 48395, + "share": 0.28698, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B500_PLUS": { + "employment": 28400, + "share": 0.16841, + "noise_flag_worst": "J", + "cv_upper_bound": null + }, + "B50_99": { + "employment": 16558, + "share": 0.09819, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "LT10": { + "employment": 46038, + "share": 0.27301, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + } + }, + "21": { + "B100_499": { + "employment": 96849, + "share": 0.19064, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B10_49": { + "employment": 72714, + "share": 0.14313, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B500_PLUS": { + "employment": 267414, + "share": 0.52638, + "noise_flag_worst": "H", + "cv_upper_bound": 0.05 + }, + "B50_99": { + "employment": 39882, + "share": 0.0785, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "LT10": { + "employment": 31164, + "share": 0.06134, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + } + }, + "22": { + "B100_499": { + "employment": 58348, + "share": 0.09043, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B10_49": { + "employment": 24877, + "share": 0.03856, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B500_PLUS": { + "employment": 523619, + "share": 0.81154, + "noise_flag_worst": "H", + "cv_upper_bound": 0.05 + }, + "B50_99": { + "employment": 24990, + "share": 0.03873, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "LT10": { + "employment": 13380, + "share": 0.02074, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + } + }, + "23": { + "B100_499": { + "employment": 1257639, + "share": 0.17083, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B10_49": { + "employment": 2217549, + "share": 0.30122, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B500_PLUS": { + "employment": 1419254, + "share": 0.19279, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B50_99": { + "employment": 834047, + "share": 0.11329, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "LT10": { + "employment": 1633358, + "share": 0.22187, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + } + }, + "31-33": { + "B100_499": { + "employment": 2184791, + "share": 0.17925, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B10_49": { + "employment": 1444401, + "share": 0.11851, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B500_PLUS": { + "employment": 7203660, + "share": 0.59103, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B50_99": { + "employment": 883941, + "share": 0.07252, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "LT10": { + "employment": 471537, + "share": 0.03869, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + } + }, + "42": { + "B100_499": { + "employment": 1091735, + "share": 0.17771, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B10_49": { + "employment": 1055183, + "share": 0.17176, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B500_PLUS": { + "employment": 2929637, + "share": 0.47689, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B50_99": { + "employment": 505733, + "share": 0.08232, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "LT10": { + "employment": 560942, + "share": 0.09131, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + } + }, + "44-45": { + "B100_499": { + "employment": 1123241, + "share": 0.07054, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B10_49": { + "employment": 2014328, + "share": 0.12651, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B500_PLUS": { + "employment": 10470141, + "share": 0.65757, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B50_99": { + "employment": 763829, + "share": 0.04797, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "LT10": { + "employment": 1550899, + "share": 0.0974, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + } + }, + "48-49": { + "B100_499": { + "employment": 622233, + "share": 0.10187, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B10_49": { + "employment": 639788, + "share": 0.10474, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B500_PLUS": { + "employment": 4080292, + "share": 0.66801, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B50_99": { + "employment": 372968, + "share": 0.06106, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "LT10": { + "employment": 392840, + "share": 0.06431, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + } + }, + "51": { + "B100_499": { + "employment": 425798, + "share": 0.11717, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B10_49": { + "employment": 254370, + "share": 0.07, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B500_PLUS": { + "employment": 2660578, + "share": 0.73213, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B50_99": { + "employment": 136910, + "share": 0.03767, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "LT10": { + "employment": 156356, + "share": 0.04303, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + } + }, + "52": { + "B100_499": { + "employment": 729538, + "share": 0.10678, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B10_49": { + "employment": 406149, + "share": 0.05945, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B500_PLUS": { + "employment": 4950276, + "share": 0.72458, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B50_99": { + "employment": 222014, + "share": 0.0325, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "LT10": { + "employment": 523920, + "share": 0.07669, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + } + }, + "53": { + "B100_499": { + "employment": 368603, + "share": 0.15799, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B10_49": { + "employment": 415027, + "share": 0.17788, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B500_PLUS": { + "employment": 780729, + "share": 0.33463, + "noise_flag_worst": "H", + "cv_upper_bound": 0.05 + }, + "B50_99": { + "employment": 160390, + "share": 0.06874, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "LT10": { + "employment": 608376, + "share": 0.26076, + "noise_flag_worst": "H", + "cv_upper_bound": 0.05 + } + }, + "54": { + "B100_499": { + "employment": 1552879, + "share": 0.15296, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B10_49": { + "employment": 1765942, + "share": 0.17395, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B500_PLUS": { + "employment": 4529305, + "share": 0.44614, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B50_99": { + "employment": 710784, + "share": 0.07001, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "LT10": { + "employment": 1593194, + "share": 0.15693, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + } + }, + "55": { + "B100_499": { + "employment": 292129, + "share": 0.07977, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B10_49": { + "employment": 31786, + "share": 0.00868, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B500_PLUS": { + "employment": 3285090, + "share": 0.89708, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B50_99": { + "employment": 45684, + "share": 0.01248, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "LT10": { + "employment": 7288, + "share": 0.00199, + "noise_flag_worst": "H", + "cv_upper_bound": 0.05 + } + }, + "56": { + "B100_499": { + "employment": 1502438, + "share": 0.11065, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B10_49": { + "employment": 1134105, + "share": 0.08352, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B500_PLUS": { + "employment": 9687197, + "share": 0.71341, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B50_99": { + "employment": 538533, + "share": 0.03966, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "LT10": { + "employment": 716436, + "share": 0.05276, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + } + }, + "61": { + "B100_499": { + "employment": 733380, + "share": 0.19589, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B10_49": { + "employment": 526624, + "share": 0.14066, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B500_PLUS": { + "employment": 1971357, + "share": 0.52656, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B50_99": { + "employment": 324751, + "share": 0.08674, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "LT10": { + "employment": 187728, + "share": 0.05014, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + } + }, + "62": { + "B100_499": { + "employment": 3432316, + "share": 0.16212, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B10_49": { + "employment": 2934487, + "share": 0.13861, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B500_PLUS": { + "employment": 11910294, + "share": 0.56257, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B50_99": { + "employment": 1399147, + "share": 0.06609, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "LT10": { + "employment": 1494988, + "share": 0.07061, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + } + }, + "71": { + "B100_499": { + "employment": 466716, + "share": 0.20131, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B10_49": { + "employment": 516682, + "share": 0.22287, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B500_PLUS": { + "employment": 841941, + "share": 0.36316, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B50_99": { + "employment": 250550, + "share": 0.10807, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "LT10": { + "employment": 242468, + "share": 0.10459, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + } + }, + "72": { + "B100_499": { + "employment": 1736736, + "share": 0.12591, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B10_49": { + "employment": 4370162, + "share": 0.31683, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B500_PLUS": { + "employment": 5135989, + "share": 0.37235, + "noise_flag_worst": "H", + "cv_upper_bound": 0.05 + }, + "B50_99": { + "employment": 1435374, + "share": 0.10406, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "LT10": { + "employment": 1115217, + "share": 0.08085, + "noise_flag_worst": "H", + "cv_upper_bound": 0.05 + } + }, + "81": { + "B100_499": { + "employment": 619059, + "share": 0.11313, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B10_49": { + "employment": 1795251, + "share": 0.32808, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "B500_PLUS": { + "employment": 822678, + "share": 0.15034, + "noise_flag_worst": "H", + "cv_upper_bound": 0.05 + }, + "B50_99": { + "employment": 484178, + "share": 0.08848, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + }, + "LT10": { + "employment": 1750821, + "share": 0.31996, + "noise_flag_worst": "G", + "cv_upper_bound": 0.02 + } + }, + "99": { + "B10_49": { + "employment": 2887, + "share": 0.24359, + "noise_flag_worst": "J", + "cv_upper_bound": null + }, + "LT10": { + "employment": 8965, + "share": 0.75641, + "noise_flag_worst": "J", + "cv_upper_bound": null + } + } + }, + "bds_size_margin_yoy_stability": { + "window": [ + 2012, + 2022 + ], + "groups": { + "1_9": { + "bds_fsize_categories": [ + "a) 1 to 4", + "b) 5 to 9" + ], + "canonical_bands": [ + "LT10" + ], + "exact": true, + "share_2022": 0.10702, + "floor_abs_log_ratio_mean": 0.01718, + "floor_abs_log_ratio_sd": 0.01336, + "n_pairs": 11, + "ex_pandemic_mean": 0.01482, + "ex_pandemic_sd": 0.00511, + "n_pairs_ex_pandemic": 8 + }, + "10_19": { + "bds_fsize_categories": [ + "c) 10 to 19" + ], + "canonical_bands": [ + "B10_49" + ], + "exact": true, + "share_2022": 0.0666, + "floor_abs_log_ratio_mean": 0.01131, + "floor_abs_log_ratio_sd": 0.0054, + "n_pairs": 11, + "ex_pandemic_mean": 0.00915, + "ex_pandemic_sd": 0.00414, + "n_pairs_ex_pandemic": 8 + }, + "20_99": { + "bds_fsize_categories": [ + "d) 20 to 99" + ], + "canonical_bands": [ + "B10_49", + "B50_99" + ], + "exact": false, + "share_2022": 0.16113, + "floor_abs_log_ratio_mean": 0.00816, + "floor_abs_log_ratio_sd": 0.0086, + "n_pairs": 11, + "ex_pandemic_mean": 0.00404, + "ex_pandemic_sd": 0.00329, + "n_pairs_ex_pandemic": 8 + }, + "100_499": { + "bds_fsize_categories": [ + "e) 100 to 499" + ], + "canonical_bands": [ + "B100_499" + ], + "exact": true, + "share_2022": 0.13528, + "floor_abs_log_ratio_mean": 0.00563, + "floor_abs_log_ratio_sd": 0.00755, + "n_pairs": 11, + "ex_pandemic_mean": 0.0039, + "ex_pandemic_sd": 0.00275, + "n_pairs_ex_pandemic": 8 + }, + "500_plus": { + "bds_fsize_categories": [ + "f) 500 to 999", + "g) 1000 to 2499", + "h) 2500 to 4999", + "i) 5000 to 9999", + "j) 10000+" + ], + "canonical_bands": [ + "B500_PLUS" + ], + "exact": true, + "share_2022": 0.52997, + "floor_abs_log_ratio_mean": 0.00516, + "floor_abs_log_ratio_sd": 0.00231, + "n_pairs": 11, + "ex_pandemic_mean": 0.0048, + "ex_pandemic_sd": 0.00185, + "n_pairs_ex_pandemic": 8 + } + } + } + }, + "e2": { + "by_firmsize_all_industry": { + "firmsize1": { + "firmsize_label": "0-19 Employees", + "canonical_bands": [ + "LT10", + "B10_49" + ], + "exact": false, + "min_denominator_jobs": 18440372, + "thin": false, + "hire_rate": { + "level_mean": 0.13835, + "floor_abs_log_ratio_mean": 0.0565, + "floor_abs_log_ratio_sd": 0.05567, + "n_pairs": 36, + "ex_pandemic_mean": 0.02729, + "ex_pandemic_sd": 0.02157, + "n_pairs_ex_pandemic": 24 + }, + "separation_rate": { + "level_mean": 0.12446, + "floor_abs_log_ratio_mean": 0.05609, + "floor_abs_log_ratio_sd": 0.12328, + "n_pairs": 36, + "ex_pandemic_mean": 0.01837, + "ex_pandemic_sd": 0.01665, + "n_pairs_ex_pandemic": 24 + }, + "j2j_hire_rate": { + "level_mean": 0.05473, + "floor_abs_log_ratio_mean": 0.06146, + "floor_abs_log_ratio_sd": 0.0702, + "n_pairs": 36, + "ex_pandemic_mean": 0.03739, + "ex_pandemic_sd": 0.03021, + "n_pairs_ex_pandemic": 24 + }, + "j2j_separation_rate": { + "level_mean": 0.05247, + "floor_abs_log_ratio_mean": 0.08393, + "floor_abs_log_ratio_sd": 0.10246, + "n_pairs": 36, + "ex_pandemic_mean": 0.04322, + "ex_pandemic_sd": 0.03921, + "n_pairs_ex_pandemic": 24 + }, + "ee_hire_rate": { + "level_mean": 0.03678, + "floor_abs_log_ratio_mean": 0.08076, + "floor_abs_log_ratio_sd": 0.11019, + "n_pairs": 36, + "ex_pandemic_mean": 0.04296, + "ex_pandemic_sd": 0.03455, + "n_pairs_ex_pandemic": 24 + }, + "ee_separation_rate": { + "level_mean": 0.03435, + "floor_abs_log_ratio_mean": 0.10011, + "floor_abs_log_ratio_sd": 0.13464, + "n_pairs": 36, + "ex_pandemic_mean": 0.04862, + "ex_pandemic_sd": 0.04112, + "n_pairs_ex_pandemic": 24 + } + }, + "firmsize2": { + "firmsize_label": "20-49 Employees", + "canonical_bands": [ + "B10_49" + ], + "exact": true, + "min_denominator_jobs": 10007762, + "thin": false, + "hire_rate": { + "level_mean": 0.13301, + "floor_abs_log_ratio_mean": 0.07117, + "floor_abs_log_ratio_sd": 0.09021, + "n_pairs": 36, + "ex_pandemic_mean": 0.03415, + "ex_pandemic_sd": 0.0276, + "n_pairs_ex_pandemic": 24 + }, + "separation_rate": { + "level_mean": 0.12795, + "floor_abs_log_ratio_mean": 0.05895, + "floor_abs_log_ratio_sd": 0.10961, + "n_pairs": 36, + "ex_pandemic_mean": 0.02151, + "ex_pandemic_sd": 0.01723, + "n_pairs_ex_pandemic": 24 + }, + "j2j_hire_rate": { + "level_mean": 0.06192, + "floor_abs_log_ratio_mean": 0.07963, + "floor_abs_log_ratio_sd": 0.10108, + "n_pairs": 36, + "ex_pandemic_mean": 0.04356, + "ex_pandemic_sd": 0.03415, + "n_pairs_ex_pandemic": 24 + }, + "j2j_separation_rate": { + "level_mean": 0.06427, + "floor_abs_log_ratio_mean": 0.08386, + "floor_abs_log_ratio_sd": 0.10272, + "n_pairs": 36, + "ex_pandemic_mean": 0.04362, + "ex_pandemic_sd": 0.03531, + "n_pairs_ex_pandemic": 24 + }, + "ee_hire_rate": { + "level_mean": 0.04311, + "floor_abs_log_ratio_mean": 0.09836, + "floor_abs_log_ratio_sd": 0.13799, + "n_pairs": 36, + "ex_pandemic_mean": 0.0497, + "ex_pandemic_sd": 0.03948, + "n_pairs_ex_pandemic": 24 + }, + "ee_separation_rate": { + "level_mean": 0.0439, + "floor_abs_log_ratio_mean": 0.10179, + "floor_abs_log_ratio_sd": 0.1389, + "n_pairs": 36, + "ex_pandemic_mean": 0.05047, + "ex_pandemic_sd": 0.03819, + "n_pairs_ex_pandemic": 24 + } + }, + "firmsize3": { + "firmsize_label": "50-249 Employees", + "canonical_bands": [ + "B50_99", + "B100_499" + ], + "exact": false, + "min_denominator_jobs": 16053464, + "thin": false, + "hire_rate": { + "level_mean": 0.12559, + "floor_abs_log_ratio_mean": 0.07152, + "floor_abs_log_ratio_sd": 0.10092, + "n_pairs": 36, + "ex_pandemic_mean": 0.03417, + "ex_pandemic_sd": 0.02558, + "n_pairs_ex_pandemic": 24 + }, + "separation_rate": { + "level_mean": 0.12039, + "floor_abs_log_ratio_mean": 0.05035, + "floor_abs_log_ratio_sd": 0.08501, + "n_pairs": 36, + "ex_pandemic_mean": 0.02188, + "ex_pandemic_sd": 0.01621, + "n_pairs_ex_pandemic": 24 + }, + "j2j_hire_rate": { + "level_mean": 0.06398, + "floor_abs_log_ratio_mean": 0.08444, + "floor_abs_log_ratio_sd": 0.10867, + "n_pairs": 36, + "ex_pandemic_mean": 0.04298, + "ex_pandemic_sd": 0.03308, + "n_pairs_ex_pandemic": 24 + }, + "j2j_separation_rate": { + "level_mean": 0.06447, + "floor_abs_log_ratio_mean": 0.07991, + "floor_abs_log_ratio_sd": 0.09664, + "n_pairs": 36, + "ex_pandemic_mean": 0.0423, + "ex_pandemic_sd": 0.03385, + "n_pairs_ex_pandemic": 24 + }, + "ee_hire_rate": { + "level_mean": 0.04519, + "floor_abs_log_ratio_mean": 0.10125, + "floor_abs_log_ratio_sd": 0.14163, + "n_pairs": 36, + "ex_pandemic_mean": 0.05036, + "ex_pandemic_sd": 0.04076, + "n_pairs_ex_pandemic": 24 + }, + "ee_separation_rate": { + "level_mean": 0.04492, + "floor_abs_log_ratio_mean": 0.09829, + "floor_abs_log_ratio_sd": 0.13179, + "n_pairs": 36, + "ex_pandemic_mean": 0.04958, + "ex_pandemic_sd": 0.03893, + "n_pairs_ex_pandemic": 24 + } + }, + "firmsize4": { + "firmsize_label": "250-499 Employees", + "canonical_bands": [ + "B100_499" + ], + "exact": true, + "min_denominator_jobs": 6036916, + "thin": false, + "hire_rate": { + "level_mean": 0.12129, + "floor_abs_log_ratio_mean": 0.07696, + "floor_abs_log_ratio_sd": 0.10712, + "n_pairs": 36, + "ex_pandemic_mean": 0.04226, + "ex_pandemic_sd": 0.03558, + "n_pairs_ex_pandemic": 24 + }, + "separation_rate": { + "level_mean": 0.11677, + "floor_abs_log_ratio_mean": 0.05004, + "floor_abs_log_ratio_sd": 0.06679, + "n_pairs": 36, + "ex_pandemic_mean": 0.02763, + "ex_pandemic_sd": 0.02353, + "n_pairs_ex_pandemic": 24 + }, + "j2j_hire_rate": { + "level_mean": 0.06345, + "floor_abs_log_ratio_mean": 0.09662, + "floor_abs_log_ratio_sd": 0.1154, + "n_pairs": 36, + "ex_pandemic_mean": 0.05223, + "ex_pandemic_sd": 0.04437, + "n_pairs_ex_pandemic": 24 + }, + "j2j_separation_rate": { + "level_mean": 0.06428, + "floor_abs_log_ratio_mean": 0.08368, + "floor_abs_log_ratio_sd": 0.09313, + "n_pairs": 36, + "ex_pandemic_mean": 0.04842, + "ex_pandemic_sd": 0.04304, + "n_pairs_ex_pandemic": 24 + }, + "ee_hire_rate": { + "level_mean": 0.04467, + "floor_abs_log_ratio_mean": 0.11341, + "floor_abs_log_ratio_sd": 0.14634, + "n_pairs": 36, + "ex_pandemic_mean": 0.06109, + "ex_pandemic_sd": 0.05044, + "n_pairs_ex_pandemic": 24 + }, + "ee_separation_rate": { + "level_mean": 0.04511, + "floor_abs_log_ratio_mean": 0.10241, + "floor_abs_log_ratio_sd": 0.125, + "n_pairs": 36, + "ex_pandemic_mean": 0.05741, + "ex_pandemic_sd": 0.0484, + "n_pairs_ex_pandemic": 24 + } + }, + "firmsize5": { + "firmsize_label": "500+ Employees", + "canonical_bands": [ + "B500_PLUS" + ], + "exact": true, + "min_denominator_jobs": 54935065, + "thin": false, + "hire_rate": { + "level_mean": 0.11101, + "floor_abs_log_ratio_mean": 0.07952, + "floor_abs_log_ratio_sd": 0.09987, + "n_pairs": 36, + "ex_pandemic_mean": 0.04312, + "ex_pandemic_sd": 0.04673, + "n_pairs_ex_pandemic": 24 + }, + "separation_rate": { + "level_mean": 0.1067, + "floor_abs_log_ratio_mean": 0.05405, + "floor_abs_log_ratio_sd": 0.05735, + "n_pairs": 36, + "ex_pandemic_mean": 0.03493, + "ex_pandemic_sd": 0.03283, + "n_pairs_ex_pandemic": 24 + }, + "j2j_hire_rate": { + "level_mean": 0.0593, + "floor_abs_log_ratio_mean": 0.09724, + "floor_abs_log_ratio_sd": 0.10992, + "n_pairs": 36, + "ex_pandemic_mean": 0.05534, + "ex_pandemic_sd": 0.05671, + "n_pairs_ex_pandemic": 24 + }, + "j2j_separation_rate": { + "level_mean": 0.06032, + "floor_abs_log_ratio_mean": 0.09256, + "floor_abs_log_ratio_sd": 0.11011, + "n_pairs": 36, + "ex_pandemic_mean": 0.05281, + "ex_pandemic_sd": 0.0542, + "n_pairs_ex_pandemic": 24 + }, + "ee_hire_rate": { + "level_mean": 0.04125, + "floor_abs_log_ratio_mean": 0.11389, + "floor_abs_log_ratio_sd": 0.14234, + "n_pairs": 36, + "ex_pandemic_mean": 0.06284, + "ex_pandemic_sd": 0.06471, + "n_pairs_ex_pandemic": 24 + }, + "ee_separation_rate": { + "level_mean": 0.04255, + "floor_abs_log_ratio_mean": 0.10903, + "floor_abs_log_ratio_sd": 0.14268, + "n_pairs": 36, + "ex_pandemic_mean": 0.06003, + "ex_pandemic_sd": 0.05956, + "n_pairs_ex_pandemic": 24 + } + } + }, + "sector_cells": { + "n_cells": 95, + "hire_rate": { + "cell_floor_median": 0.08873, + "cell_floor_p90": 0.14927, + "cell_floor_max": 0.29279, + "n_cells_with_pairs": 95, + "n_thin_cells": 0 + }, + "separation_rate": { + "cell_floor_median": 0.06316, + "cell_floor_p90": 0.09947, + "cell_floor_max": 0.18552, + "n_cells_with_pairs": 95, + "n_thin_cells": 0 + }, + "j2j_hire_rate": { + "cell_floor_median": 0.10574, + "cell_floor_p90": 0.1587, + "cell_floor_max": 0.31612, + "n_cells_with_pairs": 95, + "n_thin_cells": 0 + }, + "j2j_separation_rate": { + "cell_floor_median": 0.09402, + "cell_floor_p90": 0.13385, + "cell_floor_max": 0.21333, + "n_cells_with_pairs": 95, + "n_thin_cells": 0 + }, + "ee_hire_rate": { + "cell_floor_median": 0.12524, + "cell_floor_p90": 0.1836, + "cell_floor_max": 0.35072, + "n_cells_with_pairs": 95, + "n_thin_cells": 0 + }, + "ee_separation_rate": { + "cell_floor_median": 0.11164, + "cell_floor_p90": 0.16538, + "cell_floor_max": 0.23564, + "n_cells_with_pairs": 95, + "n_thin_cells": 0 + } + }, + "by_sex_age": { + "cells": { + "sex0_A00": { + "sex": 0, + "sex_label": "All Sexes", + "agegrp": "A00", + "agegrp_label": "All Ages (14-99)", + "min_denominator_jobs": 124416927, + "thin": false, + "hire_rate": { + "level_mean": 0.11138, + "floor_abs_log_ratio_mean": 0.06924, + "floor_abs_log_ratio_sd": 0.08584, + "n_pairs": 37, + "ex_pandemic_mean": 0.03781, + "ex_pandemic_sd": 0.03295, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.10588, + "floor_abs_log_ratio_mean": 0.053, + "floor_abs_log_ratio_sd": 0.07945, + "n_pairs": 37, + "ex_pandemic_mean": 0.0272, + "ex_pandemic_sd": 0.02372, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.05446, + "floor_abs_log_ratio_mean": 0.08798, + "floor_abs_log_ratio_sd": 0.10137, + "n_pairs": 37, + "ex_pandemic_mean": 0.04834, + "ex_pandemic_sd": 0.04246, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.0547, + "floor_abs_log_ratio_mean": 0.08697, + "floor_abs_log_ratio_sd": 0.10513, + "n_pairs": 36, + "ex_pandemic_mean": 0.04752, + "ex_pandemic_sd": 0.04515, + "n_pairs_ex_pandemic": 24 + } + }, + "sex0_A01": { + "sex": 0, + "sex_label": "All Sexes", + "agegrp": "A01", + "agegrp_label": "14-18", + "min_denominator_jobs": 2374533, + "thin": false, + "hire_rate": { + "level_mean": 0.42042, + "floor_abs_log_ratio_mean": 0.07367, + "floor_abs_log_ratio_sd": 0.08249, + "n_pairs": 37, + "ex_pandemic_mean": 0.03536, + "ex_pandemic_sd": 0.03241, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.27113, + "floor_abs_log_ratio_mean": 0.07401, + "floor_abs_log_ratio_sd": 0.09739, + "n_pairs": 37, + "ex_pandemic_mean": 0.03089, + "ex_pandemic_sd": 0.02891, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.10984, + "floor_abs_log_ratio_mean": 0.07842, + "floor_abs_log_ratio_sd": 0.06298, + "n_pairs": 37, + "ex_pandemic_mean": 0.05368, + "ex_pandemic_sd": 0.04363, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.11713, + "floor_abs_log_ratio_mean": 0.08081, + "floor_abs_log_ratio_sd": 0.09525, + "n_pairs": 36, + "ex_pandemic_mean": 0.05043, + "ex_pandemic_sd": 0.04433, + "n_pairs_ex_pandemic": 24 + } + }, + "sex0_A02": { + "sex": 0, + "sex_label": "All Sexes", + "agegrp": "A02", + "agegrp_label": "19-21", + "min_denominator_jobs": 5105305, + "thin": false, + "hire_rate": { + "level_mean": 0.29055, + "floor_abs_log_ratio_mean": 0.06968, + "floor_abs_log_ratio_sd": 0.07426, + "n_pairs": 37, + "ex_pandemic_mean": 0.03633, + "ex_pandemic_sd": 0.03347, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.25229, + "floor_abs_log_ratio_mean": 0.05892, + "floor_abs_log_ratio_sd": 0.06633, + "n_pairs": 37, + "ex_pandemic_mean": 0.03226, + "ex_pandemic_sd": 0.03203, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.1353, + "floor_abs_log_ratio_mean": 0.07439, + "floor_abs_log_ratio_sd": 0.08139, + "n_pairs": 37, + "ex_pandemic_mean": 0.05102, + "ex_pandemic_sd": 0.04566, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.13621, + "floor_abs_log_ratio_mean": 0.07625, + "floor_abs_log_ratio_sd": 0.09273, + "n_pairs": 36, + "ex_pandemic_mean": 0.04843, + "ex_pandemic_sd": 0.04726, + "n_pairs_ex_pandemic": 24 + } + }, + "sex0_A03": { + "sex": 0, + "sex_label": "All Sexes", + "agegrp": "A03", + "agegrp_label": "22-24", + "min_denominator_jobs": 6550706, + "thin": false, + "hire_rate": { + "level_mean": 0.21288, + "floor_abs_log_ratio_mean": 0.07371, + "floor_abs_log_ratio_sd": 0.09203, + "n_pairs": 37, + "ex_pandemic_mean": 0.03942, + "ex_pandemic_sd": 0.03697, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.18928, + "floor_abs_log_ratio_mean": 0.05737, + "floor_abs_log_ratio_sd": 0.06247, + "n_pairs": 37, + "ex_pandemic_mean": 0.03363, + "ex_pandemic_sd": 0.03283, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.1144, + "floor_abs_log_ratio_mean": 0.0823, + "floor_abs_log_ratio_sd": 0.10323, + "n_pairs": 37, + "ex_pandemic_mean": 0.05016, + "ex_pandemic_sd": 0.04394, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.11468, + "floor_abs_log_ratio_mean": 0.08425, + "floor_abs_log_ratio_sd": 0.1033, + "n_pairs": 36, + "ex_pandemic_mean": 0.04861, + "ex_pandemic_sd": 0.04625, + "n_pairs_ex_pandemic": 24 + } + }, + "sex0_A04": { + "sex": 0, + "sex_label": "All Sexes", + "agegrp": "A04", + "agegrp_label": "25-34", + "min_denominator_jobs": 26944125, + "thin": false, + "hire_rate": { + "level_mean": 0.13034, + "floor_abs_log_ratio_mean": 0.0767, + "floor_abs_log_ratio_sd": 0.09979, + "n_pairs": 37, + "ex_pandemic_mean": 0.04057, + "ex_pandemic_sd": 0.03877, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.12315, + "floor_abs_log_ratio_mean": 0.05804, + "floor_abs_log_ratio_sd": 0.06572, + "n_pairs": 37, + "ex_pandemic_mean": 0.03373, + "ex_pandemic_sd": 0.03061, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.07351, + "floor_abs_log_ratio_mean": 0.09471, + "floor_abs_log_ratio_sd": 0.112, + "n_pairs": 37, + "ex_pandemic_mean": 0.05039, + "ex_pandemic_sd": 0.04575, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.07357, + "floor_abs_log_ratio_mean": 0.09352, + "floor_abs_log_ratio_sd": 0.11245, + "n_pairs": 36, + "ex_pandemic_mean": 0.04977, + "ex_pandemic_sd": 0.04891, + "n_pairs_ex_pandemic": 24 + } + }, + "sex0_A05": { + "sex": 0, + "sex_label": "All Sexes", + "agegrp": "A05", + "agegrp_label": "35-44", + "min_denominator_jobs": 26554573, + "thin": false, + "hire_rate": { + "level_mean": 0.09039, + "floor_abs_log_ratio_mean": 0.06993, + "floor_abs_log_ratio_sd": 0.08995, + "n_pairs": 37, + "ex_pandemic_mean": 0.03733, + "ex_pandemic_sd": 0.03389, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.08612, + "floor_abs_log_ratio_mean": 0.05528, + "floor_abs_log_ratio_sd": 0.07795, + "n_pairs": 37, + "ex_pandemic_mean": 0.0279, + "ex_pandemic_sd": 0.02411, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.04795, + "floor_abs_log_ratio_mean": 0.09433, + "floor_abs_log_ratio_sd": 0.10529, + "n_pairs": 37, + "ex_pandemic_mean": 0.04636, + "ex_pandemic_sd": 0.04237, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.04799, + "floor_abs_log_ratio_mean": 0.09472, + "floor_abs_log_ratio_sd": 0.1051, + "n_pairs": 36, + "ex_pandemic_mean": 0.04685, + "ex_pandemic_sd": 0.04441, + "n_pairs_ex_pandemic": 24 + } + }, + "sex0_A06": { + "sex": 0, + "sex_label": "All Sexes", + "agegrp": "A06", + "agegrp_label": "45-54", + "min_denominator_jobs": 25614101, + "thin": false, + "hire_rate": { + "level_mean": 0.06985, + "floor_abs_log_ratio_mean": 0.06539, + "floor_abs_log_ratio_sd": 0.08085, + "n_pairs": 37, + "ex_pandemic_mean": 0.03522, + "ex_pandemic_sd": 0.0295, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.06889, + "floor_abs_log_ratio_mean": 0.05573, + "floor_abs_log_ratio_sd": 0.08709, + "n_pairs": 37, + "ex_pandemic_mean": 0.02334, + "ex_pandemic_sd": 0.01937, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.03565, + "floor_abs_log_ratio_mean": 0.09163, + "floor_abs_log_ratio_sd": 0.09921, + "n_pairs": 37, + "ex_pandemic_mean": 0.04597, + "ex_pandemic_sd": 0.03736, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.03562, + "floor_abs_log_ratio_mean": 0.09187, + "floor_abs_log_ratio_sd": 0.09805, + "n_pairs": 36, + "ex_pandemic_mean": 0.04618, + "ex_pandemic_sd": 0.03922, + "n_pairs_ex_pandemic": 24 + } + }, + "sex0_A07": { + "sex": 0, + "sex_label": "All Sexes", + "agegrp": "A07", + "agegrp_label": "55-64", + "min_denominator_jobs": 20859090, + "thin": false, + "hire_rate": { + "level_mean": 0.05553, + "floor_abs_log_ratio_mean": 0.06896, + "floor_abs_log_ratio_sd": 0.08034, + "n_pairs": 37, + "ex_pandemic_mean": 0.03671, + "ex_pandemic_sd": 0.02972, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.0654, + "floor_abs_log_ratio_mean": 0.05664, + "floor_abs_log_ratio_sd": 0.1031, + "n_pairs": 37, + "ex_pandemic_mean": 0.01923, + "ex_pandemic_sd": 0.01458, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.02505, + "floor_abs_log_ratio_mean": 0.09193, + "floor_abs_log_ratio_sd": 0.09486, + "n_pairs": 37, + "ex_pandemic_mean": 0.04861, + "ex_pandemic_sd": 0.03196, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.0249, + "floor_abs_log_ratio_mean": 0.09233, + "floor_abs_log_ratio_sd": 0.0937, + "n_pairs": 36, + "ex_pandemic_mean": 0.04911, + "ex_pandemic_sd": 0.03419, + "n_pairs_ex_pandemic": 24 + } + }, + "sex0_A08": { + "sex": 0, + "sex_label": "All Sexes", + "agegrp": "A08", + "agegrp_label": "65-99", + "min_denominator_jobs": 6794173, + "thin": false, + "hire_rate": { + "level_mean": 0.07202, + "floor_abs_log_ratio_mean": 0.07749, + "floor_abs_log_ratio_sd": 0.08494, + "n_pairs": 37, + "ex_pandemic_mean": 0.04487, + "ex_pandemic_sd": 0.04025, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.09982, + "floor_abs_log_ratio_mean": 0.0688, + "floor_abs_log_ratio_sd": 0.14007, + "n_pairs": 37, + "ex_pandemic_mean": 0.01811, + "ex_pandemic_sd": 0.01571, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.02219, + "floor_abs_log_ratio_mean": 0.08403, + "floor_abs_log_ratio_sd": 0.07878, + "n_pairs": 37, + "ex_pandemic_mean": 0.05429, + "ex_pandemic_sd": 0.03511, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.02205, + "floor_abs_log_ratio_mean": 0.0873, + "floor_abs_log_ratio_sd": 0.08428, + "n_pairs": 36, + "ex_pandemic_mean": 0.05674, + "ex_pandemic_sd": 0.03615, + "n_pairs_ex_pandemic": 24 + } + }, + "sex1_A00": { + "sex": 1, + "sex_label": "Male", + "agegrp": "A00", + "agegrp_label": "All Ages (14-99)", + "min_denominator_jobs": 62895777, + "thin": false, + "hire_rate": { + "level_mean": 0.11264, + "floor_abs_log_ratio_mean": 0.06422, + "floor_abs_log_ratio_sd": 0.07882, + "n_pairs": 37, + "ex_pandemic_mean": 0.03567, + "ex_pandemic_sd": 0.02914, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.10773, + "floor_abs_log_ratio_mean": 0.04806, + "floor_abs_log_ratio_sd": 0.06829, + "n_pairs": 37, + "ex_pandemic_mean": 0.02496, + "ex_pandemic_sd": 0.02124, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.05589, + "floor_abs_log_ratio_mean": 0.08477, + "floor_abs_log_ratio_sd": 0.0939, + "n_pairs": 37, + "ex_pandemic_mean": 0.04672, + "ex_pandemic_sd": 0.03793, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.05609, + "floor_abs_log_ratio_mean": 0.08497, + "floor_abs_log_ratio_sd": 0.09734, + "n_pairs": 36, + "ex_pandemic_mean": 0.04705, + "ex_pandemic_sd": 0.04064, + "n_pairs_ex_pandemic": 24 + } + }, + "sex1_A01": { + "sex": 1, + "sex_label": "Male", + "agegrp": "A01", + "agegrp_label": "14-18", + "min_denominator_jobs": 1084140, + "thin": false, + "hire_rate": { + "level_mean": 0.43626, + "floor_abs_log_ratio_mean": 0.06712, + "floor_abs_log_ratio_sd": 0.06893, + "n_pairs": 37, + "ex_pandemic_mean": 0.03712, + "ex_pandemic_sd": 0.0329, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.28055, + "floor_abs_log_ratio_mean": 0.07033, + "floor_abs_log_ratio_sd": 0.08996, + "n_pairs": 37, + "ex_pandemic_mean": 0.03153, + "ex_pandemic_sd": 0.02657, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.1076, + "floor_abs_log_ratio_mean": 0.0738, + "floor_abs_log_ratio_sd": 0.05438, + "n_pairs": 37, + "ex_pandemic_mean": 0.05264, + "ex_pandemic_sd": 0.04086, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.11527, + "floor_abs_log_ratio_mean": 0.0758, + "floor_abs_log_ratio_sd": 0.08788, + "n_pairs": 36, + "ex_pandemic_mean": 0.04973, + "ex_pandemic_sd": 0.04253, + "n_pairs_ex_pandemic": 24 + } + }, + "sex1_A02": { + "sex": 1, + "sex_label": "Male", + "agegrp": "A02", + "agegrp_label": "19-21", + "min_denominator_jobs": 2508489, + "thin": false, + "hire_rate": { + "level_mean": 0.29572, + "floor_abs_log_ratio_mean": 0.06433, + "floor_abs_log_ratio_sd": 0.06592, + "n_pairs": 37, + "ex_pandemic_mean": 0.0378, + "ex_pandemic_sd": 0.03232, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.25643, + "floor_abs_log_ratio_mean": 0.05566, + "floor_abs_log_ratio_sd": 0.05724, + "n_pairs": 37, + "ex_pandemic_mean": 0.03353, + "ex_pandemic_sd": 0.02995, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.136, + "floor_abs_log_ratio_mean": 0.07226, + "floor_abs_log_ratio_sd": 0.07794, + "n_pairs": 37, + "ex_pandemic_mean": 0.05087, + "ex_pandemic_sd": 0.04292, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.13694, + "floor_abs_log_ratio_mean": 0.07474, + "floor_abs_log_ratio_sd": 0.08757, + "n_pairs": 36, + "ex_pandemic_mean": 0.0502, + "ex_pandemic_sd": 0.04434, + "n_pairs_ex_pandemic": 24 + } + }, + "sex1_A03": { + "sex": 1, + "sex_label": "Male", + "agegrp": "A03", + "agegrp_label": "22-24", + "min_denominator_jobs": 3280046, + "thin": false, + "hire_rate": { + "level_mean": 0.2154, + "floor_abs_log_ratio_mean": 0.0716, + "floor_abs_log_ratio_sd": 0.08499, + "n_pairs": 37, + "ex_pandemic_mean": 0.04026, + "ex_pandemic_sd": 0.0353, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.19136, + "floor_abs_log_ratio_mean": 0.0534, + "floor_abs_log_ratio_sd": 0.05443, + "n_pairs": 37, + "ex_pandemic_mean": 0.03481, + "ex_pandemic_sd": 0.03131, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.11515, + "floor_abs_log_ratio_mean": 0.08085, + "floor_abs_log_ratio_sd": 0.09544, + "n_pairs": 37, + "ex_pandemic_mean": 0.05161, + "ex_pandemic_sd": 0.04112, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.11547, + "floor_abs_log_ratio_mean": 0.08336, + "floor_abs_log_ratio_sd": 0.09716, + "n_pairs": 36, + "ex_pandemic_mean": 0.05123, + "ex_pandemic_sd": 0.04395, + "n_pairs_ex_pandemic": 24 + } + }, + "sex1_A04": { + "sex": 1, + "sex_label": "Male", + "agegrp": "A04", + "agegrp_label": "25-34", + "min_denominator_jobs": 13775079, + "thin": false, + "hire_rate": { + "level_mean": 0.13315, + "floor_abs_log_ratio_mean": 0.07246, + "floor_abs_log_ratio_sd": 0.09351, + "n_pairs": 37, + "ex_pandemic_mean": 0.03837, + "ex_pandemic_sd": 0.03524, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.12585, + "floor_abs_log_ratio_mean": 0.05408, + "floor_abs_log_ratio_sd": 0.05766, + "n_pairs": 37, + "ex_pandemic_mean": 0.03269, + "ex_pandemic_sd": 0.02865, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.07649, + "floor_abs_log_ratio_mean": 0.09041, + "floor_abs_log_ratio_sd": 0.10399, + "n_pairs": 37, + "ex_pandemic_mean": 0.0493, + "ex_pandemic_sd": 0.04191, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.07652, + "floor_abs_log_ratio_mean": 0.09049, + "floor_abs_log_ratio_sd": 0.10455, + "n_pairs": 36, + "ex_pandemic_mean": 0.0499, + "ex_pandemic_sd": 0.04476, + "n_pairs_ex_pandemic": 24 + } + }, + "sex1_A05": { + "sex": 1, + "sex_label": "Male", + "agegrp": "A05", + "agegrp_label": "35-44", + "min_denominator_jobs": 13661887, + "thin": false, + "hire_rate": { + "level_mean": 0.09162, + "floor_abs_log_ratio_mean": 0.06408, + "floor_abs_log_ratio_sd": 0.08345, + "n_pairs": 37, + "ex_pandemic_mean": 0.03367, + "ex_pandemic_sd": 0.02885, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.08857, + "floor_abs_log_ratio_mean": 0.05026, + "floor_abs_log_ratio_sd": 0.06663, + "n_pairs": 37, + "ex_pandemic_mean": 0.02504, + "ex_pandemic_sd": 0.02176, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.05004, + "floor_abs_log_ratio_mean": 0.08969, + "floor_abs_log_ratio_sd": 0.09852, + "n_pairs": 37, + "ex_pandemic_mean": 0.04421, + "ex_pandemic_sd": 0.03769, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.05001, + "floor_abs_log_ratio_mean": 0.09107, + "floor_abs_log_ratio_sd": 0.09824, + "n_pairs": 36, + "ex_pandemic_mean": 0.04549, + "ex_pandemic_sd": 0.03987, + "n_pairs_ex_pandemic": 24 + } + }, + "sex1_A06": { + "sex": 1, + "sex_label": "Male", + "agegrp": "A06", + "agegrp_label": "45-54", + "min_denominator_jobs": 13005656, + "thin": false, + "hire_rate": { + "level_mean": 0.07106, + "floor_abs_log_ratio_mean": 0.05836, + "floor_abs_log_ratio_sd": 0.07424, + "n_pairs": 37, + "ex_pandemic_mean": 0.03106, + "ex_pandemic_sd": 0.02446, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.07092, + "floor_abs_log_ratio_mean": 0.0468, + "floor_abs_log_ratio_sd": 0.07313, + "n_pairs": 37, + "ex_pandemic_mean": 0.0194, + "ex_pandemic_sd": 0.01638, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.03705, + "floor_abs_log_ratio_mean": 0.08444, + "floor_abs_log_ratio_sd": 0.09235, + "n_pairs": 37, + "ex_pandemic_mean": 0.04119, + "ex_pandemic_sd": 0.03369, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.03698, + "floor_abs_log_ratio_mean": 0.08604, + "floor_abs_log_ratio_sd": 0.09081, + "n_pairs": 36, + "ex_pandemic_mean": 0.04277, + "ex_pandemic_sd": 0.03474, + "n_pairs_ex_pandemic": 24 + } + }, + "sex1_A07": { + "sex": 1, + "sex_label": "Male", + "agegrp": "A07", + "agegrp_label": "55-64", + "min_denominator_jobs": 10403974, + "thin": false, + "hire_rate": { + "level_mean": 0.05782, + "floor_abs_log_ratio_mean": 0.06305, + "floor_abs_log_ratio_sd": 0.0721, + "n_pairs": 37, + "ex_pandemic_mean": 0.03419, + "ex_pandemic_sd": 0.02567, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.06761, + "floor_abs_log_ratio_mean": 0.04635, + "floor_abs_log_ratio_sd": 0.08553, + "n_pairs": 37, + "ex_pandemic_mean": 0.01628, + "ex_pandemic_sd": 0.01322, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.02673, + "floor_abs_log_ratio_mean": 0.08497, + "floor_abs_log_ratio_sd": 0.08835, + "n_pairs": 37, + "ex_pandemic_mean": 0.04383, + "ex_pandemic_sd": 0.0312, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.02654, + "floor_abs_log_ratio_mean": 0.08629, + "floor_abs_log_ratio_sd": 0.08754, + "n_pairs": 36, + "ex_pandemic_mean": 0.04502, + "ex_pandemic_sd": 0.03331, + "n_pairs_ex_pandemic": 24 + } + }, + "sex1_A08": { + "sex": 1, + "sex_label": "Male", + "agegrp": "A08", + "agegrp_label": "65-99", + "min_denominator_jobs": 3512909, + "thin": false, + "hire_rate": { + "level_mean": 0.07378, + "floor_abs_log_ratio_mean": 0.07166, + "floor_abs_log_ratio_sd": 0.0737, + "n_pairs": 37, + "ex_pandemic_mean": 0.04237, + "ex_pandemic_sd": 0.03784, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.10064, + "floor_abs_log_ratio_mean": 0.05896, + "floor_abs_log_ratio_sd": 0.12119, + "n_pairs": 37, + "ex_pandemic_mean": 0.01589, + "ex_pandemic_sd": 0.01392, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.02309, + "floor_abs_log_ratio_mean": 0.08276, + "floor_abs_log_ratio_sd": 0.07591, + "n_pairs": 37, + "ex_pandemic_mean": 0.05243, + "ex_pandemic_sd": 0.03565, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.02293, + "floor_abs_log_ratio_mean": 0.08645, + "floor_abs_log_ratio_sd": 0.08223, + "n_pairs": 36, + "ex_pandemic_mean": 0.05469, + "ex_pandemic_sd": 0.0369, + "n_pairs_ex_pandemic": 24 + } + }, + "sex2_A00": { + "sex": 2, + "sex_label": "Female", + "agegrp": "A00", + "agegrp_label": "All Ages (14-99)", + "min_denominator_jobs": 61261381, + "thin": false, + "hire_rate": { + "level_mean": 0.1101, + "floor_abs_log_ratio_mean": 0.07457, + "floor_abs_log_ratio_sd": 0.09449, + "n_pairs": 37, + "ex_pandemic_mean": 0.03999, + "ex_pandemic_sd": 0.03769, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.104, + "floor_abs_log_ratio_mean": 0.05945, + "floor_abs_log_ratio_sd": 0.09026, + "n_pairs": 37, + "ex_pandemic_mean": 0.02969, + "ex_pandemic_sd": 0.02674, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.053, + "floor_abs_log_ratio_mean": 0.09336, + "floor_abs_log_ratio_sd": 0.10852, + "n_pairs": 37, + "ex_pandemic_mean": 0.05292, + "ex_pandemic_sd": 0.04499, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.05329, + "floor_abs_log_ratio_mean": 0.09193, + "floor_abs_log_ratio_sd": 0.1117, + "n_pairs": 36, + "ex_pandemic_mean": 0.05161, + "ex_pandemic_sd": 0.04705, + "n_pairs_ex_pandemic": 24 + } + }, + "sex2_A01": { + "sex": 2, + "sex_label": "Female", + "agegrp": "A01", + "agegrp_label": "14-18", + "min_denominator_jobs": 1290393, + "thin": false, + "hire_rate": { + "level_mean": 0.40702, + "floor_abs_log_ratio_mean": 0.08137, + "floor_abs_log_ratio_sd": 0.09561, + "n_pairs": 37, + "ex_pandemic_mean": 0.03462, + "ex_pandemic_sd": 0.03186, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.26294, + "floor_abs_log_ratio_mean": 0.07794, + "floor_abs_log_ratio_sd": 0.10405, + "n_pairs": 37, + "ex_pandemic_mean": 0.0309, + "ex_pandemic_sd": 0.03068, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.1118, + "floor_abs_log_ratio_mean": 0.08275, + "floor_abs_log_ratio_sd": 0.07126, + "n_pairs": 37, + "ex_pandemic_mean": 0.0553, + "ex_pandemic_sd": 0.04525, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.11878, + "floor_abs_log_ratio_mean": 0.08551, + "floor_abs_log_ratio_sd": 0.10219, + "n_pairs": 36, + "ex_pandemic_mean": 0.05158, + "ex_pandemic_sd": 0.04546, + "n_pairs_ex_pandemic": 24 + } + }, + "sex2_A02": { + "sex": 2, + "sex_label": "Female", + "agegrp": "A02", + "agegrp_label": "19-21", + "min_denominator_jobs": 2596816, + "thin": false, + "hire_rate": { + "level_mean": 0.28574, + "floor_abs_log_ratio_mean": 0.07515, + "floor_abs_log_ratio_sd": 0.08405, + "n_pairs": 37, + "ex_pandemic_mean": 0.03525, + "ex_pandemic_sd": 0.03475, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.24836, + "floor_abs_log_ratio_mean": 0.06226, + "floor_abs_log_ratio_sd": 0.07515, + "n_pairs": 37, + "ex_pandemic_mean": 0.03138, + "ex_pandemic_sd": 0.03425, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.13467, + "floor_abs_log_ratio_mean": 0.078, + "floor_abs_log_ratio_sd": 0.08413, + "n_pairs": 37, + "ex_pandemic_mean": 0.05258, + "ex_pandemic_sd": 0.04754, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.13554, + "floor_abs_log_ratio_mean": 0.07924, + "floor_abs_log_ratio_sd": 0.0972, + "n_pairs": 36, + "ex_pandemic_mean": 0.04881, + "ex_pandemic_sd": 0.0486, + "n_pairs_ex_pandemic": 24 + } + }, + "sex2_A03": { + "sex": 2, + "sex_label": "Female", + "agegrp": "A03", + "agegrp_label": "22-24", + "min_denominator_jobs": 3270659, + "thin": false, + "hire_rate": { + "level_mean": 0.21051, + "floor_abs_log_ratio_mean": 0.07623, + "floor_abs_log_ratio_sd": 0.10036, + "n_pairs": 37, + "ex_pandemic_mean": 0.03886, + "ex_pandemic_sd": 0.03892, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.18725, + "floor_abs_log_ratio_mean": 0.06152, + "floor_abs_log_ratio_sd": 0.07064, + "n_pairs": 37, + "ex_pandemic_mean": 0.0329, + "ex_pandemic_sd": 0.03442, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.11371, + "floor_abs_log_ratio_mean": 0.08469, + "floor_abs_log_ratio_sd": 0.11117, + "n_pairs": 37, + "ex_pandemic_mean": 0.0499, + "ex_pandemic_sd": 0.04653, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.11394, + "floor_abs_log_ratio_mean": 0.08596, + "floor_abs_log_ratio_sd": 0.10923, + "n_pairs": 36, + "ex_pandemic_mean": 0.04739, + "ex_pandemic_sd": 0.04803, + "n_pairs_ex_pandemic": 24 + } + }, + "sex2_A04": { + "sex": 2, + "sex_label": "Female", + "agegrp": "A04", + "agegrp_label": "25-34", + "min_denominator_jobs": 13169046, + "thin": false, + "hire_rate": { + "level_mean": 0.12745, + "floor_abs_log_ratio_mean": 0.08139, + "floor_abs_log_ratio_sd": 0.1077, + "n_pairs": 37, + "ex_pandemic_mean": 0.04282, + "ex_pandemic_sd": 0.04361, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.12034, + "floor_abs_log_ratio_mean": 0.06229, + "floor_abs_log_ratio_sd": 0.07457, + "n_pairs": 37, + "ex_pandemic_mean": 0.03481, + "ex_pandemic_sd": 0.03326, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.07043, + "floor_abs_log_ratio_mean": 0.10116, + "floor_abs_log_ratio_sd": 0.12044, + "n_pairs": 37, + "ex_pandemic_mean": 0.05397, + "ex_pandemic_sd": 0.04837, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.07052, + "floor_abs_log_ratio_mean": 0.09911, + "floor_abs_log_ratio_sd": 0.11999, + "n_pairs": 36, + "ex_pandemic_mean": 0.05293, + "ex_pandemic_sd": 0.05104, + "n_pairs_ex_pandemic": 24 + } + }, + "sex2_A05": { + "sex": 2, + "sex_label": "Female", + "agegrp": "A05", + "agegrp_label": "35-44", + "min_denominator_jobs": 12892686, + "thin": false, + "hire_rate": { + "level_mean": 0.08912, + "floor_abs_log_ratio_mean": 0.07657, + "floor_abs_log_ratio_sd": 0.09772, + "n_pairs": 37, + "ex_pandemic_mean": 0.04164, + "ex_pandemic_sd": 0.04013, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.08356, + "floor_abs_log_ratio_mean": 0.062, + "floor_abs_log_ratio_sd": 0.08974, + "n_pairs": 37, + "ex_pandemic_mean": 0.03111, + "ex_pandemic_sd": 0.02721, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.04578, + "floor_abs_log_ratio_mean": 0.10251, + "floor_abs_log_ratio_sd": 0.11114, + "n_pairs": 37, + "ex_pandemic_mean": 0.05311, + "ex_pandemic_sd": 0.04404, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.04588, + "floor_abs_log_ratio_mean": 0.10136, + "floor_abs_log_ratio_sd": 0.11121, + "n_pairs": 36, + "ex_pandemic_mean": 0.05216, + "ex_pandemic_sd": 0.04675, + "n_pairs_ex_pandemic": 24 + } + }, + "sex2_A06": { + "sex": 2, + "sex_label": "Female", + "agegrp": "A06", + "agegrp_label": "45-54", + "min_denominator_jobs": 12608445, + "thin": false, + "hire_rate": { + "level_mean": 0.06863, + "floor_abs_log_ratio_mean": 0.07384, + "floor_abs_log_ratio_sd": 0.08839, + "n_pairs": 37, + "ex_pandemic_mean": 0.04102, + "ex_pandemic_sd": 0.03494, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.06682, + "floor_abs_log_ratio_mean": 0.06623, + "floor_abs_log_ratio_sd": 0.10139, + "n_pairs": 37, + "ex_pandemic_mean": 0.02927, + "ex_pandemic_sd": 0.02202, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.03422, + "floor_abs_log_ratio_mean": 0.10182, + "floor_abs_log_ratio_sd": 0.10553, + "n_pairs": 37, + "ex_pandemic_mean": 0.05473, + "ex_pandemic_sd": 0.03831, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.03423, + "floor_abs_log_ratio_mean": 0.10074, + "floor_abs_log_ratio_sd": 0.10445, + "n_pairs": 36, + "ex_pandemic_mean": 0.05378, + "ex_pandemic_sd": 0.0411, + "n_pairs_ex_pandemic": 24 + } + }, + "sex2_A07": { + "sex": 2, + "sex_label": "Female", + "agegrp": "A07", + "agegrp_label": "55-64", + "min_denominator_jobs": 10455116, + "thin": false, + "hire_rate": { + "level_mean": 0.05323, + "floor_abs_log_ratio_mean": 0.07784, + "floor_abs_log_ratio_sd": 0.08927, + "n_pairs": 37, + "ex_pandemic_mean": 0.04238, + "ex_pandemic_sd": 0.03189, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.06318, + "floor_abs_log_ratio_mean": 0.0678, + "floor_abs_log_ratio_sd": 0.12145, + "n_pairs": 37, + "ex_pandemic_mean": 0.02297, + "ex_pandemic_sd": 0.01809, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.02336, + "floor_abs_log_ratio_mean": 0.10114, + "floor_abs_log_ratio_sd": 0.10246, + "n_pairs": 37, + "ex_pandemic_mean": 0.05581, + "ex_pandemic_sd": 0.03141, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.02324, + "floor_abs_log_ratio_mean": 0.09958, + "floor_abs_log_ratio_sd": 0.1016, + "n_pairs": 36, + "ex_pandemic_mean": 0.05426, + "ex_pandemic_sd": 0.03632, + "n_pairs_ex_pandemic": 24 + } + }, + "sex2_A08": { + "sex": 2, + "sex_label": "Female", + "agegrp": "A08", + "agegrp_label": "65-99", + "min_denominator_jobs": 3281264, + "thin": false, + "hire_rate": { + "level_mean": 0.07016, + "floor_abs_log_ratio_mean": 0.08678, + "floor_abs_log_ratio_sd": 0.09842, + "n_pairs": 37, + "ex_pandemic_mean": 0.05075, + "ex_pandemic_sd": 0.04107, + "n_pairs_ex_pandemic": 25 + }, + "separation_rate": { + "level_mean": 0.09892, + "floor_abs_log_ratio_mean": 0.08, + "floor_abs_log_ratio_sd": 0.15915, + "n_pairs": 37, + "ex_pandemic_mean": 0.02109, + "ex_pandemic_sd": 0.01865, + "n_pairs_ex_pandemic": 25 + }, + "j2j_hire_rate": { + "level_mean": 0.02121, + "floor_abs_log_ratio_mean": 0.08586, + "floor_abs_log_ratio_sd": 0.08288, + "n_pairs": 37, + "ex_pandemic_mean": 0.05643, + "ex_pandemic_sd": 0.03501, + "n_pairs_ex_pandemic": 25 + }, + "j2j_separation_rate": { + "level_mean": 0.02111, + "floor_abs_log_ratio_mean": 0.08876, + "floor_abs_log_ratio_sd": 0.08702, + "n_pairs": 36, + "ex_pandemic_mean": 0.0591, + "ex_pandemic_sd": 0.03595, + "n_pairs_ex_pandemic": 24 + } + } + }, + "cross_cell": { + "n_cells": 16, + "note": "non-margin cells only (sex in 1,2 x agegrp A01-A08); the all-sexes / all-ages rows are aggregates of these and are reported per-cell above, not pooled here", + "hire_rate": { + "cell_floor_median": 0.07315, + "cell_floor_p90": 0.08138, + "cell_floor_max": 0.08678, + "n_cells_with_pairs": 16, + "n_thin_cells": 0 + }, + "separation_rate": { + "cell_floor_median": 0.06176, + "cell_floor_p90": 0.07414, + "cell_floor_max": 0.08, + "n_cells_with_pairs": 16, + "n_thin_cells": 0 + }, + "j2j_hire_rate": { + "cell_floor_median": 0.08483, + "cell_floor_p90": 0.10149, + "cell_floor_max": 0.10251, + "n_cells_with_pairs": 16, + "n_thin_cells": 0 + }, + "j2j_separation_rate": { + "cell_floor_median": 0.08637, + "cell_floor_p90": 0.10016, + "cell_floor_max": 0.10136, + "n_cells_with_pairs": 16, + "n_thin_cells": 0 + } + } + } + }, + "e6_e7": { + "by_firmsize_all_industry": { + "firmsize1": { + "firmsize_label": "0-19 Employees", + "canonical_bands": [ + "LT10", + "B10_49" + ], + "exact": false, + "min_denominator_jobs": 25040755, + "thin": false, + "e6_hire_rate": { + "level_mean": 0.17624, + "floor_abs_log_ratio_mean": 0.04064, + "floor_abs_log_ratio_sd": 0.03991, + "n_pairs": 36, + "ex_pandemic_mean": 0.02704, + "ex_pandemic_sd": 0.02644, + "n_pairs_ex_pandemic": 24 + }, + "e6_separation_rate": { + "level_mean": 0.16626, + "floor_abs_log_ratio_mean": 0.05999, + "floor_abs_log_ratio_sd": 0.11622, + "n_pairs": 35, + "ex_pandemic_mean": 0.02282, + "ex_pandemic_sd": 0.02517, + "n_pairs_ex_pandemic": 23 + }, + "e7_earns_mean": { + "level_mean": 3750.15385, + "floor_abs_log_ratio_mean": 0.03537, + "floor_abs_log_ratio_sd": 0.02616, + "n_pairs": 35, + "ex_pandemic_mean": 0.02618, + "ex_pandemic_sd": 0.01311, + "n_pairs_ex_pandemic": 23 + }, + "e7_earns_rel_to_aggregate": { + "floor_abs_log_ratio_mean": 0.01162, + "floor_abs_log_ratio_sd": 0.0086, + "n_pairs": 35, + "ex_pandemic_mean": 0.0094, + "ex_pandemic_sd": 0.00565, + "n_pairs_ex_pandemic": 23 + } + }, + "firmsize2": { + "firmsize_label": "20-49 Employees", + "canonical_bands": [ + "B10_49" + ], + "exact": true, + "min_denominator_jobs": 12789770, + "thin": false, + "e6_hire_rate": { + "level_mean": 0.17312, + "floor_abs_log_ratio_mean": 0.05679, + "floor_abs_log_ratio_sd": 0.07378, + "n_pairs": 36, + "ex_pandemic_mean": 0.03523, + "ex_pandemic_sd": 0.032, + "n_pairs_ex_pandemic": 24 + }, + "e6_separation_rate": { + "level_mean": 0.17206, + "floor_abs_log_ratio_mean": 0.06336, + "floor_abs_log_ratio_sd": 0.10903, + "n_pairs": 35, + "ex_pandemic_mean": 0.02619, + "ex_pandemic_sd": 0.02508, + "n_pairs_ex_pandemic": 23 + }, + "e7_earns_mean": { + "level_mean": 4381.53846, + "floor_abs_log_ratio_mean": 0.03731, + "floor_abs_log_ratio_sd": 0.03138, + "n_pairs": 35, + "ex_pandemic_mean": 0.02465, + "ex_pandemic_sd": 0.01173, + "n_pairs_ex_pandemic": 23 + }, + "e7_earns_rel_to_aggregate": { + "floor_abs_log_ratio_mean": 0.01223, + "floor_abs_log_ratio_sd": 0.00568, + "n_pairs": 35, + "ex_pandemic_mean": 0.01198, + "ex_pandemic_sd": 0.00533, + "n_pairs_ex_pandemic": 23 + } + }, + "firmsize3": { + "firmsize_label": "50-249 Employees", + "canonical_bands": [ + "B50_99", + "B100_499" + ], + "exact": false, + "min_denominator_jobs": 20162591, + "thin": false, + "e6_hire_rate": { + "level_mean": 0.16488, + "floor_abs_log_ratio_mean": 0.0591, + "floor_abs_log_ratio_sd": 0.0873, + "n_pairs": 36, + "ex_pandemic_mean": 0.03188, + "ex_pandemic_sd": 0.02802, + "n_pairs_ex_pandemic": 24 + }, + "e6_separation_rate": { + "level_mean": 0.16329, + "floor_abs_log_ratio_mean": 0.05497, + "floor_abs_log_ratio_sd": 0.08723, + "n_pairs": 35, + "ex_pandemic_mean": 0.02339, + "ex_pandemic_sd": 0.02125, + "n_pairs_ex_pandemic": 23 + }, + "e7_earns_mean": { + "level_mean": 5030.20513, + "floor_abs_log_ratio_mean": 0.04158, + "floor_abs_log_ratio_sd": 0.0342, + "n_pairs": 35, + "ex_pandemic_mean": 0.02727, + "ex_pandemic_sd": 0.0135, + "n_pairs_ex_pandemic": 23 + }, + "e7_earns_rel_to_aggregate": { + "floor_abs_log_ratio_mean": 0.00892, + "floor_abs_log_ratio_sd": 0.00766, + "n_pairs": 35, + "ex_pandemic_mean": 0.00961, + "ex_pandemic_sd": 0.00864, + "n_pairs_ex_pandemic": 23 + } + }, + "firmsize4": { + "firmsize_label": "250-499 Employees", + "canonical_bands": [ + "B100_499" + ], + "exact": true, + "min_denominator_jobs": 7617802, + "thin": false, + "e6_hire_rate": { + "level_mean": 0.16156, + "floor_abs_log_ratio_mean": 0.06534, + "floor_abs_log_ratio_sd": 0.09317, + "n_pairs": 36, + "ex_pandemic_mean": 0.03994, + "ex_pandemic_sd": 0.0375, + "n_pairs_ex_pandemic": 24 + }, + "e6_separation_rate": { + "level_mean": 0.16052, + "floor_abs_log_ratio_mean": 0.05247, + "floor_abs_log_ratio_sd": 0.0692, + "n_pairs": 35, + "ex_pandemic_mean": 0.02996, + "ex_pandemic_sd": 0.0296, + "n_pairs_ex_pandemic": 23 + }, + "e7_earns_mean": { + "level_mean": 5525.97436, + "floor_abs_log_ratio_mean": 0.04863, + "floor_abs_log_ratio_sd": 0.03432, + "n_pairs": 35, + "ex_pandemic_mean": 0.03416, + "ex_pandemic_sd": 0.01636, + "n_pairs_ex_pandemic": 23 + }, + "e7_earns_rel_to_aggregate": { + "floor_abs_log_ratio_mean": 0.00912, + "floor_abs_log_ratio_sd": 0.00785, + "n_pairs": 35, + "ex_pandemic_mean": 0.00654, + "ex_pandemic_sd": 0.00621, + "n_pairs_ex_pandemic": 23 + } + }, + "firmsize5": { + "firmsize_label": "500+ Employees", + "canonical_bands": [ + "B500_PLUS" + ], + "exact": true, + "min_denominator_jobs": 68074643, + "thin": false, + "e6_hire_rate": { + "level_mean": 0.14811, + "floor_abs_log_ratio_mean": 0.06934, + "floor_abs_log_ratio_sd": 0.08517, + "n_pairs": 36, + "ex_pandemic_mean": 0.04385, + "ex_pandemic_sd": 0.04534, + "n_pairs_ex_pandemic": 24 + }, + "e6_separation_rate": { + "level_mean": 0.14779, + "floor_abs_log_ratio_mean": 0.05885, + "floor_abs_log_ratio_sd": 0.06307, + "n_pairs": 35, + "ex_pandemic_mean": 0.03847, + "ex_pandemic_sd": 0.0392, + "n_pairs_ex_pandemic": 23 + }, + "e7_earns_mean": { + "level_mean": 6198.97436, + "floor_abs_log_ratio_mean": 0.04616, + "floor_abs_log_ratio_sd": 0.02996, + "n_pairs": 35, + "ex_pandemic_mean": 0.03539, + "ex_pandemic_sd": 0.0167, + "n_pairs_ex_pandemic": 23 + }, + "e7_earns_rel_to_aggregate": { + "floor_abs_log_ratio_mean": 0.00492, + "floor_abs_log_ratio_sd": 0.00398, + "n_pairs": 35, + "ex_pandemic_mean": 0.00397, + "ex_pandemic_sd": 0.00271, + "n_pairs_ex_pandemic": 23 + } + } + }, + "sector_cells": { + "n_cells": 95, + "e6_hire_rate": { + "cell_floor_median": 0.07599, + "cell_floor_p90": 0.13751, + "cell_floor_max": 0.24728, + "n_cells_with_pairs": 95, + "n_thin_cells": 0 + }, + "e6_separation_rate": { + "cell_floor_median": 0.06708, + "cell_floor_p90": 0.1134, + "cell_floor_max": 0.17484, + "n_cells_with_pairs": 95, + "n_thin_cells": 0 + }, + "e7_earns_mean": { + "cell_floor_median": 0.04492, + "cell_floor_p90": 0.06791, + "cell_floor_max": 0.11178, + "n_cells_with_pairs": 95, + "n_thin_cells": 0 + } + } + }, + "e11": { + "status": "detail floor NOT derivable (one YoY pair per cell); destination-size margin floor derivable", + "detail_window": { + "observed_quarters": [ + "2015Q1", + "2015Q2", + "2015Q3", + "2015Q4", + "2016Q1" + ], + "n_quarters": 5, + "max_yoy_pairs_per_cell": 1, + "why_not_floorable": "the national origin x destination cross is published only for 2015Q1-2016Q1 (from 2016Q2 every detail cell carries status flag 11); same-quarter year-over-year pairing therefore yields at most one pair per detail cell, which gives a gap but no dispersion, so no mean + k*sd floor exists on the cross. This is a different disposition from the earlier draft's 'no extract committed': the extract exists (#228), the temporal replicate does not" + }, + "destination_size_margin": { + "firmsize1": { + "firmsize_label": "0-19 Employees", + "ee": { + "floor_abs_log_ratio_mean": 0.1054, + "floor_abs_log_ratio_sd": 0.13661, + "n_pairs": 37, + "ex_pandemic_mean": 0.05397, + "ex_pandemic_sd": 0.04699, + "n_pairs_ex_pandemic": 25 + }, + "ee_rel": { + "floor_abs_log_ratio_mean": 0.02329, + "floor_abs_log_ratio_sd": 0.02113, + "n_pairs": 37, + "ex_pandemic_mean": 0.01431, + "ex_pandemic_sd": 0.00849, + "n_pairs_ex_pandemic": 25 + } + }, + "firmsize2": { + "firmsize_label": "20-49 Employees", + "ee": { + "floor_abs_log_ratio_mean": 0.11739, + "floor_abs_log_ratio_sd": 0.15705, + "n_pairs": 37, + "ex_pandemic_mean": 0.05478, + "ex_pandemic_sd": 0.03831, + "n_pairs_ex_pandemic": 25 + }, + "ee_rel": { + "floor_abs_log_ratio_mean": 0.02035, + "floor_abs_log_ratio_sd": 0.01787, + "n_pairs": 37, + "ex_pandemic_mean": 0.01269, + "ex_pandemic_sd": 0.01065, + "n_pairs_ex_pandemic": 25 + } + }, + "firmsize3": { + "firmsize_label": "50-249 Employees", + "ee": { + "floor_abs_log_ratio_mean": 0.11377, + "floor_abs_log_ratio_sd": 0.15272, + "n_pairs": 37, + "ex_pandemic_mean": 0.04992, + "ex_pandemic_sd": 0.03355, + "n_pairs_ex_pandemic": 25 + }, + "ee_rel": { + "floor_abs_log_ratio_mean": 0.01738, + "floor_abs_log_ratio_sd": 0.0129, + "n_pairs": 37, + "ex_pandemic_mean": 0.01457, + "ex_pandemic_sd": 0.01355, + "n_pairs_ex_pandemic": 25 + } + }, + "firmsize4": { + "firmsize_label": "250-499 Employees", + "ee": { + "floor_abs_log_ratio_mean": 0.12445, + "floor_abs_log_ratio_sd": 0.15539, + "n_pairs": 37, + "ex_pandemic_mean": 0.05997, + "ex_pandemic_sd": 0.04299, + "n_pairs_ex_pandemic": 25 + }, + "ee_rel": { + "floor_abs_log_ratio_mean": 0.01445, + "floor_abs_log_ratio_sd": 0.01401, + "n_pairs": 37, + "ex_pandemic_mean": 0.01089, + "ex_pandemic_sd": 0.01025, + "n_pairs_ex_pandemic": 25 + } + }, + "firmsize5": { + "firmsize_label": "500+ Employees", + "ee": { + "floor_abs_log_ratio_mean": 0.12535, + "floor_abs_log_ratio_sd": 0.14728, + "n_pairs": 37, + "ex_pandemic_mean": 0.06573, + "ex_pandemic_sd": 0.05016, + "n_pairs_ex_pandemic": 25 + }, + "ee_rel": { + "floor_abs_log_ratio_mean": 0.01321, + "floor_abs_log_ratio_sd": 0.01144, + "n_pairs": 37, + "ex_pandemic_mean": 0.00999, + "ex_pandemic_sd": 0.00981, + "n_pairs_ex_pandemic": 25 + } + } + }, + "cross_source_margin_disagreement": { + "all_size_ee_tool_above_flat_file": "37 of 41 quarters", + "all_size_ee_deviation_range_pct": [ + -1.0, + 2.02 + ], + "per_size_deviation_range_pct": [ + -3.2, + 3.67 + ], + "note": "the LED Extraction Tool's margins and the LEHD flat file's d_fs margins are independent publications of the same quantity and disagree by up to ~3% in either direction (provenance entry 6; reproduce with scripts/check_j2jod_margin_agreement.py). Since E11's post-2016Q1 constraints are margins-only, this cross-source wobble bounds how tight any E11 margin threshold can be, independently of the temporal floor above" + } + }, + "e12": { + "status": "deferred - true-linked reference required; aggregate fit cannot certify linkage or two-sided moments" + } +} diff --git a/runs/seam_reconciliation_draft_v0.json b/runs/seam_reconciliation_draft_v0.json new file mode 100644 index 00000000..06dcaed0 --- /dev/null +++ b/runs/seam_reconciliation_draft_v0.json @@ -0,0 +1,215 @@ +{ + "artifact": "seam_reconciliation", + "version": "draft_v0", + "status": "DRAFT - NOT RATIFIED; C3 not locked; no thresholds", + "issue": "192", + "year_label_convention": "Keys under within_wave_monthly_separation and within_wave_means are SIPP FILE years (pu2022/pu2023), not reference years; file year = reference year + 1. PR #212's artifacts use reference years, so pu2022 here pairs with #212's 2021 and pu2023 with #212's 2022.", + "notes": "Naming collision: the SIPP 'j2j' transition measure from #212 (~0.35% person-level direct employer change per month) and the Census J2J data source's ~4.1% monthly-equivalent main-job separation rate benchmark used here are different universes and definitions (person-level direct employer-to-employer moves vs all main-job separations in UI-covered employment); the ~10x gap is not a contradiction.", + "first_reported": "PolicyEngine/populace-dynamics#192 comment 4982442068 (groundwork conditioned on employed-both-months; this artifact adds the E->N leg via the person-month universe)", + "within_wave_monthly_separation": { + "2022": [ + { + "month_pair": "1->2", + "jobs_held": 16932, + "jobs_kept": 16763, + "sep_rate": 0.01 + }, + { + "month_pair": "2->3", + "jobs_held": 17029, + "jobs_kept": 16843, + "sep_rate": 0.0109 + }, + { + "month_pair": "3->4", + "jobs_held": 17125, + "jobs_kept": 16884, + "sep_rate": 0.0141 + }, + { + "month_pair": "4->5", + "jobs_held": 17181, + "jobs_kept": 16923, + "sep_rate": 0.015 + }, + { + "month_pair": "5->6", + "jobs_held": 17317, + "jobs_kept": 16952, + "sep_rate": 0.0211 + }, + { + "month_pair": "6->7", + "jobs_held": 17395, + "jobs_kept": 17055, + "sep_rate": 0.0195 + }, + { + "month_pair": "7->8", + "jobs_held": 17385, + "jobs_kept": 17039, + "sep_rate": 0.0199 + }, + { + "month_pair": "8->9", + "jobs_held": 17475, + "jobs_kept": 17033, + "sep_rate": 0.0253 + }, + { + "month_pair": "9->10", + "jobs_held": 17466, + "jobs_kept": 17156, + "sep_rate": 0.0177 + }, + { + "month_pair": "10->11", + "jobs_held": 17517, + "jobs_kept": 17187, + "sep_rate": 0.0188 + }, + { + "month_pair": "11->12", + "jobs_held": 17541, + "jobs_kept": 17271, + "sep_rate": 0.0154 + } + ], + "2023": [ + { + "month_pair": "1->2", + "jobs_held": 17559, + "jobs_kept": 17323, + "sep_rate": 0.0134 + }, + { + "month_pair": "2->3", + "jobs_held": 17617, + "jobs_kept": 17370, + "sep_rate": 0.014 + }, + { + "month_pair": "3->4", + "jobs_held": 17699, + "jobs_kept": 17395, + "sep_rate": 0.0172 + }, + { + "month_pair": "4->5", + "jobs_held": 17677, + "jobs_kept": 17373, + "sep_rate": 0.0172 + }, + { + "month_pair": "5->6", + "jobs_held": 17720, + "jobs_kept": 17335, + "sep_rate": 0.0217 + }, + { + "month_pair": "6->7", + "jobs_held": 17737, + "jobs_kept": 17358, + "sep_rate": 0.0214 + }, + { + "month_pair": "7->8", + "jobs_held": 17636, + "jobs_kept": 17326, + "sep_rate": 0.0176 + }, + { + "month_pair": "8->9", + "jobs_held": 17758, + "jobs_kept": 17301, + "sep_rate": 0.0257 + }, + { + "month_pair": "9->10", + "jobs_held": 17658, + "jobs_kept": 17355, + "sep_rate": 0.0172 + }, + { + "month_pair": "10->11", + "jobs_held": 17663, + "jobs_kept": 17351, + "sep_rate": 0.0177 + }, + { + "month_pair": "11->12", + "jobs_held": 17660, + "jobs_kept": 17354, + "sep_rate": 0.0173 + } + ] + }, + "within_wave_means": { + "2022": 0.0171, + "2023": 0.0182 + }, + "across_wave_dec_to_jan": { + "persons_linked": 10051, + "jobs_held": 10828, + "jobs_kept": 9805, + "sep_rate": 0.0945 + }, + "j2j_national_benchmark": [ + { + "year": 2021, + "quarter": 1, + "q_sep_rate": 0.1001, + "monthly_equivalent": 0.0346 + }, + { + "year": 2021, + "quarter": 2, + "q_sep_rate": 0.1186, + "monthly_equivalent": 0.0412 + }, + { + "year": 2021, + "quarter": 3, + "q_sep_rate": 0.1315, + "monthly_equivalent": 0.0459 + }, + { + "year": 2021, + "quarter": 4, + "q_sep_rate": 0.1269, + "monthly_equivalent": 0.0442 + }, + { + "year": 2022, + "quarter": 1, + "q_sep_rate": 0.1095, + "monthly_equivalent": 0.0379 + }, + { + "year": 2022, + "quarter": 2, + "q_sep_rate": 0.1201, + "monthly_equivalent": 0.0418 + }, + { + "year": 2022, + "quarter": 3, + "q_sep_rate": 0.1307, + "monthly_equivalent": 0.0456 + }, + { + "year": 2022, + "quarter": 4, + "q_sep_rate": 0.1162, + "monthly_equivalent": 0.0403 + } + ], + "concept_deltas": [ + "J2J counts jobs (person-employer pairs) in UI-covered non-federal employment; SIPP counts all jobs incl. self-employment per job-month held", + "J2J MSep is main-job separations; SIPP here counts every held job", + "the monthly equivalent 1-(1-q)^(1/3) treats a quarter as three independent monthly draws \u2014 an approximation", + "persons leaving the SIPP sample are excluded from the denominator, not counted as separations", + "UNVERIFIED ASSUMPTION (job-ID linkage): the 9.45% Dec->Jan seam rate assumes SIPP EJB job ids are longitudinally consistent across the pu2022->pu2023 file boundary; if ids are reassigned at wave boundaries, spurious separations inflate the seam rate, so part of the seam-vs-within-wave contrast could be a linkage artifact rather than seam recall bias. This must be checked before C3 rules on it." + ], + "proposed_ruling_note": "NOT RATIFIED: as the plan proposed ex ante, J2J is truth for rate LEVELS and SIPP for persistence STRUCTURE; phase-1 hazards estimated seam-aware (wave-frequency with within-wave interpolation). Ratification belongs to the C3 referee round." +} diff --git a/runs/sipp_e8_e9_floors_v1.env.json b/runs/sipp_e8_e9_floors_v1.env.json new file mode 100644 index 00000000..e719e6e4 --- /dev/null +++ b/runs/sipp_e8_e9_floors_v1.env.json @@ -0,0 +1,16 @@ +{ + "artifact": "sipp_e8_e9_floors_v1.json", + "status": "MEASUREMENT_ENVIRONMENT", + "environment": { + "python": "3.10.13", + "numpy": "2.1.3", + "pandas": "2.3.3", + "sklearn": "1.5.2", + "scipy": "1.13.1", + "platform": "macOS-26.5.2-arm64-arm-64bit", + "fitting_stack": { + "populace_fit": "absent", + "populace_frame": "absent" + } + } +} diff --git a/runs/sipp_e8_e9_floors_v1.inputs.json b/runs/sipp_e8_e9_floors_v1.inputs.json new file mode 100644 index 00000000..76ea1e22 --- /dev/null +++ b/runs/sipp_e8_e9_floors_v1.inputs.json @@ -0,0 +1,16 @@ +{ + "artifact": "sipp_e8_e9_floors_v1.json", + "status": "SOURCE_INPUT_DIGESTS", + "official_source": { + "url": "https://www2.census.gov/programs-surveys/sipp/data/datasets/2023/pu2023_csv.zip", + "archive_sha256": "9c5363d56aca2041db20d46d17b81e9be931eb5b18bd5f5238b367d2dd7fb74b", + "archive_bytes": 109036604, + "archive_member": "pu2023.csv" + }, + "staged_input": { + "path": "pu2023.csv.gz", + "sha256": "1e49df7e013970ea60443e4e15ded3e8fda07643038471bf6b3429a7383fbf69", + "bytes": 109032744, + "transport_note": "gzip -n recompression of the sole CSV member from the verified official Census ZIP" + } +} diff --git a/runs/sipp_e8_e9_floors_v1.json b/runs/sipp_e8_e9_floors_v1.json new file mode 100644 index 00000000..13be3c5e --- /dev/null +++ b/runs/sipp_e8_e9_floors_v1.json @@ -0,0 +1,152 @@ +{ + "artifact": "sipp_e8_e9_floors", + "version": "v1", + "status": "PRE-LOCK REFERENCE - NOT RATIFIED; IC3 not locked; no thresholds. v1 is a pinning event, not a ratification", + "issue": "192", + "deployment_scale_note": "RECORDED GAP (review of #212): these floors are half-vs-half, i.e. the sampling noise of ~50%-of-source estimates, while IC3 proposes scoring on a 0.20 person holdout - there is no candidate-context floor (gate-1 ctx20 analog). Under root-n scaling, a 20% scoring frame has ~sqrt(0.5/0.2)=1.58x the sampling noise of the half-split basis, so these floors are mildly ANTI-conservative (too tight), not conservative. RECORDED_NOT_SATISFIED: IC3 must accept a registered analytic scale adjustment or require matching-context floors before candidate runs.", + "source": "pu2023 (reference year 2022), persons observed all 12 reference months (censoring-free draft restriction, recorded; ESTIMAND NOTE per review: candidate runs scored against these cells must apply the identical full-year-persons restriction)", + "method": "person-disjoint sha256 half-splits, seeds 0-19 (raised from 5 per review: E8 cells where floor sd exceeds the mean need a stable across-seed sd); rates floored on |log rate ratio|, earnings-change medians/IQRs on absolute gaps in log-points; weighted by WPFINWGT", + "seam_caveat": "identical to the E4/E5 floors: half-splits share SIPP's seam structure; #214 carries the seam measurement", + "stay_median_heaping_caveat": "within-job SIPP monthly earnings are mostly constant across a wave (dependent-interview reporting), so the stay-transition median log-change heaps at exactly 0 and its half-vs-half floor is degenerate (0.0) - the same failure class as the tenure quantile heaping; E9-stay thresholds should be stated on the IQR or a distributional distance, not the median", + "thin_flag_units": { + "e8_nonemployment_by_age": "rows per half, equal to persons (one row per person in the E8 frame) vs THIN_CELL_PERSONS=200", + "e9_transitions.earnings_change": "distinct persons per half (person_id.nunique(); rows are consecutive-month transition pairs and a person can contribute up to 11) vs THIN_CELL_PERSONS=200" + }, + "sipp_jobs_reader_commit": "a059193e4fad80ceb1c2e1f4177aa5c69abb1048", + "source_input": { + "path": "pu2023.csv.gz", + "sha256": "1e49df7e013970ea60443e4e15ded3e8fda07643038471bf6b3429a7383fbf69" + }, + "e8_nonemployment_by_age": { + "16_24": { + "any_nonemp_share": 0.4145, + "long_nonemp_share": 0.3422, + "persons_unweighted": 1781, + "any_nonemp": { + "floor_abs_log_ratio_mean": 0.05149, + "floor_abs_log_ratio_sd": 0.0356, + "thin": false + }, + "long_nonemp": { + "floor_abs_log_ratio_mean": 0.08586, + "floor_abs_log_ratio_sd": 0.04431, + "thin": false + } + }, + "25_34": { + "any_nonemp_share": 0.1401, + "long_nonemp_share": 0.0973, + "persons_unweighted": 3240, + "any_nonemp": { + "floor_abs_log_ratio_mean": 0.05885, + "floor_abs_log_ratio_sd": 0.04819, + "thin": false + }, + "long_nonemp": { + "floor_abs_log_ratio_mean": 0.10659, + "floor_abs_log_ratio_sd": 0.06993, + "thin": false + } + }, + "35_44": { + "any_nonemp_share": 0.1017, + "long_nonemp_share": 0.0663, + "persons_unweighted": 3543, + "any_nonemp": { + "floor_abs_log_ratio_mean": 0.09917, + "floor_abs_log_ratio_sd": 0.07372, + "thin": false + }, + "long_nonemp": { + "floor_abs_log_ratio_mean": 0.13369, + "floor_abs_log_ratio_sd": 0.0899, + "thin": false + } + }, + "45_54": { + "any_nonemp_share": 0.0852, + "long_nonemp_share": 0.0555, + "persons_unweighted": 3241, + "any_nonemp": { + "floor_abs_log_ratio_mean": 0.10871, + "floor_abs_log_ratio_sd": 0.078, + "thin": false + }, + "long_nonemp": { + "floor_abs_log_ratio_mean": 0.09797, + "floor_abs_log_ratio_sd": 0.07416, + "thin": false + } + }, + "55_64": { + "any_nonemp_share": 0.1045, + "long_nonemp_share": 0.083, + "persons_unweighted": 3449, + "any_nonemp": { + "floor_abs_log_ratio_mean": 0.09033, + "floor_abs_log_ratio_sd": 0.05384, + "thin": false + }, + "long_nonemp": { + "floor_abs_log_ratio_mean": 0.11965, + "floor_abs_log_ratio_sd": 0.05523, + "thin": false + } + }, + "65_99": { + "any_nonemp_share": 0.1887, + "long_nonemp_share": 0.1546, + "persons_unweighted": 2286, + "any_nonemp": { + "floor_abs_log_ratio_mean": 0.05524, + "floor_abs_log_ratio_sd": 0.04697, + "thin": false + }, + "long_nonemp": { + "floor_abs_log_ratio_mean": 0.08085, + "floor_abs_log_ratio_sd": 0.04997, + "thin": false + } + } + }, + "e9_transitions": { + "transition_rates": { + "entry": 0.0101, + "exit": 0.0094, + "j2j": 0.0035, + "stay": 0.977 + }, + "earnings_change": { + "stay": { + "median_log_change": 0.0, + "iqr_log_change": 0.0656, + "pairs_unweighted": 163552, + "persons_unweighted": 16286, + "floor_abs_median_gap": { + "mean": 0.0, + "sd": 0.0 + }, + "floor_abs_iqr_gap": { + "mean": 0.0, + "sd": 0.0 + }, + "thin": false + }, + "j2j": { + "median_log_change": 0.2264, + "iqr_log_change": 1.069, + "pairs_unweighted": 545, + "persons_unweighted": 524, + "floor_abs_median_gap": { + "mean": 0.06659, + "sd": 0.05025 + }, + "floor_abs_iqr_gap": { + "mean": 0.12848, + "sd": 0.07392 + }, + "thin": false + } + } + } +} diff --git a/runs/sipp_spell_floors_v1.env.json b/runs/sipp_spell_floors_v1.env.json new file mode 100644 index 00000000..56cc7cb9 --- /dev/null +++ b/runs/sipp_spell_floors_v1.env.json @@ -0,0 +1,16 @@ +{ + "artifact": "sipp_spell_floors_v1.json", + "status": "MEASUREMENT_ENVIRONMENT", + "environment": { + "python": "3.10.13", + "numpy": "2.1.3", + "pandas": "2.3.3", + "sklearn": "1.5.2", + "scipy": "1.13.1", + "platform": "macOS-26.5.2-arm64-arm-64bit", + "fitting_stack": { + "populace_fit": "absent", + "populace_frame": "absent" + } + } +} diff --git a/runs/sipp_spell_floors_v1.inputs.json b/runs/sipp_spell_floors_v1.inputs.json new file mode 100644 index 00000000..6a3b2766 --- /dev/null +++ b/runs/sipp_spell_floors_v1.inputs.json @@ -0,0 +1,16 @@ +{ + "artifact": "sipp_spell_floors_v1.json", + "status": "SOURCE_INPUT_DIGESTS", + "official_source": { + "url": "https://www2.census.gov/programs-surveys/sipp/data/datasets/2023/pu2023_csv.zip", + "archive_sha256": "9c5363d56aca2041db20d46d17b81e9be931eb5b18bd5f5238b367d2dd7fb74b", + "archive_bytes": 109036604, + "archive_member": "pu2023.csv" + }, + "staged_input": { + "path": "pu2023.csv.gz", + "sha256": "1e49df7e013970ea60443e4e15ded3e8fda07643038471bf6b3429a7383fbf69", + "bytes": 109032744, + "transport_note": "gzip -n recompression of the sole CSV member from the verified official Census ZIP" + } +} diff --git a/runs/sipp_spell_floors_v1.json b/runs/sipp_spell_floors_v1.json new file mode 100644 index 00000000..c7e64b6e --- /dev/null +++ b/runs/sipp_spell_floors_v1.json @@ -0,0 +1,149 @@ +{ + "artifact": "sipp_spell_floors", + "version": "v1", + "status": "PRE-LOCK REFERENCE - NOT RATIFIED; IC3 not locked; no thresholds. v1 is a pinning event, not a ratification", + "issue": "192", + "deployment_scale_note": "RECORDED GAP (review of #212): these floors are half-vs-half, i.e. the sampling noise of ~50%-of-source estimates, while IC3 proposes scoring on a 0.20 person holdout - there is no candidate-context floor (gate-1 ctx20 analog). Under root-n scaling, a 20% scoring frame has ~sqrt(0.5/0.2)=1.58x the sampling noise of the half-split basis, so these floors are mildly ANTI-conservative (too tight), not conservative. RECORDED_NOT_SATISFIED: IC3 must accept a registered analytic scale adjustment or require matching-context floors before candidate runs.", + "source": "pu2023 (reference year 2022)", + "method": "person-disjoint sha256 half-splits, seeds 0-4; per-cell |log(rate_a/rate_b)| mean/sd across seeds; weighted by WPFINWGT", + "seam_caveat": "both halves share SIPP seam structure; the seam-vs-J2J reconciliation run is a separate required artifact before IC3 thresholds lock", + "thin_flag_units": { + "e4_retention_by_age_sex": "distinct persons per half (person_id.nunique(); rows are person-month retention pairs) vs THIN_CELL_PERSONS=200", + "e5_runs_by_age": "rows per half, equal to persons (one row per person in the run-length frame) vs THIN_CELL_PERSONS=200" + }, + "sipp_jobs_reader_commit": "a059193e4fad80ceb1c2e1f4177aa5c69abb1048", + "source_input": { + "path": "pu2023.csv.gz", + "sha256": "1e49df7e013970ea60443e4e15ded3e8fda07643038471bf6b3429a7383fbf69" + }, + "e4_retention_by_age_sex": { + "16_24|sex1": { + "rate": 0.9897, + "pairs_unweighted": 8055, + "floor_abs_log_ratio_mean": 0.00182, + "floor_abs_log_ratio_sd": 0.00107, + "thin": false + }, + "16_24|sex2": { + "rate": 0.9901, + "pairs_unweighted": 7093, + "floor_abs_log_ratio_mean": 0.00198, + "floor_abs_log_ratio_sd": 0.00232, + "thin": false + }, + "25_34|sex1": { + "rate": 0.9948, + "pairs_unweighted": 17797, + "floor_abs_log_ratio_mean": 0.0008, + "floor_abs_log_ratio_sd": 0.00036, + "thin": false + }, + "25_34|sex2": { + "rate": 0.9953, + "pairs_unweighted": 15555, + "floor_abs_log_ratio_mean": 0.00143, + "floor_abs_log_ratio_sd": 0.00114, + "thin": false + }, + "35_44|sex1": { + "rate": 0.9968, + "pairs_unweighted": 19920, + "floor_abs_log_ratio_mean": 0.00097, + "floor_abs_log_ratio_sd": 0.00058, + "thin": false + }, + "35_44|sex2": { + "rate": 0.9964, + "pairs_unweighted": 17203, + "floor_abs_log_ratio_mean": 0.00089, + "floor_abs_log_ratio_sd": 0.00065, + "thin": false + }, + "45_54|sex1": { + "rate": 0.9978, + "pairs_unweighted": 17779, + "floor_abs_log_ratio_mean": 0.0003, + "floor_abs_log_ratio_sd": 0.00028, + "thin": false + }, + "45_54|sex2": { + "rate": 0.998, + "pairs_unweighted": 16516, + "floor_abs_log_ratio_mean": 0.00051, + "floor_abs_log_ratio_sd": 0.00045, + "thin": false + }, + "55_64|sex1": { + "rate": 0.9984, + "pairs_unweighted": 18342, + "floor_abs_log_ratio_mean": 0.00067, + "floor_abs_log_ratio_sd": 0.00058, + "thin": false + }, + "55_64|sex2": { + "rate": 0.999, + "pairs_unweighted": 17410, + "floor_abs_log_ratio_mean": 0.0003, + "floor_abs_log_ratio_sd": 0.00014, + "thin": false + }, + "65_99|sex1": { + "rate": 0.9992, + "pairs_unweighted": 12113, + "floor_abs_log_ratio_mean": 0.00058, + "floor_abs_log_ratio_sd": 0.00039, + "thin": false + }, + "65_99|sex2": { + "rate": 0.9996, + "pairs_unweighted": 10437, + "floor_abs_log_ratio_mean": 0.00039, + "floor_abs_log_ratio_sd": 0.00032, + "thin": false + } + }, + "e5_runs_by_age": { + "16_24": { + "full_year_run_share": 0.4669, + "persons_unweighted": 1830, + "floor_abs_log_ratio_mean": 0.04937, + "floor_abs_log_ratio_sd": 0.04904, + "thin": false + }, + "25_34": { + "full_year_run_share": 0.7499, + "persons_unweighted": 3299, + "floor_abs_log_ratio_mean": 0.01944, + "floor_abs_log_ratio_sd": 0.01104, + "thin": false + }, + "35_44": { + "full_year_run_share": 0.8245, + "persons_unweighted": 3555, + "floor_abs_log_ratio_mean": 0.01764, + "floor_abs_log_ratio_sd": 0.01639, + "thin": false + }, + "45_54": { + "full_year_run_share": 0.8671, + "persons_unweighted": 3256, + "floor_abs_log_ratio_mean": 0.01096, + "floor_abs_log_ratio_sd": 0.00768, + "thin": false + }, + "55_64": { + "full_year_run_share": 0.8673, + "persons_unweighted": 3458, + "floor_abs_log_ratio_mean": 0.01742, + "floor_abs_log_ratio_sd": 0.00998, + "thin": false + }, + "65_99": { + "full_year_run_share": 0.7941, + "persons_unweighted": 2294, + "floor_abs_log_ratio_mean": 0.01327, + "floor_abs_log_ratio_sd": 0.01036, + "thin": false + } + } +} diff --git a/runs/tenure_floors_v1.env.json b/runs/tenure_floors_v1.env.json new file mode 100644 index 00000000..20d95d11 --- /dev/null +++ b/runs/tenure_floors_v1.env.json @@ -0,0 +1,16 @@ +{ + "artifact": "tenure_floors_v1.json", + "status": "MEASUREMENT_ENVIRONMENT", + "environment": { + "python": "3.10.13", + "numpy": "2.1.3", + "pandas": "2.3.3", + "sklearn": "1.5.2", + "scipy": "1.13.1", + "platform": "macOS-26.5.2-arm64-arm-64bit", + "fitting_stack": { + "populace_fit": "absent", + "populace_frame": "absent" + } + } +} diff --git a/runs/tenure_floors_v1.inputs.json b/runs/tenure_floors_v1.inputs.json new file mode 100644 index 00000000..f3a22c2d --- /dev/null +++ b/runs/tenure_floors_v1.inputs.json @@ -0,0 +1,27 @@ +{ + "artifact": "tenure_floors_v1.json", + "status": "SOURCE_INPUT_DIGESTS", + "source_inputs": [ + { + "year": "2020", + "path": "jan20pub.csv", + "sha256": "ab0383891ed4e953128e55692d03c7731c2963de7356abf83d872b1a3fcf5af5", + "bytes": 187155717, + "official_url": "https://www2.census.gov/programs-surveys/cps/datasets/2020/supp/jan20pub.csv" + }, + { + "year": "2022", + "path": "jan22pub.csv", + "sha256": "f09bd072084b00dc10f8336cf8ee3f35e6673a4d5827155183f33923ccce96c8", + "bytes": 172630423, + "official_url": "https://www2.census.gov/programs-surveys/cps/datasets/2022/supp/jan22pub.csv" + }, + { + "year": "2024", + "path": "jan24pub.csv", + "sha256": "ae0141ebe5f8255421e7e6c7cd1179caaf84e60a4297a58d8deddde32895771d", + "bytes": 171536589, + "official_url": "https://www2.census.gov/programs-surveys/cps/datasets/2024/supp/jan24pub.csv" + } + ] +} diff --git a/runs/tenure_floors_v1.json b/runs/tenure_floors_v1.json new file mode 100644 index 00000000..81acf47e --- /dev/null +++ b/runs/tenure_floors_v1.json @@ -0,0 +1,562 @@ +{ + "artifact": "tenure_floors", + "version": "v1", + "status": "PRE-LOCK REFERENCE - NOT RATIFIED; IC3 not locked; no thresholds. v1 is a pinning event, not a ratification", + "issue": "192", + "deployment_scale_note": "RECORDED GAP (review of #212): these floors are half-vs-half, i.e. the sampling noise of ~50%-of-source estimates, while IC3 proposes scoring on a 0.20 person holdout - there is no candidate-context floor (gate-1 ctx20 analog). Under root-n scaling, a 20% scoring frame has ~sqrt(0.5/0.2)=1.58x the sampling noise of the half-split basis, so these floors are mildly ANTI-conservative (too tight), not conservative. RECORDED_NOT_SATISFIED: IC3 must accept a registered analytic scale adjustment or require matching-context floors before candidate runs.", + "source": "CPS January supplements 2020/2022/2024 (PTST1TN, PWTENWGT); reader per #205", + "method": "person-disjoint sha256 half-splits, seeds 0-4; per-cell absolute weighted-quantile gap in years AND weighted-ECDF max gap (heaping-robust), mean/sd across seeds; BLS age bands", + "heaping_caveat": "reported tenure heaps on integers, so half-vs-half quantile gaps are frequently exactly zero (36/63 cells in the first build) - a degenerate threshold basis; the ECDF max-gap floor is the heaping-robust alternative for the IC3 round to choose between", + "thin_flag_units": "rows per half, equal to persons (one CPS record per person) vs THIN_CELL_PERSONS=200", + "cps_tenure_reader_commit": "5c9e5e67884bfe52d8d6c35ba6fdde40f52d5d62", + "source_inputs": [ + { + "year": "2020", + "path": "jan20pub.csv", + "sha256": "ab0383891ed4e953128e55692d03c7731c2963de7356abf83d872b1a3fcf5af5" + }, + { + "year": "2022", + "path": "jan22pub.csv", + "sha256": "f09bd072084b00dc10f8336cf8ee3f35e6673a4d5827155183f33923ccce96c8" + }, + { + "year": "2024", + "path": "jan24pub.csv", + "sha256": "ae0141ebe5f8255421e7e6c7cd1179caaf84e60a4297a58d8deddde32895771d" + } + ], + "by_year": { + "2020": { + "16_19": { + "p25": 0.33, + "p50": 0.58, + "p75": 1.08, + "persons_unweighted": 1345, + "floor_abs_gap_years": { + "p25": { + "mean": 0.015, + "sd": 0.03 + }, + "p50": { + "mean": 0.06, + "sd": 0.038 + }, + "p75": { + "mean": 0.091, + "sd": 0.042 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.0383, + "sd": 0.0083 + }, + "thin": false + }, + "20_24": { + "p25": 0.5, + "p50": 1.0, + "p75": 2.5, + "persons_unweighted": 3443, + "floor_abs_gap_years": { + "p25": { + "mean": 0.0, + "sd": 0.0 + }, + "p50": { + "mean": 0.033, + "sd": 0.038 + }, + "p75": { + "mean": 0.143, + "sd": 0.081 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.0276, + "sd": 0.0059 + }, + "thin": false + }, + "25_34": { + "p25": 1.0, + "p50": 3.0, + "p75": 5.0, + "persons_unweighted": 9659, + "floor_abs_gap_years": { + "p25": { + "mean": 0.0, + "sd": 0.0 + }, + "p50": { + "mean": 0.0, + "sd": 0.0 + }, + "p75": { + "mean": 0.0, + "sd": 0.0 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.018, + "sd": 0.0059 + }, + "thin": false + }, + "35_44": { + "p25": 2.0, + "p50": 5.0, + "p75": 10.0, + "persons_unweighted": 9915, + "floor_abs_gap_years": { + "p25": { + "mean": 0.016, + "sd": 0.032 + }, + "p50": { + "mean": 0.0, + "sd": 0.0 + }, + "p75": { + "mean": 0.0, + "sd": 0.0 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.015, + "sd": 0.002 + }, + "thin": false + }, + "45_54": { + "p25": 3.0, + "p50": 8.0, + "p75": 16.0, + "persons_unweighted": 9624, + "floor_abs_gap_years": { + "p25": { + "mean": 0.0, + "sd": 0.0 + }, + "p50": { + "mean": 0.0, + "sd": 0.0 + }, + "p75": { + "mean": 0.0, + "sd": 0.0 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.0129, + "sd": 0.0049 + }, + "thin": false + }, + "55_64": { + "p25": 4.0, + "p50": 10.0, + "p75": 21.0, + "persons_unweighted": 8858, + "floor_abs_gap_years": { + "p25": { + "mean": 0.0, + "sd": 0.0 + }, + "p50": { + "mean": 0.0, + "sd": 0.0 + }, + "p75": { + "mean": 0.2, + "sd": 0.4 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.0187, + "sd": 0.0048 + }, + "thin": false + }, + "65_200": { + "p25": 5.0, + "p50": 13.0, + "p75": 25.0, + "persons_unweighted": 3719, + "floor_abs_gap_years": { + "p25": { + "mean": 0.0, + "sd": 0.0 + }, + "p50": { + "mean": 1.2, + "sd": 0.98 + }, + "p75": { + "mean": 1.0, + "sd": 0.894 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.0297, + "sd": 0.0075 + }, + "thin": false + } + }, + "2022": { + "16_19": { + "p25": 0.33, + "p50": 0.5, + "p75": 1.0, + "persons_unweighted": 1218, + "floor_abs_gap_years": { + "p25": { + "mean": 0.059, + "sd": 0.031 + }, + "p50": { + "mean": 0.0, + "sd": 0.0 + }, + "p75": { + "mean": 0.0, + "sd": 0.0 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.0429, + "sd": 0.0106 + }, + "thin": false + }, + "20_24": { + "p25": 0.5, + "p50": 1.0, + "p75": 2.17, + "persons_unweighted": 2825, + "floor_abs_gap_years": { + "p25": { + "mean": 0.032, + "sd": 0.039 + }, + "p50": { + "mean": 0.0, + "sd": 0.0 + }, + "p75": { + "mean": 0.218, + "sd": 0.108 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.0292, + "sd": 0.0096 + }, + "thin": false + }, + "25_34": { + "p25": 0.92, + "p50": 3.0, + "p75": 5.0, + "persons_unweighted": 8239, + "floor_abs_gap_years": { + "p25": { + "mean": 0.033, + "sd": 0.065 + }, + "p50": { + "mean": 0.0, + "sd": 0.0 + }, + "p75": { + "mean": 0.0, + "sd": 0.0 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.014, + "sd": 0.0037 + }, + "thin": false + }, + "35_44": { + "p25": 2.0, + "p50": 5.0, + "p75": 10.0, + "persons_unweighted": 8630, + "floor_abs_gap_years": { + "p25": { + "mean": 0.0, + "sd": 0.0 + }, + "p50": { + "mean": 0.0, + "sd": 0.0 + }, + "p75": { + "mean": 0.0, + "sd": 0.0 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.0181, + "sd": 0.0069 + }, + "thin": false + }, + "45_54": { + "p25": 3.0, + "p50": 7.0, + "p75": 16.0, + "persons_unweighted": 7907, + "floor_abs_gap_years": { + "p25": { + "mean": 0.0, + "sd": 0.0 + }, + "p50": { + "mean": 0.0, + "sd": 0.0 + }, + "p75": { + "mean": 1.0, + "sd": 0.0 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.0248, + "sd": 0.0066 + }, + "thin": false + }, + "55_64": { + "p25": 4.0, + "p50": 10.0, + "p75": 21.0, + "persons_unweighted": 7138, + "floor_abs_gap_years": { + "p25": { + "mean": 0.0, + "sd": 0.0 + }, + "p50": { + "mean": 0.0, + "sd": 0.0 + }, + "p75": { + "mean": 1.0, + "sd": 0.0 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.0253, + "sd": 0.0052 + }, + "thin": false + }, + "65_200": { + "p25": 5.0, + "p50": 12.0, + "p75": 25.0, + "persons_unweighted": 3153, + "floor_abs_gap_years": { + "p25": { + "mean": 0.209, + "sd": 0.396 + }, + "p50": { + "mean": 0.4, + "sd": 0.49 + }, + "p75": { + "mean": 0.0, + "sd": 0.0 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.0268, + "sd": 0.0081 + }, + "thin": false + } + }, + "2024": { + "16_19": { + "p25": 0.33, + "p50": 0.67, + "p75": 1.5, + "persons_unweighted": 1223, + "floor_abs_gap_years": { + "p25": { + "mean": 0.016, + "sd": 0.032 + }, + "p50": { + "mean": 0.036, + "sd": 0.044 + }, + "p75": { + "mean": 0.282, + "sd": 0.039 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.0564, + "sd": 0.0175 + }, + "thin": false + }, + "20_24": { + "p25": 0.5, + "p50": 1.17, + "p75": 2.92, + "persons_unweighted": 2999, + "floor_abs_gap_years": { + "p25": { + "mean": 0.0, + "sd": 0.0 + }, + "p50": { + "mean": 0.066, + "sd": 0.063 + }, + "p75": { + "mean": 0.405, + "sd": 0.19 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.027, + "sd": 0.0045 + }, + "thin": false + }, + "25_34": { + "p25": 1.0, + "p50": 3.0, + "p75": 5.0, + "persons_unweighted": 8250, + "floor_abs_gap_years": { + "p25": { + "mean": 0.0, + "sd": 0.0 + }, + "p50": { + "mean": 0.0, + "sd": 0.0 + }, + "p75": { + "mean": 0.0, + "sd": 0.0 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.0184, + "sd": 0.0051 + }, + "thin": false + }, + "35_44": { + "p25": 2.0, + "p50": 5.0, + "p75": 10.0, + "persons_unweighted": 8932, + "floor_abs_gap_years": { + "p25": { + "mean": 0.0, + "sd": 0.0 + }, + "p50": { + "mean": 0.0, + "sd": 0.0 + }, + "p75": { + "mean": 0.0, + "sd": 0.0 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.0148, + "sd": 0.0035 + }, + "thin": false + }, + "45_54": { + "p25": 3.0, + "p50": 7.0, + "p75": 15.0, + "persons_unweighted": 7935, + "floor_abs_gap_years": { + "p25": { + "mean": 0.0, + "sd": 0.0 + }, + "p50": { + "mean": 0.0, + "sd": 0.0 + }, + "p75": { + "mean": 0.536, + "sd": 0.453 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.0151, + "sd": 0.003 + }, + "thin": false + }, + "55_64": { + "p25": 4.0, + "p50": 10.0, + "p75": 20.0, + "persons_unweighted": 7012, + "floor_abs_gap_years": { + "p25": { + "mean": 0.0, + "sd": 0.0 + }, + "p50": { + "mean": 0.0, + "sd": 0.0 + }, + "p75": { + "mean": 0.2, + "sd": 0.4 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.022, + "sd": 0.0031 + }, + "thin": false + }, + "65_200": { + "p25": 4.0, + "p50": 12.0, + "p75": 24.0, + "persons_unweighted": 3332, + "floor_abs_gap_years": { + "p25": { + "mean": 0.8, + "sd": 0.4 + }, + "p50": { + "mean": 1.2, + "sd": 1.166 + }, + "p75": { + "mean": 2.0, + "sd": 0.0 + } + }, + "floor_ecdf_max_gap": { + "mean": 0.0392, + "sd": 0.0087 + }, + "thin": false + } + } + } +} diff --git a/scripts/build_crosswave_jobid_check.py b/scripts/build_crosswave_jobid_check.py new file mode 100644 index 00000000..b1e3b16d --- /dev/null +++ b/scripts/build_crosswave_jobid_check.py @@ -0,0 +1,478 @@ +"""Build the cross-wave job-ID consistency check (C3 §6 pre-lock). + +REQUIRED PRE-LOCK ARTIFACT for the seam ruling (#230 §6; ADR 0004 +referee item 7; #214's concept-delta 5, previously an UNVERIFIED +ASSUMPTION). Question: are SIPP ``EJB`` job IDs longitudinally +consistent across the pu2022 -> pu2023 file boundary, or partly +reassigned — in which case part of the measured 9.45% Dec->Jan seam +separation rate would be a linkage artifact rather than seam-bunched +real separations? + +Design — three bounds, none assuming what they test: + +(a) **Gross consistency**: the share of December-held jobs whose ID + survives into January at all. Wholesale per-wave reassignment + would put this near zero; the #214 artifact already implies + ~90.6%, so gross reassignment is bounded by the seam rate + itself. + +(b) **The re-key signature**: among Dec->Jan *separations* (no + common ID), the share where the person holds a January job that + matches the vanished December job on industry code AND class of + worker AND monthly earnings within 20% (|log ratio| < 0.1823) — + the profile of the same employer continuing under a new ID. + Genuine job-to-job moves can also match by coincidence, so the + identical signature is computed for *within-wave* separations + (pooled month-pairs inside each file), whose IDs are known-good + under dependent interviewing. The EXCESS of the seam signature + over the within-wave baseline is the upper bound on the ID + artifact among employed-next-month separators. + +(c) **The structural bound**: seam separations decompose into exits + to nonemployment (no January job exists, so no new ID could + have been issued — these CANNOT be ID artifacts) versus + separations-to-employment. Only the latter can hide re-keying, + so the E->E share caps the artifact regardless of (b). + +Verdict rule (author-proposed, UNRATIFIED — see the artifact's +status field): under 15% implied ID-artifact share PASSES; 15-30% +carries a correction band; above 30% the #214 ruling returns to the +referee. Two scoring populations are reported (E->E-only and +all-separations) and the operative one is a referee item, as is the +bar itself. This artifact is a DISCLOSED RE-ANALYSIS, not a +pre-registration: the first committed estimator had a population +defect (documented in the status field) and the corrected estimator +re-ran after a verdict had been observed. + +Usage:: + + python scripts/build_crosswave_jobid_check.py + +writes ``runs/crosswave_jobid_check_draft_v0.json``. +""" + +from __future__ import annotations + +import json +import sys +from pathlib import Path + +import numpy as np +import pandas as pd + +REPO = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(REPO / "src")) + +from populace_dynamics.data import sipp_jobs # noqa: E402 + +FILE_YEARS = (2022, 2023) +EARN_LOG_TOL = abs(np.log(0.8)) # earnings within 20% +ARTIFACT = REPO / "runs/crosswave_jobid_check_draft_v0.json" + + +def person_month_presence(year: int) -> pd.DataFrame: + """All person-months in the file (employed or not).""" + import os + + data_dir = Path( + os.environ.get( + "POPULACE_DYNAMICS_SIPP_DIR", + str(Path("~/PolicyEngine/sipp-data").expanduser()), + ) + ).expanduser() + for suffix in (".csv", ".csv.gz"): + path = data_dir / f"pu{year}{suffix}" + if path.exists(): + break + else: + raise FileNotFoundError(f"pu{year}.csv[.gz] not staged") + raw = pd.read_csv( + path, + sep="|", + usecols=["SSUID", "PNUM", "MONTHCODE"], + dtype={"SSUID": "string"}, + ) + raw["person_id"] = raw["SSUID"].astype(str) + "-" + raw["PNUM"].astype(str) + return raw[["person_id", "MONTHCODE"]].rename( + columns={"MONTHCODE": "month"} + ) + + +def month_frame(job_months: pd.DataFrame) -> pd.DataFrame: + """Per person-month: job set plus per-job attribute map.""" + jm = job_months.copy() + jm["attrs"] = list( + zip( + jm["job_id"], + jm["industry"].astype(str), + jm["clwrk"], + jm["earnings"], + strict=True, + ) + ) + return ( + jm.groupby(["person_id", "month"]) + .agg(jobs=("job_id", frozenset), attrs=("attrs", list)) + .reset_index() + ) + + +def _rekey_match(lost, new_jobs, strict: bool = False) -> bool: + """Does any new job match a lost job's employer profile? + + Default (main) matching treats a missing field as compatible; + ``strict=True`` treats any missing industry/class/earnings on + either side as a mismatch (the sensitivity variant for the + NaN-matching caveat). + """ + _, ind, clwrk, earn = lost + for _, n_ind, n_clwrk, n_earn in new_jobs: + if n_ind != ind: + continue + if pd.isna(clwrk) or pd.isna(n_clwrk): + if strict: + continue + elif n_clwrk != clwrk: + continue + if pd.isna(earn) or pd.isna(n_earn) or not earn > 0 or not n_earn > 0: + if strict: + continue + elif abs(np.log(n_earn / earn)) > EARN_LOG_TOL: + continue + return True + return False + + +def separation_decomposition( + current: pd.DataFrame, + following: pd.DataFrame, + present_next: set, +) -> dict: + """Decompose separations between two adjacent person-months. + + ``present_next`` is the set of person_ids in the panel next + month (employed or not): a person present with no jobs is an + exit to nonemployment; a person absent left the sample and is + excluded from the denominator entirely. + """ + current = current[current["person_id"].isin(present_next)] + merged = current.merge( + following, + on="person_id", + suffixes=("", "_n"), + how="left", + ) + merged["jobs_n"] = merged["jobs_n"].apply( + lambda x: x if isinstance(x, frozenset) else frozenset() + ) + merged["attrs_n"] = merged["attrs_n"].apply( + lambda x: x if isinstance(x, list) else [] + ) + jobs_held = jobs_kept = 0 + lost_to_nonemp = lost_to_emp = lost_rekey_sig = 0 + lost_rekey_sig_strict = 0 + for row in merged.itertuples(index=False): + kept_ids = row.jobs & row.jobs_n + jobs_held += len(row.jobs) + jobs_kept += len(kept_ids) + new_jobs = [a for a in row.attrs_n if a[0] not in row.jobs] + for lost in row.attrs: + if lost[0] in kept_ids: + continue + if not row.jobs_n: + lost_to_nonemp += 1 + continue + lost_to_emp += 1 + if _rekey_match(lost, new_jobs): + lost_rekey_sig += 1 + if _rekey_match(lost, new_jobs, strict=True): + lost_rekey_sig_strict += 1 + separations = jobs_held - jobs_kept + return { + "jobs_held": jobs_held, + "separations": separations, + "sep_rate": round(separations / jobs_held, 4), + "to_nonemployment": lost_to_nonemp, + "to_employment": lost_to_emp, + "rekey_signature": lost_rekey_sig, + "rekey_signature_strict": lost_rekey_sig_strict, + "rekey_signature_share_of_seps": ( + round(lost_rekey_sig / separations, 4) if separations else None + ), + } + + +def _reader_commit() -> str: + import subprocess + + return ( + subprocess.run( + [ + "git", + "log", + "-1", + "--format=%H", + "--", + "src/populace_dynamics/data/sipp_jobs.py", + ], + capture_output=True, + text=True, + cwd=str(REPO), + ).stdout.strip() + or "unknown" + ) + + +def _input_pins() -> dict: + """sha256 + size of the staged pu files consumed.""" + import hashlib as _h + import os + + data_dir = Path( + os.environ.get( + "POPULACE_DYNAMICS_SIPP_DIR", + str(Path("~/PolicyEngine/sipp-data").expanduser()), + ) + ).expanduser() + pins = {} + for year in FILE_YEARS: + for suffix in (".csv", ".csv.gz"): + p = data_dir / f"pu{year}{suffix}" + if p.exists(): + digest = _h.sha256() + with open(p, "rb") as fh: + for chunk in iter(lambda: fh.read(1 << 22), b""): + digest.update(chunk) + pins[p.name] = { + "sha256": digest.hexdigest(), + "bytes": p.stat().st_size, + } + break + return pins + + +def build() -> dict: + frames = { + year: sipp_jobs.read_sipp_job_months(year) for year in FILE_YEARS + } + months = {year: month_frame(frames[year]) for year in FILE_YEARS} + presence = {year: person_month_presence(year) for year in FILE_YEARS} + + # Within-wave baseline: pooled adjacent month-pairs in each file. + within = { + "jobs_held": 0, + "separations": 0, + "to_nonemployment": 0, + "to_employment": 0, + "rekey_signature": 0, + "rekey_signature_strict": 0, + } + for year in FILE_YEARS: + mf = months[year] + pres = presence[year] + for month in range(1, 12): + cur = mf[mf["month"] == month] + nxt = mf[mf["month"] == month + 1].drop(columns="month") + present_next = set(pres[pres["month"] == month + 1]["person_id"]) + d = separation_decomposition(cur, nxt, present_next) + for key in within: + within[key] += d[key] + within["sep_rate"] = round(within["separations"] / within["jobs_held"], 4) + within["rekey_signature_share_of_seps"] = round( + within["rekey_signature"] / within["separations"], 4 + ) + + # Across-wave: Dec (pu2022, ref Dec 2021) -> Jan (pu2023). + dec = months[FILE_YEARS[0]] + dec = dec[dec["month"] == 12] + jan = months[FILE_YEARS[1]] + jan = jan[jan["month"] == 1].drop(columns="month") + present_jan = set( + presence[FILE_YEARS[1]][presence[FILE_YEARS[1]]["month"] == 1][ + "person_id" + ] + ) + seam = separation_decomposition(dec, jan, present_jan) + + # The bound: excess re-key signature at the seam over the + # within-wave baseline. Two defensible scoring populations exist + # and the verdict differs between them, so BOTH are reported and + # the operative choice is a referee item, not an author choice. + seam_ee_sig_share = ( + seam["rekey_signature"] / seam["to_employment"] + if seam["to_employment"] + else 0.0 + ) + within_ee_sig_share = ( + within["rekey_signature"] / within["to_employment"] + if within["to_employment"] + else 0.0 + ) + excess_sig_ee = max(0.0, seam_ee_sig_share - within_ee_sig_share) + ee_share_of_seps = seam["to_employment"] / seam["separations"] + share_ee_population = round(excess_sig_ee, 4) + share_all_separations = round(excess_sig_ee * ee_share_of_seps, 4) + ee_cap = round(ee_share_of_seps, 4) + + # Point-estimate uncertainty: binomial SEs on the two signature + # shares, propagated to the excess (independent samples), and a + # one-sided 95% upper bound per population. + import math + + se_seam = math.sqrt( + seam_ee_sig_share * (1 - seam_ee_sig_share) / seam["to_employment"] + ) + se_within = math.sqrt( + within_ee_sig_share + * (1 - within_ee_sig_share) + / within["to_employment"] + ) + se_excess = math.sqrt(se_seam**2 + se_within**2) + upper_ee = round(excess_sig_ee + 1.645 * se_excess, 4) + upper_all = round( + (excess_sig_ee + 1.645 * se_excess) * ee_share_of_seps, 4 + ) + + def band(x: float) -> str: + if x < 0.15: + return "PASS" + if x <= 0.30: + return "PASS_WITH_CORRECTION_BAND" + return "REFER_BACK" + + strict_seam = ( + seam["rekey_signature_strict"] / seam["to_employment"] + if seam["to_employment"] + else 0.0 + ) + strict_within = ( + within["rekey_signature_strict"] / within["to_employment"] + if within["to_employment"] + else 0.0 + ) + strict_excess = max(0.0, strict_seam - strict_within) + strict_variant = { + "note": ( + "missing industry/class/earnings treated as MISMATCH " + "(main variant treats missing as compatible)" + ), + "seam_signature_share": round(strict_seam, 4), + "within_signature_share": round(strict_within, 4), + "excess_ee_population": round(strict_excess, 4), + "excess_all_separations": round(strict_excess * ee_share_of_seps, 4), + } + + return { + "artifact": "crosswave_jobid_check", + "version": "draft_v1", + "status": ( + "DRAFT - pre-lock artifact for the #230 section-6 seam " + "ruling. DISCLOSED RE-ANALYSIS, not pre-registration: " + "the first committed estimator (inner-join population, " + "conditioned 6.06% seam rate) returned " + "PASS_WITH_CORRECTION_BAND; a population defect (exits " + "to nonemployment silently dropped, contradicting the " + "documented design) was found and fixed, and the " + "corrected estimator re-ran. Both runs are disclosed " + "here; the 15/30 bands are author-proposed and " + "UNRATIFIED (referee item), as is the operative scoring " + "population." + ), + "issue": "230", + "inputs": _input_pins(), + "sipp_jobs_reader_commit": _reader_commit(), + "question": ( + "are EJB job IDs longitudinally consistent across the " + "pu2022->pu2023 boundary, or is part of the 9.45% seam " + "separation rate a re-keying (linkage) artifact?" + ), + "within_wave_baseline": within, + "across_wave_seam": seam, + "rekey_signature_definition": ( + "a vanished job whose person holds a next-month job " + "matching it on industry code, class of worker, and " + "earnings within 20% (|log ratio| < 0.1823); computed " + "identically at the seam and within-wave. The excess is " + "computed on the E->E-CONDITIONAL baseline (signature " + "count / separations-to-employment on each side), then " + "optionally scaled by the seam E->E share for the " + "all-separations population — the per-all-seps " + "rekey_signature_share_of_seps fields are descriptive " + "only (referee note, #230 round 1 S3)" + ), + "bounds": { + "gross_id_survival_identity": { + "value": round(1 - seam["sep_rate"], 4), + "note": ( + "definitional identity (1 - seam sep rate), NOT " + "evidence — it would be unchanged if every seam " + "separation were a re-key; retained only as " + "context" + ), + }, + "excess_rekey_share_ee_population": share_ee_population, + "excess_rekey_share_all_separations": share_all_separations, + "one_sided_95_upper_ee_population": upper_ee, + "one_sided_95_upper_all_separations": upper_all, + "structural_ee_cap_share_of_seam_seps": ee_cap, + }, + "verdict_rule": ( + "author-proposed, UNRATIFIED (referee item): PASS if " + "excess re-key share < 15%; PASS_WITH_CORRECTION_BAND " + "if 15-30%; REFER_BACK if >30%. The operative scoring " + "population (E->E separations only, arguably the " + "conservative reading since re-keying is a " + "within-continuing-employment phenomenon, vs all seam " + "separations, since E->N separations cannot be ID " + "artifacts) is ALSO a referee item — the verdict " + "differs between them." + ), + "verdict_by_population": { + "ee_population": band(share_ee_population), + "all_separations": band(share_all_separations), + "operative": "REFEREE", + }, + "caveats": { + "composition_mismatch": ( + "the within-wave coincidence baseline has a " + "different separation mix (E->N share " + f"{within['to_nonemployment'] / within['separations']:.3f}" + " within-wave vs " + f"{seam['to_nonemployment'] / seam['separations']:.3f}" + " at the seam)" + ), + "nan_matching": ( + "the re-key signature treats missing " + "industry/class/earnings as matching (pd.notna " + "guards), biasing the signature upward where item " + "nonresponse differs across the boundary; the " + "strict variant below treats missing as mismatch" + ), + "seam_denominator": ( + "person presence at the seam is keyed on SSUID+PNUM " + "- the same cross-file linkage under test; a person " + "whose ID re-keyed would leave the denominator as a " + "sample leaver rather than appear as a separation, " + "so person-level re-keying is NOT bounded by this " + "artifact (jobs_held 10,828 at the seam vs ~17,500 " + "per within-wave pair reflects sample rotation plus " + "any such loss)" + ), + }, + "strict_nan_variant": strict_variant, + } + + +def main() -> None: + artifact = build() + ARTIFACT.write_text(json.dumps(artifact, indent=2) + "\n") + print(f"wrote {ARTIFACT}") + print("within-wave:", artifact["within_wave_baseline"]) + print("seam:", artifact["across_wave_seam"]) + print("bounds:", artifact["bounds"]) + print("strict variant:", artifact["strict_nan_variant"]) + print("VERDICT BY POPULATION:", artifact["verdict_by_population"]) + + +if __name__ == "__main__": + main() diff --git a/scripts/build_employer_firm_floors.py b/scripts/build_employer_firm_floors.py new file mode 100644 index 00000000..fdb724c1 --- /dev/null +++ b/scripts/build_employer_firm_floors.py @@ -0,0 +1,743 @@ +"""Build pre-lock aggregate-side noise floors for gates E1/E2/E6/E7/E11 +(workstream B, issue #192). + +REPORTED ANCHOR, NOT A GATE RUN: IC3 (the +employer gate block) has not locked, no thresholds are proposed here, +and nothing below is ratified. This is the firm-side counterpart to +the workstream-A floor battery (#212): it commits the floor-building +method for the aggregate-reference gates before any candidate model +exists (issue #192 protocol: floors -> thresholds -> referee round -> +one-shot runs). + +Unlike the survey-side floors, the references here are published +administrative aggregates, so person-disjoint half-splits are not +available. The floors are instead **temporal-stability floors**: + +* **QWI/J2J (E2/E6/E7/E11 proxies):** for every published firm-size x + sector cell, the year-over-year same-quarter absolute log ratio of + each rate/level, 2015Q1 on. Same-quarter comparison absorbs + seasonality (the extracts are not seasonally adjusted). The + variation deliberately **includes true business-cycle signal** — + most visibly the 2020-2021 pandemic years — so each floor is + reported both on all pairs and excluding pairs touching 2020/2021, + with both on the record rather than one adjusted away. +* **SUSB (E1):** the committed extract is a single 2022 cross-section + with no temporal replicate, so a same-source stability floor is + degenerate. E1 instead carries (a) the published SUSB noise flags + (G/H/J), converted to the flag-implied relative-sd upper bound per + cell, and (b) a BDS 2012-2022 year-over-year stability floor for + the national firm-size *margin* (BDS has no sector axis; the + sector-axis stability is not derivable from committed extracts — + recorded as a method finding, not patched). + +All band semantics come from +:mod:`populace_dynamics.firms.banding` — bands are never re-derived +here. Cells whose minimum denominator over the window is below +``THIN_JOBS`` (a draft choice, recorded) are flagged thin; national +cells are all thick in practice, and the flag is carried so the +state-level IC3 cells inherit the convention. + +Usage:: + + python scripts/build_employer_firm_floors.py + +writes ``runs/employer_firm_floors_v1.json``. +""" + +from __future__ import annotations + +import hashlib +import json +import math +import sys +from pathlib import Path + +import numpy as np +import pandas as pd + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src")) + +from populace_dynamics.firms import banding, targets # noqa: E402 + +ROOT = Path(__file__).resolve().parents[1] +ARTIFACT = ROOT / "runs/employer_firm_floors_v1.json" + +#: Committed extracts this build consumes. Their digests go into the +#: artifact, so "v1" pins what it was built FROM, not only its own +#: bytes: a silently re-fetched extract changes the floors, and a +#: reproduction test that reads the same changed file would still +#: pass. v1 is a pinning event, not a ratification -- the artifact +#: stays pre-lock with no thresholds until the IC3 amendment merges. +INPUT_EXTRACTS = ( + "susb_us_sector_size_2022.csv", + "bds_us_firm_size_1978_2022.csv", + "qwi_us_firmsize_sector_2015on.csv", + "j2j_us_firmsize_sector_2015on.csv", + "j2j_us_sexage_2015on.csv", + "j2jod_us_firmsize_od_2015on.csv", +) + + +def _input_digests() -> dict[str, str]: + """sha256 of every committed extract the floors are built from.""" + out = {} + for name in INPUT_EXTRACTS: + path = ROOT / "data" / "external" / name + out[name] = hashlib.sha256(path.read_bytes()).hexdigest() + return out + + +#: Pandemic years: YoY pairs touching these are reported separately +#: (never dropped from the full-sample figures). +PANDEMIC_YEARS = frozenset({2020, 2021}) + +#: Draft thin-cell threshold on the minimum cell denominator (jobs). +THIN_JOBS = 10_000 + +#: BDS stability window (recent decade ending at the extract's last +#: year); the full 1978-2022 series is in the committed extract if +#: the referee round prefers a different window. +BDS_WINDOW = (2012, 2022) + +#: SUSB employment noise flags -> published relative-sd upper bound. +#: G: CV < 2%; H: 2-5%; J: >= 5% (no upper bound published -> null). +SUSB_FLAG_CV_BOUND = {"G": 0.02, "H": 0.05, "J": None} +SUSB_FLAG_SEVERITY = {"G": 0, "H": 1, "J": 2} + +#: BDS fsize categories grouped to the coarsest partition that the +#: canonical bands can express without splitting a source category. +#: "20 to 99" straddles the canonical 50 edge (see banding) and is +#: carried as its own inexact group rather than allocated. +BDS_GROUPS: dict[str, tuple[str, ...]] = { + "1_9": ("a) 1 to 4", "b) 5 to 9"), + "10_19": ("c) 10 to 19",), + "20_99": ("d) 20 to 99",), + "100_499": ("e) 100 to 499",), + "500_plus": ( + "f) 500 to 999", + "g) 1000 to 2499", + "h) 2500 to 4999", + "i) 5000 to 9999", + "j) 10000+", + ), +} + + +def _round(x: float | None, nd: int = 5) -> float | None: + return None if x is None else round(float(x), nd) + + +def _span_record(span: banding.BandSpan) -> dict: + return { + "canonical_bands": [b.name for b in span.bands], + "exact": span.exact, + } + + +def _gap_summary(gaps: list[tuple[int, float]]) -> dict: + """Mean/sd of |log YoY ratio|, full and excluding pandemic pairs. + + ``gaps`` holds (later_year, gap); a pair touches the pandemic if + either the later year or the year before it is in PANDEMIC_YEARS. + """ + full = [g for _, g in gaps] + ex = [ + g + for y, g in gaps + if y not in PANDEMIC_YEARS and (y - 1) not in PANDEMIC_YEARS + ] + # ddof=1. n is 8-11 pairs here, where the population sd + # understates by ~5% -- and these sds feed a `mean + k * sd` + # threshold policy, so understating them biases thresholds tight + # (against the model) rather than harmlessly. It also matches the + # A-side batteries' across-seed sds, which the referee round will + # read alongside these. A single-pair cell has no dispersion and + # yields None rather than 0.0, which would read as a perfect + # floor (see the E11 detail window). + out = { + "floor_abs_log_ratio_mean": _round(np.mean(full)) if full else None, + "floor_abs_log_ratio_sd": ( + _round(np.std(full, ddof=1)) if len(full) > 1 else None + ), + "n_pairs": len(full), + "ex_pandemic_mean": _round(np.mean(ex)) if ex else None, + "ex_pandemic_sd": ( + _round(np.std(ex, ddof=1)) if len(ex) > 1 else None + ), + "n_pairs_ex_pandemic": len(ex), + } + return out + + +def _yoy_gaps(cell: pd.DataFrame, col: str) -> list[tuple[int, float]]: + """Same-quarter year-over-year |log ratio| pairs for one cell.""" + s = cell.set_index(["year", "quarter"])[col] + gaps = [] + for (year, quarter), value in s.items(): + prev = s.get((year - 1, quarter)) + if prev is None or pd.isna(prev) or pd.isna(value): + continue + if prev <= 0 or value <= 0: + continue + gaps.append((int(year), abs(math.log(value / prev)))) + return gaps + + +def _lehd_cell_block( + frame: pd.DataFrame, + rate_cols: dict[str, str], + denom_col: str, +) -> tuple[dict, dict]: + """Per-firm-size detail at the all-industry margin + a cross-cell + summary over every sector x firm-size cell. + + ``rate_cols`` maps output name -> frame column. + """ + detail: dict = {} + margin = frame[frame["industry"] == "00"] + for code, cell in margin.groupby("firmsize"): + label = cell["firmsize_label"].iloc[0] + span = banding.lehd_firmsize_to_canonical(int(code)) + min_denom = int(cell[denom_col].min()) + rec: dict = { + "firmsize_label": label, + **_span_record(span), + "min_denominator_jobs": min_denom, + "thin": min_denom < THIN_JOBS, + } + for name, col in rate_cols.items(): + rec[name] = { + "level_mean": _round(cell[col].mean()), + **_gap_summary(_yoy_gaps(cell, col)), + } + detail[f"firmsize{int(code)}"] = rec + + sector_cells = frame[frame["industry"] != "00"] + summary: dict = { + "n_cells": int(sector_cells.groupby(["industry", "firmsize"]).ngroups), + } + for name, col in rate_cols.items(): + means = [] + n_thin = 0 + for _, cell in sector_cells.groupby(["industry", "firmsize"]): + gaps = _yoy_gaps(cell, col) + if not gaps: + continue + means.append(float(np.mean([g for _, g in gaps]))) + if int(cell[denom_col].min()) < THIN_JOBS: + n_thin += 1 + summary[name] = { + "cell_floor_median": _round(np.median(means)), + "cell_floor_p90": _round(np.quantile(means, 0.9)), + "cell_floor_max": _round(np.max(means)), + "n_cells_with_pairs": len(means), + "n_thin_cells": n_thin, + } + return detail, summary + + +# --------------------------------------------------------------------- +# E1 — SUSB employment share by firm-size band x sector +# --------------------------------------------------------------------- + + +def e1_block() -> dict: + susb = targets.load_susb_sector_size() + detail = susb[ + (susb["naics_sector"] != "--") + & (~susb["entrsize_code"].isin(banding.SUSB_SUBTOTAL_CODES)) + & (susb["entrsize_code"] != "01") + ].copy() + detail["band"] = detail["entrsize_code"].map( + lambda c: banding.susb_entrsize_to_canonical(c).band.name + ) + by_sector: dict = {} + for sector, grp in detail.groupby("naics_sector"): + total = grp["employment"].sum() + bands: dict = {} + for band, cell in grp.groupby("band"): + worst = max( + cell["employment_noise_flag"], + key=lambda f: SUSB_FLAG_SEVERITY[f], + ) + bands[band] = { + "employment": int(cell["employment"].sum()), + "share": _round(cell["employment"].sum() / total), + "noise_flag_worst": worst, + "cv_upper_bound": SUSB_FLAG_CV_BOUND[worst], + } + by_sector[sector] = bands + + bds = targets.load_bds_firm_size() + lo, hi = BDS_WINDOW + bds = bds[(bds["year"] >= lo - 1) & (bds["year"] <= hi)] + group_of = { + label: group + for group, labels in BDS_GROUPS.items() + for label in labels + } + bds = bds.assign(group=bds["fsize"].map(group_of)) + emp = bds.groupby(["year", "group"])["emp"].sum().unstack() + shares = emp.div(emp.sum(axis=1), axis=0) + bds_margin: dict = {} + for group, labels in BDS_GROUPS.items(): + spans = [banding.bds_fsize_to_canonical(lb) for lb in labels] + union = tuple(dict.fromkeys(b for span in spans for b in span.bands)) + gaps = [ + (int(year), abs(math.log(shares.loc[year, group] / prev))) + for year, prev in zip( + shares.index[1:], + shares[group].to_numpy()[:-1], + strict=True, + ) + ] + bds_margin[group] = { + "bds_fsize_categories": list(labels), + "canonical_bands": [b.name for b in union], + "exact": len(union) == 1, + "share_2022": _round(shares.loc[hi, group]), + **_gap_summary(gaps), + } + return { + "susb_2022_share_by_sector_band": by_sector, + "bds_size_margin_yoy_stability": { + "window": list(BDS_WINDOW), + "groups": bds_margin, + }, + } + + +# --------------------------------------------------------------------- +# QWI (E6/E7) and J2J (E2 proxy, E11 margins) +# --------------------------------------------------------------------- + + +def e6_e7_block() -> dict: + qwi = targets.load_qwi_firmsize_sector() + detail, summary = _lehd_cell_block( + qwi, + { + "e6_hire_rate": "hire_rate", + "e6_separation_rate": "separation_rate", + "e7_earns_mean": "EarnS", + }, + "EmpTotal", + ) + # EarnS is nominal: its raw YoY variation embeds aggregate nominal + # wage growth (a trend, not sampling noise). Record the + # aggregate-relative variant alongside, both on the record. + margin = qwi[qwi["industry"] == "00"].copy() + agg = ( + margin.assign(w=margin["EarnS"] * margin["EmpS"]) + .groupby(["year", "quarter"]) + .agg(w=("w", "sum"), emps=("EmpS", "sum")) + ) + agg_earns = (agg["w"] / agg["emps"]).rename("agg_earns").reset_index() + rel = margin.merge(agg_earns, on=["year", "quarter"]) + rel["earns_rel"] = rel["EarnS"] / rel["agg_earns"] + for code, cell in rel.groupby("firmsize"): + detail[f"firmsize{int(code)}"]["e7_earns_rel_to_aggregate"] = ( + _gap_summary(_yoy_gaps(cell, "earns_rel")) + ) + return {"by_firmsize_all_industry": detail, "sector_cells": summary} + + +def e2_e11_block() -> tuple[dict, dict]: + j2j = targets.load_j2j_firmsize_sector() + j2j = j2j.copy() + base = j2j["MainB"].where(j2j["MainB"] > 0) + j2j["main_hire_rate"] = j2j["MHire"] / base + j2j["main_separation_rate"] = j2j["MSep"] / base + j2j["ee_hire_rate"] = j2j["EEHire"] / base + j2j["ee_separation_rate"] = j2j["EESep"] / base + detail, summary = _lehd_cell_block( + j2j, + { + "hire_rate": "main_hire_rate", + "separation_rate": "main_separation_rate", + "j2j_hire_rate": "j2j_hire_rate", + "j2j_separation_rate": "j2j_separation_rate", + "ee_hire_rate": "ee_hire_rate", + "ee_separation_rate": "ee_separation_rate", + }, + "MainB", + ) + e2 = { + "by_firmsize_all_industry": detail, + "sector_cells": summary, + "by_sex_age": e2_sexage_block(), + } + e11 = e11_block() + return e2, e11 + + +#: The rate families carried on the sex x age axis. Same |log YoY +#: ratio| machinery as the firm-size axis, so the two E2 axes are on +#: one footing for the referee round. +SEXAGE_RATE_COLS = { + "hire_rate": "hire_rate", + "separation_rate": "separation_rate", + "j2j_hire_rate": "j2j_hire_rate", + "j2j_separation_rate": "j2j_separation_rate", +} + + +def e2_sexage_block() -> dict: + """E2's registered sex x age gate axis (#192; the #228 extract). + + The floor the earlier draft deferred: E2 is registered by sex x + age, and until the ``sa`` extract landed the committed + tabulations carried no such axis. Cells are the 3 x 9 sex x age + grid at the all-industry margin (margins included, so the + all-sexes and all-ages rows are floorable too), 2015Q1-2025Q1. + """ + frame = targets.load_j2j_sexage() + cells: dict = {} + for (sex, agegrp), cell in frame.groupby(["sex", "agegrp"]): + min_denom = int(cell["MainB"].min()) + rec: dict = { + "sex": int(sex), + "sex_label": cell["sex_label"].iloc[0], + "agegrp": agegrp, + "agegrp_label": cell["agegrp_label"].iloc[0], + "min_denominator_jobs": min_denom, + "thin": min_denom < THIN_JOBS, + } + for name, col in SEXAGE_RATE_COLS.items(): + rec[name] = { + "level_mean": _round(cell[col].mean()), + **_gap_summary(_yoy_gaps(cell, col)), + } + cells[f"sex{int(sex)}_{agegrp}"] = rec + + # Cross-cell summary over the 2 x 8 non-margin cells only: the + # margins are aggregates of them, so pooling both would double + # count and pull the median toward the (much more stable) + # aggregate rows. + detail_cells = frame[(frame["sex"] != 0) & (frame["agegrp"] != "A00")] + summary: dict = { + "n_cells": int(detail_cells.groupby(["sex", "agegrp"]).ngroups), + "note": ( + "non-margin cells only (sex in 1,2 x agegrp A01-A08); the " + "all-sexes / all-ages rows are aggregates of these and " + "are reported per-cell above, not pooled here" + ), + } + for name, col in SEXAGE_RATE_COLS.items(): + means = [] + n_thin = 0 + for _, cell in detail_cells.groupby(["sex", "agegrp"]): + gaps = _yoy_gaps(cell, col) + if not gaps: + continue + means.append(float(np.mean([g for _, g in gaps]))) + if int(cell["MainB"].min()) < THIN_JOBS: + n_thin += 1 + summary[name] = { + "cell_floor_median": _round(np.median(means)), + "cell_floor_p90": _round(np.quantile(means, 0.9)), + "cell_floor_max": _round(np.max(means)), + "n_cells_with_pairs": len(means), + "n_thin_cells": n_thin, + } + return {"cells": cells, "cross_cell": summary} + + +def e11_block() -> dict: + """E11's disposition, restated now that the OD extract exists. + + Not "no extract" any more (#228 commits the full 6 x 6 origin x + destination grid) but still not a floorable cross: the national + detail is published only for 2015Q1-2016Q1, which yields exactly + one same-quarter year-over-year pair per detail cell (2016Q1 vs + 2015Q1). One pair gives a gap but no dispersion, so no + ``mean + k * sd`` floor exists on the detail. The margins run + through 2025Q1 and are floorable. + """ + od = targets.load_j2jod_firmsize() + detail = od[(od["firmsize"] > 0) & (od["firmsize_orig"] > 0)] + observed = detail.dropna(subset=["EE"]) + quarters = ( + observed[["year", "quarter"]] + .drop_duplicates() + .sort_values(["year", "quarter"]) + ) + periods = [(int(y), int(q)) for y, q in quarters.to_numpy()] + pairs_per_cell = { + f"{int(o)}to{int(d)}": len(_yoy_gaps(cell, "EE")) + for (o, d), cell in observed.groupby(["firmsize_orig", "firmsize"]) + } + max_pairs = max(pairs_per_cell.values()) if pairs_per_cell else 0 + + # EE margins are counts, so their YoY variation carries aggregate + # flow growth (a trend, not noise) exactly as raw EarnS carries + # nominal wage growth. Both variants are committed, matching the + # e7_nominal_trend treatment: `ee` is the raw count and `ee_rel` + # is the share of that quarter's all-size EE total, which divides + # the common trend out. + total = ( + od[(od["firmsize_orig"] == 0) & (od["firmsize"] == 0)] + .set_index(["year", "quarter"])["EE"] + .rename("ee_total") + ) + margin = od[(od["firmsize_orig"] == 0) & (od["firmsize"] > 0)].copy() + margin = margin.join(total, on=["year", "quarter"]) + margin["ee_rel"] = margin["EE"] / margin["ee_total"].where( + margin["ee_total"] > 0 + ) + margin_gaps: dict = {} + for code, cell in margin.groupby("firmsize"): + observed_cell = cell.dropna(subset=["EE"]) + margin_gaps[f"firmsize{int(code)}"] = { + "firmsize_label": cell["firmsize_label"].iloc[0], + "ee": _gap_summary(_yoy_gaps(observed_cell, "EE")), + "ee_rel": _gap_summary(_yoy_gaps(observed_cell, "ee_rel")), + } + + return { + "status": ( + "detail floor NOT derivable (one YoY pair per cell); " + "destination-size margin floor derivable" + ), + "detail_window": { + "observed_quarters": [f"{y}Q{q}" for y, q in periods], + "n_quarters": len(periods), + "max_yoy_pairs_per_cell": max_pairs, + "why_not_floorable": ( + "the national origin x destination cross is published " + "only for 2015Q1-2016Q1 (from 2016Q2 every detail " + "cell carries status flag 11); same-quarter " + "year-over-year pairing therefore yields at most one " + "pair per detail cell, which gives a gap but no " + "dispersion, so no mean + k*sd floor exists on the " + "cross. This is a different disposition from the " + "earlier draft's 'no extract committed': the extract " + "exists (#228), the temporal replicate does not" + ), + }, + "destination_size_margin": margin_gaps, + "cross_source_margin_disagreement": { + "all_size_ee_tool_above_flat_file": "37 of 41 quarters", + "all_size_ee_deviation_range_pct": [-1.00, 2.02], + "per_size_deviation_range_pct": [-3.20, 3.67], + "note": ( + "the LED Extraction Tool's margins and the LEHD flat " + "file's d_fs margins are independent publications of " + "the same quantity and disagree by up to ~3% in " + "either direction (provenance entry 6; reproduce with " + "scripts/check_j2jod_margin_agreement.py). Since " + "E11's post-2016Q1 constraints are margins-only, this " + "cross-source wobble bounds how tight any E11 margin " + "threshold can be, independently of the temporal " + "floor above" + ), + }, + } + + +def build() -> dict: + e2, e11 = e2_e11_block() + return { + "artifact": "employer_firm_floors", + "version": "v1", + "status": ( + "PRE-LOCK REFERENCE - NOT RATIFIED; IC3 not locked; no " + "thresholds. v1 marks the artifact sha256-pinned and " + "reproduction-tested (#230 section 12.2 item 2), which " + "is a pinning event, not a ratification: the numbers " + "here bind nothing until the IC3 amendment PR merges" + ), + "input_extract_sha256": _input_digests(), + "issue": "192", + "workstream": "B", + "sources": { + "susb": "data/external/susb_us_sector_size_2022.csv", + "bds": "data/external/bds_us_firm_size_1978_2022.csv", + "qwi": "data/external/qwi_us_firmsize_sector_2015on.csv", + "j2j": "data/external/j2j_us_firmsize_sector_2015on.csv", + "j2j_sexage": "data/external/j2j_us_sexage_2015on.csv", + "j2jod": "data/external/j2jod_us_firmsize_od_2015on.csv", + "provenance": ("data/external/employer_firm_target_sources.md"), + }, + "method": ( + "temporal-stability floors on published administrative " + "aggregates: year-over-year same-quarter |log ratio| per " + "cell (QWI/J2J, 2015Q1 on; same-quarter comparison " + "absorbs seasonality in the not-seasonally-adjusted " + "extracts), year-over-year |log share ratio| for the BDS " + "size margin (2012-2022), and published noise-flag CV " + "bounds for the single-vintage SUSB table; banding via " + "populace_dynamics.firms.banding only; thin flag at " + f"minimum cell denominator < {THIN_JOBS} jobs (draft " + "choice)" + ), + "unit_rules": [ + "QWI/J2J cells count jobs, not persons (ADR 0003): the " + "job-to-person adjustment (~ multiple-jobholding rate, " + "~5%) is a pre-registered IC3 item", + "QWI EarnS is MEAN monthly earnings of full-quarter " + "employees; QWI never publishes medians; E7 is stated on " + "means", + "J2J extract ownership is oslp (state/local + private) " + "while QWI is private-only (op) and SUSB excludes " + "government; NAICS 92 is dropped from the J2J extract " + "but state/local employment embedded in other sectors " + "(esp. 61, 62) remains — E2/E11 cells must restate on a " + "private-comparable basis or carry this scope caveat " + "(locks with IC3)", + ], + "method_findings": { + "e1_no_sector_replicate": ( + "the committed SUSB extract is a single 2022 " + "cross-section: a same-source temporal or resampling " + "floor on the size x sector cells is degenerate. The " + "E1 floor is therefore composed of the published " + "SUSB noise-flag CV bounds per cell plus a BDS " + "year-over-year stability floor that exists only for " + "the national size margin — the sector axis has no " + "stability floor derivable from committed extracts" + ), + "e1_bds_straddle": ( + "the BDS '20 to 99' category straddles the canonical " + "50 edge (banding.bds_fsize_to_canonical is inexact " + "there), so the BDS margin floor is stated on a " + "coarsened partition (20_99 kept whole), not on the " + "five canonical bands" + ), + "e2_sex_age_axis_built": ( + "SUPERSEDES draft_v0's 'e2_no_age_sex_axis'. E2's " + "registered sex x age axis is now floored from the " + "committed J2J sex x age extract (#228): the full " + "3 x 9 grid at the all-industry margin, 2015Q1-" + "2025Q1, same |log YoY ratio| machinery as the " + "firm-size axis, reported per cell and pooled over " + "the 2 x 8 non-margin cells. The firm-size x sector " + "floors remain the aggregate-side references they " + "always were; the two E2 axes are now on one " + "footing. Naming correction carried from the earlier " + "draft: LEHD's sex x age tabulation is 'sa'; 'se' is " + "sex x EDUCATION, and the draft_v0 finding named the " + "wrong one" + ), + "e11_extract_committed_but_no_temporal_replicate": ( + "SUPERSEDES draft_v0's 'e11_no_od_extract', which is " + "now factually stale: the origin x destination " + "firm-size cross IS committed (#228, the full 6 x 6 " + "grid). The obstacle is temporal, not availability. " + "The national detail is published only for " + "2015Q1-2016Q1 (status flag 11 from 2016Q2), so " + "same-quarter year-over-year pairing yields at most " + "ONE pair per detail cell — a gap with no " + "dispersion, hence no mean + k*sd floor on the " + "cross. The destination-size margins run through " + "2025Q1 and are floored in the e11 block. A second, " + "independent bound on any margin threshold comes " + "from cross-source disagreement: the LED tool's " + "margins and the LEHD flat file's differ by up to " + "~3% in either direction (e11.cross_source_margin_" + "disagreement)" + ), + "release_revision_noise_unfloored": ( + "a third floorable concept, recorded and NOT built: " + "vintage-to-vintage revision noise. LEHD revises " + "across releases, and none of the floors here see " + "that — every extract is a single release (R2026Q1). " + "Observed during the #228 review: LEHD rotated to " + "R2026Q2 mid-round and the J2JOD values for " + "2015Q1-2025Q1 were unchanged across the rotation " + "(all 1,476 rows), which is one datum, on one " + "series, over one rotation — suggestive that " + "revision noise is small for these aggregates, not " + "evidence that it is zero. Building it needs two " + "release-stamped vintages of the same series " + "committed; the IC3 referee round should decide " + "whether E1/E2/E6/E7/E11 thresholds must carry a " + "revision allowance on top of the temporal floor" + ), + "e12_deferred": ( + "E12 (AKM moments) has no committed extract: AKM " + "variance decompositions require linked " + "employer-employee microdata, and the published " + "decompositions are research outputs rather than a " + "recurring aggregate release. No floor is buildable; " + "E12 is deferred and does not gate the first IC3 " + "lock. True-linked validation remains deferred " + "pending a committed, provenance-pinned reference " + "extract. Reproducing aggregate size/industry " + "employment, mean-earnings, or flow margins cannot " + "certify true worker-firm linkage, coworker sorting, " + "within/between-firm variance, firm effects, or " + "spillovers. Those stronger Phase 2 claims remain a " + "no-go until a true-linked reference is adjudicable" + ), + "cycle_signal_in_floors": ( + "temporal-stability floors on published aggregates " + "include true business-cycle variation (2020-2021 " + "most visibly) as well as source noise; both the " + "full-sample and ex-pandemic figures are committed " + "rather than choosing one — the IC3 referee round " + "picks the formulation with both on the record" + ), + "floors_not_monotone_in_disaggregation": ( + "an empirical finding from the sex x age build, and " + "a trap for the threshold policy: the temporal " + "floor is NOT monotone in disaggregation. Of the 26 " + "non-aggregate sex x age cells, the number whose " + "ex-pandemic floor is TIGHTER than the all-sexes " + "all-ages cell is 13 (hire), 10 (separation), 6 " + "(j2j hire), 7 (j2j separation). The pattern is " + "interpretable -- the 45-99 age cells are the most " + "stable and the 19-34 cells the least, while the " + "aggregate carries compositional shift the older " + "cells do not -- but the consequence is procedural: " + "a floor measured on a margin CANNOT be used as a " + "conservative bound for the cells beneath it. Every " + "gated cell needs its own floor, or the threshold " + "policy must say explicitly which cell's floor " + "governs (IC3 open question 1)" + ), + "e11_margin_trend": ( + "the E11 destination-size margins are EE flow " + "COUNTS, so their year-over-year variation carries " + "aggregate flow growth (a trend, not noise) exactly " + "as raw EarnS carries nominal wage growth. Both are " + "committed: 'ee' (raw counts) and 'ee_rel' (share of " + "the quarter's all-size EE total, which divides the " + "common trend out). The relative variant is far " + "TIGHTER than the raw one: across the five " + "destination bands its floor mean is 4.5x to " + "9.5x smaller (e.g. firmsize1 0.1054 raw vs 0.0233 " + "relative), and 3.4x to 6.6x smaller on the " + "ex-pandemic window. Most of the raw floor is the " + "aggregate flow trend, which is exactly what the " + "relative variant removes; the IC3 referee round picks " + "the formulation, as for E7" + ), + "e7_nominal_trend": ( + "raw EarnS YoY variation embeds aggregate nominal " + "wage growth (a trend, not noise); the " + "aggregate-relative EarnS floor is committed " + "alongside the raw one, both on the record" + ), + }, + "e1": e1_block(), + "e2": e2, + "e6_e7": e6_e7_block(), + "e11": e11, + "e12": { + "status": ( + "deferred - true-linked reference required; aggregate " + "fit cannot certify linkage or two-sided moments" + ) + }, + } + + +def main() -> None: + artifact = build() + ARTIFACT.write_text(json.dumps(artifact, indent=2) + "\n") + print(f"wrote {ARTIFACT}") + + +if __name__ == "__main__": + main() diff --git a/scripts/build_noemp_band_evidence.py b/scripts/build_noemp_band_evidence.py index dc1a23cd..9bcc886c 100644 --- a/scripts/build_noemp_band_evidence.py +++ b/scripts/build_noemp_band_evidence.py @@ -3,7 +3,7 @@ REPORTED ANCHOR, NOT A GATE RUN. Like the mortality/claiming/ disability floors, this reads no gate and decides nothing on its own; it is committed evidence pinned by a reproduction test. It -records the empirical basis for the C2 banding decision's treatment +records the empirical basis for the IC2 banding decision's treatment of CPS ASEC firm size: **the 2019+ data dictionaries' relabeling of NOEMP codes 2/3 (from 10-49 / 50-99 to 10-24 / 25-99) never happened in the instrument.** diff --git a/scripts/build_seam_reconciliation.py b/scripts/build_seam_reconciliation.py new file mode 100644 index 00000000..2b5e33bf --- /dev/null +++ b/scripts/build_seam_reconciliation.py @@ -0,0 +1,271 @@ +"""Build the DRAFT SIPP-vs-J2J seam-reconciliation artifact (#192). + +REPORTED ANCHOR, NOT A GATE RUN — and explicitly a DRAFT: no +thresholds, C3 not locked. This is the reconciliation run the #192 +protocol rules require before E2/E4 thresholds lock ("commit a +documented SIPP-vs-J2J rate-reconciliation run and decide ex ante +which source is truth for rates vs persistence structure"). The +groundwork numbers were first posted to #192 (comment 4982442068); +this script commits the reproducible version and adds the E->N leg +the groundwork lacked. + +Three measurements, every concept delta NAMED, none adjusted away: + +(a) **Within-wave monthly job separation** per SIPP file: a job held + in month m and absent in m+1, among persons present in the + panel in both months (presence from the person-month universe, + so exits to nonemployment COUNT as separations — unlike the + groundwork, which conditioned on employed-both-months). +(b) **Across-wave separation** at the wave boundary: December of + one file's reference year to January of the next file's, + linking persons on ``SSUID``-``PNUM`` and the wave-consistent + ``EJB`` job ids. Seam bias concentrates here. +(c) **The J2J benchmark**: national all-industry main-job + separations (``MSep/MainB``) by quarter from the committed + extract, converted to a monthly equivalent + ``1 - (1 - q)**(1/3)``. + +Named concept deltas that remain: J2J counts jobs (person-employer +pairs) in UI-covered non-federal employment and separations of the +*main* job; SIPP here counts all jobs including self-employment +(JBORSE 2/3 excludable in later cuts) per job-month held. J2J +"quarterly separation" is not literally three independent monthly +draws, so the monthly equivalent is an approximation stated as such. + +UNVERIFIED ASSUMPTION (job-ID linkage): the across-wave Dec->Jan +seam rate assumes SIPP ``EJB`` job ids are longitudinally consistent +across the pu2022->pu2023 file boundary. If ids are reassigned at +wave boundaries, spurious separations inflate the seam rate, so part +of the seam-vs-within-wave contrast could be a linkage artifact +rather than seam recall bias. This must be checked before C3 rules +on it. + +Year-label convention: JSON keys under +``within_wave_monthly_separation`` are SIPP FILE years +(pu2022/pu2023), not reference years (file year = reference year ++ 1); PR #212's artifacts use reference years. + +Usage:: + + python scripts/build_seam_reconciliation.py + +writes ``runs/seam_reconciliation_draft_v0.json``. +""" + +from __future__ import annotations + +import json +import sys +from pathlib import Path + +import pandas as pd + +REPO = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(REPO / "src")) + +from populace_dynamics.data import sipp_jobs # noqa: E402 + +FILE_YEARS = (2022, 2023) +J2J_YEARS = (2021, 2022) +J2J_EXTRACT = REPO / "data/external/j2j_us_firmsize_sector_2015on.csv" +ARTIFACT = REPO / "runs/seam_reconciliation_draft_v0.json" + + +def person_month_presence(year: int) -> pd.DataFrame: + """All person-months in the file (employed or not).""" + import os + + data_dir = Path( + os.environ.get( + "POPULACE_DYNAMICS_SIPP_DIR", + str(Path("~/PolicyEngine/sipp-data").expanduser()), + ) + ).expanduser() + for suffix in (".csv", ".csv.gz"): + path = data_dir / f"pu{year}{suffix}" + if path.exists(): + break + else: + raise FileNotFoundError(f"pu{year}.csv[.gz] not staged") + raw = pd.read_csv( + path, + sep="|", + usecols=["SSUID", "PNUM", "MONTHCODE"], + dtype={"SSUID": "string"}, + ) + raw["person_id"] = raw["SSUID"].astype(str) + "-" + raw["PNUM"].astype(str) + return raw[["person_id", "MONTHCODE"]].rename( + columns={"MONTHCODE": "month"} + ) + + +def within_wave(year: int) -> pd.DataFrame: + """Monthly job-separation rates, presence-conditioned only.""" + job_months = sipp_jobs.read_sipp_job_months(year) + presence = person_month_presence(year) + present = set(zip(presence["person_id"], presence["month"], strict=True)) + jobs = ( + job_months.groupby(["person_id", "month"])["job_id"] + .agg(frozenset) + .reset_index() + ) + jobs_next = { + (p, m): j + for p, m, j in zip( + jobs["person_id"], jobs["month"], jobs["job_id"], strict=True + ) + } + rows = [] + for month in range(1, 12): + held = kept = 0 + month_slice = jobs[jobs["month"] == month] + for person, js in zip( + month_slice["person_id"], month_slice["job_id"], strict=True + ): + if (person, month + 1) not in present: + continue # left the sample, not a separation + held += len(js) + kept += len(js & jobs_next.get((person, month + 1), frozenset())) + rows.append( + { + "month_pair": f"{month}->{month + 1}", + "jobs_held": held, + "jobs_kept": kept, + "sep_rate": round(1 - kept / held, 4), + } + ) + return pd.DataFrame(rows) + + +def across_wave() -> dict: + """Dec (first file) -> Jan (second file), sample-present both.""" + first = sipp_jobs.read_sipp_job_months(FILE_YEARS[0]) + second = sipp_jobs.read_sipp_job_months(FILE_YEARS[1]) + presence_second = person_month_presence(FILE_YEARS[1]) + present_jan = set( + presence_second[presence_second["month"] == 1]["person_id"] + ) + dec = ( + first[first["month"] == 12] + .groupby("person_id")["job_id"] + .agg(frozenset) + ) + jan = ( + second[second["month"] == 1] + .groupby("person_id")["job_id"] + .agg(frozenset) + ) + held = kept = persons = 0 + for person, js in dec.items(): + if person not in present_jan: + continue + persons += 1 + held += len(js) + kept += len(js & jan.get(person, frozenset())) + return { + "persons_linked": persons, + "jobs_held": held, + "jobs_kept": kept, + "sep_rate": round(1 - kept / held, 4), + } + + +def j2j_benchmark() -> list[dict]: + j2j = pd.read_csv(J2J_EXTRACT, dtype={"industry": str}) + national = j2j[(j2j.industry == "00") & (j2j.year.isin(J2J_YEARS))] + out = ( + national.groupby(["year", "quarter"]) + .agg(MainB=("MainB", "sum"), MSep=("MSep", "sum")) + .reset_index() + ) + out["q_sep_rate"] = (out.MSep / out.MainB).round(4) + out["monthly_equivalent"] = ( + 1 - (1 - out.MSep / out.MainB) ** (1 / 3) + ).round(4) + return out[ + ["year", "quarter", "q_sep_rate", "monthly_equivalent"] + ].to_dict("records") + + +def build() -> dict: + within = { + str(year): within_wave(year).to_dict("records") for year in FILE_YEARS + } + seam = across_wave() + bench = j2j_benchmark() + within_means = { + year: round(float(pd.DataFrame(rows)["sep_rate"].mean()), 4) + for year, rows in within.items() + } + return { + "artifact": "seam_reconciliation", + "version": "draft_v0", + "status": "DRAFT - NOT RATIFIED; C3 not locked; no thresholds", + "issue": "192", + "year_label_convention": ( + "Keys under within_wave_monthly_separation and " + "within_wave_means are SIPP FILE years (pu2022/pu2023), " + "not reference years; file year = reference year + 1. " + "PR #212's artifacts use reference years, so pu2022 " + "here pairs with #212's 2021 and pu2023 with #212's " + "2022." + ), + "notes": ( + "Naming collision: the SIPP 'j2j' transition measure " + "from #212 (~0.35% person-level direct employer change " + "per month) and the Census J2J data source's ~4.1% " + "monthly-equivalent main-job separation rate benchmark " + "used here are different universes and definitions " + "(person-level direct employer-to-employer moves vs " + "all main-job separations in UI-covered employment); " + "the ~10x gap is not a contradiction." + ), + "first_reported": ( + "PolicyEngine/populace-dynamics#192 comment 4982442068 " + "(groundwork conditioned on employed-both-months; this " + "artifact adds the E->N leg via the person-month " + "universe)" + ), + "within_wave_monthly_separation": within, + "within_wave_means": within_means, + "across_wave_dec_to_jan": seam, + "j2j_national_benchmark": bench, + "concept_deltas": [ + "J2J counts jobs (person-employer pairs) in UI-covered " + "non-federal employment; SIPP counts all jobs incl. " + "self-employment per job-month held", + "J2J MSep is main-job separations; SIPP here counts " + "every held job", + "the monthly equivalent 1-(1-q)^(1/3) treats a quarter " + "as three independent monthly draws — an approximation", + "persons leaving the SIPP sample are excluded from the " + "denominator, not counted as separations", + "UNVERIFIED ASSUMPTION (job-ID linkage): the 9.45% " + "Dec->Jan seam rate assumes SIPP EJB job ids are " + "longitudinally consistent across the pu2022->pu2023 " + "file boundary; if ids are reassigned at wave " + "boundaries, spurious separations inflate the seam " + "rate, so part of the seam-vs-within-wave contrast " + "could be a linkage artifact rather than seam recall " + "bias. This must be checked before C3 rules on it.", + ], + "proposed_ruling_note": ( + "NOT RATIFIED: as the plan proposed ex ante, J2J is " + "truth for rate LEVELS and SIPP for persistence " + "STRUCTURE; phase-1 hazards estimated seam-aware " + "(wave-frequency with within-wave interpolation). " + "Ratification belongs to the C3 referee round." + ), + } + + +def main() -> None: + artifact = build() + ARTIFACT.write_text(json.dumps(artifact, indent=2) + "\n") + print(f"wrote {ARTIFACT}") + print("within-wave means:", artifact["within_wave_means"]) + print("across-wave:", artifact["across_wave_dec_to_jan"]) + + +if __name__ == "__main__": + main() diff --git a/scripts/build_sipp_e8_e9_floors.py b/scripts/build_sipp_e8_e9_floors.py new file mode 100644 index 00000000..441b02ca --- /dev/null +++ b/scripts/build_sipp_e8_e9_floors.py @@ -0,0 +1,463 @@ +"""Build pre-IC3 SIPP floor references for gates E8 and E9 (#192). + +REPORTED ANCHOR, NOT A GATE RUN: IC3 has not locked and no thresholds +are proposed. Completes Workstream A's +floor battery (E3 tenure and E4/E5 spells are committed siblings; +E10 needs no floor — it is pass/fail on the locked PSID gates). + +Moments, on the pu2023 file (reference year 2022), restricted to +persons observed in the panel for all 12 reference months so spell +durations are not right-censored by sample exit (the restriction is +recorded, not hidden): + +(a) **E8 — nonemployment spell durations** (the zero-spell battery + analog). A person-month is nonemployed when the person is in + the panel that month with no active EJB job. Among persons with + at least one employed month, maximal nonemployment runs are + collapsed; moments per age band: the weighted share of persons + with any nonemployment spell, and the weighted share of those + spells lasting >= 3 months. + +(b) **E9 — earnings change by transition type** (the layering- + coherence moment). Consecutive-month person transitions are + classified stay (a common job id), j2j (employed both months, + no common id), exit (employed -> nonemployed), entry + (nonemployed -> employed). For stay and j2j, where both months' + known earnings totals are positive, the moment is the weighted + median and IQR of log(earn_{m+1} / earn_m). Exit/entry carry + rates, not earnings changes (their change is to/from zero by + construction). + +(c) **The floor**: person-disjoint sha256 half-splits, seeds 0-19; + for rates the |log rate ratio| between halves, for medians/IQRs + the absolute gap in log-points; mean/sd across seeds. Cells + under 200 unweighted persons per half are flagged thin. + +Thin-flag units (recorded for honesty across the floor battery): +the E8 thin flag counts **rows** per half, which equal persons +because the E8 frame has one row per person; the E9 earnings-change +thin flag counts **distinct persons** per half +(``person_id.nunique()``), although the underlying rows are +consecutive-month transition pairs. All compare against the same +``THIN_CELL_PERSONS = 200``. + +Seam caveat: identical to the E4/E5 floors — both halves share +SIPP's seam structure, so these floors cannot see seam bias; the +reconciliation artifact (#214) carries that measurement. + +Usage:: + + python scripts/build_sipp_e8_e9_floors.py + +writes ``runs/sipp_e8_e9_floors_v1.json``. +""" + +from __future__ import annotations + +import hashlib +import json +import os +import sys +from pathlib import Path + +import numpy as np +import pandas as pd + +REPO = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(REPO / "src")) + +from populace_dynamics.contract import environment_block # noqa: E402 +from populace_dynamics.data import sipp_jobs # noqa: E402 + +YEAR = 2023 +SEEDS = tuple(range(20)) +AGE_BANDS = ((16, 24), (25, 34), (35, 44), (45, 54), (55, 64), (65, 99)) +THIN_CELL_PERSONS = 200 + +ARTIFACT = REPO / "runs/sipp_e8_e9_floors_v1.json" +ENV_SIDECAR = ARTIFACT.with_suffix(".env.json") +INPUT_SIDECAR = ARTIFACT.with_suffix(".inputs.json") +OFFICIAL_SOURCE_URL = ( + "https://www2.census.gov/programs-surveys/sipp/data/datasets/" + "2023/pu2023_csv.zip" +) +OFFICIAL_ARCHIVE_SHA256 = ( + "9c5363d56aca2041db20d46d17b81e9be931eb5b18bd5f5238b367d2dd7fb74b" +) +OFFICIAL_ARCHIVE_BYTES = 109_036_604 + + +def _source_path(year: int) -> Path: + data_dir = Path( + os.environ.get( + "POPULACE_DYNAMICS_SIPP_DIR", + str(Path("~/PolicyEngine/sipp-data").expanduser()), + ) + ).expanduser() + for suffix in (".csv", ".csv.gz"): + path = data_dir / f"pu{year}{suffix}" + if path.exists(): + return path + raise FileNotFoundError(f"pu{year}.csv[.gz] not staged") + + +def _reader_commit() -> str: + """Last commit touching the SIPP reader in effect for this run.""" + import subprocess + + try: + return subprocess.run( + [ + "git", + "log", + "-1", + "--format=%H", + "--", + "src/populace_dynamics/data/sipp_jobs.py", + ], + cwd=REPO, + capture_output=True, + text=True, + check=True, + ).stdout.strip() + except Exception: + return "unknown" + + +def _age_band(age: pd.Series) -> pd.Series: + bins = [AGE_BANDS[0][0] - 1, *[hi for _, hi in AGE_BANDS]] + labels = [f"{lo}_{hi}" for lo, hi in AGE_BANDS] + return pd.cut(age, bins=bins, labels=labels) + + +def _half(person_id: str, seed: int) -> int: + digest = hashlib.sha256(f"{seed}:{person_id}".encode()).digest() + return digest[0] & 1 + + +def _person_month_universe(year: int) -> pd.DataFrame: + path = _source_path(year) + raw = pd.read_csv( + path, + sep="|", + usecols=["SSUID", "PNUM", "MONTHCODE", "WPFINWGT", "TAGE"], + dtype={"SSUID": "string"}, + ) + raw["person_id"] = raw["SSUID"].astype(str) + "-" + raw["PNUM"].astype(str) + return raw.rename( + columns={"MONTHCODE": "month", "WPFINWGT": "weight", "TAGE": "age"} + )[["person_id", "month", "weight", "age"]] + + +def build_panel(year: int) -> pd.DataFrame: + """Person x month grid for full-year persons, with jobs/earnings.""" + universe = _person_month_universe(year) + counts = universe.groupby("person_id")["month"].nunique() + full_year = set(counts[counts == 12].index) + universe = universe[universe["person_id"].isin(full_year)] + + job_months = sipp_jobs.read_sipp_job_months(year) + jobs = ( + job_months.groupby(["person_id", "month"]) + .agg(jobs=("job_id", frozenset), earn=("earnings", "sum")) + .reset_index() + ) + panel = universe.merge(jobs, on=["person_id", "month"], how="left") + panel["jobs"] = panel["jobs"].apply( + lambda x: x if isinstance(x, frozenset) else frozenset() + ) + panel["employed"] = panel["jobs"].map(len) > 0 + return panel.sort_values(["person_id", "month"]) + + +def e8_person_frame(panel: pd.DataFrame) -> pd.DataFrame: + """Per person: any-nonemployment flag and longest N-spell.""" + rows = [] + for person, grp in panel.groupby("person_id", sort=False): + employed = grp.sort_values("month")["employed"].to_numpy() + if not employed.any(): + continue # never employed: outside the E8 universe + runs = [] + run = 0 + for e in employed: + if not e: + run += 1 + elif run: + runs.append(run) + run = 0 + if run: + runs.append(run) + rows.append( + { + "person_id": person, + "age": grp["age"].iloc[0], + "weight": grp["weight"].iloc[0], + "any_nonemp": bool(runs), + "long_nonemp": bool(runs and max(runs) >= 3), + } + ) + out = pd.DataFrame(rows) + out["age_band"] = _age_band(out["age"]) + return out[out["age_band"].notna()] + + +def e9_transition_frame(panel: pd.DataFrame) -> pd.DataFrame: + """Person x month-pair transitions with earnings changes.""" + nxt = panel[["person_id", "month", "jobs", "earn", "employed"]].copy() + nxt["month"] -= 1 + pairs = panel.merge(nxt, on=["person_id", "month"], suffixes=("", "_n")) + + def classify(row) -> str: + if row["employed"] and row["employed_n"]: + return "stay" if row["jobs"] & row["jobs_n"] else "j2j" + if row["employed"] and not row["employed_n"]: + return "exit" + if not row["employed"] and row["employed_n"]: + return "entry" + return "neither" + + pairs["transition"] = pairs.apply(classify, axis=1) + pairs = pairs[pairs["transition"] != "neither"].copy() + both_known = ( + pairs["earn"].notna() + & pairs["earn_n"].notna() + & (pairs["earn"] > 0) + & (pairs["earn_n"] > 0) + ) + pairs["log_change"] = np.nan + mask = both_known & pairs["transition"].isin(("stay", "j2j")) + pairs.loc[mask, "log_change"] = np.log( + pairs.loc[mask, "earn_n"] / pairs.loc[mask, "earn"] + ) + pairs["age_band"] = _age_band(pairs["age"]) + return pairs[pairs["age_band"].notna()] + + +def _weighted_quantile(values, weights, q: float) -> float: + order = np.argsort(values, kind="stable") + values = np.asarray(values)[order] + weights = np.asarray(weights)[order] + cum = np.cumsum(weights) - 0.5 * weights + cum /= weights.sum() + return float(np.interp(q, cum, values)) + + +def _rate_floor(cell: pd.DataFrame, flag: str) -> dict: + gaps, halves_n = [], [] + for seed in SEEDS: + half = cell["person_id"].map(lambda p, s=seed: _half(p, s)) + a, b = cell[half == 0], cell[half == 1] + halves_n.append(min(len(a), len(b))) + ra = float((a["weight"] * a[flag]).sum() / a["weight"].sum()) + rb = float((b["weight"] * b[flag]).sum() / b["weight"].sum()) + gaps.append(abs(np.log(ra / rb)) if ra > 0 and rb > 0 else np.nan) + gaps = [g for g in gaps if not np.isnan(g)] + return { + "floor_abs_log_ratio_mean": round(float(np.mean(gaps)), 5), + "floor_abs_log_ratio_sd": round(float(np.std(gaps)), 5), + "thin": bool(min(halves_n) < THIN_CELL_PERSONS), + } + + +def e8_floors(persons: pd.DataFrame) -> dict: + cells = {} + for band, cell in persons.groupby("age_band", observed=True): + w = cell["weight"] + cells[str(band)] = { + "any_nonemp_share": round( + float((w * cell["any_nonemp"]).sum() / w.sum()), 4 + ), + "long_nonemp_share": round( + float((w * cell["long_nonemp"]).sum() / w.sum()), 4 + ), + "persons_unweighted": int(len(cell)), + "any_nonemp": _rate_floor(cell, "any_nonemp"), + "long_nonemp": _rate_floor(cell, "long_nonemp"), + } + return cells + + +def e9_floors(pairs: pd.DataFrame) -> dict: + out: dict = {"transition_rates": {}, "earnings_change": {}} + monthly = pairs.groupby("transition")["weight"].sum() + total = monthly.sum() + out["transition_rates"] = { + t: round(float(v / total), 4) for t, v in monthly.items() + } + for kind in ("stay", "j2j"): + cell = pairs[ + (pairs["transition"] == kind) & pairs["log_change"].notna() + ] + values = cell["log_change"].to_numpy(dtype=float) + weights = cell["weight"].to_numpy(dtype=float) + med = _weighted_quantile(values, weights, 0.5) + iqr = _weighted_quantile(values, weights, 0.75) - _weighted_quantile( + values, weights, 0.25 + ) + med_gaps, iqr_gaps, halves_n = [], [], [] + for seed in SEEDS: + half = cell["person_id"].map(lambda p, s=seed: _half(p, s)) + a, b = cell[half == 0], cell[half == 1] + halves_n.append( + min( + a["person_id"].nunique(), + b["person_id"].nunique(), + ) + ) + + def q(frame, qq): + return _weighted_quantile( + frame["log_change"].to_numpy(dtype=float), + frame["weight"].to_numpy(dtype=float), + qq, + ) + + med_gaps.append(abs(q(a, 0.5) - q(b, 0.5))) + iqr_gaps.append( + abs((q(a, 0.75) - q(a, 0.25)) - (q(b, 0.75) - q(b, 0.25))) + ) + out["earnings_change"][kind] = { + "median_log_change": round(med, 4), + "iqr_log_change": round(iqr, 4), + "pairs_unweighted": int(len(cell)), + "persons_unweighted": int(cell["person_id"].nunique()), + "floor_abs_median_gap": { + "mean": round(float(np.mean(med_gaps)), 5), + "sd": round(float(np.std(med_gaps)), 5), + }, + "floor_abs_iqr_gap": { + "mean": round(float(np.mean(iqr_gaps)), 5), + "sd": round(float(np.std(iqr_gaps)), 5), + }, + "thin": bool(min(halves_n) < THIN_CELL_PERSONS), + } + return out + + +def build() -> dict: + panel = build_panel(YEAR) + persons = e8_person_frame(panel) + pairs = e9_transition_frame(panel) + return { + "artifact": "sipp_e8_e9_floors", + "version": "v1", + "status": ( + "PRE-LOCK REFERENCE - NOT RATIFIED; IC3 not locked; no " + "thresholds. v1 is a pinning event, not a ratification" + ), + "issue": "192", + "deployment_scale_note": ( + "RECORDED GAP (review of #212): these floors are " + "half-vs-half, i.e. the sampling noise of ~50%-of-source " + "estimates, while IC3 proposes scoring on a 0.20 person " + "holdout - there is no candidate-context floor (gate-1 " + "ctx20 analog). Under root-n scaling, a 20% scoring " + "frame has ~sqrt(0.5/0.2)=1.58x the sampling noise of " + "the half-split basis, so these floors are mildly " + "ANTI-conservative (too tight), not conservative. " + "RECORDED_NOT_SATISFIED: IC3 must accept a registered " + "analytic scale adjustment or require matching-context " + "floors before candidate runs." + ), + "source": f"pu{YEAR} (reference year {YEAR - 1}), persons " + "observed all 12 reference months (censoring-free draft " + "restriction, recorded; ESTIMAND NOTE per review: candidate " + "runs scored against these cells must apply the identical " + "full-year-persons restriction)", + "method": ( + "person-disjoint sha256 half-splits, seeds 0-19 (raised " + "from 5 per review: E8 cells where floor sd exceeds " + "the mean need a stable across-seed sd); rates " + "floored on |log rate ratio|, earnings-change medians/" + "IQRs on absolute gaps in log-points; weighted by " + "WPFINWGT" + ), + "seam_caveat": ( + "identical to the E4/E5 floors: half-splits share SIPP's " + "seam structure; #214 carries the seam measurement" + ), + "stay_median_heaping_caveat": ( + "within-job SIPP monthly earnings are mostly constant " + "across a wave (dependent-interview reporting), so the " + "stay-transition median log-change heaps at exactly 0 " + "and its half-vs-half floor is degenerate (0.0) - the " + "same failure class as the tenure quantile heaping; " + "E9-stay thresholds should be stated on the IQR or a " + "distributional distance, not the median" + ), + "thin_flag_units": { + "e8_nonemployment_by_age": ( + "rows per half, equal to persons (one row per " + "person in the E8 frame) vs THIN_CELL_PERSONS=200" + ), + "e9_transitions.earnings_change": ( + "distinct persons per half (person_id.nunique(); " + "rows are consecutive-month transition pairs and a " + "person can contribute up to 11) vs " + "THIN_CELL_PERSONS=200" + ), + }, + "sipp_jobs_reader_commit": _reader_commit(), + "source_input": { + "path": _source_path(YEAR).name, + "sha256": hashlib.sha256( + _source_path(YEAR).read_bytes() + ).hexdigest(), + }, + "e8_nonemployment_by_age": e8_floors(persons), + "e9_transitions": e9_floors(pairs), + } + + +def main() -> None: + artifact = build() + ARTIFACT.write_text(json.dumps(artifact, indent=2) + "\n") + staged_path = _source_path(YEAR) + INPUT_SIDECAR.write_text( + json.dumps( + { + "artifact": ARTIFACT.name, + "status": "SOURCE_INPUT_DIGESTS", + "official_source": { + "url": OFFICIAL_SOURCE_URL, + "archive_sha256": OFFICIAL_ARCHIVE_SHA256, + "archive_bytes": OFFICIAL_ARCHIVE_BYTES, + "archive_member": "pu2023.csv", + }, + "staged_input": { + **artifact["source_input"], + "bytes": staged_path.stat().st_size, + "transport_note": ( + "gzip -n recompression of the sole CSV member " + "from the verified official Census ZIP" + ), + }, + }, + indent=2, + ) + + "\n" + ) + ENV_SIDECAR.write_text( + json.dumps( + { + "artifact": ARTIFACT.name, + "status": "MEASUREMENT_ENVIRONMENT", + "environment": environment_block(), + }, + indent=2, + ) + + "\n" + ) + print(f"wrote {ARTIFACT}") + print("e9 transition mix:", artifact["e9_transitions"]["transition_rates"]) + stay = artifact["e9_transitions"]["earnings_change"]["stay"] + print( + "stay: median log-change", + stay["median_log_change"], + "floor", + stay["floor_abs_median_gap"]["mean"], + ) + + +if __name__ == "__main__": + main() diff --git a/scripts/build_sipp_spell_floors.py b/scripts/build_sipp_spell_floors.py new file mode 100644 index 00000000..7e0667c6 --- /dev/null +++ b/scripts/build_sipp_spell_floors.py @@ -0,0 +1,338 @@ +"""Build pre-IC3 SIPP job-spell noise-floor references (#192). + +REPORTED ANCHOR, NOT A GATE RUN: IC3 (the +employer gate block) has not locked, no thresholds are proposed +here, and v1 pinning does not ratify anything. Like the disability floors, +this commits the person-disjoint half-vs-half sampling-noise floor +that pre-registered E4/E5 thresholds would later be derived from, +so the floor-building method is on the record before any candidate +model exists (issue #192 protocol: floors -> thresholds -> referee +round -> one-shot runs). + +Moments, computed on the SIPP job-month panel +(:mod:`populace_dynamics.data.sipp_jobs`, reference year 2022 from +the pu2023 file): + +(a) **E4 retention pairs.** Among persons employed in consecutive + reference months m and m+1, the weighted share retaining at + least one employer (same within-panel ``EJB`` job id in both + months), by age band x sex. This is the month-frequency analog + of the plan's "2-window employer-retention persistence". + +(b) **E5 attachment runs.** The weighted distribution of maximal + same-employer run lengths (1-12 months within the reference + year, from :func:`job_spells`), by age band — the view that + catches chained-model persistence understatement. + +(c) **The floor.** For seeds 0-4, persons are split into two + disjoint halves; each cell's rate is computed on both halves + and the across-seed mean and sd of ``|log(rate_a / rate_b)|`` + is the sampling-noise floor for that cell, exactly the + disability-floor convention. Cells with fewer than 200 + unweighted persons per half are reported but flagged thin. + +Thin-flag units (recorded for honesty across the floor battery): +the E4 retention thin flag counts **distinct persons** per half +(``person_id.nunique()``; the underlying rows are person-month +retention pairs, so a person can contribute many rows), while the +E5 runs thin flag counts **rows**, which here equal persons because +the run-length frame has exactly one row per person. Both compare +against the same ``THIN_CELL_PERSONS = 200``. + +Seam caveat (pre-registered on #192): SIPP transitions bunch at +interview seams, and both halves share the seam structure, so this +floor cannot see seam bias — the seam-vs-J2J reconciliation run is +a separate, required artifact before E2/E4 thresholds lock. + +Usage:: + + python scripts/build_sipp_spell_floors.py + +writes ``runs/sipp_spell_floors_v1.json``. +""" + +from __future__ import annotations + +import hashlib +import json +import sys +from pathlib import Path + +import numpy as np +import pandas as pd + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src")) + +from populace_dynamics.contract import environment_block # noqa: E402 +from populace_dynamics.data import sipp_jobs # noqa: E402 + +YEAR = 2023 +SEEDS = (0, 1, 2, 3, 4) +AGE_BANDS = ((16, 24), (25, 34), (35, 44), (45, 54), (55, 64), (65, 99)) +THIN_CELL_PERSONS = 200 + +ARTIFACT = Path(__file__).resolve().parents[1] / ( + "runs/sipp_spell_floors_v1.json" +) +ENV_SIDECAR = ARTIFACT.with_suffix(".env.json") +INPUT_SIDECAR = ARTIFACT.with_suffix(".inputs.json") +OFFICIAL_SOURCE_URL = ( + "https://www2.census.gov/programs-surveys/sipp/data/datasets/" + "2023/pu2023_csv.zip" +) +OFFICIAL_ARCHIVE_SHA256 = ( + "9c5363d56aca2041db20d46d17b81e9be931eb5b18bd5f5238b367d2dd7fb74b" +) +OFFICIAL_ARCHIVE_BYTES = 109_036_604 + + +def _source_pin() -> dict[str, str]: + path = sipp_jobs._resolve_pu_path( # noqa: SLF001 + YEAR, + sipp_jobs._resolve_data_dir(None), # noqa: SLF001 + ) + return { + "path": path.name, + "sha256": hashlib.sha256(path.read_bytes()).hexdigest(), + } + + +def _reader_commit() -> str: + """Last commit touching the SIPP reader in effect for this run.""" + import subprocess + + repo = Path(__file__).resolve().parents[1] + try: + return subprocess.run( + [ + "git", + "log", + "-1", + "--format=%H", + "--", + "src/populace_dynamics/data/sipp_jobs.py", + ], + cwd=repo, + capture_output=True, + text=True, + check=True, + ).stdout.strip() + except Exception: + return "unknown" + + +def _age_band(age: pd.Series) -> pd.Series: + bins = [AGE_BANDS[0][0] - 1, *[hi for _, hi in AGE_BANDS]] + labels = [f"{lo}_{hi}" for lo, hi in AGE_BANDS] + return pd.cut(age, bins=bins, labels=labels) + + +def _half(person_id: pd.Series, seed: int) -> pd.Series: + """Deterministic person-disjoint half assignment.""" + + def bucket(pid: str) -> int: + digest = hashlib.sha256(f"{seed}:{pid}".encode()).digest() + return digest[0] & 1 + + return person_id.map(bucket) + + +def retention_frame(job_months: pd.DataFrame) -> pd.DataFrame: + """One row per person x consecutive-month pair, employed both.""" + person_months = ( + job_months.groupby(["person_id", "month"]) + .agg( + jobs=("job_id", frozenset), + age=("age", "first"), + sex=("sex", "first"), + weight=("weight", "first"), + ) + .reset_index() + ) + nxt = person_months.copy() + nxt["month"] -= 1 + pairs = person_months.merge( + nxt, + on=["person_id", "month"], + suffixes=("", "_next"), + ) + pairs["retained"] = [ + bool(a & b) for a, b in zip(pairs.jobs, pairs.jobs_next, strict=True) + ] + pairs["age_band"] = _age_band(pairs["age"]) + return pairs[pairs["age_band"].notna()] + + +def run_length_frame(job_months: pd.DataFrame) -> pd.DataFrame: + """One row per person: longest same-employer run in the year.""" + spells = sipp_jobs.job_spells(job_months) + person_attrs = job_months.groupby("person_id").agg( + age=("age", "first"), weight=("weight", "first") + ) + longest = spells.groupby("person_id")["n_months"].max() + out = person_attrs.join(longest).dropna(subset=["n_months"]) + out["age_band"] = _age_band(out["age"]) + return out[out["age_band"].notna()].reset_index() + + +def _weighted_rate(frame: pd.DataFrame, flag: str) -> float: + total = frame["weight"].sum() + return float((frame["weight"] * frame[flag]).sum() / total) + + +def floors_for_retention(pairs: pd.DataFrame) -> dict: + cells = {} + for (band, sex), cell in pairs.groupby(["age_band", "sex"], observed=True): + gaps = [] + halves_n = [] + for seed in SEEDS: + half = _half(cell["person_id"], seed) + a = cell[half == 0] + b = cell[half == 1] + halves_n.append( + min(a["person_id"].nunique(), b["person_id"].nunique()) + ) + ra, rb = ( + _weighted_rate(a, "retained"), + _weighted_rate(b, "retained"), + ) + gaps.append(abs(np.log(ra / rb))) + cells[f"{band}|sex{int(sex)}"] = { + "rate": round(_weighted_rate(cell, "retained"), 4), + "pairs_unweighted": int(len(cell)), + "floor_abs_log_ratio_mean": round(float(np.mean(gaps)), 5), + "floor_abs_log_ratio_sd": round(float(np.std(gaps)), 5), + "thin": bool(min(halves_n) < THIN_CELL_PERSONS), + } + return cells + + +def floors_for_runs(runs: pd.DataFrame) -> dict: + runs = runs.assign(long_run=runs["n_months"] >= 12) + cells = {} + for band, cell in runs.groupby("age_band", observed=True): + gaps = [] + halves_n = [] + for seed in SEEDS: + half = _half(cell["person_id"], seed) + a, b = cell[half == 0], cell[half == 1] + halves_n.append(min(len(a), len(b))) + ra, rb = ( + _weighted_rate(a, "long_run"), + _weighted_rate(b, "long_run"), + ) + gaps.append(abs(np.log(ra / rb))) + cells[str(band)] = { + "full_year_run_share": round(_weighted_rate(cell, "long_run"), 4), + "persons_unweighted": int(len(cell)), + "floor_abs_log_ratio_mean": round(float(np.mean(gaps)), 5), + "floor_abs_log_ratio_sd": round(float(np.std(gaps)), 5), + "thin": bool(min(halves_n) < THIN_CELL_PERSONS), + } + return cells + + +def build() -> dict: + job_months = sipp_jobs.read_sipp_job_months(YEAR) + pairs = retention_frame(job_months) + runs = run_length_frame(job_months) + return { + "artifact": "sipp_spell_floors", + "version": "v1", + "status": ( + "PRE-LOCK REFERENCE - NOT RATIFIED; IC3 not locked; no " + "thresholds. v1 is a pinning event, not a ratification" + ), + "issue": "192", + "deployment_scale_note": ( + "RECORDED GAP (review of #212): these floors are " + "half-vs-half, i.e. the sampling noise of ~50%-of-source " + "estimates, while IC3 proposes scoring on a 0.20 person " + "holdout - there is no candidate-context floor (gate-1 " + "ctx20 analog). Under root-n scaling, a 20% scoring " + "frame has ~sqrt(0.5/0.2)=1.58x the sampling noise of " + "the half-split basis, so these floors are mildly " + "ANTI-conservative (too tight), not conservative. " + "RECORDED_NOT_SATISFIED: IC3 must accept a registered " + "analytic scale adjustment or require matching-context " + "floors before candidate runs." + ), + "source": f"pu{YEAR} (reference year {YEAR - 1})", + "method": ( + "person-disjoint sha256 half-splits, seeds 0-4; per-cell " + "|log(rate_a/rate_b)| mean/sd across seeds; weighted by " + "WPFINWGT" + ), + "seam_caveat": ( + "both halves share SIPP seam structure; the seam-vs-J2J " + "reconciliation run is a separate required artifact " + "before IC3 thresholds lock" + ), + "thin_flag_units": { + "e4_retention_by_age_sex": ( + "distinct persons per half (person_id.nunique(); " + "rows are person-month retention pairs) vs " + "THIN_CELL_PERSONS=200" + ), + "e5_runs_by_age": ( + "rows per half, equal to persons (one row per " + "person in the run-length frame) vs " + "THIN_CELL_PERSONS=200" + ), + }, + "sipp_jobs_reader_commit": _reader_commit(), + "source_input": _source_pin(), + "e4_retention_by_age_sex": floors_for_retention(pairs), + "e5_runs_by_age": floors_for_runs(runs), + } + + +def main() -> None: + artifact = build() + ARTIFACT.write_text(json.dumps(artifact, indent=2) + "\n") + staged_path = sipp_jobs._resolve_pu_path( # noqa: SLF001 + YEAR, + sipp_jobs._resolve_data_dir(None), # noqa: SLF001 + ) + INPUT_SIDECAR.write_text( + json.dumps( + { + "artifact": ARTIFACT.name, + "status": "SOURCE_INPUT_DIGESTS", + "official_source": { + "url": OFFICIAL_SOURCE_URL, + "archive_sha256": OFFICIAL_ARCHIVE_SHA256, + "archive_bytes": OFFICIAL_ARCHIVE_BYTES, + "archive_member": "pu2023.csv", + }, + "staged_input": { + **artifact["source_input"], + "bytes": staged_path.stat().st_size, + "transport_note": ( + "gzip -n recompression of the sole CSV member " + "from the verified official Census ZIP" + ), + }, + }, + indent=2, + ) + + "\n" + ) + ENV_SIDECAR.write_text( + json.dumps( + { + "artifact": ARTIFACT.name, + "status": "MEASUREMENT_ENVIRONMENT", + "environment": environment_block(), + }, + indent=2, + ) + + "\n" + ) + print(f"wrote {ARTIFACT}") + e4 = artifact["e4_retention_by_age_sex"] + print(f"E4 cells: {len(e4)}; example:", next(iter(e4.items()))) + + +if __name__ == "__main__": + main() diff --git a/scripts/build_tenure_floors.py b/scripts/build_tenure_floors.py new file mode 100644 index 00000000..aa0cb924 --- /dev/null +++ b/scripts/build_tenure_floors.py @@ -0,0 +1,317 @@ +"""Build pre-IC3 CPS tenure noise-floor references for gate E3 (#192). + +REPORTED ANCHOR, NOT A GATE RUN: IC3 has not locked and no thresholds +are proposed; v1 pinning does not ratify anything. E3's moment is the +tenure distribution (P25/P50/P75) by age band against the CPS +January supplement; this commits the person-disjoint half-vs-half +sampling-noise floor those thresholds would later be derived from, +completing the tenure side of Workstream A's floor battery +(companion to the E4/E5 SIPP floors). + +Method mirrors the spell floors: for seeds 0-4, persons split into +two disjoint sha256 halves; each cell's weighted P25/P50/P75 of +``tenure_years`` is computed on both halves and the across-seed +mean and sd of the absolute quantile gap **in years** is the floor +(quantiles are in interpretable units, so the gap is reported in +years rather than a log ratio). Reported tenure heaps hard on +integers, so half-vs-half quantile gaps are frequently EXACTLY zero +(both halves' quantiles land on the same heap) — a degenerate basis +for a "quantile error vs floor" criterion. Each cell therefore also +carries a weighted-ECDF max-gap (Kolmogorov-style) floor, which is +smooth under heaping; the IC3 round can choose between the quantile +and distributional formulations with both on the record. All three +staged supplements +(2020/2022/2024) are floored independently — the across-year spread +of the floors is itself informative about supplement-to-supplement +stability. Cells with fewer than 200 unweighted persons per half +are flagged thin. + +Thin-flag units: the thin flag counts **rows** per half, which +equal persons because the CPS tenure frame has one record per +person, against ``THIN_CELL_PERSONS = 200`` (the same constant the +SIPP spell floors use, where E4 and E9 count distinct persons — +units are recorded per artifact). + +Usage:: + + python scripts/build_tenure_floors.py + +writes ``runs/tenure_floors_v1.json``. +""" + +from __future__ import annotations + +import hashlib +import json +import sys +from pathlib import Path + +import numpy as np + +REPO = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(REPO / "src")) + +from populace_dynamics.contract import environment_block # noqa: E402 +from populace_dynamics.data import cps_tenure # noqa: E402 + +YEARS = (2020, 2022, 2024) +SEEDS = (0, 1, 2, 3, 4) +QUANTILES = (0.25, 0.50, 0.75) +THIN_CELL_PERSONS = 200 + +ARTIFACT = REPO / "runs/tenure_floors_v1.json" +ENV_SIDECAR = ARTIFACT.with_suffix(".env.json") +INPUT_SIDECAR = ARTIFACT.with_suffix(".inputs.json") +OFFICIAL_SOURCE_URL = ( + "https://www2.census.gov/programs-surveys/cps/datasets/" + "{year}/supp/jan{yy:02d}pub.csv" +) + + +def _source_pins() -> list[dict[str, str]]: + data_dir = cps_tenure._resolve_data_dir(None) # noqa: SLF001 + pins = [] + for year in YEARS: + path = cps_tenure._resolve_person_path(year, data_dir) # noqa: SLF001 + pins.append( + { + "year": str(year), + "path": path.name, + "sha256": hashlib.sha256(path.read_bytes()).hexdigest(), + } + ) + return pins + + +def _reader_commit() -> str: + """Last commit touching the CPS tenure reader for this run.""" + import subprocess + + try: + return subprocess.run( + [ + "git", + "log", + "-1", + "--format=%H", + "--", + "src/populace_dynamics/data/cps_tenure.py", + ], + cwd=REPO, + capture_output=True, + text=True, + check=True, + ).stdout.strip() + except Exception: + return "unknown" + + +def _half(person_id: str, seed: int) -> int: + digest = hashlib.sha256(f"{seed}:{person_id}".encode()).digest() + return digest[0] & 1 + + +def _weighted_quantile(values, weights, q: float) -> float: + order = np.argsort(values, kind="stable") + values = np.asarray(values)[order] + weights = np.asarray(weights)[order] + cum = np.cumsum(weights) - 0.5 * weights + cum /= weights.sum() + return float(np.interp(q, cum, values)) + + +def _weighted_ecdf_max_gap(a_values, a_weights, b_values, b_weights): + """Max |F_a(x) - F_b(x)| over the union grid of observed values.""" + grid = np.union1d(a_values, b_values) + + def ecdf(values, weights): + order = np.argsort(values, kind="stable") + v = np.asarray(values)[order] + w = np.asarray(weights)[order] + cum = np.cumsum(w) / w.sum() + idx = np.searchsorted(v, grid, side="right") - 1 + return np.where(idx >= 0, cum[idx], 0.0) + + return float( + np.max(np.abs(ecdf(a_values, a_weights) - ecdf(b_values, b_weights))) + ) + + +def floors_for_year(year: int) -> dict: + records = cps_tenure.read_cps_tenure(year) + usable = records[ + records["tenure_years"].notna() & (records["weight"] > 0) + ].copy() + labels = [f"{lo}_{hi}" for lo, hi in cps_tenure.DEFAULT_AGE_BANDS] + import pandas as pd + + usable["age_band"] = pd.cut( + usable["age"], + bins=[cps_tenure.DEFAULT_AGE_BANDS[0][0] - 1] + + [hi for _, hi in cps_tenure.DEFAULT_AGE_BANDS], + labels=labels, + ) + usable = usable[usable["age_band"].notna()] + + cells = {} + for band, cell in usable.groupby("age_band", observed=True): + values = cell["tenure_years"].to_numpy(dtype=float) + weights = cell["weight"].to_numpy(dtype=float) + point = { + f"p{int(q * 100)}": round( + _weighted_quantile(values, weights, q), 2 + ) + for q in QUANTILES + } + halves = cell["person_id"].map( + lambda pid: [_half(pid, seed) for seed in SEEDS] + ) + gaps: dict[str, list[float]] = { + f"p{int(q * 100)}": [] for q in QUANTILES + } + ks_gaps: list[float] = [] + thin = False + for i, _seed in enumerate(SEEDS): + mask_a = halves.map(lambda h, i=i: h[i] == 0) + a, b = cell[mask_a], cell[~mask_a] + if min(len(a), len(b)) < THIN_CELL_PERSONS: + thin = True + for q in QUANTILES: + qa = _weighted_quantile( + a["tenure_years"].to_numpy(dtype=float), + a["weight"].to_numpy(dtype=float), + q, + ) + qb = _weighted_quantile( + b["tenure_years"].to_numpy(dtype=float), + b["weight"].to_numpy(dtype=float), + q, + ) + gaps[f"p{int(q * 100)}"].append(abs(qa - qb)) + ks_gaps.append( + _weighted_ecdf_max_gap( + a["tenure_years"].to_numpy(dtype=float), + a["weight"].to_numpy(dtype=float), + b["tenure_years"].to_numpy(dtype=float), + b["weight"].to_numpy(dtype=float), + ) + ) + cells[str(band)] = { + **point, + "persons_unweighted": int(len(cell)), + "floor_abs_gap_years": { + name: { + "mean": round(float(np.mean(values)), 3), + "sd": round(float(np.std(values)), 3), + } + for name, values in gaps.items() + }, + "floor_ecdf_max_gap": { + "mean": round(float(np.mean(ks_gaps)), 4), + "sd": round(float(np.std(ks_gaps)), 4), + }, + "thin": thin, + } + return cells + + +def build() -> dict: + return { + "artifact": "tenure_floors", + "version": "v1", + "status": ( + "PRE-LOCK REFERENCE - NOT RATIFIED; IC3 not locked; no " + "thresholds. v1 is a pinning event, not a ratification" + ), + "issue": "192", + "deployment_scale_note": ( + "RECORDED GAP (review of #212): these floors are " + "half-vs-half, i.e. the sampling noise of ~50%-of-source " + "estimates, while IC3 proposes scoring on a 0.20 person " + "holdout - there is no candidate-context floor (gate-1 " + "ctx20 analog). Under root-n scaling, a 20% scoring " + "frame has ~sqrt(0.5/0.2)=1.58x the sampling noise of " + "the half-split basis, so these floors are mildly " + "ANTI-conservative (too tight), not conservative. " + "RECORDED_NOT_SATISFIED: IC3 must accept a registered " + "analytic scale adjustment or require matching-context " + "floors before candidate runs." + ), + "source": "CPS January supplements 2020/2022/2024 (PTST1TN, " + "PWTENWGT); reader per #205", + "method": ( + "person-disjoint sha256 half-splits, seeds 0-4; per-cell " + "absolute weighted-quantile gap in years AND weighted-ECDF " + "max gap (heaping-robust), mean/sd across seeds; BLS age " + "bands" + ), + "heaping_caveat": ( + "reported tenure heaps on integers, so half-vs-half " + "quantile gaps are frequently exactly zero (36/63 cells " + "in the first build) - a degenerate threshold basis; the " + "ECDF max-gap floor is the heaping-robust alternative " + "for the IC3 round to choose between" + ), + "thin_flag_units": ( + "rows per half, equal to persons (one CPS record per " + "person) vs THIN_CELL_PERSONS=200" + ), + "cps_tenure_reader_commit": _reader_commit(), + "source_inputs": _source_pins(), + "by_year": {str(year): floors_for_year(year) for year in YEARS}, + } + + +def main() -> None: + artifact = build() + ARTIFACT.write_text(json.dumps(artifact, indent=2) + "\n") + data_dir = cps_tenure._resolve_data_dir(None) # noqa: SLF001 + INPUT_SIDECAR.write_text( + json.dumps( + { + "artifact": ARTIFACT.name, + "status": "SOURCE_INPUT_DIGESTS", + "source_inputs": [ + { + **source, + "bytes": cps_tenure._resolve_person_path( # noqa: SLF001 + int(source["year"]), data_dir + ) + .stat() + .st_size, + "official_url": OFFICIAL_SOURCE_URL.format( + year=int(source["year"]), + yy=int(source["year"]) % 100, + ), + } + for source in artifact["source_inputs"] + ], + }, + indent=2, + ) + + "\n" + ) + ENV_SIDECAR.write_text( + json.dumps( + { + "artifact": ARTIFACT.name, + "status": "MEASUREMENT_ENVIRONMENT", + "environment": environment_block(), + }, + indent=2, + ) + + "\n" + ) + print(f"wrote {ARTIFACT}") + y24 = artifact["by_year"]["2024"] + example = y24["35_44"] + print( + "example 35_44 (2024): p50 =", + example["p50"], + "floor(p50) =", + example["floor_abs_gap_years"]["p50"], + ) + + +if __name__ == "__main__": + main() diff --git a/scripts/check_j2jod_margin_agreement.py b/scripts/check_j2jod_margin_agreement.py new file mode 100644 index 00000000..831b4042 --- /dev/null +++ b/scripts/check_j2jod_margin_agreement.py @@ -0,0 +1,156 @@ +"""Cross-source check: LED tool J2JOD margins vs the LEHD flat file. + +Reproduces the corrected margin caveat in +``data/external/employer_firm_target_sources.md`` entry 6. + +Two independent publications of the same quantity — the national +J2JOD firm-size margins — disagree, and the size of that +disagreement is the point. E11's constraints after 2016Q1 are +margins-only (the origin x destination detail is suppressed from +2016Q2), so cross-source wobble on the margins is a noise datum for +the E11 floor build rather than a provenance footnote. + +The earlier version of the caveat attributed the gap to the flat +file's inclusion of public-sector ("N" firm size) flows. That +explanation predicts the tool's margin sits *below* the flat file in +every quarter. It sits above in 37 of 41. The deviations run both +ways, consistent with independent noise infusion applied to the two +tabulations. + +Run from the repository root:: + + .venv/bin/python scripts/check_j2jod_margin_agreement.py +""" + +from __future__ import annotations + +import gzip +import io +import sys +import urllib.request +from pathlib import Path + +import pandas as pd + +ROOT = Path(__file__).resolve().parents[1] +EXTRACT = ROOT / "data" / "external" / "j2jod_us_firmsize_od_2015on.csv" + +#: The one-sided-margin flat file, release-stamped (not +#: ``latest_release``, which is a moving alias). +FLAT_URL = ( + "https://lehd.ces.census.gov/data/j2j/R2026Q1/us/j2jod/" + "j2jod_us_d_fs_gn_ns_oslp_u.csv.gz" +) + +#: The all-demographics / all-industry / all-firm-age national cell. +#: Both the destination-side and the ``_orig``-side dimensions must +#: be pinned: the flat file carries sector-crossed rows on each side, +#: and filtering only one side silently multiplies the row count. +MARGIN_FILTER = { + "ind_level": "A", + "industry": "00", + "ind_level_orig": "A", + "industry_orig": "00", + "sex": 0, + "agegrp": "A00", + "race": "A0", + "ethnicity": "A0", + "education": "E0", + "firmage": "0", + "firmage_orig": "0", + "ownercode": "A00", + "ownercode_orig": "A00", +} + +FIRST_YEAR = 2015 + + +def load_flat() -> pd.DataFrame: + """Download and filter the flat file to the national margin.""" + print(f"downloading {FLAT_URL}") + with urllib.request.urlopen(FLAT_URL, timeout=300) as resp: + payload = gzip.decompress(resp.read()) + frame = pd.read_csv(io.BytesIO(payload), low_memory=False) + mask = frame["year"] >= FIRST_YEAR + for column, value in MARGIN_FILTER.items(): + mask &= frame[column].astype(type(value)) == value + out = frame[mask].copy() + out["fo"] = out["firmsize_orig"].astype(str) + out["fd"] = out["firmsize"].astype(str) + return out + + +def compare(flat: pd.DataFrame, tool: pd.DataFrame, fo: str, fd: str): + """Percent deviation of the tool's EE from the flat file's.""" + a = flat[(flat.fo == fo) & (flat.fd == fd)][ + ["year", "quarter", "EE"] + ].rename(columns={"EE": "flat"}) + b = tool[(tool.fo == fo) & (tool.fd == fd)][ + ["year", "quarter", "EE"] + ].rename(columns={"EE": "tool"}) + merged = a.merge(b, on=["year", "quarter"]).dropna() + merged = merged[merged["flat"] > 0] + if merged.empty: + return None + merged["pct"] = (merged.tool - merged.flat) / merged.flat * 100 + return merged + + +def main() -> None: + tool = pd.read_csv(EXTRACT) + tool["fo"] = tool["firmsize_orig"].astype(str) + tool["fd"] = tool["firmsize"].astype(str) + flat = load_flat() + + rows = [("all-size EE margin", "0", "0")] + rows += [(f"dest margin size {c}", "0", c) for c in "12345"] + rows += [(f"orig margin size {c}", c, "0") for c in "12345"] + + print( + f"\n{'comparison':24s} {'n':>3} {'above':>8} " + f"{'min%':>7} {'max%':>7} {'mean%':>7}" + ) + lo: list[float] = [] + hi: list[float] = [] + headline = None + for label, fo, fd in rows: + merged = compare(flat, tool, fo, fd) + if merged is None: + continue + n = len(merged) + above = int((merged.pct > 0).sum()) + print( + f"{label:24s} {n:3d} {above:4d}/{n:<3d} " + f"{merged.pct.min():7.2f} {merged.pct.max():7.2f} " + f"{merged.pct.mean():7.2f}" + ) + if label.startswith("all-size"): + headline = (n, above) + else: + lo.append(merged.pct.min()) + hi.append(merged.pct.max()) + + if headline is None or not lo: + sys.exit("no comparable cells; the flat-file layout changed") + + n, above = headline + print( + f"\nall-size margin: tool above flat in {above}/{n} quarters" + f"\nper-size envelope: {min(lo):.2f}% to {max(hi):.2f}%" + ) + # A pure size-N exclusion would put the tool below the flat file + # in every quarter. State the refutation rather than leaving the + # reader to infer it from the table. + if above > n / 2: + print( + "\nThe tool's margin is above the flat file in a majority " + "of quarters, so the gap is not the flat file's extra " + "public-sector ('N') flows: that would bias the tool's " + "margin downward everywhere. Two-sided deviations of " + "this size are consistent with independent noise " + "infusion on the two tabulations." + ) + + +if __name__ == "__main__": + main() diff --git a/scripts/fetch_employer_firm_targets.py b/scripts/fetch_employer_firm_targets.py index 1ed32d80..7973bd1f 100644 --- a/scripts/fetch_employer_firm_targets.py +++ b/scripts/fetch_employer_firm_targets.py @@ -28,6 +28,26 @@ job-to-job hire/separation flows by firm size x NAICS sector, 2015Q1 on (the ``year >= 2015`` filter; matches the provenance note). Feeds E11's national margin. +* **J2J R2026Q1 (us, sex x age, no firm characteristics)** -- national + job-to-job hire/separation flows by sex x age group, all-industry + margin only (the committed-extract size cap rules out the full + sector detail), 2015Q1 on. Feeds gate E2's age x sex + separation/hire/J2J rate references. NOTE: LEHD calls the sex x + age tabulation ``sa`` (``se`` is sex x *education*). +* **J2JOD R2026Q1 (us, origin x destination firm size)** -- national + job-to-job flows by origin firm size x destination firm size, + 2015Q1 on. Feeds gate E11's origin/destination size-ladder + reference. The LEHD flat J2JOD files publish only the one-sided + firm-size margins, so the full cross comes from the LED Extraction + Tool query API (``ledextract.ces.census.gov``), which serves + whatever release is current and reports no release identifier of + its own (its schema version V4.14.0 is the *software* version and + is identical across R2026Q1 and R2026Q2, so it cannot pin the + release -- see the provenance note). The full detail is released + for 2015Q1-2016Q1 only; later quarters are suppressed (status + flag 11) and only the margins remain published. Because the tool + re-runs the query live, that only-ever detail window is archived + under ``data/external/raw/`` and is the builder's default input. Run from the repository root:: @@ -42,7 +62,11 @@ import gzip import hashlib +import io +import json import tempfile +import urllib.error +import urllib.parse import urllib.request from pathlib import Path @@ -52,6 +76,9 @@ OUT_DIR = ROOT / "data" / "external" RETRIEVED = "2026-07-14" +#: Fetch date of the second-wave extracts (sex x age J2J, J2JOD +#: origin x destination firm size). +RETRIEVED_WAVE2 = "2026-07-17" #: Pinned raw source files: url -> sha256 of the download performed on #: RETRIEVED. A digest mismatch means the agency re-issued the file; @@ -83,6 +110,15 @@ "j2j_us_d_fs_gn_ns_oslp_u.csv.gz", "abdd573d414d66f864828952501cee0a6ef6c8db88cb789da38af1a3" "c9d55c6f", ), + "j2j_us_sa_f_gn_ns_oslp_u.csv.gz": ( + "https://lehd.ces.census.gov/data/j2j/R2026Q1/us/j2j/" + "j2j_us_sa_f_gn_ns_oslp_u.csv.gz", + "0e043fc8796bd3e11231ff6d174fdfebed926c9d40da4f069a3ad31e" "ed55aba0", + ), + "label_agegrp.csv": ( + "https://lehd.ces.census.gov/data/schema/latest/" "label_agegrp.csv", + "eb478c6eda6c12a57609afaf89bbb42dd4d9fb2ee883f6dd0399fb71" "7b27889b", + ), "label_firmsize.csv": ( "https://lehd.ces.census.gov/data/schema/latest/" "label_firmsize.csv", "29dfd8fed594be600c6c554b4cb27bd590c45da549c30e32824cea42" "48dffe1f", @@ -103,6 +139,93 @@ 5: "500+ Employees", } +#: LEHD sex code -> label (pinned from the J2J schema). +SEX_LABELS = {0: "All Sexes", 1: "Male", 2: "Female"} + +#: LEHD age-group code -> label (pinned from label_agegrp.csv). +AGEGRP_LABELS = { + "A00": "All Ages (14-99)", + "A01": "14-18", + "A02": "19-21", + "A03": "22-24", + "A04": "25-34", + "A05": "35-44", + "A06": "45-54", + "A07": "55-64", + "A08": "65-99", +} + +# ---------------------------------------------------------------- +# LED Extraction Tool (the J2JOD origin x destination firm-size +# cross is not published in the LEHD flat files -- they carry only +# the one-sided firm-size margins -- so it is pulled through the +# LED Extraction Tool's query API instead). +# ---------------------------------------------------------------- + +LED_BASE = "https://ledextract.ces.census.gov" + +#: Query submitted to the LED Extraction Tool (POST /j2j/download). +#: ``oq`` is the ordinal quarter, year * 4 + (quarter - 1): +#: 8060 = 2015Q1 .. 8100 = 2025Q1 (the last quarter in R2026Q1). +#: Origin-destination queries must carry the ``*_orig`` keys. +LED_J2JOD_REQUEST = { + "version": "V4.14.0", + "seasonadj": ["U"], + "geography": ["00"], + "geography_orig": ["00"], + "industry": ["00"], + "industry_orig": ["00"], + "firmage": ["0"], + "firmage_orig": ["0"], + "firmsize": ["0", "1", "2", "3", "4", "5"], + "firmsize_orig": ["0", "1", "2", "3", "4", "5"], + "sex": ["0"], + "agegrp": ["A00"], + "education": ["E0"], + "race": ["A0"], + "ethnicity": ["A0"], + "indicator": ["J2J", "EE", "AQHire", "J2JS", "EES", "AQHireS"], + "oq": list(range(8060, 8101)), + "export_labels": False, +} + +#: The archived raw tool response. The LED Extraction Tool serves +#: only its *current* release and re-runs the query live, so the +#: 2015Q1-2016Q1 origin x destination detail window -- the only +#: window in which that cross is published at all (see the +#: detail-window note in the provenance file) -- would be +#: unrecoverable the day the tool stops serving it. The response is +#: therefore committed, and it is the default input: a fetch is a +#: *verification* path, not the only path to the data. +LED_J2JOD_ARCHIVE = OUT_DIR / "raw" / "led_j2jod_us_fsfs_2015on.csv.gz" + +#: sha256 of the archived response bytes, as served on 2026-07-23. +LED_J2JOD_SHA256 = ( + "7afad9f408319c54e7e7d802b068723e346f49c840d4fe861e7e55d9" "528d3944" +) + +#: sha256 of the response's *content*, canonicalised (columns sorted, +#: rows sorted by year/quarter/firmsize_orig/firmsize, fixed float +#: format) before hashing. +#: +#: This -- not the byte digest -- is the integrity pin, because the +#: byte digest is not a property of the data. The response first +#: pinned on this PR (``adbd16e2...``) stopped matching six days +#: later while every one of the 1,476 rows was unchanged, value for +#: value: the tool had merely reordered its measure columns +#: (``EE,AQHire,EES,AQHireS,J2J,J2JS`` where it previously emitted +#: ``EE,AQHire,J2J,EES,AQHireS,J2JS``). A pin that fires on cosmetic +#: reordering is worse than no pin: it trains the reader to re-pin +#: on sight, so the one failure that matters -- an actual revision -- +#: arrives looking exactly like the six false alarms before it. +#: Byte drift is now reported and tolerated; content drift raises. +LED_J2JOD_CONTENT_SHA256 = ( + "c52ec512bc3f478d6426efb7b03cccbe1edc952309214030ed53eb42" "f7a83354" +) + +#: Key columns defining canonical row order for the content digest. +LED_J2JOD_KEY = ["year", "quarter", "firmsize_orig", "firmsize"] + QWI_MEASURES = [ "Emp", "EmpEnd", @@ -136,6 +259,127 @@ ] +J2JOD_MEASURES = ["EE", "AQHire", "J2J", "EES", "AQHireS", "J2JS"] + + +class _NoRedirect(urllib.request.HTTPRedirectHandler): + """Surface the LED tool's 303 instead of following it (the + redirect target is the HTML results page; the CSV lives at + ``download.csv`` with the same query string).""" + + def redirect_request(self, *args, **kwargs): + return None + + +def led_j2jod_content_digest(path: Path) -> str: + """Canonical content digest of a raw LED J2JOD response. + + Columns sorted, rows sorted by :data:`LED_J2JOD_KEY`, fixed float + format — so the digest is a property of the *data*, invariant to + the tool's column ordering (see :data:`LED_J2JOD_CONTENT_SHA256` + for why that distinction is load-bearing). + """ + frame = pd.read_csv(path, low_memory=False) + canonical = ( + frame[sorted(frame.columns)] + .sort_values(LED_J2JOD_KEY) + .reset_index(drop=True) + ) + buf = io.StringIO() + canonical.to_csv(buf, index=False, float_format="%.10g") + return hashlib.sha256(buf.getvalue().encode()).hexdigest() + + +def _verify_led_j2jod(path: Path) -> Path: + """Verify a raw response by content, reporting byte drift.""" + content = led_j2jod_content_digest(path) + if content != LED_J2JOD_CONTENT_SHA256: + raise RuntimeError( + f"LED J2JOD extract: content sha256 {content} != pinned " + f"{LED_J2JOD_CONTENT_SHA256}. Values changed, not just " + "the response layout — LEHD revises across releases, so " + "re-pin only after diffing the cells and updating the " + "provenance note with the new release." + ) + # LED_J2JOD_SHA256 pins the *uncompressed* response bytes, so the + # archive path must be decompressed before hashing. Hashing the + # .gz container against it made this note fire on every default + # run — a permanently-lit byte-drift channel is one nobody reads, + # which is exactly how a real byte-only change goes unnoticed. + raw = path.read_bytes() + if path.suffix == ".gz": + raw = gzip.decompress(raw) + digest = hashlib.sha256(raw).hexdigest() + if digest != LED_J2JOD_SHA256: + # Cause unknown by construction: the content pin above has + # already passed, so the values are identical and the change + # is in the layout (column order, quoting, line endings, ...). + # Naming one cause here would be a guess. + print( + f"note: LED J2JOD response bytes changed ({digest[:12]} != " + f"{LED_J2JOD_SHA256[:12]}) while every value is unchanged; " + "a layout-only difference. Not an error." + ) + return path + + +def fetch_led_j2jod(cache_dir: Path, *, live: bool = False) -> Path: + """Return the raw J2JOD firm-size cross, verified by content. + + Reads the committed archive (:data:`LED_J2JOD_ARCHIVE`) by + default: the tool serves only its current release, so the + 2015Q1-2016Q1 detail window it carries is not re-fetchable in + perpetuity and the archive is the durable copy. + + With ``live=True``, re-queries the tool instead — POST the JSON + query to ``/j2j/download``; it answers 303 with the encoded query + string, and ``/j2j/download.csv?`` serves the extract — + and verifies the result against the same content digest. That is + the path that detects a genuine LEHD revision. + """ + if not live: + if not LED_J2JOD_ARCHIVE.exists(): + raise FileNotFoundError( + f"Archived LED J2JOD response missing at " + f"{LED_J2JOD_ARCHIVE}; re-fetch with live=True only " + "if the tool still serves the detail window." + ) + return _verify_led_j2jod(LED_J2JOD_ARCHIVE) + + path = cache_dir / "led_j2jod_us_fsfs_2015on.csv" + if not path.exists(): + print("querying the LED Extraction Tool (J2JOD firm-size cross)") + req = urllib.request.Request( + LED_BASE + "/j2j/download", + data=json.dumps(LED_J2JOD_REQUEST).encode(), + headers={ + "Content-Type": "application/json", + "User-Agent": "populace-dynamics fetch script", + }, + ) + opener = urllib.request.build_opener(_NoRedirect()) + try: + resp = opener.open(req, timeout=300) + raise RuntimeError( + "LED Extraction Tool did not redirect (HTTP " + f"{resp.status}); the query API may have changed." + ) + except urllib.error.HTTPError as err: + if err.code != 303: + raise + location = err.headers["Location"] + query = urllib.parse.urlsplit(location).query + csv_req = urllib.request.Request( + LED_BASE + "/j2j/download.csv?" + query, + headers={"User-Agent": "populace-dynamics fetch script"}, + ) + tmp = path.with_suffix(path.suffix + ".part") + with urllib.request.urlopen(csv_req, timeout=300) as resp: + tmp.write_bytes(resp.read()) + tmp.replace(path) + return _verify_led_j2jod(path) + + def fetch(name: str, cache_dir: Path) -> Path: """Download (or reuse) a pinned raw file and verify its sha256.""" url, expected = SOURCES[name] @@ -289,6 +533,72 @@ def build_j2j(cache_dir: Path) -> None: print(f"j2j_us_firmsize_sector_2015on.csv: {len(out)} rows") +def build_j2j_sexage(cache_dir: Path) -> None: + """National J2J flows by sex x age group (all-industry margin). + + The raw ``sa`` file is sex x age x NAICS sector; the committed + extract keeps the all-industry margin (``industry == "00"``) only + -- with the full sector detail the file would breach the 1 MB + extract cap -- but keeps the complete sex (0-2) x age (A00-A08) + grid, margins included, so aggregation identities stay testable. + Pure row/column filter, no re-aggregation, from LEHD_START_YEAR + on. + """ + path = fetch("j2j_us_sa_f_gn_ns_oslp_u.csv.gz", cache_dir) + with gzip.open(path, "rt") as fh: + raw = pd.read_csv(fh, low_memory=False) + keep = raw[ + (raw["year"] >= LEHD_START_YEAR) + & (raw["industry"].astype(str) == "00") + ].copy() + id_cols = ["year", "quarter", "sex", "agegrp"] + flag_cols = [f"s{m}" for m in J2J_MEASURES] + out = keep[id_cols + J2J_MEASURES + flag_cols].copy() + out.insert(3, "sex_label", out["sex"].map(SEX_LABELS)) + out.insert(5, "agegrp_label", out["agegrp"].map(AGEGRP_LABELS)) + out = out.sort_values(id_cols).reset_index(drop=True) + out.to_csv( + OUT_DIR / "j2j_us_sexage_2015on.csv", + index=False, + float_format="%.10g", + ) + print(f"j2j_us_sexage_2015on.csv: {len(out)} rows") + + +def build_j2jod_firmsize(cache_dir: Path) -> None: + """National J2J flows by origin x destination firm size. + + From the LED Extraction Tool (see :func:`fetch_led_j2jod`); the + committed extract keeps the full 6 x 6 grid (codes 0-5 on both + sides: the 25 detail cells plus the tool's aggregated margins, + status flag 10/12). Column subset and sort only, no + re-aggregation. Suppressed cells (status flag 11) load as NaN. + NOTE: the tool's margins are aggregates of the firm-size-coded + tabulation and do **not** sit systematically below the flat-file + ``d_fs`` margins: checked across all 41 quarters the tool is + *above* in 37, deviating −1.00% to +2.02% (mean +0.75%). The + public-sector (firm size "N") explanation is refuted by that + direction — excluding size N could only bias the tool downward. + The gap is dominated by independent noise infusion applied to the + two tabulations; see the provenance note and + ``scripts/check_j2jod_margin_agreement.py``. + """ + raw = pd.read_csv(fetch_led_j2jod(cache_dir), low_memory=False) + keep = raw[raw["year"] >= LEHD_START_YEAR].copy() + id_cols = ["year", "quarter", "firmsize_orig", "firmsize"] + flag_cols = [f"s{m}" for m in J2JOD_MEASURES] + out = keep[id_cols + J2JOD_MEASURES + flag_cols].copy() + out.insert(4, "firmsize_orig_label", _firmsize_label(out["firmsize_orig"])) + out.insert(5, "firmsize_label", _firmsize_label(out["firmsize"])) + out = out.sort_values(id_cols).reset_index(drop=True) + out.to_csv( + OUT_DIR / "j2jod_us_firmsize_od_2015on.csv", + index=False, + float_format="%.10g", + ) + print(f"j2jod_us_firmsize_od_2015on.csv: {len(out)} rows") + + def main() -> None: cache_dir = Path(tempfile.gettempdir()) / "employer_firm_raw_cache" cache_dir.mkdir(parents=True, exist_ok=True) @@ -297,6 +607,8 @@ def main() -> None: build_bds(cache_dir) build_qwi(cache_dir) build_j2j(cache_dir) + build_j2j_sexage(cache_dir) + build_j2jod_firmsize(cache_dir) for f in sorted(OUT_DIR.glob("*_us_*2015on.csv")) + [ OUT_DIR / "susb_us_sector_size_2022.csv", OUT_DIR / "bds_us_firm_size_1978_2022.csv", diff --git a/scripts/first_estimates_birth_evidence.py b/scripts/first_estimates_birth_evidence.py index 77e14398..af2b51ad 100644 --- a/scripts/first_estimates_birth_evidence.py +++ b/scripts/first_estimates_birth_evidence.py @@ -134,6 +134,7 @@ ) POST_REVIEW_SOURCE_EXCLUSIONS = ( Path("src/populace_dynamics/artifacts.py"), + Path("src/populace_dynamics/firms/targets.py"), # Entry-11 PSID data-layer additions are downstream source readers and # registries. They are outside the reviewed birth-evidence projection # implementation and must not invalidate its historical identity seal. diff --git a/src/populace_dynamics/firms/targets.py b/src/populace_dynamics/firms/targets.py index 805e90a5..c71eec3e 100644 --- a/src/populace_dynamics/firms/targets.py +++ b/src/populace_dynamics/firms/targets.py @@ -30,6 +30,8 @@ "load_bds_firm_size", "load_qwi_firmsize_sector", "load_j2j_firmsize_sector", + "load_j2j_sexage", + "load_j2jod_firmsize", ] EXTERNAL_DIR = Path(__file__).resolve().parents[3] / "data" / "external" @@ -37,6 +39,11 @@ BDS_PATH = EXTERNAL_DIR / "bds_us_firm_size_1978_2022.csv" QWI_PATH = EXTERNAL_DIR / "qwi_us_firmsize_sector_2015on.csv" J2J_PATH = EXTERNAL_DIR / "j2j_us_firmsize_sector_2015on.csv" +J2J_SEXAGE_PATH = EXTERNAL_DIR / "j2j_us_sexage_2015on.csv" +J2JOD_PATH = EXTERNAL_DIR / "j2jod_us_firmsize_od_2015on.csv" + +#: LEHD age-group codes (A00 is the all-ages margin). +LEHD_DETAIL_AGEGRPS = {f"A0{i}" for i in range(1, 9)} #: SUSB 2022 US total-employment pin (all sectors, ENTRSIZE 01), #: verified against the published table at fetch time. @@ -170,20 +177,36 @@ def _load_bds_firm_size(path: str | None = None) -> pd.DataFrame: return df -def _load_lehd(path: Path, measures: list[str], name: str) -> pd.DataFrame: +def _load_lehd( + path: Path, + measures: list[str], + name: str, + id_cols: list[str] | None = None, + key_cols: list[str] | None = None, +) -> pd.DataFrame: + if id_cols is None: + id_cols = [ + "year", + "quarter", + "industry", + "firmsize", + "firmsize_label", + ] + if key_cols is None: + key_cols = ["year", "quarter", "industry", "firmsize"] df = _read(path) - id_cols = ["year", "quarter", "industry", "firmsize", "firmsize_label"] missing = [c for c in id_cols + measures if c not in df.columns] if missing: raise ValueError(f"{name} extract is missing columns {missing}.") - if set(df["firmsize"].unique()) != LEHD_DETAIL_FIRMSIZES: - raise ValueError( - f"{name} firmsize codes changed: " - f"{sorted(df['firmsize'].unique())}" - ) + if "firmsize" in key_cols and "firmsize_orig" not in key_cols: + if set(df["firmsize"].unique()) != LEHD_DETAIL_FIRMSIZES: + raise ValueError( + f"{name} firmsize codes changed: " + f"{sorted(df['firmsize'].unique())}" + ) if not df["quarter"].isin([1, 2, 3, 4]).all(): raise ValueError(f"{name} quarter values out of range.") - dupes = df.duplicated(["year", "quarter", "industry", "firmsize"]) + dupes = df.duplicated(key_cols) if dupes.any(): raise ValueError(f"{name} extract has duplicate cells.") return df @@ -276,3 +299,115 @@ def _load_j2j_firmsize_sector(path: str | None = None) -> pd.DataFrame: if not observed.between(0.0, 1.0).all(): raise ValueError(f"J2J derived {col} outside [0, 1].") return df + + +def load_j2j_sexage(path: str | None = None) -> pd.DataFrame: + """National J2J flows by sex x age group, 2015Q1 on (jobs). + + All-industry margin only (gate E2's age x sex reference); the + full sex (0-2) x age (A00-A08) grid including margins. Adds + derived per-job quarterly rates ``hire_rate`` (MHire / MainB), + ``separation_rate`` (MSep / MainB), ``j2j_hire_rate`` + (J2JHire / MainB) and ``j2j_separation_rate`` (J2JSep / MainB). + Returns a fresh copy on each call (see + :func:`load_susb_sector_size`). + """ + return _load_j2j_sexage(path).copy() + + +@lru_cache(maxsize=1) +def _load_j2j_sexage(path: str | None = None) -> pd.DataFrame: + measures = [ + "MainB", + "MainE", + "MHire", + "MSep", + "EEHire", + "EESep", + "J2JHire", + "J2JSep", + "NEHire", + "ENSep", + ] + id_cols = ["year", "quarter", "sex", "sex_label", "agegrp"] + key_cols = ["year", "quarter", "sex", "agegrp"] + df = _load_lehd( + Path(path) if path is not None else J2J_SEXAGE_PATH, + measures, + "J2J sex-age", + id_cols=id_cols, + key_cols=key_cols, + ) + if set(df["sex"].unique()) != {0, 1, 2}: + raise ValueError("J2J sex-age extract sex codes changed.") + if set(df["agegrp"].unique()) != LEHD_DETAIL_AGEGRPS | {"A00"}: + raise ValueError("J2J sex-age extract age groups changed.") + if (df[measures] < 0).any().any(): + raise ValueError("J2J sex-age counts must be non-negative.") + for m in measures: + missing = df[m].isna() + if not df.loc[missing, f"s{m}"].isin([-1, 5]).all(): + raise ValueError(f"J2J sex-age {m} has unexplained missing cells.") + df = df.copy() + base = df["MainB"].where(df["MainB"] > 0) + df["hire_rate"] = df["MHire"] / base + df["separation_rate"] = df["MSep"] / base + df["j2j_hire_rate"] = df["J2JHire"] / base + df["j2j_separation_rate"] = df["J2JSep"] / base + for col in ( + "hire_rate", + "separation_rate", + "j2j_hire_rate", + "j2j_separation_rate", + ): + observed = df[col].dropna() + if not observed.between(0.0, 1.0).all(): + raise ValueError(f"J2J sex-age derived {col} outside [0, 1].") + return df + + +def load_j2jod_firmsize(path: str | None = None) -> pd.DataFrame: + """National J2J flows by origin x destination firm size, 2015Q1 on. + + From the LED Extraction Tool (gate E11's origin/destination + size-ladder reference): the full 6 x 6 firm-size grid, codes 0-5 + on both sides (0 is the tool's aggregated margin, status flag + 10/12; suppressed cells, flag 11, load as NaN). The 5 x 5 + detail is published for 2015Q1-2016Q1 only; later quarters + carry the margins only (provenance note entry 6). Counts are + jobs, as for QWI/J2J. Returns a fresh copy on each call (see + :func:`load_susb_sector_size`). + """ + return _load_j2jod_firmsize(path).copy() + + +@lru_cache(maxsize=1) +def _load_j2jod_firmsize(path: str | None = None) -> pd.DataFrame: + measures = ["EE", "AQHire", "J2J", "EES", "AQHireS", "J2JS"] + id_cols = [ + "year", + "quarter", + "firmsize_orig", + "firmsize", + "firmsize_orig_label", + "firmsize_label", + ] + key_cols = ["year", "quarter", "firmsize_orig", "firmsize"] + df = _load_lehd( + Path(path) if path is not None else J2JOD_PATH, + measures, + "J2JOD", + id_cols=id_cols, + key_cols=key_cols, + ) + all_sizes = LEHD_DETAIL_FIRMSIZES | {0} + for col in ("firmsize", "firmsize_orig"): + if set(df[col].unique()) != all_sizes: + raise ValueError(f"J2JOD {col} codes changed.") + if (df[measures] < 0).any().any(): + raise ValueError("J2JOD counts must be non-negative.") + for m in measures: + missing = df[m].isna() + if not df.loc[missing, f"s{m}"].isin([-1, 5, 11]).all(): + raise ValueError(f"J2JOD {m} has unexplained missing cells.") + return df diff --git a/tests/README-tiers.md b/tests/README-tiers.md index 62033622..150496ae 100644 --- a/tests/README-tiers.md +++ b/tests/README-tiers.md @@ -38,9 +38,9 @@ pytest --collect-only -q -m oracle_policyengine | tail -1 | Tier | Tests at HEAD | |---|---:| -| `unit` | 853 | -| `artifact` | 1,967 | +| `unit` | 834 | +| `artifact` | 2,037 | | `integration_psid` | 812 | | `reproduction_legacy` | 520 | | `oracle_policyengine` | 159 | -| **Total** | **4,311** | +| **Total** | **4,362** | diff --git a/tests/estimates/test_birth_evidence_artifact.py b/tests/estimates/test_birth_evidence_artifact.py index a26870c6..eb328b0a 100644 --- a/tests/estimates/test_birth_evidence_artifact.py +++ b/tests/estimates/test_birth_evidence_artifact.py @@ -67,6 +67,7 @@ def test_reducer_input_identity_matches_reviewed_branch(): def test_context_report_sources_are_outside_historical_reducer_identity(): assert reducer.POST_REVIEW_SOURCE_EXCLUSIONS == ( Path("src/populace_dynamics/artifacts.py"), + Path("src/populace_dynamics/firms/targets.py"), Path("src/populace_dynamics/data/psid_covered_earnings_registry.py"), Path("src/populace_dynamics/data/psid_job_context.py"), Path("src/populace_dynamics/data/psid_job_context_registry.py"), diff --git a/tests/test_crosswave_jobid_check.py b/tests/test_crosswave_jobid_check.py new file mode 100644 index 00000000..a4efdbc3 --- /dev/null +++ b/tests/test_crosswave_jobid_check.py @@ -0,0 +1,104 @@ +"""Pin the cross-wave job-ID check artifact (#230 §6 pre-lock).""" + +from __future__ import annotations + +import json +from pathlib import Path + +import pytest + +ARTIFACT = Path(__file__).resolve().parents[1] / ( + "runs/crosswave_jobid_check_draft_v0.json" +) + + +@pytest.fixture(scope="module") +def artifact() -> dict: + return json.loads(ARTIFACT.read_text()) + + +def test_disclosure_language(artifact): + # The status must carry the disclosed-re-analysis framing, never + # a pre-registration claim (review on #235). + assert "DISCLOSED RE-ANALYSIS" in artifact["status"] + assert "UNRATIFIED" in artifact["status"] + assert "pre-registered" not in artifact["status"] + + +def test_both_populations_reported(artifact): + bounds = artifact["bounds"] + assert bounds["excess_rekey_share_ee_population"] == 0.1512 + assert bounds["excess_rekey_share_all_separations"] == 0.0936 + verdicts = artifact["verdict_by_population"] + assert verdicts["ee_population"] == "PASS_WITH_CORRECTION_BAND" + assert verdicts["all_separations"] == "PASS" + assert verdicts["operative"] == "REFEREE" + + +def test_identity_is_labelled(artifact): + identity = artifact["bounds"]["gross_id_survival_identity"] + assert identity["value"] == pytest.approx( + 1 - artifact["across_wave_seam"]["sep_rate"] + ) + assert "NOT evidence" in identity["note"] + + +def test_uncertainty_and_strict_variant(artifact): + bounds = artifact["bounds"] + assert ( + bounds["one_sided_95_upper_ee_population"] + > bounds["excess_rekey_share_ee_population"] + ) + strict = artifact["strict_nan_variant"] + assert strict["excess_ee_population"] == 0.1232 + assert "MISMATCH" in strict["note"] + + +def test_derived_fields_recompute_from_counts(artifact): + # Referee S3 (#230 round 1): the committed JSON's derived fields + # and verdicts must recompute exactly from its own counts, so a + # hand-edited verdict cannot pass unnoticed. + within = artifact["within_wave_baseline"] + seam = artifact["across_wave_seam"] + assert seam["sep_rate"] == pytest.approx( + seam["separations"] / seam["jobs_held"], abs=5e-5 + ) + ee_excess = max( + 0.0, + seam["rekey_signature"] / seam["to_employment"] + - within["rekey_signature"] / within["to_employment"], + ) + assert artifact["bounds"][ + "excess_rekey_share_ee_population" + ] == pytest.approx(ee_excess, abs=5e-5) + all_seps = ee_excess * seam["to_employment"] / seam["separations"] + assert artifact["bounds"][ + "excess_rekey_share_all_separations" + ] == pytest.approx(all_seps, abs=5e-5) + + def band(x): + if x < 0.15: + return "PASS" + if x <= 0.30: + return "PASS_WITH_CORRECTION_BAND" + return "REFER_BACK" + + verdicts = artifact["verdict_by_population"] + assert verdicts["ee_population"] == band( + artifact["bounds"]["excess_rekey_share_ee_population"] + ) + assert verdicts["all_separations"] == band( + artifact["bounds"]["excess_rekey_share_all_separations"] + ) + + +def test_ee_conditional_baseline_stated(artifact): + assert "E->E-CONDITIONAL" in artifact["rekey_signature_definition"] + assert len(artifact["sipp_jobs_reader_commit"]) == 40 + + +def test_inputs_pinned(artifact): + assert set(artifact["inputs"]) == {"pu2022.csv.gz", "pu2023.csv"} + for pin in artifact["inputs"].values(): + assert len(pin["sha256"]) == 64 + assert pin["bytes"] > 10_000_000 diff --git a/tests/test_employer_firm_floors.py b/tests/test_employer_firm_floors.py new file mode 100644 index 00000000..f8ee4d57 --- /dev/null +++ b/tests/test_employer_firm_floors.py @@ -0,0 +1,383 @@ +"""Pin the v1 employer-firm aggregate noise-floor artifact (#192). + +``runs/employer_firm_floors_v1.json`` is a reported anchor +(workstream B counterpart to the #212 battery): PRE-LOCK, NOT +RATIFIED, no thresholds — it commits the floor-building method for +the E1/E2/E6/E7/E11 aggregate references, and the E11/E12 deferral +findings, before IC3 locks. + +**v1 is a pinning event, not a ratification** (#230 section 12.2 +item 2). Three digests are pinned, and each catches a different way +the artifact could drift out from under the IC3 record: + +* the artifact's own bytes — an edited artifact; +* the builder's bytes — a changed method that happens to land on + the same numbers, or a reproduction test quietly rewritten to + agree with a new build; +* every input extract's bytes — a re-fetched source. This is the + one a reproduction test alone cannot catch: rebuild from a + silently changed extract and the artifact and the rebuild agree + with each other while both differ from what IC3 was shown. +""" + +from __future__ import annotations + +import hashlib +import json +import sys +from pathlib import Path + +import pytest + +from populace_dynamics.firms import banding + +ROOT = Path(__file__).resolve().parents[1] +ARTIFACT = ROOT / "runs/employer_firm_floors_v1.json" +BUILDER = ROOT / "scripts/build_employer_firm_floors.py" + +ARTIFACT_SHA256 = ( + "eb58474b42166d51ccbe80a1c58d33ffb8a60a4a5ac097290fecc6c2a8b92f17" +) +BUILDER_SHA256 = ( + "a748975e787f3b255df611ebcf9cb3808c7b0e88866d9aa10ebe320864900a72" +) + +CANONICAL_NAMES = {band.name for band in banding.CANONICAL_BANDS} + + +@pytest.fixture(scope="module") +def artifact() -> dict: + return json.loads(ARTIFACT.read_text()) + + +def test_artifact_is_a_prelock_reference_with_no_thresholds(artifact): + assert artifact["artifact"] == "employer_firm_floors" + assert artifact["version"] == "v1" + # "DRAFT" gave way to "PRE-LOCK REFERENCE" at v1: the artifact + # is pinned now, so calling it a draft would misdescribe it. What + # must not weaken is the ratification status. + assert "PRE-LOCK REFERENCE" in artifact["status"] + assert "NOT RATIFIED" in artifact["status"] + + def keys_of(node): + if isinstance(node, dict): + for key, value in node.items(): + yield key + yield from keys_of(value) + elif isinstance(node, list): + for value in node: + yield from keys_of(value) + + assert not any("threshold" in key.lower() for key in keys_of(artifact)) + + +def test_unit_rules_are_carried(artifact): + rules = " ".join(artifact["unit_rules"]) + assert "jobs, not persons" in rules + assert "MEAN monthly earnings" in rules + assert "oslp" in rules + + +def test_e1_susb_cells(artifact): + by_sector = artifact["e1"]["susb_2022_share_by_sector_band"] + assert len(by_sector) == 20 # 19 NAICS sectors + 99 unclassified + for bands in by_sector.values(): + assert set(bands) <= CANONICAL_NAMES + total = sum(cell["share"] for cell in bands.values()) + assert total == pytest.approx(1.0, abs=1e-3) + for cell in bands.values(): + assert cell["noise_flag_worst"] in {"G", "H", "J"} + if cell["noise_flag_worst"] == "J": + assert cell["cv_upper_bound"] is None + else: + assert 0 < cell["cv_upper_bound"] <= 0.05 + + +def test_e1_bds_margin_carries_the_straddle(artifact): + groups = artifact["e1"]["bds_size_margin_yoy_stability"]["groups"] + assert set(groups) == {"1_9", "10_19", "20_99", "100_499", "500_plus"} + straddle = groups["20_99"] + assert straddle["exact"] is False + assert set(straddle["canonical_bands"]) == {"B10_49", "B50_99"} + shares = [g["share_2022"] for g in groups.values()] + assert sum(shares) == pytest.approx(1.0, abs=1e-3) + for group in groups.values(): + assert group["floor_abs_log_ratio_mean"] > 0 + assert group["n_pairs_ex_pandemic"] < group["n_pairs"] + + +def test_lehd_blocks_shape(artifact): + for block, rates in ( + ( + artifact["e6_e7"], + ("e6_hire_rate", "e6_separation_rate", "e7_earns_mean"), + ), + ( + artifact["e2"], + ("hire_rate", "j2j_hire_rate", "ee_separation_rate"), + ), + ): + detail = block["by_firmsize_all_industry"] + assert set(detail) == {f"firmsize{i}" for i in range(1, 6)} + for cell in detail.values(): + assert set(cell["canonical_bands"]) <= CANONICAL_NAMES + assert cell["thin"] is False + for rate in rates: + floor = cell[rate] + assert floor["floor_abs_log_ratio_mean"] > 0 + assert floor["n_pairs_ex_pandemic"] < floor["n_pairs"] + summary = block["sector_cells"] + assert summary["n_cells"] == 95 # 19 sectors x 5 sizes + for rate in rates: + assert ( + summary[rate]["cell_floor_median"] + <= summary[rate]["cell_floor_p90"] + <= summary[rate]["cell_floor_max"] + ) + + +def test_e7_relative_floor_is_tighter_than_nominal(artifact): + # The aggregate-relative EarnS floor strips the shared nominal + # wage trend, so it must come in below the raw nominal floor. + for cell in artifact["e6_e7"]["by_firmsize_all_industry"].values(): + raw = cell["e7_earns_mean"]["floor_abs_log_ratio_mean"] + rel = cell["e7_earns_rel_to_aggregate"]["floor_abs_log_ratio_mean"] + assert rel < raw + + +def test_method_findings_are_recorded(artifact): + findings = artifact["method_findings"] + assert "sector axis has no stability floor" in ( + findings["e1_no_sector_replicate"] + ) + assert "straddles the canonical 50 edge" in findings["e1_bds_straddle"] + # The two findings draft_v0 deferred, now superseded rather than + # silently dropped: #228 landed the extracts each one blamed. + assert "e2_no_age_sex_axis" not in findings + assert "e11_no_od_extract" not in findings + assert "SUPERSEDES" in findings["e2_sex_age_axis_built"] + assert "'sa'" in findings["e2_sex_age_axis_built"] + assert "sex x EDUCATION" in findings["e2_sex_age_axis_built"] + assert "SUPERSEDES" in ( + findings["e11_extract_committed_but_no_temporal_replicate"] + ) + assert "ONE pair per detail cell" in ( + findings["e11_extract_committed_but_no_temporal_replicate"] + ) + assert "revision" in findings["release_revision_noise_unfloored"] + assert "not evidence that it is zero" in ( + findings["release_revision_noise_unfloored"] + ) + assert "trend, not noise" in findings["e11_margin_trend"] + assert "does not gate the first IC3 lock" in findings["e12_deferred"] + assert "aggregate size/industry employment" in findings["e12_deferred"] + for unsupported_claim in ( + "true worker-firm linkage", + "coworker sorting", + "within/between-firm variance", + "firm effects", + "spillovers", + ): + assert unsupported_claim in findings["e12_deferred"] + assert "no-go until a true-linked reference" in findings["e12_deferred"] + assert "business-cycle" in findings["cycle_signal_in_floors"] + assert "nominal wage growth" in findings["e7_nominal_trend"] + assert artifact["e11"]["status"].startswith("detail floor NOT") + assert artifact["e12"]["status"].startswith("deferred") + + +def test_reproduces_from_committed_extracts(artifact): + sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "scripts")) + from build_employer_firm_floors import build + + assert json.loads(json.dumps(build())) == artifact + + +def test_e2_sex_age_axis_is_built(artifact): + """E2's registered gate axis has a floor, not a deferral.""" + block = artifact["e2"]["by_sex_age"] + # Full 3 sexes x 9 age groups, margins included. + assert len(block["cells"]) == 27 + for cell in block["cells"].values(): + for name in ( + "hire_rate", + "separation_rate", + "j2j_hire_rate", + "j2j_separation_rate", + ): + floor = cell[name] + assert floor["n_pairs"] > 0 + assert floor["floor_abs_log_ratio_mean"] > 0 + assert floor["floor_abs_log_ratio_sd"] is not None + # Ex-pandemic is a strict subset of the full sample. + assert floor["n_pairs_ex_pandemic"] < floor["n_pairs"] + + +def test_e2_sex_age_cross_cell_excludes_the_margins(artifact): + """Pooling margins with the cells they aggregate would double count.""" + summary = artifact["e2"]["by_sex_age"]["cross_cell"] + # 2 sexes x 8 age groups; the all-sexes / all-ages rows are out. + assert summary["n_cells"] == 16 + assert "non-margin cells only" in summary["note"] + + +def test_e2_sex_age_floors_are_not_monotone_in_disaggregation(artifact): + """A margin's floor does not bound the floors beneath it. + + The intuition that disaggregating can only add noise is wrong + here, and the threshold policy depends on knowing that: the + 45-99 age cells are more temporally stable than the all-sexes + all-ages cell, which carries compositional shift they do not. + So a floor measured on a margin cannot stand in as a + conservative bound for its constituent cells. + """ + cells = artifact["e2"]["by_sex_age"]["cells"] + tighter = { + family: sum( + 1 + for key, cell in cells.items() + if key != "sex0_A00" + and cell[family]["ex_pandemic_mean"] + < cells["sex0_A00"][family]["ex_pandemic_mean"] + ) + for family in ( + "hire_rate", + "separation_rate", + "j2j_hire_rate", + "j2j_separation_rate", + ) + } + assert tighter == { + "hire_rate": 13, + "separation_rate": 10, + "j2j_hire_rate": 6, + "j2j_separation_rate": 7, + } + # And the direction of the pattern: oldest tighter than youngest. + assert ( + cells["sex1_A08"]["separation_rate"]["ex_pandemic_mean"] + < cells["sex1_A04"]["separation_rate"]["ex_pandemic_mean"] + ) + + +def test_non_monotonicity_is_recorded_as_a_finding(artifact): + finding = artifact["method_findings"][ + "floors_not_monotone_in_disaggregation" + ] + assert "CANNOT be used as a conservative bound" in finding + + +def test_e11_detail_window_gives_one_pair_per_cell(artifact): + """The reason the E11 cross has no floor, pinned as a number. + + Not availability -- the extract is committed (#228). The national + origin x destination detail is published for 2015Q1-2016Q1 only, + so same-quarter YoY pairing yields one pair per cell: a gap with + no dispersion, hence no mean + k*sd floor. + """ + window = artifact["e11"]["detail_window"] + assert window["n_quarters"] == 5 + assert window["observed_quarters"][0] == "2015Q1" + assert window["observed_quarters"][-1] == "2016Q1" + assert window["max_yoy_pairs_per_cell"] == 1 + + +def test_e11_margin_relative_floor_is_tighter_than_raw(artifact): + """EE counts carry aggregate flow growth, as EarnS carries wages.""" + for cell in artifact["e11"]["destination_size_margin"].values(): + assert cell["ee_rel"]["floor_abs_log_ratio_mean"] < ( + cell["ee"]["floor_abs_log_ratio_mean"] + ) + + +def test_e11_margin_trend_note_states_the_measured_magnitude(artifact): + """`rel < raw` alone let a wrong magnitude ride inside the pin. + + The note said the relative variant "runs roughly half the raw + one" while the committed numbers make it 4.5x to 9.5x tighter — + a factual error inside a sha256-pinned artifact, caught by + review rather than by a test. This pins the claim against the + numbers it describes, so the next drift fails here. + """ + cells = artifact["e11"]["destination_size_margin"].values() + ratios = [ + cell["ee"]["floor_abs_log_ratio_mean"] + / cell["ee_rel"]["floor_abs_log_ratio_mean"] + for cell in cells + ] + assert 4.5 <= min(ratios) < max(ratios) <= 9.5 + note = artifact["method_findings"]["e11_margin_trend"] + assert "4.5x to 9.5x smaller" in note + assert "roughly half" not in note + + +def test_e11_records_the_cross_source_margin_disagreement(artifact): + """The margins-only bound that survives the missing detail.""" + note = artifact["e11"]["cross_source_margin_disagreement"] + assert note["all_size_ee_tool_above_flat_file"] == "37 of 41 quarters" + lo, hi = note["per_size_deviation_range_pct"] + assert lo < 0 < hi + assert "margins-only" in note["note"] + + +# --------------------------------------------------------------- +# v1 pinning (#230 section 12.2 item 2) +# --------------------------------------------------------------- + + +def _sha256(path: Path) -> str: + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def test_artifact_sha256_is_pinned(): + assert _sha256(ARTIFACT) == ARTIFACT_SHA256 + + +def test_builder_sha256_is_pinned(): + """A changed method must not slip past the reproduction test. + + ``test_reproduces_from_committed_extracts`` compares the builder + against the artifact, so editing both together passes. Pinning + the builder makes that edit visible. + """ + assert _sha256(BUILDER) == BUILDER_SHA256 + + +def test_input_extract_digests_match_the_committed_files(artifact): + """The drift a reproduction test structurally cannot catch. + + If an extract is re-fetched, the artifact and a rebuild from it + agree with each other while both differ from what the IC3 record + was shown. Only a digest recorded *at build time* and compared + against the file *now* separates those. + """ + recorded = artifact["input_extract_sha256"] + for name, digest in recorded.items(): + path = ROOT / "data" / "external" / name + assert path.exists(), f"{name} is recorded but not committed" + assert _sha256(path) == digest, ( + f"{name} has changed since the floors were built; rebuild " + "the artifact and re-pin deliberately, and say so in the " + "IC3 record — the floors move with it" + ) + + +def test_every_consumed_extract_is_digest_recorded(artifact): + """No source may be consumed without appearing in the pin.""" + recorded = set(artifact["input_extract_sha256"]) + sources = { + Path(value).name + for key, value in artifact["sources"].items() + if key != "provenance" + } + assert sources == recorded + + +def test_v1_is_pinned_but_not_ratified(artifact): + # The distinction the whole ceremony rests on: pinning makes the + # numbers immovable, not binding. Thresholds arrive only with the + # IC3 amendment PR. + status = artifact["status"] + assert "NOT RATIFIED" in status + assert "no thresholds" in status + assert "not a ratification" in status diff --git a/tests/test_firms_banding.py b/tests/test_firms_banding.py index ae8e1f3f..3c474b64 100644 --- a/tests/test_firms_banding.py +++ b/tests/test_firms_banding.py @@ -1,4 +1,4 @@ -"""Tests for the canonical firm-size banding (contract C2). +"""Tests for the canonical firm-size banding (contract IC2). Checks the properties the contract promises: canonical bands partition the positive integers; every raw source code maps to diff --git a/tests/test_firms_targets.py b/tests/test_firms_targets.py index 4b91b256..d131e08a 100644 --- a/tests/test_firms_targets.py +++ b/tests/test_firms_targets.py @@ -10,6 +10,8 @@ from __future__ import annotations +from pathlib import Path + import numpy as np import pytest @@ -228,6 +230,136 @@ def test_j2j_flows_are_subsets_of_market_flows(j2j): assert (ok["EESep"] <= ok["J2JSep"]).all() +# --------------------------------------------------------------- +# J2J sex x age (gate E2 reference) +# --------------------------------------------------------------- + + +@pytest.fixture(scope="module") +def j2j_sexage(): + return targets.load_j2j_sexage() + + +def test_j2j_sexage_schema_and_coverage(j2j_sexage): + assert set(j2j_sexage["sex"]) == {0, 1, 2} + assert set(j2j_sexage["agegrp"]) == {f"A0{i}" for i in range(9)} + assert j2j_sexage["year"].min() == 2015 + assert j2j_sexage["year"].max() >= 2024 + # Full grid: one row per quarter x sex x age group. + quarters = j2j_sexage[["year", "quarter"]].drop_duplicates() + assert len(j2j_sexage) == len(quarters) * 3 * 9 + + +def test_j2j_sexage_rates_bounded(j2j_sexage): + for col in ( + "hire_rate", + "separation_rate", + "j2j_hire_rate", + "j2j_separation_rate", + ): + observed = j2j_sexage[col].dropna() + assert ((observed >= 0) & (observed <= 1)).all() + assert observed.median() > 0.01 + + +def test_j2j_sexage_margins_stack(j2j_sexage): + """Detail sex and age cells stack to the published margins + (exactly: LEHD margins here are published, not derived).""" + cell = j2j_sexage.set_index(["year", "quarter", "sex", "agegrp"])["MainB"] + total = cell.loc[2019, 1, 0, "A00"] + by_sex = sum(cell.loc[2019, 1, s, "A00"] for s in (1, 2)) + by_age = sum(cell.loc[2019, 1, 0, f"A0{i}"] for i in range(1, 9)) + # LEHD noise infusion rounds each published cell independently, + # so margins agree only to a few jobs out of ~130 million. + assert abs(by_sex - total) <= 5 + assert abs(by_age - total) <= 5 + + +def test_j2j_sexage_age_gradient(j2j_sexage): + """E2's sign: young workers churn faster -- the 19-21 group's + J2J hire rate exceeds the 55-64 group's, both sexes pooled.""" + us = j2j_sexage[j2j_sexage["sex"] == 0] + young = us.loc[us["agegrp"] == "A02", "j2j_hire_rate"].mean() + older = us.loc[us["agegrp"] == "A07", "j2j_hire_rate"].mean() + assert young > 2 * older + + +# --------------------------------------------------------------- +# J2JOD origin x destination firm size (gate E11 reference) +# --------------------------------------------------------------- + + +@pytest.fixture(scope="module") +def j2jod(): + return targets.load_j2jod_firmsize() + + +def test_j2jod_schema_and_coverage(j2jod): + assert set(j2jod["firmsize"]) == {0, 1, 2, 3, 4, 5} + assert set(j2jod["firmsize_orig"]) == {0, 1, 2, 3, 4, 5} + assert j2jod["year"].min() == 2015 + assert j2jod["year"].max() >= 2024 + # Full 6 x 6 grid per quarter. + quarters = j2jod[["year", "quarter"]].drop_duplicates() + assert len(j2jod) == len(quarters) * 36 + + +def test_j2jod_identity_j2j_is_ee_plus_aqhire(j2jod): + ok = j2jod.dropna(subset=["EE", "AQHire", "J2J"]) + assert (ok["J2J"] == ok["EE"] + ok["AQHire"]).all() + ok = j2jod.dropna(subset=["EES", "AQHireS", "J2JS"]) + assert (ok["J2JS"] == ok["EES"] + ok["AQHireS"]).all() + + +def test_j2jod_detail_window(j2jod): + """The full national origin x destination detail is published + only for 2015Q1-2016Q1 (later quarters carry status flag 11: a + state coverage gap blocks the national aggregate; provenance + note entry 6). Pin the window so a re-fetch that changes it + fails loudly.""" + detail = j2jod[(j2jod["firmsize"] > 0) & (j2jod["firmsize_orig"] > 0)] + published = detail[detail["EE"].notna()] + assert set(zip(published["year"], published["quarter"], strict=True)) == { + (2015, 1), + (2015, 2), + (2015, 3), + (2015, 4), + (2016, 1), + } + assert detail.loc[detail["EE"].isna(), "sEE"].isin([11]).all() + # The margins stay published for every quarter. + margin = j2jod[(j2jod["firmsize"] == 0) & (j2jod["firmsize_orig"] == 0)] + assert margin["EE"].notna().all() + + +def test_j2jod_detail_cells_below_margins(j2jod): + """Each detail origin x destination cell is bounded by both of + its one-sided margins (the margins aggregate the detail).""" + cell = j2jod.set_index(["year", "quarter", "firmsize_orig", "firmsize"])[ + "EE" + ] + for o in range(1, 6): + for d in range(1, 6): + detail = cell.loc[2015, 3, o, d] + if np.isnan(detail): + continue + assert detail <= cell.loc[2015, 3, o, 0] + assert detail <= cell.loc[2015, 3, 0, d] + + +def test_j2jod_large_firms_dominate_flows(j2jod): + """E11's sign: the 500+ x 500+ corner carries the largest + detail flow (large firms dominate both ends of the ladder).""" + us = j2jod[ + (j2jod["year"] == 2015) + & (j2jod["quarter"] == 3) + & (j2jod["firmsize"] > 0) + & (j2jod["firmsize_orig"] > 0) + ] + top = us.loc[us["EE"].idxmax()] + assert top["firmsize"] == 5 and top["firmsize_orig"] == 5 + + @pytest.mark.parametrize( "loader", [ @@ -235,6 +367,8 @@ def test_j2j_flows_are_subsets_of_market_flows(j2j): targets.load_bds_firm_size, targets.load_qwi_firmsize_sector, targets.load_j2j_firmsize_sector, + targets.load_j2j_sexage, + targets.load_j2jod_firmsize, ], ) def test_loaders_return_independent_copies(loader): @@ -261,3 +395,99 @@ def test_lehd_labels_match_banding_intervals(qwi, j2j): assert label.startswith(f"{lo}+") or "500+" in label else: assert str(int(hi)) in label + + +# --------------------------------------------------------------- +# The archived LED response and the content-based integrity pin +# --------------------------------------------------------------- + + +def _fetch_module(): + """Import the fetch script (scripts/ is not an installed package).""" + import importlib.util + + path = ( + Path(__file__).resolve().parents[1] + / "scripts" + / "fetch_employer_firm_targets.py" + ) + spec = importlib.util.spec_from_file_location("_fetch_eft", path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def test_led_j2jod_archive_is_committed(): + """The only-ever detail window must not depend on the live tool. + + The LED Extraction Tool re-runs the query against whatever + release is current, and the 2015Q1-2016Q1 origin x destination + detail is the only window in which this cross is published at + all. If the archive goes missing, that window is unrecoverable. + """ + fetch = _fetch_module() + assert fetch.LED_J2JOD_ARCHIVE.exists() + + +def test_led_j2jod_content_digest_matches_the_pin(): + fetch = _fetch_module() + digest = fetch.led_j2jod_content_digest(fetch.LED_J2JOD_ARCHIVE) + assert digest == fetch.LED_J2JOD_CONTENT_SHA256 + + +def test_content_digest_ignores_column_order_but_not_values(tmp_path): + """The property that makes the pin worth having. + + The byte digest originally pinned on this extract broke within + six days purely because the tool reordered its measure columns, + with all 1,476 values unchanged. A pin that fires on cosmetic + reordering trains the maintainer to re-pin on sight, so a real + revision arrives indistinguishable from the false alarms. + """ + import pandas as pd + + fetch = _fetch_module() + frame = pd.read_csv(fetch.LED_J2JOD_ARCHIVE, low_memory=False) + + shuffled = tmp_path / "shuffled.csv" + frame[list(reversed(frame.columns))].to_csv(shuffled, index=False) + assert ( + fetch.led_j2jod_content_digest(shuffled) + == fetch.LED_J2JOD_CONTENT_SHA256 + ) + + revised = tmp_path / "revised.csv" + bumped = frame.copy() + bumped.loc[bumped.index[0], "EE"] += 1 + bumped.to_csv(revised, index=False) + assert ( + fetch.led_j2jod_content_digest(revised) + != fetch.LED_J2JOD_CONTENT_SHA256 + ) + + +def test_committed_extract_rebuilds_from_the_archive(tmp_path): + """Byte-equality of the committed extract from the archived raw.""" + import pandas as pd + + fetch = _fetch_module() + raw = pd.read_csv(fetch.fetch_led_j2jod(tmp_path), low_memory=False) + keep = raw[raw["year"] >= fetch.LEHD_START_YEAR].copy() + id_cols = ["year", "quarter", "firmsize_orig", "firmsize"] + flag_cols = [f"s{m}" for m in fetch.J2JOD_MEASURES] + out = keep[id_cols + fetch.J2JOD_MEASURES + flag_cols].copy() + out.insert( + 4, "firmsize_orig_label", fetch._firmsize_label(out["firmsize_orig"]) + ) + out.insert(5, "firmsize_label", fetch._firmsize_label(out["firmsize"])) + out = out.sort_values(id_cols).reset_index(drop=True) + + rebuilt = tmp_path / "rebuilt.csv" + out.to_csv(rebuilt, index=False, float_format="%.10g") + committed = ( + Path(__file__).resolve().parents[1] + / "data" + / "external" + / "j2jod_us_firmsize_od_2015on.csv" + ) + assert rebuilt.read_text() == committed.read_text() diff --git a/tests/test_noemp_band_evidence.py b/tests/test_noemp_band_evidence.py index 1a98c64a..4f1c1c44 100644 --- a/tests/test_noemp_band_evidence.py +++ b/tests/test_noemp_band_evidence.py @@ -1,7 +1,7 @@ """Pin the NOEMP band-label evidence artifact (issue #192). The committed ``runs/noemp_band_evidence_v1.json`` records the -discontinuity test behind the C2 decision to read ASEC NOEMP codes +discontinuity test behind the IC2 decision to read ASEC NOEMP codes 2/3 as 10-49 / 50-99 in every year. These tests pin the artifact's internal consistency, and — when the ASEC files are staged — reproduce it from the raw data. diff --git a/tests/test_spell_floor_artifacts.py b/tests/test_spell_floor_artifacts.py new file mode 100644 index 00000000..854e2db1 --- /dev/null +++ b/tests/test_spell_floor_artifacts.py @@ -0,0 +1,188 @@ +"""Pin the three Workstream A floor artifacts (#212, pre-IC3).""" + +from __future__ import annotations + +import hashlib +import json +from pathlib import Path + +import pytest + +RUNS = Path(__file__).resolve().parents[1] / "runs" +ROOT = RUNS.parent + +ARTIFACTS = { + "sipp_spell_floors_v1.json": "500b68034c9a301eb823e1d8f7584cf6c7654bf536247827353b0941d1d026ae", + "tenure_floors_v1.json": "08e67e5d362bbd0c1703c85fdb40624de094561f385eceb6d0a9eea4772cc6ff", + "sipp_e8_e9_floors_v1.json": "b360f04fc785eeb11c8e77e4128bdb8a98d31501a11f048fa2df4e86b1f7e059", +} +BUILDERS = { + "scripts/build_sipp_spell_floors.py": "8ce7e41a9af71767672c39f7933ccde3c2eeaa0aa4f7044c5113f7430439d1dc", + "scripts/build_tenure_floors.py": "fda07dec53ab11c41aab2b7f92dc0c18ecad0f3843d70256bb2f140351b273b1", + "scripts/build_sipp_e8_e9_floors.py": "3b2209de9b10cf680f5a074ea0c56077b03ebda68a4a614f2e20f0d0c2455272", +} + + +@pytest.fixture(scope="module") +def spells() -> dict: + return json.loads((RUNS / "sipp_spell_floors_v1.json").read_text()) + + +@pytest.fixture(scope="module") +def tenure() -> dict: + return json.loads((RUNS / "tenure_floors_v1.json").read_text()) + + +@pytest.fixture(scope="module") +def e8e9() -> dict: + return json.loads((RUNS / "sipp_e8_e9_floors_v1.json").read_text()) + + +def test_all_carry_prelock_status_and_correct_scale_gap(spells, tenure, e8e9): + for artifact in (spells, tenure, e8e9): + assert artifact["version"] == "v1" + assert "pinning event, not a ratification" in artifact["status"] + assert "RECORDED GAP" in artifact["deployment_scale_note"] + assert "1.58x" in artifact["deployment_scale_note"] + assert ( + "ANTI-conservative (too tight)" + in artifact["deployment_scale_note"] + ) + assert "RECORDED_NOT_SATISFIED" in artifact["deployment_scale_note"] + assert "promotion_integrity" not in artifact + + +def test_artifact_builder_and_sidecar_pins(): + for relative, expected in ARTIFACTS.items(): + assert ( + hashlib.sha256((RUNS / relative).read_bytes()).hexdigest() + == expected + ) + sidecar = json.loads( + (RUNS / relative.replace(".json", ".env.json")).read_text() + ) + assert sidecar["status"] == "MEASUREMENT_ENVIRONMENT" + environment = sidecar["environment"] + assert environment["python"] + assert environment["numpy"] + assert environment["pandas"] + assert environment["platform"] + for relative, expected in BUILDERS.items(): + assert ( + hashlib.sha256((ROOT / relative).read_bytes()).hexdigest() + == expected + ) + + +def test_source_input_sidecars_match_artifacts(spells, tenure, e8e9): + sipp_inputs = json.loads( + (RUNS / "sipp_spell_floors_v1.inputs.json").read_text() + ) + e8e9_inputs = json.loads( + (RUNS / "sipp_e8_e9_floors_v1.inputs.json").read_text() + ) + for artifact, sidecar in ( + (spells, sipp_inputs), + (e8e9, e8e9_inputs), + ): + assert sidecar["status"] == "SOURCE_INPUT_DIGESTS" + assert ( + sidecar["staged_input"]["path"] == artifact["source_input"]["path"] + ) + assert ( + sidecar["staged_input"]["sha256"] + == artifact["source_input"]["sha256"] + ) + assert sidecar["staged_input"]["bytes"] > 0 + official = sidecar["official_source"] + assert official["url"].startswith("https://www2.census.gov/") + assert official["archive_member"] == "pu2023.csv" + _assert_sha256(official["archive_sha256"]) + assert official["archive_bytes"] > 0 + + tenure_inputs = json.loads( + (RUNS / "tenure_floors_v1.inputs.json").read_text() + ) + assert tenure_inputs["status"] == "SOURCE_INPUT_DIGESTS" + for artifact_input, sidecar_input in zip( + tenure["source_inputs"], + tenure_inputs["source_inputs"], + strict=True, + ): + assert sidecar_input["path"] == artifact_input["path"] + assert sidecar_input["sha256"] == artifact_input["sha256"] + assert sidecar_input["bytes"] > 0 + assert sidecar_input["official_url"].startswith( + "https://www2.census.gov/" + ) + assert "/supp/" in sidecar_input["official_url"] + + +def _assert_sha256(value: str) -> None: + assert len(value) == 64 + int(value, 16) + + +def test_exact_source_input_digests_are_recorded(spells, tenure, e8e9): + assert spells["source_input"] == e8e9["source_input"] + assert spells["source_input"]["path"] == "pu2023.csv.gz" + _assert_sha256(spells["source_input"]["sha256"]) + + assert [item["year"] for item in tenure["source_inputs"]] == [ + "2020", + "2022", + "2024", + ] + assert [item["path"] for item in tenure["source_inputs"]] == [ + "jan20pub.csv", + "jan22pub.csv", + "jan24pub.csv", + ] + for item in tenure["source_inputs"]: + _assert_sha256(item["sha256"]) + + +def test_sipp_builder_uses_reader_path_resolver(): + builder = (ROOT / "scripts/build_sipp_spell_floors.py").read_text() + assert "sipp_jobs._resolve_pu_path(" in builder + assert "sipp_jobs._resolve_person_path(" not in builder + + +def test_e4_e5_pinned_values(spells): + e4 = spells["e4_retention_by_age_sex"]["16_24|sex1"] + assert e4["rate"] == 0.9897 + assert e4["floor_abs_log_ratio_mean"] == 0.00182 + e5 = spells["e5_runs_by_age"]["45_54"] + assert e5["full_year_run_share"] == 0.8671 + assert spells["seam_caveat"] + + +def test_tenure_pinned_values_and_heaping(tenure): + cell = tenure["by_year"]["2024"]["35_44"] + assert cell["p50"] == 5.0 + assert cell["floor_abs_gap_years"]["p50"]["mean"] == 0.0 + assert cell["floor_ecdf_max_gap"]["mean"] > 0 + assert "exactly zero" in tenure["heaping_caveat"] + + +def test_e8_e9_pinned_values(e8e9): + assert "seeds 0-19" in e8e9["method"] + assert "ESTIMAND NOTE" in e8e9["source"] + mix = e8e9["e9_transitions"]["transition_rates"] + assert mix["stay"] == 0.977 + assert mix["j2j"] == 0.0035 + stay = e8e9["e9_transitions"]["earnings_change"]["stay"] + assert stay["median_log_change"] == 0.0 + assert "heaps at exactly 0" in e8e9["stay_median_heaping_caveat"] + assert ( + e8e9["e9_transitions"]["earnings_change"]["stay"]["persons_unweighted"] + == 16286 + ) + assert ( + e8e9["e9_transitions"]["earnings_change"]["j2j"]["persons_unweighted"] + == 524 + ) + builder = (ROOT / "scripts/build_sipp_e8_e9_floors.py").read_text() + assert '"persons_unweighted": int(cell["person_id"].nunique())' in builder + e8 = e8e9["e8_nonemployment_by_age"]["16_24"] + assert e8["any_nonemp_share"] == pytest.approx(0.4145, abs=0.001) diff --git a/tests/tier_counts.json b/tests/tier_counts.json index efd91251..3e83814c 100644 --- a/tests/tier_counts.json +++ b/tests/tier_counts.json @@ -1,8 +1,8 @@ { "schema_version": 1, "counts": { - "unit": 853, - "artifact": 1967, + "unit": 834, + "artifact": 2037, "integration_psid": 812, "reproduction_legacy": 520, "oracle_policyengine": 159
Workstream A — Daphne (person side)Workstream B — Vahid (firm side)
SIPP job-level reader (label-verified, family.py pattern); CPS NOEMP/tenure loaders; ADR drafted jointly · freeze C1/C2Target pipeline: SUSB/BDS/QWI/J2J/JOLTS extracts committed with provenance notes; canonical banding proposal (C2)
SIPP noise-floor runs; seam-vs-J2J reconciliation run; draft E3–E5/E8–E10 thresholdsAggregate-side floor studies; target/gate partition; draft E1/E2/E6/E7/E11 thresholds · joint: referee round, lock C3
SIPP job-level reader (label-verified, family.py pattern); CPS NOEMP/tenure loaders; ADR drafted jointly · freeze IC1/IC2Target pipeline: SUSB/BDS/QWI/J2J/JOLTS extracts committed with provenance notes; canonical banding proposal (IC2)
SIPP noise-floor runs; seam-vs-J2J reconciliation run; draft E3–E5/E8–E10 thresholdsAggregate-side floor studies; target/gate partition; draft E1/E2/E6/E7/E11 thresholds · joint: referee round, lock IC3
Phase-0 QRF imputation of spells + attributes onto CPSCalibration of the imputed file to partitioned QWI/SUSB cells; E1/E7 evidence artifacts
Phase-1 transition candidates registered; one-shot runs against locked gatesBLM firm-type register prototype; E12 feasibility study (are published AKM/coworker moments sufficient targets?)
Joint: phase-2 go/no-go review with Max, based on committed gate evidence + the E12 identification story