Syntax berikut ini merupakan bagian dari tugas akhir mata kuliah pemodelan klasifikasi, laporan tugas ini dapat dilihat pada link:

https://drive.google.com/file/d/10g0S8brXhjhCV-WBXCYz_cgcjYCSP-qc/view?usp=share_link

Install Packages

#install.packages( "C:/Users/Asus/Downloads/DMwR_0.4.1.tar.gz", repos=NULL, type="source" )

#install.packages("rJava")

#install.packages( "C:/Users/Asus/Downloads/extraTrees_1.0.5.tar.gz", repos=NULL, type="source" )

#install.packages("writexl")

#install.packages("remotes")
#remotes::install_github("mananshah99/xlsxboost")

#install.packages("openxlsx")

Loading Packages

library(dplyr) #glimpse
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidymodels) #splitting
## -- Attaching packages -------------------------------------- tidymodels 1.0.0 --
## v broom        1.0.0     v rsample      1.1.0
## v dials        1.0.0     v tibble       3.1.8
## v ggplot2      3.4.0     v tidyr        1.2.0
## v infer        1.0.3     v tune         1.0.0
## v modeldata    1.0.0     v workflows    1.0.0
## v parsnip      1.0.1     v workflowsets 1.0.0
## v purrr        0.3.4     v yardstick    1.0.0
## v recipes      1.0.1
## -- Conflicts ----------------------------------------- tidymodels_conflicts() --
## x purrr::discard() masks scales::discard()
## x dplyr::filter()  masks stats::filter()
## x dplyr::lag()     masks stats::lag()
## x recipes::step()  masks stats::step()
## * Use suppressPackageStartupMessages() to eliminate package startup messages
library(MASS) 
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
library(rcompanion) #cramer
## 
## Attaching package: 'rcompanion'
## The following object is masked from 'package:yardstick':
## 
##     accuracy
library(caret) #data imbalanced
## Loading required package: lattice
## 
## Attaching package: 'caret'
## The following objects are masked from 'package:yardstick':
## 
##     precision, recall, sensitivity, specificity
## The following object is masked from 'package:purrr':
## 
##     lift
library(DMwR) #smote
## Loading required package: grid
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
## 
## Attaching package: 'DMwR'
## The following object is masked from 'package:broom':
## 
##     bootstrap
library(rJava)
library(extraTrees)
library("writexl")
library(openxlsx)
library("xlsx")
## 
## Attaching package: 'xlsx'
## The following objects are masked from 'package:openxlsx':
## 
##     createWorkbook, loadWorkbook, read.xlsx, saveWorkbook, write.xlsx
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.2 --
## v readr   2.1.2     v forcats 0.5.1
## v stringr 1.4.0     
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x DMwR::bootstrap()   masks broom::bootstrap()
## x readr::col_factor() masks scales::col_factor()
## x purrr::discard()    masks scales::discard()
## x dplyr::filter()     masks stats::filter()
## x stringr::fixed()    masks recipes::fixed()
## x dplyr::lag()        masks stats::lag()
## x caret::lift()       masks purrr::lift()
## x MASS::select()      masks dplyr::select()
## x readr::spec()       masks yardstick::spec()
library(tidymodels)
library(themis)
library(embed)
library(DataExplorer)
library(ggpubr)
#library(DALEXtra)

Data

data_TA <- read.csv("D:/Download_14Des/Tugas Akhir -- data soal.xlsx - FIES_JabarMaret2020 (1).csv", header=TRUE, stringsAsFactors = TRUE)
data_TA <- data_TA[,-1]
glimpse(data_TA)
## Rows: 19,902
## Columns: 25
## $ Status_Rawan                  <fct> Tidak_Rawan, Tidak_Rawan, Tidak_Rawan, R~
## $ Pendidikan_KRT                <fct> SD, Perguruan Tinggi, SD, SMP, SMA, SMP,~
## $ KRT_Rawan                     <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Jumlah_Penabung               <int> 2, 3, 0, 1, 3, 2, 1, 4, 3, 3, 3, 3, 5, 1~
## $ Jumlah_Buta_Huruf             <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0~
## $ Penerima_Transfer             <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Aset_Tanah                    <fct> Ya, Ya, Ya, Tidak, Tidak, Ya, Ya, Ya, Ya~
## $ Akses_Internet                <fct> Ya, Ya, Tidak, Ya, Ya, Ya, Tidak, Ya, Ya~
## $ Sakit_Namun_Tidak_Rawat_Jalan <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ PKH                           <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ KKS                           <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ BPNT                          <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Bantuan_Pemda                 <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ BPJS                          <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Jamkesda                      <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ KIP_PIP                       <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Jenis_Atap                    <fct> Genteng, Genteng, Genteng, Asbes, Genten~
## $ Jenis_Lantai                  <fct> Marmer/Keramik, Marmer/Keramik, Marmer/K~
## $ Jenis_Dinding                 <fct> Tembok/Plesteran/anyaman, Tembok/Plester~
## $ Luas_Lantai                   <int> 60, 170, 54, 54, 72, 60, 73, 70, 60, 60,~
## $ Listrik                       <fct> Listrik, Listrik, Listrik, Listrik, List~
## $ Bahan_Bakar_Masak             <fct> LPG 3Kg, LPG 3Kg, LPG 3Kg, LPG 3Kg, LPG ~
## $ Sumber_Air_Minum              <fct> Lainnya, Air kemasan/isi Ulang, Lainnya,~
## $ Air_Minum_Layak               <fct> Tidak, Tidak, Tidak, Tidak, Ya, Tidak, T~
## $ Sanitasi_Layak                <fct> Ya, Ya, Tidak, Ya, Tidak, Ya, Tidak, Ya,~

Data Preprocessing

row = nrow(data_TA)

for (i in 1:row){
  if(data_TA[i,5]==0){
    data_TA[i,5]="Tidak ada"
  }
  else{
    data_TA[i,5]="Ada"
  }
}
data_TA <- data_TA %>% mutate(
               Pendidikan_KRT = factor(Pendidikan_KRT, ordered = TRUE, 
                              levels = c("Tidak Sekolah", 
                                         "Tidak Tamat SD", 
                                         "SD", 
                                         "SMP", 
                                         "SMA",
                                         "Perguruan Tinggi")),
               Jenis_Atap = factor(Jenis_Atap, ordered = TRUE, 
                              levels = c("Asbes", 
                                         "Seng", 
                                         "Beton", 
                                         "Genteng", 
                                         "Lainnya")),
               Jenis_Lantai = factor(Jenis_Lantai, ordered = TRUE, 
                              levels = c("Ubin/tegel/teraso", 
                                         "Semen/bata merah", 
                                         "Parket/vinil/karpet", 
                                         "Marmer/Keramik", 
                                         "Lainnya")),
               Jenis_Dinding = factor(Jenis_Dinding, ordered = TRUE, 
                              levels = c("Kayu/Papan", 
                                         "Tembok/Plesteran/anyaman",
                                         "Lainnya")),
               Listrik = factor(Listrik, ordered = TRUE, 
                              levels = c("Non Listrik",
                                         "Listrik")),
               Bahan_Bakar_Masak = factor(Bahan_Bakar_Masak, ordered = TRUE, 
                              levels = c("Tidak Memasak", 
                                         "Kayu Bakar",
                                         "Minyak tanah",
                                         "LPG 3Kg",
                                         "LPG 12kg/5.5kg/Bluegaz",
                                         "Lainnya")),
               Sumber_Air_Minum = factor(Sumber_Air_Minum, ordered = TRUE, 
                              levels = c("Sumur bor/pompa", 
                                         "Leding",
                                         "Air kemasan/isi Ulang",
                                         "Lainnya")),
               Jumlah_Buta_Huruf = factor(Jumlah_Buta_Huruf)
               )
