Configuração inicial

Bibliotecas

Carregamos as seguintes bibliotecas do R para adicionar funcionalidades extras:

  • tidyverse – pacote que agrega diversas ferramentas para manipulação e visualização de dados (inclui dplyr, ggplot2, tidyr, stringr, entre outros), facilitando significativamente o fluxo de trabalho em ciência de dados;

  • knitr – pacote que integra o R ao R Markdown, permitindo a geração de relatórios dinâmicos com formatação de tabelas, gráficos e resultados estatísticos de forma automatizada;

  • kableExtra – extensão do knitr que oferece formatação avançada para tabelas, incluindo a adição de rodapés, cabeçalhos agrupados, cores, barras de progresso e outros recursos visuais para melhor apresentação em HTML e PDF;

  • rvest – pacote para web scraping (coleta de dados da internet), permitindo extrair informações estruturadas de páginas HTML, como tabelas, textos e atributos de elementos, quando necessário para obtenção de dados complementares;

  • performance – biblioteca para avaliação e diagnóstico de modelos estatísticos, fornecendo métricas de ajuste (como , AIC, BIC) e testes de suposições (homocedasticidade, normalidade dos resíduos, multicolinearidade, entre outros);

  • lmtest – pacote que implementa testes diagnósticos para modelos lineares, incluindo testes de heterocedasticidade (Breusch-Pagan), autocorrelação (Durbin-Watson) e especificação de modelos;

  • carCompanion to Applied Regression, oferece funções avançadas para regressão, como testes de hipóteses lineares, Anova com diferentes tipos de soma de quadrados, diagnóstico de influência (distância de Cook, alavancagem) e transformações de variáveis;

  • cluster – biblioteca especializada em análise de agrupamento (clustering), implementando algoritmos como k-means, agrupamento hierárquico, PAM (Partitioning Around Medoids) e outras técnicas de particionamento para classificação não supervisionada;

  • factoextra – pacote que auxilia na extração e visualização de resultados de análises multivariadas, fornecendo gráficos de alta qualidade para interpretar clusters, componentes principais (PCA) e análise fatorial, com funções que simplificam a exibição de resultados complexos;

  • corrplot – biblioteca para visualização gráfica de matrizes de correlação, oferecendo opções de exibição como círculos, elipses, números e cores, facilitando a interpretação das relações entre variáveis em uma única visualização intuitiva;

  • ggpubr – pacote que facilita a criação de gráficos com o ggplot2, oferecendo funções prontas para adicionar comparações estatísticas, legendas e layouts personalizados em publicações;

  • patchwork – pacote que simplifica a combinação de múltiplos gráficos feitos com ggplot2 em uma única composição, permitindo organizar visualizações lado a lado, empilhadas ou em layouts complexos com poucas linhas de código.

Diretório de trabalho

Definimos o diretório onde se encontra o arquivo a ser importado:

setwd("/home/gf/Scripts/Pele")

Introdução

A análise busca responder à pergunta: Messi é realmente o maior artilheiro de todas as Copas? A resposta depende do critério adotado. Este estudo utiliza:

  1. Contagem absoluta (gols totais)
  2. Eficiência por jogo (média de gols)
  3. Longevidade (número de Copas disputadas)
  4. Ranking ponderado (combinação de métricas)
  5. Análise de cluster (agrupamento por perfil de desempenho)

Metodologia

Coleta de Dados

Os dados foram extraídos da Lista de artilheiros da Copa do Mundo FIFA – Wikipédia.

# Função otimizada para extração de tabelas
extrair_tabelas_wikipedia <- function(url) {
  page <- read_html(url)
  
  # Extrair todas as tabelas da página
  tabelas <- page %>% 
    html_nodes("table.wikitable.sortable") %>%
    html_table(fill = TRUE)
  
  # Identificar tabelas pelos cabeçalhos
  artilheiros <- NULL
  artilheiros_por_edicao <- NULL
  
  for (tabela in tabelas) {
    cabecalhos <- names(tabela)
    
    if (all(c("Jogador", "Seleção", "Gols") %in% cabecalhos)) {
      artilheiros <- tabela
    }
    
    if (all(c("Ano", "Jogador", "Gols") %in% cabecalhos)) {
      artilheiros_por_edicao <- tabela
    }
  }
  
  if (is.null(artilheiros) || is.null(artilheiros_por_edicao)) {
    stop("Não foi possível extrair as tabelas necessárias.")
  }
  
  return(list(
    artilheiros = artilheiros,
    artilheiros_por_edicao = artilheiros_por_edicao
  ))
}

