Analisis Regresi

Author

Bagus Sartono dan M. Rizky Nurhambali

Ilustrasi Kasus

Tim analisis data di sebuah bank ingin mengetahui faktor-faktor yang memengaruhi tingkat profitabilitas bank yang diukur dengan ROA (Return on Assets). Selain itu, ingin diketahui metode terbaik dalam memprediksi tingkat profitabilitas tersebut. Penelitian ini penting untuk memberikan gambaran kepada manajemen bank dan regulator dalam pengambilan kebijakan yang berbasis data.

Tim analisis data kemudian memutuskan akan menggunakan analisis regresi dengan data karakteristik finansial dari berbagai bank di dunia melalui beragam pendekatan.

Packages

Sebelum melakukan impor data, dilakukan pemanggilan packages untuk fungsi-fungsi yang digunakan sebagai berikut. Pemanggilan ini dilakukan di awal sehingga tidak perlu melakukan pemanggilan packages di tengah proses analisis data.

library(readxl) #untuk impor data ekstensi .xlsx dari penyimpanan lokal komputer
library(rpart) #untuk model pohon regresi
library(rpart.plot) #untuk visualisasi hasil pohon regresi
Warning: package 'rpart.plot' was built under R version 4.4.3
library(randomForest) #untuk model random forest
library(gbm) #untuk gradient boosting
library(neuralnet) #untuk neural network
Warning: package 'neuralnet' was built under R version 4.4.3

Data

Data yang digunakan dapat dilihat dan diunduh di sini.

Data dengan format .xlsx dapat diimpor melalui fungsi read_excel pada packages readxl dengan menyebutkan nama file beserta folder tempat menyimpannya.

# Impor dari penyimpanan lokal
data <- read_excel("data for regression.xlsx")

Selanjutnya, kita dapat melihat informasi dasar dari variabel dan karakter dari variabel tersebut dengan str()

str(data)
tibble [2,500 × 12] (S3: tbl_df/tbl/data.frame)
 $ Return_on_assets     : num [1:2500] 1.769 1.615 1.241 1.345 0.403 ...
 $ Assets               : num [1:2500] 3364520 2749185 2578147 2492516 2105886 ...
 $ Tier_1_Capital_Growth: num [1:2500] 16.74 16.45 11.4 24.31 2.57 ...
 $ Asset_Growth         : num [1:2500] 9.494 9.245 6.731 10.101 0.506 ...
 $ Capital_Asset_Ratio  : num [1:2500] 7.49 7.38 7.11 7.35 7.89 ...
 $ Pre_tax_Profit       : num [1:2500] 7.62 4.78 16.37 8.62 -55.87 ...
 $ Return_on_capital    : num [1:2500] 24.08 25.67 16.63 18.3 4.84 ...
 $ BIS_capital_ratio    : num [1:2500] 13.9 15.3 14.6 13.9 16.7 ...
 $ NPL_to_total_loans   : num [1:2500] 1.39 1.19 2.8 1.57 3.96 ...
 $ Loans_to_Assets_ratio: num [1:2500] 56.9 57.9 30.8 61 41.9 ...
 $ RWA_to_TA_ratio      : num [1:2500] 61.7 63.1 55.7 64.5 60.3 ...
 $ Cost_Income_ratio    : num [1:2500] 31.7 29.2 62.5 34.8 88.4 ...

Dapat kita lihat data yang digunakan terdiri atas 2500 baris dan 12 kolom. Baris menunjukkan jumlah observasi / sample, kolom menunjukkan karakteristik dari observasi. Berdasarkan output tersebut, dapat diketahui semua variabel berbentuk numerik (num).

Eksplorasi Data

Kemudian, dilakukan eksplorasi data dengan melihat hubungan antara variabel prediktor dengan variabel respons. Yang akan menjadi variabel respons adalah Returns on assets, sedangkan variabel lain akan dijadikan variabel prediktor.

Pada tahapan ini akan digunakan scatter plot antara variabel prediktor dan respons untuk melihat hubungan antarvariabel. Sebagai ilustrasi, hanya Returns on assets dan Capital Asset Ratio yang dibuat scatter plot-nya.

plot(data$Capital_Asset_Ratio, data$Return_on_assets)

Berdasarkan output di atas, dapat dilihat bahwa kedua variabel memiliki hubungan positif yang cukup kuat. Artinya, peningkatan Capital Asset Ratio jugameningkatkan Return on assets. Untuk mengetahui nilai korelasi yang ada, digunakan fungsi cor() sebagai berikut.

cor(data$Capital_Asset_Ratio, data$Return_on_assets)
[1] 0.6253622

Selanjutnya, akan dilihat korelasi dengan seluruh variabel sebagai berikut.

cor(data)
                      Return_on_assets       Assets Tier_1_Capital_Growth
