1 Motivação

Este projeto tem por finalidade realizar uma regressão linear múltipla, e encontrar o melhor modelo possível para a mesma e assim aplicar os conceitos aprendidos em aula durante o segundo semestre de 2023, na turma de IAR (Inferência e Análise de Regressão), ministrada pela Profa. Dra. Flávia cristina Martins Queiroz Mariano.

2 Dados utilizados

O conjunto de dados escolhido são referentes aos da temporada 2022-2023 da NBA (National Basketball Association), que contém informações referentes a todos os jogadores da liga, como:

  • Total de pontos feito pelo jogador na temporada;
  • Idade do jogador;
  • Time que joga;
  • Quantidade de bloqueios do jogador;
  • Quantidade de turnovers do jogador;
  • Quantidade de lances livres do jogador;
  • Quantidade de jogos jogados;
  • Quantidade de faltas cometidas;

Tanto a base de dados para download, quanto mais informações sobre a mesma, podem ser encontradas no link a seguir: Link da Base de Dados.

Para este trabalho, a variável dependente (Y) que será utilizada será o fantasy point (FP) do jogador, que significa uma pontuação do jogador, não em relação a quantidade de cestas apenas, mas como um score individual, que é cumulativo durante todo o campeonato. Dessa forma o projeto é baseado em encontrar o melhor modelo possível para prever qual seria o FP de um jogador da liga, com base nas variáveis encontradas para explicar o FP, utilizando uma taxa de 5% de significância.

3 Importação dos dados

3.1 Carregando pacotes que serão necessários para a realização do projeto

library(MASS)
library(tidyverse)
library(car)
library(ggplot2)
library(gridExtra)
library(lmtest)
library(knitr)
library(rmarkdown)
library(htmltools)

3.2 Transformando o arquivo de dados em dataset e visualizando os dados

dataset <- "C:/Users/mathe/Documents/Unifesp/Materias/IAR/Trabalho final/2023_nba_player_stats.csv"
data <- read.csv(dataset, sep = ",")

glimpse(data)
## Rows: 539
## Columns: 30
## $ PName <chr> "Jayson Tatum", "Joel Embiid", "Luka Doncic", "Shai Gilgeous-Ale…
## $ POS   <chr> "SF", "C", "PG", "PG", "PF", "SG", "PF", "SG", "PG", "SG", "PG",…
## $ Team  <chr> "BOS", "PHI", "DAL", "OKC", "MIL", "MIN", "NYK", "CLE", "ATL", "…
## $ Age   <int> 25, 29, 24, 24, 28, 21, 28, 26, 24, 28, 32, 25, 33, 26, 29, 25, …
## $ GP    <int> 74, 66, 66, 68, 63, 79, 77, 68, 73, 77, 58, 73, 74, 67, 71, 66, …
## $ W     <int> 52, 43, 33, 33, 47, 40, 44, 44, 38, 38, 27, 44, 37, 46, 35, 32, …
## $ L     <int> 22, 23, 33, 35, 16, 39, 33, 24, 35, 39, 31, 29, 37, 21, 36, 34, …
## $ Min   <dbl> 2732.2, 2284.1, 2390.5, 2416.0, 2023.6, 2841.5, 2737.3, 2432.4, …
## $ PTS   <int> 2225, 2183, 2138, 2135, 1959, 1946, 1936, 1922, 1914, 1913, 1866…
## $ FGM   <int> 727, 728, 719, 704, 707, 707, 658, 679, 597, 673, 556, 682, 657,…
## $ FGA   <int> 1559, 1328, 1449, 1381, 1278, 1541, 1432, 1402, 1390, 1388, 1202…
## $ FG.   <dbl> 46.6, 54.8, 49.6, 51.0, 55.3, 45.9, 45.9, 48.4, 42.9, 48.5, 46.3…
## $ X3PM  <int> 240, 66, 185, 58, 47, 213, 218, 245, 154, 204, 244, 119, 46, 163…
## $ X3PA  <int> 686, 200, 541, 168, 171, 578, 636, 635, 460, 544, 658, 367, 142,…
## $ X3P.  <dbl> 35.0, 33.0, 34.2, 34.5, 27.5, 36.9, 34.3, 38.6, 33.5, 37.5, 37.1…
## $ FTM   <int> 531, 661, 515, 669, 498, 319, 402, 319, 566, 363, 510, 343, 456,…
## $ FTA   <int> 622, 771, 694, 739, 772, 422, 531, 368, 639, 428, 558, 440, 523,…
## $ FT.   <dbl> 85.4, 85.7, 74.2, 90.5, 64.5, 75.6, 75.7, 86.7, 88.6, 84.8, 91.4…
## $ OREB  <int> 78, 113, 54, 59, 137, 47, 141, 63, 56, 42, 44, 40, 34, 78, 131, …
## $ DREB  <int> 571, 557, 515, 270, 605, 411, 626, 226, 161, 303, 233, 266, 309,…
## $ REB   <int> 649, 670, 569, 329, 742, 458, 767, 289, 217, 345, 277, 306, 343,…
## $ AST   <int> 342, 274, 529, 371, 359, 350, 316, 301, 741, 327, 425, 447, 377,…
## $ TOV   <int> 213, 226, 236, 192, 246, 259, 216, 180, 300, 194, 191, 181, 153,…
## $ STL   <int> 78, 66, 90, 112, 52, 125, 49, 99, 80, 69, 50, 83, 83, 75, 65, 42…
## $ BLK   <int> 51, 112, 33, 65, 51, 58, 21, 27, 9, 18, 18, 23, 36, 26, 36, 38, …
## $ PF    <int> 160, 205, 166, 192, 197, 186, 233, 168, 104, 159, 109, 172, 186,…
## $ FP    <int> 3691, 3706, 3747, 3425, 3451, 3311, 3324, 2918, 3253, 2885, 2849…
## $ DD2   <int> 31, 39, 36, 3, 46, 9, 40, 5, 40, 2, 16, 11, 6, 13, 24, 28, 58, 0…
## $ TD3   <int> 1, 1, 10, 0, 6, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 29, 0, 0, 0, 1,…
## $ X...  <int> 470, 424, 128, 149, 341, 97, 170, 338, 100, 18, 105, 176, 67, 25…
paged_table(data)