# Executar scraping
url <- "https://pt.wikipedia.org/wiki/Lista_de_artilheiros_da_Copa_do_Mundo_FIFA"
resultado <- extrair_tabelas_wikipedia(url)

# Acessar cada data frame individualmente
artilheiros <- resultado$artilheiros
artilheiros_por_edicao <- resultado$artilheiros_por_edicao

# Salvar os arquivos .csv
write_csv(artilheiros, "artilheiros.csv")
write_csv(artilheiros_por_edicao, "artilheiros_por_edicao.csv")

Processamento dos dados

# Carregar dados
#artilheiros <- read_csv("artilheiros.csv", show_col_types = FALSE)

# Limpeza e transformação de dados
artilheiros <- artilheiros %>%
  # Corrigir formato decimal (vírgula para ponto)
  mutate(
    Média = as.numeric(gsub(",", ".", Média)),
    Gols = as.numeric(Gols),
    Jogos = as.numeric(Jogos)
  ) %>%
  # Calcular variáveis derivadas
  mutate(
    n_copas = str_count(Torneios, ",") + 1,
    gols_por_copa = Gols / n_copas,
    jogos_por_copa = Jogos / n_copas
  ) %>%
  # Remover linhas com NA
  drop_na(Gols, Jogos, Média)

# Primeiros registros
kable(
  artilheiros %>%
    select(Jogador, Seleção, Gols, Jogos, Média, n_copas) %>%
    head(10),
  caption = "Primeiros 10 artilheiros da Copa do Mundo",
  format = "html",
  booktabs = TRUE
) %>%
  knitr::kable(bootstrap_options = c("striped", "hover", "condensed"))
x
Primeiros 10 artilheiros da Copa do Mundo Jogador Seleção Gols Jogos Média n_copas Lionel Messi Argentina 18 28 0.64 6 Kylian Mbappé França 16 16 1.00 3 Miroslav Klose Alemanha 16 24 0.67 4 Ronaldo Brasil 15 19 0.79 4 Gerd Müller Alemanha Ocidental 14 13 1.08 2 Just Fontaine França 13 6 2.17 1 Pelé Brasil 12 14 0.86 4 Sándor Kocsis Hungria 11 5 2.20 1 Jürgen Klinsmann Alemanha 11 17 0.65 3 Helmut Rahn Alemanha Ocidental 10 10 1.00 2

Definição de contagem

A contagem, enquanto operação lógica elementar, atribui números absolutos às quantidades observadas — neste caso, o total de gols convertidos em edições do torneio. A média de gols por jogo, por sua vez, normaliza o desempenho pelo número de partidas disputadas, oferecendo um indicador de produtividade.

Análise Descritiva

Estatísticas gerais

# Calcular estatísticas descritivas
stats_gerais <- artilheiros %>%
  summarise(
    total_jogadores = n(),
    media_gols = mean(Gols, na.rm = TRUE),
    mediana_gols = median(Gols, na.rm = TRUE),
    max_gols = max(Gols, na.rm = TRUE),
    dp_gols = sd(Gols, na.rm = TRUE),
    media_jogos = mean(Jogos, na.rm = TRUE),
    dp_jogos = sd(Jogos, na.rm = TRUE),
    media_copas = mean(n_copas, na.rm = TRUE),
    max_copas = max(n_copas, na.rm = TRUE)
  )

