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.
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:
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.
library(MASS)
library(tidyverse)
library(car)
library(ggplot2)
library(gridExtra)
library(lmtest)
library(knitr)
library(rmarkdown)
library(htmltools)
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.
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
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.
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
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
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
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.
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.
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.
# 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
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.
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
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()
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.
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.
Documentação do StepAIC: StepAIC documentation;↩︎
Fator de inflação de variância (VIF): VIF documentation;↩︎
Teste de Shapiro Wilk: Shapiro Test documentation;↩︎
Breusch-Pagan teste: Bptest documentation.↩︎