no, of course there's no massive society-wide problem with aviation safety

2025-06-06

This really shouldn't need to be said. If you read anything intellectually downstream of Overcoming Bias, consider this blog post entirely supplemental reading.


#!/usr/bin/env -S uv run --script
# /// script
# requires-python = "~=3.12"
# dependencies = [
#   "matplotlib~=3.10",
# ]
# ///

import math
import random
random.seed(32)

# Knuth's algorithm from TAoCP
def poisson(lam):
    L = math.exp(-lam)
    k = 0
    p = 1.0
    while p > L:
        k += 1
        p *= random.random()
    return k - 1

Let's say, for the sake of argument, that there's some facet of reality we're interested in. Call it "aviation safety".

In "aviation safety", about one bad thing happens per week. We'll assume bad things are independent of each other, and that the badness of these bad things is - to a first approximation - exponentially distributed.

import matplotlib.pyplot as plt

NUM_WEEKS = 52 * 10 # 10 years

# For each week, keep a list of the bad things that have happened.
weeks = []
for i in range(NUM_WEEKS):
    num_bad_things_this_week = poisson(1)
    week = []
    for j in range(num_bad_things_this_week):
        week.append(random.expovariate(1)) # reasonable first-order approximation.
    weeks.append(week)


x, y, size, alpha = [], [], [], []
for i in range(NUM_WEEKS):
    for bad_thing in weeks[i]:
        x.append(i)
        y.append(bad_thing)
        size.append(math.sqrt(bad_thing))
        alpha.append(min(0.1 + bad_thing / 3, 1))

plt.figure(figsize=(8, 2))
plt.tight_layout()
plt.scatter(x, y, s=size, alpha=alpha)
plt.ylabel('badness of bad thing')
xticks = range(0, NUM_WEEKS, 52)
xticks = xticks, [2020 + i // 52 for i in xticks]
plt.xticks(*xticks)
plt.savefig('1.png', dpi=300)

1.png

Blue dots are individual events. Anything above a 4ish is going to be really very major.

Most of the time, you, your friends and family, social media, and the news are paying attention to lots of things. Only a very small fraction of all things are aviation-safety related. Functionally, this means there's a pretty high floor, below which any minor aviation-safety bad thing really just looks like background noise.

We'll explicitly model the significance-threshold, as:

noise_baseline = 4.75
noise_threshold = []
noise_threshold_current = noise_baseline
for i in range(NUM_WEEKS):
    for bad_thing in weeks[i]:
        if bad_thing > noise_threshold_current:

            # if an event is significant enough to draw our collective attention,
            # we'll pay attention to it, and also be more sensitive to other
            # events in this domain for a bit.

            relative_badness = 
              (bad_thing - noise_threshold_current) / noise_threshold_current

            noise_threshold_current /= (relative_badness * 10 + 1)

    noise_threshold.append(noise_threshold_current)

    # as life goes on, our attention drifts to other areas, and the noise floor
    # returns to baseline.
    noise_threshold_current += ((noise_baseline - noise_threshold_current)) / 10

plt.plot(noise_threshold, color='red', linestyle='--')
plt.savefig('2.png', dpi=300)

2.png

You probably see where I'm going with this.

It's surprisingly hard to pay attention to where your attention is, let alone monitor the collective attention of the media, your friends, social media algorithms, etc. You don't see the red line, just the dots that manage to clear it.

plt.clf()

x_prime, y_prime, size_prime, alpha_prime = [], [], [], []
for xi, yi in zip(x, y):
    x_prime.append(xi)
    y_prime.append(yi)
    if yi < noise_threshold[xi]:
        size_prime.append(math.sqrt(yi / 5))
        alpha_prime.append(min(yi / 15, 1))
    else:
        size_prime.append(math.sqrt(yi))
        alpha_prime.append(1)

plt.figure(figsize=(8, 2))
plt.tight_layout()
plt.scatter(x_prime, y_prime, s=size_prime, alpha=alpha_prime)
plt.ylabel('badness of bad thing')
plt.xticks(*xticks)
plt.savefig('3.png', dpi=300)

3.png

Looking at headlines and tweets, it's pretty much impossible to determine between:

  1. A real underlying shift in the world, causing a lot more bad things
  2. No feature of reality whatsoever, random poisson clustering with the media / twitter clinging onto a vibe they themselves create.

If you want to understand reality, you need a Bayesian distribution over mechanistic explanations, and to update on news stories a bit less than you'd naïvely expect.

End Note I.

In reality, I think a good chunk of the effect is actually the result of selective ex post facto re-framing of events in a Baader–Meinhof-phenomenon-ish way. Boeing loses a bird, and it's news, sure, but after a second one is down and a whistleblower kicks it, the original event is suddenly re-remembered as much larger than it was at the time. My model doesn't account for this, but the overall idea is pretty much the same.

It's all a bit self-excitatory. A more accurate model would allow for media frenzies over pretty much any minuscule stimulus.

End Note II.

One way to think about this red line dropping downwards: one significant event increasing priors on the significance of others in the same domain. This is good and correct. If I'm in a dark forest and hear some twig snap, it makes sense to consider the hypothesis "tiger to your left" when given ambiguous visual noise that would previously have fallen below background level.

A bad thing happening is only one way to increase the collective social priors on the significance of events - stuff can leak across channels. If a political party known for, say, violating norms is elected, then priors on the significance of negative norm-violating events go up, more negative norm-violations are identified and reported on, and it becomes a lot tougher to identify how much of an actual shift in the base frequency has occurred.

In the event of this kind of selective reporting, one useful mental tool to prevent over-updating is to try to get a feeling for your uncertainty about the baseline. When you see a story or tweet about a plane crash, guess:

For other scary tweets:

For each of the above, my 68% confidence interval spans at least an order of magnitude.

It is fair to say something like "while I don't have a strong prior on the exact value of XX, I have strong reason to expect its current value to be an equilibrium optimised towards by some systemic pressure, and any significant shift away from its current value is in expectation going to be bad", though do be careful not to Chesterton's Fence yourself into the equivalent of defending the current number of malaria deaths.

I'm rambling a bit here. Point is, reality is hard, and the availability of information is a terrible proxy for the frequency of underlying events.