O banco possui informações de todos os 539 jogadores da NBA e 29 variáveis associadas para cada um, relacionada as estatísticas do player na temporada de 2022-2023, além do nome.

3.3 Separação das variáveis do dataset

Pname <- data$PName
POS <- data$POS
Team <- data$Team
Age <- data$Age
GP <- data$GP
W <- data$W
L <- data$L
Min <- data$Min
PTS <- data$PTS
FGM <- data$FGM
FGA <- data$FGA
FG <- data$FG.
X3PM <- data$X3PM
X3PA <- data$X3PA
X3P <- data$X3P.
FTM <- data$FTM
FTA <- data$FTA
FT <- data$FT.
OREB <- data$OREB
DREB <- data$DREB
REB <- data$REB
AST <- data$AST
TOV <- data$TOV
STL <- data$STL
BLK <- data$BLK
PF <- data$PF
FP <- data$FP
DD2 <- data$DD2
TD3 <- data$TD3
X <- data$X

4 Análise visual dos dados

Fazendo o plot de algumas variáveis em relação ao fantasy point, para verificar de maneira visual algumas variáveis que apresentem não ter relação direta com a variável dependente.


Com isso, pode-se notar que a posição do jogador e a idade, a quantidade de duplos-duplos e triplos-duplos parecem não ter relação diretas com os fantasy points do jogador.

5 Modelos de regressão

Partimos agora para buscar o melhor modelo para tentar explicar nossa variável dependente. Uma primeira tentativa é utizar todas as variáveis para termos de onde começar a fase de testes. Dessa forma, utilizaremos todas as variáveis para observar os resultados obtidos

5.1 Primeiro modelo

first_model <- lm(FP ~ GP + W + PTS+ FGM + FGA +
                  FG + X3PM + X3PA + X3P + FTM +
                  FTA + FT + OREB + DREB + REB + 
                  AST + TOV + STL + BLK + PF +
                  FP, data = data)
                  
summary(first_model)
## 
## Call:
## lm(formula = FP ~ GP + W + PTS + FGM + FGA + FG + X3PM + X3PA + 
##     X3P + FTM + FTA + FT + OREB + DREB + REB + AST + TOV + STL + 
##     BLK + PF + FP, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.54939 -0.25112  0.00488  0.24413  0.51420 
## 
## Coefficients: (2 not defined because of singularities)
##               Estimate Std. Error   t value Pr(>|t|)    
## (Intercept) -7.778e-03  7.595e-02    -0.102    0.918    
## GP          -1.476e-03  1.583e-03    -0.933    0.351    
## W            2.710e-03  2.073e-03     1.307    0.192    
## PTS          9.993e-01  1.171e-03   853.649   <2e-16 ***
## FGM          1.432e-03  2.509e-03     0.571    0.568    
## FGA         -1.303e-04  5.199e-04    -0.251    0.802    
## FG           1.510e-03  1.438e-03     1.050    0.294    
## X3PM        -3.058e-05  2.659e-03    -0.012    0.991    
## X3PA         7.472e-04  9.815e-04     0.761    0.447    
## X3P          6.912e-04  1.054e-03     0.656    0.512    
## FTM                 NA         NA        NA       NA    
## FTA          8.117e-04  9.951e-04     0.816    0.415    
## FT          -9.793e-05  6.808e-04    -0.144    0.886    
## OREB         1.201e+00  5.938e-04  2022.647   <2e-16 ***
## DREB         1.200e+00  2.768e-04  4333.404   <2e-16 ***
## REB                 NA         NA        NA       NA    
## AST          1.500e+00  2.553e-04  5875.644   <2e-16 ***
## TOV         -1.000e+00  8.515e-04 -1174.613   <2e-16 ***
## STL          3.000e+00  9.602e-04  3123.935   <2e-16 ***
## BLK          3.000e+00  7.925e-04  3786.087   <2e-16 ***
## PF          -5.696e-04  5.399e-04    -1.055    0.292    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2928 on 520 degrees of freedom
## Multiple R-squared:      1,  Adjusted R-squared:      1 
## F-statistic: 2.786e+08 on 18 and 520 DF,  p-value: < 2.2e-16


