Out-of-Field Teachers
Share of Georgia teachers assigned to a subject they are not certified in, by school, district, and poverty stratum, 2018-2024.
- 2018–2024
- annual
- 1.0.0
- 35a095021777
Overview
Georgia Office of Student Achievement (GOSA) Out-of-Field teacher FTE report. For every Georgia public school, school district, and the state as a whole, reports the total teacher full-time equivalent (`total_fte`), the FTE of teachers assigned to a subject for which they are not certified (`out_of_field_fte`), and the out-of-field FTE as a percentage of total FTE (`out_of_field_fte_rate`, on a 0-1 decimal scale). Each entity has three rows — Total, High Poverty, and Low Poverty — reporting the same three metrics across poverty strata of schools. Coverage spans the 2017-2018 school year through 2023-2024.
Row grain: One row per year, district_code, school_code, poverty_subgroup.
out_of_field_fte_rate — Out of Field FTE Rate (proportion)
The single headline value most answers want.
Variables
Every column in the fact table. The code is the exact field name the API returns.
| Column | Type | Unit | Range | Null? | Description |
|---|---|---|---|---|---|
year | integer | — | — | no | Ending calendar year of the school year. Year 2024 = 2023-2024 school year. Derived from the bronze `LONG_SCHOOL_YEAR` column's ending year.Full description▾Ending calendar year of the school year. Year 2024 = 2023-2024 school year. Derived from the bronze `LONG_SCHOOL_YEAR` column's ending year. |
district_code | string | — | — | yes | 3-digit GOSA district code (zero-padded) for standard districts; 7-digit charter code for charter / specialty-school districts; NULL for state-level aggregate rows. FK to the education districts dimension. Because the source publishes only district NAMES (no codes), codes are resolved against `data/gold/education/_dimensions/districts.parquet` via the shared educator-topic resolver (year-aware certified_personnel lookups, curated code pins, and guarded name matching — see src/etl/education/gosa/_educator_lookups.py). Rows whose names cannot be resolved are dropped only under documented predicates; the transform manifest records each dropped class and count per year.Full description▾3-digit GOSA district code (zero-padded) for standard districts; 7-digit charter code for charter / specialty-school districts; NULL for state-level aggregate rows. FK to the education districts dimension. Because the source publishes only district NAMES (no codes), codes are resolved against `data/gold/education/_dimensions/districts.parquet` via the shared educator-topic resolver (year-aware certified_personnel lookups, curated code pins, and guarded name matching — see src/etl/education/gosa/_educator_lookups.py). Rows whose names cannot be resolved are dropped only under documented predicates; the transform manifest records each dropped class and count per year. |
school_code | string | — | — | yes | 4-digit GOSA school code (zero-padded); NULL for district-level and state-level aggregate rows. FK to the education schools dimension (composite key with district_code). Resolved by name via the shared educator-topic resolver; school-level rows whose name cannot be resolved to a dimension entry are dropped under documented source-gap predicates only (counts in the transform manifest).Full description▾4-digit GOSA school code (zero-padded); NULL for district-level and state-level aggregate rows. FK to the education schools dimension (composite key with district_code). Resolved by name via the shared educator-topic resolver; school-level rows whose name cannot be resolved to a dimension entry are dropped under documented source-gap predicates only (counts in the transform manifest). |
poverty_subgroup | string | — | — | no | School-poverty stratum the row covers: all schools (total), or only the highest- or lowest-poverty quartile; a school-poverty level, not a student demographic.Full description▾Poverty stratum of the schools whose FTE this row aggregates. `total` covers all schools in the entity; `high_poverty` covers only the entity's schools in the state's highest-poverty quartile; `low_poverty` only those in the lowest-poverty quartile. Per GOSA's K-12 Teacher & Leader Workforce Reports, a school's poverty level is defined by its direct-certification rate (the share of students directly certified for free/reduced-price meals) — higher direct certification means higher poverty. For a school-level row the stratum describes the school itself, so `high_poverty`/`low_poverty` rows duplicate that school's `total` row (enforced by a quality check). This is a SCHOOL-poverty stratum, NOT a student demographic — it does not map to the global demographics dimension. 3 allowed values▾
|
total_fte | number | — | yes | Total teacher full-time equivalent count in the entity (or in the poverty subgroup). Fractional FTEs are real (e.g. 42.5). NULL when suppressed by the GOSA reporting floor (`TFS`, < 10 teachers; 2022 onward only). Denominator of `out_of_field_fte_rate`. The 2019 statewide level (162,256.2) is ~37% above neighboring years (2018: 118,009.1; 2020: 110,800.8) — a broader teacher population GOSA reported that year at every detail level; and the 2018 file mixes scopes across levels (school rows broad, district/state rows narrow). Preserved faithfully per data-cleaning-standards §4b (extreme-but-conceivable).Full description▾Total teacher full-time equivalent count in the entity (or in the poverty subgroup). Fractional FTEs are real (e.g. 42.5). NULL when suppressed by the GOSA reporting floor (`TFS`, < 10 teachers; 2022 onward only). Denominator of `out_of_field_fte_rate`. The 2019 statewide level (162,256.2) is ~37% above neighboring years (2018: 118,009.1; 2020: 110,800.8) — a broader teacher population GOSA reported that year at every detail level; and the 2018 file mixes scopes across levels (school rows broad, district/state rows narrow). Preserved faithfully per data-cleaning-standards §4b (extreme-but-conceivable). | |
out_of_field_fte | number | — | yes | Teacher FTE assigned to a subject for which the teacher is not certified (teaching out of field) in the entity (or poverty subgroup). NULL when suppressed (`TFS`, < 10 FTE) — observed from 2022 onward (~88% of school-level rows). KNOWN ANOMALY: 2018-2021 files have no explicit suppression but carry implausibly high concentrations of literal 0 (2020: 48% of school-level rows; 2021: 18%) that almost certainly encode suppression as zero. True zeros cannot be mechanically separated, so every bronze 0 is preserved as 0.0 — treat 2018-2021 zeros with caution (school-level aggregates including 2020 are biased toward zero). Numerator of `out_of_field_fte_rate`. In this topic the 2018-2022 bronze OUTOFFIELD_FTE column carries genuine out-of-field values (unlike the sibling emergency-credentials topic, whose 2018-2021 bronze mislabels Emergency values under the same header).Full description▾Teacher FTE assigned to a subject for which the teacher is not certified (teaching out of field) in the entity (or poverty subgroup). NULL when suppressed (`TFS`, < 10 FTE) — observed from 2022 onward (~88% of school-level rows). KNOWN ANOMALY: 2018-2021 files have no explicit suppression but carry implausibly high concentrations of literal 0 (2020: 48% of school-level rows; 2021: 18%) that almost certainly encode suppression as zero. True zeros cannot be mechanically separated, so every bronze 0 is preserved as 0.0 — treat 2018-2021 zeros with caution (school-level aggregates including 2020 are biased toward zero). Numerator of `out_of_field_fte_rate`. In this topic the 2018-2022 bronze OUTOFFIELD_FTE column carries genuine out-of-field values (unlike the sibling emergency-credentials topic, whose 2018-2021 bronze mislabels Emergency values under the same header). | |
out_of_field_fte_rate | number | — | yes | Share of teacher FTE assigned out of field, on a 0-1 scale (out_of_field_fte / total_fte).Full description▾`out_of_field_fte` / `total_fte` on a 0-1 decimal scale. Bronze publishes an integer 0-100 percent (verified range 0-100 across all years); divided by 100 per data-cleaning-standards §4. Because GOSA rounds the percent to an integer computed from unrounded FTE values, the published rate deviates from out_of_field_fte/total_fte by up to 0.0124 at entities with total_fte >= 3 (enforced within 0.015 by a quality check scoped to total_fte >= 3). At 26 tiny-FTE rows (total_fte < 3, 2018-2021 alternative programs) the published percent deviates by up to 0.57 from the rounded-FTE quotient (e.g. 1.0/1.0 published as 50%) — GOSA evidently computed those percents from unrounded FTE values; the published rate is preserved per §4b (extreme-but-conceivable, not impossible). |
Filters
Query parameters the fact endpoint accepts. Comma-separated values are OR within a parameter; multiple parameters AND together.
| Parameter | Kind | Allowed values | Notes |
|---|---|---|---|
year | year_exact | any value | — |
year_min | year_range | any value | — |
year_max | year_range | any value | — |
detail | detail | districtsschoolsstates | enum-enforced, default: schools |
district_code | foreign_key | any value | multi-value |
school_code | foreign_key | any value | multi-value |
poverty_subgroup | categorical | high_povertylow_povertytotal | multi-value, enum-enforced |
district_type | dimension_attribute | 7 allowed values▾
| multi-value, enum-enforced |
Example requests
Run these against the base URL — they return live data.
All rows (first page), schools level
curl "https://georgiacivicdata.org/api/v1/education/educator_qualifications_out_of_field_teachers"schools data for 2024
curl "https://georgiacivicdata.org/api/v1/education/educator_qualifications_out_of_field_teachers?year=2024"Filtered to poverty_subgroup = high_poverty for 2024
curl "https://georgiacivicdata.org/api/v1/education/educator_qualifications_out_of_field_teachers?year=2024&poverty_subgroup=high_poverty"One district (code 601), 2024
curl "https://georgiacivicdata.org/api/v1/education/educator_qualifications_out_of_field_teachers?district_code=601&year=2024&detail=districts"Download 2024 as CSV
curl "https://georgiacivicdata.org/api/v1/education/educator_qualifications_out_of_field_teachers?year=2024&format=csv"Notes & limitations
NULL handling
- Suppressed cells (too few students to report) are NULL, never zero.
- Zero is a real, reported value.
Limitations
Cross-topic lineage caveat: the sibling emergency-credentials topic's 2018-2021 bronze files re-use the column headers OUTOFFIELD_FTE / OUTOFFIELD_FTE_PCT for Emergency-credential values (its 2021 state total is 9,796.9). THIS topic's bronze is the genuine out-of-field report (2021 state total 6,281.9) — do not reconcile the two by column name. Suppression is era-asymmetric: 2018-2021 files contain no TFS markers at all, while 2022 onward suppress values below 10 with TFS (treat NULL as 'value < 10' for 2022+; NULL does not occur before 2022). KNOWN ANOMALY: 2018-2021 out_of_field_fte carries implausibly many literal zeros (48% of 2020 school rows) that almost certainly encode suppression as 0; all zeros are preserved per bronze fidelity and consumers must handle 2018-2021 zeros explicitly. The FTE denominator has scope shifts: the 2019 file reports a ~37% broader teacher population at every detail level, and the 2018 file mixes scopes ACROSS levels (school rows broad — statewide school-row total_fte sums to 157,557.3 — while district and state rows are narrow, state row 118,009.1), so 2018 school rows do NOT sum to their district or state aggregates. The source publishes only district/school NAMES, so codes are resolved by name against the education dimensions via the shared educator-topic resolver (year-aware certified_personnel lookups, curated code pins, guarded matching); rows that cannot be resolved are dropped only under documented predicates — redundant 2023 truncated charter-container aggregates and cataloged source gaps — with per-year counts in the transform manifest. State rows have NULL district_code and school_code; district rows have NULL school_code.