Skip to content
Expedify
14 min

Loss aversion, sunk cost and regression — what it costs you

Four questions you answer about yourself rather than about a scenario, and your own answers are the finding. Then the pattern that makes praise look useless and criticism look like it works, whatever you actually do.

The first two lessons could be got wrong at arm's length. These are about you.

A coin flip, for real money

I will flip a fair coin. If it comes up heads you lose ₹10,000. If it comes up tails you win ₹X.

How large does X have to be before you would take that bet?

Keep your answer. This one comes back later.

In pure arithmetic anything above ₹10,000 is worth taking. The bet is fair at ₹10,000 and favourable at ₹10,001.

Most people want somewhere around ₹20,000. If your number was near that, you have just measured your own loss aversion without being told that was the question.

Tversky and Kahneman put the ratio at roughly two to one. A loss hurts about twice as much as the same gain pleases.

This is not a flaw to correct. It is a fact about people to plan around. It is why a customer fights harder to keep a discount than to win one of the same size.

₹40 lakh in, and it is not going to work

Eight months and ₹40 lakh into building a system, it is clear the approach does not work.

What do you do?

The top row is identical, so only the bottom two decide anything.

Money already spent

Finish it
₹40 lakh, gone
Start again
₹40 lakh, gone

Money still to spend

Finish it
₹10 lakh
Start again
₹12 lakh

What you end up with

Finish it
A system that does not work
Start again
A system that works

₹2 lakh is the whole difference, and it buys a system that works instead of one that does not. Read that way it is not a close call.

The phrase people reach for is we have come too far to stop. That is a statement about the past, inside a decision about the future.

When will it be finished?

Think of the piece of work you are in the middle of right now. The real one, at work.

When will it be finished? Give a date or a number of weeks.

Keep your answer. This one comes back later.

And the last few things you estimated — how often did the first estimate hold?

Buehler, Griffin and Ross measured that gap in 1994. The estimate is built by imagining the work going well, which is the only version anybody can picture in detail.

Everything that has ever delayed you was, at the time, unforeseeable. And it happened anyway, every time.

The fix is not to think harder about the plan. It is to look up what happened last time. Your own track record is better evidence than your own reasoning, and it is the one thing nobody consults.

Are you a better than average driver?

Compared with everybody else on the road, how good a driver are you?

Keep your answer. This one comes back later.

Roughly half of any group is below average, and almost nobody puts themselves there. Svenson published the driving version in 1981 and it has been repeated on nearly every skill anyone thought to ask about.

It matters here for one reason. Every pattern in this module is one you will now recognise in other people. The evidence that you are also subject to them is the four answers you have just given.

Five more, which this module cannot catch you with

Some of the best-known findings in this field need two groups of people who cannot see each other. One group gets one wording and the other gets another, and the two groups answer differently.

There is no honest way to do that to one reader. You would spot the parallel and answer consistently, which is the right thing to do and destroys the demonstration. So here they are as findings rather than as traps.

Same decision, one word different, two groups.

Framing

The two wordings
200 of 600 saved, against 400 of 600 lost
Who found it
Tversky & Kahneman, 1981

Mental accounting

The two wordings
losing a ₹500 ticket, against losing a ₹500 note
Who found it
Kahneman & Tversky, 1984

Relativity

The two wordings
₹200 off a ₹500 kettle, against ₹200 off a ₹40,000 laptop
Who found it
Tversky & Kahneman, 1981

The decoy

The two wordings
two subscription options, against the same two plus a third nobody takes
Who found it
Huber and colleagues, 1982

Zero price

The two wordings
a ₹1 truffle against a free sweet, then ₹2 against ₹1
Who found it
Shampanier, Mazar & Ariely, 2007

In every one of them, the wording moves people and the arithmetic does not change. Ariely's Predictably Irrational is the readable version of most of this list.

And one nobody was asked

The last pattern cannot be put as a question at all, and it is the one that costs the most.

Kahneman tells it about flight instructors. They were certain that praising a cadet after a good landing made the next one worse. They were equally certain that shouting after a bad landing helped. They had watched it happen for years.