Com isso, foi possível observar um R2 de 100%, o que apesar de parecer bom, é passivo de dúvidas, pois pode haver multicolinearidade nos dados. Entretanto, muitas variáveis não apresentaram significância no modelo, irá ser utilizado o stepAIC()1 para encontrar um modelo mais ajustado para o problema.

stepAIC(first_model, direction = "both")
## Start:  AIC=-1305.24
## FP ~ GP + W + PTS + FGM + FGA + FG + X3PM + X3PA + X3P + FTM + 
##     FTA + FT + OREB + DREB + REB + AST + TOV + STL + BLK + PF + 
##     FP
## 
## 
## Step:  AIC=-1305.24
## FP ~ GP + W + PTS + FGM + FGA + FG + X3PM + X3PA + X3P + FTM + 
##     FTA + FT + OREB + DREB + REB + AST + TOV + STL + BLK + PF
## 
## 
## Step:  AIC=-1305.24
## FP ~ GP + W + PTS + FGM + FGA + FG + X3PM + X3PA + X3P + FTM + 
##     FTA + FT + OREB + DREB + AST + TOV + STL + BLK + PF
## 
## 
## Step:  AIC=-1305.24
## FP ~ GP + W + PTS + FGM + FGA + FG + X3PM + X3PA + X3P + FTA + 
##     FT + OREB + DREB + AST + TOV + STL + BLK + PF
## 
##        Df Sum of Sq     RSS     AIC
## - X3PM  1         0      45 -1307.2
## - FT    1         0      45 -1307.2
## - FGA   1         0      45 -1307.2
## - FGM   1         0      45 -1306.9
## - X3P   1         0      45 -1306.8
## - X3PA  1         0      45 -1306.6
## - FTA   1         0      45 -1306.6
## - GP    1         0      45 -1306.3
## - FG    1         0      45 -1306.1
## - PF    1         0      45 -1306.1
## - W     1         0      45 -1305.5
## <none>                   45 -1305.2
## - PTS   1     62494   62538  2598.3
## - TOV   1    118323  118367  2942.2
## - OREB  1    350848  350892  3527.9
## - STL   1    836917  836961  3996.5
## - BLK   1   1229305 1229350  4203.7
## - DREB  1   1610411 1610455  4349.2
## - AST   1   2960665 2960709  4677.4
## 
## Step:  AIC=-1307.24
## FP ~ GP + W + PTS + FGM + FGA + FG + X3PA + X3P + FTA + FT + 
##     OREB + DREB + AST + TOV + STL + BLK + PF
## 
##        Df Sum of Sq     RSS     AIC
## - FT    1         0      45 -1309.2
## - FGA   1         0      45 -1309.2
## - FGM   1         0      45 -1308.8
## - X3P   1         0      45 -1308.8
## - GP    1         0      45 -1308.3
## - FTA   1         0      45 -1308.2
## - FG    1         0      45 -1308.1
## - PF    1         0      45 -1308.1
## - W     1         0      45 -1307.5
## <none>                   45 -1307.2
## - X3PA  1         0      45 -1307.0
## + X3PM  1         0      45 -1305.2
## + FTM   1         0      45 -1305.2
## - PTS   1     94670   94714  2820.0
## - TOV   1    118356  118401  2940.4
## - OREB  1    355259  355304  3532.7
## - STL   1    839172  839216  3995.9
## - BLK   1   1230451 1230496  4202.2
## - DREB  1   1616909 1616953  4349.4
## - AST   1   2961279 2961324  4675.6
## 
## Step:  AIC=-1309.22
## FP ~ GP + W + PTS + FGM + FGA + FG + X3PA + X3P + FTA + OREB + 
##     DREB + AST + TOV + STL + BLK + PF
## 
##        Df Sum of Sq     RSS     AIC
## - FGA   1         0      45 -1311.1
## - X3P   1         0      45 -1310.8
## - FGM   1         0      45 -1310.8
## - GP    1         0      45 -1310.2
## - FG    1         0      45 -1310.1
## - PF    1         0      45 -1310.1
## - FTA   1         0      45 -1310.1
## - W     1         0      45 -1309.4
## <none>                   45 -1309.2
## - X3PA  1         0      45 -1308.8
## + FT    1         0      45 -1307.2
## + X3PM  1         0      45 -1307.2
## + FTM   1         0      45 -1307.2
## - PTS   1     98020   98064  2836.8
## - TOV   1    118359  118403  2938.4
## - OREB  1    356171  356216  3532.0
## - STL   1    839852  839897  3994.4
## - BLK   1   1231576 1231621  4200.7
## - DREB  1   1617435 1617480  4347.6
## - AST   1   2961286 2961331  4673.6
## 
## Step:  AIC=-1311.14
## FP ~ GP + W + PTS + FGM + FG + X3PA + X3P + FTA + OREB + DREB + 
##     AST + TOV + STL + BLK + PF
## 
##        Df Sum of Sq     RSS     AIC
## - FGM   1         0      45 -1312.8
## - X3P   1         0      45 -1312.7
## - FTA   1         0      45 -1312.1
## - GP    1         0      45 -1312.0
## - PF    1         0      45 -1312.0
## - FG    1         0      45 -1311.7
## <none>                   45 -1311.1
## - W     1         0      45 -1311.1
## - X3PA  1         0      45 -1310.3
## + FGA   1         0      45 -1309.2
## + FT    1         0      45 -1309.2
## + X3PM  1         0      45 -1309.2
## + FTM   1         0      45 -1309.2
## - PTS   1    107673  107718  2885.4
## - TOV   1    121490  121535  2950.4
## - OREB  1    359189  359234  3534.6
## - STL   1    852876  852920  4000.7
## - BLK   1   1264302 1264346  4212.8
## - DREB  1   1700261 1700305  4372.5
## - AST   1   2961426 2961471  4671.6
## 
## Step:  AIC=-1312.77
## FP ~ GP + W + PTS + FG + X3PA + X3P + FTA + OREB + DREB + AST + 
##     TOV + STL + BLK + PF
## 
##        Df Sum of Sq     RSS     AIC
## - X3P   1         0      45 -1314.5
## - GP    1         0      45 -1313.8
## - PF    1         0      45 -1313.6
## - FTA   1         0      45 -1313.5
## - FG    1         0      45 -1313.4
## - W     1         0      45 -1312.9
## <none>                   45 -1312.8
## + FGM   1         0      45 -1311.1
## + FTM   1         0      45 -1311.1
## + FT    1         0      45 -1310.8
## + X3PM  1         0      45 -1310.8
## + FGA   1         0      45 -1310.8
## - X3PA  1         0      45 -1310.1
## - TOV   1    127481  127526  2974.4
## - OREB  1    363256  363301  3538.7
## - STL   1    852999  853044  3998.7
## - BLK   1   1264409 1264453  4210.9
## - DREB  1   1751870 1751915  4386.6
## - AST   1   2987862 2987907  4674.4
## - PTS   1   4002602 4002646  4832.0
## 
## Step:  AIC=-1314.46
## FP ~ GP + W + PTS + FG + X3PA + FTA + OREB + DREB + AST + TOV + 
##     STL + BLK + PF
## 
##        Df Sum of Sq     RSS     AIC
## - GP    1         0      45 -1315.5
## - PF    1         0      45 -1315.3
## - FTA   1         0      45 -1315.2
## - FG    1         0      45 -1314.7
## - W     1         0      45 -1314.6
## <none>                   45 -1314.5
## + X3P   1         0      45 -1312.8
## + FTM   1         0      45 -1312.7
## + FGM   1         0      45 -1312.7
## + FT    1         0      45 -1312.5
## + X3PM  1         0      45 -1312.5
## + FGA   1         0      45 -1312.5
## - X3PA  1         0      45 -1311.5
## - TOV   1    127640  127685  2973.0
## - OREB  1    376355  376400  3555.7
## - STL   1    853050  853094  3996.8
## - BLK   1   1265917 1265961  4209.5
## - DREB  1   1755094 1755139  4385.6
## - AST   1   2988148 2988193  4672.4
## - PTS   1   4004107 4004152  4830.2
## 
## Step:  AIC=-1315.53
## FP ~ W + PTS + FG + X3PA + FTA + OREB + DREB + AST + TOV + STL + 
##     BLK + PF
## 
##        Df Sum of Sq     RSS     AIC
## - W     1         0      45 -1316.6
## - FTA   1         0      45 -1316.2
## - FG    1         0      45 -1315.9
## <none>                   45 -1315.5
## - PF    1         0      45 -1315.2
## + GP    1         0      45 -1314.5
## + FTM   1         0      45 -1313.8
## + X3P   1         0      45 -1313.8
## + FGM   1         0      45 -1313.7
## + FT    1         0      45 -1313.7
## + FGA   1         0      45 -1313.6
## + X3PM  1         0      45 -1313.5
## - X3PA  1         0      45 -1313.1
## - TOV   1    128614  128659  2975.1
## - OREB  1    385462  385507  3566.6
## - STL   1    870805  870850  4005.9
## - BLK   1   1278130 1278175  4212.7
## - DREB  1   1763826 1763871  4386.3
## - AST   1   3014357 3014401  4675.1
## - PTS   1   4010010 4010054  4829.0
## 
## Step:  AIC=-1316.59
## FP ~ PTS + FG + X3PA + FTA + OREB + DREB + AST + TOV + STL + 
##     BLK + PF
## 
##        Df Sum of Sq     RSS     AIC
## - FTA   1         0      45 -1317.4
## - PF    1         0      45 -1316.9
## - FG    1         0      45 -1316.7
## <none>                   45 -1316.6
## + W     1         0      45 -1315.5
## + X3P   1         0      45 -1314.9
## + FTM   1         0      45 -1314.8
## + FGM   1         0      45 -1314.7
## + FGA   1         0      45 -1314.6
## + FT    1         0      45 -1314.6
## + X3PM  1         0      45 -1314.6
## + GP    1         0      45 -1314.6
## - X3PA  1         0      45 -1313.3
## - TOV   1    134131  134175  2995.8
## - OREB  1    385752  385796  3565.0
## - STL   1    878408  878453  4008.6
## - BLK   1   1278824 1278869  4211.0
## - DREB  1   1790046 1790091  4392.2
## - AST   1   3090713 3090758  4686.6
## - PTS   1   4016706 4016751  4827.9
## 
## Step:  AIC=-1317.39
## FP ~ PTS + FG + X3PA + OREB + DREB + AST + TOV + STL + BLK + 
##     PF
## 
##        Df Sum of Sq      RSS     AIC
## - FG    1         0       45 -1317.8
## - PF    1         0       45 -1317.7
## <none>                    45 -1317.4
## + FTA   1         0       45 -1316.6
## + W     1         0       45 -1316.2
## + FTM   1         0       45 -1316.1
## + FGM   1         0       45 -1316.1
## + FGA   1         0       45 -1316.0
## + X3P   1         0       45 -1315.7
## + FT    1         0       45 -1315.5
## + X3PM  1         0       45 -1315.4
## + GP    1         0       45 -1315.4
## - X3PA  1         0       45 -1315.2
## - TOV   1    136771   136816  3004.3
## - OREB  1    385807   385852  3563.1
## - STL   1    889630   889675  4013.4
## - BLK   1   1282303  1282347  4210.4
## - DREB  1   1821643  1821688  4399.7
## - AST   1   3113875  3113920  4688.6
## - PTS   1  10352305 10352350  5336.2
## 
## Step:  AIC=-1317.82
## FP ~ PTS + X3PA + OREB + DREB + AST + TOV + STL + BLK + PF
## 
##        Df Sum of Sq      RSS     AIC
## - PF    1         0       45 -1318.4
## <none>                    45 -1317.8
## + FG    1         0       45 -1317.4
## + W     1         0       45 -1316.9
## + FGA   1         0       45 -1316.8
## + FTA   1         0       45 -1316.7
## - X3PA  1         0       45 -1316.5
## + X3P   1         0       45 -1316.4
## + FGM   1         0       45 -1316.3
## + FTM   1         0       45 -1316.3
## + FT    1         0       45 -1315.8
## + X3PM  1         0       45 -1315.8
## + GP    1         0       45 -1315.8
## - TOV   1    137298   137343  3004.3
## - OREB  1    393692   393737  3572.0
## - STL   1    891740   891785  4012.7
## - BLK   1   1286571  1286616  4210.2
## - DREB  1   1824283  1824328  4398.5
## - AST   1   3115480  3115525  4686.9
## - PTS   1  10616670 10616716  5347.8
## 
## Step:  AIC=-1318.36
## FP ~ PTS + X3PA + OREB + DREB + AST + TOV + STL + BLK
## 
##        Df Sum of Sq      RSS     AIC
## <none>                    45 -1318.4
## - X3PA  1         0       45 -1318.1
## + PF    1         0       45 -1317.8
## + FG    1         0       45 -1317.7
## + FGA   1         0       45 -1317.4
## + FTA   1         0       45 -1317.2
## + FGM   1         0       45 -1316.9
## + FTM   1         0       45 -1316.8
## + W     1         0       45 -1316.8
## + X3P   1         0       45 -1316.8
## + GP    1         0       45 -1316.6
## + FT    1         0       45 -1316.5
## + X3PM  1         0       45 -1316.4
## - TOV   1    151828   151873  3056.5
## - OREB  1    427715   427760  3614.7
## - STL   1   1045904  1045949  4096.6
## - BLK   1   1378989  1379034  4245.6
## - DREB  1   1879285  1879330  4412.5
## - AST   1   3224748  3224793  4703.5
## - PTS   1  11269824 11269869  5377.9
## 
## Call:
## lm(formula = FP ~ PTS + X3PA + OREB + DREB + AST + TOV + STL + 
##     BLK, data = data)
## 
## Coefficients:
## (Intercept)          PTS         X3PA         OREB         DREB          AST  
##   0.0605561    1.0000420    0.0002367    1.2008375    1.1996273    1.5001085  
##         TOV          STL          BLK  
##  -1.0005360    2.9988904    3.0003412

