Dataset
Routine vaccination coverage — district reporting, 2024
Monthly DHIS2-style aggregate reporting of six antigens across 38 health facilities, built so that genuinely low coverage and simply-did-not-report look identical until you separate them.
- Rows
- 2,736
- Variables
- 7
- Period
- 2024-01 to 2024-12
- Licence
- CC BY 4.0
- Completeness
- 77%
Standards and methodologies
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 |
|---|---|---|---|
facility_id | string | Pseudonymous health facility identifier, FAC001 to FAC038. | — |
facility_type | categorical | Level of the reporting facility. | health-post, health-centre, district-hospital |
period | date | Reporting month, given as the first day of the month. | — |
antigen | categorical | Vaccine antigen reported, in schedule order. | bcg, penta1, penta3, mcv1, mcv2, opv3 |
doses_administered | integer | Doses administered in the reporting month. Zero when no report was submitted. | — |
target_population | integer | Annual target population for the facility catchment. Divide by twelve for a monthly denominator. | — |
report_submitted | boolean | Whether the facility submitted its monthly report for the period. | true, false |
Provenance
Data quality
- Fully simulated. Coverage rates here describe no real district.
- The denominator is annual. Monthly coverage is doses divided by target_population over twelve, not by the full figure — dividing by the full target understates coverage twelvefold and is the most common mistake made against data shaped like this.
- A facility that did not report appears as a row with report_submitted false and zero doses, not as a missing row. Summing doses without filtering on that flag treats no report as no children vaccinated.
- Reporting completeness is 77% overall. Corrected for it, penta3 coverage sits in the low-to-mid 70s all year; uncorrected, it appears to collapse to under a third in August.
Known issues
- Reporting completeness falls to 29% in August and 45% in September. This is deliberate and is what makes the dataset useful for teaching completeness adjustment.
- Month-to-month noise puts penta3 above penta1 at least once in 37 of the 38 facilities, so a single-month check flags almost the whole district and is useless. Only six facilities — FAC009, FAC015, FAC021, FAC023, FAC034 and FAC035 — still show penta3 above penta1 on the annual total, which is the aggregation the flag has to be applied at.
- Median penta1 to penta3 dropout is about 14%, so a facility reporting near-zero dropout deserves as much suspicion as one reporting a very high figure.
Worked examples
Python
Coverage and dropout rate by facility
Computes penta1 to penta3 dropout and flags facilities where the rate is implausible.
R
Coverage and dropout rate by facility
The same dropout calculation and flagging logic written with tidyverse verbs.
Adjusting coverage for reporting completeness
Shows how reported coverage shifts once completeness is accounted for in the denominator, and how the August cliff disappears.