So here are 200 people whose skill never changes, over two quarters, with no praise and no criticism anywhere in the simulation.

200 people, skill fixed, luck resampled each quarter.introduction-to-ai/where-judgment-fails.ipynb

The best 10% fell from 139 to 114, and 90% of them got worse. The worst 10% rose from 62 to 86, and 80% of them improved.

An extreme result is usually real skill plus a good run. The skill stays for the next quarter. The good run does not.

So praise looks useless and criticism looks like it works, whatever you actually do. Anybody who rewards the top and confronts the bottom will see exactly this every quarter, for their whole career. And will be certain it was them.

What these four told you about yourself

  • A loss weighs about twice a gain. Your coin-flip number.
  • Money already spent belongs in no column. The ₹40 lakh.
  • Your estimate assumed a record you know you do not have. The two planning answers.
  • You are almost certainly not below average, by your own account. The driving question.

One question from the first lesson is still open — the ordinary one, about a lead. The last lesson is about what your answer to it was.

The flagged customer, the screening test, and the fallers

content/notebooks/introduction-to-ai/where-judgment-fails.ipynb

Raise the churn base rate from 5% to 30% and watch a flag become worth believing. Then move the screening test's prevalence and watch the same thing happen to a 99% accurate test.

Show the code4 cells
Fifty million passengers, and where the alarms land
PASSENGERS, RATE, ACC = 50_000_000, 1 / 10_000_000, 0.999
wanted = round(PASSENGERS * RATE)
ordinary = PASSENGERS - wanted
caught = round(wanted * ACC)
false_alarms = round(ordinary * (1 - ACC))
alarms = caught + false_alarms

record('air_passengers', f'{PASSENGERS:,}')
record('air_wanted', wanted)
record('air_accuracy', f'{ACC:.1%}')
record('air_caught', caught)
record('air_false', f'{false_alarms:,}')
record('air_alarms', f'{alarms:,}')
record('air_worth', f'1 in {round(alarms / caught):,}')
record('air_per_day', f'{round(false_alarms / 365):,}')
record('air_columns', ['', 'System raises an alarm', 'It does not', 'All'])
record('air_rows', [
    ['Actually wanted', f'{caught}', f'{wanted - caught}', f'{wanted}'],
    ['An ordinary passenger', f'{false_alarms:,}', f'{ordinary - false_alarms:,}', f'{ordinary:,}'],
    ['All', f'{alarms:,}', f'{PASSENGERS - alarms:,}', f'{PASSENGERS:,}'],
])
print(f'{caught} real of {alarms:,} alarms — about 1 in {round(alarms/caught):,}')
print(f'{round(false_alarms/365):,} innocent people stopped every day')
What squaring assumes, and what happens if it is wrong
SINGLE = 1 / 8_500          # roughly the rate the court was given
record('clark_single', '1 in 8,500')
record('clark_squared', f'1 in {round(1 / SINGLE**2):,}')

# If a first cot death makes a second more likely — as later evidence
# suggested — the honest figure moves by orders of magnitude.
record('clark_columns', ['If a first death makes a second…', 'Chance of two'])
record('clark_rows', [
    ['no more likely (what the court was told)', f'1 in {round(1 / SINGLE**2):,}'],
    ['5 times more likely', f'1 in {round(1 / (SINGLE * SINGLE * 5)):,}'],
    ['10 times more likely', f'1 in {round(1 / (SINGLE * SINGLE * 10)):,}'],
])
for mult in (1, 5, 10):
    print(f'{mult:>3}x -> 1 in {round(1 / (SINGLE * SINGLE * mult)):,}')
The best and the worst, followed into a second quarter
n = 200
skill = rng.normal(100, 12, n)
q1 = skill + rng.normal(0, 18, n)
q2 = skill + rng.normal(0, 18, n)

