Projeto Final CPAD

Hudo Leonardo

2024-09-11

Introducao

Introdução ao problema

A análise foca em avaliar jogadores de futebol no contexto do jogo FIFA 23, utilizando dados sobre suas habilidades, ponteciais e valores de mercado. É abordado como identificar jogadores com um bom custo benefício quando pensamos em performance futura. Isso é relevante para a tomada de decisão no ambito financeiro de montagem de elenco de um time.

Abordagem

Para abordar esse problema, utilizamos dados reais do FIFA 23, que contém informações detalhadas sobre jogadores, como sua nacionalidade, idade, altura, habilidades (ex. precisão no cabeceio), valor de mercado, entre outros. A análise será conduzida em várias etapas:

Preparação e limpeza dos dados para focar nas informações mais relevantes. Análise exploratória para entender a distribuição dos jogadores por países e posições. Criação de uma nova métrica de custo-benefício baseada no potencial e valor de mercado dos jogadores. Visualização dos resultados para encontrar padrões importantes.

Finalidade da análise

A análise ajudará potenciais clientes (como clubes de futebol ou jogadores de FIFA) a tomar decisões informadas sobre investimentos em jogadores. Com a métrica de custo-benefício, eles poderão:

Identificar jogadores com grande potencial de crescimento que estão subvalorizados no mercado. Analisar padrões de desempenho por posição e nacionalidade, auxiliando no recrutamento de talentos. Usar correlações (como altura vs. precisão no cabeceio) para entender melhor quais características impactam diretamente no jogo.

Pacotes usados

Esses são os pacotes utilizados nesse rmarkdown

Preparação de dados

Sobre o dataset

O dataset original se encontra aqui

O dataset original foi criado para fim de análises dos dados do jogo e foi coletado após o lançamento do jogo, em setembro de 2022.

O dataset original conta com 18539 obsservações cada uma com 89 variaveis. Nessas variaveis haviam diversas informações como valores numéricos e strings com links, nomes de times, dentre outros

Carregamento do dataset

É carregado o dataset completo, porém devido ao tamanho do mesmo apenas é mostrado uma parte dele

fifa_dt <- read.csv("Fifa 23 Players Data.csv")
head_fifa <-head(fifa_dt)
datatable(head_fifa, options = list(pageLength = 10, autoWidth = TRUE))

Limpeza de dados

Como mencionado anteriormente, haviam muitas variaveis com informações não tao pertinentes (como link para imagem do clube do jogador, link para a foto do jogador). Além disso, foram removidas múltiplas variáveis de desempenho (como passing, defending etc), algumas foram mantidas para fins de análises

colunas_para_manter <- c(
  'Known.As', 'Overall', 'Potential', 'Value.in.Euro.', 'Positions.Played', 'Nationality', 'Age',
  'Height.in.cm.', 'Wage.in.Euro.', 'Release.Clause', 'Contract.Until', 'Preferred.Foot','Heading.Accuracy'
)
fifa_reduzido <- fifa_dt %>% select(all_of(colunas_para_manter))
datatable(fifa_reduzido)

Informações dos dados limpos

Análise exploratória de dados

Vamos começar com as analises

Análise por país

Aqui teremos algumas análises no ambito de país

Paises com mais jogadores

Vamos agrupar por nacionalidade para encontrarmos quais são os paises que mais tem jogadores

top_countries <- fifa_reduzido %>%
  group_by(Nationality)%>%
  summarise(player_count= n()) %>%
  arrange(desc(player_count))%>%
  slice_head(n=10)
plot_ly(
  top_countries, 
  labels = ~Nationality, 
  values = ~player_count, 
  type = 'pie'
) %>%
  layout(
    title = "Top 10 Países com Mais Jogadores",
    xaxis = list(showgrid = FALSE, zeroline = FALSE),
    yaxis = list(showgrid = FALSE, zeroline = FALSE),
    margin=list(t=100)
  )

