# Are 0–0s dying out?

Source: https://www.footballdatascience.co.uk/myth-or-maths/nil-nil
Published: 2026-09-29

> Football is more attacking than ever, so the goalless draw must be disappearing. Over 10,000 Scottish league matches in 26 seasons, one match in 14 still ends 0–0, and the share hasn't budged.

## The claim

"You hardly see a 0–0 these days." Pressing, attacking full-backs and teams that play out from the back, the argument goes, have made the goalless draw an endangered species.

## Why people believe it

The highlights make it feel true. Goals are what get replayed, shared and remembered; nobody clips a 0–0. And the few that stick in the mind are the dreadful ones from years ago, which makes it easy to believe they belonged to an older, duller game. Meanwhile, modern football certainly *looks* more attacking.

## The data

Every Scottish Premiership and Championship match from 2000/01 to 2025/26: **10,471 matches** in 26 seasons, final scores only, from football-data.co.uk. 2019/20 and 2020/21, cut short or reshaped by COVID, are included with the matches that were played.

## The method

For each season, count the 0–0s and divide by the matches played. Then:

- **Compare two halves** of the period, 2000/01–2012/13 against 2013/14–2025/26, each with a range for how much luck alone could move it.
- **Fit a trend line** through the 26 seasons.
- **Check against goals.** A season with fewer goals should have more 0–0s. For each season, a simple Poisson model, the one in [the Poisson distribution](/learn/poisson-distribution), says how many 0–0s its goal rate alone would produce.

## The evidence

<figure class="rank-chart">
<div role="img" aria-label="Bar chart of the share of matches ending 0–0 in each season from 2000/01 to 2025/26, between 4.2% and 9.8%, with no upward or downward trend. The 26-season average is 7.3%. Gold dots show the share expected from each season's goal rate, and mostly track the bars.">

</div>
<figcaption>Each season's share of 0–0s. It bounces between about 4% and 10% with no sign of dying out; the most recent season, 2025/26, had the most. The gold dots, from each season's goal rate, follow the bars up and down.</figcaption>
</figure>

Across all 26 seasons, **767 of 10,471 matches ended 0–0: 7.3%, about one match in 14.**

| Seasons | 0–0s | Share | 95% range |
|---|---|---|---|
| 2000/01 to 2012/13 | 395 of 5,304 | 7.45% | ±0.71 |
| 2013/14 to 2025/26 | 372 of 5,167 | 7.20% | ±0.70 |

The recent half has a quarter of a point fewer 0–0s, far inside the range luck alone could produce. The trend line across all 26 seasons actually points slightly **up**, by half a point a decade, and that's well within the noise too. The most recent season, **2025/26, had the most 0–0s of all: 40 of 408, 9.8%.**

### So why do some seasons feel full of them?

Because some seasons are. The share swings from **4.2% (2002/03) to 9.8% (2025/26)**. Two things drive that.

**Luck.** A season is about 408 matches. Even if the true chance of a 0–0 never changed, the count would wobble from season to season:

$$\sqrt{\frac{0.073 \times 0.927}{408}} \approx 0.013$$

<div class="plain" markdown="1">
In plain football

- **0.073** is the chance any match ends 0–0; **408** is the number of matches in a season.
- **0.013** means luck alone moves a season's 0–0 share by about **1.3 points** either way.
- The seasons actually vary by about 1.5 points, so most of the swing is just luck.
</div>

**Goals.** Seasons with fewer goals have more 0–0s: across the 26 seasons the correlation is **−0.58**. The gold dots in the chart are what each season's goal rate alone predicts, and they follow the bars. Goals per game haven't trended either: **2.67 a game in the first half of the period, 2.68 in the second.** With no fall in goals, there's no reason for 0–0s to rise or fall.

### A few more than the simple model expects

The simple Poisson model expects **7.0%** of matches to end 0–0; football delivered **7.3%**. Low-scoring draws turning up a little more often than a plain Poisson model predicts is well known, and it's exactly what the [Dixon-Coles model](/models/dixon-coles) was built to correct.