Return_on_assets             1.0000000 -0.176774173            0.47636525
Assets                      -0.1767742  1.000000000            0.15357217
Tier_1_Capital_Growth        0.4763653  0.153572166            1.00000000
Asset_Growth                 0.5260809  0.045185850            0.73651265
Capital_Asset_Ratio          0.6253622 -0.115503637            0.33171625
Pre_tax_Profit              -0.1474208 -0.093393261            0.06933467
Return_on_capital            0.8362566 -0.218320911            0.46910693
BIS_capital_ratio           -0.4331832 -0.009206108           -0.26066724
NPL_to_total_loans          -0.3336504 -0.038261560           -0.37409542
Loans_to_Assets_ratio        0.2414729 -0.215967997           -0.15374518
RWA_to_TA_ratio              0.7538991 -0.175021329            0.35582742
Cost_Income_ratio           -0.5589522  0.134012070           -0.35446939
                      Asset_Growth Capital_Asset_Ratio Pre_tax_Profit
Return_on_assets        0.52608092         0.625362223    -0.14742081
Assets                  0.04518585        -0.115503637    -0.09339326
Tier_1_Capital_Growth   0.73651265         0.331716255     0.06933467
Asset_Growth            1.00000000         0.294363389    -0.05570091
Capital_Asset_Ratio     0.29436339         1.000000000    -0.03362101
Pre_tax_Profit         -0.05570091        -0.033621012     1.00000000
Return_on_capital       0.50015373         0.266608533    -0.18832466
BIS_capital_ratio      -0.45342965        -0.001026292     0.28040753
NPL_to_total_loans     -0.41573434        -0.026909370     0.19315461
Loans_to_Assets_ratio   0.05775189        -0.007296452    -0.07696600
RWA_to_TA_ratio         0.50284863         0.806101707    -0.14713543
Cost_Income_ratio      -0.44362005        -0.169406934    -0.11065089
                      Return_on_capital BIS_capital_ratio NPL_to_total_loans
Return_on_assets              0.8362566      -0.433183215        -0.33365040
Assets                       -0.2183209      -0.009206108        -0.03826156
Tier_1_Capital_Growth         0.4691069      -0.260667241        -0.37409542
Asset_Growth                  0.5001537      -0.453429651        -0.41573434
Capital_Asset_Ratio           0.2666085      -0.001026292        -0.02690937
Pre_tax_Profit               -0.1883247       0.280407525         0.19315461
Return_on_capital             1.0000000      -0.596380593        -0.47730742
BIS_capital_ratio            -0.5963806       1.000000000         0.10003559
NPL_to_total_loans           -0.4773074       0.100035590         1.00000000
Loans_to_Assets_ratio         0.3467514      -0.455132665         0.06644722
RWA_to_TA_ratio               0.5280968      -0.472226563        -0.11095462
Cost_Income_ratio            -0.6476158       0.496967122         0.16944049
                      Loans_to_Assets_ratio RWA_to_TA_ratio Cost_Income_ratio
Return_on_assets                0.241472852       0.7538991        -0.5589522
Assets                         -0.215967997      -0.1750213         0.1340121
Tier_1_Capital_Growth          -0.153745177       0.3558274        -0.3544694
Asset_Growth                    0.057751889       0.5028486        -0.4436201
Capital_Asset_Ratio            -0.007296452       0.8061017        -0.1694069
Pre_tax_Profit                 -0.076966000      -0.1471354        -0.1106509
Return_on_capital               0.346751358       0.5280968        -0.6476158
BIS_capital_ratio              -0.455132665      -0.4722266         0.4969671
NPL_to_total_loans              0.066447217      -0.1109546         0.1694405
Loans_to_Assets_ratio           1.000000000       0.2938931        -0.4441270
RWA_to_TA_ratio                 0.293893136       1.0000000        -0.4859568
Cost_Income_ratio              -0.444126978      -0.4859568         1.0000000

Keluaran dari fungsi di atas merupakan sebuah matriks. Oleh karena itu, untuk mempermudah pembacaan, hasil tersebut dapat dibuat dalam sebuah plot dengan fungsi berikut.

library(corrplot)
Warning: package 'corrplot' was built under R version 4.4.3
corrplot 0.95 loaded
corrmatrix <- cor(data)
corrplot(corrmatrix, method = 'color', type = "lower", addCoef.col = "black")

Berdasarkan korelasi antara variabel respons dan prediktor (kolom pertama), variabel Asset Growth, Capital Asset Ratio, Return on capital, RWA to TA ratio, dan Cost Income Ratio terlihat sebagai variabel yang cukup berpengaruh terhadap Return to assets karena memiliki korelasi cukup tinggi (|>0,5|). Namun, perlu diperhatikan bahwa terdapat korelasi yang tinggi antara Capital Asset Ratio dan RWA to TA ratio dengan korelasi sebesar 0,81 sehingga memungkinkan adanya multikolinearitas. Salah satu variabel dapat dipertahankan dan lainnya dihapus untuk mengatasi masalah tersebut karena kedua variabel tersebut sejalan dan dapat mewakili satu sama lain. Namun, pada ilustrasi ini kondisi ini dibiarkan apa adanya.

Pembagian Data

Sebelum melakukan pemodelan, dilakukan pembagian data menjadi data train dan data test. Data train digunakan untuk membangun model, sementara data test digunakan untuk mengevaluasi model. Pada kesempatan ini, pembagian data train dan data test akan menggunakan prinsip Pareto dengan perbandingan data train dan data test sebesar 80:20. Pembagian data dilakukan dengan cara mengambil sample data dengan fungsi sample sebagai berikut.

