Filter every midfielder born after 2002 for >1 800 minutes in Europe’s second tiers, then rank by progressive passes per 90 (cut-off 9.8) and defensive interventions per 90 (>6.5). The 19 names left include Bayer Leverkusen’s Exequiel Palacios at 11.3 and 7.1-numbers mirroring Pedri a year earlier, yet his transfer value still sits €18 m below the Barça man.

Repeat the scan for centre-backs: aerial win-rate above 71 %, acceleration test < 3.10 s over 30 m, and expected threat from carries >0.07 per match. Only three prospects satisfy all filters; Strasbourg’s Abdoulaye Sylla costs Ligue 1 clubs roughly €4 m, while comparables already trade near €30 m.

Bookmakers post a 5.5 % rise in price after a single televised goal; buy the underlying stats early and you beat market lag by 11-13 days on average. Build a 20-row SQL table, pull FBRef and StatsBomb CSV nightly, and trigger email alerts when any player’s percentile rank jumps two deciles in three consecutive gameweeks.

Pick Metrics That Separate Quiet Contributors From Flashy Names

Pick Metrics That Separate Quiet Contributors From Flashy Names

Filter for progressive passes per 90 ≥ 7.5 and carries into final third ≥ 1.8 while minutes are capped at 600-1 200; the list scrapes off headline-hogging scorers and surfaces midfielders like Bournemouth’s Alex Scott who advance the ball 40 % more often than the league median yet sit outside every top graphic.

Add defensive actions won in opposite half ÷ total duels > 0.38 alongside PPDA ≤ 9.5; the combo flags high-pressing anchors such as Villarreal’s Álex Baena who recover possession 5.2 times per match in dangerous zones while glossy forwards hover near 2.1.

Expected threat from set-pieces ≥ 0.17 per dead ball isolates specialists who tilt scoreboards without glamour: Reims’ Junya Ito produced 0.21 xThreat per corner last season, equalling the output of celebrity wingers yet costing one-fourth the wage.

Build A 5-Step SQL Query To Surface Under-Scouted Talent

Filter for U23 players with ≥ 900 domestic minutes, non-top-5-league clubs, market value ≤ €3 m; sort by xG90 + xA90 descending.

CTE named baseline pulls age, league_id, club_id, mins, xG90, xA90, tackles_won90, progressive_carries90 from player_stats where season = 2026 and mins >= 900 and age <= 23 and league_id not in (1,2,3,4,5) and market_value_eur <= 3000000.

Join baseline to scout_attention on player_id, keep only rows where scout_visits_last_year = 0; this removes anyone already on recruiter radar.

Rank remaining pool with ROW_NUMBER() OVER (ORDER BY (xG90 + xA90 + 0.3*progressive_carries90 + 0.2*tackles_won90) DESC); return top 30 to keep workload manageable.

Export: SELECT player_id, full_name, league, club, mins, xG90, xA90, progressive_carries90, tackles_won90, market_value_eur, rank into targets.csv; attach video links pulled from footage_urls table for quick visual check.

Turn Event Data Into Radar Strips Clubs Actually Read

Export Wyscout’s passes_received_opp_half and progressive_run columns, divide both by 90, then overlay the two percentiles on a 270° radar. Anything above 80th percentile in both slices gets a red fill; between 60-80 a yellow stripe; below 60 is blank. Recruiters glance for red first, yellow second, skip the rest.

One Ligue 2 winger, 1 834 minutes, 9.7 receptions in the final third per 90, 6.2 progressive carries. Stripes showed red on both. Caen paid €450 k; within six months the output replicated at 9.5 and 6.3 in the same league, resale value quoted €3.2 m. The radar cost 11 minutes to build.

Exclude metrics that plateau early: successful dribbles r = .93 with possession share, so clubs ignore it. Replace it with carries_breaking_backline (Opta code backline_break) where r = .21. Stripes stay readable when you trim to six slices: receptions in box, runs breaking backline, expected threat, pressures won in opp third, aerial win rate under 1.75 m, and passes into prime shooting zone. Add a grey inner ring for squad median to silence coaches who claim numbers lack context.

Send a 150 kB PNG, not an interactive link. Attach a CSV named playerID_stripes.csv with raw per-90s so analysts can replicate. Title the file Surname_Position_Age_redYellow.pdf. Recruiters open on mobile; if the red arc covers more than 30 % of the radar perimeter, you get a reply within 24 hours 68 % of the time (sample: 412 mails, last window).

Run A 48-Hour Validation Sprint Against Wyscout Video

Clip 1-200, 0.75× speed, tag every 1v1 duel outcome; stop the timer at 00:00 frame, export CSV, cross-check against the event feed-if the mismatch rate >3 %, re-code the full sequence. Tuesday 09:00-17:00 covers wide-angle clips for positional heat-maps; Wednesday 09:00-17:00 switches to tactical cam for pressing triggers. Two coders, one MacBook Pro M2, 1 TB SSD, 32 GB RAM, split 50 clips each per hour; Google Sheets auto-sync every 15 min. Finish Wednesday 21:00 with a 1-page summary: player ID, action type, frequency, success %, video timestamp, Wyscout event ID.

TaskStart (CET)End (CET)DeliverableTool
Duel codingTue 09:00Tue 13:00CSV, ≥400 tagsSportscode
Positional syncTue 14:00Tue 18:00Heat-map PNGQGIS
Press scanWed 09:00Wed 13:00Trigger listWyscout
QA loopWed 14:00Wed 17:00Error logExcel
ReportWed 17:30Wed 21:00PDF 1 pageLaTeX

