live · 14 leagues · 26-27
Roles are a blend, not a box.
A scout that finds the role a player actually plays, and prices the output without the name.
Loading wingers…
Kick-off
Libero reads every player-season in 14 European leagues on one scale and asks a scout's two questions: what does this player actually do, and what is that usually worth.
A Gaussian mixture per position finds roles nobody named in advance. A gradient-boosted model prices the output without ever seeing last year's price. A third projects where the price goes next.
Inside a position, roles are a continuum. The libero was the player no position could hold.
Architecture
Pick a player. The diagram redraws from the exported models, stage by stage: the profile, the projection, the mixture, all 1,060 trees and the verdict.
Only derived data ships: league-adjusted per-90s and rates, model outputs, rounded values, minutes to the half hour. In-browser inference matches Python to within 3e-6 on the same inputs.
Before any model
Raw per-90s are not comparable across leagues, possession styles or sample sizes. Four steps fix that first.
Match stats summed per season and put per 90. Defensive actions are scaled by the opponent's possession, so a side that never has the ball does not inflate its defenders.
Players who move between leagues show how each stat changes with the league. A ridge regression on those moves gives every league a factor per stat, and every number is translated to Premier League level.
Success rates are pulled toward the position's average with a beta prior, so three dribbles out of three cannot outrank 80 out of 120.
A style profile feeds the role mixtures. Output, age, playing time, league and team feed the fair value. Add the current price and its momentum, and you get the trajectory.
Under review
Every number here is out of time: a season the model never trained on, or refits that never saw the players they are scored on.
Roles
Fair value
Median error on 25-26, a season none of them saw. Shorter is better.
Median by league, position, agethe baseline60%
Ridge on the same inputs41%
LightGBMused34%
LightGBM + last year's valueleft out on purpose23%
Season in progress
Trajectory
Players binned into ten groups by predicted one-year change, on 24-25. Every decile lands on the diagonal: when the model says +40%, the group gained about 40%.
Its top tenth gained +143% on average, its bottom tenth −57%. Direction is right 78% of the time, against 56% for an age curve alone.
Laws of the game
Within a position the roles touch. A player is reported as 70% one role and 30% another, and a role is defined by its centre, never by a border.
Fair value never sees last year's price. The model answers what this output usually costs, so a gap with the market is a disagreement worth reading.
Trees cannot extrapolate inflation or the rising price of youth. The model predicts relative to the season's league level and age premium, both read from that season's other valuations.
Every headline number comes from a season the model never trained on. Role stability is checked on refits of 80% of players and on a season the mixture never saw.
The mixture says what a player is. A weighted percentile score says how good the player is at it. Hand-made templates agree with the model at ARI 0.00 to 0.20, because templates rank quality and the mixture groups style.
Still open
Pick a role on the pitch, read the map, find where the market and the numbers disagree.
Open the scout