library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
df <- read.csv("Level Risiko Investasi.csv")
glimpse(df)
## Rows: 100
## Columns: 16
## $ Country    <chr> "AD", "AE", "AE-AZ", "AE-RK", "AM", "AO", "AR", "AT", "AU",…
## $ X1         <dbl> 17.5000, 18.2000, 18.7000, NA, 14.0000, NA, 23.2527, 18.574…
## $ X2         <dbl> 38674.616, 40105.120, 76037.997, 27882.829, 4251.398, 2033.…
## $ X3         <dbl> 172.75400, 103.52280, 31.03626, 24.78532, 89.61882, 57.0556…
## $ X4         <dbl> 0.68000, 1.76600, 2.63056, 1.29416, 1.44000, 22.35646, 36.7…
## $ X5         <dbl> 1.2206, 0.8698, 1.4893, 1.7530, 0.2562, 3.3422, 0.9657, 0.7…
## $ X6         <dbl> 1.78560, 2.65884, 1.85034, 2.23192, 4.74800, -0.87800, -0.2…
## $ X7         <dbl> -2.0843, -0.7254, -1.9008, -1.1355, 2.3318, -5.2032, -3.729…
## $ X8         <dbl> 55.00000, 102.52738, 102.52738, 102.52738, 166.80851, 34.81…
## $ X9         <dbl> -26.52000, -13.59890, -56.24160, 24.78532, 47.27262, 15.449…
## $ X10        <dbl> 2.857862, 352.910575, 199.928422, 10.108892, 12.645460, 62.…
## $ X11        <dbl> 8.0000, 8.1550, 8.1550, NA, 6.6000, 10.3000, 10.6000, 2.019…
## $ X12        <dbl> 23.08410, 24.85976, 20.39940, 21.69104, 19.40300, 31.12380,…
## $ X13        <dbl> 26.94344, 32.47740, 31.03926, 17.30888, 15.11172, 20.57210,…
## $ X14        <dbl> 3.0000, 2.4500, NA, NA, 18.5000, 10.5000, 11.0500, 6.0000, …
## $ Risk.Level <chr> "low", "low", "low", "low", "high", "high", "high", "low", …
#eksplorasi data
skimr::skim(df)
Data summary
Name df
Number of rows 100
Number of columns 16
_______________________
Column type frequency:
character 2
numeric 14
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Country 1 0.99 2 5 0 98 0
Risk.Level 0 1.00 3 4 0 2 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
X1 12 0.88 18.97 5.42 4.20 15.93 18.58 21.80 47.50 ▁▇▃▁▁
X2 0 1.00 22641.57 24846.18 434.46 4265.94 11659.10 34815.21 124340.38 ▇▂▂▁▁
X3 0 1.00 191.93 697.33 13.63 42.96 70.42 130.63 6908.35 ▇▁▁▁▁
X4 0 1.00 3.26 4.86 -0.15 0.87 1.70 3.94 36.70 ▇▁▁▁▁
X5 0 1.00 1.20 1.06 -0.89 0.44 1.14 1.95 4.40 ▃▇▅▃▁
X6 0 1.00 3.08 2.26 -5.14 1.76 2.98 4.30 10.08 ▁▂▇▃▁
X7 0 1.00 0.11 2.58 -9.85 -1.19 0.07 1.94 6.07 ▁▁▆▇▂
X8 7 0.93 99.94 42.61 34.82 76.95 90.19 113.39 359.14 ▇▅▁▁▁
X9 0 1.00 -13.58 217.07 -1955.72 -14.11 12.67 36.67 456.49 ▁▁▁▂▇
X10 0 1.00 582.32 1659.10 1.17 32.81 106.87 366.37 14866.70 ▇▁▁▁▁
X11 17 0.83 5.53 5.14 0.34 1.93 3.90 7.95 26.98 ▇▃▁▁▁
X12 0 1.00 24.96 6.73 12.67 20.79 23.40 28.38 46.83 ▃▇▃▁▁
X13 0 1.00 24.48 8.07 10.95 19.06 24.28 29.36 55.09 ▅▇▅▁▁
X14 11 0.89 8.44 5.29 0.12 4.82 6.80 10.50 24.65 ▆▇▂▂▁
#menghilangkan var country 
#variabel ini dihilangkan karena tidak akan digunakan dalam analisis
df <- df[, -which(names(df) == "Country")]
head(df)
##     X1        X2        X3       X4     X5       X6      X7        X8        X9
## 1 17.5 38674.616 172.75400  0.68000 1.2206  1.78560 -2.0843  55.00000 -26.52000
## 2 18.2 40105.120 103.52280  1.76600 0.8698  2.65884 -0.7254 102.52738 -13.59890
## 3 18.7 76037.997  31.03626  2.63056 1.4893  1.85034 -1.9008 102.52738 -56.24160
## 4   NA 27882.829  24.78532  1.29416 1.7530  2.23192 -1.1355 102.52738  24.78532
## 5 14.0  4251.398  89.61882  1.44000 0.2562  4.74800  2.3318 166.80851  47.27262
## 6   NA  2033.900  57.05566 22.35646 3.3422 -0.87800 -5.2032  34.81845  15.44938
##          X10    X11      X12      X13   X14 Risk.Level
## 1   2.857862  8.000 23.08410 26.94344  3.00        low
## 2 352.910575  8.155 24.85976 32.47740  2.45        low
## 3 199.928422  8.155 20.39940 31.03926    NA        low
## 4  10.108892     NA 21.69104 17.30888    NA        low
## 5  12.645460  6.600 19.40300 15.11172 18.50       high
## 6  62.485865 10.300 31.12380 20.57210 10.50       high
library(ggplot2)
library(cowplot)
x1_y <- ggplot(data = df, mapping = aes(x = X1, y = Risk.Level)) + 
  geom_boxplot()

