Tim analisis data di sebuah bank menggunakan German Credit Data untuk membedakan antara kelompok berisiko tinggi dan kelompok berisiko rendah. Selain itu, ingin diketahui metode terbaik dalam memprediksi seseorang memiliki risiko tinggi atau rendah. Penelitian ini penting untuk memberikan gambaran kepada manajemen bank dan tim pemasaran untuk menghindari kredit macet.
Tim analisis data kemudian memutuskan akan menggunakan analisis klasifikasi dengan dataset yang bersumber pada:
Dataset ini mengklasifikasikan orang-orang yang dijelaskan oleh serangkaian atribut atau peubah penjelas sebagai risiko kredit baik atau buruk. Terdapat 700 sampel yang tergolong risiko kredit baik dan 300 sampel tergolong risiko kredit macet. Terdapat 20 peubah penjelas yang diukur dalam German Credit Data, termasuk 7 peubah penjelas numerik dan 13 peubah penjelas kategorik sebagai berikut.
Nama Variabel
Tipe Variabel
Deskripsi
class
Kategorik
Status Kredit
checking_status
Kategorik
Rekening Koran
duration
Numerik
Durasi Kredit
credit_history
Kategorik
Riwayat Kredit
purpose
Kategorik
Tujuan Kredit
credit_amount
Numerik
Jumlah Kredit
savings_status
Kategorik
Rekening Tabungan/Obligasi
employment
Kategorik
Lama Bekerja
installment_commitment
Numerik
Tingkat angsuran dalam persentase pendapatan yang dapat disisihkan
personal_status
Kategorik
Jenis Kelamin dan Status
other_parties
Kategorik
Debitur Lain
residence_since
Numerik
Lama tinggal di alamat sekarang
property_magnitude
Kategorik
Properti atau Aset Paling Berharga
age
Numerik
Usia
other_payment_plans
Kategorik
Cicilan Lainnya
housing
Kategorik
Jenis tempat tinggal
existing_credits
Numerik
Jumlah Kredit yang ada di Bank ini
job
Kategorik
Pekerjaan
num_dependents
Numerik
Jumlah tanggungan
own_telephone
Kategorik
Langganan Telepon
foreign_worker
Kategorik
Status Pekerja Asing
Packages
Sebelum melakukan impor data, dilakukan pemanggilan packages untuk fungsi-fungsi yang digunakan sebagai berikut. Pemanggilan ini dilakukan di awal sehingga tidak perlu melakukan pemanggilan packages di tengah proses analisis data.
library(readxl) #untuk impor data ekstensi .xlsx dari penyimpanan lokal komputerlibrary(ggstatsplot) #untuk visualisasi data
Warning: package 'ggstatsplot' was built under R version 4.4.3
library(rsample)
Warning: package 'rsample' was built under R version 4.4.3
library(rpart) #untuk model pohon regresilibrary(rpart.plot) #untuk visualisasi hasil pohon regresi
Warning: package 'rpart.plot' was built under R version 4.4.3
library(randomForest) #untuk model random forestlibrary(gbm) #untuk gradient boostinglibrary(neuralnet) #untuk neural network
Warning: package 'neuralnet' was built under R version 4.4.3
library(nnet)library(caret)
Warning: package 'ggplot2' was built under R version 4.4.3
library(MLmetrics)
Warning: package 'MLmetrics' was built under R version 4.4.3
Data
Data yang digunakan dapat dilihat dan diunduh di sini.
Data dengan format .csv dapat diimpor melalui fungsi read.csv() dengan menyebutkan nama file beserta folder tempat menyimpannya.
# Impor dari penyimpanan lokaldata <-read.csv("german_credit.csv", sep =",")
Selanjutnya, kita dapat melihat informasi dasar dari variabel dan karakter dari variabel tersebut dengan str()
Dapat kita lihat data yang digunakan terdiri atas 1000 baris dan 21 kolom. Baris menunjukkan jumlah observasi / sample, kolom menunjukkan variabel atau karakteristik dari observasi. Berdasarkan output tersebut, dapat diketahui bahwa ada variabel dalam bentuk integer (int) dan karakter (chr).
Eksplorasi Data
Kemudian, dilakukan eksplorasi data dengan:
melihat proporsi kelas y
melihat hubungan antara variabel respons dengan variabel prediktor dengan stacked barplot.
Proporsi Kelas Respons
Seperti yang disampaikan sebelumnya bahwa dataset memuat 1000 amatan. Sebaran banyaknya kredit macet dan kredit lancar dapat diperoleh dengan menampilkan frekuensi kejadiannya dengan cara berikut.
table(data$class)
bad good
300 700
prop.table(table(data$class))
bad good
0.3 0.7
Selain itu, dapat digunakan pula pie-chart seperti di bawah ini. Sebanyak 30% amatan adalah kredit macet, dan 70% sisanya kredit lancar.
Hubungan Variabel Prediktor dengan Kelancaran Kredit
Sebelum lebih jauh menyusun model klasifikasi, kita dapat mendeskripsikan secara sederhana bagaimana hubungan antara variabel penjelas dalam model dengan kelancaran kredit. Di bawah ini kita coba untuk melihat apakah ada keterkaitan variabel pekerjaan “job” dengan kelancaran kredit menggunakan stacked-bar chart.
Diagram di atas menunjukkan kredit macet cukup tinggi pada kelompok pekerja dengan kualifikasi tinggi (’high qualif/self emp/mgmt). Namun, besaran proporsi antar kelompok relatif sama sehingga dapat dianggap variabel ini kemungkunin besar tidak akan memberikan pengaruh pada model.
Selanjutnya, dilakukan ekplorasi yang sama untuk riwayat kredit (credit_history) sebagai berikut.
Diagram di atas menunjukkan ada perbedaan cukup tinggi untuk masing-masing riwayat kredit. Besaran proporsi antar kelompok yang relatif berbeda mengindikasikan variabel ini kemungkunin besar memberikan pengaruh pada model.
Kemudian, untuk variabel numerik seperti umur, dapat dikelompokkan sebagai berikut untuk mempermudah visualisasi.
Sebelum melakukan pemodelan, dilakukan pembagian data menjadi data train dan data test. Data train digunakan untuk membangun model, sementara data test digunakan untuk mengevaluasi model. Pada kesempatan ini, pembagian data train dan data test akan menggunakan prinsip Pareto dengan perbandingan data train dan data test sebesar 80:20.
Berikut ini adalah perintah/program untuk melakukan pemisahan data secara acak berstrata untuk menjamin persentase nasabah yang berlangganan di data train dan data test relatif sama. Namun, sebelum itu juga dilakukan pengubahan nilai menjadi 1 (untuk bad) dan 0 (untuk good)
#data$class = relevel(data$class, ref = "good")data$class =ifelse(data$class =="bad", 1, 0)set.seed(4321) #digunakan agar dapat diulang dan menghasilkan hasil yang samadefine_split <-initial_split(data = data,prop =0.8,strata ="class")train <-training(define_split)test <-testing(define_split)
dim(train)
[1] 800 21
prop.table(table(train$class))
0 1
0.7 0.3
dim(test)
[1] 200 21
prop.table(table(test$class))
0 1
0.7 0.3
Berdasarkan output di atas, diperoleh bahwa data latih berisi 800 amatan, sedangkan data uji berisi 200 amatan. Proporsi kredit macet di kedua dataset tersebut relatif sama yaitu 30%.
Regresi Logistik
Pemodelan
Model klasifikasi pertama yang disusun adalah regresi logistik. Model ini menggunakan variabel class sebagai variabel respon.
Fungsi di R yang bisa digunakan adalah glm() dengan opsi family="binomial".
Untuk mengeluarkan dugaan parameter model, dapat memanggil objek yang digunakan sebagai tempat menyimpan model, yaitu reg.model . Namun, apabila ingin lebih jelas mengetahui informasi dari model yang tidak terbatas pada dugaan parameter, gunakan fungsi summary() seperti berikut.
Output dari ringkasan model terdiri atas fungsi yang dimasukkan seperti koefisien regresi dan hasil uji-z, serta kebaikan model yang ditunjukkan dengan AIC.
Berdasarkan output di atas dapat dilihat bahwa:
foreign_workeryes memiliki koefisien positif, yang berarti bahwa pekerja asing memiliki peluang/resiko kredit macet tinggi
credit_amount memiliki koefisien positif, yang berarti bahwa semakin tinggi jumlah kredit seseorang maka peluang/resiko kredit macetnya akan semakin membesar
age memiliki koefisien negatif, yang berarti bahwa semakin tua seseorang maka peluang/resiko kredit macetnya akan semakin mengecil
Selanjutnya, pada hasil uji statistik, dapat dilihat bahwa status pekerja asing, jumlah kredit, dan umur berpengaruh signifikan. Akan tetapi, pada riwayat kredit terdapat kategori yang tidak signifikan, yaitu pada “no credits/all paid” sementara kategori lainnya signifikan sehingga untuk memastikan signifikansinya digunakan Analysis of Deviance sebagai berikut.
Berdasarkan output, credit_history berpengaruh signifikan terhadap kejadian kredit macet. Selain itu, variabel yang memiliki pengaruh ditandakan dengan bintang (*), sementara jika tidak berpengaruh maka tanda bintang tidak ada.
Evaluasi Model
Selanjutnya dilakukan evaluasi model dengan melakukan prediksi variabel respon pada data test. Untuk melakukan prediksi gunakan fungsi predict() . Berbeda dari model regresi linear, pada regresi logistik gunakan type=response .
Tahapan yang dilakukan kira-kira adalah:
melakukan prediksi menggunakan model regresi logistik yang telah didapatkan –> hasil prediksi berupa peluang terjadinya kejadian respon (dalam kasus ini adalah kredit macet)
melakukan pengkelasan nilai prediksi peluang/resiko kredit macet. Jika prediksi peluangnya di atas 0.5 maka disimpulkan diprediksi kredit macet, jika kurang dari 0.5 disimpulkan kredit lancar
membandingkan kelas prediksi dengan kelas aktual
menghitung persentase ketepatan hasil prediksi dengan ukuran akurasi, sensitivity, atau specificity.
Performa model klasifikasi dapat direpresentasikan dalam sebuah grafik, yaitu kurva receiver operating characteristic (ROC) yang menggambarkan hubungan sensitivitas (pada sumbu y) dengan 1-spesifisitas (pada sumbu x). Pembuatan kurva ROC dapat dilakukan dengan
library(PRROC)
Warning: package 'PRROC' was built under R version 4.4.3
Loading required package: rlang
Warning: package 'rlang' was built under R version 4.4.3
Luas area di bawah kurva ROC dinyatakan dalam metrik area under curve (AUC) yang menunjukkan performal model, di mana semakin mendekati 1 maka kemampuan model semakin baik.
Nilai di bawah kurva ROC dapat disimpan dengan cara berikut.
Untuk melakukan pemodelan dengan pohon klasifikasi, digunakan fungsi rpart() dengan memasukkan ekspresi method="class". Apabila fungsi tersebut hanya menggunakan input berupa formula dan data, maka fungsi tersebut akan menjalankan fungsi default pada rpart.control .
Pemanggilan objek class.tree akan menampilkan pohon yang terbentuk. Pada partisi pertama, terlihat penggunaan variabel checking status. Namun, untuk lebih mempermudah melihat pohon yang terbentu, dapat menggunakan fungsi rpart.plot() sebagai berikut.
Pohon yang terbentuk menunjukkan aturan-aturan keputusan dari model. Simpul akar dari pohon berada di bagian atas, dan simpul daun berada di bagian bawah. Setiap node diberi label dengan variabel yang digunakan untuk membagi data pada node tersebut dan nilai dari pembagian tersebut. Node daun menunjukkan nilai prediksi (1 sebagai “bad” atau kredit macet, 0 sebagai “good” atau kredit lancar), nilai desimal di bawahnya menunjukkan peluang untuk kredit macet, dan persentase menunjukkan persentase dari observasi yang tercakup di dalamnya.
Selain itu, dapat diketahui variabel penting dari pohon regresi dengan cara berikut.
Output menunjukkan bahwa variabel checking status, jumlah kredit, dan riwayat kredit menjadi tiga variabel penting.
Evaluasi Model
Evaluasi model dilakukan dengan cara yang sama dengan regresi logistik, yaitu dengan melakukan prediksi variabel respon pada data test. Untuk melakukan prediksi gunakan fungsi predict() , dengan type="prob". Kemudian diikuti dengan melihat keakuratan prediksi menggunakan confussion matrix.
Untuk melakukan pemodelan dengan random forest, digunakan fungsi randomForest() dengan type="classification". Apabila fungsi tersebut hanya menggunakan input berupa formula dan data, maka fungsi tersebut akan menjalankan fungsi default.
Perlu diperhatikan, input class yang sudah berupa angka akan terbaca numerik sehingga perlu dilakukan penyesuaian dengan menambahkan as.factor() .
Call:
randomForest(formula = as.factor(class) ~ foreign_worker + credit_history + credit_amount + age + installment_commitment + housing + num_dependents + own_telephone + property_magnitude + savings_status + checking_status + purpose, data = train, ntree = 500, type = "classification")
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 3
OOB estimate of error rate: 25.75%
Confusion matrix:
0 1 class.error
0 506 54 0.09642857
1 152 88 0.63333333
Tingkat kesalahan Out-of-Bag (OOB) adalah 25,75% yang mencerminkan keakuratan model berdasarkan data yang tidak digunakan selama pelatihan. Tingkat kesalahan OOB yang lebih rendah menunjukkan kinerja yang lebih baik. Selanjutnya pada class.error menunjukkan kesalahan klasifikasi di setiap kelas.
Selanjutnya, apabila ingin menampilkan variabel penting, perlu dimasukkan ekspresi importance=TRUE .
Berdasarkan dua keluaran di atas, variabel checking status, jumlah kredit, riwayat kredit menjadi tiga variabel penting.
Evaluasi Model
Evaluasi model dilakukan dengan cara yang sama, yaitu dengan melakukan prediksi variabel respon pada data test. Namun, pada random forest, hasil prediksi sudah berupa kelas, yaitu 0 atau 1 sehingga tidak perlu dilakukan pengelompokkan secara manual seperti regresi logistik dan pohon klasifikasi. Untuk melakukan prediksi gunakan fungsi predict() dan diikuti dengan melihat keakuratan prediksi menggunakan confussion matrix.
Untuk melakukan pemodelan dengan gradient boosting, digunakan fungsi gbm() . Namun, untuk klasifikasi, tambahkan opsi distribution="bernoulli" . Apabila fungsi tersebut hanya menggunakan input berupa formula dan data, maka fungsi tersebut akan menjalankan fungsi default.
Perlu diperhatikan di sini, respons untuk pemodelan gbm() memerlukan input berupa numerik dan variabel kategoriknya harus dalam factor . Oleh karena itu, perlu dilakukan beberapa penyesuaian seperti berikut ini.
#cek bentuk dari variabel responsis.numeric(train$class)
[1] TRUE
gbm.model <-gbm(class ~as.factor(foreign_worker) +as.factor(credit_history) + credit_amount + age + installment_commitment +as.factor(housing) + num_dependents +as.factor(own_telephone) +as.factor(property_magnitude) +as.factor(savings_status) +as.factor(checking_status) +as.factor(purpose), data = train, distribution ="bernoulli")
Untuk melihat hasil pemodelan berupa peubah penting, gunakan summary() .
Output akan menunjukkan variabel yang memiliki kontribusi besar dalam pemodelan. Berdasarkan output tersebut terdapat variabel checking status, jumlah kredit, riwayat kredit sebagai tiga peubah penting.
Evaluasi Model
Evaluasi model dilakukan dengan cara yang sama, yaitu dengan melakukan prediksi variabel respon pada data test. Untuk melakukan prediksi gunakan fungsi predict() dengan tahapan yang sama dengan regresi logistik dan pohon klasifikasi. Setelah itu, keakuratan prediksi dilihat menggunakan confussion matrix.
Pemodelan SVM dilakukan dengan fungsi svm() pada packagee1071 . Pemodelan klasifikasi SVM dilakukan dengan memberi ekpresi type="C-classification" . Selain itu, terdapat beberapa kernel yang dapat digunakan, seperti:
linear
polynomial
radial basis
sigmoid
Pada ilustrasi ini, digunakan kernel linear.
library(e1071)
Attaching package: 'e1071'
The following object is masked from 'package:rsample':
permutations
Evaluasi model dilakukan dengan cara yang sama, yaitu dengan melakukan prediksi variabel respon pada data test. Namun, pada SVM, hasil prediksi sudah berupa kelas, yaitu 0 atau 1 sehingga tidak perlu dilakukan pengelompokkan secara manual. Untuk melakukan prediksi gunakan fungsi predict() dan diikuti dengan melihat keakuratan prediksi menggunakan confussion matrix.
Berdasarkan metrik yang digunakan, dapat dilihat bahwa regresi logistik dan SVM sebagai dua metode terbaik. Hal ini ditandakan dengan nilai metrik yang cukup tinggi di antara metode lainnya. Perlu menjadi perhatian, pada ilustrasi ini ada ketidakseimbangan kelas sehingga metrik evaluasi yang bisa manjadi fokus utama adalah AUC. Nilai AUC yang semakin tinggi menunjukkan performa metode semakin baik. Apabila nilai AUC mendekati 0,5, maka performal model seperti tebakan acak (random guessing).