Atlas of the player pool

How deep is a national player pool — and why

3.13 players in Europe's 9 strongest leagues per million inhabitants, 2025/26 rosters

Per head, Germany ranks 8th of 8 peer countries for players in Europe’s strongest leagues. The reasons below are measured, not guessed: 1.1 regular under-21 starters per club at home against 1.3 in France; a first move abroad at 25; and a layer at the top that stepped down in 2000/01.

Three minutes: this number, the five rungs below it, and the one-page brief. Everything else is the evidence.

In context

How one country’s professional pool compares with its peers, where the road abroad leaks, and what the national team gets from it — from public data, every number recomputed on each run. The largest cohort gap is in defenders aged 23-25: 6 German players in the top-9 leagues against a peer median of 23. A recent German export first reached a top-9 roster at a median age of 22; one from Spain at 21.5. Built from FBref, Wikipedia and Wikidata. Germany is the worked example; the pipeline takes a nationality code and a peer set. Football people recognise these numbers player by player; there is no place where they are aggregated.

* 262 GER players with ≥ 450 minutes in the UEFA top-9 leagues, 2025/26, per 83.6 M inhabitants; peers counted the same way. Methodology.

What to take from it

1

Germany's Big-5 count is mostly its own league: 161 players with 450+ Big-5 minutes now, 253 at the 95/96 peak.

The steps the model dates — fall in 00/01 (×0.75), then rise in 10/11 (×1.03) — say how international the home league became, not how many of its players play abroad; the mechanisms below are the sharper read.

2

One mechanism carries the gap to every peer it trails: the age of the first move.

Against France the age of the first move carries most of a 2.7-per-million gap; against Spain the age of the first move carries 33 % of a 6.4-per-million gap.

3

The trend runs the right way: Germany's own under-21s went from 3 % to 6 % of home-league minutes in 6 seasons.

Over the same seasons France 7 % → 9 % and -0.4 per million in the Big-5; Spain 4 % → 5 % and -0.4 per million in the Big-5; Germany +0.1 per million. Across the 16 covered leagues the change in youth minutes and the change in Big-5 presence lean the same way — a weak signal with the right sign, not a law.

4

Where the mistake shows: Germany is out of line on the timing of the first move.

Out of line: the first move abroad at a median 25 (Belgium 22); the exporters move at 22–23.

Not the problem: minutes for its own under-21s at home: 6.1 % of league minutes and 1.1 regular under-21 starters per club, 4 of 8 among the peers (Netherlands 13.6 %; Netherlands 1.9 starters per club); the home league itself: multiplier ×0.79, 4 of 8 among the peers; how its exports fare: a median 42 % of their club's minutes, 1 of 8; how many leave at all: 316 first moves in the covered seasons (Germany 316).

What the peers show is reachable: the first move at 22–23, not 25 — the route the peers that grew use.

The four numbers to watch every summer: under-21 share, regular under-21 starters per club, age of the first move, first Big-5 seasons. None of this is a proven cause; it is where the nation is out of line with the peers that grew, on the mechanisms the gap decomposition weighs most.

5

Can a reform cause it? The data can follow 2 documented cases, and only as a sequence.

Germany after its DFB/DFL academy licensing (01/02): its own under-21s' share of Bundesliga minutes went from 5 % to 11 % by 09/10 but is 6 % now — the turn did not hold. England after its Elite Player Performance Plan (12/13): its own under-21s' share of Premier League minutes went from 3 % to 6 % by 19/20 but is 3 % now — the turn did not hold. A sequence in one country against none in another is the strongest thing this data can say; it is not a counterfactual. Read as a heuristic: minutes for the young at home are the lever a federation holds, the effect is counted in seasons, and a weaker league yields less from it.

Each statement is written from the numbers on this page and on the six-nation comparison; the evidence follows, one question at a time.

Everything below is the evidence for these numbers, one question at a time.

Terms used on this page are explained in the glossary.

Why the train left

Five numbers, in the order they build on each other, show where the pool of players available to the national team gets thin. Each one is shown for German football and for the two countries used as a comparison throughout this report; each links to the part of the report that shows the full evidence.

Five-stage funnel: German football next to France and Spain on the share of playing time young players get at home, the league's average age, the age of the first move abroad, the share of sideways moves, and players per million people in Europe's strongest leagues.
How to read it: one rung per stage of the argument, each on its own scale, so the dots show the distance between countries, not the size of the number. The filled acid dot is Germany; the open dots are the two comparison countries. Under each rung is which direction means a more open pathway. Hover a dot for the exact value.
  1. Young players do not get much of the playing time in the country's own top league.

    Share of league minutes that went to players aged 21 or under

    GER 6.1 % FRA 8.8 % ESP 4.8 %

    Clubs that gave those young players more than a tenth of their own playing time

    GER 14 of 18 clubs FRA 14 of 18 clubs ESP 7 of 20 clubs

    Under-21 nationals who were regular starters, per club in the league

    GER 1.06 per club (19 players) FRA 1.28 per club (23 players) ESP 0.70 per club (14 players)

    The regular-starter line is drawn at ten starts; at five it is 1.3 per club, at fifteen 0.8 (ten: 1.1).

    They are not being used as late substitutes: 6.0 % of the league’s starts went to them against 6.1 % of its minutes, and when one of them started he was on the pitch for 78 minutes against the league’s own 80. The difference between these countries is how many young players are picked at all, not how they are used once picked.

  2. The league those minutes are missing from is, on average, an old one.

    Average age of a minute played in the league

    GER 26.1 FRA 25.6 ESP 26.9

    Share of league minutes that went to players aged 30 or over

    GER 20.9 % FRA 20.2 % ESP 28.9 %
  3. So the first move to a foreign league, when it happens, comes late.

    Age the first time a player has real playing time in a foreign league, over the players abroad today

    GER 25 years (316 players) FRA 23 years (205 players) ESP 25 years (132 players)
  4. And the move, when it happens, is often not a step up.

    Share of moves abroad to a league no stronger than the player's own

    GER 92 % FRA ESP
  5. The layer of players in Europe's strongest leagues stays thin, and it fell sharply once.

    Players in Europe's strongest leagues, for every million people

    GER 3.13 FRA 5.79 ESP 9.54

    Around the 2000/01 season, the model finds a possible shift in the count of German players in Europe's strongest leagues, with 69 percent probability that it is a genuine change rather than an ordinary season-to-season dip. Break & forecast.

If you take one thing from this: the single measured link that carries the most of the gap is different for each comparison — how old players are when they move abroad for France, how strong the domestic league is for Spain. That is one decomposition over 8 countries — a description of the gap, not a weight to plan by.

What this does not show
  • Money: transfer fees, wages and academy budgets play no part in any number above.
  • How the academy and coaching set-up actually work day to day, which no public data source used here can see.
  • Agents, and how a move abroad actually gets arranged, which happens off any table this pipeline can read.
  • The direction of the arrow: a low share of playing time for young players at home could help cause a thin generation, or just as easily be a symptom of one — the five numbers above are associations measured the same way for every country.

How deep is the pool?

The next three questions count who is in the pool and where the count runs thin.

Is the German pool thin?

Germany ranks 8th of 8 countries at 3.13 per million; Portugal leads at 25.19.

POR Portugal
25.19
BEL Belgium
21.46
NED Netherlands
20.69
ESP Spain
9.54
FRA France
5.79
ENG England
3.60
ITA Italy
3.41
GER Germany
3.13
How we know

As an analytics question In numbers: distinct players with ≥ 450 minutes on 2025/26 rosters of the 9 strongest leagues, per million inhabitants, against 8 peers.

What we did We counted every player with the home nation's nationality who had real playing time in one of Europe's strongest leagues that season, then divided the count by the country's population.

Sources Distinct players with ≥ 450 minutes on 2025/26 rosters of the 9 strongest leagues ÷ population (Eurostat 2024); every country counted the same way.

A federation tracking this would watch the per-million rank move over seasons, not any one year's number.

Where exactly is it thin?

The largest cohort gap: Defenders aged 23-25, 6 German players vs a peer median of 23.

GroupCohortGERPeer median
Defenders 23-25 6 23
Midfielders U22 15 22
Midfielders 26-29 19 25
Defenders 26-29 22 24
Forwards 23-25 5 7
How we know

As an analytics question In numbers: German player count against the peer-country median, by age cohort and position group, ≥ 450 minutes, 2025/26 season.

What we did We split players into position groups and age bands, counted how many the home nation had in each one, and compared that count with the middle value among the other countries.

Sources Age at season start; cohorts U22 / 23–25 / 26–29 / 30+; ≥ 450 minutes.

A federation tracking this would watch which cohort's gap narrows or widens season to season, not just today's snapshot.

Where does the path leak?

From here the questions follow a player through youth minutes at home, the move abroad, and how that move turns out.

Do young players get minutes at home?

Under-21s get 6.1 % of the home league’s minutes. In Netherlands, the best of the peers, 13.6 %.

How sure is the link to the top? Across 8 countries, ten points more under-21 share go with +13.94 more top-9 players per million, but the interval (−4.93 to 33.09) includes zero; within countries, from one season to the next, the estimate is +1.56 (−1.29 to 4.33) — nothing. The share is a fact; its weight in the gap is not settled.

NED Netherlands
13.6 %
FRA France
8.8 %
BEL Belgium
8.7 %
GER Germany
6.1 %
POR Portugal
4.9 %
ESP Spain
4.8 %
ENG England
3.0 %
ITA Italy
2.7 %
Across countries
Scatter of U21 share of domestic-league minutes against top-9 players per million, 8 countries, two seasons each connected by a line, Germany highlighted, with the fitted line and its 90 % band.
How we know

Across the 8 countries (country averages over both seasons), 10 points more U21 share go with +13.94 more top-9 players per million (−4.93–33.09).

As an analytics question In numbers: share of domestic-league minutes played by players aged ≤ 21 at season start, 2025/26, by country's top flight.

What we did We counted every minute played in the league and looked at how many of them went to players aged 21 or younger.

Sources Share of all league minutes played by players aged ≤ 21 at season start, 2025/26, per domestic top flight.

A federation tracking this would watch the U21 share season by season, not the export count.

Where do German players go when they leave?

288 of 410 play abroad; 17 % in the 9 strongest leagues, 92 % moved sideways (to a league no stronger than the German one).

197 stepping stone median multiplier 0.473
68 %
49 top-9 median multiplier 0.630
17 %
42 other median multiplier 0.293
15 %
How we know

As an analytics question In numbers: destination-league tier of every German-eligible player's 2025/26 row, split into top-9, sideways and other abroad moves.

What we did We looked at where every eligible player was actually playing that season and grouped each one by how strong that league is compared with the player's own home league.

Sources Destination league of every German-eligible player's 2025/26 row; sideways = destination multiplier ≤ German league multiplier (league strength: two estimates, § Methodology). Bundesliga is itself one of Europe's top-9 leagues; here 'abroad' means the other 8.

A federation tracking this would watch the sideways-move share over time, not the raw count of players abroad.

Does leaving later cost anything?

Arrive in the top-9 at 21 and you produce +0.017 more league-adjusted G+A per 90 over your first two seasons than arriving at 24. German exports arrive at a median age of 21.

Line chart: the fitted age-at-export curve with its 90 % band, German exports as points against every other peer export, and a rug of every export's age along the axis.
How to read it: the horizontal axis is a player’s age in his first top-9 season; the vertical axis is his league-adjusted goals plus assists per 90 over the first two seasons there. The line is the model’s expected value at each age, the band its 90 % interval; a flat line means arriving later costs nothing measurable. Acid dots are German exports — hover for the name.
How we know

At 21: 0.15 (0.13–0.17); at 24: 0.13 (0.11–0.15); the difference +0.017 (0.004–0.028).

As an analytics question In numbers: mean league-adjusted goals + assists per 90 over the first two top-9 seasons, as a function of age at the first one, given origin-league strength and position, 691 peer-nationality exports.

What we did We looked at the age a player first arrived in one of the strongest leagues and checked whether players who arrived earlier ended up producing more, once we accounted for the strength of the league they came from.

Sources Age curve (natural cubic spline) on league-adjusted production, given origin-league strength (§ Methodology), position and a country effect, 691 peer-nationality exports (Gelman et al., 2013; Hoffman and Gelman, 2014); better players tend to leave earlier, so the curve mixes selection with development and this report does not separate them.

A federation tracking this would watch how the age-at-export curve shifts across cohorts, not any single player's outcome.

How do they fare there?

German exports keep 42 % of their club's minutes (1st of 8).

Dot plot: each country's median share of club minutes for players abroad, with a thin line spanning the other countries' values; Germany highlighted.
How to read it: one row per country, sorted; the dot is the median share of his club’s minutes that a country’s exported player keeps, the thin line the range across its exports. German exports are the acid row. Further right means exports who play, not sit.
Country-by-country figures
GER Germany n = 262
42 %
ITA Italy n = 201
37 %
ESP Spain n = 464
36 %
FRA France n = 395
36 %
BEL Belgium n = 253
35 %
NED Netherlands n = 372
35 %
ENG England n = 208
33 %
POR Portugal n = 268
29 %
How we know

A Bundesliga season converts to 0.78 of a Premier League one by the transfer-graph model (0.74–0.81), against 0.79 by UEFA coefficient.

As an analytics question In numbers: median share of a club's 2025/26 minutes kept by players abroad, by country of origin.

What we did We worked out what share of each club's playing time the player actually got, and where that club stood in its own league's scoring table that season.

Sources Median share of club minutes for players abroad, per country of origin (league strength: two estimates, § Methodology). Bundesliga is itself one of Europe's top-9 leagues; here 'abroad' means the other 8.

A federation tracking this would watch whether an export's minutes share holds after the first season, not just the median.

What reaches the national team?

The last stretch looks at what actually gets picked, and when the door to the biggest leagues opened and shut.

What is the national-team squad built from?

100 % of the 2026 FIFA World Cup squad plays in the 9 strongest leagues; France 96 %.

  • Top-9 %
  • Stepping %
  • Domestic %
  • Other %
  • Oliver Baumann
  • Alexander Nübel
  • Malick Thiaw
  • Waldemar Anton
  • Angelo Stiller
  • Nathaniel Brown
  • David Raum
  • Nico Schlotterbeck
  • Florian Wirtz
  • Jamie Leweling
  • Joshua Kimmich
  • Leroy Sané
  • Deniz Undav
  • Felix Nmecha
  • Nadiem Amiri
  • Maximilian Beier
  • Jonathan Tah
  • Leon Goretzka
  • Nick Woltemade
  • Manuel Neuer
  • Pascal Groß
  • Antonio Rüdiger
  • Aleksandar Pavlović
  • Assan Ouédraogo
  • Jamal Musiala
  • Kai Havertz
How the peers are sourced
  • Top-9 %
  • Stepping %
  • Domestic %
  • Other %
GER Germany Squad 26
100 %
FRA France Squad 26
96 %
ESP Spain Squad 26
96 %
ENG England Squad 26
96 %
NED Netherlands Squad 26
96 %
BEL Belgium Squad 26
96 %
POR Portugal Squad 26
88 %
How we know

As an analytics question In numbers: league tier of every 2026 FIFA World Cup squad member's most-minutes 2025/26 row, matched by name and birth year, per country.

What we did We matched every named squad player to his club season and recorded which level of league he was actually playing in.

Sources Wikipedia squad lists matched to 2025/26 league rows; tier = league of the most-minutes row.

A federation tracking this would watch the tier mix of future squads over cycles, not one tournament's snapshot.

When did the train leave?

German players with ≥ 450 Big-5 minutes: 253 at the 1995/96 peak, 128 at the 2009/10 low, 161 in 2025/26. The break is dated to 2000/01.

Line chart: German players with at least 450 minutes in the Big-5 leagues, 1995/96 to 2025/26, against eight peer countries; a lower panel shows per-million rates for Germany, France and Spain.
How to read it: each line is one country’s count of players with at least 450 minutes in the five biggest leagues, season by season since 1995/96. German players are the acid line; the dashed rules are the seasons the model dates the rise and the fall to, with their probabilities; the point past the last season is the forecast for next season with its 90 % interval. Toggle countries and switch to per million to compare fairly across sizes.
How we know

Break posterior 69 %; a level change of ×0.76 (0.65–0.98).

As an analytics question In numbers: German players with ≥ 450 minutes in the Big-5 leagues each season since 2020/21, with the rise and the fall each dated by a change-point model.

What we did We counted, season by season, how many home-nation players had real playing time in Europe's five biggest leagues, then looked for the two seasons where that count changed level for good — once up, once down — and stayed there.

Sources FBref Big-5 player tables 1995/96 → 2025/26; peers on the same rule; the names are the most-minutes German players of each peak season, goalkeepers included — a lineup of presence, not a quality ranking: 1995/96: Eike Immel, Jörg Schmadtke, Jörg Albertz; 1996/97: Bodo Illgner, Andreas Köpke, Oliver Reck; 1997/98: Jens Lehmann, Oliver Kahn, Uwe Kamps. The break dates come from a Bayesian local-level model with two ordered change points, one for the rise and one for the fall (Adams and MacKay, 2007); detail in § Methodology.

A federation tracking this would watch whether the post-break level holds for another season, not treat one break as final.

How do France and Spain do it?

On the same six numbers France gives U21 players 9 % of domestic minutes against 6 % and sends 96 % of its squad to the 9 strongest leagues against 100 %.

Slope chart: France, Spain and Germany on six pathway metrics, each rescaled 0 (worst of the three) to 1 (best of the three), one line per country.
How to read it: six measures, each rescaled so 0 is the worst of the three countries and 1 the best, one line per country. A line that stays high is a pathway that is open at every stage; where the acid line dips is where Germany loses ground.
The six numbers, unscaled
MetricGERFRAESP
Players per million 3.13 5.79 9.54
U21 share of domestic minutes 6.1 % 8.8 % 4.8 %
Export age (recent) 22 21 21.5
Sideways moves 92 %
Exports' club-minutes share 42 % 36 % 36 %
National-team squad in the top-9 leagues 100 % 96 % 96 %
Big-5 players now 161 205 284
How we know

As an analytics question In numbers: France and Spain against Germany on the same six 9-strongest-league pathway definitions, same seasons.

What we did We compared the home nation with the two comparison countries on six numbers, each one defined and measured in exactly the same way for all three.

Sources Same definitions, same seasons; a comparison, not a causal claim. Each metric is rescaled 0-1 across the three countries for the chart above, direction chosen so 1.0 is always the more open pathway (more players per million, more U21 minutes, an earlier export age, fewer sideways moves, a bigger minutes share abroad, more of the squad in the top-9); the table below keeps the raw numbers.

A federation tracking this would watch which of the six numbers moves first, not the overall picture alone.

Do goalkeepers follow a different path?

20 German goalkeepers play ≥ 450 minutes in the top-9 leagues — rank 6 of 8 per million — and they get there later than outfield exports.

Strip plot of age at first top-9-league appearance, German goalkeepers against outfield exports, one dot per player, medians marked.
How to read it: one dot per player at the age of his first season in a top-9 league; goalkeepers in the upper strip, outfield exports in the lower, medians marked. Further left is an earlier first appearance.
Club tier: German top-9 goalkeepers, 2025/26
PlayerClub LeagueMinutes Club goals percentile
Bernd LenoFulhamENG-Premier League3420 25 %
Noah AtuboluFreiburgGER-Bundesliga3060 61 %
Moritz NicolasGladbachGER-Bundesliga3060 19 %
Oliver BaumannHoffenheimGER-Bundesliga3060 69 %
Marvin SchwäbeKölnGER-Bundesliga3060 56 %
Finn DahmenAugsburgGER-Bundesliga3060 50 %
Alexander NübelStuttgartGER-Bundesliga3060 94 %
Timon WellenreutherFeyenoordNED-Eredivisie2970 89 %
Mio BackhausWerder BremenGER-Bundesliga2880 11 %
Diant RamajHeidenheimGER-Bundesliga2790 28 %
Lars UnnerstallTwenteNED-Eredivisie2790 78 %
Kevin TrappParis FCFRA-Ligue 11980 47 %
Michael ZettererFrankfurtGER-Bundesliga1976 69 %
Daniel BatzMainz 05GER-Bundesliga1890 39 %
Manuel NeuerBayern MunichGER-Bundesliga1859 100 %
Jonas UrbigBayern MunichGER-Bundesliga1111 100 %
Janis BlaswichLeverkusenGER-Bundesliga931 83 %
Robin ZentnerMainz 05GER-Bundesliga876 39 %
Nico MantlAroucaPOR-Primeira Liga720 67 %
Erdem CanpolatRizesporTUR-Süper Lig630 72 %
Goalkeeper production: German keepers, 2025/26
PlayerClub LeagueMinutes GA/90Saves/90 Save %Clean-sheet share GA/90, quality-adj.
Bernd LenoFulhamENG-Premier League3420 1.342.58 66.0 %24 % 1.35
Finn DahmenAugsburgGER-Bundesliga3060 1.793.09 65.0 %15 % 2.22
Jonas UrbigBayern MunichGER-Bundesliga1111 1.222.59 65.5 %43 % 1.75
Manuel NeuerBayern MunichGER-Bundesliga1859 0.971.50 65.1 %32 % 1.48
Michael ZettererFrankfurtGER-Bundesliga1976 1.502.82 65.3 %27 % 1.94
Noah AtuboluFreiburgGER-Bundesliga3060 1.682.94 65.1 %18 % 2.10
Moritz NicolasGladbachGER-Bundesliga3060 1.564.00 66.5 %38 % 1.99
Diant RamajHeidenheimGER-Bundesliga2790 2.163.23 64.5 %3 % 2.56
Oliver BaumannHoffenheimGER-Bundesliga3060 1.532.88 65.3 %21 % 1.96
Marvin SchwäbeKölnGER-Bundesliga3060 1.852.71 64.5 %9 % 2.27
Janis BlaswichLeverkusenGER-Bundesliga931 0.873.96 66.2 %27 % 1.55
Daniel BatzMainz 05GER-Bundesliga1890 1.293.33 66.0 %19 % 1.75
Robin ZentnerMainz 05GER-Bundesliga876 1.443.18 65.5 %0 % 1.92
Alexander NübelStuttgartGER-Bundesliga3060 1.443.15 65.8 %32 % 1.87
Mio BackhausWerder BremenGER-Bundesliga2880 1.753.12 65.2 %16 % 2.17
Kevin TrappParis FCFRA-Ligue 11980 1.322.55 65.4 %32 % 2.01
Timon WellenreutherFeyenoordNED-Eredivisie2970 1.332.70 67.8 %27 % 2.72
Lars UnnerstallTwenteNED-Eredivisie2790 1.132.48 67.9 %19 % 2.42
Nico MantlAroucaPOR-Primeira Liga720 2.253.25 66.0 %25 % 2.72
Erdem CanpolatRizesporTUR-Süper Lig630 1.433.14 68.6 %29 % 2.86
Jonas Thomas KerskenArminiaGER-2. Bundesliga2949 1.502.69 66.9 %18 % 3.11
Ron-Thorben HoffmannBTSVGER-2. Bundesliga2880 1.592.59 66.6 %19 % 3.27
Timo HornBochumGER-2. Bundesliga3060 1.383.21 67.7 %24 % 2.93
Marcel SchuhenDarmstadt 98GER-2. Bundesliga3060 1.323.50 68.1 %29 % 2.83
Lennart GrillDresdenGER-2. Bundesliga540 1.672.17 67.0 %0 % 3.17
Tim SchreiberDresdenGER-2. Bundesliga2430 1.592.56 66.7 %18 % 3.25
Florian KastenmeierDüsseldorfGER-2. Bundesliga2880 1.623.34 67.2 %12 % 3.32
Silas PrüfrockGreuther FürthGER-2. Bundesliga1350 1.202.80 67.5 %27 % 2.70
Timo SchlieckGreuther FürthGER-2. Bundesliga810 2.442.78 66.6 %11 % 4.00
Nahuel NollHannover 96GER-2. Bundesliga3060 1.292.82 67.4 %29 % 2.78
Tjark ErnstHertha BSCGER-2. Bundesliga2970 1.332.97 67.5 %33 % 2.85
Jonas KrumreyHolstein KielGER-2. Bundesliga1980 1.413.09 67.4 %23 % 2.97
Timon WeinerHolstein KielGER-2. Bundesliga1080 1.422.67 67.2 %33 % 2.97
Julian KrahlKaiserslauternGER-2. Bundesliga2880 1.383.59 68.1 %28 % 2.92
Dominik ReimannMagdeburgGER-2. Bundesliga3060 1.713.15 66.9 %21 % 3.46
Jan ReichertNürnbergGER-2. Bundesliga2970 1.363.03 67.5 %12 % 2.90
Dennis SeimenPaderborn 07GER-2. Bundesliga3060 1.322.94 67.3 %26 % 2.83
Johannes SchenkPreußen MünsterGER-2. Bundesliga2754 1.833.01 66.6 %13 % 3.64
Loris KariusSchalke 04GER-2. Bundesliga2700 0.802.00 67.6 %43 % 2.01
Nico MantlBlau-Weiß LinzAUT-Bundesliga1350 1.331.47 65.5 %27 % 4.94
Tom HülsmannHartbergAUT-Bundesliga2683 1.272.75 66.3 %30 % 4.79