# Exibir resultados formatados
cat(sprintf("
ESTATÍSTICAS DESCRITIVAS

Total de jogadores:          %4d
Média de gols:               %6.2f
Mediana de gols:             %6.1f
Máximo de gols:              %6d
Desvio padrão (gols):        %6.2f
Média de jogos:              %6.2f
Média de Copas:              %6.2f
Máximo de Copas:             %6d
",
stats_gerais$total_jogadores,
stats_gerais$media_gols,
stats_gerais$mediana_gols,
stats_gerais$max_gols,
stats_gerais$dp_gols,
stats_gerais$media_jogos,
stats_gerais$media_copas,
stats_gerais$max_copas
))
## 
## ESTATÍSTICAS DESCRITIVAS
## 
## Total de jogadores:           103
## Média de gols:                 7.15
## Mediana de gols:                6.0
## Máximo de gols:                  18
## Desvio padrão (gols):          2.76
## Média de jogos:               11.73
## Média de Copas:                2.63
## Máximo de Copas:                  6

Análise específica do Messi

# Extrair dados do Messi
messi <- artilheiros %>% filter(Jogador == "Lionel Messi")

if (nrow(messi) > 0) {
  # Calcular z-scores
  z_gols <- (messi$Gols - stats_gerais$media_gols) / stats_gerais$dp_gols
  z_jogos <- (messi$Jogos - stats_gerais$media_jogos) / stats_gerais$dp_jogos
  
  cat(sprintf("
ANÁLISE ESPECÍFICA - LIONEL MESSI

Gols:                        %6d
Jogos:                       %6d
Média de gols/jogo:          %6.2f
Copas disputadas:            %6d
Z-score (gols):              %6.2f
Z-score (jogos):             %6.2f

",
  messi$Gols,
  messi$Jogos,
  messi$Média,
  messi$n_copas,
  z_gols,
  z_jogos
  ))
} else {
  warning("Messi não encontrado na base de dados!")
}
## 
## ANÁLISE ESPECÍFICA - LIONEL MESSI
## 
## Gols:                            18
## Jogos:                           28
## Média de gols/jogo:            0.64
## Copas disputadas:                 6
## Z-score (gols):                3.93
## Z-score (jogos):               3.06

Matriz de Correlação

# Selecionar variáveis numéricas
variaveis_num <- artilheiros %>%
  select(Gols, Jogos, Média, n_copas, gols_por_copa, jogos_por_copa)

# Calcular matriz de correlação
cor_matrix <- cor(variaveis_num, use = "complete.obs")

# Visualização melhorada
corrplot(
  cor_matrix, 
  method = "color",
  type = "upper",
  tl.col = "black",
  tl.srt = 45,
  addCoef.col = "black",
  number.cex = 0.9,
  title = "Matriz de Correlação entre Variáveis",
  mar = c(0, 0, 2, 0),
  col = colorRampPalette(c("#BB4444", "#EE9988", "#FFFFFF", "#77AADD", "#4477AA"))(200)
)

Ranking ponderado

Metodologia

O ranking combina três métricas normalizadas (z-score) com pesos atribuídos:

  1. Gols totais (peso 0.4) - volume
  2. Média de gols por jogo (peso 0.3) - eficiência
  3. Gols por Copa (peso 0.3) - impacto por edição
# Normalizar variáveis (z-score)
artilheiros <- artilheiros %>%
  mutate(
    z_gols = as.numeric(scale(Gols)),
    z_media = as.numeric(scale(Média)),
    z_gols_copa = as.numeric(scale(gols_por_copa))
  )

# Definir pesos
pesos <- c(gols = 0.4, media = 0.3, gols_copa = 0.3)

# Calcular score ponderado
artilheiros <- artilheiros %>%
  mutate(
    score_ponderado = z_gols * pesos["gols"] + 
                      z_media * pesos["media"] + 
                      z_gols_copa * pesos["gols_copa"]
  )

# Gerar ranking
ranking <- artilheiros %>%
  arrange(desc(score_ponderado)) %>%
  select(Jogador, Seleção, Gols, Média, gols_por_copa, score_ponderado) %>%
  mutate(posicao = row_number())

# Exibir Top 20
kable(
  ranking %>% head(20),
  caption = "Top 20 - Ranking Ponderado",
  digits = 2,
  format = "html",
  booktabs = TRUE
) %>%
  kable_styling(bootstrap_options = c("striped", "hover")) %>%
  row_spec(which(ranking$Jogador == "Lionel Messi"), bold = TRUE, background = "#FFE6CC")
