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.
Kadang banyak lembaga yang menggunakan risk rating atau tingkat resiko. Terbalik dengan credit score, semakin tinggi rating ini menunjukkan resiko yang semakin meningkat. Selain itu kodifikasi juga dibuat lebih simpel dibandingkan rentang nilai sehingga keputusan yang bisa diambil lebih cepat. Contoh, misalkan penggunaan kombinasi seperti huruf AAA, AA+, P-1, dan seterusnya. Atau untuk banyak internal lembaga peminjam, kategorisasi hanya menggunakan rentang angka yang kecil misalkan 1 sampai dengan 5.
C5.0 adalah kode penamaan suatu algoritma untuk decision tree. Banyak algoritma lain seperti random forest, CART, CHAID, MARS, dan lain-lain. Namun C5.0 adalah algoritma yang sangat populer karena memiliki performa yang sangat baik dari sisi kecepatan maupun akurasi. Algoritma ini sering dikategorikan sebagai classification, dimana tujuannya adalah untuk mengkategorikan atau mengklasifikan sesuatu - pada contoh kita risk rating - berdasarkan input dari data-data lain.
kali ini DQLAB sudah menyediakan dataset yang akan digunkana untuk mempelajari bagaimana mengelelola data credit risk menggunakan algoritma C5.0
dari data tersebut kita telah mengetahui bahwa ada kolom yang perlu dikonversikan sebagai factor menggunakan fungsi as.factor
Tidak semua input variable yang perlu kita gunakan, apalagi yang sangat berkaitan sangat erat dengan risk_rating, yaitu rata_rata_overdue. Input variable ini akan kita buang. Proses ini disebut sebagai feature selection. Karena kita gunakan data frame sebagai tipe data input kita untuk C5.0, maka field-field yang ingin kita gunakan bisa kita kita masukkan sebagai vector sebagai filter. Berikut adalah perintah untuk membuat vector nama kolom yang kita butuhkan saat ini, yaitu durasi_pinjaman_bulan dan jumlah_tanggungan. Hasil filtering ini kita simpan ke variable baru bernama datafeed, dan perintah terakhir kita gunakan melihat struktur variable ini.
library("openxlsx")
#Mempersiapkan data
dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")
#Merubah tipe data class variable sebagai 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 ...
#Menghilangkan beberapa variable input dari dataset
input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")
datafeed <- dataCreditRating[ , input_columns ]
str(datafeed)
## '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: —Training set: adalah porsi dataset yang digunakan oleh algoritma untuk dianalisa dan menjadi input untuk pembentukan model. —Testing set: adalah porsi dataset yang tidak digunakan untuk membentuk model, tapi untuk menguji model yang telah dibentuk. Pembentukan ini biasanya menggunakan metode pemilihan acak. Untuk praktek selanjutnya, kita akan membagi dataset kita menjadi 800 baris data untuk training set dan 100 baris data untuk testing set.
kita akan menggunakan kode berikut untuk membagi data train dan test
library("openxlsx")
#Mempersiapkan data
dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")
#Mempersiapkan class dan input variables
dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)
input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")
datafeed <- dataCreditRating[ , input_columns ]
#Mempersiapkan porsi index acak untuk training dan testing set
set.seed(100)
indeks_training_set <- sample(900, 800)
#Membuat dan menampilkan training set dan testing set
input_training_set <- datafeed[indeks_training_set,]
class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating
input_testing_set <- datafeed[-indeks_training_set,]
str(input_training_set)
## '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_set)
## Factor w/ 5 levels "1","2","3","4",..: 1 1 4 1 5 3 3 3 2 1 ...
str(input_testing_set)
## '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 ...
Dengan persiapan sebelumnya, sekarang saatnya kita akan menggunakan algoritma C5.0 untuk menghasilkan model decision tree dengan menggunakan fungsi yang juga bernama C5.0. Function ini juga memerlukan package R yang bernama “C50”. untuk menjalankannya editor menggunakan syntax sebagai berikut
library("openxlsx")
library("C50")
## Warning: package 'C50' was built under R version 3.6.3
#Mempersiapkan data
dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")
#Mempersiapkan class dan input variables
dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)
input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")
datafeed <- dataCreditRating[ , input_columns ]
#Mempersiapkan training dan testing set
set.seed(100) #untuk menyeragamkan hasil random antar tiap komputer
indeks_training_set <- sample(900, 800)
#Membuat dan menampilkan training set dan testing set
input_training_set <- datafeed[indeks_training_set,]
class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating
input_testing_set <- datafeed[-indeks_training_set,]
#menghasilkan dan menampilkan summary model
risk_rating_model <- C5.0(input_training_set, class_training_set)
summary(risk_rating_model)
##
## Call:
## C5.0.default(x = input_training_set, y = class_training_set)
##
##
## C5.0 [Release 2.07 GPL Edition] Tue Oct 06 13:12:08 2020
## -------------------------------
##
## Class specified by attribute `outcome'
##
## 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
mari kita pahami bagaimana cara membaca outputdari alghoritma tersebut. Terlihat bahwa leaf node yang dihasilkan dari pinjaman dengan durasi sama dengan atau lebih kecil dari 24 bulan masuk kedalam klasifikasi 4, dan jika durasi pinjamannya lebih dari 24 makan masuk kedalam klasifikasi 5. Dari dataset training, alur ini mengklasifikasikan 98 data, namun 25 diantara 98 data ini salah klasifikasi.
Selain itu kita juga dapt melihat presentase kesalahan model dari output tersebut yang di tunjukan oleh bagian evaluation on training data. informasi yagn dapat adalah — 800 cases adalah jumlah baris data (case) yang diproses. — Size = 6 adalah jumlah leaf nodes (node ujung) dari decision tree. — Errors = 180(22.5%): 180 adalah jumlah record yang salah klasifikasi, dan 22.5% adalah rasio dari seluruh populasi.
diagram pada decision tree ini biasanya digunakna unutk melihat output agar lebih mudah untuk dipahami, fungsi yang digunkana juga biasanya cukup sederhana yaitu dengan “plot(model)”
Package C50 memiliki fungsi bernama predict, yang bisa digunakan untuk melakukan prediksi berdasarkan input model dan data test.
library("openxlsx")
library("C50")
#Mempersiapkan data
dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")
#Mempersiapkan class dan input variables
dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)
input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")
datafeed <- dataCreditRating[ , input_columns ]
#Mempersiapkan training dan testing set
set.seed(100) #untuk menyeragamkan hasil random antar tiap komputer
indeks_training_set <- sample(900, 800)
#Membuat dan menampilkan training set dan testing set
input_training_set <- datafeed[indeks_training_set,]
class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating
input_testing_set <- datafeed[-indeks_training_set,]
#menghasilkan model
risk_rating_model <- C5.0(input_training_set, class_training_set, control = C5.0Control(label="Risk Rating"))
#menggunakan model untuk prediksi testing set
predict(risk_rating_model, input_testing_set)
## [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
Terlihat hasil prediksi semua sesuai dengan posisi baris data dari testing set. Dan ini juga sesuai dengan rentang nilai risk_rating, yaitu 1 sampai dengan 5. maka yang selanjutnya adalah menggabungkan hasil prediksi dengan testing set
library("openxlsx")
library("C50")
#Mempersiapkan data
dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")
#Mempersiapkan class dan input variables
dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)
input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")
datafeed <- dataCreditRating[ , input_columns ]
#Mempersiapkan training dan testing set
set.seed(100) #untuk menyeragamkan hasil random antar tiap komputer
indeks_training_set <- sample(900, 800)
#Membuat dan menampilkan training set dan testing set
input_training_set <- datafeed[indeks_training_set,]
class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating
input_testing_set <- datafeed[-indeks_training_set,]
#menghasilkan model
risk_rating_model <- C5.0(input_training_set, class_training_set, control = C5.0Control(label="Risk Rating"))
#menyimpan hasil prediksi testing set ke dalam kolom hasil_prediksi
input_testing_set$risk_rating <- dataCreditRating[-indeks_training_set,]$risk_rating
input_testing_set$hasil_prediksi <- predict(risk_rating_model, input_testing_set)
print(input_testing_set)
## durasi_pinjaman_bulan jumlah_tanggungan risk_rating hasil_prediksi
## 3 12 0 1 1
## 5 36 0 2 1
## 8 48 3 2 3
## 40 36 3 2 3
## 41 48 6 2 5
## 44 48 5 2 5
## 58 12 0 1 1
## 70 12 0 1 1
## 109 12 0 1 1
## 110 12 4 3 3
## 122 12 0 1 1
## 151 48 0 2 2
## 179 36 1 1 1
## 180 36 1 2 1
## 182 24 4 3 3
## 195 48 3 3 3
## 200 24 0 1 1
## 217 12 4 3 3
## 230 48 2 3 3
## 231 12 3 3 3
## 234 24 3 3 3
## 236 24 4 3 3
## 238 24 0 1 1
## 245 36 5 4 5
## 252 24 0 1 1
## 253 24 0 1 1
## 260 48 1 3 3
## 265 36 0 2 1
## 275 12 3 3 3
## 279 36 6 5 5
## 285 36 1 1 1
## 295 24 0 1 1
## 317 48 0 2 2
## 343 24 0 1 1
## 350 48 6 5 5
## 352 12 1 1 1
## 356 36 2 2 1
## 369 48 6 5 5
## 373 48 3 3 3
## 375 48 2 3 3
## 384 24 3 3 3
## 388 36 3 3 3
## 399 24 6 4 4
## 419 48 3 3 3
## 433 24 4 3 3
## 437 36 1 1 1
## 446 24 3 3 3
## 455 48 5 5 5
## 493 48 0 2 2
## 496 12 3 3 3
## 501 48 0 3 2
## 521 48 5 4 5
## 524 48 2 3 3
## 527 36 5 5 5
## 534 36 1 1 1
## 536 48 6 5 5
## 544 12 5 4 4
## 548 48 6 5 5
## 561 12 3 3 3
## 565 12 6 4 4
## 574 24 1 1 1
## 577 48 2 3 3
## 587 12 6 4 4
## 594 12 6 4 4
## 612 24 4 3 3
## 616 48 6 5 5
## 621 36 5 5 5
## 632 48 6 5 5
## 641 36 4 3 3
## 645 12 2 2 1
## 657 12 2 1 1
## 675 12 2 1 1
## 687 12 2 1 1
## 697 36 4 3 3
## 704 48 6 5 5
## 707 12 2 1 1
## 716 12 5 4 4
## 721 36 5 5 5
## 729 48 1 3 3
## 737 12 2 1 1
## 743 36 3 3 3
## 748 48 1 3 3
## 749 36 4 3 3
## 786 48 1 3 3
## 799 12 3 3 3
## 801 24 2 1 1
## 806 24 4 3 3
## 814 36 3 3 3
## 825 36 6 5 5
## 831 24 6 4 4
## 861 48 5 5 5
## 863 12 3 3 3
## 869 48 3 3 3
## 870 48 3 3 3
## 872 24 2 1 1
## 880 36 1 2 1
## 888 48 5 5 5
## 890 48 5 5 5
## 893 48 3 3 3
## 897 48 2 3 3
Setelah hasil prediksi terhadap testing set selesai, langkah berikutnya kita coba lihat distribusi mana yang terprediksi dengan benar dan salah, confusion matrix ini berguna untuk mempermudah dalam melihat hasil dan akurasi mesin yang kita buat dalam mengidentifikasi suatu masalah
library("openxlsx")
library("C50")
library("reshape2")
#Mempersiapkan data
dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")
#Mempersiapkan class dan input variables
dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)
input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")
datafeed <- dataCreditRating[ , input_columns ]
#Mempersiapkan training dan testing set
set.seed(100) #untuk menyeragamkan hasil random antar tiap komputer
indeks_training_set <- sample(900, 800)
#Membuat dan menampilkan training set dan testing set
input_training_set <- datafeed[indeks_training_set,]
class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating
input_testing_set <- datafeed[-indeks_training_set,]
#menghasilkan model
risk_rating_model <- C5.0(input_training_set, class_training_set, control = C5.0Control(label="Risk Rating"))
#menyimpan risk_rating dari data awal dan hasil prediksi testing set ke dalam kolom hasil_prediksi
input_testing_set$risk_rating <- dataCreditRating[-indeks_training_set,]$risk_rating
input_testing_set$hasil_prediksi <- predict(risk_rating_model, input_testing_set)
#membuat confusion matrix
dcast(hasil_prediksi ~ risk_rating, data=input_testing_set)
## 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 yang palinga atas menunjukkan risk_rating hasil prediksi, sedangkan header baris paling kiri menunjukkan data risk_rating sebenarnya. Diagonal menunjukkan jumlah data yang terprediksi dengan benar, dan sisanya menunjukkan data yang salah terprediksi.
Sekilas terlihat jumlah yang terprediksi dengan benar jauh lebih besar porsinya dibandingkan yang salah. Namun untuk yang 4 dan 5 ada sedikit catatan diman prediksi 5 itu kadang jatuh ke 4. Namun ini bisa kita abaikan, karena 4 dan 5 memang beresiko tinggi.
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
library("openxlsx")
library("C50")
#Mempersiapkan data
dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")
#Mempersiapkan class dan input variables
dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)
input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")
datafeed <- dataCreditRating[ , input_columns ]
#Mempersiapkan training dan testing set
set.seed(100) #untuk menyeragamkan hasil random antar tiap komputer
indeks_training_set <- sample(900, 800)
#Membuat dan menampilkan training set dan testing set
input_training_set <- datafeed[indeks_training_set,]
class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating
input_testing_set <- datafeed[-indeks_training_set,]
#menghasilkan model
risk_rating_model <- C5.0(input_training_set, class_training_set, control = C5.0Control(label="Risk Rating"))
#menyimpan risk_rating dari data awal dan hasil prediksi testing set ke dalam kolom hasil_prediksi
input_testing_set$risk_rating <- dataCreditRating[-indeks_training_set,]$risk_rating
input_testing_set$hasil_prediksi <- predict(risk_rating_model, input_testing_set)
#Menghitung jumlah prediksi yang benar
nrow(input_testing_set[input_testing_set$risk_rating==input_testing_set$hasil_prediksi,])
## [1] 87
Angka 87 ini menunjukkan jumlah data dengan prediksi yang benar terhadap testing set. Karena testing set berjumlah 100, maka persentase prediksi yang benar adalah 87%, dan error rate atau persentase yang salah adalah 13%.
coba jika kita melakukan perhitungan unutk jumpah data prediksi salah
library("openxlsx")
library("C50")
#Mempersiapkan data
dataCreditRating <- read.xlsx(xlsxFile = "https://academy.dqlab.id/dataset/credit_scoring_dqlab.xlsx")
#Mempersiapkan class dan input variables
dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)
input_columns <- c("durasi_pinjaman_bulan", "jumlah_tanggungan")
datafeed <- dataCreditRating[ , input_columns ]
#Mempersiapkan training dan testing set
set.seed(100) #untuk menyeragamkan hasil random antar tiap komputer
indeks_training_set <- sample(900, 800)
#Membuat dan menampilkan training set dan testing set
input_training_set <- datafeed[indeks_training_set,]
class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating
input_testing_set <- datafeed[-indeks_training_set,]
#menghasilkan model
risk_rating_model <- C5.0(input_training_set, class_training_set, control = C5.0Control(label="Risk Rating"))
#menyimpan risk_rating dari data awal dan hasil prediksi testing set ke dalam kolom hasil_prediksi
input_testing_set$risk_rating <- dataCreditRating[-indeks_training_set,]$risk_rating
input_testing_set$hasil_prediksi <- predict(risk_rating_model, input_testing_set)
#Menghitung jumlah prediksi yang salah
nrow(input_testing_set[input_testing_set$risk_rating!=input_testing_set$hasil_prediksi,])
## [1] 13
dari nilai 13 tersebut kita bisa tahu bahwa error yang terjadi karena missclassifikasi sebesar 13%
Sekian dulu tulsian kali ini tentang menggunakan algoritma C5.0 dimulai dari preparation hingga confussion matrix. Semoga bermanfaat.