Peer median quality-adjusted GA/90: GER 2.72 · FRA 2.07 · ESP 1.79 · ITA 1.49 · ENG 1.40 · NED 3.09 · POR 2.34 · BEL 2.21

Goalkeepers per million, by country
BEL Belgium
1.78
NED Netherlands
1.39
POR Portugal
1.03
ESP Spain
0.41
ITA Italy
0.29
GER Germany
0.24
FRA France
0.21
ENG England
0.09
How we know

0.24 per million; first top-9 season at a median age of 25.5, against 22 for outfield exports.

As an analytics question In numbers: German goalkeepers with ≥ 450 minutes in the top-9 leagues, per million inhabitants, against outfield export age.

What we did We counted goalkeepers the same way we counted outfield players, then compared the age each group first reached one of the strongest leagues.

Sources 450-minute floor, 2025/26 rosters, same K = 900 shrinkage as the rest of the report; first season in a fetched top-9 table; players already there in 2020/21 are censored — 60 % of the goalkeepers, 40 % of the outfield exports; a comparison of two pathways inside one nation, not a causal claim. First top-9 season needs no move for a Bundesliga keeper.

A federation tracking this would watch whether the goalkeeper pathway keeps diverging from outfield export age, not one season's gap.

What is the gap made of?

Of the 2.66 players per million between France and Germany, U21 minutes go with −1.55, league strength with −1.68, export age with +4.26.

One horizontal stacked bar per contrast country: the contribution of U21 minutes, league strength and export age to its per-capita gap with Germany, plus the residual; whiskers show each channel's bootstrap interval.
How to read it: the whole bar is the gap in players per million between the comparison country and Germany. Each segment is how much of that gap goes with one measured channel — youth minutes, league strength, export age — under the decomposition; the hatched remainder is what the three channels do not carry. A segment can be negative when the channel works the other way.
How we know

+1.63 is not carried by the three channels.

As an analytics question In numbers: a linear split of the per-capita gap into U21 minutes, league strength and export age across 8 peer countries.

What we did We used the players who changed leagues to work out what a season in one league is worth in another, then split the gap between countries into the parts that line up with young players' minutes, league strength and the age players move abroad.

Sources Ridge-regression linear split, Blinder-Oaxaca-style (Oaxaca, 1973; Blinder, 1973), fit on the 8 peer countries with data on all three channels; bootstrap 90 % intervals, 1000 resamples; a decomposition of a correlation, not a causal accounting.

A federation tracking this would watch which channel's contribution grows, not treat the split as fixed.

Who are the players?

14 cards chosen by six rules.

How the 14 cards were chosen

Why these cards: one card per position group per rule, applied in this order — (a) highest goals + assists per 90, league-adjusted, (b) youngest national-team call-up, (c) most top-9 minutes among the 2026 FIFA World Cup squad, (d) most domestic-league minutes among the 2026 FIFA World Cup squad, (e) most top-9 minutes, (f) most domestic minutes under 23 without a top-9 season. A player already chosen by an earlier rule falls through to the next name, so a later row can show the second name by its measure. Rows group the six rules; the national-team core row holds two of them.

Highest quality-adjusted production

Deniz UndavStuttgartFW0.69G+A / 90 adj.↑ improving · +0.24 G+A / 90 adj.Career →
Stuttgart

Deniz Undav

FW · 30 · Stuttgart (2026/27) · NT 2024–26

2025/26 · Stuttgart · GER-Bundesliga

G+A / 90 adj.
0.69
Non-penalty goals / assists per 90
0.76 / 0.28
Minutes
2241 (73 %)
Style map Primary scorers Quality map High-volume scorers in top-five leagues

Primary scorers — non-penalty goal rate nearly double the forward median on starter minutes (56 %). The finishing forward of a first-choice line (Tresoldi, Undav, Mala).

improving +0.24 G+A / 90 adj. 1726 min → 2241 min

  1. Duván Zapata COL ITA-Serie A 2020/21 · 2379 min · 0.66 · d = 0.50
  2. Alexander Sørloth NOR ESP-La Liga 2024/25 · 1566 min · 0.74 · d = 0.96
  3. Jacob Murphy ENG ENG-Premier League 2024/25 · 2360 min · 0.68 · d = 1.05

2026 FIFA World Cup · 2026 World Cup qualification · UEFA Euro 2024

Selected as: highest goals + assists per 90, league-adjusted among FW.

Serge GnabryBayern MunichMF0.54G+A / 90 adj.↑ improving · +0.07 G+A / 90 adj.Career →
Bayern Munich

Serge Gnabry

MF · 31 · Bayern Munich (latest known) · NT 2024–26

2025/26 · Bayern Munich · GER-Bundesliga

G+A / 90 adj.
0.54
Non-penalty goals / assists per 90
0.59 / 0.44
Minutes
1219 (42 %)
Style map High-scoring attacking midfielders Quality map Productive midfielders in top-five leagues

Goal-scoring attacking midfielders — non-penalty goal rate three times the midfield median on starter minutes (56 %). The number 8/10 who arrives in the box (Wanitzek, Schade, Klaus).

improving +0.07 G+A / 90 adj. 1242 min → 1219 min

  1. Neymar BRA FRA-Ligue 1 2022/23 · 1545 min · 0.58 · d = 0.81
  2. Sadio Mané SEN GER-Bundesliga 2022/23 · 1425 min · 0.41 · d = 1.15
  3. İlkay Gündoğan GER ENG-Premier League 2020/21 · 2029 min · 0.48 · d = 1.58

2024–25 Nations League

Selected as: highest goals + assists per 90, league-adjusted among MF.

Tom BischofBayern MunichDF0.22G+A / 90 adj.Career →
Bayern Munich

Tom Bischof

DF · 21 · Bayern Munich (2026/27) · NT 2024–26

2025/26 · Bayern Munich · GER-Bundesliga

G+A / 90 adj.
0.22
Non-penalty goals / assists per 90
0.21 / 0.21
Minutes
1302 (45 %)
Style map Goal-scoring defenders Quality map Goal-scoring defenders in top-five leagues

Set-piece threats — defenders scoring at five times the DF median on 60 % of minutes. Aerial presence in both boxes (Thiaw, Papadopoulos, Ginter).

  1. Manu Sánchez ESP ESP-La Liga 2020/21 · 976 min · 0.17 · d = 0.63
  2. Ryan Sessegnon ENG GER-Bundesliga 2020/21 · 1574 min · 0.15 · d = 0.68
  3. Hannes Behrens GER GER-Bundesliga 2025/26 · 1318 min · 0.12 · d = 0.83

2024–25 Nations League

Selected as: highest goals + assists per 90, league-adjusted among DF.

National-team core — 2026 FIFA World Cup squad: most top-9 minutes, most home-league minutes

Nick WoltemadeJuventusFW0.44G+A / 90 adj.→ stable · −0.03 G+A / 90 adj.Career →
Juventus

Nick Woltemade

FW · 24 · Juventus (2026/27) · NT 2024–26

2025/26 · Newcastle · ENG-Premier League

G+A / 90 adj.
0.44
Non-penalty goals / assists per 90
0.33 / 0.14
Minutes
1902 (57 %)
Style map High-minutes starting forwards Quality map High-volume scorers in top-five leagues

Every-week starters — three quarters of the season's minutes, assist rate about 1.5 times the forward median, scoring at median. Mostly a top-five-league footprint: the first-choice forward who links play as much as he finishes (Atik, Futkeu, Ganaus).

stable −0.03 G+A / 90 adj. 1622 min → 1902 min

  1. Lyle Foster RSA ENG-Premier League 2023/24 · 1899 min · 0.43 · d = 0.10
  2. João Félix POR ENG-Premier League 2022/23 · 1591 min · 0.46 · d = 0.43
  3. Odsonne Édouard FRA ENG-Premier League 2021/22 · 1564 min · 0.44 · d = 0.45

2024–25 Nations League · 2026 FIFA World Cup · UEFA European Under-21 Championship 2025

Selected as: most top-9 minutes among 2026 FIFA World Cup squad FW.

Angelo StillerStuttgartMF0.18G+A / 90 adj.→ stable · −0.04 G+A / 90 adj.Career →
Stuttgart

Angelo Stiller

MF · 25 · Stuttgart (2026/27) · NT 2024–26

2025/26 · Stuttgart · GER-Bundesliga

G+A / 90 adj.
0.18
Non-penalty goals / assists per 90
0.07 / 0.16
Minutes
2743 (90 %)
Style map Everyday starting midfielders, low scoring output Quality map Everyday starting midfielders, low scoring output

The engine room — nearly 80 % of minutes with median output: holding and box-to-box midfielders whose value is continuity and structure, not numbers (Eggestein, Leopold, El-Faouzi).

stable −0.04 G+A / 90 adj. 2741 min → 2743 min

  1. Sergio Gómez ESP ESP-La Liga 2024/25 · 2738 min · 0.18 · d = 0.09
  2. Romano Schmid AUT GER-Bundesliga 2024/25 · 2834 min · 0.19 · d = 0.18
  3. Maximilian Eggestein GER GER-Bundesliga 2020/21 · 2942 min · 0.17 · d = 0.28

2026 FIFA World Cup · 2026 World Cup qualification

Selected as: most top-9 minutes among 2026 FIFA World Cup squad MF.

Malick ThiawNewcastleDF0.11G+A / 90 adj.↑ improving · +0.11 G+A / 90 adj.Career →
Newcastle

Malick Thiaw

DF · 25 · Newcastle (2026/27) · NT 2024–26

2025/26 · Newcastle · ENG-Premier League

G+A / 90 adj.
0.11
Non-penalty goals / assists per 90
0.12 / 0.00
Minutes
2965 (89 %)
Style map Goal-scoring defenders Quality map Goal-scoring defenders in top-five leagues

Set-piece threats — defenders scoring at five times the DF median on 60 % of minutes. Aerial presence in both boxes (Thiaw, Papadopoulos, Ginter).

improving +0.11 G+A / 90 adj. 1806 min → 2965 min

  1. Nathan Collins IRL ENG-Premier League 2025/26 · 2975 min · 0.08 · d = 0.20
  2. Micky van de Ven NED ENG-Premier League 2025/26 · 3041 min · 0.13 · d = 0.20
  3. Marc Guéhi ENG ENG-Premier League 2024/25 · 3059 min · 0.13 · d = 0.21

2024–25 Nations League · 2026 FIFA World Cup

Selected as: most top-9 minutes among 2026 FIFA World Cup squad DF.

Nathaniel BrownBayern MunichMF0.20G+A / 90 adj.↓ declining · −0.08 G+A / 90 adj.Career →
Bayern Munich

Nathaniel Brown

MF · 23 · Bayern Munich (2026/27) · NT 2024–26

2025/26 · Frankfurt · GER-Bundesliga

G+A / 90 adj.
0.20
Non-penalty goals / assists per 90
0.14 / 0.14
Minutes
2656 (89 %)
Style map Everyday starting midfielders, low scoring output Quality map Everyday starting midfielders, low scoring output

The engine room — nearly 80 % of minutes with median output: holding and box-to-box midfielders whose value is continuity and structure, not numbers (Eggestein, Leopold, El-Faouzi).

declining −0.08 G+A / 90 adj. 1947 min → 2656 min

  1. Víctor Muñoz ESP ESP-La Liga 2025/26 · 2656 min · 0.20 · d = 0.10
  2. Ritsu Doan JPN GER-Bundesliga 2020/21 · 2768 min · 0.17 · d = 0.29
  3. Pedri ESP ESP-La Liga 2024/25 · 2879 min · 0.21 · d = 0.32

2024–25 Nations League · 2026 FIFA World Cup · UEFA European Under-21 Championship 2025

Selected as: most domestic minutes among 2026 FIFA World Cup squad MF.

Waldemar AntonDortmundDF0.05G+A / 90 adj.↓ declining · −0.06 G+A / 90 adj.Career →
Dortmund

Waldemar Anton

DF · 30 · Dortmund (2026/27) · NT 2024–26

2025/26 · Dortmund · GER-Bundesliga

G+A / 90 adj.
0.05
Non-penalty goals / assists per 90
0.06 / 0.00
Minutes
2880 (94 %)
Style map Everyday starting defenders Quality map Everyday starting defenders

The defensive core — 85 % of minutes, output at the DF floor. Availability and continuity are the signal; production is not (Toljan, Mainka, Steurer).

declining −0.06 G+A / 90 adj. 1949 min → 2880 min

  1. Nico Elvedi SUI GER-Bundesliga 2025/26 · 2966 min · 0.05 · d = 0.11
  2. Martin Valjent SVK ESP-La Liga 2024/25 · 2763 min · 0.07 · d = 0.21
  3. Florian Lejeune FRA ESP-La Liga 2020/21 · 3015 min · 0.04 · d = 0.22

2024–25 Nations League · 2026 FIFA World Cup · UEFA Euro 2024

Selected as: most domestic minutes among 2026 FIFA World Cup squad DF.

Youngest national-team call-up

Said El MalaKölnFW0.52G+A / 90 adj.Career →
Köln

Said El Mala

FW · 20 · Köln (2026/27) · NT 2024–26

2025/26 · Köln · GER-Bundesliga

G+A / 90 adj.
0.52
Non-penalty goals / assists per 90
0.55 / 0.18
Minutes
1956 (64 %)
Style map Primary scorers Quality map High-volume scorers in top-five leagues

Primary scorers — non-penalty goal rate nearly double the forward median on starter minutes (56 %). The finishing forward of a first-choice line (Tresoldi, Undav, Mala).

  1. Yan Diomandé CIV GER-Bundesliga 2025/26 · 2472 min · 0.52 · d = 0.68
  2. Elye Wahi CIV FRA-Ligue 1 2022/23 · 2513 min · 0.48 · d = 0.99
  3. Rasmus Højlund DEN ITA-Serie A 2022/23 · 1834 min · 0.41 · d = 0.99

2024–25 Nations League

Selected as: youngest national-team call-up among FW.

Lennart KarlBayern MunichMF0.40G+A / 90 adj.Career →
Bayern Munich

Lennart Karl

MF · 18 · Bayern Munich (2026/27) · NT 2024–26

2025/26 · Bayern Munich · GER-Bundesliga

G+A / 90 adj.
0.40
Non-penalty goals / assists per 90
0.35 / 0.35
Minutes
1281 (44 %)
Style map High-minutes creative midfielders Quality map Productive midfielders in top-five leagues

Starting playmakers — assist rate three times the midfield median on 62 % of minutes, scoring nearly double. The creative hub of the middle third (Reese, Curda, Justvan).

  1. Jamal Musiala GER GER-Bundesliga 2020/21 · 881 min · 0.36 · d = 0.62
  2. Rodrigo Mora POR POR-Primeira Liga 2024/25 · 1370 min · 0.39 · d = 0.78
  3. Florian Wirtz GER GER-Bundesliga 2020/21 · 2224 min · 0.30 · d = 1.52

2024–25 Nations League

Selected as: youngest national-team call-up among MF.

Finn JeltschStuttgartDF0.05G+A / 90 adj.→ stable · +0.02 G+A / 90 adj.Career →
Stuttgart

Finn Jeltsch

DF · 20 · Stuttgart (2026/27) · NT 2024–26

2025/26 · Stuttgart · GER-Bundesliga

G+A / 90 adj.
0.05
Non-penalty goals / assists per 90
0.00 / 0.06
Minutes
1511 (49 %)
Style map Young low-minute defenders Quality map Young low-minute defenders

Development defenders — median age 22, about a third of minutes, output at the floor. The tier the 23–25 cohort draws from (Coulibaly, Arrey-Mbi, Pauli).

stable +0.02 G+A / 90 adj. 2363 min → 1511 min

  1. Malick Thiaw GER GER-Bundesliga 2020/21 · 1452 min · 0.04 · d = 0.15
  2. Noahkai Banks USA GER-Bundesliga 2025/26 · 1725 min · 0.08 · d = 0.34
  3. Max Finkgräfe GER GER-Bundesliga 2023/24 · 1756 min · 0.04 · d = 0.35

2024–25 Nations League

Selected as: youngest national-team call-up among DF.

Most top-9 minutes

Nicolo TresoldiClub BruggeFW0.42G+A / 90 adj.↑ improving · +0.24 G+A / 90 adj.Career →
Club Brugge

Nicolo Tresoldi

FW · 22 · Club Brugge (2026/27) · NT 2024–26

2025/26 · Club Brugge · BEL-Pro League

G+A / 90 adj.
0.42
Non-penalty goals / assists per 90
0.69 / 0.18
Minutes
2488 (69 %)
Style map Primary scorers Quality map High-volume scorers in top-five leagues

Primary scorers — non-penalty goal rate nearly double the forward median on starter minutes (56 %). The finishing forward of a first-choice line (Tresoldi, Undav, Mala).

improving +0.24 G+A / 90 adj. 2142 min → 2488 min

  1. Donyell Malen NED NED-Eredivisie 2020/21 · 2444 min · 0.43 · d = 0.32
  2. Brian Brobbey NED NED-Eredivisie 2023/24 · 2405 min · 0.44 · d = 0.35
  3. Gonçalo Ramos POR POR-Primeira Liga 2022/23 · 2282 min · 0.44 · d = 0.41

UEFA European Under-21 Championship 2025

Selected as: most top-9 league minutes among FW.

Maximilian EggesteinFreiburgMF0.11G+A / 90 adj.→ stable · +0.03 G+A / 90 adj.Career →
Freiburg

Maximilian Eggestein

MF · 30 · Freiburg (2026/27)

2025/26 · Freiburg · GER-Bundesliga

G+A / 90 adj.
0.11
Non-penalty goals / assists per 90
0.09 / 0.03
Minutes
3060 (100 %)
Style map Everyday starting midfielders, low scoring output Quality map Everyday starting midfielders, low scoring output

The engine room — nearly 80 % of minutes with median output: holding and box-to-box midfielders whose value is continuity and structure, not numbers (Eggestein, Leopold, El-Faouzi).

stable +0.03 G+A / 90 adj. 2845 min → 3060 min

  1. Aleix Febas ESP ESP-La Liga 2025/26 · 3160 min · 0.10 · d = 0.17
  2. Julian Weigl GER GER-Bundesliga 2024/25 · 2881 min · 0.08 · d = 0.36
  3. Marcelo Brozović CRO ITA-Serie A 2021/22 · 2937 min · 0.09 · d = 0.40

Selected as: most top-9 league minutes among MF.

Jeremy ToljanLevanteDF0.10G+A / 90 adj.Career →
Levante

Jeremy Toljan

DF · 32 · Levante (2026/27)

2025/26 · Levante · ESP-La Liga

G+A / 90 adj.
0.10
Non-penalty goals / assists per 90
0.03 / 0.11
Minutes
3164 (95 %)
Style map Everyday starting defenders Quality map High-assist defenders in top-five leagues

The defensive core — 85 % of minutes, output at the DF floor. Availability and continuity are the signal; production is not (Toljan, Mainka, Steurer).

  1. Catena ESP ESP-La Liga 2025/26 · 3071 min · 0.10 · d = 0.12
  2. Patrick Mainka GER GER-Bundesliga 2025/26 · 3060 min · 0.09 · d = 0.21
  3. Danilo BRA ITA-Serie A 2022/23 · 3184 min · 0.12 · d = 0.28

Selected as: most top-9 league minutes among DF.

Goalkeepers — most top-9 minutes · youngest in the top-9

Fulham

Bernd Leno

GK · Fulham (ENG-Premier League) · Career, season by season →

2025/26 · 3420 min

GA/90
1.34
Saves/90
2.58
Save %
66.0 %

Fulham (ENG-Premier League) · 25 % of the league's goals scored

Selected as: most top-9 minutes among home goalkeepers.

Werder Bremen

Mio Backhaus

GK · Werder Bremen (GER-Bundesliga) · Career, season by season →

2025/26 · 2880 min

GA/90
1.75
Saves/90
3.12
Save %
65.2 %

Werder Bremen (GER-Bundesliga) · 11 % of the league's goals scored

Selected as: youngest home goalkeeper with minimum top-9 minutes.

* Each card renders the existing dataset; no computation beyond the join. Age on the name line is the 2026/27 season-start age (start year − birth year); the club is from the 2026/27 tables, or — labelled "latest known" — from FBref's country page where the player has no 2026/27 row. Age on the analog line follows the analog finder's convention (season start year + 1 − birth year).

The atlas: every player-season of 2025/26, one dot each

Two-panel atlas of forwards 2025/26 in PCA projection. Left panel: style map without league multipliers; right panel: quality-adjusted map. Grey points are the whole corpus of 924 players; coloured points are the 61 German-eligible players by cluster; bright rings mark the 9 with a national-team call-up 2024–26.
How to read it: every dot is the 2025/26 season of one of the forwards in the leagues this report covers. The two axes are the first two principal components of his five per-90 numbers (goals, assists, minutes share, age, cards) — dots that sit close together had similar seasons. The style projection uses the raw numbers, the quality projection the league-adjusted ones, so switching shows who moves when the strength of his league is counted. Colours are the clusters named below; acid dots are German-eligible players, a white ring marks a national-team call-up. Hover a dot for the player, click to pin, scroll to zoom, type a name to find him.
Two-panel atlas of midfielders 2025/26 in PCA projection. Left panel: style map without league multipliers; right panel: quality-adjusted map. Grey points are the whole corpus of 2648 players; coloured points are the 188 German-eligible players by cluster; bright rings mark the 33 with a national-team call-up 2024–26.
How to read it: every dot is the 2025/26 season of one of the midfielders in the leagues this report covers. The two axes are the first two principal components of his five per-90 numbers (goals, assists, minutes share, age, cards) — dots that sit close together had similar seasons. The style projection uses the raw numbers, the quality projection the league-adjusted ones, so switching shows who moves when the strength of his league is counted. Colours are the clusters named below; acid dots are German-eligible players, a white ring marks a national-team call-up. Hover a dot for the player, click to pin, scroll to zoom, type a name to find him.
Two-panel atlas of defenders 2025/26 in PCA projection. Left panel: style map without league multipliers; right panel: quality-adjusted map. Grey points are the whole corpus of 1947 players; coloured points are the 161 German-eligible players by cluster; bright rings mark the 23 with a national-team call-up 2024–26.
How to read it: every dot is the 2025/26 season of one of the defenders in the leagues this report covers. The two axes are the first two principal components of his five per-90 numbers (goals, assists, minutes share, age, cards) — dots that sit close together had similar seasons. The style projection uses the raw numbers, the quality projection the league-adjusted ones, so switching shows who moves when the strength of his league is counted. Colours are the clusters named below; acid dots are German-eligible players, a white ring marks a national-team call-up. Hover a dot for the player, click to pin, scroll to zoom, type a name to find him.
Every player in the 2025/26 pool — all 469, searchable

The cards above pick by rule. This is everyone with a 2025/26 season in the data: 61 forwards, 188 midfielders, 161 defenders and 59 goalkeepers. Open a name for what the report measures about him, in plain words. Rank is within his own position group on quality-adjusted production; the two arrows mark a mid-season move.

