Certified Personnel Composition (Staff Characteristics)
Staff headcounts by certificate level, certification status, gender, employment status, and race/ethnicity for Georgia schools and districts, 2011-2024.
- 2011–2024
- annual
- 1.0.0
- 67f87ed56ccd
Overview
Georgia certified-personnel staff composition, from the Governor's Office of Student Achievement (GOSA) Certified Personnel report (compiled from local school systems' Certified/Classified Personnel Information (CPI) submissions). For every Georgia public school, school district, and the state as a whole, publishes staff headcounts along five mutually exclusive staff-attribute axes — certificate level (Bachelor's through Doctoral, plus Other), certification status (Professional / Provisional), gender, employment status (Full/Part-time), and race/ethnicity — for each of three employee groups (Administrators, PK-12 Teachers, Support Personnel), school years 2010-11 through 2023-24. This topic covers WHO the staff are; its sibling topics from the same GOSA source cover how experienced they are (`certified_personnel_experience`: years-of-experience band headcounts and the mean) and their positions and pay (`certified_personnel_compensation`: FTE position counts and average salary/contract days).
Row grain: One row per year, district_code, school_code, employee_type, staff_attribute_category, staff_attribute.
num_staff — Number Staff (count)
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 | GOSA district code (FK to the education districts dimension): 3-digit zero-padded for standard districts, 7-digit for state/commission charter schools (present from 2012 onward). NULL for state-level aggregate rows (the bronze sentinel `ALL`).Full description▾GOSA district code (FK to the education districts dimension): 3-digit zero-padded for standard districts, 7-digit for state/commission charter schools (present from 2012 onward). NULL for state-level aggregate rows (the bronze sentinel `ALL`). |
school_code | string | — | — | yes | 4-digit zero-padded GOSA school code (FK to the education schools dimension, composite key with district_code). NULL for district-level and state-level aggregate rows (the bronze sentinel `ALL`).Full description▾4-digit zero-padded GOSA school code (FK to the education schools dimension, composite key with district_code). NULL for district-level and state-level aggregate rows (the bronze sentinel `ALL`). |
employee_type | string | — | — | no | Which staff group the headcount covers: administrators, PK-12 teachers, or support personnel.Full description▾Employee group this headcount covers. Snake_case recode of bronze EMPLOYEE_TYPE: `administrators`, `pk_12_teachers`, `support_personnel`. 3 allowed values▾
|
staff_attribute_category | string | — | — | no | Which staff-attribute axis the row slices by: certificate level, certification status, gender, employment status, or race/ethnicity.Full description▾The staff-attribute axis this row belongs to. Each of the five axes partitions the SAME certified-personnel population a different way, so rows from different axes must never be summed together. Renamed from the confusing bronze DATA_CATEGORY family names: bronze `Certified Personnel` -> `certification_status`, bronze `Personnel` -> `employment_status`; the other three are direct snake_case recodes. The axis is functionally determined by `staff_attribute` (17 valid pairs, enforced by a quality check). 5 allowed values▾
|
staff_attribute | string | — | — | no | The specific attribute value within the chosen axis (e.g. 5_yr_masters, professional, female, full_time, black).Full description▾Specific attribute value within the axis. Snake_case recode of bronze DATA_SUB_CATEGORY — e.g. `5_yr_masters` (axis `certificate_level`), `professional` (axis `certification_status`), `full_time` (axis `employment_status`). `other` is the fifth CERTIFICATE LEVEL bucket (bronze `Other *`; the asterisk flags a source footnote), not a race value. Gender and race values reuse the canonical demographic vocabulary but describe STAFF — there is no `demographic` column and no join to the demographics dimension. `asian_pacific_islander` is the bronze staff-race label `Asian`: the source publishes only 6 race buckets with no separate Pacific Islander label in any year, and state-level race-bucket sums equal the gender-bucket sums (same population, residuals under 0.04% in both directions) — the pre-1997 OMB combined Asian + Pacific Islander bucket per data-cleaning-standards §5b. Certification status caveat: two source-defect windows on this axis are masked to NULL (see num_staff) — the whole axis in 2017 and the provisional bucket in 2020. 17 allowed values▾
|
num_staff | integer | — | yes | Whole-person headcount of staff in the employee group with the given attribute value.Full description▾Whole-person headcount of certified personnel in the employee group carrying the row's staff-attribute value. All 17 labels are verified-integral counts; the source has no suppression (zeros are real). Each staff_attribute_category axis partitions the same population, so only sum num_staff across rows WITHIN one axis (one staff_attribute_category value) — never across axes. Do not sum school rows to rebuild district or state headcounts (staff serving multiple schools are counted once per school assignment but deduplicated at higher levels). Two known source-defect windows on the certification_status axis are masked to NULL per §4b (the certification-axis staff sums otherwise match the gender-axis sums within ~0.3% — the internal test both windows fail): the ENTIRE axis in the 2016-17 file (captured ~3% of staff at every level, e.g. state professional PK-12 teachers 2,689 vs ~110,000 in adjacent years) and the provisional bucket in the 2019-20 file (state teachers 900 vs 4,745/4,716 neighbors; 102 of 214 districts at zero; professional passes the axis-sum test and is served). The bad values are recorded in the transform manifest and remain in bronze; they are not served. |
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 |
employee_type | categorical | administratorspk_12_teacherssupport_personnel | multi-value, enum-enforced, pick one |
staff_attribute_category | categorical | certificate_levelcertification_statusemployment_statusgenderrace_ethnicity | multi-value, enum-enforced, pick one |
staff_attribute | categorical | 17 allowed values▾
| multi-value, enum-enforced, pick one |
district_type | dimension_attribute | 7 allowed values▾
| multi-value, enum-enforced |
school_level | dimension_attribute | elementarymiddlehighk12other | multi-value, enum-enforced |
locale | dimension_attribute | citysuburbtownrural | 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/certified_personnel_composition"schools data for 2024
curl "https://georgiacivicdata.org/api/v1/education/certified_personnel_composition?year=2024"Filtered to employee_type = administrators for 2024
curl "https://georgiacivicdata.org/api/v1/education/certified_personnel_composition?year=2024&employee_type=administrators"One district (code 644), 2024
curl "https://georgiacivicdata.org/api/v1/education/certified_personnel_composition?district_code=644&year=2024&detail=districts"Download 2024 as CSV
curl "https://georgiacivicdata.org/api/v1/education/certified_personnel_composition?year=2024&format=csv"Notes & limitations
NULL handling
- Zero is a real, reported value.
Limitations
This source has no suppression markers in any year (2010-11 through 2023-24); zero counts are published as real `0` values. num_staff is NULL only on the two masked source-defect windows described below. The five staff_attribute_category axes each partition the SAME certified-personnel population a different way — sum num_staff only across rows within a single axis, never across axes (the total would multiply-count every person). staff_attribute_category is functionally determined by staff_attribute (17 valid pairs). Gender and race/ethnicity values reuse the canonical demographic vocabulary but describe STAFF, not the student demographic axis — there is no `demographic` column and these rows do not join the demographics dimension. The race_ethnicity axis uses the pre-1997 OMB combined `asian_pacific_islander` bucket (no separate Pacific Islander label exists in the source). Two known source-defect windows on the certification_status axis are MASKED to NULL rather than served (§4b known-source-defect rule; both fail the internal certification-vs-gender axis-sum test that every other year passes within ~0.3%): the entire axis in the 2016-17 file (captured ~3% of staff at every level) and the provisional bucket in the 2019-20 file (~19% of adjacent years; 102 of 214 districts at zero; professional passes the test and is served). The published defect values remain in bronze and in the transform manifest's mask ledger. School rows must not be summed to rebuild district or state headcounts: staff serving multiple schools are counted once per school assignment but deduplicated at higher levels, so a district count can even be smaller than a single school's count (observed only in employment_status/part_time; 1,811 cells). State rows have NULL district_code and school_code; district rows have NULL school_code. Experience and compensation/salary measures from the same GOSA source live in the sibling topics `certified_personnel_experience` and `certified_personnel_compensation`.