Comparable structure. Different evidence.

A shared schema makes data queryable. It does not make providers, competitions or players interchangeable.

Provider expansion

StatsBomb Open Data and the academic Pappalardo/Wyscout release retain separate identities and native feature registries. Searchable does not imply validated Player DNA, translation eligibility or recruitment suitability. Existing WSL research stays frozen.

Common profile harmonisation

Same label does not guarantee the same measurement. Common v1 retains only non-penalty shots, all pass attempts including restarts, and long pass attempts (≥30 m), per 90. Coordinates use a 105 × 68 m pitch, upper-left origin and attacking direction towards positive x in every period. Four completed-pass candidates were excluded after unknown-outcome coverage checks; no outcomes are imputed.

Rates use nominal regulation minutes (45 + 45); recorded stoppage-time actions remain in the numerator. Unresolved participation conflicts exclude the whole player-season profile.

Common profiles use a conservative subset of independently harmonised features. Provider-native profiles may contain additional information and should not be interpreted as numerically identical measurement systems.

Measured limits

A fixed provider classifier is evaluated on held-out provider identities in men's shared leagues with matched broad roles. Provider, league, season and gender effects cannot be separated causally. Temporal retrieval and bootstrap results describe stability, not predictive football performance.

Common evidence threshold
450 reliable minutes
Held-out provider ROC AUC
0.702
Balanced accuracy
0.653

Cross-provider nearest-neighbour rankings are not published. Three shared measures and detectable provider effects do not establish player-style equivalence.

Derived aggregates only. Raw event files are downloaded separately. StatsBomb research remains non-commercial under its Open Data terms. The Pappalardo/Wyscout academic dataset is CC BY 4.0; no endorsement is implied.

Pappalardo et al. (2019), A public data set of spatio-temporal match events in soccer · Figshare v5 · CC BY 4.0

Full evaluation and limitations ↗

What the evaluation shows

The four final query clubs were held out from method selection. The 2023/24 season had already been examined in Phase 2. These small retrospective tests measure representation consistency and roster alignment, not transfer success.

RECRUITMENT-FIT-V1 · REQUIREMENTS-V1 · CLUB-CONTEXT-V1

Recruitment methodology

Data, assumptions, ranking and evidence have different meanings. Keep them visible when interpreting a shortlist.

1

Observed profile

What a player did in the selected season, using the existing 18 Player DNA features.

2

Requirement profile

What the analyst asks for: exact, minimum, maximum or neutral preferences with visible weights and sources.

3

Club context

Observed team behaviour and role-specific roster distributions. Context does not silently add ranking criteria.

4

Fit

Weighted root mean squared percentile-point mismatch. Lower means closer to the selected requirements. Hard constraints remove candidates first.

5

Evidence

Reliable minutes and existing neighbour stability. Evidence is never averaged into football fit.

6

Translation

Only the separate historical environments supported by Phase 3. Its simple defaults and calibration limitations remain unchanged.

What the evaluation establishes

The four final query clubs were held out from method selection. The 2023/24 season had already been examined in Phase 2. These small retrospective tests measure representation consistency and roster alignment, not transfer success.

View complete evaluation
Final queries · Later-half peer retrieval
MethodQueriesRecall@5Recall@10MRR
Existing Player DNA310.4190.8060.259
Family-balanced distance310.4190.7740.231
Threshold + distance310.3550.8060.232
Threshold satisfaction310.2580.8060.237
Weighted requirement distance *310.4520.8060.258
Random expectation310.3160.6320.210

* Selected on development queries before the final query evaluation. MRR is mean reciprocal rank: higher means the designated peer appears earlier. This peer is a representation-derived label, not an expert judgement.

