cassionData Analysis

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.

syntheticPublic HealthDHIS2VaccinationMaternal health
Rows
2,736
Variables
7
Period
2024-01 to 2024-12
Licence
CC BY 4.0
Completeness
77%

Standards and methodologies

UNICEF indicator definitionsSustainable 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

VariableTypeDescriptionAllowed values
facility_idstringPseudonymous health facility identifier, FAC001 to FAC038.—
facility_typecategoricalLevel of the reporting facility.health-post, health-centre, district-hospital
perioddateReporting month, given as the first day of the month.—
antigencategoricalVaccine antigen reported, in schedule order.bcg, penta1, penta3, mcv1, mcv2, opv3
doses_administeredintegerDoses administered in the reporting month. Zero when no report was submitted.—
target_populationintegerAnnual target population for the facility catchment. Divide by twelve for a monthly denominator.—
report_submittedbooleanWhether the facility submitted its monthly report for the period.true, false

Provenance

Source
Synthetic, generated by scripts/generate/routine_vaccination_coverage_2024.py
Collection method
Simulated monthly aggregate facility reporting
Geography
Anonymised district, structure typical of national EPI reporting
Period
2024-01 to 2024-12

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.