Dois focos principais estruturam esse texto:
O primeiro é apresentar um tutorial de como fazer análises básicas no software estatístico R;
O outro é que, ao fazê-lo, vamos utilizar um exemplo futebolístico e assim prever a posição final do São Paulo no campeonato brasileiro, bem como as chances de classificação à libertadores.
Em primeiro lugar, você deve baixar o software, o passo a passo segue aqui: https://didatica.tech/como-instalar-a-linguagem-r-e-o-rstudio/
Em Segundo lugar deves baixar na mesma pasta que fores rodar a análise a base de dados utilizada por essa pesquisa, a mesma consta disponível nesse link
Após iniciar o RStudio, abra um script (FILE - NEW FILE - SCRIPT) e vá colando os códigos, aperte CTRL + Enter para rodar
A função library(nome do pacote), baixa os pacotes utilizados nessa análise. Para os pacotes que não constam instalado no teu pc, deves instalar antes:
install.packges(‘nome do pacote’) entre aspas
OBS: O que for código constará em itálico
...
library(readxl)
base <- read_excel("saopaulo21jogos.xlsx")
str(base)
## tibble [18 x 4] (S3: tbl_df/tbl/data.frame)
## $ year : num [1:18] 2003 2004 2005 2006 2007 ...
## $ gols21 : num [1:18] 41 28 30 34 29 36 29 27 33 33 ...
## $ libertadores: num [1:18] 1 1 0 1 1 1 1 0 0 1 ...
## $ posicao : num [1:18] 3 3 11 1 1 1 3 9 6 4 ...
library(readxl) é relacionado ao pacote necessário para abrir arquivos de excel no R
a segunda função (base <- …) cria a base de dados a ser analisado;
str(nome da base): apresenta os dados do banco
‘year’ é ano
‘gols21’ - é quantidade de gols marcados pelo São Paulo Futebol Clube até as vigésima primeira rodada dos 18 campeonatos brasileiros entre 2003 e 2020
‘libertadores’ - é uma variável de valores 1 e 0, sendo 1 classificou à libertadores ao fim do campeonato e 0 não classificou
‘posicao’ - é a posição final do campeonato, sendo 1 primeiro e 13 décimo terceiro.
O que se segue tem 4 objetivos:
verificar se o número de gols marcados até a vigésima primeira rodada tem relação com a classificação à libertadores
verificar se o número de gols marcados até a vigésima primeira rodada tem relação com a classificação final no brasileirão.
tentar prever se o São Paulo se classificará à libertadores, tendo em vista que marcou 18 em 2021 até a vigésima primeira rodada
tentar prever a posição final do São Paulo, tendo em vista que marcou 18 e em 2021 até a vigésima primeira
Antes, entretanto, vamos dar uma olhada em estatísticas descritivas utilizando a variável ‘gols21’:
library(ggplot2)
summary(base$gols21)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 20.00 27.25 29.50 30.44 34.00 41.00
O menor valor da amostra é 20 gols, ou seja os 18 gols marcados é a pior vigésima primeira rodada da história são-paulina no atributo gols marcados.
Os dados acima também nos mostram que a média histórica do São Paulo nas 18 primeiras edições do campeonato brasileiro por pontos corridos é de 30,44 gols até a vigésima primeira rodada.
g <- ggplot(base, aes(year, gols21))
g + geom_line()
Vemos no gráfico acima o numero de gols marcados por ano
cor.test(base$gols21, base$libertadores)
##
## Pearson's product-moment correlation
##
## data: base$gols21 and base$libertadores
## t = 2.4843, df = 16, p-value = 0.02443
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.08058241 0.79792637
## sample estimates:
## cor
## 0.5276032
A correlação é estatisticamente signficativa (p-value menor que 0.05) e com força de 0.52 (a medida vai de 0 a 1). Há correlação porém de força moderada.
prop.table(table(base$libertadores))
##
## 0 1
## 0.3333333 0.6666667
Os dados acima mostram que em 66,66% (2/3) das vezes o São Paulo se classificou à libertadores entre 2003 e 2020.
mean(base$libertadores)
## [1] 0.6666667
A mesma medida pode ser obtida tirando a media da variável ‘libertadores’, já que a variável vai de 0 a 1, o valor de 0,66… equivale a 2/3.
O teste de correlação adequado é o ponto biserial, uma vez que uma das variáveis (‘libertadores’) assume somente assume dois valores.
library(polycor)
polyserial(base$gols21, base$libertadores)
## [1] 0.6840339
0.68 é um valor razoável, ou seja, como esperado marcar mais gols gera mais probabilidades de classificação à libertadores.
A regressão logísitica binária é o tipo de regressão indicada para variáveis como ‘libertadores’ (valores 0 e 1)
library(coefplot)
modelo_obj1 <- glm(libertadores ~ gols21, data = base, family = binomial(link = logit))
summary(modelo_obj1)
##
## Call:
## glm(formula = libertadores ~ gols21, family = binomial(link = logit),
## data = base)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.9139 -0.6636 0.3810 0.8521 1.6254
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -7.1456 4.0040 -1.785 0.0743 .
## gols21 0.2667 0.1380 1.933 0.0532 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 22.915 on 17 degrees of freedom
## Residual deviance: 17.245 on 16 degrees of freedom
## AIC: 21.245
##
## Number of Fisher Scoring iterations: 5
coefplot(modelo_obj1, intercept= F)
‘gols21’ é explicativa à 90%. Na imagem isso fica nítido (linha grossa não passa no zero) que mais gols redunda em maiores probabilidades de classificação. A linha fina passa em cima do zero, isso quer dizer que a confiança à 95% não foi obtida.
A posição está quantificada assim:
table(base$posicao)
##
## 1 2 3 4 5 6 9 10 11 13
## 3 1 3 3 1 2 2 1 1 1
Sendo que a pior posição foi 13 (décimo terceiro), optou-se por criar uma nova variável dando mais peso às melhores classificação.
Para isso se recodificou a variável ‘posicao’, criando a variável ‘posicao_recod’ (13-posicao):
base$posicao_recod <- 13 - base$posicao
table(base$posicao_recod)
##
## 0 2 3 4 7 8 9 10 11 12
## 1 1 1 2 2 1 3 3 1 3
Fazendo uma simples operação [ 13 - ‘posicao’ ], inverte-se a ordem.
Ou seja, agora a primeira posição vale 12 pontos, a segunda posição vale 11 e assim sucessivamente, confira:
table(base$posicao, base$posicao_recod)
Logo, podemos analisar de forma a correlacionar gols na vigésima primeira rodada e posição final:
a <- ggplot(base, aes(gols21, posicao_recod))
a + geom_point()
Percebemos à uma primeira vista que marcar mais gols melhora a posição.
f <- ggplot(base, aes(gols21, posicao_recod))
f + geom_text(aes(label = year))
Na tabela acima observamos os ano.
c <- ggplot(base, aes(gols21, posicao_recod))
c + geom_smooth(model =lm)
O gráfico acima mostra que há uma relação linear (não-perfeita) entre as variáveis.
cor.test(base$gols21, base$posicao_recod)
##
## Pearson's product-moment correlation
##
## data: base$gols21 and base$posicao_recod
## t = 2.9932, df = 16, p-value = 0.0086
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.1836226 0.8329977
## sample estimates:
## cor
## 0.5991305
0.599 mostra haver certa correlação
library(vcdExtra)
library(Kendall)
Kendall(base$gols21, base$posicao_recod)
## tau = 0.415, 2-sided pvalue =0.023435
gama1 <- table(base$gols21, base$posicao_recod)
GKgamma(gama1)
## gamma : 0.441
## std. error : 0.102
## CI : 0.242 0.64
modelo_obj2 <- lm(posicao_recod ~ gols21, data = base)
summary(modelo_obj2)
##
## Call:
## lm(formula = posicao_recod ~ gols21, data = base)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.9961 -1.6467 0.3097 2.1568 4.8388
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4.1015 4.0143 -1.022 0.3221
## gols21 0.3884 0.1297 2.993 0.0086 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.033 on 16 degrees of freedom
## Multiple R-squared: 0.359, Adjusted R-squared: 0.3189
## F-statistic: 8.959 on 1 and 16 DF, p-value: 0.0086
coefplot(modelo_obj2, intercept= T)
Os dois asteriscos na variável explicativa ‘gols21’ mostra que há significância estatística a 0.01. Ou seja o modelo prevê que cada gol a mais marcado até a vigésima primeira rodada eleva 0.3384 a posição final do campeonato
library(Zelig)
z.out1 <- zelig(libertadores ~ gols21 , model = "logit", data = base, cite = FALSE)
x.out1 <- Zelig::setx(z.out1,gols21 = 18)
s.out1 <- sim(z.out1, x = x.out1)
summary(s.out1)
##
## sim x :
## -----
## ev
## mean sd 50% 2.5% 97.5%
## [1,] 0.1538204 0.1764415 0.08314116 0.004119182 0.6526773
## pv
## 0 1
## [1,] 0.847 0.153
15% em média
plot(s.out1)
O pacote Zelig gera 1000 simulações na regressão logística binária rodada anteriormente e vê-se (pequeno tamanho de y=1) que raramente nessas simulações com essa quantidade de gols (18 marcados em 2021) na vigésima primeira rodada, ocorreu a classificação para a liberta. Ou seja, o time precisa melhorar muito seu desempenho se quiser se classificar à competição sulamericana.
Veja no gráfico inferior que a maior parte das simulações estão em números baixos e poucos se aproximam do 1.
modelo_obj4 <- lm(posicao ~ gols21, data = base)
library(BAS)
prediction <-data.frame(gols21=18)
pred = predict(modelo_obj4, newdata =prediction, estimator = "BPM", se.fit=T)
pred$fit # fitted values
## 1
## 10.11082
Na previsão da posição final, utilizando o pacote BAS, tem-se a expectativa de que terminará o Brasileirão 2021 em décimo lugar.
Por óbvio, isso se trata de uma ‘brincadeira’, mas é interessante notar que com poucos passos é possível fazer simples previsões. Dúvidas? entre em contato.