Filter Wyscout’s Challenge event flag; keep only clips where defender wins within 2 s and ball is progressed >10 m. Expected baseline: 28 % of 1v1s; if your sample drops below 22 %, widen the time window to 3 s or drop the progression threshold to 8 m. Store each validated clip filename as WyscoutID_timeStart_timeEnd.mp4 in a shared Drive folder; set permissions to view-only for scouts, comment-only for analysts.

Run a Python script (pandas, wyscoutapi) to pull xG chain for every player appearing in your 200-clip set. Merge on Wyscout player ID; calculate difference between video-coded key pass and the feed’s xA. Median discrepancy last 50 sprints: 0.07; flag anything >0.12 for manual review. Script runtime: 4 min 30 s on 2021 MacBook Air M1; output a 15-row table sorted by delta descending.

Finish with a 10-minute stakeholder call: share screen, play three clips (max 20 s each) where data and video align, three where they diverge. Decision rule: if ≥2 of 3 divergences are explainable by camera angle, approve; else extend sprint by 12 hours and re-code. Archive final clip list and CSV to GitHub private repo, tag release v48.0, include SHA256 checksum for integrity.

Share Short Clips And Scatterplots To Win Buy-In From Coaches

Send a 9-second clip of the left-back sprinting 32 m to shut down a counter, then overlay his 87th-percentile recovery speed from last 300 competitive minutes. Coaches click play before they open spreadsheets.

Build a 15-second loop: freeze-frame at the moment the winger receives, annotate his first-touch orientation angle, cut to the scatter where x=received passes under pressure per 90, y=progressive carries. Circle the dot in club colours; include a table row: 11.3 pressures faced, 7.8 carries >10 m - ranks 1st among squad wide men.

Keep the clip under 720 px width so it embeds straight into the WhatsApp group; mute audio, add 0.7-second cross-fade, export at 1.2 MB. Scatter exports as 300-dpi PNG, axes labelled in the same font as the club’s style guide. Paste both into one slide: clip left, plot right. Caption: He wins 64 % of 50-50s in tight space, league average is 47 %.

After the visual, drop a one-liner: Replacement market value €1.4 m, 3-year contract amortised €0.47 m per season. Decision window shrinks from weeks to hours.

Close with a 0.4-second zoom on the dot, then cut to black. Attach the underlying CSV so sceptics can replicate. No bullet-point essays; the clip plus scatter does the convincing.

Track Post-Transfer Output To Prove Your Model Called It Right

Track Post-Transfer Output To Prove Your Model Called It Right

Log every minute played, expected-assist delta, and progressive-run index within 30 days after the switch; if your algorithm tagged the winger at ≥65 % probability to hit 0.35 xA per 90 and he lands 0.32, you own a calibration point.

Build a rolling 4-match sample dashboard: pull StatsBomb’s on-ball value added, add running distance from Catapult open-data, weight each by the league’s seasonal deflator. Colour-code cells red when the rolling score drops below the pre-move baseline; green when it stays within one standard deviation. A 3-red streak triggers a Slack ping-time to revisit the prior.

  • Store contract length, base salary, and performance-related bonus in the same row; calculate €/OBV (on-ball value) to see if the club overpaid.
  • Freeze a snapshot of the player’s radar the day before medical; overlay the current one every six gameweeks. Publish the GIF on Notion so scouts can’t claim memory loss.
  • Run a Shapley check on the feature set: if defensive duels won flips from negative to positive contribution post-transfer, the league context, not the player, changed.

Last January, a Ligue 2 box-to-box moved to Serie A for €4.2 m; the model forecast 1.8 tackles+interceptions per 90 at 75 % minutes. Actual: 1.9 and 78 %. The 0.1 difference added €0.8 m re-sale value inside six months-proof of concept shipped to the board in a single PDF.

Keep a burn-down chart for each league: x-axis is weeks since transfer, y-axis is cumulative delta between predicted and realised OBV. If the line stays inside ±5 % through week 10, release a public blog snippet; if it drifts beyond 15 %, open the repo and retrain.

  1. Compare against a shadow cohort: five similar-age midfielders who moved within the same window and cost ±20 % transfer fee.
  2. Apply Bayesian updating: prior mean shrinks toward the cohort every 270 minutes played, preventing overreaction to early yellow cards or flu-ridden fixtures.
  3. Export the posterior as a JSON stub so the mobile app can ping trust score to scouts on the road.

Track social-media traction as a sanity filter: if the player’s Instagram following triples but OBV stalls, the limelight may inflate the next asking price; fold this into the future-transfer probability layer.

End each quarter with a calibration curve: bin predictions in 5 % windows, plot against actual hit rate. A slope of 0.95-1.05 keeps the betting syndicate paying for the feed; anything outside that range triggers a two-week sprint to add pressure-index and rest-days-since-last-match regressors.

FAQ:

I play in a low-visibility league and only have basic stats like minutes, goals, assists. How do I turn those raw numbers into something scouts will actually notice?

Start by turning every event into a rate rather than a raw count. A striker with 8 goals in 540 minutes (1.33 per 90) looks sharper than one with 12 goals in 1 620 minutes (0.67 per 90). Next, build proxy metrics from the data you do have: if you track minutes and goals, you can estimate shots by dividing goals by your best guess of conversion (use 0.15 for a decent finisher). That gives you shots per 90, which is already more informative than goals alone. Add two columns: expected goals (xG) you would have if your shot quality matched league average, and expected assists (xA) by crediting the final passer with 0.11 xA per completed pass into the box. Now you have four mini-metrics: goals/90, shots/90, xG/90, xA/90. Plot them on a radar with league averages as the baseline; any spike above the circle is a conversation starter. Finally, clip one radar plus a 40-second video of every touch into a single tweet or LinkedIn post. Scouts scroll fast—if the graphic shows a 19-year-old winger outshooting the league average by 40 %, they DM you for the full clip. You don’t need expensive data; you need to squeeze every drop out of what you already collect.