set.seed(1234) #digunakan agar dapat diulang dan menghasilkan hasil yang sama
sample <- sample(c(TRUE, FALSE), nrow(data), replace=TRUE, prob=c(0.8,0.2))
train  <- data[sample, ]
test   <- data[!sample, ]

Regresi Linear

Regresi linear merupakan metode statistika untuk memprediksi atau menjelaskan hubungan antara variabel respons dengan satu atau beberapa variabel prediktor.

Pemodelan

Untuk melakukan analisis regresi linear, digunakan fungsi lm(formula, data). Formula dituliskan sebagai Return_on_assets~. . Ekspresi tersebut bermakna bahwa variabel targetnya adalah Return_on_assets sementara titik (.) menandakan seluruh variabel selain variabel target digunakan sebagai prediktor. Namun, apabila ingin menggunakan beberapa variabel, variabel dapat disebutkan dan dipisahkan dengan tanda + , seperti Return_on_assets~Assets+Asset_Growth . Sementara itu, data diisikan dengan data yang digunakan. Pada ilustrasi ini digunakan data = train .

reg.model <- lm(Return_on_assets~., data = train)

Koefisien

Untuk mengeluarkan dugaan parameter model, dapat memanggil objek yang digunakan sebagai tempat menyimpan model, yaitu reg.model . Namun, apabila ingin lebih jelas mengetahui informasi dari model yang tidak terbatas pada dugaan parameter, gunakan fungsi summary() seperti berikut.

summary(reg.model)

Call:
lm(formula = Return_on_assets ~ ., data = train)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.74465 -0.13725 -0.00169  0.14233  0.78936 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)           -1.337e+00  8.082e-02 -16.543  < 2e-16 ***
Assets                 4.858e-08  7.027e-09   6.914 6.34e-12 ***
Tier_1_Capital_Growth -4.358e-03  6.910e-04  -6.307 3.49e-10 ***
Asset_Growth           8.461e-03  9.665e-04   8.754  < 2e-16 ***
Capital_Asset_Ratio    9.452e-02  7.672e-03  12.319  < 2e-16 ***
Pre_tax_Profit         5.996e-05  9.456e-05   0.634  0.52612    
Return_on_capital      6.069e-02  1.178e-03  51.511  < 2e-16 ***
BIS_capital_ratio      2.478e-02  2.932e-03   8.452  < 2e-16 ***
NPL_to_total_loans     2.277e-02  2.966e-03   7.674 2.58e-14 ***
Loans_to_Assets_ratio -1.279e-03  4.011e-04  -3.189  0.00145 ** 
RWA_to_TA_ratio        6.655e-03  9.111e-04   7.305 4.00e-13 ***
Cost_Income_ratio      3.722e-04  4.619e-04   0.806  0.42048    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.2086 on 1995 degrees of freedom
Multiple R-squared:  0.8837,    Adjusted R-squared:  0.8831 
F-statistic:  1379 on 11 and 1995 DF,  p-value: < 2.2e-16

Output dari ringkasan model terdiri atas fungsi yang dimasukkan, statistik deskriptif sisaan, koefisien regresi dan hasil uji-t, serta kebaikan model yang ditunjukkan dengan Adjusted R-squared.

Contoh interpretasi koefisien model berdasarkan output di atas sebagai berikut.

Misalkan pada variabel Return on capital, menunjukkan bahwa setiap penambahan Return on capital sebanyak 1 satuan, akan meningkatkan rata-rata Return on assets sebesar 0,06069 ketika variabel lain dianggap tetap.

Selanjutnya, pada hasil uji-t, dapat dilihat bahwa variabel Pre-tax profit dan Cost Income Ratio tidak berpengaruh signifikan.

Terakhir, berdasarkan nilai Adjusted R-squared sebesar 0,8831 telah menunjukkan model yang terbentuk sudah baik karena semakin mendekati nilai 1.

Evaluasi Model

Selanjutnya dilakukan evaluasi model dengan melakukan prediksi variabel respon pada data test. Untuk melakukan prediksi gunakan fungsi predict() dan diikuti dengan melihat keakuratan prediksi menggunakan nilai RMSE, MAPE, dan korelasi. Perhitungan RMSE dilakukan menggunakan packages MLmetrics .

pred_test_reg <-  predict(reg.model,newdata = test)
rmse_test_reg <- MLmetrics::RMSE(pred_test_reg, as.vector(test$Return_on_assets))
rmse_test_reg
[1] 0.2048943
mape_test_reg <- mean(abs(pred_test_reg-test$Return_on_assets)/test$Return_on_assets)*100
mape_test_reg
[1] 8.198464
cor_test_reg <- cor(pred_test_reg, as.vector(test$Return_on_assets))
cor_test_reg
[1] 0.9465784

Berdasarkan nilai metrik di atas, hasil prediksi model menunjukkan hasil yang baik di mana didapatkan nilai RMSE dan MAPE yang rendah dengan korelasi yang tinggi.

