O que é xG?

Breve explicação sobre o uso do xG no futebol, com exemplos.
métricas
Autor

William Amorim

Data de Publicação

16 de outubro de 2026

A métrica xG fornece a probabilidade de uma finalização resultar em gol.

Essa probabilidade é calculada com base em diversas características da finalização, como a posição da bola no campo, o ângulo do chute, o número de adversários próximos, o tipo de assistência recebida, a parte do corpo utilizada para finalizar, entre outras.

Ela não leva em conta quem finalizou.

O termo vem de “expected goals”, que em português significa “gols esperados”. Se somarmos o xG de todas as finalizações de um time em uma partida, teremos uma estimativa de quantos gols esse time deveria ter marcado.

Se um time obteve um xG total de 1,5 em uma partida, não sabemos dizer se ele finalizou algumas chances claras ou se finalizou diversas chances de baixa qualidade.

Uma medida bastante utilizada para avaliar a qualidade das chances é o xG da partida dividido pelo número de finalizações. Isso nos dá uma ideia do quão boas foram, em média, as chances criadas por um time.

Vamos ver um exemplo utilizando a Copa do Mundo masculina de 2022. O código abaixo obtém os dados de eventos do StatsBomb.

library(kickoff)
library(dplyr)

# Get SB open competitions
sb_competitions <- kickoff::sb_open_competitions()

# Get 2022 World Cup
wc_2022 <- sb_competitions |>
  filter(
    competition_name == "FIFA World Cup",
    competition_gender == "male",
    season_name == 2022
  )

# Get 2022 World Cup matches
wc_2022_matches <- kickoff::sb_open_matches(wc_2022)

# Get 2022 World Cup events
wc_2022_events <- kickoff::sb_open_events(wc_2022_matches)

O StatsBomb possui um modelo de xG. Podemos acessar o xG de cada finalização pela coluna shot.statsbomb_xg.

final_match <- wc_2022_matches |>
  filter(competition_stage.name == "Final")

final_match_xg <- wc_2022_events |>
  filter(match_id == final_match$match_id) |>
  # Remove penalty shootouts
  filter(period %in% 1:4) |>
  group_by(team.name) |>
  summarise(match_xg = sum(shot.statsbomb_xg, na.rm = TRUE))

Na final, a Argentina obteve um xG total de 2,76, enquanto o da França foi de 2,27. Veja que consideramos apenas o tempo normal e a prorrogação, excluindo a disputa de pênaltis.

Ambas as seleções fizeram mais gols do que o esperado pelo xG (a partida foi 3x3).

Isso não é por acaso!

Como o xG de uma finalização é uma probabilidade calculada a partir de uma média histórica de finalizações parecidas, é esperado que bons times tenham desempenho acima do xG.

O gráfico abaixo mostra o xG de cada seleção em todo o torneio versus o número de gols marcados (excluindo gols contra). Times em verde, acima da linha tracejada, marcaram mais gols do que o esperado pelo xG, enquanto times em vermelho marcaram menos.

library(ggplot2)

wc_2022_goals_vs_xg <- wc_2022_events |>
  filter(period %in% 1:4) |>
  group_by(team.name) |>
  summarise(
    total_xg = sum(shot.statsbomb_xg, na.rm = TRUE),
    goals = sum(shot.outcome.name == "Goal", na.rm = TRUE)
  ) |> 
  arrange(desc(goals))

wc_2022_goals_vs_xg |> 
  mutate(
    fill = ifelse(goals > total_xg, "lightgreen", "lightcoral")
  ) |>
  ggplot(aes(x = total_xg, y = goals, label = team.name, fill = I(fill))) +
  ggrepel::geom_label_repel(max.overlaps = 30) +
  geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "red") +
  labs(
    title = "Goals vs Expected Goals (xG) - 2022 World Cup",
    x = "Total xG",
    y = "Goals"
   ) +
  theme_minimal()