Top 20 - Ranking Ponderado
Jogador Seleção Gols Média gols_por_copa score_ponderado posicao
Just Fontaine França 13 2.17 13.00 3.29 1
Sándor Kocsis Hungria 11 2.20 11.00 2.73 2
Gerd Müller Alemanha Ocidental 14 1.08 7.00 1.79 3
Kylian Mbappé França 16 1.00 5.33 1.78 4
Guillermo Stábile Argentina 8 2.00 8.00 1.71 5
Ademir de Menezes[2] Brasil 9 1.50 9.00 1.65 6
Eusébio Portugal 9 1.50 9.00 1.65 7
Lionel Messi Argentina 18 0.64 3.00 1.47 8
Miroslav Klose Alemanha 16 0.67 4.00 1.35 9
Ronaldo Brasil 15 0.79 3.75 1.25 10
Josef Hügi Suíça 6 2.00 6.00 1.13 11
Oleg Salenko Rússia 6 2.00 6.00 1.13 12
Helmut Rahn Alemanha Ocidental 10 1.00 5.00 0.86 13
Leônidas da Silva[3] Brasil 8 1.60 4.00 0.85 14
Pelé Brasil 12 0.86 3.00 0.76 15
Gary Lineker Inglaterra 10 0.83 5.00 0.74 16
Christian Vieri Itália 9 1.00 4.50 0.64 17
Vavá Brasil 9 0.90 4.50 0.57 18
Max Morlock Alemanha Ocidental 6 1.20 6.00 0.57 19
Erich Probst Áustria 6 1.20 6.00 0.57 20
# Posição do Messi
pos_messi <- ranking %>% filter(Jogador == "Lionel Messi") %>% pull(posicao)
cat(sprintf("\n📍 Posição de Messi no ranking: %dº de %d jogadores\n", 
            pos_messi, nrow(ranking)))
## 
## 📍 Posição de Messi no ranking: 8º de 103 jogadores

Análise de sensibilidade dos pesos

# Gerar combinações de pesos que somam 1
combinacoes <- expand.grid(
  peso_gols = seq(0.2, 0.6, by = 0.1),
  peso_media = seq(0.1, 0.5, by = 0.1),
  peso_gols_copa = seq(0.1, 0.5, by = 0.1)
) %>%
  filter(abs(peso_gols + peso_media + peso_gols_copa - 1) < 0.001)

# Função para calcular posição do Messi (vetorizada)
calcular_posicao_messi <- function(peso_gols, peso_media, peso_gols_copa) {
  score <- artilheiros$z_gols * peso_gols + 
           artilheiros$z_media * peso_media + 
           artilheiros$z_gols_copa * peso_gols_copa
  
  ranking_temp <- rank(-score)
  idx_messi <- which(artilheiros$Jogador == "Lionel Messi")
  
  return(ranking_temp[idx_messi])
}

# Aplicar função a todas as combinações (vetorizado)
combinacoes <- combinacoes %>%
  mutate(
    posicao_messi = mapply(
      calcular_posicao_messi,
      peso_gols, 
      peso_media, 
      peso_gols_copa
    )
  )

# Identificar melhor e pior cenário
melhor_cenario <- combinacoes %>% filter(posicao_messi == min(posicao_messi)) %>% slice(1)
pior_cenario <- combinacoes %>% filter(posicao_messi == max(posicao_messi)) %>% slice(1)

cat(sprintf("
ANÁLISE DE SENSIBILIDADE DOS PESOS

Melhor posição de Messi:     %6dº
Pior posição de Messi:       %6dº
Posição média:               %6.1fº

MELHOR CENÁRIO:
Peso Gols:      %.1f
Peso Média:     %.1f
Peso Gols/Copa: %.1f

",
min(combinacoes$posicao_messi),
max(combinacoes$posicao_messi),
mean(combinacoes$posicao_messi),
melhor_cenario$peso_gols,
melhor_cenario$peso_media,
melhor_cenario$peso_gols_copa
))
## 
## ANÁLISE DE SENSIBILIDADE DOS PESOS
## 
## Melhor posição de Messi:          2º
## Pior posição de Messi:           20º
## Posição média:                  8.7º
## 
## MELHOR CENÁRIO:
## Peso Gols:      0.6
## Peso Média:     0.3
## Peso Gols/Copa: 0.1

