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’.

Estatística descritiva gols do São Paulo FC até a vigésima primeira rodada

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

Objetivo 1- verificar se o número de gols marcados até a vigésima primeira rodada tem relação com a classificação à libertadores

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.

Objetivo 2 - verificar se o número de gols marcados até a vigésima primeira rodada tem relação com a classificação à libertadores

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

Objetivo 3 - tentar prever se o São Paulo se classificará à libertadores, tendo em vista que marcou 18 em 2021 até a vigésima primeira rodad

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.

Objetivo 4- tentar prever a posição final do São Paulo, tendo em vista que marcou em 2021 até a vigésima primeira rodada 18 gols

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