Skip to content
← All datasets

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.

Year coverage
20182024
Updated
annual
Version
1.0.0
Schema hash
35a095021777

Detail levels available

StateDistrictSchool · default

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.

Key metric

out_of_field_fte_rateOut 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.

ColumnTypeUnitRangeNull?Description
yearYearintegernoEnding 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_codeDistrict Codestringyes3-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.

Joins districts; adds its label columns.

school_codeSchool Codestringyes4-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).

Joins schools; adds its label columns.

poverty_subgroupPoverty SubgroupstringnoSchool-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
  • high_poverty
  • low_poverty
  • total — total / aggregate
total_fteTotal FTEnumbercountyesTotal 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_fteOut of Field FTEnumbercountyesTeacher 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_rateOut of Field FTE RatenumberproportionyesShare 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.

ParameterKindAllowed valuesNotes
yearyear_exactany value
year_minyear_rangeany value
year_maxyear_rangeany value
detaildetaildistrictsschoolsstatesenum-enforced, default: schools
district_codeforeign_keyany valuemulti-value
school_codeforeign_keyany valuemulti-value
poverty_subgroupcategoricalhigh_povertylow_povertytotalmulti-value, enum-enforced
district_typedimension_attribute
7 allowed values
  • commission_charter
  • resa
  • standard
  • state_agency
  • state_charter
  • state_school
  • state_special
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.