Football analytics · flagship
Live repoOpen data (StatsBomb)Opponent-Adjusted Football Metrics
Independent research · 8 months of active development
View the repo →What this is
Contextual expected goals (CxG) and assists (CxA) over 2,143,146 raw StatsBomb events, benchmarked directly against StatsBomb's own xG on the same shots rather than self-reported in isolation.
Metrics
CxG model
0.80920 AUC
vs StatsBomb xG 0.81957
CxG calibration
Brier 0.07325 · log loss 0.26110
CxA baseline
0.85814 AUC · Brier 0.04046
over 1,091,388 rows
Testing
332 tests across 46 files
Stack
Provenance
Computed outputs are gitignored; the numbers above live in committed docs, not rendered dashboards.
What I would not claim
- LightGBM as headline tech
- gradient boosting as headline tech
- plotly
Explore the shots
A sample of real shots, my CxG beside StatsBomb's own xG on the same shots. Toggle the metric or the diff, filter by team, match or pressure, and watch the calibration recompute.
440 shots
59 goals in this selection
Brier score on this selection (lower is better calibrated)
Actual goal rate 0.134. Both are shot-quality estimates; the point is that CxG sits next to StatsBomb's own number on the same shots, not in isolation.
Data provenance. 440-shot sample from the CxG diagnostic model, benchmarked against StatsBomb xG. Open StatsBomb data, served from Supabase; full set in the repo.
Explore contextual expected assists
The CxA diagnostic model against its own baseline over 1,091,388 action rows. Precision among the model's most confident actions is the headline; the leaderboard shows volume against efficiency.
Diagnostic v1 against its own baseline
Over 1,091,388 action rows. There is no off-the-shelf expected-assists model to compare against, so this is an internal baseline, not an industry incumbent.
+0.1233 better than the baseline. Higher is better for this metric.
The headline. Among the actions the model is most confident about, the share that actually created a shot rose from 0.463 to 0.586 — 12.3 percentage points.
scikit-learn GradientBoostingClassifier, sigmoid-calibrated · 37 selected features · promotion gate passed
Volume and efficiency tell different stories: sort by total and by mean to see it. Özil leads on total CxA, but Sánchez creates more per action, and Fàbregas has the most actions of the leaders with the lowest mean.
Mesut Özil
Arsenal
416.09
Total CxA
Alexis Alejandro Sánchez Sánchez
Arsenal
351.93
Total CxA
Willian Borges da Silva
Chelsea
325.34
Total CxA
Francesc Fàbregas i Soler
Chelsea
324.86
Total CxA
Ross Barkley
Everton
316.04
Total CxA
Christian Dannemann Eriksen
Tottenham Hotspur
311.67
Total CxA
Dimitri Payet
West Ham United
311.06
Total CxA
Eden Hazard
Chelsea
296.40
Total CxA
Riyad Mahrez
Leicester City
273.62
Total CxA
Juan Manuel Mata García
Manchester United
268.31
Total CxA
Aaron Ramsey
Arsenal
266.26
Total CxA
Anthony Martial
Manchester United
258.48
Total CxA
| Rank | Name | Total CxA | Mean CxA | Actions | Shot-creating |
|---|---|---|---|---|---|
| 1 | Mesut Özil | 416.09 | 0.0891 | 4,672 | 417 |
| 2 | Alexis Alejandro Sánchez Sánchez | 351.93 | 0.1070 | 3,288 | 324 |
| 3 | Willian Borges da Silva | 325.34 | 0.0976 | 3,333 | 277 |
| 4 | Francesc Fàbregas i Soler | 324.86 | 0.0631 | 5,150 | 283 |
| 5 | Ross Barkley | 316.04 | 0.0805 | 3,924 | 322 |
| 6 | Christian Dannemann Eriksen | 311.67 | 0.0842 | 3,703 | 402 |
| 7 | Dimitri Payet | 311.06 | 0.1013 | 3,071 | 364 |
| 8 | Eden Hazard | 296.40 | 0.0970 | 3,055 | 262 |
| 9 | Riyad Mahrez | 273.62 | 0.1023 | 2,674 | 341 |
| 10 | Juan Manuel Mata García | 268.31 | 0.0741 | 3,621 | 199 |
| 11 | Aaron Ramsey | 266.26 | 0.0630 | 4,223 | 233 |
| 12 | Anthony Martial | 258.48 | 0.1140 | 2,267 | 220 |
| 13 | Sergio Leonel Agüero del Castillo | 257.14 | 0.1428 | 1,801 | 215 |
| 14 | Kevin De Bruyne | 256.32 | 0.1028 | 2,494 | 283 |
| 15 | David Josué Jiménez Silva | 255.46 | 0.0900 | 2,839 | 231 |
| 16 | Dušan Tadić | 251.42 | 0.1168 | 2,153 | 286 |
| 17 | Romelu Lukaku Menama | 249.28 | 0.1109 | 2,247 | 226 |
| 18 | Philippe Coutinho Correia | 247.98 | 0.1075 | 2,306 | 288 |
| 19 | Sadio Mané | 245.73 | 0.1025 | 2,397 | 251 |
| 20 | Jesús Navas González | 243.40 | 0.0857 | 2,840 | 217 |
| 21 | Harry Kane | 234.90 | 0.1105 | 2,125 | 312 |
| 22 | Gylfi Þór Sigurðsson | 231.15 | 0.0949 | 2,436 | 279 |
| 23 | Raheem Sterling | 226.48 | 0.1127 | 2,010 | 194 |
| 24 | Erik Lamela | 221.96 | 0.1002 | 2,215 | 231 |
| 25 | Marko Arnautović | 218.77 | 0.0876 | 2,497 | 221 |
| 26 | Matt Ritchie | 214.77 | 0.0699 | 3,072 | 226 |
| 27 | Bamidele Alli | 211.71 | 0.0911 | 2,325 | 227 |
| 28 | Gnégnéri Yaya Touré | 209.48 | 0.0602 | 3,477 | 222 |
| 29 | James Philip Milner | 209.12 | 0.0745 | 2,808 | 238 |
| 30 | Odion Jude Ighalo | 208.70 | 0.1299 | 1,606 | 232 |
| 31 | Moussa Sissoko | 208.13 | 0.0662 | 3,142 | 278 |
| 32 | Jason Puncheon | 207.57 | 0.0764 | 2,717 | 202 |
| 33 | Kylian Mbappé Lottin | 206.52 | 0.1226 | 1,684 | 214 |
| 34 | Diego da Silva Costa | 203.75 | 0.1125 | 1,811 | 157 |
| 35 | Nathan Redmond | 203.69 | 0.0915 | 2,226 | 227 |
| 36 | Robert Brady | 199.07 | 0.0707 | 2,816 | 196 |
| 37 | Troy Deeney | 196.49 | 0.0903 | 2,176 | 225 |
| 38 | Wayne Mark Rooney | 194.75 | 0.0839 | 2,322 | 188 |
| 39 | Pedro Eliezer Rodríguez Ledesma | 192.79 | 0.0855 | 2,254 | 209 |
| 40 | Marc Albrighton | 191.34 | 0.0818 | 2,338 | 246 |
| 41 | Wes Hoolahan | 190.04 | 0.0804 | 2,364 | 181 |
| 42 | Steven Davis | 188.19 | 0.0666 | 2,827 | 190 |
| 43 | Jamie Vardy | 184.49 | 0.1355 | 1,362 | 221 |
| 44 | Wilfried Zaha | 182.91 | 0.0955 | 1,916 | 185 |
| 45 | Oscar dos Santos Emboaba Júnior | 179.04 | 0.0831 | 2,155 | 169 |
| 46 | Roberto Firmino Barbosa de Oliveira | 177.24 | 0.0868 | 2,043 | 209 |
| 47 | Héctor Bellerín Moruno | 175.06 | 0.0467 | 3,747 | 142 |
| 48 | Adam David Lallana | 173.32 | 0.0871 | 1,990 | 216 |
| 49 | Memphis Depay | 167.53 | 0.1048 | 1,599 | 119 |
| 50 | Charlie Daniels | 162.56 | 0.0420 | 3,871 | 178 |
| 51 | Ignacio Monreal Eraso | 162.55 | 0.0435 | 3,738 | 136 |
| 52 | Jordan Ayew | 162.55 | 0.0824 | 1,972 | 136 |
| 53 | Santiago Cazorla González | 161.96 | 0.0665 | 2,435 | 167 |
| 54 | Manuel Lanzini | 161.71 | 0.0695 | 2,327 | 202 |
| 55 | Georginio Wijnaldum | 161.44 | 0.0626 | 2,578 | 202 |
| 56 | Aleksandar Kolarov | 159.26 | 0.0524 | 3,041 | 128 |
| 57 | Nathaniel Edwin Clyne | 158.76 | 0.0479 | 3,316 | 177 |
| 58 | Xherdan Shaqiri | 157.44 | 0.0889 | 1,771 | 186 |
| 59 | Alberto Moreno Pérez | 154.56 | 0.0545 | 2,835 | 192 |
| 60 | Gerard Deulofeu Lázaro | 153.70 | 0.1031 | 1,491 | 161 |
| 61 | Idrissa Gana Gueye | 152.02 | 0.0418 | 3,635 | 145 |
| 62 | Danny Drinkwater | 151.71 | 0.0430 | 3,527 | 177 |
| 63 | Luka Modrić | 150.76 | 0.0513 | 2,941 | 149 |
| 64 | Lionel Andrés Messi Cuccittini | 150.59 | 0.1177 | 1,279 | 149 |
| 65 | Fernando Luiz Roza | 149.55 | 0.0431 | 3,472 | 151 |
| 66 | Kevin De Bruyne | 147.73 | 0.0864 | 1,710 | 193 |
| 67 | Graziano Pellè | 145.18 | 0.0950 | 1,528 | 133 |
| 68 | André Ayew Pelé | 144.54 | 0.0649 | 2,228 | 134 |
| 69 | Yannick Bolasie Yala | 143.80 | 0.0942 | 1,527 | 172 |
| 70 | Jonathan Howson | 143.03 | 0.0590 | 2,426 | 161 |
| 71 | Junior Stanislas | 142.71 | 0.0932 | 1,532 | 145 |
| 72 | Darren Fletcher | 142.60 | 0.0509 | 2,801 | 116 |
| 73 | Antoine Griezmann | 141.90 | 0.0849 | 1,672 | 148 |
| 74 | Daryl Janmaat | 140.93 | 0.0495 | 2,845 | 167 |
| 75 | Ashley Westwood | 140.33 | 0.0487 | 2,880 | 121 |
| 76 | Emre Can | 139.97 | 0.0454 | 3,084 | 181 |
| 77 | Yohan Cabaye | 139.58 | 0.0570 | 2,448 | 166 |
| 78 | Jermain Defoe | 139.43 | 0.1383 | 1,008 | 154 |
| 79 | Yann Gérard M'Vila | 138.91 | 0.0439 | 3,167 | 210 |
| 80 | Olivier Giroud | 138.08 | 0.0964 | 1,433 | 129 |
| 81 | José Manuel Jurado Marín | 137.54 | 0.0705 | 1,950 | 146 |
| 82 | Aaron Cresswell | 136.19 | 0.0426 | 3,200 | 184 |
| 83 | Mark Noble | 134.45 | 0.0389 | 3,460 | 189 |
| 84 | Bojan Krkíc Pérez | 133.81 | 0.0805 | 1,663 | 149 |
| 85 | Ayoze Pérez Gutiérrez | 132.48 | 0.0858 | 1,544 | 149 |
| 86 | Patrick van Aanholt | 131.73 | 0.0536 | 2,458 | 150 |
| 87 | Ryan Bertrand | 131.61 | 0.0506 | 2,601 | 112 |
| 88 | César Azpilicueta Tanco | 131.22 | 0.0372 | 3,525 | 99 |
| 89 | Séamus Coleman | 130.35 | 0.0498 | 2,619 | 106 |
| 90 | Joshua King | 129.74 | 0.1118 | 1,160 | 137 |
| 91 | Andrew Surman | 128.96 | 0.0332 | 3,879 | 149 |
| 92 | Joshua Kimmich | 128.46 | 0.0590 | 2,177 | 147 |
| 93 | Simon Francis | 128.33 | 0.0313 | 4,098 | 134 |
| 94 | Toni Kroos | 128.17 | 0.0559 | 2,292 | 129 |
| 95 | James McClean | 128.13 | 0.0827 | 1,550 | 123 |
| 96 | Dan Gosling | 127.83 | 0.0553 | 2,312 | 131 |
| 97 | Mousa Sidi Yaya Dembélé | 127.70 | 0.0457 | 2,796 | 154 |
| 98 | N'Golo Kanté | 127.37 | 0.0474 | 2,688 | 138 |
| 99 | Daniel Olmo Carvajal | 126.87 | 0.1021 | 1,243 | 110 |
| 100 | Stéphane Sessègnon | 125.99 | 0.0873 | 1,444 | 148 |
What drives the model
Progression and location dominate, led by end_x. That is an honest description of what the model leans on, not a claim of subtle contextual insight.
Data provenance. Generated into data/cxa.json from the committed CxA portfolio export (headline metrics, top players and teams, feature drivers). Open StatsBomb data. The comparison is against this project's own baseline, not an industry expected-assists incumbent, and the model is provisionally promoted.