Retention Decisions & Expected Value—A Gift from Prof. Roh
A decision-intelligence gift from Prof. Roh 🎁

Retention Decisions & Expected Value

From DDDM 2 — Module 2 — Day 3: predicting customer attrition & employee turnover, then deciding whether the retention package is worth its cost.

🎁 Drag the sliders. Find where the lines cross. That's the threshold the formula was hiding.

Try it: when the package pays for itself

The decision rule says "offer the package iff p·Creplace > Cpackage + p(1−lift)·Creplace". Drag the sliders—you'll see the two costs become two lines. They cross at p*: that's the formula in pictures.

Decide OFFER iff  p > Cpackage /  (Creplace × lift)  =  8,000 /  (30,000 ×  0.40)  = 0.667
loss — do nothing
SGD 15,000
cost — offer package
SGD 17,000
break-even p*
66.7%
net savings if offered
−SGD 2,000
do nothing = p · Creplace offer = Cpackage + p(1−lift)·Creplace OFFER zone = right of p*
0% 25% 50% 75% 100% P(turnover) — your model's prediction Expected loss / cost (SGD) p* = 0.667 🎁 expected loss — do nothing expected cost — offer package

What to notice. When you raise lift, the blue line tilts down — the package gets cheaper at every p, so p* shifts left and more employees qualify. When you raise Cpackage, the blue line lifts up and p* shifts right (offer fewer people). When you raise Creplace, both lines rise but the red rises faster — net effect: p* shifts left (offer more). The geometry is the formula.

The lesson — when probability alone isn't enough

The temptation, when you have a model that predicts P(turnover), is to say "OK, anyone above 50% — let's save them". That sounds reasonable, the way "give a coupon to anyone over 50% likely to buy" sounds reasonable in marketing. It is not reasonable. The model gave you a probability. The decision needs cost.

Predictions are nouns. Decisions are verbs. The verb has to know what the action costs.

That is what the formula in this lesson does. It takes three numbers — Creplace (what it costs the firm if the employee leaves), Cpackage (what the retention offer costs), and lift (how much the offer is expected to reduce churn) — and asks one thing: does the package, in expectation, cost less than doing nothing?

Geometry helps the algebra speak. Plot expected loss against P(turnover):

  • The red line is what doing nothing costs you in expectation: p·Creplace. It starts at zero (a 0% leaver costs nothing in expectation) and rises with slope Creplace.
  • The blue line is what offering the package costs you in expectation: Cpackage + p(1−lift)·Creplace. It starts at Cpackage (you pay it whether or not the employee was going to leave) and rises with a shallower slope (because some of the leaving was prevented by the package).

These two lines cross at exactly one point — that's p*, the break-even probability. To the right of p*, the red line is on top: doing nothing is more expensive than the package, so OFFER. To the left of p*, the blue line is on top: the package is more expensive than just absorbing the expected loss, so SKIP.

Solve for where they cross: p·Creplace = Cpackage + p(1−lift)·Creplace  ⇒  p·lift·Creplace = Cpackage  ⇒  p* = Cpackage / (Creplace·lift).

That is why the formula matters. One number falls out, in the units the business already speaks (a probability between 0 and 1). The slider on the previous tab is just walking you across that crossing point in real time.

A quieter lesson — what the formula respects

Look at what p* depends on, and what it doesn't. It does not depend on how many employees you have. It does not depend on the model's overall accuracy. It does not depend on how you feel about the employee. It depends only on three honest costs. The formula is, in this sense, a respect for cost: the threshold rises and falls with what saving an employee actually buys you, and what the offer actually costs.

Be careful which number you trust the most. The one you usually trust the most is lift — and lift is usually the number you've measured the least.

That is the call to humility. Creplace can be benchmarked from HR records. Cpackage is on the offer letter. Lift is a behavioural claim about what humans will do when offered a thing — and the only way to know it for your firm, your roles, your culture, is to run a small holdout A/B test and let reality teach you.