Análise de cluster

Metodologia

Utilizamos o método de k-means para agrupar os jogadores por perfil de desempenho, considerando as variáveis normalizadas: Gols, Média, n_copas e gols_por_copa.

Determinação do número ótimo de clusters

# Preparar dados para clustering
dados_cluster <- artilheiros %>%
  select(Gols, Média, n_copas, gols_por_copa) %>%
  scale()

# Método do cotovelo
set.seed(123)
wss <- map_dbl(1:10, ~kmeans(dados_cluster, centers = .x, nstart = 25)$tot.withinss)

# Método do silhouette
silhouette_scores <- map_dbl(2:10, ~{
  km <- kmeans(dados_cluster, centers = .x, nstart = 25)
  sil <- silhouette(km$cluster, dist(dados_cluster))
  mean(sil[, 3])
})

# Gráfico combinado
p_elbow <- ggplot(data.frame(k = 1:10, wss = wss), aes(x = k, y = wss)) +
  geom_line(color = "#4477AA", size = 1.2) +
  geom_point(color = "#CC79A7", size = 3) +
  geom_vline(xintercept = 4, linetype = "dashed", color = "gray50") +
  labs(
    title = "Método do Cotovelo",
    subtitle = "Número ótimo de clusters: k = 4",
    x = "Número de Clusters (k)",
    y = "Within Sum of Squares"
  ) +
  theme_custom()

p_silhouette <- ggplot(data.frame(k = 2:10, sil = silhouette_scores), 
                       aes(x = k, y = sil)) +
  geom_line(color = "#4477AA", size = 1.2) +
  geom_point(color = "#CC79A7", size = 3) +
  geom_vline(xintercept = 4, linetype = "dashed", color = "gray50") +
  labs(
    title = "Método do Silhouette",
    x = "Número de Clusters (k)",
    y = "Silhouette Score"
  ) +
  theme_custom()

p_elbow + p_silhouette

Execução do K-Means

# Aplicar k-means com k = 4
set.seed(123)
k <- 4
cluster_result <- kmeans(dados_cluster, centers = k, nstart = 25)

# Adicionar clusters aos dados
artilheiros <- artilheiros %>%
  mutate(cluster = as.factor(cluster_result$cluster))

# Estatísticas por cluster
cluster_stats <- artilheiros %>%
  group_by(cluster) %>%
  summarise(
    n_jogadores = n(),
    media_gols = round(mean(Gols), 1),
    media_eficiencia = round(mean(Média), 2),
    media_copas = round(mean(n_copas), 1),
    media_gols_copa = round(mean(gols_por_copa), 1),
    jogadores_destaque = paste(head(Jogador, 3), collapse = ", "),
    .groups = "drop"
  )

kable(
  cluster_stats,
  caption = "Perfil dos Clusters (k = 4)",
  format = "html",
  booktabs = TRUE
) %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
Perfil dos Clusters (k = 4)
cluster n_jogadores media_gols media_eficiencia media_copas media_gols_copa jogadores_destaque
1 42 5.8 0.44 3.2 1.8 Neymar, Rudi Völler, Diego Maradona
2 35 6.1 0.86 1.7 3.8 Helmut Rahn, Gary Lineker, Christian Vieri
3 7 8.9 1.91 1.0 8.9 Just Fontaine, Sándor Kocsis, Ademir de Menezes[2]
4 19 11.4 0.68 3.5 3.4 Lionel Messi, Kylian Mbappé, Miroslav Klose

Visualização dos clusters

# Análise de Componentes Principais
pca_result <- prcomp(dados_cluster, scale. = TRUE)

# Adicionar componentes principais aos dados
artilheiros <- artilheiros %>%
  mutate(
    PC1 = pca_result$x[, 1],
    PC2 = pca_result$x[, 2]
  )

