Copa do Mundo FIFA 2018: uma abordagem baseada em dados para os escalões de equipes ideais

Com a Copa do Mundo de 2018 chegando neste verão na Rússia, todo fã de futebol de todo o mundo está ansioso para fazer sua previsão sobre qual equipe vencerá este ano. Outra questão para os torcedores é como as equipes nacionais favoritas devem se alinhar: que formação deve ser usada? Quais jogadores devem ser escolhidos? Quais devem ser deixadas no banco ou eliminadas do torneio?

Adepto de futebol entusiasta, comecei a pensar: por que não construir minha própria formação de sonho para minhas equipes favoritas na Copa do Mundo? Como alguém que adora a ciência de dados e cresceu jogando FIFA, percebi que posso usar os dados do extremamente popular video game FIFA18 da EA Sport lançado no ano passado para fazer minha análise.

Neste post, eu mostrarei passo a passo que eu usei para construir a formação mais formidável para as 8 melhores equipes reconhecidas neste torneio: França, Alemanha, Espanha, Inglaterra, Brasil, Argentina, Bélgica e Portugal.

O conjunto de dados FIFA18

Eu encontrei o Dataset FIFA18 no Kaggle . O conjunto de dados contém mais de 17.000 jogadores no FIFA18, cada um com mais de 70 atributos. Ele é extraído do site SoFiFa , extraindo dados pessoais dos jogadores, ID, jogando e estatísticas de estilo. Existem vários recursos interessantes, como valor do jogador, salário, idade e classificação de desempenho que eu realmente quero aprofundar.

Depois de carregar os dados, escolhi apenas as colunas mais interessantes que quero analisar:

 interesting_columns = [ 
'Nome',
'Era',
'Nacionalidade',
'No geral',
'Potencial',
'Clube',
'Valor',
'Salário',
'Posições preferidas'
]
FIFA18 = pd.DataFrame (FIFA18, colunas = colunas_cointerativas)

Aqui está uma rápida olhada nos 5 principais jogadores com base na classificação geral do conjunto de dados:

Visualização de dados

Para dar uma boa noção deste conjunto de dados, fiz várias visualizações da idade dos jogadores, em geral, posição preferida, nacionalidade, valor e salário. Vamos verificar cada um deles:

Como você pode ver, a maioria dos jogadores tem entre 20 e 26 anos, com o pico aos 25 anos.

Este gráfico mostra uma distribuição normal, com a classificação geral média de 66.

Aqui, as 4 posições preferidas mais comuns dos jogadores são o centro-atrás, o atacante, o goleiro e o meio-campista central, nessa ordem.

Eu usei o pacote plot.ly para traçar uma visualização geográfica das nacionalidades dos jogadores. Como você pode ver, os jogadores são muito centralizados na Europa. Para ser preciso, Inglaterra, Alemanha, Espanha e França.

Em termos de valor, fiz um gráfico de dispersão do valor dos jogadores em relação à sua idade e classificação geral. Os valores de pico parecem cair de acordo com a faixa etária de 28 a 33 anos e a classificação geral de 90+.

Em termos de salário, também fiz um gráfico de dispersão do salário dos jogadores em relação à idade e à classificação geral. Os salários máximos parecem cair de acordo com a faixa etária de 30 a 33 anos e a classificação geral de 90+.

Melhor Análise de Esquadrão

Tudo bem, vamos construir algumas formações ideais para as seleções nacionais. Para simplificar essa análise, só pego dados nos quais estou interessado:

 FIFA18 = FIFA18 [['Nome', 'Idade', 'Nacionalidade', 'Geral', 'Potencial', 'Clube', 'Posição', 'Valor', 'Salário']] 
FIFA18.head (10)

Eu escrevi duas funções muito importantes, get_best_squad_n (que, dada a formação de um esquadrão e nacionalidade dos jogadores, retorna um time com os melhores jogadores em suas respectivas posições de acordo com a classificação geral) e get_summary_n (que, dada uma lista de formação de esquadrões) as escolhas e a equipe nacional comparam essas diferentes formações com base na média geral de classificação dos jogadores nessas respectivas formações).

Eu também fiz as escolhas do esquadrão mais rigorosas:

 squad_343_strict = ['GK', 'CB', 'CB', 'CB', 'RB | RWB', 'CM | CDM', 'CM | MDL', 'LB | LWB', 'RM | RW', ' ST | CF ',' LM | LW '] 
 squad_442_strict = ['GK', 'RB | RWB', 'CB', 'CB', 'LB | LWB', 'RM', 'CM | CDM', 'CM | CAM', 'LM', 'ST | CF ',' ST | CF '] 
 squad_4312_strict = ['GK', 'RB | RWB', 'CB', 'CB', 'LB | LWB', 'CM | CDM', 'CM | CAM | CDM', 'CM | CAM | CDM', ' CAM | CF ',' ST | CF ',' ST | CF '] 
 squad_433_strict = ['GK', 'RB | RWB', 'CB', 'CB', 'LB | LWB', 'CM | CDM', 'CM | CAM | CDM', 'CM | CAM | CDM', ' RM | RW ',' ST | CF ',' LM | LW '] 
 squad_4231_strict = ['GK', 'RB | RWB', 'CB', 'CB', 'LB | LWB', 'CM | CDM', 'CM | CDM', 'RM | RW', 'CAM', ' LM | LW ',' ST | CF '] 
 squad_list = [squad_343_strict, squad_442_strict, squad_4312_strict, squad_433_strict, squad_4231_strict] 
 squad_name = ['3-4-3', '4-4-2', '4-3-1-2', '4-3-3', '4-2-3-1'] 

