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.
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.
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")
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.
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 ...
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.
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
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
input_testing = input[indeks_testing,]
input_testing
class_testing = class[indeks_testing]
class_testing
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
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.
Untuk melihat Desicison Tree lebih jelas, gunakan syntax
plot().
plot(model)
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=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.
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
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 :
Youtube : Ilham Darussalam
Github : ilhamster19
E-mail : ilham.rush19@gmail.com