Paises com melhores jogadores

Vamos pegar a média do Overall do dataset. Após isso, vamos filtrar um dataset que contenha apenas jogadores a cima da média e com isso vamos ranquear os países que tem, em média, os jogadores com mais destaques.

Esses sao os paises com o maior numero de jogadores a cima da média

media_overall <- mean(fifa_reduzido$Overall)

jogadores_acima_media <- fifa_reduzido %>%
  filter(Overall>media_overall)

top_paises_acima_media <-jogadores_acima_media%>%
  group_by(Nationality)%>%
  summarise(qtd_jogadores = n()) %>%
  arrange(desc(qtd_jogadores))%>%
  slice_head(n=10)

media_por_pais <- jogadores_acima_media %>%
  filter(Nationality %in% top_paises_acima_media$Nationality) %>%
  group_by(Nationality) %>%
  summarise(qtd_jogadores_acima = n(),media_overall_acima = mean(Overall, na.rm = TRUE)) %>%
  arrange(desc(media_overall_acima))
plot_ly(media_por_pais %>% arrange(media_overall_acima), x = ~Nationality,y = ~media_overall_acima, type = 'bar', 
  text = ~round(media_overall_acima, 2),   textposition = 'outside',textfont=list(size=10),color = ~Nationality
) %>%
  layout(title = "Média de Overall Acima da Média por País",titlefont=list(size=20),xaxis = list(title = "País", showgrid = FALSE),
    yaxis = list(title = "Média de Overall",showgrid = TRUE,range = c(65, 74)), margin=list(t=100))

Análise por posição

Jogadores que jogam multiplas posicoes

Aqui é criada uma tabela com todos os jogadores que performam em mais de uma posição

jogadores_varias_posicoes <- fifa_reduzido %>%
  filter(sapply(strsplit(Positions.Played, ","), length) > 1)

datatable(jogadores_varias_posicoes)

Número de posições jogadas por jogador

Também é feito um gráfico para melhor entender o quão comum é um jogador ter mais de uma posição de ofício

jogadores_num_posicoes <- fifa_reduzido %>%
  mutate(num_posicoes = sapply(strsplit(Positions.Played, ","), length)) %>%
  group_by(num_posicoes) %>%
  summarise(qtd_jogadores = n())

plot_ly(
  jogadores_num_posicoes, 
  labels = ~num_posicoes,
  values = ~qtd_jogadores,
  type = 'pie',
  textinfo = 'label+percent',
  hole = 0.4
) %>%
  layout(
    title = "Distribuição de Jogadores por Número de Posições Jogadas",
    showlegend = TRUE,
    margin=list(t=100)
  )

Nova Métrica

Criando a nova métrica

Agora iremos criar uma nova métrica que nos auxiliará a escolher um jogador com potencial de estrelato no futuro

fifa_auxiliar <- fifa_reduzido %>%
  filter(Value.in.Euro. > 0) %>%
  filter(Potential>80)

# Passo 2: Calcular o ratio custo-benefício no dataset auxiliar
fifa_auxiliar <- fifa_auxiliar %>%
  mutate(ratio_custo_beneficio = Potential / Value.in.Euro.)

# Passo 3: Normalizar o ratio usando a normalização min-max no dataset auxiliar
# Evitar divisão por zero e valores NA
min_ratio <- min(fifa_auxiliar$ratio_custo_beneficio, na.rm = TRUE)
max_ratio <- max(fifa_auxiliar$ratio_custo_beneficio, na.rm = TRUE)

fifa_auxiliar <- fifa_auxiliar %>%
  mutate(ratio_normalizado = (ratio_custo_beneficio - min_ratio) / 
                               (max_ratio - min_ratio))

# Passo 4: Ordenar os jogadores com o melhor custo-benefício no dataset auxiliar
jogadores_bom_custo_beneficio_auxiliar <- fifa_auxiliar %>%
  arrange(desc(ratio_normalizado))

