Data Science in Finance: Credit Risk Analysis

Nurul Fadilah Syahrul
6 min readSep 12, 2021

--

Halo kali ini, saya ingin membagikan hasil belajar data science menggunakan R dari DQLab Course. Credit Risk Analysis menggunakan decision tree dengan algoritma C50.

Pertama-tama, hal yang harus dilakukan adalah load packages yang akan digunakan. Packages yang digunakan adalah “openxlsx” dan “C50”. Jika packages tersebut belum ada terinstall di aplikasinya, sila diinstall dulu.

(1) Load packages yang digunakan
library(“openxlsx”)
library(“C50”)

(2) Read Data
dataCreditRating <- read.xlsx(xlsxFile = “https://storage.googleapis.com/dqlab-dataset/credit_scoring_dqlab.xlsx")

Setelah membaca data, langkah selanjutnya adalah mengecek tipe data dari masing-masing kolom yang ada di dataset tersebut. Dengan menggunakan function berikut:
str(dataCreditRating)

tampilan dari function di atas adalah sebagai berikut:
‘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 …

Perhatikan variabel “risk_rating” masih memiliki tipe data numerik, berarti kita harus mengubahnya ke dalam tipe data faktor agar dapat digunakan dalam algoritma C5.0

(3) Melakukan konversi kolom risk_rating menjadi factor
Lakukan dengan menjalankan perintah berikut:
dataCreditRating$risk_rating <- as.factor(dataCreditRating$risk_rating)
Setelah perintah tersebut dijalankan, sila dicek dulu tipe data variabel tersebut, dengan menjalankan perintah sebagai berikut.
str(dataCreditRating$risk_rating)
Hasil dari perintah tersebut adalah:
Factor w/ 5 levels “1”,”2",”3",”4",..: 4 4 1 3 2 1 2 2 2 2 …
Hal ini menandakan bahwa variabel tersebut sudah bertipe faktor.

Variabel yang akan dianalisis adalah variabel durasi pinjaman dan jumlah tanggungan sehingga variabel lainnya akan dihilangkan.

(4) Menghilangkan beberapa variabel 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 …

Setelah memisahkan beberapa variabel input yang akan digunakan pada model, langkah selanjutnya adalah mempersiapkan data training dan data testing secara acak dalam dataset yang digunakan. Data training adalah data yang dianalisis dan digunakan dalam pembentukan model, sedangkan data testing digunakan untuk menguji model yang telah dibentuk.

(5) Mempersiapkan porsi index acak untuk training dan testing set
set.seed(100)
indeks_training_set <- sample(900, 800)
* set.seed(100) adalah perintah untuk menyeragamkan pengambilan bilangan acak di seluruh aplikasi R.
*sample(900, 800) adalah membuat urutan acak dengan rentang nilai 1 sampai dengan 900, tetapi diambil sebanyak 800 nilai.

(6) Membuat dan menampilkan data training dan data testing
input_training_set <- datafeed[indeks_training_set,]
class_training_set <- dataCreditRating[indeks_training_set,]$risk_rating
input_testing_set <- datafeed[-indeks_training_set,]

(7) Mengecek tipe data tiap perintah data training dan data testing
> 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 …

(8) Menghasilkan dan menampilkan model
> risk_rating_model <- C5.0(input_training_set, class_training_set)
> summary(risk_rating_model)

Penjelasan dari tiap bagian di function “summary” adalah sebagai berikut:

Terdapat 800 data training yang diambil dari “undefined data”. “Undefined Data” bisa diabaikan karena bagian ini merupakan informasi file data dari program C50 yang asli. Input variabel yang digunakan adalah durasi_pinjaman dan jumlah_tanggungan dan Class variabel yang digunakan adalah risk_rating. Class variabel dinamakan dengan “outcome”.

Jika jumlah tanggungan > 4 maka perlu dilihat kondisi berikutnya yaitu:

  • Jika durasi pinjaman sampai dengan 24 bulan, maka klasifikasi risk ratingnya adalah 4. Dari dataset training, alur ini mengklasifikasikan 105 data, namun 30 diantara 105 data ini salah klasifikasi.
  • Jika durasi pinjaman lebih dari 24 bulan, maka klasifikasi risk ratingnya adalah 5. Dari dataset training, alur ini mengklasifikasikan 120 data, namun 51 diantara 120 data ini salah klasifikasi.

Begitu seterusnya untuk kondisi jumlah tanggungan lainnya.

Terdapat 192 data yang salah klasifikasi dari 800 data training yang digunakan, dengan tingkat kesalahan sebesar 24%.

Penjelasan untuk baris pertama setelah baris “classified as” :

  • Angka 184 pada kolom pertama baris pertama menunjukkan jumlah data yang benar klasifikasi atau prediksinya, dimana:
    klasifikasi model terhadap data mendapatkan risk_rating 1, sedangkan pada data aktual juga nilai risk_rating-nya 1
  • Angka 2 pada kolom kedua baris pertama menunjukkan jumlah data yang salah prediksi, dimana: klasifikasi model terhadap data mendapatkan risk_rating 2, sedangkan pada data aktual ternyata nilai risk_rating-nya 1
  • Angka 5 pada kolom ketiga baris pertama menunjukkan jumlah data yang salah prediksi, dimana: klasifikasi model terhadap data mendapatkan risk_rating 3, sedangkan pada data aktual ternyata nilai risk_rating-nya 1
  • Angka 6 pada kolom keempat baris pertama menunjukkan jumlah data yang salah prediksi, dimana: klasifikasi model terhadap data mendapatkan risk_rating 4, sedangkan pada data aktual ternyata nilai risk_rating-nya 1
  • Angka 6 pada kolom kelima baris pertama menunjukkan jumlah data yang salah prediksi, dimana: klasifikasi model terhadap data mendapatkan risk_rating 5, sedangkan pada data aktual ternyata nilai risk_rating-nya 1

Output tersebut menceritakan tingkat pentingnya penggunaan tiap variabel. Disini jumlah_tanggungan menempati urutan pertama dengan nilai 100% dan durasi_pinjaman dengan 73.00%.

(9) Menampilkan plot decision tree
plot(risk_rating_model)

Plot Decision Tree

(10) 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 5 3 3 3 3 4
[44] 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 5 1 4 5 3 1 3 3 3 3 3 1
[87] 3 3 5 4 5 3 3 3 1 1 5 5 3 3
Levels: 1 2 3 4 5

(11) 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)

