← Back to portfolioCase study · Football analytics · Statistics

"If you don't score, you get scored on": the myth doesn't survive the data

Football's most-repeated cliché, tested across 70,000 shots and 10 competitions with seven independent statistical methods. Verdict: no evidence of a 'punishment' effect.

70,399shots analyzed
2,796matches, 10 competitions
1958–2024period covered
VerdictMythp > 0.05 · Bernoulli null model · no significant effect detected
The problem

A belief that was never tested

"If you don't score, you get scored on." Commentators repeat it after every missed chance, as if it were a law of physics. Yet nobody seems to have seriously tested it against data.

This project takes that belief — shared by generations of fans and coaches — and gives it the treatment it never got: a series of independent statistical tests, each designed to be hard to pass by chance.

The key metric

Understanding xG (Expected Goals)

What it actually is

The probability that a given shot ends up in the net, calculated from thousands of comparable shots (distance, angle, type of play).

How it is calculated

A statistical model trained on StatsBomb data assigns a value between 0 and 1 to every historical shot, based on its characteristics.

Why it matters here

It lets me define a 'big chance' objectively (xG ≥ 0.4) instead of relying on a commentator's gut feeling.

Its limits

xG ignores fine-grained tactical context (defensive pressure, fatigue) — one more reason to cross-check with several methods rather than trust it alone.

The method

Seven layers of verification

A single test can mislead. Seven independent tests, all pointing the same way, are much harder to dismiss.

01

Event study

Comparing the concede rate in the 5, 10 and 15 minutes following a missed vs. converted chance.

02

Score-state stratification

Controlling for match state (leading, tied, trailing) to isolate the real effect.

03

Permutation test

10,000 random permutations to build a reference distribution under the null hypothesis.

04

Multiple-testing correction

Benjamini-Hochberg correction to avoid false positives from the large number of comparisons.

05

Logistic regression

Standard errors clustered by match, so correlated observations aren't double-counted.

06

Cross-validation

GroupKFold by match, evaluated on AUC and Brier score, to check out-of-sample robustness.

07

Bernoulli null model

500 simulations of a world with no "punishment" effect, compared against the observed result.

Results

Five counter-intuitive findings

Finding 1

No "curse" of the missed chance

The concede rate after a big chance is statistically identical whether the shot was scored or missed — see the chart below.

missed chanceconverted chance
Big chance
missed chance
9.9%
converted chance
9.3%
Penalty (n = 658)
missed chance
5.2%
converted chance
8.7%

Concede rate in the 10 minutes following a big chance (xG ≥ 0.4) or a penalty

Finding 2

Missing a penalty actually protects you

Across 658 penalties, the following concede rate is lower after a missed penalty (5.2%) than after a scored one (8.7%) — the opposite of the myth.

Finding 3

Barrages of shots don't break defenses

The concede risk stays flat around 14%, whether a team has missed 0 or more than 10 consecutive chances in the match.

~14%regardless of consecutive missed shots (0 to 10+)
Finding 4

Holds across 10 competitions and 66 years

Isolating each competition (including La Liga, the Premier League, Serie A, the Bundesliga, Ligue 1, and the World Cup), 7 out of 10 show a mildly protective effect, 3 show no effect — none show a significant positive effect.

7 / 10protective effect
3 / 10no effect
0 / 10positive effect (the myth)
Finding 5

Simpson's paradox in action

At the season level, the most 'wasteful' teams concede slightly more (correlation of 0.31) — but that correlation completely disappears when you look minute-by-minute, inside individual matches. That's the real statistical trap behind the myth: mistaking an aggregate correlation for a causal mechanism.

0.31Aggregate correlation (season/team level)
≈ 0Within-match correlation (minute by minute)
Tech stack
Python 3.9+pandasNumPySciPystatsmodelsscikit-learnlifelinesmatplotlibseabornstatsbombpyJupyter

Open data from StatsBomb — 7 Jupyter notebooks, 15 figures

View the code on GitHubBack to portfolio