FIFA 21 adalah sebuah video gim simulasi sepakbola yang diterbitkan oleh Electronics Arts. Gim ini adalah seri ke-28 dari seri FIFA, yang dirilis pada 9 Oktober 2020 di berbagai platform. Ada beberapa jenis permainan dalam gim ini, seperti Ultimate Team, Career Mode, VOLTA Football, Pro Clubs, dll. Kualitas seorang pemain pada gim ini dilihat dari Overall Ratingnya. Overall Rating ditentukan dari beberapa attribut dari seorang pemain dalam gim ini. Manchester United adalah sebuah klub sepakbola profesional yang berbasis di Old Trafford, Greater Manchester, Inggris. Klub ini berkompetisi di Premier League, kompetisi tertinggi di sepakbola Inggris. Klub ini juga menjadi salah satu klub dengan pendukung terbanyak di dunia. Beberapa pemain yang merumput saat ini adalah Marcus Rashford, Bruno Fernandes, dan Aaron Wan-Bissaka

Memanggil Library yang akan digunakan

library(car)
## Loading required package: carData
library(corrplot)
## corrplot 0.92 loaded
library(MASS)
library(olsrr)
## 
## Attaching package: 'olsrr'
## The following object is masked from 'package:MASS':
## 
##     cement
## The following object is masked from 'package:datasets':
## 
##     rivers
library(leaps)
library(plyr)

Memanggil dataset, data cleaning dan eksplorasi data

Dataset ini diambil dari web futwiz.com, yang merupakan salah satu website yang menyediakan database overall rating seluruh pemain yang ada di FIFA 21. Untuk kasus kali ini, diambil data pemain Manchester United, kecuali penjaga gawang. Didapatkan 29 data dengan peubah respon OVR dan 6 peubah penjelas (PAC, SHO, PAS, DRI, DEF, dan PHY).

datamu <- read.csv("RatingMUFIFA21.csv")
datamu <- datamu[,-1]
datamu$POS <- NULL
summary(datamu)
##       OVR             PAC             SHO             PAS       
##  Min.   :63.00   Min.   :44.00   Min.   :36.00   Min.   :54.00  
##  1st Qu.:75.00   1st Qu.:69.00   1st Qu.:53.00   1st Qu.:65.00  
##  Median :79.00   Median :76.00   Median :68.00   Median :70.00  
##  Mean   :77.86   Mean   :73.72   Mean   :64.55   Mean   :70.59  
##  3rd Qu.:83.00   3rd Qu.:81.00   3rd Qu.:78.00   3rd Qu.:76.00  
##  Max.   :87.00   Max.   :95.00   Max.   :85.00   Max.   :88.00  
##       DRI             DEF             PHY       
##  Min.   :56.00   Min.   :27.00   Min.   :44.00  
##  1st Qu.:70.00   1st Qu.:55.00   1st Qu.:68.00  
##  Median :76.00   Median :71.00   Median :74.00  
##  Mean   :74.34   Mean   :63.86   Mean   :72.59  
##  3rd Qu.:80.00   3rd Qu.:77.00   3rd Qu.:78.00  
##  Max.   :87.00   Max.   :81.00   Max.   :85.00
korelasi <- cor(datamu)
korelasi
##            OVR         PAC        SHO         PAS         DRI         DEF
## OVR 1.00000000  0.05087659  0.5743234  0.79088593  0.70854738  0.15618077
## PAC 0.05087659  1.00000000  0.1956354  0.04403422  0.39214704 -0.35155858
## SHO 0.57432335  0.19563540  1.0000000  0.71454763  0.74975955 -0.45284949
## PAS 0.79088593  0.04403422  0.7145476  1.00000000  0.84068932 -0.01385047
## DRI 0.70854738  0.39214704  0.7497595  0.84068932  1.00000000 -0.30891585
## DEF 0.15618077 -0.35155858 -0.4528495 -0.01385047 -0.30891585  1.00000000
## PHY 0.51093113 -0.11282645  0.1158662  0.17071198  0.07982555  0.54418541
##             PHY
## OVR  0.51093113
## PAC -0.11282645
## SHO  0.11586622
## PAS  0.17071198
## DRI  0.07982555
## DEF  0.54418541
## PHY  1.00000000
corrplot(korelasi, method = "number")

## Pemodelan

model.reg <- lm(OVR~.,data=datamu)
summary(model.reg)
## 
## Call:
## lm(formula = OVR ~ ., data = datamu)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.6814 -1.4540 -0.3747  1.2559  6.1886 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 17.7725418  8.0541373   2.207   0.0381 *
## PAC         -0.0184793  0.0669819  -0.276   0.7852  
## SHO         -0.0241283  0.0915084  -0.264   0.7945  
## PAS          0.3570118  0.2064369   1.729   0.0977 .
## DRI          0.2360556  0.2118877   1.114   0.2773  
## DEF          0.0009604  0.0765219   0.013   0.9901  
## PHY          0.2782687  0.1018399   2.732   0.0122 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.17 on 22 degrees of freedom
## Multiple R-squared:  0.7893, Adjusted R-squared:  0.7318 
## F-statistic: 13.73 on 6 and 22 DF,  p-value: 1.848e-06
vif(model.reg)
##      PAC      SHO      PAS      DRI      DEF      PHY 
## 1.773661 4.792689 8.831228 8.131389 4.354707 2.252408
ols_vif_tol(model.reg)
##   Variables Tolerance      VIF
## 1       PAC 0.5638056 1.773661
## 2       SHO 0.2086511 4.792689
## 3       PAS 0.1132345 8.831228
## 4       DRI 0.1229802 8.131389
## 5       DEF 0.2296366 4.354707
## 6       PHY 0.4439693 2.252408
ols_eigen_cindex(model.reg)
##     Eigenvalue Condition Index    intercept          PAC          SHO
## 1 6.8647911497        1.000000 1.128267e-04 0.0002874929 0.0001949268
## 2 0.0875621722        8.854324 7.698041e-05 0.0062567833 0.0278543418
## 3 0.0287072010       15.463872 5.119813e-03 0.3093293064 0.0795899462
## 4 0.0091083976       27.453181 3.408437e-04 0.0018807068 0.0592508928
## 5 0.0059247449       34.039160 4.648752e-01 0.3710300414 0.2102082703
## 6 0.0031368565       46.780659 5.281426e-01 0.0034706310 0.4882977007
## 7 0.0007694782       94.452945 1.331735e-03 0.3077450382 0.1346039213
##            PAS          DRI          DEF          PHY
## 1 3.394626e-05 2.915948e-05 0.0002734593 0.0001314793
## 2 2.240934e-04 5.350924e-04 0.0966256384 0.0025797536
## 3 3.655875e-03 4.537027e-07 0.0091187916 0.0014496207
## 4 4.589369e-02 1.556647e-02 0.0394523803 0.3793647296
## 5 7.814963e-04 5.648051e-03 0.3094561140 0.0350829728
## 6 4.158057e-02 8.706624e-02 0.1856119501 0.4110546614
## 7 9.078303e-01 8.911545e-01 0.3594616663 0.1703367825

Subset Regression Modeling

subreg <- regsubsets(OVR ~ ., data = datamu)
summ_subreg <- summary(subreg)
summ_subreg
## Subset selection object
## Call: regsubsets.formula(OVR ~ ., data = datamu)
## 6 Variables  (and intercept)
##     Forced in Forced out
## PAC     FALSE      FALSE
## SHO     FALSE      FALSE
## PAS     FALSE      FALSE
## DRI     FALSE      FALSE
## DEF     FALSE      FALSE
## PHY     FALSE      FALSE
## 1 subsets of each size up to 6
## Selection Algorithm: exhaustive
##          PAC SHO PAS DRI DEF PHY
## 1  ( 1 ) " " " " "*" " " " " " "
## 2  ( 1 ) " " " " "*" " " " " "*"
## 3  ( 1 ) " " " " "*" "*" " " "*"
## 4  ( 1 ) " " "*" "*" "*" " " "*"
## 5  ( 1 ) "*" "*" "*" "*" " " "*"
## 6  ( 1 ) "*" "*" "*" "*" "*" "*"

Plot R-squared, Adjusted R-squared dan Cp Mallows

plot(summ_subreg$rsq, xlab = "Number of Variables", ylab = "R-squared", type
     = "l")

Terlihat pada plot bahwa kenaikan 𝑅-Squared dari k = 1 ke k = 2 paling signifikan dibandingkan dengan yang lainnya sehingga model yang dipilih adalah ketika k = 2. Namun, belum dapat memastikan peubah penjelas mana saja akan menghasilkan model terbaik.

plot(summ_subreg$adjr2, xlab = "Number of Variables", ylab = "Adjusted RSq",
     type = "l")
adj_r2_max = which.max(summ_subreg$adjr2)
points(adj_r2_max, summ_subreg$adjr2[adj_r2_max], col ="red", cex = 2, pch =
         20)

Terlihat pada plot bahwa nilai adjusted r-squared terbesar adalah ketika peubah penjelas yang diikutkan sebanyak tiga peubah. Namun, belum dapat memastikan peubah penjelas mana saja akan menghasilkan model terbaik.

plot(summ_subreg$cp, xlab = "Number of Variables", ylab = "Cp", type = "l")
cp_min = which.min(summ_subreg$cp)
points(cp_min, summ_subreg$cp[cp_min], col = "red", cex = 2, pch = 20)

rsq <- as.matrix(summ_subreg$rsq)
rss <- as.matrix(summ_subreg$rss)
adjr2 <- as.matrix(summ_subreg$adjr2)
cp <- as.matrix(summ_subreg$cp)
summ <- as.table(cbind(as.matrix(summ_subreg$outmat),
                       rsq, rss, adjr2, cp))
colnames(summ) <- c("PAC", "SHO", "PAS", "DRI", "DEF", "PHY", "rsq", "rss", "adjr2", "cp")
par(mfrow = c(1,2))
plot(subreg, scale = "adjr2")
plot(subreg, scale = "Cp")

Berdasarkan kriteria Adjusted R-squared, model yang dipilih adalah model dengan tiga peubah penjelas, yaitu PAS, DRI, dan PHY. Berdasarkan kriteria R-squared dan Cp Mallows, model yang dipilih adalah model dengan dua peubah penjelas, yaitu PAS dan PHY.

reg1 <- lm(OVR ~ PAS + DRI + PHY, datamu)
reg2 <- lm(OVR ~ PAS + PHY, datamu)
summary(reg1)
## 
## Call:
## lm(formula = OVR ~ PAS + DRI + PHY, data = datamu)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -5.730 -1.490 -0.522  1.412  6.239 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 18.02874    6.74912   2.671 0.013099 *  
## PAS          0.37154    0.12322   3.015 0.005821 ** 
## DRI          0.17944    0.13029   1.377 0.180623    
## PHY          0.27921    0.06539   4.270 0.000247 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.989 on 25 degrees of freedom
## Multiple R-squared:  0.7872, Adjusted R-squared:  0.7617 
## F-statistic: 30.83 on 3 and 25 DF,  p-value: 1.464e-08
summary(reg2)
## 
## Call:
## lm(formula = OVR ~ PAS + PHY, data = datamu)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.0146 -1.8321 -0.4417  1.8705  6.0888 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 22.06225    6.18465   3.567 0.001429 ** 
## PAS          0.51445    0.06760   7.610 4.45e-08 ***
## PHY          0.26846    0.06603   4.066 0.000394 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.04 on 26 degrees of freedom
## Multiple R-squared:  0.7711, Adjusted R-squared:  0.7534 
## F-statistic: 43.78 on 2 and 26 DF,  p-value: 4.748e-09
PRESS <- function(model) {
  i <- residuals(model)/(1 - lm.influence(model)$hat)
  sum(i^2)
}

pred_r_squared <- function(linear.model) {
  lm.anova <- anova(linear.model)
  tss <- sum(lm.anova$'Sum Sq')
  pred.r.squared <- 1-PRESS(linear.model)/(tss)
  
  return(pred.r.squared)
}

model_fit_stats <- function(linear.model) {
  r.sqr <- summary(linear.model)$r.squared
  adj.r.sqr <- summary(linear.model)$adj.r.squared
  pre.r.sqr <- pred_r_squared(linear.model)
  PRESS <- PRESS(linear.model)
return.df <- data.frame(r.squared = r.sqr, adj.r.squared = adj.r.sqr, pred.r.squared = pre.r.sqr, press = PRESS)
  return(return.df)
}
ldply(list(reg1, reg2), model_fit_stats)
##   r.squared adj.r.squared pred.r.squared    press
## 1 0.7872033     0.7616676      0.6565108 360.4742
## 2 0.7710563     0.7534453      0.6841665 331.4509

Model yang dipilih adalah model dengan nilai PRESS terkecil dan nilai Predictive R-squared tertinggi. Model yang memenuhi syarat tersebut adalah model reg2.

Model yang didapat adalah: \(OVR = 22.06225 + 0.51445PAS + 0.26846PHY\)

Note: Proyek ini adalah Tugaa Akhir yang saya buat untuk mata kuliah Analisis Regresi