1 – França

Vamos explorar diferentes possibilidades de seleção da França e como isso afeta as classificações.

 França = pd.DataFrame (np.array (get_summary_n (squad_list, squad_name, ['França'])) .recifer (-1,4), colunas = ['Nacionalidade', 'Esquadrão', 'Geral']) 
 France.set_index ('Nacionalidade', inplace = True ) 
 França ['Overall'] = França ['Overall']. Astype (float) 
 imprimir (França) 

Vamos conferir os 11 melhores jogadores franceses em uma formação de 4–3–3.

 rating_433_FR_Overall, best_list_433_FR_Overall = get_best_squad_n (squad_433_strict, 'França', 'Geral') 
 print ('- Geral-') 
print ('Classificação média: {: .1f} ' .format (rating_433_FR_Overall))
imprimir (best_list_433_FR_Overall)

Antoine Griezmann

2 – Alemanha

O campeão da holding é certamente um candidato pesado para o 1º lugar deste ano.

 Alemanha = pd.DataFrame (np.array (get_summary_n (squad_list, squad_name, ['Germany'])) .deschape (-1,4), colunas = ['Nacionalidade', 'Esquadrão', 'Geral']) 
 Germany.set_index ('Nacionalidade', inplace = True ) 
 Alemanha ['Overall'] = Alemanha ['Geral']. Astype (float) 
 imprimir (Alemanha) 

Como você pode ver, as classificações atuais da Alemanha atingem o máximo com 3-4-3 ou 4-3-3. Eu vou em frente com uma opção 4-3-3.

 rating_433_GER_Overall, best_list_433_GER_Overall = get_best_squad_n (squad_433_strict, 'Alemanha', 'Geral') 
 print ('- Geral-') 
print ('Classificação média: {: .1f} ' .format (rating_433_GER_Overall))
imprimir (best_list_433_GER_Overall)

Toni Kroos

3 – Espanha

Como sobre o nosso vencedor de 2010?

 Espanha = pd.DataFrame (np.array (get_summary_n (squad_list, squad_name, ['Spain'])) .deschape (-1,4), colunas = ['Nacionalidade', 'Esquadrão', 'Geral']) 
 Spain.set_index ('Nacionalidade', inplace = True ) 
 Espanha ['Overall'] = Espanha ['Overall']. Astype (float) 
 imprimir (Espanha) 

Bem, a Espanha faz o melhor com 4–3–3 ou 4–2–3–1. Em prol da diversidade, escolherei a formação 4-2-3.

 rating_4231_ESP_Overall, best_list_4231_ESP_Overall = get_best_squad_n (squad_4231_strict, 'Spain', 'Overall') 
 print ('- Geral-') 
print ('Classificação média: {: .1f} ' .format (rating_4231_ESP_Overall))
imprimir (best_list_4231_ESP_Overall)

Sergio Ramos

4 – Inglaterra

Apesar de ter a melhor liga de futebol da Europa, a Inglaterra não parece fazer isso bem em nível nacional. Vamos descobrir suas opções para a próxima Copa do Mundo:

 Inglaterra = pd.DataFrame (np.array (get_summary_n (squad_list, squad_name, ['Inglaterra'])) .muda (-1,4), colunas = ['Nacionalidade', 'Esquadrão', 'Geral']) 
 England.set_index ('Nacionalidade', inplace = True ) 
 Inglaterra ['Overall'] = Inglaterra ['Geral']. Astype (flutuação) 
 print (Inglaterra) 

Inglaterra deve ficar com 4-3-3 então.

 rating_433_ENG_Overall, best_list_433_ENG_Overall = get_best_squad_n (squad_433_strict, 'England', 'Overall') 
 print ('- Geral-') 
print ('Pontuação média: {: .1f} ' .format (rating_433_ENG_Overall)) print (best_list_433_ENG_Overall)

Harry Kane

5 – Brasil

Tendo vencido a Copa do Mundo mais vezes na história, a equipe do Samba será, sem dúvida, um dos principais candidatos para este verão na Rússia.

 Brasil = pd.DataFrame (np.array (get_summary_n (squad_list, squad_name, ['Brasil'])) .recifer (-1,4), colunas = ['Nacionalidade', 'Esquadra', 'Geral']) 
 Brazil.set_index ('Nacionalidade', inplace = True ) 
 Brasil ['Overall'] = Brasil ['Geral']. Astype (float) 
 imprimir (Brasil) 

