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 komputerlibrary(rpart) #untuk model pohon regresilibrary(rpart.plot) #untuk visualisasi hasil pohon regresi
Warning: package 'rpart.plot' was built under R version 4.4.3
library(randomForest) #untuk model random forestlibrary(gbm) #untuk gradient boostinglibrary(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 packagesreadxl dengan menyebutkan nama file beserta folder tempat menyimpannya.
# Impor dari penyimpanan lokaldata <-read_excel("data for regression.xlsx")
Selanjutnya, kita dapat melihat informasi dasar dari variabel dan karakter dari variabel tersebut dengan str()
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.
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.
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 samasample <-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.
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 packagesMLmetrics .
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.
Data awal dianggap sebagai satu simpul akar yang berisi seluruh data.
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.
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 .
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.
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.
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:
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.
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
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.
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.
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.
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:
Lapisan input, yang menerima data awal.
Satu atau lebih lapisan tersembunyi (hidden layers), yang memproses data lewat bobot dan fungsi aktivasi untuk mengekstraksi fitur dan pola yang kompleks.
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 packageBBmisc.
Untuk melakukan pemodelan dengan neural network, digunakan fungsi neuralnet() pada packageneuralnet. Apabila fungsi tersebut hanya menggunakan input berupa formula dan data, maka fungsi tersebut akan menjalankan fungsi default.
Node paling kiri (yaitu node input) adalah variabel prediktor.
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.
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.
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.
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.
Sebelum menghitung keakuratan, dilakukan transformasi balik dengan fungsi undo_minmax pada packagerMIDAS
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
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 barismetrics_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 bariscolnames(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.