All development and final comparisons
Development · Later-half peer retrieval
MethodQueriesRecall@5Recall@10MRR
Existing Player DNA560.7320.8750.402
Family-balanced distance560.6430.8570.388
Threshold + distance560.4640.7860.351
Threshold satisfaction560.5180.7320.336
Weighted requirement distance *560.6790.8390.391
Random expectation560.3840.6780.241
Development · Roster holdout
MethodQueriesRecall@5Recall@10MRR
Existing Player DNA440.3640.5450.264
Family-balanced distance440.3410.5450.208
Threshold + distance440.3860.7270.254
Requirements + role + team440.3180.6360.247
Requirements + role median440.3640.5910.229
Threshold satisfaction440.3410.7270.231
Weighted requirement distance *440.3410.5450.208
Random expectation440.2250.4500.163
Development · Club-context ablation
MethodQueriesRecall@5Recall@10MRR
Requirements + role + team120.5830.6670.513
Requirements + role median120.5830.6670.464
Requirements only120.5830.6670.412
Random expectation120.4460.6420.268
Final queries · Roster holdout
MethodQueriesRecall@5Recall@10MRR
Existing Player DNA270.3700.6670.332
Family-balanced distance270.3330.6670.232
Threshold + distance270.4440.6300.314
Requirements + role + team270.3330.6670.277
Requirements + role median270.4070.6670.271
Threshold satisfaction270.4440.6670.321
Weighted requirement distance *270.3330.6670.232
Random expectation270.2200.4400.160
Final queries · Club-context ablation
MethodQueriesRecall@5Recall@10MRR
Requirements + role + team120.4170.7500.210
Requirements + role median120.4170.7500.218
Requirements only120.4170.6670.223
Random expectation120.2920.5850.199

Mean top-10 Jaccard across 205 scenarios: weights 0.950; profile sampling 0.723. Fourteen scenarios have at most ten candidates, which inflates inclusion. Context gains are mixed and do not establish recruitment value.

Read the complete evaluation and limitations ↗

WSL · 2018/19 → 2019/20 → 2020/21

What happened in the later season?

Methods were selected on 12 validation players, then fitted on 65 earlier episodes. The 76 later episodes were untouched until selection was frozen. Lower error is better; coverage should be close to the nominal 80% without unnecessarily wide ranges.

Coverage of the nominal 80% range

Pressures
76%
Progressive carries
80%
Progressive passes
71%
Shots
74%

Vertical marker: 80% nominal coverage. All rows use the later season (n = 76).

Ranges are imperfect: the selected 80% ranges covered 74% of shots, 71% of progressive passes, 80% of carries and 76% of pressures in the later season. Pass and shot uncertainty is understated.

All held-out results
per 90 minutes · n = 76
ActionMethodMean absolute errorRMSE50%80%95%Mean 80% width
PressuresHierarchical count model3.44.446%80%93%10.5
PressuresRidge regression3.44.049%82%93%10.4
PressuresRole average3.34.162%87%96%11.1
PressuresUnchanged sourceDefault2.94.055%76%95%8.2
Progressive carriesHierarchical count model0.50.757%92%97%2.0
Progressive carriesRidge regression0.60.750%71%92%1.5
Progressive carriesRole average0.70.950%75%92%2.2
Progressive carriesUnchanged sourceDefault0.50.755%80%96%1.6
Progressive passesHierarchical count model1.01.336%64%82%1.8
Progressive passesRidge regressionDefault0.91.230%71%83%1.9
Progressive passesRole average1.11.550%82%96%3.8
Progressive passesUnchanged source0.91.350%71%83%2.4
ShotsHierarchical count model0.40.538%71%91%1.1
ShotsRidge regressionDefault0.40.541%74%97%1.0
ShotsRole average0.50.750%80%96%1.4
ShotsUnchanged source0.50.650%80%92%1.3

Study design and model

Three baselines were compared with four hierarchical negative-binomial count models. Minutes enter as exposure; role and team effects are partially pooled. Source activity and only pre-change team context are inputs. Four chains per target had zero divergences and maximum R-hat below 1.006. Good sampling does not guarantee good prediction.

Ridge was selected for shots and progressive passes. Unchanged source rates were selected for carries and pressures. Changing the target team therefore does not change those two default point estimates. No Bayesian target met all validation rules; later results did not change that decision.

65 development episodes and 76 later-season episodes; just 4 held-out team changes. Most observations are the same player at the same club in a later season. Target role is a scenario assumption. Destination minutes and survival in the dataset are selected, so non-playing and failed moves are underrepresented. There is no causal league-strength estimate and no current-season forecast.

Model card and reproducible research ↗

How Player DNA is calculated

1

Evidence first

WSL 2023/24 is a complete 132-match cohort. Playing time is reconciled from starting XIs, substitutions, temporary exits, cards and actual period ends, including stoppage time. Conflicting player-match records are excluded together with their events. The short SkillCorner sample is not used for similarity.

2

Roles and thresholds

Choose 450, 600, 900 or 1,200 reliable minutes. The default is 900. The six supported roles stay separate; at least 12 eligible players are required. Goalkeepers and sparse attacking-midfield cohorts are excluded. Role shares describe observed time; they are not permanent identities.

3

Features and distance

18 style features form five equally weighted families. Each feature is centred on its role-cohort mean and divided by its population standard deviation. Constant features contribute nothing. Distance is the square root of the average within-family mean squared difference. There is no clipping or probability score. Percentiles use the same role, season and threshold; tied values share their midpoint percentile.

4

Progression and chance creation

A progressive completed open-play pass or carry reduces Euclidean distance to the opponent goal centre by at least 10 reference metres and at least 25% of the starting distance. Passes exclude restarts. Penalty-area entries start outside the 16.5 × 40.32 m box and end inside. Shot assists and xA require reciprocal event links; xA uses the linked non-penalty shot’s provider xG. Set-piece assists are included. Shootouts and own goals are excluded.

5

Stability and evaluation

Bootstrap samples resample each player’s whole matches with replacement, rebuild features and refit scaling. Eligibility and roles remain fixed. Inclusion rates count appearances in the top 10; Jaccard measures overlap with the original neighbour set. Temporal evaluation uses disjoint calendar windows and fits scaling on the earlier window only. The experiments also compare cosine, PCA, robust/global scaling, possession context and family ablations.

6

What the experiments did not prove

Role-specific robust scaling and equal family weights did not outperform every control. Standard scaling improved both retrieval and bootstrap stability over the robust baseline. Global scaling performed better on these consistency measures, but is not used for role-relative product interpretation. PCA offered no consistent advantage. Higher thresholds reduce coverage and shrink candidate groups; the resulting increase in stability is not pure evidence of a minutes effect.

Feature definitions

Non-penalty shots · per90
90 * sum(Shot, excluding Penalty and period 5) / sum(reliable elapsed minutes). Observed behaviour in this season; includes stoppage time in the denominator. More is not necessarily better.
Shots from the box · per90
90 * sum(Non-penalty Shot starting in x>=88.5, 13.84<=y<=54.16) / sum(reliable elapsed minutes). Observed behaviour in this season; includes stoppage time in the denominator. More is not necessarily better.
Shot assists · per90
90 * sum(Pass with explicit assisted_shot_id and reciprocal shot.key_pass_id; non-penalty Shot) / sum(reliable elapsed minutes). Observed behaviour in this season; includes stoppage time in the denominator. More is not necessarily better.
Passes into the box · per90
90 * sum(Completed open-play Pass from outside to inside penalty area) / sum(reliable elapsed minutes). Observed behaviour in this season; includes stoppage time in the denominator. More is not necessarily better.
Completed crosses · per90
90 * sum(Completed open-play Pass with pass.cross=true) / sum(reliable elapsed minutes). Observed behaviour in this season; includes stoppage time in the denominator. More is not necessarily better.
Passing volume · per90
90 * sum(All attempted open-play Pass events; exclude Corner, Free Kick, Throw-in, Kick Off, Goal Kick) / sum(reliable elapsed minutes). Observed behaviour in this season; includes stoppage time in the denominator. More is not necessarily better.
Progressive passes · per90
90 * sum(Completed open-play Pass reducing distance to goal (105,34) by >=max(10m,25% of starting distance)) / sum(reliable elapsed minutes). Observed behaviour in this season; includes stoppage time in the denominator. More is not necessarily better.
Final-third entries by pass · per90
90 * sum(Completed open-play Pass from x<70 to end_x>=70) / sum(reliable elapsed minutes). Observed behaviour in this season; includes stoppage time in the denominator. More is not necessarily better.
Long passes · per90
90 * sum(Open-play Pass with canonical Euclidean start-to-end distance >=30m; attempts) / sum(reliable elapsed minutes). Observed behaviour in this season; includes stoppage time in the denominator. More is not necessarily better.
Carrying volume · per90
90 * sum(Provider Carry event count; no synthetic carries) / sum(reliable elapsed minutes). Observed behaviour in this season; includes stoppage time in the denominator. More is not necessarily better.
Progressive carries · per90
90 * sum(Carry reducing distance to goal (105,34) by >=max(10m,25% of starting distance)) / sum(reliable elapsed minutes). Observed behaviour in this season; includes stoppage time in the denominator. More is not necessarily better.
Carry distance · m / 90
90 * sum(Sum of Euclidean Carry displacement in reference metres; not physical tracking distance) / sum(reliable elapsed minutes). Observed behaviour in this season; includes stoppage time in the denominator. More is not necessarily better.
Carries into the box · per90
90 * sum(Carry from outside to inside penalty area) / sum(reliable elapsed minutes). Observed behaviour in this season; includes stoppage time in the denominator. More is not necessarily better.
Pressures · per90
90 * sum(Provider Pressure event count; no inferred off-ball pressure) / sum(reliable elapsed minutes). Observed behaviour in this season; includes stoppage time in the denominator. More is not necessarily better.
Counterpressures · per90
90 * sum(Pressure with counterpress=true) / sum(reliable elapsed minutes). Observed behaviour in this season; includes stoppage time in the denominator. More is not necessarily better.
Tackles · per90
90 * sum(Duel with type Tackle; all outcomes) / sum(reliable elapsed minutes). Observed behaviour in this season; includes stoppage time in the denominator. More is not necessarily better.
Interceptions · per90
90 * sum(Interception event count; all outcomes) / sum(reliable elapsed minutes). Observed behaviour in this season; includes stoppage time in the denominator. More is not necessarily better.
Ball recoveries · per90
90 * sum(Ball Recovery event count; all outcomes) / sum(reliable elapsed minutes). Observed behaviour in this season; includes stoppage time in the denominator. More is not necessarily better.
Non-penalty goals · count
Non-penalty Shot with outcome Goal; own goals excluded. Display or research context only; excluded from the default style distance.
Non-penalty xG · per90
90 * sum(provider xG of non-penalty shots) / reliable minutes. Display or research context only; excluded from the default style distance.
xG per shot · xG / shot
Non-penalty xG / non-penalty shots; no shots -> null. Display or research context only; excluded from the default style distance.
Linked expected assists · per90
90 * sum(non-penalty shot xG linked reciprocally to assist pass) / reliable minutes; includes set pieces. Display or research context only; excluded from the default style distance.
Open-play pass completion · fraction
Completed open-play passes / attempted open-play passes; no passes -> null. Display or research context only; excluded from the default style distance.
Pressures per 100 opponent possessions · per100
100 * Pressure / distinct opponent (match, period, possession) sequences with an event during participation. Display or research context only; excluded from the default style distance.
Interceptions per 100 opponent possessions · per100
100 * Interception / distinct opponent possession sequences during participation. Display or research context only; excluded from the default style distance.
Progressive passes per 100 team possessions · per100
100 * progressive Pass / distinct own-team possession sequences during participation. Display or research context only; excluded from the default style distance.
Share of team passes while playing · fraction
Player open-play attempts / team open-play attempts during player participation. Display or research context only; excluded from the default style distance.

