Dataset
School attendance and dropout — 2024 term
Two joinable synthetic files — a roster of 1,200 students across 24 schools and 70,245 daily attendance records — built so dropout is only visible if you look for consecutive absences rather than a term average.
syntheticEducationKoboToolboxStudent attendanceDropout analysisSchool feeding
- Rows
- 71,447
- Variables
- 6
- Period
- One term, 5 February to 26 April 2024
- Licence
- CC BY 4.0
- Completeness
- 99%
Standards and methodologies
Sustainable Development Goals (SDG)
Files
Files are versioned by filename. A corrected release ships as .v2.csv rather than replacing the file in place, so an analysis pinned to v1 keeps reproducing.
Data dictionary
| Variable | Type | Description | Allowed values |
|---|---|---|---|
student_id | string | Pseudonymous student identifier. The key that joins the roster to the attendance file. | — |
school_id | string | Pseudonymous school identifier, SCH01 to SCH24. | — |
grade | integer | Grade level the student was enrolled in, 1 to 8. | — |
feeding_programme | boolean | Whether the student's school operated a school feeding programme that term. | true, false |
attendance_date | date | School day the attendance was recorded for. Weekdays only, 5 February to 26 April 2024. | — |
present | boolean | Whether the student was marked present that day. | true, false |
Provenance
Data quality
- Simulated records. No real student is represented and every identifier is generated.
- Attendance rows exist only for days a school was open. A date with no row is a closure, not an absence — the distinction changes the dropout ranking completely, and nothing in the file marks which is which.
- Overall attendance is about 88%. Schools running a feeding programme sit around 90% against 85% without, so the effect is real but small enough that a naive comparison of raw means overstates it.
- Around 7% of students disengage during the term. Attendance decays over roughly three weeks before stopping, which is what makes early warning possible at all.
Known issues
- SCH07 and SCH18 have no attendance rows for the fifteen school days from 11 to 29 March, a strike period. Counted as absences, both schools look like a dropout emergency.
- SCH09 recorded attendance with Y and N instead of true and false for about 30% of its rows. A boolean cast will silently turn those into missing values.
- Two students appear on the roster twice after a transfer that was never de-registered. Joining attendance to the roster fans their rows out and double-counts them.
- About 3% of roster rows are missing grade, and a small number of attendance days were never marked either way.
Worked examples
Python
Dropout risk from attendance patterns
Joins roster to attendance, builds consecutive-absence features per student, and ranks dropout risk before term end.
R
Attendance and the school feeding programme
Compares attendance between schools with and without feeding programmes, excluding the strike period so the closure does not masquerade as absence.