1. Supervised Statistical Learning
Library
library(broom) #untuk merapikan tampilan data
library(glmnet) #metode seleksi LASSO dan RIDGE
library(glmnetUtils) #package tambahan dari glmnet yang memungkinkan syntax glmnet bisa dinput menggunakan object data.frame
library(leaps) #menggunakan fungsi regsubset sebagai metode seleksi peubah dengan bestforward
library(varbvs) #Data
library(tidyverse)
library(plyr)
library(readr)
library(repr)
library(MASS) #Data
library(MuMIn) #Model Averaging
library(data.table) # used for reading and manipulation of data
library(dplyr) # used for data manipulation and joining
library(ggplot2) # used for ploting
library(caret) # used for modeling
library(xgboost) # used for building XGBoost model
library(e1071) # used for skewness
library(cowplot) # used for combining multiple plots
Data
Data yang digunakan adalah dataset Bigmart yang tersedia pada website kaggle. Data ini terdiri dari 1559 produk di 10 toko di berbagai kota dengan total sebanyak 8523 observasi. Peubah tertentu dari setiap produk dan toko telah ditentukan. Peubah-peubahnya yaitu:
Item_Identifier: ID unik untuk setiap item yang berbedaItem_Weight: Berat produkItem_Fat_Content: Menjelaskan apakah produk rendah lemak atau tidakItem_Visibility: Persentase total area semua produk di toko yang dialokasikan untuk produk tertentuItem_Type: Kategori makanan yang dimiliki produk tersebutItem_MRP: Harga Eceran Maksimum produkOutlet_Identifier: ID unik untuk tokoOutlet_Establishment_Year: Tahun berdirinya tokoOutlet_Size: Luas tanah tokoOutlet_Location_Type: Luas kota dimana toko tersebut beradaOutlet_Type: Menjelaskan apakah outlet tersebut hanya toko kelontong atau semacam supermarketItem_Outlet_Sales: Penjualan produk di toko tertentu (Peubah respons)
dat <- read.csv("D:/Semester 5/5. Pengantar Sains Data/Bigmart Train.csv")
str(dat)
## 'data.frame': 8523 obs. of 12 variables:
## $ Item_Identifier : chr "FDA15" "DRC01" "FDN15" "FDX07" ...
## $ Item_Weight : num 9.3 5.92 17.5 19.2 8.93 ...
## $ Item_Fat_Content : chr "Low Fat" "Regular" "Low Fat" "Regular" ...
## $ Item_Visibility : num 0.016 0.0193 0.0168 0 0 ...
## $ Item_Type : chr "Dairy" "Soft Drinks" "Meat" "Fruits and Vegetables" ...
## $ Item_MRP : num 249.8 48.3 141.6 182.1 53.9 ...
## $ Outlet_Identifier : chr "OUT049" "OUT018" "OUT049" "OUT010" ...
## $ Outlet_Establishment_Year: int 1999 2009 1999 1998 1987 2009 1987 1985 2002 2007 ...
## $ Outlet_Size : chr "Medium" "Medium" "Medium" "" ...
## $ Outlet_Location_Type : chr "Tier 1" "Tier 3" "Tier 1" "Tier 3" ...
## $ Outlet_Type : chr "Supermarket Type1" "Supermarket Type2" "Supermarket Type1" "Grocery Store" ...
## $ Item_Outlet_Sales : num 3735 443 2097 732 995 ...
Terdapat beberapa peubah yang masih bertipe “chr” atau karakter. Penggunaan supervised Statistical Learning dalam regresi Ridge dan Lasso mengharuskan data yang digunakan minimal bertipe rasio/numerik. Maka dari itu, akan dilakukan pre-processing data terlebih dahulu untuk meng-convert data di atas menjadi data yang dapat digunakan untuk analisis.
Pre-processing data
Syntax di bawah ini digunakan untuk membaca dua jenis dataset yang
tersedia pada link di atas, yaitu data Bigmart Train dan Bigmart Test.
Data ini kemudian digabung dan dimanfaatkan untuk mengatasi data yang
hilang (missing value). Adapun penjelasan dari setiap tahapan
dituliskan pada komentar syntax di bawah yang diawali dengan tanda
#.
# Membaca dataset
train <- fread("D:/Semester 5/5. Pengantar Sains Data/Bigmart Train.csv")
test <- fread("D:/Semester 5/5. Pengantar Sains Data/Bigmart Test.csv")
# Setting dataset test
# Menggabungkan dataset
# Menambah Item_Outlet_Sales ke data test
test[, Item_Outlet_Sales := NA]
combi = rbind(train, test)
# Mengatasi Missing Value
missing_index = which(is.na(combi$Item_Weight))
for(i in missing_index){
item = combi$Item_Identifier[i]
combi$Item_Weight[i] =
mean(combi$Item_Weight[combi$Item_Identifier == item],
na.rm = T)
}
# Mengganti nilai 0 di Item_Visibility dengan rataan
zero_index = which(combi$Item_Visibility == 0)
for(i in zero_index)
{
item = combi$Item_Identifier[i]
combi$Item_Visibility[i] =
mean(combi$Item_Visibility[combi$Item_Identifier == item],
na.rm = T)
}
# Membuat kode label
# Guna mengganti kode label "chr" menjadi "num"
combi[, Outlet_Size_num := ifelse(Outlet_Size == "Small", 0,
ifelse(Outlet_Size == "Medium",
1, 2))]
combi[, Outlet_Location_Type_num :=
ifelse(Outlet_Location_Type == "Tier 3", 0,
ifelse(Outlet_Location_Type == "Tier 2", 1, 2))]
combi[, c("Outlet_Size", "Outlet_Location_Type") := NULL]
# One Hot Encoding
# Guna mengganti kode label "chr" menjadi "num"
ohe_1 = dummyVars("~.", data = combi[, -c("Item_Identifier",
"Outlet_Establishment_Year",
"Item_Type")], fullRank = T)
ohe_df = data.table(predict(ohe_1, combi[, -c("Item_Identifier",
"Outlet_Establishment_Year",
"Item_Type")]))
combi = cbind(combi[, "Item_Identifier"], ohe_df)
# log + 1 untuk menghindari pembagian dengan nilai 0
combi[, Item_Visibility := log(Item_Visibility + 1)]
# Scaling dan Centering data
num_vars = which(sapply(combi, is.numeric)) # index of numeric features
num_vars_names = names(num_vars)
combi_numeric = combi[, setdiff(num_vars_names,
"Item_Outlet_Sales"),
with = F]
prep_num = preProcess(combi_numeric,
method=c("center", "scale"))
combi_numeric_norm = predict(prep_num, combi_numeric)
# menghilangkan peubah tak bebas numerik
combi[, setdiff(num_vars_names,
"Item_Outlet_Sales") := NULL]
# Menggabungkan kembali peubah-peubah
combi = cbind(combi, combi_numeric_norm)
# splitting data kembali ke train dan test
train = combi[1:nrow(train)]
test = combi[(nrow(train) + 1):nrow(combi)]
# Removing Item_Outlet_Sales
test[, Item_Outlet_Sales := NULL]
# Membuat variabel untuk data train baru
data <- train
Sehingga didapatkan data fixed sebagai berikut:
head(data)
str(data)
## Classes 'data.table' and 'data.frame': 8523 obs. of 23 variables:
## $ Item_Identifier : chr "FDA15" "DRC01" "FDN15" "FDX07" ...
## $ Item_Outlet_Sales : num 3735 443 2097 732 995 ...
## $ Item_Weight : num -0.751 -1.478 1.012 1.377 -0.831 ...
## $ Item_Fat_Contentlow fat : num -0.113 -0.113 -0.113 -0.113 -0.113 ...
## $ Item_Fat_ContentLow Fat : num 0.821 -1.218 0.821 -1.218 0.821 ...
## $ Item_Fat_Contentreg : num -0.118 -0.118 -0.118 -0.118 -0.118 ...
## $ Item_Fat_ContentRegular : num -0.717 1.394 -0.717 1.394 -0.717 ...
## $ Item_Visibility : num -1.11 -1.04 -1.1 -1.08 -1.25 ...
## $ Item_MRP : num 1.75245 -1.49364 0.00987 0.66181 -1.40357 ...
## $ Outlet_IdentifierOUT013 : num -0.35 -0.35 -0.35 -0.35 2.85 ...
## $ Outlet_IdentifierOUT017 : num -0.349 -0.349 -0.349 -0.349 -0.349 ...
## $ Outlet_IdentifierOUT018 : num -0.349 2.861 -0.349 -0.349 -0.349 ...
## $ Outlet_IdentifierOUT019 : num -0.257 -0.257 -0.257 -0.257 -0.257 ...
## $ Outlet_IdentifierOUT027 : num -0.351 -0.351 -0.351 -0.351 -0.351 ...
## $ Outlet_IdentifierOUT035 : num -0.35 -0.35 -0.35 -0.35 -0.35 ...
## $ Outlet_IdentifierOUT045 : num -0.35 -0.35 -0.35 -0.35 -0.35 ...
## $ Outlet_IdentifierOUT046 : num -0.35 -0.35 -0.35 -0.35 -0.35 ...
## $ Outlet_IdentifierOUT049 : num 2.86 -0.35 2.86 -0.35 -0.35 ...
## $ Outlet_TypeSupermarket Type1: num 0.727 -1.376 0.727 -1.376 0.727 ...
## $ Outlet_TypeSupermarket Type2: num -0.349 2.861 -0.349 -0.349 -0.349 ...
## $ Outlet_TypeSupermarket Type3: num -0.351 -0.351 -0.351 -0.351 -0.351 ...
## $ Outlet_Size_num : num -0.138 -0.138 -0.138 1.093 1.093 ...
## $ Outlet_Location_Type_num : num 1.37 -1.09 1.37 -1.09 -1.09 ...
## - attr(*, ".internal.selfref")=<externalptr>
Data di atas terdiri dari jumlah observasi yang sama, yaitu sebanyak 8523 dengan beberapa peubah “baru” yang diperoleh dari pengelompokkan data outlet yang sebelumnya berupa data ordinal/tingkatan -> memperlakukannya sebagai data numerik.
Partisi Data
Selanjutnya data perlu dibagi menjadi data training dan data testing. Data training akan digunakan untuk melatih algoritma dalam mencari model yang sesuai, sedangkan data testing akan dipakai untuk menguji dan mengetahui performa model yang didapatkan pada tahapan testing. Pada umumnya, proporsi data testing berada di antara \(60/%-80/%\). Pada tugas kali ini, akan ditetapkan proporsi data testing sebesar \(70/%\)
set.seed(100)
index = sample(1:nrow(data), 0.7*nrow(data))
train = data[index,-1] # Create the training data
test = data[-index,-1] # Create the test data
dim(train)
## [1] 5966 22
dim(test)
## [1] 2557 22
RIDGE Regression
Regresi Ridge adalah metode yang dapat digunakan untuk mencocokkan model regresi ketika terdapat multikolinearitas dalam data. Regresi ridge meminimalkan jumlah kuadrat residual prediktor dalam model. Regresi ridge cenderung menyusutkan estimasi koefisien menuju nol.
Cara 1
Pada cara pertama, akan dilakukan dengan menggunakan data asli (bukan data partisi).
Control Model
Syntax di bawah ini akan membuat variabel control model dengan metode cross-validation berulang, dengan banyaknya folds = 10 dan banyaknya ulangan = 5. Selain itu, pemilihan alpha = 0 pada syntax di bawah diperlukan untuk regresi ridge dan nilai lambda dari 0.001 hingga 0.1 dengan jarak antar lambda 0.0002.
# Model Building : Ridge Regression
set.seed(123)
control = trainControl(method ="repeatedcv",
number = 10,
repeats = 5,
verboseIter = F) #print iterasi
Grid_ri_reg = expand.grid(alpha = 0, lambda = seq(0.001, 0.1,
by = 0.0002))
Modelling
Kemudian, akan dijalankan model regresi ridge berdasarkan control model di atas:
#fitting Ridge Regression model
Ridge_model = train(x = data[, -c("Item_Identifier",
"Item_Outlet_Sales")],
y = data$Item_Outlet_Sales,
method = "glmnet",
trControl = control,
tuneGrid = Grid_ri_reg
)
Ridge_model
## glmnet
##
## 8523 samples
## 21 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 5 times)
## Summary of sample sizes: 7671, 7670, 7670, 7670, 7671, 7671, ...
## Resampling results across tuning parameters:
##
## lambda RMSE Rsquared MAE
## 0.0010 1133.289 0.5612142 838.5613
## 0.0012 1133.289 0.5612142 838.5613
## 0.0014 1133.289 0.5612142 838.5613
## 0.0016 1133.289 0.5612142 838.5613
## 0.0018 1133.289 0.5612142 838.5613
## 0.0020 1133.289 0.5612142 838.5613
## 0.0022 1133.289 0.5612142 838.5613
## 0.0024 1133.289 0.5612142 838.5613
## 0.0026 1133.289 0.5612142 838.5613
## 0.0028 1133.289 0.5612142 838.5613
## 0.0030 1133.289 0.5612142 838.5613
## 0.0032 1133.289 0.5612142 838.5613
## 0.0034 1133.289 0.5612142 838.5613
## 0.0036 1133.289 0.5612142 838.5613
## 0.0038 1133.289 0.5612142 838.5613
## 0.0040 1133.289 0.5612142 838.5613
## 0.0042 1133.289 0.5612142 838.5613
## 0.0044 1133.289 0.5612142 838.5613
## 0.0046 1133.289 0.5612142 838.5613
## 0.0048 1133.289 0.5612142 838.5613
## 0.0050 1133.289 0.5612142 838.5613
## 0.0052 1133.289 0.5612142 838.5613
## 0.0054 1133.289 0.5612142 838.5613
## 0.0056 1133.289 0.5612142 838.5613
## 0.0058 1133.289 0.5612142 838.5613
## 0.0060 1133.289 0.5612142 838.5613
## 0.0062 1133.289 0.5612142 838.5613
## 0.0064 1133.289 0.5612142 838.5613
## 0.0066 1133.289 0.5612142 838.5613
## 0.0068 1133.289 0.5612142 838.5613
## 0.0070 1133.289 0.5612142 838.5613
## 0.0072 1133.289 0.5612142 838.5613
## 0.0074 1133.289 0.5612142 838.5613
## 0.0076 1133.289 0.5612142 838.5613
## 0.0078 1133.289 0.5612142 838.5613
## 0.0080 1133.289 0.5612142 838.5613
## 0.0082 1133.289 0.5612142 838.5613
## 0.0084 1133.289 0.5612142 838.5613
## 0.0086 1133.289 0.5612142 838.5613
## 0.0088 1133.289 0.5612142 838.5613
## 0.0090 1133.289 0.5612142 838.5613
## 0.0092 1133.289 0.5612142 838.5613
## 0.0094 1133.289 0.5612142 838.5613
## 0.0096 1133.289 0.5612142 838.5613
## 0.0098 1133.289 0.5612142 838.5613
## 0.0100 1133.289 0.5612142 838.5613
## 0.0102 1133.289 0.5612142 838.5613
## 0.0104 1133.289 0.5612142 838.5613
## 0.0106 1133.289 0.5612142 838.5613
## 0.0108 1133.289 0.5612142 838.5613
## 0.0110 1133.289 0.5612142 838.5613
## 0.0112 1133.289 0.5612142 838.5613
## 0.0114 1133.289 0.5612142 838.5613
## 0.0116 1133.289 0.5612142 838.5613
## 0.0118 1133.289 0.5612142 838.5613
## 0.0120 1133.289 0.5612142 838.5613
## 0.0122 1133.289 0.5612142 838.5613
## 0.0124 1133.289 0.5612142 838.5613
## 0.0126 1133.289 0.5612142 838.5613
## 0.0128 1133.289 0.5612142 838.5613
## 0.0130 1133.289 0.5612142 838.5613
## 0.0132 1133.289 0.5612142 838.5613
## 0.0134 1133.289 0.5612142 838.5613
## 0.0136 1133.289 0.5612142 838.5613
## 0.0138 1133.289 0.5612142 838.5613
## 0.0140 1133.289 0.5612142 838.5613
## 0.0142 1133.289 0.5612142 838.5613
## 0.0144 1133.289 0.5612142 838.5613
## 0.0146 1133.289 0.5612142 838.5613
## 0.0148 1133.289 0.5612142 838.5613
## 0.0150 1133.289 0.5612142 838.5613
## 0.0152 1133.289 0.5612142 838.5613
## 0.0154 1133.289 0.5612142 838.5613
## 0.0156 1133.289 0.5612142 838.5613
## 0.0158 1133.289 0.5612142 838.5613
## 0.0160 1133.289 0.5612142 838.5613
## 0.0162 1133.289 0.5612142 838.5613
## 0.0164 1133.289 0.5612142 838.5613
## 0.0166 1133.289 0.5612142 838.5613
## 0.0168 1133.289 0.5612142 838.5613
## 0.0170 1133.289 0.5612142 838.5613
## 0.0172 1133.289 0.5612142 838.5613
## 0.0174 1133.289 0.5612142 838.5613
## 0.0176 1133.289 0.5612142 838.5613
## 0.0178 1133.289 0.5612142 838.5613
## 0.0180 1133.289 0.5612142 838.5613
## 0.0182 1133.289 0.5612142 838.5613
## 0.0184 1133.289 0.5612142 838.5613
## 0.0186 1133.289 0.5612142 838.5613
## 0.0188 1133.289 0.5612142 838.5613
## 0.0190 1133.289 0.5612142 838.5613
## 0.0192 1133.289 0.5612142 838.5613
## 0.0194 1133.289 0.5612142 838.5613
## 0.0196 1133.289 0.5612142 838.5613
## 0.0198 1133.289 0.5612142 838.5613
## 0.0200 1133.289 0.5612142 838.5613
## 0.0202 1133.289 0.5612142 838.5613
## 0.0204 1133.289 0.5612142 838.5613
## 0.0206 1133.289 0.5612142 838.5613
## 0.0208 1133.289 0.5612142 838.5613
## 0.0210 1133.289 0.5612142 838.5613
## 0.0212 1133.289 0.5612142 838.5613
## 0.0214 1133.289 0.5612142 838.5613
## 0.0216 1133.289 0.5612142 838.5613
## 0.0218 1133.289 0.5612142 838.5613
## 0.0220 1133.289 0.5612142 838.5613
## 0.0222 1133.289 0.5612142 838.5613
## 0.0224 1133.289 0.5612142 838.5613
## 0.0226 1133.289 0.5612142 838.5613
## 0.0228 1133.289 0.5612142 838.5613
## 0.0230 1133.289 0.5612142 838.5613
## 0.0232 1133.289 0.5612142 838.5613
## 0.0234 1133.289 0.5612142 838.5613
## 0.0236 1133.289 0.5612142 838.5613
## 0.0238 1133.289 0.5612142 838.5613
## 0.0240 1133.289 0.5612142 838.5613
## 0.0242 1133.289 0.5612142 838.5613
## 0.0244 1133.289 0.5612142 838.5613
## 0.0246 1133.289 0.5612142 838.5613
## 0.0248 1133.289 0.5612142 838.5613
## 0.0250 1133.289 0.5612142 838.5613
## 0.0252 1133.289 0.5612142 838.5613
## 0.0254 1133.289 0.5612142 838.5613
## 0.0256 1133.289 0.5612142 838.5613
## 0.0258 1133.289 0.5612142 838.5613
## 0.0260 1133.289 0.5612142 838.5613
## 0.0262 1133.289 0.5612142 838.5613
## 0.0264 1133.289 0.5612142 838.5613
## 0.0266 1133.289 0.5612142 838.5613
## 0.0268 1133.289 0.5612142 838.5613
## 0.0270 1133.289 0.5612142 838.5613
## 0.0272 1133.289 0.5612142 838.5613
## 0.0274 1133.289 0.5612142 838.5613
## 0.0276 1133.289 0.5612142 838.5613
## 0.0278 1133.289 0.5612142 838.5613
## 0.0280 1133.289 0.5612142 838.5613
## 0.0282 1133.289 0.5612142 838.5613
## 0.0284 1133.289 0.5612142 838.5613
## 0.0286 1133.289 0.5612142 838.5613
## 0.0288 1133.289 0.5612142 838.5613
## 0.0290 1133.289 0.5612142 838.5613
## 0.0292 1133.289 0.5612142 838.5613
## 0.0294 1133.289 0.5612142 838.5613
## 0.0296 1133.289 0.5612142 838.5613
## 0.0298 1133.289 0.5612142 838.5613
## 0.0300 1133.289 0.5612142 838.5613
## 0.0302 1133.289 0.5612142 838.5613
## 0.0304 1133.289 0.5612142 838.5613
## 0.0306 1133.289 0.5612142 838.5613
## 0.0308 1133.289 0.5612142 838.5613
## 0.0310 1133.289 0.5612142 838.5613
## 0.0312 1133.289 0.5612142 838.5613
## 0.0314 1133.289 0.5612142 838.5613
## 0.0316 1133.289 0.5612142 838.5613
## 0.0318 1133.289 0.5612142 838.5613
## 0.0320 1133.289 0.5612142 838.5613
## 0.0322 1133.289 0.5612142 838.5613
## 0.0324 1133.289 0.5612142 838.5613
## 0.0326 1133.289 0.5612142 838.5613
## 0.0328 1133.289 0.5612142 838.5613
## 0.0330 1133.289 0.5612142 838.5613
## 0.0332 1133.289 0.5612142 838.5613
## 0.0334 1133.289 0.5612142 838.5613
## 0.0336 1133.289 0.5612142 838.5613
## 0.0338 1133.289 0.5612142 838.5613
## 0.0340 1133.289 0.5612142 838.5613
## 0.0342 1133.289 0.5612142 838.5613
## 0.0344 1133.289 0.5612142 838.5613
## 0.0346 1133.289 0.5612142 838.5613
## 0.0348 1133.289 0.5612142 838.5613
## 0.0350 1133.289 0.5612142 838.5613
## 0.0352 1133.289 0.5612142 838.5613
## 0.0354 1133.289 0.5612142 838.5613
## 0.0356 1133.289 0.5612142 838.5613
## 0.0358 1133.289 0.5612142 838.5613
## 0.0360 1133.289 0.5612142 838.5613
## 0.0362 1133.289 0.5612142 838.5613
## 0.0364 1133.289 0.5612142 838.5613
## 0.0366 1133.289 0.5612142 838.5613
## 0.0368 1133.289 0.5612142 838.5613
## 0.0370 1133.289 0.5612142 838.5613
## 0.0372 1133.289 0.5612142 838.5613
## 0.0374 1133.289 0.5612142 838.5613
## 0.0376 1133.289 0.5612142 838.5613
## 0.0378 1133.289 0.5612142 838.5613
## 0.0380 1133.289 0.5612142 838.5613
## 0.0382 1133.289 0.5612142 838.5613
## 0.0384 1133.289 0.5612142 838.5613
## 0.0386 1133.289 0.5612142 838.5613
## 0.0388 1133.289 0.5612142 838.5613
## 0.0390 1133.289 0.5612142 838.5613
## 0.0392 1133.289 0.5612142 838.5613
## 0.0394 1133.289 0.5612142 838.5613
## 0.0396 1133.289 0.5612142 838.5613
## 0.0398 1133.289 0.5612142 838.5613
## 0.0400 1133.289 0.5612142 838.5613
## 0.0402 1133.289 0.5612142 838.5613
## 0.0404 1133.289 0.5612142 838.5613
## 0.0406 1133.289 0.5612142 838.5613
## 0.0408 1133.289 0.5612142 838.5613
## 0.0410 1133.289 0.5612142 838.5613
## 0.0412 1133.289 0.5612142 838.5613
## 0.0414 1133.289 0.5612142 838.5613
## 0.0416 1133.289 0.5612142 838.5613
## 0.0418 1133.289 0.5612142 838.5613
## 0.0420 1133.289 0.5612142 838.5613
## 0.0422 1133.289 0.5612142 838.5613
## 0.0424 1133.289 0.5612142 838.5613
## 0.0426 1133.289 0.5612142 838.5613
## 0.0428 1133.289 0.5612142 838.5613
## 0.0430 1133.289 0.5612142 838.5613
## 0.0432 1133.289 0.5612142 838.5613
## 0.0434 1133.289 0.5612142 838.5613
## 0.0436 1133.289 0.5612142 838.5613
## 0.0438 1133.289 0.5612142 838.5613
## 0.0440 1133.289 0.5612142 838.5613
## 0.0442 1133.289 0.5612142 838.5613
## 0.0444 1133.289 0.5612142 838.5613
## 0.0446 1133.289 0.5612142 838.5613
## 0.0448 1133.289 0.5612142 838.5613
## 0.0450 1133.289 0.5612142 838.5613
## 0.0452 1133.289 0.5612142 838.5613
## 0.0454 1133.289 0.5612142 838.5613
## 0.0456 1133.289 0.5612142 838.5613
## 0.0458 1133.289 0.5612142 838.5613
## 0.0460 1133.289 0.5612142 838.5613
## 0.0462 1133.289 0.5612142 838.5613
## 0.0464 1133.289 0.5612142 838.5613
## 0.0466 1133.289 0.5612142 838.5613
## 0.0468 1133.289 0.5612142 838.5613
## 0.0470 1133.289 0.5612142 838.5613
## 0.0472 1133.289 0.5612142 838.5613
## 0.0474 1133.289 0.5612142 838.5613
## 0.0476 1133.289 0.5612142 838.5613
## 0.0478 1133.289 0.5612142 838.5613
## 0.0480 1133.289 0.5612142 838.5613
## 0.0482 1133.289 0.5612142 838.5613
## 0.0484 1133.289 0.5612142 838.5613
## 0.0486 1133.289 0.5612142 838.5613
## 0.0488 1133.289 0.5612142 838.5613
## 0.0490 1133.289 0.5612142 838.5613
## 0.0492 1133.289 0.5612142 838.5613
## 0.0494 1133.289 0.5612142 838.5613
## 0.0496 1133.289 0.5612142 838.5613
## 0.0498 1133.289 0.5612142 838.5613
## 0.0500 1133.289 0.5612142 838.5613
## 0.0502 1133.289 0.5612142 838.5613
## 0.0504 1133.289 0.5612142 838.5613
## 0.0506 1133.289 0.5612142 838.5613
## 0.0508 1133.289 0.5612142 838.5613
## 0.0510 1133.289 0.5612142 838.5613
## 0.0512 1133.289 0.5612142 838.5613
## 0.0514 1133.289 0.5612142 838.5613
## 0.0516 1133.289 0.5612142 838.5613
## 0.0518 1133.289 0.5612142 838.5613
## 0.0520 1133.289 0.5612142 838.5613
## 0.0522 1133.289 0.5612142 838.5613
## 0.0524 1133.289 0.5612142 838.5613
## 0.0526 1133.289 0.5612142 838.5613
## 0.0528 1133.289 0.5612142 838.5613
## 0.0530 1133.289 0.5612142 838.5613
## 0.0532 1133.289 0.5612142 838.5613
## 0.0534 1133.289 0.5612142 838.5613
## 0.0536 1133.289 0.5612142 838.5613
## 0.0538 1133.289 0.5612142 838.5613
## 0.0540 1133.289 0.5612142 838.5613
## 0.0542 1133.289 0.5612142 838.5613
## 0.0544 1133.289 0.5612142 838.5613
## 0.0546 1133.289 0.5612142 838.5613
## 0.0548 1133.289 0.5612142 838.5613
## 0.0550 1133.289 0.5612142 838.5613
## 0.0552 1133.289 0.5612142 838.5613
## 0.0554 1133.289 0.5612142 838.5613
## 0.0556 1133.289 0.5612142 838.5613
## 0.0558 1133.289 0.5612142 838.5613
## 0.0560 1133.289 0.5612142 838.5613
## 0.0562 1133.289 0.5612142 838.5613
## 0.0564 1133.289 0.5612142 838.5613
## 0.0566 1133.289 0.5612142 838.5613
## 0.0568 1133.289 0.5612142 838.5613
## 0.0570 1133.289 0.5612142 838.5613
## 0.0572 1133.289 0.5612142 838.5613
## 0.0574 1133.289 0.5612142 838.5613
## 0.0576 1133.289 0.5612142 838.5613
## 0.0578 1133.289 0.5612142 838.5613
## 0.0580 1133.289 0.5612142 838.5613
## 0.0582 1133.289 0.5612142 838.5613
## 0.0584 1133.289 0.5612142 838.5613
## 0.0586 1133.289 0.5612142 838.5613
## 0.0588 1133.289 0.5612142 838.5613
## 0.0590 1133.289 0.5612142 838.5613
## 0.0592 1133.289 0.5612142 838.5613
## 0.0594 1133.289 0.5612142 838.5613
## 0.0596 1133.289 0.5612142 838.5613
## 0.0598 1133.289 0.5612142 838.5613
## 0.0600 1133.289 0.5612142 838.5613
## 0.0602 1133.289 0.5612142 838.5613
## 0.0604 1133.289 0.5612142 838.5613
## 0.0606 1133.289 0.5612142 838.5613
## 0.0608 1133.289 0.5612142 838.5613
## 0.0610 1133.289 0.5612142 838.5613
## 0.0612 1133.289 0.5612142 838.5613
## 0.0614 1133.289 0.5612142 838.5613
## 0.0616 1133.289 0.5612142 838.5613
## 0.0618 1133.289 0.5612142 838.5613
## 0.0620 1133.289 0.5612142 838.5613
## 0.0622 1133.289 0.5612142 838.5613
## 0.0624 1133.289 0.5612142 838.5613
## 0.0626 1133.289 0.5612142 838.5613
## 0.0628 1133.289 0.5612142 838.5613
## 0.0630 1133.289 0.5612142 838.5613
## 0.0632 1133.289 0.5612142 838.5613
## 0.0634 1133.289 0.5612142 838.5613
## 0.0636 1133.289 0.5612142 838.5613
## 0.0638 1133.289 0.5612142 838.5613
## 0.0640 1133.289 0.5612142 838.5613
## 0.0642 1133.289 0.5612142 838.5613
## 0.0644 1133.289 0.5612142 838.5613
## 0.0646 1133.289 0.5612142 838.5613
## 0.0648 1133.289 0.5612142 838.5613
## 0.0650 1133.289 0.5612142 838.5613
## 0.0652 1133.289 0.5612142 838.5613
## 0.0654 1133.289 0.5612142 838.5613
## 0.0656 1133.289 0.5612142 838.5613
## 0.0658 1133.289 0.5612142 838.5613
## 0.0660 1133.289 0.5612142 838.5613
## 0.0662 1133.289 0.5612142 838.5613
## 0.0664 1133.289 0.5612142 838.5613
## 0.0666 1133.289 0.5612142 838.5613
## 0.0668 1133.289 0.5612142 838.5613
## 0.0670 1133.289 0.5612142 838.5613
## 0.0672 1133.289 0.5612142 838.5613
## 0.0674 1133.289 0.5612142 838.5613
## 0.0676 1133.289 0.5612142 838.5613
## 0.0678 1133.289 0.5612142 838.5613
## 0.0680 1133.289 0.5612142 838.5613
## 0.0682 1133.289 0.5612142 838.5613
## 0.0684 1133.289 0.5612142 838.5613
## 0.0686 1133.289 0.5612142 838.5613
## 0.0688 1133.289 0.5612142 838.5613
## 0.0690 1133.289 0.5612142 838.5613
## 0.0692 1133.289 0.5612142 838.5613
## 0.0694 1133.289 0.5612142 838.5613
## 0.0696 1133.289 0.5612142 838.5613
## 0.0698 1133.289 0.5612142 838.5613
## 0.0700 1133.289 0.5612142 838.5613
## 0.0702 1133.289 0.5612142 838.5613
## 0.0704 1133.289 0.5612142 838.5613
## 0.0706 1133.289 0.5612142 838.5613
## 0.0708 1133.289 0.5612142 838.5613
## 0.0710 1133.289 0.5612142 838.5613
## 0.0712 1133.289 0.5612142 838.5613
## 0.0714 1133.289 0.5612142 838.5613
## 0.0716 1133.289 0.5612142 838.5613
## 0.0718 1133.289 0.5612142 838.5613
## 0.0720 1133.289 0.5612142 838.5613
## 0.0722 1133.289 0.5612142 838.5613
## 0.0724 1133.289 0.5612142 838.5613
## 0.0726 1133.289 0.5612142 838.5613
## 0.0728 1133.289 0.5612142 838.5613
## 0.0730 1133.289 0.5612142 838.5613
## 0.0732 1133.289 0.5612142 838.5613
## 0.0734 1133.289 0.5612142 838.5613
## 0.0736 1133.289 0.5612142 838.5613
## 0.0738 1133.289 0.5612142 838.5613
## 0.0740 1133.289 0.5612142 838.5613
## 0.0742 1133.289 0.5612142 838.5613
## 0.0744 1133.289 0.5612142 838.5613
## 0.0746 1133.289 0.5612142 838.5613
## 0.0748 1133.289 0.5612142 838.5613
## 0.0750 1133.289 0.5612142 838.5613
## 0.0752 1133.289 0.5612142 838.5613
## 0.0754 1133.289 0.5612142 838.5613
## 0.0756 1133.289 0.5612142 838.5613
## 0.0758 1133.289 0.5612142 838.5613
## 0.0760 1133.289 0.5612142 838.5613
## 0.0762 1133.289 0.5612142 838.5613
## 0.0764 1133.289 0.5612142 838.5613
## 0.0766 1133.289 0.5612142 838.5613
## 0.0768 1133.289 0.5612142 838.5613
## 0.0770 1133.289 0.5612142 838.5613
## 0.0772 1133.289 0.5612142 838.5613
## 0.0774 1133.289 0.5612142 838.5613
## 0.0776 1133.289 0.5612142 838.5613
## 0.0778 1133.289 0.5612142 838.5613
## 0.0780 1133.289 0.5612142 838.5613
## 0.0782 1133.289 0.5612142 838.5613
## 0.0784 1133.289 0.5612142 838.5613
## 0.0786 1133.289 0.5612142 838.5613
## 0.0788 1133.289 0.5612142 838.5613
## 0.0790 1133.289 0.5612142 838.5613
## 0.0792 1133.289 0.5612142 838.5613
## 0.0794 1133.289 0.5612142 838.5613
## 0.0796 1133.289 0.5612142 838.5613
## 0.0798 1133.289 0.5612142 838.5613
## 0.0800 1133.289 0.5612142 838.5613
## 0.0802 1133.289 0.5612142 838.5613
## 0.0804 1133.289 0.5612142 838.5613
## 0.0806 1133.289 0.5612142 838.5613
## 0.0808 1133.289 0.5612142 838.5613
## 0.0810 1133.289 0.5612142 838.5613
## 0.0812 1133.289 0.5612142 838.5613
## 0.0814 1133.289 0.5612142 838.5613
## 0.0816 1133.289 0.5612142 838.5613
## 0.0818 1133.289 0.5612142 838.5613
## 0.0820 1133.289 0.5612142 838.5613
## 0.0822 1133.289 0.5612142 838.5613
## 0.0824 1133.289 0.5612142 838.5613
## 0.0826 1133.289 0.5612142 838.5613
## 0.0828 1133.289 0.5612142 838.5613
## 0.0830 1133.289 0.5612142 838.5613
## 0.0832 1133.289 0.5612142 838.5613
## 0.0834 1133.289 0.5612142 838.5613
## 0.0836 1133.289 0.5612142 838.5613
## 0.0838 1133.289 0.5612142 838.5613
## 0.0840 1133.289 0.5612142 838.5613
## 0.0842 1133.289 0.5612142 838.5613
## 0.0844 1133.289 0.5612142 838.5613
## 0.0846 1133.289 0.5612142 838.5613
## 0.0848 1133.289 0.5612142 838.5613
## 0.0850 1133.289 0.5612142 838.5613
## 0.0852 1133.289 0.5612142 838.5613
## 0.0854 1133.289 0.5612142 838.5613
## 0.0856 1133.289 0.5612142 838.5613
## 0.0858 1133.289 0.5612142 838.5613
## 0.0860 1133.289 0.5612142 838.5613
## 0.0862 1133.289 0.5612142 838.5613
## 0.0864 1133.289 0.5612142 838.5613
## 0.0866 1133.289 0.5612142 838.5613
## 0.0868 1133.289 0.5612142 838.5613
## 0.0870 1133.289 0.5612142 838.5613
## 0.0872 1133.289 0.5612142 838.5613
## 0.0874 1133.289 0.5612142 838.5613
## 0.0876 1133.289 0.5612142 838.5613
## 0.0878 1133.289 0.5612142 838.5613
## 0.0880 1133.289 0.5612142 838.5613
## 0.0882 1133.289 0.5612142 838.5613
## 0.0884 1133.289 0.5612142 838.5613
## 0.0886 1133.289 0.5612142 838.5613
## 0.0888 1133.289 0.5612142 838.5613
## 0.0890 1133.289 0.5612142 838.5613
## 0.0892 1133.289 0.5612142 838.5613
## 0.0894 1133.289 0.5612142 838.5613
## 0.0896 1133.289 0.5612142 838.5613
## 0.0898 1133.289 0.5612142 838.5613
## 0.0900 1133.289 0.5612142 838.5613
## 0.0902 1133.289 0.5612142 838.5613
## 0.0904 1133.289 0.5612142 838.5613
## 0.0906 1133.289 0.5612142 838.5613
## 0.0908 1133.289 0.5612142 838.5613
## 0.0910 1133.289 0.5612142 838.5613
## 0.0912 1133.289 0.5612142 838.5613
## 0.0914 1133.289 0.5612142 838.5613
## 0.0916 1133.289 0.5612142 838.5613
## 0.0918 1133.289 0.5612142 838.5613
## 0.0920 1133.289 0.5612142 838.5613
## 0.0922 1133.289 0.5612142 838.5613
## 0.0924 1133.289 0.5612142 838.5613
## 0.0926 1133.289 0.5612142 838.5613
## 0.0928 1133.289 0.5612142 838.5613
## 0.0930 1133.289 0.5612142 838.5613
## 0.0932 1133.289 0.5612142 838.5613
## 0.0934 1133.289 0.5612142 838.5613
## 0.0936 1133.289 0.5612142 838.5613
## 0.0938 1133.289 0.5612142 838.5613
## 0.0940 1133.289 0.5612142 838.5613
## 0.0942 1133.289 0.5612142 838.5613
## 0.0944 1133.289 0.5612142 838.5613
## 0.0946 1133.289 0.5612142 838.5613
## 0.0948 1133.289 0.5612142 838.5613
## 0.0950 1133.289 0.5612142 838.5613
## 0.0952 1133.289 0.5612142 838.5613
## 0.0954 1133.289 0.5612142 838.5613
## 0.0956 1133.289 0.5612142 838.5613
## 0.0958 1133.289 0.5612142 838.5613
## 0.0960 1133.289 0.5612142 838.5613
## 0.0962 1133.289 0.5612142 838.5613
## 0.0964 1133.289 0.5612142 838.5613
## 0.0966 1133.289 0.5612142 838.5613
## 0.0968 1133.289 0.5612142 838.5613
## 0.0970 1133.289 0.5612142 838.5613
## 0.0972 1133.289 0.5612142 838.5613
## 0.0974 1133.289 0.5612142 838.5613
## 0.0976 1133.289 0.5612142 838.5613
## 0.0978 1133.289 0.5612142 838.5613
## 0.0980 1133.289 0.5612142 838.5613
## 0.0982 1133.289 0.5612142 838.5613
## 0.0984 1133.289 0.5612142 838.5613
## 0.0986 1133.289 0.5612142 838.5613
## 0.0988 1133.289 0.5612142 838.5613
## 0.0990 1133.289 0.5612142 838.5613
## 0.0992 1133.289 0.5612142 838.5613
## 0.0994 1133.289 0.5612142 838.5613
## 0.0996 1133.289 0.5612142 838.5613
## 0.0998 1133.289 0.5612142 838.5613
## 0.1000 1133.289 0.5612142 838.5613
##
## Tuning parameter 'alpha' was held constant at a value of 0
## RMSE was used to select the optimal model using the smallest value.
## The final values used for the model were alpha = 0 and lambda = 0.1.
Model regresi Ridge menggunakan nilai alpha sebesar 0 dan nilai lambda sebesar 0,1. RMSE digunakan untuk memilih model optimal dengan menggunakan nilai RMSE terkecil.
# mean validation score
mean(Ridge_model$resample$RMSE)
## [1] 1133.289
Rata-rata skor validasi model RMSE adalah 1133.019.
Plot
#plotting the model
plot(Ridge_model, main = "Ridge Regression")
Dari plot di atas, dapat terlihat bahwa meskipun parameter regularisasi meningkat, RMSE tetap konstan.
Variable importance
#plotting important variables
plot(varImp(Ridge_model,scale=T))
Dari plot di atas, dapat terlihat bahwa peubah item_MRP
atau peubah harga eceran tertinggi merupakan peubah paling
penting dalam menentukan penjualan suatu produk. Kemudian,
peubah yang penting terhadap penjualan suatu produk selanjutnya adalah
peubah Outlet_Type, yaitu pada supermarket tipe 1.
Cara 2
Modelling
Cara lain dapat dilakukan dengan fungsi glmnet. Lambda diiterasi dari \(10^2\) sampai pada nilai 0.01 dengan selisih antar lambda = 0.1. Akan dibandingkan hasil prediksi data training dan testing pada cara ini, sehingga data yang digunakan adalah data partisi.
#Ridge Regression with library(glmnet)
train <- as.matrix(train)
lambdas <- 10^seq(2,-3, by=-0.1)
ridge_reg = glmnet(train[,-1], train[,1], nlambda = 25, alpha = 0, family = 'gaussian', lambda = lambdas)
summary(ridge_reg)
## Length Class Mode
## a0 51 -none- numeric
## beta 1071 dgCMatrix S4
## df 51 -none- numeric
## dim 2 -none- numeric
## lambda 51 -none- numeric
## dev.ratio 51 -none- numeric
## nulldev 1 -none- numeric
## npasses 1 -none- numeric
## jerr 1 -none- numeric
## offset 1 -none- logical
## call 7 -none- call
## nobs 1 -none- numeric
ridge_reg
##
## Call: glmnet::glmnet(x = train[, -1], y = train[, 1], nlambda = 25, alpha = 0, family = "gaussian", lambda = lambdas)
##
## Df %Dev Lambda
## 1 21 55.99 100.000
## 2 21 56.10 79.430
## 3 21 56.18 63.100
## 4 21 56.23 50.120
## 5 21 56.26 39.810
## 6 21 56.29 31.620
## 7 21 56.30 25.120
## 8 21 56.31 19.950
## 9 21 56.32 15.850
## 10 21 56.32 12.590
## 11 21 56.32 10.000
## 12 21 56.32 7.943
## 13 21 56.33 6.310
## 14 21 56.33 5.012
## 15 21 56.33 3.981
## 16 21 56.33 3.162
## 17 21 56.33 2.512
## 18 21 56.33 1.995
## 19 21 56.33 1.585
## 20 21 56.33 1.259
## 21 21 56.33 1.000
## 22 21 56.33 0.794
## 23 21 56.33 0.631
## 24 21 56.33 0.501
## 25 21 56.33 0.398
## 26 21 56.33 0.316
## 27 21 56.33 0.251
## 28 21 56.33 0.200
## 29 21 56.33 0.158
## 30 21 56.33 0.126
## 31 21 56.33 0.100
## 32 21 56.33 0.079
## 33 21 56.33 0.063
## 34 21 56.33 0.050
## 35 21 56.33 0.040
## 36 21 56.33 0.032
## 37 21 56.33 0.025
## 38 21 56.33 0.020
## 39 21 56.33 0.016
## 40 21 56.33 0.013
## 41 21 56.33 0.010
## 42 21 56.33 0.008
## 43 21 56.33 0.006
## 44 21 56.33 0.005
## 45 21 56.33 0.004
## 46 21 56.33 0.003
## 47 21 56.33 0.003
## 48 21 56.33 0.002
## 49 21 56.33 0.002
## 50 21 56.33 0.001
## 51 21 56.33 0.001
Tuning hyperparameter
Selanjutnya akan dilakukan tunning parameter dengan cross validation.
set.seed(1)
#tunning parameter lambda dg cv
cv_ridge <- cv.glmnet(train[,-1], train[,1], alpha = 0, lambda = lambdas)
optimal_lambda <- cv_ridge$lambda.min
optimal_lambda
## [1] 3.162278
didapatkan lambda optimal sebesar 3.162278.
Koefisien Regresi
coef(cv_ridge, s="lambda.min")
## 22 x 1 sparse Matrix of class "dgCMatrix"
## s1
## (Intercept) 2190.7600700
## Item_Weight 3.6699819
## Item_Fat_Contentlow fat 7.7696761
## Item_Fat_ContentLow Fat -18.2191098
## Item_Fat_Contentreg -0.3963248
## Item_Fat_ContentRegular 10.0907186
## Item_Visibility -13.9355920
## Item_MRP 971.7523433
## Outlet_IdentifierOUT013 259.0493696
## Outlet_IdentifierOUT017 227.0411481
## Outlet_IdentifierOUT018 198.1348335
## Outlet_IdentifierOUT019 -206.5180948
## Outlet_IdentifierOUT027 481.8333714
## Outlet_IdentifierOUT035 83.9596162
## Outlet_IdentifierOUT045 177.5334006
## Outlet_IdentifierOUT046 -8.8035524
## Outlet_IdentifierOUT049 120.0868649
## Outlet_TypeSupermarket Type1 518.6908330
## Outlet_TypeSupermarket Type2 203.9974049
## Outlet_TypeSupermarket Type3 479.7755872
## Outlet_Size_num -218.0322841
## Outlet_Location_Type_num 112.6411869
Output di atas merupakan nilai koefisien dari setiap peubah bebas
terhadap peubah respons (Sales). Dapat terlihat bahwa Peubah
Item_MRP merupakan peubah dengan koefisien positif
tertinggi yang berpengaruh terhadap model. Sehingga dapat disimpulkan
bahwa peubah ini merupakan peubah yang paling berpengaruh terhadap
peubah respons jika dibandingkan peubah bebas lainnya.
Nilai keakuratan prediksi dan Koefisien determinasi
# Compute R^2 from true and predicted values
eval_results <- function(true, predicted, df) {
SSE <- sum((predicted - true)^2)
SST <- sum((true - mean(true))^2)
R_square <- 1 - SSE / SST
RMSE = sqrt(SSE/nrow(df))
# Model performance metrics
data.frame(RMSE = RMSE,
Rsquare = R_square)
}
# Prediction and evaluation on train data
predictions_train <- predict(ridge_reg, s = optimal_lambda, newx = train[,-1])
eval_results(train[,1], predictions_train, train)
Dari hasil di atas, didapat nilai koefisien determinasi sebesar 56.32%. Dapat terlihat pula bahwa cara 2 ini memiliki Rata-rata skor validasi model RMSE sebesar 1140.715. Nilai ini sedikit lebih tinggi dibandingkan model pada cara 1 yaitu 1133.019.
Keakuratan data testing
test <- as.matrix(test)
predictions_test <- predict(ridge_reg, s = optimal_lambda, newx = test[,-1])
eval_results(test[,1], predictions_test, test)
Dari hasil di atas, didapat nilai koefisien determinasi sebesar 56.21% dan RMSE 1097.26. Hasil ini tidak terlalu berbeda jauh dengan data training. Artinya, tidak terdapat overfitting/underfitting pada training model.
LASSO Regression
“LASSO” merupakan akronim dari Least Absolute Shrinkage and Selection Operator. Regresi Lasso adalah algoritma klasifikasi yang menggunakan shrinkage pada dalam model sederhana dan model sparse (model dengan parameter yang lebih sedikit). Dalam Shrinkage/penyusutan, nilai data menyusut menuju titik pusat seperti rata-rata. Regresi Lasso sangat mirip dengan regresi ridge, yaitu sama-sama baik digunakan ketika model memiliki multikolinearitas yang tinggi. Perbedaan yang mencolok antara kedua model ini adalah pada nilai alpha (0 pada ridge dan 1 pada lasso). Nilai alpha ini berdampak terhadap pemilihan peubah, dengan regresi lasso merupakan regresi yang dapat memilih peubah penting saja sedangkan regresi ridge memasukan semua peubah.
Cara 1
Control Model
Syntax di bawah ini akan membuat variabel control model dengan metode cross-validation berulang, dengan banyaknya folds = 10 dan banyaknya ulangan = 5. Selain itu, pemilihan alpha = 1 pada syntax di bawah diperlukan untuk regresi lasso dan nilai lambda dari 0.001 hingga 0.1 dengan jarak antar lambda 0.0002.
# Model Building : Lasso Regression
set.seed(123)
control = trainControl(method ="repeatedcv",
number = 10,
repeats = 5,
verboseIter = F) #print iterasi
Grid_la_reg = expand.grid(alpha = 1,
lambda = seq(0.001, 0.1, by = 0.0002))
Modelling
Kemudian, akan dijalankan model regresi lasso berdasarkan control model di atas:
#fitting Lasso Regression model
lasso_model = train(x = data[, -c("Item_Identifier",
"Item_Outlet_Sales")],
y = data$Item_Outlet_Sales,
method = "glmnet",
trControl = control,
tuneGrid = Grid_la_reg
)
lasso_model
## glmnet
##
## 8523 samples
## 21 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 5 times)
## Summary of sample sizes: 7671, 7670, 7670, 7670, 7671, 7671, ...
## Resampling results across tuning parameters:
##
## lambda RMSE Rsquared MAE
## 0.0010 1128.862 0.5626525 837.2839
## 0.0012 1128.862 0.5626525 837.2839
## 0.0014 1128.862 0.5626525 837.2839
## 0.0016 1128.862 0.5626525 837.2839
## 0.0018 1128.862 0.5626525 837.2839
## 0.0020 1128.862 0.5626525 837.2839
## 0.0022 1128.862 0.5626525 837.2839
## 0.0024 1128.862 0.5626525 837.2839
## 0.0026 1128.862 0.5626525 837.2839
## 0.0028 1128.862 0.5626525 837.2839
## 0.0030 1128.862 0.5626525 837.2839
## 0.0032 1128.862 0.5626525 837.2839
## 0.0034 1128.862 0.5626525 837.2839
## 0.0036 1128.862 0.5626525 837.2839
## 0.0038 1128.862 0.5626525 837.2839
## 0.0040 1128.862 0.5626525 837.2839
## 0.0042 1128.862 0.5626525 837.2839
## 0.0044 1128.862 0.5626525 837.2839
## 0.0046 1128.862 0.5626525 837.2839
## 0.0048 1128.862 0.5626525 837.2839
## 0.0050 1128.862 0.5626525 837.2839
## 0.0052 1128.862 0.5626525 837.2839
## 0.0054 1128.862 0.5626525 837.2839
## 0.0056 1128.862 0.5626525 837.2839
## 0.0058 1128.862 0.5626525 837.2839
## 0.0060 1128.862 0.5626525 837.2839
## 0.0062 1128.862 0.5626525 837.2839
## 0.0064 1128.862 0.5626525 837.2839
## 0.0066 1128.862 0.5626525 837.2839
## 0.0068 1128.862 0.5626525 837.2839
## 0.0070 1128.862 0.5626525 837.2839
## 0.0072 1128.862 0.5626525 837.2839
## 0.0074 1128.862 0.5626525 837.2839
## 0.0076 1128.862 0.5626525 837.2839
## 0.0078 1128.862 0.5626525 837.2839
## 0.0080 1128.862 0.5626525 837.2839
## 0.0082 1128.862 0.5626525 837.2839
## 0.0084 1128.862 0.5626525 837.2839
## 0.0086 1128.862 0.5626525 837.2839
## 0.0088 1128.862 0.5626525 837.2839
## 0.0090 1128.862 0.5626525 837.2839
## 0.0092 1128.862 0.5626525 837.2839
## 0.0094 1128.862 0.5626525 837.2839
## 0.0096 1128.862 0.5626525 837.2839
## 0.0098 1128.862 0.5626525 837.2839
## 0.0100 1128.862 0.5626525 837.2839
## 0.0102 1128.862 0.5626525 837.2839
## 0.0104 1128.862 0.5626525 837.2839
## 0.0106 1128.862 0.5626525 837.2839
## 0.0108 1128.862 0.5626525 837.2839
## 0.0110 1128.862 0.5626525 837.2839
## 0.0112 1128.862 0.5626525 837.2839
## 0.0114 1128.862 0.5626525 837.2839
## 0.0116 1128.862 0.5626525 837.2839
## 0.0118 1128.862 0.5626525 837.2839
## 0.0120 1128.862 0.5626525 837.2839
## 0.0122 1128.862 0.5626525 837.2839
## 0.0124 1128.862 0.5626525 837.2839
## 0.0126 1128.862 0.5626525 837.2839
## 0.0128 1128.862 0.5626525 837.2839
## 0.0130 1128.862 0.5626525 837.2839
## 0.0132 1128.862 0.5626525 837.2839
## 0.0134 1128.862 0.5626525 837.2839
## 0.0136 1128.862 0.5626525 837.2839
## 0.0138 1128.862 0.5626525 837.2839
## 0.0140 1128.862 0.5626525 837.2839
## 0.0142 1128.862 0.5626525 837.2839
## 0.0144 1128.862 0.5626525 837.2839
## 0.0146 1128.862 0.5626525 837.2839
## 0.0148 1128.862 0.5626525 837.2839
## 0.0150 1128.862 0.5626525 837.2839
## 0.0152 1128.862 0.5626525 837.2839
## 0.0154 1128.862 0.5626525 837.2839
## 0.0156 1128.862 0.5626525 837.2839
## 0.0158 1128.862 0.5626525 837.2839
## 0.0160 1128.862 0.5626525 837.2839
## 0.0162 1128.862 0.5626525 837.2839
## 0.0164 1128.862 0.5626525 837.2839
## 0.0166 1128.862 0.5626525 837.2839
## 0.0168 1128.862 0.5626525 837.2839
## 0.0170 1128.862 0.5626525 837.2839
## 0.0172 1128.862 0.5626525 837.2839
## 0.0174 1128.862 0.5626525 837.2839
## 0.0176 1128.862 0.5626525 837.2839
## 0.0178 1128.862 0.5626525 837.2839
## 0.0180 1128.862 0.5626525 837.2839
## 0.0182 1128.862 0.5626525 837.2839
## 0.0184 1128.862 0.5626525 837.2839
## 0.0186 1128.862 0.5626525 837.2839
## 0.0188 1128.862 0.5626525 837.2839
## 0.0190 1128.862 0.5626525 837.2839
## 0.0192 1128.862 0.5626525 837.2839
## 0.0194 1128.862 0.5626525 837.2839
## 0.0196 1128.862 0.5626525 837.2839
## 0.0198 1128.862 0.5626525 837.2839
## 0.0200 1128.862 0.5626525 837.2839
## 0.0202 1128.862 0.5626525 837.2839
## 0.0204 1128.862 0.5626525 837.2839
## 0.0206 1128.862 0.5626525 837.2839
## 0.0208 1128.862 0.5626525 837.2839
## 0.0210 1128.862 0.5626525 837.2839
## 0.0212 1128.862 0.5626525 837.2839
## 0.0214 1128.862 0.5626525 837.2839
## 0.0216 1128.862 0.5626525 837.2839
## 0.0218 1128.862 0.5626525 837.2839
## 0.0220 1128.862 0.5626525 837.2839
## 0.0222 1128.862 0.5626525 837.2839
## 0.0224 1128.862 0.5626525 837.2839
## 0.0226 1128.862 0.5626525 837.2839
## 0.0228 1128.862 0.5626525 837.2839
## 0.0230 1128.862 0.5626525 837.2839
## 0.0232 1128.862 0.5626525 837.2839
## 0.0234 1128.862 0.5626525 837.2839
## 0.0236 1128.862 0.5626525 837.2839
## 0.0238 1128.862 0.5626525 837.2839
## 0.0240 1128.862 0.5626525 837.2839
## 0.0242 1128.862 0.5626525 837.2839
## 0.0244 1128.862 0.5626525 837.2839
## 0.0246 1128.862 0.5626525 837.2839
## 0.0248 1128.862 0.5626525 837.2839
## 0.0250 1128.862 0.5626525 837.2839
## 0.0252 1128.862 0.5626525 837.2839
## 0.0254 1128.862 0.5626525 837.2839
## 0.0256 1128.862 0.5626525 837.2839
## 0.0258 1128.862 0.5626525 837.2839
## 0.0260 1128.862 0.5626525 837.2839
## 0.0262 1128.862 0.5626525 837.2839
## 0.0264 1128.862 0.5626525 837.2839
## 0.0266 1128.862 0.5626525 837.2839
## 0.0268 1128.862 0.5626525 837.2839
## 0.0270 1128.862 0.5626525 837.2839
## 0.0272 1128.862 0.5626525 837.2839
## 0.0274 1128.862 0.5626525 837.2839
## 0.0276 1128.862 0.5626525 837.2839
## 0.0278 1128.862 0.5626525 837.2839
## 0.0280 1128.862 0.5626525 837.2839
## 0.0282 1128.862 0.5626525 837.2839
## 0.0284 1128.862 0.5626525 837.2839
## 0.0286 1128.862 0.5626525 837.2839
## 0.0288 1128.862 0.5626525 837.2839
## 0.0290 1128.862 0.5626525 837.2839
## 0.0292 1128.862 0.5626525 837.2839
## 0.0294 1128.862 0.5626525 837.2839
## 0.0296 1128.862 0.5626525 837.2839
## 0.0298 1128.862 0.5626525 837.2839
## 0.0300 1128.862 0.5626525 837.2839
## 0.0302 1128.862 0.5626525 837.2839
## 0.0304 1128.862 0.5626525 837.2839
## 0.0306 1128.862 0.5626525 837.2839
## 0.0308 1128.862 0.5626525 837.2839
## 0.0310 1128.862 0.5626525 837.2839
## 0.0312 1128.862 0.5626525 837.2839
## 0.0314 1128.862 0.5626525 837.2839
## 0.0316 1128.862 0.5626525 837.2839
## 0.0318 1128.862 0.5626525 837.2839
## 0.0320 1128.862 0.5626525 837.2839
## 0.0322 1128.862 0.5626525 837.2839
## 0.0324 1128.862 0.5626525 837.2839
## 0.0326 1128.862 0.5626525 837.2839
## 0.0328 1128.862 0.5626525 837.2839
## 0.0330 1128.862 0.5626525 837.2839
## 0.0332 1128.862 0.5626525 837.2839
## 0.0334 1128.862 0.5626525 837.2839
## 0.0336 1128.862 0.5626525 837.2839
## 0.0338 1128.862 0.5626525 837.2839
## 0.0340 1128.862 0.5626525 837.2839
## 0.0342 1128.862 0.5626525 837.2839
## 0.0344 1128.862 0.5626525 837.2839
## 0.0346 1128.862 0.5626525 837.2839
## 0.0348 1128.862 0.5626525 837.2839
## 0.0350 1128.862 0.5626525 837.2839
## 0.0352 1128.862 0.5626525 837.2839
## 0.0354 1128.862 0.5626525 837.2839
## 0.0356 1128.862 0.5626525 837.2839
## 0.0358 1128.862 0.5626525 837.2839
## 0.0360 1128.862 0.5626525 837.2839
## 0.0362 1128.862 0.5626525 837.2839
## 0.0364 1128.862 0.5626525 837.2839
## 0.0366 1128.862 0.5626525 837.2839
## 0.0368 1128.862 0.5626525 837.2839
## 0.0370 1128.862 0.5626525 837.2839
## 0.0372 1128.862 0.5626525 837.2839
## 0.0374 1128.862 0.5626525 837.2839
## 0.0376 1128.862 0.5626525 837.2839
## 0.0378 1128.862 0.5626525 837.2839
## 0.0380 1128.862 0.5626525 837.2839
## 0.0382 1128.862 0.5626525 837.2839
## 0.0384 1128.862 0.5626525 837.2839
## 0.0386 1128.862 0.5626525 837.2839
## 0.0388 1128.862 0.5626525 837.2839
## 0.0390 1128.862 0.5626525 837.2839
## 0.0392 1128.862 0.5626525 837.2839
## 0.0394 1128.862 0.5626525 837.2839
## 0.0396 1128.862 0.5626525 837.2839
## 0.0398 1128.862 0.5626525 837.2839
## 0.0400 1128.862 0.5626525 837.2839
## 0.0402 1128.862 0.5626525 837.2839
## 0.0404 1128.862 0.5626525 837.2839
## 0.0406 1128.862 0.5626525 837.2839
## 0.0408 1128.862 0.5626525 837.2839
## 0.0410 1128.862 0.5626525 837.2839
## 0.0412 1128.862 0.5626525 837.2839
## 0.0414 1128.862 0.5626525 837.2839
## 0.0416 1128.862 0.5626525 837.2839
## 0.0418 1128.862 0.5626525 837.2839
## 0.0420 1128.862 0.5626525 837.2839
## 0.0422 1128.862 0.5626525 837.2839
## 0.0424 1128.862 0.5626525 837.2839
## 0.0426 1128.862 0.5626525 837.2839
## 0.0428 1128.862 0.5626525 837.2839
## 0.0430 1128.862 0.5626525 837.2839
## 0.0432 1128.862 0.5626525 837.2839
## 0.0434 1128.862 0.5626525 837.2839
## 0.0436 1128.862 0.5626525 837.2839
## 0.0438 1128.862 0.5626525 837.2839
## 0.0440 1128.862 0.5626525 837.2839
## 0.0442 1128.862 0.5626525 837.2839
## 0.0444 1128.862 0.5626525 837.2839
## 0.0446 1128.862 0.5626525 837.2839
## 0.0448 1128.862 0.5626525 837.2839
## 0.0450 1128.862 0.5626525 837.2839
## 0.0452 1128.862 0.5626525 837.2839
## 0.0454 1128.862 0.5626525 837.2839
## 0.0456 1128.862 0.5626525 837.2839
## 0.0458 1128.862 0.5626525 837.2839
## 0.0460 1128.862 0.5626525 837.2839
## 0.0462 1128.862 0.5626525 837.2839
## 0.0464 1128.862 0.5626525 837.2839
## 0.0466 1128.862 0.5626525 837.2839
## 0.0468 1128.862 0.5626525 837.2839
## 0.0470 1128.862 0.5626525 837.2839
## 0.0472 1128.862 0.5626525 837.2839
## 0.0474 1128.862 0.5626525 837.2839
## 0.0476 1128.862 0.5626525 837.2839
## 0.0478 1128.862 0.5626525 837.2839
## 0.0480 1128.862 0.5626525 837.2839
## 0.0482 1128.862 0.5626525 837.2839
## 0.0484 1128.862 0.5626525 837.2839
## 0.0486 1128.862 0.5626525 837.2839
## 0.0488 1128.862 0.5626525 837.2839
## 0.0490 1128.862 0.5626525 837.2839
## 0.0492 1128.862 0.5626525 837.2839
## 0.0494 1128.862 0.5626525 837.2839
## 0.0496 1128.862 0.5626525 837.2839
## 0.0498 1128.862 0.5626525 837.2839
## 0.0500 1128.862 0.5626525 837.2839
## 0.0502 1128.862 0.5626525 837.2839
## 0.0504 1128.862 0.5626525 837.2839
## 0.0506 1128.862 0.5626525 837.2839
## 0.0508 1128.862 0.5626525 837.2839
## 0.0510 1128.862 0.5626525 837.2839
## 0.0512 1128.862 0.5626525 837.2839
## 0.0514 1128.862 0.5626525 837.2839
## 0.0516 1128.862 0.5626525 837.2839
## 0.0518 1128.862 0.5626525 837.2839
## 0.0520 1128.862 0.5626525 837.2839
## 0.0522 1128.862 0.5626525 837.2839
## 0.0524 1128.862 0.5626525 837.2839
## 0.0526 1128.862 0.5626525 837.2839
## 0.0528 1128.862 0.5626525 837.2839
## 0.0530 1128.862 0.5626525 837.2839
## 0.0532 1128.862 0.5626525 837.2839
## 0.0534 1128.862 0.5626525 837.2839
## 0.0536 1128.862 0.5626525 837.2839
## 0.0538 1128.862 0.5626525 837.2839
## 0.0540 1128.862 0.5626525 837.2839
## 0.0542 1128.862 0.5626525 837.2839
## 0.0544 1128.862 0.5626525 837.2839
## 0.0546 1128.862 0.5626525 837.2839
## 0.0548 1128.862 0.5626525 837.2839
## 0.0550 1128.862 0.5626525 837.2839
## 0.0552 1128.862 0.5626525 837.2839
## 0.0554 1128.862 0.5626525 837.2839
## 0.0556 1128.862 0.5626525 837.2839
## 0.0558 1128.862 0.5626525 837.2839
## 0.0560 1128.862 0.5626525 837.2839
## 0.0562 1128.862 0.5626525 837.2839
## 0.0564 1128.862 0.5626525 837.2839
## 0.0566 1128.862 0.5626525 837.2839
## 0.0568 1128.862 0.5626525 837.2839
## 0.0570 1128.862 0.5626525 837.2839
## 0.0572 1128.862 0.5626525 837.2839
## 0.0574 1128.862 0.5626525 837.2839
## 0.0576 1128.862 0.5626525 837.2839
## 0.0578 1128.862 0.5626525 837.2839
## 0.0580 1128.862 0.5626525 837.2839
## 0.0582 1128.862 0.5626525 837.2839
## 0.0584 1128.862 0.5626525 837.2839
## 0.0586 1128.862 0.5626525 837.2839
## 0.0588 1128.862 0.5626525 837.2839
## 0.0590 1128.862 0.5626525 837.2839
## 0.0592 1128.862 0.5626525 837.2839
## 0.0594 1128.862 0.5626525 837.2839
## 0.0596 1128.862 0.5626525 837.2839
## 0.0598 1128.862 0.5626525 837.2839
## 0.0600 1128.862 0.5626525 837.2839
## 0.0602 1128.862 0.5626525 837.2839
## 0.0604 1128.862 0.5626525 837.2839
## 0.0606 1128.862 0.5626525 837.2839
## 0.0608 1128.862 0.5626525 837.2839
## 0.0610 1128.862 0.5626525 837.2839
## 0.0612 1128.862 0.5626525 837.2839
## 0.0614 1128.862 0.5626525 837.2839
## 0.0616 1128.862 0.5626525 837.2839
## 0.0618 1128.862 0.5626525 837.2839
## 0.0620 1128.862 0.5626525 837.2839
## 0.0622 1128.862 0.5626525 837.2839
## 0.0624 1128.862 0.5626525 837.2839
## 0.0626 1128.862 0.5626525 837.2839
## 0.0628 1128.862 0.5626525 837.2839
## 0.0630 1128.862 0.5626525 837.2839
## 0.0632 1128.862 0.5626525 837.2839
## 0.0634 1128.862 0.5626525 837.2839
## 0.0636 1128.862 0.5626525 837.2839
## 0.0638 1128.862 0.5626525 837.2839
## 0.0640 1128.862 0.5626525 837.2839
## 0.0642 1128.862 0.5626525 837.2839
## 0.0644 1128.862 0.5626525 837.2839
## 0.0646 1128.862 0.5626525 837.2839
## 0.0648 1128.862 0.5626525 837.2839
## 0.0650 1128.862 0.5626525 837.2839
## 0.0652 1128.862 0.5626525 837.2839
## 0.0654 1128.862 0.5626525 837.2839
## 0.0656 1128.862 0.5626525 837.2839
## 0.0658 1128.862 0.5626525 837.2839
## 0.0660 1128.862 0.5626525 837.2839
## 0.0662 1128.862 0.5626525 837.2839
## 0.0664 1128.862 0.5626525 837.2839
## 0.0666 1128.862 0.5626525 837.2839
## 0.0668 1128.862 0.5626525 837.2839
## 0.0670 1128.862 0.5626525 837.2839
## 0.0672 1128.862 0.5626525 837.2839
## 0.0674 1128.862 0.5626525 837.2839
## 0.0676 1128.862 0.5626525 837.2839
## 0.0678 1128.862 0.5626525 837.2839
## 0.0680 1128.862 0.5626525 837.2839
## 0.0682 1128.862 0.5626525 837.2839
## 0.0684 1128.862 0.5626525 837.2839
## 0.0686 1128.862 0.5626525 837.2839
## 0.0688 1128.862 0.5626525 837.2839
## 0.0690 1128.862 0.5626525 837.2839
## 0.0692 1128.862 0.5626525 837.2839
## 0.0694 1128.862 0.5626525 837.2839
## 0.0696 1128.862 0.5626525 837.2839
## 0.0698 1128.862 0.5626525 837.2839
## 0.0700 1128.862 0.5626525 837.2839
## 0.0702 1128.862 0.5626525 837.2839
## 0.0704 1128.862 0.5626525 837.2839
## 0.0706 1128.862 0.5626525 837.2839
## 0.0708 1128.862 0.5626525 837.2839
## 0.0710 1128.862 0.5626525 837.2839
## 0.0712 1128.862 0.5626525 837.2839
## 0.0714 1128.862 0.5626525 837.2839
## 0.0716 1128.862 0.5626525 837.2839
## 0.0718 1128.862 0.5626525 837.2839
## 0.0720 1128.862 0.5626525 837.2839
## 0.0722 1128.862 0.5626525 837.2839
## 0.0724 1128.862 0.5626525 837.2839
## 0.0726 1128.862 0.5626525 837.2839
## 0.0728 1128.862 0.5626525 837.2839
## 0.0730 1128.862 0.5626525 837.2839
## 0.0732 1128.862 0.5626525 837.2839
## 0.0734 1128.862 0.5626525 837.2839
## 0.0736 1128.862 0.5626525 837.2839
## 0.0738 1128.862 0.5626525 837.2839
## 0.0740 1128.862 0.5626525 837.2839
## 0.0742 1128.862 0.5626525 837.2839
## 0.0744 1128.862 0.5626525 837.2839
## 0.0746 1128.862 0.5626525 837.2839
## 0.0748 1128.862 0.5626525 837.2839
## 0.0750 1128.862 0.5626525 837.2839
## 0.0752 1128.862 0.5626525 837.2839
## 0.0754 1128.862 0.5626525 837.2839
## 0.0756 1128.862 0.5626525 837.2839
## 0.0758 1128.862 0.5626525 837.2839
## 0.0760 1128.862 0.5626525 837.2839
## 0.0762 1128.862 0.5626525 837.2839
## 0.0764 1128.862 0.5626525 837.2839
## 0.0766 1128.862 0.5626525 837.2839
## 0.0768 1128.862 0.5626525 837.2839
## 0.0770 1128.862 0.5626525 837.2839
## 0.0772 1128.862 0.5626525 837.2839
## 0.0774 1128.862 0.5626525 837.2839
## 0.0776 1128.862 0.5626525 837.2839
## 0.0778 1128.862 0.5626525 837.2839
## 0.0780 1128.862 0.5626525 837.2839
## 0.0782 1128.862 0.5626525 837.2839
## 0.0784 1128.862 0.5626525 837.2839
## 0.0786 1128.862 0.5626525 837.2839
## 0.0788 1128.862 0.5626525 837.2839
## 0.0790 1128.862 0.5626525 837.2839
## 0.0792 1128.862 0.5626525 837.2839
## 0.0794 1128.862 0.5626525 837.2839
## 0.0796 1128.862 0.5626525 837.2839
## 0.0798 1128.862 0.5626525 837.2839
## 0.0800 1128.862 0.5626525 837.2839
## 0.0802 1128.862 0.5626525 837.2839
## 0.0804 1128.862 0.5626525 837.2839
## 0.0806 1128.862 0.5626525 837.2839
## 0.0808 1128.862 0.5626525 837.2839
## 0.0810 1128.862 0.5626525 837.2839
## 0.0812 1128.862 0.5626525 837.2839
## 0.0814 1128.862 0.5626525 837.2839
## 0.0816 1128.862 0.5626525 837.2839
## 0.0818 1128.862 0.5626525 837.2839
## 0.0820 1128.862 0.5626525 837.2839
## 0.0822 1128.862 0.5626525 837.2839
## 0.0824 1128.862 0.5626525 837.2839
## 0.0826 1128.862 0.5626525 837.2839
## 0.0828 1128.862 0.5626525 837.2839
## 0.0830 1128.862 0.5626525 837.2839
## 0.0832 1128.862 0.5626525 837.2839
## 0.0834 1128.862 0.5626525 837.2839
## 0.0836 1128.862 0.5626525 837.2839
## 0.0838 1128.862 0.5626525 837.2839
## 0.0840 1128.862 0.5626525 837.2839
## 0.0842 1128.862 0.5626525 837.2839
## 0.0844 1128.862 0.5626525 837.2839
## 0.0846 1128.862 0.5626525 837.2839
## 0.0848 1128.862 0.5626525 837.2839
## 0.0850 1128.862 0.5626525 837.2839
## 0.0852 1128.862 0.5626525 837.2839
## 0.0854 1128.862 0.5626525 837.2839
## 0.0856 1128.862 0.5626525 837.2839
## 0.0858 1128.862 0.5626525 837.2839
## 0.0860 1128.862 0.5626525 837.2839
## 0.0862 1128.862 0.5626525 837.2839
## 0.0864 1128.862 0.5626525 837.2839
## 0.0866 1128.862 0.5626525 837.2839
## 0.0868 1128.862 0.5626525 837.2839
## 0.0870 1128.862 0.5626525 837.2839
## 0.0872 1128.862 0.5626525 837.2839
## 0.0874 1128.862 0.5626525 837.2839
## 0.0876 1128.862 0.5626525 837.2839
## 0.0878 1128.862 0.5626525 837.2839
## 0.0880 1128.862 0.5626525 837.2839
## 0.0882 1128.862 0.5626525 837.2839
## 0.0884 1128.862 0.5626525 837.2839
## 0.0886 1128.862 0.5626525 837.2839
## 0.0888 1128.862 0.5626525 837.2839
## 0.0890 1128.862 0.5626525 837.2839
## 0.0892 1128.862 0.5626525 837.2839
## 0.0894 1128.862 0.5626525 837.2839
## 0.0896 1128.862 0.5626525 837.2839
## 0.0898 1128.862 0.5626525 837.2839
## 0.0900 1128.862 0.5626525 837.2839
## 0.0902 1128.862 0.5626525 837.2839
## 0.0904 1128.862 0.5626525 837.2839
## 0.0906 1128.862 0.5626525 837.2839
## 0.0908 1128.862 0.5626525 837.2839
## 0.0910 1128.862 0.5626525 837.2839
## 0.0912 1128.862 0.5626525 837.2839
## 0.0914 1128.862 0.5626525 837.2839
## 0.0916 1128.862 0.5626525 837.2839
## 0.0918 1128.862 0.5626525 837.2839
## 0.0920 1128.862 0.5626525 837.2839
## 0.0922 1128.862 0.5626525 837.2839
## 0.0924 1128.862 0.5626525 837.2839
## 0.0926 1128.862 0.5626525 837.2839
## 0.0928 1128.862 0.5626525 837.2839
## 0.0930 1128.862 0.5626525 837.2839
## 0.0932 1128.862 0.5626525 837.2839
## 0.0934 1128.862 0.5626525 837.2839
## 0.0936 1128.862 0.5626525 837.2839
## 0.0938 1128.862 0.5626525 837.2839
## 0.0940 1128.862 0.5626525 837.2839
## 0.0942 1128.862 0.5626525 837.2839
## 0.0944 1128.862 0.5626525 837.2839
## 0.0946 1128.862 0.5626525 837.2839
## 0.0948 1128.862 0.5626525 837.2839
## 0.0950 1128.862 0.5626525 837.2839
## 0.0952 1128.862 0.5626525 837.2839
## 0.0954 1128.862 0.5626525 837.2839
## 0.0956 1128.862 0.5626525 837.2839
## 0.0958 1128.862 0.5626525 837.2839
## 0.0960 1128.862 0.5626525 837.2839
## 0.0962 1128.862 0.5626525 837.2839
## 0.0964 1128.862 0.5626525 837.2839
## 0.0966 1128.862 0.5626525 837.2839
## 0.0968 1128.862 0.5626525 837.2839
## 0.0970 1128.862 0.5626525 837.2839
## 0.0972 1128.862 0.5626525 837.2839
## 0.0974 1128.862 0.5626525 837.2839
## 0.0976 1128.862 0.5626525 837.2839
## 0.0978 1128.862 0.5626525 837.2839
## 0.0980 1128.862 0.5626525 837.2839
## 0.0982 1128.862 0.5626525 837.2839
## 0.0984 1128.862 0.5626525 837.2839
## 0.0986 1128.862 0.5626525 837.2839
## 0.0988 1128.862 0.5626525 837.2839
## 0.0990 1128.862 0.5626525 837.2839
## 0.0992 1128.862 0.5626525 837.2839
## 0.0994 1128.862 0.5626525 837.2839
## 0.0996 1128.862 0.5626525 837.2839
## 0.0998 1128.862 0.5626525 837.2839
## 0.1000 1128.862 0.5626525 837.2839
##
## Tuning parameter 'alpha' was held constant at a value of 1
## RMSE was used to select the optimal model using the smallest value.
## The final values used for the model were alpha = 1 and lambda = 0.1.
Model regresi Lasso menggunakan nilai alpha sebesar 1 dan nilai lambda sebesar 0,1. RMSE digunakan untuk memilih model optimal dengan menggunakan nilai RMSE terkecil.
# mean validation score
mean(lasso_model$resample$RMSE)
## [1] 1128.862
Rata-rata skor validasi model adalah 1128.862.
Plot
#plotting the model
plot(lasso_model, main = "Lasso Regression")
Dari plot di atas, dapat terlihat bahwa meskipun parameter regularisasi meningkat, RMSE tetap konstan.
Variable importance
#plotting important variables
plot(varImp(lasso_model,scale=T))
Dari plot di atas, dapat terlihat bahwa peubah item_MRP
atau peubah harga eceran tertinggi merupakan peubah paling
penting dalam menentukan penjualan suatu produk. Kemudian,
peubah yang penting terhadap penjualan suatu produk selanjutnya adalah
peubah Outlet_Type, yaitu pada supermarket tipe 1.
Cara 2
Modelling
Cara lain dapat dilakukan dengan fungsi glmnet. Lambda diiterasi dari \(10^2\) sampai pada nilai 0.01 dengan selisih antar lambda = 0.1. Akan dibandingkan hasil prediksi data training dan testing pada cara ini, sehingga data yang digunakan adalah data partisi.
#Ridge Regression with library(glmnet)
lambdas <- 10^seq(2,-3, by=-0.1)
lasso_reg = glmnet(as.matrix(train[,-1]), train[,1], alpha = 1,
lambda = lambdas, standardize = TRUE)
summary(lasso_reg)
## Length Class Mode
## a0 51 -none- numeric
## beta 1071 dgCMatrix S4
## df 51 -none- numeric
## dim 2 -none- numeric
## lambda 51 -none- numeric
## dev.ratio 51 -none- numeric
## nulldev 1 -none- numeric
## npasses 1 -none- numeric
## jerr 1 -none- numeric
## offset 1 -none- logical
## call 6 -none- call
## nobs 1 -none- numeric
lasso_reg
##
## Call: glmnet::glmnet(x = as.matrix(train[, -1]), y = train[, 1], alpha = 1, lambda = lambdas, standardize = TRUE)
##
## Df %Dev Lambda
## 1 5 51.10 100.000
## 2 8 52.95 79.430
## 3 9 54.13 63.100
## 4 9 54.88 50.120
## 5 10 55.36 39.810
## 6 12 55.69 31.620
## 7 13 55.92 25.120
## 8 12 56.06 19.950
## 9 13 56.16 15.850
## 10 13 56.22 12.590
## 11 14 56.26 10.000
## 12 14 56.28 7.943
## 13 16 56.30 6.310
## 14 16 56.31 5.012
## 15 16 56.32 3.981
## 16 17 56.32 3.162
## 17 17 56.32 2.512
## 18 17 56.32 1.995
## 19 17 56.33 1.585
## 20 18 56.33 1.259
## 21 18 56.33 1.000
## 22 18 56.33 0.794
## 23 18 56.33 0.631
## 24 19 56.33 0.501
## 25 19 56.33 0.398
## 26 19 56.33 0.316
## 27 19 56.33 0.251
## 28 19 56.33 0.200
## 29 19 56.33 0.158
## 30 20 56.33 0.126
## 31 20 56.33 0.100
## 32 20 56.33 0.079
## 33 20 56.33 0.063
## 34 20 56.33 0.050
## 35 20 56.33 0.040
## 36 20 56.33 0.032
## 37 20 56.33 0.025
## 38 20 56.33 0.020
## 39 20 56.33 0.016
## 40 20 56.33 0.013
## 41 20 56.33 0.010
## 42 20 56.33 0.008
## 43 20 56.33 0.006
## 44 20 56.33 0.005
## 45 20 56.33 0.004
## 46 20 56.33 0.003
## 47 20 56.33 0.003
## 48 20 56.33 0.002
## 49 20 56.33 0.002
## 50 20 56.33 0.001
## 51 20 56.33 0.001
Tuning hyperparameter
Selanjutnya akan dilakukan tunning parameter dengan cross validation.
set.seed(1)
#tunning parameter lambda dg cv
cv_lasso <- cv.glmnet(train[,-1], train[,1], alpha = 1, lambda = lambdas, standarize=T)
lambda_best <- cv_lasso$lambda.min
lambda_best
## [1] 3.981072
didapatkan lambda optimal sebesar 3.981072
Koefisien Regresi
coef(cv_lasso, s="lambda.min")
## 22 x 1 sparse Matrix of class "dgCMatrix"
## s1
## (Intercept) 2190.772189
## Item_Weight .
## Item_Fat_Contentlow fat 3.176408
## Item_Fat_ContentLow Fat -20.047204
## Item_Fat_Contentreg .
## Item_Fat_ContentRegular 4.001664
## Item_Visibility -12.424707
## Item_MRP 969.818298
## Outlet_IdentifierOUT013 .
## Outlet_IdentifierOUT017 10.467808
## Outlet_IdentifierOUT018 455.210425
## Outlet_IdentifierOUT019 -16.689346
## Outlet_IdentifierOUT027 597.157719
## Outlet_IdentifierOUT035 33.988801
## Outlet_IdentifierOUT045 -32.303546
## Outlet_IdentifierOUT046 -8.533902
## Outlet_IdentifierOUT049 29.780375
## Outlet_TypeSupermarket Type1 892.157136
## Outlet_TypeSupermarket Type2 14.938496
## Outlet_TypeSupermarket Type3 433.372237
## Outlet_Size_num .
## Outlet_Location_Type_num .
Hal yang membedakan output di atas dengan model ridge adalah hilangnya koefisien pada peubah yang tidak berpengaruh signifikan terhadap model.
Output di atas merupakan nilai koefisien dari setiap peubah bebas
terhadap peubah respons (Sales). Dapat terlihat bahwa Peubah
Item_MRP merupakan peubah dengan koefisien positif
tertinggi yang berpengaruh terhadap model. Sehingga dapat disimpulkan
bahwa peubah ini merupakan peubah yang paling berpengaruh terhadap
peubah respons jika dibandingkan peubah bebas lainnya.
Nilai keakuratan prediksi dan Koefisien determinasi
# Prediction and evaluation on train data
predictions_train <- predict(lasso_reg, s = lambda_best, newx = train[,-1])
eval_results(train[,1], predictions_train, train)
Dari hasil di atas, didapat nilai koefisien determinasi sebesar 56.31%. Dapat terlihat pula bahwa cara 2 ini memiliki Rata-rata skor validasi model RMSE sebesar 1140.872. Nilai ini sedikit lebih tinggi dibandingkan model pada cara 1 yaitu 1128.862.
Keakuratan data testing
predictions_test <- predict(lasso_reg, s = lambda_best, newx = test[,-1])
eval_results(test[,1], predictions_test, test)
Dari hasil di atas, didapat nilai koefisien determinasi sebesar 56.21% dan RMSE 1097.24. Hasil ini tidak terlalu berbeda jauh dengan data training. Artinya, tidak terdapat overfitting/underfitting pada training model.
Model Averaging
mod1 <- lm(Item_Outlet_Sales~., data = data[,-1], na.action = na.fail)
#mod2 <- dredge(mod1, m.lim=c(21,22))
# Model 2 di atas tidak dapat dijalankan karena error
Setelah berkali-kali try and error, dan mencari cara ke google. Error global.model di atas akan terus muncul berapapun kali dicoba. Adapun kemungkinan kenapa ini dapat terjadi adalah karena data yang digunakan tidak cocok untuk syntax yang tersedia. Untuk itu, solusi yang dapat dilakukan adalah dengan mengganti data untuk analisis. Data di bawah ini mengikuti data contoh di kuliah dengan beberapa pergantian nilai mean dan sd.
set.seed(123)
x <- cbind(1,matrix(rnorm(100*20,5,3), 100, 20))
e <- matrix(rnorm(100),100,1)
b <- c(1,rep(0:4,each=4))
y <- x%*%b+e
dt.all <- data.frame(y,x[, -1])
Sehingga didapat:
mod1 <- lm(y~.,data=dt.all, na.action = na.fail)
mod2 <- dredge(global.model=mod1, m.lim=c(18,20))
## Fixed term is "(Intercept)"
mod3 <- model.avg(mod2, delta<4)
mod3
##
## Call:
## model.avg(object = mod2, subset = delta < 4)
##
## Component models:
## '2+3+4+5+6+7+8+9+10+11+12+13+14+16+17+18+19+20'
## '1+2+3+4+5+6+7+8+9+10+11+13+14+16+17+18+19+20'
## '2+3+4+5+6+7+8+9+10+11+13+14+15+16+17+18+19+20'
## '1+2+3+4+5+6+7+8+9+10+11+12+13+14+16+17+18+19+20'
## '1+2+3+4+5+6+7+8+9+10+11+12+13+16+17+18+19+20'
## '2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20'
## '1+2+3+4+5+6+7+8+9+10+11+13+14+15+16+17+18+19+20'
## '1+2+3+4+5+6+7+8+9+10+11+13+15+16+17+18+19+20'
## '2+3+4+5+6+7+8+9+10+11+12+13+15+16+17+18+19+20'
##
## Coefficients:
## (Intercept) X10 X11 X12 X13 X14 X15
## full 1.071163 2.008017 2.050216 2.006872 2.956322 3.009049 3.011422
## subset 1.071163 2.008017 2.050216 2.006872 2.956322 3.009049 3.011422
## X16 X17 X18 X19 X2 X20 X3
## full 2.98823 3.988329 3.981979 4.010674 -0.01071991 3.951602 0.05160856
## subset 2.98823 3.988329 3.981979 4.010674 -0.02305327 3.951602 0.06016359
## X5 X6 X7 X8 X9 X1 X4
## full 1.00839 0.9979606 1.005464 0.9593162 1.996802 -0.01124941 -0.0002600121
## subset 1.00839 0.9979606 1.005464 0.9593162 1.996802 -0.02418151 -0.0006876929
summary(mod3)
##
## Call:
## model.avg(object = mod2, subset = delta < 4)
##
## Component model call:
## lm(formula = y ~ <9 unique rhs>, data = dt.all, na.action = na.fail)
##
## Component models:
## df logLik AICc delta weight
## 2+3+4+5+6+7+8+9+10+11+12+13+14+16+17+18+19+20 20 -121.78 294.19 0.00 0.25
## 1+2+3+4+5+6+7+8+9+10+11+13+14+16+17+18+19+20 20 -121.79 294.21 0.03 0.25
## 2+3+4+5+6+7+8+9+10+11+13+14+15+16+17+18+19+20 20 -122.03 294.69 0.50 0.19
## 1+2+3+4+5+6+7+8+9+10+11+12+13+14+16+17+18+19+20 21 -121.50 296.85 2.67 0.07
## 1+2+3+4+5+6+7+8+9+10+11+12+13+16+17+18+19+20 20 -123.22 297.08 2.90 0.06
## 2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20 21 -121.78 297.40 3.21 0.05
## 1+2+3+4+5+6+7+8+9+10+11+13+14+15+16+17+18+19+20 21 -121.78 297.41 3.23 0.05
## 1+2+3+4+5+6+7+8+9+10+11+13+15+16+17+18+19+20 20 -123.52 297.68 3.49 0.04
## 2+3+4+5+6+7+8+9+10+11+12+13+15+16+17+18+19+20 20 -123.62 297.87 3.68 0.04
##
## Term codes:
## X1 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X2 X20 X3 X4 X5 X6 X7 X8 X9
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
##
## Model-averaged coefficients:
## (full average)
## Estimate Std. Error Adjusted SE z value Pr(>|z|)
## (Intercept) 1.07116 0.72759 0.73779 1.452 0.147
## X10 2.00802 0.03333 0.03384 59.343 <2e-16 ***
## X11 2.05022 0.03563 0.03617 56.683 <2e-16 ***
## X12 2.00687 0.03408 0.03460 58.003 <2e-16 ***
## X13 2.95632 0.03693 0.03749 78.865 <2e-16 ***
## X14 3.00905 0.03408 0.03460 86.979 <2e-16 ***
## X15 3.01142 0.03348 0.03399 88.608 <2e-16 ***
## X16 2.98823 0.03905 0.03964 75.393 <2e-16 ***
## X17 3.98833 0.03294 0.03343 119.315 <2e-16 ***
## X18 3.98198 0.03250 0.03300 120.680 <2e-16 ***
## X19 4.01067 0.03172 0.03220 124.560 <2e-16 ***
## X2 -0.01072 0.02665 0.02698 0.397 0.691
## X20 3.95160 0.03052 0.03099 127.527 <2e-16 ***
## X3 0.05161 0.03861 0.03902 1.323 0.186
## X5 1.00839 0.03356 0.03407 29.596 <2e-16 ***
## X6 0.99796 0.03628 0.03683 27.097 <2e-16 ***
## X7 1.00546 0.03163 0.03211 31.314 <2e-16 ***
## X8 0.95932 0.03310 0.03360 28.547 <2e-16 ***
## X9 1.99680 0.03060 0.03106 64.289 <2e-16 ***
## X1 -0.01125 0.02764 0.02798 0.402 0.688
## X4 -0.00026 0.02081 0.02112 0.012 0.990
##
## (conditional average)
## Estimate Std. Error Adjusted SE z value Pr(>|z|)
## (Intercept) 1.0711630 0.7275932 0.7377926 1.452 0.1465
## X10 2.0080173 0.0333318 0.0338374 59.343 <2e-16 ***
## X11 2.0502157 0.0356305 0.0361701 56.683 <2e-16 ***
## X12 2.0068720 0.0340830 0.0345997 58.003 <2e-16 ***
## X13 2.9563223 0.0369275 0.0374859 78.865 <2e-16 ***
## X14 3.0090492 0.0340803 0.0345952 86.979 <2e-16 ***
## X15 3.0114222 0.0334828 0.0339858 88.608 <2e-16 ***
## X16 2.9882304 0.0390479 0.0396356 75.393 <2e-16 ***
## X17 3.9883287 0.0329359 0.0334270 119.315 <2e-16 ***
## X18 3.9819790 0.0325032 0.0329962 120.680 <2e-16 ***
## X19 4.0106737 0.0317181 0.0321987 124.560 <2e-16 ***
## X2 -0.0230533 0.0352635 0.0357996 0.644 0.5196
## X20 3.9516020 0.0305250 0.0309865 127.527 <2e-16 ***
## X3 0.0601636 0.0349715 0.0355028 1.695 0.0901 .
## X5 1.0083895 0.0335650 0.0340716 29.596 <2e-16 ***
## X6 0.9979606 0.0362814 0.0368294 27.097 <2e-16 ***
## X7 1.0054642 0.0316295 0.0321091 31.314 <2e-16 ***
## X8 0.9593162 0.0331045 0.0336045 28.547 <2e-16 ***
## X9 1.9968019 0.0305963 0.0310596 64.289 <2e-16 ***
## X1 -0.0241815 0.0364652 0.0370171 0.653 0.5136
## X4 -0.0006877 0.0338357 0.0343489 0.020 0.9840
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Hasil di atas menunjukkan bahwa model terbaik yang dapat menggambarkan peubah y adalah model dengan peubah X5 hingga X10 pada taraf nyata 5%.
2. Variable Selection
Library
library(tidyverse)
library(mlr3verse)
library(mlr3fselect)
library(DataExplorer)
library(skimr)
library(corrplot)
library(leaps)
library(factoextra)
library(FactoMineR)
library(tidyverse)
library(googlesheets4)
Data
Data yang digunakan pada section ini adalah data sekunder yang diperoleh dari hasil publikasi Kementerian Pendidikan dan Kebudayaan, Badan Pusat Statistik Jawa Barat dan Dinas Kesehatan Provinsi Jawa Barat. Data terdiri dari sepuluh peubah penjelas dan satu peubah respons dari masing-masing kabupaten/kota di Jawa Barat pada tahun 2020. Peubah yang digunakan adalah sebagai berikut:
Data di atas terdiri atas 27 Kabupaten/Kota di Jawa Barat dan bisa dilihat pada link berikut ini: IPM dan faktor-faktornya
gs4_deauth()
ipm <- read_sheet("https://docs.google.com/spreadsheets/d/1vWCtJ2brrMoVPj6u8tTuZJ_PddK2O9thYY90tlyScmc/edit#gid=310882767", skip=1)
## ✔ Reading from "IPM dan faktor-faktornya".
## ✔ Range '2:5000000'.
ipm <- ipm[-c(1:5)]
glimpse(ipm)
## Rows: 27
## Columns: 11
## $ Y <dbl> 70.40, 66.88, 65.36, 72.39, 66.12, 65.67, 70.49, 69.38, 68.75, 67.…
## $ X1 <dbl> 2246, 596, 590, 2167, 858, 688, 849, 979, 2244, 1005, 760, 852, 85…
## $ X2 <dbl> 71.17, 70.97, 70.13, 73.53, 71.41, 69.47, 71.83, 73.59, 71.99, 70.…
## $ X3 <dbl> 38.78738, 27.28164, 20.98790, 32.11512, 22.01403, 21.32821, 26.607…
## $ X4 <dbl> 8.30, 7.07, 7.18, 8.96, 7.52, 7.35, 7.70, 7.57, 6.92, 7.27, 8.51, …
## $ X5 <dbl> 9295.0122, 9182.9703, 6289.8000, 10555.1102, 10140.9115, 13102.313…
## $ X6 <dbl> 7.648689, 7.088440, 10.354949, 6.879803, 9.966484, 10.338837, 7.60…
## $ X7 <dbl> 29, 9, 5, 10, 7, 2, 6, 12, 12, 5, 3, 11, 9, 11, 25, 50, 9, 1, 23, …
## $ X8 <dbl> 36, 31, 32, 33, 27, 28, 27, 29, 28, 31, 30, 27, 28, 33, 33, 28, 33…
## $ X9 <dbl> 1603.54, 1269.10, 1091.56, 1466.04, 971.39, 1609.53, 1316.56, 899.…
## $ X10 <dbl> 62.65, 61.56, 69.26, 62.20, 61.11, 69.54, 71.41, 61.98, 63.79, 69.…
Exploratory Data Analysis (EDA)
1. Memeriksa Gambaran Umum Data
plot_intro(data = ipm,
geom_label_args = list(size=2.5))
Dari plot di atas, dapat terlihat bahwa tidak ada peubah diskret (semua peubah merupakan peubah kontinu). Selain itu, dapat terlihat juga bahwa tidak terdapat missing value pada data di atas. Sehingga, tidak perlu penanganan missing value. Catatan:
plot_intromerupakan fungsi yang berasal dari packageDataExplorerdan argumen utamanya adalah object berbentukdata.frame.- argumen
geom_label_argsbisa diisi dengan opsi-opsi yang ada pada fungsigeom_labelpada packageggplot2.
2. Memeriksa Sebaran Data
plot_histogram(data = ipm, nrow=3, ncol = 4,
geom_histogram_args = list(fill="steelblue")
)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Dari gambar di atas, dapat terlihat bahwa tidak semua peubah menyebar secara simetris. Seperti peubah X1, X3, dan X7 yang sebaran datanya cenderung menjulur ke kanan.
3. Melihat hubungan linear (korelasi) antar peubah
plot_scatterplot(data = ipm,
by="Y", geom_point_args = list(color="steelblue"),
nrow=3, ncol = 4)
Dari plot di atas, dapat terlihat bahwa tidak semua peubah X memiliki hubungan linear terhadap Y. Secara eksploratif, dapat dikatakan bahwa peubah X8 dan X9 memiliki hubungan yang sangat lemah terhadap Y.
corrplot(cor(ipm), method = "circle", type = "upper")
Dari plot matriks korelasi di atas, dapat terlihat bahwa tidak semua peubah X memiliki korelasi yang kuat terhadap Y. Peubah yang memiliki korelasi relatif lemah terhadap Y adalah X3, X8, X9, dan X10.
cor_mat <- cor(ipm, method = "spearman")
cor_mat[upper.tri(cor_mat,diag = TRUE)] <- NA
cor_df <- cor_mat %>%
as.data.frame() %>%
rownames_to_column(var = "Var1") %>%
pivot_longer(names_to = "Var2",
values_to = "corr",
-Var1) %>% na.omit
cor_df %>% filter(abs(corr)>0.6) %>% arrange(desc(abs(corr)))
Dari tabel di atas, dapat terlihat bahwa peubah X4 dan X1 memiliki korelasi tertinggi terhadap Y. Namun, kedua peubah ini memiliki korelasi tinggi satu sama lain pula, yang dapat berakibat pada timbulnya multikolinearitas.
Seleksi Peubah
Dari eksplorasi yang telah dilakukan, dapat dikatakan bahwa masih banyak peubah yang tidak memenuhi kriteria untuk dijadikan peubah bebas untuk peubah respons Y. Untuk itu, perlu dilakukan seleksi peubah hingga didapat model yang baik yang dapat menggambarkan peubah Y secara efektif dan efisien.
1. Regresi Linear
Akan dibuat model regresi linear terhadap Y sebagai berikut:
regresi1 <- lm(formula = Y~.,data = ipm)
summary(regresi1)
##
## Call:
## lm(formula = Y ~ ., data = ipm)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.8054 -0.3369 0.2418 0.6226 1.1238
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.497e+00 2.255e+01 0.111 0.91321
## X1 1.012e-04 1.216e-04 0.832 0.41778
## X2 7.365e-01 2.904e-01 2.537 0.02199 *
## X3 9.801e-03 1.260e-02 0.778 0.44799
## X4 1.708e+00 4.404e-01 3.878 0.00133 **
## X5 -5.908e-05 1.063e-04 -0.556 0.58589
## X6 -1.696e-01 1.316e-01 -1.289 0.21578
## X7 3.782e-02 3.153e-02 1.199 0.24780
## X8 -5.249e-02 1.060e-01 -0.495 0.62725
## X9 -7.296e-04 5.906e-04 -1.235 0.23454
## X10 6.279e-02 6.199e-02 1.013 0.32616
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.151 on 16 degrees of freedom
## Multiple R-squared: 0.9634, Adjusted R-squared: 0.9406
## F-statistic: 42.16 on 10 and 16 DF, p-value: 1.385e-09
Berdasarkan uji-t Dari tabel di atas, dapat terlihat bahwa hanya peubah X2 dan X4 yang memiliki pengaruh signifikan terhadap Y.
2. Forward Selection
best_forward <- regsubsets(Y~., data = ipm, method = "forward", nvmax = 100)
summ_forward <- summary(best_forward)
summ_forward$outmat
## X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
## 1 ( 1 ) " " " " " " "*" " " " " " " " " " " " "
## 2 ( 1 ) " " "*" " " "*" " " " " " " " " " " " "
## 3 ( 1 ) " " "*" "*" "*" " " " " " " " " " " " "
## 4 ( 1 ) "*" "*" "*" "*" " " " " " " " " " " " "
## 5 ( 1 ) "*" "*" "*" "*" " " " " " " " " " " "*"
## 6 ( 1 ) "*" "*" "*" "*" " " "*" " " " " " " "*"
## 7 ( 1 ) "*" "*" "*" "*" "*" "*" " " " " " " "*"
## 8 ( 1 ) "*" "*" "*" "*" "*" "*" "*" " " " " "*"
## 9 ( 1 ) "*" "*" "*" "*" "*" "*" "*" " " "*" "*"
## 10 ( 1 ) "*" "*" "*" "*" "*" "*" "*" "*" "*" "*"
Tabel di atas menunjukkan peubah-peubah yang terpilih untuk setiap kombinasi k peubah yang mungkin (dengan k=1,2,…,10). Misalnya, untuk model dengan 5 peubah: X1, X2, X3, X4, dan X10 merupakan kombinasi peubah terbaik daripada kombinasi 5 peubah lainnya.
result_gof <- data.frame(
Adj.R2 = c(which.max(summ_forward$adjr2),max(summ_forward$adjr2)),
CP = c(which.min(summ_forward$cp),min(summ_forward$cp)),
BIC = c(which.min(summ_forward$bic),min(summ_forward$bic))
)
rownames(result_gof) <- c("Model ke-", "nilai")
result_gof
Dari tabel di atas, terdapat 3 kesimpulan, yaitu:
- Berdasarkan adj \(R^2\), model terbaiknya adalah model dengan 7 peubah.
- Berdasarkan nilai \(CP\), model terbaiknya adalah model dengan 5 peubah.
- Berdasarkan nilai \(BIC\), model terbaiknya adalah model dengan 3 peubah.
Pada umumnya, semakin mudah model untuk diinterpretasikan, maka semakin baik pula model tersebut untuk dipilih. Oleh karena itu, model dengan 3 peubah akan dipilih untuk menjadi model terbaik guna kemudahan interpretasi
coef_forward <- coef(best_forward,result_gof$BIC[1])
enframe(coef_forward) %>% mutate(across(where(is.numeric), ~ format(round(.x,3),big.mark=",",scientific=F)))
Hasil di atas merupakan model terbaik yang terpilih berdasarkan forward selection. Sehingga, model yang terbentuk adalah: \[ \hat{Y}=\beta_0+\beta_1X_2+\beta_2X_3+\beta_3X_4\\ \text{atau}\\ \hat{Y}=-13.061+0.885X_2+0.024X_3+2.318X_4 \] Plot di bawah ini dapat menggambarkan lebih jelas bagaimana model di atas terbentuk.
plot_forward <- data.frame(subset=seq_along(summ_forward$bic),
BIC = summ_forward$bic)
ggplot(plot_forward,aes(subset,BIC))+
geom_line(size=1)+
geom_point(color="darkgreen",size=2)+
geom_vline(aes(xintercept=result_gof$BIC[1]),
color="orange",size=1.2)+
theme_bw()
3. Backward Selection
best_backward <- regsubsets(Y~.,data = ipm,method = "backward",nvmax = 100)
summ_backward <- summary(best_backward)
summ_backward$outmat
## X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
## 1 ( 1 ) " " " " " " "*" " " " " " " " " " " " "
## 2 ( 1 ) " " "*" " " "*" " " " " " " " " " " " "
## 3 ( 1 ) " " "*" " " "*" " " " " "*" " " " " " "
## 4 ( 1 ) " " "*" " " "*" " " " " "*" " " "*" " "
## 5 ( 1 ) "*" "*" " " "*" " " " " "*" " " "*" " "
## 6 ( 1 ) "*" "*" " " "*" " " " " "*" " " "*" "*"
## 7 ( 1 ) "*" "*" " " "*" " " "*" "*" " " "*" "*"
## 8 ( 1 ) "*" "*" "*" "*" " " "*" "*" " " "*" "*"
## 9 ( 1 ) "*" "*" "*" "*" "*" "*" "*" " " "*" "*"
## 10 ( 1 ) "*" "*" "*" "*" "*" "*" "*" "*" "*" "*"
Tabel di atas menunjukkan peubah-peubah yang terpilih untuk setiap kombinasi k peubah yang mungkin (dengan k=1,2,…,10). Misalnya, untuk model dengan 2 peubah: X2 dan X4 merupakan kombinasi peubah terbaik daripada kombinasi 2 peubah lainnya.
result_gof2 <- data.frame(
Adj.R2 = c(which.max(summ_backward$adjr2),max(summ_backward$adjr2)),
CP = c(which.min(summ_backward$cp),min(summ_backward$cp)),
BIC = c(which.min(summ_backward$bic),min(summ_backward$bic))
)
rownames(result_gof2) <- c("Model ke-", "nilai")
result_gof2
Dari tabel di atas, terdapat 2 kesimpulan, yaitu:
- Berdasarkan adj \(R^2\), model terbaiknya adalah model dengan 7 peubah.
- Berdasarkan nilai \(CP\) dan \(BIC\), model terbaiknya adalah model dengan 4 peubah.
Pada umumnya, semakin mudah model untuk diinterpretasikan, maka semakin baik pula model tersebut untuk dipilih. Oleh karena itu, model dengan 4 peubah akan dipilih untuk menjadi model terbaik guna kemudahan interpretasi
coef_backward <- coef(best_backward,result_gof2$BIC[1])
enframe(coef_backward) %>% mutate(across(where(is.numeric), ~ format(round(.x,3),big.mark=",",scientific=F)))
Hasil di atas merupakan model terbaik yang terpilih berdasarkan forward selection. Sehingga, model yang terbentuk adalah: \[ \hat{Y}=\beta_0+\beta_1X_2+\beta_2X_4+\beta_3X_7+\beta_4X_9\\ \text{atau}\\ \hat{Y}=0.820+0.720X_2+2.215X_4+.215X_7-0.001X_9 \] Plot di bawah ini dapat menggambarkan lebih jelas bagaimana model di atas terbentuk.
plot_backward <- data.frame(subset=seq_along(summ_backward$bic),
BIC = summ_backward$bic)
ggplot(plot_backward,aes(subset,BIC))+
geom_line(size=1)+
geom_point(color="darkgreen",size=2)+
geom_vline(aes(xintercept=result_gof2$BIC[1]),
color="orange",size=1.2)+
theme_bw()
3. Unsupervised Learning (Cluster Analysis)
Library
library(ggplot2)
library(factoextra)
library(ggpubr)
##
## Attaching package: 'ggpubr'
## The following object is masked from 'package:cowplot':
##
## get_legend
## The following object is masked from 'package:plyr':
##
## mutate
library(wesanderson)
Data
Data yang digunakan pada analisis ini adalah data customer suatu mall
yang terdiri atas Customer ID, Gender,
Age, Annual Income, dan
Spending Score pada setiap customer. Tujuan tugas ini
adalah untuk memilih metode segmentasi terbaik untuk mengetahui target
pasar yang paling efektif untuk dipilih pihak mall dalam memasarkan
produknya. Segmentasi pelanggan merupakan kegiatan mengelompokkan
pelanggan menjadi beberapa kelompok berbeda berdasarkan karakteristik
umum seperti usia, gender, penghasilan tahunan, tempat tinggal,
frekuensi pembelian, dan lainnya. Hasil dari analisis segmentasi pasar
ini akan sangat berguna bagi pelaku bisnis dalam menentukan kebijakan
berdasarkan karakter tiap-tiap segmen pelanggan.
data <- read.csv("D:/Semester 5/5. Pengantar Sains Data/Data Mall_Customer.csv", sep=";")
tidyr::tibble(data)
Peubah yang terdapat pada data di atas adalah sebagai berikut :
Customer ID: merupakan angka khusus yang digunakan sebagai representasi dari tiap-tiap customer (pelanggan) sehingga tiap customer memiliki ID nya sendiri-sendiri dan berbeda satu sama lain. Dari tabel di atas dapat diketahui bahwa terdapat 200 pelanggan dalam dataset pelanggan mall ini.Gender(Jenis kelamin): Male (laki-laki) atau Female (perempuan).Age: umur (dalam tahun)Annual Income(Pendapatan tahunan) dalam satuan ribu dolar.Spending score: merupakan skor dalam skala 1 hingga 100 yang ditentukan oleh pihak mall berdasarkan sifat dan kebiasaan belanja dari tiap-tiap pelanggan. Makin tinggi nilainya berarti makin bagus nilai yang diberikan pihak mall terhadap pelanggan tersebut.
Dalam analisis ini, kita hanya tertarik untuk mengelompokkan customer berdasarkan umur, pendapatan tahunan, dan skor pengeluaran.
data.ok = data[,-c(1:2)]
head(data.ok)
Rentang dari masing-masing peubah data di atas berbeda-beda. Karenanya, perlu dilakukan standarisasi data.
scaled_data = scale(data.ok)
head(scaled_data)
## Age Annual.Income Spending.Score
## [1,] -1.4210029 -1.734646 -0.4337131
## [2,] -1.2778288 -1.734646 1.1927111
## [3,] -1.3494159 -1.696572 -1.7116178
## [4,] -1.1346547 -1.696572 1.0378135
## [5,] -0.5619583 -1.658498 -0.3949887
## [6,] -1.2062418 -1.658498 0.9990891
Secara default, R akan melakukan scaling mengikuti sebaran normal baku.
Penggerombolan HIRARKI
Hierarchical Clustering adalah metode pengelompokan data yang dimulai dengan setiap satu pengamatan sebagai clusternya sendiri kemudian terus mengelompokkan pengamatan ke dalam kelompok yang semakin besar. Tahapan pertama yang dilakukan dalam penggerombolan hirarki yaitu menghitung jarak antara setiap satu pasang amatan dalam kumpulan data. Metode yang digunakan untuk menentukan jarak antar dua amatan bisa bermacam-macam. Dalam analisis kali ini, yang akan digunakan adalah Jarak Euclidean karena data yang digunakan telah distandarisasi menjadi rentang nilai yang sama. Setelah jarak dihitung, langkah selanjutnya adalah menggabungkan pengamatan ke dalam kelompok berdasarkan jarak yang terdekat. Tahap kedua ini diulang sampai semua pengamatan menjadi anggota dari satu kelompok besar. Untuk menentukan seberapa dekat jarak antara dua gerombol, ada beberapa metode yang dapat digunakan, yaitu:
Complete linkage: Berdasarkan jarak maksimum antara titik-titik dari dua gerombol yang berbeda.
Single linkage: Berdasarkan jarak minimum antara titik-titik dari dua gerombol yang berbeda.
Average linkage: Berdasarkan rata-rata jarak antara titik-titik dari dua gerombol yang berbeda.
Centroid linkage: Berdasarkan jarak antara rata-rata dua gerombol yang berbeda.
Akan dibandingkan hasil keempat metode di atas dengan melihat dendogram masing-masing metode penggerombolan.
Pemilihan metode hirarki yang digunakan
Untuk memilih metode terbaik pada penggerombolan hirarki, kita perlu melihat perbandingan dendogram antar metodenya. Ketika suatu metode menghasilkan penggerombolan yang sangat tidak seimbang pada dendogramnya, maka dapat dikatakan bahwa penggerombolannya gagal. Syntax dan output yang dihasilkan adalah sebagai berikut:
#Menampilkan Dendogram
cmp <- fviz_dend(hclust(dist(scaled_data, method = "euclidean"), method = "complete")) + ggtitle("Complete Linkage")
avg <- fviz_dend(hclust(dist(scaled_data, method = "euclidean"), method = "average"))+ ggtitle("Average Linkage")
cen <- fviz_dend(hclust(dist(scaled_data, method = "euclidean"), method = "centroid")) + ggtitle("Centroid Linkage")
sin <- fviz_dend(hclust(dist(scaled_data, method = "euclidean"), method = "single")) + ggtitle("Single Linkage")
ggarrange(cmp, avg, cen, sin,
ncol = 2, nrow = 2)
Dari output di atas, metode yang menghasilkan clustering yang paling terdistribusi secara sama (evenly distributed) adalah metode average linkage. Untuk itu, akan dilakukan pemilihan banyak cluster berdasarkan metode clustering average linkage.
Pemilihan banyaknya cluster
Ada beberapa metode yang popular digunakan untuk memilih banyak
cluster, salah satunya adalah metode silhouette. Koefisien
silhouette menduga nilai rata-rata jarak antar cluster. Semakin besar
jarak antar cluster, maka semakin baik clustering tersebut. Artinya,
semakin besar nilai koefisien silhouette, maka semakin baik
clusteringnya. Plot di bawah menunjukkan rata-rata lebar silhouette dari
banyak cluster 1 hingga 10.
#Average Linkage
fviz_nbclust(scaled_data, FUNcluster = hcut, method = "silhouette", hc_method = "average", hc_metric="euclidean")
Berdasarkan plot di atas, terlihat bahwa banyaknya cluster yang optimal untuk hclustering metode average linkage sebesar lima cluster.
Clustering
Syntax di bawah ini akan menghasilkan pengelompokkan/penggerombolan data customer menggunakan metode penggerombolan average linkage dengan banyak gerombol yaitu lima.
#Interpretasi, utk melihat anggota dari setiap gerombol
hc.data <- eclust(scaled_data, FUNcluster = "hclust", k=5, hc_method = "average", hc_metric = "euclidean", graph = F)
Cluster vs Order
plot(1:200, hc.data$cluster, xlab="Order", ylab="Cluster", main="Cluster vs Order")
Output di atas memperlihatkan plot cluster terhadap urutan data. Dapat terlihat bahwa data dengan urutan akhir (120-200) cenderung masuk ke cluster ke-4 dan 5, sedangkan data urutan awal masuk ke cluster 1 hingga 3.
Barplot Frekuensi Cluster
tab_h <- as.data.frame(table(hc.data$cluster))
tab_h <- tab_h[order(tab_h$Freq),]
barplot(tab_h$Freq, main="Barplot Frekuensi Cluster", ylab="Frekuensi", xlab="Cluster", col=wes_palette(n=5, name="BottleRocket1"), names.arg = tab_h$Var1)
Dari barplot di atas, dapat terlihat bahwa banyaknya frekuensi untuk setiap cluster tidak terlalu jomplang. Artinya, segmentasi data sudah cukup baik
Cluster Plot
fviz_cluster(hc.data)
Dari cluster plot di atas, dapat terlihat bahwa:
Dim1 dapat menjelaskan 44.3% keragaman dan Dim2 dapat menjelaskan 33.3% keragaman. Artinya, informasi yang diberikan oleh cluster plot di atas sebesar 77.6% dari keseluruhan informasi yang terkandung dalam data.
Data masing-masing cluster tidak terlalu menumpuk satu sama lain. artinya, metode clustering telah baik untuk mengelompokkan setiap data.
Sum Square Within (Error)
Nilai sum square within (Error) akan berguna untuk mendapatkan perbandingan metode clustering terbaik.
X.ss1 <- aggregate(scaled_data, by=list(hc.data$cluster), function(x) sum(scale(x, scale=FALSE)^2))
SS_cluster <- rowSums(X.ss1[-1])
ssw_h <- sum(SS_cluster)
ssw_h
## [1] 176.1383
Nilai di atas merupakan total nilai SSW/Error untuk masing-masing cluster pada penggerombolan berhirarki.
Penggerombolan NON-HIRARKI (K-Means)
Metode penggerombolan non-hirarki digunakan untuk pengelompokan objek dimana banyaknya cluster yang akan dibentuk dapat ditentukan terlebih dahulu sebagai bagian dari prosedur penggerombolan. K-Means merupakan salah satu metode data clustering non-hirarki yang berusaha mempartisi data yang ada ke dalam bentuk satu atau lebih cluster/kelompok. Metode clustering ini berbasis jarak yang membagi data ke dalam sejumlah cluster yang hanya bekerja pada data numerik.
Pemilihan banyaknya cluster
Seperti yang telah dijelaskan sebelumnya, metode
Silhouette akan digunakan untuk memilih banyaknya cluster.
Dalam hal ini, digunakan pada metode non hirarki kmeans.
#Penentuan k dengan within sum square
fviz_nbclust(scaled_data, FUNcluster = kmeans, method = "silhouette")
Berdasarkan plot di atas, terlihat bahwa banyaknya cluster yang optimal untuk hclustering metode kmeans sebesar delapan cluster.
Clustering
Syntax di bawah ini akan menghasilkan pengelompokkan/penggerombolan data customer menggunakan metode penggerombolan kmeans dengan banyak gerombol yaitu delapan.
#Ditetapkan k=8
kmeans.data <- eclust(scaled_data, FUNcluster = "kmeans", k=8, graph = F)
Cluster vs Order
plot(1:200, kmeans.data$cluster, xlab="Order", ylab="Cluster", main="Cluster vs Order")
Output di atas memperlihatkan plot cluster terhadap urutan data. Dapat terlihat bahwa data dengan urutan akhir (120-200) cenderung masuk ke cluster ke-1, 2, 4, dan 5, sedangkan data urutan awal masuk ke cluster ke-3, 6, 7, dan 3.
Barplot Frekuensi Cluster
tab_k <- as.data.frame(table(kmeans.data$cluster))
tab_kO <- tab_k[order(tab_k$Freq),]
barplot(tab_kO$Freq, main="Barplot Frekuensi Cluster", ylab="Frekuensi", xlab="Cluster", col=wes_palette(n=5, name="BottleRocket1"), names.arg = tab_kO$Var1)
Dari barplot di atas, dapat terlihat bahwa terdapat cluster yang frekuensinya sangat jomplang dengan cluster lain, yaitu cluster ke-4 dan 7. Namun, ini terjadi karena semakin banyaknya cluster yang digunakan. Selain itu, jika cluster diurutkan berdasarkan frekuensi, maka frekuensi satu cluster dengan satu cluster setelahnya tidak terlalu beda jauh. Artinya, segmentasi data masih dapat diterima.
Cluster Plot
fviz_cluster(kmeans.data)
Dari cluster plot di atas, dapat terlihat bahwa:
Dim1 dapat menjelaskan 44.3% keragaman dan Dim2 dapat menjelaskan 33.3% keragaman. Artinya, informasi yang diberikan oleh cluster plot di atas sebesar 77.6% dari keseluruhan informasi yang terkandung dalam data.
Data masing-masing cluster tidak terlalu menumpuk satu sama lain. artinya, metode clustering telah baik untuk mengelompokkan setiap data.
Sum Square Within (Error)
Nilai sum square within (Error) akan berguna untuk mendapatkan perbandingan metode clustering terbaik.
ssw_k <- kmeans.data$tot.withinss
ssw_k
## [1] 110.2985
Nilai di atas merupakan nilai SSW/Error untuk masing-masing cluster pada penggerombolan berhirarki.
Metode Clustering Terbaik
Pemilihan metode clustering terbaik
Jika dibandingkan berdasarkan plot, metode clustering hirarki dan non-hirarki sama-sama menghasilkan output yang cukup baik. Untuk itu, kita perlu membandingkan nilai Sum Square Withins masing-masing metode. Namun, seiring bertambahnya jumlah cluster, cenderung semakin kecil pula SSW yang didapat. Oleh karena itu, perlu dilakukan standarisasi dengan syntax di bawah:
sst <- sum(scaled_data^2)
ssb_h <- sst-ssw_h
ssb_k <- sst-ssw_k
Fh <- (ssb_h/5)/(ssw_h/194)
Fk <- (ssb_k/8)/(ssw_k/191)
best_method <- data.frame("Hierarchical"=Fh, "KMeans"=Fk)
rownames(best_method)="Nilai Kebaikan Model"
best_method
Dari nilai di atas, dapat terlihat bahwa nilai kebaikan model K-means setelah distandarisasi lebih besar daripada nilai kebaikan model Hirarki. Artinya, metode Kmeans dipilih untuk penggerombolan data.
Interpretasi Hasil Clustering
df_kmeans <- aggregate(data.ok, by=list(cluster=kmeans.data$cluster), FUN = mean)
cbind(df_kmeans,"Frekuensi"=tab_k$Freq)
Cluster 1 merupakan segmentasi orang-orang muda dengan penghasilan di atas rata-rata tetapi dengan nilai spending score yang sangat rendah (paling rendah dibanding yang lain). Artinya, segmentasi ini berisi orang muda yang hanya membeli produk-produk yang mereka butuhkan saja.
Cluster 2 merupakan segmentasi orang-orang tua dengan penghasilan yang cukup tinggi tetapi nilai spending score yang rendah. Artinya, segmentasi ini berisi orang tua yang hanya membeli produk-produk yang mereka butuhkan saja.
Cluster 3 merupakan segmentasi orang-orang muda dengan penghasilan yang sangat rendah (paling rendah dibanding yang lain) tetapi memiliki nilai spending score yang sangat tinggi (kedua tertinggi dibanding yang lain). Artinya, segmentasi ini berisi orang muda yang hanya sangat boros.
Cluster 4 merupakan segmentasi orang-orang 30 tahunan dengan penghasilan yang sangat tinggi (paling tinggi dibanding yang lain) tetapi memiliki nilai spending score yang cukup rendah. Artinya, segmentasi ini berisi orang-orang yang hanya membeli produk-produk yang mereka butuhkan saja.
Cluster 5 merupakan segmentasi orang-orang 30 tahunan dengan penghasilan yang sangat tinggi (kedua tertinggi dibanding yang lain) dan memiliki nilai spending score yang sangat tinggi pula (paling tinggi dibanding yang lain). Artinya, segmentasi ini berisi orang yang suka berbelanja.
Cluster 6 merupakan segmentasi orang-orang muda dengan penghasilan yang standar dan memiliki nilai spending score yang standar pula. Segmentasi ini berisi orang muda pada umumnya, terlihat dari frekuensinya yang besar.
Cluster 7 merupakan cluster dengan frekuensi paling banyak dibanding yang lain. Cluster ini berisi orang-orang tua dengan penghasilan yang standar dan memiliki nilai spending score yang standar pula. Segmentasi ini berisi orang tua pada umumnya.
Cluster 8 merupakan segmentasi orang-orang tua dengan penghasilan yang sangat rendah yang memiliki nilai spending score yang rendah pula. Artinya, segmentasi ini berisi orang tua yang kurang mampu pada umumnya.