Série B scouting board
Problem framing
Python
K-means / scikit-learn
Feature engineering
Interactive HTML/JS
Problem
A club shopping for under-27 talent in Brazil's Série B needs an objective, repeatable way to find players who fit a specific tactical role — not the ones with the loudest reputation or the biggest raw goal tally. The underlying question was a product one: how do you turn a sprawling, uneven pool of players into a shortlist a decision-maker can actually act on, in one view?
Approach
- Let the data define the roles. Instead of hand-labelling positions, I used K-means clustering on performance data from a pure Série B player pool to derive position archetypes — what a full-back, a defensive midfielder, a striker actually look like statistically in this league.
- Rank by fit. Every player is scored on similarity to their archetype's centroid, so the closest match to each role surfaces first.
- Make strengths legible. Each player is profiled on percentile bars versus Série B peers in the same position — 15 per-90 metrics — so you read a strength/weakness profile without parsing raw numbers.
- Attach the decision context. Market value and contract-expiry data is joined in for the under-27 cohort, putting "who fits" and "is he gettable" in the same place.
What it produced
- 130 Série B players scored across 9 data-derived position archetypes, each ranked by similarity to its role centroid — a top-of-role shortlist in a single view, with market value and contract data attached for the 37 players it was publicly available for.
- A single, self-contained interactive scouting board: filter by position archetype, toggle to show only players with a known market value, and click any player for a full percentile breakdown.
- A shortlist that is reproducible and explainable — every ranking traces back to the same clustering and percentile logic, not to opinion.
- A reusable template: point the same pipeline at a different league or season and it regenerates.
Note on the data
Independent, personal analysis built on publicly visible match data (FotMob / Sofascore), with publicly
listed market values and contract dates where available. Figures are a dated snapshot (2026 season,
through round 19) and are illustrative of method — not an official club document.