Math & ModelsUpdated 28 Jul 20264 min read
How to Read an xG Table
The league table says what a season produced. The xG table says what it was worth. Where the two disagree is the only interesting part.
The columns#
| Column | What it is |
|---|---|
| # | The club's real league position. It never changes, whichever order you choose. |
| MP | Matches with chance data. Normally the same as the league table's. |
| GF / GA | Goals actually scored and conceded. |
| Pts | Points actually taken. |
| xG / xGA | The goals the chances created and conceded were worth across the season. |
| xPts | Expected points — each match's win, draw and loss probabilities, summed. |
| Δ | Points minus expected points. |
The two orders, and why the position never moves#
The By table order is the league table. The By xPts order sorts by expected points, so a side that has taken fewer points than its play deserved rises, and one riding a good run falls.
The first column keeps the real position in both. That is deliberate. A re-ranked table that hid where a club actually stands would be a second, rival league table, and a reader glancing at it would carry away a position that does not exist. The order changes what the rows are sorted by; it never changes the answer to "where is this club".
Δ, and the direction it points#
A positive Δ means a club has more points than its chances were worth. This is where the column is most often misread. It is not a mark of quality — if anything it is a warning. The things that put a team above its expected points (hot finishing, a goalkeeper in form, a run of one-goal wins) repeat less reliably than the chances themselves, so large positive gaps tend to shrink.
That is why the column is not coloured green and red. Green on the club most likely to fall, and red on the one most likely to climb, would be worse than no colour at all.
Read Δ as a question — is this season describing this team, or describing its luck? — and go looking for the answer.
Why we do not show goals minus expected goals#
Most xG tables include a column subtracting expected goals from actual goals. Ours does not, and it is worth being explicit about why.
Expected goals are a model's output, and models are calibrated to their own data. Summed across the complete 2025 season, our provider's expected goals compared with the goals actually scored like this:
| League | Goals | xG | xG ÷ goals |
|---|---|---|---|
| Serie A | 922 | 1060.6 | 1.150 |
| La Liga | 1024 | 1140.6 | 1.114 |
| Premier League | 1045 | 1162.4 | 1.112 |
| Ligue 1 | 863 | 926.6 | 1.074 |
| Bundesliga | 990 | 1041.9 | 1.052 |
| Russian Premier League | 609 | 577.8 | 0.949 |
In Serie A the expected goals for the season exceed the real goals by 15%. Subtract one from the other there and nearly every club in the division reads as under-performing — not because Italian football finished badly, but because the model's scale sits above the league's scoring rate. In the Russian Premier League the bias runs the other way, so the same column would flatter almost everyone.
Expected points do not have this problem: summed over a season they land within about 2% of the points the league really awards, in every one of the six. So the comparison the table makes is in points.
This is not a criticism of the provider. xG models are trained to rank chances, not to reproduce a league's seasonal goal total, and a consistent offset does not stop the ranking being useful. It only stops the subtraction being meaningful.
Why the ranking waits for five matches#
Early in a season the xPts order and the Δ column are withheld, and the table stays in league order showing only chances created and conceded. A note says how many matches the least-played club has.
Two or three matches of chance data produce an ordering that is almost entirely noise. Printing it anyway would dress variance as a finding, and the fact that it appears in a neat ranked column makes it more convincing, not less. Five matches is the same threshold the Form view uses, so the site has one answer to "enough to say something" rather than two.
What this table cannot tell you#
- Who will win on Saturday. It describes matches already played. Chance quality is an input to a forecast, not a forecast.
- Whether a club is good. It measures chances, and ignores who took them. A team of exceptional finishers will sit above its expected goals every season, and the model will call that over-performance every time.
- Where the value is. The bookmaker reads the same public data. See expected points for why a large gap is not a bet.
Related
Frequently asked questions
Why does the xG table have two orders?
One is the real league table; the other ranks by expected points. The club's real position stays in the first column in both, so the second order comments on the table rather than replacing it.
Why is there no 'goals minus xG' column?
Because it would not mean what it appears to mean. Across the 2025 season the total expected goals in five of our six covered leagues ran between 5% and 15% above the goals actually scored, so subtracting would label almost every team in those leagues an under-performer. Over-performance is shown in points instead, which reconciles with the real table.
Why is the ranking hidden early in the season?
Ranking by expected points needs five matches from every club in the league. Below that the order is mostly noise, and printing it as a ranking would present variance as a finding.
Which leagues have xG?
The six our data provider publishes: the Premier League, La Liga, Serie A, the Bundesliga, Ligue 1 and the Russian Premier League. Elsewhere the view is not offered at all rather than shown empty.
Why does another site show different xG for the same match?
Because xG is a model output, not a measurement. Every provider trains its own model on its own event data, so the same shot receives a different number. Comparing xG across providers is not comparing like with like.