Shoot, cross or keep the ball? It depends on the score
A goal isn't worth the same at every score. Real half-time results show one down a side can afford to risk two goals against for every goal it might score, and one up barely half of one. The same chance can be the right call in one game and the wrong one in the next.
Beginner Part 10 of Decision Science Through Football
New to the notation? The symbols explained
Contents
The football question
Just after half-time, the winger picks the ball up on the edge of the box. He can shoot, cross with bodies charging into the box, or keep the ball and let the move build again. Which is right?
The usual answer is whichever is most likely to lead to a goal. This part shows why that's the wrong question, and how the score changes the right answer.
The concept
Every choice here is a gamble: a chance we score, a chance it goes wrong and they score on the break, and a chance nothing happens. Weighing up a gamble means multiplying each outcome by how likely it is and adding them up: the expected value.
The question is what to add up. Count goals, and a goal is a goal. But a side doesn't play for goals, it plays for points, and a goal's worth in points depends on the score. When outcomes are weighed by what they're really worth to you, the result is called expected utility. Here, the utility is points.
This is a different kind of decision tree from Machine Learning #9's. That one learns rules from data to make predictions; this one lays out a choice, what can follow it, and what each ending is worth.
A football example
What's a goal worth? Real results answer it. Across 5,879 Scottish Premiership matches from 2000/01 to 2025/26, seen from both sides, this is how many points a side ended up with, by its score at half-time:
| Half-time | Points at the end |
|---|---|
| 2+ down | 0.09 |
| 1 down | 0.50 |
| Level | 1.32 |
| 1 up | 2.30 |
| 2+ up | 2.87 |
Each value is good to about ±0.04 for luck: these are thousands of matches.
The gaps between the rows are what a goal is worth. Level, a goal for adds 0.98 points and a goal against costs 0.82, close to even. But the gaps aren't the same size:
One down, a goal for is worth 0.82 and a goal against costs only 0.41, because a side already losing doesn't have far to fall. One up, a goal for adds 0.56, but a goal against costs 0.98: it throws away a likely win.
So a choice is worth making when the chance of scoring, times what a goal adds, beats the chance of conceding, times what a goal against costs:
$$\begin{aligned} \text{worth it if } & p_{\text{score}} \times \text{gain} \\ &> p_{\text{concede}} \times \text{loss} \end{aligned}$$
In plain football
- pscore is the chance the move ends in a goal for us; pconcede is the chance it ends with one for them.
- Gain is what a goal for adds in points, from the chart; loss is what a goal against costs.
- Worth it means the move adds points on average, compared with nothing happening.
Turn it round and it says how much risk a side can carry. One down, a gamble pays if it risks fewer than about two goals against for every goal it might score. Level, about 1.2. One up, only about 0.6: the move has to be nearly twice as likely to score as to concede.
The winger's choice
Now the three options, with made-up chances for each:
| Option | We score | They score |
|---|---|---|
| Shoot | 8% | 2% |
| Cross | 11% | 6.5% |
| Keep the ball | 1% | 0% |
Shooting usually ends the move, so a counter-attack is rare. The cross gets the most goals, but with bodies forward, losing the ball leaves the back door open.
Counting goals, the shot wins: 0.08 − 0.02 = +0.060 expected goals, against +0.045 for the cross and +0.010 for keeping the ball. That answer never changes.
Counting points, it does:
| Score | Shoot | Cross | Keep |
|---|---|---|---|
| 1 down | +0.058 | +0.064 | +0.008 |
| Level | +0.062 | +0.055 | +0.010 |
| 1 up | +0.025 | −0.002 | +0.006 |
One down, the cross is best: its extra goals are worth a lot, and the goals it gives away don't cost much. Level, the shot. One up, the shot again, and the cross is now worse than keeping the ball: on average it loses points.
The numbers are small because one moment is a small part of a match. But a match is full of moments like this, and the side that gets them right more often adds up.
Risk-seeking and risk-averse
Behind the table is an old idea. A side one down should be risk-seeking: take gambles that give away more goals than they'd accept at level, because the downside is small. A side one up should be risk-averse: turn down gambles that look good on goals alone, because the downside is a win thrown away.
That's what managers already do when they throw on strikers chasing a game, or bring on a defender to see one out. Expected utility puts numbers on the instinct, and shows where it can go too far: in this example, one up, the shot is still better than keeping the ball, so shutting up shop completely would give away points too.
It ties in with other parts of the site. Decision Science #2 chose how far forward to push for a whole season; here the right push changes minute by minute with the score. The 2–0 lead myth found how safe a two-goal lead really is, and points per goal found a goal is worth about 0.6 points across a season, an average over all these different scores.
Why it matters
Any decision with uncertain outcomes comes down to two questions: how likely is each outcome, and what is each one worth to you? Expected goals answers the first. It doesn't answer the second, and the second changes with the score. A recruitment, tactics or substitution decision that counts goals when it should count points can be right on average and wrong in exactly the games that matter. This is the first part of the series about uncertainty; the next parts choose under it over whole seasons.
Limitations
- The winger's chances are made up. Real values would come from event data on where shots, crosses and counter-attacks start and end, which our data doesn't have.
- The values are at half-time. A goal in the 85th minute is worth more than one just after half-time, because there's less time to answer it. With minute-by-minute goal times, each step would get steeper as the game goes on. Our data has only half-time and full-time scores.
- Both sides of every match are counted, so the table mixes home and away. Home sides do a little better from every score; the shape is the same.
- A league's utility is points. In a cup tie, where a draw means extra time and only winning matters, the gaps change and so can the answer.
- One moment, not a plan. A side one down might also keep the ball to tire the opposition before pressing; expected utility weighs one decision at a time.
Try it yourself
Make the cross safer: drop its chance of a goal against from 6.5% to 4%. Before running the code, guess: is it now the best option at every score, or still only some?
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. Then:
Show the Python43 lines, ready to copy and run.
import csv
import glob
from statistics import mean, stdev
# Points each side ended with, by its half-time margin (2 or more is grouped). Every match is seen from both sides.
by_margin = {m: [] for m in (-2, -1, 0, 1, 2)}
matches = 0
for path in sorted(glob.glob("SC0_*.csv")):
for row in csv.DictReader(open(path, encoding="latin-1")):
try:
ht = int(row["HTHG"]) - int(row["HTAG"])
ft = int(row["FTHG"]) - int(row["FTAG"])
except (KeyError, ValueError):
continue
matches += 1
for side in (1, -1):
points = 3 if side * ft > 0 else 1 if side * ft == 0 else 0
by_margin[max(-2, min(2, side * ht))].append(points)
value = {m: mean(p) for m, p in by_margin.items()}
names = {-2: "2+ down", -1: "1 down", 0: "Level", 1: "1 up", 2: "2+ up"}
print(f"{matches:,} matches. Points a side ends with, by its half-time score:")
for m, p in by_margin.items():
luck = 2 * stdev(p) / len(p) ** 0.5
print(f" {names[m]:8} {value[m]:.2f} (±{luck:.2f}) from {len(p):,} sides")
print("\nWhat a goal is worth just after half-time:")
for m in (-1, 0, 1):
gain = value[m + 1] - value[m]
loss = value[m] - value[m - 1]
print(f" {names[m]:7} scoring +{gain:.2f}, conceding -{loss:.2f}: "
f"a gamble pays if it risks fewer than {gain / loss:.2f} goals against for each goal for")
# The winger's three choices (made up): chance we score from it, chance they score on the break.
choices = {"Shoot": (0.08, 0.02), "Cross": (0.11, 0.065), "Keep the ball": (0.01, 0.00)}
print("\nExpected goals (ours minus theirs):")
for c, (us, them) in choices.items():
print(f" {c:14} {us - them:+.3f}")
for m in (-1, 0, 1):
gain, loss = value[m + 1] - value[m], value[m] - value[m - 1]
worth = {c: us * gain - them * loss for c, (us, them) in choices.items()}
best = max(worth, key=worth.get)
print(f"Expected points added, {names[m].lower()}: " + ", ".join(f"{c} {w:+.3f}" for c, w in worth.items()) + f" -> {best}")
It prints:
Show the Text19 lines, ready to copy and run.
5,879 matches. Points a side ends with, by its half-time score:
2+ down 0.09 (±0.03) from 976 sides
1 down 0.50 (±0.04) from 2,593 sides
Level 1.32 (±0.04) from 4,620 sides
1 up 2.30 (±0.04) from 2,593 sides
2+ up 2.87 (±0.03) from 976 sides
What a goal is worth just after half-time:
1 down scoring +0.82, conceding -0.41: a gamble pays if it risks fewer than 2.01 goals against for each goal for
Level scoring +0.98, conceding -0.82: a gamble pays if it risks fewer than 1.19 goals against for each goal for
1 up scoring +0.56, conceding -0.98: a gamble pays if it risks fewer than 0.57 goals against for each goal for
Expected goals (ours minus theirs):
Shoot +0.060
Cross +0.045
Keep the ball +0.010
Expected points added, 1 down: Shoot +0.058, Cross +0.064, Keep the ball +0.008 -> Cross
Expected points added, level: Shoot +0.062, Cross +0.055, Keep the ball +0.010 -> Shoot
Expected points added, 1 up: Shoot +0.025, Cross -0.002, Keep the ball +0.006 -> Shoot
Further reading
- Expected utility hypothesis, Wikipedia. The idea in general, from the St. Petersburg paradox and Daniel Bernoulli to modern economics.
- Risk aversion, Wikipedia. Why people, and teams, turn down gambles that look good on average.
- Decision tree, Wikipedia. The decision-analysis kind used here, as opposed to the machine-learning kind.