Como você pode ver, o Brasil tem opções similares como a Inglaterra. 4–3–3 por todo o caminho.

 rating_433_BRA_Overall, best_list_433_BRA_Overall = get_best_squad_n (squad_433_strict, 'Brazil', 'Overall') 
 print ('- Geral-') 
print ('Classificação média: {: .1f} ' .format (rating_433_BRA_Overall))
imprimir (best_list_433_BRA_Overall)

Neymar

6 – Argentina

Lionel Messi ainda está esperando o único troféu que ainda não conseguiu em sua carreira. Ele pode levar a Argentina ao topo depois de ter sido short nos últimos 4 anos?

 Argentina = pd.DataFrame (np.array (get_summary_n (squad_list, squad_name, ['Argentina'])) .muda (-1,4), colunas = ['Nacionalidade', 'Esquadrão', 'Geral']) 
 Argentina.set_index ('Nacionalidade', inplace = True ) 
 Argentina ['Overall'] = Argentina ['Geral']. Astype (float) 
 imprimir (Argentina) 

Ambos 3-4-3 e 4-3-3 são muito bons para os jogadores argentinos. Eu escolho 3-4-3.

 rating_343_ARG_Geral, best_list_343_ARG_Overall = get_best_squad_n (squad_343_strict, 'Argentina', 'Geral') 
 print ('- Geral-') 
print ('Classificação média: {: .1f} ' .format (rating_343_ARG_Overall))
imprimir (best_list_343_ARG_Overall)

Lionel Messi

7 – Bélgica

O Red Devils tem alguns dos melhores jogadores da Premier League inglesa, mas parece que nunca consegue chegar longe em nível nacional. Hazard e De Bruyne podem levá-los longe desta vez?

 Bélgica = pd.DataFrame (np.array (get_summary_n (squad_list, squad_name, ['Belgium'])) .recupera (-1,4), colunas = ['Nacionalidade', 'Esquadrão', 'Geral']) 
 Belgium.set_index ('Nacionalidade', inplace = True ) 
 Bélgica ['Overall'] = Bélgica ['Geral']. Astype (float) 
 imprimir (Bélgica) 

Novamente, 4–3–3 é a melhor formação para a Bélgica.

 rating_433_BEL_Overall, best_list_433_BEL_Overall = get_best_squad_n (squad_433_strict, 'Belgium', 'Overall') 
 print ('- Geral-') 
print ('Classificação média: {: .1f} ' .format (rating_433_BEL_Overall))
imprimir (best_list_433_BEL_Overall)

Kevin De Bruyne

8 – Portugal

Por último, mas não menos importante, o vencedor do Euro 2016 e o ??melhor jogador do mundo 3 vezes seguidas, Cristiano Ronaldo.

 Portugal = pd.DataFrame (np.array (get_summary_n (squad_list, squad_name, ['Portugal'])) .muda (-1,4), colunas = ['Nacionalidade', 'Esquadra', 'Geral']) 
 Portugal.set_index ('Nacionalidade', inplace = True ) 
 Portugal ['Overall'] = Portugal ['Overall']. Astype (float) 
 print (Portugal) 

OK, vou com 4–2–3–1 para Portugal.

 rating_433_POR_Potential, best_list_433_POR_Potential = get_best_squad_n (squad_433_strict, 'Portugal', 'Potencial') 
 print ('- Potencial-') 
print ('Classificação média: {: .1f} ' .format (rating_433_POR_Potential))
imprimir (best_list_433_POR_Potential)

Cristiano Ronaldo

Comparação final

Ok, vamos fazer uma comparação entre esses 8 alinhamentos com a classificação atual de jogadores para esses candidatos mais fortes para a Copa do Mundo de 2018.

Então, baseado puramente no FIFA 18 Data:

  • A Espanha tem a maior média geral, seguida pela Alemanha e pelo Brasil.
  • A Alemanha tem o maior valor total, seguida pela Espanha e pela França.
  • A Espanha tem o maior salário médio, seguida pela Alemanha e pelo Brasil.

Minha aposta é para a Espanha contra a Alemanha na final, e o Brasil contra a França para o 3º lugar. Quais são seus pensamentos?

Você pode ver todo o código-fonte em meu repositório do GitHub neste link ( https://github.com/khanhnamle1994/fifa18 ). Deixe-me saber se você tem alguma dúvida ou sugestão de melhoria!

– –

Se você gostou desta peça, eu adoraria se você apertasse o botão para que os outros pudessem tropeçar. Você pode encontrar meu próprio código no GitHub e mais meus trabalhos e projetos em https://jameskle.com/ . Você também pode me seguir no Twitter , me enviar um e-mail diretamente ou me encontrar no LinkedIn .