Como funcionam os rankings

SigningLab transforma dados públicos de partidas em uma resposta quantitativa pra uma pergunta simples: quem fez as melhores contratações esse ano?

O que conta como contratação

Pra cada temporada e clube, identificamos jogadores que apareceram pela primeira vez em partidas oficiais daquela equipe. O jogador precisa ter tido tempo mínimo em campo (200 minutos por padrão no futebol, equivalentes em outros esportes) pra ser considerado uma contratação "avaliável" — exclui curiosidades de 5 minutos no fim de jogo.

Para cobertura cross-source (api-football + súmulas FGF no Gauchão), resolvemos o mesmo time entre IDs diferentes através de um mapa de aliases que evita contar um Internacional duas vezes ou perder um Grêmio.

Como cada contratação é pontuada

Para cada jogador-time-temporada, calculamos features estatísticas e produzimos um score (z-score combinado). A versão atual é v3 e prioriza produção objetiva normalizada por posição:

  • G+A por 90 min, normalizado por posição (45%) — o sinal dominante. Carlos Vinícius com 12 gols em 954 minutos vence Tiago Volpi mesmo com Volpi jogando o ano inteiro.
  • Rating médio normalizado por posição (15%) — nota de partida (api-football) comparada à média de outros jogadores na mesma posição.
  • Minutos normalizados por posição (15%) — recompensa contribuição ao longo da temporada.
  • % titular, valor de mercado, idade-pico, custo por g+a, upgrade de liga ao revender, cartões vermelhos (5% cada) — sinais secundários.

Goleiros e defensores têm a feature de "gols por 90 min" zerada no score (não vence ranking porque um zagueiro fez 2 gols num ano). Isso mantém goleiros competindo entre si por rating e minutos, sem inflacionar o ranking geral.

Tiers

Excelente
Top 15% por percentil
Boa
Próximos 35%
Mediana
Próximos 30%
Ruim
Bottom 20%

Os limites são calculados por temporada e liga — uma "Excelente" no Brasileirão não é a mesma coisa que uma "Excelente" no Paulistão.

Score do clube

Para o ranking de clubes, agregamos os scores individuais com ajuste por força de liga (Premier League pesa mais que Série B). O score final é a média ponderada das contratações daquele clube, com bônus por concentração de "Excelente" + "Boa".

Fontes de dados

  • api-football — partidas, escalações, estatísticas e ratings de 50+ ligas de futebol e cobertura histórica até 2008.
  • FGF (Federação Gaúcha) — súmulas oficiais em PDF do Gauchão, parseadas pra cobrir dados que api-football não tem.
  • MLB Stats API — beisebol, transações nativas (signings, trades).
  • NHL public API — hóquei, rosters por temporada.
  • nflverse — futebol americano via CSVs mantidos pela comunidade (licença permissiva).
  • cricsheet.org — ball-by-ball de 9 ligas T20 (IPL, BBL, PSL, etc). cricsheet.org, ODbL 1.0.
  • Liquipedia — esports (LoL incluindo CBLOL). liquipedia.net, CC BY-SA 3.0.
  • stats.wnba.com — basquete feminino americano.
  • LNB — basquete brasileiro (NBB).
  • euroleague-api — basquete europeu.

Limitações conhecidas

  • Ratings têm viés posicional. Goleiros recebem média 7.07 no api-football vs ~6.88 dos outros — o algoritmo conta defesas/clean sheets pesado. A versão v3 do score compensa parcialmente via normalização por posição. A próxima iteração migra ratings pra SofaScore (em desenvolvimento).
  • Ligas africanas tier-2 (Marrocos, Argélia, Tunísia, Nigéria, etc) têm fixtures mas api-football não expõe stats de jogador — só temos os resultados, sem ranking de contratações.
  • Pré-2021 no Gauchão não existe online; a FGF só começou a publicar súmulas digitais em 2021.
  • Esports / LoL não temos stats de performance por jogador, apenas roster changes. Ranking de LoL atual é por volume de contratações, não qualidade.

Quem fez isso

Projeto pessoal de Alessandro Almeida, mantido em código aberto em github.com/alessandroUSF/signinglab. Sugestões e correções são bem-vindas — abra um issue ou me mande email.