(12) Membuat confusion matrix
library(reshape2)
dcast(hasil_prediksi ~ risk_rating, data=input_testing_set)
Setelah membuat confusion matrix, kita dapat melihat jumlah prediksi yang benar dengan menjalankan perintah berikut:
>nrow(input_testing_set[input_testing_set$risk_rating==input_testing_set$hasil_prediksi,])
[1] 87
Terlihat bahwa ada 87 data yang klasifikasinya sudah benar. Artinya persentase yang benar sebesar 87% karena data testing yang digunakan berjumlah 100 data.

Untuk melihat jumlah prediksi yang salah dapat menjalankan perintah berikut:
>nrow(input_testing_set[input_testing_set$risk_rating!=input_testing_set$hasil_prediksi,])
[1] 13
Persentase yang salah sebesar 13% artinya sebanyak 13 data yang memiliki klasifikasi yang berbeda dengan data aslinya.

Demikian, penjelasan singkat dari hasil belajar saya. Pertanyaan terakhir, data yang diujikan adalah data lama yang sudah ada dalam dataset. Bagaimana jika tiba-tiba ada data pengajuan baru? Bagaimana cara memprediksi terhadap data tersebut?

Di postingan selanjutnya akan dijelaskan. Malam semakin larut, jadi penjelasannya akan dijelaskan keesokan harinya. Stay tuned teman-teman!!

--

--

Nurul Fadilah Syahrul
Nurul Fadilah Syahrul

Written by Nurul Fadilah Syahrul

numericitian (numeric-statistician-mathematician)

No responses yet