Lesson 15 / 25
Sensitivity Analysis (Tornado)
Which assumption matters most?
Swing one input at a time
A sensitivity analysis varies each input across a plausible range while holding the others at base values, and records how much the result swings. Sorted by swing size, this forms a tornado chart. It shows where to focus: validate the top assumptions with pilots and stakeholders, and do not waste effort refining inputs that barely matter.
Tornado ranking for the NPV, run
I ran this with plain Python 3. All figures belong to one worked example (an invoice-processing team) with invented but internally consistent numbers; prices are placeholders. The realisation rate swings NPV the most (from about $172,000 to $472,000), followed by volume and the error-rate improvement. The one-off cost, often argued over at length, matters least here (a $50,000 swing).
base = {"volume": 12000, "minutes_saved": 3.81, "realisation": 0.6, "error_drop": 0.025,
"monthly_cost": 3016, "one_off": 53000}
def npv(p, months=36):
net = (p["volume"] * p["minutes_saved"] / 60 * 18.0 * p["realisation"]
+ p["volume"] * p["error_drop"] * 25.0 - p["monthly_cost"])
return -p["one_off"] + sum(net / 1.10 ** (m / 12) for m in range(1, months + 1))
ranges = {"volume": (8000, 15000), "minutes_saved": (2.0, 4.5), "realisation": (0.2, 0.9),
"error_drop": (0.005, 0.03), "monthly_cost": (2500, 6000), "one_off": (40000, 90000)}
print(f"base NPV ${npv(base):,.0f}")
swings = []
for k, (lo, hi) in ranges.items():
a, b = npv({**base, k: lo}), npv({**base, k: hi})
swings.append((abs(b - a), k, a, b))
for swing, k, a, b in sorted(swings, reverse=True):
print(f"{k:<14} NPV from ${min(a, b):>9,.0f} to ${max(a, b):>9,.0f} (swing ${swing:,.0f})")
Output:
base NPV $343,492 realisation NPV from $ 172,391 to $ 471,818 (swing $299,427) volume NPV from $ 179,975 to $ 466,130 (swing $286,154) error_drop NPV from $ 156,373 to $ 390,272 (swing $233,898) minutes_saved NPV from $ 221,566 to $ 389,972 (swing $168,407) monthly_cost NPV from $ 250,432 to $ 359,584 (swing $109,153) one_off NPV from $ 306,492 to $ 356,492 (swing $50,000)
Validate the top two inputs first
Spend pilot effort and stakeholder time on the assumptions at the top of the tornado.
Quick check: What does a tornado chart rank?
- Inputs by how much they move the result across their plausible ranges
- Projects by cost
- Employees by speed
- Models by size
Answer
Inputs by how much they move the result across their plausible ranges — Focus on what drives the answer.