Skip to content

Methodology

How the numbers are made

Where each number on this site comes from, what we work out ourselves, what we take as it is, and where the limits are. The glossary says what the terms mean; this page says how they are made.

Our data, and what it can't see

Everything here is built from event data: a record of each action on the ball in a game (every shot, pass, touch, tackle and card) with the minute and the spot on the pitch where it happened. It comes from our data providers, and we store it in our own database after every game.

We have no tracking data. Tracking data follows all 22 players many times a second; we don't have it. So nothing on this site measures off-the-ball runs, distances covered, sprint speeds, defensive shape, or where players stood when they didn't have the ball. Where a chart looks like it shows positions, it shows where a player had the ball.

  • Not every competition has every number. The SuperLiga has no xG, and some games (some cup ties, some Conference League games) have no detailed event list. When a number is missing we show that, never a zero.
  • Numbers are kept unrounded and rounded only when they are shown.
  • Providers sometimes fix their data after a game (a shot moved to another player, for example). Those fixes flow into the site automatically. Mistakes of our own are listed on the corrections page.

xG, xGOT and xA

We don't run our own xG model. The xG of each shot comes from our data provider's shot model, the same model for every competition that has it. It judges how often a shot like that is scored from things such as where it was taken, the angle, the body part and the kind of chance. xGOT, for shots on target, comes from the same provider and also looks at where the shot ended up in the goal.

  • A team's or a player's xG is simply the sum of the xG of their shots.
  • npxG is the same with penalties left out.
  • xA is the xG of the shots a player set up with a pass, whether the shot went in or not.
  • Own goals carry no xG, and penalty shoot-outs are left out.

Because the shot model isn't ours, we can't change it or list every input it uses. Like any model built on event data, it can't know things only tracking data would show, like exactly where each defender stood. Read xG as how good the chances were on average, not as a verdict on one shot.

Deserved table (expected points)

For every league game we take each team's shots and their xG, treat every shot as its own chance to score, and work out how likely each final score was. That gives each side its chance of winning, drawing and losing the game, and its expected points: three times the chance of a win, plus the chance of a draw. Add those up over the season and rank the teams: that is the deserved table.

A game with no shot data counts the points actually won. The method treats shots as independent, so a rebound after a save counts as a second chance, and it ignores the score at the time: a team protecting a lead may happily give up chances it wouldn't at 0-0.

Match predictions

The win, draw and loss chances and the predicted score come from a score model we built and run ourselves. It is a well-known kind of football model (Poisson, in the Dixon-Coles style): it estimates how many goals each side should expect, then turns that into the chance of every score.

