Skip to content

Instantly share code, notes, and snippets.

@henriquepgomide
Last active September 21, 2019 21:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save henriquepgomide/6c137adec6737a9d72c92816e7374c14 to your computer and use it in GitHub Desktop.
Save henriquepgomide/6c137adec6737a9d72c92816e7374c14 to your computer and use it in GitHub Desktop.

Acabou o primeiro turno do Brasileirão deste ano. Com isso temos dados de 19 rodadas para analisar o desempenho dos atletas. Escalar jogadores no Cartola é sempre um desafio de minimizar os riscos.

Cartoleiros letrados e numerados sempre começam olhando para as médias da temporada, probabilidade de vitória nos confrontos. Cartoleiros estudiosos também olham métricas mais refinadas tais como média em casa / fora, quantidade de chutes a gol, impedimentos, número de faltas…

Tentar classificar jogadores passa a ser então um problema bastante difícil de ser feito através da observação sistemática do atletas. Certo?

Neste tutorial, iremos tentar responder a pergunta usando um conjunto de técnicas bastante utilizadas entre cientistas de dados para tentar responder a seguinte questão.

É possível agrupar jogadores com estatísticas semelhantes no Cartola?

Metodologia

Para responder a esta questão, usaremos uma técnica de agrupamento conhecida por escalonamento multidimensional. De maneira resumida, iremos representar objetos com atributos multidimensionais numa matriz de dimensões reduzidas. Objetos com características mais semelhantes, estarão mais próximos. Isto é, combinar várias estatísticas dos jogadores do cartola num gráfico com dois eixos apenas e aqueles jogadores que possuírem características mais próximas estarão mais próximos uns dos outros.

Além de agrupar os jogadores com métricas similares, aplicaremos um algoritmo de agrupamento conhecido como Agrupamento por Propagação de Afinidade (do inglês, Affinity Propagation). Diferente de métodos clássicos de agrupamento como k-médias e k-medoides, o algoritmo de propagação por afinidade não requer que o número de clusteres seja definido de antemão pelo analista. Este algoritmo foi publicado na revista Science em 2007. Olhe as referências para satisfazer sua curiosidade.

Análise de agrupamentos

Bem, primeiro vamos aos dados do Cartola. Em parceria com Arnaldo, eu organizo estatísticas do Cartola no repositório do Github caRtola. Nele você encontrará dados e estatísticas de 2014 até 2019. Vamos aproveitar uma base de 2019 que é atualizada toda rodada. :)

Vamos aproveitar a leitura e ver quais dados o arquivo nos fornece.

https://gist.github.com/6aa6cbc5347f1b274093fc2405c4c8e1

## Observations: 622
## Variables: 26
## $ player_slug               <chr> "paulo-andre", "evandro", "betao", "ra…
## $ player_id                 <int> 37604, 37614, 37646, 37655, 37656, 376…
## $ player_nickname           <chr> "Paulo André", "Evandro", "Betão", "Ra…
## $ player_team               <int> 293, 277, 314, 290, 283, 275, 293, 341…
## $ player_position           <chr> "zag", "mei", "zag", "ata", "gol", "za…
## $ price_cartoletas          <dbl> 3.91, 5.04, 4.82, 3.26, 9.06, 6.97, 7.…
## $ score_mean                <dbl> 0.7250000, 1.1200000, 2.2812500, 0.483…
## $ score_no_cleansheets_mean <dbl> -0.5250000, 1.1200000, 1.0312500, 0.48…
## $ diff_home_away_s          <dbl> -0.07976546, -0.10409680, -1.08546112,…
## $ n_games                   <int> 4, 5, 16, 6, 16, 4, 5, 9, 17, 15, 7, 2…
## $ score_mean_home           <dbl> 4.5000000, 1.1000000, 1.6428571, 0.433…
## $ score_mean_away           <dbl> -0.5333333, 1.1333333, 2.7777778, 0.53…
## $ shots_x_mean              <dbl> 0.0000000, 0.4000000, 0.1250000, 0.500…
## $ fouls_mean                <dbl> 1.5000000, 1.2000000, 1.1250000, 1.166…
## $ RB_mean                   <dbl> 0.5000000, 1.0000000, 1.5000000, 0.333…
## $ PE_mean                   <dbl> 0.500000, 1.600000, 2.000000, 0.500000…
## $ A_mean                    <dbl> 0.00000000, 0.00000000, 0.00000000, 0.…
## $ I_mean                    <dbl> 0.00000000, 0.00000000, 0.00000000, 0.…
## $ FS_mean                   <dbl> 0.0000000, 0.6000000, 1.0000000, 0.666…
## $ FF_mean                   <dbl> 0.00000000, 0.20000000, 0.12500000, 0.…
## $ G_mean                    <dbl> 0.0000000, 0.0000000, 0.0000000, 0.000…
## $ DD_mean                   <dbl> 0.000, 0.000, 0.000, 0.000, 1.125, 0.0…
## $ DP_mean                   <dbl> 0.000, 0.000, 0.000, 0.000, 0.125, 0.0…
## $ status                    <chr> "Provável", "Provável", "Provável", "P…
## $ price_diff                <dbl> 0.11, 0.56, 1.78, -0.53, -0.24, 0.56, …
## $ last_points               <dbl> 1.7, 3.4, 7.2, -0.5, -2.6, 4.5, 17.7, …

