Tutorial Lengkap (Step by Step) Supervised Learning: Decision Tree dengan R

Decision Tree dengan R

Halo teman-teman, jumpa lagi dengan blog sederhana ini. Pada pembahasan sebelumnya, kita telah berbagai mengenai cara mengunduh dan menginstal R serta R Studio, melakukan web scraping, serta melakukan peramalan pertumbuhan ekonomi Indonesia yang menurut sejumlah pakar ekonomi, ekonomi Indonesia dalam beberapa kuartal ke depan akan menemui berbagai tantangan, termasuk resesi global akibat krisis di sejumlah negara mitra dagang, terutama Amerika Serikat (AS).

Dalam unggahan kali ini, kita akan melangkah pada pembahasan mengenai machine learning lagi teman-teman. Adapun jenis model machine learning yang akan kita pelajari bersama ini berjenis supervised learning, karena data berlabel pada praktiknya nanti kita pakai dalam proses membuat model, alias kita pisahkan mana variabel dependen dan variabel independennya.

Dalam aktivitas sehari-hari, acapkali kita dihadapkan pada sebuah situasi di mana kita harus mengambil sebuah keputusan dari beberapa pilihan terbaik atau terburuk. Bila kita berada dalam atmosfer bisnis misalkan, kita bakal sering menghadapi beberapa pilihan berisiko dan kita harus sesegera mungkin mengambil keputusan atau kebijakan untuk mengatasi masalah. Teknik mengambil sebuah keputusan memang banyak jenisnya, namun terdapat sebuah model pengambilan keputusan yang mungkin bisa menjadi alternatif bagi kita saat ini, yaitu model Decision Tree atau Pohon Keputusan.

Seperti halnya sebuah pohon yang tumbuh menjulang ke atas dimulai dari akar hingga daun, Decision Tree ini juga sama persis dengan pohon tersebut, hanya saja bentuknya terbalik. Model Decision Tree merupakan sebuah "pohon keputusan" yang menjulur ke bawah, diawali dengan akar pada bagian atasnya, berlanjut pada cabang dan ranting-ranting keputusan atau yang biasa disebut lengan keputusan dan berakhir pada daun-daun keputusan yang bisa kita petik dan ambil sebagai kebijakan menyelesaikan masalah, menghindari masalah, atau meminimalkan risiko serta efisiensi biaya.

Adapun prinsip dasar Decision Tree ini merupakan model klasifisikasi yang menggunakan hubungan fungsional sebab-akibat atau regresi di dalamnya. Dengan prinsip tersebut, model Decision Tree dapat kita manfaatkan untuk memecahkan permasalah dengan klasifikasi maupun regresi. Sebelum lebih jauh, kita akan awali sebagaimana adat kita dalam blog ini, yaitu pendefinisiannya dulu.

Menurut Lestari (2019), Decision Tree merupakan suatu metode klasifikasi yang menggunakan struktur pohon, di mana setiap node menunjukkan atribut dan cabangnya menunjukkan nilai dari atribut tersebut, sedangkan daunnya menunjukkan kelas. Node paling atas dalam model ini diistilahkan sebagai akar (root). Menurut Gie (2021), Decision Tree merupakan alat pendukung yang mempunyai struktur seperti pohon untuk memodelkan kemungkinan hasil, biaya dari sumber daya, kebermanfaatan, serta beberapa kemungkinan risiko atau konsekuensi. Berdasarkan dua definisi tersebut kita dapat simpulkan bahwa Decision Tree merupakan salah satu alat analisis machine learning di era Data Science dan Big Data dengan pendekatan klasifikasi berstruktur pohon yang terdiri atas node sebagai atributnya, cabang sebagai nilai atributnya, dan daun-daun keputusan yang berkelas-kelas di dalamnya sebagai pendukung kemungkinan hasil, biaya atas sumber daya, kebermanfaatan, serta kemungkinan risiko dari permasalahan.

