Konsumsi listrik merupakan bagian penting dari kehidupan masyarakat modern. Hampir seluruh aktivitas manusia bergantung pada energi listrik, mulai dari kebutuhan rumah tangga, transportasi, hingga kegiatan industri. Karena itu, memahami faktor-faktor yang memengaruhi besar kecilnya konsumsi listrik menjadi hal yang penting.
Salah satu faktor yang sering berpengaruh terhadap penggunaan listrik adalah kondisi cuaca. Perubahan suhu, kelembapan udara, curah hujan, dan kecepatan angin dapat memengaruhi pola konsumsi listrik. Misalnya, saat suhu udara meningkat, penggunaan pendingin ruangan biasanya bertambah, sedangkan pada hari hujan atau kelembapan tinggi, konsumsi listrik cenderung menurun.
Namun, dalam menganalisis hubungan antara variabel-variabel cuaca tersebut, sering muncul masalah multikolinearitas, yaitu kondisi ketika antar variabel saling berkorelasi tinggi. Hal ini dapat menyebabkan model regresi linier biasa menjadi kurang stabil dan menghasilkan estimasi yang tidak akurat.
Untuk mengatasi hal tersebut, digunakan dua metode pendekatan, yaitu:
Regresi Komponen Utama (Principal Component Regression / PCR) : metode ini mengubah variabel-variabel asal menjadi beberapa komponen utama yang tidak saling berkorelasi. Dengan cara ini, pengaruh multikolinearitas dapat dikurangi tanpa kehilangan banyak informasi dari data.
Regresi LASSO (Least Absolute Shrinkage and Selection Operator) : metode ini menambahkan penalti terhadap besar kecilnya koefisien regresi, sehingga beberapa koefisien dapat menjadi nol. Pendekatan ini membantu dalam menyederhanakan model dengan hanya mempertahankan variabel yang paling berpengaruh.
Dalam analisis ini, digunakan data simulasi yang menggambarkan faktor-faktor cuaca seperti suhu, kelembapan, kecepatan angin, dan curah hujan untuk memprediksi tingkat konsumsi listrik. Tujuannya adalah untuk membandingkan kinerja model PCR serta LASSO.
Data yang digunakan untuk membandingkan metode yaitu data simulasi
yang merepresentasikan hubungan antara variabel-variabel cuaca dan
tingkat konsumsi listrik. Pertama, data dihasilkan secara acak
menggunakan fungsi rnorm() dan rpois() untuk
membuat empat variabel prediktor, yaitu suhu, kelembapan, angin, dan
hujan, masing-masing dengan distribusi dan parameter yang mencerminkan
kondisi realistis. Selanjutnya, variabel listrik dibentuk sebagai
variabel respon yang dipengaruhi secara linear oleh keempat variabel
tersebut, dengan koefisien 2 untuk suhu, -0.5 untuk kelembapan, dan 1.5
untuk angin, serta tambahan noise acak dari distribusi normal
(rnorm(n, 0, 10)) hanya hujan saja yang tidak
diperhitungkan untuk membuat variabel listrik. Dengan demikian, dataset
ini dapat digunakan untuk menguji dan membandingkan kinerja berbagai
metode regresi seperti PCR dan LASSO dalam memodelkan hubungan antara
kondisi cuaca dan konsumsi listrik.
set.seed(0501251016)
n <- 100
data <- data.frame(
suhu = rnorm(n, mean=30, sd=5),
kelembapan = rnorm(n, mean=70, sd=10),
angin = rnorm(n, mean=10, sd=3),
hujan = rpois(n, lambda=5)
)
data$listrik <- 50 + 2*data$suhu - 0.5*data$kelembapan +
1.5*data$angin + rnorm(n, 0, 10)
head(data)## suhu kelembapan angin hujan listrik
## 1 27.30946 52.67032 12.453267 2 98.14111
## 2 29.82308 61.49643 8.438003 2 91.50637
## 3 26.28814 59.78751 5.937344 4 73.58287
## 4 36.27239 90.11039 11.753164 6 82.05026
## 5 33.73203 65.00736 12.780216 7 99.71055
## 6 28.17952 75.90808 12.134619 7 88.18445
set.seed(0501251016)
# Split data
idx_train <- sample(1:n, size = 0.8 * n)
train <- data[idx_train, ]
test <- data[-idx_train, ]
# Konversi X_train dan X_test menjadi matriks untuk glmnet/pls
X_train <- as.matrix(train[, c("suhu", "kelembapan", "angin", "hujan")])
y_train <- train$listrik
X_test <- as.matrix(test[, c("suhu", "kelembapan", "angin", "hujan")])
y_test <- test$listrikSebelum melakukan pemodelan, data dibagi menjadi Data Training dan Data Testing. Data training digunakan untuk membangun model dan data testing digunakan untuk memprediksi nilai respon berdasarkan model yang dilatih dari data training. Penggunaan data testing ini dengan tujuan untuk menilai kinerja model yang dapat membantu memastikan bahwa model tidak hanya baik pada data training tetapi model juga mempunyai kinerja baik pada data testing. Pembangkitan data menggunakan set.seed( ) untuk memastikan angka acak yang dihasilkan akan sama setiap kali kode dijalankan. Data Training menggunakan 80% data dan sisanya digunakan untuk data testing.
RegresiOOP <- function(x, y, metode = c("lasso","pcr")) {
metode <- match.arg(metode)
obj <- list(
x = as.matrix(x),
y = as.numeric(y),
model = NULL,
metode = metode
)
class(obj) <- "RegresiOOP"
return(obj)
}Class S3 dibuat dengan nama RegresiOOP yaitu bentuk
Pemrograman Berorientasi Objek (OOP) di R yang pada tugas ini dirancang
untuk menjalankan metode Lasso dan Principal Component Regression /
PCR.
RegresiOOP adalah fungsi yang berisi
empat slot, yaitu:
x : data prediktor (biasanya matrix/data.frame)
x = as.matrix(x) : mengonversi x menjadi
matrix. Ini penting karena glmnet
mengharapkan input dalam bentuk matriks numerik.
y : variabel respon (vektor).
y = as.numeric(y) : mengonversi y menjadi
vektor numerik (menghindari faktor/character). Memastikan y
dalam bentuk yang tepat untuk pemodelan regresi
model = NULL : placeholder untuk menyimpan objek
model (nanti akan diisi, mis. hasil cv.glmnet() atau
pcr())
metode : argumen pilihan yang defaultnya adalah
c("lasso","pcr"). Jika pemanggil tidak memberikan nilai,
match.arg() (baris berikutnya) akan memilih nilai pertama
sebagai default — yaitu "lasso"
return(obj): mengembalikan objek obj ke
pemanggil fungsi , objek ini berkelas "RegresiOOP" dan
berisi x, y, model, dan
metode
## Loading required package: Matrix
## Loaded glmnet 4.1-10
##
## Attaching package: 'pls'
## The following object is masked from 'package:stats':
##
## loadings
set.seed(0501251016)
fit <- function(obj, ...) UseMethod("fit")
fit.RegresiOOP <- function(obj, ...) {
cat("Fitting model", toupper(obj$metode), "...\n")
if (obj$metode == "lasso") {
obj$model <- glmnet::cv.glmnet(obj$x, obj$y, alpha = 1, family = "gaussian", ...)
} else if (obj$metode == "pcr") {
df <- data.frame(y=obj$y, obj$x) # y harus di depan untuk formula y~.
model_pcr <- pls::pcr(y~., data=df, scale=TRUE, validation="CV", ...)
# Ambil jumlah komponen terbaik (ncomp) berdasarkan RMSEP minimum
ncomp <- which.min(RMSEP(model_pcr)$val[1, , ]) - 1
# Melakukan pemodelan ulang berdasarkan jumlah komponen terbaik
model_pcr_best <- pcr(listrik ~ .,
data = train,
scale = TRUE,
ncomp = ncomp)
#Hasil Model PCR awal, jumlah komponen terbaik dan model PCR terbaik disimpan dalam bentuk list
obj$model <- list(model_pcr = model_pcr, ncomp = ncomp, model_pcr_best=model_pcr_best)
}
return(obj)
}UseMethod("fit") memberitahu R ketika
fit(obj, ...) dipanggil, maka selanjutnya akan mencari dan
menjalankan method yang sesuai berdasarkan class(obj)
Jika object@metode adalah "lasso" maka
menggunakan cv.glmnet() dari paket glmnet
:
obj$x harus berupa matriks prediktor
(numeric)
obj$y adalah vektor respons numeric
alpha = 1 → penalti L1 (LASSO)
family = "gaussian" → untuk regresi kontinu
Hasil (cv.glmnet object) disimpan ke
obj$model. Objek ini berisi lambda.min,
lambda.1se, nilai CV MSE, koefisien untuk setiap
lambda
Jika object@metode adalah "pcr" maka
menggunakan pcr() dari paket pls:
df <- data.frame(y=obj$y,X=obj$X) :
y dan x digabung ke dalam satu dataframe yang
bernama df untuk mempersiapkan data frame tersebut untuk
fungsi pls::pcr()
y ~ . memodelkan y terhadap semua kolom
lain di df
scale = TRUE menstandarisasi prediktor sebelum
PCA
validation = "CV" meminta cross-validation untuk
memilih jumlah komponen
Hasil (objek class mvr) disimpan di
model_pcr.
Pemodelan ulang metode PCR dilakukan dengan jumlah komponen
terbaik yang memiliki RMSEP terkecil disimpan dalam
model_pcr_best
predict.RegresiOOP <- function(obj, newdata, ...) {
if (is.null(obj$model)) {
stop("Model belum disesuaikan. Jalankan fit() terlebih dahulu.")
}
if (obj$metode == "lasso") {
#melakukan prediksi menggunakan model LASSO dengan menggunakan lamda.min
pred <- predict(obj$model, newx = as.matrix(newdata), s = "lambda.min", ...)
} else if (obj$metode == "pcr") {
#melakukan prediksi menggunakan model PCR dengan jumlah komponen terbaik
pred <- predict(obj$model$model_pcr_best,
newdata = as.matrix(newdata),
ncomp = obj$model$ncomp,
...)
}
return(as.numeric(pred)) # Memastikan output adalah vektor numerik
}Mendefinisikan method S3 predict untuk
objek berkelas RegresiOOP
Jika object@metode adalah "lasso" ,
maka:
Melakukan prediksi pada metode LASSO menggunakan objek
cv.glmnet yang disimpan di obj$model
newx = as.matrix(newdata) mengonversi
newdata menjadi matriks numerik (kebutuhan
glmnet)
s = "lambda.min" langsung memilih λ terbaik yang
dicari cv.glmnet
Jika object@metode adalah "pcr" , maka:
model_pcr_best dengan menggunakan jumlah komponen terbaik
(ncomp) berdasarkan nilai RMSEP terkecilsummary.RegresiOOP <- function(obj, ...) {
if (is.null(obj$model)) {
cat("Model belum disesuaikan. Jalankan fit() terlebih dahulu.\n")
return(invisible(NULL))
}
cat("Ringkasan Model RegresiOOP\n")
cat("============================\n")
cat("Metode:", toupper(obj$metode), "\n\n")
if (obj$metode == "lasso") {
cat("Ringkasan LASSO (cv.glmnet)\n")
cat("----------------------------\n")
print(obj$model)
cat("\nLambda Terbaik (lambda.min):\n")
print(round(obj$model$lambda.min,3))
cat("\nKoefisien:\n")
# Tampilkan koefisien non-zero
print(coef(obj$model, s = "lambda.min"))
} else if (obj$metode == "pcr") {
model_pcr <- obj$model$model_pcr
model_pcr_best <- obj$model$model_pcr_best
ncomp <- obj$model$ncomp
cat("Ringkasan PCR dengan Cross Validation (pls::pcr)\n")
cat("--------------------------\n")
cat("Ringkasan Model PCR:\n")
print(summary(model_pcr, ncomp = ncomp))
cat("Jumlah Komponen Terbaik (Berdasarkan minimum RMSEP):", ncomp, "komponen\n\n")
cat("Koefisien Model PCR dengan Jumlah Komponen Terbaik:\n")
print(coef(model_pcr_best, ncomp = ncomp))
}
return(invisible(obj))
}Sintaks ini mendefinisikan method S3
summary untuk objek berkelas RegresiOOP yang
akan dipanggil untuk menampilkan summary dari hasil pemodelan dan
koefisien model
## --- Implementasi RegresiOOP S3 ---
obj_lasso <- RegresiOOP(X_train, y_train, metode = "lasso")
obj_pcr <- RegresiOOP(X_train, y_train, metode = "pcr")
# Fit models
obj_lasso <- fit(obj_lasso)## Fitting model LASSO ...
## Fitting model PCR ...
## Ringkasan Model RegresiOOP
## ============================
## Metode: LASSO
##
## Ringkasan LASSO (cv.glmnet)
## ----------------------------
##
## Call: glmnet::cv.glmnet(x = obj$x, y = obj$y, alpha = 1, family = "gaussian")
##
## Measure: Mean-Squared Error
##
## Lambda Index Measure SE Nonzero
## min 0.3116 39 113.9 10.94 3
## 1se 1.8251 20 124.5 15.61 3
##
## Lambda Terbaik (lambda.min):
## [1] 0.312
##
## Koefisien:
## 5 x 1 sparse Matrix of class "dgCMatrix"
## lambda.min
## (Intercept) 48.2683411
## suhu 1.9950855
## kelembapan -0.5972926
## angin 2.3479548
## hujan .
## Ringkasan Model RegresiOOP
## ============================
## Metode: PCR
##
## Ringkasan PCR dengan Cross Validation (pls::pcr)
## --------------------------
## Ringkasan Model PCR:
## Data: X dimension: 80 4
## Y dimension: 80 1
## Fit method: svdpc
## Number of components considered: 4
##
## VALIDATION: RMSEP
## Cross-validated using 10 random segments.
## (Intercept) 1 comps 2 comps 3 comps 4 comps
## CV 17.44 16.65 15.20 13.34 10.67
## adjCV 17.44 16.49 15.08 13.22 10.64
##
## TRAINING: % variance explained
## 1 comps 2 comps 3 comps 4 comps
## X 28.15 55.70 78.27 100.00
## y 16.41 37.55 53.53 65.73
## NULL
## Jumlah Komponen Terbaik (Berdasarkan minimum RMSEP): 4 komponen
##
## Koefisien Model PCR dengan Jumlah Komponen Terbaik:
## , , 4 comps
##
## listrik
## suhu 10.2473400
## kelembapan -6.6693011
## angin 6.8640978
## hujan -0.1029523
## [1] 100.53316 90.84862 94.76124 103.51825 107.63121 65.37124
## [1] 101.34042 91.03186 94.82625 104.02637 108.30820 64.40581
# Evaluasi regresi
mse_lasso <- round(mean((y_test - pred_lasso)^2),2)
mse_pcr <- round(mean((y_test - pred_pcr)^2),2)
MSE <- rbind(mse_lasso, mse_pcr)
r_squared_lasso <- round(1 - sum((y_test - pred_lasso)^2) /
sum((y_test - mean(y_test))^2),4)
r_squared_pcr <- round(1 - sum((y_test - pred_pcr)^2) /
sum((y_test - mean(y_test))^2),4)
Rsq <- rbind(r_squared_lasso, r_squared_pcr)
Evaluasi <- cbind(MSE, Rsq)
rownames(Evaluasi) <- c("LASSO","PCR")
colnames(Evaluasi) <- c("MSE","R-Squared")== Perbandingan MSE dan R-Squared pada Data Testing ==
## MSE R-Squared
## LASSO 94.55 0.6599
## PCR 96.26 0.6538
Interpretasi Model
Berdasarkan summary dari model Lasso yang ditampilkan sebagai output, dapat diketahui bahwa melalui cross-validation lambda yang mempunyai nilai RMSE yang terkecil (lambda.min) yaitu 0.3116. Lambda ini yang digunakan sebagai nilai regularisasi pada pemodelan data dengan metode LASSO. Model mengeliminasi variabel hujan, dengan koefisien variabel lain yaitu 1.9950855 (suhu), -0.5972926 (kelembapan), dan 2.3479548 (angin). Semua variabel prediktor berpengaruh positif kecuali kelembapan dengan angin yang mempunyai pengaruh terbesar terhadap konsumsi listrik. Model Regresi LASSO berhasil memprediksi konsumsi listrik dengan R-squared = 0.6599, yang berarti 65.99% dari seluruh keragaman konsumsi listrik harian dapat dijelaskan oleh variabel prediktor yang dimasukkan ke dalam model dan MSE = 94.55.
Berdasarkan summary dari model PCR, melalui cross-validation didapatkan bahwa jumlah komponen yang meminimumkan RMSEP yaitu 4 komponen. Hal ini menandakan tidak ada proses pereduksian data dan dalam model ini semua variabel memang diikutkan dalam model. Model menghasilkan koefisien regresi yaitu 10.2473400 (suhu), -6.6693011 (kelembapan), 6.8640978 (angin), dan -0.1029523 (hujan). Variabel suhu dan angin berpengaruh positif terhadap konsumsi listrik sedangkan kelembapan dan hujan berpengaruh negatif. Model Regresi PCR berhasil memprediksi konsumsi listrik dengan R-squared = 0.6538, yang berarti 65.38% dari seluruh keragaman konsumsi listrik harian dapat dijelaskan oleh variabel prediktor yang dimasukkan ke dalam model dan MSE = 96.26
Berdasarkan hasil analisis regresi LASSO yang dilakukan, diperoleh model terbaik dengan nilai parameter penalti (lambda.min) sebesar 0.3116. Nilai ini menunjukkan tingkat penalti yang memberikan kesalahan prediksi terkecil selama proses cross-validation. Pada model tersebut, hanya beberapa variabel yang berkontribusi nyata terhadap konsumsi listrik, yaitu suhu, kelembapan, dan angin, sementara variabel hujan dieliminasi karena koefisiennya disusutkan menjadi nol. Artinya, faktor curah hujan tidak memiliki pengaruh yang signifikan dalam menjelaskan variasi konsumsi listrik pada data ini. Koefisien regresi menunjukkan bahwa peningkatan suhu dan kecepatan angin cenderung meningkatkan konsumsi listrik, sedangkan peningkatan kelembapan justru menurunkan konsumsi listrik. Secara keseluruhan, model LASSO berhasil menyederhanakan struktur model tanpa mengorbankan ketepatan prediksi, sekaligus mengatasi potensi masalah multikolinearitas antarvariabel prediktor.
Berdasarkan hasil analisis dengan metode Regresi Komponen Utama (Principal Component Regression / PCR), diperoleh bahwa model terbaik menggunakan 4 komponen utama dengan %variance explained 100%. Pemilihan jumlah komponen ini didasarkan pada nilai Root Mean Squared Error of Prediction (RMSEP) yang paling rendah, yaitu sebesar 10.67, yang menunjukkan bahwa model dengan 4 komponen menghasilkan kesalahan prediksi terkecil dibandingkan jumlah komponen lainnya. Dari hasil cross-validation, terlihat bahwa peningkatan jumlah komponen menyebabkan penurunan nilai RMSEP, yang berarti model menjadi semakin baik dalam memprediksi respon.
Selain itu, bagian Training variance explained menunjukkan bahwa dengan 4 komponen, model mampu menjelaskan 100% variasi pada variabel X (prediktor) dan 65,73% variasi pada variabel Y (respon listrik). Hal ini menunjukkan bahwa sebagian besar informasi dalam data berhasil ditangkap oleh model. Koefisien regresi juga menunjukkan arah hubungan antar variabel: suhu (10.25) dan angin (6.86) berpengaruh positif terhadap konsumsi listrik, sementara kelembapan (-6.67) dan hujan (-0.10) berpengaruh negatif. Dengan demikian, dapat disimpulkan bahwa kondisi cuaca yang panas dan berangin cenderung meningkatkan konsumsi listrik, sedangkan kelembapan tinggi dan curah hujan menurunkannya. Secara keseluruhan, model PCR ini cukup baik dalam menangani multikolinearitas antar variabel cuaca serta memberikan estimasi yang stabil untuk prediksi konsumsi listrik.
| Aspek | LASSO | PCR |
|---|---|---|
| Prinsip Dasar | Regularisasi : penalti L1 untuk menyusutkan dan menghapus koefisien. Model pada kasus ini dibangun dengan menggunakan lambda.min | Reduksi dimensi: mengganti variabel asli yaitu Suhu, Kelembaban, Angin, dan Hujan menjadi 4 komponen Utama |
| Fokus Utama | Seleksi variabel dan penyederhanaan model. | PCR mempunyai fokus utama mengatasi multikolinieritas dalam model. Dikarenakan tingkat multikolinieritas dalam data tidak tinggi, sehingga komponen utama yang terbentuk sama dengan jumlah variabel sehingga reduksi dimensi tidak dilakukan |
| Koefisien nol | Ada (variabel tak relevan bisa dieliminasi) Metode lasso mengeliminasi variabel hujan dari model Jika dilihat dari simulasi data, hujan memang tidak dilibatkan dalam membentuk variabel Y sehingga model mengeliminasi variabel tersebut karena dianggap tidak berkontribusi dalam model. |
Tidak ada (semua variabel ikut berperan dalam kombinasi) |
| Interpretasi | Mudah dalam interpretasi (variabel asli tetap dipertahankan atau dieliminasi) | Sulit (karena prediktor jadi komponen utama) |
| Jumlah Variabel (Model) | 3 Variabel | 4 Variabel |
| Evaluasi Model (Data Testing) | MSE = 94.55 R-Squared = 0.66 |
MSE = 96.26 R-Squared = 0.65 |
Kedua metode dalam kerangka kerja OOP yaitu PCR dan LASSO, memberikan hasil kinerja berbeda dalam model. Regresi Lasso memberikan performa yang lebih baik jika dibandingkan dengan Principal Component Regression (PCR) pada dataset yang digunakan. Hasil perbandingan dilihat dari nilai MSE dan R-Squared, Lasso memberikan nilai R-Square yang lebih tinggi meskipun bisa dibilang tidak berbeda signifikan. Model LASSO menghasilkan MSE yang lebih rendah dibandingkan PCR.