jogos_brasileirao = read_csv2(here("data/campeonato-brasileiro-full.csv"))
glimpse(jogos_brasileirao)
## Rows: 8,319
## Columns: 14
## $ id <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16…
## $ rodada <chr> "1", "1", "1", "1", "1", "1", "1", "1", "1", "2", "2"…
## $ data <date> 2000-07-29, 2000-07-29, 2000-07-29, 2000-07-30, 2000…
## $ horario <chr> "16h00", "16h00", "16h00", "17h00", "18h30", "16h00",…
## $ dia <chr> "Sábado", "Sábado", "Sábado", "Domingo", "Domingo", "…
## $ mandante <chr> "Fluminense", "Vasco", "Vitória", "Botafogo-RJ", "Juv…
## $ visitante <chr> "Bahia", "Sport", "Palmeiras", "Atlético-MG", "Flamen…
## $ vencedor <chr> "Fluminense", "Sport", "Vitória", "-", "-", "-", "Ath…
## $ arena <chr> "Maracanã", "São Januário", "Barradão", "Caio Martins…
## $ mandante_placar <dbl> 2, 0, 4, 0, 1, 0, 0, 0, 3, 0, 2, 3, 2, 0, 3, 2, 0, 1,…
## $ visitante_placar <dbl> 0, 2, 1, 0, 1, 0, 2, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1,…
## $ estado_mandante <chr> "RJ", "RJ", "ES", "RJ", "RS", "SP", "MG", "MG", "GO",…
## $ estado_visitante <chr> "BA", "PE", "SP", "MG", "RJ", "PE", "PR", "DF", "SP",…
## $ estado_vencedor <chr> "RJ", "PE", "ES", "-", "-", "-", "PR", "DF", "GO", "-…
campeoes_brasileiros = read_csv(here('data/campeoes-brasileiros.csv'))
## Rows: 64 Columns: 7
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (5): vencedor, vice, terceiro_colocado, quarto_colocado, artilheiro
## dbl (2): ano, gols
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
glimpse(campeoes_brasileiros)
## Rows: 64
## Columns: 7
## $ ano <dbl> 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967…
## $ vencedor <chr> "Bahia", "Palmeiras", "Santos", "Santos", "Santos", …
## $ vice <chr> "Santos", "Fortaleza", "Bahia", "Botafogo", "Bahia",…
## $ terceiro_colocado <chr> "Grêmio", "Fluminense", "America", "Internacional", …
## $ quarto_colocado <chr> "Vasco da Gama", "Santa Cruz", "Náutico", "Sport", "…
## $ artilheiro <chr> "Léo Briglia (Bahia)", "Bececê (Fortaleza)", "Pelé (…
## $ gols <dbl> 8, 7, 7, 7, 8, 7, 10, 10, 15, 9, 18, 7, 14, 12, 15, …
Os dados utilizados nesse estudo consistem em dados de partidas de futebol do campeonato brasileiro desde a edição de 2000, e também de dados sobre o histórico de campeões e outras colocações do topo da tabela do campeonato brasileiro. Os dados originais podem ser acessados através dos links disponibilizados abaixo:
Dados das partidas do campeonato campeonato-brasileiro-full.csv
- id: identificador único da partida
- rodada: identificador da rodada correspondente à partida que foi realizada
- data: data em que foi realizada a partida
- horario: horário em que foi realizada a partida
- dia: dia da semana em que foi realizada a partida
- mandante: nome da equipe mandante
- visitante: nome da equipe visitante
- vencedor: nome da equipe que venceu a partida
- arena: nome do estádio em que foi realizada a partida
- mandante_placar: quantos gols a equipe mandante marcou
- visitante_placar: quantos gols a equipe visitante marcou
- estado_mandante: estado ao qual pertence a equipe mandante
- estado_visitante: estado ao qual pertence a equipe visitante
- estado_vencedor: estado ao qual pertence a equipe que venceu a partida
- ano_brasileirao: ano da edição do campeonato que foi realizado
Dados de campeões brasileiros campeoes-brasileiros.csv
- ano: ano da edição do campeonato que foi realizado
- vencedor: primeiro colocado na tabela de classificação após a última rodada
- vice: segundo colocado na tabela de classificação após a última rodada
- terceiro_colocado: terceiro colocado na tabela de classificação após a última rodada
- quarto_colocado: quarto colocado na tabela de classificação após a última rodada
- artilheiro: o(s) jogador(es) que marcou(marcaram) mais gols na edição do campeonato
- gols: quantos gols o(s) artilheiro(s) marcou
Desde 2003, o campeonato brasileiro de futebol é realizado em formato de pontos corridos, em que todas as equipes se enfrentam duas vezes, uma em seu próprio estádio/região (como mandante), e outra no estado adversário (como visitante). Uma vitória dá 3 pontos à equipe, um empate dá 1 ponto para ambas, e uma derrota não dá ponto algum. Ao final de todas as rodadas, quem tiver mais pontos é declarado campeão brasileiro.
É sabido por quem acompanha futebol, especialmente campeonatos de pontos corridos, que as equipes mandantes possuem uma maior vantagem em relação à equipe visitante, já que vão jogar no estádio em que estão acostumados a treinar e vão contar com o apoio de sua torcida. Porém, devido à pandemia do coronavírus, o campeonato brasileiro do ano de 2020 foi realizado inteiramente sem torcedores. Esse estudo se propõe a analisar o aproveitamento histórico de mandantes e visitantes nos campeonatos realizados. A partir disso, será feito um modelo de regressão logística pra entender o quanto o aproveitamento (porcentagem de vitórias que uma equipe obtém) como mandante e visitante influencia na colocação da equipe (entre os 4 primeiros colocados ao final da última rodada), e se essa influência se alterou na edição de 2020, em que o time mandante não contou mais com o apoio da sua torcida.
OBS: Apesar do formato de pontos corridos ser adotado desde 2003, apenas em 2006 foi organizado o campeonato no formato mais recente, com 20 equipes na Série A, e um total de 38 rodadas. Por isso, vamos realizar uma filtragem de dados para pegar os dados de partidas e de campeões a partir da edição realizada em 2006.
jogos_brasileirao_filtrados = jogos_brasileirao %>%
filter(as.numeric(substr(data, 0, 4)) >= 2006 & as.numeric(substr(data, 0, 4)) < 2020) %>%
mutate(ano_brasileirao = as.numeric(substr(data, 0, 4)))
glimpse(jogos_brasileirao_filtrados)
## Rows: 5,320
## Columns: 15
## $ id <dbl> 2620, 2621, 2622, 2623, 2624, 2625, 2626, 2627, 2628,…
## $ rodada <chr> "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "2"…
## $ data <date> 2006-04-15, 2006-04-15, 2006-04-16, 2006-04-16, 2006…
## $ horario <chr> "18h10", "18h10", "18h10", "18h10", "16h00", "18h10",…
## $ dia <chr> "Sábado", "Sábado", "Domingo", "Domingo", "Domingo", …
## $ mandante <chr> "Vasco", "Juventude", "Santa Cruz", "Goiás", "Botafog…
## $ visitante <chr> "Internacional", "Paraná", "Figueirense", "Santos", "…
## $ vencedor <chr> "-", "Juventude", "-", "-", "Botafogo-RJ", "Fluminens…
## $ arena <chr> "São Januário", "Alfredo Jaconi", "Arruda", "Serra Do…
## $ mandante_placar <dbl> 1, 1, 0, 0, 1, 1, 2, 2, 2, 1, 3, 6, 1, 0, 3, 3, 1, 1,…
## $ visitante_placar <dbl> 1, 0, 0, 0, 0, 2, 0, 3, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0,…
## $ estado_mandante <chr> "RJ", "RS", "PE", "GO", "RJ", "PR", "RS", "SP", "SP",…
## $ estado_visitante <chr> "RS", "PR", "SC", "SP", "CE", "RJ", "SP", "SP", "MG",…
## $ estado_vencedor <chr> "-", "RS", "-", "-", "RJ", "RJ", "RS", "SP", "SP", "S…
## $ ano_brasileirao <dbl> 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006,…
campeoes_brasileiros_filtrados = campeoes_brasileiros %>%
filter(ano >= 2006 & ano < 2020)
glimpse(campeoes_brasileiros_filtrados)
## Rows: 14
## Columns: 7
## $ ano <dbl> 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014…
## $ vencedor <chr> "São Paulo", "São Paulo", "São Paulo", "Flamengo", "…
## $ vice <chr> "Internacional", "Santos", "Grêmio", "Internacional"…
## $ terceiro_colocado <chr> "Grêmio", "Flamengo", "Cruzeiro", "São Paulo", "Cori…
## $ quarto_colocado <chr> "Santos", "Fluminense", "Palmeiras", "Cruzeiro", "Gr…
## $ artilheiro <chr> "Souza (Goiás)", "Josiel (Paraná)", "Keirrison (Cori…
## $ gols <dbl> 17, 20, 21, 19, 23, 23, 20, 21, 18, 20, 14, 18, 18, …
Primeiramente, vamos dar uma olhada em alguns gráficos de desempenho de equipes mandantes e visitantes até a edição de 2019.
df_mandantes_gols = jogos_brasileirao_filtrados %>%
group_by(ano_brasileirao) %>%
summarise(
gols = sum(mandante_placar)
) %>%
mutate(tipo_gols = "gols dos mandantes")
df_visitantes_gols = jogos_brasileirao_filtrados %>%
group_by(ano_brasileirao) %>%
summarise(
gols = sum(visitante_placar)
) %>%
mutate(tipo_gols = "gols dos visitantes")
df_gols = rbind(df_mandantes_gols, df_visitantes_gols)
df_gols %>%
ggplot(aes(fill=tipo_gols, y=gols, x=as.character(ano_brasileirao))) +
geom_bar(position="dodge", stat="identity") +
labs(
x = "Ano em que o Brasileirão foi disputado",
y = "Gols",
title = "Visualização de gols marcados por mandantes e visitantes no Brasileirão"
)
Como observado no gráfico acima, as equipes mandantes costumam, pelo menos até a edição de 2019, fazer mais gols que as equipes visitantes.
df_vitorias_mandantes = jogos_brasileirao_filtrados %>%
group_by(ano_brasileirao) %>%
summarise(
jogos = sum(vencedor == mandante)
) %>%
mutate(tipo_jogos = "1 - Vitória dos mandantes")
df_vitorias_visitantes = jogos_brasileirao_filtrados %>%
group_by(ano_brasileirao) %>%
summarise(
jogos = sum(vencedor == visitante)
) %>%
mutate(tipo_jogos = "2 - Vitória dos visitantes")
df_empates = jogos_brasileirao_filtrados %>%
group_by(ano_brasileirao) %>%
summarise(
jogos = sum(vencedor == '-')
) %>%
mutate(tipo_jogos = "3 - Empates")
df_jogos = rbind(df_vitorias_mandantes, df_vitorias_visitantes, df_empates)
df_jogos %>%
ggplot(aes(fill=tipo_jogos, y=jogos, x=as.character(ano_brasileirao))) +
geom_bar(position="dodge", stat="identity") +
labs(
x = "Ano em que o Brasileirão foi disputado",
y = "Gols",
title = "Visualização de desempenho de mandantes e visitantes no Brasileirão"
)
E de acordo com o gráfico acima, podemos observar que as equipes mandantes costumam ganhar mais seus jogos mais constantemente, do que empates ou vitórias de visitantes. O destaque fica para a edição de 2017, em que a diferença foi um pouco menor do que os outros anos.
Para facilitar a criação do modelo de regressão logística, vamos fazer um cruzamento de dados para gerar um dataset final com dados de aproveitamento dos times e se esse time terminou no G4, cujas informações e colunas podem ser observadas abaixo:
## `summarise()` has grouped output by 'time'. You can override using the `.groups` argument.
## `summarise()` has grouped output by 'time'. You can override using the `.groups` argument.
## # A tibble: 562 × 6
## # Groups: time [41]
## time ano_brasileirao jogos aproveitamento tipo_aproveitam… terminou_no_g4
## <chr> <dbl> <int> <dbl> <chr> <lgl>
## 1 ATHLÉTICO-PR 2006 9 47.4 Aproveitamento … FALSE
## 2 BOTAFOGO-RJ 2006 10 52.6 Aproveitamento … FALSE
## 3 CORINTHIANS 2006 9 47.4 Aproveitamento … FALSE
## 4 CRUZEIRO 2006 10 52.6 Aproveitamento … FALSE
## 5 FIGUEIRENSE 2006 9 47.4 Aproveitamento … FALSE
## 6 FLAMENGO 2006 10 52.6 Aproveitamento … FALSE
## 7 FLUMINENSE 2006 7 36.8 Aproveitamento … FALSE
## 8 FORTALEZA 2006 5 26.3 Aproveitamento … FALSE
## 9 GOIÁS 2006 9 47.4 Aproveitamento … FALSE
## 10 GRÊMIO 2006 13 68.4 Aproveitamento … TRUE
## # … with 552 more rows
- time: nome da equipe
- ano_brasileirao: ano da edição do campeonato que foi realizado
- jogos: quantos jogos a equipe ganhou (como visitante ou mandante)
- aproveitamento: porcentagem que corresponde a quantos jogos a equipe ganhou (como visitante ou mandante) pelo total de jogos
- tipo_aproveitamento: identificador do coeficiente de aproveitamento, se é aproveitamento como mandante ou como visitante
- terminou_no_g4: diz se a equipe terminou entre os 4 primeiros colocados ao fim da última rodada no brasileirão daquele ano.
Agora, vamos aplicar uma regressão logística múltipla através da variável binomial de resposta terminou_no_g4 e a variável explicativa aproveitamento, com uma filtragem para o tipo aproveitamento como mandante, para identificarmos o quanto o aproveitamento como mandante influencia em a equipe terminar entre os 4 primeiros colocados:
bm_mandante <- glm(terminou_no_g4 ~ aproveitamento,
data = df_aproveitamento_final %>% filter(tipo_aproveitamento == "Aproveitamento como mandante"),
family = "binomial")
tidy(bm_mandante, conf.int = T, exponentiate = TRUE) %>% select(-p.value)
## # A tibble: 2 × 6
## term estimate std.error statistic conf.low conf.high
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 0.0000109 1.41 -8.08 0.000000519 0.000137
## 2 aproveitamento 1.19 0.0231 7.57 1.14 1.25
glance(bm_mandante)
## # A tibble: 1 × 8
## null.deviance df.null logLik AIC BIC deviance df.residual nobs
## <dbl> <int> <dbl> <dbl> <dbl> <dbl> <int> <int>
## 1 275. 279 -76.2 156. 164. 152. 278 280
pR2(bm_mandante)
## fitting null model for pseudo-r2
## llh llhNull G2 McFadden r2ML r2CU
## -76.2462957 -137.2950405 122.0974896 0.4446537 0.3534227 0.5655273
A partir da análise do Pseudo-R2 de McFadden, pode-se observar que o modelo feito a partir da variável selecionada explica cerca de 44% dos dados dessa amostra. Um grau de explicação considerável para uma única variável.
tidy(bm_mandante, conf.int = T, exponentiate = TRUE) %>% select(-p.value) %>%
filter(term != "(Intercept)") %>%
ggplot(aes(x = reorder(term, estimate), y = estimate, ymin = conf.low, ymax = conf.high)) +
geom_point() +
coord_flip() +
geom_linerange() +
geom_hline(yintercept = 1, color = 'red') +
labs(
y = "Estimativa",
x = "Variável explicativa",
title = "Intervalo de confiança para a variável explicativa escolhida"
)
A partir da análise do gráfico com os intervalos de confiança para a influência do aproveitamento como mandante na variação do quanto uma equipe termina o campeonato entre as 4 primeiras posições, podemos afirmar que, como esperado, a variável de aproveitamento como mandante possui uma explicação positiva razoável, com intervalo de confiança variando entre 1.143 e 1.252, aproximadamente.
Vamos analizar agora se o quanto a variável de aproveitamento como mandante explica difere quando levamos em consideração um ano em que não houve presença de torcida nos estádios. Vamos observar algumas visualizações sobre o campeonato de 2020:
df_gols %>%
ggplot(aes(fill=tipo_gols, y=gols, x=as.character(ano_brasileirao))) +
geom_bar(position="dodge", stat="identity") +
labs(
x = "Ano em que o Brasileirão foi disputado",
y = "Gols",
title = "Visualização de gols marcados por mandantes e visitantes no Brasileirão 2020"
)
df_jogos %>%
ggplot(aes(fill=tipo_jogos, y=jogos, x=as.character(ano_brasileirao))) +
geom_bar(position="dodge", stat="identity") +
labs(
x = "Ano em que o Brasileirão foi disputado",
y = "Gols",
title = "Visualização de desempenho de mandantes e visitantes no Brasileirão 2020"
)
De acordo com os gráficos acima, os times mandantes tiveram de fato uma redução no desempenho, com menos gols marcados e menos vitórias. Agora vamos aplicar a regressão logística pra ver se há alguma mudança significativa no quanto a variável explica.
## `summarise()` has grouped output by 'time'. You can override using the `.groups` argument.
## `summarise()` has grouped output by 'time'. You can override using the `.groups` argument.
Agora, vamos aplicar a regressão logística:
bm_mandante <- glm(terminou_no_g4 ~ aproveitamento,
data = df_aproveitamento_final %>% filter(tipo_aproveitamento == "Aproveitamento como mandante"),
family = "binomial")
tidy(bm_mandante, conf.int = T, exponentiate = TRUE) %>% select(-p.value)
## # A tibble: 2 × 6
## term estimate std.error statistic conf.low conf.high
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 5.47e-10 11.8 -1.80 2.89e-25 0.00153
## 2 aproveitamento 1.46e+ 0 0.216 1.75 1.11e+ 0 2.76
glance(bm_mandante)
## # A tibble: 1 × 8
## null.deviance df.null logLik AIC BIC deviance df.residual nobs
## <dbl> <int> <dbl> <dbl> <dbl> <dbl> <int> <int>
## 1 20.0 19 -3.75 11.5 13.5 7.51 18 20
pR2(bm_mandante)
## fitting null model for pseudo-r2
## llh llhNull G2 McFadden r2ML r2CU
## -3.7546894 -10.0080485 12.5067182 0.6248330 0.4649183 0.7351458
A partir da análise do Pseudo-R2 de McFadden, pode-se observar que o modelo feito a partir da variável selecionada explica cerca de 62% dos dados dessa amostra. Um aumento considerável no grau de explicação. Faz sentido, já que o desempenho dos mandantes caiu, e os visitantes estão com alguns resultados mais positivos do que nas edições anteriores, então o aproveitamento das equipes como mandantes se torna muito mais crucial para sua colocação final entre os 4 primeiros do que antes.