x2_y <- ggplot(data = df, mapping = aes(x = X2, y = Risk.Level)) + 
  geom_boxplot()

x3_y <- ggplot(data = df, mapping = aes(x = X3, y = Risk.Level)) + 
  geom_boxplot()

x4_y <- ggplot(data = df, mapping = aes(x = X4, y = Risk.Level)) + 
  geom_boxplot()

x5_y <- ggplot(data = df, mapping = aes(x = X5, y = Risk.Level)) + 
  geom_boxplot()

x6_y <- ggplot(data = df, mapping = aes(x = X6, y = Risk.Level)) + 
  geom_boxplot()

x7_y <- ggplot(data = df, mapping = aes(x = X7, y = Risk.Level)) + 
  geom_boxplot()

x8_y <- ggplot(data = df, mapping = aes(x = X8, y = Risk.Level)) + 
  geom_boxplot()

x9_y <- ggplot(data = df, mapping = aes(x = X9, y = Risk.Level)) + 
  geom_boxplot()

x10_y <- ggplot(data = df, mapping = aes(x = X10, y = Risk.Level)) + 
  geom_boxplot()

x11_y <- ggplot(data = df, mapping = aes(x = X11, y = Risk.Level)) + 
  geom_boxplot()

x12_y <- ggplot(data = df, mapping = aes(x = X12, y = Risk.Level)) + 
  geom_boxplot()

x13_y <- ggplot(data = df, mapping = aes(x = X13, y = Risk.Level)) + 
  geom_boxplot()

x14_y <- ggplot(data = df, mapping = aes(x = X14, y = Risk.Level)) + 
  geom_boxplot()

# Memanggil semua plot dengan plot_grid
plot_grid(x1_y, x2_y, x3_y, x4_y, x5_y, x6_y, x7_y, 
          x8_y, x9_y, x10_y, x11_y, x12_y, x13_y, x14_y, 
          ncol = 2)
## Warning: Removed 12 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
## Warning: Removed 7 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
## Warning: Removed 17 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
## Warning: Removed 11 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

Distribusi nilai: Box plot menunjukkan distribusi nilai untuk setiap variabel independen berdasarkan tingkat risiko (low atau high). Garis di tengah kotak menunjukkan median, sementara batas atas dan bawah kotak menunjukkan kuartil pertama dan ketiga.

