Pendahuluan

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).

Mengimport Data

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.

Melihat ukuran data dan nama-nama kolom di dalamnya

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.

Menampilkan banyaknya nasabah berdasarkan status kreditnya

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.

Melihat tingkat resiko per karakteristik nasabah

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

Membagi Data: Training - Testing

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

Menjalankan Algoritma Pohon Klasifikasi

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

Menampilkan Pohon Klasifikasi yang Dihasilkan

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) *

Visualisasi Bentuk Pohon Klasifikasi

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)

Mengukur Kinerja Prediksi

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

Random Forest

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