Dari sisi manfaat, Decision Tree ini kalau kita lakukan pencarian pada mesin pencari (search engine), kita akan banyak temui beragam manfaat penggunaannya. Beberapa di antaranya, Decision Tree dimanfaatkan untuk melakukan penilaian berpeluang atas pertumbuhan prospektif sebuah bisnis atau usaha dengan memakai data historis; model ini juga bisa kita gunakan untuk menganalisis segmentasi konsumen produk yang kita hasilkan dari bisnis atau usaha kita, termasuk melihat peluang pangsa pasar produk bisnis, dan segmentasi klien yang mungkin menjadi target pelayanan bisnis kita menggunakan data demografi; di bidang riset operasi (operation research), model ini juga bisa digunakan dalam perencanaan logistik serta strategi pemasaran produk dengan konstrain atau formulasi kendala tertentu sehingga mampu meminimalkan biaya, sumber daya, waktu, dan aspek lainnya; Decsion Tree juga bisa dimanfaatkan dalam pengambilan keputusan hukum suatu perkara dengan memanfaatkan data historis perkara yang ada; di bidang pendidikan, model ini bisa digunakan dalam perencanaan pembangunan pendidikan suatu wilayah; di bidang keuangan, model ini juga banyak dimanfaatkan untuk meminimalisir kredit macet perbankan dengan konstrain segmentasi calon klien berdasarkan pendapatan serta pekerjaannya; dan di bidang kesehatan, model ini dapat digunakan untuk pengujian efektivitas obat, vaksin, atau mendiagnosa sebuah penyakit.

Bagian-bagian Decision Tree

Berikutnya, kita lanjutkan pada bagian-bagian yang ada pada hasil pemodelan Decision Tree. Gambar di atas merupakan struktur yang saya rangkum dari berbagai sumber. Terlihat bahwa sebuah model Decision Tree terdiri atas beberapa node mulai dari node akar hingga daun. Di dalam sekumpulan node, terdapat node keputusan (decision node), yaitu sebuah node yang menjadi pilihan keputusan dari node sebelumnya. Node inilah yang kemudian menjadi acuan pengujian cabang berikutnya. Pada setiap node terdapat beberapa kelas yang merupakan variabel kategorik "Ya" dan "Tidak". Di bagian ujung bawah terdapat node-node yang merupakan sejumlah pilihan keputusan diistilahkan sebagai node daun. Node inilah yang kemudian disebut sebagai terminal keputusan. Dari sekumpulan node dalam sebuah Decision Tree, terdapat Sub-Tree yang merupakan miniatur lengkap dari keseluruhan Decision Tree. Sedangkan garis-garis yang menghubungkan antara node satu dan lainnya kita istilahkan sebagai lengan Tree.

Dalam penggunaannya, Decision Tree memperkenalkan istilah atribut pada proses pembuatan struktur pohon keputusannya. Penentuan atribut ini, kita perlu melakukan proses pemilihan sedemikian rupa sehingga diperoleh Decision Tree yang paling kecil ukurannya. Untuk menentukan atribut terbaik, kita perlu memilih atribut yang memiliki information Gain paling besar nilainya. Adapun rumus penghitungan information Gain dapat dituliskan sebagai berikut:

Beberapa formula dalam penentuan atribut Decision Tree

Berdasarkan rumus tersebut, dalam memahami Decision Tree kita akan mengenal beberapa istilah, yaitu information Gain sendiri dan Entropi. Information Gain sendiri merupakan selisih antara informasi yang diharapkan dikurangi dengan Entropi dari informasi. Konsep Entropi biasanya kita kenal dalam ilmu Fisika, tetapi seiring berkembangan ilmu pengetahuan, konsep Entropi juga dikembangkan dalam bidang matematika informasi. Entropi dalam bidang matematika informasi dikenalkan pertama kali oleh Claude Shannon pada tahun 1948. Dalam pengertiannya, Entropi informasi menunjukkan seberapa besar peluang ketidakpastian sebuah kejadian benar-benar terjadi. Secara umum, Entropi sendiri dirumuskan I(x) = -log P(x). Bila nilai I = 0, maka tidak ada ketidakpastian, atau ketidakpastiannya sama dengan 0, misalkan pada kejadian "hari ini matahari terbit arah timur". Bila nilai I = tak hingga, maka sangat tidak pasti atau ketidakpastiannya tidak terhingga, misalkan pada kondisi "hari ini hujan berlian". Dari pengertian sederhana tersebut, kita dapat menarik kesimpulan, semakin tinggi nilai Entropi maka ketidakpastiannya semakin besar, demikian sebaliknya.

Apa kaitannya dengan Decision Tree yang kita bahas? Misalkan kita disuruh menebak nama benda dalam sebuah kotak tertutup, tentu keputusan kita dalam menebak sangat dipengaruhi oleh banyaknya informasi yang kita peroleh. Semakin banyak informasi yang kita dapatkan (dalam Decision Tree ditunjukkan oleh node daun), maka semakin besar pula ketidakpastian tebakan kita mengenai benda di dalam kotak itu. Karena semakin banyak informasi, banyak ketidakpastian yang timbul bahkan membuat kita bingung dalam menebak benda dalam kotak. Sebaliknya, bila informasi yang kita peroleh tidak banyak pilihannya (sedikit), maka derajat ketidakpastian akan rendah sehingga kita lebih mudah dalam menebak benda dalam kotak. Inilah filosofi mengapa di dalam Decision Tree, tujuan kita adalah memilih atribut yang mampu membuat struktur Decision Tree dengan ukuran seminimal mungkin.