5.2 Segundo modelo

Como pode ser visto no passo anterior, um modelo melhor para ser utilizado é

second_model <- lm(FP ~ PTS + X3PA + OREB + DREB + AST + TOV + STL + 
                    BLK, data = data)

summary(second_model)
## 
## Call:
## lm(formula = FP ~ PTS + X3PA + OREB + DREB + AST + TOV + STL + 
##     BLK, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.49288 -0.26134 -0.00109  0.24175  0.51034 
## 
## Coefficients:
##               Estimate Std. Error   t value Pr(>|t|)    
## (Intercept)  6.056e-02  2.094e-02     2.892  0.00398 ** 
## PTS          1.000e+00  8.696e-05 11499.633  < 2e-16 ***
## X3PA         2.367e-04  1.583e-04     1.495  0.13551    
## OREB         1.201e+00  5.360e-04  2240.282  < 2e-16 ***
## DREB         1.200e+00  2.555e-04  4695.931  < 2e-16 ***
## AST          1.500e+00  2.439e-04  6151.391  < 2e-16 ***
## TOV         -1.001e+00  7.496e-04 -1334.754  < 2e-16 ***
## STL          2.999e+00  8.560e-04  3503.251  < 2e-16 ***
## BLK          3.000e+00  7.459e-04  4022.591  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2919 on 530 degrees of freedom
## Multiple R-squared:      1,  Adjusted R-squared:      1 
## F-statistic: 6.308e+08 on 8 and 530 DF,  p-value: < 2.2e-16


Neste modelo é possível notar que as variáveis se tornam mais significativas para o modelo, mas ainda há uma sem significância, tentaremos então mais um stepAIC(), para verificar se há mais variáveis que podem ser retiradas.

stepAIC(second_model, direction = "both")
## Start:  AIC=-1318.36
## FP ~ PTS + X3PA + OREB + DREB + AST + TOV + STL + BLK
## 
##        Df Sum of Sq      RSS     AIC
## <none>                    45 -1318.4
## - X3PA  1         0       45 -1318.1
## - TOV   1    151828   151873  3056.5
## - OREB  1    427715   427760  3614.7
## - STL   1   1045904  1045949  4096.6
## - BLK   1   1378989  1379034  4245.6
## - DREB  1   1879285  1879330  4412.5
## - AST   1   3224748  3224793  4703.5
## - PTS   1  11269824 11269869  5377.9
## 
## Call:
## lm(formula = FP ~ PTS + X3PA + OREB + DREB + AST + TOV + STL + 
##     BLK, data = data)
## 
## Coefficients:
## (Intercept)          PTS         X3PA         OREB         DREB          AST  
##   0.0605561    1.0000420    0.0002367    1.2008375    1.1996273    1.5001085  
##         TOV          STL          BLK  
##  -1.0005360    2.9988904    3.0003412

5.3 Terceiro modelo

Como no segundo teste o stepAIC() não removeu uma variável não significativa do modelo, retiraremos manualmente.

third_model <- lm(FP ~ PTS + OREB + DREB + AST + TOV + STL + 
                  BLK, data = data)

summary(third_model)
## 
## Call:
## lm(formula = FP ~ PTS + OREB + DREB + AST + TOV + STL + BLK, 
##     data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.49763 -0.26277  0.00102  0.24086  0.50423 
## 
## Coefficients:
##               Estimate Std. Error   t value Pr(>|t|)    
## (Intercept)  0.0682998  0.0203112     3.363 0.000828 ***
## PTS          1.0001121  0.0000733 13643.963  < 2e-16 ***
## OREB         1.2005281  0.0004950  2425.122  < 2e-16 ***
## DREB         1.1996784  0.0002535  4733.144  < 2e-16 ***
## AST          1.5000666  0.0002425  6185.195  < 2e-16 ***
## TOV         -1.0006448  0.0007469 -1339.686  < 2e-16 ***
## STL          2.9993205  0.0008072  3715.787  < 2e-16 ***
## BLK          3.0001886  0.0007397  4055.878  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2923 on 531 degrees of freedom
## Multiple R-squared:      1,  Adjusted R-squared:      1 
## F-statistic: 7.193e+08 on 7 and 531 DF,  p-value: < 2.2e-16


Neste teste todas as variáveis utilizadas foram significativas para o modelo, entretanto ambos R2 estão altos demais, o que indica que o modelo possui multicolinearidade nas variáveis explicativas, logo será verificado o VIF (Fator de Inflação de Variância)2

vif(third_model)
##       PTS      OREB      DREB       AST       TOV       STL       BLK 
##  8.395494  4.192761  7.631762  6.220196 11.934523  3.295097  2.425499


Como evidenciado pelo VIF, algumas variáveis possuem valores muito altos de multicolinearidade, como TOV, AST, DREB e PTS. Dado que o número de turnovers é o que possui maior valor, logo ele está sendo redundante cm outra variável que está no modelo, então pode ser retirado sem haver perda de informações.

5.4 Quarto modelo

Retirando a variável TOV do modelo, obtemos:

fourth_model <- lm(FP ~ PTS + OREB + DREB + AST + STL + 
                  BLK, data = data)

summary(fourth_model)
## 
## Call:
## lm(formula = FP ~ PTS + OREB + DREB + AST + STL + BLK, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -79.830  -6.764   1.188   6.457  63.898 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -1.975305   1.176571  -1.679   0.0938 .  
## PTS          0.942316   0.003443 273.728   <2e-16 ***
## OREB         1.144180   0.028653  39.932   <2e-16 ***
## DREB         1.156817   0.014606  79.200   <2e-16 ***
## AST          1.293088   0.010860 119.069   <2e-16 ***
## STL          3.127896   0.046558  67.183   <2e-16 ***
## BLK          2.987612   0.042968  69.532   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 16.98 on 532 degrees of freedom
## Multiple R-squared:  0.9996, Adjusted R-squared:  0.9996 
## F-statistic: 2.486e+05 on 6 and 532 DF,  p-value: < 2.2e-16


Houve uma pequena diminuição nos valores de R2 e do R2 ajustado, mas novamente será testada a multicolinearidade das variáveis que ficaram.

vif(fourth_model)
##      PTS     OREB     DREB      AST      STL      BLK 
## 5.487332 4.162494 7.510166 3.695922 3.248514 2.425109


Agora a única variável que apresenta um valor vif > 5 é a variável relacionada aos rebotes defensivos do jogador, portanto, ela também será removida do modelo.

5.5 Quinto modelo

O modelo sem ‘DREB’ fica:

fifth_model <- lm(FP ~ PTS + OREB + AST + STL + 
                  BLK, data = data)

summary(fifth_model)
## 
## Call:
## lm(formula = FP ~ PTS + OREB + AST + STL + BLK, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -298.32  -20.96   -4.31   19.38  383.28 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  4.55198    4.19362   1.085    0.278    
## PTS          1.09144    0.01030 105.993   <2e-16 ***
## OREB         2.65223    0.07651  34.667   <2e-16 ***
## AST          1.41538    0.03841  36.850   <2e-16 ***
## STL          2.85068    0.16588  17.185   <2e-16 ***
## BLK          3.59690    0.15104  23.814   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 60.66 on 533 degrees of freedom
## Multiple R-squared:  0.9954, Adjusted R-squared:  0.9954 
## F-statistic: 2.327e+04 on 5 and 533 DF,  p-value: < 2.2e-16


Testanto o vif mais uma vez, para analisar se a multicolinearidade deixou de existir:

vif(fifth_model)
##      PTS     OREB      AST      STL      BLK 
## 3.845730 2.324354 3.621201 3.230153 2.347368


Dessa vez sim, agora as variáveis não possuem multicolinearidades e o valor de R2 com isso foi impactado, tendo seu valor reduzido. Com isso verificamos uma das pressuposições do modelo. Agora verifiquemos se os resíduos do modelo possuem uma distribuição normal, com o teste de Shapiro Wilk3:

shapiro.test(residuals(fifth_model))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(fifth_model)
## W = 0.91168, p-value < 2.2e-16


O p-valor do teste de Shapiro Wilk foi muito pequeno, portanto, não podemos rejeitar a hipótese nula do teste, logo os resíduos não possuem uma distribuição normal. Nesse caso, uma tentativa é aplicar o método de BoxCox, de transformação de variável, para testar se assim é possível chegar em um modelo que atende os pressupostos.

5.5.1 Aplicando a transformação de variável

# Realiza a transformação Box-Cox
boxcox_result <- boxcox(FP + 2 ~ 1, lambda = seq(-1, 3, 0.1))

z <- max(boxcox_result$y)
lamb <- boxcox_result$x[boxcox_result$y==z]
print(lamb)
## [1] 0.3737374
FP_ajust = (FP ^ lamb - 1) / lamb

5.6 Sexto modelo

Aplicando o modelo agora com a variável dependente transformada:

sixth_model <- lm(FP_ajust ~ PTS + OREB + AST + STL + 
                  BLK, data = data)

summary(sixth_model)
## 
## Call:
## lm(formula = FP_ajust ~ PTS + OREB + AST + STL + BLK, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -16.188  -2.517   1.398   3.222   8.182 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 1.351e+01  2.975e-01  45.425  < 2e-16 ***
## PTS         1.285e-02  7.287e-04  17.632  < 2e-16 ***
## OREB        4.887e-02  5.414e-03   9.028  < 2e-16 ***
## AST         1.025e-02  2.718e-03   3.771 0.000181 ***
## STL         1.300e-01  1.174e-02  11.072  < 2e-16 ***
## BLK         4.320e-02  1.069e-02   4.042 6.08e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.293 on 532 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.8997, Adjusted R-squared:  0.8987 
## F-statistic: 954.3 on 5 and 532 DF,  p-value: < 2.2e-16


Agora com o fantasy point ajustado continuamos com todas as variáveis sendo altamente significativas para explicar o modelo, com um valor de R2 ajustado alto. Então será testado novamente os pressupostos. Começando pelo VIF:

vif(sixth_model)
##      PTS     OREB      AST      STL      BLK 
## 3.837952 2.321009 3.615856 3.223173 2.344572
shapiro.test(residuals(sixth_model))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(sixth_model)
## W = 0.92187, p-value = 4.387e-16