Perbedaan antar tingkat risiko: Jika ada perbedaan yang jelas antara box plot untuk tingkat risiko rendah dan tinggi, ini menunjukkan bahwa variabel tersebut mungkin memiliki pengaruh yang signifikan terhadap tingkat risiko.

Outlier: Titik-titik di luar whisker (garis vertikal yang memanjang dari kotak) menunjukkan outlier atau nilai ekstrem.

Variabilitas: Ukuran kotak dan panjang whisker menunjukkan variabilitas data.

Interpretasi spesifik untuk setiap variabel:

X1 (Capital adequacy ratio): Jika box plot untuk tingkat risiko rendah lebih tinggi, ini menunjukkan bahwa rasio kecukupan modal yang lebih tinggi cenderung terkait dengan risiko yang lebih rendah.

X2 (GDP per capita): Jika box plot untuk tingkat risiko rendah lebih tinggi, ini menunjukkan bahwa negara dengan GDP per kapita lebih tinggi cenderung memiliki risiko investasi yang lebih rendah.

X3 (Gross External Debt): Jika box plot untuk tingkat risiko tinggi lebih tinggi, ini menunjukkan bahwa utang eksternal yang lebih tinggi cenderung terkait dengan risiko yang lebih tinggi.

X4 (Growth of consumer price): Perbedaan yang signifikan antara dua tingkat risiko dapat menunjukkan pengaruh inflasi terhadap risiko investasi.

X5 (Growth of population): Perbedaan dalam pertumbuhan populasi antara tingkat risiko dapat menunjukkan bagaimana demografi mempengaruhi risiko investasi.

X6 dan X7 (Growth of Real GDP dan GDP per capita): Perbedaan yang signifikan dapat menunjukkan pentingnya pertumbuhan ekonomi dalam menentukan risiko investasi.

X8 (Loan-deposit ratio): Perbedaan yang jelas dapat menunjukkan bagaimana kesehatan sektor perbankan mempengaruhi risiko investasi.

X9 (Net External Debt): Seperti X3, perbedaan yang signifikan dapat menunjukkan pentingnya posisi utang eksternal.

X10 (Nominal GDP): Ukuran ekonomi yang lebih besar (box plot lebih tinggi untuk risiko rendah) mungkin terkait dengan risiko yang lebih rendah.

X11 (Non-performing loans): Tingkat pinjaman bermasalah yang lebih tinggi (box plot lebih tinggi untuk risiko tinggi) mungkin terkait dengan risiko yang lebih tinggi.

X12 dan X13 (Investment and Saving to GDP): Perbedaan dalam rasio ini dapat menunjukkan bagaimana pola investasi dan tabungan mempengaruhi risiko.

X14 (Unemployment rate): Tingkat pengangguran yang lebih tinggi (box plot lebih tinggi untuk risiko tinggi) mungkin terkait dengan risiko yang lebih tinggi.

#manajemen data
#untuk mengatasi missing data dapat dilakukan pendugaan dengan mengganti data hilang tersebut dengan nilai median pada variabel tersebut.
df$X1 = ifelse(is.na(df$X1),ave(df$X1, FUN = function(x) median(df$X1, na.rm = TRUE)), df$X1)

df$X8 = ifelse(is.na(df$X8),ave(df$X8, FUN = function(x) median(df$X8, na.rm = TRUE)), df$X8)

df$X11 = ifelse(is.na(df$X11),ave(df$X11, FUN = function(x) median(df$X11, na.rm = TRUE)), df$X11)

df$X14 = ifelse(is.na(df$X14),ave(df$X14, FUN = function(x) median(df$X14, na.rm = TRUE)), df$X14)
df$X1
##   [1] 17.5000 18.2000 18.7000 18.5770 14.0000 18.5770 23.2527 18.5740 15.7000
##  [10] 33.5000 25.3012  4.2000 19.3188 22.7406 20.0000 10.5000 12.2800 19.1400
##  [19] 18.5770 16.0956 22.3000 19.3000 18.5770 14.2800  9.1000 14.7045 17.2000
##  [28] 13.2840 19.4200 16.0000 21.3796 18.5800 22.6000 18.6500 13.4000 25.3120
##  [37] 20.1000 16.9822 18.5770 20.1000 19.6501 18.5770 21.6000 17.6000 15.0000
##  [46] 16.6643 16.1000 20.7000 25.5000 18.2802 23.9000 25.4692 18.5770 13.6000
##  [55] 18.5770 24.8200 16.0000 14.3000 17.9300 17.3000 18.4444 14.8000 18.5770
##  [64] 26.9700 16.5000 22.9520 11.0000 21.8073 23.9000 24.9680 15.2000 16.6966
##  [73] 18.5770 14.5000 23.9600 47.5000 17.7000 18.3000 26.0000 15.2000 15.4000
##  [82] 21.7500 18.9026 23.1000 18.5770 19.1000 16.2500 15.5888 14.9396 17.2000
##  [91] 20.1490 16.7000 19.1000 18.8000 23.2000 21.8000 12.7000 23.3000 18.5770
## [100] 19.0200
df$X8
##   [1]  55.00000 102.52738 102.52738 102.52738 166.80851  34.81845  90.19331
##   [8] 116.41876 191.74943  80.54508 110.63987  78.40700  90.42874  72.99709
##  [15]  90.19331  81.54536 101.29834  76.95112 149.03716 106.86400  84.09314
##  [22]  82.50000  83.29876 116.51738  87.68676  94.22575 117.32727 125.26214
##  [29]  67.45486  68.15254  76.50765 138.35724 359.13886  80.10580  99.71869
##  [36] 104.68417  53.29829 117.48908  90.19331 175.16013 139.57196  72.26748
##  [43]  91.33396 145.18138  50.13182  89.84441  72.98978  68.82672  82.18115
##  [50]  79.03623  96.57359  84.42461  85.93030  73.69553  90.19331 160.95762
##  [57] 111.19617  88.86704  93.88143  70.95343  87.40996 123.99717  90.19331
##  [64]  83.52300  89.13270  59.50145  90.19331  68.23179  42.65388  77.92536
##  [71] 102.28671  94.67722  77.34337  81.91411  67.94252  78.58290  99.03247
##  [78] 113.38897  49.29687  91.29415  64.18761  84.09234 161.74143 207.31980
##  [85] 138.38958 148.12624 121.21618 116.71299  74.25542  61.34609  93.36164
##  [92] 113.24087 104.13747 163.71672  74.41554  90.19331 122.72076 111.94390
##  [99]  90.19331  45.41537
df$X11
##   [1]  8.0000  8.1550  8.1550  3.9000  6.6000 10.3000 10.6000  2.0190  0.9600
##  [10]  5.0000  3.9000  7.7000  3.9000  5.7984  3.9000 17.0000  3.9000  3.9000
##  [19]  4.8292  0.5333 24.4000  0.7500  8.8000  1.7229 20.0000  1.8396  3.1800
##  [28]  2.7000  9.5200  3.9000  2.6562  3.9000  1.8000  1.8500  3.9000  0.3791
##  [37]  3.9000  2.8512 11.1000  1.4000  2.8415 11.2000  1.2157  2.3000 15.0000
##  [46] 26.9780  1.8301  0.9024  7.1776  0.9250  3.0600  3.5406  1.4760  9.5000
##  [55]  3.9000  2.9022  3.9000  2.8000  5.4000  1.0734 14.1390  1.0000  3.9000
##  [64]  7.9000  5.3000  4.1991  3.2000  0.9915  1.0280  3.5221  8.3515  3.2613
##  [73] 11.6788  0.3357  3.6629  8.3000  2.4292  1.6600 11.8000  6.4000  6.0000
##  [82]  4.1000  3.9000  3.9000  3.9000  4.2000  2.1500  4.1276  1.6736  9.1000
##  [91]  3.7123  6.2000  4.9000  2.0000  4.0580  5.0000  3.9000  4.5000  3.9000
## [100]  3.8700
df$X14
##   [1]  3.0000  2.4500  6.8000  6.8000 18.5000 10.5000 11.0500  6.0000  5.4478
##  [10]  8.0000  7.0000  5.0000  6.0000  5.3000  4.0000  2.3000  8.5000 13.9500
##  [19]  4.5000  7.4503  6.8000  3.1728 12.0000 10.0000  6.8000  4.9000 13.0000
##  [28] 15.0000 15.8000  7.8000  3.4000  4.8177  5.4000  5.7000  7.2000  6.4000
##  [37]  7.0000 16.1639 18.0000  7.8000  9.3242 19.0000  5.5665 20.0000  6.8000
##  [46] 18.3000  4.0000  6.5000  7.5000  4.4000  6.5000  6.5000  4.5000  7.5000
##  [55] 13.5000  7.8000 10.8839  8.5000 22.0000  2.7383 11.4537  4.0000  6.8000
##  [64]  5.1000  5.0000 24.6500  6.8000  9.0000  6.8000  8.1000 11.5000 16.3000
##  [73]  7.3000  2.4000  4.3000  6.5000  4.0000  4.0000  6.8000 23.0000 22.0000
##  [82]  4.5000  4.6000  4.2000  4.8000  6.8000 12.0000  9.7000  8.5000  6.5000
##  [91]  6.2000  7.1000  5.5000  0.1200  5.0000  9.7000  5.4000  6.8000  6.8000
## [100]  4.5000
# cek missing data
sum(is.na(df))
## [1] 0
freqrisk <- as.data.frame(table(df$Risk.Level))
freqrisk
##   Var1 Freq
## 1 high   54
## 2  low   46
#visualisasi data
#br chat
freqrisk$persen <- freqrisk$Freq/sum(freqrisk$Freq)

ggplot(data = freqrisk, mapping = aes(x = Var1, y = Freq)) + 
  geom_col(aes(fill =Var1), alpha = 0.7) +
  labs(title = "Level Risiko Investasi",
       x = "Risk Level",
       y = "Frekuensi") +
  geom_text(aes(label = paste0(round(persen*100, 2), "%")), vjust = -0.25) +
  theme(legend.position = "none")

Berdasarkan bar chart diatas terlihat bahwa 54% negara berada pada level risiko investasi yang tinggi (high-risk investment) dan 46% negara berada pada level risiko investasi yang rendah (low-risk investment). Artinya, negara yang memiliki level risiko investasi yang tinggi sedikit lebih banyak dibandingkan negara yang memiliki level risiko investasi yang rendah

#ubah kolom 'Risk.Level' menjadi faktor
df$Risk.Level <- as.factor(df$Risk.Level)
df$Risk.Level <- factor(df$Risk.Level, levels = c("high", "low"), ordered = FALSE)
df$Risk.Level
##   [1] low  low  low  low  high high high low  low  high high high low  low  high
##  [16] high high high high low  high low  high low  high low  high high high high
##  [31] low  low  low  high high low  high low  high low  low  high low  high high
##  [46] high high low  high low  low  low  low  high high low  high high high low 
##  [61] high low  low  low  high high high low  low  low  high high high low  low 
##  [76] high high low  high high high high low  low  low  high high low  low  high
##  [91] low  low  high low  high high low  high low  high
## Levels: high low
#Random Forest
#Prepocessing
#import data ke mlr3
library(mlr3)
task_risk = TaskClassif$new(id="country",backend = df,target = "Risk.Level",positive ="low")
task_risk
## <TaskClassif:country> (100 x 15)
## * Target: Risk.Level
## * Properties: twoclass
## * Features (14):
##   - dbl (14): X1, X10, X11, X12, X13, X14, X2, X3, X4, X5, X6, X7, X8,
##     X9
#Spliting Data
#Data dibagi menjadi 2 bagian yaitu 80% sebagai data training dan 20% sebagai data testing
set.seed(234)
resample_holdout =rsmp("holdout", ratio = 0.8)
resample_holdout$instantiate(task=task_risk)
resample_holdout
## <ResamplingHoldout>: Holdout
## * Iterations: 1
## * Instantiated: TRUE
## * Parameters: ratio=0.8

