Dalam dokumen ini diberikan ilustrasi penggunaan R untuk menjalankan algoritma recursive partition untuk menghasilkan pohon klasifikasi (classification tree). Ilustrasi akan diberikan mulai dari proses mengimport data menjadi dataframe, melakukan eksplorasi sederhana, membuat model pohon klasifikasi berdasarkan data training, hingga mengevaluasi ketepatan prediksinya.
Data yang digunakan adalah data untuk kasus prediksi status kredit nasabah, yang tersedia pada URL: (kontak penulis).
Proses mengimport data dalam format file csv dapat dilakukan menggunakan fungsi read.csv() dan menyebutkan nama file beserta folder tempat menyimpannya.
kredit <- read.csv("D:/ipb credit.csv")
Dengan perintah di atas, pada workspace-R kita memiliki data frame dengan mana kredit. Selanjutnya kita akan bekerja dengan dataframe ini.
Sebelum lebih jauh bekerja dengan data, kita perlu mengetahui informasi dasar dari data yang kita miliki. Informasi dasar tersebut meliputi ukuran/banyaknya data dan nama-nama kolom atau variabel yang ada di dalamnya.
FUngsi dim() dapat digunakan untuk menampilkan berapa banyak baris dan kolom pada dataframe kita, dan fungsi colnames() dapat digunakan untuk menampilkan nama-nama kolom pada data.
dim(kredit)
## [1] 10598 12
colnames(kredit)
## [1] "usia" "income" "rumah" "lokasi"
## [5] "pernikahan" "jenis.kelamin" "pekerjaan" "durasi.kerja"
## [9] "jumlah.anak" "housing.loan" "vehicle.loan" "status"
Tampak bahwa ada sebanyak 10598 baris pada data dengan kolom sebanyak 12 buah. Nama-nama kolom sudah diberikan oleh output di atas.
Ada baiknya kita mengetahui berapa banyak nasabah yang statusnya tergolong BAD dan GOOD, karena variabel ini merupakan variabel yang akan kita gunakan dalam pemodelan sebagai variabel target.
Fungsi table() merupakan fungsi yang dapat menghasilkan frekuensi dari setiap kategori, sedangkan prop.table() dapat menghasilkan proporsi atau persentase-nya.
table(kredit$status)
##
## BAD GOOD
## 3583 7015
prop.table(table(kredit$status))
##
## BAD GOOD
## 0.3380827 0.6619173
Berdasarkan hasil di atas diperoleh bahwa yang BAD ada sebanyak 3583 nasabah atau 33.8% dari keseluruhan yang ada.
Informasi lain yang juga penting untuk dilihat adalah tingkat resiko dari berbagai karakteristik nasabah. Perintah di bawah ini adalah untuk melihat berapa resiko atau peluang terjadinya BAD pada nasabah berdasarkan jenis kelaminnya. Kita dapat menampilkannya dalam bentuk tabel, atau memvisualisasikannya dalam bentuk grafik sederhana seperti di bawah ini, dimana terlihat bahwa nasabah laki-laki (MALE) memiliki resiko BAD yang lebih tinggi dibandingkan nasabah perempuan (FEMALE).
prop.table(table(kredit$status,kredit$jenis.kelamin), margin=2)
##
## FEMALE MALE
## BAD 0.2565618 0.3922123
## GOOD 0.7434382 0.6077877
barplot(prop.table(table(kredit$status,kredit$jenis.kelamin), margin=2), col=c(2,4))
Ilustrasi di bawah ini melakukan hal serupa namun untuk variabel lain yaitu kepemilikan kredit perumahan, dan terlihat bahwa mereka yang sedang memiliki kredit perumahan resiko jauh lebih besar dibandingkan nasabah yang tidak memiliki kredit rumah.
prop.table(table(kredit$status,kredit$housing.loan), margin=2)
##
## 0 1
## BAD 0.1017617 0.5003183
## GOOD 0.8982383 0.4996817
barplot(prop.table(table(kredit$status,kredit$housing.loan), margin=2), col=c(2,4))
Proses pemodelan akan diawali dengan membagi data menjadi dua bagian secara acak, yaitu data latih (training set) dan data uji (testing set). Data latih adalah data yang akan digunakan untuk melakukan pemodelan, sedangkan data uji adalah data untuk melihat kinerja prediksinya.
Fungsi yang bisa digunakan untuk memisahkan data menjadi dua bagian adalah createDataPartition() pada package caretsebagai berikut.
library(caret)
## Loading required package: lattice
## Loading required package: ggplot2
set.seed(100)
index_train <- createDataPartition(kredit$status,
p = 0.7,list = FALSE)
data.train <- kredit[index_train,]
data.test <- kredit[-index_train,]
Ada dua dataframe baru yang dihasilkan dari perintah di atas yaitu data.train dan data.test, yang banyaknya baris untuk masing-masing dapat diperoleh sebagai berikut.
dim(data.train)
## [1] 7420 12
dim(data.test)
## [1] 3178 12
Selanjutnya kita dapat menjalankan algoritma pohon klasifikasi menggunakan fungsi rpart() yang tersedia pada package dengan nama yang sama yaitu rpart.
Pada fungsi ini kita tinggal menyebutkan dataframe yang digunakan sebagai sumber data yaitu data.train. Ekspresi status ~ . memiliki makna bahwa variabel target-nya adalah status dan seluruh variabel lainnya digunakan sebagai prediktor. Jika kita hanya menggunakan beberapa variabel saja, kita bisa mengganti tanda "." denga nama-nama variabel yang ingin digunakan.
library(rpart)
pohon <- rpart(data=data.train,
status~.,
control = rpart.control(cp=0, minsplit=700))
Hasil dari pemodelan di atas tersimpan pada objek dengan nama pohon yang berisi model pohon klasifikasi yang dihasilkan.
Perintah di bawah ini dapat digunakan untuk menampilkan pohon yang terbentuk. Terlihat bahwa partisi pertama adalah menggunakan variabel "housing.loan".
pohon
## n= 7420
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 7420 2509 GOOD (0.33814016 0.66185984)
## 2) housing.loan>=0.5 4391 2193 BAD (0.50056935 0.49943065)
## 4) rumah=OTHERS,PARENTS,RENT 1819 506 BAD (0.72182518 0.27817482)
## 8) vehicle.loan>=0.5 525 31 BAD (0.94095238 0.05904762) *
## 9) vehicle.loan< 0.5 1294 475 BAD (0.63292117 0.36707883)
## 18) income< 6.025 558 113 BAD (0.79749104 0.20250896) *
## 19) income>=6.025 736 362 BAD (0.50815217 0.49184783)
## 38) jenis.kelamin=MALE 434 162 BAD (0.62672811 0.37327189) *
## 39) jenis.kelamin=FEMALE 302 102 GOOD (0.33774834 0.66225166) *
## 5) rumah=OWNED 2572 885 GOOD (0.34409020 0.65590980)
## 10) vehicle.loan>=0.5 779 281 BAD (0.63928113 0.36071887) *
## 11) vehicle.loan< 0.5 1793 387 GOOD (0.21583938 0.78416062) *
## 3) housing.loan< 0.5 3029 311 GOOD (0.10267415 0.89732585) *
Guna memudahkan melihat pohon klasifikasi yang terbentuk, kita dapat menggunakan fungsi rpart.plot() seperti di bawah ini.
library(rpart.plot)
rpart.plot(pohon, extra=4,box.palette="RdBu", shadow.col="gray", nn=TRUE)
Bagaimana kualitas prediksinya? Berikut ini adalah proses untuk menghasilkan beberapa ukuran kinerja berdasarkan prediksinya di data testing.
Beberapa ukuran yang dihasilkan adalah: Akurasi: 81.34% Sensitivity (BAD): 69.65% Specificity (GOOD): 87.31% AUC: 83.52%
#memprediksi data testing
prediksi <- predict(pohon, data.test)
head(prediksi, n=10)
## BAD GOOD
## 4 0.1026741 0.89732585
## 13 0.2158394 0.78416062
## 15 0.2158394 0.78416062
## 18 0.1026741 0.89732585
## 19 0.2158394 0.78416062
## 23 0.1026741 0.89732585
## 24 0.9409524 0.05904762
## 25 0.2158394 0.78416062
## 26 0.6392811 0.36071887
## 32 0.1026741 0.89732585
prediksi.status <- ifelse(prediksi[,2] > 0.5, "GOOD", "BAD")
#menghitung ukuran kinerja prediksi
confusionMatrix(as.factor(prediksi.status), as.factor(data.test$status))
## Confusion Matrix and Statistics
##
## Reference
## Prediction BAD GOOD
## BAD 748 267
## GOOD 326 1837
##
## Accuracy : 0.8134
## 95% CI : (0.7994, 0.8268)
## No Information Rate : 0.6621
## P-Value [Acc > NIR] : < 2e-16
##
## Kappa : 0.5773
##
## Mcnemar's Test P-Value : 0.01723
##
## Sensitivity : 0.6965
## Specificity : 0.8731
## Pos Pred Value : 0.7369
## Neg Pred Value : 0.8493
## Prevalence : 0.3379
## Detection Rate : 0.2354
## Detection Prevalence : 0.3194
## Balanced Accuracy : 0.7848
##
## 'Positive' Class : BAD
##
#menghitung ROC
library(ROCit)
ngitungROC <- rocit(score=prediksi[,2],class=data.test$status)
plot(ngitungROC)
AUC <- ngitungROC$AUC
AUC
## [1] 0.835294
Di bawah ini proses menjalankan algoritma Random Forest di R dan menghitung kinerja prediksinya, dan diperoleh Beberapa ukuran yang dihasilkan adalah: (hasilnya dapat berbeda karena proses random) Akurasi: 83.26% Sensitivity (BAD): 70.20% Specificity (GOOD): 89.92% AUC: 89.60%
library(randomForest)
## randomForest 4.6-14
## Type rfNews() to see new features/changes/bug fixes.
##
## Attaching package: 'randomForest'
## The following object is masked from 'package:ggplot2':
##
## margin
set.seed(100)
forest <- randomForest(data=data.train,
as.factor(status)~.,
ntree=500)
#memprediksi data testing
prediksi.f <- predict(forest, data.test, type="prob")
head(prediksi.f, n=10)
## BAD GOOD
## 4 0.016 0.984
## 13 0.044 0.956
## 15 0.364 0.636
## 18 0.042 0.958
## 19 0.118 0.882
## 23 0.048 0.952
## 24 0.926 0.074
## 25 0.150 0.850
## 26 0.140 0.860
## 32 0.166 0.834
prediksi.status.f <- ifelse(prediksi.f[,2] > 0.5, "GOOD", "BAD")
#menghitung ukuran kinerja prediksi
confusionMatrix(as.factor(prediksi.status.f), as.factor(data.test$status))
## Confusion Matrix and Statistics
##
## Reference
## Prediction BAD GOOD
## BAD 754 212
## GOOD 320 1892
##
## Accuracy : 0.8326
## 95% CI : (0.8192, 0.8454)
## No Information Rate : 0.6621
## P-Value [Acc > NIR] : < 2e-16
##
## Kappa : 0.6165
##
## Mcnemar's Test P-Value : 3.5e-06
##
## Sensitivity : 0.7020
## Specificity : 0.8992
## Pos Pred Value : 0.7805
## Neg Pred Value : 0.8553
## Prevalence : 0.3379
## Detection Rate : 0.2373
## Detection Prevalence : 0.3040
## Balanced Accuracy : 0.8006
##
## 'Positive' Class : BAD
##
#menghitung ROC
library(ROCit)
ngitungROC <- rocit(score=prediksi.f[,2],class=data.test$status)
plot(ngitungROC)
AUC <- ngitungROC$AUC
AUC
## [1] 0.896007