Untuk lebih memahami pembentukan atribut dan Decision Tree, kita bisa mencoba melakukan penghitungan secara manual terlebih dahulu berdasarkan Pak Rahmadya dari Nusa Putra University berikut:

Baik, itu sekilas mengenai konsep atau teori mengenai Decision Tree teman-teman. Pada tahapan akhir, kita akan coba mempraktikkan bagaimana cara memodelkan Decision Tree sebagai salah satu jenis machine learning supervised. Pada praktik kali ini, kita akan menggunakan data dummy yang telah saya siapkan, teman-teman dapat mengunduhnya terlebih dahulu pada tautan berikut. Dengan pemodelan Decision Tree ini kita akan mengidentifikasi variabel apa saja yang menjadi penentu seseorang dalam membeli komputer. Adapun data demografi yang kita gunakan meliputi umur, pendapatan, statusnya sebagai murid atau tidak, serta rating kredit historisnya.

Dari hasil penelusuran saya, kebanyakan praktik Decision Tree dilakukan dengan mengkonversi variabel kategorik menjadi numerik dengan variabel dependennya adalah variabel kategorik. Tetapi, kali ini kita akan menggunakan variabel-variabel yang murni kategorik semua.

#Import Data
library(readxl)
data <- read_excel("datareal.xlsx")
data
## # A tibble: 14 x 5
##    umur  pendapatan status_murid rating_kredit beli_komputer
##    <chr> <chr>      <chr>        <chr>         <chr>        
##  1 <=30  Tinggi     Tidak        Sedang        Tidak        
##  2 <=30  Tinggi     Tidak        Baik          Tidak        
##  3 31-40 Tinggi     Tidak        Sedang        Ya           
##  4 >40   Sedang     Tidak        Sedang        Ya           
##  5 >40   Rendah     Ya           Sedang        Ya           
##  6 >40   Rendah     Ya           Baik          Tidak        
##  7 31-40 Rendah     Ya           Baik          Ya           
##  8 <=30  Sedang     Tidak        Sedang        Tidak        
##  9 <=30  Rendah     Ya           Sedang        Ya           
## 10 >40   Sedang     Ya           Sedang        Ya           
## 11 <=30  Sedang     Ya           Baik          Ya           
## 12 31-40 Sedang     Tidak        Baik          Ya           
## 13 31-40 Tinggi     Ya           Sedang        Ya           
## 14 >40   Sedang     Tidak        Baik          Tidak
#Struktur Data
str(data)
## tibble [14 x 5] (S3: tbl_df/tbl/data.frame)
##  $ umur         : chr [1:14] "<=30" "<=30" "31-40" ">40" ...
##  $ pendapatan   : chr [1:14] "Tinggi" "Tinggi" "Tinggi" "Sedang" ...
##  $ status_murid : chr [1:14] "Tidak" "Tidak" "Tidak" "Tidak" ...
##  $ rating_kredit: chr [1:14] "Sedang" "Baik" "Sedang" "Sedang" ...
##  $ beli_komputer: chr [1:14] "Tidak" "Tidak" "Ya" "Ya" ...
#Mengubah Tipe Data
data$umur <- as.factor(data$umur)
data$pendapatan <- as.factor(data$pendapatan)
data$status_murid <- as.factor(data$status_murid)
data$rating_kredit <- as.factor(data$rating_kredit)
data$beli_komputer <- as.factor(data$beli_komputer)
#Struktur Data
str(data)
## tibble [14 x 5] (S3: tbl_df/tbl/data.frame)
##  $ umur         : Factor w/ 3 levels "<=30",">40","31-40": 1 1 3 2 2 2 3 1 1 2 ...
##  $ pendapatan   : Factor w/ 3 levels "Rendah","Sedang",..: 3 3 3 2 1 1 1 2 1 2 ...
##  $ status_murid : Factor w/ 2 levels "Tidak","Ya": 1 1 1 1 2 2 2 1 2 2 ...
##  $ rating_kredit: Factor w/ 2 levels "Baik","Sedang": 2 1 2 2 2 1 1 2 2 2 ...
##  $ beli_komputer: Factor w/ 2 levels "Tidak","Ya": 1 1 2 2 2 1 2 1 2 2 ...
#Partisi Data
library(caret)
inTrain <- createDataPartition(y = data$beli_komputer, p = 0.75, list = F)
train <- data[inTrain,]
test <- data[-inTrain,]
dim(train)
## [1] 11  5
dim(test)
## [1] 3 5
#Attach Data
attach(train)
attach(test)
#Model Decision Tree
library(rpart)
dtku <- rpart(beli_komputer ~ umur + pendapatan + status_murid + rating_kredit, data = train,
              method = "class", minsplit = 1, minbucket = 1)