469 of 469
    How we know

    As an analytics question In numbers: 14 showcase cards chosen from the 2025/26 pool by six selection rules, one per position group per rule.

    What we did We matched each player's season to his national-team call-ups and photo, then picked one player per position group under each of six rules.

    Sources 2025/26 FBref, Wikipedia and Wikidata rows joined by name and birth year; six selection rules, applied in order — see below.

    A federation tracking this would watch how the showcase set changes as a cohort ages, not any one card.

    What changed since last season?

    36 climbed a rung, 27 came down. The stepping-stone leagues hold 195 of the pool, from 208; the top nine hold 49, from 40.

    How to read it: the left column is last season’s rung for every player in the pool, the right column this season’s; each ribbon is the players who went from one to the other, its width their number. Acid ribbons climb, orange come down, mint are new to the pool, grey are no longer in a covered league. Hover a ribbon for the names.

    Bundesliga

    127 122

    222 012 → 195 190 minutes

    stepping-stone league

    208 195

    330 707 → 307 946 minutes

    top-9 league

    40 49

    64 804 → 80 744 minutes

    other covered league

    32 42

    54 067 → 71 383 minutes

    Players of the pool on each rung, 2024/25 → 2025/26, with the minutes they played there; 407 qualifying players last season, 408 this season.

    Climbed a rung 36

    • Nicolo Tresoldi GER-2. Bundesliga → BEL-Pro League
    • Philipp Hofmann GER-Bundesliga → GER-2. Bundesliga
    • Philipp Ziereis AUT-Bundesliga → GER-2. Bundesliga
    • Maximilian Wittek GER-Bundesliga → GER-2. Bundesliga
    • Florian Wirtz GER-Bundesliga → ENG-Premier League
    • Anton Stach GER-Bundesliga → ENG-Premier League
    • and 30 more

    Came down a rung 27

    • Robin Fellhauer GER-2. Bundesliga → GER-Bundesliga
    • Tom Gaal GER-2. Bundesliga → SUI-Super League
    • Noah Ganaus GER-2. Bundesliga → DEN-Superliga
    • Eric Martel GER-2. Bundesliga → GER-Bundesliga
    • Yannik Engelhardt ITA-Serie A → GER-Bundesliga
    • Amara Conde NED-Eredivisie → GER-2. Bundesliga
    • and 21 more

    New to the pool 114

    • Jeremy Toljan ESP-La Liga
    • Soufiane El-Faouzi GER-2. Bundesliga
    • Oliver Steurer AUT-Bundesliga
    • Lauren Ulrich GER-2. Bundesliga
    • Mika Baur GER-2. Bundesliga
    • Gabriel Isik POL-Ekstraklasa
    • and 108 more

    No longer in a covered league 113

    • Phil Neumann GER-2. Bundesliga
    • Elias Baum GER-2. Bundesliga
    • Julian Weigl GER-Bundesliga
    • Mitchell Weiser GER-Bundesliga
    • Caspar Jander GER-2. Bundesliga
    • Tim Kleindienst GER-Bundesliga
    • and 107 more

    “No longer in a covered league” means exactly that: retired, injured for the season, or playing in a league this report does not fetch. The data cannot tell those apart and this page does not guess. “New to the pool” likewise mixes debutants with players returning from leagues outside the set.

    How we know

    As an analytics question In numbers: every German-eligible player with at least 450 minutes in 2024/25 or 2025/26, placed on the pathway’s tier ladder in each season, and the move between the two.

    What we did We took each player’s main league last season and this season, sorted the leagues into the four rungs the report uses everywhere — home league, other covered league, stepping stone, top nine — and counted who climbed, who came down, who appeared and who is no longer in any league we can see.

    Sources Season feature tables for both seasons; a player’s league is the one he played most minutes in; 450-minute floor in a season to count as present in it; rungs as defined in the pathways chapter.

    A federation tracking this would watch the two moving columns each summer, and the stepping-stone count above all.

    For a federation

    One-page brief

    The whole argument on one screen: the five numbers behind why the pool of players runs thin, the single link that carries most of the gap, two checks on the models behind the numbers, and what none of this shows.

    Show the one-page brief
    Number GERFRAESP
    Share of league minutes that went to players aged 21 or under6.1 %8.8 %4.8 %
    Average age of a minute played in the league26.125.626.9
    Age the first time a player has real playing time in a foreign league, over the players abroad today252325
    Share of moves abroad to a league no stronger than the player's own92 %
    Players in Europe's strongest leagues, for every million people3.135.799.54

    If you take one thing from this: the single measured link that carries the most of the gap is different for each comparison — how old players are when they move abroad for France, how strong the domestic league is for Spain.

    How strong is the home league
    A season in the home league is worth about 0.78 of a season in the Premier League (0.74–0.81).
    When the count of players in the strongest leagues turned
    Around the 2000/01 season, with 69 percent probability that the shift is genuine rather than an ordinary season-to-season dip.

    What this does not show

    • Money: transfer fees, wages and academy budgets play no part in any number above.
    • How the academy and coaching set-up actually work day to day, which no public data source used here can see.
    • Agents, and how a move abroad actually gets arranged, which happens off any table this pipeline can read.
    • The direction of the arrow: a low share of playing time for young players at home could help cause a thin generation, or just as easily be a symptom of one — the five numbers above are associations measured the same way for every country.

    Explore the data

    Benchmark vs peer countries

    Structural benchmark vs peer countries

    Football intuition recognises the German pool player by player. Its structural position among the peer countries needs an aggregation nobody holds in one place. Three numbers below that are usually not collected together.

    Cohort gaps — forwards

    Cohort U2223-2526-2930+
    Germany 5 5 8 8
    France 10 9 15 6
    Spain 6 10 12 10
    Italy 3 7 8 4
    England 2 4 6 7

    Cohort gaps — midfielders

    Cohort U2223-2526-2930+
    Germany 15 24 19 26
    France 27 48 35 27
    Spain 17 55 44 39
    Italy 8 18 22 16
    England 15 17 25 9

    Cohort gaps — defenders

    Cohort U2223-2526-2930+
    Germany 9 6 22 27
    France 15 23 25 15
    Spain 17 29 34 38
    Italy 7 12 14 15
    England 6 11 20 15

    * Count and median npG+A per 90 of players with the country's nationality in a top-9 league, 2025/26, at least 450 minutes; cohort by age at the season's calendar turn (start year + 1 − birth year). 5 of the 8 countries are shown; the heatmap above carries all of them. Largest German shortfalls against the peer median count: defenders 23-25 (6 vs 23), midfielders U22 (15 vs 22), midfielders 26-29 (19 vs 25).

    The full picture, all nine peer countries at once, as a heatmap:

    Heatmap of the international cohort benchmark: 8 countries by position group and age cohort, 2025/26 season; the German row is outlined.
    Median non-penalty goals + assists per 90 by country, position group and age cohort, 2025/26; the outlined row is Germany.

    Observations

    Per capita: rank 8 of 8 · The largest cohort gap: defenders 23-25 · Trajectories 2024/25 → 2025/26: mostly stable

    Per capita: rank 8 of 8

    262 German players on 2025/26 rosters of the nine strongest leagues give 3.13 per million inhabitants, rank 8 of 8. Portugal leads with 25.19, 8.0 times the German density; Italy sits one place above with 3.41 from 201 players and a population 1.4 times smaller. No peer sits below.

    The largest cohort gap: defenders 23-25

    Counting 2025/26 top-9 players by position group and age cohort and comparing the German count with the median of the other seven peers, the three largest shortfalls are defenders 23-25 — 6 German against a peer median of 23; midfielders U22 — 15 German against a peer median of 22; midfielders 26-29 — 19 German against a peer median of 25. The cohort tables above show the medians behind the counts.

    Trajectories 2024/25 → 2025/26: mostly stable

    178 German-eligible players had at least 900 minutes in both 2024/25 and 2025/26: forwards 22 (5 up, 7 stable, 10 down); midfielders 76 (14 up, 47 stable, 15 down); defenders 80 (13 up, 59 stable, 8 down). A move counts as up or down when league-adjusted goals + assists per 90 changed by more than 0.05; 113 of 178 stayed within that band. These are season-over-season deltas, not projections.

    Cluster archetypes

    Cluster archetypes (style projection)

    Clusters are fitted on the whole corpus of 2025/26 player-seasons and read here through their German members, K chosen by silhouette score (Rousseeuw, 1987) with scikit-learn (Pedregosa et al., 2011). The label describes the cluster's median footprint; the count is German members of the corpus cluster; names are the German members with the most minutes.

    Two-panel atlas of forwards 2025/26 in PCA projection. Left panel: style map without league multipliers; right panel: quality-adjusted map. Grey points are the whole corpus of 924 players; coloured points are the 61 German-eligible players by cluster; bright rings mark the 9 with a national-team call-up 2024–26.
    Atlas of forwards 2025/26 in both projections: 61 German-eligible players in colour against a corpus of 924. Bright rings mark the national-team pool (call-up 2024–26, 9 players).
    Two-panel atlas of midfielders 2025/26 in PCA projection. Left panel: style map without league multipliers; right panel: quality-adjusted map. Grey points are the whole corpus of 2648 players; coloured points are the 188 German-eligible players by cluster; bright rings mark the 33 with a national-team call-up 2024–26.
    Atlas of midfielders 2025/26 in both projections: 188 German-eligible players in colour against a corpus of 2648. Bright rings mark the national-team pool (call-up 2024–26, 33 players).
    Two-panel atlas of defenders 2025/26 in PCA projection. Left panel: style map without league multipliers; right panel: quality-adjusted map. Grey points are the whole corpus of 1947 players; coloured points are the 161 German-eligible players by cluster; bright rings mark the 23 with a national-team call-up 2024–26.
    Atlas of defenders 2025/26 in both projections: 161 German-eligible players in colour against a corpus of 1947. Bright rings mark the national-team pool (call-up 2024–26, 23 players).

    Forwards

    High-assist forwards 8 German of 112 · NT pool 1 · median born 1997 Ragnar AcheDaniel HanslikJona NiemiecBenedict Hollerbach
    Corpus medians: 0.30 non-penalty goals and 0.21 assists per 90, 33 % of the club's minutes, age 25, 0.15 cards per 90. Tactical readCreators from the front line — assist rate more than double the forward median on rotation minutes (38 %), scoring at median. Wide forwards and second strikers who feed the box rather than occupy it (Ache, Hanslik, Niemiec).
    Duel-heavy rotation forwards 7 German of 144 · NT pool 0 · median born 2000 Steffen TiggesDavie SelkeDennis OwusuKeke Topp
    Corpus medians: 0.30 non-penalty goals and 0.10 assists per 90, 33 % of the club's minutes, age 24, 0.29 cards per 90. Tactical readRotation forwards whose signature is physical engagement — card rate roughly three times the forward median, a third of minutes, output at median. Pressing and duel-heavy roles rather than finishing (Tigges, Selke, Owusu).
    High-minutes starting forwards 12 German of 148 · NT pool 1 · median born 2001 Barış AtikNoel FutkeuNoah GanausPhilipp Hofmann
    Corpus medians: 0.30 non-penalty goals and 0.13 assists per 90, 76 % of the club's minutes, age 24, 0.14 cards per 90. Tactical readEvery-week starters — three quarters of the season's minutes, assist rate about 1.5 times the forward median, scoring at median. Mostly a top-five-league footprint: the first-choice forward who links play as much as he finishes (Atik, Futkeu, Ganaus).
    Older forwards with moderate playing time 11 German of 142 · NT pool 1 · median born 1994 Kevin BehrensFabian SchleusenerLucas HölerLion Lauberbach
    Corpus medians: 0.28 non-penalty goals and 0.08 assists per 90, 46 % of the club's minutes, age 32, 0.17 cards per 90. Tactical readExperienced forwards on managed minutes — median age 31, about 40 % of minutes, output at median. The impact or target forward used in rotation (Behrens, Schleusener, Höler).
    Young low-minute forwards 15 German of 255 · NT pool 1 · median born 2000 Morgan FaßbenderMarvin PieringerMaurice MaloneYoussoufa Moukoko
    Corpus medians: 0.27 non-penalty goals and 0.08 assists per 90, 29 % of the club's minutes, age 23, 0.13 cards per 90. Tactical readThe development tier and the largest forward cluster — median age 23, under 30 % of minutes, output just below median. Where most of the home pool's young forwards sit (Faßbender, Pieringer, Malone).
    Primary scorers 8 German of 123 · NT pool 5 · median born 2001 Nicolo TresoldiDeniz UndavSaid El MalaDženan Pejčinović
    Corpus medians: 0.50 non-penalty goals and 0.10 assists per 90, 51 % of the club's minutes, age 25, 0.16 cards per 90. Tactical readPrimary scorers — non-penalty goal rate nearly double the forward median on starter minutes (56 %). The finishing forward of a first-choice line (Tresoldi, Undav, Mala).

    Midfielders

    High-card-rate midfielders 29 German of 387 · NT pool 2 · median born 2001 Fabian KunzeEric MartelCajetan LenzRafael Lubach
    Corpus medians: 0.08 non-penalty goals and 0.08 assists per 90, 38 % of the club's minutes, age 24, 0.33 cards per 90. Tactical readBall-winning, duel-heavy midfielders — the card rate (about 2.5 times the midfield median) is the defining feature, production at the floor of the group. The destroyer profile, often in a double pivot (Kunze, Martel, Lenz).
    Older rotation midfielders 31 German of 425 · NT pool 2 · median born 1994 Lewis HoltbyMarlon RitterMaximilian ArnoldLuca Marseiler
    Corpus medians: 0.08 non-penalty goals and 0.10 assists per 90, 39 % of the club's minutes, age 30, 0.21 cards per 90. Tactical readVeteran rotation midfielders — median age 30 on managed minutes (40 %), output at median, card rate above it. Experience kept in the squad rather than on the pitch every week (Holtby, Ritter, Arnold).
    Young low-minute midfielders 37 German of 624 · NT pool 3 · median born 2003 Louis OppieJan ThielmannRafael PintoAleksandar Pavlovic
    Corpus medians: 0.08 non-penalty goals and 0.09 assists per 90, 29 % of the club's minutes, age 22, 0.17 cards per 90. Tactical readDevelopment midfielders — the home pool's largest midfield group: median age 22, under a third of minutes, output at median. The pipeline's waiting room (Oppie, Thielmann, Pinto).
    Everyday starting midfielders, low scoring output 47 German of 600 · NT pool 9 · median born 2000 Maximilian EggesteinEnzo LeopoldSoufiane El-FaouziNicolai Remberg
    Corpus medians: 0.08 non-penalty goals and 0.09 assists per 90, 79 % of the club's minutes, age 25, 0.18 cards per 90. Tactical readThe engine room — nearly 80 % of minutes with median output: holding and box-to-box midfielders whose value is continuity and structure, not numbers (Eggestein, Leopold, El-Faouzi).
    High-scoring attacking midfielders 21 German of 320 · NT pool 10 · median born 2001 Marvin WanitzekKevin SchadeFelix KlausLeroy Sané
    Corpus medians: 0.25 non-penalty goals and 0.13 assists per 90, 54 % of the club's minutes, age 24, 0.17 cards per 90. Tactical readGoal-scoring attacking midfielders — non-penalty goal rate three times the midfield median on starter minutes (56 %). The number 8/10 who arrives in the box (Wanitzek, Schade, Klaus).
    High-minutes creative midfielders 23 German of 290 · NT pool 7 · median born 1998 Fabian ReeseLaurin CurdaJulian JustvanTom Zimmerschied
    Corpus medians: 0.14 non-penalty goals and 0.22 assists per 90, 59 % of the club's minutes, age 24, 0.17 cards per 90. Tactical readStarting playmakers — assist rate three times the midfield median on 62 % of minutes, scoring nearly double. The creative hub of the middle third (Reese, Curda, Justvan).

    Defenders

    Everyday starting defenders 31 German of 431 · NT pool 4 · median born 1998 Jeremy ToljanPatrick MainkaOliver SteurerWaldemar Anton
    Corpus medians: 0.03 non-penalty goals and 0.03 assists per 90, 84 % of the club's minutes, age 25, 0.18 cards per 90. Tactical readThe defensive core — 85 % of minutes, output at the DF floor. Availability and continuity are the signal; production is not (Toljan, Mainka, Steurer).
    High-card-rate defenders 29 German of 284 · NT pool 0 · median born 2000 Paul JaeckelThilo KehrerDominik KohrMaxwell Gyamfi
    Corpus medians: 0.02 non-penalty goals and 0.02 assists per 90, 47 % of the club's minutes, age 24, 0.36 cards per 90. Tactical readDuel-heavy defenders — card rate 2.5 times the DF median with rotation minutes (46 %). The physical stopper profile (Jaeckel, Kehrer, Kohr).
    Young low-minute defenders 25 German of 424 · NT pool 6 · median born 2003 Abdoul CoulibalyBright Arrey-MbiJulian PauliJamil Siebert
    Corpus medians: 0.02 non-penalty goals and 0.02 assists per 90, 34 % of the club's minutes, age 22, 0.18 cards per 90. Tactical readDevelopment defenders — median age 22, about a third of minutes, output at the floor. The tier the 23–25 cohort draws from (Coulibaly, Arrey-Mbi, Pauli).
    Goal-scoring defenders 24 German of 218 · NT pool 5 · median born 1999 Malick ThiawAntonios PapadopoulosMatthias GinterPius Dorn
    Corpus medians: 0.10 non-penalty goals and 0.04 assists per 90, 55 % of the club's minutes, age 25, 0.20 cards per 90. Tactical readSet-piece threats — defenders scoring at five times the DF median on 60 % of minutes. Aerial presence in both boxes (Thiaw, Papadopoulos, Ginter).
    Older defenders 27 German of 363 · NT pool 2 · median born 1994 Marcel FrankePhilipp ZiereisMarcel HeisterSebastian Jung
    Corpus medians: 0.02 non-penalty goals and 0.02 assists per 90, 44 % of the club's minutes, age 31, 0.20 cards per 90. Tactical readExperienced defenders on managed minutes — median age 31, 44 % of minutes, output at the floor. Leadership and cover rather than a starting role (Franke, Ziereis, Heister).
    High-assist defenders with high playing time 25 German of 226 · NT pool 6 · median born 1999 David HeroldDavid RaumRidle BakuMaximilian Wittek
    Corpus medians: 0.04 non-penalty goals and 0.12 assists per 90, 64 % of the club's minutes, age 25, 0.20 cards per 90. Tactical readAttacking full-backs — assist rate seven times the DF median on starter minutes (65 %). The wide defender whose job ends in the final third (Herold, Raum, Baku).
    Trajectories

    Trajectories 2024/25 → 2025/26 (German-eligible, ≥ 900 minutes in both seasons)

    Season-over-season change in goals + assists per 90, league-adjusted. A move counts as up or down beyond ± 0.05; everything inside that band is stable and not listed.

    Forwards — 22 players: 5 up, 7 stable, 10 down

    Moving up · G+A / 90 adj.

    PlayerLeagueMin 2024/25 / 2025/26Change
    Nicolo Tresoldi BEL-Pro League 2142 / 2488 +0.244
    Deniz Undav GER-Bundesliga 1726 / 2241 +0.238
    Fabian Schleusener GER-2. Bundesliga 2164 / 2077 +0.106
    Ragnar Ache GER-Bundesliga 2038 / 1718 +0.083
    Noel Futkeu GER-2. Bundesliga 2215 / 2705 +0.064

    Moving down · G+A / 90 adj.

    PlayerLeagueMin 2024/25 / 2025/26Change
    Lucas Höler GER-Bundesliga 1867 / 2037 −0.171
    Johannes Eggestein AUT-Bundesliga 1853 / 2324 −0.170
    Phil Harres GER-2. Bundesliga 1544 / 2204 −0.160
    Adriano Grimaldi GER-2. Bundesliga 1099 / 903 −0.152
    Justin Njinmah GER-Bundesliga 952 / 1947 −0.136

    Midfielders — 76 players: 14 up, 47 stable, 15 down

    Moving up · G+A / 90 adj.

    PlayerLeagueMin 2024/25 / 2025/26Change
    Chris Führich GER-Bundesliga 1981 / 1698 +0.265
    Jamie Leweling GER-Bundesliga 1663 / 2367 +0.223
    Anton Stach ENG-Premier League 2585 / 2370 +0.175
    Anton Kade GER-Bundesliga 2340 / 1743 +0.138
    Vitaly Janelt ENG-Premier League 2254 / 1443 +0.099

    Moving down · G+A / 90 adj.

    PlayerLeagueMin 2024/25 / 2025/26Change
    Leroy Sané TUR-Süper Lig 1637 / 2280 −0.322
    Florian Wirtz ENG-Premier League 2351 / 2378 −0.205
    İlkay Gündoğan TUR-Süper Lig 2223 / 1387 −0.139
    Paul Nebel GER-Bundesliga 2345 / 2073 −0.135
    Niklas Dorsch GER-Bundesliga 1335 / 2258 −0.126

    Defenders — 80 players: 13 up, 59 stable, 8 down

    Moving up · G+A / 90 adj.

    PlayerLeagueMin 2024/25 / 2025/26Change
    Marc-Oliver Kempf ITA-Serie A 2615 / 2326 +0.126
    Marnon Busch GER-Bundesliga 1396 / 1915 +0.121
    Malick Thiaw ENG-Premier League 1806 / 2965 +0.107
    Stefan Bell GER-Bundesliga 1436 / 1039 +0.090
    Maximilian Wittek GER-2. Bundesliga 2706 / 2452 +0.084

    Moving down · G+A / 90 adj.

    PlayerLeagueMin 2024/25 / 2025/26Change
    Keven Schlotterbeck GER-Bundesliga 1297 / 2031 −0.106
    Robin Gosens ITA-Serie A 2521 / 1881 −0.106
    Julian Chabot GER-Bundesliga 2269 / 2294 −0.086
    Tim Oberdorf GER-2. Bundesliga 2970 / 2797 −0.067
    Lukas Ullrich GER-Bundesliga 1903 / 1305 −0.066
    Why does the train leave?

    Why does the train leave?

    Four exhibits comparing Germany with 7 peer countries: youth exposure at home, export route, how exports fare, and who made it.

    Exhibit A — youth exposure at home

    Share of a domestic league's total minutes played by its own nationals aged 21 or under, 2025/26.

    * Σ minutes of players with the league country's nationality and age ≤ 21 at the season's start ÷ Σ minutes of all players in the league, 2025/26. Under-23 shares: NED 24.2 %, FRA 14.4 %, BEL 16.4 %, GER 10.9 %, POR 9.1 %, ESP 16.9 %, ENG 6.4 %, ITA 7.3 %. A league without a bar is not covered by FBref.

    Exhibit B — export route

    For every peer-country player on a 2026/27 top-9 roster: the age at the first top-9 season (full roster, and recent entrants only) and, for recent entrants, the league of the season before it. Not informative for this nation: Bundesliga and every peer's own league are themselves top-9 leagues, so the domestic / top-9 split has no content here; the exhibit is kept for comparability with other nations. German exports: 208 players, median export age 22.5 (recent entrants 63, median 22), 0 % of the recent ones straight from the Bundesliga*.

    CountrynRecent Export age (all)Export age (recent) DomesticStepping stoneOther top-9Not covered Censored
    GER Germany 208 63 22.5 22 0 % 57 % 0 % 43 % 36 %
    FRA France 313 107 21 21 0 % 2 % 0 % 98 % 34 %
    ESP Spain 368 98 22 21.5 0 % 0 % 0 % 100 % 33 %
    ITA Italy 144 36 21 22 0 % 0 % 0 % 100 % 32 %
    ENG England 154 29 21 20 0 % 0 % 0 % 100 % 39 %
    NED Netherlands 268 78 20 20.5 0 % 3 % 0 % 97 % 29 %
    POR Portugal 176 40 20.5 20.5 0 % 5 % 0 % 95 % 36 %
    BEL Belgium 208 55 20 20 0 % 0 % 0 % 100 % 32 %

    * Export age = age at the first season in any headline league, history back to 2020/21; a first appearance already in 2020/21 is censored. Recent entrants: first top-9 season 2025/26 or 2026/27, the only ones whose previous season lies inside the fetched window (2024/25 onwards for peer domestic leagues). Stepping-stone leagues: NED-Eredivisie, BEL-Pro League, POR-Primeira Liga, TUR-Süper Lig, GER-2. Bundesliga. Not covered: no earlier row in the data.

    Exhibit C — how the exports fare

    Peer-country players at a top-9 club in 2025/26: median share of the club's minutes, and the club's strength within its league.

    ESP Spain n = 464
    60 %
    POR Portugal n = 268
    60 %
    BEL Belgium n = 253
    59 %
    ENG England n = 208
    55 %
    GER Germany n = 262
    50 %
    NED Netherlands n = 372
    48 %
    FRA France n = 395
    47 %
    ITA Italy n = 201
    45 %

    * Minutes share = player minutes ÷ (club matches × 90), 2025/26, one row per player-season. Club strength proxy: goals-scored percentile within league — clubs ranked by the goals their own roster scored that season (ClubElo was unreachable at run time). Both are medians over the country's exports; n per country in the bars.

    Exhibit D — profile of those who made it

    Goals + assists per 90, league-adjusted, in 2025/26 by the tier of the player's own league: domestic, stepping stone, top-9, or another covered league. German count and median against the median of the peer countries' values. Not informative for this nation: Bundesliga and every peer's own league are themselves top-9 leagues, so the domestic / top-9 split has no content here; the exhibit is kept for comparability with other nations.

    Profile table by tier and position group
    TierGroupGER nGER medianPeer median nPeer median
    stepping-stone league FW 24 0.22 1 0.22
    stepping-stone league MF 100 0.09 2 0.09
    stepping-stone league DF 74 0.03 1 0.03
    top-9 league FW 26 0.37 22 0.28
    top-9 league MF 81 0.18 84 0.14
    top-9 league DF 64 0.07 62 0.05
    other covered league FW 11 0.14 4.5 0.14
    other covered league MF 7 0.07 5 0.09
    other covered league DF 25 0.03 7 0.03

    * Tier = the league of the player's own 2025/26 season. Peer median n and peer median are medians across the peer countries present in that tier and group; a tier a country has no player in is absent, not zero.

    Exhibit E — where German exports go

    Of the 410 mapped German players, 288 play outside the Bundesliga.

    • stepping stone Marvin Wanitzek · Enzo Leopold · Soufiane El-Faouzi
    • top-9 Jeremy Toljan · Malick Thiaw · Kevin Schade
    • other Antonios Papadopoulos · Oliver Steurer · Jamie Lawrence

    * Buckets by the league of the player's own 2025/26 season; a player is counted once per position group, like everywhere else on the page, so one with rows in two groups counts in each; the number in front of each bar is the player count, the median multiplier is the bucket's median league multiplier. Sideways: destination league multiplier <= the domestic league's multiplier.

    F · The 2026 FIFA World Cup squad by league tier

    Where the 26 players named to the 2026 FIFA World Cup squad played in 2025/26, next to France, Spain, England, Netherlands, Belgium, Portugal. Tier = the league of the player's most-minutes 2025/26 row.

    Minutes, multipliers and age cohorts by country
    Country Median minutesMedian multiplier U2223–25 26–2930+
    GER Germany 2208.5 0.788 2 8 4 12
    FRA France 2316 0.807 3 7 10 6
    ESP Spain 2181 0.807 3 8 7 8
    ENG England 2199 1.000 2 8 9 7
    NED Netherlands 1903 1.000 1 7 11 7
    BEL Belgium 2034 0.807 4 8 5 9
    POR Portugal 2226 0.807 1 6 11 8

    * 8 squad players have no 2025/26 row in the fetched leagues and are counted as unmatched.

    Historical analogs

    Historical analogs

    For each showcase player the finder takes the nearest 5 player-seasons at the same age across the whole corpus of every fetched league — the 9 headline leagues back to 2020/21, the rest from 2024/25 — all nationalities. Distance is computed on three standardised features: npG+A/90 (quality-adjusted), minutes, league multiplier. For every analog the following seasons are shown as they happened. Description, not prediction: the reader sees the spread of paths; the method imposes none.

    Target

    Deniz Undav

    FW · age 30 · GER-Bundesliga 2025/26 · 2241 min · 0.69 npG+A/90 quality

    Nearest 5 at the same age

    5 nearest analogs and what followed
    1. 1 Duván Zapata COL ITA-Serie A 2020/21 · 2379 min · 0.66 npG+A/90 · d = 0.50
      Followed by: 2021/22  ITA-Serie A · 1722 min · 0.46 2022/23  ITA-Serie A · 1390 min · 0.25 2023/24  ITA-Serie A · 2880 min · 0.40 2024/25  ITA-Serie A · 587 min · 0.36
    2. 2 Alexander Sørloth NOR ESP-La Liga 2024/25 · 1566 min · 0.74 npG+A/90 · d = 0.96
      Followed by: 2025/26  ESP-La Liga · 1980 min · 0.44
    3. 3 Jacob Murphy ENG ENG-Premier League 2024/25 · 2360 min · 0.68 npG+A/90 · d = 1.05
      Followed by: 2025/26  ENG-Premier League · 1617 min · 0.31
    4. 4 Ollie Watkins ENG ENG-Premier League 2024/25 · 2598 min · 0.69 npG+A/90 · d = 1.14
      Followed by: 2025/26  ENG-Premier League · 2839 min · 0.55
    5. 5 Riyad Mahrez ALG ENG-Premier League 2020/21 · 1949 min · 0.61 npG+A/90 · d = 1.31
      Followed by: 2021/22  ENG-Premier League · 1498 min · 0.61 2022/23  ENG-Premier League · 1920 min · 0.51

    Target

    Said El Mala

    FW · age 20 · GER-Bundesliga 2025/26 · 1956 min · 0.52 npG+A/90 quality

    Nearest 5 at the same age

    5 nearest analogs and what followed
    1. 1 Yan Diomandé CIV GER-Bundesliga 2025/26 · 2472 min · 0.52 npG+A/90 · d = 0.68
      No later season in the corpus.
    2. 2 Elye Wahi CIV FRA-Ligue 1 2022/23 · 2513 min · 0.48 npG+A/90 · d = 0.99
      Followed by: 2023/24  FRA-Ligue 1 · 1692 min · 0.36 2024/25  FRA-Ligue 1 · 574 min · 0.33 2025/26  FRA-Ligue 1 · 922 min · 0.33
    3. 3 Rasmus Højlund DEN ITA-Serie A 2022/23 · 1834 min · 0.41 npG+A/90 · d = 0.99
      Followed by: 2023/24  ENG-Premier League · 2158 min · 0.51 2024/25  ENG-Premier League · 2004 min · 0.27 2025/26  ITA-Serie A · 2750 min · 0.41
    4. 4 Christian Kofane CMR GER-Bundesliga 2025/26 · 1239 min · 0.46 npG+A/90 · d = 1.07
      No later season in the corpus.
    5. 5 Georginio Rutter FRA GER-Bundesliga 2021/22 · 1611 min · 0.39 npG+A/90 · d = 1.16
      Followed by: 2022/23  GER-Bundesliga · 1009 min · 0.33 2024/25  ENG-Premier League · 1656 min · 0.36 2025/26  ENG-Premier League · 1786 min · 0.28

    Target

    Nick Woltemade

    FW · age 24 · ENG-Premier League 2025/26 · 1902 min · 0.44 npG+A/90 quality

    Nearest 5 at the same age

    5 nearest analogs and what followed
    1. 1 Lyle Foster RSA ENG-Premier League 2023/24 · 1899 min · 0.43 npG+A/90 · d = 0.10
      Followed by: 2025/26  ENG-Premier League · 1371 min · 0.35
    2. 2 João Félix POR ENG-Premier League 2022/23 · 1591 min · 0.46 npG+A/90 · d = 0.43
      Followed by: 2023/24  ESP-La Liga · 1540 min · 0.43 2024/25  ITA-Serie A · 760 min · 0.17
    3. 3 Odsonne Édouard FRA ENG-Premier League 2021/22 · 1564 min · 0.44 npG+A/90 · d = 0.45
      Followed by: 2022/23  ENG-Premier League · 1803 min · 0.38 2023/24  ENG-Premier League · 1555 min · 0.45 2025/26  FRA-Ligue 1 · 1796 min · 0.42
    4. 4 João Pedro BRA ENG-Premier League 2024/25 · 1948 min · 0.50 npG+A/90 · d = 0.47
      Followed by: 2025/26  ENG-Premier League · 2661 min · 0.60
    5. 5 Allan Saint-Maximin FRA ENG-Premier League 2020/21 · 1560 min · 0.42 npG+A/90 · d = 0.50
      Followed by: 2021/22  ENG-Premier League · 2804 min · 0.34 2022/23  ENG-Premier League · 1120 min · 0.47 2024/25  TUR-Süper Lig · 1201 min · 0.19

    Target

    Nicolo Tresoldi

    FW · age 22 · BEL-Pro League 2025/26 · 2488 min · 0.42 npG+A/90 quality

    Nearest 5 at the same age

    5 nearest analogs and what followed
    1. 1 Donyell Malen NED NED-Eredivisie 2020/21 · 2444 min · 0.43 npG+A/90 · d = 0.32
      Followed by: 2021/22  GER-Bundesliga · 1684 min · 0.32 2022/23  GER-Bundesliga · 1706 min · 0.48 2023/24  GER-Bundesliga · 1781 min · 0.43 2024/25  GER-Bundesliga · 614 min · 0.24
    2. 2 Brian Brobbey NED NED-Eredivisie 2023/24 · 2405 min · 0.44 npG+A/90 · d = 0.35
      Followed by: 2024/25  NED-Eredivisie · 1555 min · 0.20 2025/26  ENG-Premier League · 1927 min · 0.37
    3. 3 Gonçalo Ramos POR POR-Primeira Liga 2022/23 · 2282 min · 0.44 npG+A/90 · d = 0.41
      Followed by: 2023/24  FRA-Ligue 1 · 1419 min · 0.40 2024/25  FRA-Ligue 1 · 1066 min · 0.49 2025/26  FRA-Ligue 1 · 1318 min · 0.30
    4. 4 Emanuel Emegha NED FRA-Ligue 1 2024/25 · 2293 min · 0.41 npG+A/90 · d = 0.53
      No later season in the corpus.
    5. 5 Franjo Ivanović CRO BEL-Pro League 2024/25 · 2542 min · 0.34 npG+A/90 · d = 0.73
      Followed by: 2025/26  POR-Primeira Liga · 876 min · 0.31

    Target

    Serge Gnabry

    MF · age 31 · GER-Bundesliga 2025/26 · 1219 min · 0.54 npG+A/90 quality

    Nearest 5 at the same age

    5 nearest analogs and what followed
    1. 1 Neymar BRA FRA-Ligue 1 2022/23 · 1545 min · 0.58 npG+A/90 · d = 0.81
      No later season in the corpus.
    2. 2 Sadio Mané SEN GER-Bundesliga 2022/23 · 1425 min · 0.41 npG+A/90 · d = 1.15
      No later season in the corpus.
    3. 3 İlkay Gündoğan GER ENG-Premier League 2020/21 · 2029 min · 0.48 npG+A/90 · d = 1.58
      Followed by: 2021/22  ENG-Premier League · 1857 min · 0.45 2022/23  ENG-Premier League · 2353 min · 0.39 2023/24  ESP-La Liga · 2994 min · 0.27 2024/25  ENG-Premier League · 2223 min · 0.27
    4. 4 Bobby De Cordova-Reid JAM ENG-Premier League 2023/24 · 1423 min · 0.39 npG+A/90 · d = 1.67
      Followed by: 2024/25  ENG-Premier League · 744 min · 0.29
    5. 5 Lee Jae-sung KOR GER-Bundesliga 2022/23 · 1894 min · 0.37 npG+A/90 · d = 1.73
      Followed by: 2023/24  GER-Bundesliga · 2113 min · 0.27 2024/25  GER-Bundesliga · 2650 min · 0.30 2025/26  GER-Bundesliga · 2185 min · 0.19

    Target

    Lennart Karl

    MF · age 18 · GER-Bundesliga 2025/26 · 1281 min · 0.40 npG+A/90 quality

    Nearest 5 at the same age

    5 nearest analogs and what followed
    1. 1 Jamal Musiala GER GER-Bundesliga 2020/21 · 881 min · 0.36 npG+A/90 · d = 0.62
      Followed by: 2021/22  GER-Bundesliga · 1465 min · 0.36 2022/23  GER-Bundesliga · 2198 min · 0.56 2023/24  GER-Bundesliga · 1755 min · 0.46 2024/25  GER-Bundesliga · 1798 min · 0.43
    2. 2 Rodrigo Mora POR POR-Primeira Liga 2024/25 · 1370 min · 0.39 npG+A/90 · d = 0.78
      Followed by: 2025/26  POR-Primeira Liga · 1181 min · 0.10
    3. 3 Florian Wirtz GER GER-Bundesliga 2020/21 · 2224 min · 0.30 npG+A/90 · d = 1.52
      Followed by: 2021/22  GER-Bundesliga · 1851 min · 0.49 2022/23  GER-Bundesliga · 1090 min · 0.43 2023/24  GER-Bundesliga · 2372 min · 0.51 2024/25  GER-Bundesliga · 2351 min · 0.48
    4. 4 Rio Ngumoha ENG ENG-Premier League 2025/26 · 560 min · 0.32 npG+A/90 · d = 1.55
      No later season in the corpus.
    5. 5 Lewis Miley ENG ENG-Premier League 2023/24 · 1202 min · 0.26 npG+A/90 · d = 1.55
      Followed by: 2025/26  ENG-Premier League · 1496 min · 0.27

    Target

    Angelo Stiller

    MF · age 25 · GER-Bundesliga 2025/26 · 2743 min · 0.18 npG+A/90 quality

    Nearest 5 at the same age

    5 nearest analogs and what followed
    1. 1 Sergio Gómez ESP ESP-La Liga 2024/25 · 2738 min · 0.18 npG+A/90 · d = 0.09
      Followed by: 2025/26  ESP-La Liga · 2701 min · 0.14 2026/27  ESP-La Liga · 521 min · 0.00
    2. 2 Romano Schmid AUT GER-Bundesliga 2024/25 · 2834 min · 0.19 npG+A/90 · d = 0.18
      Followed by: 2025/26  GER-Bundesliga · 2982 min · 0.20
    3. 3 Maximilian Eggestein GER GER-Bundesliga 2020/21 · 2942 min · 0.17 npG+A/90 · d = 0.28
      Followed by: 2021/22  GER-Bundesliga · 2194 min · 0.12 2022/23  GER-Bundesliga · 2451 min · 0.12 2023/24  GER-Bundesliga · 2914 min · 0.10 2024/25  GER-Bundesliga · 2845 min · 0.08
    4. 4 Iván Martín ESP ESP-La Liga 2023/24 · 2729 min · 0.21 npG+A/90 · d = 0.31
      Followed by: 2024/25  ESP-La Liga · 2039 min · 0.10 2025/26  ESP-La Liga · 2532 min · 0.06
    5. 5 Lucas Da Cunha FRA ITA-Serie A 2025/26 · 2739 min · 0.16 npG+A/90 · d = 0.36
      No later season in the corpus.

    Target

    Nathaniel Brown

    MF · age 23 · GER-Bundesliga 2025/26 · 2656 min · 0.20 npG+A/90 quality

    Nearest 5 at the same age

    5 nearest analogs and what followed
    1. 1 Víctor Muñoz ESP ESP-La Liga 2025/26 · 2656 min · 0.20 npG+A/90 · d = 0.10
      No later season in the corpus.
    2. 2 Ritsu Doan JPN GER-Bundesliga 2020/21 · 2768 min · 0.17 npG+A/90 · d = 0.29
      Followed by: 2021/22  NED-Eredivisie · 1510 min · 0.21 2022/23  GER-Bundesliga · 2424 min · 0.25 2023/24  GER-Bundesliga · 2246 min · 0.26 2024/25  GER-Bundesliga · 2862 min · 0.36
    3. 3 Pedri ESP ESP-La Liga 2024/25 · 2879 min · 0.21 npG+A/90 · d = 0.32
      Followed by: 2025/26  ESP-La Liga · 2104 min · 0.31
    4. 4 Angelo Stiller GER GER-Bundesliga 2023/24 · 2694 min · 0.16 npG+A/90 · d = 0.34
      Followed by: 2024/25  GER-Bundesliga · 2741 min · 0.22 2025/26  GER-Bundesliga · 2743 min · 0.18
    5. 5 Arthur Atta FRA ITA-Serie A 2025/26 · 2557 min · 0.22 npG+A/90 · d = 0.37
      No later season in the corpus.

    Target

    Maximilian Eggestein

    MF · age 30 · GER-Bundesliga 2025/26 · 3060 min · 0.11 npG+A/90 quality

    Nearest 5 at the same age

    5 nearest analogs and what followed
    1. 1 Aleix Febas ESP ESP-La Liga 2025/26 · 3160 min · 0.10 npG+A/90 · d = 0.17
      No later season in the corpus.
    2. 2 Julian Weigl GER GER-Bundesliga 2024/25 · 2881 min · 0.08 npG+A/90 · d = 0.36
      No later season in the corpus.
    3. 3 Marcelo Brozović CRO ITA-Serie A 2021/22 · 2937 min · 0.09 npG+A/90 · d = 0.40
      Followed by: 2022/23  ITA-Serie A · 1770 min · 0.28
    4. 4 Isaac Palazón Camacho ESP ESP-La Liga 2023/24 · 2791 min · 0.09 npG+A/90 · d = 0.40
      Followed by: 2024/25  ESP-La Liga · 2162 min · 0.24 2025/26  ESP-La Liga · 2248 min · 0.13
    5. 5 Lucas Ocampos ARG ESP-La Liga 2023/24 · 2871 min · 0.15 npG+A/90 · d = 0.41
      No later season in the corpus.

    Target

    Tom Bischof

    DF · age 21 · GER-Bundesliga 2025/26 · 1302 min · 0.22 npG+A/90 quality

    Nearest 5 at the same age

    5 nearest analogs and what followed
    1. 1 Manu Sánchez ESP ESP-La Liga 2020/21 · 976 min · 0.17 npG+A/90 · d = 0.63
      Followed by: 2021/22  ESP-La Liga · 2257 min · 0.10 2022/23  ESP-La Liga · 2124 min · 0.06 2023/24  ESP-La Liga · 1775 min · 0.16 2024/25  ESP-La Liga · 2634 min · 0.03
    2. 2 Ryan Sessegnon ENG GER-Bundesliga 2020/21 · 1574 min · 0.15 npG+A/90 · d = 0.68
      Followed by: 2021/22  ENG-Premier League · 1047 min · 0.18 2022/23  ENG-Premier League · 813 min · 0.21 2024/25  ENG-Premier League · 580 min · 0.50 2025/26  ENG-Premier League · 1823 min · 0.15
    3. 3 Hannes Behrens GER GER-Bundesliga 2025/26 · 1318 min · 0.12 npG+A/90 · d = 0.83
      No later season in the corpus.
    4. 4 Sael Kumbedi FRA GER-Bundesliga 2025/26 · 1804 min · 0.15 npG+A/90 · d = 0.88
      No later season in the corpus.
    5. 5 Juanlu Sánchez ESP ESP-La Liga 2023/24 · 1181 min · 0.10 npG+A/90 · d = 1.08
      Followed by: 2024/25  ESP-La Liga · 1722 min · 0.28 2025/26  ESP-La Liga · 1990 min · 0.12

    Target

    Finn Jeltsch

    DF · age 20 · GER-Bundesliga 2025/26 · 1511 min · 0.05 npG+A/90 quality

    Nearest 5 at the same age

    5 nearest analogs and what followed
    1. 1 Malick Thiaw GER GER-Bundesliga 2020/21 · 1452 min · 0.04 npG+A/90 · d = 0.15
      Followed by: 2022/23  ITA-Serie A · 1362 min · 0.01 2023/24  ITA-Serie A · 1619 min · 0.04 2024/25  ITA-Serie A · 1806 min · 0.00 2025/26  ENG-Premier League · 2965 min · 0.11
    2. 2 Noahkai Banks USA GER-Bundesliga 2025/26 · 1725 min · 0.08 npG+A/90 · d = 0.34
      No later season in the corpus.
    3. 3 Max Finkgräfe GER GER-Bundesliga 2023/24 · 1756 min · 0.04 npG+A/90 · d = 0.35
      Followed by: 2024/25  GER-2. Bundesliga · 811 min · 0.05 2025/26  GER-Bundesliga · 504 min · 0.14
    4. 4 Piero Hincapié ECU GER-Bundesliga 2021/22 · 1754 min · 0.09 npG+A/90 · d = 0.44
      Followed by: 2022/23  GER-Bundesliga · 2457 min · 0.06 2023/24  GER-Bundesliga · 1484 min · 0.10 2024/25  GER-Bundesliga · 2670 min · 0.09 2025/26  ENG-Premier League · 1792 min · 0.12
    5. 5 Mattia Viti ITA ITA-Serie A 2021/22 · 1491 min · 0.01 npG+A/90 · d = 0.51
      Followed by: 2022/23  FRA-Ligue 1 · 634 min · 0.05 2023/24  ITA-Serie A · 979 min · 0.06 2024/25  ITA-Serie A · 2572 min · 0.02

    Target

    Malick Thiaw

    DF · age 25 · ENG-Premier League 2025/26 · 2965 min · 0.11 npG+A/90 quality

    Nearest 5 at the same age

    5 nearest analogs and what followed
    1. 1 Nathan Collins IRL ENG-Premier League 2025/26 · 2975 min · 0.08 npG+A/90 · d = 0.20
      No later season in the corpus.
    2. 2 Micky van de Ven NED ENG-Premier League 2025/26 · 3041 min · 0.13 npG+A/90 · d = 0.20
      No later season in the corpus.
    3. 3 Marc Guéhi ENG ENG-Premier League 2024/25 · 3059 min · 0.13 npG+A/90 · d = 0.21
      Followed by: 2025/26  ENG-Premier League · 3150 min · 0.13
    4. 4 Gabriel Magalhães BRA ENG-Premier League 2021/22 · 3063 min · 0.13 npG+A/90 · d = 0.22
      Followed by: 2022/23  ENG-Premier League · 3409 min · 0.07 2023/24  ENG-Premier League · 3044 min · 0.11 2024/25  ENG-Premier League · 2363 min · 0.13 2025/26  ENG-Premier League · 2751 min · 0.19
    5. 5 Toti Gomes POR ENG-Premier League 2023/24 · 2772 min · 0.12 npG+A/90 · d = 0.28
      Followed by: 2024/25  ENG-Premier League · 2614 min · 0.04 2025/26  ENG-Premier League · 1424 min · 0.02

    Target

    Waldemar Anton

    DF · age 30 · GER-Bundesliga 2025/26 · 2880 min · 0.05 npG+A/90 quality

    Nearest 5 at the same age

    5 nearest analogs and what followed
    1. 1 Nico Elvedi SUI GER-Bundesliga 2025/26 · 2966 min · 0.05 npG+A/90 · d = 0.11
      No later season in the corpus.
    2. 2 Martin Valjent SVK ESP-La Liga 2024/25 · 2763 min · 0.07 npG+A/90 · d = 0.21
      Followed by: 2025/26  ESP-La Liga · 3308 min · 0.01
    3. 3 Florian Lejeune FRA ESP-La Liga 2020/21 · 3015 min · 0.04 npG+A/90 · d = 0.22
      Followed by: 2021/22  ESP-La Liga · 2699 min · 0.01 2022/23  ESP-La Liga · 2565 min · 0.09 2023/24  ESP-La Liga · 3327 min · 0.08 2024/25  ESP-La Liga · 3325 min · 0.09
    4. 4 Jeffrey Gouweleeuw NED GER-Bundesliga 2020/21 · 2835 min · 0.03 npG+A/90 · d = 0.25
      Followed by: 2021/22  GER-Bundesliga · 2576 min · 0.03 2022/23  GER-Bundesliga · 2795 min · 0.03 2023/24  GER-Bundesliga · 2593 min · 0.03 2024/25  GER-Bundesliga · 2944 min · 0.10
    5. 5 Patrick Mainka GER GER-Bundesliga 2023/24 · 3060 min · 0.04 npG+A/90 · d = 0.25
      Followed by: 2024/25  GER-Bundesliga · 3060 min · 0.05 2025/26  GER-Bundesliga · 3060 min · 0.09

    Target

    Jeremy Toljan

    DF · age 32 · ESP-La Liga 2025/26 · 3164 min · 0.10 npG+A/90 quality

    Nearest 5 at the same age

    5 nearest analogs and what followed
    1. 1 Catena ESP ESP-La Liga 2025/26 · 3071 min · 0.10 npG+A/90 · d = 0.12
      Followed by: 2026/27  ESP-La Liga · 450 min · 0.00
    2. 2 Patrick Mainka GER GER-Bundesliga 2025/26 · 3060 min · 0.09 npG+A/90 · d = 0.21
      No later season in the corpus.
    3. 3 Danilo BRA ITA-Serie A 2022/23 · 3184 min · 0.12 npG+A/90 · d = 0.28
      Followed by: 2023/24  ITA-Serie A · 2452 min · 0.05 2024/25  ITA-Serie A · 581 min · 0.05
    4. 4 Giovanni Di Lorenzo ITA ITA-Serie A 2024/25 · 3330 min · 0.09 npG+A/90 · d = 0.34
      Followed by: 2025/26  ITA-Serie A · 2276 min · 0.08
    5. 5 Jordi Alba ESP ESP-La Liga 2020/21 · 3025 min · 0.15 npG+A/90 · d = 0.48
      Followed by: 2021/22  ESP-La Liga · 2644 min · 0.25 2022/23  ESP-La Liga · 1419 min · 0.17

    * Corpus: player-seasons with at least 450 minutes in any fetched league — headline leagues 2020/21 → 2026/27, the other leagues 2024/25 → 2026/27; the target's own seasons are excluded. A path that ends early means the player left the covered leagues, not that the career ended.

    Player index

    Player index

    Every German-eligible player with a complete 2025/26 season in a covered league — 410 players — with the numbers behind the atlases. Names with a card link to it.

    410
    Table of 410 players
    PlayerPosAge ClubLeagueMin G+A / 90 adj.Style clusterNT
    Ragnar Ache FW 27 Köln GER-Bundesliga 1718 0.43 High-assist forwards
    Karim Adeyemi MF 23 Dortmund GER-Bundesliga 1195 0.45 High-scoring attacking midfielders NT
    Farid Alfa-Ruprecht MF 19 Bochum GER-2. Bundesliga 1226 0.14 Young low-minute midfielders
    Bastian Allgeier DF 23 Hannover 96 GER-2. Bundesliga 1105 0.01 Young low-minute defenders
    Nadiem Amiri MF 28 Mainz 05 GER-Bundesliga 2083 0.20 Everyday starting midfielders, low scoring output NT
    Kofi Amoako MF 20 Dresden GER-2. Bundesliga 2205 0.05 Everyday starting midfielders, low scoring output
    Robert Andrich DF 30 Leverkusen GER-Bundesliga 2546 0.06 Everyday starting defenders NT
    Ilyas Ansah MF 20 Union Berlin GER-Bundesliga 1892 0.21 High-scoring attacking midfielders
    Waldemar Anton DF 29 Dortmund GER-Bundesliga 2880 0.05 Everyday starting defenders NT
    Shinta Appelkamp MF 24 Düsseldorf GER-2. Bundesliga 1834 0.12 Everyday starting midfielders, low scoring output
    Maximilian Arnold MF 31 Wolfsburg GER-Bundesliga 1859 0.19 Older rotation midfielders
    Jann-Fiete Arp MF 25 Odense DEN-Superliga 2262 0.12 Everyday starting midfielders, low scoring output
    Bright Arrey-Mbi DF 22 Braga POR-Primeira Liga 1829 0.01 Young low-minute defenders NT
    Simon Asta MF 24 Kaiserslautern GER-2. Bundesliga 730 0.08 Young low-minute midfielders
    Barış Atik FW 30 Magdeburg GER-2. Bundesliga 2859 0.25 High-minutes starting forwards
    Mehmet Aydin MF 23 BTSV GER-2. Bundesliga 2488 0.10 Everyday starting midfielders, low scoring output
    Tom Baack MF 26 Nürnberg GER-2. Bundesliga 951 0.09 High-card-rate midfielders
    Mike-Steven Bähre MF 29 Rheindorf Altach AUT-Bundesliga 2671 0.03 Everyday starting midfielders, low scoring output
    Elias Bakatukanda DF 21 Blau-Weiß Linz AUT-Bundesliga 1275 0.00 Young low-minute defenders
    Ridle Baku DF 27 RB Leipzig GER-Bundesliga 2504 0.12 High-assist defenders with high playing time NT
    Oliver Batista-Meier FW 24 Preußen Münster GER-2. Bundesliga 2166 0.18 High-minutes starting forwards
    Nick Bätzner MF 25 Paderborn 07 GER-2. Bundesliga 1239 0.10 High-card-rate midfielders
    Maximilian Bauer DF 25 Arminia GER-2. Bundesliga 1450 0.03 Young low-minute defenders
    Mika Baur MF 21 Paderborn 07 GER-2. Bundesliga 2656 0.12 Everyday starting midfielders, low scoring output NT
    Adrian Beck MF 28 Heidenheim GER-Bundesliga 868 0.17 Older rotation midfielders
    Finn Ole Becker MF 25 Nürnberg GER-2. Bundesliga 2271 0.11 Everyday starting midfielders, low scoring output
    Timo Becker DF 28 Schalke 04 GER-2. Bundesliga 1982 0.02 Everyday starting defenders
    Vitalie Becker MF 20 Schalke 04 GER-2. Bundesliga 1530 0.09 High-card-rate midfielders
    Hannes Behrens DF 20 Heidenheim GER-Bundesliga 1318 0.12 Young low-minute defenders
    Kevin Behrens FW 34 Lugano SUI-Super League 2232 0.17 Older forwards with moderate playing time
    Maximilian Beier MF 22 Dortmund GER-Bundesliga 2026 0.42 High-scoring attacking midfielders NT
    Marcel Beifus DF 22 Karlsruher GER-2. Bundesliga 813 0.07 Goal-scoring defenders
    Stefan Bell DF 33 Mainz 05 GER-Bundesliga 1039 0.14 Goal-scoring defenders
    Marcel Benger MF 27 Preußen Münster GER-2. Bundesliga 996 0.04 High-card-rate midfielders
    Mergim Berisha FW 27 Kaiserslautern GER-2. Bundesliga 627 0.22 Young low-minute forwards
    Jan-Niklas Beste MF 26 Freiburg GER-Bundesliga 1704 0.17 Everyday starting midfielders, low scoring output
    Filip Bilbija MF 25 Paderborn 07 GER-2. Bundesliga 1812 0.25 High-scoring attacking midfielders
    Tom Bischof DF 20 Bayern Munich GER-Bundesliga 1302 0.22 Goal-scoring defenders NT
    Yann Aurel Bisseck DF 24 Inter ITA-Serie A 1922 0.12 Goal-scoring defenders NT
    Leonardo Bittencourt MF 31 Werder Bremen GER-Bundesliga 615 0.15 High-card-rate midfielders
    Benjamin Boakye DF 20 Arminia GER-2. Bundesliga 1241 0.03 High-card-rate defenders
    Ben Bobzien MF 22 Dresden GER-2. Bundesliga 1153 0.21 High-minutes creative midfielders
    Lukas Boeder DF 28 Dresden GER-2. Bundesliga 1511 0.03 Older defenders
    Luca Bolay DF 23 Preußen Münster GER-2. Bundesliga 918 0.06 High-assist defenders with high playing time
    Marco Boras DF 23 WSG Tirol AUT-Bundesliga 2614 0.04 Everyday starting defenders
    Calvin Brackelmann DF 25 Paderborn 07 GER-2. Bundesliga 2034 0.07 Goal-scoring defenders
    Julian Brandt MF 29 Dortmund GER-Bundesliga 1606 0.37 High-scoring attacking midfielders
    Tim Breithaupt MF 23 Düsseldorf GER-2. Bundesliga 1120 0.06 High-card-rate midfielders
    Louis Breunig DF 21 BTSV GER-2. Bundesliga 503 0.05 High-card-rate defenders
    Maximilian Breunig FW 24 Magdeburg GER-2. Bundesliga 560 0.20 Young low-minute forwards
    Moritz Broschinski FW 24 Basel SUI-Super League 542 0.11 Duel-heavy rotation forwards
    Nathaniel Brown MF 22 Frankfurt GER-Bundesliga 2656 0.20 Everyday starting midfielders, low scoring output NT
    Marius Bülter FW 32 Köln GER-Bundesliga 1597 0.39 Older forwards with moderate playing time
    Lars Bünning DF 27 Dresden GER-2. Bundesliga 773 0.04 High-card-rate defenders
    Jonathan Burkardt FW 25 Frankfurt GER-Bundesliga 1336 0.47 Primary scorers NT
    Marnon Busch DF 30 Heidenheim GER-Bundesliga 1915 0.17 High-assist defenders with high playing time
    Kerim Calhanoglu DF 22 Vukovar 1991 CRO-HNL 1343 0.03 High-assist defenders with high playing time
    Emre Can DF 31 Dortmund GER-Bundesliga 621 0.04 Older defenders NT
    Jason Ceka MF 25 Dresden GER-2. Bundesliga 1172 0.10 Young low-minute midfielders
    Julian Chabot DF 27 Stuttgart GER-Bundesliga 2294 0.02 Everyday starting defenders
    Namory Noel Cissé FW 22 Dukla Prague CZE-First League 886 0.13 Young low-minute forwards
    Nnamdi Collins DF 21 Frankfurt GER-Bundesliga 1500 0.11 High-assist defenders with high playing time NT
    Amara Conde MF 28 Elversberg GER-2. Bundesliga 2122 0.06 Everyday starting midfielders, low scoring output
    Bambasé Conté MF 22 Elversberg GER-2. Bundesliga 1850 0.17 High-minutes creative midfielders NT
    Christian Conteh MF 25 BTSV GER-2. Bundesliga 1234 0.18 High-scoring attacking midfielders
    Sirlord Conteh MF 29 Heidenheim GER-Bundesliga 625 0.24 Older rotation midfielders
    Danny da Costa DF 32 Mainz 05 GER-Bundesliga 2695 0.12 Everyday starting defenders
    Abdoul Coulibaly DF 18 Werder Bremen GER-Bundesliga 2120 0.04 Young low-minute defenders
    Montrell Culbreath MF 17 Leverkusen GER-Bundesliga 736 0.14 Young low-minute midfielders
    Laurin Curda MF 23 Paderborn 07 GER-2. Bundesliga 2774 0.18 High-minutes creative midfielders
    Christoph Daferner FW 27 Dresden GER-2. Bundesliga 1137 0.25 Primary scorers
    Mahmoud Dahoud MF 29 Frankfurt GER-Bundesliga 716 0.32 High-minutes creative midfielders
    Lukas Daschner MF 26 St. Gallen SUI-Super League 2066 0.05 Everyday starting midfielders, low scoring output
    Jannik Dehm MF 29 Greuther Fürth GER-2. Bundesliga 2193 0.07 Everyday starting midfielders, low scoring output
    Kerem Demirbay MF 32 Eyüpspor TUR-Süper Lig 1410 0.03 Older rotation midfielders
    Diego Demme MF 33 Hertha BSC GER-2. Bundesliga 551 0.06 Older rotation midfielders
    Eren Dinkçi MF 23 Heidenheim GER-Bundesliga 1131 0.22 Young low-minute midfielders
    Pius Dorn DF 28 Luzern SUI-Super League 2678 0.07 Goal-scoring defenders
    Niklas Dorsch MF 27 Heidenheim GER-Bundesliga 2258 0.07 Everyday starting midfielders, low scoring output
    Tim Drexler DF 20 RB Salzburg AUT-Bundesliga 1069 0.00 Young low-minute defenders
    Younes Ebnoutalib FW 21 Elversberg GER-2. Bundesliga 1260 0.31 Primary scorers NT
    Johannes Eggestein FW 27 Austria Wien AUT-Bundesliga 2324 0.11 High-minutes starting forwards
    Maximilian Eggestein MF 28 Freiburg GER-Bundesliga 3060 0.11 Everyday starting midfielders, low scoring output
    Lilian Egloff MF 22 Karlsruher GER-2. Bundesliga 893 0.14 High-card-rate midfielders
    Elias Egouli DF 22 Düsseldorf GER-2. Bundesliga 1830 0.03 High-card-rate defenders
    Kevin Ehlers DF 24 BTSV GER-2. Bundesliga 2673 0.06 Everyday starting defenders
    Kennet Eichhorn MF 16 Hertha BSC GER-2. Bundesliga 1141 0.06 High-card-rate midfielders
    Julian Eitschberger MF 21 Hertha BSC GER-2. Bundesliga 1084 0.11 High-card-rate midfielders
    Soufiane El-Faouzi MF 23 Schalke 04 GER-2. Bundesliga 3004 0.10 Everyday starting midfielders, low scoring output
    Yannik Engelhardt MF 24 Gladbach GER-Bundesliga 2487 0.13 Everyday starting midfielders, low scoring output NT
    Luis Engelns MF 18 Paderborn 07 GER-2. Bundesliga 572 0.08 Young low-minute midfielders
    Mario Engels MF 31 Heracles Almelo NED-Eredivisie 1002 0.14 Older rotation midfielders
    Konrad Faber DF 27 Dresden GER-2. Bundesliga 1521 0.03 Older defenders
    Morgan Faßbender FW 26 Nieciecza POL-Ekstraklasa 1710 0.11 Young low-minute forwards
    Robin Fellhauer MF 27 Augsburg GER-Bundesliga 2799 0.14 Everyday starting midfielders, low scoring output
    Max Finkgräfe DF 21 RB Leipzig GER-Bundesliga 504 0.14 Goal-scoring defenders
    Kilian Fischer DF 24 Wolfsburg GER-Bundesliga 800 0.04 Young low-minute defenders
    Florian Flick MF 25 BTSV GER-2. Bundesliga 1874 0.08 Everyday starting midfielders, low scoring output
    Jonas Föhrenbach DF 29 Heidenheim GER-Bundesliga 2325 0.06 Everyday starting defenders
    Philipp Förster MF 30 Karlsruher GER-2. Bundesliga 1650 0.08 Older rotation midfielders
    Marcel Franke DF 32 Karlsruher GER-2. Bundesliga 2537 0.01 Older defenders
    Lukas Frenkert DF 25 BTSV GER-2. Bundesliga 1331 0.07 Goal-scoring defenders
    Chris Führich MF 27 Stuttgart GER-Bundesliga 1698 0.44 High-minutes creative midfielders NT
    Niclas Füllkrug FW 32 Milan ITA-Serie A 659 0.23 Older forwards with moderate playing time NT
    Noel Futkeu FW 22 Greuther Fürth GER-2. Bundesliga 2705 0.29 High-minutes starting forwards
    Tom Gaal DF 24 St. Gallen SUI-Super League 2652 0.03 Everyday starting defenders
    Noah Ganaus FW 24 Odense DEN-Superliga 2589 0.19 High-minutes starting forwards
    Linus Gechter DF 21 Hertha BSC GER-2. Bundesliga 2567 0.02 Everyday starting defenders
    Yannick Gerhardt MF 31 Wolfsburg GER-Bundesliga 1068 0.12 Older rotation midfielders
    Max Geschwill DF 24 Magdeburg GER-2. Bundesliga 584 0.02 High-card-rate defenders
    Benedikt Gimber DF 28 Heidenheim GER-Bundesliga 1436 0.03 High-card-rate defenders
    Matthias Ginter DF 31 Freiburg GER-Bundesliga 2833 0.13 Goal-scoring defenders
    Robert Glatzel FW 31 Hamburger SV GER-Bundesliga 612 0.41 High-assist forwards
    Serge Gnabry MF 30 Bayern Munich GER-Bundesliga 1219 0.54 High-scoring attacking midfielders NT
    Leon Goretzka MF 30 Bayern Munich GER-Bundesliga 1947 0.25 High-scoring attacking midfielders NT
    Luis Görlich DF 24 Bryne NOR-Eliteserien 497 0.02 High-card-rate defenders
    Lukas Görtler MF 31 St. Gallen SUI-Super League 2580 0.11 High-minutes creative midfielders
    Robin Gosens DF 31 Fiorentina ITA-Serie A 1881 0.12 Goal-scoring defenders
    Felix Götze DF 27 Paderborn 07 GER-2. Bundesliga 2397 0.05 Everyday starting defenders
    Mario Götze MF 33 Frankfurt GER-Bundesliga 886 0.09 Older rotation midfielders
    Adriano Grimaldi FW 34 Nürnberg GER-2. Bundesliga 903 0.18 Older forwards with moderate playing time
    Joel Grodowski FW 27 Arminia GER-2. Bundesliga 2023 0.20 High-minutes starting forwards
    Pascal Groß MF 34 Brighton ENG-Premier League 1636 0.22 Older rotation midfielders NT
    Maximilian Großer DF 24 Arminia GER-2. Bundesliga 2154 0.04 Everyday starting defenders
    Brajan Gruda MF 21 RB Leipzig GER-Bundesliga 753 0.35 High-minutes creative midfielders NT
    İlkay Gündoğan MF 34 Galatasaray TUR-Süper Lig 1387 0.13 Older rotation midfielders NT
    Christian Günter DF 32 Freiburg GER-Bundesliga 1547 0.11 High-assist defenders with high playing time
    Lasse Günther DF 22 Elversberg GER-2. Bundesliga 1612 0.13 High-assist defenders with high playing time
    Göktan Gürpüz MF 22 Gençlerbirliği TUR-Süper Lig 1920 0.10 Everyday starting midfielders, low scoring output
    Maxwell Gyamfi DF 25 Kaiserslautern GER-2. Bundesliga 2279 0.01 High-card-rate defenders
    Mikas Haas MF 19 Kaiserslautern GER-2. Bundesliga 2181 0.07 Everyday starting midfielders, low scoring output
    Janik Haberer MF 31 Union Berlin GER-Bundesliga 1646 0.09 Older rotation midfielders
    Alexander Hack DF 31 Zürich SUI-Super League 1119 0.04 Older defenders
    Felix Hagmann DF 21 Arminia GER-2. Bundesliga 919 0.02 Young low-minute defenders
    Tim Handwerker DF 27 Arminia GER-2. Bundesliga 1752 0.16 High-assist defenders with high playing time
    Mattes Hansen DF 21 Paderborn 07 GER-2. Bundesliga 1721 0.03 High-card-rate defenders
    Daniel Hanslik FW 28 Kaiserslautern GER-2. Bundesliga 1124 0.25 High-assist forwards
    Phil Harres FW 23 Holstein Kiel GER-2. Bundesliga 2204 0.24 High-minutes starting forwards
    Niklas Hauptmann MF 29 Dresden GER-2. Bundesliga 2223 0.16 High-minutes creative midfielders
    Kai Havertz FW 26 Arsenal ENG-Premier League 581 0.53 High-assist forwards NT
    Marcel Heister DF 33 Istra 1961 CRO-HNL 2105 0.03 Older defenders
    Maximilian Hennig DF 18 Hartberg AUT-Bundesliga 1954 0.05 High-assist defenders with high playing time
    Ricardo Henning DF 24 Vukovar 1991 CRO-HNL 630 0.01 Young low-minute defenders
    Philipp Hercher DF 29 Magdeburg GER-2. Bundesliga 1479 0.01 Older defenders
    David Herold DF 22 Karlsruher GER-2. Bundesliga 2852 0.09 High-assist defenders with high playing time
    Luca Herrmann MF 26 Dresden GER-2. Bundesliga 1045 0.09 Older rotation midfielders
    Jannis Heuer DF 26 Preußen Münster GER-2. Bundesliga 2389 0.05 Goal-scoring defenders
    Robin Heußer MF 27 BTSV GER-2. Bundesliga 2065 0.09 High-card-rate midfielders
    Moritz Heyer DF 30 Düsseldorf GER-2. Bundesliga 992 0.02 Older defenders
    Jonas Hofmann MF 33 Leverkusen GER-Bundesliga 1013 0.23 Older rotation midfielders
    Philipp Hofmann FW 32 Bochum GER-2. Bundesliga 2480 0.27 High-minutes starting forwards
    Lucas Höler FW 31 Freiburg GER-Bundesliga 2037 0.21 Older forwards with moderate playing time
    Fabian Holland DF 35 Darmstadt 98 GER-2. Bundesliga 674 0.02 Older defenders
    Benedict Hollerbach FW 24 Mainz 05 GER-Bundesliga 872 0.35 High-assist forwards
    Lewis Holtby MF 34 NAC Breda NED-Eredivisie 1927 0.14 Older rotation midfielders
    Jannes Horn DF 28 Rapid Wien AUT-Bundesliga 1570 0.01 Older defenders
    Jano ter Horst DF 23 Preußen Münster GER-2. Bundesliga 2821 0.05 Everyday starting defenders
    Timo Hübers DF 29 Köln GER-Bundesliga 675 0.04 Older defenders
    Arijon Ibrahimović MF 19 Heidenheim GER-Bundesliga 2169 0.17 Everyday starting midfielders, low scoring output
    Gabriel Isik DF 26 Nieciecza POL-Ekstraklasa 2456 0.03 Everyday starting defenders
    Gian-Luca Itter DF 26 Greuther Fürth GER-2. Bundesliga 1431 0.03 Young low-minute defenders
    Emmanuel Iyoha MF 27 Düsseldorf GER-2. Bundesliga 1863 0.06 Everyday starting midfielders, low scoring output
    Paul Jaeckel DF 27 Preußen Münster GER-2. Bundesliga 2433 0.03 High-card-rate defenders
    Vitaly Janelt MF 27 Brentford ENG-Premier League 1443 0.28 High-card-rate midfielders NT
    Tim Janisch DF 19 Nürnberg GER-2. Bundesliga 824 0.04 High-card-rate defenders
    Finn Jeltsch DF 19 Stuttgart GER-Bundesliga 1511 0.05 Young low-minute defenders NT
    Moritz Jenz DF 26 Wolfsburg GER-Bundesliga 1787 0.05 High-card-rate defenders
    Marco John MF 23 Greuther Fürth GER-2. Bundesliga 562 0.11 Young low-minute midfielders
    Anthony Jung DF 33 Freiburg GER-Bundesliga 526 0.04 Older defenders
    Sebastian Jung DF 35 Karlsruher GER-2. Bundesliga 2088 0.05 Older defenders
    Julian Justvan MF 27 Nürnberg GER-2. Bundesliga 2766 0.19 High-minutes creative midfielders
    Yusuf Kabadayı MF 21 Gaziantep TUR-Süper Lig 612 0.08 High-card-rate midfielders
    Anton Kade MF 21 Augsburg GER-Bundesliga 1743 0.22 High-scoring attacking midfielders
    Lennart Karl MF 17 Bayern Munich GER-Bundesliga 1281 0.40 High-minutes creative midfielders NT
    Thilo Kehrer DF 28 Monaco FRA-Ligue 1 2353 0.01 High-card-rate defenders
    Felix Keidel DF 22 Elversberg GER-2. Bundesliga 1330 0.07 High-assist defenders with high playing time NT
    Aaron Keller MF 21 Greuther Fürth GER-2. Bundesliga 1835 0.08 Everyday starting midfielders, low scoring output
    Thomas Keller DF 25 Dresden GER-2. Bundesliga 1194 0.07 Goal-scoring defenders
    Aljoscha Kemlein MF 20 Union Berlin GER-Bundesliga 1959 0.10 Everyday starting midfielders, low scoring output
    Marc-Oliver Kempf DF 30 Como ITA-Serie A 2326 0.13 Goal-scoring defenders
    Luca Kerber MF 23 Heidenheim GER-Bundesliga 682 0.19 High-card-rate midfielders
    Sebastian Kerk MF 31 Arka Gdynia POL-Ekstraklasa 2568 0.15 High-minutes creative midfielders
    Joshua Kimmich MF 30 Bayern Munich GER-Bundesliga 2280 0.27 High-minutes creative midfielders NT
    Sebastian Klaas MF 27 Paderborn 07 GER-2. Bundesliga 1355 0.15 High-minutes creative midfielders
    Felix Klaus MF 32 Greuther Fürth GER-2. Bundesliga 2310 0.21 High-scoring attacking midfielders
    Kai Klefisch MF 25 Darmstadt 98 GER-2. Bundesliga 2546 0.04 Everyday starting midfielders, low scoring output
    Colin Kleine-Bekel DF 22 St. Gallen SUI-Super League 893 0.03 High-card-rate defenders
    Florian Kleinhansl MF 24 Kaiserslautern GER-2. Bundesliga 507 0.09 Young low-minute midfielders
    Ansgar Knauff MF 23 Frankfurt GER-Bundesliga 1326 0.23 High-scoring attacking midfielders NT
    Robin Knoche DF 33 Arminia GER-2. Bundesliga 1000 0.06 Goal-scoring defenders
    Robin Koch DF 29 Frankfurt GER-Bundesliga 2833 0.09 Everyday starting defenders NT
    Sven Köhler DF 28 BTSV GER-2. Bundesliga 1349 0.03 High-card-rate defenders
    Mats Köhlert DF 27 Brøndby DEN-Superliga 1573 0.04 High-assist defenders with high playing time
    Dominik Kohr DF 31 Mainz 05 GER-Bundesliga 2338 0.06 High-card-rate defenders
    Niklas Kolbe DF 28 Hertha BSC GER-2. Bundesliga 968 0.02 Older defenders
    Mert Kömür MF 20 Augsburg GER-Bundesliga 1464 0.25 High-minutes creative midfielders
    Armel Bella Kotchap DF 23 Hellas Verona ITA-Serie A 1347 0.01 Young low-minute defenders
    Dominik Kother MF 25 Dresden GER-2. Bundesliga 453 0.09 Young low-minute midfielders
    Henri Koudossou DF 25 Nürnberg GER-2. Bundesliga 1173 0.08 Goal-scoring defenders
    Niko Koulis DF 26 Preußen Münster GER-2. Bundesliga 912 0.02 High-card-rate defenders
    Maurice Krattenmacher MF 19 Hertha BSC GER-2. Bundesliga 685 0.08 Young low-minute midfielders
    Frans Krätzig DF 22 RB Salzburg AUT-Bundesliga 1906 0.05 High-assist defenders with high playing time
    Tom Krauß MF 24 Köln GER-Bundesliga 1780 0.11 Everyday starting midfielders, low scoring output
    David Kubatta DF 21 WSG Tirol AUT-Bundesliga 1697 0.02 High-card-rate defenders
    Lukas Kübler DF 32 Freiburg GER-Bundesliga 1587 0.14 Goal-scoring defenders
    Nicolas-Gerrit Kühn MF 25 Como ITA-Serie A 665 0.18 Young low-minute midfielders
    Fabian Kunze MF 27 Kaiserslautern GER-2. Bundesliga 2578 0.02 High-card-rate midfielders
    Christopher Lannert DF 27 Arminia GER-2. Bundesliga 1556 0.06 High-card-rate defenders
    Lion Lauberbach FW 27 Mechelen BEL-Pro League 1866 0.20 Older forwards with moderate playing time
    Jamie Lawrence DF 22 WSG Tirol AUT-Bundesliga 2851 0.02 Everyday starting defenders
    Toni Leistner DF 34 Hertha BSC GER-2. Bundesliga 1902 0.03 Older defenders
    Jakob Lemmer MF 25 Dresden GER-2. Bundesliga 1682 0.16 High-scoring attacking midfielders
    Tim Lemperle FW 23 Hoffenheim GER-Bundesliga 1944 0.34 High-minutes starting forwards
    Cajetan Lenz MF 19 Bochum GER-2. Bundesliga 2181 0.05 High-card-rate midfielders
    Christopher Lenz DF 30 Düsseldorf GER-2. Bundesliga 670 0.05 Older defenders
    Enzo Leopold MF 25 Hannover 96 GER-2. Bundesliga 3027 0.09 Everyday starting midfielders, low scoring output
    Jamie Leweling MF 24 Stuttgart GER-Bundesliga 2367 0.40 High-minutes creative midfielders NT
    Enrique Lofolomo MF 25 Zulte Waregem BEL-Pro League 1313 0.09 High-card-rate midfielders
    Lars Lokotsch FW 29 Preußen Münster GER-2. Bundesliga 1094 0.17 Older forwards with moderate playing time
    Rafael Lubach MF 20 Nürnberg GER-2. Bundesliga 2125 0.11 High-card-rate midfielders
    Lars Lukas Mai DF 25 Lugano SUI-Super League 2691 0.01 Everyday starting defenders
    Arne Maier MF 26 Újpest HUN-NB I 459 0.05 Young low-minute midfielders
    Linton Maina MF 26 Köln GER-Bundesliga 1023 0.16 Young low-minute midfielders
    Patrick Mainka DF 30 Heidenheim GER-Bundesliga 3060 0.09 Everyday starting defenders
    Said El Mala FW 18 Köln GER-Bundesliga 1956 0.52 Primary scorers NT
    Jarzinho Malanga MF 19 Elversberg GER-2. Bundesliga 511 0.12 Young low-minute midfielders
    Maurice Malone FW 24 Sturm Graz AUT-Bundesliga 1567 0.08 Young low-minute forwards
    Max Marie MF 20 BTSV GER-2. Bundesliga 2499 0.07 Everyday starting midfielders, low scoring output
    Stefano Marino FW 21 Paderborn 07 GER-2. Bundesliga 1188 0.24 Young low-minute forwards
    Luca Marseiler MF 28 Darmstadt 98 GER-2. Bundesliga 1848 0.09 Older rotation midfielders
    Eric Martel MF 23 Köln GER-Bundesliga 2559 0.13 High-card-rate midfielders NT
    Roberto Massimo MF 24 Górnik Zabrze POL-Ekstraklasa 470 0.07 Young low-minute midfielders
    Jean-Manuel Mbom DF 25 Viborg DEN-Superliga 1591 0.06 High-assist defenders with high playing time
    Joshua Mees FW 29 Preußen Münster GER-2. Bundesliga 968 0.18 Older forwards with moderate playing time
    Jonas Meffert MF 30 Holstein Kiel GER-2. Bundesliga 1454 0.07 Older rotation midfielders
    Marvin Mehlem MF 27 Arminia GER-2. Bundesliga 1052 0.06 High-card-rate midfielders
    Levent Mercan DF 24 Fenerbahçe TUR-Süper Lig 1162 0.07 High-assist defenders with high playing time
    Marco Meyerhöfer DF 29 Preußen Münster GER-2. Bundesliga 718 0.02 Older defenders
    Falko Michel MF 24 Magdeburg GER-2. Bundesliga 2015 0.03 Everyday starting midfielders, low scoring output
    Sven Michel MF 35 Paderborn 07 GER-2. Bundesliga 791 0.12 Older rotation midfielders
    Maximilian Mittelstädt DF 28 Stuttgart GER-Bundesliga 2186 0.16 High-assist defenders with high playing time NT
    Tobias Mohr DF 29 Standard Liège BEL-Pro League 2286 0.08 Goal-scoring defenders
    Wael Mohya MF 16 Gladbach GER-Bundesliga 552 0.25 Young low-minute midfielders
    Monju Momuluh MF 23 Arminia GER-2. Bundesliga 2090 0.18 High-minutes creative midfielders
    Leandro Morgalla DF 20 Bochum GER-2. Bundesliga 2244 0.02 Everyday starting defenders
    Youssoufa Moukoko FW 20 FC Copenhagen DEN-Superliga 1204 0.20 Young low-minute forwards
    Lukas Mühl DF 28 FC Winterthur SUI-Super League 1060 0.01 Older defenders
    Andreas Müller MF 25 Karlsruher GER-2. Bundesliga 1210 0.06 High-card-rate midfielders
    Friedrich Müller DF 19 Dresden GER-2. Bundesliga 1101 0.01 Young low-minute defenders
    Marcus Müller FW 22 Holstein Kiel GER-2. Bundesliga 473 0.21 Duel-heavy rotation forwards
    Ruben Müller MF 19 Paderborn 07 GER-2. Bundesliga 1050 0.09 Young low-minute midfielders
    Tobias Müller DF 31 Magdeburg GER-2. Bundesliga 1882 0.01 Older defenders
    Reno Münz DF 19 Greuther Fürth GER-2. Bundesliga 2259 0.02 Everyday starting defenders
    Jamal Musiala MF 22 Bayern Munich GER-Bundesliga 683 0.37 High-minutes creative midfielders NT
    Gerrit Nauber DF 33 Go Ahead Eagles NED-Eredivisie 798 0.08 Goal-scoring defenders
    Paul Nebel MF 22 Mainz 05 GER-Bundesliga 2073 0.22 High-scoring attacking midfielders NT
    Luca Netz MF 22 Gladbach GER-Bundesliga 940 0.16 Young low-minute midfielders
    Maurice Neubauer MF 29 Hannover 96 GER-2. Bundesliga 2515 0.10 Everyday starting midfielders, low scoring output
    Florian Neuhaus MF 28 Gladbach GER-Bundesliga 930 0.12 Older rotation midfielders
    Niklas Niehoff MF 20 Holstein Kiel GER-2. Bundesliga 804 0.12 Young low-minute midfielders
    Julian Niehues MF 24 Heidenheim GER-Bundesliga 1383 0.16 Young low-minute midfielders
    Jona Niemiec FW 23 Odense DEN-Superliga 954 0.21 High-assist forwards
    Justin Njinmah FW 24 Werder Bremen GER-Bundesliga 1947 0.24 High-minutes starting forwards
    Noel Nkili MF 19 Hannover 96 GER-2. Bundesliga 2273 0.13 Everyday starting midfielders, low scoring output
    Felix Nmecha MF 24 Dortmund GER-Bundesliga 2176 0.17 Everyday starting midfielders, low scoring output NT
    Lukas Nmecha FW 26 Leeds United ENG-Premier League 1083 0.40 Young low-minute forwards
    Alexander Nollenberger MF 28 Magdeburg GER-2. Bundesliga 2532 0.10 Everyday starting midfielders, low scoring output
    Tim Oberdorf DF 28 Düsseldorf GER-2. Bundesliga 2797 0.02 Everyday starting defenders
    Tim Oermann DF 21 Sturm Graz AUT-Bundesliga 1007 0.02 Young low-minute defenders NT
    Francis Onyeka MF 18 Bochum GER-2. Bundesliga 2130 0.13 High-scoring attacking midfielders
    Aaron Opoku MF 26 BTSV GER-2. Bundesliga 530 0.09 Young low-minute midfielders
    Aaron Opoku DF 26 Kayserispor TUR-Süper Lig 1232 0.05 High-assist defenders with high playing time
    Louis Oppie MF 23 St Pauli GER-Bundesliga 1620 0.09 Young low-minute midfielders
    Patrick Osterhage MF 25 Freiburg GER-Bundesliga 1189 0.11 High-card-rate midfielders
    Assan Ouédraogo MF 19 RB Leipzig GER-Bundesliga 948 0.35 High-scoring attacking midfielders NT
    Dennis Owusu FW 24 Baník Ostrava CZE-First League 716 0.14 Duel-heavy rotation forwards
    Torge Paetow DF 29 Preußen Münster GER-2. Bundesliga 824 0.02 High-card-rate defenders
    Mats Pannewig MF 20 Bochum GER-2. Bundesliga 1772 0.06 High-card-rate midfielders
    Antonios Papadopoulos DF 25 Lugano SUI-Super League 2943 0.03 Goal-scoring defenders
    Merveille Papela MF 24 Darmstadt 98 GER-2. Bundesliga 1061 0.09 High-card-rate midfielders
    Felix Passlack MF 27 Bochum GER-2. Bundesliga 549 0.09 Older rotation midfielders
    Raul Paula MF 21 NAC Breda NED-Eredivisie 713 0.20 Young low-minute midfielders
    Julian Pauli DF 20 Dresden GER-2. Bundesliga 1793 0.03 Young low-minute defenders
    Aleksandar Pavlovic MF 21 Bayern Munich GER-Bundesliga 1462 0.19 Young low-minute midfielders NT
    Dženan Pejčinović FW 20 Wolfsburg GER-Bundesliga 1460 0.38 Primary scorers
    Patrick Pflücke MF 28 Charleroi BEL-Pro League 2341 0.20 High-minutes creative midfielders
    Amos Pieper DF 27 Werder Bremen GER-Bundesliga 1502 0.03 Older defenders
    Marvin Pieringer FW 25 Heidenheim GER-Bundesliga 1650 0.24 Young low-minute forwards
    Lukas Pinckert DF 25 Elversberg GER-2. Bundesliga 2536 0.01 Everyday starting defenders
    Rafael Pinto MF 17 Karlsruher GER-2. Bundesliga 1468 0.07 Young low-minute midfielders
    Ole Pohlmann FW 24 Rio Ave POR-Primeira Liga 1722 0.12 High-minutes starting forwards
    Finn Porath MF 28 Schalke 04 GER-2. Bundesliga 649 0.11 Older rotation midfielders
    Rico Preißinger MF 29 Preußen Münster GER-2. Bundesliga 1507 0.07 High-card-rate midfielders
    Grischa Prömel MF 30 Hoffenheim GER-Bundesliga 1758 0.30 High-scoring attacking midfielders
    Luca Raimund MF 20 Düsseldorf GER-2. Bundesliga 523 0.09 Young low-minute midfielders
    Nicolai Rapp DF 28 Karlsruher GER-2. Bundesliga 1869 0.01 High-card-rate defenders
    David Raum DF 27 RB Leipzig GER-Bundesliga 2553 0.20 High-assist defenders with high playing time NT
    Kenny Redondo MF 30 Kaiserslautern GER-2. Bundesliga 484 0.12 Older rotation midfielders
    Fabian Reese MF 27 Hertha BSC GER-2. Bundesliga 2799 0.24 High-minutes creative midfielders
    Lukas Reich MF 18 Greuther Fürth GER-2. Bundesliga 927 0.07 Young low-minute midfielders
    Rocco Reitz MF 23 Gladbach GER-Bundesliga 2627 0.12 Everyday starting midfielders, low scoring output NT
    Nicolai Remberg MF 25 Hamburger SV GER-Bundesliga 2880 0.08 Everyday starting midfielders, low scoring output
    Marco Rente DF 28 Groningen NED-Eredivisie 2264 0.11 High-assist defenders with high playing time
    Marco Richter MF 27 Darmstadt 98 GER-2. Bundesliga 2208 0.18 High-minutes creative midfielders
    Clemens Riedel DF 22 Espanyol ESP-La Liga 1396 0.05 High-card-rate defenders
    Sascha Risch DF 25 Dresden GER-2. Bundesliga 653 0.05 Young low-minute defenders
    Marlon Ritter MF 30 Kaiserslautern GER-2. Bundesliga 1913 0.14 Older rotation midfielders
    Lars Ritzka MF 27 St Pauli GER-Bundesliga 966 0.08 Older rotation midfielders
    Leon Robinson DF 24 Kaiserslautern GER-2. Bundesliga 1551 0.05 High-card-rate defenders
    Jannik Rochelt FW 26 Hannover 96 GER-2. Bundesliga 669 0.16 Young low-minute forwards
    Jannik Rochelt MF 26 Arminia GER-2. Bundesliga 998 0.16 High-minutes creative midfielders
    Merlin Röhl MF 23 Everton ENG-Premier League 682 0.18 Young low-minute midfielders NT
    Maximilian Rohr DF 30 Elversberg GER-2. Bundesliga 2534 0.07 Goal-scoring defenders
    Lasse Rosenboom DF 23 Holstein Kiel GER-2. Bundesliga 1683 0.04 High-card-rate defenders
    Max Rosenfelder DF 22 Freiburg GER-Bundesliga 492 0.04 Young low-minute defenders NT
    Alexander Rossipal DF 29 Dresden GER-2. Bundesliga 2345 0.15 High-assist defenders with high playing time
    Tom Rothe MF 20 Union Berlin GER-Bundesliga 1029 0.15 Young low-minute midfielders
    Antonio Rüdiger DF 32 Real Madrid ESP-La Liga 1490 0.05 Older defenders NT
    Stefano Russo MF 25 Arminia GER-2. Bundesliga 2303 0.07 Everyday starting midfielders, low scoring output
    Semih Sahin MF 25 Kaiserslautern GER-2. Bundesliga 2335 0.14 Everyday starting midfielders, low scoring output
    Fabio Di Michele Sanchez DF 22 BTSV GER-2. Bundesliga 1850 0.03 High-card-rate defenders
    Philipp Sander DF 27 Gladbach GER-Bundesliga 2445 0.06 Everyday starting defenders
    Leroy Sané MF 29 Galatasaray TUR-Süper Lig 2280 0.19 High-scoring attacking midfielders NT
    Sidi Sané FW 22 BTSV GER-2. Bundesliga 772 0.17 Young low-minute forwards
    Kevin Schade MF 23 Brentford ENG-Premier League 2745 0.33 High-scoring attacking midfielders NT
    Ron Schallenberg MF 26 Schalke 04 GER-2. Bundesliga 2792 0.03 Everyday starting midfielders, low scoring output
    Tjark Scheller DF 23 Paderborn 07 GER-2. Bundesliga 2649 0.03 Everyday starting defenders
    Derry Scherhant MF 22 Freiburg GER-Bundesliga 1301 0.26 High-scoring attacking midfielders NT
    Stefan Schimmer FW 31 Heidenheim GER-Bundesliga 820 0.44 Older forwards with moderate playing time
    Fabian Schleusener FW 33 Karlsruher GER-2. Bundesliga 2077 0.28 Older forwards with moderate playing time
    Keven Schlotterbeck DF 28 Augsburg GER-Bundesliga 2031 0.04 High-card-rate defenders
    Nico Schlotterbeck DF 25 Dortmund GER-Bundesliga 2520 0.14 Goal-scoring defenders NT
    Frederik Schmahl MF 22 Elversberg GER-2. Bundesliga 1086 0.13 Young low-minute midfielders
    Kenneth Schmidt DF 23 Düsseldorf GER-2. Bundesliga 1385 0.03 High-card-rate defenders
    Niklas Schmidt MF 27 Darmstadt 98 GER-2. Bundesliga 773 0.13 Older rotation midfielders
    Leon Schneider DF 25 Arminia GER-2. Bundesliga 1332 0.01 Young low-minute defenders
    Luca Schnellbacher FW 31 Elversberg GER-2. Bundesliga 603 0.33 High-assist forwards
    Paul Scholl DF 19 Karlsruher GER-2. Bundesliga 648 0.05 Young low-minute defenders
    Max Scholze DF 20 Estrela POR-Primeira Liga 729 0.01 Young low-minute defenders
    Jan Schöppner MF 26 Heidenheim GER-Bundesliga 2252 0.18 Everyday starting midfielders, low scoring output
    Jan Luca Schuler FW 26 Hertha BSC GER-2. Bundesliga 1140 0.29 Primary scorers
    Marvin Schulz MF 30 Preußen Münster GER-2. Bundesliga 827 0.15 High-card-rate midfielders
    Marvin Schulz MF 21 Preußen Münster GER-2. Bundesliga 452 0.06 Young low-minute midfielders
    Piet Scobel FW 20 Nürnberg GER-2. Bundesliga 811 0.17 Young low-minute forwards
    Christopher Scott MF 23 Antwerp BEL-Pro League 2195 0.16 High-scoring attacking midfielders
    Paul Seguin MF 30 Hertha BSC GER-2. Bundesliga 2167 0.05 Everyday starting midfielders, low scoring output
    Davie Selke FW 30 Başakşehir TUR-Süper Lig 1198 0.26 Duel-heavy rotation forwards
    Suat Serdar MF 28 Hellas Verona ITA-Serie A 1108 0.14 Older rotation midfielders
    Janni Serra FW 27 AGF DEN-Superliga 529 0.18 Young low-minute forwards
    Kevin Sessa MF 25 Hertha BSC GER-2. Bundesliga 714 0.08 High-card-rate midfielders
    Arne Sicker DF 28 Arminia GER-2. Bundesliga 854 0.07 High-assist defenders with high playing time
    Armindo Sieb FW 22 Mainz 05 GER-Bundesliga 548 0.33 Young low-minute forwards
    Jamil Siebert DF 23 Lecce ITA-Serie A 1701 0.04 Young low-minute defenders NT
    Tim Siersleben DF 25 Heidenheim GER-Bundesliga 1081 0.03 Young low-minute defenders
    Luca Sirch DF 26 Kaiserslautern GER-2. Bundesliga 2808 0.05 Everyday starting defenders
    Tim Skarke MF 28 Union Berlin GER-Bundesliga 623 0.20 Older rotation midfielders
    Steven Skrzybski MF 32 Holstein Kiel GER-2. Bundesliga 1180 0.12 Older rotation midfielders
    Dennis Srbeny MF 31 Greuther Fürth GER-2. Bundesliga 680 0.16 Older rotation midfielders
    Anton Stach MF 26 Leeds United ENG-Premier League 2370 0.28 Everyday starting midfielders, low scoring output NT
    Niklas Stark DF 30 Werder Bremen GER-Bundesliga 697 0.04 High-card-rate defenders
    Jonas Sterner DF 23 Dresden GER-2. Bundesliga 1465 0.07 High-assist defenders with high playing time
    Oliver Steurer DF 30 Ried AUT-Bundesliga 2880 0.01 Everyday starting defenders
    Jonah Sticker MF 21 Paderborn 07 GER-2. Bundesliga 813 0.05 Young low-minute midfielders
    Angelo Stiller MF 24 Stuttgart GER-Bundesliga 2743 0.18 Everyday starting midfielders, low scoring output NT
    Philipp Strompf DF 27 Bochum GER-2. Bundesliga 2307 0.01 Everyday starting defenders
    Niklas Süle DF 29 Dortmund GER-Bundesliga 486 0.10 Older defenders
    Klaus Suso MF 20 Düsseldorf GER-2. Bundesliga 1473 0.05 High-card-rate midfielders
    Jonathan Tah DF 29 Bayern Munich GER-Bundesliga 2018 0.09 Goal-scoring defenders NT
    Henok Teklab MF 26 OH Leuven BEL-Pro League 1632 0.10 Older rotation midfielders
    Semir Telalovic FW 25 Arminia GER-2. Bundesliga 473 0.21 Duel-heavy rotation forwards
    Lino Tempelmann MF 26 BTSV GER-2. Bundesliga 893 0.07 Young low-minute midfielders
    Malick Thiaw DF 23 Newcastle ENG-Premier League 2965 0.11 Goal-scoring defenders NT
    Jan Thielmann MF 23 Köln GER-Bundesliga 1540 0.18 Young low-minute midfielders NT
    Phillip Tietz FW 28 Mainz 05 GER-Bundesliga 1610 0.33 Older forwards with moderate playing time
    Steffen Tigges FW 27 Paderborn 07 GER-2. Bundesliga 1592 0.22 Duel-heavy rotation forwards
    Umut Tohumcu MF 20 Holstein Kiel GER-2. Bundesliga 868 0.12 High-card-rate midfielders
    Jeremy Toljan DF 30 Levante ESP-La Liga 3164 0.10 Everyday starting defenders
    Boris Tomiak DF 26 Hannover 96 GER-2. Bundesliga 2095 0.02 High-card-rate defenders
    Keke Topp FW 21 Werder Bremen GER-Bundesliga 638 0.31 Duel-heavy rotation forwards
    Jordan Torunarigha DF 27 Hamburger SV GER-Bundesliga 1962 0.02 Everyday starting defenders
    Idrissa Touré MF 27 Pisa ITA-Serie A 2279 0.06 Everyday starting midfielders, low scoring output
    Omar Traoré DF 27 Heidenheim GER-Bundesliga 1501 0.08 High-assist defenders with high playing time
    Nicolo Tresoldi FW 20 Club Brugge BEL-Pro League 2488 0.42 Primary scorers NT
    Philipp Treu DF 24 Freiburg GER-Bundesliga 2186 0.09 Everyday starting defenders NT
    Ohis Felix Uduokhai DF 27 Beşiktaş TUR-Süper Lig 1126 0.01 Older defenders
    Lukas Ullrich DF 21 Gladbach GER-Bundesliga 1305 0.03 Young low-minute defenders NT
    Lauren Ulrich MF 20 Magdeburg GER-2. Bundesliga 2671 0.09 Everyday starting midfielders, low scoring output
    Deniz Undav FW 29 Stuttgart GER-Bundesliga 2241 0.69 Primary scorers NT
    Josha Vagnoman DF 24 Stuttgart GER-Bundesliga 1587 0.14 High-assist defenders with high playing time NT
    Kevin Vogt DF 33 Bochum GER-2. Bundesliga 630 0.02 Older defenders
    Robert Wagner MF 22 Dresden GER-2. Bundesliga 1343 0.06 High-card-rate midfielders
    Hauke Wahl DF 31 St Pauli GER-Bundesliga 2592 0.08 Everyday starting defenders
    Luca Waldschmidt FW 29 Köln GER-Bundesliga 677 0.53 High-assist forwards
    Mika Wallentowitz MF 17 Schalke 04 GER-2. Bundesliga 507 0.09 Young low-minute midfielders
    Marvin Wanitzek MF 32 Karlsruher GER-2. Bundesliga 3060 0.21 High-scoring attacking midfielders
    Kjell-Arik Wätjen MF 19 Bochum GER-2. Bundesliga 1250 0.08 Young low-minute midfielders
    Nelson Weiper FW 20 Mainz 05 GER-Bundesliga 558 0.23 Young low-minute forwards NT
    Jannes Wieckhoff DF 24 Heracles Almelo NED-Eredivisie 849 0.02 Young low-minute defenders
    Paul Will MF 26 Greuther Fürth GER-2. Bundesliga 1315 0.04 Young low-minute midfielders
    Marten Winkler MF 22 Hertha BSC GER-2. Bundesliga 2144 0.21 High-minutes creative midfielders
    Florian Wirtz MF 22 Liverpool ENG-Premier League 2378 0.28 Everyday starting midfielders, low scoring output NT
    Maximilian Wittek DF 29 Bochum GER-2. Bundesliga 2452 0.10 High-assist defenders with high playing time
    Marius Wolf MF 30 Augsburg GER-Bundesliga 1019 0.16 Older rotation midfielders
    Nick Woltemade FW 23 Newcastle ENG-Premier League 1902 0.44 High-minutes starting forwards NT
    Marius Wörl MF 21 Arminia GER-2. Bundesliga 2068 0.06 Everyday starting midfielders, low scoring output
    Robin Yalçın DF 31 Eyüpspor TUR-Süper Lig 1625 0.01 Older defenders
    Aaron Zehnter DF 20 Wolfsburg GER-Bundesliga 1456 0.09 Goal-scoring defenders
    Philipp Ziereis DF 32 Greuther Fürth GER-2. Bundesliga 2469 0.02 Older defenders
    Matthias Zimmermann DF 33 Düsseldorf GER-2. Bundesliga 1111 0.01 Older defenders
    Tom Zimmerschied MF 26 Elversberg GER-2. Bundesliga 2742 0.19 High-minutes creative midfielders

    * 2025/26 season, at least 450 minutes; the club is the one with the most minutes that season. NT = national-team call-up 2024–26.

    Download the tables

    Download the tables

    The tables behind this report, exactly as the pipeline produced them, committed to the public repository. An analyst can take these and work from them directly, not only from the pictures above.

    • Every player found in the pool, one row per player, before any season's numbers are attached. pool.parquet
    • Players per million people, one row per country — the number behind the very first slide. per_capita.parquet
    • The five-number season vector for every covered player, one file per position group (forwards, midfielders, defenders). features_FW.parquet · features_MF.parquet · features_DF.parquet
    • Production by country, position group and age band, the numbers behind the international comparison. cohorts.parquet
    • Youth minutes at home, the age and route of the move abroad, how exports fare, and where they land — every number behind the pathway exhibits, in one file. pathways.json
    • Season-by-season counts of home-nation players in Europe's five biggest leagues, back to the start of the fetched history. big5_history.parquet
    • Every season row this pipeline has fetched, for every league and nationality it covers — the raw table everything else in this report is built from. fbref_players.parquet
    • How each of the five season numbers contributes to the style and quality maps. pca_loadings.parquet
    • How much the top players change when a league's strength is nudged up or down. sensitivity.parquet
    • The three new numbers behind the why-the-train-left funnel: club breadth of youth minutes, the league's own age structure, and the age at a player's first move abroad. pipeline_facts.json
    • FBref’s playing-time and miscellaneous tables for every fetched league-season: starts, minutes per start, substitute appearances, on-off, crosses, interceptions, tackles won, fouls. fbref_roles.parquet
    • Every player in the pool as one row — the table behind the searchable list — with production, rank in his position group, playing-time split and role counts. pool_table.json
    • The history seasons of the home, peer and stepping-stone leagues back to the start of the fetched history, the rows behind the player atlas’s careers. fbref_history.parquet
    • Where the pool moved between the two seasons: each player’s rung in each, the move between them, and minutes by rung. season_changes.json

    How it is built, validated and where it stops

    Data sources

    From raw tables to a feature vector

    One 2025/26 player-season, traced from its raw FBref row to the five-number vector the rest of this chapter builds on: Jeremy Toljan, the German player with the most 2025/26 minutes among those who cleared the inclusion floor.

    Jeremy Toljan: raw row and feature row
    Raw FBref row, 2025/26
    ColumnValue
    leagueESP-La Liga
    season2025-2026
    teamLevante
    playerJeremy Toljan
    nationGER
    posDF
    born1994
    age30
    mp37
    min3164
    gls1
    ast4
    pk0
    crdy8
    crdr0
    Feature row after the pipeline
    FeatureRaw ShrunkQuality-adjusted Z-score
    npg_p900.0280.029 0.0230.06
    ast_p900.1140.098 0.0791.86
    min_share0.9500.950 0.9501.53
    age30.00030.000 30.0000.98
    cards_p900.2280.231 0.2310.11

    Six wrangling checks turn the raw rows above into the pool used everywhere else in this report, recomputed on every run:

    The full log, with the recorded pipeline incidents, is in the data-quality log below.

    Every position group shares the same five-number vector (spec §5): a raw column becomes a per-90 rate, shrunk toward its league-season median (Efron and Morris, 1975), then multiplied by the league quality projection.

    Five candidates considered for the 2025/26 vector and what the data said about each, corpus-wide (every fetched nationality, the same population the rest of this chapter describes):

    CandidateStatistic ValueDecision
    gls_p90Correlation with npg_p900.973Replaced by npg_p90
    mpCorrelation with minutes played0.844Replaced by minutes share
    crdr_p90Share of player-seasons with zero red cards0.854Folded into cards
    ageSpread of median goals + assists per 90 across age bands (max − min band)0.028Kept
    bornShare of player-seasons missing a birth year0.003Kept — required for the player key

    Despite the high correlation, goals and non-penalty goals diverge for the players who take penalties: Nabil Touaizi (POR-Primeira Liga, 100 %); Yohan Croizet (HUN-NB I, 100 %); Luca Zuffi (SUI-Super League, 100 %). Appearances (mp) correlate strongly with minutes but not perfectly — a substitute cameo counts the same as 90 minutes started, which is why minutes share, not appearances, measures playing time here. Median goals + assists per 90 by age band runs from 0.147 (30+) – 0.175 (23-25).

    The picture behind league adjustment: the same raw rate reads very differently depending on the league it was earned in.

    Small multiples: the five raw per-90 features' distributions by league, boxplots per league, the Bundesliga highlighted, 7 leagues shown.

    What shrinkage does to a low-minute player: at the inclusion floor the league median still carries most of the weight; Nelson Weiper's rate moves the most of any German-eligible player this season.

    Scatter of raw vs shrunk non-penalty goals per 90 against minutes for German-eligible players, with the shrinkage weight on the league median as a function of minutes overlaid.

    League multipliers (quality projection)

    npG/90_quality = npG/90_shrunk × m_league

    LeagueMultiplier
    ENG-Premier League1.000
    ITA-Serie A0.856
    ESP-La Liga0.807
    GER-Bundesliga0.788
    FRA-Ligue 10.666
    POR-Primeira Liga0.630
    BEL-Pro League0.573
    NED-Eredivisie0.510
    TUR-Süper Lig0.484
    GER-2. Bundesliga0.473
    POL-Ekstraklasa0.438
    CZE-First League0.434
    NOR-Eliteserien0.374
    DEN-Superliga0.371
    SUI-Super League0.293
    AUT-Bundesliga0.268
    HUN-NB I0.265
    CRO-HNL0.249
    SVK-Super Liga0.217

    Method: uefa_coefficient. ClubElo unavailable at run time (HTTP error); fell back to Wikipedia's UEFA men's association coefficient, current 5-year ranking (2022–23–2026–27 seasons). tier-1 multiplier = coef[country] / max(coef); tier-2 multiplier = 0.6 * tier-1 multiplier of the same country (stated assumption, not derived from data). Strongest tier-1 country = 1.00. The sensitivity analysis below shows the ranking's robustness to ±20 % on any one multiplier.

    League strength: two estimates

    A season in one league is not automatically worth the same as a season in another: goals and assists come easier in some competitions than others. This section works out an exchange rate between leagues by watching the same players before and after they change league, the way a manager judges a new signing by how his output changes at the new club.

    Full method, figures and diagnostics

    How much is a Bundesliga season worth in Premier League terms? The UEFA multiplier above answers that from countries' continental results; this model answers the same question from the players who actually changed leagues.

    Movers — 2125 players observed in at least two leagues across 8108 qualifying player-seasons — anchor the model, since only a player's own before/after change of league separates their level from the league's scoring environment. A hierarchical Poisson model of non-penalty goals plus assists per 90 (Gelman et al., 2013) fits a league effect and a player effect together, sampled with NUTS (Hoffman and Gelman, 2014) in PyMC (Abril-Pla et al., 2023) and diagnosed with ArviZ (Kumar et al., 2019). Partial pooling keeps the league effects regularised while leaving player effects close to unpooled, the same within-subject logic behind plus-minus and RAPM ratings elsewhere in team sports (Kharrat, McHale and Peña, 2020; Hvattum, 2019).

    Dot and 90 % HDI of the model's league-strength multiplier m_L per league, sorted, with each league's UEFA multiplier as a hollow marker.

    In these terms, a Bundesliga season converts to 0.78 of a Premier League one (90 % HDI 0.74–0.81).

    Leaguem_L (median) 90 % HDITransitions UEFA
    ENG-Premier League1.000 1.000–1.000 588 1.000
    ITA-Serie A0.935 0.890–0.981 569 0.856
    ESP-La Liga0.908 0.859–0.953 435 0.807
    FRA-Ligue 10.810 0.772–0.848 672 0.666
    GER-Bundesliga0.777 0.741–0.814 588 0.788
    HUN-NB I0.743 0.625–0.864 35 0.265
    POR-Primeira Liga0.721 0.680–0.762 350 0.630
    BEL-Pro League0.671 0.637–0.710 474 0.573
    CZE-First League0.665 0.585–0.749 64 0.434
    TUR-Süper Lig0.660 0.625–0.696 472 0.484
    POL-Ekstraklasa0.659 0.599–0.729 131 0.438
    AUT-Bundesliga0.657 0.576–0.729 80 0.268
    DEN-Superliga0.635 0.576–0.702 117 0.371
    GER-2. Bundesliga0.600 0.555–0.645 230 0.473
    NED-Eredivisie0.597 0.567–0.632 387 0.510
    CRO-HNL0.597 0.525–0.671 64 0.249
    SUI-Super League0.597 0.538–0.649 128 0.293
    NOR-Eliteserien0.574 0.507–0.639 64 0.374

    Refit on seasons before 2025/26, the model predicts each mover's first 2025/26 row after a league change — 863 such moves — against two baselines: the same rate as before, and that rate scaled by the ratio of UEFA multipliers. This is the same population CIES Football Observatory's expatriate-player reports track (Poli, Ravenel and Besson, 2024).

    MethodLog predictive density MAE (rate)
    Same rate as before −2.628 0.137
    Rate × UEFA ratio −2.734 0.151
    Model −2.174 0.127

    Against 18 leagues in common, the model's medians and the UEFA multipliers correlate at Spearman's rho = 0.74.

    • HUN-NB I: model rank 6 vs UEFA rank 17 (m_L 0.74 vs multiplier 0.27).
    • NED-Eredivisie: model rank 15 vs UEFA rank 8 (m_L 0.60 vs multiplier 0.51).
    • NOR-Eliteserien: model rank 18 vs UEFA rank 13 (m_L 0.57 vs multiplier 0.37).

    R-hat ≤ 1.003, minimum bulk ESS 1224, 0 divergent transitions across 8108 player-seasons from 2125 movers; fit in 203 s.

    Posterior predictive check

    Observed vs. replicated non-penalty goals plus assists per player-season (Vehtari, Gelman and Gabry, 2017): 15 % vs 14 % share of zeros, mean 4.45 vs 4.45, 90th percentile 11.00 vs 10.85.

    Bar chart comparing the observed and posterior-predictive-replicated distribution of non-penalty goals plus assists per player-season, grouped 0/1/2/3/4/5+.

    What the movers do not show: they are not a random sample — players tend to move up when they are good and down when they are older — so the within-player contrast describes the league difference for the kind of player who moves, and the age term absorbs only the part of that selection that is age. The interval is the model's uncertainty, not the selection's.

    The report's rankings keep the UEFA-coefficient multiplier throughout; the model above is shown alongside it as a check on that multiplier's own assumption — that continental results track player-level strength — not as a replacement for it.

    Three models, one task, five seasons

    Here we ask a simple question of five different methods: given a player's numbers this season, how well can each one guess his numbers next season. Each method is tested only on seasons it has not already seen, the way a scout's judgement only really counts for what he predicts before a season starts, not after it has finished.

    Full method, figures and diagnostics

    What does a player's season tell us about the next one, given where he plays, how old he is and — for exports — at what age he moved? In model terms: predict a player's league-adjusted production next season (non-penalty goals plus assists per 90, quality-adjusted) from this season's numbers, for every player-season pair with at least 450 minutes in both seasons, every nationality in the corpus.

    Evaluated by rolling-origin cross-validation (Hyndman and Athanasopoulos, 2021): for each of 5 target seasons in turn, every model trains only on pairs whose target season came earlier and is tested on that season's pairs — the same discipline a forecaster uses when the future is genuinely unknown at fit time, and what makes the per-season table below a real "performance over time" read rather than one blended number. Two baselines — persistence (next season = this season) and shrinkage to the league mean — sit alongside three fitted models sharing the same eight features: a hierarchical Bayesian regression (target ~ Normal(μ, σ), partial pooling on league and player, NUTS, 2 chains × 400 draws per origin (Gelman et al., 2013)), a gradient-boosted regressor and a small multilayer perceptron (scikit-learn (Pedregosa et al., 2011), hidden layers 64/32 — a small MLP, not an embedding model: PyTorch is not part of this pipeline). The Bayesian model's training rows are subsampled to at most 2500 per origin to keep five origins' worth of fits inside the runtime budget; the other four models train on the full split. The target is adjusted with the multiplier of the league the player is in next season; the features only know this season's league, so a move is a change the models cannot see coming — a limitation shared by all five.

    Line chart of RMSE per target season, one line per model, persistence dashed.
    Model 2021/222022/232023/242024/252025/26 Pooled
    Persistence 0.0768 (0.054) 0.0782 (0.056) 0.0789 (0.056) 0.0787 (0.057) 0.0684 (0.048) 0.0751 (0.053)
    Shrinkage to league mean 0.1343 (0.104) 0.1293 (0.100) 0.1311 (0.098) 0.1271 (0.098) 0.1099 (0.089) 0.1225 (0.095)
    Hierarchical Bayesian 0.0715 (0.053) 0.0760 (0.054) 0.0722 (0.053) 0.0681 (0.052) 0.0714 (0.053)
    Gradient boosting 0.0723 (0.051) 0.0744 (0.051) 0.0698 (0.051) 0.0677 (0.051) 0.0706 (0.051)
    Small MLP 0.0794 (0.059) 0.0792 (0.057) 0.0735 (0.054) 0.0714 (0.054) 0.0753 (0.056)

    Each cell: RMSE (MAE), in league-adjusted npG+A per 90. The first origin's training set is empty by construction — the corpus's earliest feature season leaves no earlier target season to train on — so only the two baselines are reported there.

    The Bayesian model's 90 % predictive interval covered the observed value 91 % of the time, pooled across the 4 origins it was fit for (2022/23: 90 %, 2023/24: 90 %, 2024/25: 91 %, 2025/26: 93 %).

    By pooled RMSE, Gradient boosting wins (0.071 vs 0.075 for persistence, 6 % lower).

    The clearest season-to-season move in the winner's own RMSE is between 2023/24 and 2024/25 (0.005) — the kind of drift this rolling-origin table exists to surface.

    Dating the break and one forecast

    This section finds the two seasons when the count of home-nation players in Europe's five biggest leagues changed level for good — the rise and the fall — and puts a probability on each being the true turning point rather than an ordinary dip. It also makes one forecast for next season, as a demonstration of the method, not a prediction about any player.

    Full method, figures and diagnostics

    The series is modelled as a local level in state space (Durbin and Koopman, 2012): the log of the season count follows a Gaussian random walk (σ ~ HalfNormal(0.2)), plus two ordered step changes δ₁, δ₂ in the level at unknown seasons τ₁ < τ₂ — on the series back to 1990/91 one step is misspecified, since the count rises through the 1990s and falls after the 2000s plateau, and a single step lands on whichever change buys more likelihood. NUTS only samples continuous parameters, so the τ pair is not sampled directly — every ordered pair of candidate seasons at least 3 seasons from either end and from each other is marginalised out of the model with a single log-sum-exp potential, and each break's own posterior is recovered afterwards from the continuous draws, the standard move for a marginalised discrete parameter (Gelman et al., 2013); the changepoint idea itself is due to (Adams and MacKay, 2007), applied here to a batch, two-break setting. The report's "break" is the step that lowers the level; the other is the rise. A rolling-origin backtest (Hyndman and Athanasopoulos, 2021) refits the same local level without the step at each of 15 origins, forecasting one season ahead and scoring against the naive "same as last season" baseline — the honest forecaster's read, since no real origin knows in advance which side of a break it sits on. The one forecast below, from the same change-point-free model fitted on the full series, is a demonstration of the method on a count of players, not a statement about any player.

    Line chart of the Germany series with the change-point model's fitted level in a pale band, a vertical rule marking the most probable break season with its posterior probability, and the one-season forecast with its 90 % interval at the right edge, past a dashed divider.
    How to read it: the acid line is the observed count, the pale band the model’s fitted level; the dashed rules are the most probable rise and fall seasons with their posterior probabilities; past the divider on the right, the one-season forecast with its 90 % interval.

    For Germany, the model dates the break to 2000/01 (69 % posterior probability), a ×0.76 (0.65–0.98, 90 % HDI) change in the level; the random walk's own innovation scale is σ = 0.033.

    • 2000/01: 69 %
    • 2001/02: 6 %
    • 1999/00: 6 %

    The same model, fit separately for the two contrast countries:

    • France: 2023/24 (26 % posterior), ×0.93 (0.82–1.04).
    • Spain: 2001/02 (2 % posterior), ×1.02 (0.90–1.12). Rise: 1998/99 (23 %), ×1.00.

    One-step-ahead rolling-origin backtest of the plain local level (no change point) against the naive "same as last season", 15 origins from 2010/11 to 2024/25:

    OriginForecast season ActualModel median (90 % interval) Naive
    2010/112011/12164 152 (120–188)166
    2011/122012/13159 160 (127–197)164
    2012/132013/14179 161 (128–195)159
    2013/142014/15165 170 (138–210)179
    2014/152015/16161 167 (135–204)165
    2015/162016/17165 163 (131–200)161
    2016/172017/18162 164 (133–198)165
    2017/182018/19170 163 (132–197)162
    2018/192019/20159 166 (135–202)170
    2019/202020/21150 162 (131–195)159
    2020/212021/22164 156 (126–187)150
    2021/222022/23160 159 (131–195)164
    2022/232023/24176 159 (131–190)160
    2023/242024/25167 168 (136–204)176
    2024/252025/26161 168 (139–200)167

    Pooled across 15 origins: MAE 7.07 for the model against 8.60 for the naive baseline, 100 % of the 90 % intervals covered the observed value.

    The one forecast, for next season (2026/27), from the same change-point-free model fitted on the full series:

    CountrySeason Median90 % interval
    Germany2026/27162 134–195
    France2026/27210 182–242
    Spain2026/27283 248–319

    A demonstration of the method on a count of players, not a statement about any player.

    Change-point fit: R-hat ≤ 1.010, minimum bulk ESS 114, 16 divergent transitions across 31 seasons.

    Cross-country youth-minutes panel

    This section asks whether the pattern from the funnel above — countries that give young players more minutes at home tend to have a deeper pool in the strongest leagues — holds up across every country in the comparison set, not only the two shown earlier. Two seasons and a handful of countries is a small sample, so the range around the estimate is wide.

    Full method, figures and diagnostics

    For each of the 8 peer countries, the 2024/25 → 2025/26 average U21 share of domestic-league minutes (x) against the 2024/25 → 2025/26 average top-9 players per million (y) — one row per country. A Bayesian simple regression, y ~ Normal(α + β·x, σ), weakly informative priors (4 chains × 1000 draws (Abril-Pla et al., 2023)), answers the between-country question slide 3 asks: does a country with a higher average U21 share also have a deeper pool, on average (Gelman et al., 2013). Cross-checked against a plain pooled least-squares slope on the full two-season panel (numpy polyfit, ignoring country structure entirely, 1000 percentile-bootstrap resamples — statsmodels is not a dependency here), which should agree in sign. Two seasons per country (previous and metrics; the current season is partial and left out); a peer whose top flight FBref does not track is absent from the panel, which is why n can be below the peer count.

    Scatter of the panel with the between-country fitted line and its 90 % band.

    β = +13.94 per 10 percentage points of U21 share (90 % HDI −4.93–33.09), R² = 0.22; OLS on the same 8 country means lands close by, at +14.17 (1.46–33.69), and the pooled-panel OLS slope agrees in sign at +13.57 (5.36–20.82). n = 8; the interval is wide because the panel is small.

    R-hat ≤ 1.005, minimum bulk ESS 2182, 0 divergent transitions.

    A separate check: the same regression, but with a country random intercept fit on the full two-season panel instead of country means. Within-country changes across the two seasons carry no signal — β_within = +1.56 per 10 percentage points (90 % HDI −1.29–4.33), n = 16 country-seasons (R-hat ≤ 1.006, minimum bulk ESS 861, 0 divergent transitions; posterior-median country-intercept scale σ_country = 8.25). With only two seasons per country the intercept absorbs almost all of the between-country pattern the fit above isolates, leaving this estimate driven by season-to-season noise alone; reported here as a robustness check, not a second headline.

    Descriptive only: a country's average U21 share and its average per-capita count are shown together because they are the numbers on hand, not because one is claimed to produce the other.

    Panel rows (n = 16)
    CountrySeason U21 sharePer million
    POR2024/256.2 %27.35
    BEL2024/257.8 %22.99
    NED2024/2511.8 %17.35
    ESP2024/257.8 %9.38
    FRA2024/258.7 %5.35
    ENG2024/253.9 %4.00
    ITA2024/253.3 %3.58
    GER2024/254.7 %3.12
    POR2025/264.9 %25.19
    BEL2025/268.7 %21.46
    NED2025/2613.6 %20.69
    ESP2025/264.8 %9.54
    FRA2025/268.8 %5.79
    ENG2025/263.0 %3.60
    ITA2025/262.7 %3.41
    GER2025/266.2 %3.13

    What the gap is made of

    The gap between the home nation and a comparison country, in players per million, can be split into pieces that line up with three things this report already measures: how much young players play at home, how strong the domestic league is, and how old players are when they move abroad. This does not say which of the three causes the gap, only how much of it moves together with each one — the way a manager might note that a poor season lines up with an injury crisis without claiming the injuries alone explain it.

    Full method, figures and diagnostics

    Ridge regression (α = 1.00, standardised channels, converted back to original units) of top-9 players per million on three channels — U21 share of domestic minutes, domestic league strength (M2's m_L where the country's top flight is in that model's fitted set, else the UEFA-coefficient multiplier (every country in this run used the model estimate)) and median export age (recent entrants, or the all-time median for a country with none recently) — over the 8 peer countries with data on all three channels, metrics season. For one contrast country at a time, the fitted model's own prediction splits the gap exactly into one term per channel — the linear-model form of the Blinder-Oaxaca wage decomposition (Oaxaca, 1973; Blinder, 1973), applied here to a per-capita player count. Three linear channels means this split is Shapley-equivalent: the Shapley value of an additive term in a linear model equals its own coefficient's contribution, so no permutation machinery is implemented. The residual is whatever the three channels do not carry.

    Horizontal stacked bar per contrast country: three channel contributions plus the residual; whiskers show each channel's bootstrap interval.
    How to read it: the whole bar is the gap in players per million between the comparison country and Germany. Each segment is how much of that gap goes with one measured channel — youth minutes, league strength, export age — under the decomposition; the hatched remainder is what the three channels do not carry. A segment can be negative when the channel works the other way.
    ContrastChannel ContributionShare of gap 90 % interval
    France
    Gap (players per million): +2.66
    U21 minutes −1.55 −4.75 – +2.05
    League strength −1.68 −2.38 – −0.36
    Export age +4.26 +0.23 – +9.68
    Residual +1.63
    Spain
    Gap (players per million): +6.41
    U21 minutes +0.78 12 % −1.02 – +2.46
    League strength −6.67 −104 % −9.36 – −0.95
    Export age +2.13 33 % +0.34 – +4.80
    Residual +10.16

    Bootstrap 90 % intervals on each channel's contribution, 1000 resamples of the panel's rows (the model refit on each resample; the home/contrast countries' own values held fixed); the residual itself is not bootstrapped — it is the two countries' own observed counts minus the fitted gap.

    A decomposition of a correlation this panel happens to show, not a causal accounting; with n = 8 and three correlated national-level channels, the shares are indicative, not precise. A channel's share of the gap is only shown when the gap itself is at least 3 players per million — below that, a small denominator can send a share past 100 % in either direction; the contribution itself, in players per million, is always reported.

    Age at export

    Players who move abroad younger tend to end up producing more once they are there, but that is not necessarily because moving young helps a career: clubs are also more willing to take a chance on a player they already rate highly at a younger age. This section fits a curve to that pattern while trying to hold the strength of the player's original league fixed, but it cannot fully tell the two explanations apart.

    Full method, figures and diagnostics

    For every peer-nationality player (home nation included) whose first top-9-league season lies inside the fetched window and isn't censored (the same censoring rule as "Where do German players go when they leave?", reused here) — 691 players, ages 16–36 — age at that season is modelled against league-adjusted production over the player's first one or two top-9 seasons. f(age) is a natural cubic spline with knots at 19, 21, 23 and 25 (a plain quadratic below n = 150; the natural cubic spline branch was used here), alongside origin-league strength (the transfer-graph model, § League strength), position and a partially pooled country effect (Gelman et al., 2013), sampled with NUTS (Hoffman and Gelman, 2014), 4 chains × 1000 draws; every design column and the outcome were standardised before fitting, the youth-minutes panel's own lesson about raw-scale priors on differently-scaled covariates.

    Line chart: the fitted age-at-export curve with its 90 % band, home-nation exports as acid points against every other peer export in grey, and a rug of every export's age along the axis.
    How to read it: the horizontal axis is a player’s age in his first top-9 season; the vertical axis is his league-adjusted goals plus assists per 90 over the first two seasons there. The line is the model’s expected value at each age, the band its 90 % interval; a flat line means arriving later costs nothing measurable. Acid dots are German exports — hover for the name.
    AgeExpected G+A/90 (median)90 % HDI
    190.160.14 – 0.18
    210.150.13 – 0.17
    230.140.12 – 0.16
    250.130.11 – 0.15
    270.140.11 – 0.15

    β, per one-unit increase in origin-league strength (m_L): +0.07 (0.02–0.12).

    German exports' own country effect: +0.04 (0.01–0.06); German exports arrive at a median age of 21.

    The same model, fit again without origin-league strength: the country-effect scale (σ_n) is 0.282 with the league term in the model and 0.312 without it — what moves between the two is what the league term is absorbing.

    Leave-one-nation-out: excluding Germany's own 72 exports (n = 619 remaining) and refitting, the 21-vs-24 difference is +0.01 (0.00–0.03), against +0.02 in the full fit.

    Posterior predictive check

    Observed vs. replicated y (mean league-adjusted G+A/90 over the first two top-9 seasons): mean 0.15 vs 0.15, sd 0.11 vs 0.11, 10th percentile 0.03 vs 0.02, 90th percentile 0.30 vs 0.29.

    R-hat ≤ 1.004, minimum bulk ESS 1262, 0 divergent transitions across 691 players; fit in 20.2 s.

    What this model does not separate: the corpus is not a random sample of players who could have left later. Players who leave earlier tend to be the ones judged ready earliest — a selection effect the age curve mixes with any genuine development effect of arriving young, and this report does not try to tell the two apart.

    Bayesian shrinkage

    Per-90 rates of players with few minutes are shrunk towards the median of their league and season (players with at least 900 minutes) using the empirical Bayes formula (Efron and Morris, 1975), with K = 10 phantom matches expressed as 900 minutes:

    shrunk_rate = (events + K × league_median) / (minutes / 90 + K),   K = 10

    At 450 minutes (the inclusion floor) the league median carries 67 % of the weight; at 900 minutes the player's own rate and the median weigh the same. Minutes share and age are not shrunk.

    Goalkeepers are counted the same way as outfield players throughout this report, with one difference: because a goalkeeper's save numbers swing around a lot from game to game, the model needs a bigger sample of shots faced before it trusts a keeper's own numbers over the league average.

    Goalkeeper rates (chapter II's counter-example) use the same formula. GA/90 and saves/90 are shrunk toward their league-season median with the same K = 900 minutes, and GA/90 is then quality-adjusted by the league multiplier — a goal conceded in a stronger league counts less. Save percentage is shrunk the same way but against shots on target faced, not minutes: a single season's shot count sits far below K = 900, so save_pct_shrunk compresses hard toward the league median for almost every goalkeeper — a large gap in the raw, unshrunk save percentage is the more informative read there.

    PCA loadings

    One five-feature vector per position group (npg_p90, ast_p90, min_share, age, cards_p90), standardised, reduced to two components per projection. Style uses the shrunk rates; quality multiplies the rates by the league multiplier first.

    Loadings table
    GroupProjectionPC% variance npG/90A/90min shareagecards/90
    FW style PC1 25.2 % 0.533 0.215 0.651 0.430 −0.246
    FW style PC2 23.6 % −0.206 −0.271 −0.120 0.823 0.439
    FW quality PC1 28.9 % 0.636 0.380 0.482 0.217 −0.415
    FW quality PC2 24.9 % −0.108 −0.114 0.133 0.910 0.361
    MF style PC1 29.5 % 0.597 0.601 0.383 0.073 −0.361
    MF style PC2 23.2 % −0.245 −0.117 0.484 0.828 0.082
    MF quality PC1 30.0 % 0.590 0.608 0.382 0.133 −0.344
    MF quality PC2 24.2 % −0.244 −0.199 0.490 0.809 0.087
    DF style PC1 25.0 % 0.546 0.429 0.505 0.183 −0.480
    DF style PC2 21.1 % −0.343 −0.378 0.278 0.804 −0.128
    DF quality PC1 25.8 % 0.432 0.356 0.578 0.327 −0.496
    DF quality PC2 21.7 % −0.462 −0.375 0.104 0.797 −0.023

    Sensitivity analysis (±20 % multipliers)

    For each scenario the quality-adjusted ranking of German-eligible players within each position group was recomputed and compared with the baseline; "top-10" is the union of the 3 groups' own top tens (30 players at baseline). Of the 41 scenarios, 28 change nobody in that set; the largest churn is 5 (GER-Bundesliga multiplier -20%, mean rank shift 3.33 in the top twenty)*.

    Scenario table
    ScenarioDescription Top-10 overlapTop-10 churnMean Δ rank (top 20)
    baseline current multipliers from config/league_quality.yaml 30 / 30 0 0.00
    ENG-Premier League_minus20 ENG-Premier League multiplier -20% 27 / 30 3 1.57
    ENG-Premier League_plus20 ENG-Premier League multiplier +20% 28 / 30 2 0.78
    ITA-Serie A_minus20 ITA-Serie A multiplier -20% 30 / 30 0 0.53
    ITA-Serie A_plus20 ITA-Serie A multiplier +20% 28 / 30 2 0.70
    ESP-La Liga_minus20 ESP-La Liga multiplier -20% 30 / 30 0 0.00
    ESP-La Liga_plus20 ESP-La Liga multiplier +20% 29 / 30 1 0.12
    GER-Bundesliga_minus20 GER-Bundesliga multiplier -20% 25 / 30 5 3.33
    GER-Bundesliga_plus20 GER-Bundesliga multiplier +20% 25 / 30 5 2.23
    FRA-Ligue 1_minus20 FRA-Ligue 1 multiplier -20% 30 / 30 0 0.00
    FRA-Ligue 1_plus20 FRA-Ligue 1 multiplier +20% 30 / 30 0 0.00
    NED-Eredivisie_minus20 NED-Eredivisie multiplier -20% 30 / 30 0 0.00
    NED-Eredivisie_plus20 NED-Eredivisie multiplier +20% 30 / 30 0 0.15
    POR-Primeira Liga_minus20 POR-Primeira Liga multiplier -20% 29 / 30 1 0.03
    POR-Primeira Liga_plus20 POR-Primeira Liga multiplier +20% 30 / 30 0 0.00
    BEL-Pro League_minus20 BEL-Pro League multiplier -20% 29 / 30 1 0.20
    BEL-Pro League_plus20 BEL-Pro League multiplier +20% 30 / 30 0 0.13
    TUR-Süper Lig_minus20 TUR-Süper Lig multiplier -20% 30 / 30 0 0.00
    TUR-Süper Lig_plus20 TUR-Süper Lig multiplier +20% 30 / 30 0 0.03
    CZE-First League_minus20 CZE-First League multiplier -20% 30 / 30 0 0.00
    CZE-First League_plus20 CZE-First League multiplier +20% 30 / 30 0 0.00
    SVK-Super Liga_minus20 SVK-Super Liga multiplier -20% 30 / 30 0 0.00
    SVK-Super Liga_plus20 SVK-Super Liga multiplier +20% 30 / 30 0 0.00
    AUT-Bundesliga_minus20 AUT-Bundesliga multiplier -20% 30 / 30 0 0.00
    AUT-Bundesliga_plus20 AUT-Bundesliga multiplier +20% 29 / 30 1 0.03
    HUN-NB I_minus20 HUN-NB I multiplier -20% 30 / 30 0 0.00
    HUN-NB I_plus20 HUN-NB I multiplier +20% 30 / 30 0 0.00
    POL-Ekstraklasa_minus20 POL-Ekstraklasa multiplier -20% 29 / 30 1 0.03
    POL-Ekstraklasa_plus20 POL-Ekstraklasa multiplier +20% 30 / 30 0 0.00
    CRO-HNL_minus20 CRO-HNL multiplier -20% 30 / 30 0 0.00
    CRO-HNL_plus20 CRO-HNL multiplier +20% 30 / 30 0 0.00
    DEN-Superliga_minus20 DEN-Superliga multiplier -20% 30 / 30 0 0.00
    DEN-Superliga_plus20 DEN-Superliga multiplier +20% 30 / 30 0 0.00
    SUI-Super League_minus20 SUI-Super League multiplier -20% 29 / 30 1 0.03
    SUI-Super League_plus20 SUI-Super League multiplier +20% 30 / 30 0 0.00
    NOR-Eliteserien_minus20 NOR-Eliteserien multiplier -20% 30 / 30 0 0.00
    NOR-Eliteserien_plus20 NOR-Eliteserien multiplier +20% 30 / 30 0 0.00
    GER-2. Bundesliga_minus20 GER-2. Bundesliga multiplier -20% 28 / 30 2 0.90
    GER-2. Bundesliga_plus20 GER-2. Bundesliga multiplier +20% 29 / 30 1 1.23
    all_minus20 every league multiplier -20% 30 / 30 0 0.00
    all_plus20 every league multiplier +20% 30 / 30 0 0.00

    * Churn = baseline top-10 members that leave the set under the scenario; mean Δ rank = mean absolute rank change over the baseline top-20 union. Scenarios: baseline, every league ±20 % on its own, and all leagues ±20 % at once.

    The table above is fixed at the config multipliers; the panel below is the same German-eligible top ten made interactive — drag any league's slider (0.5×–1.5× of its default) and the ranking recomputes in the browser.

    # Player League q Vs. default

    Sources This is the offline sensitivity table above (§ Sensitivity analysis) made interactive: q = (npG/90_shrunk + A/90_shrunk) × m_league, recomputed client-side from the shrunk rates of every German-eligible metrics-season player, no server round-trip. The rank-change column compares each row's rank under the current sliders to its rank at the config defaults.

    Data-quality log

    8 recomputed checks · 6 recorded incidents

    Every wrangling decision that changed a count, with the count. The first block is recomputed on every run; the second is the incident record (dates and counts as recorded at the time).

    CheckCountWhat it counts
    Women's entries filtered0 entriesFBref country-page entries dropped for a surname ending in -ová (see Limitations).
    Namesakes in the pool56 playersActive pool players sharing a normalised name (e.g. father and son), disambiguated by club.
    Pool players without season tables6058 playersGerman professionals on FBref's country page who play in a league without season tables and carry no metrics.
    Split-season rows collapsed441 rowsPlayer-season-group rows merged into one after a mid-season transfer (minutes summed, rates minutes-weighted).
    Unmatched call-up names18 namesNational-team squad-table names that match no German-eligible row in the feature tables.
    Missing birth years0 rowsSeason-table rows of nation GER with no birth year, which cannot form a player_key.
    Unjoined goalkeeper rows12 rowsKeeper-page rows with no matching GK row in the season tables on (league, season, team, player_key); dropped from every goalkeeper exhibit.
    Bundesliga rows without a nationality2 rowsSeason-table rows in the Bundesliga where FBref records no nationality — the highest rate of any league in this pipeline. Every “own nationals” share reads that column as its numerator while the denominator keeps the league’s full minutes, so those shares are floors, not point estimates.
    • 2026-09-14 A stale FBref season index made soccerdata fetch the season-less URL, which FBref serves as the season in progress: nine leagues' 2025/26 tables were 2026/27 after four rounds. Fixed by checking the page's own heading against the requested season. (9 leagues, recorded)
    • 2026-09-14 FBref intermittently served a squads-only page (no season table yet) for a season still in progress. Fixed by a single refetch, in the same page-heading guard.
    • 2026-09-13 ClubElo's API answered 502 for the whole run; league multipliers fell back to UEFA association coefficients.
    • 2026-09-13 The Wikidata portrait query matched on name, citizenship and birth date only; seven portraits belonged to namesakes in other sports until an occupation filter was added. (7 portraits, recorded)
    • 2026-09-13 Slovakia's top flight is not on FBref at all; this report's Slovak exhibits rest entirely on players abroad.
    • 2026-09-14 The first out-of-sample comparison of the league-strength model applied the UEFA-multiplier baseline in the wrong direction and started both baselines from a raw previous-season rate (a zero-goal season predicted zero); caught in review. Corrected: multiplier ratio m_prev / m_new, baselines from the shrunk rate. The model's margin over the baselines shrank from about 3 nats to 0.5 and is the figure reported.

    Limitations of this analysis

    Leagues without metrics

    The pipeline fetches 19 competitions from FBref. 6058 of the 6990 German professionals found on FBref's country page play in a league without season tables and carry no metrics; they are listed by name and club only. The German second tier (2. Bundesliga) is fetched as a stepping-stone league, so a home player's first rung below the top flight is visible here, unlike for most home nations.

    Free-tier feature set

    The feature vector is five basic columns per 90 minutes: non-penalty goals, assists, minutes share, age and cards. No expected goals, no progressive passes, no tackles — the rule was one identical vector across every league in the corpus, and only the basic table is available for all of them. Defensive and creative contributions beyond assists are invisible to the map.

    National-team flag source

    The flag "called up 2024–26" is parsed from Wikipedia squad tables (2024–25 Nations League, 2026 FIFA World Cup, 2026 World Cup qualification, UEFA Euro 2024, UEFA European Under-21 Championship 2025) and matched on normalised name plus birth year. 65 of the 410 mapped players carry it. A squad table edit or a name variant can drop a call-up; the flag is a tag, not a cap count.

    Photo coverage

    719 of the 6990 pool players have a Wikimedia Commons portrait (Wikidata P18, matched on name, citizenship and birth date, occupation filtered to association football player) used on the site. Players without a portrait on the site show initials.

    Season split

    The headline per-capita count and every metric use the complete 2025/26 season; trajectories run 2024/25 → 2025/26; the club on a card is the 2026/27 club (season in progress at build time).

    League multipliers

    ClubElo was unreachable at run time, so the multipliers are UEFA association coefficients scaled to the strongest league = 1.00, and second-tier leagues are set to 0.6 × the first tier of the same country by assumption. The club-strength proxy in chapter II is the club's goals-scored percentile within its league, not an Elo rating. The sensitivity table shows how far a ±20 % error in any one multiplier moves the German ranking.

    Export origins from recent entrants only

    The origin league of an export is known only when the season before the first top-9 season was fetched: 2020/21 onwards for the headline leagues, 2024/25 onwards for the peer domestic leagues. Origin shares and the recent export age are therefore computed over players whose first top-9 season is 2025/26 or 2026/27; earlier entrants count towards the full export age but not the origin mix, and a first appearance already in 2020/21 is censored (the censored share is shown).

    Player identity

    FBref's season tables carry no player id, so players are joined on normalised name plus birth year across leagues and seasons; two players sharing both would collapse into one. A mid-season transfer produces two club rows that are collapsed into one minutes-weighted row before ranking.

    Women's entries and the -ová heuristic

    FBref's country page mixes men's and women's competitions. Entries whose surname ends in -ová were dropped from the pool; a woman with a different surname ending would survive the filter, and a man with that ending would not. The suffix is specific to Czech feminine surnames, so for a nation whose naming convention doesn't use it (English, for one) the filter catches close to none of the contamination it targets; the "Women's entries filtered" count in the data-quality log below says how many it caught this run.

    No market values, no scouting

    Transfer fees, market values, video and scouting reports are outside the public sources used here. The map describes statistical footprints and counts; selection and development decisions require the federation's own data and expertise, which this method does not have.

    No event or tracking data

    Every feature here is a season aggregate from free FBref tables. The author's tracking work lives elsewhere: tactical-cz (broadcast-video player tracking for Czech football) and the hockey video PoC linked from hockey.bsandova.com. New columns enter in src/features.py::per90 and the feature list in config/feature_definitions.yaml.

    Validation & robustness

    Each model in this pipeline carries its own validation next to where it is described; this section collects one headline diagnostic from each as it lands. So far:

    Reproducibility

    The full pipeline is public: github.com/sandovabarbora/czefootball-player-pool-atlas. MIT licence. From a clean clone, uv sync && make restore-snapshot && make render renders this report from the committed data snapshot and make pages builds the site; make all refetches everything and runs the whole pipeline. Random seed 42 for every stochastic step (KMeans). Fetchers cache raw pages and are idempotent; the render step never touches the network.

    The processed tables also load into BigQuery unchanged: infra/bigquery/ has generated schemas, a bq load script and a key/unit contract for the model-output JSONs the tables don't cover. Run infra/bigquery/load.sh -n <dataset> <nation> to see the load commands without running them.

    How this was built

    Spec → plan → task agents → reviews → ledger · 25 rulings · 317 tests

    The report was produced with an agentic workflow: a written design spec, an implementation plan of small tasks, a fresh coding agent per task, a spec-compliance and code-quality review after each, a whole-branch review at the end. Every decision the controller made without the author is a dated ruling in a ledger — 25 across this edition and the last. The author wrote the framing, the cluster reads and the rulings; the agents wrote the code under 317 tests.

    Build-flow diagram Spec, then plan, then one task agent per task, a two-stage task review, up to five fix rounds, a whole-branch review, then deploy; the ledger on the side records every ruling — 25 so far, across 36 tasks. Spec Plan Task agent SONNET Task review spec + quality SONNET Fix rounds ≤ 5 SONNET Whole-branch review SONNET Deploy OPUS Ledger rulings: 25

    Implementers and reviewers: sonnet · controller: opus.

    Reviews are two-stage per task — spec compliance, then code quality — and every review's findings are written into the ledger, not just its verdict: 40 lines mentioning a review across the 36 tasks of this edition and the last.

    Spec: design · plan: tasks · ledger: rulings.

    Every edition's own design spec and ledger: v1 spec · v1 ledger · v1.2 spec · v1.2 ledger.

    What tracking data would add

    Everything above is built from season tables, because that is what exists for every league in the benchmark. The next layer of data — every player’s position ten times a second — exists for none of them publicly. So here is one match of it, from a different league, to show concretely what it answers that a season table cannot: not how many goals a player scored, but how he moves when he does not have the ball.

    How to read it: the pitch is drawn with both teams attacking left to right; every arrow is one off-ball run, from where it started to where it ended, coloured by the kind of run SkillCorner’s model labelled it. Bright arrows were passed to; thick ones were received. Pick a team, switch run types on and off, hover an arrow for the player and what came of it. Data: (SkillCorner, 2025), one A-League match, MIT licence; none of it enters any number in this report.

    For a federation this is the layer that turns “how many minutes” into “what kind of minutes”: whether a young winger’s runs are the runs the first team needs, whether an export’s physical output matches his new league, whether a squad presses as one. The atlas cannot see it and does not pretend to; the pipeline is built so that a tracking feed, when a federation has one, becomes another table beside the season tables rather than a different project.

    The methods below shaped this report's design. Each entry states what the method is, what this report took from it, and what was left out and why.

    One pairing here has no single citation behind it: the transfer-graph league-strength model (§ League strength) and the age-at-export curve (§ Age at export) are fit independently and joined only through origin-league strength as a covariate — a within-player league-identification model feeding a spline-in-age production curve is, to the author's knowledge, this report's own combination, not drawn whole from any one method below.

    Glossary

    Ten terms used in the sections above, each in one plain sentence with a football example.

    Per 90
    A rate scaled to a full match: a player with three goals in five matches, each played the full ninety minutes, has a rate of 0.6 goals per 90 — it lets a player who came on as a substitute be compared fairly with one who started every match.
    Minutes share
    How much of a club's available playing time a player actually got, out of every minute the club's matches could have offered that season; a player who played every minute of every match has a minutes share of 100 percent.
    Shrinkage
    A way of not trusting a small sample too much: a player with only a handful of matches has his numbers pulled part of the way toward the league's typical number, the way a manager waits for more than one good game before trusting that a young player's form is real.
    League multiplier / league strength
    A number saying how much a goal, an assist or a minute is worth in one league compared with another; a striker's goal in a weaker league counts for less once it is adjusted by that league's own multiplier — the same idea as judging a transfer by the level the player is coming from.
    Quality-adjusted
    A player's raw numbers after they have been multiplied by the league multiplier above, so a rate earned in a strong league and one earned in a weaker league can be compared on the same footing.
    Interval (90 percent)
    A range around a number that shows how sure the model is, not a single guess; a ninety percent interval means the model thinks the true value falls inside that range about nine times out of ten.
    Posterior
    What the model believes about a number after it has seen the data, expressed as a range of plausible values rather than one single figure; the probability attached to a break season in this report is a posterior probability.
    Out-of-sample
    Checking a method only on matches, players or seasons it was not shown while it was being built — the way a manager judges a scouting report by what actually happens once the player signs, not by how well the report described what had already happened.
    Cluster
    A group of players whose season numbers look similar to each other and different from other groups, found automatically from the data rather than assigned by hand; a cluster is a style label such as "high-volume scorers", not a formal position.
    Change point
    The point in a series of seasons where the level genuinely shifts to a new one and stays there, rather than just one unusually high or low season on its own; this report finds one for the count of home-nation players in Europe's biggest leagues.

    References

    What this is for

    A federation does not need another opinion about its pool. It needs the same measured questions asked every summer, answered the same way, with the uncertainty on the page — and a name for every player the staff ask about.

    This is one country, built from public data in the open. The pipeline takes a nationality code and a peer set; the same code produced the other editions linked below, and the comparison across them. With a federation’s own data — tracking, academy, medical — the tables get deeper and the questions stay the same.