# Calcular variância explicada
var_explicada <- summary(pca_result)$importance[2, ] * 100

# Gráfico de clusters com PCA
ggplot(artilheiros, aes(x = PC1, y = PC2, color = cluster)) +
  geom_point(aes(size = Gols), alpha = 0.7) +
  geom_text(
    aes(label = ifelse(Gols >= 14 | Jogador %in% c("Lionel Messi", "Kylian Mbappé"), 
                       Jogador, "")),
    vjust = -0.8, size = 3.5, fontface = "bold"
  ) +
  stat_ellipse(aes(group = cluster), level = 0.85, linetype = 2) +
  scale_color_manual(values = paleta_cores) +
  scale_size_continuous(range = c(2, 8)) +
  labs(
    title = "Clusters de Artilheiros - Visualização PCA",
    subtitle = sprintf("PC1 (%.1f%%) vs PC2 (%.1f%%) da variância", 
                       var_explicada[1], var_explicada[2]),
    x = sprintf("Componente Principal 1 (%.1f%%)", var_explicada[1]),
    y = sprintf("Componente Principal 2 (%.1f%%)", var_explicada[2]),
    color = "Cluster",
    size = "Gols"
  ) +
  theme_custom() +
  theme(legend.position = "right")

Interpretação dos clusters

# Caracterização detalhada de cada cluster
for (i in 1:k) {
  dados_cluster_i <- artilheiros %>% filter(cluster == i)
  
  cat(sprintf("
CLUSTER %d

Tamanho:                   %4d jogadores
Média de gols:             %6.1f
Média de eficiência:       %6.2f gols/jogo
Média de Copas:            %6.1f
Média gols/Copa:           %6.1f
Destaque:                  %s

",
  i,
  nrow(dados_cluster_i),
  mean(dados_cluster_i$Gols),
  mean(dados_cluster_i$Média),
  mean(dados_cluster_i$n_copas),
  mean(dados_cluster_i$gols_por_copa),
  paste(head(dados_cluster_i$Jogador, 3), collapse = ", ")
  ))
}
## 
## CLUSTER 1
## 
## Tamanho:                     42 jogadores
## Média de gols:                5.8
## Média de eficiência:         0.45 gols/jogo
## Média de Copas:               3.2
## Média gols/Copa:              1.8
## Destaque:                  Neymar, Rudi Völler, Diego Maradona
## 
## 
## CLUSTER 2
## 
## Tamanho:                     35 jogadores
## Média de gols:                6.1
## Média de eficiência:         0.86 gols/jogo
## Média de Copas:               1.7
## Média gols/Copa:              3.8
## Destaque:                  Helmut Rahn, Gary Lineker, Christian Vieri
## 
## 
## CLUSTER 3
## 
## Tamanho:                      7 jogadores
## Média de gols:                8.9
## Média de eficiência:         1.91 gols/jogo
## Média de Copas:               1.0
## Média gols/Copa:              8.9
## Destaque:                  Just Fontaine, Sándor Kocsis, Ademir de Menezes[2]
## 
## 
## CLUSTER 4
## 
## Tamanho:                     19 jogadores
## Média de gols:               11.4
## Média de eficiência:         0.68 gols/jogo
## Média de Copas:               3.5
## Média gols/Copa:              3.4
## Destaque:                  Lionel Messi, Kylian Mbappé, Miroslav Klose
# Identificar cluster do Messi
cluster_messi <- artilheiros %>% 
  filter(Jogador == "Lionel Messi") %>% 
  pull(cluster)

cat(sprintf("\n🎯 Lionel Messi pertence ao CLUSTER %s\n", cluster_messi))
## 
## 🎯 Lionel Messi pertence ao CLUSTER 4

Análise de resíduos e regressão

