Does sacking the manager bring a bounce?
"New manager bounce." Across 80 Scottish Premiership changes since 2001/02, results did jump after the manager went, from 0.83 to 1.39 points a game. Sides with the same bad run that kept their manager jumped just as far.
Intermediate
Contents
The claim
"Sack the manager and you'll get a bounce."
A new face in the dugout, a lift in the dressing room, and the results turn. Boards sack managers expecting it, and pundits point to it every time a new man wins his first game.
Why people believe it
Because it happens. A side that's been losing changes its manager and starts picking up points. You see it at your own club, and you see it every season somewhere in the league.
What you don't see is the other half of the comparison: what would have happened if the club had kept him.
The data
- Every in-season managerial change in the Scottish top flight from 2000/01 to 2025/26, taken from the "managerial changes" table on each season's Wikipedia page; most rows cite a BBC Sport report. That's 131 changes. The 2010/11 page has no table, so that season is missing.
- 102 of them were the club's decision or followed bad results: sacked, resigned, left by mutual consent or contract terminated. Managers poached by another club, retirements and the end of interim spells are left out.
- Every league result from football-data.co.uk.
The compiled list is published as manager-changes-spfl.csv, with the source for each change.
The method
Take every change with six league games either side in the same season: 80 of them from 2001/02 on (2000/01 is left out because the comparison needs the previous season). Compare points a game before and after.
Then build the comparison nobody sees: sides that had exactly the same points from their last six games, and were about as strong the season before, but kept their manager. Every such six-game spell in 25 seasons counts, as long as no manager left within six games of it. Whatever those sides did next is what you'd expect from a changer if the change made no difference.
A gap between the two is only real if it's bigger than the luck margin, worked out here by resampling the 80 changes 4,000 times.
The evidence
The bounce is real
In the six games before the manager went, the 80 sides averaged 0.83 points a game. In the six after, 1.39. That's a jump of 0.56 a game, about three and a half points over six games, and it's exactly what fans and boards remember.
Sides that kept their manager bounced too
The sides with the same run of results and similar strength that kept their manager went from 0.83 to 1.39 as well:
The extra from changing manager: 0.00 points a game, with a luck margin of −0.13 to +0.13. Whatever the new man brings, it doesn't show up in the next six games.
Why the bounce happens anyway
A run as bad as 0.83 points a game is partly the side's level and partly bad luck: the deflections, the penalties, the late goals. The luck doesn't carry on, so results drift back towards the side's real level whoever is in charge. That's regression to the mean, the same pull that makes form fade.
Clubs also tend to act at the very bottom of a run. The game before the change averaged 0.31 points: the sacking usually follows a defeat. Starting the clock from the worst point makes any recovery look like the new manager's work.
Why strength matters
Match on the run alone, ignoring how strong the side was, and the change seems to add 0.13 points a game (luck margin −0.02 to +0.28). That's because the sides that sack managers after a bad run are often better sides than the usual owners of such a run, so they would bounce further anyway. Compare them with sides of similar strength and the extra disappears.
Every window says the same
| Games (changes) | Extra | Luck margin |
|---|---|---|
| 4 (87) | +0.04 | −0.10 to +0.18 |
| 6 (80) | 0.00 | −0.13 to +0.13 |
| 8 (71) | 0.00 | −0.12 to +0.12 |
| 10 (53) | +0.02 | −0.11 to +0.16 |
Extra points a game from the change, matched on run and strength.
Verdict
Not supported. The bounce is real: results do pick up after a manager goes. But sides with the same bad run that kept their manager picked up just as much. On average, the new manager isn't the reason for the bounce; luck evening out is. For one club's change judged on its own, see is the new manager really better?
Caveats
- On average, not every time. Some appointments clearly worked and some clearly didn't; this says the typical change adds nothing you can see in six to ten games, not that managers don't matter.
- The luck margin is ±0.13 points a game. A real effect smaller than that, about three-quarters of a point over six games, could hide inside it.
- Matching can't see everything. A club might sack a manager over a dressing-room problem the results don't show yet, and that would favour the change.
- Interim managers count as "after". The six games after a sacking often include a caretaker.
- One season is missing (2010/11 has no table), and the dates are as Wikipedia records them. A spot-check of eight against their sources: six matched, one date was a day out, and two cited a report about the successor rather than the departure (neither of those two is in the analysis).
- Longer-term effects aren't measured. A new manager's signings and system take longer than ten games to show.
Reproduce the analysis
Download the Scottish Premiership files (SC0) for 2000/01 to 2025/26 from football-data.co.uk, saved as SC0_0001.csv and so on; they aren't rehosted on this site. Download manager-changes-spfl.csv into the same folder. It runs in a couple of seconds:
Show the Python81 lines, ready to copy and run.
import csv
import random
from collections import Counter, defaultdict
from datetime import datetime
seasons = [f"{y % 100:02d}{(y + 1) % 100:02d}" for y in range(2000, 2026)]
PUSHED = ("Sacked", "Resigned", "Mutual consent", "Contract terminated") # not poached, retired or the end of an interim spell
games = defaultdict(list) # (season, club) -> points from each league game, in date order
for s in seasons:
with open(f"SC0_{s}.csv", encoding="latin-1") as f:
rows = [r for r in csv.DictReader(f) if r.get("FTR") in ("H", "D", "A")]
for r in rows:
date = datetime.strptime(r["Date"], "%d/%m/%Y" if len(r["Date"]) == 10 else "%d/%m/%y")
x, y = int(r["FTHG"]), int(r["FTAG"])
games[(s, r["HomeTeam"])].append((date, 3 * (x > y) + (x == y)))
games[(s, r["AwayTeam"])].append((date, 3 * (y > x) + (x == y)))
points = {key: [p for _, p in sorted(g)] for key, g in games.items()}
dates = {key: sorted(d for d, _ in g) for key, g in games.items()}
def strength(s, club): # last season's points a game, in bands of 0.4; promoted sides form their own group
last = points.get((seasons[seasons.index(s) - 1], club))
return "promoted" if not last else min(int(sum(last) / len(last) / 0.4), 5)
with open("manager-changes-spfl.csv", encoding="utf-8") as f:
changes = list(csv.DictReader(f))
at = defaultdict(list) # (season, club) -> how many league games had been played at each change
for c in changes:
key = (c["season"][2:4] + c["season"][5:7], c["club"])
at[key].append(sum(d <= datetime.fromisoformat(c["date"]) for d in dates[key]))
print(f"{len(changes)} in-season changes, 2000/01 to 2025/26 (no table for 2010/11); "
f"{sum(c['left'].startswith(PUSHED) for c in changes)} sacked, resigned, by mutual consent or contract terminated")
def study(n, match_strength=True):
"""Each change with n games either side, and sides with the same run of points (and strength) that kept their manager."""
pool = defaultdict(list) # (points in last n, strength) -> the 2n games around every spell with no change near it
for (s, club), pts in points.items():
if s == seasons[0]:
continue # strength needs last season
for i in range(n, len(pts) - n + 1):
if all(abs(i - j) > n for j in at[(s, club)]):
pool[(sum(pts[i - n:i]), strength(s, club) if match_strength else 0)].append(pts[i - n:i + n])
cases = []
for c in changes:
s, club = c["season"][2:4] + c["season"][5:7], c["club"]
i, pts = sum(d <= datetime.fromisoformat(c["date"]) for d in dates[(s, club)]), points[(s, club)]
key = (sum(pts[i - n:i]), strength(s, club) if match_strength else 0)
if c["left"].startswith(PUSHED) and s != seasons[0] and i >= n and len(pts) - i >= n and pool[key]:
kept = [sum(spell[k] for spell in pool[key]) / len(pool[key]) for k in range(2 * n)]
cases.append((pts[i - n:i + n], kept))
return cases
def ppg(cases, part, n): # points a game before or after, for the changers and for the matched sides that kept their manager
sl = slice(0, n) if part == "before" else slice(n, 2 * n)
return (sum(sum(c[sl]) for c, _ in cases) / (n * len(cases)), sum(sum(k[sl]) for _, k in cases) / (n * len(cases)))
def extra(cases, n, draws=4000, seed=1): # after: changers minus matched sides, with a 95% range by resampling the changes
one = lambda cs: sum(sum(c[n:]) - sum(k[n:]) for c, k in cs) / (n * len(cs))
rng = random.Random(seed)
boot = sorted(one([cases[rng.randrange(len(cases))] for _ in cases]) for _ in range(draws))
return one(cases), boot[int(0.025 * draws)], boot[int(0.975 * draws)]
cases = study(6)
(b, kb), (a, ka) = ppg(cases, "before", 6), ppg(cases, "after", 6)
e, lo, hi = extra(cases, 6)
print(f"\nSix games either side, {len(cases)} changes (2001/02 on), matched on run and strength:")
print(f" changed manager: {b:.2f} points a game before, {a:.2f} after, a bounce of {a - b:+.2f}")
print(f" kept manager: {kb:.2f} before, {ka:.2f} after, a bounce of {ka - kb:+.2f}")
print(f" extra from the change: {e:+.2f} points a game (95% range {lo:+.2f} to {hi:+.2f})")
print(" game by game, changed / kept: " + ", ".join(
f"{k - 6 if k < 6 else k - 5:+d}: {sum(c[k] for c, _ in cases) / len(cases):.2f}/{sum(kk[k] for _, kk in cases) / len(cases):.2f}"
for k in range(12)))
print("\nOther windows, and matching on the run alone:")
for n in (4, 6, 8, 10):
for both in (False, True):
cs = study(n, both)
e, lo, hi = extra(cs, n)
(b, kb), (a, ka) = ppg(cs, "before", n), ppg(cs, "after", n)
print(f" {n:2} games, {'run and strength' if both else 'run only '}: {len(cs)} changes, {b:.2f} -> {a:.2f}; "
f"kept {kb:.2f} -> {ka:.2f}; extra {e:+.2f} ({lo:+.2f} to {hi:+.2f})")
Further reading
- Regression toward the mean, Wikipedia. Why extreme results tend to be followed by less extreme ones.
- 2023–24 Scottish Premiership, Wikipedia. One of the season pages the changes were taken from; its "managerial changes" table cites a BBC report for each.
- W. A. Bruinshoofd and B. J. ter Weel (2003), "Manager to go? Performance dips reconsidered with evidence from Dutch football", European Journal of Operational Research. Twelve seasons of the Dutch top flight, a control group, and the same conclusion: results recover after a sacking, but they would have anyway.