What goes in

  • Every finished game we have, fitted at once. Each team gets an attacking and a defensive strength, measured against the opponents it actually played.
  • Mostly xG, partly goals. Each side's number in a game is mostly its xG, with real goals counting too. For the last three seasons of the big five leagues, where we have no xG, shots on and off target stand in for it.
  • Recent games count more. A game's weight shrinks steadily with age, and a short form term compares the last few games with what the model expected. Games with a red card count half, since ten against eleven says little about either team.
  • Home advantage, one general edge plus a small one for each team, both learned from the results. Also rest (days since each side's last game) and each competition's own scoring level.
  • League strength. Teams are pulled towards their own league's average, and leagues are compared through the European games, the only games between them. Promoted sides start near the average of promoted sides.
  • Bookmakers' prices, in the big five leagues. We take the average pre-match prices that are published for the result and for over or under 2.5 goals, turn them into expected goals and mix them with the model's. In these leagues the market usually gets the larger share. European cups and the other leagues are model only. We use those prices as published data; we have no link to any bookmaker and we never show odds.

What comes out

  • The chance of every score, with a small correction for low scores (0-0, 1-0, 0-1, 1-1), which plain Poisson gets slightly wrong. Summed up, that gives the home, draw and away percentages, which add up to 100, and the three likeliest scores.
  • The call is the most likely result, or a draw when the two sides are almost level. The printed score is one of that result's likeliest scores: of those nearly as likely as the top one, the one closest to the goals that result usually comes with.
  • Predictions update until kick-off and are frozen then. Our public record counts every one, misses included, next to how often “the home team wins” would have been right.

How it checks itself

Every day the season so far is replayed week by week, each week predicted only from the games before it. From that replay a handful of settings are adjusted: how much weight the bookmakers' prices get, how likely level scores are, how confident to be in favourites, and when to call a draw. A change is kept only if it also does better on the last three weeks, held back from the tuning. The team strengths themselves are simply refitted on the data.

What it doesn't know. The model has no line-ups, injuries, suspensions, weather or motivation. Where those matter, it only sees them to the extent that bookmakers' prices already reflect them, and outside the big five leagues not at all. It is a probability, not a promise: a 70% call still misses about three times in ten. These are not betting tips.

Season odds

From the fifth round of a league season, after every round, we play the rest of the season 5,000 times. We start from the table as it stands and add every game still to play, postponed ones included. Each game's goals come from the same model as our match predictions. Every simulated season also shifts each team's strength a little at random, because the ratings are never certain and form changes over a season.

A club's title chance is the share of those 5,000 seasons it finishes first; the same goes for the top places and for the places that go down directly. Ties on points are split on goal difference, then goals scored, then at random: head-to-head rules are not modelled, so a close race can read a point or two differently from the real tie-breakers.

Momentum

Our own simple index. For each five minutes of a game we add up each side's shot xG plus a small amount for every touch it had in the final third, then take home minus away. Bars above the line are the home side on top, below the away side. Second-half stoppage time goes into the last bar.

It is not possession and not territory. A single big chance can make a tall bar, and in games without a detailed event list only the shots count.

Heat maps and zones

A player's heat map counts their touches this season from the event data, on a 12 by 8 grid, always drawn attacking the same way, and shaded against their busiest square. We only draw one once a player has 50 touches. The zones view groups the same touches into 18 areas (six bands up the pitch, three lanes across) and shows the share of touches in each.

These are on-ball maps. They show where a player had the ball, not where they stood, pressed or ran. Without tracking data, a striker who makes lots of runs but rarely gets the ball will look quieter than they played.

Pass networks

Built from the event data for the longest stretch of a game that a team played with the same eleven, usually from kick-off to the first substitution. Each circle sits at the average spot where that player had the ball in that stretch. Lines join players who passed to each other at least three times; thicker means more passes. Like heat maps, they show on-ball positions only.

Player ratings

Match ratings out of 10 come from our data provider's rating model; we don't calculate them. We use one provider's ratings throughout, so they compare fairly between games. A season average counts games where the player played at least 20 minutes, and the player of the match is the highest-rated player in the game.

Per 90 and percentiles

Per 90 is a season total divided by minutes played, times 90. Leaderboards show it only above a minimum of minutes, so a player with one great half doesn't top the list.

Percentiles compare a player with everyone in the same position group (from the position they started in most often) across all the competitions we cover this season, on per 90 numbers. A player needs 40% of the season leader's minutes to be included, and never less than 180 or more than 450 minutes. For numbers where fewer is better, like fouls or losing the ball, the scale is turned round, so a high percentile is always good.

Player profiles

Players with percentiles get a short written profile: an archetype, what kind of player the numbers show, key strengths, areas for development and similar players. An AI model (Claude, made by Anthropic) writes it from the numbers on the player's own page and nothing else: no reputation, transfer news or anything it remembers about the player.

Weaknesses are judged against the role, so a centre-back isn't marked down for few dribbles. Similar players are picked by us, not by the model: the closest percentile profiles in the same position group this season, never a teammate. They share numbers this season, not fame or style.

Before a report goes up, every number in it is checked against the player's data, and so are the similar players. A report that fails the check isn't published. Each report shows the date it was written and the minutes it covers; it is rewritten once a player has played about three more full games, so between rewrites the numbers below it can have moved on.

PPDA

A rough pressing measure: how many passes the opponent made in our half, divided by our tackles, interceptions and fouls. The usual PPDA counts only passes and defensive actions in the area where a team presses; ours uses whole-game team totals, because that is what we have for every game. Use it to tell a high-pressing side from a deep one, and treat small differences as noise. It isn't available while a game is live.

Spotted something that doesn't match this page? Tell us through the contact form; we fix it and log it on the corrections page.