Set Pieces & Corners
Summary
Per-team-season aggregates describing set-piece attack share,
free-kick outcomes, corner delivery quality, and overall big-chance
conversion. Everything is a sum over regular-season team-matches of
fields already present in match_stats.stats_json. No ingest changes
and no model fitting: the page exists because the underlying teamstats
feed carries these numbers and nothing in the UI was surfacing them.
The feature lives at /analysis/set-pieces and feeds one input to the
finishing-efficiency cut planned for the next SQI revision.
Inputs
Each value is the SDP teamstats key of the same name. Fields that are absent from a team-match payload are treated as zero (SDP omits zero-valued keys for many stats, which would otherwise look like missing data).
| Stored column | SDP key | Meaning |
|---|---|---|
sp_goals |
goalAssistSetplay |
Goals that came from a set-play assist (corner / FK / long throw combined). |
sp_att |
attAssistSetplay |
Set-play chances created (shots whose assist was a set play). |
sp_shots |
attSetpiece |
Shots from set pieces. Attempts, not goals. |
fk_goals |
attFreekickGoal |
Direct free-kick goals. |
fk_total |
attFreekickTotal |
Direct free-kick attempts. |
fk_target |
attFreekickTarget |
Direct free-kick attempts on target. |
corners_taken |
cornerTaken |
Corners taken by the team. |
corners_won |
wonCorners |
Corners awarded to the team (basically the same as cornerTaken in this feed). |
corners_intobox_total |
totalCornersIntobox |
Corners played into the penalty area. |
corners_intobox_accurate |
accurateCornersIntobox |
Into-box corners that found a teammate. |
big_chance_scored |
bigChanceScored |
SDP-flagged big chances scored. |
big_chance_missed |
bigChanceMissed |
SDP-flagged big chances missed. |
goals |
goals |
Total goals scored by the team in the match. |
Playoff matches are excluded (matches.is_playoff = 0), matching the
default scope used by form, splits, expected points, and SQI.
Derived rates
Computed server-side on read from the stored counters. None when the
denominator is zero. All are straightforward:
- SP assist share =
sp_goals / goals - SP conversion =
sp_goals / sp_att - SP shots per match =
sp_shots / matches - FK on-target rate =
fk_target / fk_total - FK goal rate =
fk_goals / fk_total - Corners per match =
corners_taken / matches - Corner delivery rate =
corners_intobox_accurate / corners_intobox_total - Big-chance conversion =
big_chance_scored / (big_chance_scored + big_chance_missed)
What we explicitly can NOT do
Per-event corner-to-goal attribution. Confirmed on 2026-04-16 by
scanning all 718 match summary.json payloads: SDP's event stream does
not emit a corner event. There is no way to say "goal scored within
two minutes of a corner" from the current feed. Only teamstats
aggregates are available.
Split goals by set-piece type. goalAssistSetplay bundles corners,
free kicks, and long throws into one number. To isolate "goals from
corners" you would need either per-event corners or per-event goal
sources, neither of which are present.
Data caveats
attSetpieceis present every season (2019-2025, ~0.7 per team-match) but is attempts from set pieces, not goals. Confirmed by comparing the season sums (140-190) to total season goals (250-350): if it were goals, half of all goals would be from set pieces, which is nonsense. We surface it assp_shotson the page for this reason.goalAssistSetplayis the cross-season goals-from-set-plays signal. It averages 4-7 goals per team per season, so team-season set-piece conversion rates (sp_conv) are genuinely noisy. The UI italicizes rates where the denominator is under 10 and the methods is to rank teams by set-piece volume first, not conversion.accurateCornersIntoboxandtotalCornersIntoboxare present every season, so corner delivery quality is the most reliable cross-season signal on the page.- 2020 Island Games had 7-11 matches per team in a neutral bubble without travel, rest variance, or crowds. Rows from 2020 are flagged on the page and should not be compared directly to other seasons.
- Direct-free-kick goals (
attFreekickGoal) are very rare (2-16 per season league-wide). Team-season FK goal-rates are almost always too small-N to read meaningfully.
Why this isn't clustering
The data volume is too small. With 55 team-seasons total and 4-7 set-piece goals per team per season, any clustering would mostly be fitting noise. The page sticks to raw counters + direct rates so the user always sees the denominator.