A análise a seguir é feita sob os gols que ocorrem nos Campeonatos Brasileiros, afim de encontrar algum padrão de comportamento nas observações e concluir sob hipóteses que serão consideradas mais adiante. Para esta análise, foi utilizado como amostra os gols marcados referentes ao Campeonato Brasileiro de 2013.
O Campeonato Brasileiro de Futebol é formado por uma liga de 20 clubes no formato de pontos corridos, onde cada clube se enfrenta duas vezes ao longo da competição. Ao total ocorrem 380 jogos onde estes ficam agrupados em 38 rodadas, registrando 10 jogos por rodada. Cada clube joga 38 partidas, onde 19 partidas serão “em casa” e a outra metade “fora de casa”. O rankeamento no campeonato é feito através dos pontos corridos, onde uma vitória vale 3 pontos, empate 1 ponto, e derrota 0 pontos. O vencedor do campeonato será aquele que mais pontuar ao longo das rodadas. Os quatro times mais bem colocados se classificam para participar de uma competição entre clubes da América (Taça Libertadores), enquanto que os 4 piores colodados serão rebaixados para a série B do Campeonato Brasileiro.
O dataset utilizado é composto por 973 observações que representam os gols ocorridos no Campeonato Brasileiro de 2013. Cada observação possui informações relativas a sete variáveis que serão consideradas na análise. São elas:
setwd("~/Documents/ad1/problema3")
gols <- read.csv("camp_brasileiro_2013.txt", sep=";")
summary(gols)
## id_jogo time_a time_b tempo_gol
## Min. : 1.0 Cruzeiro : 64 Vasco da Gama: 64 90 : 37
## 1st Qu.: 92.0 Atlético/MG : 58 Criciúma : 61 None : 37
## Median :184.0 Internacional: 57 Atlético/PR : 60 45 : 19
## Mean :187.6 Atlético/PR : 56 Vitória : 60 52 : 17
## 3rd Qu.:282.0 Vitória : 54 Náutico : 53 25 : 16
## Max. :380.0 Fluminense : 53 Botafogo : 52 72 : 16
## (Other) :631 (Other) :623 (Other):831
## time_gol placar_time_a placar_time_b
## Cruzeiro : 77 Min. :0.000 Min. :0.0000
## Atlético/PR : 65 1st Qu.:1.000 1st Qu.:0.0000
## Vitória : 59 Median :1.000 Median :1.0000
## Botafogo : 55 Mean :1.299 Mean :0.8756
## Internacional: 51 3rd Qu.:2.000 3rd Qu.:1.0000
## Santos : 51 Max. :6.000 Max. :5.0000
## (Other) :615
A partir dos resultados dos jogos, é possível realizar uma análise comparando os gols sofridos por times que jogam em casa e times que jogam fora de casa, afim de verificar se existe alguma diferença significativa entre o número de gols marcados por estes grupos.
library(dplyr)
jogos <- group_by(gols, id_jogo) %>% arrange(desc(as.numeric(as.character(tempo_gol)))) %>% do(head(., n=1))
jogos$vencedor <- ifelse(as.numeric(jogos$placar_time_a) > as.numeric(jogos$placar_time_b),as.character(jogos$time_a),
ifelse(jogos$placar_time_a < jogos$placar_time_b,as.character(jogos$time_b),
"Empate" ))
jogos$rodada <- 0
rod = 1
for(i in seq(1,380, by=10)){
jogos[seq(i,i+9),]$rodada <- rod #indica as rodadas dos jogos
rod = rod + 1
}
library(rCharts)
gols_time_casa <- jogos %>% group_by(placar_time_a) %>% summarise(Freq = length(placar_time_a))
rp1 <- dPlot(Freq ~ placar_time_a, data = gols_time_casa, type = "bar")
rp1$show("inline", include_assets = TRUE, cdn = F)
gols_time_visitante <- jogos %>% group_by(placar_time_b) %>% summarise(Freq = length(placar_time_b))
rp2 <- dPlot(Freq ~ placar_time_b, data = gols_time_visitante,type = "bar")
rp2$show('inline', include_assets = TRUE, cdn = F)
Através dos histogramas acima, é possível observar uma diferença entre as distribuições dos gols marcados em casa (placar_time_a) e marcados fora de casa (placar_time_b), onde as frequências do número de gols para os times que jogam em casa se encontram concentradas nos valores 1 e 2 e os times que jogam fora de casa com maior concentração para os valores 0 e 1. Além disso, é notável que os times que jogam em casa possuem mais observações em valores mais à direita (6,5 e 4 gols).
Através do teste de hipótese para as médias, é possível observar se há uma diferença significativa entre as médias de gols marcados em casa e fora de casa. Inicialmente, temos que a hipótese nula (H0) é de que não há diferença significativa entre as médias dos gols marcados em casa e fora de casa.
t.test(jogos$placar_time_a,jogos$placar_time_b, alternative="two.sided")
##
## Welch Two Sample t-test
##
## data: jogos$placar_time_a and jogos$placar_time_b
## t = 5.8864, df = 737.206, p-value = 5.992e-09
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 0.3157048 0.6316636
## sample estimates:
## mean of x mean of y
## 1.4684211 0.9947368
Através do p_valor calculado no teste de hipótese, é possível inferir com 95% de confiança que a hipótese nula está rejeita, representando que há uma possível diferença entre as médias das distribuições em questão.
times_casa_test <- t.test(jogos$placar_time_a, alternative="two.sided", conf.int=TRUE)
times_visitantes_test <- t.test(jogos$placar_time_b, alternative="two.sided", conf.int=TRUE)
ic_times_casa <- c(times_casa_test$conf.int[1],times_casa_test$conf.int[2])
ic_times_visitantes <- c(times_visitantes_test$conf.int[1], times_visitantes_test$conf.int[2])
library(ggplot2, quietly=TRUE)
a <- select(jogos, value = placar_time_a)
a$time <- "casa"
b <- select(jogos, value =placar_time_b)
b$time <- "visitante"
ab <- rbind(a,b)
toPlot = summarise(group_by(ab, time), mean = mean(value))
toPlot = mutate(toPlot, lower = ifelse(toPlot$time == "casa",ic_times_casa[1],ic_times_visitantes[1]))
toPlot = mutate(toPlot, upper = ifelse(toPlot$time == "casa",ic_times_casa[2],ic_times_visitantes[2]))
ggplot(toPlot, aes(x = time, y=mean, colour = time)) +
geom_point() +
geom_errorbar(aes(ymin=lower, ymax=upper), width=.1) + theme_bw()
A partir do gráfico acima, é possível observar que não há uma sobreposição entre os intervalos calculados para as médias das distribuições em questão, reforçando a rejeição da hipótese nula.
A análise seguinte busca verificar se existe uma diferença significativa entre as médias de gols de partidas que terminam empatadas e partidas que possuem um vencedor.
jogos_empate <- jogos %>% filter(placar_time_a == placar_time_b) %>% group_by(id_jogo) %>% summarise(num_gols=placar_time_a + placar_time_b )
jogos_com_vencedor <- jogos %>% filter(placar_time_a != placar_time_b) %>% group_by(id_jogo) %>% summarise(num_gols = placar_time_a + placar_time_b)
freq_jogos_empate <- jogos_empate %>% group_by(num_gols) %>% summarise(Freq = length(num_gols))
rp3 <- dPlot(Freq ~ num_gols, data = freq_jogos_empate, type = "bar")
rp3$show('inline', include_assets = TRUE, cdn = F)
O histograma acima representa a frequência do número de gols ocorridos em partidas que terminam empatadas. É possível observar poucas barras pois o número de resultados comuns para empates costuma ser mais restrito, sendo esta uma característica específica do futebol. Um fato interessante é sobre o resultado mais comum para empates neste campeonato ser de 1x1 (onde o número de gols ocorridos é igual a 2).
freq_jogos_com_vencedor <- jogos_com_vencedor %>% group_by(num_gols) %>% summarise(Freq=length(num_gols))
rp4 <- dPlot(Freq ~ num_gols, data=freq_jogos_com_vencedor, type="bar")
rp4$show('inline', include_assets = TRUE, cdn = F)
Para partidas que possuem um vencedor, é possível observar uma maior variedade no numero de gols, com ocorrência de mais gols neste tipo de partida do que em partidas que terminam empatadas. Um fato interessante que pode ser visualizado é que partidas com número de gols igual a 3 (ou placar de 2x1) foram mais recorrentes nesta edição do campeonato.
Para este teste, será considerado como hipótese nula (H0) que não há diferença entre as médias de gols em partidas que terminam empatadas e com vencedor.
t.test(jogos_empate$num_gols, jogos_com_vencedor$num_gols, alternative="two.sided")
##
## Welch Two Sample t-test
##
## data: jogos_empate$num_gols and jogos_com_vencedor$num_gols
## t = -5.5908, df = 199.265, p-value = 7.375e-08
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -1.3302374 -0.6365382
## sample estimates:
## mean of x mean of y
## 1.759259 2.742647
A partir do teste de hipótese acima, onde foi encontrado uma baixa probabilidade para o p_valor (menor que 0.05), rejeitamos a hipótese nula de que não há diferença significativa entre as distribuições observadas.
jogos_empate_test <- t.test(jogos_empate$num_gols, alternative="two.sided", conf.int=TRUE)
jogos_vencedor_test <- t.test(jogos_com_vencedor$num_gols, alternative="two.sided",conf.int=TRUE)
ic_jogos_empate <- c(jogos_empate_test$conf.int[1],jogos_empate_test$conf.int[2])
ic_jogos_vencedor <- c(jogos_vencedor_test$conf.int[1],jogos_vencedor_test$conf.int[2])
jogos_empate_e_venc <- rbind(mutate(jogos_empate, res = "empate"), mutate(jogos_com_vencedor, res = "com_vencedor"))
toPlot = summarise(group_by(jogos_empate_e_venc, res), mean = mean(num_gols))
toPlot = mutate(toPlot, lower = ifelse(toPlot$res == "empate",ic_jogos_empate[1],ic_jogos_vencedor[1]))
toPlot = mutate(toPlot, upper = ifelse(toPlot$res == "empate",ic_jogos_empate[2],ic_jogos_vencedor[2]))
ggplot(toPlot, aes(x = res, y=mean, colour = res)) +
geom_point() +
geom_errorbar(aes(ymin=lower, ymax=upper), width=.1) + theme_bw()
Com o gráfico acima, podemos observar os intervalos de confiança para as médias das distribuições. Como foi visto através do teste de hipótese, foi rejeitada a hipótese de que não há diferença significativa nas médias e, através dos ICs acima, é possível notar esta diferença. Outro aspecto interessante observado é em relação ao quão distante são os valores que as médias das classes da população podem assumir (com confiança de 95%), chegando próximo a 1.5 gols de diferença.
#diferença entre o limite superior do ic "com_vencedor" e o limite inferior do ic "empate"
toPlot[1,]$upper - toPlot[2,]$lower
## [1] 1.463711
Ainda sobre os Intervalos de Confiança acima, é notória a diferença de tamanho dos intervalos. Isso se deve ao fato das distribuições possuirem tamanhos diferentes. A primeira possui mais observações, sendo assim terá mais precisão e um intervalo mais curto, enquanto que a segunda distribuição possui menos observações, e com isso com um IC maior.
nrow(jogos_com_vencedor)
## [1] 272
nrow(jogos_empate)
## [1] 108
## Source: local data frame [2 x 4]
##
## res mean lower upper
## 1 com_vencedor 2.742647 2.556075 2.929219
## 2 empate 1.759259 1.465509 2.053010
A análise a seguir busca uma diferença significativa entre o número de empates dos clubes mais bem colocados (os 10 primeiros) com os clubes mais abaixo na tabela de classificação (os 10 últimos colocados).
A a partir dos resultados dos jogos, é possível construir a tabela de classificação do campeonato.
times_casa <- jogos %>% group_by(id_jogo) %>% summarise(rodada=rodada, time=time_a,
venceu=ifelse(as.numeric(placar_time_a) > as.numeric(placar_time_b), TRUE,FALSE),
perdeu=ifelse(as.numeric(placar_time_a) < as.numeric(placar_time_b), TRUE,FALSE),
empatou=ifelse(as.numeric(placar_time_a) == as.numeric(placar_time_b), TRUE, FALSE),
gols_pro=placar_time_a, gols_contra=placar_time_b, dia_jogo=dia_jogo,
saldo_gols=(placar_time_a - placar_time_b))
times_visitante <- jogos %>% group_by(id_jogo) %>% summarise(rodada=rodada, time=time_b,
venceu=ifelse(as.numeric(placar_time_b) > as.numeric(placar_time_a),TRUE,FALSE),
perdeu=ifelse(as.numeric(placar_time_b) < as.numeric(placar_time_a),TRUE,FALSE),
empatou=ifelse(as.numeric(placar_time_b) == as.numeric(placar_time_a),TRUE,FALSE),
gols_pro= placar_time_b, gols_contra= placar_time_a,dia_jogo= dia_jogo,
saldo_gols=placar_time_b - placar_time_a)
resultados_times <- rbind(times_casa, times_visitante)
classificacao_geral <- resultados_times %>% group_by(time) %>% summarise(gols_pro= sum(gols_pro),
gols_contra= sum(gols_contra), saldo_gols= sum(saldo_gols),
num_vitorias= sum(venceu), num_empates= sum(empatou),
num_derrotas= sum(perdeu), pontuacao=(sum(venceu)*3) + sum(empatou)) %>%
arrange(desc(pontuacao), desc(saldo_gols)) %>% group_by(time) %>%
mutate(aproveitamento=round(pontuacao / 114, digits=2))
classificacao_geral$pos <- 1:20
classificacao_geral <- classificacao_geral[,c(10,1,2,3,4,5,6,7,8,9)] #rearranjo de colunas para facilitar leitura da tabela
library("googleVis", quietly = TRUE)
library("base64enc", quietly = TRUE)
op <- options(gvis.plot.tag = "chart")
Table <- gvisTable(classificacao_geral)
plot(Table)
primeiros <- classificacao_geral[1:10,]
rp5 <- dPlot(num_empates ~ time, data = primeiros, type = "bar")
rp5$show('inline', include_assets = TRUE, cdn = F)
ultimos <- classificacao_geral[11:20,]
rp6 <- dPlot(num_empates ~ time, data = ultimos, type = "bar")
rp6$show('inline', include_assets = TRUE, cdn = F)
Através dos histogramas acima, é possível observar uma semelhança nas distribuições, demonstrando indícios de que não existe diferença significativa sob a amostra. Em relação a população, é feito um teste de hipótese com a amostra afim de verificar uma existência ou ausência de diferença significativa. Como hipótese nula (H0), será considerado que não há diferença significativa entre as distribuições.
t.test(primeiros$num_empates, ultimos$num_empates, alternative="two.sided")
##
## Welch Two Sample t-test
##
## data: primeiros$num_empates and ultimos$num_empates
## t = 0.1598, df = 17.887, p-value = 0.8748
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -2.430842 2.830842
## sample estimates:
## mean of x mean of y
## 10.9 10.7
mean(primeiros$num_empates)
## [1] 10.9
mean(ultimos$num_empates)
## [1] 10.7
Através do teste de hipótese para médias (t-test), foi verificado que o p_valor possui um valor bem maior que 0.05, levando a conclusão de que, com 95% de confiança, a hipótese nula não seja rejeitada e sugerindo que não há diferença significativa entre o número de empates entre os dez primeiros colocados e os dez últimos.
empate_primeiros_test <- t.test(primeiros$num_empates, alternative="two.sided",conf.int=TRUE)
empate_ultimos_test <- t.test(ultimos$num_empates, alternative="two.sided", conf.int=TRUE)
ic_primeiros <- c(empate_primeiros_test$conf.int[1],empate_primeiros_test$conf.int[2])
ic_ultimos <- c(empate_ultimos_test$conf.int[1], empate_ultimos_test$conf.int[2])
primeiros_e_ultimos <- rbind(mutate(primeiros, res="primeiros"), mutate(ultimos, res="ultimos"))
toPlot = summarise(group_by(primeiros_e_ultimos, res), mean = mean(num_empates))
toPlot = mutate(toPlot, lower = ifelse(toPlot$res == "primeiros",ic_primeiros[1],ic_ultimos[1]))
toPlot = mutate(toPlot, upper = ifelse(toPlot$res == "ultimos",ic_ultimos[2],ic_primeiros[2]))
ggplot(toPlot, aes(x = res, y=mean, colour = res)) +
geom_point() +
geom_errorbar(aes(ymin=lower, ymax=upper), width=.1) + theme_bw()
Através do gráfico acima, podemos verificar os intervalos de confiança se sobreponto quase que para os mesmos valores.
O gráfico a seguir faz uma simulação campeonato exibindo os resultados dos times por rodada.
#Detalhamento da tabela de classificacao por rodada.
ranking_rodadas <- select(resultados_times, -id_jogo)
rodada_zero <- filter(ranking_rodadas, rodada==1) %>% group_by(time) %>% summarise(rodada=0,
venceu=FALSE, perdeu=FALSE,empatou=FALSE,gols_pro=0, gols_contra=0,
dia_jogo=as.Date("2013-5-24"), saldo_gols=0)
ranking_rodadas <- rbind(rodada_zero, ranking_rodadas)
#Calcula numero de vitorias, empates, derrotas e pontuacao de cada time por rodada.
ranking_rodadas <- ranking_rodadas %>% group_by(rodada,time) %>%
summarise(gols_pro = gols_pro, gols_contra= gols_contra, saldo_gols = saldo_gols,
num_vitorias = ifelse(venceu, 1, 0), num_empates = ifelse(empatou, 1, 0),
num_derrotas = ifelse(perdeu, 1, 0), pontuacao = ifelse(venceu, 3, ifelse(empatou, 1, 0)),
dia_jogo = dia_jogo)
#Adiciona pontuacao cumulativa aos times por rodada.
ranking_rodadas <- group_by(ranking_rodadas, time) %>% mutate(pontuacao = cumsum(pontuacao), saldo_gols = cumsum(saldo_gols), num_vitorias = cumsum(num_vitorias), num_empates = cumsum(num_empates), num_derrotas = cumsum(num_derrotas))
#Adiciona a posicao na tabela de cada clube por rodada.
ranking_rodadas <- ranking_rodadas %>% group_by(rodada) %>% arrange(desc(pontuacao), desc(saldo_gols))
ranking_rodadas$posicao <- 0
ranking_rodadas <- group_by(ranking_rodadas, rodada)
ranking_rodadas$posicao <- desc(1:20)
#Ordena pelos dias dos jogos
ranking_rodadas <- ranking_rodadas %>% group_by(rodada) %>% arrange(dia_jogo)
op <- options(gvis.plot.tag='chart')
myStateSettings <-'
{"orderedByX":true,"colorOption":"5","yZoomedIn":false,"iconType":"VBAR","nonSelectedAlpha":0.4,"xZoomedDataMax":20,"time":"2013-05-24","yZoomedDataMin":0,"xLambda":1,"sizeOption":"_UNISIZE","yLambda":1,"orderedByY":false,"uniColorForNonSelected":false,"showTrails":false,"xZoomedDataMin":0,"duration":{"multiplier":1,"timeUnit":"D"},"xAxisOption":"10","yAxisOption":"9","iconKeySettings":[],"dimensions":{"iconDimensions":["dim0"]},"playDuration":15000,"xZoomedIn":false,"yZoomedDataMax":80}
'
Motion=gvisMotionChart(ranking_rodadas,
idvar="time",
timevar="dia_jogo",
#xvar = "posicao",
#yvar = "pontuacao",
#sizevar = "num_vitorias",
#colorvar = "saldo_gols",
date.format = "%d/%m/%Y",
options=list(state=myStateSettings)
)
plot(Motion)
Instruções: - Marque o(s) time(s) desejado(s) para vê-lo(s) em destaque. - Aperte o botão “play” para iniciar a simulação. - É possível alterar os parâmetros verticais e horizontais, bem como a cor e os times de gráficos (nas abas que se encontram à direita na parte superior do gráfico)