← All methods

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

  • attSetpiece is 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 as sp_shots on the page for this reason.
  • goalAssistSetplay is 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.
  • accurateCornersIntobox and totalCornersIntobox are 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.