options(repos = c(CRAN = "https://cran.rstudio.com/"))
#Install package yang diperlukan

install.packages("readxl")
## Installing package into 'C:/Users/lusia/AppData/Local/R/win-library/4.4'
## (as 'lib' is unspecified)
## package 'readxl' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'readxl'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problem copying
## C:\Users\lusia\AppData\Local\R\win-library\4.4\00LOCK\readxl\libs\x64\readxl.dll
## to C:\Users\lusia\AppData\Local\R\win-library\4.4\readxl\libs\x64\readxl.dll:
## Permission denied
## Warning: restored 'readxl'
## 
## The downloaded binary packages are in
##  C:\Users\lusia\AppData\Local\Temp\RtmpCAFbVW\downloaded_packages
install.packages("caTools")
## Installing package into 'C:/Users/lusia/AppData/Local/R/win-library/4.4'
## (as 'lib' is unspecified)
## package 'caTools' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'caTools'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problem copying
## C:\Users\lusia\AppData\Local\R\win-library\4.4\00LOCK\caTools\libs\x64\caTools.dll
## to C:\Users\lusia\AppData\Local\R\win-library\4.4\caTools\libs\x64\caTools.dll:
## Permission denied
## Warning: restored 'caTools'
## 
## The downloaded binary packages are in
##  C:\Users\lusia\AppData\Local\Temp\RtmpCAFbVW\downloaded_packages
install.packages("ggplot2")
## Installing package into 'C:/Users/lusia/AppData/Local/R/win-library/4.4'
## (as 'lib' is unspecified)
## package 'ggplot2' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\lusia\AppData\Local\Temp\RtmpCAFbVW\downloaded_packages
install.packages("pROC")
## Installing package into 'C:/Users/lusia/AppData/Local/R/win-library/4.4'
## (as 'lib' is unspecified)
## package 'pROC' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'pROC'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problem copying
## C:\Users\lusia\AppData\Local\R\win-library\4.4\00LOCK\pROC\libs\x64\pROC.dll to
## C:\Users\lusia\AppData\Local\R\win-library\4.4\pROC\libs\x64\pROC.dll:
## Permission denied
## Warning: restored 'pROC'
## 
## The downloaded binary packages are in
##  C:\Users\lusia\AppData\Local\Temp\RtmpCAFbVW\downloaded_packages

Deskripsi:

Baris ini menginstall dua package R yaitu readxl dan caTools. readxl digunakan untuk membaca file Excel, caTools digunakan untuk membagi data menjadi training dan testing, ggplot2 digunakan sebagai alat visualisasi data untuk membuat grafik yang informatif dan estetis menggunakan Grammar of Graphics, sedangkan pROC digunakan untuk menghitung dan memvisualisasikan kurva ROC serta menghitung area di bawah kurva (AUC)

Insight:

Instalasi ini penting untuk memungkinkan akses dan pembagian dataset dengan cara yang efisien. Pastikan package ini sudah terinstal sebelum melanjutkan.

#Load data dan package

library(readxl)
library(caTools)
library(ggplot2)
library(pROC)
## Type 'citation("pROC")' for a citation.
## 
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var

Deskripsi:

Package readxl, caTools, ggplot2, dan pROC di-load kedalam lingkungan kerja agar fungsinya dapat digunakan.

Insight:

Ini adalah persiapan untuk memungkinkan operasi seperti membaca file Excel, membagi dataset secara acak, visualisasi data atau kurva serta menghitung area di bawah kurva.

#Baca data dari file excel

file_path <- "D:/Data R SEI/Copy of Level Risiko Investasi (edit).xlsx"
train_data <- read_excel(file_path, sheet = "Training")
test_data <- read_excel(file_path, sheet = "Testing")

Deskripsi:

read_excel() digunakan untuk membaca file Excel yang berlokasi di file_path Dataset Training dan Testing dibaca dari lembar kerja (sheet) yang sesuai dalam file Excel.

Insight:

Proses ini mengimpor data untuk keperluan pelatihan dan pengujian model. Data training digunakan untuk melatih model, dan data testing untuk memvalidasi hasil prediksi.

