No artigo anterior, apresentamos a motivação e os objetivos da nossa análise exploratória sobre os gols de Pelé, utilizando dados extraídos da Wikipedia. Demonstramos como a coleta e a preparação dos dados são etapas fundamentais para qualquer análise estatística.
Agora, pretendemos realizar uma análise um pouco mais detalhada. Desse modo, esperamos que este artigo sirva como um guia prático, que poderá ser replicado pelos interessados.
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;
lubridate – biblioteca para manipular dados no formato data/hora, permitindo extrair ano, mês, dia e realizar cálculos com datas de forma intuitiva;
knitr – para geração de relatórios dinâmicos em R, formatando saídas de código, tabelas e gráficos em documentos como HTML, PDF e Word.
Definimos o diretório onde se encontra o arquivo a ser importado:
No artigo anterior, não fizemos uma menção explícida à gravação do arquivo .csv, que poderá ser facilmente realizada com a função write.csv(), após a última etapa de limpeza de dados, que reduziu o número de competições a cincoenta.
Nesta etapa, realizamos a transformação dos dados:
criação de variáveis derivadas – geramos colunas para Ano, Década e indicador de jogo em casa (Vila Belmiro);
conversão para fatores – transformamos as variáveis categóricas (Adversário, Local, Competição) em fatores para facilitar a análise e a visualização.
dados_limpos <- pele_gols %>%
mutate(
Data = as.Date(Data, format = "%Y-%m-%d"),
# Ano
Ano = year(Data),
# Década
Decada = floor(Ano / 10) * 10,
# Adversário como fator
Adversario = as.factor(Adversário),
# Local como fator
Local = as.factor(Local),
# Competição como fator
Competicao = as.factor(Competição),
# Jogos em casa? (Vila Belmiro = casa, outros = fora/neutro)
Em_casa = ifelse(str_detect(Local, "Vila Belmiro"), "Casa", "Fora/Neutro")
) Iniciamos nossa análise com as estatísticas descritivas básicas. Calculamos o total de jogos e gols, além das medidas de tendência central e dispersão. Os resultados preliminares revelam a grandiosidade dos números de** Pelé**, com média superior a 0,9 gol por partida ao longo de mais de 1.300 jogos.
Totais
total_gols <- sum(dados_limpos$Gols, na.rm = TRUE)
total_jogos <- nrow(dados_limpos)
media_gols <- mean(dados_limpos$Gols, na.rm = TRUE)
mediana_gols <- median(dados_limpos$Gols, na.rm = TRUE)
dp_gols <- sd(dados_limpos$Gols, na.rm = TRUE)
cat(paste("Total de jogos:", total_jogos, "\n"))
cat(paste("Total de gols:", total_gols, "\n"))
cat(paste("Média de gols por jogo:", round(media_gols, 2), "\n"))
cat(paste("Mediana:", mediana_gols, "\n"))
cat(paste("Desvio padrão:", round(dp_gols, 2), "\n\n"))## Total de jogos: 1373
## Total de gols: 1287
## Média de gols por jogo: 0.94
## Mediana: 1
## Desvio padrão: 1.07
Distribuição dos gols
A tabela de distribuição dos gols nos permite compreender a frequência com que Pelé marcava em cada partida. Os resultados são reveladores: em mais da metade das partidas disputadas, Pelé encontrou o caminho das redes. Em 3 de cada 10 partidas, estufou as redes com um gol, e em 1 a cada 10 partidas fez dois gols. Em 40% das partidas, o craque deixou o gramado em branco, demonstrando como o gol é um evento excepcional mesmo para um gênio do futebol.
##
## 0 1 2 3 4 5 8
## 584 469 191 91 30 7 1
Percentual de jogos sem gols
jogos_sem_gol <- sum(dados_limpos$Gols == 0) / total_jogos * 100
cat(paste("\nJogos sem marcar gol:", round(jogos_sem_gol, 1), "%\n"))##
## Jogos sem marcar gol: 42.5 %
## Jogos com 1+ gols: 57.5 %
Agrupamos os dados por ano para identificar a evolução da performance de Pelé ao longo do tempo. O top 5 anos com mais gols revela o auge da carreira do jogador, concentrado principalmente na década de 1960, com destaque para os anos de 1961, 1962 e 1965, onde Pelé atingiu médias superiores a 1 gol por jogo.
media_por_ano <- dados_limpos %>%
group_by(Ano) %>%
summarise(
Jogos = n(),
Total_gols = sum(Gols),
Media_gols = mean(Gols),
Mediana_gols = median(Gols),
Max_gols = max(Gols)
) %>%
arrange(desc(Ano))
print(head(media_por_ano %>% arrange(desc(Media_gols)), 5))## # A tibble: 5 × 6
## Ano Jogos Total_gols Media_gols Mediana_gols Max_gols
## <dbl> <int> <int> <dbl> <dbl> <int>
## 1 1980 1 2 2 2 2
## 2 1961 75 111 1.48 1 5
## 3 1965 74 105 1.42 1 5
## 4 1958 68 88 1.29 1 5
## 5 1962 58 73 1.26 1 4
Top 5 anos com mais gols
## # A tibble: 5 × 6
## Ano Jogos Total_gols Media_gols Mediana_gols Max_gols
## <dbl> <int> <int> <dbl> <dbl> <int>
## 1 1959 104 126 1.21 1 4
## 2 1961 75 111 1.48 1 5
## 3 1965 74 105 1.42 1 5
## 4 1958 68 88 1.29 1 5
## 5 1960 82 76 0.927 1 5
A análise por competição revela que Pelé teve desempenhos excepcionais em diversas competições. Sintomática a realização de tantos jogos amistosos, pois é fato notório que o futebol brasileiro, que nessa época se tornou produto de exportação, ganhou enorme prestígio após a conquista do bicampeonato mundial pela seleção.
desempenho_competicao <- dados_limpos %>%
group_by(Competicao) %>%
summarise(
Jogos = n(),
Total_gols = sum(Gols),
Media_gols = mean(Gols),
Gols_por_jogo = Total_gols / Jogos
) %>%
arrange(desc(Gols_por_jogo))
print(desempenho_competicao)## # A tibble: 50 × 5
## Competicao Jogos Total_gols Media_gols Gols_por_jogo
## <fct> <int> <int> <dbl> <dbl>
## 1 Torneio de Caracas 2 5 2.5 2.5
## 2 Torneio Naranja 2 5 2.5 2.5
## 3 Copa Intercontinental 3 7 2.33 2.33
## 4 Taça Bernardo O'Higgins 2 3 1.5 1.5
## 5 Taça Morumbi 4 6 1.5 1.5
## 6 Torneio Internacional do Chile 10 15 1.5 1.5
## 7 Campeonato Sul-Americano 6 8 1.33 1.33
## 8 Torneio Itália 3 4 1.33 1.33
## 9 Superclássico dasAméricas 4 5 1.25 1.25
## 10 Torneio de Paris 4 5 1.25 1.25
## # ℹ 40 more rows
Listamos os adversários que mais sofreram com a genialidade de Pelé. Times como Corinthians, Portuguesa e Guarani figuraram entre os mais castigados, evidenciando a intensidade dos clássicos e a regularidade de Pelé contra seus principais rivais.
top_adversarios <- dados_limpos %>%
group_by(Adversario) %>%
summarise(
Jogos = n(),
Total_gols = sum(Gols),
Media_gols = mean(Gols)
) %>%
filter(Total_gols > 0) %>%
arrange(desc(Total_gols)) %>%
head(10)
print(top_adversarios)## # A tibble: 10 × 4
## Adversario Jogos Total_gols Media_gols
## <fct> <int> <int> <dbl>
## 1 Corinthians 50 51 1.02
## 2 Guarani 35 45 1.29
## 3 Portuguesa 52 43 0.827
## 4 Juventus-SP 29 42 1.45
## 5 Botafogo-SP 29 40 1.38
## 6 Palmeiras 56 32 0.571
## 7 São Paulo 49 32 0.653
## 8 Noroeste 18 29 1.61
## 9 Prudentina 11 25 2.27
## 10 XV de Piracicaba 18 25 1.39
Investigamos se o desempenho de Pelé era influenciado pelo fator casa. Considerando Vila Belmiro“ como casa e todos os outros estádios como fora/neutro, calculamos as médias e realizamos um teste t** para comparar os grupos. O teste revela se a diferença observada é estatisticamente significativa.
desempenho_local <- dados_limpos %>%
group_by(Em_casa) %>%
summarise(
Jogos = n(),
Total_gols = sum(Gols),
Media_gols = mean(Gols),
Mediana = median(Gols)
)
print(desempenho_local)## # A tibble: 2 × 5
## Em_casa Jogos Total_gols Media_gols Mediana
## <chr> <int> <int> <dbl> <dbl>
## 1 Casa 212 287 1.35 1
## 2 Fora/Neutro 1161 1000 0.861 1
# Teste t para comparar médias
teste_t <- t.test(Gols ~ Em_casa, data = dados_limpos)
cat("\nTeste t (casa vs fora):\n")##
## Teste t (casa vs fora):
##
## Welch Two Sample t-test
##
## data: Gols by Em_casa
## t = 4.9457, df = 250.81, p-value = 1.391e-06
## alternative hypothesis: true difference in means between group Casa and group Fora/Neutro is not equal to 0
## 95 percent confidence interval:
## 0.2963453 0.6885490
## sample estimates:
## mean in group Casa mean in group Fora/Neutro
## 1.3537736 0.8613264
Criamos quatro visualizações para compreender os dados:
Evolução temporal – gráfico de dispersão com suavização LOESS que mostra a trajetória de Pelé ao longo dos anos, com picos de performance e declínios naturais com a idade;
Boxplot por ano – distribuição dos gols por temporada, revelando a variabilidade e os outliers (como os jogos com 4, 5 e até 8 gols);
Histograma da distribuição – frequência absoluta de jogos por número de gols, evidenciando a alta concentração em 0 e 1 gol, e a cauda longa para jogos com múltiplos gols;
Média de gols por competição – comparação do desempenho nas diferentes competições, destacando aquelas onde Pelé foi mais prolífico.
p1 <- ggplot(dados_limpos, aes(x = Data, y = Gols)) +
geom_point(alpha = 0.5, color = "darkgreen") +
geom_smooth(method = "loess", se = TRUE, color = "red") +
labs(title = "Evolução dos Gols de Pelé por Jogo",
x = "Data", y = "Número de Gols") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold"))
p1p2 <- ggplot(dados_limpos, aes(x = as.factor(Ano), y = Gols)) +
geom_boxplot(fill = "lightblue", outlier.color = "red") +
labs(title = "Distribuição de gols por ano",
x = "Ano", y = "Gols por jogo") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
p2O vetor [0, 1, 2, 3, 4, 5, 8] representa as diferentes quantidades de gols que Pelé marcou em uma partida. No histograma, a barra correspondente a 8 gols tem altura 1, enquanto as demais barras alcançam centenas. Por isso, essa barra é tão pequena que se torna praticamente invisível a olho nu. Isso ocorre porque o histograma não foi projetado para enfatizar valores atípicos (outliers), mas sim para mostrar a distribuição geral dos dados.
# Gráfico com zoom para valores altos
p3 <- ggplot(dados_limpos, aes(x = Gols)) +
geom_histogram(binwidth = 1, fill = "steelblue", color = "white", alpha = 0.7) +
geom_vline(xintercept = media_gols, color = "red", linetype = "dashed", size = 1) +
annotate("text", x = media_gols + 0.5, y = 200,
label = paste("Média =", round(media_gols, 2)), color = "red") +
labs(title = "Distribuição de Gols por Jogo",
x = "Número de Gols", y = "Frequência") +
theme_minimal() +
scale_x_continuous(breaks = 0:8)
p3p4 <- ggplot(desempenho_competicao, aes(x = reorder(Competicao, Gols_por_jogo),
y = Gols_por_jogo)) +
geom_bar(stat = "identity", fill = "darkorange") +
coord_flip() +
labs(title = "Média de gols por competição",
x = "Competição", y = "Média de gols por jogo") +
theme_minimal() +
theme(axis.text.y = element_text(angle = 0, hjust = 1, size = 6))
p4Para identificar se havia uma tendência ao longo da carreira de Pelé, realizamos dois procedimentos:
Correlação de Pearson – medimos a força e direção da relação linear entre ano e número de gols;
Regressão linear simples – modelamos a relação entre ano e gols, permitindo estimar o efeito do tempo sobre a performance e identificar se houve aumento ou diminuição significativa ao longo dos anos.
O coeficiente de correlação de -0,217 indica uma correlação negativa fraca a moderada entre o ano e o número de gols marcados por jogo. Isso significa que, à medida que o tempo avançava, havia uma ligeira tendência de diminuição na quantidade de gols por partida. Contudo, essa é apenas uma das muitas variáveis que influenciam a quantidade de gols marcados.
correlacao_temporal <- cor.test(dados_limpos$Ano, dados_limpos$Gols,
method = "pearson")
print(correlacao_temporal)##
## Pearson's product-moment correlation
##
## data: dados_limpos$Ano and dados_limpos$Gols
## t = -8.2342, df = 1371, p-value = 4.169e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## -0.2669182 -0.1660845
## sample estimates:
## cor
## -0.2170803
O modelo indica que a variável Ano contribui muito pouco para explicar a variação na quantidade de gols por jogo, sendo que a maior parte da variação pode ser atribuída a outros fatores não considerados no modelo, como o tipo de competição, qualidade do adversário, condições físicas e lesões, mudanças táticas das equipes, fator casa ou mando de campo, idade e estágio da carreira.
modelo_lm <- lm(Gols ~ Ano, data = dados_limpos)
cat("\nResumo da regressão linear (Gols ~ Ano):\n")##
## Resumo da regressão linear (Gols ~ Ano):
##
## Call:
## lm(formula = Gols ~ Ano, data = dados_limpos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.2946 -0.7891 -0.1779 0.4443 6.9776
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 77.398788 9.285887 8.335 < 2e-16 ***
## Ano -0.038888 0.004723 -8.234 4.17e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.043 on 1371 degrees of freedom
## Multiple R-squared: 0.04712, Adjusted R-squared: 0.04643
## F-statistic: 67.8 on 1 and 1371 DF, p-value: 4.169e-16
Agrupamos os dados por década para identificar padrões mais amplos na carreira de Pelé. A análise revela o auge na década de 1960, quando Pelé atingiu suas melhores marcas, com médias superiores a 1 gol por jogo e percentuais de jogos com gol acima de 60%.
por_decada <- dados_limpos %>%
group_by(Decada) %>%
summarise(
Jogos = n(),
Total_gols = sum(Gols),
Media_gols = mean(Gols),
Jogos_com_gol = sum(Gols > 0),
Perc_acerto = (Jogos_com_gol / Jogos) * 100
)
print(por_decada)## # A tibble: 5 × 6
## Decada Jogos Total_gols Media_gols Jogos_com_gol Perc_acerto
## <dbl> <int> <int> <dbl> <int> <dbl>
## 1 1950 247 282 1.14 155 62.8
## 2 1960 673 725 1.08 436 64.8
## 3 1970 448 277 0.618 196 43.8
## 4 1980 4 3 0.75 2 50
## 5 1990 1 0 0 0 0
Exportamos os principais resultados em formato .csv para utilização em outras ferramentas ou para compartilhamento. Utilizamos row.names = FALSE para garantir que os índices não sejam incluídos no arquivo.
Finalizamos nossa análise com um resumo que sintetiza as principais descobertas:
o total de jogos e gols de Pelé;
a porcentagem de jogos em que marcou;
a competição onde teve a melhor média de gols.
cat(sprintf("Pelé disputou %d jogos, marcando %d gols (média de %.2f por jogo)\n",
total_jogos, total_gols, media_gols))## Pelé disputou 1373 jogos, marcando 1287 gols (média de 0.94 por jogo)
## Em 57.5% dos jogos, Pelé marcou pelo menos 1 gol
cat(sprintf("Sua melhor média foi em %s (%.2f gols/jogo)\n",
desempenho_competicao$Competicao[1],
desempenho_competicao$Gols_por_jogo[1]))## Sua melhor média foi em Torneio de Caracas (2.50 gols/jogo)
Conclusão
Muito já foi dito e escrito a respeito do Rei Pelé. Aproveitamos a existência de tabelas livremente disponíveis na web para criar uma base de dados, que foi manipulada no R, para revelar algumas peculiaridades ofuscadas pelos números.
Demonstramos como o uso de funções do tidyverse e ferramentas estatísticas podem ser úteis para reduzir o tamanho do código e tornar a análise mais elucidativas.
A análise exploratória revelou que:
Pelé disputou 1.373 partidas e marcou 1.283 gols (média de 0,93 por jogo);
em 60% dos jogos, Pelé marcou pelo menos um gol;
o auge da carreira ocorreu na década de 1960, com médias superiores a 1 gol por jogo;
o Santos foi a equipe com mais jogos e gols, seguido pela Seleção Brasileira;
Corinthians, Portuguesa e Guarani estão entre os adversários mais castigados;
Pelé marcou gols em todas as competições que disputou;
o fator casa (Vila Belmiro) teve influência significativa no desempenho;
Pelé fez gols em todos os dias da semana.
Referências
Bradley Boehmke (2018). “Scraping Data: UC Business Analytics R Programming Guide”. https://uc-r.github.io/scraping
Kabacoff, Robert I. (2011). R in Action - Data analysis and graphics with R. Manning Publications Co.
Beggs, Clive (2024). Soccer Analytics: An Introduction Using R. CRC Press, Taylor & Francis Group .
Katti, Vishall (2021). “Programming with R[Dplyr] - As I Understand it”. https://vishalkatti.com/posts/programming-with-dplyr