Breakdown Point Analysis

Breakdown point analysis scans a nested family Q(radius) and finds the smallest radius where a threshold-style claim stops being certified.

This is useful when the reported number supports a concrete action:

  • a fairness metric is acceptable only if disparity is below a threshold,

  • an experiment ships only if uplift exceeds a threshold,

  • a model-risk estimate passes review only if expected loss stays below a tolerance,

  • an evaluation benchmark is acceptable only if a score clears a bar.

What The Radius Means

The radius has the meaning assigned by the chosen Q family. For example:

  • bounded_shift: per-fiber movement away from the observed hidden-cell mix,

  • tv_budget: total-variation budget around the observed hidden-cell law,

  • chi_square_budget: chi-square divergence budget,

  • kl_budget: KL-divergence budget,

  • l2_budget: Euclidean budget.

The search assumes the family is nested: larger radii permit at least the shifts allowed by smaller radii. The result is always relative to the chosen hidden refinement and chosen Q family. It is not an absolute robustness guarantee.

Minimal Example

import updatesupport as us

report = us.breakdown_point(
    rows,
    public=["age_band", "sex"],
    hidden=["age_band", "sex", "channel", "tenure_band"],
    target="uplift",
    weight="n",
    decision=us.threshold_decision(">=", 0.01, label="ship if uplift >= 1pp"),
    q_family="bounded_shift",
    radius_max=0.5,
    tolerance=1e-4,
)

print(report.to_markdown())

The report status has three possible values:

  • found: a finite breakdown radius was found inside the search range,

  • not_found: the decision stayed stable through radius_max,

  • already_broken: the decision was not stable even at radius_min.

Interpretation

If the observed estimate is 0.014, the decision rule is value >= 0.01, and the breakdown radius is 0.22, the plain-English interpretation is:

The reported decision survives hidden recomposition up to roughly radius 0.22 under this Q family. By radius 0.22, at least one admissible hidden mix can move the interval across the decision threshold, so the coarse public report no longer certifies the decision.

This is a deterministic composition-stability diagnostic, not a confidence interval.

Structured Exports

Breakdown reports support the same downstream artifact patterns as the rest of the framework:

payload = report.to_json()
tables = report.to_tables()
frames = report.to_dataframes()

The curve table contains one row per grid radius with the lower endpoint, upper endpoint, ambiguity width, endpoint decisions, and a decision_stable flag.

Caveats

  • The result depends on the chosen finer refinement. If the relevant composition variable is absent from the data, breakdown analysis cannot bound its effect.

  • The result depends on the chosen Q family. A large breakdown radius under one family does not imply robustness under every plausible stress test.

  • For non-linear targets, the same target-capability guardrails used by public_descent_report() still apply.