Dataset telah dibagi menjadi dua bagian:80% digunakan sebagai training set untuk melatih model.20% digunakan sebagai testing set untuk menguji model setelah pelatihan. Hanya satu iterasi dari pembagian data yang dilakukan (tanpa pengulangan), sehingga dataset hanya dipisahkan satu kali. Resampling berhasil diinisialisasi (Instantiated: TRUE), yang berarti proses ini telah dilakukan dengan benar dan siap digunakan untuk melatih dan mengevaluasi model.

#model
library(ranger)
library(mlr3)
library(mlr3learners)
model_rf <- lrn("classif.ranger", predict_type="prob",importance="impurity")
model_rf
## <LearnerClassifRanger:classif.ranger>: Random Forest
## * Model: -
## * Parameters: importance=impurity, num.threads=1
## * Packages: mlr3, mlr3learners, ranger
## * Predict Types:  response, [prob]
## * Feature Types: logical, integer, numeric, character, factor, ordered
## * Properties: hotstart_backward, importance, multiclass, oob_error,
##   twoclass, weights
#interpretasi model
model_rf$train(task=task_risk)

importance<- data.frame(Predictors = names(model_rf$model$variable.importance),
                        impurity = model_rf$model$variable.importance
                        )

rownames(importance) <- NULL

importance %>% arrange(desc(impurity))
##    Predictors   impurity
## 1          X2 11.9123627
## 2          X9  5.3800137
## 3         X11  5.2250550
## 4         X10  4.5483290
## 5          X4  2.6826454
## 6         X14  2.5604889
## 7         X13  2.4320643
## 8          X3  2.0127682
## 9         X12  1.3496433
## 10         X8  1.2618846
## 11         X5  1.1837529
## 12         X1  1.1466515
## 13         X6  0.8667637
## 14         X7  0.8274137
model_rf
## <LearnerClassifRanger:classif.ranger>: Random Forest
## * Model: ranger
## * Parameters: importance=impurity, num.threads=1
## * Packages: mlr3, mlr3learners, ranger
## * Predict Types:  response, [prob]
## * Feature Types: logical, integer, numeric, character, factor, ordered
## * Properties: hotstart_backward, importance, multiclass, oob_error,
##   twoclass, weights

Variabel dengan kemampuan prediksi terbaik: X5 (Population growth) X12 (Total investment) X3 (Gross national income per capita) Variabel-variabel ini memiliki impurity terendah, menunjukkan bahwa mereka paling efektif dalam membedakan level risiko investasi.

Variabel dengan kemampuan prediksi terburuk: X2 (GDP per capita) X9 (Current account balance) X11 (Unemployment rate) X10 (GDP) Variabel-variabel ini memiliki impurity tertinggi, menunjukkan bahwa mereka kurang efektif dalam membedakan level risiko investasi.

Variabel dengan kemampuan prediksi menengah: X4 (Inflation rate) X14 (Interest rate) X13 (Gross national savings)

ggplot(importance,
       aes(x=impurity,
           y=reorder(Predictors,impurity))
       ) +
  geom_col(fill = "steelblue")+
  geom_text(aes(label=round(impurity,2)),hjust=1.2)

Plot akan menampilkan prediktor (variabel) pada sumbu y dan nilai impurity pada sumbu x.

Prediktor akan diurutkan berdasarkan nilai impurity mereka, dengan prediktor yang memiliki impurity tertinggi di bagian atas plot. Di ujung setiap batang, akan ada label yang menunjukkan nilai impurity yang dibulatkan ke dua desimal.

X2 (GDP per capita): Batang terpanjang, dengan nilai 11.92 X9 (Current account balance): Batang kedua terpanjang, dengan nilai 5.23 X11 (Unemployment rate): Nilai 4.76 X10 (GDP): Nilai 4.65 X4 (Inflation rate): Nilai 2.88 X14 (Interest rate): Nilai 2.70 X13 (Gross national savings): Nilai 2.33 X3 (Gross national income per capita): Nilai 2.26 X12 (Total investment): Nilai 1.35 X5 (Population growth): Batang terpendek, dengan nilai 1.24

Plot ini akan memperkuat kesimpulan sebelumnya bahwa X2 (GDP per capita) adalah prediktor dengan impurity tertinggi, sementara X5 (Population growth) adalah prediktor dengan impurity terendah, menunjukkan bahwa pertumbuhan populasi mungkin merupakan indikator yang lebih baik untuk risiko investasi dibandingkan dengan GDP per kapita dalam konteks ini.

#training
set.seed(234)
train_test_rf = resample(task = task_risk,
                         learner = model_rf,
                         resampling = resample_holdout,
                         store_models = TRUE
)
## INFO  [22:27:25.196] [mlr3] Applying learner 'classif.ranger' on task 'country' (iter 1/1)

Waktu: [20:35:49.316] Ini menunjukkan waktu ketika proses ini dimulai, yaitu pukul 20:35:49 dan 316 milidetik.

[mlr3] Ini mengindikasikan bahwa proses ini dijalankan menggunakan framework mlr3, yang merupakan framework pembelajaran mesin di R.

Applying learner ‘classif.ranger’ ‘classif.ranger’ adalah nama learner yang digunakan. Ini mengacu pada algoritma Random Forest yang diimplementasikan dalam paket ‘ranger’ di R. ‘classif’ menunjukkan bahwa ini adalah tugas klasifikasi (bukan regresi).

on task ‘country’ Ini menunjukkan nama tugas yang sedang diproses, dalam hal ini disebut ‘country’. Tugas ini kemungkinan berkaitan dengan klasifikasi negara berdasarkan tingkat risiko investasi.

#testing
data_testing = as.data.table(train_test_rf$prediction())
data_testing
##     row_ids  truth response   prob.low  prob.high
##       <int> <fctr>   <fctr>      <num>      <num>
##  1:       9    low      low 0.90590317 0.09409683
##  2:      10   high      low 0.55254365 0.44745635
##  3:      12   high     high 0.28936905 0.71063095
##  4:      22    low      low 0.95048651 0.04951349
##  5:      23   high     high 0.08841111 0.91158889
##  6:      27   high     high 0.23626587 0.76373413
##  7:      32    low      low 0.97720714 0.02279286
##  8:      33    low      low 0.94433651 0.05566349
##  9:      36    low      low 0.80659444 0.19340556
## 10:      37   high     high 0.20504206 0.79495794
## 11:      44   high     high 0.18224603 0.81775397
## 12:      47   high     high 0.27397063 0.72602937
## 13:      59   high     high 0.06550238 0.93449762
## 14:      62    low      low 0.86840476 0.13159524
## 15:      64    low     high 0.49597540 0.50402460
## 16:      71   high     high 0.10524603 0.89475397
## 17:      73   high     high 0.07424444 0.92575556
## 18:      81   high     high 0.16464048 0.83535952
## 19:      94    low      low 0.74354524 0.25645476
## 20:      95   high      low 0.65104444 0.34895556
##     row_ids  truth response   prob.low  prob.high

Row ID 9: Truth: low, Response: low Model memprediksi dengan benar (90.59% yakin) Interpretasi: Model sangat yakin dan akurat untuk kasus ini

Row ID 10: Truth: high, Response: low Model salah memprediksi (55.25% yakin prediksi salah) Interpretasi: Kesalahan klasifikasi, tapi model tidak terlalu yakin

Row ID 12: Truth: high, Response: high Model memprediksi dengan benar (71.06% yakin) Interpretasi: Prediksi benar dengan keyakinan moderat

Row ID 22: Truth: low, Response: low Model memprediksi dengan benar (95.05% yakin) Interpretasi: Model sangat yakin dan akurat

Row ID 23: Truth: high, Response: high Model memprediksi dengan benar (91.16% yakin) Interpretasi: Prediksi benar dengan keyakinan tinggi

Row ID 27: Truth: high, Response: high Model memprediksi dengan benar (76.37% yakin) Interpretasi: Prediksi benar dengan keyakinan moderat ke tinggi

Row ID 32: Truth: low, Response: low Model memprediksi dengan benar (97.72% yakin) Interpretasi: Model sangat yakin dan akurat

Row ID 33: Truth: low, Response: low Model memprediksi dengan benar (94.43% yakin) Interpretasi: Model sangat yakin dan akurat

Row ID 36: Truth: low, Response: low Model memprediksi dengan benar (80.66% yakin) Interpretasi: Prediksi benar dengan keyakinan tinggi

Row ID 37: Truth: high, Response: high Model memprediksi dengan benar (79.50% yakin) Interpretasi: Prediksi benar dengan keyakinan tinggi

Akurasi: Model benar dalam 9 dari 10 kasus yang ditampilkan, menunjukkan kinerja yang baik. Kepercayaan: Model umumnya memiliki tingkat kepercayaan yang tinggi dalam prediksinya. Kesalahan: Satu kesalahan klasifikasi (Row ID 10) dengan tingkat kepercayaan yang rendah, menunjukkan bahwa model “ragu-ragu” dalam kasus ini. Distribusi kelas: Sampel ini menunjukkan keseimbangan yang baik antara kelas ‘high’ dan ‘low’. Potensi perbaikan: Fokus pada kasus seperti Row ID 10 mungkin dapat membantu meningkatkan kinerja model.

#Evaluasi Model
#Confusion matrix
train_test_rf$prediction()$confusion
##         truth
## response low high
##     low    7    2
##     high   1   10

Dari confusion matrix di atas terlihat bahwa diperoleh:

True Positive (TP) = 7 Artinya ada 7 negara yang memiliki kategori risiko investasi rendah (low) dan diprediksi dengan benar sebagai risiko rendah.

True Negative (TN) = 10 Artinya ada 10 negara yang memiliki kategori risiko investasi tinggi (high) dan diprediksi dengan benar sebagai risiko tinggi.

False Positive (FP) = 2 Artinya ada 2 negara yang memiliki kategori risiko investasi rendah (low), tetapi salah diprediksi sebagai risiko tinggi (high).

False Negative (FN) = 1 Artinya ada 1 negara yang memiliki kategori risiko investasi tinggi (high), tetapi salah diprediksi sebagai risiko rendah (low).

#akurasi
akurasi_rf <- train_test_rf$aggregate(list(msr("classif.acc"),
                                   msr("classif.specificity"),
                                   msr("classif.sensitivity")
                                   ))
akurasi_rf
##         classif.acc classif.specificity classif.sensitivity 
##           0.8500000           0.8333333           0.8750000

Terlihat dari output diatas, diperoleh nilai akurasi sekitar 85%

#ROC
library(mlr3viz)
autoplot(train_test_rf$prediction(), type = "roc")

Kurva ROC menunjukkan trade-off antara True Positive Rate (TPR) dan False Positive Rate (FPR) pada berbagai ambang batas klasifikasi. Semakin besar luas area di bawah kurva ROC maka kemampuan prediksi yang dihasilkan semakin baik.

#nilai AUC atau Area Under Curve didapat dengan menghitung luas area dibawah kurva AUC sebagai berikut
train_test_rf$aggregate((msr("classif.auc")))
## classif.auc 
##   0.9791667

Model dengan nilai AUC 0.9791667 menunjukkan performa yang sangat baik.

risklevel_baru <- data.frame(
  X1 = 20,
  X2 = 9203,
  X3 = 90,
  X4 = 22,
  X5 = 1,
  X6 = 3,
  X7 = 0,
  X8 = 90,
  X9 = 15,
  X10 = 450,
  X11 = 8,
  X12 = 23, 
  X13 = 26,
  X14 = 5)
prediksi <- predict(model_rf, newdata = risklevel_baru)
prediksi
## [1] high
## Levels: low high

Hasil prediksi menunjukan bahwa negara tersebut masuk dalam kelompok tingkat investasi risiko yang tinggi