Explicador do Modelo da 1ª Divisão

modelo epoca modelos
Hóquei Analítico
2019-12-07

Este post explica como funciona o modelo de simulação da época da 1ª divisão. No 1º post que fiz com as previsões do modelo, expliquei a base da versão inicial. Desde aí, foram feitas várias alterações, pelo que decidi juntar tudo sobre o funcionamento do mesmo nesta página, que irá sendo actualizada sempre que possível.

Objectivo

A principal vantagem de utilizar um modelo como este ao longo de uma época é, para mim, a oportunidade de obter uma tabela classificativa mais realista e capaz de nos informar sobre o impacto de cada jogo para a classificação final. Em várias alturas da época vemos umas equipas à frente das outras, mas a tabela normal não nos permite avaliar diversos factores, como:

A cada momento da época, o modelo utiliza os resultados reais e simula os jogos que faltam para apresentar a classificação esperada. Tem estes factores em conta e permite-nos saber se a equipa que vai à frente tem uma situação confortável (parece ser mais forte e só tem adversários acessíveis pelo caminho) ou pelo contrário (parece-nos ser inferior e ainda lhe faltam os jogos difíceis). Permite-nos também converter uma vantagem de pontos em algo mais concreto. Por exemplo, se uma equipa lidera o campeonato com 3 pontos de avanço sobre outra, quão mais provável é que seja campeã?

Sistema Elo

A base do modelo é o sistema de rating Elo, criado para o xadrez, mas já aplicado em muitos outros desportos. Com este sistema, cada equipa tem um rating e é possível calcular a probabilidade do resultado num confronto entre duas equipas. Após o jogo, o rating de cada um dos participantes é actualizado de acordo com o resultado final.

Assim, para prever o resultado de cada jogo, o primeiro passo é saber o rating de cada uma das equipas participantes. Suponhamos que haverá um jogo em terreno neutro entre o OC Barcelos e HC Braga. O rating do OC Barcelos é 500 e do HAC Braga é 250 (estes números não representam nenhuma quantidade específica). O sistema Elo utiliza a seguinte fórmula para prever o resultado do jogo: \(E_{OCB} = \frac{1}{1+10^{(R_{HCB}-R_{OCB})/400}}\). Neste contexto, uma vitória vale 1 ponto; um empate 0.5 e uma derrota 0 pontos. Com os ratings mencionados de cada equipa, o resultado da fórmula é 80.8%. Isto significa que o OC Barcelos, com este rating, ganharia essa percentagem de pontos em confrontos com equipas de nível semelhante.

Imaginemos que o jogo se realiza e o OC Barcelos venceu. O sistema toma em conta os resultados para actualizar a sua avaliação de cada equipa. A fórmula é \(R_{novo} = R_{velho} + K(\text{Resultado} - E_{OCB})\). O valor da variável \(K\) varia de desporto para desporto. Quanto mais alto o valor de \(K\), mais rapidamente o rating se actualiza com novos resultados; quanto mais baixo, mais peso terão resultados antigos. O valor do \(K\) representa assim o quanto devemos confiar num resultado. Em desportos com alguma aleatoriedade (como o futebol), não nos devemos guiar tanto pelo resultado apenas de um jogo. No entanto, no hóquei em patins e numa primeira análise, parecem-me menos frequentes os casos em que equipas inferiores vencem equipas superiores, pelo que o valor será relativamente mais alto. Imaginando que o valor usado é \(K=50\), o cálculo seria: \(R_{OCB~novo}=\) 500 \(+ 50(1 -\) 0.81 \()=\) 509.6. Para o Braga, aplicando a mesma fórmula, o rating desceria para \(R_{HCB~novo}=\) 250 \(+ 50(0 -\) 0.81 \()=\) 240.4. Repare que os pontos ganhos por uma equipa são os pontos perdidos pela outra e neste caso são aproximadamente 10.

Uma característica interessante do sistema Elo é que quando os resultados são mais surpreendentes, os ratings variam mais. Imaginemos que o Braga tinha ganho este jogo. Nesse caso, as equipas trocariam 38 pontos, o que reflecte a maior surpresa do resultado. Neste contexto, uma vitória do HCB seria um feito maior que do OC Barcelos e portanto o rating das equipas sofre uma variação maior com a nova informação. Mesmo um empate seria um resultado desfavorável ao OC Barcelos e o seu rating desceria para 485.

Vantagem caseira

A explicação anterior assumiu que o jogo seria em campo neutro. Para os jogos do campeonato, onde isso não acontece, faço um ajuste para cima ao rating da equipa da casa para ter em conta o factor casa. É como se a equipa ao jogar em casa fosse ligeiramente melhor do que jogando fora. Assim, isto permite ou tornar favorita uma equipa que recebe outra de nível igual; ou igualar um visitante ligeiramente superior.

Empates

Um dos problemas do sistema Elo, que não tem grande importância no xadrez, mas tem em desportos com a pontuação como a do hóquei em patins, é que ele não dá a probabilidade de resultados específicos (vitórias, empates, e derrotas). A fórmula apresentada acima (\(E_{OCB} = \frac{1}{1+10^{(R_{HCB}-R_{OCB})/400}}\)) apenas indica quantos podes pode o OC Barcelos esperar conquistar num sistema em que uma vitória vale 1 ponto, um empate vale 0.5 e uma derrota vale 0. No entanto, no hóquei em patins uma vitória vale mais do que o dobro de um empate. Assim, é preciso decompor dos pontos esperados do Elo qual é a parte correspondente a vitórias e a parte correspondente a empates.

Para o fazer, utilizo dados históricos (ver essa secção) e um método estatístico chamado regressão logística que é apropriado para analisar que factores explicam eventos binários, isto é, que ou acontecem ou não acontecem (por oposição a acontecerem um bocadinho). Assim, a variável dependente toma o valor 1 quando um jogo terminou empatado e 0 quando não terminou empatado. Depois, utilizo algumas variáveis que podem ajudar a explicar quando há empate: 1) a diferença do rating de Elo entre duas equipas (quanto mais próximas são, mais provável é um empate); 2) o nível máximo de rating entre as duas (para a mesma diferença de rating, quanto melhores são as equipas, mais provável é que empatem); 3) se a equipa mais forte é a que joga em casa (se a equipa mais forte for a visitante, é mais provável que aconteça um empate). Estimando o impacto de cada um desses factores nos jogos passados, é possível ter uma previsão da probabilidade de ocorrer um empate num jogo futuro.

Vamos supor que o resultado desta regressão, aplicado aos ratings do exemplo anterior, dita uma probabilidade de empate de 10%. Sabendo isso, e que o valor esperado do jogo de acordo com o rating Elo é 80.8%, podemos agora calcular o valor específico de ter uma vitória, um empate, ou uma derrota. A probabilidade de empate é 10%. A previsão do Elo de \(E_{OCB} =\) 80.8% tem de ser igual a \(1 * P_{Vit.~OCB} + 0.5 * P_{empate}\). Reordenando os termos da fórmula: \(P_{Vit.~OCB} = E_{OCB} - 0.5 * P_{empate} =\) 75.8%. A probabilidade de derrota do OCB é então o que resta até aos 100%: 14.2%.

Simulações

Tendo um modelo para prever os resultados específicos de cada jogo, entre vitórias, empates, e derrotas, é possível simular o que acontece ao longo de uma época. Para o fazer, simulo um número grande de épocas (actualmente, 25000) em que, de acordo com as probabilidades de resultado de cada jogo, vai sendo sorteado o que acontece. Estas simulações são feitas “quentes”, isto é, o rating Elo dentro de cada época simulada vai-se adaptando com os resultados fictícios, como acontecerá na vida real.1 Isto permite captar melhor a incerteza sobre como pode correr a época, dado que o rating de cada equipa não está já pré-definido no início da simulação. Para além disso, torna a simulação mais realista: na vida real, o rating Elo vai sendo actualizado com os resultados, pelo que deve ser actualizado na própria simulação.

Após simular um número grande de épocas, resta apenas contar os resultados. Para saber a probabilidade de uma certa equipa ser campeã, ou despromovida, conto quantas vezes aconteceu nas simulações e divido pelo número de simulações.

Ratings iniciais

Para simular uma época, é preciso uma noção dos ratings iniciais de cada equipa para prever os jogos. Poderia assumir antes de cada época que as equipas são de nível equivalente e o modelo acabaria por aprender quais as melhores. No entanto, isto iria demorar a obter ratings realistas e não representa de forma credível aquilo que já sabemos sobre cada equipa no início de uma época: umas são melhores do que outras.

Assim, para dar um valor mais exacto dos ratings iniciais da época, utilizo os dados de todos os jogos da primeira e segunda divisão desde 2009/10. Na versão na data em que escrevo, utilizo as classificações da época 2008/09 para diferenciar ligeiramente o rating inicial de 2009/10 das equipas da primeira divisão. As equipas da segunda divisão são consideradas todas iguais. Depois, utilizo o sistema Elo para ir calculando o rating de cada equipa ao longo das 10 épocas e utilizo o rating final de 2018/19 como o rating inicial da época 2019/20.2 Isto significa que no início da época, a expectativa do modelo é muito semelhante ao que aconteceu na época anterior. À medida que a nova época decorre, o modelo vai aprendendo que equipas estão mais fortes e mais fracas do que inicialmente previsto e vai-se aproximando do resultado real final.

Actualmente, apenas corro o modelo na época 2019/20 para a 1ª divisão. No entanto, utilizo os dados históricos da 2ª divisão por 2 motivos. O primeiro é que permite dar ratings mais realistas às equipas recém-promovidas que, noutra situação, teriam o rating com que ficaram da última vez que estiveram na 1ª divisão (ou um valor arbitrário caso nunca tivessem estado). O segundo motivo é que permite aumentar bastante o número de jogos na base de dados. Enquanto a primeira divisão tem actualmente 182 jogos por época, a segunda tem 364 mais o apuramento de campeão e promoção. A utilização de um maior número de jogos permite uma estimação mais precisa do valor dos parâmetros utilizados no modelo.

Parâmetros

O modelo, tal como está, exige a utilização de vários parâmetros: o \(K\) (quanto é que o modelo responde a um resultado surpreendente) e a vantagem caseira, assim como diversos parâmetros ligados ao modelo de empates e de golos (explicado abaixo). Para estimar o valor mais correcto para esses parâmetros, calculo qual dos valores faz com que o modelo se engane menos vezes nas probabilidades que atribui em cada jogo nos jogos das épocas anteriores.

O parâmetro \(K\) não é fixo ao longo de toda a época. Nas primeiras jornadas, é mais alto de forma a reagir mais aos resultados iniciais. Como o modelo não tem informação sobre os plantéis, não sabe se alguma das equipas começa a época reforçada ou desfalcada. Assim, ao atribuir um parâmetro \(K\) maior nas primeiras jornadas (que vai descendo ao longo de cada jornada até chegar a um valor fixo que será usado para o resto da época) o modelo tenta ajustar mais rapidamente os ratings das equipas que parecem ter desempenhos melhores ou piores do que o inicialmente previsto.

Avaliação do modelo

A forma mais correcta de avaliar um modelo que atribui probabilidades a um evento não é ver qual era o evento mais provável e contar quantas vezes aconteceu. O método que uso para avaliar é usar uma fórmula chamada log loss. Há outras fórmulas semelhantes. Esta é particularmente comum, porque, sob certos pressupostos, faz com que alguém que prevê as probabilidades indique os valores que realmente pensa corresponderem à verdade.

Concretamente, a forma como funciona é a seguinte. Recuperemos as probabilidades do jogo usado como exemplo anteriormente:

A fórmula log loss dá como pontuação o logaritmo natural da probabilidade do que realmente aconteceu. Assim, a pontuação atribuída seria, em caso de cada um dos resultados:

(Repare que os pontos são negativos. Quanto mais alto o número, ou quanto mais baixo em termos de distância para o 0, melhor.)

O modelo estará mais correcto caso vença o OCB, daí que o valor atribuído seja mais alto nessa situação. Um modelo perfeito anteciparia sempre o que acontece e teria como resultado \(\ln(1) = 0\), o valor máximo. No entanto, para penalizar um modelo que seja excessivamente confiante, esta regra é particularmente dolorosa quando acontece um evento que o modelo achava improvável. No caso extremo, se acontecer algo que o modelo achasse impossível, o resultado seria \(\ln(0)=-\infty\), isto é, menos infinito. Portanto, um modelo assim seria considerado muito mau, mesmo que acertasse em todas as outras previsões. Isto obriga a que quem faz o modelo seja mais cauteloso. Num caso menos extremo, uma situação que se previa acontecer apenas 1% das vezes teria como resultado: \(\ln(0.01)=\) -4.61, uma perda particularmente alta, quando vimos acima que acertar num evento que tinha 81% de probabilidade resulta em -0.21.

Outra forma importante de avaliar um modelo é a calibração. Isto significa avaliar se eventos que o modelo diz que acontecem 10% das vezes acontecem de facto 1 em cada 10 vezes.

Esta secção pretende alertar e informar o leitor sobre como interpretar previsões feitas com probabilidades. A maioria dos comentadores e até apostadores tendem a pensar em: “eu acho que equipa X vai ganhar”. Esta página sabe que é impossível ter a certeza de que qualquer equipa ganhe um certo jogo: apenas podemos estar extremamente confiantes. Um modelo estatístico ajuda-nos a distinguir quando devemos estar moderadamente confiantes (70%), muito confiantes (90%), ou extremamente confiantes (99%).

Desempate

O modelo tem também em conta os critérios de desempate. Este detalhe é talvez a parte mais complexa do modelo. O regulamento dita os seguintes critérios:

  1. Pontos conquistados nos jogos entre as equipas empatadas
  2. Maior diferença entre golos marcados e sofridos nos jogos entre as equipas empatadas
  3. Maior diferença entre golos marcados e sofridos ao longo da prova
  4. Melhor rácio de golos marcados e sofridos nos jogos entre elas (aplica-se ao caso de 3 ou mais equipas empatadas)
  5. Melhor rácio de golos marcados e sofridos ao longo da prova.

A versão actual do modelo implementa todos estes critérios. Isto obrigou a simular também os golos marcados e sofridos nos jogos que ainda não decorreram. Quando os jogos já aconteceram na realidade, é usado o resultado real.

Para os jogos simulados, são usados 3 modelos para prever o resultado concreto:

É de realçar que nenhum destes modelos tem em conta características específicas das equipas; apenas o seu valor e o contexto do jogo (e.g. quem joga em casa). Isto significa que não distingue duas equipas com o mesmo rating Elo, em que uma tende a querer marcar sempre mais golos e a ter jogos muito abertos, e outra que se fecha assim que consegue uma vantagem curta. Isto pode retirar alguma fiabilidade aos números concretos de golos marcados e sofridos. No entanto, os modelos de golos servem apenas para ter umas probabilidades mais aproximadas das reais em casos de empate e não são o foco do modelo principal.

O benefício de acrescentar ao modelo os golos no contexto dos critérios de desempate vê-se de duas formas:

Limitações

Todos os modelos têm limitações por definição. O objectivo de um modelo em qualquer contexto é simplificar e focar-se nos aspectos mais importantes para explicar um fenómeno. É isto que aqui é feito. Todas as sugestões concretas sobre como melhorar este modelo serão bem recebidas (mensagem no twitter ou para ).

Em termos concretos, há dois principais defeitos deste modelo, comparado ao que é feito noutros desportos:

  1. Apenas considera o resultado final do jogo e não outras estatísticas informativas sobre o mesmo (por exemplo, número de remates, livres directos, faltas, etc.) que podem indicar se foi uma vitória clara ou sortuda.
  2. Ter apenas em conta o resultado de cada clube e não dados concretos sobre o plantel. Por isso, não sabe que jogadores saíram e entraram durante a pré-época; que jogadores estão lesionados ou suspensos para a próxima jornada. Isto significa que, particularmente no início da época, as previsões estejam muito próximas da forma como terminou a época anterior.

Infelizmente, não antevejo ser possível incorporar muito mais informação no futuro. Há poucos dados sobre os jogos de hóquei em patins e mesmo os relatórios dos jogos do site da federação (veja-se um exemplo) indicam apenas os golos, livres directos, penaltis, cartões e faltas. Não se quantos minutos jogou cada jogador, quando foram as substituições, quantos remates fez cada jogador, e de onde, entre muitos outros dados. Numa situação futura ideal, teremos disponíveis dados semelhantes aos da liga de hóquei no gelo norte-americano: quanto tempo jogou cada jogador e eventos detalhados, como remates (incluindo distância para a baliza e tipo de stickada), reinícios de jogo, faltas, e até “hits” (cargas legais sobre um adversário). Sem estes dados, é difícil avaliar o contributo de cada jogador individualmente para poder ter uma noção do impacto de lesões e alterações no plantel.

Uma situação mais simples de resolver é que dados dos jogos sejam corrigidos quando há erros com a plataforma informática usada. Por exemplo, no jogo da época 2019/20 entre o OC Barcelos e o FC Porto, o relatório no site da FPP mostra muitos eventos a acontecer no mesmo segundo. Na hora do jogo, o site parecia não estar a funcionar correctamente, pelo que deverá ter sido um erro informático na plataforma. No entanto, seria útil corrigir este tipo de erros após o jogo para pelo menos ter uma informação base fiável sobre a evolução de cada jogo e quando ocorreram os principais eventos.


  1. Inspirado na forma como faz o site 538. Ver por exemplo: (https://fivethirtyeight.com/methodology/how-our-nfl-predictions-work/).↩︎

  2. Excluo os resultados de jogos com falta de comparência.↩︎