### Packages
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.3 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.3 ✔ tibble 3.2.1
## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(glmnet)
## Loading required package: Matrix
##
## Attaching package: 'Matrix'
##
## The following objects are masked from 'package:tidyr':
##
## expand, pack, unpack
##
## Loaded glmnet 4.1-8
library(lmtest)
## Loading required package: zoo
##
## Attaching package: 'zoo'
##
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(car)
## Loading required package: carData
##
## Attaching package: 'car'
##
## The following object is masked from 'package:dplyr':
##
## recode
##
## The following object is masked from 'package:purrr':
##
## some
library(corrplot)
## corrplot 0.92 loaded
library(leaps)
Data yang digunakan adalah data Air Quality Index di New Delhi, yang bersumber dari kaggle.com. Data ini terdiri dari 72 observasi dan 12 peubah di dalamnya.
aqi <- read.csv("D:/COLLEGE/SMT 5/Pengantar Sains Data/aqi.csv")
glimpse(aqi)
## Rows: 72
## Columns: 12
## $ X <int> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, …
## $ AQI <dbl> 30.2, 28.2, 26.6, 25.0, 26.0, 26.0, 26.0, 24.0, 23.0, …
## $ CO <dbl> 198.6027, 197.6013, 198.6027, 201.9405, 205.2784, 208.…
## $ datetime <chr> "2022-10-21:18", "2022-10-21:19", "2022-10-21:20", "20…
## $ no2 <dbl> 0.04685717, 0.04645554, 0.04685717, 0.04819594, 0.0488…
## $ o3 <dbl> 55.78995, 54.93164, 54.64554, 55.07469, 55.78995, 56.5…
## $ pm10 <dbl> 10.486722, 10.719325, 11.155578, 11.116206, 10.405250,…
## $ pm25 <dbl> 5.637410, 4.618169, 3.520902, 2.225919, 1.979471, 1.79…
## $ so2 <dbl> 0.3874302, 0.4097819, 0.4023313, 0.3762543, 0.3390014,…
## $ timestamp_local <chr> "2022-10-21T23:00:00", "2022-10-22T00:00:00", "2022-10…
## $ timestamp_utc <chr> "2022-10-21T18:00:00", "2022-10-21T19:00:00", "2022-10…
## $ ts <int> 1666375200, 1666378800, 1666382400, 1666386000, 166638…
sum(is.na(aqi))
## [1] 0
Dilakukan filtering data untuk memilih beberapa peubah yang relevan dengan analisis yang akan dilakukan.
y <- aqi$AQI
x1 <- aqi$CO
x2 <- aqi$no2
x3 <- aqi$o3
x4 <- aqi$pm10
x5 <- aqi$pm25
x6 <- aqi$so2
data <- cbind(y,x1,x2,x3,x4,x5,x6)
df <- as.data.frame(data)
head(df)
## y x1 x2 x3 x4 x5 x6
## 1 30.2 198.6027 0.04685717 55.78995 10.486722 5.637410 0.3874302
## 2 28.2 197.6013 0.04645554 54.93164 10.719325 4.618169 0.4097819
## 3 26.6 198.6027 0.04685717 54.64554 11.155578 3.520902 0.4023313
## 4 25.0 201.9405 0.04819594 55.07469 11.116206 2.225919 0.3762543
## 5 26.0 205.2784 0.04886533 55.78995 10.405250 1.979471 0.3390014
## 6 26.0 208.6163 0.05020411 56.50520 9.402518 1.792677 0.3129244
df.cor = cor(df)
corrplot.mixed(df.cor, lower = "ellipse", upper = "number",
tl.pos = "lt",diag = "l",tl.col = "black")
Berdasarkan matriks korelasi yang dihasilkan, peubah x3 yaitu O3
memiliki korelasi yang positif dan paling tinggi terhadap y (AQI). Dapat
dilihat pula peubah x1,x2,x3,dan x4 memiliki hubungan yang positif
terhadap y dan pada peubah x5 dan x6 memiliki hubungan yang cenderung
negatif terhadap y.
model.rlb <- lm(y ~., data = df)
summary(model.rlb)
##
## Call:
## lm(formula = y ~ ., data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.73339 -0.25673 0.03901 0.24063 0.52176
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.46525 3.49796 -0.419 0.67668
## x1 0.01142 0.01674 0.682 0.49769
## x2 16.32158 5.28647 3.087 0.00297 **
## x3 0.45725 0.01196 38.241 < 2e-16 ***
## x4 -0.09697 0.02868 -3.381 0.00123 **
## x5 1.36334 0.08151 16.726 < 2e-16 ***
## x6 -9.45886 1.68392 -5.617 4.36e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3027 on 65 degrees of freedom
## Multiple R-squared: 0.991, Adjusted R-squared: 0.9902
## F-statistic: 1194 on 6 and 65 DF, p-value: < 2.2e-16
Berdasarkan hasil perhitungan di atas, didapatkan model regresi sebagai berikut : \[yduga=-1.46525+0.01142x1+16.32158x2+0.45725x3-0.09697x4+1.36334x5-9.45886x6+e\]. Berdasarkan ringkasan model dapat diketahui bahwa hasil uji F memiliki p-value < \(\alpha\) (5%). Artinya, minimal terdapat satu variabel yang berpengaruh nyata terhadap model.
Diperoleh pula hasil uji t-parsial yaitu didapat beberapa parameter regresi yang signifikan dengan memiliki p-value < \(\alpha\) (5%) yaitu koefisien peubah x2,x3,x4,x5, dan x6 pada taraf nyata 5%.
Selanjutnya dapat dilihat juga nilai R^2=99.1. Artinya, sebesar 99.1% keragaman y dapat dijelaskan oleh peubah-peubah prediktornya.
#Sisaan dan fitted value
sisaan<- residuals(model.rlb)
fitValue<- predict(model.rlb)
#Normal Q-Q Plot
qqnorm(sisaan);qqline(sisaan, col = "blue", lwd = 2)
#Plot Residual vs Fitted Value
plot(fitValue, sisaan, xlab = "Residual", ylab = "Fitted Values", main = "Residual vs Fitted Values", pch = 20);abline(h = 0, lwd = 1,col = "coral")
#Plot Residual vs Order
plot(sisaan, type = 'o', xlab = "Residual", ylab = "Order",
main = "Residual vs Order", pch = 20);abline(h = 0, lwd = 1, col = "purple")
#ACF dan PACF
par(mfrow = c(1,2))
acf(sisaan)
pacf(sisaan)
1)Berdasarkan Normal Q-Q Plot yang dihasilkan, terlihat bahwa sebaran titik-titik data cenderung menjauhi garis yang berarti mengindikasikan sisaan tidak menyebar normal. Namun hal ini akan diperiksa kembali melalui uji formal.
2)Berdasarkan Plot Residual vs Fitted Values yang dihasilkan, terlihat bahwa sisaan tidak menyebar secara acak dan memiliki lebar pita yang tidak sama yang berarti ragam sisaan tidak homogen. Namun hal ini akan diperiksa kembali melalui uji formal.
3)Berdasarkan Plot Residual vs Order yang dihasilkan, terlihat bahwa sisaan tidak menyebar secara acak melainkan memiliki pola naik turun (fluktuatif) yang berarti sisaan tidak saling bebas atau terindikasi adanya autokorelasi.
4)Berdasarkan plot ACF dan PACF yang dihasilkan, terlihat bahwa selain pada lag 0, tidak terdapat garis vertikal yang melewati batas signifikan. Oleh karena itu dapat disimpulkan bahwa tidak terdapat autokorelasi. Hal ini berbanding terbalik dengan hasil plot residual vs order dan hal ini akan diperiksa kembali melalui uji formal.
#Nilai harapan sisaan = 0
t.test(model.rlb$residuals,
mu = 0,
conf.level = 0.95)
##
## One Sample t-test
##
## data: model.rlb$residuals
## t = -4.8306e-17, df = 71, p-value = 1
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -0.06806181 0.06806181
## sample estimates:
## mean of x
## -1.648891e-18
\(H_0\) : Nilai harapan sisaan sama dengan nol
\(H_1\) : Nilai harapan sisaan tidak sama dengan nol
Berdasarkan hasil perhitungan di atas, diperoleh p-value = 1 lebih besar dari 0.05 sehingga tak tolak H0 yang artinya nilai harapan sisaan sama dengan nol.
#Uji Normalitas
ks.test(model.rlb$residuals, "pnorm", mean=mean(model.rlb$residuals), sd=sd(model.rlb$residuals))
##
## Exact one-sample Kolmogorov-Smirnov test
##
## data: model.rlb$residuals
## D = 0.084463, p-value = 0.652
## alternative hypothesis: two-sided
\(H_0\) : Sisaan menyebar normal
\(H_1\) : Sisaan tidak menyebar normal
Berdasarkan hasil perhitungan di atas, diperoleh p-value = 0.652 lebih besar dari 0.05 sehingga tak tolak H0 yang artinya sisaan menyebar normal.
#Uji Kehomogenan Ragam
bptest(model.rlb)
##
## studentized Breusch-Pagan test
##
## data: model.rlb
## BP = 11.684, df = 6, p-value = 0.0694
\(H_0\) : Ragam sisaan homogen
\(H_1\) : Ragam sisaan tidak homogen
Berdasarkan hasil perhitungan di atas, diperoleh p-value = 0.0694 lebih besar dari 0.05 sehingga tak tolak H0 yang artinya ragam sisaan homogen.
#Uji Autokorelasi
dwtest(model.rlb)
##
## Durbin-Watson test
##
## data: model.rlb
## DW = 1.9256, p-value = 0.1541
## alternative hypothesis: true autocorrelation is greater than 0
\(H_0\) : Tidak terdapat autokorelasi
\(H_1\) : Terdapat autokorelasi
Berdasarkan hasil perhitungan di atas, diperoleh p-value = 0.1541 lebih besar dari 0.05 sehingga tak tolak H0 yang artinya tidak terdapat autokorelasi.
#Uji Multikolinieritas
vif(model.rlb)
## x1 x2 x3 x4 x5 x6
## 4.429015 2.591475 4.582356 1.495781 2.218728 4.382814
Berdasarkan hasil di atas, nilai vif < 10 pada masing-masing peubah prediktor sehingga tidak mengindikasikan adanya multikolinearitas.
library(olsrr)
##
## Attaching package: 'olsrr'
## The following object is masked from 'package:datasets':
##
## rivers
model.bs <- ols_step_best_subset(model.rlb)
model.bs
## Best Subsets Regression
## --------------------------------
## Model Index Predictors
## --------------------------------
## 1 x3
## 2 x3 x5
## 3 x3 x5 x6
## 4 x3 x4 x5 x6
## 5 x2 x3 x4 x5 x6
## 6 x1 x2 x3 x4 x5 x6
## --------------------------------
##
## Subsets Regression Summary
## -----------------------------------------------------------------------------------------------------------------------------------
## Adj. Pred
## Model R-Square R-Square R-Square C(p) AIC SBIC SBC MSEP FPE HSP APC
## -----------------------------------------------------------------------------------------------------------------------------------
## 1 0.9479 0.9472 0.9462 308.7050 157.3962 -51.4749 164.2262 35.5058 0.5068 0.0071 0.0551
## 2 0.9838 0.9833 0.9782 51.3849 75.4439 -131.5020 84.5506 11.2267 0.1624 0.0023 0.0176
## 3 0.9884 0.9878 0.9858 20.2210 53.5390 -151.9911 64.9223 8.1751 0.1198 0.0017 0.0130
## 4 0.9894 0.9888 0.9872 14.5514 48.6642 -156.2645 62.3242 7.5432 0.1120 0.0016 0.0122
## 5 0.9909 0.9903 0.9892 5.4651 39.4001 -163.7491 55.3368 6.5500 0.0985 0.0014 0.0107
## 6 0.9910 0.9902 0.989 7.0000 40.8868 -161.9558 59.1002 6.6051 0.1005 0.0014 0.0109
## -----------------------------------------------------------------------------------------------------------------------------------
## AIC: Akaike Information Criteria
## SBIC: Sawa's Bayesian Information Criteria
## SBC: Schwarz Bayesian Criteria
## MSEP: Estimated error of prediction, assuming multivariate normality
## FPE: Final Prediction Error
## HSP: Hocking's Sp
## APC: Amemiya Prediction Criteria
Berdasarkan hasil variable selection menggunakan metode best subset, model ke-5 menghasilkan nilai adjusted R-square paling tinggi dan nilai AIC terkecil. Sehingga model ke-5 merupakan model terbaik yang terdiri dari 5 peubah prediktor yaitu x2, x3, x4, x5 dan x6.
model.fwd <- ols_step_forward_p(model.rlb)
model.fwd
##
## Selection Summary
## --------------------------------------------------------------------------
## Variable Adj.
## Step Entered R-Square R-Square C(p) AIC RMSE
## --------------------------------------------------------------------------
## 1 x3 0.9479 0.9472 308.7050 157.3962 0.7022
## 2 x5 0.9838 0.9833 51.3849 75.4439 0.3948
## 3 x6 0.9884 0.9878 20.2210 53.5390 0.3369
## 4 x4 0.9894 0.9888 14.5514 48.6642 0.3236
## 5 x2 0.9909 0.9903 5.4651 39.4001 0.3015
## --------------------------------------------------------------------------
Berdasarkan hasil metode forward di atas, peubah yang pertama kali dimasukkan ke dalam model yaitu X3 dilanjutkan dengan X5,x6,x4 dan X2. Penambahan X5 setelah X3 dans seterusnya menghasilkan perubahan kriteria yang besar (adj R-square yang menjadi semakin tinggi) dan model menjadi lebih baik.
model.bwd <- ols_step_backward_p(model.rlb)
model.bwd
##
##
## Elimination Summary
## -----------------------------------------------------------------------
## Variable Adj.
## Step Removed R-Square R-Square C(p) AIC RMSE
## -----------------------------------------------------------------------
## 1 x1 0.9909 0.9903 5.4651 39.4001 0.3015
## -----------------------------------------------------------------------
Berdasarkan hasil metode backward di atas, hanya terdapat satu peubah penjelas yang dikeluarkan dari model penuh, yaitu peubah X1. Model akhir yang diperoleh dari metode ini sama dengan model akhir (step 5) dari forward selection.
Dari ketiga metode variable selection sebelumnya, menghasilkan model yang sama yaitu dengan peubah x2,x3,x4,x5,dan x6. Sehingga diperoleh model baru sebagai berikut :
new.model <- lm(y ~ x2+x3+x4+x5+x6, data = df)
summary(new.model)
##
## Call:
## lm(formula = y ~ x2 + x3 + x4 + x5 + x6, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.73766 -0.26339 0.03505 0.23931 0.55032
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.81836 1.00697 0.813 0.419315
## x2 17.14110 5.12717 3.343 0.001368 **
## x3 0.46048 0.01094 42.092 < 2e-16 ***
## x4 -0.10275 0.02729 -3.765 0.000357 ***
## x5 1.36303 0.08118 16.791 < 2e-16 ***
## x6 -9.90519 1.54522 -6.410 1.79e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3015 on 66 degrees of freedom
## Multiple R-squared: 0.9909, Adjusted R-squared: 0.9903
## F-statistic: 1445 on 5 and 66 DF, p-value: < 2.2e-16
Berdasarkan hasil perhitungan di atas, didapatkan model regresi sebagai berikut : \[yduga=0.81836+17.14110x2+0.46048 x3-0.10275x4+1.36303x5-9.90519x6+e\]. Berdasarkan ringkasan model dapat diketahui bahwa hasil uji F memiliki p-value < \(\alpha\) (5%). Artinya, minimal terdapat satu variabel yang berpengaruh nyata terhadap model.
Diperoleh pula hasil uji t-parsial yaitu didapat seluruh parameter regresi kecuali intercept memiliki p-value < \(\alpha\) (5%) sehingga signifikan pada taraf nyata 5%.
Selanjutnya dapat dilihat juga nilai R^2=99.09%. Artinya, sebesar 99.09% keragaman y dapat dijelaskan oleh peubah-peubah prediktornya.
x <- cbind(x1,x2,x3,x4,x5,x6)
y <- df$y
cv.r<-cv.glmnet(x,y,alpha=0);plot(cv.r)
best.lr <-cv.r$lambda.min
bestridge <- glmnet(x,y,alpha=0,lambda=best.lr);coef(bestridge)
## 7 x 1 sparse Matrix of class "dgCMatrix"
## s0
## (Intercept) -9.25162966
## x1 0.08367469
## x2 34.55907448
## x3 0.33780048
## x4 -0.05536372
## x5 1.07011621
## x6 -10.52153546
Model Regresi Ridge :
\[y_duga=-9.25162966+0.08367469x134.55907448x2+0.33780048x3-0.05536372x4+1.07011621x5-10.52153546x6+e\] Interpretasi : - \(Intercept\) : nilai dugaan rataan y (AQI) ketika seluruh peubah x bernilai 0 sebesar -9.25162966. - \(x1 (CO)\) : nilai dugaan perubahan dugaan rataan y (AQI) sebesar 0.08367469 pada setiap kenaikan satu satuan variabel x1 (CO). - \(x2 (no2)\) : nilai dugaan perubahan dugaan rataan y (AQI) sebesar 34.55907448 pada setiap kenaikan satu satuan variabel x2 (no2). - \(x3 (o3)\) : nilai dugaan perubahan dugaan rataan y (AQI) sebesar 0.33780048 pada setiap kenaikan satu satuan variabel x3 (o3). - \(x4 (pm10)\) : nilai dugaan perubahan dugaan rataan y (AQI) sebesar -0.05536372 pada setiap kenaikan satu satuan variabel x4 (pm10). - \(x5 (pm25)\) : nilai dugaan perubahan dugaan rataan y (AQI) sebesar 1.07011621 pada setiap kenaikan satu satuan variabel x5 (pm25). - \(x6 (so2)\) : nilai dugaan perubahan dugaan rataan y (AQI) sebesar -10.52153546 pada setiap kenaikan satu satuan variabel x6 (so2).
rsq<-function(bestmodel,bestlambda,x,y){
#y duga
y.duga <- predict(bestmodel, s = bestlambda, newx = x)
#JKG dan JKT
jkt <- sum((y - mean(y))^2)
jkg <- sum((y.duga- y)^2)
#find R-Squared
rsq <- 1 - jkg/jkt
return(rsq)
}
rsq(bestridge,best.lr,x,y)
## [1] 0.9744175
Diperoleh nilai R-Squre model ridge sebesar 97.44%
cv.l<-cv.glmnet(x,y,alpha=1);plot(cv.l)
best.ll<-cv.l$lambda.min
bestlasso<-glmnet(x,y,alpha=1,lambda=best.ll);coef(bestlasso)
## 7 x 1 sparse Matrix of class "dgCMatrix"
## s0
## (Intercept) -1.79850521
## x1 0.01216225
## x2 15.29552875
## x3 0.45776935
## x4 -0.08576635
## x5 1.32314730
## x6 -8.94032751
Model Regresi Lasso :
\[y_duga=-1.79850521+0.01216225x1+15.29552875x2+0.45776935x3-0.08576635x4+1.323147301x5-8.94032751x6+e\] Interpretasi : - \(Intercept\) : nilai dugaan rataan y (AQI) ketika seluruh peubah x bernilai 0 sebesar -1.79850521. - \(x1 (CO)\) : nilai dugaan perubahan dugaan rataan y (AQI) sebesar 0.01216225 pada setiap kenaikan satu satuan variabel x1 (CO). - \(x2 (no2)\) : nilai dugaan perubahan dugaan rataan y (AQI) sebesar 15.29552875 pada setiap kenaikan satu satuan variabel x2 (no2). - \(x3 (o3)\) : nilai dugaan perubahan dugaan rataan y (AQI) sebesar 0.45776935 pada setiap kenaikan satu satuan variabel x3 (o3). - \(x4 (pm10)\) : nilai dugaan perubahan dugaan rataan y (AQI) sebesar -0.08576635 pada setiap kenaikan satu satuan variabel x4 (pm10). - \(x5 (pm25)\) : nilai dugaan perubahan dugaan rataan y (AQI) sebesar 1.323147301 pada setiap kenaikan satu satuan variabel x5 (pm25). - \(x6 (so2)\) : nilai dugaan perubahan dugaan rataan y (AQI) sebesar -8.94032751 pada setiap kenaikan satu satuan variabel x6 (so2).
rsq(bestlasso,best.ll,x,y)
## [1] 0.9909643
Diperoleh nilai R-Squre model ridge sebesar 99.09%
#### R-Square model regresi awal
summary(model.rlb)$r.squared
## [1] 0.9910094
#### R-Square model hasil variable selection
summary(new.model)$r.squared
## [1] 0.990945
#### R-Square model regresi ridge
rsq(bestridge,best.lr,x,y)
## [1] 0.9744175
#### R-Square model regresi lasso
rsq(bestlasso,best.ll,x,y)
## [1] 0.9909643
Berdasarkan nilai R-Square dari masing-masing model, diketahui model regresi awal memiliki nilai R-Square paling tinggi, sehingga model awal (model regresi klasik awal) merupakan model regresi terbaik.
\[yduga=-1.46525+0.01142x1+16.32158x2+0.45725x3-0.09697x4+1.36334x5-9.45886x6+e\].
Interpretasi : - \(Intercept\) : nilai dugaan rataan y (AQI) ketika seluruh peubah x bernilai 0 sebesar -1.46525. - \(x1 (CO)\) : nilai dugaan perubahan dugaan rataan y (AQI) sebesar 0.01142 pada setiap kenaikan satu satuan variabel x1 (CO). - \(x2 (no2)\) : nilai dugaan perubahan dugaan rataan y (AQI) sebesar 16.32158 pada setiap kenaikan satu satuan variabel x2 (no2). - \(x3 (o3)\) : nilai dugaan perubahan dugaan rataan y (AQI) sebesar 0.45725 pada setiap kenaikan satu satuan variabel x3 (o3). - \(x4 (pm10)\) : nilai dugaan perubahan dugaan rataan y (AQI) sebesar -0.09697 pada setiap kenaikan satu satuan variabel x4 (pm10). - \(x5 (pm25)\) : nilai dugaan perubahan dugaan rataan y (AQI) sebesar 1.36334 pada setiap kenaikan satu satuan variabel x5 (pm25). - \(x6 (so2)\) : nilai dugaan perubahan dugaan rataan y (AQI) sebesar -9.45886 pada setiap kenaikan satu satuan variabel x6 (so2).