PICKUP GAMES

xG per 90: Compare Players Without Falling for Small Samples

ATHLO TEAM 12 MIN READ

xG per 90: Compare Players Without Falling for Small Samples

Football sketch title card with shot paths

xG per 90 is a per-90-minute normalization of expected goals that lets you compare attacking opportunity rates across players with different minutes. Instead of punishing a player who only got 600 minutes or rewarding one who played every game, it puts everyone on the same footing: production per full match. That’s the whole point, and it’s why nobody serious compares raw xG totals anymore.


TL;DR:

  • Calculate xG per 90 by dividing total xG by minutes played and multiplying by 90; choose full xG or npxG according to whether penalties matter.
  • Because providers assign shot probabilities differently, compare players using the same source and check its methodology before drawing conclusions from small gaps.
  • Require 900 minutes for season comparisons; below that, unusual shots can distort the rate, so compare rolling results with figures across multiple seasons.
  • Pair xG per 90 with shots per game, expected assists, position, and team context; the rate alone misses a player’s broader attacking role.
  • Treat differences below 0.05 xG per 90 cautiously; analysts generally look for a 0.10 to 0.15 gap alongside solid minutes before calling a clear lead.

Athlo
Follow the Game Beyond xG
Athlo brings live scores and AI video analysis together in one hub for youth and high school sports communities.
Explore Athlo

Table of Contents

What xG per 90 measures and how expected-goals models build that number

Every xG model starts the same way: it looks at a shot and asks, “how often does this exact kind of shot go in?” That probability, somewhere between 0 and 1, becomes the shot’s xG value. A tap-in from two yards might score 0.8. A speculative strike from 30 yards might score 0.03. Add up every shot’s probability across a season and you get a player’s cumulative xG.

The inputs that shape that probability vary by provider, but most models lean on the same core ingredients:

  • Shot location (distance and angle to goal)
  • Body part (headers score lower than clean footed strikes, generally)
  • Situation (open play, counterattack, set piece, rebound)
  • Assist type (a through ball sets up a different quality chance than a cutback)

Per-shot xG is the building block. Cumulative season xG is the sum of every shot’s value over a stretch of games. xG per 90 takes that sum and scales it to a standard 90-minute match, which is what makes it comparable across players who played wildly different amounts of soccer.

Here’s the part that trips people up: two providers can watch the same match and spit out different xG numbers for the same shot. That’s not an error, it’s a modeling choice. Some models weigh defensive pressure more heavily. Some treat headers more harshly. Some factor in goalkeeper positioning. According to the explainer on expected goals, xG assigns each shot a probability based on characteristics like location, body part, and shot situation, and that model estimates the outcome for an average player in that situation rather than measuring any individual’s actual finishing. That distinction matters more than it sounds. A player can run a high xG per 90 by getting into great spots repeatedly, independent of whether they actually bury those chances.

This is also why you’ll see per-90 league tables that differ slightly from one site to the next even when they’re covering the same competition and season. Different model, different number. Neither is “wrong,” but you need to know which one you’re reading before you start comparing players across sources.

How to calculate xG per 90 (formula, variants, and filters)

The math itself is simple. Here’s the formula:

xG per 90 = (Total xG ÷ Minutes Played) × 90

Say a forward racked up 9.5 total xG across 1,710 minutes. Divide 9.5 by 1,710, multiply by 90, and you get roughly 0.50 xG per 90. That’s the rate stat you compare against anyone else, whether they played 400 minutes or 3,000.

A few decisions shape how clean that number ends up:

  1. Decide between xG and npxG. Non-penalty xG strips out penalty kicks, which score at a much higher conversion rate than open-play chances and can skew a player’s numbers if they’re the designated taker. Use npxG when you want to isolate open-play threat; use full xG when penalties are part of the role you’re evaluating.
  2. Pick your minimum-minutes filter. A player with 90 minutes and one great chance can post an absurd per-90 rate that means nothing. Set a floor before you start comparing.
  3. Choose full-season or rolling window. A full season smooths out hot and cold stretches. A rolling window (last 10 games, for example) shows current form but swings harder on small samples.
  4. Apply competition filters. League-only numbers tell a different story than numbers blended across league, cup, and continental competitions, since quality of opposition and tactical intent shift between competitions.
  5. Handle partial minutes consistently. A player subbed on for 15 minutes who gets one shot shouldn’t be weighted the same as a player who started and played the full 90. Most providers prorate by actual minutes on the pitch, which is why the denominator in the formula matters as much as the numerator.

Get sloppy on any of these five and you’ll end up comparing numbers that look similar but were built on different assumptions.

Sample size, variance, and trust: when xG per 90 is stable or noisy

Small samples lie. A player with 300 minutes who scores from two outrageous long-range efforts can post a gaudy xG per 90 that has nothing to do with their actual underlying quality. Give that same player 2,000 minutes and the number usually regresses toward something more believable.

This is exactly why most leaderboards and serious analysts apply a minutes threshold before taking per-90 numbers seriously, often somewhere around 900 minutes for a season-long view, which is roughly ten full matches. Below that, randomness swamps signal. A partner breakdown of the 900-minute rule walks through why that threshold became the informal industry standard for trusting a per-90 figure on a live leaderboard.

Sample size scale with 900-minute threshold

Statistical simulations back this up. Analysis comparing actual goals to expected goals has used probability simulations to show when a player’s output meaningfully diverges from their underlying xG, versus when the gap is just noise you’d expect from a small sample size. The shorter the sample, the wider that margin of random variation gets.

Two practical fixes reduce the noise. Rolling averages smooth out any single hot or cold week. Multi-season aggregates give you a bigger shot sample to work with, which matters because xG per 90 is ultimately built from a count of shots and their qualities, and more shots means a more stable rate.