Uma breve descrição das métricas. Temos apelido, código do time, e as médias acumuladas para quase todos os scouts do Cartola. Além disso, temos a média acumulada em casa/fora, a diferença entre as médias casa/fora padronizadas (diff_home_away_s), número de jogos na temporada entre outros.

Antes de iniciar de aplicar as técnicas de agrupamento, vamos preparar um pouco o banco de dados para conduzir as análise. A limpeza incluí: selecionar jogadores com no mínimo 10 jogos na temporada (estamos na 19 rodada no momento deste tutorial). Também, iremos nos concentrar apenas nos atacantes. Nos próximos posts iremos nos debruçar sobre os dados de outras posições.

https://gist.github.com/6dfd8f5c028b3f662fd070f7af05c33c

Quais scouts estão associados com melhores médias?

Antes de começar nossa análise de agrupamentos, nada melhor que conhecer nossos dados um pouco melhor. O que será que está mais correlacionado com a pontuação dos meias e atacantes?

https://gist.github.com/ff1cfd50de91079413e6dcad876bfe4d

Percebemos que as variáveis mais associadas à pontuação são: média de pontos em casa, média fora, média de gols e média de chutes esperados. As outras métricas possuem associação fraca.

Análise de agrupamentos

https://gist.github.com/612597a32b2106428ca3b53da3412355

https://gist.github.com/d8efd14716e45c5c568cf0097c294fac

Análise

Hoje tem gol. Sabe de quem?

Ao analisar a figura acima, podemos perceber os agrupamentos criados pelo algoritmo. Temos ao total 9 agrupamentos de atacantes. O mais distante de todos, possui apenas uma observação. Gabigol é o nome da fera. As estatísticas do atacante de gol são semelhantes a dupla CR7 e Messi.

Deixando nosso outlier de lado, vamos aproveitar para interpretar o que seriam estas duas dimensões. Se Gabigol está distante, já podemos concluir que a primeira dimensão está ligada à pontuação do cartola. Vamos aproveitar e tentar identificar o que faz Bruno Henrique (Flamengo), Pedro (Fluminense) e Wellignton Silva estarem em extremos na segunda dimensão.

https://gist.github.com/fb4838856fd2ef7cfd2eac020c5e377b

player_slug score_mean diff_home_away_s score_mean_home score_mean_away shots_x_mean G_mean
wellington-silva 2.97 -1.75 1.15 5.70 1.00 0.10
gabriel 10.77 2.03 13.87 8.06 3.27 1.07
bruno-henrique 6.30 2.52 10.09 2.93 2.65 0.41
pedro 5.89 -1.37 4.14 7.64 2.00 0.50

Aparentemente já conseguimos entender as duas dimensões. Enquanto o eixo ‘x’ é ligado à quantidade de pontos, o ‘y’ está ligado a diferência da pontuação entre a média dentro e fora de casa. Pedro e Wellington Silva estão no topo e são jogadores que possuem média maior fora de casa do que dentro. Bruno Henrique, embora seja um grande pontuador dentro de casa, tem um desempenho ruim fora. Por isso fica na parte inferior do gráfico.

Interpretando os grupos de jogadores

Próximo passo? Identificar características comuns entre agrupamentos de jogadores. Da direita em direção à esquerda, depois do ponto fora da curva temo (em cinza claro): Gilberto, Sasha, Everton, Bruno Henrique e Everaldo. Vamos olhar as características de cada um e tentar identificar porque Sasha e Everton estão tão próximos.

https://gist.github.com/f23cec4b73b294b69f07425d393f6507

player_slug score_mean diff_home_away_s shots_x_mean fouls_mean RB_mean G_mean A_mean
gilberto 7.33 0.82 1.80 1.00 0.67 0.67 0.13
eduardo-sasha 6.54 1.21 1.83 0.78 1.22 0.44 0.06
everaldo 5.60 2.03 3.17 2.28 0.50 0.44 0.06
everton 6.62 1.44 1.40 0.53 1.13 0.47 0.13
bruno-henrique 6.30 2.52 2.65 1.65 0.41 0.41 0.12
everaldo 2.62 0.18 1.10 1.70 0.80 0.10 0.10
pedro 5.89 -1.37 2.00 0.60 0.40 0.50 0.00

Neste primeiro agrupamento é possível observar que os jogadores possuem como característica comum a média de pontos do cartola. Pedro distoa do grupo por ser um jogador que possui média fora de casa maior que dentro (diff_home_away < 0)). Sasha e Everton possuem métricas semelhantes na quantidade de pontos, quantidade de chutes, roubadas de bola e médias de gols.

E o Kiko?

E o que você pode fazer com isso tudo de informação? Talvez ainda não esteja claro, mas esse tipo de análise pode ser útil para escalar jogadores. Só ao olhar o gráfico, já temos noção de alguns grupos de jogadores que possuem pontuação distinta. Por enquanto, é tentar escalar Gabigol e escolher jogadores dos agrupamentos que possuem confrontos mais fáceis e considerar se os jogos serão em casa ou fora.

Times de futebol, podem usar estratégias semelhantes para encontrar jogadores características semelhantes em caso de venda ou compra dos jogadores para reduzir o risco do investimento em novos talentos. Naturalmente, as métricas devem ser mais elaboradas e fogem do escopo dos dados do cartola.

Quer ver uma análise semelhante para outras posições? Comente aqui.

H.G. :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment