Mostrando postagens com marcador R. Mostrar todas as postagens
Mostrando postagens com marcador R. Mostrar todas as postagens

segunda-feira, 14 de novembro de 2011

Brasileirão 2011 - 40 jogos restando

Mais uma rodada se foi e as coisas vão se clareando para muitas equipes.

No post de hoje vou me limitar apenas a postar os resultados atualizados de maneira semelhante ao último.

> probabilities(dados.2)
                      champ      libert        sulam   rebaixa
América/MG    0.00000000000 0.000000000 0.0005666667 0.9690667
Atlético/GO   0.00000000000 0.000000000 0.8173666667 0.0062000
Atlético/MG   0.00000000000 0.000000000 0.4956000000 0.0767000
Atlético/PR   0.00000000000 0.000000000 0.0119000000 0.8688000
Avaí          0.00000000000 0.000000000 0.0000000000 0.9983667
Bahia         0.00000000000 0.000000000 0.7501666667 0.0221000
Botafogo      0.00500000000 0.550900000 0.4491000000 0.0000000
Ceará         0.00000000000 0.000000000 0.0513000000 0.7212333
Corinthians   0.44046666667 0.998666667 0.0013333333 0.0000000
Coritiba      0.00000000000 0.152600000 0.8474000000 0.0000000
Cruzeiro      0.00000000000 0.000000000 0.1928666667 0.3200333
Figueirense   0.01913333333 0.710566667 0.2894333333 0.0000000
Flamengo      0.00423333333 0.438933333 0.5610666667 0.0000000
Fluminense    0.03416666667 0.778500000 0.2215000000 0.0000000
Grêmio        0.00000000000 0.005233333 0.9938666667 0.0000000
Internacional 0.00000000000 0.107033333 0.8929666667 0.0000000
Palmeiras     0.00000000000 0.000000000 0.6811333333 0.0175000
Santos        0.00003333333 1.000000000 0.0000000000 0.0000000
São Paulo     0.00036666667 0.257566667 0.7424333333 0.0000000
Vasco         0.49660000000 1.000000000 0.0000000000 0.0000000
>

Os resultados acima ilustram o que venho comentado: A 2 rodadas, o América/MG possuia probabilidades baixíssimas de fugir do rebaixamento. Vem fazendo bem a sua parte e já possui hoje uma probabilidade próxima a 4% de escapar. vimos também nesta rodada, o corinthians praticamente assegurar vaga à copa Libertadores 2012. Vimos também o campeonato praticamente se polarizar entre Vasco e corinthians.

Quanto à pontuação para se escapar do rebaixamento, vemos abaixo que 43 pontos tende a ser uma pontuação segura para se manter na série A em 2012:

> with(dados[dados$Pos == 17,], quantile(P, c(0.025, 0.5, 0.975, 0.995)))
 2.5%   50% 97.5% 99.5%
   38    41    43    44
> with(dados[dados$Pos == 16,], quantile(P, c(0.025, 0.5, 0.975, 0.995)))
 2.5%   50% 97.5% 99.5%
   40    43    45    46
>
Veja que em pelo menos 50% das simulações, o 16º conseguiu escapar com 43 ou mais pontos. Por outro lado, em apenas 2,5% das simulações mostraram o 17º alcançando pontuação igual ou superior a este.

Falando de Copa Libertadores, vemos abaixo que 64 pontos continua um valor bem interessante para se garantir no torneio de 2012.

> with(dados[dados$Ranking == 4,], quantile(P, c(0.025, 0.5, 0.975, 0.995), na.rm=TRUE))
 2.5%   50% 97.5% 99.5%
   58    61    63    64
> with(dados[dados$Ranking == 5,], quantile(P, c(0.025, 0.5, 0.975, 0.995), na.rm=TRUE))
 2.5%   50% 97.5% 99.5%
   57    59    62    63
>

Para se escapar da pré-libertadores, no entanto, esta exigencia pula para perto dos 68 pontos. Mas se o assunto for título, seria bom conseguir algo acima dos 70 ponto, veja abaixo:

> with(dados[dados$Ranking == 2,], quantile(P, c(0.025, 0.5, 0.975, 0.995), na.rm=TRUE))
 2.5%   50% 97.5% 99.5%
   61    64    68    68
> with(dados[dados$Pos == 1,], quantile(P, c(0.025, 0.5, 0.975, 0.995)))
 2.5%   50% 97.5% 99.5%
   65    69    73    73
> with(dados[dados$Pos == 2,], quantile(P, c(0.025, 0.5, 0.975, 0.995)))
 2.5%   50% 97.5% 99.5%
   63    66    70    71
>

Partindo da mesma lógica em que se analisou a permanência na Série a para 2012,  note que em 2,5% das simulações, o 2º colocado alcançou pontuação superior ou igual a 70 pontos, para superar esta colocação seria lógico fazer mais que estes 70, contudo, a pontuação do 1º colocado em 47,5% das simulações, esteve entre 69 e 73 pontos. 73 pontos, acredito ser uma pontuação bastante segura para ser o Campeão Brasileiro de 2011.

Continuo aguardando comentários e sugestões quanto a este tema e a todos que tenho discutido ultimamente neste espaço.

No feriado de 15 de novembro tentarei colocar no ar mais um post sobre este assunto, com as probabilidades dos resultados de alguns jogos chave da próxima rodada.

sexta-feira, 11 de novembro de 2011

Brasileirão 2011 - 50 jogos restando - probabilidades completas

Conforme comentei no post anterior, iria utilizar meu tempo livre para calcular corretamente as probabilidades de sulamericana e libertadores, que eram um pouco menos triviais que as demais, pois temos Vasco e Santos já classificados para a CopaLibertadores e com probabilidades reais de estarem entre os quatro primeiros lugares ao fim do Campeonato Brasileiro de 2011.

Em uma primeira olhada para o problema, nos deparamos com uma  sequência complexa decálculos de probabilidades que podem ser resumidos a algo como:

P(libertadores) = P(clubeterminar entre os 4 primeiros lugares) +
    + P(clube terminar em 5º | Vasco terminou entre os 4) +
    + P(clube terminar em 5º | Santos terminou entre os 4) +
    + P(clube terminar em 6º | Vasco E Santos terminaram entre os 5)


Se for pensar em termos de copa sulamericana, o grau de complexidade é o mesmo, com probabilidades sendo calculadas como:

P(sulamericana) = P(clube terminar entre 7º e 12º lugar) +
    + P(clube terminar em 13º | Vasco terminou até 12º) +
    + P(clube terminar em 13º | Santos terminou até 12º) +
    + P(clube terminar em 14º | Santos E Vasco até 13º) +
    + P(clube terminar em 5º | Santos E Vasco entre 6º e 20º) +
    + P(clube terminar em 6º | Santos E Vasco entre 7º e 20º)

Para nossa sorte, estas regras são equivalentes a se fazer uma tabela de classificação sem a presença de Vasco e Santos (Clubes com vaga assegurada na Copa libertadores). no caso do software R, esta ação se resume ao código apresentado a seguir:

standings.restrict <- function(st, restrictions) {
    rnk <-  rank(st[!(st$Equipe %in% restrictions),]$Pos)
    st.t <- data.frame(
        Equipe = st$Equipe[!(st$Equipe %in% restrictions)],
        Ranking = as.numeric(rnk)
    )
    st.final <- merge(st,st.t, all.x=TRUE)
    return(st.final)
}

e para se chegar às probabilidades, se precisa apenas fazer uso da seguinte função:

probabilities <- function(df) {
    Eq <- levels(df$Equipe)
    dft <- as.data.frame(prob.position(df))
    dfr <- as.data.frame(prob.ranking(df))
    p.Champ <- aggregate(
        Freq ~ Equipe, data = dft[dft$Pos == 1,], sum)
    p.libert <- aggregate(
        Freq ~ Equipe, data = dfr[dfr$Ranking %in% (1:4),], sum)
    p.sulam <- aggregate(
        Freq ~ Equipe, data = dfr[dfr$Ranking %in% (5:12),], sum)
    p.relegate <- aggregate(
        Freq ~ Equipe, data = dft[dft$Pos %in% (17:20),], sum)
    prob <- as.data.frame(cbind(
        champ=p.Champ$Freq,
        libert=p.libert$Freq,
        sulam = p.sulam$Freq,
        rebaixa=p.relegate$Freq
    ))
    rownames(prob) <- Eq
   
    prob[rownames(prob) %in% c("Santos","Vasco"),]$libert = 1.0

    return((prob))
}

o resultado da função acima, se aplicado aos dados de simulação realizados no último domingo/segunda, é o seguinte:

> probabilities(dados.1)
                champ  libert   sulam rebaixa
América/MG    0.00000 0.00000 0.00016 0.98952
Atlético/GO   0.00000 0.00004 0.93968 0.00158
Atlético/MG   0.00000 0.00000 0.66450 0.04864
Atlético/PR   0.00000 0.00000 0.03360 0.75750
Avaí          0.00000 0.00000 0.00062 0.98130
Bahia         0.00000 0.00000 0.42980 0.14464
Botafogo      0.03962 0.62346 0.37654 0.00000
Ceará         0.00000 0.00000 0.13686 0.48174
Corinthians   0.39330 0.97724 0.02276 0.00000
Coritiba      0.00006 0.07784 0.92216 0.00000
Cruzeiro      0.00000 0.00000 0.09860 0.56462
Figueirense   0.01978 0.47328 0.52672 0.00000
Flamengo      0.02462 0.52856 0.47144 0.00000
Fluminense    0.17970 0.88926 0.11074 0.00000
Grêmio        0.00000 0.01308 0.98364 0.00000
Internacional 0.00184 0.25112 0.74888 0.00000
Palmeiras     0.00000 0.00000 0.69942 0.03046
Santos        0.00000 1.00000 0.00000 0.00000
São Paulo     0.00044 0.16612 0.83388 0.00000
Vasco         0.34064 1.00000 0.00000 0.00000
>

Como esta série de posts é apenas de carater de demonstração, fico no dever de analisar  toda e qualquer sugestão, inclusive para melhoria do código postado neste blog. Para aproveitar o resultado da última simulação, tornou-se também necessária a construção de uma rotina para a geração da nova classificação. Ela funciona bem na prática e reflete muito do que encontramos em nossa prática profissional, onde temos situações onde devemos tentar aproveitar o máximo da informação que já possuímos. muitas vezes se paga o preço de rodar um comando que demora 3 horas e que foi codificado em igual periodo de tempo a se gastar 3 a 4 dias para se obter uma solução alguns segundos mais rápida. O mundo gira e o prejuízo muitas vezes bate à sua porta.

Continuo também à disposição de vocês através de meu twitter @_ldeassis_

segunda-feira, 7 de novembro de 2011

Previsões Brasileirão 2011 - Baseado em quê são calculadas as probabilidades de cada equipe

Continuando a série de perguntas e respostas, segue a resposta a mais uma das perguntas. Caso a resposta não tenha ficado suficientemente clara, gostaria do retorno de vocês para que a mesma fique mais completa, apontando os trechos onde se carece de mais explicação.

P: Baseado em quê são calculadas as probabilidades de cada equipe

R: Esta pergunta não possui uma resposta única, principalmente porque pessoas pensam de maneira diferente, vendo o problema de maneiras diferentes. Via de regra, mesmo pensando de maneiras diferentes. Hoje temos sites como o Chance de Gol, o departamento de Matemática da UFMG, um grupo da UFSCar, citando apenas 3 dos muitos que fazem trabalhos interessantes em probabilidades no esporte. Eles usam idéias muitas vezes diferentes, mas que chegam a resultados bastante próximos.

Mas via de regra, eles possuem uma coisa em comum: As probabilidades de vitória, empate e derrota. Uma partida de futebol não é um lançamento de uma moeda, tão pouco o lançamento de dados.

Se perguntarmos a 10 pessoas com conhecimentos variados de futebol, sobre qual será o resultado, por exemplo de Figueirense x Atlético/MG, que será realizado no próximo 12/11/2011 em Florianópolis, encontraremos as mais diversas opiniões. o Site chute certo (http://chutecerto.globo.com/palpites/estatistica/jogo/650) mostrava as 19:29 de hoje (6 de novembro), 65,7% para figueirense, 22,2% para empate e 12,1%  para Atlético-MG. São resultados factíveis? não sei. Mas são uma estimativa para um dos 50 jogos restantes.

Cada grupo ou site que divulga as probabilidades os faz baseado em algo que acreditam ser a melhor maneira de se estimar o resultado das partidas. Com certeza o fizeram por crer ser a melhor maneira. No caso dos cálculos feitos nesta série de explicações, optou-se por utilizar como critério de desempenho, o comportamento de cada uma das equipes nos últimos 10 jogos, baseado nos gols feitos e sofridos.

Para este objetivo, foi construída uma função no software estatístico R que produz os seguintes resultados quando executada com os dados da Série A de 2011 atualizados até 6 de Novembro de 2011:


> calculateMean(serie.A.2011)
          Equipe    mGP.m     mGC.m     mGP.v    mGC.v      mGP      mGC
1     América/MG 1.705882 1.4705882 0.8750000 2.062500 1.303030 1.757576
2    Atlético/GO 1.250000 0.7500000 1.2941176 1.647059 1.272727 1.212121
3    Atlético/MG 1.470588 1.1764706 1.0000000 1.812500 1.242424 1.484848
4    Atlético/PR 1.235294 1.0588235 0.7500000 2.000000 1.000000 1.515152
5           Avaí 1.470588 1.7647059 1.1875000 2.437500 1.333333 2.090909
6          Bahia 1.411765 1.1764706 0.9375000 1.500000 1.181818 1.333333
7       Botafogo 2.058824 0.9411765 0.8750000 1.375000 1.484848 1.151515
8          Ceará 1.687500 1.1875000 0.7058824 2.117647 1.181818 1.666667
9    Corinthians 1.750000 1.0625000 1.1176471 1.000000 1.424242 1.030303
10      Coritiba 2.250000 0.8125000 0.9411765 1.470588 1.575758 1.151515
11      Cruzeiro 1.437500 1.3125000 0.8823529 1.529412 1.151515 1.424242
12   Figueirense 1.312500 0.8750000 1.2941176 1.411765 1.303030 1.151515
13      Flamengo 1.705882 1.0588235 1.7500000 1.625000 1.727273 1.333333
14    Fluminense 1.812500 1.0000000 1.1176471 1.529412 1.454545 1.272727
15        Grêmio 1.750000 1.0000000 0.7058824 1.647059 1.212121 1.333333
16 Internacional 1.882353 1.3529412 1.3125000 1.062500 1.606061 1.212121
17     Palmeiras 1.352941 0.8823529 0.8750000 1.312500 1.121212 1.090909
18        Santos 1.705882 1.0588235 1.2500000 1.750000 1.484848 1.393939
19     São Paulo 1.375000 1.0000000 1.5294118 1.529412 1.454545 1.272727
20         Vasco 1.687500 0.6875000 1.2941176 1.529412 1.484848 1.121212


mGP = Média de Gols feitos (.m = mandante, .v = visitante)
mGC = Média de Gols sofridos (.m = mandante, .v = visitante)


Esta função foi codificada da seguinte forma:

calculateMean <- function(df) {

    G <- standings(df)

    mg <- data.frame(
        Equipe = G$Equipe,
        mGP.m = ifelse(G$J.m > 0, G$GP.m / G$J.m, 0),
        mGC.m = ifelse(G$J.m > 0, G$GC.m / G$J.m, 0),
        mGP.v = ifelse(G$J.v > 0, G$GP.v / G$J.v, 0),
        mGC.v = ifelse(G$J.v > 0, G$GC.v / G$J.v, 0),
        mGP = ifelse(G$J > 0, G$GP / G$J, 0),
        mGC = ifelse(G$J > 0, G$GC / G$J, 0)
    )

    return(mg)

}

Esta função na verdade fornece parâmetros para as distribuições de probabilidade utilizadas para gerar os resultados. Neste caso, está sendo adotada a premissa de que o número de gols feitos e sofridos por uma equipe seguem uma distribuição de probabilidades chamada Poisson. A média de gols é utilizada como parâmetro lambda desta distribuição.