Introdução

Este post apresenta uma análise exploratória dos dados da fase de grupos da Copa do Mundo FIFA 2026, com foco nas pontuações ELO de cada seleção participante.

O ranking ELO é um sistema de classificação adaptado do xadrez para o futebol, que estima a força relativa de cada seleção com base no histórico de resultados ponderado por adversário, local do jogo e importância da partida. Quanto maior o ELO, mais forte é considerada a seleção.

A Copa do Mundo 2026 é disputada por 48 seleções divididas em 12 grupos (A a L), com 4 times por grupo, totalizando 72 partidas na fase de grupos.

Carregamento de Pacotes e Dados

Carregamos os pacotes necessários para a análise e importamos os dados diretamente do arquivo Excel.

library(tidyverse)
theme_set(theme_bw())
library(readxl)
library(janitor)

A função clean_names() do pacote janitor padroniza os nomes das colunas para o formato snake_case, removendo acentos, espaços e caracteres especiais, o que facilita a manipulação posterior.

fifa <- 
  read_excel(path = "dados/Copa_Mundo_2026_Fase_Grupos_ELO.xlsx", sheet = "Sheet1") |> 
  clean_names()

glimpse(fifa)
## Rows: 96
## Columns: 7
## $ partida    <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, …
## $ data       <dttm> 2026-06-11, 2026-06-12, 2026-06-12, 2026-06-13, 2026-06-13…
## $ grupo      <chr> "A", "A", "B", "D", "B", "C", "C", "D", "E", "F", "E", "F",…
## $ time_1     <chr> "México", "Coreia do Sul", "Canadá", "EUA", "Catar", "Brasi…
## $ elo_time_1 <dbl> 1687, 1592, 1559, 1671, 1450, 1766, 1293, 1579, 1736, 1754,…
## $ time_2     <chr> "África do Sul", "República Tcheca", "Bósnia e Herzegovina"…
## $ elo_time_2 <dbl> 1428, 1506, 1387, 1505, 1650, 1755, 1503, 1606, 1295, 1662,…

Criação da Variável rodada

As partidas da fase de grupos ocorrem em três rodadas principais (mais uma rodada especial de confrontos simultâneos na última rodada de cada grupo). Criamos a variável rodada com base nas datas das partidas:

  • Rodada 0: Ranking ELO antes da Copa
  • Rodada 1: 11 a 17 de junho (1ª rodada)
  • Rodada 2: 18 a 23 de junho (2ª rodada)
  • Rodada 3: 24 a 27 de junho (3ª rodada)
fifa <- 
  fifa |> 
  mutate(
    data   = ymd(data),
    rodada = case_when(
      data >= "2026-06-11" & data <= "2026-06-17" ~ 0,
      data >= "2026-06-18" & data <= "2026-06-23" ~ 1,
      data >= "2026-06-24" & data <= "2026-06-27" ~ 2,
      data == "2026-06-28"                         ~ 3
    )
  )

Verificamos a distribuição das partidas por rodada:

fifa |> 
  group_by(rodada) |> 
  count() |> 
  kable(
    col.names = c("Rodada", "Nº de Partidas"),
    caption   = "Distribuição de partidas por rodada"
  )
Table 1: Distribuição de partidas por rodada
RodadaNº de Partidas
024
124
224
324

Transformação para Formato Longo

Para facilitar análises centradas nos times e não nas partidas, transformamos o dataset do formato largo para o formato longo. Cada linha passa a representar um time em uma partida.

fifa_longo <- 
  fifa |> 
  pivot_longer(
    cols         = c(time_1, elo_time_1, time_2, elo_time_2),
    names_to     = c(".value", "numero_time"),
    names_pattern = "(time|elo_time)_(.*)"
  ) |> 
  rename(elo = elo_time) |> 
  select(rodada, partida, data, grupo, time, elo)

glimpse(fifa_longo)
## Rows: 192
## Columns: 6
## $ rodada  <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ partida <dbl> 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, …
## $ data    <date> 2026-06-11, 2026-06-11, 2026-06-12, 2026-06-12, 2026-06-12, 2…
## $ grupo   <chr> "A", "A", "A", "A", "B", "B", "D", "D", "B", "B", "C", "C", "C…
## $ time    <chr> "México", "África do Sul", "Coreia do Sul", "República Tcheca"…
## $ elo     <dbl> 1687, 1428, 1592, 1506, 1559, 1387, 1671, 1505, 1450, 1650, 17…

Análise Descritiva do ELO por Grupo

Grupos com maior variabilidade (Rodada 1)

Grupos com alto desvio-padrão do ELO possuem times muito desiguais - o favorito é mais previsível. Grupos com baixo desvio-padrão são mais equilibrados e tendem a produzir mais surpresas.

fifa_longo |> 
  filter(rodada == 1) |> 
  group_by(grupo) |> 
  summarise(
    media = mean(elo),
    sd    = sd(elo)
  ) |> 
  arrange(desc(sd)) |> 
  kable(
    digits     = 1,
    col.names  = c("Grupo", "ELO Médio", "Desvio-Padrão ELO"),
    caption    = "Variabilidade do ELO por grupo - Rodada 1"
  )
Table 2: Variabilidade do ELO por grupo - Rodada 1
GrupoELO MédioDesvio-Padrão ELO
C1579.5231.0
H1585.8215.9
J1608.2213.8
L1607.2206.0
I1639.8192.5
E1542.8189.2
G1549.8187.0
K1599.8156.9
F1600.2132.5
A1553.0128.6
B1511.8107.6
D1590.582.8

O Grupo H é o mais desequilibrado da rodada 1. Vemos abaixo quais times o compõem:

fifa_longo |> 
  filter(grupo == "H") |> 
  select(time) |> 
  distinct() |> 
  kable(col.names = "Times do Grupo H")
Times do Grupo H
Espanha
Cabo Verde
Arábia Saudita
Uruguai

Já o Grupo D, que apresentou menor desvio-padrão, é mais equilibrado:

fifa_longo |> 
  filter(grupo == "D") |> 
  select(time) |> 
  distinct() |> 
  kable(col.names = "Times do Grupo D")
Times do Grupo D
EUA
Paraguai
Austrália
Turquia

Grupos com maior variabilidade (Rodada 3 - última rodada simultânea)

fifa_longo |> 
  filter(rodada == 3) |> 
  group_by(grupo) |> 
  summarise(
    media = mean(elo),
    sd    = sd(elo)
  ) |> 
  arrange(desc(sd)) |> 
  kable(
    digits     = 1,
    col.names  = c("Grupo", "ELO Médio", "Desvio-Padrão ELO"),
    caption    = "Variabilidade do ELO por grupo - Rodada 3"
  )
Table 3: Variabilidade do ELO por grupo - Rodada 3
GrupoELO MédioDesvio-Padrão ELO
C1579.2250.1
J1608.5224.4
H1586.0222.1
L1607.0210.4
I1639.5207.6
G1550.0197.9
E1542.5184.9
K1599.8171.6
F1600.8154.8
A1553.2130.8
B1511.8128.1
D1590.564.4
fifa_longo |> 
  filter(grupo == "C") |> 
  select(time) |> 
  distinct() |> 
  kable(col.names = "Times do Grupo C")
Times do Grupo C
Brasil
Marrocos
Haiti
Escócia

Visualização: Evolução do ELO ao Longo das Rodadas

O gráfico abaixo mostra a trajetória do ELO de cada seleção ao longo das rodadas da fase de grupos, separado por grupo. Cada linha representa um time.

fifa_longo |> 
  ggplot(aes(x = (rodada - 1), y = elo, group = time)) + 
  geom_line(alpha = 0.8) +
  geom_point(size = 1.5, alpha = 0.6) +
  facet_wrap(~ grupo, nrow = 4) + 
  labs(
    title   = "Evolução do ELO por Grupo - Copa do Mundo 2026",
    subtitle = "Cada linha representa uma seleção participante",
    x       = "Rodada",
    y       = "Ranking ELO"
  ) + 
  scale_x_continuous(breaks = 0:3, labels = 0:3, minor_breaks = NULL) + 
  scale_y_continuous(minor_breaks = NULL)

Variação do ELO: Antes e Depois da Fase de Grupos

Times com maior ganho de ELO (entre rodadas 0 e 3)

Identificamos as seleções que mais subiram no ranking ELO entre o início e o fim da fase de grupos, indicando desempenho acima do esperado.

fifa_longo |> 
  filter(rodada %in% c(0, 3)) |> 
  pivot_wider(
    id_cols     = c(time, grupo), 
    names_from  = rodada, 
    values_from = elo,
    names_prefix = "elo_rodada_"
  ) |> 
  mutate(diferenca_elo = elo_rodada_3 - elo_rodada_0) |> 
  arrange(desc(diferenca_elo)) |> 
  head(10) |> 
  kable(
    digits     = 1,
    col.names  = c("Time", "Grupo", "ELO Rodada 0", "ELO Rodada 3", "Variação ELO"),
    caption    = "Top 10 seleções com maior ganho de ELO na fase de grupos"
  )
Table 4: Top 10 seleções com maior ganho de ELO na fase de grupos
TimeGrupoELO Rodada 0ELO Rodada 3Variação ELO
MéxicoA1687173649
GanaL1347138740
NoruegaI1557159437
FrançaI1871190736
Cabo VerdeH1371140332
ColômbiaK1698172729
SuíçaB1650167626
ArgentinaJ1877190225
Costa do MarfimE1541156524
África do SulA1428145123

Times com maior queda de ELO (entre rodadas 1 e 3)

fifa_longo |> 
  filter(rodada %in% c(1, 3)) |> 
  pivot_wider(
    id_cols     = c(time, grupo), 
    names_from  = rodada, 
    values_from = elo,
    names_prefix = "elo_rodada_"
  ) |> 
  mutate(diferenca_elo = elo_rodada_3 - elo_rodada_1) |> 
  arrange(diferenca_elo) |> 
  head(10) |> 
  kable(
    digits     = 1,
    col.names  = c("Time", "Grupo", "ELO Rodada 1", "ELO Rodada 3", "Variação ELO"),
    caption    = "Top 10 seleções com maior queda de ELO entre as rodadas 1 e 3"
  )
Table 5: Top 10 seleções com maior queda de ELO entre as rodadas 1 e 3
TimeGrupoELO Rodada 1ELO Rodada 3Variação ELO
Coreia do SulA16131559-54
CatarB14591411-48
EscóciaC15191491-28
UruguaiH16621635-27
PanamáL15051478-27
TunísiaF14531427-26
AustráliaD16061581-25
IraqueI14271404-23
Nova ZelândiaG12901270-20
AlemanhaE17441726-18

Distribuição do ELO por Grupo

Distribuição na Rodada 1

Cada ponto representa um time dentro do grupo. A dispersão horizontal indica o grau de equilíbrio (ou desequilíbrio) entre as forças dos times.

fifa_longo |> 
  filter(rodada == 1) |> 
  ggplot(aes(x = elo, y = 0)) + 
  geom_point(size = 3, alpha = 0.8) + 
  facet_wrap(~ grupo, nrow = 4) + 
  scale_y_continuous(breaks = NULL) + 
  scale_x_continuous(breaks = NULL) + 
  labs(
    title    = "Distribuição do ELO por Grupo - Rodada 1",
    subtitle = "Cada ponto é uma seleção",
    x        = "ELO",
    y        = ""
  )

Distribuição na Rodada 3

fifa_longo |> 
  filter(rodada == 3) |> 
  ggplot(aes(x = elo, y = 0)) + 
  geom_point(size = 3, alpha = 0.8) + 
  facet_wrap(~ grupo, nrow = 4) + 
  scale_y_continuous(breaks = NULL) + 
  scale_x_continuous(breaks = NULL) + 
  labs(
    title    = "Distribuição do ELO por Grupo - Rodada 3",
    subtitle = "Cada ponto é uma seleção",
    x        = "ELO",
    y        = ""
  )

Conclusão

Esta análise explorou os dados da fase de grupos da Copa do Mundo 2026 sob a ótica do ranking ELO. Os principais achados foram:

  • A Copa 2026, com 12 grupos e 48 seleções, apresenta grande variabilidade no nível competitivo, com grupos muito desequilibrados (como o H) e outros bastante nivelados.
  • A variação do ELO entre o início e o fim da fase de grupos permite identificar as seleções que superaram ou frustraram as expectativas.
  • Há amplo espaço para análises de calibração do modelo ELO, investigação de zebras e comparação entre diferentes estratégias de previsão.