0.1 Pendahuluan

Dataset ini berfokus pada pengajuan pinjaman Kredit Pemilikan Rumah (KPR) di sebuah lembaga keuangan. Data ini mencakup informasi historis tentang pemohon pinjaman KPR serta hasil pengajuan mereka, baik yang disetujui maupun yang ditolak. Proses persetujuan pinjaman dalam konteks ini memerlukan upaya dan waktu yang signifikan jika dilakukan secara manual. Proses manual ini akan mengkonsumsi sumber daya dan waktu yang berharga. Namun, keputusan persetujuan KPR secara konsisten didasarkan pada data yang serupa dan repetitif. Oleh karena itu, lembaga keuangan telah memutuskan untuk mengadopsi model machine learning sebagai solusi dalam proses persetujuan pinjaman KPR. Hasil prediksi yang dihasilkan oleh model ini akan disubmit untuk direview oleh supervisor sebagai langkah akhir dalam proses persetujuan pinjaman tersebut. Dengan demikian, bank berharap dapat meningkatkan efisiensi dan efektivitas dalam pengambilan keputusan persetujuan pinjaman KPR.

0.2 Persiapan Data

0.2.1 Membaca Data

Saya akan melakukan pembacaan data dan kemudian menyimpannya ke dalam variabel yang bernama “kpr”.

kpr <- read.csv("data_input/loan_approval.csv")
head(kpr)

loan_id : ini adalah index/no baris no_of_dependents : jumlah tanggungan (anak, dll) education : tingkat pendidikan (tamat sma atau tidak) income_annum : jumlah pendapatan tahunan loan_ammount : jumlah pinjaman yang diajukan loan_term : lama masa pinjaman (tenor) dalam bulan cibil_score : identik dengan nilai kredit / bi-checking residential_assets_value : Nilai aset yang dimiliki pemohon pinjaman yang masuk ke dalam golongan residential commercial_assets_value : Nilai aset yang dimiliki pemohon pinjaman yang masuk ke dalam golongan commercial luxury_assets_value : Nilai aset yang dimiliki pemohon pinjaman yang masuk ke dalam golongan luxury bank_asset_value : Nilai aset yang dimiliki pemohon pinjaman yang ada di perbankan loan_status : hasil pengajuan pinjaman, diterima atau ditolak

0.2.2 Transformasi & Cleansing Data

