Lab · Intermediate
The page they open twice
Build a dashboard and the report around it for a vaccination programme, starting from a twenty-tile request. The deliverable is not the page — it is the page, the definition panel behind it, and the paragraph refusing seventeen of the tiles.
The EPI manager has asked for a dashboard. The request, verbatim:
“Doses by antigen, by facility, by month. Coverage against target. Dropout. Stock-outs. Which facilities are reporting. Cold chain. Staffing. Everything from the logframe. And a map.”
You have the routine coverage export and nothing else. Build what they need.
The file
vaccination-coverage-2024.v1.csv — 2,736 facility-month-antigen rows with doses
administered, target population and whether a report was submitted.
Part one: get the decision out of them
You cannot interview the manager, so infer it from what the data can answer and write it down as if you had.
Write the one sentence the page exists for, in the shape lesson 1 requires: a verb and an object. Then write the “requested and not included” paragraph, naming where each excluded item goes instead.
Three of the requested items cannot be answered from this file at all. Name them and say what would be needed.
Part two: the three numbers
Choose at most four tiles. For each, write the threshold — the value at which somebody would do something different. A tile whose threshold you cannot state does not go on the page.
The candidates worth weighing:
- coverage by antigen against target, for one antigen or for all six;
- penta1-to-penta3 dropout;
- reporting completeness;
- the number of facilities that missed a month.
Dropout is the one to argue for. It compares a facility against itself, so the target population — which decides every coverage figure and is the least reliable column in the file — cancels out of it entirely.
Part three: the page
Build it as a single self-contained HTML file: inline CSS, no JavaScript, no external request. Reading order from lesson 2 — title and purpose, tiles, table, figure if one is needed, context, method, and what it does not show.
Then print it. If the tiles do not survive greyscale, the colour is carrying information it should not.
Part four: the definition panel
Write indicator-definitions.md with an entry per indicator: numerator,
denominator, the level it is valid at, the standard, and the decision informed.
Then add the assertion from lesson 4. Your pipeline computes coverage; the definitions document states it. Make a disagreement fail the build.
assert abs(computed["penta3_coverage"] - DEFINITIONS["penta3_coverage"]) < 0.001
Part five: the report and the annex
Four pages at most, in the order lesson 5 uses: recommendation first, “what this does not establish” as a numbered section, methodology absent and linked.
The annex holds the comparisons run, the exclusions with counts after each step, and a reproduction note.
Check your numbers
| Expected | |
|---|---|
| Rows | 2,736 |
| Reports submitted | 2,094 of 2,736 |
| Reporting completeness | 76.5% |
| Antigens | 6 |
| Penta1 to penta3 dropout | 13.8% |
| Facilities | 38 |
If your coverage figures look implausibly high or low, check the denominator before the numerator — the target population is declared per facility-month and is where almost every coverage problem in routine data lives.
The questions to answer in prose
Three sentences each.
1. You excluded seventeen requested items. Pick the one the manager will push back on hardest, and write the sentence you would say — including where it goes instead.
2. Reporting completeness is 76.5%. Explain what that does to every coverage figure on your page, and say whether you put it on the page as a tile or in the method note, and why.
3. Dropout uses the same facility as its own denominator and coverage does not. Say what that buys, and name the question dropout cannot answer that coverage can.
What to hand in
dashboard/index.html, self-contained, no script, under 20 kBindicator-definitions.md, one entry per indicator- the pipeline, with the assertion tying the two together
report.md, four pages, and its annex- the “requested and not included” paragraph
- the three prose answers
How to know you are done
Give the page to someone who was not in the analysis and ask what decision it supports. If they describe the data, the page is a data dump with better spacing.
Then change one number in the definitions document to a wrong value and rerun. The build must fail. If it does not, the panel is documentation rather than a check, which is the distinction lesson 4 exists for.
What this lab is not
It is not a vaccination analysis. The coverage story here — that a denominator decides it far more than a numerator — is one the routine data course already established, and reproducing it is the material rather than the finding.
It is also not a tooling exercise. Anything that emits HTML will do. What is being assessed is what you left off the page and whether you wrote down why.