Representation stability

Temporal retrieval measures whether a first-window profile retrieves the same player in a later window. It measures consistency, not scouting quality. Candidate groups are small; see the random baseline.

Minimum reliable minutes: 900
MethodPaired queriesRecall@1Recall@5Recall@10MRRTop-10 Jaccard
Robust cosine890.3930.7980.9780.5750.613
Robust Euclidean890.4380.820.9210.6140.653
Global robust scaling890.4940.8650.9660.6590.682
Robust PCA890.4490.8310.9210.6120.642
Selected · standard Euclidean890.4720.8430.9440.6360.669

Random Recall@5: 0.337 · 100 bootstrap · seed 20260930

01

Keep identities honest

Provider identifiers become stable, namespaced IDs. Players are not joined by similar names. A mapping table records the basis for each identity; no cross-provider identity matches are claimed.

02

Make coordinates explicit

Both sources map to a 105 × 68 m reference pitch, with the origin at the bottom left. StatsBomb events are relative to the acting team. SkillCorner positions retain fixed pitch orientation and the original pitch dimensions. These are transformed coordinates, not new measurements.

03

Treat missing as missing

Absent tracking, unavailable xG and unreliable minutes are shown as unavailable. A recorded zero is different. Per-90 values require at least 30 reliable minutes and remain descriptive in this small sample.

04

Preserve the audit trail

Every input is pinned to a source revision, checksummed and timestamped. Typed records pass validation before Parquet is written. DuckDB produces the analytical tables; validated JSON supplies both the website and the local API.

05

Respect the publication boundary

StatsBomb raw events stay local. This release publishes research aggregates and binned spatial analysis with the required attribution. SkillCorner samples retain their MIT notice. No transfer values, recommendations or invented scores are included.

06

Prepare for temporal evaluation

Match dates, observation dates and extraction times remain distinct. Later work must evaluate on genuinely later periods. A World Cup final and one minute of A-League tracking cannot establish recruitment accuracy or league strength.