# Uncertainty Charts

> Visualizing forecast uncertainty, scenarios, and sensitivity - fan charts, scenario bands, tornado diagrams, Monte Carlo output, box plots, and the discipline of not implying more confidence than the model supports. Trigger on "forecast", "scenario", "uncertainty", "confidence interval", "fan chart", "sensitivity", "tornado", "Monte Carlo", "best case worst case", "range of outcomes", "what if".

- Skill: `lukehle/uncertainty-charts` (Agent Skill)
- Install (CLI): `npx skillmds@latest add lukehle/uncertainty-charts`
- Raw SKILL.md: https://api.skillmd.com/api/skills/lukehle/uncertainty-charts/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: Lukehle (https://skillmd.com/u/lukehle)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/lukehle/uncertainty-charts

---


# Uncertainty charts

A single forecast line is a claim of certainty that no forecast supports. The reader takes the number
off the chart, quotes it, and the range that mattered is gone.

The purpose of every chart here is to keep the range visible.

---

## Fan chart — forecast with widening uncertainty

Actuals as a solid line; from the forecast boundary, nested bands of increasing width.

```
                                          ╱▒▒▒▒▒
                                     ╱▒▒▒▓▓▓▓▓▓
  ────────────────●═══════════╱▒▓▓███████████████
                  ╲▒▒▒▓▓▓▓▓▓▓▓
                       ╲▒▒▒▒▒▒
   actuals        forecast →
```

- **Bands widen with horizon.** A constant-width band implies uncertainty does not grow with time,
  which is false for every business forecast.
- **Two or three bands, not five.** Typically a central case plus one or two ranges. More bands read
  as precision about imprecision.
- **Label what the bands mean** — and be honest. If they are scenario judgements rather than
  statistical intervals, call them "scenario range", not "80% confidence". Dressing judgement in
  statistical language is the most common dishonesty in forecast charts.
- **Central line dashed** past the boundary; solid for actuals.
- **Do not extend bands beyond where you have a view.** A 5-year fan from a 12-month model is
  decoration.

---

## Scenario bands — discrete cases

When you have named scenarios rather than a distribution:

- **Three lines: base, upside, downside.** Shade between them.
- **Name and define each scenario in the chart**, not in an appendix: "Downside: no Q4 enterprise
  deals, hiring freeze".
- **The base case is visually dominant**; upside and downside are lighter. Three equally weighted
  lines make the reader hunt for which one is the plan.
- **Mark the decision-relevant threshold** — the zero-cash line, the covenant, the plan number. What
  the reader wants is not the range but whether the range crosses something that matters.

For runway specifically, that threshold crossing is the whole chart: show when each scenario hits
zero cash, as a **date**.

---

## Tornado — which input matters

Horizontal bars, one per input, showing output range as that input varies across its plausible range,
sorted by width. The widest at the top gives the shape.

```
Churn rate       ██████████████████████    -18% ─── +14%
Price increase        ████████████         -9%  ─── +11%
Hiring pace              ██████            -5%  ─── +4%
Hosting cost               ███             -2%  ─── +2%
```

- **Centre on the base case.** The bar is the deviation from base, not the absolute.
- **Vary each input across a defensible range** and state it. "Churn 4-9%" is a claim; unstated
  ranges make the whole chart arbitrary — a tornado can be made to say anything by choosing ranges.
- **One input at a time**, held all else constant. Say so; real inputs correlate, and the chart does
  not capture that.
- Label both ends with the actual output values, not just percentages.

This is the single most useful chart for prioritising which assumption to go and get better data on.

---

## Monte Carlo output

Do not show the spaghetti of every simulated path. It looks impressive and communicates nothing.

Show instead:

- **A histogram or density of the outcome** with the key percentiles marked (P10 / P50 / P90).
- **The probability of crossing a threshold** — "68% of runs reach the plan number", "22% of runs hit
  zero cash before the raise". This is what a decision-maker actually needs.
- **A cumulative distribution** when the question is "what is the chance we are at least X".
- The number of runs, and the model vintage.

**Do not report a mean without its spread.** A mean of a skewed distribution — which most financial
outcomes are — is not the expected experience.

---

## Box plots and distributions

For spread across a population — deal sizes, days-to-collect, contract lengths.

- Box plots are dense and precise, but **many finance audiences will not read them**. Label the
  quartiles directly, or use a dot strip with the median marked instead.
- **Always show `n`.** A box on 6 observations is not a distribution.
- Overlay individual points when `n` is small (under ~40); the box alone hides that it is six dots.
- For aging or bucketed data, a **histogram is more natural** and needs no explanation.

---

## The honesty rules

These are what separate a useful uncertainty chart from a misleading one:

| Rule | Why |
|---|---|
| **Never present a scenario range as a statistical confidence interval** | They are different claims; conflating them borrows credibility the model has not earned |
| **State the assumptions on the chart** | An unstated assumption set makes the range unfalsifiable |
| **Do not extend a forecast beyond the model's horizon** | The bands stop meaning anything |
| **Show the base case distinctly** | Otherwise the reader picks whichever line suits them |
| **Round to the model's precision** | A P50 to the dollar from a model with ±20% inputs is theatre |
| **Date the forecast vintage** | Forecasts get revised; an undated one cannot be reconciled |
| **Mark the decision threshold** | The range only matters relative to something |

---

## What to avoid

- **A single forecast line with no range**, unless the horizon is short and the mechanism certain.
- **Symmetric bands where risk is asymmetric.** Cash runway is usually asymmetric — things go wrong
  faster than they go right. Symmetric bands understate downside.
- **Error bars on a bar chart** where the bars are already near the axis limit — the whiskers get
  clipped and the range is lost.
- **Confidence language on judgemental scenarios.**
- **Spaghetti plots** of simulation paths.

---

## Related skills

- `timeseries-finance` — the forecast boundary and vintage labelling
- `chart-selection` — when uncertainty needs its own view
- `chart-annotation` — stating assumptions and thresholds on the chart
- `ui-antipatterns` — false precision