CART

Metode pohon regresi adalah salah satu teknik analisis data yang menggunakan struktur pohon keputusan (decision tree) untuk memodelkan hubungan antara variabel penjelas (independen / prediktor) dan variabel respons (dependen). Pohon regresi dibentuk melalui algoritma penyekatan rekursif, yang secara bertahap membagi data menjadi beberapa kelompok atau simpul berdasarkan aturan tertentu, sehingga tujuan akhirnya adalah memperoleh segmen data yang relatif homogen terhadap variabel respons.

Secara umum, cara kerja metode pohon regresi adalah sebagai berikut.

  1. Data awal dianggap sebagai satu simpul akar yang berisi seluruh data.

  2. Kemudian, data tersebut dibagi menjadi dua simpul anak berdasarkan suatu aturan penyekatan nilai variabel penjelas yang menghasilkan pemisahan terbaik, umumnya yang dapat meminimalkan jumlah kuadrat sisaan antar kelompok.

  3. Proses penyekatan data ini dilakukan secara biner dan rekursif (berulang) pada setiap simpul anak hingga tercapai kriteria penghentian tertentu, seperti ukuran simpul minimal atau jumlah simpul akhir yang diinginkan

Pemodelan

Untuk melakukan pemodelan dengan pohon regresi, digunakan fungsi rpart() . Apabila fungsi tersebut hanya menggunakan input berupa formula dan data, maka fungsi tersebut akan menjalankan fungsi default pada rpart.control .

reg.tree <- rpart(Return_on_assets~., data = train,
                  control = rpart.control(minsplit = 20, 
                                          minbucket = round(20/3), 
                                          cp = 0.01,
                                          maxcompete = 4, 
                                          maxsurrogate = 5, 
                                          usesurrogate = 2, 
                                          xval = 10,
                                          surrogatestyle = 0, 
                                          maxdepth = 30))
reg.tree
n= 2007 

node), split, n, deviance, yval
      * denotes terminal node

 1) root 2007 746.6232000 0.9535563  
   2) Return_on_capital< 14.39622 948  71.7393300 0.4279013  
     4) Return_on_capital< 6.468186 300  10.3678300 0.1733772 *
     5) Return_on_capital>=6.468186 648  32.9391800 0.5457366 *
   3) Return_on_capital>=14.39622 1059 178.4502000 1.4241140  
     6) Capital_Asset_Ratio< 5.59331 335  30.8827400 1.0821990  
      12) Return_on_capital< 21.90502 124   3.7236600 0.8048748 *
      13) Return_on_capital>=21.90502 211  12.0178700 1.2451770 *
     7) Capital_Asset_Ratio>=5.59331 724  90.2828000 1.5823210  
      14) Return_on_capital< 27.01556 689  55.2719300 1.5333930  
        28) Capital_Asset_Ratio< 8.507282 528  31.1785600 1.4635420  
          56) Assets< 2717541 445  19.4261700 1.4056280 *
          57) Assets>=2717541 83   2.2575700 1.7740460 *
        29) Capital_Asset_Ratio>=8.507282 161  13.0686500 1.7624680  
          58) Return_on_capital< 20.11045 82   2.6914200 1.5444390 *
          59) Return_on_capital>=20.11045 79   2.4332200 1.9887760 *
      15) Return_on_capital>=27.01556 35   0.8909946 2.5455060 *

Pemanggilan objek reg.tree akan menampilkan pohon yang terbentuk. Pada partisi pertama, terlihat penggunaan variabel Return on capital. Namun, untuk lebih mempermudah melihat pohon yang terbentu, dapat menggunakan fungsi rpart.plot() sebagai berikut.

rpart.plot(reg.tree, box.palette="RdBu", nn=TRUE)

Pohon yang terbentuk menunjukkan aturan-aturan keputusan dari model. Simpul akar dari pohon berada di bagian atas, dan simpul daun berada di bagian bawah. Setiap node diberi label dengan variabel yang digunakan untuk membagi data pada node tersebut dan nilai dari pembagian tersebut. Node daun menunjukkan nilai prediksi dan persentase dari observasi yang tercakup di dalamnya.

Selain itu, dapat diketahui variabel penting dari pohon regresi dengan cara berikut.

reg.tree$variable.importance
    Return_on_capital       RWA_to_TA_ratio     Cost_Income_ratio 
           603.274976            322.875693            308.830079 
         Asset_Growth        Pre_tax_Profit     BIS_capital_ratio 
           297.333034            291.089236            291.047013 
  Capital_Asset_Ratio Tier_1_Capital_Growth                Assets 
            75.826742             55.942638             25.283520 
   NPL_to_total_loans 
             7.448499 

Selain dengan default, hyperparameter pada pohon regresi dapat ditentukan secara manual, yaitu pada opsi control=rpart.control() di dalam fungsi rpart() .

Berikut ini hyperparameter yang umumnya diatur.

Hyperparameter Deskripsi Pengaruh pada model
minsplit Jumlah minimum observasi yang harus ada di sebuah node agar node tersebut dapat dibagi. Mengontrol kompleksitas awal pohon; nilai terlalu kecil bisa menyebabkan overfitting.
minbucket Jumlah minimum observasi pada leaf node (node terminal). Mencegah terbentuknya daun dengan terlalu sedikit data, mengurangi overfitting.
maxdepth Kedalaman maksimum pohon. Membatasi seberapa dalam pohon dapat berkembang, mengontrol kompleksitas model.
cp (complexity parameter) Parameter penalti kompleksitas untuk pemangkasan pohon (pruning). Mengontrol pemangkasan pohon; nilai lebih besar menghasilkan pohon yang lebih sederhana.

Evaluasi Model

Evaluasi model dilakukan dengan cara yang sama dengan regresi linear, yaitu dengan melakukan prediksi variabel respon pada data test. Untuk melakukan prediksi gunakan fungsi predict() dan diikuti dengan melihat keakuratan prediksi menggunakan nilai RMSE, MAPE, dan korelasi.

pred_test_tree <-  predict(reg.tree,newdata = test)
rmse_test_tree <- MLmetrics::RMSE(pred_test_tree, as.vector(test$Return_on_assets))
rmse_test_tree
[1] 0.2072979
mape_test_tree <- mean(abs(pred_test_tree-test$Return_on_assets)/test$Return_on_assets)*100
mape_test_tree
[1] 5.951232
cor_test_tree <- cor(pred_test_tree, as.vector(test$Return_on_assets))
cor_test_tree
[1] 0.945441

Berdasarkan nilai metrik di atas, hasil prediksi model menunjukkan hasil yang baik di mana didapatkan nilai RMSE dan MAPE yang rendah dengan korelasi yang tinggi.

Random Forest

Metode Random Forest adalah algoritma machine learning yang bekerja dengan menggabungkan banyak pohon keputusan (decision trees) untuk mendapatkan hasil prediksi yang lebih akurat dan stabil dibandingkan menggunakan satu pohon keputusan saja.

Secara umum, konsep utama Random Forest adalah ensemble learning yang menggunakan dua teknik penting:

  1. Bootstrap sampling: Mengambil sampel acak (dengan pengembalian) dari data asli untuk membentuk banyak subset data berbeda yang digunakan sebagai data latih untuk masing-masing pohon.

  2. Random feature selection: Pada setiap node pemisahan di tiap pohon, hanya dipertimbangkan sebagian fitur secara acak untuk menentukan pemisahan terbaik sehingga pohon-pohon yang dihasilkan memiliki variasi dan tidak saling berkorelasi.

Pemodelan

Untuk melakukan pemodelan dengan random forest, digunakan fungsi randomForest() . Apabila fungsi tersebut hanya menggunakan input berupa formula dan data, maka fungsi tersebut akan menjalankan fungsi default, yaitu

rf <- randomForest(Return_on_assets~., data = train, ntree = 500)
rf

Call:
 randomForest(formula = Return_on_assets ~ ., data = train, ntree = 500) 
               Type of random forest: regression
                     Number of trees: 500
No. of variables tried at each split: 3

          Mean of squared residuals: 0.03276541
                    % Var explained: 91.19

Fungsi di atas menjalankan random forest untuk regresi, yaitu regresi berganda nonlinier selama variabel targetnya berupa angka (dalam contoh ini, Return on assets). Namun, pada fungsi dapat ditambahkan type="regression". Rata-rata residual kuadrat dan % varians yang dijelaskan menunjukkan seberapa baik model tersebut cocok dengan data.

Selanjutnya, apabila ingin menampilkan variabel penting, perlu dimasukkan ekspresi importance=TRUE .

rf <- randomForest(Return_on_assets~., data = train, importance = TRUE)
rf$importance
                         %IncMSE IncNodePurity
Assets                0.04953348      51.17498
Tier_1_Capital_Growth 0.03795947      35.58505
Asset_Growth          0.03637810      57.73183
Capital_Asset_Ratio   0.07745563      83.10711
Pre_tax_Profit        0.03687789      35.14547
Return_on_capital     0.23223408     249.65389
BIS_capital_ratio     0.02089198      21.25434
NPL_to_total_loans    0.01277621      16.11510
Loans_to_Assets_ratio 0.01756702      16.33925
RWA_to_TA_ratio       0.10188638     122.29892
Cost_Income_ratio     0.04490461      53.40803

Berdasarkan dua keluaran di atas, Return on capital, RWA to TA ratio, dan Capital Asset Ratio menjadi tiga variabel penting.

Selain dengan default, hyperparameter pada random forest dapat ditentukan secara manual, yaitu dengan memasukkan nilai pada opsi hyperparameter yang tersedia.

Berikut ini hyperparameter yang umumnya diatur.

