Machine Learning com Python: Jogadores com desempenhos semelhantes aos de Messi e Benzema na temporada de 2022

Charles Júnior
Data Hackers
Published in
10 min readAug 25, 2023
Reprodução / Twitter

Contextualização

No ano de 2022, Benzema estava atuando pelo Real Madrid e foi escolhido como o melhor jogador pela revista France Football. Enquanto isso, Messi, que atuava pelo PSG e que também se consagrara campeão do mundo com a seleção da Argentina, recebeu a distinção de melhor jogador do mundo pela FIFA. Entretanto, como podemos agrupar jogadores que tenham apresentado desempenhos similares aos desses dois atletas? Uma abordagem viável é a clusterização, que integra os algoritmos não supervisionados de aprendizado de máquina. Essa técnica cria clusters com elementos homogêneos intra grupo e heterogêneos extra grupo.

Na clusterização, existem dois modelos: O hierárquico, que foi utilizado na análise do Benzema e o não hierárquico, que foi usado para o Messi. Pela quantidade de observações envolvidas, poderia aplicar sem problemas qualquer um dos dois modelos, entretanto serão utilizados os dois tipos apenas para fins didáticos.

Algoritmos não supervisionados exploram dados para identificar padrões internos, sem fazer previsões ou inferências.

Recursos

A base de dados utilizada é da FIFA e referente ao ano de 2022 e contém diversas informações relativas ao desempenho dos jogadores, englobando aspectos como passes, dribles, chutes de longa distância, finalizações, entre outros.

Para a aplicação das técnicas de ciência de dados, foi utilizado o Python e o Jupyter Notebook.

Critérios utilizados

Importante relatar que, ao longo do processo da análise de dados, algumas considerações merecem atenção. Uma delas diz respeito ao potencial impacto que cada campeonato pode exercer sobre os desempenhos dos jogadores, devido a possibilidade de que os números de desempenho de um jogador que atua na Europa podem apresentar níveis inferiores ou superiores devido ao elevado grau de competitividade intrínseco a essa região, em contrapartida a um campeonato realizado em outra localidade. Nesse contexto, um critério viável consistiria na avaliação exclusiva de jogadores que atuaram na Europa em 2022. A análise efetuada não teve o propósito de aprofundar em questões semelhantes a essa.

Outro aspecto relevante é o critério adotado para a construção do dataframe, o qual impacta no resultado final dos clusters. Foi utilizada a posição em que jogam Benzema e Messi, conforme existente na coluna “player_positions” do arquivo. Contudo, é possível que, em uma análise mais abrangente, não seja usado tal critério. Nesse contexto, pode ser conveniente, por exemplo, aplicar o modelo a todos os jogadores existentes no arquivo ou até mesmo considerar a incorporação de mais valores presentes nas colunas “player_positions” ou “club_position” (dependendo da necessidade). Os critérios adotados para a elaboração dos dataframes relativos a Messi e a Benzema, nesse trabalho, foram os seguintes:

Para Messi: A variável “player_positions”, tendo o valor “RW”.

Para Benzema: A variável “player_positions”, com o valor “CF, ST”.

Data Wrangling

Os dados geralmente precisam ser preparados antes de aplicados ao modelo, pois raramente estão prontos. Essa etapa é conhecida como data wrangling.

O arquivo original tem um total de 192.239 registros e 110 colunas. Ao término do processo de data wrangling, foram gerados dois dataframes. O primeiro, denominado “df_h”, engloba os jogadores que compartilham a mesma posição de Benzema. Esse dataframe é composto por 51 observações e 35 variáveis. O segundo, nomeado como “df_kmeans”, abrange os jogadores que ocupam a mesma posição de Messi, contendo um total de 1523 observações e 35 variáveis.

As variáveis aplicadas ao modelo foram as seguintes:

Variáveis utilizadas na clusterização

Padronização das variáveis

Padronizar variáveis é essencial na preparação dos dados para análise de clusters, ajustando-as para média zero e desvio padrão um. Muitos algoritmos de cluster são sensíveis à escala, então isso evita distorções. A padronização garante que todas as variáveis sejam comparáveis, independentemente de suas magnitudes ou unidades diferentes, evitando pesos desiguais. Com variáveis padronizadas, os algoritmos de cluster funcionam melhor, produzindo resultados mais confiáveis. Técnicas como Z-score ou Min-Max Scaling podem ser usadas para padronizar, garantindo consistência e significância nos resultados.

Neste trabalho a padronização no Python foi feito da seguinte maneira:

df_scaled = df_h.copy()
df_scaled.iloc[:, :] = StandardScaler().fit_transform(df_h)

Transformação da coluna “short_name” para índice de registro

Transformar uma coluna em índice de registro é necessário para aplicar a clusterização dos jogadores. Porém, os valores na coluna a ser tranformada devem ser únicos. São esses índices que comporão os elementos de cada cluster. Em Python, essa transformação é realizada com o seguinte código:

# Criando um vetor com os nomes dos jogadores
nomes_h = df_h['short_name'].values
# Removendo a coluna com os nomes dos jogadores
df_h.drop('short_name', axis=1, inplace=True)
# Nomeando as linhas com o nome dos jogadores para rodar o modelo
df_h.index = nomes_h
Antes e depois da renomeação do índice

Observe na imagem que a coluna com o nome dos jogadores agora passou a ser o índice do registro.

Exploração dos dados

Antes de empregar técnicas de machine learning, é interessante fazer uma análise exploratória a fim de compreender sua natureza. No Python, o comando df_h.describe() apresenta as estatísticas dos dados.

Estatísticas do dataframe

Outra análise interessante são as correlações entre as variáveis. Ao utilizar o comando sb.pairplot(df_h.iloc[:, :6]) no Python, é possível visualizar a correlação entre as seis primeiras variáveis do dataframe (foram apresentadas apenas 6 variáveis, pois exibir todas as 35 resultaria em quadrantes excessivamente pequenos para disponibilizar por aqui).

Outra representação gráfica importante das correlações entre variáveis é o gráfico de calor. A coluna da diagonal principal reflete a relação intrínseca de cada variável consigo mesma, portanto, apresenta valor 1 e coloração intensa. A interação entre as variáveis é evidenciada pela tonalidade das cores, sendo que tons mais claros indicam menor correlação entre elas.

Gráfico de calor

Agrupamento Benzema (hierárquico com método Ward)

O modelo hierárquico efetua o agrupamento por meio de diversas técnicas, como a distância Euclidiana, a distância Minkowski, entre outras. Neste trabalho, foi empregado o cálculo de distância Euclidiana por meio do método de Ward. Além do método de Ward, existem outras abordagens, incluindo Single Linkage, Complete Linkage, Average Linkage e Centroid Method. Normalmente, o modelo hierárquico é preferível quando o conjunto de dados apresenta um número menor de observações. A vantagem de usar um dendrograma consiste na capacidade de visualizar a formação progressiva dos grupos ao longo do processo.

Dendrograma do modelo hierárquico

Durante a análise dos dados pode haver a necessidade em trabalhar apenas com um conjunto específico de jogadores. O código Python abaixo permite aplicar o recurso.

# Para analisar jogadores específicos
jogadores_interesse = ['K. Benzema', 'Anderson Talisca', 'João Félix', 'Gonçalo Ramos']
df_jogadores = df_scaled.loc[jogadores_interesse, :]
# Gerando um novo dendograma apenas com os jogadores específicos
Z = hierarchy.linkage(df_jogadores, 'ward')
plt.figure(figsize=(18,10))
plt.grid(axis='y')
plt.grid(False)
dn = hierarchy.dendrogram(Z, labels=list(df_jogadores.index), leaf_font_size=8)
Dendrograma com jogadores específicos

Como dito, uma das vantagens do uso do dendrograma reside na sua capacidade de mostrar como os grupos se formam. Isso ajuda a estabelecer um ponto de corte para a quantidade de clusters. Porém, existem técnicas que auxiliam na identificação do que seria o número ideal de clusters, tais como o método Elbow, Silhueta, entre outros. Será abordado o método Elbow na criação do modelo k-means.

No dendrograma abaixo, foi adicionado um linha tracejada que representa o ponto de corte para a criação de quatro clusters.

Dendrograma com a linha de corte para quatro grupos

Temos então a criação do modelo hierárquico com quatro grupos. No output abaixo, apresentado pelo Python, o Benzema está no Cluster 2, ou seja, os jogadores que também estão nesse grupo são os que tiveram desempenhos similares à ele.

Output no Python com os clusters criados

Agrupamento Messi (não hierárquico com k-means)

Assim como feito na análise hierárquica, explorar os dados destinados ao modelo não hierárquico é importante. Os comandos utilizados anteriormente em Python, para explorar o DataFrame df_h (estatísticas, gráfico de correlação e calor) podem ser aplicados ao DataFrame df_kmeans, para também explorar as variáveis antes da aplicação ao modelo.

O algoritmo K-means agrupa os dados em K clusters, onde o valor de K deve ser estabelecido previamente. Essa técnica calcula centróides para cada cluster, atribuindo pontos ao centróide mais próximo e buscando otimizar a variância dentro de cada grupo.

Diferente do dendrograma, o K-means não exibe o processo gradual de formação de grupos, pois requer que o número de clusters seja determinado antes da execução do algoritmo. Isso significa que os grupos precisam ser pré-estabelecidos.

O modelo não hierárquico é frequentemente usado com um maior volume de observações, enquanto o hierárquico é mais adequado para um volume menor. A decisão de qual modelo usar depende de algumas questões, como por exemplo: natureza dos dados, objetivos da análise, estrutura computacional envolvida, etc.