#Pre-processing data

#Drop kolom 'Country' dan pisahkan fitur serta target

train_data <- train_data[, -1]
test_data <- test_data[, -1]

train_data$`Risk Level (0=low, 1=high)`<- as.factor(train_data$`Risk Level (0=low, 1=high)`)

#Assign x (fitur) dan y (target)

x_train <- train_data[, -ncol(train_data)] #semua kolom kecuali target
y_train <- train_data$`Risk Level (0=low, 1=high)`

Deskripsi:

Kolom pertama (dalam hal ini Country) dihapus dari dataset training dan testing karena dianggap tidak relevan. Target variabel Risk Level diubah menjadi faktor (as.factor()), yang diperlukan untuk regresi logistik karena ini adalah model klasifikasi. x_train berisi fitur (semua kolom kecuali target), sementara y_train berisi target (kelas risiko).

Insight:

Ini adalah langkah pre-processing penting dimana data diformat agar sesuai dengan model regresi logistik. Kolom yang tidak relevan dihapus, dan variabel target dikonversi ke tipe yang sesuai.

#Pisahkan data training dan testing

set.seed(42)
split <- sample.split(y_train, SplitRatio = 0.8)
x_train_sub <- subset(x_train, split == TRUE)
y_train_sub <- subset(y_train, split == TRUE)
x_val <- subset(x_train, split == FALSE)
Y_val <- subset(y_train, split == FALSE)

Deskripsi:

Data training dipecah menjadi 80% training (x_train_sub, y_train_sub) dan 20% testing (x_vaL, Y_val) menggunakan fungsi sample.split() dan package caTools. set.seed(42) memastikan pembagian data selalu konsisten setiap kali kode dijalankan.

Insight:

Pembagian data ini penting untuk menguji performa model secara terpisah tanpa menggunakan data testing yang disediakan. Validasi pada subset training membantu menghindari overfitting sebelum model digunakan pada testing.

#Bangun model regresi logistik

#Gabungkan kembali fitur dan target untuk keperluan fitting

train_data_model <- cbind(x_train_sub, y_train_sub)

#Model regresi logistik

model <- glm(y_train_sub ~ ., data = train_data_model, family = binomial)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred

Deskripsi:

Fitur dan target data training digabungkan menjadi train_data_model untuk memudahkan pelatihan model. glm() digunakan untuk membangun model Regresi Logistik, dimana formula y_train_sub ~. menunjukkan bahwa kita memprediksi target y_train_sub berdasarkan semua fitur (ditandai dengan .). family = binomial menunjukkan bahwa ini adalah regresi logistik.

Insight:

Regresi logistik adalah pilihan yang tepat untuk klasifikasi biner seperti prediksi risiko (0=low, 1=high). Model ini mengasumsikan hubungan linear antara log odds dan fitur.

#Ringkasan model

summary(model)
## 
## Call:
## glm(formula = y_train_sub ~ ., family = binomial, data = train_data_model)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)  
## (Intercept)  7.4970315  7.6793486   0.976   0.3289  
## X1           0.0121219  0.1183723   0.102   0.9184  
## X2          -0.0002788  0.0001197  -2.330   0.0198 *
## X3           0.0085236  0.0118128   0.722   0.4706  
## X4          -0.2107219  0.2734545  -0.771   0.4409  
## X5           0.8249546  1.1060938   0.746   0.4558  
## X6          -1.1208077  0.8614382  -1.301   0.1932  
## X7          -0.1204581  0.6415634  -0.188   0.8511  
## X8          -0.0687486  0.0507352  -1.355   0.1754  
## X9           0.0248446  0.0162336   1.530   0.1259  
## X10          0.0002345  0.0003741   0.627   0.5308  
## X11          0.5626653  0.3452315   1.630   0.1031  
## X12          0.2256143  0.2450297   0.921   0.3572  
## X13         -0.1547744  0.2277245  -0.680   0.4967  
## X14          0.2261054  0.2454651   0.921   0.3570  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 110.45  on 79  degrees of freedom
## Residual deviance:  28.46  on 65  degrees of freedom
## AIC: 58.46
## 
## Number of Fisher Scoring iterations: 9

Deksrispi:

Menampilkan ringkasan hasil model regresi logistik yang dilatih, termasuk koefisien dari setiap fitur, nilai p, deviance, dan informasi lainnya.

Insight:

Dengan melihat ringkasan model, kita dapat mengevaluasi signifikansi statistik dari setiap fitur dan bagaimana mereka berkontribusi tehadap prediksi. Nilai p menunjukkan apakah fitur secara signifkan memengaruhi prediksi target.

#Prediksi pada data testing

#Prediksi probabilitas

pred_probs <- predict(model, newdata = x_val, type = "response")

#Ubah probabilitas menjadi prediksi kelas (threshold 0.5)

pred_classes <- ifelse(pred_probs > 0.5, 1, 0)

Deskrispi:

predict() digunakan untuk menghitung probabilitas prediksi pada data validasi. Probabilitas kemudian diubah menjadi kelas prediksi (0 atau 1) berdasarkan threshold 0.5.

Insight:

Dengan prediksi probabilitas ini, kita dapat mengukur kinerja model. Threshold 0.5 adalah default, namun bisa diubah jika diperlukan.

#Membuat confusion matrix

conf_matrix <- table(Predicted = pred_classes, Actual = Y_val)

#Mengonversi confusion matrix ke dalam data frame

conf_matrix_df <- as.data.frame(as.table(conf_matrix))
#Visualisasi confusion matrix

ggplot(conf_matrix_df, aes(x = Actual, y = Predicted)) + geom_tile(aes(fill = Freq), color = "white") + geom_text(aes(label = Freq), vjust = 1) + scale_fill_gradient(low = "lightblue", high = "blue") + labs(title = "Confusion Matrix", x = "Actual Risk Level", y = "Predicted Risk Level") + theme_minimal()

Deskripsi:

Confusion matrix adalah visualisasi yang menunjukkan perbandingan antara prediksi model dan nilai sebenarnya dari data testing (Y_val). Kolom Actual berisi label asli (risiko tinggi atau rendah), sedangkan kolom Predicted berisi hasil prediksi model. geom_tile() digunakan untuk membuat heatmap yang menunjukkan frekuensi prediksi yang benar (True Positives dan True Negatives) serta kesalahan (False Positives dan False Negatives). geom_text() menampilkan angka frekuensi di dalam kotak heatmap.

Insight:

Visualisasi ini membantu kita untuk melihat apakah model lebih sering melakukan kesalahan dalam memprediksi risiko tinggi atau rendah. Jika nilai di diagonal utama (True Positives dan True Negatives) jauh lebih besar daripada nilai lainnya, berarti model bekerja dengan baik.

#ROC curve

#Menghitung nilai ROC curve

roc_curve <- roc(Y_val, pred_probs)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
#Visualisasi ROC curve 

ggplot(data = data.frame(tpr = roc_curve$sensitivities, fpr = 1 - roc_curve$specificities), aes(x = fpr, y = tpr)) + geom_line(color = "blue") + geom_abline(linetype = "dashed", color = "red") + labs(title = "ROC Curve", x = "False Positive Rate", y = "True Positive Rate") + theme_minimal()

Deskripsi:

ROC curve digunakan untuk mengevaluasi kinerja model klasifikasi biner seperti regresi logistik dengan menampilkan trade-off antara True Positive Rate (Sensitivitas) dan False Positive Rate. geom_line() digunakan untuk menggambarkan kurva ROC, sementara geom_abline() menampilkan garis diagonal yang mewakili model acak.

Insight :

ROC curve menunjukkan bagaimana model menangani trade-off antara sensitivitas dan spesifisitas. Jika kurva mendekati sudut kiri atas, itu berarti model memiliki kinerja yang sangat baik. Luas di bawah kurva (AUC - Area Under the Curve) digunakan untuk meringkas kinerja, dengan nilai AUC mendekati 1 menunjukkan model yang sangat baik.

# Distribusi hasil prediksi

#Mengonversi pred_classes menjadi faktor untuk keperluan plot

pred_classes_factor <- as.factor(pred_classes)

#Membuat bar chart distribusi prediksi

ggplot(data = data.frame(Predicted_Risk_Level = pred_classes_factor), aes(x = Predicted_Risk_Level)) + geom_bar(fill = "gold", color = "black") + labs(title = "Distribution of Predicted Risk Levels", x = "Predicted Risk Level", y = "Count") + theme_minimal()

Deskripsi:

Bar chart ini menggambarkan distribusi jumlah prediksi risiko tinggi (1) dan risiko rendah (0). geom_bar() digunakan untuk menghitung frekuensi dari masing-masing kelas prediksi (tinggi dan rendah).

Insight:

Visualisasi ini memungkinkan kita untuk memahami seberapa banyak observasi yang diklasifikan ke dalam setiap kategori. Misalnya, jika sebagian besar prediksi menunjukkan risiko rendah, mungkin ada bias dalam data atau model.

#Membuat density plot untuk probabilitas prediksi

ggplot(data = data.frame(Predicted_Probabilities = pred_probs), aes(x = Predicted_Probabilities)) + geom_density(fill = "pink", alpha = 0.5) + labs(tittle = "Distribution of Predicted Probabilities", x = "Predicted Probability", y = "Density") + theme_minimal()

Deskripsi:

Density plot digunakan untuk melihat distribusi probabilitas yang dihasilkan oleh model regresi logistik. Probabilitas prediksi berkisar antara 0 dan 1, dimana nilai lebih mendekati 1 menunjukkan keyakinan tinggi bahwa observasi termasuk dalam risiko tinggi. geom_density() digunakan untuk memvisualisasikan distribusi probabilitas ini.

Insight:

Plot ini membantu untuk memahami bagaimana model mendistribusikan prediksi probabilitasnya. Misalnya, jika ada dua puncak (bimodal), ini menunjukkan bahwa model dapat dengan jelas membedakan antara dua kategori. Sebaliknya, jika distribusi cenderung bertumpuk di tengah, ini dapat menunjukkan ketidakpastian model.

#Boxplot untuk probabilitas berdasarkan kelas aktual

#Membuat data frame untuk probabilitas dan nilai aktual

prob_actual_df <- data.frame(Probabilities = pred_probs, Actual = as.factor(Y_val))

ggplot(prob_actual_df, aes(x = Actual, y = Probabilities, fill = Actual)) + geom_boxplot() + labs(tittle = "Predicted Probabilities by Actual Risk Level", x = "Actual Risk Level", y = "Predicted Probability") + scale_fill_manual(values = c("lightgreen", "orchid")) + theme_minimal()

Deskripsi:

Boxplot ini menunjukkan distribusi probabilitas prediksi model berdasarkan kelas aktual (risiko rendah atau tinggi). Ini menunjukkan seberapa yakin model dalam membuat prediksi untuk setiap kelas aktual. geom_boxplot() digunakan untuk memvisualisasikan rentang prediksi probabilitas untuk masing-masing kelas.

Insight:

Boxplot ini memungkinkan kita untuk melihat apakah model lebih yakin dalam memprediksi satu kelas dibandingkan kelas lainnya. Jika boxplot untuk risiko rendah memiliki rentang yang lebih sempit di sekitar 0, dan risiko tinggi di sekitar 1, itu menunjukkan model membuat prediksi dengan keyakinan tinggi. Sebaliknya, overlap antar kelas menunjukkkan kebingunagan model dalam membedakan kelas risiko.

#Menyimpan model

save(model, file = "model_regresi_logistik.RData")
#Memuat model

load("model_regresi_logistik.RData")
#Menghitung akurasi model

mean(pred_classes == Y_val)
## [1] 0.8

Deskripsi:

Menghitung akurasi model dengan membandingkan prediksi model dengan label yang sebenarnya pada data validasi.

Insight:

Akurasi adalah metrik dasar untuk mengukur performa model, yang menunjukkan proporsi prediksi yang benar.

#Prediksi pada data testing

#Prediksi probabilitas untuk data testing

test_probs <- predict(model, newdata = test_data, type = "response")

#Konversi probabilitas menjadi kelas (0 atau 1)

test_classes <- ifelse(test_probs > 0.5, 1, 0)

#Tambahkan kolom prediksi ke data testing

test_data$Predicted_Risk_Level <- test_classes

Deskripsi:

predict () digunakan untuk menghitung probabilitas prediksi pada data testing. Probabilitas diubah menjadi prediksi (0 atau 1) dan ditambahkan sebagai kolom baru Predicted_Risk_Level pada test_data

Insight:

Ini adalah langkah akhir untuk menerapkan model yang telah dilatih pada data testing, menghasilkan prediksi untuk setiap instance pada dataset testing.

#Menampilkan seluruh hasil prediksi

print(test_data)
## # A tibble: 17 × 15
##       X1     X2    X3     X4      X5    X6     X7    X8      X9      X10   X11
##    <dbl>  <dbl> <dbl>  <dbl>   <dbl> <dbl>  <dbl> <dbl>   <dbl>    <dbl> <dbl>
##  1  23.2 60338. 175.   1.62   0.676  2.47   0.353 186.    64.1    538.    0.5 
##  2  16.8 62433. 410.   0.105  0.907  2.78   0.291  94.0 -201.     340.    1.31
##  3  18.3 28684. 103.   0.844  0.0746 3.55   1.93   72.3   16.2     52.8   3.02
##  4  19.7 21043. 103.   1.17   0.0734 3.22   1.23  112.    33.4    103.    2.53
##  5  11.9 49356.  60.2  0.896  0.586  1.75  -1.13   88.6 -145.       1.49 63.5 
##  6  17.4  3989.  65.6  0.394  0.504  2.45  -0.125  88.9   27.3     24.6   1.57
##  7  19.8  7451.  33.2  0.345  0.315  3.44   1.28  100.   -42.6    502.    3.2 
##  8  12.9  3617.  85.3  5.56   1.12   1.61  -1.50  134.    64.5     39.2  13.6 
##  9  18    8653.  51.7 11.7    1.48   4.16   1.81  117.    28.6    720.   11.3 
## 10  14.1 31854.  48.5  0.724  0.102  2.54   2.77   71.1 -189.     668.   11.3 
## 11  22    3955. 104.  19.2   -0.391  0.34   1.89   72.3   -5.47   156.   49   
## 12  21.6   787.  42.3  4.29   3.66   5.74   0.421  69.5   21.9     33.5   3.34
## 13  16.3 69325. 104.   1.55   0.626  2.46   0.487  96.5   47.7  20935     1   
## 14  17.0 15968.  73.0  8.00   0.359  0.821 -0.717  49.1  -16.2     53.6  11.3 
## 15  18.4  1873.  30.0 12.3    1.61   5.84   3.07   96.5  -45.2     57.7   2.1 
## 16  12.1  3887.  34.5  2.80   0.851  6.95   5.28   86.6    7.40   352.    1.69
## 17  16.6  6405.  50.8  4.98   1.48   0.789 -2.32  107.    15.0    302.   11.3 
## # ℹ 4 more variables: X12 <dbl>, X13 <dbl>, X14 <dbl>,
## #   Predicted_Risk_Level <dbl>

Deskripsi:

print(test_data) adalah fungsi dasar di R untuk menampilkan seluruh isi objek test_data ke dalam konsol. Dalam konteks ini, test_data adalah data uji yang berisi hasil prediksi risiko (misalnya, Predicted_Risk_Level yang telah dihasilkan oleh model regresi logistik) Fungsi print() akan menampilkan semua baris dan kolom dari data test_data dalam format tabel di konsol.

Insight:

Fungsi print() bermanfaat ketika kita ingin melihat hasil prediksi secara cepat di konsol tanpa membuka jendela baru seperti pada fungsi View().

Kesimpulan

Berdasarkan 14 variabel yang telah disediakan, kita dapat menarik kesimpulan dan pengambilan keputusan dari hasil prediksi risiko investasi.

  1. X1: Capital Adequacy Ratio (%) Average from Last 5 Years Rasio kecukupan modal yang lebih tinggi menunjukkan stabilitas keuangan yang lebih baik. Jika model menunjukkan bahwa variabel ini memiliki koefisien positif, maka kecukupan modal yang rendah dapat meningkatkan risiko.

  2. X2: GDP per Capita (USD) GDP per kapita yang lebih tinggi sering kali berhubungan dengan tingkat hidup yang lebih baik dan stabilitas ekonomi.

  3. X3: Gross External Debt (% of GDP) Average from Last 5 Years Utang luar negeri yang tinggi dapat menunjukkan potensi risiko ekonomi, terutama jika utang melebihi kemampuan negara untuk membayar.

  4. X4: Growth of Consumer Price (%) Average from Last 5 Years Inflasi yang tinggi dapat menurunkan daya beli masyarakat dan menambah ketidakpastian ekonomi.

  5. X5: Growth of Population (%) Average from Last 5 Years Pertumbuhan populasi yang stabil dapat meningkatkan permintaan pasar. Namun, jika terlalu tinggi, bisa menambah tekanan pada sumber daya.

  6. X6: Growth of Real GDP (%) Average from Last 5 Years Pertumbuhan GDP riil yang positif menunjukkan kesehatan ekonomi.

  7. X7: Growth of Real GDP per Capita (%) Average from Last 5 Years Ini menunjukkan peningkatan standar hidup. Pertumbuhan yang tinggi bisa menurunkan risiko.

  8. X8: Loan-Deposit Ratio (%) Average from Last 5 Years Rasio pinjaman terhadap simpanan yang tinggi menunjukkan bahwa bank lebih agresif dalam memberikan pinjaman, yang dapat meningkatkan risiko default.

  9. X9: Net External Debt (% of GDP) Average from Last 5 Years Utang luar negeri bersih yang tinggi menunjukkan ketergantungan yang besar pada utang luar negeri.

  10. X10: Nominal GDP (USD bn) GDP nominal memberikan gambaran ukuran ekonomi. Ekonomi besar cenderung lebih stabil.

  11. X11: Non-Performing Loans (% of Gross Loans) Average from Last 5 Years Persentase pinjaman bermasalah yang tinggi menunjukkan risiko yang lebih besar bagi lembaga keuangan.

  12. X12: Percentage of Gross Domestic Investment to GDP (%) Average from Last 5 Years Investasi domestik yang tinggi menunjukkan kepercayaan pada perekonomian.

  13. X13: Percentage of Gross Domestic Saving to GDP (%) Average from Last 5 Years Tabungan domestik yang tinggi bisa mengurangi ketergantungan pada utang.

  14. X14: Unemployment Rate (% Labour Force) Average from Last 5 Years Tingkat pengangguran yang tinggi menunjukkan masalah ekonomi.

Pengambilan Keputusan

1 Prioritaskan Stabilitas Ekonomi Fokus pada investasi di negara atau perusahaan dengan GDP per kapita tinggi, pertumbuhan GDP positif, dan rasio kecukupan modal yang baik.

2 Hindari Risiko Tinggi Waspadai investasi di wilayah dengan utang luar negeri tinggi, inflasi tinggi, atau pinjaman bermasalah yang tinggi.

3 Dukung Investasi Domestik Perhatikan tingkat investasi domestik dan tabungan yang tinggi, karena ini menunjukkan kepercayaan dalam ekonomi.

4 Tingkat Pengangguran Evaluasi tingkat pengangguran untuk memastikan bahwa ekonomi yang diinvestasikan tidak mengalami masalah sosial yang dapat memengaruhi stabilitas investasi.

Dengan mengamati dan mempertimbangkan semua variabel di atas, keputusan investasi yang lebih bijak dan terukur dapat diambil, membantu meminimalkan risiko dan memaksimalkan potensi keuntungan.