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
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 methodology
Data, assumptions, ranking and evidence have different meanings. Keep them visible when interpreting a shortlist.
Observed profile
What a player did in the selected season, using the existing 18 Player DNA features.
Requirement profile
What the analyst asks for: exact, minimum, maximum or neutral preferences with visible weights and sources.
Club context
Observed team behaviour and role-specific roster distributions. Context does not silently add ranking criteria.
Fit
Weighted root mean squared percentile-point mismatch. Lower means closer to the selected requirements. Hard constraints remove candidates first.
Evidence
Reliable minutes and existing neighbour stability. Evidence is never averaged into football fit.
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
| Method | Queries | Recall@5 | Recall@10 | MRR |
|---|---|---|---|---|
| Existing Player DNA | 31 | 0.419 | 0.806 | 0.259 |
| Family-balanced distance | 31 | 0.419 | 0.774 | 0.231 |
| Threshold + distance | 31 | 0.355 | 0.806 | 0.232 |
| Threshold satisfaction | 31 | 0.258 | 0.806 | 0.237 |
| Weighted requirement distance * | 31 | 0.452 | 0.806 | 0.258 |
| Random expectation | 31 | 0.316 | 0.632 | 0.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
| Method | Queries | Recall@5 | Recall@10 | MRR |
|---|---|---|---|---|
| Existing Player DNA | 56 | 0.732 | 0.875 | 0.402 |
| Family-balanced distance | 56 | 0.643 | 0.857 | 0.388 |
| Threshold + distance | 56 | 0.464 | 0.786 | 0.351 |
| Threshold satisfaction | 56 | 0.518 | 0.732 | 0.336 |
| Weighted requirement distance * | 56 | 0.679 | 0.839 | 0.391 |
| Random expectation | 56 | 0.384 | 0.678 | 0.241 |
| Method | Queries | Recall@5 | Recall@10 | MRR |
|---|---|---|---|---|
| Existing Player DNA | 44 | 0.364 | 0.545 | 0.264 |
| Family-balanced distance | 44 | 0.341 | 0.545 | 0.208 |
| Threshold + distance | 44 | 0.386 | 0.727 | 0.254 |
| Requirements + role + team | 44 | 0.318 | 0.636 | 0.247 |
| Requirements + role median | 44 | 0.364 | 0.591 | 0.229 |
| Threshold satisfaction | 44 | 0.341 | 0.727 | 0.231 |
| Weighted requirement distance * | 44 | 0.341 | 0.545 | 0.208 |
| Random expectation | 44 | 0.225 | 0.450 | 0.163 |
| Method | Queries | Recall@5 | Recall@10 | MRR |
|---|---|---|---|---|
| Requirements + role + team | 12 | 0.583 | 0.667 | 0.513 |
| Requirements + role median | 12 | 0.583 | 0.667 | 0.464 |
| Requirements only | 12 | 0.583 | 0.667 | 0.412 |
| Random expectation | 12 | 0.446 | 0.642 | 0.268 |
| Method | Queries | Recall@5 | Recall@10 | MRR |
|---|---|---|---|---|
| Existing Player DNA | 27 | 0.370 | 0.667 | 0.332 |
| Family-balanced distance | 27 | 0.333 | 0.667 | 0.232 |
| Threshold + distance | 27 | 0.444 | 0.630 | 0.314 |
| Requirements + role + team | 27 | 0.333 | 0.667 | 0.277 |
| Requirements + role median | 27 | 0.407 | 0.667 | 0.271 |
| Threshold satisfaction | 27 | 0.444 | 0.667 | 0.321 |
| Weighted requirement distance * | 27 | 0.333 | 0.667 | 0.232 |
| Random expectation | 27 | 0.220 | 0.440 | 0.160 |
| Method | Queries | Recall@5 | Recall@10 | MRR |
|---|---|---|---|---|
| Requirements + role + team | 12 | 0.417 | 0.750 | 0.210 |
| Requirements + role median | 12 | 0.417 | 0.750 | 0.218 |
| Requirements only | 12 | 0.417 | 0.667 | 0.223 |
| Random expectation | 12 | 0.292 | 0.585 | 0.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.
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
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
| Action | Method | Mean absolute error | RMSE | 50% | 80% | 95% | Mean 80% width |
|---|---|---|---|---|---|---|---|
| Pressures | Hierarchical count model | 3.4 | 4.4 | 46% | 80% | 93% | 10.5 |
| Pressures | Ridge regression | 3.4 | 4.0 | 49% | 82% | 93% | 10.4 |
| Pressures | Role average | 3.3 | 4.1 | 62% | 87% | 96% | 11.1 |
| Pressures | Unchanged sourceDefault | 2.9 | 4.0 | 55% | 76% | 95% | 8.2 |
| Progressive carries | Hierarchical count model | 0.5 | 0.7 | 57% | 92% | 97% | 2.0 |
| Progressive carries | Ridge regression | 0.6 | 0.7 | 50% | 71% | 92% | 1.5 |
| Progressive carries | Role average | 0.7 | 0.9 | 50% | 75% | 92% | 2.2 |
| Progressive carries | Unchanged sourceDefault | 0.5 | 0.7 | 55% | 80% | 96% | 1.6 |
| Progressive passes | Hierarchical count model | 1.0 | 1.3 | 36% | 64% | 82% | 1.8 |
| Progressive passes | Ridge regressionDefault | 0.9 | 1.2 | 30% | 71% | 83% | 1.9 |
| Progressive passes | Role average | 1.1 | 1.5 | 50% | 82% | 96% | 3.8 |
| Progressive passes | Unchanged source | 0.9 | 1.3 | 50% | 71% | 83% | 2.4 |
| Shots | Hierarchical count model | 0.4 | 0.5 | 38% | 71% | 91% | 1.1 |
| Shots | Ridge regressionDefault | 0.4 | 0.5 | 41% | 74% | 97% | 1.0 |
| Shots | Role average | 0.5 | 0.7 | 50% | 80% | 96% | 1.4 |
| Shots | Unchanged source | 0.5 | 0.6 | 50% | 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
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.
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.
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.
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.
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.
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.
| Method | Paired queries | Recall@1 | Recall@5 | Recall@10 | MRR | Top-10 Jaccard |
|---|---|---|---|---|---|---|
| Robust cosine | 89 | 0.393 | 0.798 | 0.978 | 0.575 | 0.613 |
| Robust Euclidean | 89 | 0.438 | 0.82 | 0.921 | 0.614 | 0.653 |
| Global robust scaling | 89 | 0.494 | 0.865 | 0.966 | 0.659 | 0.682 |
| Robust PCA | 89 | 0.449 | 0.831 | 0.921 | 0.612 | 0.642 |
| Selected · standard Euclidean | 89 | 0.472 | 0.843 | 0.944 | 0.636 | 0.669 |
Random Recall@5: 0.337 · 100 bootstrap · seed 20260930
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.
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.
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.
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.
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.
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.