Com isso podemos notar que os resíduos continuam sem possuir uma distribuição normal.

5.7 Sétimo modelo

Com vários testes a mais que realizei, pude perceber que ao invés de utilizar PTS no modelo, utilizar X3P e FT trazem resultados melhores para explicar a variável dependente além de fazer sentido variáveis que dizem sobre a porcentagem de acerto do jogador qualificarem um FP para o mesmo e a quantidade de jogos também, pois assim jogadores que jogaram muitos jogos e jogadores que jogaram poucos jogos, serão comparados de forma equivalente. Dessa forma o novo modelo fica:

seventh_model <- lm(FP_ajust ~ GP + X3P + FT + STL + 
                    DREB + AST + BLK, data = data, na.action = na.exclude)

summary(seventh_model)
## 
## Call:
## lm(formula = FP_ajust ~ GP + X3P + FT + STL + DREB + AST + BLK, 
##     data = data, na.action = na.exclude)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -10.8158  -2.1344   0.0624   1.9233  10.6882 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 4.223147   0.549544   7.685 7.47e-14 ***
## GP          0.213748   0.010055  21.258  < 2e-16 ***
## X3P         0.033908   0.010519   3.223  0.00134 ** 
## FT          0.052484   0.007149   7.342 8.00e-13 ***
## STL         0.060339   0.009487   6.360 4.37e-10 ***
## DREB        0.026474   0.001910  13.857  < 2e-16 ***
## AST         0.023452   0.001802  13.017  < 2e-16 ***
## BLK         0.043781   0.007608   5.755 1.47e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.163 on 530 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.9458, Adjusted R-squared:  0.945 
## F-statistic:  1320 on 7 and 530 DF,  p-value: < 2.2e-16


Verificando os pressupostos:

vif(seventh_model)
##       GP      X3P       FT      STL     DREB      AST      BLK 
## 3.282204 1.107854 1.218301 3.877625 3.694710 2.927050 2.188558
shapiro.test(residuals(seventh_model))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(seventh_model)
## W = 0.99669, p-value = 0.3381


Verificados dois dos pressupostos, falta agora apenas verificar a homocedasticidade, logo para isso aplica-se o bptest()4, dessa forma:

bptest(seventh_model)
## 
##  studentized Breusch-Pagan test
## 
## data:  seventh_model
## BP = 83.707, df = 7, p-value = 2.41e-15

5.7.1 Plots do modelo

5.7.1.1 Plot 1

fitted_values <- fitted(seventh_model)
residual_values <- residuals(seventh_model)

data$fitted_values <- fitted_values
data$residual_values <- residual_values

ggplot(data, mapping = aes(x = fitted_values, y =  residual_values)) +
  geom_point() +
  geom_hline(yintercept = 0, color = "red") +
  geom_smooth()

5.7.1.2 Plot 2

fitted_values <- fitted(seventh_model)
residual_values <- residuals(seventh_model)

data$fitted_values <- fitted_values
data$residual_values <- residual_values

par(mfrow = c(2,2))
plot(seventh_model)


Por fim, o p-valor do teste foi muito baixo, com um valor menor o que 0,05, o que leva a hipótese nula a ser rejeitada, concluindo que o modelo não é homocedástico. E não faz mais sentido fazer uma tranformação de variável novamente, dado que isso já foi feito uma vez.

6 Conclusão

Neste projeto foi buscado compreender a relação de diversas variáveis independentes com os fantasy points dos jogadores da NBA através de uma relação linear múltipla. No entanto, apesar dos esforços, com várias tentativas de modelos e a transformação pelo método BoxCox da variável dependente, não foi possível validar todos os pressupostos necessários, visto que a homocedasticidade dos resíduos foi violada. Isso indica que a variabilidade dos erros não é constante em todos os níveis das variáveis independentes, o que compromete a confiabilidade das estimativas dos coeficientes e a validade do modelo.
Os outros pressupostos foram atendidos satisfatoriamente, exceto pela homocedasticidade, o modelo foi bem especificado em termos de linearidade, independência dos resíduos e normalidade. No entanto, a heterocedasticidade observada é um indicativo de que o modelo atual não é o mais adequado para capturar a complexidade dos dados de FP da NBA. Isso pode ser devido à natureza altamente variável e imprevisível do desempenho dos jogadores, que é influenciado por inúmeros fatores tanto dentro quanto fora da quadra.
Portanto, a regresão linear múltipla pode oferecer um ponto de partida para a análise, outros tipos de regressões, não-lineares, por exemplo, podem ser uma boa forma de se conseguir ajustar um bom modelo, com confiabilidade.

7 Materiais de apoio


  1. Documentação do StepAIC: StepAIC documentation;↩︎

  2. Fator de inflação de variância (VIF): VIF documentation;↩︎

  3. Teste de Shapiro Wilk: Shapiro Test documentation;↩︎

  4. Breusch-Pagan teste: Bptest documentation.↩︎