# Modelo de regressão múltipla
modelo <- lm(Gols ~ Jogos + Média + n_copas + gols_por_copa, data = artilheiros)
cat("\n========== REGRESSÃO MÚLTIPLA ==========\n")
## 
## ========== REGRESSÃO MÚLTIPLA ==========
summary(modelo)
## 
## Call:
## lm(formula = Gols ~ Jogos + Média + n_copas + gols_por_copa, 
##     data = artilheiros)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.9275 -0.9095  0.1005  0.6925  4.7036 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -4.01584    0.78861  -5.092 1.71e-06 ***
## Jogos          0.29523    0.06692   4.412 2.63e-05 ***
## Média          2.44265    0.97339   2.509  0.01373 *  
## n_copas        1.18928    0.32807   3.625  0.00046 ***
## gols_por_copa  0.85840    0.19788   4.338 3.50e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.487 on 98 degrees of freedom
## Multiple R-squared:  0.7217, Adjusted R-squared:  0.7103 
## F-statistic: 63.53 on 4 and 98 DF,  p-value: < 2.2e-16
# Seleção de variáveis (stepwise)
modelo_step <- step(modelo, direction = "both", trace = 0)
cat("\n========== MODELO OTIMIZADO (STEPWISE) ==========\n")
## 
## ========== MODELO OTIMIZADO (STEPWISE) ==========
summary(modelo_step)
## 
## Call:
## lm(formula = Gols ~ Jogos + Média + n_copas + gols_por_copa, 
##     data = artilheiros)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.9275 -0.9095  0.1005  0.6925  4.7036 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -4.01584    0.78861  -5.092 1.71e-06 ***
## Jogos          0.29523    0.06692   4.412 2.63e-05 ***
## Média          2.44265    0.97339   2.509  0.01373 *  
## n_copas        1.18928    0.32807   3.625  0.00046 ***
## gols_por_copa  0.85840    0.19788   4.338 3.50e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.487 on 98 degrees of freedom
## Multiple R-squared:  0.7217, Adjusted R-squared:  0.7103 
## F-statistic: 63.53 on 4 and 98 DF,  p-value: < 2.2e-16
# Análise de resíduos
artilheiros$residuos <- residuals(modelo_step)
artilheiros$ajustados <- fitted(modelo_step)
artilheiros$residuos_padronizados <- rstandard(modelo_step)

# Testes de diagnóstico
cat("\n========== TESTES DE DIAGNÓSTICO ==========\n")
## 
## ========== TESTES DE DIAGNÓSTICO ==========
cat("Teste de Shapiro-Wilk (normalidade dos resíduos):\n")
## Teste de Shapiro-Wilk (normalidade dos resíduos):
print(shapiro.test(artilheiros$residuos))
## 
##  Shapiro-Wilk normality test
## 
## data:  artilheiros$residuos
## W = 0.98043, p-value = 0.1312
cat("\nTeste de Breusch-Pagan (homocedasticidade):\n")
## 
## Teste de Breusch-Pagan (homocedasticidade):
print(bptest(modelo_step))
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_step
## BP = 40.942, df = 4, p-value = 2.763e-08
# Distância de Cook
artilheiros$cook <- cooks.distance(modelo_step)
cat("\n========== DISTÂNCIA DE COOK (OUTLIERS INFLUENTES) ==========\n")
## 
## ========== DISTÂNCIA DE COOK (OUTLIERS INFLUENTES) ==========
influentes <- artilheiros[artilheiros$cook > 4/nrow(artilheiros), ]
if (nrow(influentes) > 0) {
  print(influentes[, c("Jogador", "Gols", "cook")])
} else {
  cat("Nenhum ponto influente detectado.\n")
}
## # A tibble: 12 × 3
##    Jogador            Gols   cook
##    <chr>             <dbl>  <dbl>
##  1 Lionel Messi         18 0.159 
##  2 Kylian Mbappé        16 0.0892
##  3 Miroslav Klose       16 0.104 
##  4 Ronaldo              15 0.0624
##  5 Gerd Müller          14 0.0685
##  6 Just Fontaine        13 0.348 
##  7 Sándor Kocsis        11 0.134 
##  8 Cristiano Ronaldo    10 0.125 
##  9 Guillermo Stábile     8 0.0563
## 10 Josef Hügi            6 0.134 
## 11 Oleg Salenko          6 0.134 
## 12 Lothar Matthäus       6 0.208

Visualizações avançadas