# Passo 5: Exibir as primeiras linhas do dataset auxiliar com o ratio normalizado
datatable(jogadores_bom_custo_beneficio_auxiliar %>% select(Known.As,Nationality,Positions.Played, Value.in.Euro., Potential, ratio_custo_beneficio, ratio_normalizado))

Analisando Custo Benefício por Posição

Após a criação dessa métrica, é feita uma análise para entendermos quais são as posições mais custo benefício e quais são as mais caras

fifa_auxiliar <- fifa_auxiliar %>%
  mutate(Primeira_Posicao = sapply(strsplit(as.character(Positions.Played), ","), `[`, 1))

custo_beneficio_por_posicao <- fifa_auxiliar %>%
  group_by(Primeira_Posicao) %>%
  summarise(media_custo_beneficio = mean(ratio_normalizado, na.rm = TRUE)) %>%
  arrange(desc(media_custo_beneficio))

plot_ly(
  custo_beneficio_por_posicao %>% arrange(media_custo_beneficio), 
  x = ~Primeira_Posicao, 
  y = ~media_custo_beneficio, 
  type = 'bar', 
  text = ~round(media_custo_beneficio, 2),   # Exibir os valores como texto
  textposition = 'outside',                  # Posicionar o texto fora da barra
  textfont = list(size = 10),                # Tamanho da fonte do texto
  color = ~Primeira_Posicao               # Diferentes cores para as posições
)%>%
  layout(
    title = "Custo beneficio medio por posicao",
    showlegend = TRUE,
    margin=list(t=100)
  )

Insights

Os jogadores mais custo benefício por posição

Esse são, em cada posição, os jogadores com o melhor índice, sendo bons candidatos para compra

fifa_auxiliar <- fifa_auxiliar %>%
  mutate(Primeira_Posição = sapply(strsplit(as.character(Positions.Played), ","), `[`, 1))

# Passo 2: Selecionar o melhor jogador por posição com o maior ratio_normalizado
melhor_por_posicao <- fifa_auxiliar %>%
  group_by(Primeira_Posição) %>%
  slice(which.max(ratio_normalizado)) %>%
  ungroup() %>%
  select(Known.As, Primeira_Posição,Age, Value.in.Euro., Potential, ratio_normalizado, Nationality) %>%
  rename(Posicao = Primeira_Posição)

datatable(melhor_por_posicao)

Análise de Custo-Benefício por Faixa Etária

Também vemos qual faixa etaria possui um bom indice, para ajudar na tomada de decisão de compra

fifa_auxiliar <- fifa_auxiliar %>%
  mutate(Faixa_Etaria = cut(Age, breaks = c(15, 20, 25, 30, 35, 40), labels = c("15-20", "21-25", "26-30", "31-35", "36-40")))

custo_beneficio_por_faixa_etaria <- fifa_auxiliar %>%
  group_by(Faixa_Etaria) %>%
  summarise(media_custo_beneficio = mean(ratio_normalizado, na.rm = TRUE)) %>%
  arrange(desc(media_custo_beneficio))

plot_ly(
  custo_beneficio_por_faixa_etaria,
  x = ~Faixa_Etaria,
  y = ~media_custo_beneficio,
  type = 'bar',
  text = ~round(media_custo_beneficio, 2),
  textposition = 'outside',
  color=~Faixa_Etaria,
  textfont = list(size = 10)
) %>%
  layout(
    title = "Custo-Beneficio Medio por Faixa Etaria",
    xaxis = list(title = "Faixa Etaria"),
    yaxis = list(title = "Media do Custo-Beneficio"),
    margin = list(t = 100)
  )

Correlação entre nota de cabeceio e altura

Vemos aqui uma tendência ascendente que sugere que conforme a altura aumenta, a precisao no cabeceio também. Porém, devido à dispersão, podemos inferir que existem outros fatores que influenciam