summary(data_TA)
##       Status_Rawan            Pendidikan_KRT KRT_Rawan     Jumlah_Penabung
##  Rawan      : 4322   Tidak Sekolah   : 467   Tidak:18924   Min.   :0.000  
##  Tidak_Rawan:15580   Tidak Tamat SD  :2616   Ya   :  978   1st Qu.:0.000  
##                      SD              :7246                 Median :1.000  
##                      SMP             :2819                 Mean   :1.065  
##                      SMA             :5051                 3rd Qu.:2.000  
##                      Perguruan Tinggi:1703                 Max.   :9.000  
##  Jumlah_Buta_Huruf Penerima_Transfer Aset_Tanah    Akses_Internet
##  Ada      :  576   Tidak:18346       Tidak: 6203   Tidak: 8623   
##  Tidak ada:19326   Ya   : 1556       Ya   :13699   Ya   :11279   
##                                                                  
##                                                                  
##                                                                  
##                                                                  
##  Sakit_Namun_Tidak_Rawat_Jalan    PKH           KKS           BPNT      
##  Tidak:19858                   Tidak:17570   Tidak:18267   Tidak:16857  
##  Ya   :   44                   Ya   : 2332   Ya   : 1635   Ya   : 3045  
##                                                                         
##                                                                         
##                                                                         
##                                                                         
##  Bantuan_Pemda    BPJS        Jamkesda      KIP_PIP        Jenis_Atap   
##  Tidak:19309   Tidak:13650   Tidak:18419   Tidak:19316   Asbes  : 1946  
##  Ya   :  593   Ya   : 6252   Ya   : 1483   Ya   :  586   Seng   :  173  
##                                                          Beton  :  523  
##                                                          Genteng:16920  
##                                                          Lainnya:  340  
##                                                                         
##               Jenis_Lantai                    Jenis_Dinding    Luas_Lantai   
##  Ubin/tegel/teraso  : 1658   Kayu/Papan              :  741   Min.   :  3.0  
##  Semen/bata merah   : 1005   Tembok/Plesteran/anyaman:17611   1st Qu.: 42.0  
##  Parket/vinil/karpet:   85   Lainnya                 : 1550   Median : 60.0  
##  Marmer/Keramik     :14860                                    Mean   : 72.1  
##  Lainnya            : 2294                                    3rd Qu.: 90.0  
##                                                               Max.   :500.0  
##         Listrik                   Bahan_Bakar_Masak
##  Non Listrik:   13   Tidak Memasak         :  323  
##  Listrik    :19889   Kayu Bakar            : 1836  
##                      Minyak tanah          :   40  
##                      LPG 3Kg               :16250  
##                      LPG 12kg/5.5kg/Bluegaz: 1066  
##                      Lainnya               :  387  
##               Sumber_Air_Minum Air_Minum_Layak Sanitasi_Layak
##  Sumur bor/pompa      :4444    Tidak:13691     Tidak: 6198   
##  Leding               :1474    Ya   : 6211     Ya   :13704   
##  Air kemasan/isi Ulang:8768                                  
##  Lainnya              :5216                                  
##                                                              
## 

Eksplorasi Data

ggplot(data = data_TA, aes(fill = Status_Rawan))+
  geom_bar(aes(x = Status_Rawan))+
  xlab("")+
  ylab("Rumah Tangga")+
  scale_y_continuous(expand = c(0,0))+
  scale_x_discrete(expand = c(0,0))+
  theme(legend.position = "none", 
        legend.title = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.background = element_blank())