## Verdict

**Not supported.** The goalless draw isn't dying out in Scottish football. One match in 14 ended 0–0 in the early 2000s, and one in 14 does now. The share swings from season to season, mostly by luck and partly with the number of goals, but there is no trend. The most recent season had more than any other.

## Caveats

- **Scotland only.** The data covers the Premiership and Championship. Other leagues, or other eras before 2000, could tell a different story.
- **Two divisions together.** The Championship has slightly more 0–0s than the Premiership (8.0% against 6.8% over the period), and both are included.
- **Fewer matches in 2019/20 and 2020/21.** Seasons cut short or reshaped by COVID carry more luck.
- **A trend could still be too small to see.** Twenty-six seasons can rule out a big change, not a tiny one.

## Reproduce the analysis

The results files are published by [football-data.co.uk](https://www.football-data.co.uk/scotlandm.php). Download the Premiership (SC0) and Championship (SC1) files for each season from 2000/01 to 2025/26 and save each under its own name, such as `SC0_2425.csv` and `SC1_2425.csv`; they aren't rehosted on this site. Then:

```python
import csv
from math import exp, sqrt

names = [f"{y % 100:02d}{(y + 1) % 100:02d}" for y in range(2000, 2026)]
seasons = []  # (season, matches, 0-0s, goals per game, 0-0s a simple Poisson model expects)
for s in names:
    n = nil = goals = expect = 0
    for div in ("SC0", "SC1"):  # Premiership and Championship
        with open(f"{div}_{s}.csv", encoding="latin-1") as f:
            games = [r for r in csv.DictReader(f) if r.get("FTR") in ("H", "D", "A")]
        home = sum(int(r["FTHG"]) for r in games) / len(games)
        away = sum(int(r["FTAG"]) for r in games) / len(games)
        n += len(games)
        nil += sum(r["FTHG"] == "0" and r["FTAG"] == "0" for r in games)
        goals += sum(int(r["FTHG"]) + int(r["FTAG"]) for r in games)
        expect += len(games) * exp(-home - away)  # chance neither side scores, at this division's goal rates
    seasons.append((s, n, nil, goals / n, expect / n))
    print(f"20{s[:2]}/{s[2:]}: {nil:2} of {n} matches 0-0, {nil / n:.1%}; {goals / n:.2f} goals a game; Poisson expects {expect / n:.1%}")

def share(rows):
    n, nil = sum(r[1] for r in rows), sum(r[2] for r in rows)
    return f"{nil} of {n}, {nil / n:.2%} (95% range ±{1.96 * sqrt(nil / n * (1 - nil / n) / n):.2%})"

print("all seasons:", share(seasons), f"expected {sum(r[4] * r[1] for r in seasons) / sum(r[1] for r in seasons):.2%}")
print("2000/01-2012/13:", share(seasons[:13]))
print("2013/14-2025/26:", share(seasons[13:]))

x, y = list(range(len(seasons))), [r[2] / r[1] for r in seasons]
mx, my = sum(x) / len(x), sum(y) / len(y)
trend = sum((a - mx) * (b - my) for a, b in zip(x, y)) / sum((a - mx) ** 2 for a in x)
print(f"trend: {trend * 1000:+.2f} percentage points a decade")
g = [r[3] for r in seasons]
mg = sum(g) / len(g)
corr = sum((a - mg) * (b - my) for a, b in zip(g, y)) / sqrt(sum((a - mg) ** 2 for a in g) * sum((b - my) ** 2 for b in y))
print(f"goals a game against 0-0 share, correlation {corr:.2f}")
print(f"luck alone moves a 408-match season by about ±{sqrt(my * (1 - my) / 408):.1%}; seasons actually vary by ±{sqrt(sum((b - my) ** 2 for b in y) / len(y)):.1%}")
```

Spotted a flaw in the method, or have a football claim you'd like tested? [Suggest it on LinkedIn](https://www.linkedin.com/in/bryanmcguireuk/), where discussion of these articles happens.