glimpse(kpr)
#> Rows: 4,269
#> Columns: 13
#> $ loan_id                  <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14…
#> $ no_of_dependents         <int> 2, 0, 3, 3, 5, 0, 5, 2, 0, 5, 4, 2, 3, 2, 1, …
#> $ education                <chr> " Graduate", " Not Graduate", " Graduate", " …
#> $ self_employed            <chr> " No", " Yes", " No", " No", " Yes", " Yes", …
#> $ income_annum             <int> 9600000, 4100000, 9100000, 8200000, 9800000, …
#> $ loan_amount              <int> 29900000, 12200000, 29700000, 30700000, 24200…
#> $ loan_term                <int> 12, 8, 20, 8, 20, 10, 4, 20, 20, 10, 2, 18, 1…
#> $ cibil_score              <int> 778, 417, 506, 467, 382, 319, 678, 382, 782, …
#> $ residential_assets_value <int> 2400000, 2700000, 7100000, 18200000, 12400000…
#> $ commercial_assets_value  <int> 17600000, 2200000, 4500000, 3300000, 8200000,…
#> $ luxury_assets_value      <int> 22700000, 8800000, 33300000, 23300000, 294000…
#> $ bank_asset_value         <int> 8000000, 3300000, 12800000, 7900000, 5000000,…
#> $ loan_status              <chr> " Approved", " Rejected", " Rejected", " Reje…
summary(kpr)
#>     loan_id     no_of_dependents  education         self_employed     
#>  Min.   :   1   Min.   :0.000    Length:4269        Length:4269       
#>  1st Qu.:1068   1st Qu.:1.000    Class :character   Class :character  
#>  Median :2135   Median :3.000    Mode  :character   Mode  :character  
#>  Mean   :2135   Mean   :2.499                                         
#>  3rd Qu.:3202   3rd Qu.:4.000                                         
#>  Max.   :4269   Max.   :5.000                                         
#>   income_annum      loan_amount         loan_term     cibil_score   
#>  Min.   : 200000   Min.   :  300000   Min.   : 2.0   Min.   :300.0  
#>  1st Qu.:2700000   1st Qu.: 7700000   1st Qu.: 6.0   1st Qu.:453.0  
#>  Median :5100000   Median :14500000   Median :10.0   Median :600.0  
#>  Mean   :5059124   Mean   :15133450   Mean   :10.9   Mean   :599.9  
#>  3rd Qu.:7500000   3rd Qu.:21500000   3rd Qu.:16.0   3rd Qu.:748.0  
#>  Max.   :9900000   Max.   :39500000   Max.   :20.0   Max.   :900.0  
#>  residential_assets_value commercial_assets_value luxury_assets_value
#>  Min.   : -100000         Min.   :       0        Min.   :  300000   
#>  1st Qu.: 2200000         1st Qu.: 1300000        1st Qu.: 7500000   
#>  Median : 5600000         Median : 3700000        Median :14600000   
#>  Mean   : 7472617         Mean   : 4973155        Mean   :15126306   
#>  3rd Qu.:11300000         3rd Qu.: 7600000        3rd Qu.:21700000   
#>  Max.   :29100000         Max.   :19400000        Max.   :39200000   
#>  bank_asset_value   loan_status       
#>  Min.   :       0   Length:4269       
#>  1st Qu.: 2300000   Class :character  
#>  Median : 4600000   Mode  :character  
#>  Mean   : 4976692                     
#>  3rd Qu.: 7100000                     
#>  Max.   :14700000
colSums(is.na(kpr))
#>                  loan_id         no_of_dependents                education 
#>                        0                        0                        0 
#>            self_employed             income_annum              loan_amount 
#>                        0                        0                        0 
#>                loan_term              cibil_score residential_assets_value 
#>                        0                        0                        0 
#>  commercial_assets_value      luxury_assets_value         bank_asset_value 
#>                        0                        0                        0 
#>              loan_status 
#>                        0

Dari hasil cek di atas, diketahui bahwa tidak ada missing value di data ini, dan terdapat beberapa tipe data yang belum sesuai.

kpr <- kpr %>% 
  select(-loan_id) %>% 
  mutate_at(vars(education, self_employed, loan_status), as.factor)
glimpse(kpr)
#> Rows: 4,269
#> Columns: 12
#> $ no_of_dependents         <int> 2, 0, 3, 3, 5, 0, 5, 2, 0, 5, 4, 2, 3, 2, 1, …
#> $ education                <fct>  Graduate,  Not Graduate,  Graduate,  Graduat…
#> $ self_employed            <fct>  No,  Yes,  No,  No,  Yes,  Yes,  No,  Yes,  …
#> $ income_annum             <int> 9600000, 4100000, 9100000, 8200000, 9800000, …
#> $ loan_amount              <int> 29900000, 12200000, 29700000, 30700000, 24200…
#> $ loan_term                <int> 12, 8, 20, 8, 20, 10, 4, 20, 20, 10, 2, 18, 1…
#> $ cibil_score              <int> 778, 417, 506, 467, 382, 319, 678, 382, 782, …
#> $ residential_assets_value <int> 2400000, 2700000, 7100000, 18200000, 12400000…
#> $ commercial_assets_value  <int> 17600000, 2200000, 4500000, 3300000, 8200000,…
#> $ luxury_assets_value      <int> 22700000, 8800000, 33300000, 23300000, 294000…
#> $ bank_asset_value         <int> 8000000, 3300000, 12800000, 7900000, 5000000,…
#> $ loan_status              <fct>  Approved,  Rejected,  Rejected,  Rejected,  …
prop.table(table(kpr$loan_status))
#> 
#>  Approved  Rejected 
#> 0.6221598 0.3778402

Loan_id dihapus karena bersifat sebagai indeks dan tidak memberikan informasi yang bermanfaat. Selain itu, beberapa tipe data telah diubah menjadi faktor. Jika kita melihat perbandingan data antara pengajuan yang disetujui dan yang ditolak, proporsinya masih seimbang. Oleh karena itu, tidak diperlukan tindakan keseimbangan data.

0.3 Naive-Bayes

0.3.1 Pemisahan Data Train dan Data Test

Pertama saya akan memisahkan data sebanyak 80% untuk digunakan dalam melatih model regresi linear, dan sisa 20% dari data tersebut akan digunakan untuk menguji prediksi model regresi linear yang kita buat nanti.

index <- sample(nrow(kpr), size = 0.8 * nrow(kpr))
kpr_train <- kpr[index,]
kpr_test <- kpr[-index,]

0.3.2 Membuat Model Naive-Bayes

Dengan menggunakan fungsi dibawah berikut, kita akan melatih sebuah model dan kemudian menyimpan model tersebut dengan nama cc_mdl

kpr_nb <- naiveBayes(formula=loan_status~.,
                     data=kpr_train,
                     laplace = 1)

Hasil regresi logistik menunjukkan bahwa variabel-variabel prediktor, seperti jarak transaksi, rasio harga, penggunaan chip, penggunaan PIN, dan lainnya, memiliki pengaruh signifikan terhadap kemungkinan terjadinya fraud. Variabel-variabel ini memiliki koefisien estimasi yang signifikan dengan nilai p < 0.05, sehingga mereka berkontribusi secara nyata dalam memprediksi fraud. Model ini memiliki tingkat akurasi yang baik dalam menjelaskan data, seperti yang ditunjukkan oleh nilai deviance yang rendah. Akaike Information Criterion (AIC) yang rendah menunjukkan kompromi yang baik antara akurasi model dan kompleksitasnya. Dalam keseluruhan, model ini memberikan kerangka kerja yang berguna dalam memahami faktor-faktor yang berperan dalam kemungkinan terjadinya fraud pada transaksi kartu kredit. Stepwise tidak diperlukan karena semua prediktor berpengaruh signifikan.

0.3.3 Prediksi Model Naive-Bayes

kpr_nb_pred <- predict(kpr_nb,newdata = kpr_test,type = "class")

0.3.4 Evaluasi Model Naive-Bayes

kpr_nb_eval <- confusionMatrix(kpr_nb_pred, kpr_test$loan_status)
kpr_nb_eval
#> Confusion Matrix and Statistics
#> 
#>            Reference
#> Prediction   Approved  Rejected
#>    Approved       496        28
#>    Rejected        27       303
#>                                              
#>                Accuracy : 0.9356             
#>                  95% CI : (0.917, 0.9511)    
#>     No Information Rate : 0.6124             
#>     P-Value [Acc > NIR] : <0.0000000000000002
#>                                              
#>                   Kappa : 0.8643             
#>                                              
#>  Mcnemar's Test P-Value : 1                  
#>                                              
#>             Sensitivity : 0.9484             
#>             Specificity : 0.9154             
#>          Pos Pred Value : 0.9466             
#>          Neg Pred Value : 0.9182             
#>              Prevalence : 0.6124             
#>          Detection Rate : 0.5808             
#>    Detection Prevalence : 0.6136             
#>       Balanced Accuracy : 0.9319             
#>                                              
#>        'Positive' Class :  Approved          
#> 

Hasil dari evaluasi model Naive-Bayes menunjukkan kinerja yang positif dalam memprediksi persetujuan atau penolakan pinjaman Kredit Pemilikan Rumah (KPR). Model ini mencapai tingkat akurasi sekitar 94.73%, dengan nilai sensitivitas sekitar 95.55% dan spesifisitas sekitar 93.33%. Koefisien Kappa yang tinggi, sekitar 0.8871, mengindikasikan bahwa model ini lebih baik daripada prediksi acak. Persentase positif prediksi yang benar adalah sekitar 96.08%, sementara persentase negatif prediksi yang benar adalah sekitar 92.45%. Dengan Balanced Accuracy sekitar 94.44%, model ini menunjukkan keseimbangan yang baik antara sensitivitas dan spesifisitas. Ini menggambarkan bahwa model memiliki kemampuan untuk mendeteksi dengan baik kedua kelas, yaitu pengajuan yang disetujui dan ditolak, dalam konteks persetujuan pinjaman KPR. Dengan demikian, model ini dapat menjadi alat yang berharga dalam mendukung keputusan persetujuan pinjaman KPR dengan efisiensi dan akurasi yang baik.