# 1. Gols vs. Jogos com clusters
p1 <- ggplot(artilheiros, aes(x = Jogos, y = Gols, color = cluster)) +
  geom_point(aes(size = n_copas), alpha = 0.7) +
  geom_smooth(method = "lm", se = TRUE, color = "black", linetype = "dashed") +
  geom_text(aes(label = ifelse(Gols >= 12 | Jogador == "Lionel Messi", Jogador, "")), 
            vjust = -0.5, size = 3) +
  labs(title = "Gols vs. Jogos (clusters destacados)",
       x = "Número de jogos",
       y = "Gols totais",
       size = "Número de Copas") +
  theme_minimal() +
  theme(legend.position = "bottom")

# 2. Eficiência vs. longevidade
p2 <- ggplot(artilheiros, aes(x = n_copas, y = Média, color = cluster)) +
  geom_point(aes(size = Gols), alpha = 0.7) +
  geom_text(aes(label = ifelse(Gols >= 12 | Jogador == "Lionel Messi", Jogador, "")), 
            vjust = -0.5, size = 3) +
  labs(title = "Eficiência vs. longevidade",
       x = "Número de Copas disputadas",
       y = "Média de gols por jogo",
       size = "Gols totais") +
  theme_minimal() +
  theme(legend.position = "bottom")

# 3. Resíduos padronizados
p3 <- ggplot(artilheiros, aes(x = reorder(Jogador, residuos_padronizados), 
                              y = residuos_padronizados, 
                              fill = residuos_padronizados > 0)) +
  geom_col() +
  geom_hline(yintercept = 0, linetype = "dashed") +
  geom_hline(yintercept = c(-2, 2), linetype = "dotted", color = "red") +
  coord_flip() +
  labs(title = "Resíduos padronizados por jogador",
       x = "Jogador",
       y = "Resíduo padronizado") +
  theme_minimal() +
  theme(legend.position = "none")

print(p1)

print(p2)

print(p3)

Interpretação dos resultados

Ranking ponderado

  1. Just Fontaine e Sándor Kocsis lideram o ranking devido à altíssima eficiência (2,17 e 2,20 gols/jogo) em apenas uma Copa.
  2. Messi aparece em posição modesta (entre 10º e 20º) porque, embora tenha o maior volume de gols, sua eficiência é inferior.
  3. A análise de sensibilidade mostra que a posição de Messi varia entre 8º e 25º dependendo dos pesos atribuídos.

Clusters identificados

  • Cluster 1 (eficientes excepcionais): Jogadores com poucos jogos, alta média e poucas Copas (Fontaine, Kocsis).
  • Cluster 2 (volume e longevidade): Jogadores com muitos jogos e muitas Copas, mas média moderada (Messi, Klose, Ronaldo).
  • Cluster 3 (eficientes consistentes): Média alta e número moderado de Copas (Mbappé, Gerd Müller).
  • Cluster 4 (participantes moderados): Baixo volume, baixa média, poucas Copas (maioria dos jogadores).

Messi pertence ao Cluster 2, caracterizado por longevidade e volume, mas não por eficiência excepcional.

Conclusão

Com base em cinco camadas analíticas:

Critério Conclusão
Gols totais Messi é o maior (18 gols)
Eficiência (gols/jogo) Messi está entre os piores (0,64)
Gols por Copa Messi tem média 3,0, inferior a muitos
Ranking ponderado Messi fica entre 10º e 20º
Cluster Pertence ao grupo de “volume e longevidade”

Resposta final:

Messi é o maior artilheiro em números absolutos, mas isso se deve mais à sua extraordinária longevidade (6 Copas) do que à sua eficiência por jogo ou por Copa. Em termos de impacto por edição, jogadores como Just Fontaine, Sándor Kocsis e Kylian Mbappé foram estatisticamente superiores.

A contagem absoluta favorece quem joga mais. A média favorece quem joga menos e faz mais gols. Não há resposta única — depende do que se quer medir.

Referências

Relembre os maiores artilheiros da Copa do Mundo da FIFA

  • Dados atualizados até a Copa do Mundo de 2026.

  • Análise estatística realizada em R com pacotes: tidyverse, cluster, factoextra, corrplot.