ggplot(data_TA,aes(x=Pendidikan_KRT,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## i Please use `after_stat(count)` instead.

ggplot(data_TA,aes(x=KRT_Rawan,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=Jumlah_Buta_Huruf,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=Penerima_Transfer,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=Aset_Tanah,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=Akses_Internet,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=Sakit_Namun_Tidak_Rawat_Jalan,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=PKH,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=KKS,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=BPNT,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=Bantuan_Pemda,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=BPJS,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=Jamkesda,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=KIP_PIP,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=Jenis_Atap,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=Jenis_Lantai,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=Jenis_Dinding,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=Listrik,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=Bahan_Bakar_Masak,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=Sumber_Air_Minum,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=Air_Minum_Layak,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

ggplot(data_TA,aes(x=Sanitasi_Layak,fill=Status_Rawan))+
    geom_bar(position="fill")+
    geom_text(aes(label=scales::percent(..count../sum(..count..))),
              stat='count',position=position_fill(vjust=0.5))

Splitting Data

set.seed(012)
holdout_split <- initial_split(data_TA, prop= 0.7)
train_TA <- training(holdout_split)
test_TA <- testing(holdout_split)
train_TA %>% count(Status_Rawan)
##   Status_Rawan     n
## 1        Rawan  3051
## 2  Tidak_Rawan 10880
test_TA %>% count(Status_Rawan)
##   Status_Rawan    n
## 1        Rawan 1271
## 2  Tidak_Rawan 4700

Uji Korelasi

Cramer’s V (nominal)

thislist <- list()
kolom <- c(3,5:16,24:25)
k = 1

for(i in kolom){
  thislist <- append(thislist,cramerV(train_TA[,1], train_TA[,i], bias.correct = FALSE)[[1]])
  names(thislist)[[k]] <- names(data_TA)[i]
  
  k = k+1
}

thislist
## $KRT_Rawan
## [1] 0.04758
## 
## $Jumlah_Buta_Huruf
## [1] 0.05757
## 
## $Penerima_Transfer
## [1] 0.06831
## 
## $Aset_Tanah
## [1] 0.08731
## 
## $Akses_Internet
## [1] 0.1412
## 
## $Sakit_Namun_Tidak_Rawat_Jalan
## [1] 0.03981
## 
## $PKH
## [1] 0.1148
## 
## $KKS
## [1] 0.1042
## 
## $BPNT
## [1] 0.1354
## 
## $Bantuan_Pemda
## [1] 0.02411
## 
## $BPJS
## [1] 0.1405
## 
## $Jamkesda
## [1] 0.007726
## 
## $KIP_PIP
## [1] 0.0613
## 
## $Air_Minum_Layak
## [1] 0.001403
## 
## $Sanitasi_Layak
## [1] 0.08433

Kendall (ordinal)

thislist_2 <- list()
kolom_2 <- c(2,17:19,21:23)
k = 1

for(i in kolom_2){
  thislist_2 <- append(thislist_2,cor.test(as.numeric(train_TA[,1]), as.numeric(train_TA[,i]),method="kendall")$estimate[[1]])
  names(thislist_2)[[k]] <- names(data_TA)[i]
  
  k = k+1
}

thislist_2
## $Pendidikan_KRT
## [1] 0.1741626
## 
## $Jenis_Atap
## [1] -0.00226241
## 
## $Jenis_Lantai
## [1] -0.01950819
## 
## $Jenis_Dinding
## [1] -0.05673541
## 
## $Listrik
## [1] 0.02069015
## 
## $Bahan_Bakar_Masak
## [1] 0.1362149
## 
## $Sumber_Air_Minum
## [1] -0.05465374

Buang 5 peubah penjelas yang asosiasinya lemah, yaitu 1. kepemilikan jamkesda (15) 2. air minum layak (24) 3. jenis atap (17) 4. jenis lantai (18) 5. sumber penerangan rumah (21)

train_TA <- train_TA[,-c(15,17,18,21,24)]
glimpse(train_TA)
## Rows: 13,931
## Columns: 20
## $ Status_Rawan                  <fct> Tidak_Rawan, Tidak_Rawan, Tidak_Rawan, T~
## $ Pendidikan_KRT                <ord> SMP, Tidak Tamat SD, SMA, Tidak Tamat SD~
## $ KRT_Rawan                     <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Jumlah_Penabung               <int> 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 2, 3, 1~
## $ Jumlah_Buta_Huruf             <fct> Tidak ada, Tidak ada, Tidak ada, Tidak a~
## $ Penerima_Transfer             <fct> Tidak, Ya, Tidak, Tidak, Tidak, Tidak, T~
## $ Aset_Tanah                    <fct> Tidak, Ya, Ya, Ya, Tidak, Tidak, Ya, Ya,~
## $ Akses_Internet                <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Ya, T~
## $ Sakit_Namun_Tidak_Rawat_Jalan <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ PKH                           <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ KKS                           <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ BPNT                          <fct> Tidak, Tidak, Tidak, Ya, Tidak, Tidak, T~
## $ Bantuan_Pemda                 <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ BPJS                          <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ KIP_PIP                       <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Jenis_Dinding                 <ord> Tembok/Plesteran/anyaman, Tembok/Plester~
## $ Luas_Lantai                   <int> 40, 25, 137, 50, 35, 30, 42, 25, 98, 42,~
## $ Bahan_Bakar_Masak             <ord> LPG 3Kg, Tidak Memasak, LPG 12kg/5.5kg/B~
## $ Sumber_Air_Minum              <ord> Air kemasan/isi Ulang, Lainnya, Sumur bo~
## $ Sanitasi_Layak                <fct> Tidak, Ya, Ya, Tidak, Ya, Ya, Ya, Tidak,~
test_TA <- test_TA[,-c(15,17,18,21,24)]
glimpse(test_TA)
## Rows: 5,971
## Columns: 20
## $ Status_Rawan                  <fct> Tidak_Rawan, Rawan, Tidak_Rawan, Tidak_R~
## $ Pendidikan_KRT                <ord> Perguruan Tinggi, Tidak Tamat SD, SMA, S~
## $ KRT_Rawan                     <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Jumlah_Penabung               <int> 3, 1, 5, 2, 4, 0, 2, 2, 1, 2, 2, 4, 2, 4~
## $ Jumlah_Buta_Huruf             <fct> Tidak ada, Tidak ada, Tidak ada, Tidak a~
## $ Penerima_Transfer             <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Aset_Tanah                    <fct> Ya, Ya, Ya, Tidak, Ya, Tidak, Ya, Tidak,~
## $ Akses_Internet                <fct> Ya, Tidak, Ya, Ya, Ya, Ya, Ya, Ya, Tidak~
## $ Sakit_Namun_Tidak_Rawat_Jalan <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ PKH                           <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ KKS                           <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ BPNT                          <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Bantuan_Pemda                 <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ BPJS                          <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Ya, T~
## $ KIP_PIP                       <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Jenis_Dinding                 <ord> Tembok/Plesteran/anyaman, Tembok/Plester~
## $ Luas_Lantai                   <int> 170, 73, 60, 60, 60, 42, 84, 90, 140, 90~
## $ Bahan_Bakar_Masak             <ord> LPG 3Kg, LPG 3Kg, LPG 3Kg, LPG 3Kg, LPG ~
## $ Sumber_Air_Minum              <ord> Air kemasan/isi Ulang, Lainnya, Air kema~
## $ Sanitasi_Layak                <fct> Ya, Tidak, Ya, Ya, Ya, Ya, Ya, Ya, Ya, Y~

Imbalanced Data

Random Undersampling

set.seed(012)
down_train <- downSample(x = train_TA[, -1],y 
= train_TA$Status_Rawan)

colnames(down_train)[colnames(down_train)=="Class"] = "Status_Rawan"

glimpse(down_train) 
## Rows: 6,102
## Columns: 20
## $ Pendidikan_KRT                <ord> SMP, Tidak Tamat SD, SMP, SD, Tidak Seko~
## $ KRT_Rawan                     <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Jumlah_Penabung               <int> 0, 0, 0, 0, 0, 2, 2, 0, 0, 1, 1, 0, 0, 0~
## $ Jumlah_Buta_Huruf             <fct> Tidak ada, Ada, Tidak ada, Tidak ada, Ti~
## $ Penerima_Transfer             <fct> Tidak, Tidak, Tidak, Ya, Ya, Tidak, Tida~
## $ Aset_Tanah                    <fct> Ya, Tidak, Tidak, Ya, Ya, Tidak, Ya, Ya,~
## $ Akses_Internet                <fct> Ya, Tidak, Ya, Tidak, Tidak, Ya, Tidak, ~
## $ Sakit_Namun_Tidak_Rawat_Jalan <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ PKH                           <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ KKS                           <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ BPNT                          <fct> Ya, Ya, Tidak, Tidak, Tidak, Tidak, Tida~
## $ Bantuan_Pemda                 <fct> Tidak, Ya, Tidak, Tidak, Tidak, Tidak, T~
## $ BPJS                          <fct> Ya, Tidak, Ya, Tidak, Tidak, Tidak, Ya, ~
## $ KIP_PIP                       <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Jenis_Dinding                 <ord> Lainnya, Lainnya, Tembok/Plesteran/anyam~
## $ Luas_Lantai                   <int> 56, 45, 65, 54, 33, 150, 120, 48, 96, 60~
## $ Bahan_Bakar_Masak             <ord> Kayu Bakar, Kayu Bakar, LPG 3Kg, LPG 3Kg~
## $ Sumber_Air_Minum              <ord> Lainnya, Lainnya, Lainnya, Lainnya, Air ~
## $ Sanitasi_Layak                <fct> Tidak, Tidak, Tidak, Ya, Tidak, Ya, Tida~
## $ Status_Rawan                  <fct> Rawan, Rawan, Rawan, Rawan, Rawan, Rawan~
table(train_TA$Status_Rawan)
## 
##       Rawan Tidak_Rawan 
##        3051       10880
table(down_train$Status_Rawan)
## 
##       Rawan Tidak_Rawan 
##        3051        3051

Random Oversampling

set.seed(012)
up_train <- upSample(x = train_TA[, -1],y 
= train_TA$Status_Rawan)

colnames(up_train)[colnames(up_train)=="Class"] = "Status_Rawan"

glimpse(up_train) 
## Rows: 21,760
## Columns: 20
## $ Pendidikan_KRT                <ord> SD, SD, SMP, SD, SMP, SMA, SD, SD, Tidak~
## $ KRT_Rawan                     <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Jumlah_Penabung               <int> 0, 1, 2, 0, 0, 1, 1, 1, 0, 2, 0, 3, 1, 0~
## $ Jumlah_Buta_Huruf             <fct> Tidak ada, Tidak ada, Tidak ada, Ada, Ti~
## $ Penerima_Transfer             <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Aset_Tanah                    <fct> Tidak, Ya, Ya, Tidak, Tidak, Tidak, Tida~
## $ Akses_Internet                <fct> Tidak, Tidak, Ya, Ya, Tidak, Ya, Tidak, ~
## $ Sakit_Namun_Tidak_Rawat_Jalan <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ PKH                           <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ KKS                           <fct> Tidak, Tidak, Ya, Tidak, Tidak, Tidak, T~
## $ BPNT                          <fct> Tidak, Tidak, Ya, Tidak, Tidak, Tidak, T~
## $ Bantuan_Pemda                 <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ BPJS                          <fct> Tidak, Tidak, Ya, Tidak, Ya, Ya, Ya, Tid~
## $ KIP_PIP                       <fct> Tidak, Tidak, Ya, Tidak, Tidak, Tidak, T~
## $ Jenis_Dinding                 <ord> Kayu/Papan, Tembok/Plesteran/anyaman, Te~
## $ Luas_Lantai                   <int> 35, 45, 55, 56, 9, 35, 24, 45, 54, 58, 7~
## $ Bahan_Bakar_Masak             <ord> Lainnya, LPG 3Kg, LPG 3Kg, LPG 3Kg, LPG ~
## $ Sumber_Air_Minum              <ord> Sumur bor/pompa, Lainnya, Sumur bor/pomp~
## $ Sanitasi_Layak                <fct> Ya, Ya, Ya, Ya, Tidak, Ya, Tidak, Ya, Ya~
## $ Status_Rawan                  <fct> Rawan, Rawan, Rawan, Rawan, Rawan, Rawan~
table(train_TA$Status_Rawan)
## 
##       Rawan Tidak_Rawan 
##        3051       10880
table(up_train$Status_Rawan)
## 
##       Rawan Tidak_Rawan 
##       10880       10880

SMOTE

set.seed(012)
smote_train <- SMOTE(Status_Rawan ~ ., data = train_TA,perc.over=200, perc.under=100)
## Warning in if (class(data[, col]) %in% c("factor", "character")) {: the
## condition has length > 1 and only the first element will be used

## Warning in if (class(data[, col]) %in% c("factor", "character")) {: the
## condition has length > 1 and only the first element will be used

## Warning in if (class(data[, col]) %in% c("factor", "character")) {: the
## condition has length > 1 and only the first element will be used

## Warning in if (class(data[, col]) %in% c("factor", "character")) {: the
## condition has length > 1 and only the first element will be used
## Warning in `[<-.factor`(`*tmp*`, ri, value = c(3, 3, 3, 3.38115100329742, :
## invalid factor level, NA generated

## Warning in `[<-.factor`(`*tmp*`, ri, value = c(3, 3, 3, 3.38115100329742, :
## invalid factor level, NA generated

## Warning in `[<-.factor`(`*tmp*`, ri, value = c(3, 3, 3, 3.38115100329742, :
## invalid factor level, NA generated

## Warning in `[<-.factor`(`*tmp*`, ri, value = c(3, 3, 3, 3.38115100329742, :
## invalid factor level, NA generated
glimpse(smote_train) 
## Rows: 15,255
## Columns: 20
## $ Status_Rawan                  <fct> Tidak_Rawan, Tidak_Rawan, Tidak_Rawan, T~
## $ Pendidikan_KRT                <ord> SMA, Perguruan Tinggi, SMA, SD, SMP, SMA~
## $ KRT_Rawan                     <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Jumlah_Penabung               <dbl> 2, 1, 2, 0, 1, 2, 6, 4, 1, 1, 2, 1, 1, 0~
## $ Jumlah_Buta_Huruf             <fct> Tidak ada, Tidak ada, Tidak ada, Tidak a~
## $ Penerima_Transfer             <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Aset_Tanah                    <fct> Ya, Ya, Ya, Tidak, Ya, Ya, Ya, Ya, Ya, T~
## $ Akses_Internet                <fct> Ya, Ya, Tidak, Tidak, Ya, Ya, Ya, Ya, Ya~
## $ Sakit_Namun_Tidak_Rawat_Jalan <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ PKH                           <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ KKS                           <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ BPNT                          <fct> Tidak, Tidak, Tidak, Ya, Tidak, Tidak, T~
## $ Bantuan_Pemda                 <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ BPJS                          <fct> Tidak, Tidak, Tidak, Ya, Tidak, Tidak, T~
## $ KIP_PIP                       <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Jenis_Dinding                 <ord> Tembok/Plesteran/anyaman, Tembok/Plester~
## $ Luas_Lantai                   <dbl> 140, 36, 90, 35, 32, 25, 120, 42, 77, 54~
## $ Bahan_Bakar_Masak             <ord> LPG 3Kg, LPG 12kg/5.5kg/Bluegaz, LPG 12k~
## $ Sumber_Air_Minum              <ord> Air kemasan/isi Ulang, Air kemasan/isi U~
## $ Sanitasi_Layak                <fct> Ya, Ya, Ya, Ya, Ya, Ya, Ya, Tidak, Ya, Y~
table(train_TA$Status_Rawan)
## 
##       Rawan Tidak_Rawan 
##        3051       10880
table(smote_train$Status_Rawan)
## 
##       Rawan Tidak_Rawan 
##        9153        6102

Pemodelan Klasifikasi

## Set seed for reproducibility
set.seed(012)

## Define repeated cross validation with 5 folds and three repeats
repeat_cv <- trainControl(method='repeatedcv', number=5)

Random Forest

Data awal

## Set seed for reproducibility
set.seed(012)

## Train a random forest model
forest <- train(
        
        # Formula. We are using all variables to predict Species
        Status_Rawan~., 
        
        # Source of data; remove the Species variable
        data=train_TA, 
        
        # `rf` method for random forest
        method='rf', 
        
        # Add repeated cross validation as trControl
        trControl=repeat_cv,
        
        # Accuracy to measure the performance of the model
        metric='Accuracy')

## Print out the details about the model
forest$finalModel
## 
## Call:
##  randomForest(x = x, y = y, mtry = param$mtry) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 2
## 
##         OOB estimate of  error rate: 21.79%
## Confusion matrix:
##             Rawan Tidak_Rawan class.error
## Rawan          59        2992 0.980662078
## Tidak_Rawan    43       10837 0.003952206
## Generate predictions
y_hats <- predict(
        
        ## Random forest object
        object=forest, 
        
        ## Data to use for predictions; remove the Species
        newdata=test_TA[, -1])
confusionMatrix(y_hats,test_TA$Status_Rawan, positive="Rawan")
## Confusion Matrix and Statistics
## 
##              Reference
## Prediction    Rawan Tidak_Rawan
##   Rawan          26          25
##   Tidak_Rawan  1245        4675
##                                           
##                Accuracy : 0.7873          
##                  95% CI : (0.7767, 0.7976)
##     No Information Rate : 0.7871          
##     P-Value [Acc > NIR] : 0.4949          
##                                           
##                   Kappa : 0.0233          
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.020456        
##             Specificity : 0.994681        
##          Pos Pred Value : 0.509804        
##          Neg Pred Value : 0.789696        
##              Prevalence : 0.212862        
##          Detection Rate : 0.004354        
##    Detection Prevalence : 0.008541        
##       Balanced Accuracy : 0.507569        
##                                           
##        'Positive' Class : Rawan           
## 

Data undersampling

## Set seed for reproducibility
set.seed(012)

## Train a random forest model
forest_2 <- train(
        
        # Formula. We are using all variables to predict Species
        Status_Rawan~., 
        
        # Source of data; remove the Species variable
        data=down_train, 
        
        # `rf` method for random forest
        method='rf', 
        
        # Add repeated cross validation as trControl
        trControl=repeat_cv,
        
        # Accuracy to measure the performance of the model
        metric='Accuracy')

## Print out the details about the model
forest_2$finalModel
## 
## Call:
##  randomForest(x = x, y = y, mtry = param$mtry) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 2
## 
##         OOB estimate of  error rate: 35.68%
## Confusion matrix:
##             Rawan Tidak_Rawan class.error
## Rawan        2197         854   0.2799082
## Tidak_Rawan  1323        1728   0.4336283
## Generate predictions
y_hats_2 <- predict(
        
        ## Random forest object
        object=forest_2, 
        
        ## Data to use for predictions; remove the Species
        newdata=test_TA[, -1])
confusionMatrix(y_hats_2,test_TA$Status_Rawan, positive="Rawan")
## Confusion Matrix and Statistics
## 
##              Reference
## Prediction    Rawan Tidak_Rawan
##   Rawan         921        2021
##   Tidak_Rawan   350        2679
##                                           
##                Accuracy : 0.6029          
##                  95% CI : (0.5904, 0.6154)
##     No Information Rate : 0.7871          
##     P-Value [Acc > NIR] : 1               
##                                           
##                   Kappa : 0.1991          
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.7246          
##             Specificity : 0.5700          
##          Pos Pred Value : 0.3131          
##          Neg Pred Value : 0.8845          
##              Prevalence : 0.2129          
##          Detection Rate : 0.1542          
##    Detection Prevalence : 0.4927          
##       Balanced Accuracy : 0.6473          
##                                           
##        'Positive' Class : Rawan           
## 

Data oversampling

## Set seed for reproducibility
set.seed(012)

## Train a random forest model
forest_3 <- train(
        
        # Formula. We are using all variables to predict Species
        Status_Rawan~., 
        
        # Source of data; remove the Species variable
        data=up_train, 
        
        # `rf` method for random forest
        method='rf', 
        
        # Add repeated cross validation as trControl
        trControl=repeat_cv,
        
        # Accuracy to measure the performance of the model
        metric='Accuracy')

## Print out the details about the model
forest_3$finalModel
## 
## Call:
##  randomForest(x = x, y = y, mtry = param$mtry) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 30
## 
##         OOB estimate of  error rate: 12.41%
## Confusion matrix:
##             Rawan Tidak_Rawan class.error
## Rawan       10464         416  0.03823529
## Tidak_Rawan  2284        8596  0.20992647
## Generate predictions
y_hats_3 <- predict(
        
        ## Random forest object
        object=forest_3, 
        
        ## Data to use for predictions; remove the Species
        newdata=test_TA[, -1])
confusionMatrix(y_hats_3,test_TA$Status_Rawan, positive="Rawan")
## Confusion Matrix and Statistics
## 
##              Reference
## Prediction    Rawan Tidak_Rawan
##   Rawan         350        1001
##   Tidak_Rawan   921        3699
##                                         
##                Accuracy : 0.6781        
##                  95% CI : (0.6661, 0.69)
##     No Information Rate : 0.7871        
##     P-Value [Acc > NIR] : 1.00000       
##                                         
##                   Kappa : 0.061         
##                                         
##  Mcnemar's Test P-Value : 0.07155       
##                                         
##             Sensitivity : 0.27537       
##             Specificity : 0.78702       
##          Pos Pred Value : 0.25907       
##          Neg Pred Value : 0.80065       
##              Prevalence : 0.21286       
##          Detection Rate : 0.05862       
##    Detection Prevalence : 0.22626       
##       Balanced Accuracy : 0.53120       
##                                         
##        'Positive' Class : Rawan         
## 

Extra Trees

Data awal

## Set seed for reproducibility
set.seed(012)

## Train a random forest model
extraT <- train(
  
  # Formula. We are using all variables to predict Species
  Status_Rawan~.,
  
  tuneGrid = data.frame(mtry = c(2,3,7),
                        splitrule = c("extratrees","extratrees","extratrees"),min.node.size = 10L),
  
  # Source of data; remove the Species variable
  data=train_TA, 
  
  # `rf` method for random forest
  method='ranger', 
  
  # Add repeated cross validation as trControl
  trControl=repeat_cv
  )

## Print out the details about the model
extraT$finalModel
## Ranger result
## 
## Call:
##  ranger::ranger(dependent.variable.name = ".outcome", data = x,      mtry = min(param$mtry, ncol(x)), min.node.size = param$min.node.size,      splitrule = as.character(param$splitrule), write.forest = TRUE,      probability = classProbs, ...) 
## 
## Type:                             Classification 
## Number of trees:                  500 
## Sample size:                      13931 
## Number of independent variables:  30 
## Mtry:                             2 
## Target node size:                 10 
## Variable importance mode:         none 
## Splitrule:                        extratrees 
## Number of random splits:          1 
## OOB prediction error:             21.87 %
## Generate predictions
y_hats_e1 <- predict(
  
  ## Random forest object
  object=extraT, 
  
  ## Data to use for predictions; remove the Species
  newdata=test_TA[, -1])
confusionMatrix(y_hats_e1,test_TA$Status_Rawan, positive="Rawan")
## Confusion Matrix and Statistics
## 
##              Reference
## Prediction    Rawan Tidak_Rawan
##   Rawan          19          10
##   Tidak_Rawan  1252        4690
##                                           
##                Accuracy : 0.7886          
##                  95% CI : (0.7781, 0.7989)
##     No Information Rate : 0.7871          
##     P-Value [Acc > NIR] : 0.3952          
##                                           
##                   Kappa : 0.0199          
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.014949        
##             Specificity : 0.997872        
##          Pos Pred Value : 0.655172        
##          Neg Pred Value : 0.789297        
##              Prevalence : 0.212862        
##          Detection Rate : 0.003182        
##    Detection Prevalence : 0.004857        
##       Balanced Accuracy : 0.506411        
##                                           
##        'Positive' Class : Rawan           
## 

Data undersampling

## Set seed for reproducibility
set.seed(012)

## Train a random forest model
extraT_2 <- train(
  
  # Formula. We are using all variables to predict Species
  Status_Rawan~.,
  
  tuneGrid = data.frame(mtry = c(2,3,7),
                        splitrule = c("extratrees","extratrees","extratrees"),min.node.size = 10L),
  
  # Source of data; remove the Species variable
  data=down_train, 
  
  # `rf` method for random forest
  method='ranger', 
  
  # Add repeated cross validation as trControl
  trControl=repeat_cv
  )

## Print out the details about the model
extraT_2$finalModel
## Ranger result
## 
## Call:
##  ranger::ranger(dependent.variable.name = ".outcome", data = x,      mtry = min(param$mtry, ncol(x)), min.node.size = param$min.node.size,      splitrule = as.character(param$splitrule), write.forest = TRUE,      probability = classProbs, ...) 
## 
## Type:                             Classification 
## Number of trees:                  500 
## Sample size:                      6102 
## Number of independent variables:  30 
## Mtry:                             2 
## Target node size:                 10 
## Variable importance mode:         none 
## Splitrule:                        extratrees 
## Number of random splits:          1 
## OOB prediction error:             35.10 %
## Generate predictions
y_hats_e2 <- predict(
  
  ## Random forest object
  object=extraT_2, 
  
  ## Data to use for predictions; remove the Species
  newdata=test_TA[, -1])
confusionMatrix(y_hats_e2,test_TA$Status_Rawan, positive="Rawan")
## Confusion Matrix and Statistics
## 
##              Reference
## Prediction    Rawan Tidak_Rawan
##   Rawan         871        1879
##   Tidak_Rawan   400        2821
##                                           
##                Accuracy : 0.6183          
##                  95% CI : (0.6059, 0.6307)
##     No Information Rate : 0.7871          
##     P-Value [Acc > NIR] : 1               
##                                           
##                   Kappa : 0.2004          
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.6853          
##             Specificity : 0.6002          
##          Pos Pred Value : 0.3167          
##          Neg Pred Value : 0.8758          
##              Prevalence : 0.2129          
##          Detection Rate : 0.1459          
##    Detection Prevalence : 0.4606          
##       Balanced Accuracy : 0.6427          
##                                           
##        'Positive' Class : Rawan           
## 

Data oversampling

## Set seed for reproducibility
set.seed(012)

## Train a random forest model
extraT_3 <- train(
  
  # Formula. We are using all variables to predict Species
  Status_Rawan~.,
  
  tuneGrid = data.frame(mtry = c(2,3,7),
                        splitrule = c("extratrees","extratrees","extratrees"),min.node.size = 10L),
  
  # Source of data; remove the Species variable
  data=up_train, 
  
  # `rf` method for random forest
  method='ranger', 
  
  # Add repeated cross validation as trControl
  trControl=repeat_cv
  )

## Print out the details about the model
extraT_3$finalModel
## Ranger result
## 
## Call:
##  ranger::ranger(dependent.variable.name = ".outcome", data = x,      mtry = min(param$mtry, ncol(x)), min.node.size = param$min.node.size,      splitrule = as.character(param$splitrule), write.forest = TRUE,      probability = classProbs, ...) 
## 
## Type:                             Classification 
## Number of trees:                  500 
## Sample size:                      21760 
## Number of independent variables:  30 
## Mtry:                             7 
## Target node size:                 10 
## Variable importance mode:         none 
## Splitrule:                        extratrees 
## Number of random splits:          1 
## OOB prediction error:             25.86 %
## Generate predictions
y_hats_e3 <- predict(
  
  ## Random forest object
  object=extraT_3, 
  
  ## Data to use for predictions; remove the Species
  newdata=test_TA[, -1])
confusionMatrix(y_hats_e3,test_TA$Status_Rawan, positive="Rawan")
## Confusion Matrix and Statistics
## 
##              Reference
## Prediction    Rawan Tidak_Rawan
##   Rawan         630        1417
##   Tidak_Rawan   641        3283
##                                           
##                Accuracy : 0.6553          
##                  95% CI : (0.6431, 0.6674)
##     No Information Rate : 0.7871          
##     P-Value [Acc > NIR] : 1               
##                                           
##                   Kappa : 0.1588          
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.4957          
##             Specificity : 0.6985          
##          Pos Pred Value : 0.3078          
##          Neg Pred Value : 0.8366          
##              Prevalence : 0.2129          
##          Detection Rate : 0.1055          
##    Detection Prevalence : 0.3428          
##       Balanced Accuracy : 0.5971          
##                                           
##        'Positive' Class : Rawan           
## 

Gradient Boosting

## Set seed for reproducibility
set.seed(012)

## Define repeated cross validation with 5 folds and three repeats
repeat_cv <- trainControl(method='repeatedcv', number=5)

Data Awal

boost_1 <- train(Status_Rawan ~., 
               data=train_TA, 
               method="gbm",
               tuneLength = 5,  
               trControl=repeat_cv,
               verbose = FALSE)
plot(boost_1, main = "5-Fold Cross Validation Gradient Boosting: tuneLength")

boost_best <- boost_1$bestTune
boost_1 <- train(Status_Rawan ~., 
               data=train_TA, 
               method="gbm",
               tuneGrid  = boost_best,
               verbose = FALSE)
boost_result_1 <- boost_1$results
boost_result_1
##   n.trees interaction.depth shrinkage n.minobsinnode  Accuracy      Kappa
## 1     100                 2       0.1             10 0.7799405 0.04558969
##    AccuracySD    KappaSD
## 1 0.005261321 0.01163629
## Generate predictions
y_hats_b1 <- predict(
  
  ## Random forest object
  object=boost_1, 
  
  ## Data to use for predictions; remove the Species
  newdata=test_TA[, -1])
confusionMatrix(y_hats_b1,test_TA$Status_Rawan, positive="Rawan")
## Confusion Matrix and Statistics
## 
##              Reference
## Prediction    Rawan Tidak_Rawan
##   Rawan          57          62
##   Tidak_Rawan  1214        4638
##                                           
##                Accuracy : 0.7863          
##                  95% CI : (0.7757, 0.7966)
##     No Information Rate : 0.7871          
##     P-Value [Acc > NIR] : 0.5702          
##                                           
##                   Kappa : 0.0473          
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.044847        
##             Specificity : 0.986809        
##          Pos Pred Value : 0.478992        
##          Neg Pred Value : 0.792550        
##              Prevalence : 0.212862        
##          Detection Rate : 0.009546        
##    Detection Prevalence : 0.019930        
##       Balanced Accuracy : 0.515828        
##                                           
##        'Positive' Class : Rawan           
## 

Data undersampling

boost_2 <- train(Status_Rawan ~., 
               data=down_train, 
               method="gbm",
               tuneLength = 5,  
               trControl=repeat_cv,
               verbose = FALSE)
plot(boost_2, main = "5-Fold Cross Validation Gradient Boosting: tuneLength")

boost_best <- boost_2$bestTune
boost_2 <- train(Status_Rawan ~., 
               data=down_train, 
               method="gbm",
               tuneGrid  = boost_best,
               verbose = FALSE)
boost_result_2 <- boost_2$results
boost_result_2
##   n.trees interaction.depth shrinkage n.minobsinnode  Accuracy     Kappa
## 1     100                 2       0.1             10 0.6440698 0.2883036
##    AccuracySD    KappaSD
## 1 0.007887327 0.01489327
## Generate predictions
y_hats_b2 <- predict(
  
  ## Random forest object
  object=boost_2, 
  
  ## Data to use for predictions; remove the Species
  newdata=test_TA[, -1])
confusionMatrix(y_hats_b2,test_TA$Status_Rawan, positive="Rawan")
## Confusion Matrix and Statistics
## 
##              Reference
## Prediction    Rawan Tidak_Rawan
##   Rawan         883        1901
##   Tidak_Rawan   388        2799
##                                          
##                Accuracy : 0.6166         
##                  95% CI : (0.6042, 0.629)
##     No Information Rate : 0.7871         
##     P-Value [Acc > NIR] : 1              
##                                          
##                   Kappa : 0.2024         
##                                          
##  Mcnemar's Test P-Value : <2e-16         
##                                          
##             Sensitivity : 0.6947         
##             Specificity : 0.5955         
##          Pos Pred Value : 0.3172         
##          Neg Pred Value : 0.8783         
##              Prevalence : 0.2129         
##          Detection Rate : 0.1479         
##    Detection Prevalence : 0.4663         
##       Balanced Accuracy : 0.6451         
##                                          
##        'Positive' Class : Rawan          
## 

Data oversampling

boost_3 <- train(Status_Rawan ~., 
               data=up_train, 
               method="gbm",
               tuneLength = 5,  
               trControl=repeat_cv,
               verbose = FALSE)
plot(boost_3, main = "5-Fold Cross Validation Gradient Boosting: tuneLength")

boost_best <- boost_3$bestTune
boost_3 <- train(Status_Rawan ~., 
               data=up_train, 
               method="gbm",
               tuneGrid  = boost_best,
               verbose = FALSE)
boost_result_3 <- boost_3$results
boost_result_3
##   n.trees interaction.depth shrinkage n.minobsinnode  Accuracy     Kappa
## 1     250                 5       0.1             10 0.6694346 0.3391146
##    AccuracySD    KappaSD
## 1 0.005485861 0.01077039
## Generate predictions
y_hats_b3 <- predict(
  
  ## Random forest object
  object=boost_3, 
  
  ## Data to use for predictions; remove the Species
  newdata=test_TA[, -1])
confusionMatrix(y_hats_b3,test_TA$Status_Rawan, positive="Rawan")
## Confusion Matrix and Statistics
## 
##              Reference
## Prediction    Rawan Tidak_Rawan
##   Rawan         843        1821
##   Tidak_Rawan   428        2879
##                                           
##                Accuracy : 0.6233          
##                  95% CI : (0.6109, 0.6357)
##     No Information Rate : 0.7871          
##     P-Value [Acc > NIR] : 1               
##                                           
##                   Kappa : 0.197           
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.6633          
##             Specificity : 0.6126          
##          Pos Pred Value : 0.3164          
##          Neg Pred Value : 0.8706          
##              Prevalence : 0.2129          
##          Detection Rate : 0.1412          
##    Detection Prevalence : 0.4462          
##       Balanced Accuracy : 0.6379          
##                                           
##        'Positive' Class : Rawan           
## 

Prediksi Data Baru

Preprocessing data baru

data_baru <- read.csv("D:/Download_14Des/Tugas Akhir -- data soal.xlsx - untuk diprediksi.csv", header=TRUE, stringsAsFactors = TRUE)
data_baru <- data_baru[,-1]
glimpse(data_baru)
## Rows: 4,867
## Columns: 25
## $ Status_Rawan                  <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, ~
## $ Pendidikan_KRT                <fct> Perguruan Tinggi, SMP, Perguruan Tinggi,~
## $ KRT_Rawan                     <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Ya, T~
## $ Jumlah_Penabung               <int> 3, 0, 2, 3, 4, 3, 2, 1, 1, 1, 2, 3, 1, 0~
## $ Jumlah_Buta_Huruf             <int> 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0~
## $ Penerima_Transfer             <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Aset_Tanah                    <fct> Ya, Ya, Ya, Ya, Ya, Ya, Ya, Ya, Ya, Ya, ~
## $ Akses_Internet                <fct> Ya, Tidak, Ya, Ya, Ya, Ya, Ya, Ya, Tidak~
## $ Sakit_Namun_Tidak_Rawat_Jalan <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ PKH                           <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ KKS                           <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ BPNT                          <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Bantuan_Pemda                 <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ BPJS                          <fct> Tidak, Ya, Tidak, Tidak, Tidak, Tidak, T~
## $ Jamkesda                      <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ KIP_PIP                       <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Jenis_Atap                    <fct> Asbes, Asbes, Genteng, Genteng, Genteng,~
## $ Jenis_Lantai                  <fct> Marmer/Keramik, Lainnya, Marmer/Keramik,~
## $ Jenis_Dinding                 <fct> Tembok/Plesteran/anyaman, Kayu/Papan, Te~
## $ Luas_Lantai                   <int> 60, 48, 60, 60, 84, 72, 60, 10, 39, 150,~
## $ Listrik                       <fct> Listrik, Listrik, Listrik, Listrik, List~
## $ Bahan_Bakar_Masak             <fct> LPG 3Kg, LPG 3Kg, LPG 12kg/5.5kg/Bluegaz~
## $ Sumber_Air_Minum              <fct> Air kemasan/isi Ulang, Air kemasan/isi U~
## $ Air_Minum_Layak               <fct> Tidak, Tidak, Tidak, Ya, Tidak, Tidak, Y~
## $ Sanitasi_Layak                <fct> Ya, Tidak, Ya, Ya, Ya, Ya, Ya, Ya, Ya, Y~
row = nrow(data_baru)

for (i in 1:row){
  if(data_baru[i,5]==0){
    data_baru[i,5]="Tidak ada"
  }
  else{
    data_baru[i,5]="Ada"
  }
}
data_baru <- data_baru %>% mutate(
  Pendidikan_KRT = factor(Pendidikan_KRT, ordered = TRUE, 
                          levels = c("Tidak Sekolah", 
                                     "Tidak Tamat SD", 
                                     "SD", 
                                     "SMP", 
                                     "SMA",
                                     "Perguruan Tinggi")),
  Jenis_Atap = factor(Jenis_Atap, ordered = TRUE, 
                      levels = c("Asbes", 
                                 "Seng", 
                                 "Beton", 
                                 "Genteng", 
                                 "Lainnya")),
  Jenis_Lantai = factor(Jenis_Lantai, ordered = TRUE, 
                        levels = c("Ubin/tegel/teraso", 
                                   "Semen/bata merah", 
                                   "Parket/vinil/karpet", 
                                   "Marmer/Keramik", 
                                   "Lainnya")),
  Jenis_Dinding = factor(Jenis_Dinding, ordered = TRUE, 
                         levels = c("Kayu/Papan", 
                                    "Tembok/Plesteran/anyaman",
                                    "Lainnya")),
  Listrik = factor(Listrik, ordered = TRUE, 
                   levels = c("Non Listrik",
                              "Listrik")),
  Bahan_Bakar_Masak = factor(Bahan_Bakar_Masak, ordered = TRUE, 
                             levels = c("Tidak Memasak", 
                                        "Kayu Bakar",
                                        "Minyak tanah",
                                        "LPG 3Kg",
                                        "LPG 12kg/5.5kg/Bluegaz",
                                        "Lainnya")),
  Sumber_Air_Minum = factor(Sumber_Air_Minum, ordered = TRUE, 
                            levels = c("Sumur bor/pompa", 
                                       "Leding",
                                       "Air kemasan/isi Ulang",
                                       "Lainnya")),
  Jumlah_Buta_Huruf = factor(Jumlah_Buta_Huruf)
)
data_baru <- data_baru[,-c(1,15,17,18,21,24)]
glimpse(data_baru)
## Rows: 4,867
## Columns: 19
## $ Pendidikan_KRT                <ord> Perguruan Tinggi, SMP, Perguruan Tinggi,~
## $ KRT_Rawan                     <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Ya, T~
## $ Jumlah_Penabung               <int> 3, 0, 2, 3, 4, 3, 2, 1, 1, 1, 2, 3, 1, 0~
## $ Jumlah_Buta_Huruf             <fct> Tidak ada, Ada, Tidak ada, Tidak ada, Ti~
## $ Penerima_Transfer             <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Aset_Tanah                    <fct> Ya, Ya, Ya, Ya, Ya, Ya, Ya, Ya, Ya, Ya, ~
## $ Akses_Internet                <fct> Ya, Tidak, Ya, Ya, Ya, Ya, Ya, Ya, Tidak~
## $ Sakit_Namun_Tidak_Rawat_Jalan <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ PKH                           <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ KKS                           <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ BPNT                          <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Bantuan_Pemda                 <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ BPJS                          <fct> Tidak, Ya, Tidak, Tidak, Tidak, Tidak, T~
## $ KIP_PIP                       <fct> Tidak, Tidak, Tidak, Tidak, Tidak, Tidak~
## $ Jenis_Dinding                 <ord> Tembok/Plesteran/anyaman, Kayu/Papan, Te~
## $ Luas_Lantai                   <int> 60, 48, 60, 60, 84, 72, 60, 10, 39, 150,~
## $ Bahan_Bakar_Masak             <ord> LPG 3Kg, LPG 3Kg, LPG 12kg/5.5kg/Bluegaz~
## $ Sumber_Air_Minum              <ord> Air kemasan/isi Ulang, Air kemasan/isi U~
## $ Sanitasi_Layak                <fct> Ya, Tidak, Ya, Ya, Ya, Ya, Ya, Ya, Ya, Y~

hasil prediksi

set.seed(012)
prediksi_rf <- predict(forest_2, newdata=data_baru)
table(prediksi_rf)
## prediksi_rf
##       Rawan Tidak_Rawan 
##        2310        2557
set.seed(012)
prediksi_et <- predict(extraT_2, newdata=data_baru)
table(prediksi_et)
## prediksi_et
##       Rawan Tidak_Rawan 
##        2119        2748
set.seed(012)
prediksi_gb <- predict(boost_2, newdata=data_baru)
table(prediksi_gb)
## prediksi_gb
##       Rawan Tidak_Rawan 
##        2228        2639

export excel

n = nrow(data_baru)

pred1 <- data.frame(No = c(1:n),
                   Status_Rawan = prediksi_rf)

pred2 <- data.frame(No = c(1:n),
                   Status_Rawan = prediksi_et)

pred3 <- data.frame(No = c(1:n),
                   Status_Rawan = prediksi_gb)
write.xlsx(pred1, "C:\\Users\\Asus\\Downloads\\TA_G1501211012.xlsx",sheetName = "Random Forest (Undersampling)",row.names = FALSE)
write.xlsx(pred2, "C:\\Users\\Asus\\Downloads\\TA_G1501211012.xlsx", sheetName = "Extra Trees (Undersampling)",row.names = FALSE, append=TRUE)
write.xlsx(pred3, "C:\\Users\\Asus\\Downloads\\TA_G1501211012.xlsx", sheetName = "Gradient Boosting (Undersampling)",row.names = FALSE, append=TRUE)
wb <- loadWorkbook("C:\\Users\\Asus\\Downloads\\TA_G1501211012.xlsx")
sheets <- getSheets(wb)
saveWorkbook(wb,"C:\\Users\\Asus\\Downloads\\TA_G1501211012.xlsx")
table(pred1$Status_Rawan)
## 
##       Rawan Tidak_Rawan 
##        2310        2557

Permutation Variable Importance

rf_extra <- rand_forest() %>% 
  set_engine("ranger",
             importance="permutation",
             splitrule="extratrees",replace=F) %>%
  set_mode("classification")
undersm <- recipe(Status_Rawan~.,data = train_TA) %>% 
            step_downsample(Status_Rawan,under_ratio = 1)

rf_fit2 <- workflow() %>%
          add_recipe(undersm) %>% 
          add_model(rf_extra) %>% 
          fit(data=train_TA)
rf_imp2 <- ranger::importance_pvalues(
  extract_fit_engine(rf_fit2),
  method = "altmann",
  formula = Status_Rawan ~ .,
  data = down_train
) %>% 
  as_tibble(rownames = "Variable") %>% 
  arrange(desc(importance)) %>% 
  rename(Permutation_Value=importance)
rf_imp2
## # A tibble: 19 x 3
##    Variable                      Permutation_Value  pvalue
##    <chr>                                     <dbl>   <dbl>
##  1 Jumlah_Penabung                        0.0127   0.00990
##  2 Pendidikan_KRT                         0.00975  0.00990
##  3 BPNT                                   0.00947  0.00990
##  4 PKH                                    0.00916  0.00990
##  5 BPJS                                   0.00889  0.00990
##  6 Akses_Internet                         0.00675  0.00990
##  7 KKS                                    0.00618  0.00990
##  8 Bahan_Bakar_Masak                      0.00495  0.00990
##  9 Aset_Tanah                             0.00472  0.00990
## 10 Luas_Lantai                            0.00346  0.0396 
## 11 Penerima_Transfer                      0.00294  0.00990
## 12 Jenis_Dinding                          0.00264  0.00990
## 13 Sanitasi_Layak                         0.00252  0.0198 
## 14 Sumber_Air_Minum                       0.00230  0.109  
## 15 KRT_Rawan                              0.00148  0.00990
## 16 KIP_PIP                                0.00143  0.00990
## 17 Jumlah_Buta_Huruf                      0.000658 0.0792 
## 18 Bantuan_Pemda                          0.000161 0.317  
## 19 Sakit_Namun_Tidak_Rawat_Jalan          0.000102 0.149
#relative importance
rel_rf_imp2 <- rf_imp2 %>% 
  mutate(Relative_Importance=(Permutation_Value*100)/(max(Permutation_Value))) %>% 
  relocate(Relative_Importance,
           .after = Variable)
rel_rf_imp2
## # A tibble: 19 x 4
##    Variable                      Relative_Importance Permutation_Value  pvalue
##    <chr>                                       <dbl>             <dbl>   <dbl>
##  1 Jumlah_Penabung                           100              0.0127   0.00990
##  2 Pendidikan_KRT                             76.5            0.00975  0.00990
##  3 BPNT                                       74.3            0.00947  0.00990
##  4 PKH                                        71.9            0.00916  0.00990
##  5 BPJS                                       69.8            0.00889  0.00990
##  6 Akses_Internet                             53.0            0.00675  0.00990
##  7 KKS                                        48.5            0.00618  0.00990
##  8 Bahan_Bakar_Masak                          38.8            0.00495  0.00990
##  9 Aset_Tanah                                 37.0            0.00472  0.00990
## 10 Luas_Lantai                                27.1            0.00346  0.0396 
## 11 Penerima_Transfer                          23.1            0.00294  0.00990
## 12 Jenis_Dinding                              20.7            0.00264  0.00990
## 13 Sanitasi_Layak                             19.8            0.00252  0.0198 
## 14 Sumber_Air_Minum                           18.0            0.00230  0.109  
## 15 KRT_Rawan                                  11.6            0.00148  0.00990
## 16 KIP_PIP                                    11.2            0.00143  0.00990
## 17 Jumlah_Buta_Huruf                           5.17           0.000658 0.0792 
## 18 Bantuan_Pemda                               1.26           0.000161 0.317  
## 19 Sakit_Namun_Tidak_Rawat_Jalan               0.799          0.000102 0.149
ggbarplot(rel_rf_imp2 %>% arrange(Permutation_Value),
          x="Variable",fill="#007ea7",
          y="Relative_Importance",orientation="horizontal")+
  scale_y_continuous(expand = c(1e-4,1e-4),limits = c(0,105))