9.37*players in Europe's 9 strongest leagues per million inhabitants, 2025/26 rosters
Per head, Norway ranks 3rd of 9 peer countries for players in Europe’s strongest leagues.
The reasons below are measured, not guessed: 1.6 regular under-21 starters per club at home against 2.5 in Denmark; and a first move abroad at 22.5.
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: 1 Norwegian player in the top-9 leagues against a peer median of 2.
A recent Norwegian export first reached a top-9 roster at a median age of 22; one from Czechia at 22.
Built from FBref, Wikipedia and Wikidata. Norway 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.
* 52 NOR players with ≥ 450 minutes in the UEFA top-9 leagues, 2025/26, per 5.5 M inhabitants; peers counted the same way. Methodology.
What to take from it
1
Norway's Big-5 presence: fall in 04/05 (×0.66), then rise in 21/22 (×1.32).
25 players with 450+ Big-5 minutes now, 26 at the 98/99 peak. 1 small peer (Czechia) ended in a fall.
2
One mechanism carries the gap to every peer it trails: youth minutes at home.
Against Denmark youth minutes at home carries 98 % of a 3.2-per-million gap.
3
The trend runs the right way: Norway's own under-21s went from 8 % to 11 % of home-league minutes in 6 seasons.
Over the same seasons Denmark 16 % → 15 % and +2.3 per million in the Big-5; Czechia 10 % → 6 % and -0.1 per million in the Big-5; Norway +2.7 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: Norway is out of line on how its exports fare once abroad.
Out of line: how its exports fare: a median 37 % of their club's minutes, 9 of 9.
Not the problem: minutes for its own under-21s at home: 11.5 % of league minutes and 1.6 regular under-21 starters per club, 4 of 8 among the peers (Denmark 15.3 %; Denmark 2.5 starters per club); the first move abroad at a median 22; the exporters move at 22–23; the home league itself: multiplier ×0.37, 3 of 9 among the peers; how many leave at all: 60 first moves in the covered seasons (Denmark 112); how many clubs the exports leave from: 22 % of the 54 players who went from the home league to a top-9 league since 20/21 left from Lillestrøm or Tromsø (Denmark: 31 % from its top two, 150 exports in all).
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 Norwegian 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.
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 Norway; 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.
Share of league minutes that went to players aged 21 or under
NOR 11.5 %DEN 15.3 %CZE 6.4 %
Clubs that gave those young players more than a tenth of their own playing time
NOR 12 of 16 clubsDEN 11 of 12 clubsCZE 9 of 16 clubs
Under-21 nationals who were regular starters, per club in the league
NOR 1.56 per club (25 players)DEN 2.50 per club (30 players)CZE 1.06 per club (17 players)
The regular-starter line is drawn at ten starts; at five it is 2.4 per club, at fifteen 0.9 (ten: 1.6).
The shortage is one of selection, not of late cameos: 11.2 % of the league’s starts went to them against 11.5 % of its minutes, so they are picked to start about as often as they are played at all. They are, though, taken off early — 75 minutes in a start against the league’s own 80.
Players in Europe's strongest leagues, for every million people
NOR 9.37DEN 12.58CZE 2.39
Around the 2004/05 season, the model finds a possible shift in the count of Norwegian players in Europe's strongest leagues, with 27 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 with both Denmark and Czechia is how strong the domestic league is. 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 Norwegian pool thin?
Norway ranks 3rd of 9 countries at 9.37 per million; Denmark leads at 12.58.
DEN
Denmark
12.58
CRO
Croatia
12.18
NOR
Norway
9.37
SUI
Switzerland
6.03
AUT
Austria
4.80
SVK
Slovakia
3.14
CZE
Czechia
2.39
HUN
Hungary
1.57
POL
Poland
1.23
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 9 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, 1 Norwegian players vs a peer median of 2.
Group
Cohort
NOR
Peer median
Defenders
23-25
1
2
Defenders
30+
2
2
Forwards
23-25
1
1
Forwards
30+
1
0.5
Midfielders
U22
2
1.5
How we know
As an analytics question In numbers: Norwegian 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 11.5 % of the home league’s minutes. In Denmark, the best of the peers, 15.3 %.
How sure is the link to the top? Across 8 countries, ten points more under-21 share go with +10.11 more top-9 players per million, but the interval (−1.69 to 23.26) includes zero; within countries, from one season to the next, the estimate is −0.16 (−2.53 to 2.17) — nothing. The share is a fact; its weight in the gap is not settled.
DEN
Denmark
15.3 %
HUN
Hungary
14.1 %
CRO
Croatia
14.0 %
NOR
Norway
11.5 %
AUT
Austria
9.3 %
POL
Poland
9.3 %
SUI
Switzerland
7.7 %
CZE
Czechia
6.4 %
SVK
Slovakia
—
Across countries
How we know
Across the 8 countries (country averages over both seasons), 10 points more U21 share go with +10.11 more top-9 players per million (−1.69–23.26).
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.
59 of 236 play abroad; 66 % in the 9 strongest leagues, 22 % moved sideways (to a league no stronger than the Norwegian one).
39
top-9 median multiplier 0.666
66 %
17
peer country league median multiplier 0.371
29 %
2
stepping stone median multiplier 0.473
3 %
1
other median multiplier 0.434
2 %
How we know
As an analytics question In numbers: destination-league tier of every Norwegian-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 Norwegian-eligible player's 2025/26 row; sideways = destination multiplier ≤ Norwegian league multiplier (league strength: two estimates, § Methodology).
A federation tracking this would watch the sideways-move share over time, not the raw count of players abroad.
Does leaving later cost anything?
No. Players who reach the top-9 at 21 and at 24 produce the same league-adjusted G+A per 90 over their first two seasons (difference +0.001, an interval that includes zero, n = 115). Norwegian exports arrive at a median age of 21.
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 Norwegian exports — hover for the name.
How we know
At 21: 0.14 (0.12–0.16); at 24: 0.14 (0.12–0.16); the difference +0.001 (−0.010–0.013).
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, 115 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 (quadratic) on league-adjusted production, given origin-league strength (§ Methodology), position and a country effect, 115 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?
Norwegian exports keep 37 % of their club's minutes (9th of 9).
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. Norwegian exports are the acid row. Further right means exports who play, not sit.Country-by-country figures
SVK
Slovakia n = 17
76 %
HUN
Hungary n = 15
57 %
CZE
Czechia n = 26
50 %
SUI
Switzerland n = 54
48 %
CRO
Croatia n = 47
46 %
DEN
Denmark n = 75
46 %
AUT
Austria n = 44
43 %
POL
Poland n = 45
41 %
NOR
Norway n = 52
37 %
How we know
A Eliteserien season converts to 0.57 of a Premier League one by the transfer-graph model (0.51–0.64), against 0.37 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.
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?
65 % of the 2026 FIFA World Cup squad plays in the 9 strongest leagues; Switzerland 88 %.
Top-9 %
Stepping %
Domestic %
Other %
Erling Haaland
Sander Berge
Leo Østigård
Kristian Thorstvedt
Fredrik Aursnes
Julian Ryerson
Torbjørn Heggem
Antonio Nusa
Alexander Sørloth
Kristoffer Ajer
Andreas Schjelderup
Jørgen Strand Larsen
Martin Ødegaard
David Møller Wolfe
Morten Thorsby
Oscar Bobb
Ørjan Nyland
Sander Tangvik
Henrik Falchener
Fredrik André Bjørkan
Patrick Berg
Jens Petter Hauge
Egil Selvik
MHMarcus Holmgren Pedersen
Thelo Aasgaard
Sondre Langås
How the peers are sourced
Top-9 %
Stepping %
Domestic %
Other %
NOR Norway
Squad 26
65 %
SUI Switzerland
Squad 26
88 %
AUT Austria
Squad 26
69 %
CZE Czechia
Squad 26
35 %
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?
Norwegian players with ≥ 450 Big-5 minutes: 26 at the 1998/99 peak, 4 at the 2007/08 low, 25 in 2025/26. The break is dated to 2004/05. The recovery after it is dated to 2021/22.
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. Norwegian 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 27 %; a level change of ×0.66 (0.29–1.34). Rise posterior 23 %; ×1.32.
As an analytics question In numbers: Norwegian 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 Norwegian players of each peak season, goalkeepers included — a lineup of presence, not a quality ranking: 1998/99: Thomas Myhre, Petter Rudi, Claus Lundekvam; 1999/00: Gunnar Halle, Steffen Iversen, Trond Andersen; 2025/26: Erling Haaland, Sander Berge, Leo Østigård. 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 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 Norway loses ground.The six numbers, unscaled
Metric
NOR
DEN
CZE
Players per million
9.37
12.58
2.39
U21 share of domestic minutes
11.5 %
15.3 %
6.4 %
Export age (recent)
22
22
22
Sideways moves
22 %
10 %
—
Exports' club-minutes share
37 %
46 %
50 %
National-team squad in the top-9 leagues
65 %
—
35 %
Big-5 players now
25
38
10
How we know
As an analytics question In numbers: Denmark and Czechia against Norway 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?
1 Norwegian goalkeepers play ≥ 450 minutes in the top-9 leagues — rank 7 of 9 per million — and they get there later than outfield exports.
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: Norwegian top-9 goalkeepers, 2025/26
Player
Club
League
Minutes
Club goals percentile
Ørjan Nyland
Sevilla
ESP-La Liga
450
45 %
Goalkeeper production: Norwegian keepers, 2025/26
Player
Club
League
Minutes
GA/90
Saves/90
Save %
Clean-sheet share
GA/90, quality-adj.
Ørjan Nyland
Sevilla
ESP-La Liga
450
1.60
2.20
68.7 %
20 %
1.79
Mathias Dyngeland
Brann
NOR-Eliteserien
2700
1.53
2.27
65.5 %
17 %
4.01
Martin Børsheim
Fredrikstad
NOR-Eliteserien
1080
1.25
3.50
66.7 %
25 %
3.53
Amund Wichne
Haugesund
NOR-Eliteserien
1440
2.50
3.94
66.1 %
12 %
5.56
Einar Fauskanger
Haugesund
NOR-Eliteserien
990
2.91
3.73
65.5 %
0 %
5.86
Emil Ødegaard
KFUM Oslo
NOR-Eliteserien
2610
1.28
1.55
65.3 %
24 %
3.50
Adrian Sæther
Kristiansund
NOR-Eliteserien
1956
1.93
3.04
65.7 %
14 %
4.72
Knut-André Skjærstein
Kristiansund
NOR-Eliteserien
540
2.17
3.83
66.1 %
33 %
4.52
Jacob Karlstrom
Molde
NOR-Eliteserien
2520
1.32
2.61
66.4 %
32 %
3.59
Sander Tangvik
Rosenborg
NOR-Eliteserien
2700
1.40
3.20
66.7 %
37 %
3.75
Per Kristian Bråtveit
Strømsgodset
NOR-Eliteserien
2218
2.15
4.34
66.3 %
8 %
5.17
Arild Østbø
Viking
NOR-Eliteserien
1032
0.78
3.14
66.9 %
42 %
2.87
Kristoffer Klaesson
Viking
NOR-Eliteserien
1218
1.33
2.44
66.1 %
29 %
3.64
Thomas Kinn
Viking
NOR-Eliteserien
450
1.80
1.20
65.8 %
0 %
4.11
Jacob Storevik
Vålerenga
NOR-Eliteserien
630
1.86
4.00
66.3 %
29 %
4.25
Magnus Sjøeng
Vålerenga
NOR-Eliteserien
810
1.56
1.56
65.7 %
22 %
3.95
Viljar Myhra
Odense
DEN-Superliga
2008
1.75
2.82
63.8 %
17 %
4.44
Peer median quality-adjusted GA/90:
NOR 4.01 · DEN 3.69 · SUI 4.95 · AUT 4.76 · CZE 2.86 · CRO 5.19 · POL 2.74 · HUN 5.29 · SVK 2.90
Goalkeepers per million, by country
DEN
Denmark
0.67
CRO
Croatia
0.52
SUI
Switzerland
0.45
SVK
Slovakia
0.37
CZE
Czechia
0.37
POL
Poland
0.19
NOR
Norway
0.18
AUT
Austria
0.11
HUN
Hungary
0.10
How we know
0.18 per million; first top-9 season at a median age of 32, against 22 for outfield exports.
As an analytics question In numbers: Norwegian 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 — 0 % of the goalkeepers, 30 % of the outfield exports; a comparison of two pathways inside one nation, not a causal claim.
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 3.21 players per million between Denmark and Norway, U21 minutes go with +3.15, league strength with −3.54, export age with 0.00.
How to read it: the whole bar is the gap in players per million between the comparison country and Norway. 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
+3.60 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.
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.
Style mapOlder forwards with moderate playing timeQuality mapHigh-card-rate forwards
Tactical read
Experienced forwards on managed minutes — median age 31, about 40 % of minutes, output at median. The impact or target forward used in rotation (Haaland, Sørloth, Marković).
Trajectory 2024/25 → 2025/26
↑improving+0.17G+A / 90 adj.2736 min → 2953 min
Historical analogs at age 26
Alexander IsakSWE
ENG-Premier League 2024/25 · 2756 min · 0.73 ·
d = 0.92
Mateo ReteguiITA
ITA-Serie A 2024/25 · 2383 min · 0.77 ·
d = 1.16
Marcus RashfordENG
ENG-Premier League 2022/23 · 2879 min · 0.63 ·
d = 1.74
2026 FIFA World Cup
Selected as: highest goals + assists per 90, league-adjusted among FW.
Style mapHigh-card-rate midfieldersQuality mapProductive midfielders in top-five leagues
Tactical read
Ball-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 (Berg, Elyounoussi, Ryerson).
Historical analogs at age 29
Julian BrandtGER
GER-Bundesliga 2024/25 · 2303 min · 0.38 ·
d = 0.06
Jens StageDEN
GER-Bundesliga 2024/25 · 2204 min · 0.39 ·
d = 0.11
Alassane PléaFRA
GER-Bundesliga 2021/22 · 2070 min · 0.36 ·
d = 0.33
2026 FIFA World Cup
Selected as: highest goals + assists per 90, league-adjusted among MF.
Style mapPrimary scorersQuality mapHigh-assist forwards in top-five leagues
Tactical read
Primary scorers — non-penalty goal rate nearly double the forward median on starter minutes (56 %). The finishing forward of a first-choice line (Larsen, Solbakken, Heggebø).
Trajectory 2024/25 → 2025/26
↓declining−0.34G+A / 90 adj.2587 min → 2307 min
Historical analogs at age 26
VitinhaPOR
ITA-Serie A 2025/26 · 2226 min · 0.24 ·
d = 0.71
David OkerekeNGA
ITA-Serie A 2022/23 · 2266 min · 0.23 ·
d = 0.71
Walid CheddiraMAR
ITA-Serie A 2023/24 · 2120 min · 0.27 ·
d = 0.78
2026 FIFA World Cup
Selected as: most top-9 minutes among 2026 FIFA World Cup squad FW.
Veteran 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 (Berge, Ulvestad, Jenssen).
Trajectory 2024/25 → 2025/26
→stable+0.01G+A / 90 adj.2224 min → 2905 min
Historical analogs at age 28
Nélson SemedoPOR
ENG-Premier League 2020/21 · 2983 min · 0.08 ·
d = 0.12
George BaldockGRE
ENG-Premier League 2020/21 · 2787 min · 0.09 ·
d = 0.18
Kyle Walker-PetersENG
ENG-Premier League 2024/25 · 2918 min · 0.10 ·
d = 0.21
2026 FIFA World Cup
Selected as: most top-9 minutes among 2026 FIFA World Cup squad MF.
Style mapEveryday starting defendersQuality mapHigh-assist defenders in top-five leagues
Tactical read
The defensive core — 85 % of minutes, output at the DF floor. Availability and continuity are the signal; production is not (Østigård, Cornic, Falchener).
Trajectory 2024/25 → 2025/26
↑improving+0.11G+A / 90 adj.2154 min → 2622 min
Historical analogs at age 27
Jules KoundéFRA
ESP-La Liga 2024/25 · 2605 min · 0.11 ·
d = 0.33
Emanuele ValeriITA
ITA-Serie A 2024/25 · 2873 min · 0.14 ·
d = 0.34
Benjamin HenrichsGER
GER-Bundesliga 2023/24 · 2526 min · 0.13 ·
d = 0.36
2026 FIFA World Cup
Selected as: most top-9 minutes among 2026 FIFA World Cup squad DF.
The 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 (Lauritsen, Arnstad, Brunes).
Trajectory 2024/25 → 2025/26
→stable+0.01G+A / 90 adj.2003 min → 2216 min
Historical analogs at age 27
Lirim QamiliMKD
DEN-Superliga 2024/25 · 2059 min · 0.21 ·
d = 0.31
Peter ChristiansenDEN
NOR-Eliteserien 2025/26 · 2098 min · 0.22 ·
d = 0.38
Sebastian BergierPOL
POL-Ekstraklasa 2025/26 · 2278 min · 0.22 ·
d = 0.43
2026 FIFA World Cup
Selected as: most domestic minutes among 2026 FIFA World Cup squad FW.
Ball-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 (Berg, Elyounoussi, Ryerson).
Trajectory 2024/25 → 2025/26
↑improving+0.08G+A / 90 adj.2610 min → 2292 min
Historical analogs at age 29
Jordan LarssonSWE
DEN-Superliga 2025/26 · 2281 min · 0.20 ·
d = 0.03
Emrah BaşsanTUR
TUR-Süper Lig 2020/21 · 2283 min · 0.21 ·
d = 0.54
Miguel CardosoPOR
TUR-Süper Lig 2022/23 · 2333 min · 0.21 ·
d = 0.54
2026 FIFA World Cup
Selected as: most domestic minutes among 2026 FIFA World Cup squad MF.
Fredrik André BjørkanBodø/GlimtDF0.06G+A / 90 adj.↓ declining · −0.06 G+A / 90 adj.Career →
The defensive core — 85 % of minutes, output at the DF floor. Availability and continuity are the signal; production is not (Østigård, Cornic, Falchener).
Trajectory 2024/25 → 2025/26
↓declining−0.06G+A / 90 adj.1792 min → 2457 min
Historical analogs at age 28
Eirik SaunesNOR
NOR-Eliteserien 2025/26 · 2496 min · 0.05 ·
d = 0.10
Jesper TåjeNOR
NOR-Eliteserien 2024/25 · 2228 min · 0.04 ·
d = 0.34
Jacob RasmussenDEN
DEN-Superliga 2024/25 · 2520 min · 0.02 ·
d = 0.35
2026 FIFA World Cup
Selected as: most domestic minutes among 2026 FIFA World Cup squad DF.
Youngest national-team call-up
Antonio NusaRB LeipzigFW0.29G+A / 90 adj.—Career →
The 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 (Lauritsen, Arnstad, Brunes).
Historical analogs at age 21
Vinicius JúniorBRA
ESP-La Liga 2020/21 · 1969 min · 0.25 ·
d = 0.35
Jamie LewelingGER
GER-Bundesliga 2021/22 · 1959 min · 0.24 ·
d = 0.37
Emanuel EmeghaNED
FRA-Ligue 1 2023/24 · 2078 min · 0.27 ·
d = 0.61
2026 FIFA World Cup
Selected as: youngest national-team call-up among FW.
Andreas SchjelderupBenficaMF0.26G+A / 90 adj.—Career →
MFBenfica
Andreas Schjelderup
MF · 22 · Benfica (2026/27) · NT 2025–26
2025/26 · Benfica · POR-Primeira Liga
G+A / 90 adj.
0.26
Non-penalty goals / assists per 90
0.26 / 0.26
Minutes
1723 (58 %)
Style mapHigh-card-rate midfieldersQuality mapProductive midfielders in top-five leagues
Tactical read
Ball-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 (Berg, Elyounoussi, Ryerson).
Historical analogs at age 22
Hákon HaraldssonISL
FRA-Ligue 1 2024/25 · 1755 min · 0.23 ·
d = 0.31
Sofiane DiopMAR
FRA-Ligue 1 2021/22 · 1948 min · 0.25 ·
d = 0.35
Francisco ConceiçãoPOR
POR-Primeira Liga 2023/24 · 1888 min · 0.22 ·
d = 0.37
2026 FIFA World Cup
Selected as: youngest national-team call-up among MF.
Henrik FalchenerVikingDF0.07G+A / 90 adj.—Career →
DFViking
Henrik Falchener
DF · 23 · Viking (2026/27) · NT 2025–26
2025/26 · Viking · NOR-Eliteserien
G+A / 90 adj.
0.07
Non-penalty goals / assists per 90
0.21 / 0.00
Minutes
2576 (99 %)
Style mapEveryday starting defendersQuality mapHigh-assist defenders in top-five leagues
Tactical read
The defensive core — 85 % of minutes, output at the DF floor. Availability and continuity are the signal; production is not (Østigård, Cornic, Falchener).
Historical analogs at age 23
Fredrik SjøvoldNOR
NOR-Eliteserien 2025/26 · 2594 min · 0.10 ·
d = 0.24
Mikkel RaknebergNOR
NOR-Eliteserien 2024/25 · 2311 min · 0.06 ·
d = 0.36
Mathias TønnessenNOR
NOR-Eliteserien 2025/26 · 2422 min · 0.02 ·
d = 0.45
2026 FIFA World Cup
Selected as: youngest national-team call-up among DF.
The 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 (Lauritsen, Arnstad, Brunes).
Trajectory 2024/25 → 2025/26
→stable+0.03G+A / 90 adj.2707 min → 3039 min
Historical analogs at age 29
Riad BajićBIH
TUR-Süper Lig 2022/23 · 2868 min · 0.20 ·
d = 0.27
Lennart ThyGER
NED-Eredivisie 2020/21 · 2782 min · 0.22 ·
d = 0.34
Victor EdvardsenSWE
NED-Eredivisie 2024/25 · 2740 min · 0.23 ·
d = 0.42
Ball-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 (Berg, Elyounoussi, Ryerson).
Trajectory 2024/25 → 2025/26
→stable+0.03G+A / 90 adj.2428 min → 3375 min
Historical analogs at age 23
Kodai SanoJPN
NED-Eredivisie 2025/26 · 3060 min · 0.15 ·
d = 0.42
Fisayo Dele-BashiruNGA
TUR-Süper Lig 2023/24 · 3035 min · 0.15 ·
d = 0.47
Jarne SteuckersBEL
BEL-Pro League 2024/25 · 3097 min · 0.17 ·
d = 0.50
The 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 (Lauritsen, Arnstad, Brunes).
Historical analogs at age 23
Christian GammelgaardDEN
DEN-Superliga 2025/26 · 2330 min · 0.16 ·
d = 0.11
Tobias BechDEN
DEN-Superliga 2024/25 · 2262 min · 0.15 ·
d = 0.21
Bohdan ViunnykUKR
POL-Ekstraklasa 2024/25 · 2329 min · 0.16 ·
d = 0.34
Selected as: most domestic-league minutes among under-23 FW without a top-9 season.
Veteran 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 (Berge, Ulvestad, Jenssen).
Trajectory 2024/25 → 2025/26
↑improving+0.07G+A / 90 adj.2016 min → 2372 min
Historical analogs at age 21
Mario DorgelèsCIV
DEN-Superliga 2024/25 · 2225 min · 0.09 ·
d = 0.27
Thomas JørgensenDEN
DEN-Superliga 2025/26 · 2579 min · 0.13 ·
d = 0.33
Mateusz KowalczykPOL
POL-Ekstraklasa 2024/25 · 2465 min · 0.12 ·
d = 0.34
Selected as: most domestic-league minutes among under-23 MF without a top-9 season.
Development defenders — median age 22, about a third of minutes, output at the floor. The tier the 23–25 cohort draws from (Ulvestad, Fredriksen, Valsvik).
Trajectory 2024/25 → 2025/26
→stable−0.01G+A / 90 adj.914 min → 2986 min
Historical analogs at age 21
Bung Meng FreimannSUI
SUI-Super League 2025/26 · 2752 min · 0.03 ·
d = 0.51
Filip LubereckiPOL
POL-Ekstraklasa 2025/26 · 2615 min · 0.02 ·
d = 0.58
Bünyamin BalcıTUR
TUR-Süper Lig 2020/21 · 3022 min · 0.06 ·
d = 0.64
Selected as: most domestic-league minutes among under-23 DF without a top-9 season.
Goalkeepers — most top-9 minutes · youngest in the top-9
Sevilla (ESP-La Liga) · 45 % of the league's goals scored
2026 FIFA World Cup
Selected as: most top-9 minutes among home goalkeepers.
* 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
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 Norwegian-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.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 Norwegian-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.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 Norwegian-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 258, searchable
The cards above pick by rule. This is everyone with a 2025/26 season in the data: 44 forwards, 103 midfielders, 89 defenders and 22 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.
258 of 258
PlayerAgePosClubMinutesRank
No player matches. The pool is every Norwegian-eligible player with a season row in the leagues this report covers; a player in a league it does not cover is not here.
How we know
As an analytics question In numbers: 18 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?
11 climbed a rung, 7 came down. The stepping-stone leagues hold 2 of the pool, from 1; the top nine hold 38, from 34.
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.
Eliteserien
193→176
293 797 → 259 396 minutes
stepping-stone league
1→2
1 396 → 3 738 minutes
top-9 league
34→38
60 395 → 63 393 minutes
other covered league
20→18
27 585 → 27 570 minutes
Players of the pool on each rung, 2024/25 → 2025/26, with the minutes they played there; 248 qualifying players last season, 234 this season.
Climbed a rung 11
Sebastian SebulonsenDEN-Superliga → GER-Bundesliga
Sondre LisethNOR-Eliteserien → POL-Ekstraklasa
Jonas TherkelsenNOR-Eliteserien → GER-2. Bundesliga
“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 Norwegian-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.
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
NOR
DEN
CZE
Share of league minutes that went to players aged 21 or under
11.5 %
15.3 %
6.4 %
Average age of a minute played in the league
25.6
25.4
26.0
Age the first time a player has real playing time in a foreign league, over the players abroad today
22.5
23
24
Share of moves abroad to a league no stronger than the player's own
22 %
10 %
—
Players in Europe's strongest leagues, for every million people
9.37
12.58
2.39
If you take one thing from this: the single measured link that carries the most of the gap with both Denmark and Czechia is how strong the domestic league is. That is one decomposition over 8 countries — a description of the gap, not a weight to plan by.
How strong is the home league
A season in the home league is worth about 0.57 of a season in the Premier League (0.51–0.64).
When the count of players in the strongest leagues turned
Around the 2004/05 season, with 27 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 Norwegian 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
U22
23-25
26-29
30+
Norway
1
1
4
1
Denmark
1
7
2
—
Switzerland
—
1
3
—
Austria
1
2
—
1
Czechia
—
1
2
2
Cohort gaps — midfielders
Cohort
U22
23-25
26-29
30+
Norway
2
9
11
4
Denmark
6
6
13
6
Switzerland
4
6
10
3
Austria
2
6
4
7
Czechia
1
2
3
1
Cohort gaps — defenders
Cohort
U22
23-25
26-29
30+
Norway
3
1
5
2
Denmark
2
5
7
2
Switzerland
2
5
4
6
Austria
1
3
5
1
Czechia
—
1
3
3
* 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 9 countries are shown; the heatmap above carries all of them. Largest Norwegian shortfalls against the peer median count: defenders 23-25 (1 vs 2), defenders 30+ (2 vs 2), forwards 23-25 (1 vs 1).
The full picture, all nine peer countries at once, as a heatmap:
Median non-penalty goals + assists per 90 by country, position group and age cohort, 2025/26; the outlined row is Norway.
Observations
Per capita: rank 3 of 9 · The largest cohort gap: defenders 23-25 · Trajectories 2024/25 → 2025/26: mostly stable
Per capita: rank 3 of 9
52 Norwegian players on 2025/26 rosters of the nine strongest leagues give 9.37 per million inhabitants, rank 3 of 9. Denmark leads with 12.58, 1.3 times the Norwegian density; Croatia sits one place above with 12.18 from 47 players and a population 1.4 times smaller. Below Norway: Switzerland, Austria, Slovakia, Czechia, Hungary, Poland.
The largest cohort gap: defenders 23-25
Counting 2025/26 top-9 players by position group and age cohort and comparing the Norwegian count with the median of the other eight peers, the three largest shortfalls are defenders 23-25 — 1 Norwegian against a peer median of 2; defenders 30+ — 2 Norwegian against a peer median of 2; forwards 23-25 — 1 Norwegian against a peer median of 1. The cohort tables above show the medians behind the counts.
Trajectories 2024/25 → 2025/26: mostly stable
101 Norwegian-eligible players had at least 900 minutes in both 2024/25 and 2025/26: forwards 19 (7 up, 8 stable, 4 down); midfielders 42 (8 up, 30 stable, 4 down); defenders 40 (6 up, 31 stable, 3 down). A move counts as up or down when league-adjusted goals + assists per 90 changed by more than 0.05; 69 of 101 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 Norwegian 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 Norwegian members of the corpus cluster; names are the Norwegian members with the most minutes.
Atlas of forwards 2025/26 in both projections: 44 Norwegian-eligible players in colour against a corpus of 924. Bright rings mark the national-team pool (call-up 2025–26, 5 players).Atlas of midfielders 2025/26 in both projections: 103 Norwegian-eligible players in colour against a corpus of 2648. Bright rings mark the national-team pool (call-up 2025–26, 10 players).Atlas of defenders 2025/26 in both projections: 89 Norwegian-eligible players in colour against a corpus of 1947. Bright rings mark the national-team pool (call-up 2025–26, 5 players).
Forwards
High-assist forwards
2 Norwegian of 142 · NT pool 0 · median born 2000
LALeander Alvheim
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 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 (Alvheim, Sæter).
Duel-heavy rotation forwards
4 Norwegian of 142 · NT pool 0 · median born 1993
MMMoses MawaMWMagnus Wolff EikremFGFredrik Gulbrandsen
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 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 (Mawa, Eikrem, Gulbrandsen).
High-minutes starting forwards
10 Norwegian of 115 · NT pool 0 · median born 2000
SBSanel BojadzicUMUlrik MathisenODOle Didrik BlombergNHNoah Holm
Corpus medians: 0.31 non-penalty goals and 0.21 assists per 90, 32 % of the club's minutes, age 25, 0.15 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 (Bojadzic, Mathisen, Blomberg).
Older forwards with moderate playing time
5 Norwegian of 121 · NT pool 2 · median born 1999
EHErling HaalandASAlexander SørlothEMEman MarkovićOOObilor Okeke
Corpus medians: 0.50 non-penalty goals and 0.10 assists per 90, 53 % of the club's minutes, age 25, 0.16 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 (Haaland, Sørloth, Marković).
Young low-minute forwards
13 Norwegian of 145 · NT pool 2 · median born 2001
TLTobias LauritsenKAKristian ArnstadJBJonatan Braut BrunesDKDaniel Karlsbakk
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 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 (Lauritsen, Arnstad, Brunes).
Primary scorers
10 Norwegian of 259 · NT pool 1 · median born 2001
JSJørgen Strand LarsenOSOla SolbakkenAHAune HeggebøJGJulian Gonstad
Corpus medians: 0.27 non-penalty goals and 0.09 assists per 90, 29 % of the club's minutes, age 23, 0.13 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 (Larsen, Solbakken, Heggebø).
Midfielders
High-card-rate midfielders
18 Norwegian of 293 · NT pool 4 · median born 1999
PBPatrick BergMEMohamed ElyounoussiJRJulian RyersonSSondre Ørjasæter
Corpus medians: 0.14 non-penalty goals and 0.22 assists per 90, 59 % of the club's minutes, age 25, 0.17 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 (Berg, Elyounoussi, Ryerson).
Older rotation midfielders
25 Norwegian of 592 · NT pool 3 · median born 1999
SBSander BergeFUFredrik UlvestadRYRuben Yttergård JenssenJKJoshua Kitolano
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 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 (Berge, Ulvestad, Jenssen).
Young low-minute midfielders
18 Norwegian of 320 · NT pool 0 · median born 1999
SKSander KilenEAEdvin AustbøSSSondre SørløkkUSUlrik Saltnes
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 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 (Kilen, Austbø, Sørløkk).
Everyday starting midfielders, low scoring output
10 Norwegian of 423 · NT pool 1 · median born 1995
OSOle SelnæsMBMorten BjørloMKMorten KonradsenMMMarcus Mehnert
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 readThe engine room — nearly 80 % of minutes with median output: holding and box-to-box midfielders whose value is continuity and structure, not numbers (Selnæs, Bjørlo, Konradsen).
High-scoring attacking midfielders
27 Norwegian of 626 · NT pool 2 · median born 2003
JRJakob RomsaasJHJakob HansenVHVictor HalvorsenSRSander Risan Mørk
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 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 (Romsaas, Hansen, Halvorsen).
High-minutes creative midfielders
5 Norwegian of 392 · NT pool 0 · median born 2002
SSSverre SandalSMSivert MannsverkMRMagnus RiisnæsOEOliver Edvardsen
Corpus medians: 0.08 non-penalty goals and 0.07 assists per 90, 38 % of the club's minutes, age 24, 0.33 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 (Sandal, Mannsverk, Riisnæs).
Defenders
Everyday starting defenders
15 Norwegian of 218 · NT pool 3 · median born 1998
LLeo ØstigårdLCLeo CornicHFHenrik FalchenerFAFredrik André Bjørkan
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 readThe defensive core — 85 % of minutes, output at the DF floor. Availability and continuity are the signal; production is not (Østigård, Cornic, Falchener).
High-card-rate defenders
17 Norwegian of 424 · NT pool 0 · median born 2004
SJSebastian JarlHSHåkon SjåtilBRBirk RisaVEVetle Egeli
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 readDuel-heavy defenders — card rate 2.5 times the DF median with rotation minutes (46 %). The physical stopper profile (Jarl, Sjåtil, Risa).
Young low-minute defenders
22 Norwegian of 430 · NT pool 1 · median born 1999
DPDan Peter UlvestadUFUlrik FredriksenGVGustav ValsvikTGTobias Guddal
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 readDevelopment defenders — median age 22, about a third of minutes, output at the floor. The tier the 23–25 cohort draws from (Ulvestad, Fredriksen, Valsvik).
Goal-scoring defenders
15 Norwegian of 227 · NT pool 0 · median born 1997
OBOliver BraudeFSFredrik SjøvoldFDFredrik DahlDEDaniel Eid
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 readSet-piece threats — defenders scoring at five times the DF median on 60 % of minutes. Aerial presence in both boxes (Braude, Sjøvold, Dahl).
Older defenders
3 Norwegian of 284 · NT pool 0 · median born 2000
JDJesper DalandHSHalldor Stenevik
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 readExperienced defenders on managed minutes — median age 31, 44 % of minutes, output at the floor. Leadership and cover rather than a starting role (Daland, Stenevik, Meling).
High-assist defenders with high playing time
17 Norwegian of 363 · NT pool 1 · median born 1996
LVLars-Christopher VilsvikFSFredrik SjølstadKAKristoffer AjerAKAxel Kryger
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 readAttacking full-backs — assist rate seven times the DF median on starter minutes (65 %). The wide defender whose job ends in the final third (Vilsvik, Sjølstad, Ajer).
Trajectories
Trajectories 2024/25 → 2025/26 (Norwegian-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 — 19 players: 7 up, 8 stable, 4 down
Moving up · G+A / 90 adj.
Player
League
Min 2024/25 / 2025/26
Change
EHErling Haaland
ENG-Premier League
2736 / 2953
+0.174
KSKristian Strømland Lien
NOR-Eliteserien
1072 / 2286
+0.120
EMEman Marković
POL-Ekstraklasa
2518 / 1124
+0.110
ODOle Didrik Blomberg
NOR-Eliteserien
1944 / 1196
+0.097
SLSondre Liseth
POL-Ekstraklasa
1389 / 2341
+0.074
Moving down · G+A / 90 adj.
Player
League
Min 2024/25 / 2025/26
Change
JSJørgen Strand Larsen
ENG-Premier League
2587 / 2307
−0.342
ASAlexander Sørloth
ESP-La Liga
1566 / 1980
−0.298
MWMagnus Wolff Eikrem
NOR-Eliteserien
1597 / 1623
−0.116
AHAune Heggebø
NOR-Eliteserien
1282 / 1161
−0.059
Midfielders — 42 players: 8 up, 30 stable, 4 down
Moving up · G+A / 90 adj.
Player
League
Min 2024/25 / 2025/26
Change
HVHugo Vetlesen
BEL-Pro League
1500 / 1289
+0.153
MTMorten Thorsby
ITA-Serie A
1898 / 1374
+0.105
PBPatrick Berg
NOR-Eliteserien
2610 / 2292
+0.080
JHJens Hjertø-Dahl
NOR-Eliteserien
2016 / 2372
+0.072
RYRuben Yttergård Jenssen
NOR-Eliteserien
2375 / 2700
+0.066
Moving down · G+A / 90 adj.
Player
League
Min 2024/25 / 2025/26
Change
KEKristian Eriksen
NOR-Eliteserien
2412 / 902
−0.111
VHVictor Halvorsen
NOR-Eliteserien
1056 / 1446
−0.089
MKMorten Konradsen
NOR-Eliteserien
1315 / 1296
−0.069
HEHåkon Evjen
NOR-Eliteserien
1974 / 2198
−0.062
Defenders — 40 players: 6 up, 31 stable, 3 down
Moving up · G+A / 90 adj.
Player
League
Min 2024/25 / 2025/26
Change
LLeo Østigård
ITA-Serie A
2154 / 2622
+0.110
JSJoachim Soltvedt
NOR-Eliteserien
1200 / 1752
+0.091
CCChristopher Cheng
NOR-Eliteserien
2060 / 2597
+0.082
OBOdin Bjørtuft
NOR-Eliteserien
1577 / 2266
+0.071
MOMartin Ove Roseth
NOR-Eliteserien
1281 / 1441
+0.059
Moving down · G+A / 90 adj.
Player
League
Min 2024/25 / 2025/26
Change
APAdrian Pereira
NOR-Eliteserien
1354 / 1704
−0.063
FAFredrik André Bjørkan
NOR-Eliteserien
1792 / 2457
−0.062
EHEirik Haugan
NOR-Eliteserien
1382 / 2366
−0.060
Why does the train leave?
Why does the train leave?
Four exhibits comparing Norway with 8 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: DEN 21.2 %, HUN 22.6 %, CRO 22.7 %, NOR 19.8 %, AUT 16.5 %, POL 14.4 %, SUI 16.6 %, CZE 13.5 %. 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.
Norwegian exports: 37 players, median export age 21 (recent entrants 17, median 22), 53 % of the recent ones straight from the Eliteserien*.
Country
n
Recent
Export age (all)
Export age (recent)
Domestic
Stepping stone
Other top-9
Not covered
Censored
NOR Norway
37
17
21
22
53 %
0 %
0 %
47 %
19 %
DEN Denmark
65
25
22
22
60 %
0 %
0 %
40 %
14 %
SUI Switzerland
42
13
23
21
85 %
0 %
0 %
15 %
33 %
AUT Austria
37
13
23
22
54 %
8 %
0 %
38 %
35 %
CZE Czechia
15
7
23
22
0 %
0 %
0 %
100 %
20 %
CRO Croatia
39
10
23
24.5
60 %
10 %
0 %
30 %
31 %
POL Poland
30
13
23
24
38 %
23 %
0 %
38 %
20 %
HUN Hungary
18
11
22
22
91 %
0 %
0 %
9 %
11 %
SVK Slovakia
11
4
24
23
0 %
0 %
0 %
100 %
27 %
* 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.
HUN
Hungary n = 15
72 %
CZE
Czechia n = 26
67 %
SVK
Slovakia n = 17
60 %
AUT
Austria n = 44
59 %
NOR
Norway n = 52
56 %
DEN
Denmark n = 75
56 %
CRO
Croatia n = 47
55 %
POL
Poland n = 45
55 %
SUI
Switzerland n = 54
50 %
* 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. Norwegian count and median against the median of the peer countries' values.
Profile table by tier and position group
Tier
Group
NOR n
NOR median
Peer median n
Peer median
domestic league
FW
31
0.18
16.5
0.12
domestic league
MF
72
0.10
57
0.06
domestic league
DF
76
0.04
42.5
0.02
stepping-stone league
FW
0
—
2
0.28
stepping-stone league
MF
2
0.07
2
0.09
stepping-stone league
DF
1
0.01
2
0.05
top-9 league
FW
6
0.29
5
0.28
top-9 league
MF
23
0.13
16
0.14
top-9 league
DF
11
0.06
8
0.04
other covered league
FW
7
0.16
6
0.13
other covered league
MF
9
0.08
6.5
0.08
other covered league
DF
3
0.02
10.5
0.02
* 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 Norwegian exports go
Of the 236 mapped Norwegian players, 59 play outside the Eliteserien.
peer country leagueFredrik Ulvestad · Kristian Arnstad · Robin Dahl Østrøm
stepping stoneJonas Therkelsen · Jesper Daland
otherSivert Mannsverk
* 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 Switzerland, Austria, Czechia. Tier = the league of the player's most-minutes 2025/26 row.
Minutes, multipliers and age cohorts by country
Country
Median minutes
Median multiplier
U22
23–25
26–29
30+
NOR Norway
2164.5
0.832
2
6
14
4
SUI Switzerland
2132
0.788
1
5
10
10
AUT Austria
1711.5
0.788
1
6
10
9
CZE Czechia
1826.5
0.434
1
6
10
9
* 6 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
Erling Haaland
FW · age 26 · ENG-Premier League 2025/26 · 2953 min · 0.83 npG+A/90 quality
Nearest 5 at the same age
5 nearest analogs and what followed
1Alexander IsakSWE
ENG-Premier League 2024/25 · 2756 min · 0.73 npG+A/90 · d = 0.92
Followed by:
2025/26
ENG-Premier League · 699 min · 0.44
2Mateo ReteguiITA
ITA-Serie A 2024/25 · 2383 min · 0.77 npG+A/90 · d = 1.16
No later season in the corpus.
3Marcus RashfordENG
ENG-Premier League 2022/23 · 2879 min · 0.63 npG+A/90 · d = 1.74
Followed by:
2023/24
ENG-Premier League · 2271 min · 0.26
2024/25
ENG-Premier League · 978 min · 0.35
2025/26
ESP-La Liga · 1763 min · 0.46
4Lautaro MartínezARG
ITA-Serie A 2022/23 · 2576 min · 0.65 npG+A/90 · d = 1.77
Followed by:
2023/24
ITA-Serie A · 2656 min · 0.62
2024/25
ITA-Serie A · 2564 min · 0.42
2025/26
ITA-Serie A · 2159 min · 0.67
5Diogo JotaPOR
ENG-Premier League 2021/22 · 2364 min · 0.64 npG+A/90 · d = 1.85
Followed by:
2022/23
ENG-Premier League · 1131 min · 0.69
2023/24
ENG-Premier League · 1145 min · 0.81
2024/25
ENG-Premier League · 1196 min · 0.59
Target
Antonio Nusa
FW · age 21 · GER-Bundesliga 2025/26 · 2027 min · 0.29 npG+A/90 quality
Nearest 5 at the same age
5 nearest analogs and what followed
1Vinicius JúniorBRA
ESP-La Liga 2020/21 · 1969 min · 0.25 npG+A/90 · d = 0.35
Followed by:
2021/22
ESP-La Liga · 2690 min · 0.63
2022/23
ESP-La Liga · 2823 min · 0.45
2023/24
ESP-La Liga · 1864 min · 0.61
2024/25
ESP-La Liga · 2253 min · 0.48
2Jamie LewelingGER
GER-Bundesliga 2021/22 · 1959 min · 0.24 npG+A/90 · d = 0.37
Followed by:
2023/24
GER-Bundesliga · 1523 min · 0.30
2024/25
GER-Bundesliga · 1663 min · 0.17
2025/26
GER-Bundesliga · 2367 min · 0.40
3Emanuel EmeghaNED
FRA-Ligue 1 2023/24 · 2078 min · 0.27 npG+A/90 · d = 0.61
Followed by:
2024/25
FRA-Ligue 1 · 2293 min · 0.41
4Arnaud KalimuendoFRA
FRA-Ligue 1 2022/23 · 1849 min · 0.31 npG+A/90 · d = 0.69
Followed by:
2023/24
FRA-Ligue 1 · 2139 min · 0.26
2024/25
FRA-Ligue 1 · 2578 min · 0.35
2025/26
GER-Bundesliga · 1417 min · 0.36
5Josh SargentUSA
GER-Bundesliga 2020/21 · 2506 min · 0.25 npG+A/90 · d = 0.71
Followed by:
2021/22
ENG-Premier League · 1572 min · 0.26
Target
Jørgen Strand Larsen
FW · age 26 · ENG-Premier League 2025/26 · 2307 min · 0.24 npG+A/90 quality
Nearest 5 at the same age
5 nearest analogs and what followed
1VitinhaPOR
ITA-Serie A 2025/26 · 2226 min · 0.24 npG+A/90 · d = 0.71
No later season in the corpus.
2David OkerekeNGA
ITA-Serie A 2022/23 · 2266 min · 0.23 npG+A/90 · d = 0.71
Followed by:
2024/25
TUR-Süper Lig · 2073 min · 0.25
3Walid CheddiraMAR
ITA-Serie A 2023/24 · 2120 min · 0.27 npG+A/90 · d = 0.78
Followed by:
2024/25
ESP-La Liga · 640 min · 0.28
2025/26
ITA-Serie A · 1000 min · 0.31
4Moise KeanITA
ITA-Serie A 2025/26 · 2036 min · 0.28 npG+A/90 · d = 0.84
No later season in the corpus.
5Sam LammersNED
ITA-Serie A 2022/23 · 1983 min · 0.22 npG+A/90 · d = 0.84
Followed by:
2023/24
NED-Eredivisie · 1605 min · 0.32
2024/25
NED-Eredivisie · 1501 min · 0.23
2025/26
NED-Eredivisie · 1545 min · 0.28
Target
Jens Petter Hauge
FW · age 27 · NOR-Eliteserien 2025/26 · 2216 min · 0.18 npG+A/90 quality
Nearest 5 at the same age
5 nearest analogs and what followed
1Lirim QamiliMKD
DEN-Superliga 2024/25 · 2059 min · 0.21 npG+A/90 · d = 0.31
Followed by:
2025/26
DEN-Superliga · 1265 min · 0.10
2Peter ChristiansenDEN
NOR-Eliteserien 2025/26 · 2098 min · 0.22 npG+A/90 · d = 0.38
Followed by:
2026/27
NOR-Eliteserien · 1629 min · 0.27
3Sebastian BergierPOL
POL-Ekstraklasa 2025/26 · 2278 min · 0.22 npG+A/90 · d = 0.43
No later season in the corpus.
4Afimico PululuCOD
POL-Ekstraklasa 2025/26 · 2352 min · 0.21 npG+A/90 · d = 0.44
No later season in the corpus.
5Moussa SyllaMLI
GER-2. Bundesliga 2025/26 · 2193 min · 0.19 npG+A/90 · d = 0.49
No later season in the corpus.
Target
Tobias Lauritsen
FW · age 29 · NED-Eredivisie 2025/26 · 3039 min · 0.21 npG+A/90 quality
Nearest 5 at the same age
5 nearest analogs and what followed
1Riad BajićBIH
TUR-Süper Lig 2022/23 · 2868 min · 0.20 npG+A/90 · d = 0.27
Followed by:
2023/24
TUR-Süper Lig · 815 min · 0.22
2Lennart ThyGER
NED-Eredivisie 2020/21 · 2782 min · 0.22 npG+A/90 · d = 0.34
Followed by:
2021/22
NED-Eredivisie · 2386 min · 0.14
2023/24
NED-Eredivisie · 2674 min · 0.26
3Victor EdvardsenSWE
NED-Eredivisie 2024/25 · 2740 min · 0.23 npG+A/90 · d = 0.42
Followed by:
2025/26
NED-Eredivisie · 1992 min · 0.24
2026/27
NED-Eredivisie · 493 min · 0.28
4Krzysztof PiątekPOL
TUR-Süper Lig 2023/24 · 2694 min · 0.22 npG+A/90 · d = 0.49
Followed by:
2024/25
TUR-Süper Lig · 2607 min · 0.28
5Ali SoweGAM
TUR-Süper Lig 2022/23 · 2749 min · 0.25 npG+A/90 · d = 0.50
Followed by:
2023/24
TUR-Süper Lig · 2123 min · 0.19
2024/25
TUR-Süper Lig · 2978 min · 0.29
2025/26
TUR-Süper Lig · 2284 min · 0.23
Target
Daniel Karlsbakk
FW · age 23 · NOR-Eliteserien 2025/26 · 2347 min · 0.17 npG+A/90 quality
Nearest 5 at the same age
5 nearest analogs and what followed
1Christian GammelgaardDEN
DEN-Superliga 2025/26 · 2330 min · 0.16 npG+A/90 · d = 0.11
No later season in the corpus.
2Tobias BechDEN
DEN-Superliga 2024/25 · 2262 min · 0.15 npG+A/90 · d = 0.21
Followed by:
2025/26
DEN-Superliga · 2668 min · 0.19
2026/27
DEN-Superliga · 467 min · 0.05
3Bohdan ViunnykUKR
POL-Ekstraklasa 2024/25 · 2329 min · 0.16 npG+A/90 · d = 0.34
Followed by:
2025/26
POL-Ekstraklasa · 966 min · 0.11
4Derry ScherhantGER
GER-2. Bundesliga 2024/25 · 2415 min · 0.19 npG+A/90 · d = 0.51
Followed by:
2025/26
GER-Bundesliga · 1301 min · 0.26
5Kristian ArnstadNOR
DEN-Superliga 2025/26 · 2611 min · 0.13 npG+A/90 · d = 0.51
Followed by:
2026/27
DEN-Superliga · 657 min · 0.04
Target
Julian Ryerson
MF · age 29 · GER-Bundesliga 2025/26 · 2266 min · 0.39 npG+A/90 quality
Nearest 5 at the same age
5 nearest analogs and what followed
1Julian BrandtGER
GER-Bundesliga 2024/25 · 2303 min · 0.38 npG+A/90 · d = 0.06
Followed by:
2025/26
GER-Bundesliga · 1606 min · 0.37
2Jens StageDEN
GER-Bundesliga 2024/25 · 2204 min · 0.39 npG+A/90 · d = 0.11
Followed by:
2025/26
GER-Bundesliga · 2460 min · 0.30
3Alassane PléaFRA
GER-Bundesliga 2021/22 · 2070 min · 0.36 npG+A/90 · d = 0.33
Followed by:
2022/23
GER-Bundesliga · 1774 min · 0.33
2023/24
GER-Bundesliga · 1913 min · 0.37
2024/25
GER-Bundesliga · 1902 min · 0.41
4Leon GoretzkaGER
GER-Bundesliga 2023/24 · 2241 min · 0.35 npG+A/90 · d = 0.33
Followed by:
2024/25
GER-Bundesliga · 1325 min · 0.23
2025/26
GER-Bundesliga · 1947 min · 0.25
5Filip KostićSRB
GER-Bundesliga 2020/21 · 2534 min · 0.41 npG+A/90 · d = 0.43
Followed by:
2021/22
GER-Bundesliga · 2522 min · 0.31
2022/23
ITA-Serie A · 2564 min · 0.28
2023/24
ITA-Serie A · 1815 min · 0.16
2024/25
TUR-Süper Lig · 1959 min · 0.14
Target
Andreas Schjelderup
MF · age 22 · POR-Primeira Liga 2025/26 · 1723 min · 0.26 npG+A/90 quality
Nearest 5 at the same age
5 nearest analogs and what followed
1Hákon HaraldssonISL
FRA-Ligue 1 2024/25 · 1755 min · 0.23 npG+A/90 · d = 0.31
Followed by:
2025/26
FRA-Ligue 1 · 2460 min · 0.21
2Sofiane DiopMAR
FRA-Ligue 1 2021/22 · 1948 min · 0.25 npG+A/90 · d = 0.35
Followed by:
2022/23
FRA-Ligue 1 · 1228 min · 0.19
2023/24
FRA-Ligue 1 · 499 min · 0.19
2024/25
FRA-Ligue 1 · 1064 min · 0.37
2025/26
FRA-Ligue 1 · 2130 min · 0.19
3Francisco ConceiçãoPOR
POR-Primeira Liga 2023/24 · 1888 min · 0.22 npG+A/90 · d = 0.37
Followed by:
2024/25
ITA-Serie A · 1340 min · 0.26
2025/26
ITA-Serie A · 2078 min · 0.25
4Maghnes AklioucheFRA
FRA-Ligue 1 2023/24 · 1613 min · 0.30 npG+A/90 · d = 0.44
Followed by:
2024/25
FRA-Ligue 1 · 2406 min · 0.29
2025/26
FRA-Ligue 1 · 2400 min · 0.25
5Timothy WeahUSA
FRA-Ligue 1 2021/22 · 1616 min · 0.21 npG+A/90 · d = 0.45
Followed by:
2022/23
FRA-Ligue 1 · 1748 min · 0.05
2023/24
ITA-Serie A · 1258 min · 0.10
2024/25
ITA-Serie A · 1638 min · 0.26
2025/26
FRA-Ligue 1 · 2253 min · 0.11
Target
Sander Berge
MF · age 28 · ENG-Premier League 2025/26 · 2905 min · 0.08 npG+A/90 quality
Nearest 5 at the same age
5 nearest analogs and what followed
1Nélson SemedoPOR
ENG-Premier League 2020/21 · 2983 min · 0.08 npG+A/90 · d = 0.12
Followed by:
2021/22
ENG-Premier League · 2131 min · 0.08
2022/23
ENG-Premier League · 2632 min · 0.03
2023/24
ENG-Premier League · 3084 min · 0.07
2024/25
ENG-Premier League · 2886 min · 0.15
2George BaldockGRE
ENG-Premier League 2020/21 · 2787 min · 0.09 npG+A/90 · d = 0.18
Followed by:
2023/24
ENG-Premier League · 969 min · 0.09
3Kyle Walker-PetersENG
ENG-Premier League 2024/25 · 2918 min · 0.10 npG+A/90 · d = 0.21
Followed by:
2025/26
ENG-Premier League · 1383 min · 0.06
4João PalhinhaPOR
ENG-Premier League 2022/23 · 3108 min · 0.11 npG+A/90 · d = 0.42
Followed by:
2023/24
ENG-Premier League · 2699 min · 0.18
2024/25
GER-Bundesliga · 673 min · 0.10
2025/26
ENG-Premier League · 2198 min · 0.27
5Lewis CookENG
ENG-Premier League 2024/25 · 2978 min · 0.15 npG+A/90 · d = 0.60
Followed by:
2025/26
ENG-Premier League · 874 min · 0.16
Target
Patrick Berg
MF · age 29 · NOR-Eliteserien 2025/26 · 2292 min · 0.21 npG+A/90 quality
Nearest 5 at the same age
5 nearest analogs and what followed
1Jordan LarssonSWE
DEN-Superliga 2025/26 · 2281 min · 0.20 npG+A/90 · d = 0.03
No later season in the corpus.
2Emrah BaşsanTUR
TUR-Süper Lig 2020/21 · 2283 min · 0.21 npG+A/90 · d = 0.54
Followed by:
2021/22
TUR-Süper Lig · 1940 min · 0.19
2022/23
TUR-Süper Lig · 1220 min · 0.17
2023/24
TUR-Süper Lig · 1483 min · 0.09
2024/25
TUR-Süper Lig · 801 min · 0.13
3Miguel CardosoPOR
TUR-Süper Lig 2022/23 · 2333 min · 0.21 npG+A/90 · d = 0.54
Followed by:
2023/24
TUR-Süper Lig · 2508 min · 0.13
2024/25
TUR-Süper Lig · 2857 min · 0.19
2025/26
TUR-Süper Lig · 2852 min · 0.11
4Marco RichterGER
GER-2. Bundesliga 2025/26 · 2208 min · 0.18 npG+A/90 · d = 0.55
No later season in the corpus.
5Tomáš LadraCZE
CZE-First League 2025/26 · 2020 min · 0.17 npG+A/90 · d = 0.56
No later season in the corpus.
Target
Sondre Ørjasæter
MF · age 23 · NED-Eredivisie 2025/26 · 3375 min · 0.15 npG+A/90 quality
Nearest 5 at the same age
5 nearest analogs and what followed
1Kodai SanoJPN
NED-Eredivisie 2025/26 · 3060 min · 0.15 npG+A/90 · d = 0.42
No later season in the corpus.
2Fisayo Dele-BashiruNGA
TUR-Süper Lig 2023/24 · 3035 min · 0.15 npG+A/90 · d = 0.47
Followed by:
2024/25
ITA-Serie A · 947 min · 0.24
2025/26
ITA-Serie A · 1187 min · 0.10
3Jarne SteuckersBEL
BEL-Pro League 2024/25 · 3097 min · 0.17 npG+A/90 · d = 0.50
Followed by:
2025/26
BEL-Pro League · 1439 min · 0.17
4Isa SakamotoJPN
BEL-Pro League 2025/26 · 2999 min · 0.16 npG+A/90 · d = 0.59
No later season in the corpus.
5Matisse SamoiseBEL
BEL-Pro League 2023/24 · 3069 min · 0.10 npG+A/90 · d = 0.65
Followed by:
2024/25
BEL-Pro League · 2029 min · 0.04
2025/26
BEL-Pro League · 1368 min · 0.13
Target
Jens Hjertø-Dahl
MF · age 21 · NOR-Eliteserien 2025/26 · 2372 min · 0.11 npG+A/90 quality
Nearest 5 at the same age
5 nearest analogs and what followed
1Mario DorgelèsCIV
DEN-Superliga 2024/25 · 2225 min · 0.09 npG+A/90 · d = 0.27
Followed by:
2025/26
POR-Primeira Liga · 996 min · 0.14
2Thomas JørgensenDEN
DEN-Superliga 2025/26 · 2579 min · 0.13 npG+A/90 · d = 0.33
No later season in the corpus.
3Mateusz KowalczykPOL
POL-Ekstraklasa 2024/25 · 2465 min · 0.12 npG+A/90 · d = 0.34
Followed by:
2025/26
POL-Ekstraklasa · 2188 min · 0.07
4Tomasz PieńkoPOL
POL-Ekstraklasa 2024/25 · 2487 min · 0.10 npG+A/90 · d = 0.35
Followed by:
2025/26
POL-Ekstraklasa · 1384 min · 0.11
5Sander KilenNOR
NOR-Eliteserien 2025/26 · 2066 min · 0.12 npG+A/90 · d = 0.42
Followed by:
2026/27
NOR-Eliteserien · 1264 min · 0.10
Target
Joachim Soltvedt
DF · age 31 · NOR-Eliteserien 2025/26 · 1752 min · 0.15 npG+A/90 quality
Nearest 5 at the same age
5 nearest analogs and what followed
1Viljar VevatneNOR
NOR-Eliteserien 2024/25 · 1727 min · 0.09 npG+A/90 · d = 0.56
No later season in the corpus.
2Casper Højer NielsenDEN
TUR-Süper Lig 2024/25 · 2024 min · 0.11 npG+A/90 · d = 0.72
Followed by:
2025/26
TUR-Süper Lig · 2702 min · 0.02
3Bas KuipersNED
NED-Eredivisie 2024/25 · 1724 min · 0.12 npG+A/90 · d = 0.72
Followed by:
2025/26
POR-Primeira Liga · 1348 min · 0.09
2026/27
NED-Eredivisie · 540 min · 0.10
4Kaan AyhanTUR
TUR-Süper Lig 2024/25 · 1726 min · 0.08 npG+A/90 · d = 0.83
No later season in the corpus.
5Uğur ÇiftçiTUR
TUR-Süper Lig 2022/23 · 1793 min · 0.08 npG+A/90 · d = 0.84
Followed by:
2023/24
TUR-Süper Lig · 3206 min · 0.03
2024/25
TUR-Süper Lig · 2655 min · 0.07
Target
Henrik Falchener
DF · age 23 · NOR-Eliteserien 2025/26 · 2576 min · 0.07 npG+A/90 quality
Nearest 5 at the same age
5 nearest analogs and what followed
1Fredrik SjøvoldNOR
NOR-Eliteserien 2025/26 · 2594 min · 0.10 npG+A/90 · d = 0.24
Followed by:
2026/27
NOR-Eliteserien · 1646 min · 0.07
2Mikkel RaknebergNOR
NOR-Eliteserien 2024/25 · 2311 min · 0.06 npG+A/90 · d = 0.36
Followed by:
2025/26
NOR-Eliteserien · 2057 min · 0.02
3Mathias TønnessenNOR
NOR-Eliteserien 2025/26 · 2422 min · 0.02 npG+A/90 · d = 0.45
No later season in the corpus.
4Zinedin SmajlovicSWE
NOR-Eliteserien 2025/26 · 2274 min · 0.04 npG+A/90 · d = 0.45
Followed by:
2026/27
NOR-Eliteserien · 896 min · 0.03
5Mattia ZanottiITA
SUI-Super League 2025/26 · 2548 min · 0.04 npG+A/90 · d = 0.47
No later season in the corpus.
Target
Leo Østigård
DF · age 27 · ITA-Serie A 2025/26 · 2622 min · 0.14 npG+A/90 quality
Nearest 5 at the same age
5 nearest analogs and what followed
1Jules KoundéFRA
ESP-La Liga 2024/25 · 2605 min · 0.11 npG+A/90 · d = 0.33
Followed by:
2025/26
ESP-La Liga · 2261 min · 0.11
2Emanuele ValeriITA
ITA-Serie A 2024/25 · 2873 min · 0.14 npG+A/90 · d = 0.34
Followed by:
2025/26
ITA-Serie A · 2643 min · 0.08
3Benjamin HenrichsGER
GER-Bundesliga 2023/24 · 2526 min · 0.13 npG+A/90 · d = 0.36
Followed by:
2024/25
GER-Bundesliga · 935 min · 0.10
4Nico SchlotterbeckGER
GER-Bundesliga 2025/26 · 2520 min · 0.14 npG+A/90 · d = 0.36
No later season in the corpus.
5Theo HernándezFRA
ITA-Serie A 2023/24 · 2791 min · 0.17 npG+A/90 · d = 0.38
Followed by:
2024/25
ITA-Serie A · 2696 min · 0.15
Target
Fredrik André Bjørkan
DF · age 28 · NOR-Eliteserien 2025/26 · 2457 min · 0.06 npG+A/90 quality
Nearest 5 at the same age
5 nearest analogs and what followed
1Eirik SaunesNOR
NOR-Eliteserien 2025/26 · 2496 min · 0.05 npG+A/90 · d = 0.10
Followed by:
2026/27
NOR-Eliteserien · 1454 min · 0.01
2Jesper TåjeNOR
NOR-Eliteserien 2024/25 · 2228 min · 0.04 npG+A/90 · d = 0.34
Followed by:
2025/26
NOR-Eliteserien · 2186 min · 0.05
3Jacob RasmussenDEN
DEN-Superliga 2024/25 · 2520 min · 0.02 npG+A/90 · d = 0.35
Followed by:
2025/26
AUT-Bundesliga · 2232 min · 0.02
2026/27
GER-2. Bundesliga · 450 min · 0.00
4Odin BjørtuftNOR
NOR-Eliteserien 2025/26 · 2266 min · 0.10 npG+A/90 · d = 0.39
Followed by:
2026/27
NOR-Eliteserien · 1676 min · 0.02
5Stratos SvarnasGRE
POL-Ekstraklasa 2024/25 · 2504 min · 0.03 npG+A/90 · d = 0.40
Followed by:
2025/26
POL-Ekstraklasa · 2361 min · 0.03
Target
Oliver Braude
DF · age 22 · NED-Eredivisie 2025/26 · 2815 min · 0.06 npG+A/90 quality
Nearest 5 at the same age
5 nearest analogs and what followed
1Bünyamin BalcıTUR
TUR-Süper Lig 2021/22 · 2740 min · 0.06 npG+A/90 · d = 0.17
Followed by:
2022/23
TUR-Süper Lig · 2810 min · 0.04
2023/24
TUR-Süper Lig · 1858 min · 0.07
2024/25
TUR-Süper Lig · 1363 min · 0.03
2025/26
TUR-Süper Lig · 2349 min · 0.06
2Yukinari SugawaraJPN
NED-Eredivisie 2021/22 · 2635 min · 0.06 npG+A/90 · d = 0.24
Followed by:
2022/23
NED-Eredivisie · 2398 min · 0.16
2023/24
NED-Eredivisie · 2557 min · 0.16
2024/25
ENG-Premier League · 1557 min · 0.16
2025/26
GER-Bundesliga · 2428 min · 0.15
3Milan van EwijkNED
NED-Eredivisie 2021/22 · 2897 min · 0.03 npG+A/90 · d = 0.25
Followed by:
2022/23
NED-Eredivisie · 3060 min · 0.09
4Jurriën TimberNED
NED-Eredivisie 2022/23 · 3029 min · 0.06 npG+A/90 · d = 0.28
Followed by:
2024/25
ENG-Premier League · 2417 min · 0.12
2025/26
ENG-Premier League · 2454 min · 0.23
5Melle MeulensteenNED
NED-Eredivisie 2020/21 · 2945 min · 0.03 npG+A/90 · d = 0.31
Followed by:
2021/22
NED-Eredivisie · 2880 min · 0.03
2022/23
NED-Eredivisie · 2699 min · 0.07
2023/24
NED-Eredivisie · 2039 min · 0.05
2025/26
NED-Eredivisie · 2826 min · 0.11
Target
Eivind Helland
DF · age 21 · NOR-Eliteserien 2025/26 · 2986 min · 0.02 npG+A/90 quality
Nearest 5 at the same age
5 nearest analogs and what followed
1Bung Meng FreimannSUI
SUI-Super League 2025/26 · 2752 min · 0.03 npG+A/90 · d = 0.51
Followed by:
2026/27
SUI-Super League · 450 min · 0.00
2Filip LubereckiPOL
POL-Ekstraklasa 2025/26 · 2615 min · 0.02 npG+A/90 · d = 0.58
Followed by:
2026/27
POL-Ekstraklasa · 716 min · 0.00
3Bünyamin BalcıTUR
TUR-Süper Lig 2020/21 · 3022 min · 0.06 npG+A/90 · d = 0.64
Followed by:
2021/22
TUR-Süper Lig · 2740 min · 0.06
2022/23
TUR-Süper Lig · 2810 min · 0.04
2023/24
TUR-Süper Lig · 1858 min · 0.07
2024/25
TUR-Süper Lig · 1363 min · 0.03
4Morrison AgyemangGHA
CRO-HNL 2024/25 · 2788 min · 0.02 npG+A/90 · d = 0.66
No later season in the corpus.
5Marvin YoungNED
NED-Eredivisie 2025/26 · 2970 min · 0.02 npG+A/90 · d = 0.66
Followed by:
2026/27
NED-Eredivisie · 528 min · 0.06
* 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 Norwegian-eligible player with a complete 2025/26 season in a covered league — 236 players — with the numbers behind the atlases. Names with a card link to it.
* 2025/26 season, at least 450 minutes; the club is the one with the most minutes that season. NT = national-team call-up 2025–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
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
FBref (via soccerdata): player season tables (standard, playing time) for the 9 headline leagues, the Eliteserien, the peer domestic leagues and the German second tier; the country page "Players from Norway" for pool discovery; the nationality column for peer counts
Wikipedia: national-team squad tables (2026 FIFA World Cup) for the call-up flag
Wikidata / Wikimedia Commons: player portraits (P18) matched on name, citizenship and date of birth; credits in the footer
UEFA association coefficients (via Wikipedia) as the league-strength source, ClubElo being unreachable at run time
Eurostat: population estimates, 2024
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: Tobias Lauritsen, the Norwegian player with the most 2025/26 minutes among those who cleared the inclusion floor.
Tobias Lauritsen: raw row and feature row
Raw FBref row, 2025/26
Column
Value
league
NED-Eredivisie
season
2025-2026
team
Sparta R.
player
Tobias Lauritsen
nation
NOR
pos
FW
born
1997
age
27
mp
34
min
3039
gls
12
ast
5
pk
3
crdy
4
crdr
0
Feature row after the pipeline
Feature
Raw
Shrunk
Quality-adjusted
Z-score
npg_p90
0.267
0.268
0.137
−0.65
ast_p90
0.148
0.144
0.074
−0.09
min_share
0.993
0.993
0.993
2.30
age
27.000
27.000
27.000
0.32
cards_p90
0.118
0.119
0.119
−0.60
Six wrangling checks turn the raw rows above into the pool used everywhere else in this report, recomputed on every run:
Women's entries filtered: 0 entries.
Namesakes in the pool: 6 players.
Pool players without season tables: 686 players.
Split-season rows collapsed: 441 rows.
Unmatched call-up names: 62 names.
Missing birth years: 0 rows.
Unjoined goalkeeper rows: 12 rows.
Eliteserien rows without a nationality: 6 rows.
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.
npg_p90 — non-penalty goals per 90 minutes: penalties are shot quality, not open-play production, and inflate a taker's raw goal count for reasons that have nothing to do with how the player creates chances
ast_p90 — assists per 90 minutes: the direct creative complement to non-penalty goals, on the same basic table for every league in the corpus
min_share — minutes played ÷ (club matches × 90): the coach's own read of the player, sturdier than counting appearances (see below)
age — age at the season's start (start year − birth year): median production still shifts by age band in this corpus (see below), so it stays as its own axis rather than being folded into anything else
cards_p90 — yellow + 2 × red cards per 90 minutes: a discipline signal folded into one rate because red cards alone are too sparse a signal on their own (see below)
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):
Candidate
Statistic
Value
Decision
gls_p90
Correlation with npg_p90
0.973
Replaced by npg_p90
mp
Correlation with minutes played
0.844
Replaced by minutes share
crdr_p90
Share of player-seasons with zero red cards
0.854
Folded into cards
age
Spread of median goals + assists per 90 across age bands (max − min band)
0.028
Kept
born
Share of player-seasons missing a birth year
0.003
Kept — required for the player key
Despite the high correlation, goals and non-penalty goals diverge for the players who take penalties: Jan Kalabiška (CZE-First League, 100 %); Ali Kabacalman (SUI-Super League, 100 %); Derrick Köhn (GER-Bundesliga, 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.
What shrinkage does to a low-minute player: at the inclusion floor the league median still carries most of the weight; Andreas Helmersen's rate moves the most of any Norwegian-eligible player this season.
League multipliers (quality projection)
npG/90_quality = npG/90_shrunk × m_league
League
Multiplier
ENG-Premier League
1.000
ITA-Serie A
0.856
ESP-La Liga
0.807
GER-Bundesliga
0.788
FRA-Ligue 1
0.666
POR-Primeira Liga
0.630
BEL-Pro League
0.573
NED-Eredivisie
0.510
TUR-Süper Lig
0.484
GER-2. Bundesliga
0.473
POL-Ekstraklasa
0.438
CZE-First League
0.434
NOR-Eliteserien
0.374
DEN-Superliga
0.371
SUI-Super League
0.293
AUT-Bundesliga
0.268
HUN-NB I
0.265
CRO-HNL
0.249
SVK-Super Liga
0.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 Eliteserien 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).
In these terms, a Eliteserien season converts to 0.57 of a Premier League one (90 % HDI 0.51–0.64).
League
m_L (median)
90 % HDI
Transitions
UEFA
ENG-Premier League
1.000
1.000–1.000
588
1.000
ITA-Serie A
0.935
0.891–0.983
569
0.856
ESP-La Liga
0.907
0.864–0.956
435
0.807
FRA-Ligue 1
0.810
0.772–0.848
672
0.666
GER-Bundesliga
0.777
0.739–0.812
588
0.788
HUN-NB I
0.742
0.622–0.864
35
0.265
POR-Primeira Liga
0.721
0.680–0.764
349
0.630
BEL-Pro League
0.671
0.635–0.710
474
0.573
CZE-First League
0.664
0.587–0.751
65
0.434
TUR-Süper Lig
0.660
0.625–0.696
472
0.484
POL-Ekstraklasa
0.659
0.592–0.721
131
0.438
AUT-Bundesliga
0.655
0.579–0.730
80
0.268
DEN-Superliga
0.636
0.575–0.700
117
0.371
GER-2. Bundesliga
0.600
0.554–0.642
229
0.473
CRO-HNL
0.599
0.525–0.665
64
0.249
NED-Eredivisie
0.597
0.565–0.631
386
0.510
SUI-Super League
0.596
0.539–0.652
128
0.293
NOR-Eliteserien
0.574
0.507–0.642
64
0.374
Refit on seasons before 2025/26, the model predicts each mover's first 2025/26 row after a league change — 862 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).
Method
Log predictive density
MAE (rate)
Same rate as before
−2.628
0.137
Rate × UEFA ratio
−2.733
0.151
Model
−2.177
0.129
Against 18 leagues in common, the model's medians and the UEFA multipliers correlate at Spearman's rho = 0.72.
HUN-NB I: model rank 6 vs UEFA rank 17 (m_L 0.74 vs multiplier 0.27).
NED-Eredivisie: model rank 16 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.007, minimum bulk ESS 619, 0 divergent transitions across 8108 player-seasons from 2125 movers; fit in 212 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.44, 90th percentile 11.00 vs 10.86.
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.
Model
2021/22
2022/23
2023/24
2024/25
2025/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.0710 (0.052)
0.0759 (0.054)
0.0722 (0.053)
0.0681 (0.051)
0.0713 (0.052)
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 92 % of the time, pooled across the 4 origins it was fit for (2022/23: 91 %, 2023/24: 90 %, 2024/25: 91 %, 2025/26: 92 %).
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.
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 Norway, the model dates the break to 2004/05 (27 % posterior probability), a ×0.66 (0.29–1.34, 90 % HDI) change in the level; the random walk's own innovation scale is σ = 0.196.
The recovery after it is dated to 2021/22 (23 % posterior), a ×1.32 (0.34–2.23) change in the level. The most probable seasons for each:
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:
Origin
Forecast season
Actual
Model median (90 % interval)
Naive
2010/11
2011/12
8
9 (3–18)
10
2011/12
2012/13
9
8 (3–17)
8
2012/13
2013/14
12
9 (3–18)
9
2013/14
2014/15
5
10 (4–21)
12
2014/15
2015/16
9
7 (2–15)
5
2015/16
2016/17
11
8 (3–16)
9
2016/17
2017/18
6
9 (4–18)
11
2017/18
2018/19
7
8 (3–15)
6
2018/19
2019/20
12
7 (3–15)
7
2019/20
2020/21
10
9 (4–19)
12
2020/21
2021/22
18
10 (4–19)
10
2021/22
2022/23
17
14 (6–25)
18
2022/23
2023/24
16
15 (7–29)
17
2023/24
2024/25
19
16 (7–29)
16
2024/25
2025/26
25
17 (9–30)
19
Pooled across 15 origins: MAE 3.20 for the model against 3.40 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:
Country
Season
Median
90 % interval
Norway
2026/27
21
11–37
Denmark
2026/27
35
22–51
Czechia
2026/27
11
5–19
A demonstration of the method on a count of players, not a statement about any player.
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.
β = +10.11 per 10 percentage points of U21 share (90 % HDI −1.69–23.26), R² = 0.27; OLS on the same 8 country means lands close by, at +10.65 (−3.85–20.33), and the pooled-panel OLS slope agrees in sign at +7.76 (1.12–13.99). n = 8; the interval is wide because the panel is small.
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 = −0.16 per 10 percentage points (90 % HDI −2.53–2.17), n = 16 country-seasons (R-hat ≤ 1.004, minimum bulk ESS 851, 0 divergent transitions; posterior-median country-intercept scale σ_country = 5.19). 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)
Country
Season
U21 share
Per million
CRO
2024/25
12.8 %
15.54
DEN
2024/25
13.2 %
13.42
NOR
2024/25
10.5 %
9.01
SUI
2024/25
9.2 %
5.36
AUT
2024/25
6.4 %
5.02
CZE
2024/25
11.1 %
2.20
HUN
2024/25
12.2 %
1.36
POL
2024/25
12.5 %
1.26
DEN
2025/26
15.3 %
12.58
CRO
2025/26
14.0 %
12.18
NOR
2025/26
11.5 %
9.37
SUI
2025/26
7.7 %
6.03
AUT
2025/26
9.2 %
4.80
CZE
2025/26
6.3 %
2.39
HUN
2025/26
14.1 %
1.57
POL
2025/26
9.3 %
1.23
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.
How to read it: the whole bar is the gap in players per million between the comparison country and Norway. 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.
Contrast
Channel
Contribution
Share of gap
90 % interval
Denmark Gap (players per million): +3.21
U21 minutes
+3.15
98 %
+1.24 – +4.49
League strength
−3.54
−110 %
−4.91 – −1.27
Export age
0.00
0 %
0.00 – 0.00
Residual
+3.60
—
—
Czechia Gap (players per million): −6.98
U21 minutes
−4.25
61 %
−5.94 – −1.43
League strength
−5.14
74 %
−7.16 – −1.89
Export age
0.00
0 %
0.00 – 0.00
Residual
+2.41
—
—
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 Norwegian players go when they leave?", reused here) — 115 players, ages 17–31 — 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 quadratic 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.
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 Norwegian exports — hover for the name.
Age
Expected G+A/90 (median)
90 % HDI
19
0.14
0.12 – 0.16
21
0.14
0.12 – 0.16
23
0.14
0.12 – 0.16
25
0.14
0.12 – 0.16
27
0.14
0.12 – 0.16
β, per one-unit increase in origin-league strength (m_L): −0.03 (−0.11–0.05).
Norwegian exports' own country effect: −0.01 (−0.04–0.00); Norwegian exports arrive at a median age of 21.
The same model, fit again without origin-league strength: the country-effect scale (σ_n) is 0.135 with the league term in the model and 0.139 without it — what moves between the two is what the league term is absorbing.
Leave-one-nation-out: excluding Norway's own 18 exports (n = 97 remaining) and refitting, the 21-vs-24 difference is +0.01 (−0.01–0.02), against 0.00 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.14 vs 0.14, sd 0.10 vs 0.10, 10th percentile 0.02 vs 0.01, 90th percentile 0.27 vs 0.28.
R-hat ≤ 1.005, minimum bulk ESS 978, 0 divergent transitions across 115 players; fit in 6.9 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
Group
Projection
PC
% variance
npG/90
A/90
min share
age
cards/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 Norwegian-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, 30 change nobody in that set; the largest churn is 5 (NOR-Eliteserien multiplier -20%, mean rank shift 2.70 in the top twenty)*.
Scenario table
Scenario
Description
Top-10 overlap
Top-10 churn
Mean Δ 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%
28 / 30
2
0.88
ENG-Premier League_plus20
ENG-Premier League multiplier +20%
29 / 30
1
0.40
ITA-Serie A_minus20
ITA-Serie A multiplier -20%
30 / 30
0
0.45
ITA-Serie A_plus20
ITA-Serie A multiplier +20%
29 / 30
1
0.23
ESP-La Liga_minus20
ESP-La Liga multiplier -20%
30 / 30
0
0.00
ESP-La Liga_plus20
ESP-La Liga multiplier +20%
30 / 30
0
0.00
GER-Bundesliga_minus20
GER-Bundesliga multiplier -20%
29 / 30
1
0.63
GER-Bundesliga_plus20
GER-Bundesliga multiplier +20%
30 / 30
0
0.07
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.13
NED-Eredivisie_minus20
NED-Eredivisie multiplier -20%
29 / 30
1
0.97
NED-Eredivisie_plus20
NED-Eredivisie multiplier +20%
28 / 30
2
0.75
POR-Primeira Liga_minus20
POR-Primeira Liga multiplier -20%
30 / 30
0
0.10
POR-Primeira Liga_plus20
POR-Primeira Liga multiplier +20%
30 / 30
0
0.15
BEL-Pro League_minus20
BEL-Pro League multiplier -20%
30 / 30
0
0.13
BEL-Pro League_plus20
BEL-Pro League multiplier +20%
30 / 30
0
0.10
TUR-Süper Lig_minus20
TUR-Süper Lig multiplier -20%
30 / 30
0
0.18
TUR-Süper Lig_plus20
TUR-Süper Lig multiplier +20%
29 / 30
1
0.37
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%
30 / 30
0
0.00
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.23
POL-Ekstraklasa_plus20
POL-Ekstraklasa multiplier +20%
30 / 30
0
0.37
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%
29 / 30
1
0.47
DEN-Superliga_plus20
DEN-Superliga multiplier +20%
30 / 30
0
0.45
SUI-Super League_minus20
SUI-Super League multiplier -20%
30 / 30
0
0.00
SUI-Super League_plus20
SUI-Super League multiplier +20%
30 / 30
0
0.00
NOR-Eliteserien_minus20
NOR-Eliteserien multiplier -20%
25 / 30
5
2.70
NOR-Eliteserien_plus20
NOR-Eliteserien multiplier +20%
26 / 30
4
2.45
GER-2. Bundesliga_minus20
GER-2. Bundesliga multiplier -20%
30 / 30
0
0.00
GER-2. Bundesliga_plus20
GER-2. Bundesliga multiplier +20%
30 / 30
0
0.00
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 Norwegian-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 Norwegian-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).
Check
Count
What it counts
Women's entries filtered
0 entries
FBref country-page entries dropped for a surname ending in -ová (see Limitations).
Namesakes in the pool
6 players
Active pool players sharing a normalised name (e.g. father and son), disambiguated by club.
Pool players without season tables
686 players
Norwegian professionals on FBref's country page who play in a league without season tables and carry no metrics.
Split-season rows collapsed
441 rows
Player-season-group rows merged into one after a mid-season transfer (minutes summed, rates minutes-weighted).
Unmatched call-up names
62 names
National-team squad-table names that match no Norwegian-eligible row in the feature tables.
Missing birth years
0 rows
Season-table rows of nation NOR with no birth year, which cannot form a player_key.
Unjoined goalkeeper rows
12 rows
Keeper-page rows with no matching GK row in the season tables on (league, season, team, player_key); dropped from every goalkeeper exhibit.
Eliteserien rows without a nationality
6 rows
Season-table rows in the Eliteserien 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. 686 of the 1197 Norwegian 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 Norwegian second tier is not fetched, and Sweden's top flight is not in the fetched set, so the nearest neighbour's exhibits are absent rather than thin. The Eliteserien is a calendar-year league; its season labelled 2025/26 here is the 2025 season.
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 2025–26" is parsed from Wikipedia squad tables (2026 FIFA World Cup) and matched on normalised name plus birth year. 20 of the 236 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
218 of the 1197 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 Norwegian 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:
Season-to-season model comparison (M1): rolling-origin evaluation over 5 seasons, pooled RMSE favours Gradient boosting (0.071 vs 0.075 for persistence), the Bayesian model's 90 % interval covered 92 % of observed values.
League strength (M2): R-hat ≤ 1.007, 0 divergent transitions, out-of-sample log predictive density favours "Model" (−2.177), Spearman rho = 0.72 against the UEFA multipliers.
The break and forecast (M4): the break dates to 2004/05 (27 % posterior) for Norway, a ×0.66 level change; the plain local level beats the naive baseline on MAE (3.20 vs 3.40) with 100 % of the 90 % intervals covering the observed value over 15 rolling-origin backtests.
The youth-minutes panel (M3): across 8 countries (country means, n = 8), the between-country slope is +10.11 per 10 percentage points of U21 share (−1.69–23.26), R² = 0.27; a plain pooled OLS slope agrees in sign at +7.76 (1.12–13.99) — the interval is wide because the panel is small. A within-country check (country-random-intercept fit on the full two-season panel) finds no signal: β_within = −0.16.
The gap decomposition (M5): ridge fit (α = 1.00) on n = 8 peer countries; for Denmark, the residual is +3.60 of a 3.21 gap — a decomposition of a correlation, not a causal accounting.
Age at export (M1 proper): R-hat ≤ 1.005, 0 divergent transitions across 115 players; β on origin-league strength is −0.03; leaving out 18 Norwegian exports and refitting shifts the 21-vs-24 difference by +0.0047.
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.
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.
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.
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.
Related methods and what was taken from them
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.
Empirical-Bayes shrinkage of a sparse per-unit rate toward a group mean (Efron and Morris, 1975) · taken: per-90 rates are shrunk toward the league-season median with a K = 10 phantom-match prior before the quality projection (§ Bayesian shrinkage) · left out: the fully hierarchical variance-component estimate the original method also supports, since one shared K fits this corpus's minutes floor well enough for a descriptive report.
Multilevel (partial-pooling) regression and posterior predictive checking as a model-diagnosis routine (Gelman et al., 2013) · taken: the league-strength and youth-panel models pool leagues and countries partially rather than fitting each alone or merging them into one, and the league-strength posterior predictive check (§ League strength) compares simulated to observed production · left out: model comparison by WAIC/LOO, since every model here is instead scored on seasons it never trained on (rolling-origin backtests), a stronger check for this report's purpose.
The No-U-Turn Sampler, the gradient-based MCMC method PyMC uses by default (Hoffman and Gelman, 2014) · taken: every Bayesian model in this report — league strength, model comparison, the change-point series, the youth panel — is fit with it and diagnosed on R-hat and divergences · left out: variational inference as a faster approximate alternative, since none of the four models is slow enough to need it.
Plus-minus and regularised adjusted plus-minus ratings, which isolate a player's contribution from teammates' and opponents' by regression (Kharrat, McHale and Peña, 2020; Hvattum, 2019) · taken: the league-strength model's within-player logic — only a mover's own before/after change of league separates their level from the league's scoring environment — follows the same identification idea, applied to leagues rather than teammates · left out: an actual RAPM fit over lineup data, which this corpus's season-level tables (no lineups, no possession data) cannot support.
Bayesian online change-point detection, a sequential method for locating a shift in a data-generating process (Adams and MacKay, 2007) · taken: a single unknown break season with a marginalised discrete location parameter, applied here to a short batch series rather than sequentially · left out: the online/sequential setting and multiple change points, since the series in question (one country's Big-5 count per season) is short, fixed, and plausibly has at most one structural shift.
The local-level model — a random walk plus noise for a slowly drifting series — in the state-space tradition (Durbin and Koopman, 2012) · taken: the change-point model (§ Dating the break) is exactly this local level in log space, with one added step change at the break · left out: a local linear trend or seasonal component, since the series is annual and too short for a trend term to be identifiable.
Rolling-origin (time-series) cross-validation: refit on data up to each origin, score only on what came after it (Hyndman and Athanasopoulos, 2021) · taken: both the model-comparison exercise (§ Three models, one task) and the change-point backtest (§ Dating the break) are scored this way, never on a random split that could leak future seasons into training · left out: expanding-vs-sliding-window variants beyond the single expanding-window scheme, since the corpus's five metrics seasons leave little room to compare schemes.
The Oaxaca–Blinder decomposition, splitting a gap between two groups' means into an explained and an unexplained part via a linear model (Oaxaca, 1973; Blinder, 1973) · taken: the gap-decomposition exhibit (§ What the gap is made of) splits the per-capita gap into the three measured channels plus a residual the same way · left out: the detailed, coefficient-level decomposition of the explained share, since three channels are few enough to read directly off the coefficients themselves.
The silhouette coefficient, a per-point measure of how well a clustering separates its groups (Rousseeuw, 1987) · taken: used to sanity-check the PCA cluster counts per position group and projection before they were fixed (§ Cluster archetypes) · left out: a silhouette sweep reported in the text, since the chosen cluster counts are stable across position groups and projections.
Gradient-boosted trees and a small multilayer perceptron, two non-Bayesian machine-learning baselines standard in this kind of comparison (Pedregosa et al., 2011) · taken: both sit alongside the persistence, shrinkage and Bayesian models in § Three models, one task, on the same eight features and the same rolling-origin split · left out: hyperparameter search beyond scikit-learn's defaults (plus the MLP's 64/32 hidden layers), since the comparison's point is model family, not a tuned leaderboard.
CIES Football Observatory's periodic counts of footballers playing outside their home association (Poli, Ravenel and Besson, 2024) · taken: the out-of-sample league-strength check (§ League strength) tracks the same population — players who changed league — though it does not reuse CIES's own counts · left out: CIES's expatriate-share figures as a number quoted in this report, since the per-capita and pathways exhibits already answer the same question from this report's own fetched player tables.
Next steps not attempted
Player-season embeddings and graph methods over the transfer network — clubs and moves as a graph, players as nodes with learned representations — are natural next tools (graph neural networks, specifically) for a pool this size, but were not attempted here.
Event- and tracking-derived features (pressing intensity, progressive carries, expected threat) would sharpen the style axis beyond the five box-score numbers used here, but no tracking data source was available for this corpus.
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.
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.