Objetivo

O objetivo desta pesquisa é estudar o comportamento dos times já rebaixados no Campeonato Brasileiro de Futebol e também os fatores que influenciam um time ser rebaixado no Brasileirão. Em particular, buscamos investigar a validade da ideia tradicional de que alcançar a marca de “45 pontos” é suficiente para evitar o rebaixamento para a segunda divisão. Essa crença amplamente disseminada sugere que atingir essa pontuação pode ser uma garantia de permanência na elite do futebol nacional. No entanto, é crucial avaliar se essa hipótese se sustenta ao longo do tempo e se os fatores que determinam o rebaixamento são realmente refletidos nessa meta de pontos.

Para alcançar este objetivo, a pesquisa utilizará análise descritiva para identificar quais variáveis, como por exemplo, o número de gols marcados, gols sofridos, derrotas, empates e etc, têm maior impacto em um time ser rebaixado. Além disso, será realizada uma análise crítica sobre a relevância da meta dos “45 pontos”, comparando-a com as evidências observadas para determinar sua eficácia como indicador de segurança contra o rebaixamento.

Pacotes necessários

library(ggplot2)
library(dplyr)
library(e1071)
library(kableExtra)
library(knitr)

Leitura do banco de dados

setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
brasileirao <- read.csv("brasileirao.csv", sep = ";")
brasileirao <- brasileirao %>%
  filter(year >= 2006)

Medidas Estatísticas e Histogramas

# Filtrando dataframe apenas com os times rebaixados
brasileirao_rebaixados <- brasileirao %>%
    filter(position > 16, year >= 2006)

# Medidas Estatísticas
pontos <- brasileirao_rebaixados$points
media <- mean(pontos)
mediana <- median(pontos)
variancia <- var(pontos)
desvio_padrao <- sd(pontos)
assimetria <- skewness(pontos)
curtose <- kurtosis(pontos)  # Correção na função de curtose

# Pontuação max e min de times rebaixados
min_pontos <- min(pontos)
max_pontos <- max(pontos)

# Criando o dataframe para as linhas do histograma
lines_df <- data.frame(
  value = c(media, mediana),
  Legenda = c("Média", "Mediana")
)

# Histograma
ggplot(brasileirao_rebaixados, aes(x = points)) +
  geom_histogram(color = "white", fill = "black", binwidth = 1) +
  scale_x_continuous(breaks = seq(from = min_pontos, to = max_pontos, by = 1)) +
  geom_vline(data = lines_df, aes(xintercept = value, color = Legenda), linetype = "dashed", size = 1) +
  labs(
    title = "Histograma da pontuação dos times rebaixados entre 2006 - 2019",
    x = "Quantidade de Pontos",
    y = "Frequência"
  ) +
  scale_color_manual(values = c("red", "blue")) + # Adicione as cores específicas
  theme_classic()

# Criando a tabela com as estatísticas
estatisticas <- data.frame(
  Estatísticas = c("Média", "Mediana", "Variância", "Desvio Padrão", "Assimetria", "Curtose"),
  Valor = c(media, mediana, variancia, desvio_padrao, assimetria, curtose)
)

# Mostrar a tabela
kable(estatisticas, col.names = c("Estatísticas", "Valor"))
Estatísticas Valor
Média 35.9464286
Mediana 37.0000000
Variância 42.0152597
Desvio Padrão 6.4819179
Assimetria -0.9637136
Curtose 0.4991345

O valor da assimetria é negativo, indicando que há uma concentração dos dados à direita. Isso sugere que a maior parte dos pontos está agrupada no intervalo de 35 a 45 pontos. Ademais, a curtose de aproximadamente 0.5 do histograma dos pontos dos times rebaixados indica que a distribuição é ligeiramente mais pontiaguda e com caudas um pouco mais pesadas do que uma distribuição normal. Isso sugere uma leve concentração dos dados em torno da média e algumas caudas mais pronunciadas, mas a diferença não é extrema.

Após a análise do histograma, observa-se que a maior pontuação já alcançada por um time rebaixado é de 45 pontos. No entanto, é importante destacar que essa situação foi uma exceção, ocorrendo apenas uma vez entre 2006 e 2019. É necessário estudar o histórico de pontos do 16º colocado, pois se trata do primeiro time fora da zona de rebaixamento.

brasileirao_pos16 = brasileirao %>%
  filter(brasileirao$position == 16, brasileirao$year >= 2006)

ggplot(brasileirao_pos16, aes(x = points)) +
  geom_histogram(color = "white", fill = "black", binwidth = 1 ) +
  scale_x_continuous(breaks = seq(from = 39, to = 46, by=1)) +
  labs(title = "Histograma de pontos do 16º colocado",
       x = "Pontuação",
       y = "Frequência") +
  theme_classic()

Vejamos que, a frequência de times na 16º colocação com 45 pontos é de 4 observações. Dado que no histograma de pontuação dos times rebaixados entre 2006 e 2019 temos uma observação de ocorrência de 45 pontos. Concluímos que, das vezes nas quais um time terminou o campeonato com 45 pontos, 1 em 5 ele foi rebaixado. Tal feito foi realizado pelo Coritiba no Campeonato Brasileiro de 2009:

ultimoreb_2009 <- brasileirao_rebaixados %>%
  filter(brasileirao_rebaixados$points == 45)
kable(ultimoreb_2009)
year position team points games victories draws losses goals_scored goals_against goals_difference perc_points_won
2009 17  Coritiba 45 38 12 9 17 48 60 -12 39

Validade da Meta de 45 Pontos:

A crença tradicional de que atingir 45 pontos é uma garantia de permanência na elite do futebol nacional é parcialmente corroborada pelos dados, mas não é uma regra infalível. Embora a meta de 45 pontos seja frequentemente citada como um valor seguro para evitar o rebaixamento, a análise mostra que, de fato, um time pode ser rebaixado mesmo com 45 pontos. Entre 2006 e 2019, o Coritiba foi um exemplo notável desse cenário, ao ser rebaixado com 45 pontos em 2009. Isso sugere que, enquanto 45 pontos pode ser uma meta razoável, não é uma garantia absoluta de segurança.

Encontrando Correlações

cor_gols_marcados <- cor(brasileirao$points, brasileirao$goals_scored)
cor_gols_sofridos <- cor(brasileirao$points, brasileirao$goals_against)
cor_vitorias <- cor(brasileirao$points, brasileirao$victories)
cor_derrotas <- cor(brasileirao$points, brasileirao$losses)
cor_empates <- cor(brasileirao$points, brasileirao$draws)
brasileirao <- brasileirao %>%
  mutate(Rebaixado = ifelse(position > 16, "Sim", "Não"))

ggplot(brasileirao, aes(x = victories, y = points)) +
  geom_jitter(aes(color = Rebaixado), size = 2) + 
  scale_color_manual(values = c("Sim" = "red", "Não" = "green")) +  # Define as cores
  labs(title = "Dispersão: Vitórias vs Pontos",
       x = "Vitórias",
       y = "Pontos") +
  theme_minimal()

print(cor_vitorias)
## [1] 0.9780552
ggplot(brasileirao, aes(x = losses, y = points)) +
  geom_jitter(aes(color = Rebaixado), size = 2) + 
  scale_color_manual(values = c("Sim" = "red", "Não" = "green")) +  # Define as cores
  labs(title = "Dispersão: Derrotas vs Pontos",
       x = "Derrotas",
       y = "Pontos") +
  theme_minimal()

print(cor_derrotas)
## [1] -0.9182298
ggplot(brasileirao, aes(x = draws, y = points)) +
  geom_jitter(aes(color = Rebaixado), size = 2) + 
  scale_color_manual(values = c("Sim" = "red", "Não" = "green")) +  # Define as cores
  labs(title = "Dispersão: Empates vs Pontos",
       x = "Empates",
       y = "Pontos") +
  theme_minimal()

print(cor_empates)
## [1] -0.03068457
ggplot(brasileirao, aes(x = goals_scored, y = points)) +
  geom_jitter(aes(color = Rebaixado), size = 2) + 
  scale_color_manual(values = c("Sim" = "red", "Não" = "green")) +  # Define as cores
  labs(title = "Dispersão: Gols Marcados vs Pontos",
       x = "Gols Marcados",
       y = "Pontos") +
  theme_minimal()

print(cor_gols_marcados)
## [1] 0.7363492
ggplot(brasileirao, aes(x = goals_against, y = points)) +
  geom_jitter(aes(color = Rebaixado), size = 2) + 
  scale_color_manual(values = c("Sim" = "red", "Não" = "green")) +  # Define as cores
  labs(title = "Dispersão: Gols Sofridos vs Pontos",
       x = "Gols Sofridos",
       y = "Pontos") +
  theme_minimal()

print(cor_gols_sofridos)
## [1] -0.7186629

A análise identificou que os principais fatores que influenciam o rebaixamento são, em ordem de relevância: número de vitórias, derrotas, gols marcados e gols sofridos. O número de empates, embora relevante, não possui uma influência tão significativa quanto os outros fatores.

Para ilustrar, vejamos os times que terminaram o Campeonato Brasileiro de Futebol de 2014 com 8 empates:

campeonato_2014 <- brasileirao %>%
  filter(draws == 8, year == 2014)
kable(campeonato_2014)
year position team points games victories draws losses goals_scored goals_against goals_difference perc_points_won Rebaixado
2014 1  Cruzeiro 80 38 24 8 6 67 38 29 70 Não
2014 9  Santos 53 38 15 8 15 42 35 7 46 Não
2014 12  Goiás 47 38 13 8 17 38 40 –2 41 Não
2014 13  Figueirense 47 38 13 8 17 37 47 –10 41 Não
2014 17  Vitória 38 38 10 8 20 37 54 –17 33 Sim

Isso implica que, para evitar o rebaixamento, é mais crucial focar em melhorar o número de vitórias e reduzir as derrotas e gols sofridos, além de aumentar a quantidade de gols marcados.