#bila regression tree methodnya "class", jika classification tree methodnya "anova" 
#Ringkasan Model
summary(dtku)
## Call:
## rpart(formula = beli_komputer ~ umur + pendapatan + status_murid + 
##     rating_kredit, data = train, method = "class", minsplit = 1, 
##     minbucket = 1)
##   n= 11 
## 
##      CP nsplit rel error xerror      xstd
## 1 0.375      0      1.00    1.0 0.3988620
## 2 0.125      2      0.25    1.5 0.4128614
## 3 0.010      4      0.00    1.5 0.4128614
## 
## Variable importance
## rating_kredit    pendapatan          umur 
##            41            31            29 
## 
## Node number 1: 11 observations,    complexity param=0.375
##   predicted class=Ya     expected loss=0.3636364  P(node) =1
##     class counts:     4     7
##    probabilities: 0.364 0.636 
##   left son=2 (8 obs) right son=3 (3 obs)
##   Primary splits:
##       umur          splits as  LLR, improve=1.0909090, (0 missing)
##       status_murid  splits as  LR,  improve=1.0242420, (0 missing)
##       rating_kredit splits as  LR,  improve=1.0242420, (0 missing)
##       pendapatan    splits as  RLL, improve=0.1623377, (0 missing)
## 
## Node number 2: 8 observations,    complexity param=0.375
##   predicted class=Tidak  expected loss=0.5  P(node) =0.7272727
##     class counts:     4     4
##    probabilities: 0.500 0.500 
##   left son=4 (3 obs) right son=5 (5 obs)
##   Primary splits:
##       rating_kredit splits as  LR,  improve=2.4000000, (0 missing)
##       status_murid  splits as  LR,  improve=1.0000000, (0 missing)
##       pendapatan    splits as  RRL, improve=0.5714286, (0 missing)
##       umur          splits as  LR-, improve=0.2666667, (0 missing)
##   Surrogate splits:
##       pendapatan splits as  RRL, agree=0.75, adj=0.333, (0 split)
## 
## Node number 3: 3 observations
##   predicted class=Ya     expected loss=0  P(node) =0.2727273
##     class counts:     0     3
##    probabilities: 0.000 1.000 
## 
## Node number 4: 3 observations
##   predicted class=Tidak  expected loss=0  P(node) =0.2727273
##     class counts:     3     0
##    probabilities: 1.000 0.000 
## 
## Node number 5: 5 observations,    complexity param=0.125
##   predicted class=Ya     expected loss=0.2  P(node) =0.4545455
##     class counts:     1     4
##    probabilities: 0.200 0.800 
##   left son=10 (2 obs) right son=11 (3 obs)
##   Primary splits:
##       umur         splits as  LR-, improve=0.6000000, (0 missing)
##       status_murid splits as  LR,  improve=0.6000000, (0 missing)
##       pendapatan   splits as  RL-, improve=0.2666667, (0 missing)
## 
## Node number 10: 2 observations,    complexity param=0.125
##   predicted class=Tidak  expected loss=0.5  P(node) =0.1818182
##     class counts:     1     1
##    probabilities: 0.500 0.500 
##   left son=20 (1 obs) right son=21 (1 obs)
##   Primary splits:
##       pendapatan   splits as  RL-, improve=1, (0 missing)
##       status_murid splits as  LR,  improve=1, (0 missing)
## 
## Node number 11: 3 observations
##   predicted class=Ya     expected loss=0  P(node) =0.2727273
##     class counts:     0     3
##    probabilities: 0.000 1.000 
## 
## Node number 20: 1 observations
##   predicted class=Tidak  expected loss=0  P(node) =0.09090909
##     class counts:     1     0
##    probabilities: 1.000 0.000 
## 
## Node number 21: 1 observations
##   predicted class=Ya     expected loss=0  P(node) =0.09090909
##     class counts:     0     1
##    probabilities: 0.000 1.000
#Visualisasi Decision Tree
library(rpart.plot)
rpart.plot(dtku)
plot of chunk unnamed-chunk-20
Visualisasi Decision Tree dengan R