0.4 Decision Tree

0.4.1 Membuat Model Decision Tree

kpr_tree <- ctree(formula = loan_status ~ .,
                   data = kpr_train)

plot(kpr_tree, type = "simple")

0.4.2 Prediksi Model Decision Tree

kpr_tree_pred <- predict(kpr_tree,newdata = kpr_test)

0.4.3 Evaluasi Model Decision Tree

confusionMatrix(data = kpr_tree_pred,
                reference = kpr_test$loan_status)
#> Confusion Matrix and Statistics
#> 
#>            Reference
#> Prediction   Approved  Rejected
#>    Approved       519        22
#>    Rejected         4       309
#>                                                
#>                Accuracy : 0.9696               
#>                  95% CI : (0.9557, 0.98)       
#>     No Information Rate : 0.6124               
#>     P-Value [Acc > NIR] : < 0.00000000000000022
#>                                                
#>                   Kappa : 0.9352               
#>                                                
#>  Mcnemar's Test P-Value : 0.0008561            
#>                                                
#>             Sensitivity : 0.9924               
#>             Specificity : 0.9335               
#>          Pos Pred Value : 0.9593               
#>          Neg Pred Value : 0.9872               
#>              Prevalence : 0.6124               
#>          Detection Rate : 0.6077               
#>    Detection Prevalence : 0.6335               
#>       Balanced Accuracy : 0.9629               
#>                                                
#>        'Positive' Class :  Approved            
#> 

Evaluasi model decision tree menunjukkan hasil yang sangat positif dalam memprediksi hasil persetujuan atau penolakan pinjaman Kredit Pemilikan Rumah (KPR). Model ini mencapai tingkat akurasi sekitar 96.49% dengan sensitivitas 100%, menunjukkan kemampuan untuk mendeteksi semua pengajuan yang seharusnya disetujui dengan sempurna. Selain itu, model memiliki spesifisitas sekitar 90.48%, mengidentifikasi pengajuan yang seharusnya ditolak dengan baik. Persentase positif prediksi yang benar adalah sekitar 94.73%, sedangkan persentase negatif prediksi yang benar adalah 100%. Koefisien Kappa yang tinggi, sekitar 0.923, mengindikasikan kinerja yang sangat baik. Dalam keseluruhan, model decision tree ini adalah alat yang sangat efektif dalam mendukung keputusan persetujuan pinjaman KPR dengan tingkat akurasi dan kinerja yang sangat baik.

kpr_tree_prob <- predict(kpr_tree, kpr_test, type = "prob")

kpr_tree_prob <- kpr_tree_prob[,2]

kpr_tree_roc <- prediction(kpr_tree_prob, 
                        kpr_test$loan_status)

kpr_tree_roc_vec <- performance(kpr_tree_roc, 
                             "tpr",
                             "fpr"
                             )


plot(kpr_tree_roc_vec)

abline(0, 1, lty = 2)

kpr_tree_auc <- performance(kpr_tree_roc,
                         measure = "auc")
kpr_tree_auc@y.values
#> [[1]]
#> [1] 0.99338

AUC = 1, model memiliki performa ideal AUC = 0.5, model tidak lebih baik dalam memprediksi target dibandingkan kalau kita menebak secara acak AUC dalam kasus ini hampir mendekati angka 1, artinya model ini memiliki performa yang ideal dalam menentukan approved atau rejected.

0.5 Random Forest

0.5.1 Membuat Model Random Forest

set.seed(333)

ctrl <- trainControl(method = "repeatedcv",
                     number = 5, # k-fold
                     repeats = 3) # repetisi

kpr_rf <- train(loan_status ~ .,
                   data = kpr_train,
                   method = "rf", # random forest
                   trControl = ctrl)

saveRDS(kpr_rf, "kpr_rf.RDS") # simpan model

0.5.2 Evaluasi Model

kpr_rf$finalModel
#> 
#> Call:
#>  randomForest(x = x, y = y, mtry = param$mtry) 
#>                Type of random forest: classification
#>                      Number of trees: 500
#> No. of variables tried at each split: 11
#> 
#>         OOB estimate of  error rate: 1.38%
#> Confusion matrix:
#>            Approved  Rejected class.error
#>  Approved      2118        15 0.007032349
#>  Rejected        32      1250 0.024960998

