Skip to content

docs: catalog the UCDP events concentrated by measurement (#533) - #534

Merged
Polichinel merged 1 commit into
developmentfrom
docs/533-summary-event-concentration-catalog
Nov 4, 2026
Merged

Polichinel merged 1 commit into
developmentfrom
docs/533-summary-event-concentration-catalog

Conversation

@Polichinel

Copy link
Copy Markdown
Contributor

Closes nothing. Documents the measurement behind #533 and #484; both stay open pending a policy
decision that is not this PR's to take.

What this is

views-hydranet reported that one cell-month held 62% of a scored horizon's truth mass, collapsing
that score's effective sample size to 2.58 cells out of 842,634 — deleting a single data point
moved the score by 83×. This PR catalogs the whole class that cell belongs to.

Measurement only. No code, configuration or data changed.

Headline figures

Events landing in a cell-month their own UCDP precision fields disown 21,766 (5.8%), carrying 21.95% of all fatality mass
The severe class — spatially and temporally unresolved 457 events (0.12%), carrying 11.22%
Top ten cell-months 431,802 fatalities = 12.4% of the dataset
One 0.5° cell (148759, 13.25N 39.25E, Tigray/Amhara) 270,688 = 7.79% of every fatality recorded 1989–2026

Two mechanisms, not one

The first pass at #533 found only the temporal one. The spatial one is nearly as large and was
missed:

  • Temporal — date_end_only assigns an annual-source event to its date_end month "regardless
    of whether the event spans multiple months" (its own docstring). A year-long aggregate lands on
    one month. 3,315 events, 17.79% of mass.
  • Spatial — passthrough returns an event unchanged whatever its where_prec, and
    production_parity excludes only where_prec 4 and 6. So 5 (country-level) and 7 (unclear) are
    pinned to whatever single cell their coordinates happen to name. 18,908 events, 15.37% of mass.

Only 181 events in the entire dataset are ever spread across months.

The figure with the largest operational consequence

Concentrated share of total fatality mass:

period share
2010–14 5.5%
2015–19 8.6%
2020–24 48.8%

2020–2024 is the window training and evaluation splits draw on. Nearly half its fatality mass is in
the wrong place, the wrong month, or both.

Why the catalog is tiered rather than a top-N list

Two shapes need different remedies. Ethiopia is few enormous events (142 events, 7.96% of all
mass). Ukraine is 1,893 small ones. Nagorno-Karabakh is 159 events across 78 months of persistent
low-grade concentration. A magnitude threshold catches the first and misses the other two —
independent support for views-hydranet's decision not to winsorise.

Also found

Negative results

  • date_prec == 5 with span_months == 1: zero events. Had any existed they would have been
    invisible to a span-based test.
  • where_prec 4 and 6 are correctly excluded, as configured.
  • Survivorship is working — 372,058 unique ids over 372,303 rows; the excess is month spreading.
  • No UCDP data-quality fault. Every event carries honest precision metadata, and it is retained
    through the builder. The information needed to handle these correctly is already in the store.

What is deliberately not here

source_distribution_map={"annual": "date_end_only"} is the production-parity contract and sits
formally with Håvard; changing it would move every published fatality figure. This PR proposes no
policy and changes no behaviour.
It records what already exists so the decision is cheap when it
is taken.

Files

  • reports/investigation_summary_event_concentration/findings.md — the catalog
  • scripts/investigate_summary_event_concentration.py — prints every figure in it and writes the
    two CSVs; ruff and mypy --strict clean
  • .gitignore — the two CSVs are not committed: 6.7 MB of derived data regenerated by one
    command from a viewpoint build superseded every refresh. A committed snapshot would only be a
    stale one nobody could tell was stale.

Caveats carried in the document

  1. Basis is a local viewpoint build dated 2026-06-01, data through 2026-04. The deployed build
    is newer; re-run the script before citing any figure as current.
  2. Leverage is proxied by best, not measured on model scores. Sound for a count-unit CRPS, and
    views-hydranet reports the direct figure is the same order — but it is a proxy, and the effective
    sample sizes are computed on truth.
  3. No causal claim about any model's performance. The instrument is degenerate on these slices;
    that is not the same as saying a particular reading was wrong.

🤖 Generated with Claude Code

https://claude.ai/code/session_01EfeuULbPTqrx4qtNki5dy9

views-hydranet reported one cell-month holding 62% of a scored horizon's
truth mass, collapsing that score's effective sample size to 2.58 cells.
This catalogs the whole class.

21,766 events (5.8%) carry 21.95% of all fatality mass into a cell-month
their own UCDP precision fields disown. 457 of them — 0.12% of the
dataset — carry 11.22%. Ten cell-months hold 12.4% of every fatality
recorded 1989-2026, and one 0.5-degree cell at 13.25N 39.25E holds 7.79%
of it across eight months.

Two mechanisms, not one. The first pass found only the temporal one:
date_end_only assigns an annual-source event to its date_end month
whatever its span, so a year-long aggregate lands on one month. The
spatial one is nearly as large and was missed: passthrough returns an
event unchanged whatever its where_prec, and production_parity excludes
only where_prec 4 and 6, so 5 (country-level) and 7 (unclear) are pinned
to whatever single cell their coordinates happen to name.

The operationally important figure is temporal: in 2020-2024, 48.8% of
all fatality mass is concentrated by measurement. That is the window
training and evaluation splits draw on. It is 5.5% in 2010-2014.

Two shapes need different remedies, which is why the catalog is tiered
rather than a top-N list. Ethiopia is few enormous events (142 events,
7.96% of all mass); Ukraine is 1,893 small ones; Nagorno-Karabakh is 159
events across 78 months of persistent low-grade concentration. A
magnitude threshold catches the first and misses the other two — which is
independent support for views-hydranet's decision not to winsorise.

Recorded and not acted on: mass over rows exceeds mass over events by
31,672 (0.91%), because ceil_split rounds up per month. Totals are not
conserved today, which matters for any remedy that claims to conserve
them. even_split already exists, is tested, and does conserve.

No code, configuration or data changed. The distribution policy is the
production-parity contract and is not mine to move; this measures its
consequence and recommends nothing. Corrects one inference in #533 along
the way: the anchor event is Ethiopia/Tigray, not Darfur — #484's cell
is separately confirmed and is genuinely North Darfur.

The two CSVs the script writes are gitignored. They are 6.7 MB of
derived data regenerated by one command from a viewpoint build that is
superseded every refresh; a committed snapshot would only be a stale one
nobody could tell was stale.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfeuULbPTqrx4qtNki5dy9
@Polichinel
Polichinel merged commit a45d485 into development Nov 4, 2026
6 checks passed
@Polichinel
Polichinel deleted the docs/533-summary-event-concentration-catalog branch November 4, 2026 06:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant