Credit Risk

Credit risk adalah resiko yang harus ditanggung oleh seorang individu atau lembaga ketika memberikan pinjaman (biasanya dalam bentuk uang) ke individu atau pihak lain. Resiko ini berupa tidak bisa dibayarkannya pokok dan bunga pinjaman, sehingga mengakibatkan kerugian berikut :

  • Gangguan aliran kas (cash flow) sehingga modal kerja terganggu.

  • Meningkatkan biaya operasional untuk mengejar pembayaran tersebut (collection).

Untuk memperkecil resiko kredit ini, biasanya dilakukan proses yang disebut dengan credit scoring dan credit rating terhadap pihak peminjam. Output proses ini akan menjadi basis untuk menentukan apakah aplikasi pengajuan pinjaman baru diterima atau ditolak.

Algoritma C5.0

C5.0 adalah algoritma klasifikasi yang digunakan untuk membuat model prediksi dengan data bertipe kategorik dan numerik. Algoritma ini diciptakan oleh Ross Quinlan dan merupakan pengembangan dari algoritma sebelumnya yaitu C4.5. C5.0 sendiri merupakan salah satu algoritma yang menggunakan teknik pembelajaran “Decision tree” untuk membuat keputusan dan model prediksi.

C5.0 menggunakan teknik pemotongan (pruning) untuk menghindari overfitting pada data. Pruning adalah proses untuk menghapus pohon keputusan yang tidak penting atau tidak signifikan dari model. Ini membuat model lebih sederhana dan mudah dipahami, serta meningkatkan akurasi prediksi.

Import Library

Pertama-tama, import library yang akan kita gunakan.

library(readxl)    #untuk membaca data excel
library(tidyverse) #untuk manipulasi data
library(C50)       #untuk menggunakan algoritma C5.0
library(reshape2)  #untuk menggunakan fungsi prediksi dcast()

Jika belum tersedia pada environtmen R Anda, silahkan download terlebih dahulu dengan syntax berikut (pastikan terkoneksi dengan internet).

install.packages("readxl")
install.packages("tidyverse")
install.packages(C50)
install.packages("reshape2")

Import Dataset

Dataset yang digunakan adalah data profil calon nasabah pinjaman yang bersumber dari website dqlab.id. Silahkan download dataset pada link berikut https://github.com/ilhamster19/Training-Datasets/raw/main/Credit%20Score-dqlab.xlsx . Selanjutnya, import dataset sesuai dengan direktori tempat menyimpan fille. Simpan data pada variabel ‘datakredit’ dan gunakan struktur data tibble agar lebih mudah melihat tipe data per kolom. Anda juga bisa menggunakan syntax View() untuk melihat dataset secara keseluruhan.

#Import dataset
datakredit = read_excel(
  "DATA SCIENCE/Portofolio/Credit Risk Analysys/Credit Score.xlsx") %>%
  as.tibble

datakredit
View(datakredit)
## # A tibble: 900 × 7
##    kode_kontrak pendapatan_setahun_juta kpr_ak…¹ duras…² jumla…³ rata_…⁴ risk_…⁵
##    <chr>                          <dbl> <chr>      <dbl>   <dbl> <chr>     <dbl>
##  1 AGR-000001                       295 YA            48       5 61 - 9…       4
##  2 AGR-000011                       271 YA            36       5 61 - 9…       4
##  3 AGR-000030                       159 TIDAK         12       0 0 - 30…       1
##  4 AGR-000043                       210 YA            12       3 46 - 6…       3
##  5 AGR-000049                       165 TIDAK         36       0 31 - 4…       2
##  6 AGR-000063                       220 TIDAK         24       5 0 - 30…       1
##  7 AGR-000068                        70 TIDAK         36       3 31 - 4…       2
##  8 AGR-000075                        88 TIDAK         48       3 31 - 4…       2
##  9 AGR-000081                       163 TIDAK         48       5 31 - 4…       2
## 10 AGR-000094                       100 TIDAK         36       6 31 - 4…       2
## # … with 890 more rows, and abbreviated variable names ¹​kpr_aktif,
## #   ²​durasi_pinjaman_bulan, ³​jumlah_tanggungan, ⁴​rata_rata_overdue,
## #   ⁵​risk_rating

Dapat dilihat bahwa dataset memiliki dimensi 900 x 7 (900 baris dan 7 kolom) yang artinya terdapat 900 observasi dan 7 atribut.

Mempersiapkan Class dan Input Variable

