1. Latar Belakang

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:

  1. 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.

  2. 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.

2. Dataset

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$listrik

Sebelum 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.

3. Membangun Sistem Analisis Data

3.1 Mendefinisikan Class S3

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

3.2 Membuat generic function dan method

library(glmnet)
## Loading required package: Matrix
## Loaded glmnet 4.1-10
library(pls)
## 
## Attaching package: 'pls'
## The following object is masked from 'package:stats':
## 
##     loadings
library(stats)

a). Generic fit()

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

b). Generic predict ()

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 yang digunakan untuk memprediksi adalah model_pcr_best dengan menggunakan jumlah komponen terbaik (ncomp) berdasarkan nilai RMSEP terkecil

c). Generic summary()

summary.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

3.3. Implementasi dan Testing

## --- 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 ...
obj_pcr   <- fit(obj_pcr)
## Fitting model PCR ...
#summary model
summary(obj_lasso)
## 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        .
summary(obj_pcr)
## 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
# Prediksi
pred_lasso <- predict(obj_lasso, X_test)
head(pred_lasso)
## [1] 100.53316  90.84862  94.76124 103.51825 107.63121  65.37124
pred_pcr   <- predict(obj_pcr, X_test)
head(pred_pcr)
## [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 ==

Evaluasi
##         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

4. Hasil Analisis

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.

a). Kelemahan dan Kelebihan Metode

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

b). Kesimpulan

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.