top, bot = np.argsort(q1)[-20:], np.argsort(q1)[:20]
record('rep_n', n)
record('top_q1', f'{q1[top].mean():.0f}')
record('top_q2', f'{q2[top].mean():.0f}')
record('top_got_worse', f'{(q2[top] < q1[top]).mean():.0%}')
record('bot_q1', f'{q1[bot].mean():.0f}')
record('bot_q2', f'{q2[bot].mean():.0f}')
record('bot_improved', f'{(q2[bot] > q1[bot]).mean():.0%}')

def plot_reps(ax):
    for grp, colour, label in ((top, '#e2574c', 'best 10% of quarter one'),
                               (bot, '#3b6fd4', 'worst 10% of quarter one')):
        for i in grp:
            ax.plot([0, 1], [q1[i], q2[i]], color=colour, alpha=0.16, lw=1)
        ax.plot([0, 1], [q1[grp].mean(), q2[grp].mean()], color=colour, lw=2.6, label=label)
    ax.axhline(skill.mean(), color='#9aa0aa', ls='--', lw=1)
    ax.annotate('everyone\'s average', (1, skill.mean()), textcoords='offset points',
                xytext=(-6, 6), ha='right', fontsize=9, color='#77777f')
    ax.set_xticks([0, 1]); ax.set_xticklabels(['Quarter one', 'Quarter two'])
    ax.set_ylabel('% of target')
    ax.legend(frameon=False, loc='upper center')
    ax.grid(axis='x', visible=False)

save_fig('nobody-was-praised', plot_reps, figsize=(6.8, 4.0))
print(f'best 10%: {q1[top].mean():.0f} -> {q2[top].mean():.0f}, {(q2[top]<q1[top]).mean():.0%} got worse')
print(f'worst 10%: {q1[bot].mean():.0f} -> {q2[bot].mean():.0f}, {(q2[bot]>q1[bot]).mean():.0%} improved')
The same habit, with and without a wobble
HABIT, WOBBLE, M = 6.0, 11.0, 500
truth = rng.normal(50, 15, M)
judge1 = truth + HABIT + rng.normal(0, WOBBLE, M)
judge2 = truth + HABIT + rng.normal(0, WOBBLE, M)
rule = truth + HABIT

err = lambda p: float(np.sqrt(np.mean((p - truth) ** 2)))
e1, e2, er = err(judge1), err(judge2), err(rule)
disagree = float(np.mean(np.abs(judge1 - judge2)))

record('judge_habit', f'{HABIT:.0f}')
record('judge_cases', M)
record('judge1_error', f'{e1:.1f}')
record('judge2_error', f'{e2:.1f}')
record('rule_error', f'{er:.1f}')
record('judges_disagree_by', f'{disagree:.1f}')
record('wobble_share', f'{(e1 - er) / e1:.0%}')
record('judge_columns', ['', 'Habit', 'Wobble', 'Typical error'])
record('judge_rows', [
    ['Underwriter one', f'+{HABIT:.0f}', 'yes', f'{e1:.1f}'],
    ['Underwriter two', f'+{HABIT:.0f}', 'yes', f'{e2:.1f}'],
    ['A written-down rule', f'+{HABIT:.0f}', 'none', f'{er:.1f}'],
])

def plot_judges(ax):
    ax.bar(['Underwriter\none', 'Underwriter\ntwo', 'A written-down\nrule'],
           [e1, e2, er], color=['#9aa0aa', '#9aa0aa', '#e2574c'])
    for i, v in enumerate([e1, e2, er]):
        ax.text(i, v + 0.25, f'{v:.1f}', ha='center', fontsize=11)
    ax.axhline(HABIT, color='#3b6fd4', ls='--', lw=1.2)
    ax.annotate('the habit they all share', (2.4, HABIT), textcoords='offset points',
                xytext=(0, 6), ha='right', fontsize=9, color='#3b6fd4')
    ax.set_ylabel('Typical error')
    ax.grid(axis='x', visible=False)

save_fig('habit-and-wobble', plot_judges, figsize=(6.6, 3.8))
print(f'judges {e1:.1f} and {e2:.1f}; rule {er:.1f}; they disagree by {disagree:.1f}')
print(f'{(e1-er)/e1:.0%} of the error was wobble')

Related lessons