#Prediksi dari Model Train
predtrain <- predict(dtku, train, type = "class")
predtrain
##     1     2     3     4     5     6     7     8     9    10    11 
## Tidak    Ya    Ya Tidak    Ya Tidak    Ya    Ya    Ya    Ya Tidak 
## Levels: Tidak Ya
#Akurasi Prediksi
confusionMatrix(predtrain, train$beli_komputer, mode = "everything")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction Tidak Ya
##      Tidak     4  0
##      Ya        0  7
##                                      
##                Accuracy : 1          
##                  95% CI : (0.7151, 1)
##     No Information Rate : 0.6364     
##     P-Value [Acc > NIR] : 0.00693    
##                                      
##                   Kappa : 1          
##                                      
##  Mcnemar's Test P-Value : NA         
##                                      
##             Sensitivity : 1.0000     
##             Specificity : 1.0000     
##          Pos Pred Value : 1.0000     
##          Neg Pred Value : 1.0000     
##               Precision : 1.0000     
##                  Recall : 1.0000     
##                      F1 : 1.0000     
##              Prevalence : 0.3636     
##          Detection Rate : 0.3636     
##    Detection Prevalence : 0.3636     
##       Balanced Accuracy : 1.0000     
##                                      
##        'Positive' Class : Tidak      
## 
#Prediksi dengan Test
predtest <- predict(dtku, test, type = "class")
predtest
##     1     2     3 
## Tidak    Ya Tidak 
## Levels: Tidak Ya
#Confusion Matriks Test
confusionMatrix(predtest, test$beli_komputer, mode = "everything")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction Tidak Ya
##      Tidak     1  1
##      Ya        0  1
##                                           
##                Accuracy : 0.6667          
##                  95% CI : (0.0943, 0.9916)
##     No Information Rate : 0.6667          
##     P-Value [Acc > NIR] : 0.7407          
##                                           
##                   Kappa : 0.4             
##                                           
##  Mcnemar's Test P-Value : 1.0000          
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.5000          
##          Pos Pred Value : 0.5000          
##          Neg Pred Value : 1.0000          
##               Precision : 0.5000          
##                  Recall : 1.0000          
##                      F1 : 0.6667          
##              Prevalence : 0.3333          
##          Detection Rate : 0.3333          
##    Detection Prevalence : 0.6667          
##       Balanced Accuracy : 0.7500          
##                                           
##        'Positive' Class : Tidak           
## 

Dari hasil pemodelan, terlihat bahwa rating kredit, pendapatan, dan umur merupakan variabel penentu seseorang membeli komputer (lihat pada bagian Variable Important). Akurasi pada menggunakan data training kita sebesar 1, artinya akurasi model Decision Tree yang terbentuk 100 persen mampu mengklasifikasikan data dengan benar (lihat Confusion Matrix Statistics bagian train). Sedangkan akurasi dengan data testing adalah sebesar 0,6667. Artinya, kemampuan model yang kita bangun mampu mengklasifikasikan data dengan benar sebesar 66,67 persen. Kendati demikian, nilai recall bain training dan testing 100 persen, artinya model yang terbentuk mampu mengklasifikasikan data dengan baik alias kelasnya tidak terbalik.

Berdasarkan visualisasi Decision Tree, kita dapat interpretasikan bahwa dari seluruh responden (100 persen) yang berumur kurang dari atau sama dengan 30 tahun dan lebih dari 40 tahun yang berpeluang membeli komputer sebesar 0,64. Dari seluruh responden yang bukan berumur kurang dari atau sama dengan 30 tahun dan lebih dari 40 tahun tersebut, seluruhnya berpeluang membeli komputer. Sebanyak 73 persen responden berumur kurang dari atau sama dengan 30 tahun dan lebih dari 40 tahun berpeluang membeli komputer sebesar 0,5. Dari 73 persen responden berumur kurang dari atau sama dengan 30 tahun dan lebih dari 40 tahun, bila rating kreditnya baik, 45 persennya akan membeli komputer dengan peluang sebesar 0,80. Dari 45 persen responden berumur kurang dari atau sama dengan 30 tahun dan lebih dari 40 tahun, bila umurnya ternyata kurang dari atau sama dengan 30 tahun, 27 persennya pasti membeli komputer semua atau dengan peluang 1,00.

Demikian sedikit sharing kita tentang machine learning jenis supervised learning: Decision Tree menggunakan R. Selamat memahami dan mempratikkan!

Add Comments


EmoticonEmoticon