Class variable adalah variabel yang akan diprediksi sedangkan Input variable adalah variabel yang akan digunakan untuk memprediksi. Pada artikel ini class yang digunakan adalah risk_rating dengan input jumlah_tanggungan dan durasi_pinjaman_bulan dengan keterangan sebagai berikut :

  • risk_rating : Credit Score untuk calon nasabah.

  • jumlah_tanggungan : Jumlah anggota keluarga yang menjadi tanggungan calon nasabah.

  • durasi_pinjaman_bulan : Durasi pinjaman oleh calon nasabah dalan hitungan bulan.

Untuk class variable akan diubah menjadi tipe factor sebagai salah satu syarat melakukan pemodelan dengan algoritma C5.0 di R.

class=datakredit$risk_rating %>% as.factor
input=datakredit%>%select(jumlah_tanggungan,durasi_pinjaman_bulan)

str(class)
##  Factor w/ 5 levels "1","2","3","4",..: 4 4 1 3 2 1 2 2 2 2 ...
str(input)
## tibble [900 × 2] (S3: tbl_df/tbl/data.frame)
##  $ jumlah_tanggungan    : num [1:900] 5 5 0 3 0 5 3 3 5 6 ...
##  $ durasi_pinjaman_bulan: num [1:900] 48 36 12 12 36 24 36 48 48 36 ...

Menyiapkan Data Training dan Data Testing

Pada pemodelan machine learning, dataset akan dibagi menjadi 2. Sebagian digunakan untuk training dan sisanya untuk testing. Pada artikel ini akan digunakan metode 80 : 20, artinya 80% data diambil secara acak untuk training dan 20% sisanya untuk testing.

Membuat Indeks Pengacakan

Langkah pertama adalah menyiapkan indeks pengacakan. Hasil perintah sample() akan berbeda pada setiap komputer atau setiap kali dijalankan kembali. Jika Anda ingin berlatih dan menyeragamkan hasil acakan dengan artikel ini, Anda bisa menggunakan syntax set.seed().

set.seed(100) #untuk menyeragamkan hasil random antar komputer
indeks_training = sample(900, 720) #ambil 720 sampel acak yg terdiri dari angka 1-900

indeks_testing = c(1:900)
indeks_testing = indeks_testing[-indeks_training]

Untuk memastikan hasil acakan telah valid, gunakan operator %in%. Jika hanya ada elemen FALSE, artinya indeks_training dan indeks_testing tidak memiliki elemen yang sama.

indeks_testing %in% indeks_training %>% unique
## [1] FALSE

Membuat Data Training

Data training digunakan untuk melatih model machine learning. Data training akan diambil dari datakredit dengan indeks indeks_training yang sudah dibuat sebelumnya.

input_training = input[indeks_training,]
input_training

class_training = class[indeks_training]
class_training

Membuat Data Testing

input_testing = input[indeks_testing,]
input_testing

class_testing = class[indeks_testing]
class_testing

Membuat dan Menginterpretasikan Model

Menampilkan Model

model <- C5.0(input_training, class_training,
              control = C5.0Control(label="Risk Rating"))
summary(model)
## 
## Call:
## C5.0.default(x = input_training, y = class_training, control
##  = C5.0Control(label = "Risk Rating"))
## 
## 
## C5.0 [Release 2.07 GPL Edition]      Wed Jan 18 23:37:34 2023
## -------------------------------
## 
## Class specified by attribute `Risk Rating'
## 
## Read 720 cases (3 attributes) from undefined.data
## 
## Decision tree:
## 
## jumlah_tanggungan > 4:
## :...durasi_pinjaman_bulan <= 24: 4 (95/26)
## :   durasi_pinjaman_bulan > 24: 5 (107/45)
## jumlah_tanggungan <= 4:
## :...jumlah_tanggungan > 2: 3 (198/18)
##     jumlah_tanggungan <= 2:
##     :...durasi_pinjaman_bulan <= 36: 1 (237/73)
##         durasi_pinjaman_bulan > 36:
##         :...jumlah_tanggungan <= 0: 2 (33/7)
##             jumlah_tanggungan > 0: 3 (50/4)
## 
## 
## Evaluation on training data (720 cases):
## 
##      Decision Tree   
##    ----------------  
##    Size      Errors  
## 
##       6  173(24.0%)   <<
## 
## 
##     (a)   (b)   (c)   (d)   (e)    <-classified as
##    ----  ----  ----  ----  ----
##     164     2     5     5     5    (a): class 1
##      73    26    17     5     9    (b): class 2
##             3   226                (c): class 3
##             2          69    31    (d): class 4
##                        16    62    (e): class 5
## 
## 
##  Attribute usage:
## 
##  100.00% jumlah_tanggungan
##   72.50% durasi_pinjaman_bulan
## 
## 
## Time: 0.0 secs