Existem métodos que são usados para determinar o número adequado de clusters para um algoritmo K-means, como o Elbow e Silhueta.

Método do Cotovelo (Elbow Method): Traça a soma das distâncias quadradas dentro de cada grupo em relação ao número de clusters. O ponto na “curva de cotovelo” indica o número ideal de clusters.

Método Silhueta (Silhouette Method): Avalia a semelhança dos pontos num cluster com os demais, variando de -1 a 1. Valores altos mostram melhor separação entre os grupos. O número ideal de clusters é onde a média da métrica da silhueta é máxima.

Utilizamos o método Elbow para determinar a quantidade de cluster de jogadores que o k-means deverá criar.

No gráfico gerado pelo método do Cotovelo (Elbow), é possível observar que após o quarto ou quinto ponto, as distâncias entre os clusters deixam de ter uma distância significativa. Isso indica que a adição de mais clusters não resulta em uma redução significativa na variabilidade. Esse ponto é conhecido como o “cotovelo” do gráfico, e geralmente é escolhido como o número ideal de clusters, pois representa um equilíbrio entre a explicação da variabilidade e a complexidade do modelo. Portanto, no contexto da criação dos grupos de jogadores semelhantes ao Messi, quatro clusters podem ser considerados como uma escolha apropriada com base na análise do gráfico Elbow.

Usando PCA para reduzir a dimensionalidade e plotar o scatter

O dataframe contém 35 variáveis e essa alta dimensionalidade dificulta a criação de um gráfico de dispersão para visualizar a formação dos grupos. Para uma interpretação mais intuitiva, é preferível a representação em duas dimensões. Porém, ao escolher duas variáveis de forma aleatória, há uma chance de que essas variáveis possam não ser as mais representativas para capturar a verdadeira estrutura da formação dos clusters.

Por essa razão, em vez de escolher duas colunas de dados de forma aleatória para plotar o scatter bidimensional, utilizou-se um outro algoritmo de machine learning: PCA (Análise de Componentes Principais).

Após a redução da dimensionalidade pela PCA, foi então plotado o scatter.

A análise visual dos clusters pode ser enriquecida com a criação de diversos outros tipos de gráfico. Abaixo são apresentados os gráficos de área e com a posicão dos centróides.

Após aplicar o machine learning para criar os quatro clusters indicados pelo método Elbow, o Python gerou o output abaixo.

Cluster 0
Cluster 1
Cluster 2
Cluster 3

No output, o grupo no qual Messi está incluído é o Cluster 0, composto por jogadores que tiveram desempenhos semelhantes. Como o DataFrame possui ~1523 jogadores, o grupo ficou muito grande com ~304 jogadores. Aumentar o número de cluster para o k-means irá diminuir a quantidade de jogadores no grupo do Messi, todavia, conforme sugerido pelo método Elbow, o indicado é algo em torno de 4 clusters e manteremos essa quantidade. Mas, uma vez que o desejado seja, por exemplo, extrair uma lista com apenas 10 jogadores, quais escolher? Um critério poderia ser o de criar um ranking com 10 jogadores melhores posicionados no cluster do Messi. Porém, é preciso ter cuidado ao se criar um ranking. Deve-se evitar a ponderação arbitrária. Para isso, a PCA pode ser novamente usada, ou seja, além de reduzir a dimensionalidade a PCA também pode ser usada para criar ranking sem ponderação arbitrária. Após aplicar a PCA para obter o ranking, foi apresentada a seguinte lista no output:

Ranking melhores pontuados cluster Messi

Segue o resultado final dos jogadores com desempenho similiares ao Benzema e Messi em seus campeonatos na temporada 2022, segundo os dados.

Jogadores com desempenho similares ao Benzema e Messi (em seus campeonatos)

Considerações Finais

A seleção dos jogadores para compor os dataframes foi realizada considerando apenas a posição dos jogadores conforme existente no arquivo. O resultado final poderá ser diferente se houver alteração nesse critério, o que poderá aumentar o número de observações (jogadores) ou em outros pontos, como por exemplo considerar um grupo estratégico de variáveis. Portanto, é essencial aprofundar os estudos no assunto e na análise desejada. Isso permitirá uma melhor preparação do modelo para obter o melhor resultado.

Materiais

O Notebook com o código está disponível no GIT: https://github.com/charlesjuniorx/artigos-python-cluster

Referências

Fávero, Luiz Paulo Lopes e Belfiore, Patrícia P. Manual de análise de dados: estatística e modelagem multivariada com excel, SPSS e stata. Rio de Janeiro: Elsevier. 2017

Grus, Joel. Data Science do Zero. Primeiras Regras com o Python. Rio de Janeiro. Alta Books, 2016

Mckinney, Wes. Python for Data Analysis: Data Wrangling with Pandas, Numpy and IPython. O’Reilly. USA, 2017.

--

--