Berikut ini adalah data risk rating pembiayaan pada sebuah perbankan.
Tujuan saya menggunakan data ini adalah untuk membuat Credit Scoring pada nasabah perbankan. Credit Scoring sendiri merupakan metode yang biasanya digunakan dunia perbankan untuk melihat dan menilai resiko yang dimiliki oleh nasabah yang akan melakukan pembiayaan. Dengan adanya analisis Credit Scoring ini dapat membantu bank untuk bisa lebih efektif dan efisien dalam menentukan profil resiko yang dimiliki oleh nasabah.
Deskripsi Data
kode_kontrak: Kontrak nasabah dengan bank
pendapatan_setahun_juta: Pendapatan nasabah pertahun (dalam juta)
kpr_aktif: Status kepemilikan KPR yang masih aktif
durasi_pinjaman_bulan: Tenor pinjaman nasabah
jumlah_tanggungan: Jumlah anggota keluarga yang dibiayai
rata_rata_overdue: Kategori rata-rata keterlambatan
risk_rating: Rating resiko nasabah
Dataset
Aktifkan Library
Mengaktifkan library yang akan dipakai
library("openxlsx") #read excel
library("C50") #decision tree model
library("tidyverse") #preprocessing data
library("reshape2") #confusion matrix
Import Data
Import data yang akan digunakan
rawdatacredit <- read.xlsx("credit_scoring.xlsx")
rawdatacredit
Memeriksa Tipe Data
glimpse(rawdatacredit)
## Rows: 900
## Columns: 7
## $ kode_kontrak <chr> "AGR-000001", "AGR-000011", "AGR-000030", "AGR~
## $ pendapatan_setahun_juta <dbl> 295, 271, 159, 210, 165, 220, 70, 88, 163, 100~
## $ kpr_aktif <chr> "YA", "YA", "TIDAK", "YA", "TIDAK", "TIDAK", "~
## $ durasi_pinjaman_bulan <dbl> 48, 36, 12, 12, 36, 24, 36, 48, 48, 36, 12, 36~
## $ jumlah_tanggungan <dbl> 5, 5, 0, 3, 0, 5, 3, 3, 5, 6, 0, 0, 5, 4, 4, 3~
## $ rata_rata_overdue <chr> "61 - 90 days", "61 - 90 days", "0 - 30 days",~
## $ risk_rating <dbl> 4, 4, 1, 3, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2~
Memeriksa Missing Value
colSums(is.na(rawdatacredit))
## kode_kontrak pendapatan_setahun_juta kpr_aktif
## 0 0 0
## durasi_pinjaman_bulan jumlah_tanggungan rata_rata_overdue
## 0 0 0
## risk_rating
## 0
Tidak ada data yang kosong untuk setiap variabel
#CLASS
#ubah risk_rating menjadi tipe data factor (karena akan digunakan sebagai class)
rawdatacredit$risk_rating <- as.factor(rawdatacredit$risk_rating)
#INPUT
datacredit <-
rawdatacredit %>%
select("durasi_pinjaman_bulan", "jumlah_tanggungan")
datacredit
Data Train untuk melakukan training model, Data Test untuk melakukan testing pada model
#Indeks
set.seed(1616) #menyeragamkan hasil random antar tiap komputer
indeks_data <- sample(900, 800) #800 data untuk data train
#Data Train (800 data)
input_train_data <- datacredit[indeks_data,]
#Data Train Class/Target
class_train_data <- rawdatacredit[indeks_data,]$risk_rating
#Data Test (100 data)
input_test_data <- datacredit[-indeks_data,]
Untuk model yang akan digunakan yaitu model ‘Decison Tree’. Yaitu model yang powerful dan populer untuk keperluan klasifikasi dan prediksi. Struktur decision tree terbagi dalam 3 elemen utama : root node, leaf node, dan branch.
Decision tree biasa digunakan untuk mengeksplorasi dan menemukan pengetahuan baru, dikarenakan stuktur analisanya dimulai dari ‘akar’ atau root node yang menspesifikasi attribute pertama, dan kemudian dilanjutkan dengan spesifikasi attribute kedua berdasarkan output dari attribute pertama, dan begitu seterusnya.
Algoritma C5.0
Algoritma yang digunakan adalah Algoritma C5.0 , untuk C5.0 sendiri merupakan kode penamaan suatu algoritma untuk decision tree. Algoritma ini sering dikategorikan sebagai classification, dimana tujuannya adalah untuk mengkategorikan atau mengklasifikan sesuatu
scoring_model <- C5.0(input_train_data,class_train_data)
# Hasil model
summary(scoring_model)
##
## Call:
## C5.0.default(x = input_train_data, y = class_train_data)
##
##
## C5.0 [Release 2.07 GPL Edition] Wed Mar 09 22:01:53 2022
## -------------------------------
##
## Class specified by attribute `outcome'
##
## Read 800 cases (3 attributes) from undefined.data
##
## Decision tree:
##
## jumlah_tanggungan > 4:
## :...durasi_pinjaman_bulan <= 24: 4 (94/25)
## : durasi_pinjaman_bulan > 24: 5 (128/49)
## jumlah_tanggungan <= 4:
## :...jumlah_tanggungan > 2: 3 (217/21)
## jumlah_tanggungan <= 2:
## :...durasi_pinjaman_bulan <= 36: 1 (265/76)
## durasi_pinjaman_bulan > 36:
## :...jumlah_tanggungan <= 0: 2 (38/8)
## jumlah_tanggungan > 0: 3 (58/3)
##
##
## Evaluation on training data (800 cases):
##
## Decision Tree
## ----------------
## Size Errors
##
## 6 182(22.8%) <<
##
##
## (a) (b) (c) (d) (e) <-classified as
## ---- ---- ---- ---- ----
## 189 2 5 4 5 (a): class 1
## 76 30 19 5 13 (b): class 2
## 4 251 (c): class 3
## 2 69 31 (d): class 4
## 16 79 (e): class 5
##
##
## Attribute usage:
##
## 100.00% jumlah_tanggungan
## 72.88% durasi_pinjaman_bulan
##
##
## Time: 0.0 secs
Insight:
Model membaca 800 data dengan 3 atribut (jumlah_tanggungan, durasi_pinjaman_bulan, risk_rating)
Jumlah leaf node yang dihasilkan adalah 6
Jumlah error yang dihasilkan adalah 22.6%
Variabel dengan siginifikansi terbesar adalah jumlah_tanggungan (100%) dan durasi_pinjaman_bulan (72.75%)
plot(scoring_model)
Setelah pembuatan model selesai dilakukan, selanjutnya adalah melakukan evaluasi dengan menggunakan data test. Sebelum melakukan evalasi, yang perlu dilakukan yaitu prediksi data
#menggunakan model untuk prediksi testing set
prediksi <- predict(scoring_model, input_test_data)
prediksi
## [1] 5 4 3 4 4 3 1 5 4 3 1 3 5 3 5 3 3 3 3 5 2 3 3 3 1 4 1 1 5 1 3 1 4 1 4 3 3
## [38] 4 3 5 1 3 2 1 3 3 3 1 1 3 4 1 1 3 3 4 3 1 1 3 4 3 4 1 4 3 4 1 3 4 4 5 1 1
## [75] 1 3 1 3 5 1 5 1 4 2 1 3 3 3 5 1 3 3 3 3 5 1 4 1 3 1
## Levels: 1 2 3 4 5
Hasil prediksi sesuai dengan jumlah baris data dari data test, dan juga sesuai dengan rentang nilai risk_rating yaitu 1 sampai dengan 5.
Menggabungkan risk_rating dan prediksi kedalam data test
input_test_data$risk_rating <- rawdatacredit[-indeks_data,]$risk_rating
input_test_data$prediksi <- predict(scoring_model, input_test_data)
input_test_data
Selanjutnya yaitu melihat distribusi mana yang terprediksi dengan benar dan sala dengan menggunakan Confusion Matrix yagg berguna untuk mempermudah dalam melihat hasil dan akurasi model yang kita buat dalam mengidentifikasi suatu masalah
dcast(prediksi ~ risk_rating, data = input_test_data)
## Using prediksi as value column: use value.var to override.
## Aggregation function missing: defaulting to length
Jumlah data yang terprediksi benar
input_test_data %>% filter(risk_rating == prediksi) %>% nrow()
## [1] 77
Jumlah data yang terprediksi salah
input_test_data %>% filter(risk_rating != prediksi) %>% nrow()
## [1] 23
Insight:
Pada dataframe function dcast() header kolom paling atas menunjukkan risk_rating prediksi, sedangkan header paling kiri menunjukkan data risk_rating sebenarnya. Untuk diagonal menunjukkan jumlah data yang terprediksi dengan benar, dan sisanya menunjukkan data yang terprediksi dengan salah.
Terlihat jumlah yang terprediksi dengan benar (76) jauh lebih besar porsinya dibandingkan yang salah (26), artinya model mampu memberikan 76% klasifikasi yang tepat dengan tingkat error 26%.
Setelah evaluasi model selesai, selanjutnya bisa dilakukan testing model dengan menggunakan data inputan baru.
Melihat nilai risk rating dengan data jumlah_tanggungan = 1, durasi_pinjaman_bulan = 6
example1 <- data.frame(jumlah_tanggungan = 1, durasi_pinjaman_bulan = 6)
example1
predict(scoring_model, example1)
## [1] 1
## Levels: 1 2 3 4 5
Dengan data jumlah_tanggungan = 6 dan durasi_pinjaman_bulan = 12, hasil risk rating yang dihasilkan adalah 4
Melihat nilai risk rating dengan data jumlah_tanggungan = , durasi_pinjaman_bulan = 12
example2 <- data.frame(jumlah_tanggungan = 6, durasi_pinjaman_bulan = 12)
example2
predict(scoring_model, example2)
## [1] 4
## Levels: 1 2 3 4 5
Dengan data jumlah_tanggungan = 6 dan durasi_pinjaman_bulan = 12, hasil risk rating yang dihasilkan adalah 4
Dengan model yang sudah dibuat menggunakan decision tree, model dapat mengukur risk rating jika terdapat data yang baru. Untuk akurasi model sendiri yaitu sebesar 76%.