A practical workflow: step-by-step how to compare players using xG per 90

Here’s the routine we’d run before trusting any xG per 90 comparison enough to repeat it in an argument.

  1. Set a minutes threshold and competition filter first. Decide your floor (900 minutes is a reasonable default) and whether you’re comparing league-only numbers or blending competitions. Do this before you look at any numbers, so you’re not cherry-picking a filter that flatters your preferred player.
  2. Pick your xG variant and confirm the source’s methodology. Decide if you want npxG or full xG, then check the leaderboard’s own methodology page since providers calculate shot probabilities differently.
  3. Control for position and team context. A striker on a possession-heavy team facing deep defenses will generate different shot volume than a counterattacking winger. xG per 90 doesn’t adjust for role on its own, so you have to.
  4. Pair xG per 90 with volume and xA. A player with 0.45 xG per 90 off six shots per game is a different profile than one with the same rate off two efficient shots. Add expected assists (xA) per 90 if you care about total attacking threat, not just shooting.
  5. Treat small gaps with caution. A 0.05 difference in xG per 90 between two players rarely means much. Analysts use rough confidence heuristics, generally wanting a gap north of 0.10 to 0.15 xG per 90 with solid minutes behind it before calling one player clearly ahead, an approach grounded in the simulation work StatsBomb has published on testing whether actual output significantly beats expected output.

Pro Tip: When you’re comparing a hot streak to a track record, check the rolling-window number against the multi-season baseline before you get excited, a short hot run can look like a breakout when it’s really just a good month.

If you want a deeper primer on what specific xG values actually mean in context, our explainer on interpreting xG numbers breaks down what separates a 0.05 chance from a 0.79 chance in plain language.

Worked example: comparing three players on xG per 90

Here’s a compact, illustrative example showing how the workflow plays out with actual arithmetic. These are sample figures built for demonstration, not live stats pulled from any season.

Player Minutes Total xG xG per 90 npxG per 90
Player A 2,430 14.6 0.54 0.49
Player B 990 7.1 0.65 0.65
Player C 1800 9.0 0.45 0.41

Running the formula: Player A’s 14.6 total xG divided by 2,430 minutes, times 90, lands at 0.54 xG per 90. Player B clears the 900-minute threshold but only just, so that 0.65 rate deserves a second look before you crown them the most dangerous of the three. Player C’s lower rate comes with the largest minutes sample of the group, which gives it more weight than the raw number alone suggests.

  • Player A shows the steadiest profile: big minutes, consistent rate, and a small gap between xG and npxG suggesting few penalties inflating the number.
  • Player B posts the highest per-90 rate but barely clears the minimum sample size, so treat it as promising rather than proven until the minutes pile up.
  • Player C looks least dangerous by rate alone, but the largest sample size here means that number is the most trustworthy of the three as a season-long baseline.

Always check whether the number you’re reading reflects full xG or npxG, since the gap between those two columns tells you how much of a player’s threat depends on penalties.

Reading xG per 90 like someone who’s argued about it at halftime

I’ve had the “but he’s not actually that good, look at his xG” conversation more times than I can count, and the number is almost never the whole answer. xG per 90 tells you how often a player gets into dangerous spots. It doesn’t tell you if they’re the guy a coach trusts to take the corner, or if their role shifted mid-season, or if they’ve been playing through a knock. Pair the rate with game footage and you start seeing why the number looks the way it does, not just that it does.

That’s also where staying current matters. A rate stat from three months ago can miss a role change or a return from injury, so cross-checking against live, current match data keeps your comparison honest instead of stale.

— Abdulazeez

Track live stats and AI insights with Athlo

Running this workflow gets a lot easier when you’re not digging through five browser tabs to check minutes played, recent form, and live scores. A dedicated sports app keeps live scores, match stats, and AI-powered insights in one place, so you can check who’s actually logging minutes before you trust their per-90 numbers. If you’re also organizing or finding local pickup games, some apps help you track those matches too.

Athlo

Grab Athlo on the App Store or Google Play and keep your comparisons backed by current data instead of a stat that’s gone stale.

FAQ

How much xG is a big chance?

Most analysts treat any single shot with a moderately high xG value as a clear “big chance,” since that implies at least a moderate-to-high probability of scoring based on location, body part, and situation. The exact threshold varies slightly by provider and methodology.

What is the highest xG without scoring?

This figure changes constantly depending on season, competition, and provider, so there’s no fixed answer that stays accurate over time. Check a current per-90 leaderboard for up-to-date figures on players whose actual goals trail their cumulative xG the most.

How do I calculate xG?

Individual shot xG comes from a model that assigns a scoring probability based on factors like shot distance, angle, body part, and game situation, as explained in how expected goals models work. To get xG per 90, add up a player’s shot-level xG values over a stretch of games, divide by their total minutes played, then multiply by 90.

Who has the highest xG in football?

Leaderboard leaders shift by season, competition, and which provider’s model you’re checking, so there’s no fixed name that stays accurate. Current league-level xG tables show up-to-date rankings, but always confirm the minutes filter and model before comparing across sources.

What counts as a reliable sample size for xG per 90?

Most analysts look for at least 900 minutes, roughly ten full matches, before trusting a per-90 rate as stable rather than noise. Below that threshold, a single unusual shot or hot stretch can swing the number significantly.

Sources

Athlo app icon
Do this in AthloFree on iOS & Android — pickup games, coaching & tickets in one app.
GET THE APP
PUT IT INTO PLAY

GET IN
THE GAME.

Download Athlo and put this guide to work. Free to join.

Athlo
GET ATHLO Free · iOS & Android
DOWNLOAD