Key points from the dashboard
- The dashboard, called Normalized football data by bbta24, gives each player season in the top seven European leagues a single Score built from per minute statistics.
- Lionel Messi holds four of the top five places, for every season from 2017/18 to 2020/21, with a best Score of 5.83 in 2018/19.
- Manchester City has eight of the top 20 player seasons, including three for Kevin De Bruyne.
- The top 20 come from only three leagues: the Premier League (11), La Liga (7) and Ligue 1 (2).
- Eight scatter plots compare players on pairs of attacking, passing and defensive statistics, with standout players named.
Football player statistics in text
Title: bbta24 Normalized football data. Filters across the top for Player, Team, League, Season, Role, Age and Nation are all set to (All), and the minutes requirement is set to Half. The main table ranks the top 20 player seasons by Score. League codes are LL for La Liga, PL for the Premier League and L1 for Ligue 1. Roles shown as FW,… are cut off on the dashboard.
| Rank | Player | Team | League | Season | Games | Minutes | Role | Age | Nation | Score |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Lionel Messi | Barcelona | LL | 18/19 | 34 | 2713 | FW | 31 | ARG | 5.83 |
| 2 | Lionel Messi | Barcelona | LL | 17/18 | 36 | 3000 | FW | 30 | ARG | 5.71 |
| 3 | Neymar | Paris S-G | L1 | 17/18 | 20 | 1786 | FW | 25 | BRA | 5.28 |
| 4 | Lionel Messi | Barcelona | LL | 19/20 | 33 | 2880 | FW | 32 | ARG | 5.27 |
| 5 | Lionel Messi | Barcelona | LL | 20/21 | 35 | 3023 | FW,… | 33 | ARG | 5.22 |
| 6 | Kevin De Bruyne | Manchester City | PL | 17/18 | 37 | 3073 | MF | 26 | BEL | 4.94 |
| 7 | David Silva | Manchester City | PL | 17/18 | 29 | 2430 | MF | 31 | ESP | 4.93 |
| 8 | Jude Bellingham | Real Madrid | LL | 23/24 | 28 | 2315 | MF | 20 | ENG | 4.93 |
| 9 | Riyad Mahrez | Manchester City | PL | 19/20 | 33 | 1944 | FW,… | 28 | ALG | 4.92 |
| 10 | Kevin De Bruyne | Manchester City | PL | 19/20 | 35 | 2791 | MF | 28 | BEL | 4.84 |
| 11 | Eden Hazard | Chelsea | PL | 18/19 | 37 | 2923 | FW | 27 | BEL | 4.77 |
| 12 | Kevin De Bruyne | Manchester City | PL | 21/22 | 30 | 2201 | MF | 30 | BEL | 4.69 |
| 13 | Isco | Real Madrid | LL | 17/18 | 30 | 1774 | MF | 25 | ESP | 4.58 |
| 14 | Eden Hazard | Chelsea | PL | 17/18 | 34 | 2422 | FW,… | 26 | BEL | 4.57 |
| 15 | Rodri | Manchester City | PL | 23/24 | 34 | 2931 | MF | 27 | ESP | 4.54 |
| 16 | Kylian Mbappé | Paris S-G | L1 | 18/19 | 29 | 2343 | FW | 19 | FRA | 4.52 |
| 17 | Mohamed Salah | Liverpool | PL | 17/18 | 36 | 2907 | FW | 25 | EGY | 4.52 |
| 18 | Raheem Sterling | Manchester City | PL | 18/19 | 34 | 2771 | FW | 23 | ENG | 4.50 |
| 19 | Cristiano Ronaldo | Real Madrid | LL | 17/18 | 27 | 2285 | FW | 32 | POR | 4.49 |
| 20 | Sergio Agüero | Manchester City | PL | 17/18 | 25 | 1963 | FW | 29 | ARG | 4.47 |
Beside the table are strip charts for Goals (30), xGoals (20), Shots (15), xAssists (15), Assists (10) and Key passes (10), and a scroll bar shows that more rows and more metrics continue off screen. Below are eight scatter plots, each with thousands of player seasons as dots:
| Scatter plot | Extra encoding | Players named on the plot |
|---|---|---|
| Goals (30) against xGoals (20) | dot size Shots (15), colour xG performance | Robert Lewandowski, Lionel Messi (twice), Jude Bellingham, Edin Džeko, Karim Benzema, David McGoldrick |
| xAssists (15) against Assists (10) | colour Key passes | Riyad Mahrez, Dušan Tadić, Hakim Ziyech, David Silva, Rafa Silva, Harvey Barnes, Pablo Fornals, Danny Ings |
| Progressive carries (15) against Dribbling (10) | colour Fouls won (5), dot size Carries (10) | Adama Traoré, Eden Hazard (twice), Douglas Costa, Mateo Kovačić, Thiago Alcântara |
| Progressive passes (15) against General passing (15) | colour Possession | Cesc Fàbregas, David Silva, Mesut Özil, Lionel Messi, Rodri (three times), Fidel, Conor Coady |
| Interceptions (15) against Passes blocked (10) | colour Recoveries | Medhi Benatia, Miralem Pjanić, Luís Neto, Casemiro, Jorginho, N’Golo Kanté, Raphinha |
| Aerial duels (15) against Ground duels (10) | no colour scale | Milan Đurić, Joselu, Christian Benteke, Raúl García, Virgil van Dijk, Willy Boly, Lisandro Martínez, João Palhinha, Lucas Hernández |
| Tackles (15) against Ground duels (10) | colour Fouls (5) | Antonio Rüdiger, Ronald Araújo, Ferland Mendy, Oleksandr Zinchenko, Lisandro Martínez, João Cancelo, João Palhinha |
| Clearances (15) against Shots blocked (15) | colour Errors (5) | Phil Jones, Virgil van Dijk, Dejan Lovren, Luiz Felipe, Casemiro, Manuel Locatelli |
Footer text on the dashboard, in summary: Normalized Football Data is the creator’s platform for player rankings from the top seven European leagues over the past seven seasons (six for ED and LP), meant to compare players fairly across leagues, teams and seasons. Data is gathered from fbref.com for players with at least 33% of available minutes each season. Statistics are adjusted per minute played, a custom league Elo rating accounts for league strength, dribbles and tackles are adjusted for success rate, and defensive metrics are normalised by goals conceded and expected goals against (xGA) while the player is on the pitch. Each metric is weighted and feature scaled into one Score. The data covers league play only, with cup matches, more leagues and goalkeeper data planned.
How the Score is normalised
The creator gave a longer explanation in a Reddit post using the same tool [1]. The numbers in brackets after each statistic are the maximum points it can add to the Score. Non-penalty goals are weighted most heavily, at up to 30 points, and expected goals at up to 20. Assists, key passes, progressive carries and defensive actions are worth 10 or 15 points, and minor discipline metrics such as fouls committed, where fewer fouls score higher, are worth up to 5 [1]. The creator says these weights were chosen by them, based on how they think each metric should be valued [1].
The league adjustment works like an exchange rate. In the creator’s example, if a Premier League player scores 1.0 goals per 90 minutes, an Eredivisie player has to score 1.3 goals per 90 to get the same score [1]. Users can choose a minutes requirement of one third, one half or two thirds of available minutes [1]; this view uses one half. Another Reddit user who built comparisons with the dashboard described it as a tool that normalises data per minute based on league coefficient [2].
The heavy weighting on goals and expected goals favours attacking players, which fits a top 20 made up entirely of forwards (FW) and midfielders (MF), with no defenders.
Notes on this infographic
- The Score is the creator’s own model. The weights and league ratings are their choices, so the ranking is one way of comparing players, not an official statistic.
- Only league matches are counted, so cup and European performances do not affect the Score.
- This is a screenshot of an interactive dashboard with the minutes filter on Half. Other filter settings would give a different list.
- The Tableau dashboard is no longer available at its public address; the links below go to the creator’s Reddit explanation of the method.
Sources
- Reddit, r/reddevils, [OC] Normalized comparison of selected defensive midfielders in the top seven European leagues, posted with the creator’s Tableau dashboard and full method explanation (account since deleted).
- u/bughidudi, r/ACMilan, Normalized Stats of our midfield Vs Fofana and Konè for 2023/24, made with the same dashboard.
Last reviewed 29 October 2026


