Methodology
The observatory does three things: it keeps exact copies of what government bodies publish, it reads the values out of them, and it compares those values with earlier ones by fixed rules. Every rule is on this page. No model writes a number or a sentence.
The health score
The score puts India and each state on one scale from 0 to 100, built from three systems. The rules below are rendered from the code that computes the score (core/src/score/goalposts.ts), so they cannot drift apart.
- Each marker is placed between a worst and a best goalpost: at the worst it scores 0, at the best 100, in between proportionally.
- A system's score is the average of its markers.
- The overall score is the average of the systems, each weighted equally. A missing system's weight is shared by the others; at least two systems are needed.
- Only current markers with a clear better-or-worse direction count. A survey stays current for five years after its fieldwork ends; administrative data for two. Outbreak reports, HMIS (public data ends May 2021), health spending, and crude (not age-adjusted) chronic-disease rates are shown but not scored.
- Small-sample estimates (bracketed survey values, single-city figures) are shown with a warning but never scored.
A place with data for only some systems gets a partial score, shown as partial and ranked separately from places measured on every system.
India's score uses India's own national figures, which already weigh each state by its population, rather than averaging 36 states equally.
Maternal & child
How many babies, young children and mothers survive, and whether they get the basic care that keeps them alive.
| Marker | Scores 0 at | Scores 100 at | Why |
|---|---|---|---|
| infant mortality rate | 60 | 5 | 60 deaths per 1,000 is roughly where India stood in the mid-2000s; 5 is what the best-performing states and high-income countries achieve. |
| neonatal mortality rate | 40 | 3 | 40 per 1,000 is about India's mid-2000s level; 3 matches the best health systems. |
| under five mortality rate | 75 | 5 | 75 per 1,000 is about India's level when SRS began reporting it; 5 matches the best health systems. |
| maternal mortality ratio | 300 | 20 | 300 per 100,000 births is about India's level in the early 2000s; 20 is what high-income countries achieve. |
| full immunisation coverage | 40 | 95 | 40% is about India's level in NFHS-3 (2005-06); 95% is the coverage WHO cites for stopping measles spreading. |
| institutional births | 40 | 100 | 40% is about India's level in NFHS-3 (2005-06); the goal is every birth in a health facility, which several states already reach. |
| antenatal care 4 visits | 30 | 100 | 30% is below every state today and India's NFHS-3 level; WHO now recommends eight contacts, so four for every mother is a floor, not a stretch. |
Child nutrition
How many young children are too short, too thin or too light for their age.
| Marker | Scores 0 at | Scores 100 at | Why |
|---|---|---|---|
| child stunting | 50 | 5 | 50% is about India's level in NFHS-3 (48%, 2005-06), above every state today; 5% is in WHO's 'low' prevalence band. |
| child wasting | 30 | 3 | 30% is above every state in the last three survey rounds; WHO calls under 2.5% 'very low'. |
| child underweight | 50 | 5 | 50% is above India's NFHS-3 level (42.5%) and every state today; 5% is what well-nourished populations show. |
Population health
How long people live, and whether girls are born in natural numbers.
| Marker | Scores 0 at | Scores 100 at | Why |
|---|---|---|---|
| life expectancy at birth | 60 | 80 | 60 years is about where India was in the early 1990s; 80 is where the longest-lived countries are. |
| sex ratio at birth | 850 | 950 | About 950 girls per 1,000 boys is the natural ratio; 850 signals strong sex selection. |
Air quality
How clean the air has been over the last 12 months in monitored cities.
| Marker | Scores 0 at | Scores 100 at | Why |
|---|---|---|---|
| air quality index | 300 | 50 | On India's AQI scale, up to 50 is 'Good' and above 300 is 'Very Poor'. A 12-month average, so the score reflects the air people breathe across seasons, not this month's weather. |
| cities with poor air | 50 | 0 | No city with poor air scores 100; half of a state's cities at 'Poor' or worse, on an average day of the last 12 months, scores 0. |
The status words beside every score are bands of the same number: 80 and above is Strong, 65 to 79 Good, 50 to 64 Fair, and below 50 Low.
From file to figure
- Every response from a publisher is stored byte for byte and named by its SHA-256 digest. That copy is what
/archive/<digest>serves, so a figure can be checked against the file even after the original link changes. - One publication (a week’s report, a month of data, an annual bulletin) is one release. If the publisher re-issues it with different contents, the new file becomes a new release and the old one is marked superseded, never deleted.
- A release is validated as a whole before anything is stored: every place must be a known state or union territory, every indicator must belong to that source, every value must sit inside the indicator’s plausible range, every period must be sane, and every value must say where in the document it was read. One failure rejects the whole release; nothing partial is ever published.
- When a re-issued release changes a value already published, the change is recorded as a revision with both values and both releases. Revisions are listed on every indicator page.
- Some government hosts only answer requests from Indian IP addresses. Those files are fetched through the observatory’s relay in Mumbai, and the release page says so.
Signals
After every release, each series (one indicator in one place) is compared with its own past. A comparison that clears its threshold becomes a signal: a sentence written from a fixed template, a strength score from 0 to 10 used only for ordering, and an assessment.
Assessment
Each indicator declares whether higher or lower is better. A move in the better direction is improving, the other way deteriorating. Where neither direction is better in itself, any flagged move is unusual. A change of exactly zero is unchanged.
Robust deviation
Most scores measure how far a value sits from a reference set, in a way that a single odd year cannot distort:
z = (x − median(reference)) ÷ max(1.4826 × MAD, 5% of |median|, printed resolution)
MAD is the median absolute deviation. The two floors stop a very steady history from turning a tiny move into a large score: 5% of the typical level, and the resolution the figure is printed at (1 for a rate published in whole numbers, 0.1 for one published to a decimal). For counts, which are noisy when small, a Poisson-style deviation is used instead:
z = (x − expected) ÷ √(expected + 1)
A count must also have moved a lot in relative terms, so its score is the smaller of that deviation and the per-cent change divided by 20 (a 20% change counts as 1). The Poisson part alone would call a 4% dip in lakhs of operations extreme; the relative part alone would call one outbreak becoming three a tripling.
count score = min(|z|, |per cent change| ÷ 20)
Damping
Some comparisons are weaker than they look, so their scores are reduced. When either value is a small-sample estimate (the Sample Registration System marks these for smaller states), the score is multiplied by 0.4. When the two periods overlap, as consecutive three-year pooled periods do (2021–23 and 2022–24 share two years), it is multiplied by 0.5. Weekly, monthly and daily comparisons that touch the COVID-19 disruption (25 March 2020 to 30 June 2021), when service use and reporting fell sharply, are also multiplied by 0.5; annual series are not. The signal’s context line says which applied.
Indicators without signals
Some indicators are bookkeeping rather than news, such as the number of cities reporting air quality on a day. They are shown with their data but never produce signals.
The size of a move
Several scores need the size of a move on a common scale, where 1 is a routine but real change. For most indicators that is the per-cent change divided by 5, so a 5% move counts as 1. Shares (indicators measured in per cent) move in percentage points instead, so their size is the change in points divided by 2.5: a share going from 1% to 4% is a 3-point move, not a 300% rise. Sentences say “+3 points” for shares, a per-cent change otherwise, and “from none” when the earlier value was zero.
size = |per cent change| ÷ 5, or for shares |change in points| ÷ 2.5
Change on the previous period
For annual and multi-year indicators. The latest value is compared with the one before it.
score = min(10, √( size × max(z, 0.5) ) × damping)
Here z is the robust deviation of this step against up to seven previous year-to-year steps (zero when there are fewer than three). The score is a geometric mean of how big the move is and how out of character it is for this series, so neither a large percentage on a tiny base nor a routine step can score high on its own. Every annual period gets this signal; the score says whether it is unusual. Its context line gives the typical size of a year-to-year move.
Change on a year earlier
For monthly indicators, and weekly indicators that are not counts (weekly counts and daily data are compared differently; see below). The value is compared with the same week or month a year earlier, matched by label (week 38 of 2026 with week 38 of 2025), which removes ordinary seasonality.
z = (count score for counts, otherwise size ÷ 2) × damping
A signal needs z of at least 2 (weekly) or 1.5 (monthly). For counts the difference must also be at least 3, so that two cases becoming five does not register as a surge. Score = min(10, z).
Outside the usual range
For monthly indicators, and weekly indicators that are not counts, with at least three earlier years. The value is compared with the median of the same period in up to five previous years (robust deviation; the count score for counts), halved when any of those periods falls in the COVID-19 disruption. A signal needs a deviation half a point above the year-on-year threshold for that cadence, and for counts a difference of at least 3. Score = min(10, |z|).
Weekly counts: four weeks against the same four weeks in earlier years
A single week of outbreak reports holds a handful of events, too few to compare. So weekly counts (outbreaks reported to IDSP) are added up over the four weeks to each week, as long as those four weeks span no more than 28 days, and compared with the median of the same four weeks in up to three earlier years, needing at least two. The baseline is short on purpose, because reporting itself has grown over the years. Weekly counts get no year-on-year signal and no single-week comparison.
z = count score(4-week total, median of the same 4 weeks in earlier years); score = min(10, z)
Only rises are signalled, because a fall in reported outbreaks mostly means reports did not arrive. A signal needs z of at least 2 and a total at least 5 above the median. The context line lists the same four weeks in each earlier year and the four weeks before, and says that the counts reflect reporting as well as disease.
Daily data: the week against the same week in earlier years
A single day’s air quality mostly reflects the weather, so daily indicators are never compared day against day, and have no year-on-year signal. Instead the mean of the seven days to each date (at least five of them present) is compared with the mean of the same seven days in up to five earlier years, needing at least three.
z = robust deviation of this week’s mean against the earlier weeks’ means; score = min(10, √(|z| × size ÷ 2)) × 0.4 for small samples
It is a breach only when |z| is at least 2.5 and the week is at least 15% away from the median (5 percentage points for shares). If what is being averaged has changed by more than a fifth (for example, the number of cities reporting in a state), part of the move is about which places are measured rather than the air, so z is halved and the context line says so. Small-sample figures, such as a state with a single monitoring city, are multiplied by 0.4 and labelled. A breach is reported once, when an unusual run begins, and again for the latest day while the run lasts, not once a day. The signal page shows the seven-day mean beside the day’s own value.
Records
A value higher (or lower) than every one of the previous N periods, where N, the bar, is at least 5 for annual series, 12 for monthly, 26 for weekly and 90 for daily or hourly: daily air quality swings with the seasons, so a daily record must beat at least a quarter of a year. “Highest in the series” is only said once the series is at least twice the bar long (two years for daily data). For counts, only highs count, and only from 5 up: a record of 3 outbreaks is noise, and a record low of zero is usually a missing report. Count records are written as “the most since”.
score = min(10, 1 + 2 × log₂(run ÷ bar) + 1 if it is a record for the whole series)
Scoring against each cadence’s own bar puts a daily and an annual record on the same footing. A steadily improving series sets a record every period; only the first of a streak scores, and the rest are kept (they are true) with a score of 0.5, which keeps them off the front page and out of the default list of changes. Small-sample records are multiplied by 0.4.
State versus India
For the latest three periods, each state’s value is compared with the spread of all states’ values in the same period (robust deviation). It is flagged when |z| is at least 2 and at least eight states reported. It is not computed for counts, which scale with population, or for daily and hourly data. The sentence states the all-India figure for the same period. This compares levels, not change, so it never counts towards a status.
The pulse rule
Alongside the health score, topic pages give each of the eight systems a status word (improving, watch, deteriorating, steady) from its signals. Each system is judged separately, for India and for each state, using only the signals about the latest period each of its indicators has been published for. A state that has not yet reported that period, or a unit that no longer exists, has no current signal rather than an old one.
- Each indicator takes the assessment of its strongest current change signal, if that signal’s score is at least 1. Otherwise the indicator is quiet for this period.
- The system then reads, checked in this order:
- Steady when no indicator moved.
- Deteriorating when at least one indicator deteriorated with a score of 3 or more, and deteriorations are at least as many as improvements.
- Improving when some indicators improved and none deteriorated or moved unusually.
- Watch for everything else: mixed movement, a weak deterioration, or an unusual move.
- Only indicators that pass the freshness rule count. If every indicator with data in a system is stale, the status is still worked out from them, but the page says “Latest public data” with its period, and that the status describes that period, not today.
- A system with no indicator holding data gets no status. It says so: not yet covered, awaiting its first release, or no figures for that state.
The rule is deliberately cautious about bad news (it needs one strong deterioration) and strict about good news (any deterioration or unusual move blocks “improving”). The trend shown beside each system is its first indicator with at least three published periods.
What changed, hotspots and tiles
- What changed on the front page lists current change signals from current sources with a score of at least 1, strongest first: one per place and source (a state’s average and highest-city air quality are often the same number), at most two per indicator and at most four per source, so no feed or series can crowd out the rest. The full list is ordered newest period first, then by score, and by default leaves out signals scoring below 1; one click includes them.
- Hotspots are the states with the strongest current deteriorating signal in that system, up to three. For outbreaks, the districts listed are those with the most outbreaks in the latest four reporting weeks, counting new and late-reported outbreaks but not follow-up entries for earlier ones. Districts are named as printed until district geography arrives in V2.
- Tiles shade states in five steps of one colour, cut at the quintiles of the values shown (equal intervals when the values are too few to split). Every state is one equal tile; no boundary is drawn.
Freshness
Each source shows two dates that mean different things: the period its latest published release describes (“data for week 38 of 2026”), and when the observatory last fetched from the publisher. A monthly or annual source can be fetched today and still describe a period months or years ago; the site always says which. Pipeline runs are logged whether or not they find anything new, so a silent source shows up as such.
Current and stale
Every publisher reports late, and each cadence has a normal lag. An indicator is current when the latest period published for it ended within that lag of today, and stale otherwise. A source is current when any of its indicators is.
| Cadence | Normal lag |
|---|---|
| Hourly | 2 days |
| Daily | 3 days |
| Weekly | 10 weeks (IDSP publishes 5 to 7 weeks late) |
| Monthly | 4 months |
| Annual | 24 months |
| Multi-year | 48 months |
Signals from current sources lead the front page and the list of changes. Signals from stale sources are kept, because they are true, but shown apart under “From older releases”, with the date the source’s public data ends. They never count towards a system’s status while any current indicator in that system has data.