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: https://docs.google.com/spreadsheets/d/1jQpi1bnSRkfWwQ1HenIc2301XmdvA_EU/edit?usp=sharing&ouid=110199422031960594145&rtpof=true&sd=true
Após iniciar o R studio, abra um script (FILE - NEW FILE - SCRIPT) e vá colando os códigos
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:
library(readxl)
## Warning: package 'readxl' was built under R version 4.0.5
base <- read_excel("saopaulo21jogos.xlsx")
str(base)#quais as variáveis do banco
## 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 6 objetivos:
1- verificar se o número de gols marcados até a vigésima primeira rodada tem relação com a classificação à libertadores
2- verificar se o número de gols marcados até a vigésima primeira rodada tem relação com a classificação à libertadores
3- tentar prever se o São Paulo se classificará à libertadores, tendo em vista que marcou 18 em 2021 até a vigésima primeira rodada
4- 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ístiticas descritivas utilizando a variável ‘gols21’.
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.0.5
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
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v tibble 3.0.6 v dplyr 1.0.4
## v tidyr 1.1.2 v stringr 1.4.0
## v readr 1.4.0 v forcats 0.5.1
## v purrr 0.3.4
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
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)
## Warning: package 'polycor' was built under R version 4.0.5
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.
library(coefplot)
## Warning: package 'coefplot' was built under R version 4.0.5
regressão logísitica binária é o tipo de regressão indicada para variáveis como ‘libertadores’ (valores 0 e 1)
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)
## Warning: It is deprecated to specify `guide = FALSE` to remove a guide. Please
## use `guide = "none"` instead.
## Warning: It is deprecated to specify `guide = FALSE` to remove a guide. Please
## use `guide = "none"` instead.
## Warning: It is deprecated to specify `guide = FALSE` to remove a guide. Please
## use `guide = "none"` instead.
‘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)
##
## 0 2 3 4 7 8 9 10 11 12
## 1 0 0 0 0 0 0 0 0 0 3
## 2 0 0 0 0 0 0 0 0 1 0
## 3 0 0 0 0 0 0 0 3 0 0
## 4 0 0 0 0 0 0 3 0 0 0
## 5 0 0 0 0 0 1 0 0 0 0
## 6 0 0 0 0 2 0 0 0 0 0
## 9 0 0 0 2 0 0 0 0 0 0
## 10 0 0 1 0 0 0 0 0 0 0
## 11 0 1 0 0 0 0 0 0 0 0
## 13 1 0 0 0 0 0 0 0 0 0
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)
## Warning: Ignoring unknown parameters: model
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
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
#gkgama
library(vcdExtra)
## Warning: package 'vcdExtra' was built under R version 4.0.5
## Loading required package: vcd
## Warning: package 'vcd' was built under R version 4.0.5
## Loading required package: grid
## Loading required package: gnm
## Warning: package 'gnm' was built under R version 4.0.5
##
## Attaching package: 'vcdExtra'
## The following object is masked from 'package:dplyr':
##
## summarise
#Kendall
library(Kendall)
## Warning: package 'Kendall' was built under R version 4.0.5
O valor de 0,41 para teste Kendall e 0,441 para Kgamma mostram relação de leve para moderada
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)
## Warning: It is deprecated to specify `guide = FALSE` to remove a guide. Please
## use `guide = "none"` instead.
## Warning: It is deprecated to specify `guide = FALSE` to remove a guide. Please
## use `guide = "none"` instead.
## Warning: It is deprecated to specify `guide = FALSE` to remove a guide. Please
## use `guide = "none"` instead.
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)
## Warning: package 'Zelig' was built under R version 4.0.5
## Loading required package: survival
##
## Attaching package: 'Zelig'
## The following object is masked from 'package:purrr':
##
## reduce
## The following object is masked from 'package:ggplot2':
##
## stat
z.out1 <- zelig(libertadores ~ gols21 , model = "logit", data = base, cite = FALSE)
## Warning: `tbl_df()` was deprecated in dplyr 1.0.0.
## Please use `tibble::as_tibble()` instead.
## Warning: `group_by_()` was deprecated in dplyr 0.7.0.
## Please use `group_by()` instead.
## See vignette('programming') for more help
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
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)
## Warning: package 'BAS' was built under R version 4.0.5
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 cienciapoliticaporgregorio@gmail.com