Interpretasi Model

Bagian ini menjelaskan Decision Tree dalam bentuk teks. Penjelasan setiap bagiannya sebagai berikut :

  • Warna Biru : Node dan Split Kondisinya

  • Warna Merah : Leaf Node atau hasil klasifikasi

  • Warna Ungu : Statistik klasifikasi berbanding kesalahan. Sebagai contoh pada bagian : 4 (95/26) artinya ada 95 data yang diklasifikasikan sebagai class 4 dan 26 data diantaranya salah klasifikasi.

    Pada bagian ini menjelaskan bahwa decision tree yang dihasilkan memiliki 6 leaf node dan menghasilkan 173 prediksi salah (Error sebesar 24%). Artinya, secara umum model yang telah dibuat menghasilkan akurasi 76%.

Pada Bagian ini menjelaskan confusion matrix. Heading kolom menyatakan prediksi model dan heading baris menyatakan class sebenarnya. Sebagai contoh :

  • Pada indeks matriks [1,1] nilainya 164, artinya ada 164 class 1 sebenarnya yang diklasifikasikan model sebagai class 1.

  • Pada indeks matriks [1,2] nilainya 2, artinya ada 2 class 1 sebenarnya yang diklasifikasikan model sebagai class 2.

  • Pada indeks matriks [2,1] nilainya 73, artinya ada 73 class 2 sebenarnya yang diklasifikasikan model sebagai class 1.

  • Pada indeks matriks [2,2] nilainya 26, artinya ada 26 class 2 sebenarnya yang diklasifikasikan model sebagai class 2.

  • Dst.

Pada bagian ini menjelaskan bahwa atribut jumlah_tabungan digunakan sebanyak 100% dan atribut durasi_pinjaman_bulan digunakan sebanyak 72.5% untuk menyusun model.

Plot Model Decision Tree

Untuk melihat Desicison Tree lebih jelas, gunakan syntax plot().

plot(model)

Menguji Model dengan Data Testing

Setelah mendapatkan model, kita akan menguji model dengan data testing yang sudah dibuat sebelumnya. Model akan digunakan untuk memprediksi class dari data testing, dimana hasil prediksi akan dibandingkan dengan class sebenarnya.

Hasil Prediksi vs Data Testing

hasil_prediksi=predict(model, input_testing)
compare=data.frame(input_testing,risk_rating=class_testing,hasil_prediksi,
                   keterangan=(class_testing==hasil_prediksi))%>%as.tibble
compare  
## # A tibble: 180 × 5
##    jumlah_tanggungan durasi_pinjaman_bulan risk_rating hasil_prediksi keterangan
##                <dbl>                 <dbl> <fct>       <fct>          <lgl>     
##  1                 0                    12 1           1              TRUE      
##  2                 0                    36 2           1              FALSE     
##  3                 3                    48 2           3              FALSE     
##  4                 0                    48 2           2              TRUE      
##  5                 3                    12 2           3              FALSE     
##  6                 6                    24 2           4              FALSE     
##  7                 1                    36 2           1              FALSE     
##  8                 3                    36 2           3              FALSE     
##  9                 6                    48 2           5              FALSE     
## 10                 3                    48 2           3              FALSE     
## # … with 170 more rows
summary(compare$keterangan)
##    Mode   FALSE    TRUE 
## logical      32     148

Pada tabel di atas dapat dilihat bahwa model menghasilkan 148 prediksi benar dan 32 prediksi salah. Artinya, akurasi model mencapai 82% dalam memprediksi data testing.

Confusion Matrix

Berikut hasil confusion matrix pengujian model dengan data testing.

dcast(hasil_prediksi ~ class_testing, data=compare)
## Using keterangan as value column: use value.var to override.
## Aggregation function missing: defaulting to length
##   hasil_prediksi  1  2  3  4  5
## 1              1 44 13  0  0  0
## 2              2  0  7  1  0  0
## 3              3  0  4 61  0  0
## 4              4  1  1  0 13  2
## 5              5  1  4  0  5 23

Kesimpulan

Hasil pemodelan jumlah tanggungan dan durasi pinjaman terhadap risk rating dengan menggunakan 100% atribut jumlah tanggungan dan 72,5% atribut durasi pinjaman menghasilkan akurasi sebesar 76%, sehingga cukup layak digunakan untuk memprediksi risk rating dari calon nasabah.



Kunjungi saya :