Positional KICK

KICK-D, KICK-F, KICK-R, KICK-M

The companion metric to KICK Rating. Per-position weights so defenders, rucks and forwards get rated fairly to how they played — not compared against midfielders the Brownlow already rewards.

The problem, stated plainly

Harris Andrews has been the AFL's best defender for five years running. Five-time All-Australian. Brisbane's defensive rank with him versus without him is measurable. His overall KICK Rating is 41.

Meanwhile a replacement-level inside-midfielder with 100 games sits around 58. That gap is not a bug. KICK v1.1 was designed to agree with the Brownlow, the All-Australian selection and the AFLCA Champion Player vote — and all three of those awards heavily reward midfielders. Umpires vote inside-mids. AA panels pick inside-mids. So KICK over-rewards inside-mids, by construction.

We spent months trying to close the position gap inside the overall formula. See the validation page for the full history (v1.2 weight sweep, v1.3 mechanism sweep, v1.4 richer-data sweep across 972 configs). Every lever that closes the position gap breaks external-signal alignment. The tradeoff is structural, not a tuning problem.

So we shipped a second surface instead.

What positional KICK is

Every player now carries two numbers:

KICK-P is not a separate formula per position — it's one formula, run across all 13,279 rated players, with weights tuned from the v1.4 sweep's top-5 region. Because the formula amplifies statistics that correlate with position impact — intercept marks for defenders, hit-outs-to-advantage for rucks, marks-inside-50 and goal-assists for forwards — the effect is per-position. A defender who racks up intercept marks gets lifted. A midfielder who doesn't barely changes.

The formula

The v1.4 sweep's top-1 configuration, unchanged:

Lever Value Effect
intercept_marks weight 5.0 Primary defender correction — intercept marks are the single cleanest signal of defensive impact the box score exposes. Also rewards rebounding defenders and interceptor rucks.
Role-aware multipliers (moderate preset) per-position Rucks get hit_outs × 1.4 and contested_marks × 1.3. Defenders get one_percenters × 2.5, rebound_50s × 2.0, marks × 1.15. Forwards get marks_inside_50 × 2.5, goals × 1.15, goal_assists × 1.5.
Era normaliser tiered Divisor 0.8 for pre-1965, 1.6 for 1965–1999, 1.9 for 2000+. Lets older careers share the scale with modern ones without flattening 2020s elites.

Nothing else. We did try layering hit-outs-to-advantage, score-involvements, pressure-acts and general intercepts on top, but every additional lever either made ruck numbers unrealistically high (hit-outs-to-advantage compounded with the role-aware ruck multiplier), or moved the needle by less than a point (score-involvements, pressure-acts). The cleanest, most defensible version is the sweep's top-1 exactly: one new weight + two mechanism presets.

Per-position calibration (the scale-fairness layer)

Even after the formula runs, raw positional KICK numbers aren't the same across positions. A top midfielder hits raw 74; a top defender 69; a top forward 69; a top ruck 83. Same "position peak", different numbers. Root cause: v1.1 rewards disposal volume, which mids and rucks accumulate more of than defenders/forwards. No amount of weight tuning closes this (we've tried — 1,052 sweep configurations across v1.2, v1.3 and v1.4 all hit the same ceiling).

So the final step in positional KICK is a per-position percentile-anchor rescale. For each position, we take the distribution of raw positional KICK across every player with 30+ games and calibrate:

Piecewise linear between those anchors; below p50 linear to 0; clamped to [0, 100]. Separate anchors for career averages and rolling-40 form, separate per position.

Effect: a reader sees KICK-D 85 and KICK-M 85 and knows both mean "elite at this position". Bontempelli (the best contemporary midfielder) and Tom Stewart (the best contemporary defender) both land near 100. Max Gawn and Nick Riewoldt too. Within each position the ranking and relative spread are preserved exactly — it's a monotonic transform — but across positions the numbers are finally comparable.

We show both the scaled number (headline) and the raw formula number (smaller, for transparency) on every leaderboard row. The raw number is there so you can see what the formula produced; the scaled number is there because "elite defender" and "elite midfielder" should read as numerically similar.

Full anchor tables are persisted in data/computed/kick_positional.json (top-level anchors key). Code: compute_positional_kick.py_apply_scaling().

All seven AFL.com.au advanced fields (score_involvements, intercepts, intercept_marks, hitouts_to_advantage, pressure_acts, metres_gained, f50_ground_ball_gets) remain available in the components pickle — if future work relaxes the pass criteria or licences commercial data, the plumbing is ready.

Before and after

Same players. Same data. Overall KICK (award-aligned) next to KICK-P (calibrated). Career averages shown.

Player Position KICK KICK-P raw KICK-P scaled
Harris AndrewsDefender416086
Tom StewartDefender5369100
Jeremy McGovernDefender476591
Max GawnRuck7183100
Brodie GrundyRuck677695
Jeremy CameronForward505685
Nick RiewoldtForward6369100
Marcus BontempelliMidfielder7374100
Patrick CrippsMidfielder717190

The KICK column is the overall award-aligned rating (unchanged). The raw KICK-P column is the positional formula's output before calibration — still position-biased in scale. The scaled KICK-P is what shows on leaderboards and player profiles: elite at each position lands in the 90–100 range, fairness restored across positions.

Which number should I use?

KICK is the single-number headline. Use it when you want "who's the best player going around" or need a number that agrees with award voting. It's what Brownlow medallists' profiles show at the top.

KICK-P is the companion metric. Use it when you're comparing players within a position — "best defender", "best ruck". It's what the positional leaderboards rank by.

They're designed to disagree on defenders and rucks, by exactly the amount that the awards they track undervalue those positions. That's not a bug — it's the honest version of the story.

Where to see it

The validation code, sweep results and full methodology are in the data/validation/ and compute_positional_kick.py files in our repo. See also the validation page for the full v1.2–v1.4 story.