Este relatório apresenta uma análise estatística detalhada de partidas de futebol obtidas a partir de um conjunto de dados coletado via web scraping no site Flashscore — uma das maiores plataformas de acompanhamento esportivo em tempo real.
A base contém informações completas de cada jogo, separadas entre time da casa e time visitante, abrangendo métricas tradicionais e avançadas que permitem uma avaliação rica do desempenho das equipes.
O objetivo deste dashboard é:
Este conjunto amplo de métricas torna possível analisar o futebol de forma moderna e profunda, alinhada às melhores práticas de análise esportiva atual.
library(tidyverse) # Conjunto de pacotes para manipulação de dados, modelagem e visualização.
library(readxl) # Leitura de arquivos Excel (.xlsx, .xls).
library(janitor) # Limpeza e padronização de nomes de colunas, tabelas e dados.
library(lubridate) # Manipulação e conversão de datas e horários.
library(DT) # Tabelas interativas renderizadas em HTML (DataTables).
library(flexdashboard) # Criação de dashboards responsivos com RMarkdown.
library(dplyr) # Manipulação de dados (parte do tidyverse, mas carregado explicitamente).
library(stringr) # Manipulação de strings de forma consistente.
library(tidyr) # Funções para "arrumar" dados (separar, pivotar, completar etc.).
library(tidymodels) # Framework para modelagem estatística e machine learning.
library(vip) # Visualização da importância de variáveis em modelos.
library(ggplot2) # Sistema de visualização gráfica (parte do tidyverse).
library(patchwork) # Combinar múltiplos gráficos ggplot2 em um layout.
library(plotly) # Gráficos interativos, conversão ggplot → plotly.
library(htmlwidgets) # Exportação/renderização de widgets HTML interativos.
library(htmltools) # Manipulação de HTML dentro do RMarkdown (tags, estilos...).
library(gt) # Criação de tabelas estáticas profissionais.
library(knitr) # Motor de renderização do RMarkdown (kable, chunks etc.).
library(kableExtra) # Estilização avançada de tabelas criadas com knitr::kable.Rows: 5,776
Columns: 78
$ url_jogo <chr> "https://www.flas…
$ time_da_casa <chr> "Fluminense", "Sp…
$ time_visitante <chr> "Flamengo", "Flam…
$ data_hora <chr> "19.11.2025 21:30…
$ gols_time_da_casa <chr> "2", "1", "3", "2…
$ gols_time_visitante <chr> "1", "5", "2", "2…
$ `gols esperados (xg)_time_da_casa` <chr> "1.75", "0.41", "…
$ `gols esperados (xg)_time_visitante` <chr> "1.56", "3.73", "…
$ `posse de bola_time_da_casa` <chr> "31%", "25%", "66…
$ `posse de bola_time_visitante` <chr> "69%", "75%", "34…
$ `total de finalizações_time_da_casa` <chr> "9", "7", "14", "…
$ `total de finalizações_time_visitante` <chr> "13", "36", "18",…
$ `finalizações no alvo_time_da_casa` <chr> "3", "2", "4", "4…
$ `finalizações no alvo_time_visitante` <chr> "4", "13", "4", "…
$ `chances claras_time_da_casa` <chr> "2", "1", "4", "1…
$ `chances claras_time_visitante` <chr> "1", "6", "4", "4…
$ escanteios_time_da_casa <chr> "3", "4", "10", "…
$ escanteios_time_visitante <chr> "5", "15", "3", "…
$ passes_time_da_casa <chr> "71%", "69%", "91…
$ passes_time_visitante <chr> "89%", "90%", "84…
$ `cartões amarelos_time_da_casa` <chr> "4", "5", "2", "2…
$ `cartões amarelos_time_visitante` <chr> "3", "3", "2", "3…
$ `xg das finalizações no alvo (xgot)_time_da_casa` <chr> "1.89", "0.57", "…
$ `xg das finalizações no alvo (xgot)_time_visitante` <chr> "1.29", "4.27", "…
$ `finalizações para fora_time_da_casa` <chr> "4", "2", "7", "8…
$ `finalizações para fora_time_visitante` <chr> "5", "14", "10", …
$ `finalizações bloqueadas_time_da_casa` <chr> "2", "3", "3", "3…
$ `finalizações bloqueadas_time_visitante` <chr> "4", "9", "4", "5…
$ `finalizações de dentro da área_time_da_casa` <chr> "5", "5", "12", "…
$ `finalizações de dentro da área_time_visitante` <chr> "9", "21", "13", …
$ `finalizações de fora da área_time_da_casa` <chr> "4", "2", "2", "8…
$ `finalizações de fora da área_time_visitante` <chr> "4", "15", "5", "…
$ `bolas na trave_time_da_casa` <chr> "0", "0", "1", "1…
$ `bolas na trave_time_visitante` <chr> "0", "1", "1", "0…
$ `toques dentro da área adversária_time_da_casa` <chr> "10", "7", "34", …
$ `toques dentro da área adversária_time_visitante` <chr> "28", "49", "27",…
$ `passes em profundidade certos_time_da_casa` <chr> "1", "0", "2", "0…
$ `passes em profundidade certos_time_visitante` <chr> "0", "1", "0", "0…
$ impedimentos_time_da_casa <chr> "2", "0", "1", "1…
$ impedimentos_time_visitante <chr> "4", "1", "1", "1…
$ `faltas cobradas_time_da_casa` <chr> "12", "5", "12", …
$ `faltas cobradas_time_visitante` <chr> "14", "5", "14", …
$ `passes longos_time_da_casa` <chr> "37%", "23%", "65…
$ `passes longos_time_visitante` <chr> "52%", "54%", "66…
$ `passes no terço final_time_da_casa` <chr> "59%", "44%", "84…
$ `passes no terço final_time_visitante` <chr> "79%", "89%", "77…
$ cruzamentos_time_da_casa <chr> "20%", "14%", "16…
$ cruzamentos_time_visitante <chr> "30%", "29%", "43…
$ `assistências esperadas (xa)_time_da_casa` <chr> "0.41", "0.18", "…
$ `assistências esperadas (xa)_time_visitante` <chr> "0.96", "3.97", "…
$ `laterais cobrados_time_da_casa` <chr> "19", "7", "15", …
$ `laterais cobrados_time_visitante` <chr> "21", "23", "15",…
$ faltas_time_da_casa <chr> "14", "5", "14", …
$ faltas_time_visitante <chr> "12", "5", "12", …
$ desarmes_time_da_casa <chr> "75%", "50%", "60…
$ desarmes_time_visitante <chr> "73%", "50%", "47…
$ `duelos ganhos_time_da_casa` <chr> "49", "32", "39",…
$ `duelos ganhos_time_visitante` <chr> "49", "30", "50",…
$ rebatidas_time_da_casa <chr> "41", "49", "14",…
$ rebatidas_time_visitante <chr> "13", "6", "31", …
$ interceptações_time_da_casa <chr> "5", "8", "4", "8…
$ interceptações_time_visitante <chr> "11", "6", "12", …
$ `erros que resultaram em finalização_time_da_casa` <chr> "1", "1", "1", "1…
$ `erros que resultaram em finalização_time_visitante` <chr> "1", "1", "1", "1…
$ `erros que resultaram em gol_time_da_casa` <chr> "0", "1", "1", "0…
$ `erros que resultaram em gol_time_visitante` <chr> "1", "1", "1", "1…
$ `defesas do goleiro_time_da_casa` <chr> "3", "7", "2", "0…
$ `defesas do goleiro_time_visitante` <chr> "1", "1", "2", "2…
$ `xgot enfrentado_time_da_casa` <chr> "1.29", "4.27", "…
$ `xgot enfrentado_time_visitante` <chr> "1.89", "0.57", "…
$ `gols evitados_time_da_casa` <chr> "0.29", "-0.73", …
$ `gols evitados_time_visitante` <chr> "-0.11", "-0.43",…
$ time <chr> "Flamengo", "Flam…
$ `cartões vermelhos_time_da_casa` <chr> NA, "2", NA, "0",…
$ `cartões vermelhos_time_visitante` <chr> NA, "0", NA, "1",…
$ `gols de cabeça_time_da_casa` <chr> NA, NA, NA, NA, N…
$ `gols de cabeça_time_visitante` <chr> NA, NA, NA, NA, N…
$ sem_estatisticas <lgl> NA, NA, NA, NA, N…
dados <- dados_brutos %>%
# Remove linhas onde não há estatísticas
filter(is.na(sem_estatisticas) | sem_estatisticas == FALSE) %>%
select(-sem_estatisticas) %>%
# Converte % para decimal
mutate(across(c(posse_de_bola_time_da_casa, posse_de_bola_time_visitante,
starts_with("passes_"), starts_with("cruzamentos_"),
starts_with("faltas_"), starts_with("duelos_")),
~ as.numeric(str_remove(., "%")) / 100),
# Converte datas
data_hora = dmy_hm(data_hora))dados <- dados %>%
mutate(
gols_time_da_casa = as.numeric(gols_time_da_casa),
gols_time_visitante = as.numeric(gols_time_visitante),
gols_esperados_xg_time_da_casa = as.numeric(gols_esperados_xg_time_da_casa),
gols_esperados_xg_time_visitante = as.numeric(gols_esperados_xg_time_visitante),
total_de_finalizacoes_time_da_casa = as.numeric(total_de_finalizacoes_time_da_casa),
total_de_finalizacoes_time_visitante = as.numeric(total_de_finalizacoes_time_visitante),
escanteios_time_da_casa = as.numeric(escanteios_time_da_casa),
escanteios_time_visitante = as.numeric(escanteios_time_visitante)
)
dados <- dados %>%
mutate(
resultado = case_when(
gols_time_da_casa > gols_time_visitante ~ "Vitória Casa",
gols_time_da_casa < gols_time_visitante ~ "Vitória Visitante",
TRUE ~ "Empate"
),
diff_gols = gols_time_da_casa - gols_time_visitante,
diff_xg = gols_esperados_xg_time_da_casa - gols_esperados_xg_time_visitante,
efic_ofensiva_casa = gols_time_da_casa / gols_esperados_xg_time_da_casa,
efic_ofensiva_visitante = gols_time_visitante / gols_esperados_xg_time_visitante,
gols_acima_xg_casa = gols_time_da_casa - gols_esperados_xg_time_da_casa,
gols_acima_xg_visitante = gols_time_visitante - gols_esperados_xg_time_visitante,
total_finalizacoes =
total_de_finalizacoes_time_da_casa +
total_de_finalizacoes_time_visitante,
total_escanteios =
escanteios_time_da_casa +
escanteios_time_visitante
) %>%
mutate(across(starts_with("efic_ofensiva"),
~ if_else(is.infinite(.), NA_real_, .)))Rows: 2,087
Columns: 86
$ url_jogo <chr> "https://www.flashs…
$ time_da_casa <chr> "Fluminense", "Spor…
$ time_visitante <chr> "Flamengo", "Flamen…
$ data_hora <dttm> 2025-11-19 21:30:0…
$ gols_time_da_casa <dbl> 2, 1, 3, 2, 3, 0, 1…
$ gols_time_visitante <dbl> 1, 5, 2, 2, 0, 0, 0…
$ gols_esperados_xg_time_da_casa <dbl> 1.75, 0.41, 2.60, 0…
$ gols_esperados_xg_time_visitante <dbl> 1.56, 3.73, 2.49, 1…
$ posse_de_bola_time_da_casa <dbl> 0.31, 0.25, 0.66, 0…
$ posse_de_bola_time_visitante <dbl> 0.69, 0.75, 0.34, 0…
$ total_de_finalizacoes_time_da_casa <dbl> 9, 7, 14, 15, 25, 2…
$ total_de_finalizacoes_time_visitante <dbl> 13, 36, 18, 15, 4, …
$ finalizacoes_no_alvo_time_da_casa <chr> "3", "2", "4", "4",…
$ finalizacoes_no_alvo_time_visitante <chr> "4", "13", "4", "2"…
$ chances_claras_time_da_casa <chr> "2", "1", "4", "1",…
$ chances_claras_time_visitante <chr> "1", "6", "4", "4",…
$ escanteios_time_da_casa <dbl> 3, 4, 10, 3, 9, 13,…
$ escanteios_time_visitante <dbl> 5, 15, 3, 5, 8, 0, …
$ passes_time_da_casa <dbl> 0.71, 0.69, 0.91, 0…
$ passes_time_visitante <dbl> 0.89, 0.90, 0.84, 0…
$ cartoes_amarelos_time_da_casa <chr> "4", "5", "2", "2",…
$ cartoes_amarelos_time_visitante <chr> "3", "3", "2", "3",…
$ xg_das_finalizacoes_no_alvo_xgot_time_da_casa <chr> "1.89", "0.57", "1.…
$ xg_das_finalizacoes_no_alvo_xgot_time_visitante <chr> "1.29", "4.27", "2.…
$ finalizacoes_para_fora_time_da_casa <chr> "4", "2", "7", "8",…
$ finalizacoes_para_fora_time_visitante <chr> "5", "14", "10", "8…
$ finalizacoes_bloqueadas_time_da_casa <chr> "2", "3", "3", "3",…
$ finalizacoes_bloqueadas_time_visitante <chr> "4", "9", "4", "5",…
$ finalizacoes_de_dentro_da_area_time_da_casa <chr> "5", "5", "12", "7"…
$ finalizacoes_de_dentro_da_area_time_visitante <chr> "9", "21", "13", "1…
$ finalizacoes_de_fora_da_area_time_da_casa <chr> "4", "2", "2", "8",…
$ finalizacoes_de_fora_da_area_time_visitante <chr> "4", "15", "5", "2"…
$ bolas_na_trave_time_da_casa <chr> "0", "0", "1", "1",…
$ bolas_na_trave_time_visitante <chr> "0", "1", "1", "0",…
$ toques_dentro_da_area_adversaria_time_da_casa <chr> "10", "7", "34", "1…
$ toques_dentro_da_area_adversaria_time_visitante <chr> "28", "49", "27", "…
$ passes_em_profundidade_certos_time_da_casa <dbl> 0.01, 0.00, 0.02, 0…
$ passes_em_profundidade_certos_time_visitante <dbl> 0.00, 0.01, 0.00, 0…
$ impedimentos_time_da_casa <chr> "2", "0", "1", "1",…
$ impedimentos_time_visitante <chr> "4", "1", "1", "1",…
$ faltas_cobradas_time_da_casa <dbl> 0.12, 0.05, 0.12, 0…
$ faltas_cobradas_time_visitante <dbl> 0.14, 0.05, 0.14, 0…
$ passes_longos_time_da_casa <dbl> 0.37, 0.23, 0.65, 0…
$ passes_longos_time_visitante <dbl> 0.52, 0.54, 0.66, 0…
$ passes_no_terco_final_time_da_casa <dbl> 0.59, 0.44, 0.84, 0…
$ passes_no_terco_final_time_visitante <dbl> 0.79, 0.89, 0.77, 0…
$ cruzamentos_time_da_casa <dbl> 0.20, 0.14, 0.16, 0…
$ cruzamentos_time_visitante <dbl> 0.30, 0.29, 0.43, 0…
$ assistencias_esperadas_xa_time_da_casa <chr> "0.41", "0.18", "1.…
$ assistencias_esperadas_xa_time_visitante <chr> "0.96", "3.97", "1.…
$ laterais_cobrados_time_da_casa <chr> "19", "7", "15", "1…
$ laterais_cobrados_time_visitante <chr> "21", "23", "15", "…
$ faltas_time_da_casa <dbl> 0.14, 0.05, 0.14, 0…
$ faltas_time_visitante <dbl> 0.12, 0.05, 0.12, 0…
$ desarmes_time_da_casa <chr> "75%", "50%", "60%"…
$ desarmes_time_visitante <chr> "73%", "50%", "47%"…
$ duelos_ganhos_time_da_casa <dbl> 0.49, 0.32, 0.39, 0…
$ duelos_ganhos_time_visitante <dbl> 0.49, 0.30, 0.50, 0…
$ rebatidas_time_da_casa <chr> "41", "49", "14", "…
$ rebatidas_time_visitante <chr> "13", "6", "31", "1…
$ interceptacoes_time_da_casa <chr> "5", "8", "4", "8",…
$ interceptacoes_time_visitante <chr> "11", "6", "12", "4…
$ erros_que_resultaram_em_finalizacao_time_da_casa <chr> "1", "1", "1", "1",…
$ erros_que_resultaram_em_finalizacao_time_visitante <chr> "1", "1", "1", "1",…
$ erros_que_resultaram_em_gol_time_da_casa <chr> "0", "1", "1", "0",…
$ erros_que_resultaram_em_gol_time_visitante <chr> "1", "1", "1", "1",…
$ defesas_do_goleiro_time_da_casa <chr> "3", "7", "2", "0",…
$ defesas_do_goleiro_time_visitante <chr> "1", "1", "2", "2",…
$ xgot_enfrentado_time_da_casa <chr> "1.29", "4.27", "2.…
$ xgot_enfrentado_time_visitante <chr> "1.89", "0.57", "1.…
$ gols_evitados_time_da_casa <chr> "0.29", "-0.73", "0…
$ gols_evitados_time_visitante <chr> "-0.11", "-0.43", "…
$ time <chr> "Flamengo", "Flamen…
$ cartoes_vermelhos_time_da_casa <chr> NA, "2", NA, "0", "…
$ cartoes_vermelhos_time_visitante <chr> NA, "0", NA, "1", "…
$ gols_de_cabeca_time_da_casa <chr> NA, NA, NA, NA, NA,…
$ gols_de_cabeca_time_visitante <chr> NA, NA, NA, NA, NA,…
$ resultado <chr> "Vitória Casa", "Vi…
$ diff_gols <dbl> 1, -4, 1, 0, 3, 0, …
$ diff_xg <dbl> 0.19, -3.32, 0.11, …
$ efic_ofensiva_casa <dbl> 1.1428571, 2.439024…
$ efic_ofensiva_visitante <dbl> 0.6410256, 1.340482…
$ gols_acima_xg_casa <dbl> 0.25, 0.59, 0.40, 1…
$ gols_acima_xg_visitante <dbl> -0.56, 1.27, -0.49,…
$ total_finalizacoes <dbl> 22, 43, 32, 30, 29,…
$ total_escanteios <dbl> 8, 19, 13, 8, 17, 1…
variavel
gols_time_da_casa gols_time_da_casa
gols_time_visitante gols_time_visitante
gols_acima_xg_casa gols_acima_xg_casa
xg_das_finalizacoes_no_alvo_xgot_time_da_casa xg_das_finalizacoes_no_alvo_xgot_time_da_casa
xgot_enfrentado_time_visitante xgot_enfrentado_time_visitante
gols_de_cabeca_time_visitante gols_de_cabeca_time_visitante
gols_de_cabeca_time_da_casa gols_de_cabeca_time_da_casa
diff_xg diff_xg
gols_acima_xg_visitante gols_acima_xg_visitante
xg_das_finalizacoes_no_alvo_xgot_time_visitante xg_das_finalizacoes_no_alvo_xgot_time_visitante
xgot_enfrentado_time_da_casa xgot_enfrentado_time_da_casa
chances_claras_time_da_casa chances_claras_time_da_casa
gols_evitados_time_visitante gols_evitados_time_visitante
gols_esperados_xg_time_da_casa gols_esperados_xg_time_da_casa
gols_esperados_xg_time_visitante gols_esperados_xg_time_visitante
gols_evitados_time_da_casa gols_evitados_time_da_casa
efic_ofensiva_visitante efic_ofensiva_visitante
finalizacoes_no_alvo_time_da_casa finalizacoes_no_alvo_time_da_casa
chances_claras_time_visitante chances_claras_time_visitante
finalizacoes_no_alvo_time_visitante finalizacoes_no_alvo_time_visitante
correlacao abs_corr
gols_time_da_casa 0.7568492 0.7568492
gols_time_visitante -0.6673231 0.6673231
gols_acima_xg_casa 0.5818581 0.5818581
xg_das_finalizacoes_no_alvo_xgot_time_da_casa 0.5312770 0.5312770
xgot_enfrentado_time_visitante 0.5312770 0.5312770
gols_de_cabeca_time_visitante -0.5159430 0.5159430
gols_de_cabeca_time_da_casa 0.5136641 0.5136641
diff_xg 0.5120454 0.5120454
gols_acima_xg_visitante -0.4974238 0.4974238
xg_das_finalizacoes_no_alvo_xgot_time_visitante -0.4853628 0.4853628
xgot_enfrentado_time_da_casa -0.4852450 0.4852450
chances_claras_time_da_casa 0.4533860 0.4533860
gols_evitados_time_visitante -0.4170440 0.4170440
gols_esperados_xg_time_da_casa 0.3779838 0.3779838
gols_esperados_xg_time_visitante -0.3743246 0.3743246
gols_evitados_time_da_casa 0.3675716 0.3675716
efic_ofensiva_visitante -0.3638994 0.3638994
finalizacoes_no_alvo_time_da_casa 0.3472388 0.3472388
chances_claras_time_visitante -0.3468077 0.3468077
finalizacoes_no_alvo_time_visitante -0.3347685 0.3347685
A análise realizada permitiu observar algumas tendências importantes, mas também evidenciou limitações relevantes dos dados utilizados. Muitos jogos brasileiros — especialmente envolvendo equipes de menor expressão, que careciam de estatísticas completas — acabaram afetando a robustez dos modelos e restringindo a profundidade das conclusões em determinadas métricas.
Outro ponto interessante foi perceber que alguns parâmetros que, à primeira vista, pareciam ter forte relação com o saldo de gols, como posse de bola, não se mostraram tão determinantes assim. Esse resultado reforça a ideia de que o desempenho no futebol é multifatorial, envolvendo aspectos que estatísticas tradicionais não capturam totalmente.
Por outro lado, um padrão ficou muito evidente: a maioria dos times apresenta melhor desempenho quando joga em casa. O fator mandante apareceu com consistência, indicando que elementos como familiaridade com o gramado, apoio da torcida e redução de desgaste logístico exercem influência significativa nos resultados.
Em suma, embora a análise tenha proporcionado insights relevantes, ela também aponta possíveis melhorias futuras, como o uso de bases de dados mais completas, ampliação do volume de partidas analisadas e exploração de novos indicadores capazes de captar nuances táticas e contextuais das disputas.