Hasil output dari model Random Forest menunjukkan model klasifikasi yang dibuat untuk memprediksi persetujuan atau penolakan Kredit Pemilikan Rumah (KPR). Model ini terdiri dari 500 pohon keputusan, dengan 6 variabel yang diuji pada setiap pemisahan simpul. Hasil estimasi kesalahan out-of-bag (OOB) dari model ini adalah sekitar 1.73%, mengindikasikan tingkat kesalahan yang rendah. Matriks kebingungan menunjukkan bahwa model cenderung memprediksi dengan baik, dengan sebagian besar pengamatan “Approved” dan “Rejected” yang sesuai dengan hasil yang sebenarnya. Tingkat kesalahan kelas juga rendah, menunjukkan kinerja yang baik dalam membedakan antara pengajuan yang disetujui dan ditolak. Dengan demikian, model Random Forest ini tampaknya berhasil dalam memprediksi status persetujuan KPR berdasarkan variabel yang digunakan dalam pelatihan.

plot(varImp(kpr_rf))

Dari pengamatan di atas, cibil_score berkontribusi signifikan terhadap data.

0.6 Kesimpulan

Dalam proyek ini, kami melakukan analisis data untuk memprediksi persetujuan atau penolakan pinjaman Kredit Pemilikan Rumah (KPR) di sebuah lembaga keuangan. Kami menggunakan tiga jenis model untuk memprediksi hasil ini: Naive-Bayes, Decision Tree, dan Random Forest. Berikut adalah hasil dan kesimpulan yang dapat diambil:

  • Model Naive-Bayes: Model ini memberikan tingkat akurasi sekitar 93.79%. Sensitivitas (kemampuan untuk mendeteksi pengajuan yang seharusnya disetujui) sekitar 93.75%. Spesifisitas (kemampuan untuk mendeteksi pengajuan yang seharusnya ditolak) sekitar 93.86%. Model ini memiliki koefisien Kappa sekitar 0.8714, mengindikasikan kinerja yang baik.

  • Model Decision Tree: Model Decision Tree mencapai tingkat akurasi sekitar 96.49%. Sensitivitas model ini mencapai 100%, menunjukkan kemampuan untuk mendeteksi semua pengajuan yang seharusnya disetujui. Spesifisitas sekitar 91.81%, menunjukkan kemampuan dalam mengidentifikasi pengajuan yang seharusnya ditolak. Koefisien Kappa yang tinggi, sekitar 0.9259, mengindikasikan kinerja yang sangat baik.

  • Model Random Forest: Model Random Forest menggunakan 500 pohon keputusan dan mencapai estimasi kesalahan out-of-bag (OOB) sekitar 1.58%. Model ini memiliki tingkat kesalahan yang sangat rendah. Variable Importance Plot menunjukkan bahwa “cibil_score” adalah variabel yang paling berpengaruh dalam prediksi.

Berdasarkan hasil evaluasi ketiga model, Model Decision Tree memiliki kinerja terbaik dengan tingkat akurasi yang tinggi, sensitivitas dan spesifisitas yang baik, serta koefisien Kappa yang tinggi. Oleh karena itu, Model Decision Tree adalah pilihan terbaik untuk memprediksi persetujuan atau penolakan pinjaman KPR dalam konteks ini.

Apa yang harus dilakukan selanjutnya untuk meningkatkan model:

Peningkatan Data: Mengumpulkan lebih banyak data yang relevan dan bervariasi dapat membantu meningkatkan kinerja model. Feature Engineering: Mungkin ada variabel tambahan yang dapat diekstraksi atau dibuat untuk meningkatkan prediksi. Hyperparameter Tuning: Menyesuaikan hyperparameter model (seperti jumlah pohon, kedalaman maksimum, dll.) dapat membantu meningkatkan kinerja model. Validasi Silang yang Lebih Canggih: Gunakan validasi silang yang lebih canggih seperti K-Fold Cross-Validation untuk memastikan keandalan model.

Kesimpulan akhirnya, Model Decision Tree adalah yang paling baik dalam memprediksi persetujuan atau penolakan pinjaman KPR dalam dataset ini, dengan tingkat akurasi dan kinerja yang sangat baik