Hyperparameter Deskripsi Pengaruh pada Model
ntree Jumlah total pohon yang akan dibuat dalam random forest Semakin banyak pohon, prediksi lebih stabil dan akurat, tetapi waktu training lebih lama (default 500).
mtry Jumlah variabel (fitur) acak yang dipilih untuk mencari split pada tiap node Mengontrol keragaman dan kekuatan masing-masing pohon. Default: √p (jumlah fitur) untuk klasifikasi dan p/3 untuk regresi. Penting untuk tuning, bisa dicari optimalnya dengan tuneRF().
nodesize Jumlah minimum observasi yang harus ada di node terminal (daun) Mengontrol ukuran node akhir; nilai lebih besar mencegah overfitting dengan daun yang terlalu kecil (default 5 untuk klasifikasi).
maxnodes Maksimum jumlah node terminal (daun) per pohon Membatasi kompleksitas pohon, dapat membantu mengurangi overfitting; tidak selalu disetel secara default.

Evaluasi Model

Evaluasi model dilakukan dengan cara yang sama, yaitu dengan melakukan prediksi variabel respon pada data test. Untuk melakukan prediksi gunakan fungsi predict() dan diikuti dengan melihat keakuratan prediksi menggunakan nilai RMSE, MAPE, dan korelasi.

pred_test_rf <-  predict(rf,newdata = test)
rmse_test_rf <- MLmetrics::RMSE(pred_test_rf, as.vector(test$Return_on_assets))
rmse_test_rf
[1] 0.1748068
mape_test_rf <- mean(abs(pred_test_rf-test$Return_on_assets)/test$Return_on_assets)*100
mape_test_rf
[1] 2.567824
cor_test_rf <- cor(pred_test_rf, as.vector(test$Return_on_assets))
cor_test_rf
[1] 0.961365

Berdasarkan nilai metrik di atas, hasil prediksi model menunjukkan hasil yang baik di mana didapatkan nilai RMSE dan MAPE yang rendah dengan korelasi yang tinggi.

Gradient Boosting

Metode Gradient Boosting untuk regresi adalah teknik ensemble learning yang membangun model prediksi secara bertahap dengan menggabungkan beberapa model lemah (weak learners), biasanya berupa pohon keputusan sederhana sehingga menghasilkan model kuat yang mampu memprediksi variabel kontinu dengan akurasi tinggi.

Metode Gradient Boosting secara matematis mengoptimalkan fungsi kerugian (loss function) seperti Mean Squared Error (MSE) dengan menggunakan pendekatan penurunan gradien (gradient descent) pada ruang fungsi. Ini berarti setiap model baru diarahkan untuk mengurangi gradien negatif dari fungsi kerugian, yang sebanding dengan residual error saat itu.

Pemodelan

Untuk melakukan pemodelan dengan gradient boosting, digunakan fungsi gbm() . Apabila fungsi tersebut hanya menggunakan input berupa formula dan data, maka fungsi tersebut akan menjalankan fungsi default.

gbm.model <- gbm(Return_on_assets~., data = train,
                 n.trees = 100,
                 interaction.depth = 1,
                 n.minobsinnode = 10,
                 shrinkage = 0.1,
                 bag.fraction = 0.5,
                 train.fraction = 1,
                 cv.folds = 0,
                 verbose = FALSE)
Distribution not specified, assuming gaussian ...

Untuk melihat hasil pemodelan berupa peubah penting, gunakan summary() .

summary(gbm.model)

                                        var     rel.inf
Return_on_capital         Return_on_capital 74.18704960
RWA_to_TA_ratio             RWA_to_TA_ratio 10.72214963
Capital_Asset_Ratio     Capital_Asset_Ratio 10.59479852
Assets                               Assets  3.53533029
BIS_capital_ratio         BIS_capital_ratio  0.37774468
Asset_Growth                   Asset_Growth  0.21708723
Cost_Income_ratio         Cost_Income_ratio  0.17684406
NPL_to_total_loans       NPL_to_total_loans  0.15751368
Pre_tax_Profit               Pre_tax_Profit  0.03148231
Tier_1_Capital_Growth Tier_1_Capital_Growth  0.00000000
Loans_to_Assets_ratio Loans_to_Assets_ratio  0.00000000

Output akan menunjukkan variabel yang memiliki kontribusi besar dalam pemodelan. Berdasarkan output tersebut terdapat variabel Return on capital, RWA to TA ratio, Capital Asset Ratio, dan Assets.

Selain dengan default, hyperparameter pada gradient boosting dapat ditentukan secara manual, yaitu dengan memasukkan nilai pada opsi hyperparameter yang tersedia.

Berikut ini hyperparameter yang umumnya diatur.

Hyperparameter Deskripsi Pengaruh pada Model
n.trees Jumlah total pohon (iterasi boosting) yang akan dibuat Semakin banyak pohon, model dapat belajar lebih detail; terlalu banyak pohon dapat menyebabkan overfitting
interaction.depth Kedalaman maksimum dari setiap pohon (jumlah level split) Mengontrol kompleksitas dan interaksi fitur yang dapat ditangkap; nilai kecil menghasilkan pohon yang lebih sederhana
shrinkage (learning rate) Kecepatan belajar setiap pohon, menentukan kontribusi tiap pohon pada model akhir Nilai lebih kecil membuat model lebih stabil dan generalisasi lebih baik, tapi butuh lebih banyak pohon
n.minobsinnode Jumlah minimum observasi pada node terminal (daun) Mencegah pohon terlalu dalam dan overfitting dengan batas minimum data pada daun
bag.fraction Proporsi data acak yang digunakan untuk membangun tiap pohon (stochastic gradient boosting) Menambah randomness untuk mengurangi overfitting; nilai < 1 meningkatkan keragaman model
train.fraction Proporsi data yang digunakan untuk pelatihan, sisanya untuk validasi Memisahkan data untuk validasi dalam proses fitting model
verbose Opsi untuk menampilkan progres pelatihan Membantu monitoring proses fitting model, tidak mempengaruhi model itu sendiri

Evaluasi Model

Evaluasi model dilakukan dengan cara yang sama, yaitu dengan melakukan prediksi variabel respon pada data test. Untuk melakukan prediksi gunakan fungsi predict() dan diikuti dengan melihat keakuratan prediksi menggunakan nilai RMSE, MAPE, dan korelasi.

pred_test_gbm <-  predict(gbm.model,newdata = test)
rmse_test_gbm <- MLmetrics::RMSE(pred_test_gbm, as.vector(test$Return_on_assets))
rmse_test_gbm
[1] 0.1993716
mape_test_gbm <- mean(abs(pred_test_gbm-test$Return_on_assets)/test$Return_on_assets)*100
mape_test_gbm
[1] 1.741794
cor_test_gbm <- cor(pred_test_gbm, as.vector(test$Return_on_assets))
cor_test_gbm
[1] 0.9493894

Berdasarkan nilai metrik di atas, hasil prediksi model menunjukkan hasil yang baik di mana didapatkan nilai RMSE dan MAPE yang rendah dengan korelasi yang tinggi.

Neural Network

Metode neural network atau jaringan saraf tiruan adalah model komputasi dalam machine learning yang terinspirasi dari cara kerja otak manusia, khususnya jaringan neuron biologis. Neural network berfungsi untuk mengenali pola dan mempelajari hubungan kompleks dalam data melalui struktur jaringan yang terdiri dari lapisan-lapisan neuron buatan (node) yang saling terhubung.

Secara umum, neural network tersusun atas beberapa lapisan, yaitu:

  1. Lapisan input, yang menerima data awal.

  2. Satu atau lebih lapisan tersembunyi (hidden layers), yang memproses data lewat bobot dan fungsi aktivasi untuk mengekstraksi fitur dan pola yang kompleks.

  3. Lapisan output, yang memberikan hasil prediksi atau klasifikasi.

Setiap neuron pada lapisan menerima sinyal dari neuron sebelumnya, kemudian mengalikan sinyal tersebut dengan bobot tertentu, menjumlahkannya, dan menerapkan fungsi aktivasi. Jika hasilnya melewati ambang batas, neuron akan “aktif” dan meneruskan sinyal ke lapisan berikutnya. Proses ini berlangsung berulang hingga keluaran akhir diperoleh.

Pemodelan

Sebelum melakukan pemodelan, perlu dilakukan praproses pada data input neural network, yaitu normalisasi data dengan fungsi normalize() dari package BBmisc.

library(BBmisc)
train_normalize <- normalize(train, method = "range")
test_normalize <- normalize(test, method = "range")

Untuk melakukan pemodelan dengan neural network, digunakan fungsi neuralnet() pada package neuralnet. Apabila fungsi tersebut hanya menggunakan input berupa formula dan data, maka fungsi tersebut akan menjalankan fungsi default.

nn <- neuralnet(Return_on_assets ~ ., data = train_normalize,
                hidden = c(3), threshold = 0.01,
                stepmax = 1e+05, rep = 1, startweights = NULL,
                learningrate.limit = NULL, 
                learningrate.factor = list(minus = 0.5, plus = 1.2),
                learningrate = NULL, lifesign = "none",
                lifesign.step = 1000, algorithm = "rprop+", err.fct = "sse",
                act.fct = "logistic", linear.output = TRUE, exclude = NULL,
                constant.weights = NULL, likelihood = FALSE)

Hasil proses ditampilkan sebagai berikut.

plot(nn, rep = "best")

Penjelasan gambar di atas adalah sebagai berikut.

  1. Node paling kiri (yaitu node input) adalah variabel prediktor.

  2. Panah berwarna hitam (dan angka yang terkait) adalah bobot yang dapat dianggap sebagai seberapa banyak variabel tersebut berkontribusi pada node berikutnya. Garis biru adalah bobot bias.

  3. Simpul tengah (yaitu apa pun di antara simpul input dan output) adalah simpul tersembunyi (hidden layer). Setiap node ini merupakan komponen yang sedang dipelajari oleh jaringan untuk dikenali.

  4. Node paling kanan (node output) adalah output akhir dari neural network.

Selain dengan default, hyperparameter pada neural network dapat ditentukan secara manual, yaitu dengan memasukkan nilai pada opsi hyperparameter yang tersedia.

Berikut ini hyperparameter yang umumnya diatur.

Hyperparameter Deskripsi Pengaruh pada Model
hidden Vektor yang menentukan jumlah layer tersembunyi dan jumlah neuron di tiap layer, contoh: c(5,3) Mencegah/meningkatkan kompleksitas jaringan; lebih banyak neuron/layer menangkap pola lebih kompleks tapi bisa overfit.
threshold Ambang batas untuk turunan parsial dari fungsi error saat pelatihan berhenti (default 0.01) Menentukan kapan pelatihan berhenti, nilai terlalu besar bisa menyebabkan pelatihan berhenti terlalu cepat (underfitting).
rep Jumlah pengulangan pelatihan jaringan dengan inisialisasi bobot berbeda (default 1) Meningkatkan kestabilan hasil dengan mencari bobot terbaik dari beberapa percobaan.
algorithm Metode optimisasi pelatihan, misal “backprop”, “rprop+”, “rprop-”, “sag”, “slr” Memilih algoritma training yang dapat mempengaruhi kecepatan dan efisiensi pelatihan.
act.fct Fungsi aktivasi yang digunakan di neuron, default biasanya logistic atau tanh Mempengaruhi cara neuron memproses sinyal; dapat berdampak pada kemampuan jaringan menangkap hubungan non-linear.
stepmax Batas maksimum langkah iterasi pelatihan (default 1e5) Membatasi durasi pelatihan untuk menghindari waktu maksimum yang terlalu lama.
startweights Bobot awal jaringan yang dapat dipasang secara manual (default bobot acak) Memberikan titik awal berbeda untuk pelatihan yang dapat mempengaruhi konvergensi.

Evaluasi Model

Evaluasi model dilakukan dengan cara yang sama, yaitu dengan melakukan prediksi variabel respon pada data test. Untuk melakukan prediksi gunakan fungsi predict() dan diikuti dengan melihat keakuratan prediksi menggunakan nilai RMSE, MAPE, dan korelasi.

pred_test_nn <- predict(nn,newdata = test_normalize)

Sebelum menghitung keakuratan, dilakukan transformasi balik dengan fungsi undo_minmax pada package rMIDAS

library(rMIDAS)
Warning: package 'rMIDAS' was built under R version 4.4.3
Loading required package: data.table
Loading required package: mltools
Warning: package 'mltools' was built under R version 4.4.3
Loading required package: reticulate
rMIDAS is loaded. In headless mode its environment and dependencies need to be set up manually. Please read https://github.com/MIDASverse/rMIDAS for additional help on how to set up and configure your environment.
If you want to change your Python environment use 'reset_rMIDAS_env()' to reset your configuration. After resetting, you'll need to restart the R session and run 'library(rMIDAS)' again.

## 
## rMIDAS: Multiple Imputation using Denoising Autoencoders 
## Authors: Thomas Robinson and Ranjit Lall 
## Please visit https://github.com/MIDASverse/rMIDAS for more information 
## 

Attaching package: 'rMIDAS'
The following object is masked from 'package:randomForest':

    combine
pred_test_nn1 <- undo_minmax(pred_test_nn, s_min = min(train$Return_on_assets), s_max = max(train$Return_on_assets))

#menghitung keakuratan
rmse_test_nn <- MLmetrics::RMSE(pred_test_nn1, as.vector(test$Return_on_assets))
rmse_test_nn
[1] 0.1784255
mape_test_nn <- mean(abs(pred_test_nn1-test$Return_on_assets)/test$Return_on_assets)*100
mape_test_nn
[1] 6.163091
cor_test_nn <- cor(pred_test_nn1, as.vector(test$Return_on_assets))
cor_test_nn
          [,1]
[1,] 0.9606072

Berdasarkan nilai metrik di atas, hasil prediksi model menunjukkan hasil yang baik di mana didapatkan nilai RMSE dan MAPE yang rendah dengan korelasi yang tinggi.

Perbandingan Metode

Setelah dilakukan berbagai pemodelan, dilakukan perbandingan metrik yang digunakan untuk menentukan model terbaik dengan cara sebagai berikut.

# membuat matrix dengan 3 kolom dan 5 baris
metrics_data <- matrix(c(rmse_test_reg, mape_test_reg, cor_test_reg,
                         rmse_test_tree, mape_test_tree, cor_test_tree,
                         rmse_test_rf, mape_test_rf, cor_test_rf,
                         rmse_test_gbm, mape_test_gbm, cor_test_gbm,
                         rmse_test_nn, mape_test_nn, cor_test_nn), 
                       ncol=3, byrow=TRUE)

# mengubah nama kolom dan nama baris
colnames(metrics_data) <- c('RMSE','MAPE', "r")
rownames(metrics_data) <- c('Regresi Linear','CART', 'Random Forest',
                            'Gradient Boosting', 'Neural Network')

as.table(metrics_data)
                       RMSE      MAPE         r
Regresi Linear    0.2048943 8.1984643 0.9465784
CART              0.2072979 5.9512315 0.9454410
Random Forest     0.1748068 2.5678245 0.9613650
Gradient Boosting 0.1993716 1.7417943 0.9493894
Neural Network    0.1784255 6.1630906 0.9606072

Berdasarkan metrik yang digunakan, dapat dilihat bahwa neural network dan random forest menjadi dua metode terbaik. Hal ini ditandakan dengan nilai RMSE dan MAPE yang rendah dan korelasi tinggi di antara metode lainnya.