Until you do, your p* is a hypothesis. The decision rule is not the answer — it is the scaffold on which evidence gets hung. That is the most honest framing of expected value, and the one this whole module has been quietly preparing you for.

The code — same idea, in two languages

Three honest numbers in, one decision out. Drop these into your notebook.

retention.pyscikit-learn
import numpy as np

def expected_loss_no_action(p, C_replace):
    return p * C_replace

def expected_loss_with_package(p, C_replace, C_package, lift):
    return C_package + p * (1.0 - lift) * C_replace

def retention_decision(p, C_replace, C_package, lift):
    L_no  = expected_loss_no_action(p, C_replace)
    L_yes = expected_loss_with_package(p, C_replace, C_package, lift)
    savings = L_no - L_yes
    return {
        "loss_no_action"     : L_no,
        "loss_with_package"  : L_yes,
        "savings_if_offered" : savings,
        "should_offer"       : savings > 0,
        "break_even_p"       : C_package / (C_replace * lift),
    }

def retention_decision_vector(p_arr, C_replace, C_package, lift):
    # vectorised — for batch scoring of a whole roster
    p_arr = np.asarray(p_arr, dtype=float)
    L_no  = p_arr * C_replace
    L_yes = C_package + p_arr * (1 - lift) * C_replace
    return L_no, L_yes, L_no - L_yes

# --- demo ---
out = retention_decision(p=0.72, C_replace=30_000,
                         C_package=8_000, lift=0.40)
print(out)
# {'loss_no_action': 21600.0, 'loss_with_package': 14480.0,
#  'savings_if_offered': 7120.0, 'should_offer': True,
#  'break_even_p': 0.6666...}
retention.jsJS
function expectedLossNoAction(p, Crep) {
  return p * Crep;
}

function expectedLossWithPackage(p, Crep, Cpkg, lift) {
  return Cpkg + p * (1 - lift) * Crep;
}

function retentionDecision(p, Crep, Cpkg, lift) {
  const Lno  = expectedLossNoAction(p, Crep);
  const Lyes = expectedLossWithPackage(p, Crep, Cpkg, lift);
  const savings = Lno - Lyes;
  return {
    lossNoAction    : Lno,
    lossWithPackage : Lyes,
    savingsIfOffered: savings,
    shouldOffer     : savings > 0,
    breakEvenP      : Cpkg / (Crep * lift),
  };
}

// --- demo ---
console.log(retentionDecision(0.72, 30_000, 8_000, 0.40));
// { lossNoAction: 21600, lossWithPackage: 14480,
//   savingsIfOffered: 7120, shouldOffer: true,
//   breakEvenP: 0.6666... }

Three honest numbers, four lines of arithmetic, one verb. Notice that the same code works for customer churn × CLV (replace Creplace with the customer's CLV), fraud × investigation cost, loan default × outreach, and a hundred other decisions you'll meet in your career. Tiny math, big leverage. That's the pattern of decision intelligence.

A note from Prof. Roh

With heart, and with the cost on the table

Dear team — the formula on the previous tabs is short, but it changes how you think. Most people, when they look at a probability, want to act on the probability itself: "60% is high, let's act". The cost-aware mind sees probability as one input of three. It asks: at what probability does action cost less than inaction? And it answers itself in the language the business already speaks.

Carry this geometry with you. Whenever you build a model — whether it predicts churn, default, fraud, repurchase, illness, or any other future thing — pause before you set a threshold. Ask what the action costs. Ask what doing nothing costs in expectation. Ask what the action actually does (the lift). The threshold writes itself out of those three honest answers.

And when the lift number is unknown — as it almost always is — be the analyst who runs the small A/B test instead of the analyst who picks a number that feels right. The discipline of measuring lift before scaling action is, in my experience, the single most underrated habit in industry data work. It is also the most career-defining one.

Go build with rigor, with kindness, and with the cost on the table.

— with warmth, Prof. Roh 🎁
🎁 Probabilities are nouns. Decisions are verbs. The verb needs the cost.
DDDM 2 · Module 2 · Day 3 — Predicting Customer Attrition & Customer Lifetime Value