THE METHODOLOGY
Read the game.
Understand the numbers.
A card is a starting point for analysis. Here is what the numbers can tell you, and where to be careful.
Start with the dataset
SquadLens uses the season data loaded into the app. Available players, competitions and statistics depend on that dataset. Check its season and freshness before treating a result as current.
The images on this website are fixed sample exports. They do not update with live matches. Their exact source and comparison rules are below.
Compare similar positions
Percentiles rank a player within a comparison group. A 94th-percentile result places that player around the top 6% of the relevant sample for that metric. It does not mean they are better than 94% of every player in football.
The player cards rank raw values against rows with the same exact position label in the supplied dataset. FW and FW,MF are separate groups. Half of tied rows count below the player. Missing values are excluded for each metric, so sample size can vary. The renderer adds no minutes filter; any earlier app filters still apply.
Labels are rounded to whole percentiles, with results below 100 capped at 99. The sample’s downloadable data includes unrounded values. The breakdown shows the six highest-ranked metrics, which may describe related aspects of play.
Treat the rating as a summary
The 0–100 model rating weights performance at 65%, age potential at 15%, minutes reliability at 10% and durability at 10%. Missing injury history receives a neutral durability score of 50. The overall number therefore measures more than season performance; it is not a scouting verdict or a prediction of future success.
DF means defender. A DF label, including mixed DF/MF labels, uses a general profile: tackles and interceptions, tackle success, aerial success, progressive passing, carrying and pass completion. Centre-back and full-back profiles require explicit positions such as CB or RB. These model weights are design choices, not a validated measure of overall ability.
Put minutes and context back in
Small samples can make a player look unusually strong or weak. Team style, league, role and playing time also shape the numbers. Use the card alongside those details, rather than as a complete assessment.
Read the wording with the stats
Card text is generated from the available player statistics. Missing data limits what can be said, and players with similar profiles may receive similar descriptions. Check the underlying metrics when making a claim.
Separate output from playing time
The analysis view divides season event totals by recorded minutes and multiplies by 90. Percentages and existing per-90 fields retain their original units. Zero or missing minutes cannot produce a derived rate.
Benchmarks use the exact recorded position label and at least 900 minutes. Each metric shows its own available row count; fewer than five valid rows suppresses the median and percentile. The selected player is included when eligible. This differs from the exported card’s unfiltered total-based ranks.
The median is the middle available value. Percentiles use midpoint ranks for ties. Per-90 rates control for time on the pitch, not league strength, team possession or opponents. A high defensive event count can reflect workload rather than better defending.
The goals-minus-xG observation describes this season’s recorded outcome. It does not demonstrate repeatable finishing skill or predict future goals.
The dataset behind these examples
The samples use the bundled 2024/25 player file, players_data-2024_2025.csv, through master_normalised_stats_2026.csv. The manifest records loading that player snapshot on 9 May 2026. That is not the date of the last match played, and it does not make the statistics current.
Mbappé’s percentile group contains 371 rows with the exact position label FW across the five leagues in the dataset. Each of his six displayed metrics has 371 available values. There is no minimum minutes filter. These are season totals, so playing time influences the ranks. Rows are counted rather than claiming a deduplicated number of individual players.
The Mbappé–Haaland comparison uses raw season totals. It shows 2,907 and 2,736 minutes respectively, and does not adjust for playing time or league strength. Higher totals are not an overall player ranking.
The XI is a manually selected Premier League example in a 4-3-3. Its model ratings also use difficulty adjustments based on 2025/26 match Elo. It is not a live matchweek selection or a claim to be the highest-rated team. Where injury history is absent, the rating holds that component neutral.
The manifest does not establish the original player-data supplier, collection date or redistribution licence. Those details remain unverified; we do not imply endorsement by a data supplier.
Download the exact sample values, ranking basis and input file hashes (JSON). Hashes identify the files used to reproduce these exports; they do not certify the quality of the source data.
Player profiles and selected XIs
The player profile uses 83 configured features. Season counts become rates per 90; percentages, ratios and existing rates keep their units. Each varying feature is scaled between the lowest and highest values in the filtered cohort. Missing values stay unavailable.
The similarity index is 100 × (1 − RMS distance) over shared features. A pair needs at least ten shared features and 80% of the active dimensions. It describes statistical proximity, not a probability or quality score. Related metrics overlap and extremes affect the scale. Compare indices only within the same cohort.
The website example compares Mbappé and Haaland with exact FW labels and at least 900 minutes. The largest differences explain shares of the squared distance. The app lets you change players, minutes and the position filter.
Team comparison uses two selected XIs: one goalkeeper, four defenders, three midfielders and three forwards. Defaults prefer a club’s primary recorded positions, then minutes, assigning forwards before midfielders. They are illustrative selections, not official lineups. DF alone does not establish central or wide duties.
Outfield values are equal-weight means of individual season rates, with at least eight of ten players required per metric. Percentages are means of player percentages, not event-weighted team percentages. Missing coverage is displayed and incomplete metrics do not generate automatic comparison claims. Goalkeeper rates are shown separately. These profiles do not establish how the XI performed together or predict a result.
Explore the comparisons · Download the exact inputs and results
Estimating a defender’s role
When the feed only says DF, we compare six signals with other defenders: crosses, progressive carries, attacking-third touch share, clearances, aerial contests and defensive-third touch share. Counts are converted to per 90. Explicit centre-back or full-back position labels take precedence.
The wide profile averages the first three percentile ranks and the complements of the other three; the central profile reverses that calculation. The leading score needs to reach 65/100, lead by 20 points and have two supporting signals at 65 or above. Otherwise we show a mixed profile.
Role inference needs at least 900 minutes, 30 defender rows and 20 usable rows per signal. All six signals must be present. These are transparent heuristic thresholds, not a trained classifier or probabilities. Team tactics affect the figures, and the data cannot establish left or right side.
The estimate adds role-relevant analysis metrics while preserving the feed’s position and the existing model rating. Every written observation has supporting rates, medians or sample counts available in the analysis data.