fifa_auxiliar_correlacao <- fifa_auxiliar %>%
  filter(Primeira_Posição != "GK" & !is.na(Heading.Accuracy) & !is.na(Height.in.cm.))

cor_coef <- cor(fifa_auxiliar_correlacao$Height.in.cm., fifa_auxiliar_correlacao$Heading.Accuracy)

plot_ly(
  data = fifa_auxiliar_correlacao,
  x = ~Height.in.cm.,
  y = ~Heading.Accuracy,
  type = 'scatter',
  mode = 'markers'
) %>%
  add_lines(
    x = ~Height.in.cm.,
    y = fitted(lm(Heading.Accuracy ~ Height.in.cm., data = fifa_auxiliar_correlacao)),
    line = list(color = 'red')
  ) %>%
  layout(
    title = paste("Correlação entre Precisão no Cabeceio e Altura (r =", round(cor_coef, 2), ")"),
    xaxis = list(title = "Altura em cm"),
    yaxis = list(title = "Precisão no Cabeceio")
  )

Como observado, não existe uma correlação clara entre quão bom uma pessoa é cabeceando e sua altura

Correlação entre Idade e Potencial

Analisando visualmente o gráfico e a linha de tendência, parece haver uma correlação negativa entre a idade e o potencial dos jogadores. Isso significa que, à medida que a idade aumenta, o potencial tende a diminuir levemente. A inclinação negativa da linha indica essa correlação negativa, ainda que a dispersão dos pontos seja significativa, o que sugere que a correlação não é muito forte

plot_ly(fifa_reduzido, x = ~Age, y = ~Potential, type = 'scatter', mode = 'markers') %>%
  add_lines(
    x = ~Age,
    y = fitted(lm(Potential ~ Age, data = fifa_reduzido)),
    line = list(color = 'red', width = 2),
    name = 'Linha de Tendencia'
  ) %>%
  layout(
    title = "Relacao entre Idade e Potencial",
    xaxis = list(title = "Idade"),
    yaxis = list(title = "Potencial"),
    margin = list(t = 100)
  )

Conclusões

Declaração do Problema

A análise aborda a relação custo-benefício dos jogadores no FIFA 23. O objetivo principal foi criar uma métrica que permita avaliar quais jogadores oferecem o melhor retorno em termos de potencial de desenvolvimento e valor financeiro. Isso permite identificar futuros talentos a serem explorados pelos clubes.

Metodologia e Dados

Os dados utilizados foram extraídos do dataset ‘Fifa 23 Players Data.csv’. A metodologia incluiu o agrupamento dos jogadores por país, a análise de suas habilidades e potenciais de crescimento, bem como a criação de uma métrica personalizada que relaciona o valor de mercado com o potencial. Utilizamos técnicas de análise descritiva e criação de novos indicadores para fundamentar essa métrica

Insights interessantes

Além da análise exploratoria mais simples, as insights mais valiosas são as da nova métrica calculada. Observamos que, em alguns casos, jogadores subvalorizados podem oferecer um excelente retorno sobre o investimento, principalmente aqueles com grande potencial de desenvolvimento, mas ainda com um valor de mercado relativamente baixo

Implicações para Clientes Potenciais

Para clubes e olheiros, esta análise pode ser útil na hora de decidir quais jogadores contratar, especialmente ao considerar jogadores jovens que ainda não atingiram seu pico de performance. O foco em jogadores com um bom equilíbrio entre preço e potencial pode ajudar a maximizar o retorno sobre o investimento, identificando talentos subvalorizados antes que seu valor de mercado cresça significativamente.

Limitações e melhorias

Uma limitação da análise é que ela depende fortemente dos dados atuais do FIFA 23, o que pode não refletir com precisão as variações futuras no desempenho dos jogadores. Além disso, fatores subjetivos, como adaptabilidade a diferentes estilos de jogo ou ligas, não foram considerados. Uma possível melhoria seria integrar dados de desempenho ao longo de várias temporadas para obter uma visão mais robusta da progressão do jogador.