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 R², 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;
car – Companion 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.
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:
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")# 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 |
|---|
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.
# 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
# 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
# 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)
)O ranking combina três métricas normalizadas (z-score) com pesos atribuídos:
# 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")| 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
# 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
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.
# 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# 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"))| 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 |
# 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")# 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
# 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 ==========
##
## 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) ==========
##
## 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 ==========
## Teste de Shapiro-Wilk (normalidade dos resíduos):
##
## Shapiro-Wilk normality test
##
## data: artilheiros$residuos
## W = 0.98043, p-value = 0.1312
##
## Teste de Breusch-Pagan (homocedasticidade):
##
## 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
# 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)Messi pertence ao Cluster 2, caracterizado por longevidade e volume, mas não por eficiência excepcional.
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.
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.