Introdução

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.

Preparação e pré-processamento

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;

  • 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.

Diretório de trabalho

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

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

Importamos os dados

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.

pele_gols <- read.csv("gols_de_pele.csv", header = TRUE)

Inspecionamos e tratamos os dados

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")
  ) 

Estatísticas descritivas básicas

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.

Estatísticas descritivas

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.

tabela_gols <- table(dados_limpos$Gols)
print(tabela_gols)
## 
##   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 %
cat(paste("Jogos com 1+ gols:", 100 - round(jogos_sem_gol, 1), "%\n\n"))
## Jogos com 1+ gols: 57.5 %

Análise por ano

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.

Média de gols por ano

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

Melhores anos (mais gols)

Top 5 anos com mais gols

print(head(media_por_ano %>% arrange(desc(Total_gols)), 5))
## # 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

Análise por competição

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 por competiçã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

Análise por adversário

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 10 maiores vítimas

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

O fator mando de campo

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):
print(teste_t)
## 
##  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

Gráficos

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.

Gráfico 1: Evolução temporal dos gols

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"))
p1

Gráfico 2: Boxplot por ano

p2 <- 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))
p2

Gráfico 3: Histograma da distribuição

O 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)
p3

Gráfico 4: Média de gols por competição

p4 <- 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))
p4

Análise de tendência temporal

Para 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.

Correlação entre ano e média de gols

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

Regressão linear simples

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):
print(summary(modelo_lm))
## 
## 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

Análise de periodicidade

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%.

Análise por década

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

Exportar resultados

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.

write.csv(media_por_ano, "analise_por_ano.csv", row.names = FALSE)
write.csv(desempenho_competicao, "analise_por_competicao.csv", row.names = FALSE)
write.csv(top_adversarios, "top_adversarios.csv", row.names = FALSE)

Resumo final

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)
cat(sprintf("Em %.1f%% dos jogos, Pelé marcou pelo menos 1 gol\n", 
            100 - jogos_sem_gol))
## 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