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.
Credit score adalah nilai resiko yang diberikan kepada seorang individu atau organisasi yang mengajukan pinjaman berdasarkan rekam jejak pinjaman dan pembayaran yang dilakukan. Proses pemberian credit score ini biasanya disebut sebagai credit scoring.
Perhitungan credit score biasanya dibuat berdasarkan data historis lamanya keterlambatan pembayaran dan yang tidak bayar sama sekali (bad debt). Bad debt biasanya mengakibatkan lembaga pemberian kredit harus menyita aset atau melakukan write off . Nilai credit score biasanya bervariasi antar lembaga. Namun banyak yang kemudian mengadopsi model FICO Score yang memiliki rentang nilai 300 - 850. Semakin tinggi nilai yang didapatkan, maka semakin baik tingkat kemampuan seseorang atau sebuah lembaga untuk membayar pinjaman.
Terbalik dengan credit score, semakin tinggi rating ini menunjukkan resiko yang semakin meningkat.
Berikut adalah contoh data risk rating yang dihasilkan berdasarkan data historis lamanya proses pengembalian pinjaman. Perhatikan kolom risk_rating dimana terdapat angka 1 sampai dengan 5, yang menunjukkan resiko terendah sampai tertinggi.
library(openxlsx)
## Warning: package 'openxlsx' was built under R version 4.2.2
data<-read.xlsx("D:/LOOKER DAN R/modul R/data/credit_scoring.xlsx")
head(data)
## kode_kontrak pendapatan_setahun_juta kpr_aktif durasi_pinjaman_bulan
## 1 AGR-000001 295 YA 48
## 2 AGR-000011 271 YA 36
## 3 AGR-000030 159 TIDAK 12
## 4 AGR-000043 210 YA 12
## 5 AGR-000049 165 TIDAK 36
## 6 AGR-000063 220 TIDAK 24
## jumlah_tanggungan rata_rata_overdue risk_rating
## 1 5 61 - 90 days 4
## 2 5 61 - 90 days 4
## 3 0 0 - 30 days 1
## 4 3 46 - 60 days 3
## 5 0 31 - 45 days 2
## 6 5 0 - 30 days 1
Kolom risk_rating ini berelasi langsung dengan kolom
overdue_average, atau kolom keterlambatan pembayaran.
Beberapa kolom lainnya, yaitu:
pendapatan dalam jutaan per tahun (pendapatan_setahun_juta).
durasi pinjaman dalam satuan bulan (durasi_pinjaman_bulan).
jumlah tanggungan (jumlah_tanggungan).
apakah ada kpr aktif atau tidak (kpr_aktif).
Seorang analis akan melakukan penelusuran terhadap data kita untuk mencari pola. Berikut adalah temuannya:
Dari kedua temuan ini, analis akan membentuk aturan-aturan untuk menuntun pengambilan keputusan (decision making model) terhadap pengajuan pinjaman baru sebagai berikut: - Jika jumlah tanggungan berjumlah kurang dari 5 orang , dan durasi pinjaman kurang dari 24 bulan maka rating diberikan nilai 2 dan pengajuan pinjaman diterima. - Jika jumlah tanggungan berjumlah lebih dari 4 orang dan durasi pinjaman lebih dari 24 bulan maka maka rating diberikan nilai 5 dan pengajuan pinjaman ditolak. - Jika jumlah tanggungan berjumlah kurang dari 5, dan durasi pinjaman kurang dari 36 bulan maka maka rating diberikan nilai 3 dan diberikan pinjaman.
Tiga aturan itu kita sebut sebagai model untuk memprediksi nilai risk rating dan menjadi basis pengambilan keputusan terhadap aplikasi pinjaman baru.
Dengan model ini, lembaga pinjaman akan semakin cepat mengambil keputusan dan dengan tingkat kesalahan pengambilan keputusan yang lebih minim.
Selanjutnya, kita akan melihat bagaimana model penilaian ini distrukturkan dalam bentuk Decision Tree.
Tujuan pembentukan model adalah untuk memprediksi nilai pada kolom
risk rating berdasarkan data-data lain yang menyertai.
Dengan demikian, risk rating disebut sebagai class
variable. Kolom-kolom lainnya disebut sebagai input
variables. Input variables bisa digunakan sebagian saja, namun
class variable harus selalu digunakan untuk membentuk model.
Pada algoritma C5.0 di R, class variable harus selalu berupa factor.
#Membaca dataset
library(openxlsx)
dataCreditRating<-read.xlsx("D:/LOOKER DAN R/modul R/data/credit_scoring.xlsx")
str(dataCreditRating)
## 'data.frame': 900 obs. of 7 variables:
## $ kode_kontrak : chr "AGR-000001" "AGR-000011" "AGR-000030" "AGR-000043" ...
## $ pendapatan_setahun_juta: num 295 271 159 210 165 220 70 88 163 100 ...
## $ kpr_aktif : chr "YA" "YA" "TIDAK" "YA" ...
## $ durasi_pinjaman_bulan : num 48 36 12 12 36 24 36 48 48 36 ...
## $ jumlah_tanggungan : num 5 5 0 3 0 5 3 3 5 6 ...
## $ rata_rata_overdue : chr "61 - 90 days" "61 - 90 days" "0 - 30 days" "46 - 60 days" ...
## $ risk_rating : num 4 4 1 3 2 1 2 2 2 2 ...
Untuk class variable risk_rating ternyata masih dibaca
dalam bentuk numerik. Untuk menjadi class variable yang digunakan pada
algoritma C5.0, maka perlu dikonversi menjadi factor.
dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)
str(dataCreditRating)
## 'data.frame': 900 obs. of 7 variables:
## $ kode_kontrak : chr "AGR-000001" "AGR-000011" "AGR-000030" "AGR-000043" ...
## $ pendapatan_setahun_juta: num 295 271 159 210 165 220 70 88 163 100 ...
## $ kpr_aktif : chr "YA" "YA" "TIDAK" "YA" ...
## $ durasi_pinjaman_bulan : num 48 36 12 12 36 24 36 48 48 36 ...
## $ jumlah_tanggungan : num 5 5 0 3 0 5 3 3 5 6 ...
## $ rata_rata_overdue : chr "61 - 90 days" "61 - 90 days" "0 - 30 days" "46 - 60 days" ...
## $ risk_rating : Factor w/ 5 levels "1","2","3","4",..: 4 4 1 3 2 1 2 2 2 2 ...
Selanjutnya untuk data input variable yang akan
digunakan yaitu durasi_pinjaman_bulan dan
jumlah_tanggungan.
data.input_variable<-dataCreditRating[,c(4:5)]
str(data.input_variable)
## 'data.frame': 900 obs. of 2 variables:
## $ durasi_pinjaman_bulan: num 48 36 12 12 36 24 36 48 48 36 ...
## $ jumlah_tanggungan : num 5 5 0 3 0 5 3 3 5 6 ...
Untuk proses pembentukan model machine learning dan melihat akurasinya, biasanya dataset kita perlu dibagi menjadi dua, yaitu:
Data Training: adalah porsi dataset yang digunakan oleh algoritma untuk dianalisa dan menjadi input untuk pembentukan model. Data Testing: adalah porsi dataset yang tidak digunakan untuk membentuk model, tapi untuk menguji model yang telah dibentuk.Pembentukan kedua data ini biasanya menggunakan metode pemilihan acak.
Langkah pertama adalah menyusun index untuk data training:
set.seed(100)
indeks_training<- sample(900, 800)
#atau
#indeks_training<- sample(nrow(dataCreditRating), nrow(dataCreditRating)*0.9)
set.seed() digunakan sebagai perintah untuk
menyeragamkan pengambilan bilangan acak di seluruh aplikasi R.
Langkah kedua adalah membuat variable untuk data training (input dan class variable) dan data testing (input variable saja) berdasarkan index di atas dengan perintah berikut.
input_training <- data.input_variable[indeks_training,]
class_training <- dataCreditRating[indeks_training,]$risk_rating
input_testing <- data.input_variable[-indeks_training,]
str(input_training)
## 'data.frame': 800 obs. of 2 variables:
## $ durasi_pinjaman_bulan: num 36 24 36 36 36 24 12 48 48 12 ...
## $ jumlah_tanggungan : num 1 1 5 1 5 3 3 3 0 0 ...
str(class_training)
## Factor w/ 5 levels "1","2","3","4",..: 1 1 4 1 5 3 3 3 2 1 ...
str(input_testing)
## 'data.frame': 100 obs. of 2 variables:
## $ durasi_pinjaman_bulan: num 12 36 48 36 48 48 12 12 12 12 ...
## $ jumlah_tanggungan : num 0 0 3 3 6 5 0 0 0 4 ...
Selanjutnya, menghasilkan model (dari data training) dengan fungsi
C5.0 di R pada package C50.
library(C50)
## Warning: package 'C50' was built under R version 4.2.2
risk_rating_model <- C5.0(input_training, class_training, control=C5.0Control(label="Risk Rating"))
summary(risk_rating_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 31 10:23:15 2024
## -------------------------------
##
## Class specified by attribute `Risk Rating'
##
## Read 800 cases (3 attributes) from undefined.data
##
## Decision tree:
##
## jumlah_tanggungan > 4:
## :...durasi_pinjaman_bulan <= 24: 4 (105/30)
## : durasi_pinjaman_bulan > 24: 5 (120/51)
## jumlah_tanggungan <= 4:
## :...jumlah_tanggungan > 2: 3 (216/20)
## jumlah_tanggungan <= 2:
## :...durasi_pinjaman_bulan <= 36: 1 (264/80)
## durasi_pinjaman_bulan > 36:
## :...jumlah_tanggungan <= 0: 2 (37/7)
## jumlah_tanggungan > 0: 3 (58/4)
##
##
## Evaluation on training data (800 cases):
##
## Decision Tree
## ----------------
## Size Errors
##
## 6 192(24.0%) <<
##
##
## (a) (b) (c) (d) (e) <-classified as
## ---- ---- ---- ---- ----
## 184 2 5 6 6 (a): class 1
## 80 30 19 6 11 (b): class 2
## 3 250 (c): class 3
## 2 75 34 (d): class 4
## 18 69 (e): class 5
##
##
## Attribute usage:
##
## 100.00% jumlah_tanggungan
## 73.00% durasi_pinjaman_bulan
##
##
## Time: 0.0 secs
plot(risk_rating_model)
Selanjutnya kita perlu evaluasi model ini terhadap data testing yang
telah kita siapkan. Package C50 memiliki fungsi bernama
predict, yang bisa digunakan untuk melakukan prediksi
berdasarkan input model dan data test.
predict(risk_rating_model, input_testing)
## [1] 1 1 3 3 5 5 1 1 1 3 1 2 1 1 3 3 1 3 3 3 3 3 1 5 1 1 3 1 3 5 1 1 2 1 5 1 1
## [38] 5 3 3 3 3 4 3 3 1 3 5 2 3 2 5 3 5 1 5 4 5 3 4 1 3 4 4 3 5 5 5 3 1 1 1 1 3
## [75] 5 1 4 5 3 1 3 3 3 3 3 1 3 3 5 4 5 3 3 3 1 1 5 5 3 3
## Levels: 1 2 3 4 5
Kemudian, kita akan menyimpan risk_rating dari dataset awal dan hasil
prediksi ini ke dalam dua kolom nama yang lain di data frame
input_testing. Mari kita namakan kolom tersebut dengan
risk_rating dan hasil_prediksi.
Kita gunakan perintah pertama untuk menyimpan nilai asli risk_rating ke dalam kolom risk_rating.
input_testing$risk_rating <- dataCreditRating[-indeks_training,]$risk_rating
Kemudian menyimpan nilai prediksi ke dalam kolom hasil_prediksi.
input_testing$hasil_prediksi <- predict(risk_rating_model, input_testing)
langkah berikutnya kita coba lihat distribusi mana yang terprediksi
dengan benar dan salah. Ini kita lakukan dengan confusion matrix. Untuk
menghasilkan ini kita bisa gunakan fungsi dcast dari
package reshape2.
library(reshape2)
## Warning: package 'reshape2' was built under R version 4.2.2
#dcast(kolom ~ baris, dataframe)
dcast(hasil_prediksi ~ risk_rating, data=input_testing)
## Using hasil_prediksi as value column: use value.var to override.
## Aggregation function missing: defaulting to length
## hasil_prediksi 1 2 3 4 5
## 1 1 24 6 0 0 0
## 2 2 0 3 1 0 0
## 3 3 0 2 37 0 0
## 4 4 0 0 0 7 0
## 5 5 0 2 0 2 16
Header kolom menunjukkan risk_rating hasil prediksi, sedangkan header baris menunjukkan data risk_rating sebenarnya.
Untuk menghitung persentase error, kita bisa menghitung terlebih
dahulu jumlah data dengan prediksi yang benar. Hasil dikatakan benar
jika data risk_rating sama dengan
hasil_prediksi. Disini kita gunakan operator
== untuk membandingkan.
input_testing$risk_rating==input_testing$hasil_prediksi
## [1] TRUE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE
## [13] TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE
## [25] TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [37] FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [49] TRUE TRUE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [61] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE
## [73] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [85] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE
## [97] TRUE TRUE TRUE TRUE
jumlah.pred_benar<-nrow(input_testing[input_testing$risk_rating==input_testing$hasil_prediksi,])
jumlah.pred_benar
## [1] 87
jumlah.pred_salah<-nrow(input_testing[input_testing$risk_rating!=input_testing$hasil_prediksi,])
jumlah.pred_salah
## [1] 13
persentase_error<-(jumlah.pred_salah/(jumlah.pred_benar+jumlah.pred_salah))*100
persentase_error
## [1] 13
Mempersiapkan Data Pengajuan Baru Data pengajuan baru perlu dibentuk sebagai satu data frame dengan input dimana nama-nama variable yang digunakan harus sama persis. Dari awal pemodelan, kita menggunakan dua variable yakni:
jumlah_tanggungandurasi_pinjaman_bulan
Keduanya dalam bentuk numerik (angka). Dan berikut adalah contoh
membentuk data frame dengan dua variable tersebut.aplikasi_baru <- data.frame(jumlah_tanggungan = 6, durasi_pinjaman_bulan = 12)
#Melakukan prediksi
predict(risk_rating_model, aplikasi_baru)
## [1] 4
## Levels: 1 2 3 4 5