पाठ 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.

त्वरित जाँच: 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.