Contextflo Blog

We let Claude Fable analyze football penalty data. Here's what it found

Planet Money said penalty takers randomize so well that no spot on goal scores better than another. We checked 1,557 penalties in one Claude session.

July 9, 20266 min readVivek Sah

Planet Money just ran an episode on the game theory of penalty kicks, pegged to Messi's miss at the World Cup. The claim: every penalty taker has a good side and a bad side, and if you always shoot your good side, keepers figure you out. So pros mix, not just randomly but in exactly the right proportions, so that neither side scores better than the other and the keeper has nothing to exploit. Economists call it a mixed strategy, and the famous studies say pros execute it almost perfectly.

That is a testable claim, and it happens to be checkable: StatsBomb publishes open event data that records every shot with its end location in three dimensions. So instead of nodding along, we asked. The whole analysis below happened in one Claude session.

Heatmap of penalty conversion rates by goal placement, 1,557 penalties

The data and the queries

The dataset is StatsBomb Open Data loaded into BigQuery: 14 tables covering roughly 3,960 matches across 24 competitions, every on-ball event recorded. In StatsBomb coordinates the goal mouth spans y 36 to 44 (eight yards wide) and the crossbar sits at z 2.67. Penalties are just shots where shot_type_name = 'Penalty'. There are 1,557 of them.

The question was typed in exactly as you would say it out loud:

“Is it actually true that no spot on the goal scores more than any other? Where do players aim vs how well does each spot convert, not just left/right, high and low too. Show it as a heatmap of the goal.”

Two queries answered it. The first splits the goal into six zones, three across and two heights:

SELECT
  CASE WHEN s.end_location_y < 38.67 THEN 'Left'
       WHEN s.end_location_y <= 41.33 THEN 'Centre' ELSE 'Right' END AS horizontal,
  CASE WHEN s.end_location_z IS NULL THEN 'Unknown'
       WHEN s.end_location_z < 1.33 THEN 'Low' ELSE 'High' END AS height,
  COUNT(*) AS attempts,
  SUM(CASE WHEN s.outcome_name = 'Goal' THEN 1 ELSE 0 END) AS goals,
  ROUND(100 * SUM(CASE WHEN s.outcome_name = 'Goal' THEN 1 ELSE 0 END) / COUNT(*), 1) AS conversion_pct
FROM `contextflo-demo.football.shots` s
WHERE s.shot_type_name = 'Penalty'
GROUP BY horizontal, height
ORDER BY horizontal, height

The second re-bins the same table for the heatmap: 1-yard columns across the 8-yard goal, four height bands, with over-the-bar and wide misses kept in edge bins so the risk of each strategy stays visible:

SELECT
  CASE
    WHEN s.end_location_y < 36 THEN -1                -- wide left
    WHEN s.end_location_y >= 44 THEN 8                -- wide right
    ELSE CAST(FLOOR(s.end_location_y - 36) AS INT64)  -- 1-yard columns 0..7
  END AS ybin,
  CASE
    WHEN s.end_location_z IS NULL THEN NULL
    WHEN s.end_location_z >= 2.67 THEN 4              -- over the bar
    ELSE CAST(FLOOR(s.end_location_z / 0.6675) AS INT64)
  END AS zbin,
  COUNT(*) AS attempts,
  SUM(CASE WHEN s.outcome_name = 'Goal' THEN 1 ELSE 0 END) AS goals
FROM `contextflo-demo.football.shots` s
WHERE s.shot_type_name = 'Penalty'
GROUP BY ybin, zbin
ORDER BY zbin, ybin

That is the whole extraction layer. Here is the session itself, unedited:

What 1,557 penalties say

Overall conversion: 74.2%. And the game-theory claim splits cleanly in two.

Left to right, the equilibrium is real. Shots to the left convert 72.8%, centre 76.4%, right 75.5%. Across more than 1,500 kicks, a spread of about two percentage points is remarkably flat, exactly what a mixed-strategy equilibrium predicts, and consistent with Palacios-Huerta's academic studies (which, notably, only ever tested left vs right).

Top to bottom, it breaks down. Players hit the bottom half of the goal 74% of the time, yet low shots convert around 71–73% while high shots convert 81–83%. Even after charging the high strategy for every ball blazed over the bar, all automatic misses, aiming high still wins, roughly 80% vs 72%.

Heatmap of where 1,557 penalties were placed on the goal

The fine grid explains the mechanism:

  • Bottom corners are good, near-corners are not. Balls along the ground into the outermost yard convert 86–91%. One yard further inside, conversion collapses to 64–69%. That is the keeper's dive radius, drawn in data.
  • The top of the goal is nearly unsaveable. Shots that got up there and stayed under the bar almost always scored (the top band went in 94 of 96 times). The tax is missing the frame entirely, and that risk concentrates in the last few inches under the bar.
  • The worst place in the goal is shin-to-waist height (roughly 61–66%), the most comfortable save a keeper ever makes.

So pros randomize direction like textbook game theorists, but they are systematically too conservative on height, trading roughly eight points of conversion for the comfort of keeping the ball under the bar. Statistically, the Panenka takers and top-bins merchants are the rational ones.

One honest caveat: the data records where the ball ended up, not where the taker aimed, so a scuffed shot gets charged to the wrong strategy. That slightly flatters the low corners and penalizes the high rows, meaning the real gap in favor of aiming high is, if anything, understated.

The podcast proves it in its own climax

The best part is that the episode's dramatic peak is this exact finding. 2008 Champions League final: Palacios-Huerta writes Chelsea's penalty cribsheet, and his advice against Van der Sar is to go along the ground or high into the top corner, but never mid-height. Anelka hits it mid-height. Saved. Chelsea lose the final. The best penalty database in the world had already concluded in 2008 what the heatmap above shows: the middle band belongs to the keeper.

Why do pros keep leaving those eight points on the table? Probably because skying a ball over the bar is humiliating in a way “the keeper guessed right” never is. The pattern has company in the literature: Bar-Eli et al. found that goalkeepers dive on roughly 94% of penalties even though staying central is statistically optimal, because conceding after action feels better than conceding after standing still. Everyone on the pitch is optimizing for dignity. An independent analysis on different data found the same high-vs-low gap we did (25% of kicks high converting 82%, vs 75% low converting 74%), so this is not a quirk of one dataset.

Why this matters beyond football

Swap penalties for churn cohorts, funnel steps, or fulfillment SLAs and the workflow is identical. Ask the question in plain language. ContextFlo grounds it with org context, verified saved queries, and table schemas, so the SQL is right the first time. In this case a saved, approved query in the workspace had already encoded the goal-frame geometry, which is why Claude never had to guess a coordinate system. Iterate on trusted SQL instead of guessing column names. Save the output as a living, shareable artifact.

A podcast claim to a checked, replicated answer, with a published visualization, in a single conversation. That is the pitch, and the penalty data made it for us.

This was just the penalties. The same dataset has every pass, shot, and press across roughly 4,000 matches. Got a theory of your own? Pick the football dataset during onboarding and connect your Claude. Event data sourced from StatsBomb Open Data.

ContextFlo onboarding screen with the football demo dataset selected

Related reading