Klasifikasi: Studi Kasus Prediksi Investment Risk Level
Studi Kasus
Dalam berinvestasi terdapat hal-hal yang perlu diperhtaikan salah satunya adanya risiko. Risiko dapat menyebabkan nilai pokok investor berkurang. “Risiko” merujuk pada potensi produk investasi, sedangkan “berisiko” merujuk pada pihak yang berinvestasi.
Di bawah ini terdapat data yang berisi 117 negara dan informasi mengenai kondisi ekonomi selama lima tahun terakhir (rasio kecukupan modal, Gross Domestic Product per kapita, Utang luar negeri, pertumbuhan harga konsumen, dan sebagainya). Pada studi kasus ini akan dibangun model machine learning yang dapat mengelompokkan negara ke dalam kelompok negara dengan tingkat risiko investasi tinggi atau rendah.
A. Package
Beberapa packages yang digunakan dalam analisis di bawah ini yakni sebagai berikut.
library(tidyverse)## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5 v purrr 0.3.4
## v tibble 3.1.6 v dplyr 1.0.7
## v tidyr 1.1.4 v stringr 1.4.0
## v readr 2.1.0 v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(rmarkdown)
library(skimr)
library(mlr3verse)## Loading required package: mlr3
##
## Attaching package: 'mlr3'
## The following object is masked from 'package:skimr':
##
## partition
library(ggplot2)
library(ranger)
library(MLeval)B. Data
Membaca Data
Membaca data dari file excel ke dalam R dilakukan dengan perintah sebagai berikut
data1 <- readxl::read_xlsx("investment_risk_level.xlsx", sheet = 'investment')
data1## # A tibble: 117 x 16
## Country X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 AD 17.5 38675. 173. 0.68 1.22 1.79 -2.08 55 -26.5 2.86
## 2 AE 18.2 40105. 104. 1.77 0.870 2.66 -0.725 103. -13.6 353.
## 3 AE-AZ 18.7 76038. 31.0 2.63 1.49 1.85 -1.90 103. -56.2 200.
## 4 AE-RK NA 27883. 24.8 1.29 1.75 2.23 -1.14 103. 24.8 10.1
## 5 AM 14 4251. 89.6 1.44 0.256 4.75 2.33 167. 47.3 12.6
## 6 AO NA 2034. 57.1 22.4 3.34 -0.878 -5.20 34.8 15.4 62.5
## 7 AR 23.3 9203. 43.3 36.7 0.966 -0.237 -3.73 NA -5.01 375.
## 8 AT 18.6 53174. 159. 1.52 0.726 1.88 -0.300 116. 15.4 430.
## 9 AU 15.7 63972. 122. 1.65 1.48 2.45 0.0306 192. 58.0 1359.
## 10 AW 33.5 24643. 92.8 1.22 0.797 2.06 -4.72 80.5 28.1 2.38
## # ... with 107 more rows, and 5 more variables: X11 <dbl>, X12 <dbl>,
## # X13 <dbl>, X14 <dbl>, Risk Level <chr>
Deskripsi Data
Berikut adalah penjelasan setiap variabel dalam dataset di atas
| Variabel | Keterangan |
|---|---|
| Country | ID negara |
| X1 | Capital adequacy ratio (%) average from last 5 years % Rata-rata rasio kecukupan modal 5 tahun terakhir |
| X2 | GDP per capita (USD) Produk Domestik Bruto per kapita (USD) |
| X3 | Gross External Debt (% of GDP) average from last 5 years % Rata-rata Utang Luar Negeri Bruto 5 tahun terakhir |
| X4 | Growth of consumer price (%) average from last 5 years % Rata-rata pertumbuhan harga konsumen 5 tahun terakhir |
| X5 | Growth of population (%) average from last 5 years % Rata-rata pertumbuhan penduduk 5 tahun terakhir |
| X6 | Growth of Real GDP (%) average from last 5 years % Rata-rata PDB riil 5 tahun terakhir |
| X7 | Growth of Real GDP per cap. (%) average from last 5 years % Rata-rata pertumbuhan PDB riil per kapita 5 tahun terakhir |
| X8 | Loan-deposit ratio (%) average from last 5 years Rata-rata rasio pinjaman-deposit 5 tahun terakhir |
| X9 | Net External Debt (% of GDP) average from last 5 years % Rata-rata Utang Luar Negeri Bersih 5 tahun terakhir |
| X10 | Nominal GDP (USD bn) Nominal PDB (US miliar) |
| X11 | Non-performing loans (% of gross loans) average from last 5 years Rata-rata kredit bermasalah 5 tahun terakhir |
| X12 | Percentage of gross domestic investment to GDP (%) average from last 5 years % Rata-rata investasi domestik bruto terhadap PDB 5 tahun terakhir |
| X13 | Percentage of gross domestic saving to GDP (%) average from last 5 years % Rata-rata tabungan domestik bruto terhadap PDB 5 tahun terakhir |
| X14 | Unemployment rate (% labour force) average from last 5 years % Rata-rata tingkat pengangguran 5 tahun terakhir |
| Risk Level | Tingkat risiko investasi |
Untuk keperluan analisis, dilakukan beberapa hal sebagai berikut:
Mengubah tipe data peubah response Risk Level menjadi bertipe factor
Optional: mengubah nama kolom
Risk Levelmenjadirisk_level
# mengubah tipe data peubah
data1$`Risk Level` <- as.factor(data1$`Risk Level`)
colnames(data1)[16] <- "risk_level"
library(rmarkdown)
paged_table(data1)Ringkasan Data
# library(skimr)
skim(data1)| Name | data1 |
| Number of rows | 117 |
| Number of columns | 16 |
| _______________________ | |
| Column type frequency: | |
| character | 1 |
| factor | 1 |
| numeric | 14 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| Country | 0 | 1 | 2 | 5 | 0 | 116 | 0 |
Variable type: factor
| skim_variable | n_missing | complete_rate | ordered | n_unique | top_counts |
|---|---|---|---|---|---|
| risk_level | 0 | 1 | FALSE | 2 | hig: 64, low: 53 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| X1 | 13 | 0.89 | 18.73 | 5.18 | 4.20 | 15.93 | 18.35 | 21.64 | 47.50 | ▁▇▃▁▁ |
| X2 | 0 | 1.00 | 22596.35 | 24598.74 | 434.46 | 4223.46 | 11363.61 | 34641.26 | 124340.38 | ▇▂▂▁▁ |
| X3 | 0 | 1.00 | 177.50 | 646.02 | 13.63 | 43.11 | 70.35 | 117.76 | 6908.35 | ▇▁▁▁▁ |
| X4 | 0 | 1.00 | 3.44 | 4.94 | -0.15 | 0.84 | 1.70 | 4.21 | 36.70 | ▇▁▁▁▁ |
| X5 | 0 | 1.00 | 1.15 | 1.05 | -0.89 | 0.38 | 1.05 | 1.80 | 4.40 | ▃▇▅▂▁ |
| X6 | 0 | 1.00 | 3.06 | 2.20 | -5.14 | 1.75 | 2.84 | 4.26 | 10.08 | ▁▂▇▃▁ |
| X7 | 0 | 1.00 | 0.22 | 2.50 | -9.85 | -1.11 | 0.29 | 1.92 | 6.07 | ▁▁▆▇▂ |
| X8 | 9 | 0.92 | 99.47 | 41.28 | 34.82 | 75.98 | 90.02 | 113.28 | 359.14 | ▇▅▁▁▁ |
| X9 | 0 | 1.00 | -14.34 | 202.88 | -1955.72 | -16.23 | 12.94 | 33.35 | 456.49 | ▁▁▁▂▇ |
| X10 | 0 | 1.00 | 710.34 | 2434.56 | 1.17 | 34.54 | 107.80 | 375.19 | 20935.00 | ▇▁▁▁▁ |
| X11 | 21 | 0.82 | 6.31 | 8.92 | 0.34 | 1.84 | 3.60 | 7.93 | 63.50 | ▇▁▁▁▁ |
| X12 | 0 | 1.00 | 24.52 | 6.52 | 12.67 | 20.16 | 23.08 | 27.97 | 46.83 | ▃▇▃▁▁ |
| X13 | 0 | 1.00 | 24.36 | 8.19 | 8.88 | 18.42 | 24.23 | 29.25 | 55.09 | ▅▇▆▁▁ |
| X14 | 12 | 0.90 | 8.52 | 5.68 | 0.12 | 4.82 | 7.00 | 10.30 | 33.70 | ▇▆▂▁▁ |
Data investment risk level (pada analisi ini disimpai dalam objek data1) terdiri atas 16 peubah dan 117 observasi. Dari 16 peubah tersebut, terdapat 1 peubah karakter (kolom Country), 14 peubah numerik (kolom X1 s.d X14) sebagai peubah prediktor, dan 1 peubah kategorik (kolom risk_level) dengan dua kelas sebagai peubah respon.
Pada data di atas, terdapat missing value di beberapa peubah prediktor, yaitu peubah X1 sejumlah 13 data, X8 sejumlah 9 data, X11 sejumlah 21 data, dan X14 sejumlah 12 data. Agar proses pemodelan dapat dilakukan, peru dilakukan penanganan terhadap kasus missing value tersebut.
Penanganan Missing Value
Penanganan dilakukan dengan mengisi data kosong dengan rataan nilai dari masing-masing kolom/peubah
# peubah X1
data1$X1 <- ifelse(is.na(data1$X1),
ave(data1$X1, FUN = function(x) mean(x, na.rm = TRUE)),
data1$X1)
# peubah X8
data1$X8 <- ifelse(is.na(data1$X8),
ave(data1$X8, FUN = function(x) mean(x, na.rm = TRUE)),
data1$X8)
# peubah X11
data1$X11 <- ifelse(is.na(data1$X11),
ave(data1$X11, FUN = function(x) mean(x, na.rm = TRUE)),
data1$X11)
# peubah X14
data1$X14 <- ifelse(is.na(data1$X14),
ave(data1$X14, FUN = function(x) mean(x, na.rm = TRUE)),
data1$X14)
skim(data1)| Name | data1 |
| Number of rows | 117 |
| Number of columns | 16 |
| _______________________ | |
| Column type frequency: | |
| character | 1 |
| factor | 1 |
| numeric | 14 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| Country | 0 | 1 | 2 | 5 | 0 | 116 | 0 |
Variable type: factor
| skim_variable | n_missing | complete_rate | ordered | n_unique | top_counts |
|---|---|---|---|---|---|
| risk_level | 0 | 1 | FALSE | 2 | hig: 64, low: 53 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| X1 | 0 | 1 | 18.73 | 4.88 | 4.20 | 16.10 | 18.73 | 20.70 | 47.50 | ▁▇▂▁▁ |
| X2 | 0 | 1 | 22596.35 | 24598.74 | 434.46 | 4223.46 | 11363.61 | 34641.26 | 124340.38 | ▇▂▂▁▁ |
| X3 | 0 | 1 | 177.50 | 646.02 | 13.63 | 43.11 | 70.35 | 117.76 | 6908.35 | ▇▁▁▁▁ |
| X4 | 0 | 1 | 3.44 | 4.94 | -0.15 | 0.84 | 1.70 | 4.21 | 36.70 | ▇▁▁▁▁ |
| X5 | 0 | 1 | 1.15 | 1.05 | -0.89 | 0.38 | 1.05 | 1.80 | 4.40 | ▃▇▅▂▁ |
| X6 | 0 | 1 | 3.06 | 2.20 | -5.14 | 1.75 | 2.84 | 4.26 | 10.08 | ▁▂▇▃▁ |
| X7 | 0 | 1 | 0.22 | 2.50 | -9.85 | -1.11 | 0.29 | 1.92 | 6.07 | ▁▁▆▇▂ |
| X8 | 0 | 1 | 99.47 | 39.65 | 34.82 | 77.34 | 93.36 | 111.79 | 359.14 | ▇▃▁▁▁ |
| X9 | 0 | 1 | -14.34 | 202.88 | -1955.72 | -16.23 | 12.94 | 33.35 | 456.49 | ▁▁▁▂▇ |
| X10 | 0 | 1 | 710.34 | 2434.56 | 1.17 | 34.54 | 107.80 | 375.19 | 20935.00 | ▇▁▁▁▁ |
| X11 | 0 | 1 | 6.31 | 8.07 | 0.34 | 2.15 | 4.83 | 6.31 | 63.50 | ▇▁▁▁▁ |
| X12 | 0 | 1 | 24.52 | 6.52 | 12.67 | 20.16 | 23.08 | 27.97 | 46.83 | ▃▇▃▁▁ |
| X13 | 0 | 1 | 24.36 | 8.19 | 8.88 | 18.42 | 24.23 | 29.25 | 55.09 | ▅▇▆▁▁ |
| X14 | 0 | 1 | 8.52 | 5.38 | 0.12 | 5.00 | 7.30 | 9.70 | 33.70 | ▇▇▂▁▁ |
# data setelah dilakukan penanganan missing value
paged_table(data1)Proporsi dua kelas dalam peubah respon
prop.table(table(data1$risk_level))##
## high low
## 0.5470085 0.4529915
Berdasarkan statistik deskriptif di atas dapat diketahui bahwa peubah respon memiliki anggota kelas High risk level sebanyak 54.7% dan kelas Low risk level sebanyak 45.29% pengamatan.
Sebaran Data
Untuk melihat sebaran data setiap peubah, setiap peubah digambarkan dalam bentuk box-plot.
library(caret)## Loading required package: lattice
##
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
##
## lift
featurePlot(x = data1[, 2:15],
y = data1$risk_level,
plot = "box",
do.out = FALSE,
layout = c(5,3),
strip = strip.custom(par.strip.text=list(cex=.7)),
scales = list(x = list(relation="free"),
y = list(relation="free")))featurePlot(x = data1[, 2:15],
y = data1$risk_level,
plot = "density",
do.out = FALSE,
layout = c(5,3),
strip = strip.custom(par.strip.text=list(cex=.7)),
scales = list(x = list(relation="free"),
y = list(relation="free"))) Dari box-plot dan density plot di atas, terlihat bahwa banyak peubah predictor yang sebaran datanya tidak simetris dan terdapat cukup banyak outlier.
C. Persiapan Data Pemodelan
Split Data
Melakukan pembagian dataset menjadi data train dan data testing sebagai metode untuk melatih dan mengevaluasi performa model machine learning. Data training digunakan untuk membuat model, sedangkan data testing digunakan untuk evaluasi kebaikan model.
set.seed(100)
# Mengambil amatan yang digunakan sebagai data train
train_index <- createDataPartition(data1$risk_level, p = 0.8, list = FALSE)
train_index # index amatan ## Resample1
## [1,] 2
## [2,] 3
## [3,] 4
## [4,] 5
## [5,] 6
## [6,] 8
## [7,] 10
## [8,] 12
## [9,] 13
## [10,] 14
## [11,] 15
## [12,] 16
## [13,] 17
## [14,] 18
## [15,] 19
## [16,] 20
## [17,] 21
## [18,] 22
## [19,] 23
## [20,] 24
## [21,] 25
## [22,] 26
## [23,] 28
## [24,] 30
## [25,] 32
## [26,] 33
## [27,] 35
## [28,] 36
## [29,] 37
## [30,] 38
## [31,] 39
## [32,] 40
## [33,] 42
## [34,] 43
## [35,] 44
## [36,] 45
## [37,] 46
## [38,] 47
## [39,] 48
## [40,] 49
## [41,] 50
## [42,] 51
## [43,] 52
## [44,] 53
## [45,] 54
## [46,] 55
## [47,] 56
## [48,] 58
## [49,] 59
## [50,] 60
## [51,] 61
## [52,] 62
## [53,] 63
## [54,] 64
## [55,] 65
## [56,] 66
## [57,] 68
## [58,] 69
## [59,] 70
## [60,] 71
## [61,] 72
## [62,] 73
## [63,] 75
## [64,] 76
## [65,] 78
## [66,] 79
## [67,] 80
## [68,] 82
## [69,] 84
## [70,] 85
## [71,] 87
## [72,] 89
## [73,] 90
## [74,] 91
## [75,] 92
## [76,] 95
## [77,] 96
## [78,] 97
## [79,] 98
## [80,] 99
## [81,] 100
## [82,] 101
## [83,] 103
## [84,] 104
## [85,] 105
## [86,] 106
## [87,] 107
## [88,] 108
## [89,] 109
## [90,] 110
## [91,] 111
## [92,] 112
## [93,] 114
## [94,] 115
## [95,] 116
# Data train
train_data <- data1[train_index,]
head(train_data)## # A tibble: 6 x 16
## Country X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 AE 18.2 40105. 104. 1.77 0.870 2.66 -0.725 103. -13.6 353. 8.15
## 2 AE-AZ 18.7 76038. 31.0 2.63 1.49 1.85 -1.90 103. -56.2 200. 8.15
## 3 AE-RK 18.7 27883. 24.8 1.29 1.75 2.23 -1.14 103. 24.8 10.1 6.31
## 4 AM 14 4251. 89.6 1.44 0.256 4.75 2.33 167. 47.3 12.6 6.6
## 5 AO 18.7 2034. 57.1 22.4 3.34 -0.878 -5.20 34.8 15.4 62.5 10.3
## 6 AT 18.6 53174. 159. 1.52 0.726 1.88 -0.300 116. 15.4 430. 2.02
## # ... with 4 more variables: X12 <dbl>, X13 <dbl>, X14 <dbl>, risk_level <fct>
# Data testing
test_data <- data1[-train_index,]
head(test_data)## # A tibble: 6 x 16
## Country X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 AD 17.5 38675. 173. 0.68 1.22 1.79 -2.08 55 -26.5 2.86
## 2 AR 23.3 9203. 43.3 36.7 0.966 -0.237 -3.73 99.5 -5.01 375.
## 3 AU 15.7 63972. 122. 1.65 1.48 2.45 0.0306 192. 58.0 1359.
## 4 AZ 25.3 5083. 43.4 6.85 1.05 0.391 -1.74 111. -174. 42.6
## 5 CO 17.2 5860. 47.6 4.71 1.38 2.45 -0.888 117. 9.93 271.
## 6 CV 19.4 3466. 115. 0.379 1.16 3.92 -0.404 67.5 51.4 1.70
## # ... with 5 more variables: X11 <dbl>, X12 <dbl>, X13 <dbl>, X14 <dbl>,
## # risk_level <fct>
Dalam proses pemodelan, kolom Country tidak digunakan sehingga dihapus dari data training dan data testing.
train_data$Country <- NULL
test_data$Country <- NULLStandarisasi Data
Tahapan selanjutnya adalah standarisasi. Standarisasi dilakukan karena skala dari setiap peubah prediktor berbeda-beda, sedangkan untuk hasil pemodelan yang baik diperlukan skala yang sama. Metode standarisasi yang digunakan adalah transformasi ke normal baku (Z).
standardize <- preProcess(train_data, method = c("center", "scale"))
train_data_s <- predict(standardize, newdata = train_data)
test_data_s <- predict(standardize, newdata = test_data)Cross validation
Cross Validation (CV) merupakan metode untuk mengukur kinerja model. Pada studi kasus ini tipe CV yang digunakan adalah repeatedcv k-folds (validasi silang k-folds berulang) dengan folds yang digunakan adalah 5 folds dan perulangan dilakukan sebanyak 5 kali. Data dipartisi secara acak ke dalam lipatan/subset data (folds). Untuk masing-masing subset data tersebut, CV akan menggunakan empat folds untuk training dan satu fold untuk testing.
Cross Validation dalam studi kasus ini digunakan untuk tuning parameter, yakni mencari parameter terbaik bagi model yang memberikan nilai kebaikan evaluasi optimal.
fit_Control <- trainControl(method = 'repeatedcv',
number = 5,
repeats = 5,
savePredictions = 'final',
classProbs = T,
summaryFunction = prSummary,
allowParallel = TRUE)Metriks evaluasi yang ditampilkan meliputi precision, recall dan F1-score. Pada kasus ini metrik yang digunakan adalah F1-score di mana nilai terbaiknya adalah 1 dan nilai terburuknya adalah 0. F1-score yang baik mengindikasikan bahwa model klasifikasi yang dihasilan memiliki nilai precision dan recall yang baik.
C. Pemodelan
Pada studi kasus ini metode yang digunakan untuk memodelkan adalah Random Forest. Random forest merupakan model yang dibentuk dari banyak model Decission Tree baik untuk regresi maupun klasifikasi. Metode ini merupakan metode pohon gabungan. Untuk mengidentifikasi peubah prediktor yang relevan terhadap peubah respons, random forest menghasilkan ukuran tingkat kepentingan (variable importance) peubah penjelas.
Fitting Model
set.seed(100)
# library(ModelMetrics)
rf <- train(risk_level ~., data = train_data_s,
method = 'ranger',
metric = "F",
tuneLength = 10,
trControl = fit_Control,
importance = 'impurity')
rf## Random Forest
##
## 95 samples
## 14 predictors
## 2 classes: 'high', 'low'
##
## No pre-processing
## Resampling: Cross-Validated (5 fold, repeated 5 times)
## Summary of sample sizes: 76, 76, 76, 76, 76, 75, ...
## Resampling results across tuning parameters:
##
## mtry splitrule AUC Precision Recall F
## 2 gini 0.8733406 0.8804966 0.8818182 0.8727286
## 2 extratrees 0.8697731 0.8754178 0.8701818 0.8660647
## 3 gini 0.8726069 0.8852483 0.8661818 0.8691898
## 3 extratrees 0.8656059 0.8842343 0.8705455 0.8702183
## 4 gini 0.8705316 0.8837518 0.8545455 0.8626873
## 4 extratrees 0.8654105 0.8871854 0.8705455 0.8716585
## 6 gini 0.8640966 0.8932266 0.8429091 0.8597012
## 6 extratrees 0.8635803 0.8990155 0.8665455 0.8759484
## 7 gini 0.8633970 0.9087215 0.8469091 0.8688785
## 7 extratrees 0.8574909 0.8856822 0.8665455 0.8688762
## 8 gini 0.8582331 0.9126946 0.8509091 0.8730173
## 8 extratrees 0.8612042 0.8982603 0.8705455 0.8779944
## 10 gini 0.8577532 0.8973440 0.8436364 0.8623278
## 10 extratrees 0.8619580 0.9040785 0.8625455 0.8767615
## 11 gini 0.8501395 0.9066571 0.8396364 0.8650164
## 11 extratrees 0.8596047 0.8904747 0.8669091 0.8726571
## 12 gini 0.8503759 0.9030938 0.8432727 0.8658341
## 12 extratrees 0.8609997 0.8996061 0.8589091 0.8730065
## 14 gini 0.8471561 0.9056268 0.8316364 0.8600780
## 14 extratrees 0.8600832 0.8958765 0.8621818 0.8727337
##
## Tuning parameter 'min.node.size' was held constant at a value of 1
## F was used to select the optimal model using the largest value.
## The final values used for the model were mtry = 8, splitrule = extratrees
## and min.node.size = 1.
Dari hasil output di atas, hasil tunning parameter dengan k-fold cv berulang pada model random forest memberikan AUC (luas area di bawah kurva ROC), precision, recall dan F1-score yang tinggi (>80%), sehingga dapat dikatakan bahwa model random forest yang dibangun cukup baik. Model final diperoleh dengan parameter mtry = 8, splitrule = extratress dan min.node.size = 1.
Variabel Importance
Berikut dapat diketahui ukuran tingkat kepentingan peubah prediktor yang relevan terhadap peubah respons
plot(varImp(rf, scale = FALSE)) Dari output di atas dapat diketahui bahwa Gross Domestic Product per kapita (X2) merupakan variabel terpenting bagi model random forest. Selanjutnya disusul oleh
X13: rataan tabungan domestik bruto terhadap GDP; X14: tingkat pengangguran; dan X11: rataan kredit bermasalah, di mana termasuk variabel terpenting teratas bagi model ini.
Prediksi
testing_pred <- predict(rf, newdata = test_data_s)
confusionMatrix(testing_pred, test_data_s$risk_level)## Confusion Matrix and Statistics
##
## Reference
## Prediction high low
## high 10 1
## low 2 9
##
## Accuracy : 0.8636
## 95% CI : (0.6509, 0.9709)
## No Information Rate : 0.5455
## P-Value [Acc > NIR] : 0.001732
##
## Kappa : 0.7273
##
## Mcnemar's Test P-Value : 1.000000
##
## Sensitivity : 0.8333
## Specificity : 0.9000
## Pos Pred Value : 0.9091
## Neg Pred Value : 0.8182
## Prevalence : 0.5455
## Detection Rate : 0.4545
## Detection Prevalence : 0.5000
## Balanced Accuracy : 0.8667
##
## 'Positive' Class : high
##
Berdasarkan hasil uji coba model random forest pada data testing, ditunjukkan bahwa kelas positive yang dimaksud adalah kelompok negara dengan tingkat risiko investasi tinggi (high risk level).
Interpretasi prediksi
Tingkat akurasi menggambarkan tingkat ketepatan model dalam mengklasifikasikan dengan benar. Dalam kasus ini berarti bahwa model dapat memprediksi benar negara tergolong
high riskataulow risksebesar 86.36%Spesificity/precision/positive predictive value menggambarkan ketepatan antara data yang diminta terhadap hasil prediksi yang diberikan model. Pada kasus ini, berarti bahwa negara yang benar termasuk negara high risk dari keseluruhan negara yang diprediksi sebagai negara high risk sebesar 90%
Sensitivity/recall menggambarkan keberhasilan model dalam menemukan informasi. Pada kasus ini, berarti bahwa negara yang diprediksi sebagai negara
high riskdibanding keseluruhan negara yang sebenarnya termasuk dalamhigh risksebesar 83.33%
Kesimpulan
Berdasarkan proses di atas, model random forest final untuk memprediksi tingkat risiko investasi negara memberikan nilai akurasi 86.36%. Model tersebut mengelompokan kelas positif sebagai negara dengan high risk level atau negara yang memiliki risiko tinggi dalam hal investasi.
Berdasarkan nilai variable importance, peubah-peubah prediktor dapat diurutikan dari yang terpenting (bagi pembangunan model) sebagai berikut:
X2 : Gross per capita (USD)
X13 : Percentage of gross domestic saving to GDP (%) average from last 5 years
X11 : Non-performing loans (% of gross loans) average from last 5 years
X14 : Unemployment rate (% labour force) average from last 5 years
X10 : Nominal GDP (USD bn)
X4 : Growth of consumer price (%) average from last 5 years
X9 : Net External Debt (% of GDP) average from last 5 years
X5 : Growth of population (%) average from last 5 years
X1 : Capital adequacy ratio (%) average from last 5 years
X12 : Percentage of gross domestic investment to GDP (%) average from last 5 years
X7 : Growth of Real GDP per cap. (%) average from last 5 years
X8 : Loan-deposit ratio (%) average from last 5 years
X6 : Growth of Real GDP (%) average from last 5 years
X3 : Gross External Debt (% of GDP) average from last 5 years
D. Referensi
Dito, Gery A. 2021. Statistical Machine Learning dengan mlr3. Diakses pada laman berikut
James, Garet dkk. An Introduction to Statistical Learning with Applications in R
Kuhn. Max. 2019. The caret Package. Diakses pada laman berikut
Kukuh, R. 2018. Mengatasi “Missing Data” dalam Dataset. Diakses pada laman berikut
Nugorho, Kuncahyo S. 2019. confusion Matrix untuk Evaluasi Model pada Supervised Learning. Diakses pada laman berikut
Sartono, Bagus. 2020. Random Forest. Diakses pada laman berikut
Setiawan, Stevanus. 2020. Membicarakan Precision, Recall, dan F1-Score. Diakses pada laman berikut
Tutorials Point: Simply Easy Learning. 2021. R-Random Forest. Diakses pada laman berikut