1 Kasus

Hingar bingar Pemilihan Umum (Pemilu) membuat para calon anggota legislatif (caleg) berlomba-lomba untuk melenggang ke gedung legislatif. Para caleg menargetkan jumlah suara tertentu dan berebut untuk mendapatkan nomor urut utama. Pada artikel ini akan dilakukan prediksi apakah seorang caleg itu akan berhasil menjadi anggota DPRD atau gagal.

1.1 Libraries and Setup

# chunk options
knitr::opts_chunk$set(
  message = FALSE,
  warning = FALSE,
  fig.align = "center",
  comment = "#>"
)

# scientific notation
options(scipen = 9999)
# import libs
library(dplyr) # for data wrangling
library(ggplot2) # to visualize data
library(gridExtra) # to display multiple graph
library(inspectdf) # for EDA
library(tidymodels) # to build tidy models
library(rpart)
library(caret) # to pre-process data

1.2 Decision Tree

Prediksi dilakukan dengan membuat decisiion tree. Variabel yang akan diprediksi adalah keberhasilan caleg lolos menjadi anggota DPRD. Data yang digunakan adalah dataset Pemilu DPRD Propinsi DKI tahun 2009. Variabel prediktor yang relevan yang akan digunakan antara lain jumlah suara dan nomor urut

1.3 Impor Dataset

Mengimpor dataset yang akan digunakan dan memberi nama variabel

pemilu <- read.csv("pemilu.csv")
names(pemilu) <- c("urut", "suara","terpilih")
pemilu
pemilu <- pemilu %>% 
  mutate(terpilih = factor(terpilih, levels = c(0,1), labels = c("Gagal", "Lolos"))) 

pemilu

1.4 Data Train vs Data Test

Untuk pembuatan model decision tree, data akan dibagi menjadi data train dan data test. Berikut adalah proses pembagian data.

RNGkind(sample.kind = "Rounding")
set.seed(100)

index <- sample(nrow(pemilu), nrow(pemilu) * 0.8)
data_train <- pemilu[index,]
data_test <- pemilu[-index,] 
prop.table(table(data_train$terpilih))
#> 
#>      Gagal      Lolos 
#> 0.96141125 0.03858875

2 Pembuatan Decision Tree

Kita akan membuat decision tree. Kita akan menggunakan data train untuk membuat model decision tree dan yang kemudian akan diuji dengan data test. Berikut adalah proses pembuatan model decision tree

pemilu_tree <- rpart(data=data_train,
               terpilih~.,
               control = rpart.control(cp=0, minsplit=25))

Guna memudahkan melihat pohon klasifikasi yang terbentuk, kita dapat menggunakan fungsi rpart.plot() dari library(rpart.plot) seperti hasil gambar decision tree di bawah ini.

library(rpart.plot)
rpart.plot(pemilu_tree, extra=4,box.palette="RdBu", shadow.col="gray", nn=TRUE)

Insight:

Dari grafik decision tree yang telah dihasilkan, seorang caleg akan berhasil menjadi anggota DPRD jika memiliki suara diatas 6319. Jika di bawah angka tersebut maka peluang gagal adalah 99%. Untuk suara di bawah 6319 masih memiliki peluang sangat sedikit menjadi anggota DPRD jika memiliki nomor urut lebih kecil dari 6. Jika nomer urut di atas 6, maka bisa dipastikan gagal menjadi anggota DPRD.

3 Pengujian Kinerja Model Decision Tree

Model decision tree yang akan dibuat, sangat perlu sekali untuk diuji kinerjanya. Berikut adalah pengujian kinerja model decision tree yang telah dibuat.

prediksi <- predict(pemilu_tree, data_test)
head(prediksi, n=10)
#>        Gagal       Lolos
#> 4  0.9970606 0.002939447
#> 10 0.9970606 0.002939447
#> 21 0.9970606 0.002939447
#> 22 0.9970606 0.002939447
#> 24 0.9970606 0.002939447
#> 27 0.9970606 0.002939447
#> 28 0.9970606 0.002939447
#> 38 0.9970606 0.002939447
#> 51 0.9970606 0.002939447
#> 52 0.9970606 0.002939447
prediksi.status <- ifelse(prediksi[,2] > 0.5, "Lolos", "Gagal")
head(prediksi.status) 
#>       4      10      21      22      24      27 
#> "Gagal" "Gagal" "Gagal" "Gagal" "Gagal" "Gagal"

3.1 Confusion Matrix

Berikut adalah salah satu cara pengujian kinerja dengan menggunakan confusion matrix:

confusionMatrix(as.factor(prediksi.status), as.factor(data_test$terpilih))
#> Confusion Matrix and Statistics
#> 
#>           Reference
#> Prediction Gagal Lolos
#>      Gagal   427     8
#>      Lolos     3    16
#>                                           
#>                Accuracy : 0.9758          
#>                  95% CI : (0.9571, 0.9878)
#>     No Information Rate : 0.9471          
#>     P-Value [Acc > NIR] : 0.002057        
#>                                           
#>                   Kappa : 0.7316          
#>                                           
#>  Mcnemar's Test P-Value : 0.227800        
#>                                           
#>             Sensitivity : 0.9930          
#>             Specificity : 0.6667          
#>          Pos Pred Value : 0.9816          
#>          Neg Pred Value : 0.8421          
#>              Prevalence : 0.9471          
#>          Detection Rate : 0.9405          
#>    Detection Prevalence : 0.9581          
#>       Balanced Accuracy : 0.8298          
#>                                           
#>        'Positive' Class : Gagal           
#> 

Dari hasil confusion matrix, nilai accuracy adalah 97,58%. Hasil ini sangat baik. Metode pengukuran kinerja lainnya adalah dengan ROC Curve

3.2 ROC Curve

Berikut adalah output ROC Curve yang telah dibuat.

library(ROCit)
NilaiROC <- rocit(score=prediksi[,2],class=data_test$terpilih)
plot(NilaiROC)

Kurva ROC yang telah dihasilkan, menunjukkan bahwa kurva ROC telah hampir menutupi daerah segitiga diagonal. Artinya model decision tree yang dibuat sudah cukup bagus untuk melakukan prediksi.

4 Kesimpulan

Model decision tree yang telah dibuat sudah cukup bagus kinerjanya untuk memprediksi kegagalan caleg menjadi anggota DPRD. Jika seorang caleg memiliki suara kurang dari 6319 suara, maka berpeluang besar akan gagal menjadi anggota DPRD. Nomer urut berpengaruh terhadap kegagalan caleg, namun tidak siginifikan. Akan tetapi seorang caleg yang meiliki nomer urut di atas 6, akan berpeluang besar untuk gagal.