TUGAS 14 STA581

Khusnia Nurul Khikmah (G1501211049)

11/30/2021

Studi Kasus

Sebuah perusahaan akan berinvestasi dengan sebuah negara untuk meningkatkan kerja sama. Mereka ingin memperoleh model yang dapat digunakan untuk memprediksi negara mana saja yang potensial untuk dijadikan tempat berinvestasi oleh perusahaan tersebut. Negara yang potensial tersebut dipilih berdasarkan kriteria. Maka, ekonomi seperti apa dari negara-negara tersebut yang cocok untuk diperhitungkan sebagai landasan untuk berinvestasi.

Diberikan data ekonomi dari 117 negara. Dimana masing-masing negara dinilai berdasarkan 14 keriteria penilaian yang sama. Susun model Classification Tree terbaik berdasarkan data tersebut.

Data

Membaca Data

Memasukkan data dari excel ke R dilakukan dengan perintah:

data <- read_excel("D:/S2/IPB/STA581 Sains Data/2021/14/tugas STA581 - investment risk level.xlsx")
head(data)
## # A tibble: 6 x 16
##   Country    X1     X2    X3    X4    X5     X6     X7    X8    X9    X10   X11
##   <chr>   <dbl>  <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl>  <dbl> <dbl>
## 1 AD       17.5 38675. 173.   0.68 1.22   1.79  -2.08   55   -26.5   2.86  8   
## 2 AE       18.2 40105. 104.   1.77 0.870  2.66  -0.725 103.  -13.6 353.    8.15
## 3 AE-AZ    18.7 76038.  31.0  2.63 1.49   1.85  -1.90  103.  -56.2 200.    8.15
## 4 AE-RK    NA   27883.  24.8  1.29 1.75   2.23  -1.14  103.   24.8  10.1  NA   
## 5 AM       14    4251.  89.6  1.44 0.256  4.75   2.33  167.   47.3  12.6   6.6 
## 6 AO       NA    2034.  57.1 22.4  3.34  -0.878 -5.20   34.8  15.4  62.5  10.3 
## # ... with 4 more variables: X12 <dbl>, X13 <dbl>, X14 <dbl>, Risk Level <chr>

Deskripsi Data

14 keriteria penilaian data ekonomi dari 117 negara adalah:

Variabel Keterangan
X1 Capital adequacy ratio (%) average from last 5 years
X2 GDP per capita (USD)
X3 Gross External Debt (% of GDP) average from last 5 years
X4 Growth of consumer price (%) average from last 5 years
X5 Growth of population (%) average from last 5 years
X6 Growth of Real GDP (%) average from last 5 year
X7 Growth of Real GDP per cap. (%) average from last 5 years
X8 Loan-deposit ratio (%) average from last 5 years
X9 Net External Debt (% of GDP) average from last 5 years
X10 Nominal GDP (USD bn)
X11 Non-performing loans (% of gross loans) average from last 5 years
X12 Percentage of gross domestic investment to GDP (%) average from last 5 years
X13 Percentage of gross domestic saving to GDP (%) average from last 5 years
X14 Unemployment rate (% labour force) average from last 5 years

Ringkasan Data

skim(data)
Data summary
Name data
Number of rows 117
Number of columns 16
_______________________
Column type frequency:
character 2
numeric 14
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Country 0 1 2 5 0 116 0
Risk Level 0 1 3 4 0 2 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
X1 13 0.89 18.73 5.18 4.20 15.93 18.35 21.64 47.50 ▁▇▃▁▁
X2 0 1.00 22596.35 24598.74 434.46 4223.46 11363.61 34641.26 124340.38 ▇▂▂▁▁
X3 0 1.00 177.50 646.02 13.63 43.11 70.35 117.76 6908.35 ▇▁▁▁▁
X4 0 1.00 3.44 4.94 -0.15 0.84 1.70 4.21 36.70 ▇▁▁▁▁
X5 0 1.00 1.15 1.05 -0.89 0.38 1.05 1.80 4.40 ▃▇▅▂▁
X6 0 1.00 3.06 2.20 -5.14 1.75 2.84 4.26 10.08 ▁▂▇▃▁
X7 0 1.00 0.22 2.50 -9.85 -1.11 0.29 1.92 6.07 ▁▁▆▇▂
X8 9 0.92 99.47 41.28 34.82 75.98 90.02 113.28 359.14 ▇▅▁▁▁
X9 0 1.00 -14.34 202.88 -1955.72 -16.23 12.94 33.35 456.49 ▁▁▁▂▇
X10 0 1.00 710.34 2434.56 1.17 34.54 107.80 375.19 20935.00 ▇▁▁▁▁
X11 21 0.82 6.31 8.92 0.34 1.84 3.60 7.93 63.50 ▇▁▁▁▁
X12 0 1.00 24.52 6.52 12.67 20.16 23.08 27.97 46.83 ▃▇▃▁▁
X13 0 1.00 24.36 8.19 8.88 18.42 24.23 29.25 55.09 ▅▇▆▁▁
X14 12 0.90 8.52 5.68 0.12 4.82 7.00 10.30 33.70 ▇▆▂▁▁

Variabel Respon

table(data$`Risk Level`)
## 
## high  low 
##   64   53
prop.table(table(data$`Risk Level`))
## 
##      high       low 
## 0.5470085 0.4529915
risklev <- ggplot(data, aes(x="", y=`Risk Level`, fill=`Risk Level`))+ geom_bar(width = 1, stat = "identity")
pie <- risklev + coord_polar("y", start=0)
pie + scale_fill_brewer(palette="Blues")+
  theme_minimal()

Berdasarkan statistik deskiptif di atas dapat diketahui bahwa peubah respon memiliki anggota kelas high sebanyak 54.7% dan anggota kelas low sebanyak 45.3%. Proporsi ini cukup balance sehingga tidak perlu dilakukan standarisasi data.

Missing Value

Missing value atau data hilang didefinisikan sebagai nilai data yang tidak ada atau tidak tersimpan untuk suatu variabel dalam suatu pengamatan. Karena missing value dapat menyebabkan beberapa masalah maka perlunya teknik-teknik dalam menangani missing value ini.

Untuk studi kasus ini memiliki missing value yang divisualisasikan dengan menggunakan fungsi vis_miss dari package visdat yang hasilnya sebagai berikut:

vis_miss(data)

Cara Menangani

Ada beberapa teknik yang dapat digunakan dalam menangani missing value. Beberapa di antaranya yaitu:

  1. Dibiarkan
  2. Dengan menghapus baris atau kolom yang memuat missing value
  3. Dengan imputation. Cara ketiga ini jauh lebih baik digunakan dalam mengatasi missing value dan memiliki beberapa teknik dalam imputasinya. Beberapa di antaranya yaitu: MIM (Mean, Median, Mode Imputation Method), KNN Imputation, Hot and Cold Deck Imputation, Regression Imputation, dsb.

Pemodelan dengan Classification Tree

Classification and Regression Tree (CART) adalah salah satu contoh metode klasifikasi dengan pendekatan statistik nonparametrik yang diperkenalkan pertama kali oleh empat ilmuan yaitu: Leo Breiman, Jerome H. Friedman, Richard A. Olshen, dan Charles J. Stone pada tahun 1984 (Breiman, 1984). Metode ini digunakan untuk menggambarkan hubungan antara peubah respon dengan satu set peubah prediktor. Pohon klasifikasi bertujuan untuk menghasilkan pengklasifikasian yang akurat dan menjelaskan prediksi data baru dalam tiap kategori yang terdapat dalam respon. Jika peubah responnya bersifat kategorik maka mmenghasilkan pohon klasifikasi sebaliknya jika peubah responnya bersifat numerik akan menghasilkan pohon regresi.

Pada penelitian ini menggunakan peubah yang digunakan bersifat kategorik sehingga menghasilkan pohon klasifikasi. Pohon klasifikasi digunakan untuk mengidentifikasi peubah apa yang dapat dijadikan sebagai pembeda antar kelas/kategori, dan memprediksi keanggotaan kelas dari suatu individu amatan berdasarkan karakteristiknya.

Pembentukan pohon klasifikasi juga dikenal dengan istilah binary recursive partition yang berarti bahwa setiap parent node akan mengalami pemecahan tepat menjadi dua child node dan setiap child node memiliki siklus berulang untuk menjadi parent node kembali. Siklus ini akan terus berulang hingga tidak ada lagi kesempatan untuk melakukan pemecahan berikutnya(Lewis, 2000) atau hingga simpul anak berisi amatan yang berasal dari satu kategori, simpul anak berisi amatan yang seluruh peubah prediktornya identik, dan kedalaman pohon sudah mencapai kedalaman maksimal (Breiman et al. 1993).

By Ignoring NA

Persiapan Data

# Memanggil data untuk dimasukkan dalam variabel baru bernama data1
data1 <- data
head(data1)
## # A tibble: 6 x 16
##   Country    X1     X2    X3    X4    X5     X6     X7    X8    X9    X10   X11
##   <chr>   <dbl>  <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl>  <dbl> <dbl>
## 1 AD       17.5 38675. 173.   0.68 1.22   1.79  -2.08   55   -26.5   2.86  8   
## 2 AE       18.2 40105. 104.   1.77 0.870  2.66  -0.725 103.  -13.6 353.    8.15
## 3 AE-AZ    18.7 76038.  31.0  2.63 1.49   1.85  -1.90  103.  -56.2 200.    8.15
## 4 AE-RK    NA   27883.  24.8  1.29 1.75   2.23  -1.14  103.   24.8  10.1  NA   
## 5 AM       14    4251.  89.6  1.44 0.256  4.75   2.33  167.   47.3  12.6   6.6 
## 6 AO       NA    2034.  57.1 22.4  3.34  -0.878 -5.20   34.8  15.4  62.5  10.3 
## # ... with 4 more variables: X12 <dbl>, X13 <dbl>, X14 <dbl>, Risk Level <chr>
# Mengubah tipe data pada variabel respon Risk Level menjadi factor
data1$`Risk Level` <- as.factor(data1$`Risk Level`)
# Dimensi dari data
dim(data1)
## [1] 117  16

Sebaran Data

Untuk melihat sebaran data, setiap variabel digambarkan dalam bentuk density-plot. Untuk memperjelas hasil, data yang digunakan merupakan data contoh sebanyak 100 pengamatan.

data_s <- data[sample(nrow(data), 100),]

featurePlot(x = data1[, 2:15], 
            y = data1$`Risk Level`,
            plot = "density", 
            ## Pass in options to xyplot() to 
            ## make it prettier
            scales = list(x = list(relation="free"), 
                          y = list(relation="free")), 
            adjust = 1.5, 
            pch = "|", 
            layout = c(4, 4), 
            auto.key = list(columns = 3))
## Warning in draw.key(simpleKey(...), draw = FALSE): not enough rows for columns

Splitting Data

Evaluasi performa model machine learning dapat menggunakan Spliting Data. Data akan dibagi menjadi dua bagian, yaitu data train atau (data latih) dan data test (data uji). Data train digunakan untuk membuat model dan data test digunakan untuk evaluasi kebaikan model dari data train.

set.seed(123)
# Mempartisi data dengan proporsi 80%:20%
index <- createDataPartition(data1$`Risk Level`, p = 0.8,list = FALSE)
# Membagi data menjadi data train
train.data1index <- data1[index,]
dim(train.data1index)
## [1] 95 16
# Membagi data menjadi data test
test.data1index <- data1[-index,]
dim(test.data1index)
## [1] 22 16

Kolom Country dihapus dari data train dan data test karena tidak digunakan dalam pemodelan.

# cleaning data dengan menghilangkan variabel Country pada data1
train.data1index$Country <- NULL
test.data1index$Country <- NULL

Interpretasi Model

# Menggunakan fungsi rpart untk memodelkan dengan Classification Tree
Xtree <- rpart(`Risk Level`~., data = train.data1index, method = "class",control = rpart.control(cp = 0.008,minsplit=3))
Xtree
## n= 95 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 95 43 high (0.54736842 0.45263158)  
##    2) X2< 10001.82 47  3 high (0.93617021 0.06382979)  
##      4) X9>=-8.85936 42  1 high (0.97619048 0.02380952) *
##      5) X9< -8.85936 5  2 high (0.60000000 0.40000000)  
##       10) X4>=2.81052 3  0 high (1.00000000 0.00000000) *
##       11) X4< 2.81052 2  0 low (0.00000000 1.00000000) *
##    3) X2>=10001.82 48  8 low (0.16666667 0.83333333)  
##      6) X11>=3.79115 11  5 high (0.54545455 0.45454545)  
##       12) X10< 66.87607 4  0 high (1.00000000 0.00000000) *
##       13) X10>=66.87607 7  2 low (0.28571429 0.71428571)  
##         26) X9>=2.89109 3  1 high (0.66666667 0.33333333)  
##           52) X2< 22343.5 2  0 high (1.00000000 0.00000000) *
##           53) X2>=22343.5 1  0 low (0.00000000 1.00000000) *
##         27) X9< 2.89109 4  0 low (0.00000000 1.00000000) *
##      7) X11< 3.79115 37  2 low (0.05405405 0.94594595)  
##       14) X5>=3.4515 1  0 high (1.00000000 0.00000000) *
##       15) X5< 3.4515 36  1 low (0.02777778 0.97222222) *

Visualisasi dari model

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

printcp(Xtree)
## 
## Classification tree:
## rpart(formula = `Risk Level` ~ ., data = train.data1index, method = "class", 
##     control = rpart.control(cp = 0.008, minsplit = 3))
## 
## Variables actually used in tree construction:
## [1] X10 X11 X2  X4  X5  X9 
## 
## Root node error: 43/95 = 0.45263
## 
## n= 95 
## 
##         CP nsplit rel error  xerror     xstd
## 1 0.744186      0  1.000000 1.00000 0.112825
## 2 0.046512      1  0.255814 0.39535 0.086884
## 3 0.023256      3  0.162791 0.37209 0.084829
## 4 0.008000      8  0.046512 0.44186 0.090668

Menghitung best complexity parameter

Dengan menggunakan hasil pemodelan sebelumnya akan dilakukan prun dengan mencari best complexity parameter terlebih dahulu.

# Explicitly request the lowest cp value
bestcp<-Xtree$cptable[which.min(Xtree$cptable[,"xerror"]),"CP"]
data.frame(Xtree$cptable)
##           CP nsplit  rel.error    xerror       xstd
## 1 0.74418605      0 1.00000000 1.0000000 0.11282508
## 2 0.04651163      1 0.25581395 0.3953488 0.08688434
## 3 0.02325581      3 0.16279070 0.3720930 0.08482879
## 4 0.00800000      8 0.04651163 0.4418605 0.09066785
bestcp
## [1] 0.02325581

Visualisasi Prunning tree berdasarkan best complexity parameter

Dari hasil best complexity parameter akan dilakukan prun terhadap model untuk mendapatkan model terbaik berdasarkan CP yaitu sebesar 0.02325581 dan minsplit yaitu sebesar 3.

#Prunning tree based on best cp
Xtreebest <- prune(Xtree, cp = bestcp)
rpart.plot(Xtreebest)

Variabel important

arrange(varImp(Xtreebest), desc(Overall))
##       Overall
## X2  34.098708
## X11 19.685902
## X4  14.921303
## X9  14.191762
## X10 13.763216
## X13  5.947830
## X7   3.100366
## X14  3.041443
## X3   2.187879
## X1   0.000000
## X5   0.000000
## X6   0.000000
## X8   0.000000
## X12  0.000000

Dari output variabel important di atas diperoleh bahwa X2 (GDP per capita (USD)) dan X11 (Non-performing loans (% of gross loans) average from last 5 years) adalah dua variable terpenting bagi model classification tree dengan cara membiarkan variabel NA.

Hasil Prediksi

pred <- predict(Xtreebest, test.data1index)
dim(pred)
## [1] 22  2
head(pred, n=15)
##          high        low
## 1  1.00000000 0.00000000
## 2  0.28571429 0.71428571
## 3  1.00000000 0.00000000
## 4  0.05405405 0.94594595
## 5  0.05405405 0.94594595
## 6  0.05405405 0.94594595
## 7  0.05405405 0.94594595
## 8  0.93617021 0.06382979
## 9  0.93617021 0.06382979
## 10 0.93617021 0.06382979
## 11 0.05405405 0.94594595
## 12 0.93617021 0.06382979
## 13 0.05405405 0.94594595
## 14 0.05405405 0.94594595
## 15 0.93617021 0.06382979
predRL <- ifelse(pred[,1] > 0.5 , "high", "low")

Confusion Matrix

confusionMatrix(as.factor(predRL), as.factor(test.data1index$`Risk Level`))
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction high low
##       high    9   2
##       low     3   8
##                                           
##                Accuracy : 0.7727          
##                  95% CI : (0.5463, 0.9218)
##     No Information Rate : 0.5455          
##     P-Value [Acc > NIR] : 0.02455         
##                                           
##                   Kappa : 0.5455          
##                                           
##  Mcnemar's Test P-Value : 1.00000         
##                                           
##             Sensitivity : 0.7500          
##             Specificity : 0.8000          
##          Pos Pred Value : 0.8182          
##          Neg Pred Value : 0.7273          
##              Prevalence : 0.5455          
##          Detection Rate : 0.4091          
##    Detection Prevalence : 0.5000          
##       Balanced Accuracy : 0.7750          
##                                           
##        'Positive' Class : high            
## 

Akurasi dari yang dihasilkan dari classification tree dengan membiarkan nilai NA ikut dalam pemodelan diperoleh sebesar 77.27%. Kemudian, jika dilihat pada confusion matrix terlihat bahwa prediksi dari high menjadi high cenderung baik. Sehingga, model ini dapat dikatakan cukup baik dalam memprediksi kriteria ekonomi terbaik untuk dijadikan landasan berinvestasi.

ROC Plot

#Create ROC graph & Calculate AUC value
ROCval <- rocit(score=pred[,2],class=test.data1index$`Risk Level`)
plot(ROCval)

Nilai AUC

AUC <- ROCval$AUC
AUC
## [1] 0.7416667

Nilai AUC yang dihasilkan cukup baik yaitu 74.17% metode classification tree dengan membiarkan nilai NA ini cukup bisa mengklasifikasikan data dengan baik karena nilai akurasinya sebanding dengan nilai sensitivity dan specificitynya yaitu (0.75 dan 0,80)

By removing row that having NA

Metode kedua untuk menangani missing value adalah dengan menghapus baris yang memuat NA. Meskipun teknik ini menyebabkan beberapa negara langsung tereliminasi dari kandidat negara yang akan dijadikan tempat berinvestasi tersebut.

Persiapan Data

# Memanggil data untuk dimasukkan dalam variabel baru bernama data2
data2 <- data
head(data2)
## # A tibble: 6 x 16
##   Country    X1     X2    X3    X4    X5     X6     X7    X8    X9    X10   X11
##   <chr>   <dbl>  <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl>  <dbl> <dbl>
## 1 AD       17.5 38675. 173.   0.68 1.22   1.79  -2.08   55   -26.5   2.86  8   
## 2 AE       18.2 40105. 104.   1.77 0.870  2.66  -0.725 103.  -13.6 353.    8.15
## 3 AE-AZ    18.7 76038.  31.0  2.63 1.49   1.85  -1.90  103.  -56.2 200.    8.15
## 4 AE-RK    NA   27883.  24.8  1.29 1.75   2.23  -1.14  103.   24.8  10.1  NA   
## 5 AM       14    4251.  89.6  1.44 0.256  4.75   2.33  167.   47.3  12.6   6.6 
## 6 AO       NA    2034.  57.1 22.4  3.34  -0.878 -5.20   34.8  15.4  62.5  10.3 
## # ... with 4 more variables: X12 <dbl>, X13 <dbl>, X14 <dbl>, Risk Level <chr>
# cleaning data dengan menghilangkan variabel Country pada data
data2 <- data2 %>% select(-Country)
dim(data2)
## [1] 117  15
# Menjadikan dat2 menjadi bentuk data frame
data2 <- data.frame(data2)
# Removing data yaitu baris data yang memuat NA akan dihilangkan dengan menggunakan fungsi na.omit
data2 <- na.omit(data2)
class(data2$Risk.Level)
## [1] "character"
# Mengubah tipe data pada variabel respon Y menjadi factor
data2$Risk.Level <- as.factor(data2$Risk.Level)
summary(data2)
##        X1              X2               X3                X4          
##  Min.   : 4.20   Min.   :  1011   Min.   :  13.63   Min.   : 0.00116  
##  1st Qu.:16.00   1st Qu.:  4430   1st Qu.:  47.02   1st Qu.: 0.83263  
##  Median :18.29   Median : 13682   Median :  84.09   Median : 1.59750  
##  Mean   :19.00   Mean   : 24035   Mean   : 211.56   Mean   : 2.62237  
##  3rd Qu.:21.76   3rd Qu.: 39032   3rd Qu.: 125.09   3rd Qu.: 3.54052  
##  Max.   :47.50   Max.   :124340   Max.   :6908.35   Max.   :19.17300  
##        X5                X6               X7                X8        
##  Min.   :-0.8862   Min.   :-1.670   Min.   :-9.8453   Min.   : 42.65  
##  1st Qu.: 0.2440   1st Qu.: 1.950   1st Qu.:-0.7310   1st Qu.: 75.98  
##  Median : 0.8911   Median : 3.116   Median : 0.5276   Median : 89.49  
##  Mean   : 0.8882   Mean   : 3.294   Mean   : 0.5063   Mean   : 99.66  
##  3rd Qu.: 1.3036   3rd Qu.: 4.305   3rd Qu.: 2.0471   3rd Qu.:113.28  
##  Max.   : 3.5095   Max.   :10.076   Max.   : 6.0712   Max.   :359.14  
##        X9                X10                 X11               X12       
##  Min.   :-1955.72   Min.   :    1.171   Min.   : 0.3357   Min.   :12.67  
##  1st Qu.:  -13.04   1st Qu.:   34.836   1st Qu.: 1.7807   1st Qu.:20.05  
##  Median :   12.15   Median :  155.297   Median : 3.1900   Median :23.02  
##  Mean   :  -29.47   Mean   :  618.226   Mean   : 5.7432   Mean   :24.09  
##  3rd Qu.:   32.43   3rd Qu.:  362.242   3rd Qu.: 6.0500   3rd Qu.:26.35  
##  Max.   :  134.17   Max.   :14866.703   Max.   :63.5000   Max.   :43.18  
##       X13              X14         Risk.Level
##  Min.   : 8.882   Min.   : 0.120   high:36   
##  1st Qu.:19.159   1st Qu.: 4.800   low :40   
##  Median :23.991   Median : 6.500             
##  Mean   :24.863   Mean   : 8.206             
##  3rd Qu.:29.136   3rd Qu.: 9.550             
##  Max.   :55.089   Max.   :24.650

Splitting Data

Evaluasi performa model machine learning dapat menggunakan Spliting Data. Data akan dibagi menjadi dua bagian, yaitu data train atau (data latih) dan data test (data uji). Data train digunakan untuk membuat model dan data test digunakan untuk evaluasi kebaikan model dari data train.

set.seed(123)
index2 <- createDataPartition(data2$Risk.Level, p = 0.8,list = FALSE)
# Membagi data menjadi data train dan data test
train.data2index <- data2[index2,]
dim(train.data2index)
## [1] 61 15
test.data2index <- data2[-index2,]
dim(test.data2index)
## [1] 15 15
table(data2$Risk.Level)
## 
## high  low 
##   36   40

Interpretasi Model

# Menggunakan fungsi rpart untk memodelkan dengan Classification Tree
Xtree2 <- rpart(Risk.Level~., data = train.data2index, method = "class",control = rpart.control(cp = 0.008,minsplit=4))
Xtree2
## n= 61 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 61 29 low (0.47540984 0.52459016)  
##    2) X2< 10159.16 26  2 high (0.92307692 0.07692308)  
##      4) X9>=-7.26356 24  0 high (1.00000000 0.00000000) *
##      5) X9< -7.26356 2  0 low (0.00000000 1.00000000) *
##    3) X2>=10159.16 35  5 low (0.14285714 0.85714286)  
##      6) X11>=3.76645 10  5 high (0.50000000 0.50000000)  
##       12) X13< 25.64303 7  2 high (0.71428571 0.28571429)  
##         24) X2>=12389.68 6  1 high (0.83333333 0.16666667)  
##           48) X8< 101.5426 5  0 high (1.00000000 0.00000000) *
##           49) X8>=101.5426 1  0 low (0.00000000 1.00000000) *
##         25) X2< 12389.68 1  0 low (0.00000000 1.00000000) *
##       13) X13>=25.64303 3  0 low (0.00000000 1.00000000) *
##      7) X11< 3.76645 25  0 low (0.00000000 1.00000000) *

Visualisasi dari model

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

printcp(Xtree2)
## 
## Classification tree:
## rpart(formula = Risk.Level ~ ., data = train.data2index, method = "class", 
##     control = rpart.control(cp = 0.008, minsplit = 4))
## 
## Variables actually used in tree construction:
## [1] X11 X13 X2  X8  X9 
## 
## Root node error: 29/61 = 0.47541
## 
## n= 61 
## 
##         CP nsplit rel error  xerror     xstd
## 1 0.758621      0  1.000000 1.17241 0.133770
## 2 0.068966      1  0.241379 0.27586 0.090912
## 3 0.051724      2  0.172414 0.41379 0.107060
## 4 0.034483      4  0.068966 0.44828 0.110288
## 5 0.008000      6  0.000000 0.31034 0.095512

Menghitung best complexity parameter

Dengan menggunakan hasil pemodelan sebelumnya akan dilakukan prun dengan mencari best complexity parameter terlebih dahulu.

# Explicitly request the lowest cp value
bestcp2<-Xtree2$cptable[which.min(Xtree2$cptable[,"xerror"]),"CP"]
data.frame(Xtree2$cptable)
##           CP nsplit  rel.error    xerror       xstd
## 1 0.75862069      0 1.00000000 1.1724138 0.13376991
## 2 0.06896552      1 0.24137931 0.2758621 0.09091175
## 3 0.05172414      2 0.17241379 0.4137931 0.10705963
## 4 0.03448276      4 0.06896552 0.4482759 0.11028828
## 5 0.00800000      6 0.00000000 0.3103448 0.09551246
bestcp2
## [1] 0.06896552

Visualisasi Prunning tree berdasarkan best complexity parameter

Dari hasil best complexity parameter akan dilakukan prun terhadap model untuk mendapatkan model terbaik berdasarkan CP yaitu sebesar 0.06896552 dan minsplit yaitu sebesar 1.

# Prunning tree based on best cp
Xtreebest2 <- prune(Xtree2, cp = bestcp2)
rpart.plot(Xtreebest2)

Variabel important

arrange(varImp(Xtreebest2),desc(Overall))
##      Overall
## X2  18.16249
## X9  10.77013
## X11 10.65350
## X4  10.22569
## X3   8.18024
## X1   0.00000
## X5   0.00000
## X6   0.00000
## X7   0.00000
## X8   0.00000
## X10  0.00000
## X12  0.00000
## X13  0.00000
## X14  0.00000

Dari output variabel important di atas diperoleh bahwa X2 (GDP per capita (USD)) adalah variable terpenting bagi model classification tree dengan cara menghapus baris yang memuat NA.

Hasil Prediksi

pred2 <- predict(Xtreebest2, test.data2index)
dim(pred2)
## [1] 15  2
head(pred2, n=5)
##         high       low
## 8  0.1428571 0.8571429
## 9  0.1428571 0.8571429
## 10 0.1428571 0.8571429
## 28 0.1428571 0.8571429
## 48 0.1428571 0.8571429
predRL2 <- ifelse(pred2[,1] > 0.5 , "high", "low")

Confusion Matrix

confusionMatrix(as.factor(predRL2), as.factor(test.data2index$Risk.Level))
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction high low
##       high    4   2
##       low     3   6
##                                           
##                Accuracy : 0.6667          
##                  95% CI : (0.3838, 0.8818)
##     No Information Rate : 0.5333          
##     P-Value [Acc > NIR] : 0.2201          
##                                           
##                   Kappa : 0.3243          
##                                           
##  Mcnemar's Test P-Value : 1.0000          
##                                           
##             Sensitivity : 0.5714          
##             Specificity : 0.7500          
##          Pos Pred Value : 0.6667          
##          Neg Pred Value : 0.6667          
##              Prevalence : 0.4667          
##          Detection Rate : 0.2667          
##    Detection Prevalence : 0.4000          
##       Balanced Accuracy : 0.6607          
##                                           
##        'Positive' Class : high            
## 

Akurasi dari yang dihasilkan dari classification tree dengan menghapus baris yang memuat NA diperoleh sebesar 66.67%. Kemudian, jika dilihat pada confusion matrix terlihat bahwa prediksi dari high menjadi high masih cukup baik. Sehingga, model ini dapat dikatakan cukup baik dalam memprediksi kriteria ekonomi terbaik untuk dijadikan landasan berinvestasi.

ROC Plot

# Create ROC graph
ROCval2 <- rocit(score=pred2[,2],class=test.data2index$Risk.Level)
plot(ROCval2)

Nilai AUC

# Calculate AUC value
AUC2 <- ROCval2$AUC
AUC2
## [1] 0.6607143

Nilai AUC yang dihasilkan metode classification tree dengan menghapus baris yang memuat NA ini cukup baik yaitu 66.07%. Metode ini cukup bisa mengklasifikasikan data dengan baik karena nilai akurasinya sebanding dengan nilai sensitivity dan spesifisity yaitu (0.5714 dan 0.75)

By removing Column that having NA

Metode ketiga untuk menangani missing value adalah dengan menghapus kolom (variabel) yang memuat NA. Meskipun teknik ini menyebabkan berkurangnya kriteria penilaian terhadap kondisi ekonomi negara-negara tersebut.

Persiapan Data

# Memanggil data untuk dimasukkan dalam variabel baru bernama data3
data3 <- data
head(data3)
## # A tibble: 6 x 16
##   Country    X1     X2    X3    X4    X5     X6     X7    X8    X9    X10   X11
##   <chr>   <dbl>  <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl>  <dbl> <dbl>
## 1 AD       17.5 38675. 173.   0.68 1.22   1.79  -2.08   55   -26.5   2.86  8   
## 2 AE       18.2 40105. 104.   1.77 0.870  2.66  -0.725 103.  -13.6 353.    8.15
## 3 AE-AZ    18.7 76038.  31.0  2.63 1.49   1.85  -1.90  103.  -56.2 200.    8.15
## 4 AE-RK    NA   27883.  24.8  1.29 1.75   2.23  -1.14  103.   24.8  10.1  NA   
## 5 AM       14    4251.  89.6  1.44 0.256  4.75   2.33  167.   47.3  12.6   6.6 
## 6 AO       NA    2034.  57.1 22.4  3.34  -0.878 -5.20   34.8  15.4  62.5  10.3 
## # ... with 4 more variables: X12 <dbl>, X13 <dbl>, X14 <dbl>, Risk Level <chr>
# cleaning data dengan menghilangkan variabel Country pada data dan menghilangkan variabel yang memuat NA  pada data
data3 <- data3 %>% select(-Country, -X1, -X8, -X11, -X14)
dim(data3)
## [1] 117  11
# Menjadikan data3 menjadi bentuk data frame
data3 <- data.frame(data3)
summary(data3)
##        X2                 X3                X4                X5         
##  Min.   :   434.5   Min.   :  13.63   Min.   :-0.1510   Min.   :-0.8862  
##  1st Qu.:  4223.5   1st Qu.:  43.11   1st Qu.: 0.8435   1st Qu.: 0.3751  
##  Median : 11363.6   Median :  70.35   Median : 1.6986   Median : 1.0511  
##  Mean   : 22596.3   Mean   : 177.50   Mean   : 3.4418   Mean   : 1.1471  
##  3rd Qu.: 34641.3   3rd Qu.: 117.76   3rd Qu.: 4.2064   3rd Qu.: 1.8006  
##  Max.   :124340.4   Max.   :6908.35   Max.   :36.7035   Max.   : 4.4021  
##        X6               X7                X9                X10           
##  Min.   :-5.135   Min.   :-9.8453   Min.   :-1955.72   Min.   :    1.171  
##  1st Qu.: 1.754   1st Qu.:-1.1137   1st Qu.:  -16.23   1st Qu.:   34.539  
##  Median : 2.844   Median : 0.2912   Median :   12.94   Median :  107.796  
##  Mean   : 3.064   Mean   : 0.2206   Mean   :  -14.34   Mean   :  710.336  
##  3rd Qu.: 4.258   3rd Qu.: 1.9242   3rd Qu.:   33.35   3rd Qu.:  375.191  
##  Max.   :10.076   Max.   : 6.0712   Max.   :  456.49   Max.   :20935.000  
##       X12             X13          Risk.Level       
##  Min.   :12.67   Min.   : 8.882   Length:117        
##  1st Qu.:20.16   1st Qu.:18.419   Class :character  
##  Median :23.08   Median :24.226   Mode  :character  
##  Mean   :24.52   Mean   :24.362                     
##  3rd Qu.:27.97   3rd Qu.:29.249                     
##  Max.   :46.83   Max.   :55.089
class(data3$Risk.Level)
## [1] "character"
# Mengubah tipe data pada variabel respon Y menjadi factor
data3$Risk.Level <- as.factor(data3$Risk.Level)

Splitting Data

Evaluasi performa model machine learning dapat menggunakan Spliting Data. Data akan dibagi menjadi dua bagian, yaitu data train atau (data latih) dan data test (data uji). Data train digunakan untuk membuat model dan data test digunakan untuk evaluasi kebaikan model dari data train.

set.seed(123)
index3 <- createDataPartition(data3$Risk.Level, p = 0.8,list = FALSE)
# Membagi data menjadi data train dan data test
train.data3index <- data3[index3,]
dim(train.data3index)
## [1] 95 11
test.data3index <- data3[-index3,]
dim(test.data3index)
## [1] 22 11
table(data3$Risk.Level)
## 
## high  low 
##   64   53

Interpretasi Model

# Menggunakan fungsi rpart untk memodelkan dengan Classification Tree
Xtree3 <- rpart(Risk.Level~., data = train.data3index, method = "class",control = rpart.control(cp = 0.008,minsplit=4))
Xtree3
## n= 95 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 95 43 high (0.54736842 0.45263158)  
##    2) X2< 10001.82 47  3 high (0.93617021 0.06382979)  
##      4) X9>=-8.85936 42  1 high (0.97619048 0.02380952) *
##      5) X9< -8.85936 5  2 high (0.60000000 0.40000000)  
##       10) X4>=2.81052 3  0 high (1.00000000 0.00000000) *
##       11) X4< 2.81052 2  0 low (0.00000000 1.00000000) *
##    3) X2>=10001.82 48  8 low (0.16666667 0.83333333)  
##      6) X2< 22319.62 16  7 low (0.43750000 0.56250000)  
##       12) X10< 66.87607 5  0 high (1.00000000 0.00000000) *
##       13) X10>=66.87607 11  2 low (0.18181818 0.81818182)  
##         26) X3>=177.1846 1  0 high (1.00000000 0.00000000) *
##         27) X3< 177.1846 10  1 low (0.10000000 0.90000000) *
##      7) X2>=22319.62 32  1 low (0.03125000 0.96875000) *

Visualisasi dari model

#visualisasi dari model
rpart.plot(Xtree3, extra=4,box.palette="RdBu", shadow.col="gray", nn=TRUE)

printcp(Xtree3)
## 
## Classification tree:
## rpart(formula = Risk.Level ~ ., data = train.data3index, method = "class", 
##     control = rpart.control(cp = 0.008, minsplit = 4))
## 
## Variables actually used in tree construction:
## [1] X10 X2  X3  X4  X9 
## 
## Root node error: 43/95 = 0.45263
## 
## n= 95 
## 
##         CP nsplit rel error  xerror     xstd
## 1 0.744186      0  1.000000 1.00000 0.112825
## 2 0.058140      1  0.255814 0.39535 0.086884
## 3 0.023256      3  0.139535 0.39535 0.086884
## 4 0.008000      6  0.069767 0.39535 0.086884

Menghitung best complexity parameter

Dengan menggunakan hasil pemodelan sebelumnya akan dilakukan prun dengan mencari best complexity parameter terlebih dahulu.

# Explicitly request the lowest cp value
bestcp3<-Xtree3$cptable[which.min(Xtree3$cptable[,"xerror"]),"CP"]
data.frame(Xtree3$cptable)
##           CP nsplit  rel.error    xerror       xstd
## 1 0.74418605      0 1.00000000 1.0000000 0.11282508
## 2 0.05813953      1 0.25581395 0.3953488 0.08688434
## 3 0.02325581      3 0.13953488 0.3953488 0.08688434
## 4 0.00800000      6 0.06976744 0.3953488 0.08688434
bestcp3
## [1] 0.05813953

Visualisasi Prunning tree berdasarkan best complexity parameter

Dari hasil best complexity parameter akan dilakukan prun terhadap model untuk mendapatkan model terbaik berdasarkan CP yaitu sebesar 0.05813953 dan minsplit yaitu sebesar 1.

#Prunning tree based on best cp
Xtreebest3 <- prune(Xtree3, cp = bestcp3)
rpart.plot(Xtreebest3)

Variabel important

arrange(varImp(Xtreebest3), desc(Overall))
##       Overall
## X2  28.123330
## X4  14.921303
## X9  11.737216
## X10 11.165813
## X13  9.637192
## X3   0.000000
## X5   0.000000
## X6   0.000000
## X7   0.000000
## X12  0.000000

Dari output variabel important di atas diperoleh bahwa X2 (GDP per capita (USD)) adalah variable terpenting bagi model classification tree dengan cara menghapus kolom (variabel) yang memuat NA.

Hasil Prediksi

pred3 <- predict(Xtreebest3, test.data3index)
dim(pred3)
## [1] 22  2
head(pred3, n=5)
##         high       low
## 1  0.1666667 0.8333333
## 2  0.1666667 0.8333333
## 10 0.1666667 0.8333333
## 20 0.1666667 0.8333333
## 24 0.1666667 0.8333333
predRL3 <- ifelse(pred3[,1] > 0.5 , "high", "low")

Confusion Matrix

confusionMatrix(as.factor(predRL3), as.factor(test.data3index$Risk.Level))
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction high low
##       high    7   1
##       low     5   9
##                                           
##                Accuracy : 0.7273          
##                  95% CI : (0.4978, 0.8927)
##     No Information Rate : 0.5455          
##     P-Value [Acc > NIR] : 0.06495         
##                                           
##                   Kappa : 0.4677          
##                                           
##  Mcnemar's Test P-Value : 0.22067         
##                                           
##             Sensitivity : 0.5833          
##             Specificity : 0.9000          
##          Pos Pred Value : 0.8750          
##          Neg Pred Value : 0.6429          
##              Prevalence : 0.5455          
##          Detection Rate : 0.3182          
##    Detection Prevalence : 0.3636          
##       Balanced Accuracy : 0.7417          
##                                           
##        'Positive' Class : high            
## 

Akurasi dari yang dihasilkan dari classification tree dengan menghapus kolom (variabel) yang memuat NA diperoleh sebesar 72.737%. Kemudian, jika dilihat pada confusion matrix terlihat bahwa prediksi dari high menjadi high cenderung lebih besar dibandingkan prediksi dari high menjadi lownya. Sehingga, model ini dapat dikatakan baik dalam memprediksi kriteria ekonomi terbaik untuk dijadikan landasan berinvestasi.

ROC Plot

#Create ROC graph
ROCval3 <- rocit(score=pred3[,2],class=test.data3index$Risk.Level)
plot(ROCval3)

Nilai AUC

# Calculate AUC value
AUC3 <- ROCval3$AUC
AUC3
## [1] 0.7416667

Nilai AUC yang dihasilkan cukup baik yaitu 74.17%. Metode classification tree dengan menghapus kolom (variabel) yang memuat NA ini cukup bisa mengklasifikasikan data dengan baik karena nilai akurasinya sebanding dengan nilai sensitivity dan spesifisity yaitu (0.5833 dan 0.90)

By KNN Imputation

Metode keempat untuk menangani missing value adalah dengan KNN Imputation. Metode ini mengganti nilai NA dengan estimasi nilai tetangganya.

# Memanggil data untuk dimasukkan dalam variabel baru bernama data4
data4 <- data
head(data4)
## # A tibble: 6 x 16
##   Country    X1     X2    X3    X4    X5     X6     X7    X8    X9    X10   X11
##   <chr>   <dbl>  <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl>  <dbl> <dbl>
## 1 AD       17.5 38675. 173.   0.68 1.22   1.79  -2.08   55   -26.5   2.86  8   
## 2 AE       18.2 40105. 104.   1.77 0.870  2.66  -0.725 103.  -13.6 353.    8.15
## 3 AE-AZ    18.7 76038.  31.0  2.63 1.49   1.85  -1.90  103.  -56.2 200.    8.15
## 4 AE-RK    NA   27883.  24.8  1.29 1.75   2.23  -1.14  103.   24.8  10.1  NA   
## 5 AM       14    4251.  89.6  1.44 0.256  4.75   2.33  167.   47.3  12.6   6.6 
## 6 AO       NA    2034.  57.1 22.4  3.34  -0.878 -5.20   34.8  15.4  62.5  10.3 
## # ... with 4 more variables: X12 <dbl>, X13 <dbl>, X14 <dbl>, Risk Level <chr>
# cleaning data dengan menghilangkan variabel Country pada data
data4 <- data %>% select(-Country)
# Mengganti nilai NA dengan nilai estimasi dengan KNN Imputation
data4 <- kNN(data4, variable = c("X1", "X8", "X11", "X14"), k=5)
dim(data4)
## [1] 117  19
# Menjadikan data4 menjadi bentuk data frame
data4 <- data.frame(data4)
class(data4$Risk.Level)
## [1] "character"
#mengubah tipe data pada variabel respon Y menjadi factor
data4$Risk.Level <- as.factor(data4$Risk.Level)
summary(data4)
##        X1              X2                 X3                X4         
##  Min.   : 4.20   Min.   :   434.5   Min.   :  13.63   Min.   :-0.1510  
##  1st Qu.:16.00   1st Qu.:  4223.5   1st Qu.:  43.11   1st Qu.: 0.8435  
##  Median :18.40   Median : 11363.6   Median :  70.35   Median : 1.6986  
##  Mean   :18.63   Mean   : 22596.3   Mean   : 177.50   Mean   : 3.4418  
##  3rd Qu.:21.38   3rd Qu.: 34641.3   3rd Qu.: 117.76   3rd Qu.: 4.2064  
##  Max.   :47.50   Max.   :124340.4   Max.   :6908.35   Max.   :36.7035  
##        X5                X6               X7                X8        
##  Min.   :-0.8862   Min.   :-5.135   Min.   :-9.8453   Min.   : 34.82  
##  1st Qu.: 0.3751   1st Qu.: 1.754   1st Qu.:-1.1137   1st Qu.: 76.95  
##  Median : 1.0511   Median : 2.844   Median : 0.2912   Median : 90.43  
##  Mean   : 1.1471   Mean   : 3.064   Mean   : 0.2206   Mean   : 99.13  
##  3rd Qu.: 1.8006   3rd Qu.: 4.258   3rd Qu.: 1.9242   3rd Qu.:111.94  
##  Max.   : 4.4021   Max.   :10.076   Max.   : 6.0712   Max.   :359.14  
##        X9                X10                 X11               X12       
##  Min.   :-1955.72   Min.   :    1.171   Min.   : 0.3357   Min.   :12.67  
##  1st Qu.:  -16.23   1st Qu.:   34.539   1st Qu.: 1.8500   1st Qu.:20.16  
##  Median :   12.94   Median :  107.796   Median : 3.3357   Median :23.08  
##  Mean   :  -14.34   Mean   :  710.336   Mean   : 5.8077   Mean   :24.52  
##  3rd Qu.:   33.35   3rd Qu.:  375.191   3rd Qu.: 6.4000   3rd Qu.:27.97  
##  Max.   :  456.49   Max.   :20935.000   Max.   :63.5000   Max.   :46.83  
##       X13              X14         Risk.Level   X1_imp          X8_imp       
##  Min.   : 8.882   Min.   : 0.120   high:64    Mode :logical   Mode :logical  
##  1st Qu.:18.419   1st Qu.: 4.818   low :53    FALSE:104       FALSE:108      
##  Median :24.226   Median : 7.000              TRUE :13        TRUE :9        
##  Mean   :24.362   Mean   : 8.501                                             
##  3rd Qu.:29.249   3rd Qu.:10.300                                             
##  Max.   :55.089   Max.   :33.700                                             
##   X11_imp         X14_imp       
##  Mode :logical   Mode :logical  
##  FALSE:96        FALSE:105      
##  TRUE :21        TRUE :12       
##                                 
##                                 
## 

Splitting Data

Evaluasi performa model machine learning dapat menggunakan Spliting Data. Data akan dibagi menjadi dua bagian, yaitu data train atau (data latih) dan data test (data uji). Data train digunakan untuk membuat model dan data test digunakan untuk evaluasi kebaikan model dari data train.

set.seed(123)
index4 <- createDataPartition(data4$Risk.Level, p = 0.8,list = FALSE)
# Membagi data menjadi data train dan data test
train.data4index <- data4[index4,]
dim(train.data4index)
## [1] 95 19
test.data4index <- data4[-index4,]
dim(test.data4index)
## [1] 22 19
table(data4$Risk.Level)
## 
## high  low 
##   64   53

Interpretasi Model

# Menggunakan fungsi rpart untk memodelkan dengan Classification Tree
Xtree4 <- rpart(Risk.Level~., data = train.data4index, method = "class",
                control = rpart.control(cp = 0.008,minsplit=4))
Xtree4
## n= 95 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 95 43 high (0.54736842 0.45263158)  
##    2) X2< 10001.82 47  3 high (0.93617021 0.06382979)  
##      4) X9>=-8.85936 42  1 high (0.97619048 0.02380952) *
##      5) X9< -8.85936 5  2 high (0.60000000 0.40000000)  
##       10) X4>=2.81052 3  0 high (1.00000000 0.00000000) *
##       11) X4< 2.81052 2  0 low (0.00000000 1.00000000) *
##    3) X2>=10001.82 48  8 low (0.16666667 0.83333333)  
##      6) X14>=10 5  1 high (0.80000000 0.20000000)  
##       12) X6< 2.42191 4  0 high (1.00000000 0.00000000) *
##       13) X6>=2.42191 1  0 low (0.00000000 1.00000000) *
##      7) X14< 10 43  4 low (0.09302326 0.90697674)  
##       14) X11>=3.79115 10  4 low (0.40000000 0.60000000)  
##         28) X10< 62.6373 3  0 high (1.00000000 0.00000000) *
##         29) X10>=62.6373 7  1 low (0.14285714 0.85714286)  
##           58) X6>=4.16883 1  0 high (1.00000000 0.00000000) *
##           59) X6< 4.16883 6  0 low (0.00000000 1.00000000) *
##       15) X11< 3.79115 33  0 low (0.00000000 1.00000000) *

Visualisasi dari model

# Visualisasi dari model
rpart.plot(Xtree4, extra=4,box.palette="RdBu", shadow.col="gray", nn=TRUE)

printcp(Xtree4)
## 
## Classification tree:
## rpart(formula = Risk.Level ~ ., data = train.data4index, method = "class", 
##     control = rpart.control(cp = 0.008, minsplit = 4))
## 
## Variables actually used in tree construction:
## [1] X10 X11 X14 X2  X4  X6  X9 
## 
## Root node error: 43/95 = 0.45263
## 
## n= 95 
## 
##         CP nsplit rel error  xerror     xstd
## 1 0.744186      0  1.000000 1.00000 0.112825
## 2 0.069767      1  0.255814 0.39535 0.086884
## 3 0.034884      2  0.186047 0.44186 0.090668
## 4 0.023256      4  0.116279 0.41860 0.088828
## 5 0.008000      8  0.023256 0.46512 0.092409

Menghitung best complexity parameter

Dengan menggunakan hasil pemodelan sebelumnya akan dilakukan prun dengan mencari best complexity parameter terlebih dahulu.

bestcp4<-Xtree4$cptable[which.min(Xtree4$cptable[,"xerror"]),"CP"]
data.frame(Xtree4$cptable)
##           CP nsplit  rel.error    xerror       xstd
## 1 0.74418605      0 1.00000000 1.0000000 0.11282508
## 2 0.06976744      1 0.25581395 0.3953488 0.08688434
## 3 0.03488372      2 0.18604651 0.4418605 0.09066785
## 4 0.02325581      4 0.11627907 0.4186047 0.08882830
## 5 0.00800000      8 0.02325581 0.4651163 0.09240923
bestcp4
## [1] 0.06976744

Visualisasi Prunning tree berdasarkan best complexity parameter

Dari hasil best complexity parameter akan dilakukan prun terhadap model untuk mendapatkan model terbaik berdasarkan CP yaitu sebesar 0.06976744 dan minsplit yaitu sebesar 1.

#Prunning tree based on best cp
Xtreebest4 <- prune(Xtree4, cp = bestcp4)
rpart.plot(Xtreebest4)

Variabel important

arrange(varImp(Xtreebest4), desc(Overall))
##          Overall
## X2      28.12333
## X11     16.70441
## X4      14.92130
## X9      11.73722
## X10     11.16581
## X1       0.00000
## X3       0.00000
## X5       0.00000
## X6       0.00000
## X7       0.00000
## X8       0.00000
## X12      0.00000
## X13      0.00000
## X14      0.00000
## X1_imp   0.00000
## X8_imp   0.00000
## X11_imp  0.00000
## X14_imp  0.00000

Dari output variabel important di atas diperoleh bahwa X2 (GDP per capita (USD)) adalah variable terpenting bagi model classification tree dengan KNN Imputation.

Hasil Prediksi

pred4 <- predict(Xtreebest4, test.data4index)
dim(pred4)
## [1] 22  2
head(pred4, n=5)
##         high       low
## 1  0.1666667 0.8333333
## 2  0.1666667 0.8333333
## 10 0.1666667 0.8333333
## 20 0.1666667 0.8333333
## 24 0.1666667 0.8333333
predRL4 <- ifelse(pred4[,1] > 0.5 , "high", "low")

Confusion Matrix

confusionMatrix(as.factor(predRL4), as.factor(test.data4index$Risk.Level))
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction high low
##       high    7   1
##       low     5   9
##                                           
##                Accuracy : 0.7273          
##                  95% CI : (0.4978, 0.8927)
##     No Information Rate : 0.5455          
##     P-Value [Acc > NIR] : 0.06495         
##                                           
##                   Kappa : 0.4677          
##                                           
##  Mcnemar's Test P-Value : 0.22067         
##                                           
##             Sensitivity : 0.5833          
##             Specificity : 0.9000          
##          Pos Pred Value : 0.8750          
##          Neg Pred Value : 0.6429          
##              Prevalence : 0.5455          
##          Detection Rate : 0.3182          
##    Detection Prevalence : 0.3636          
##       Balanced Accuracy : 0.7417          
##                                           
##        'Positive' Class : high            
## 

Akurasi dari yang dihasilkan dari classification tree dengan KNN Imputation diperoleh sebesar 72.73%. Kemudian, jika dilihat pada confusion matrix terlihat bahwa prediksi dari high menjadi high cenderung lebih besar dibandingkan prediksi dari high menjadi lownya. Sehingga, model ini dapat dikatakan baik dalam memprediksi kriteria ekonomi terbaik untuk dijadikan landasan berinvestasi.

ROC Plot

# Create ROC graph
ROCval4 <- rocit(score=pred4[,2],class=test.data4index$Risk.Level)
plot(ROCval4)

Nilai AUC

# Calculate AUC value
AUC4 <- ROCval4$AUC
AUC4
## [1] 0.7416667

Nilai AUC yang dihasilkan cukup baik yaitu 74.17% metode classification tree dengan KNN Imputation ini cukup bisa mengklasifikasikan data dengan baik karena nilai akurasinya sebanding dengan nilai sensitivity dan spesifisity yaitu (0.5833 dan 0.90).

By Mean Imputation Method

Metode kelima untuk menangani missing value adalah dengan Mean Imputation Method. Metode ini mengganti nilai NA dengan nilai mean dari kolom (variabel) yang memuat NA.

# Memanggil data untuk dimasukkan dalam variabel baru bernama data5
data5 <- data
# cleaning data dengan menghilangkan variabel Country pada data
data5 <- data5 %>% select(-Country)
# Mengganti nilai NA dengan nilai mean dari masing-masing kolom (variabel) yang memuat nA
data5$X1[is.na(data5$X1)] <- mean(data5$X1, na.rm = TRUE)
data5$X8[is.na(data5$X8)] <- mean(data5$X8, na.rm = TRUE)
data5$X11[is.na(data5$X11)] <- mean(data5$X11, na.rm = TRUE)
data5$X14[is.na(data5$X14)] <- mean(data5$X14, na.rm = TRUE)
dim(data5)
## [1] 117  15
data5 <- data.frame(data5)
summary(data5)
##        X1              X2                 X3                X4         
##  Min.   : 4.20   Min.   :   434.5   Min.   :  13.63   Min.   :-0.1510  
##  1st Qu.:16.10   1st Qu.:  4223.5   1st Qu.:  43.11   1st Qu.: 0.8435  
##  Median :18.73   Median : 11363.6   Median :  70.35   Median : 1.6986  
##  Mean   :18.73   Mean   : 22596.3   Mean   : 177.50   Mean   : 3.4418  
##  3rd Qu.:20.70   3rd Qu.: 34641.3   3rd Qu.: 117.76   3rd Qu.: 4.2064  
##  Max.   :47.50   Max.   :124340.4   Max.   :6908.35   Max.   :36.7035  
##        X5                X6               X7                X8        
##  Min.   :-0.8862   Min.   :-5.135   Min.   :-9.8453   Min.   : 34.82  
##  1st Qu.: 0.3751   1st Qu.: 1.754   1st Qu.:-1.1137   1st Qu.: 77.34  
##  Median : 1.0511   Median : 2.844   Median : 0.2912   Median : 93.36  
##  Mean   : 1.1471   Mean   : 3.064   Mean   : 0.2206   Mean   : 99.47  
##  3rd Qu.: 1.8006   3rd Qu.: 4.258   3rd Qu.: 1.9242   3rd Qu.:111.79  
##  Max.   : 4.4021   Max.   :10.076   Max.   : 6.0712   Max.   :359.14  
##        X9                X10                 X11               X12       
##  Min.   :-1955.72   Min.   :    1.171   Min.   : 0.3357   Min.   :12.67  
##  1st Qu.:  -16.23   1st Qu.:   34.539   1st Qu.: 2.1500   1st Qu.:20.16  
##  Median :   12.94   Median :  107.796   Median : 4.8292   Median :23.08  
##  Mean   :  -14.34   Mean   :  710.336   Mean   : 6.3096   Mean   :24.52  
##  3rd Qu.:   33.35   3rd Qu.:  375.191   3rd Qu.: 6.3096   3rd Qu.:27.97  
##  Max.   :  456.49   Max.   :20935.000   Max.   :63.5000   Max.   :46.83  
##       X13              X14          Risk.Level       
##  Min.   : 8.882   Min.   : 0.120   Length:117        
##  1st Qu.:18.419   1st Qu.: 5.000   Class :character  
##  Median :24.226   Median : 7.300   Mode  :character  
##  Mean   :24.362   Mean   : 8.521                     
##  3rd Qu.:29.249   3rd Qu.: 9.700                     
##  Max.   :55.089   Max.   :33.700
class(data5$Risk.Level)
## [1] "character"
#mengubah tipe data pada variabel respon Y menjadi factor
data5$Risk.Level <- as.factor(data5$Risk.Level)

Splitting Data

Evaluasi performa model machine learning dapat menggunakan Spliting Data. Data akan dibagi menjadi dua bagian, yaitu data train atau (data latih) dan data test (data uji). Data train digunakan untuk membuat model dan data test digunakan untuk evaluasi kebaikan model dari data train.

set.seed(123)
index5 <- createDataPartition(data5$Risk.Level, p = 0.8,list = FALSE)
#membagi data menjadi data train dan data test
train.data5index <- data5[index5,]
dim(train.data5index)
## [1] 95 15
test.data5index <- data5[-index5,]
dim(test.data5index)
## [1] 22 15
table(data5$Risk.Level)
## 
## high  low 
##   64   53

Interpretasi Model

# Menggunakan fungsi rpart untk memodelkan dengan Classification Tree
Xtree5 <- rpart(Risk.Level~., data = train.data5index, method = "class",
                control = rpart.control(cp = 0.008,minsplit=4))
Xtree5
## n= 95 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 95 43 high (0.54736842 0.45263158)  
##    2) X2< 10001.82 47  3 high (0.93617021 0.06382979)  
##      4) X9>=-8.85936 42  1 high (0.97619048 0.02380952) *
##      5) X9< -8.85936 5  2 high (0.60000000 0.40000000)  
##       10) X4>=2.81052 3  0 high (1.00000000 0.00000000) *
##       11) X4< 2.81052 2  0 low (0.00000000 1.00000000) *
##    3) X2>=10001.82 48  8 low (0.16666667 0.83333333)  
##      6) X2< 22319.62 16  7 low (0.43750000 0.56250000)  
##       12) X10< 66.87607 5  0 high (1.00000000 0.00000000) *
##       13) X10>=66.87607 11  2 low (0.18181818 0.81818182)  
##         26) X3>=177.1846 1  0 high (1.00000000 0.00000000) *
##         27) X3< 177.1846 10  1 low (0.10000000 0.90000000) *
##      7) X2>=22319.62 32  1 low (0.03125000 0.96875000) *

Visualisasi dari model

# visualisasi dari model
rpart.plot(Xtree5, extra=4,box.palette="RdBu", shadow.col="gray", nn=TRUE)

printcp(Xtree5)
## 
## Classification tree:
## rpart(formula = Risk.Level ~ ., data = train.data5index, method = "class", 
##     control = rpart.control(cp = 0.008, minsplit = 4))
## 
## Variables actually used in tree construction:
## [1] X10 X2  X3  X4  X9 
## 
## Root node error: 43/95 = 0.45263
## 
## n= 95 
## 
##         CP nsplit rel error  xerror     xstd
## 1 0.744186      0  1.000000 1.00000 0.112825
## 2 0.058140      1  0.255814 0.39535 0.086884
## 3 0.023256      3  0.139535 0.39535 0.086884
## 4 0.008000      6  0.069767 0.44186 0.090668

Menghitung best complexity parameter

Dengan menggunakan hasil pemodelan sebelumnya akan dilakukan prun dengan mencari best complexity parameter terlebih dahulu.

# Explicitly request the lowest cp value
bestcp5<-Xtree5$cptable[which.min(Xtree5$cptable[,"xerror"]),"CP"]
data.frame(Xtree5$cptable)
##           CP nsplit  rel.error    xerror       xstd
## 1 0.74418605      0 1.00000000 1.0000000 0.11282508
## 2 0.05813953      1 0.25581395 0.3953488 0.08688434
## 3 0.02325581      3 0.13953488 0.3953488 0.08688434
## 4 0.00800000      6 0.06976744 0.4418605 0.09066785
bestcp5
## [1] 0.05813953

Visualisasi Prunning tree berdasarkan best complexity parameter

Dari hasil best complexity parameter akan dilakukan prun terhadap model untuk mendapatkan model terbaik berdasarkan CP yaitu sebesar 0.05813953 dan minsplit yaitu sebesar 1.

# Prunning tree based on best cp
Xtreebest5 <- prune(Xtree5, cp = bestcp5)
rpart.plot(Xtreebest5)

Variabel important

arrange(varImp(Xtreebest5), desc(Overall))
##      Overall
## X2  28.12333
## X4  14.92130
## X11 12.34948
## X9  11.73722
## X10 11.16581
## X1   0.00000
## X3   0.00000
## X5   0.00000
## X6   0.00000
## X7   0.00000
## X8   0.00000
## X12  0.00000
## X13  0.00000
## X14  0.00000

Dari output variabel important di atas diperoleh bahwa X2 (GDP per capita (USD)) adalah variable terpenting bagi model classification tree dengan Mean Imputation Method.

Hasil Prediksi

pred5 <- predict(Xtreebest5, test.data5index)
dim(pred5)
## [1] 22  2
head(pred5, n=5)
##         high       low
## 1  0.1666667 0.8333333
## 2  0.1666667 0.8333333
## 10 0.1666667 0.8333333
## 20 0.1666667 0.8333333
## 24 0.1666667 0.8333333
predRL5 <- ifelse(pred5[,1] > 0.5 , "high", "low")

Confusion Matrix

confusionMatrix(as.factor(predRL5), as.factor(test.data5index$Risk.Level))
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction high low
##       high    7   1
##       low     5   9
##                                           
##                Accuracy : 0.7273          
##                  95% CI : (0.4978, 0.8927)
##     No Information Rate : 0.5455          
##     P-Value [Acc > NIR] : 0.06495         
##                                           
##                   Kappa : 0.4677          
##                                           
##  Mcnemar's Test P-Value : 0.22067         
##                                           
##             Sensitivity : 0.5833          
##             Specificity : 0.9000          
##          Pos Pred Value : 0.8750          
##          Neg Pred Value : 0.6429          
##              Prevalence : 0.5455          
##          Detection Rate : 0.3182          
##    Detection Prevalence : 0.3636          
##       Balanced Accuracy : 0.7417          
##                                           
##        'Positive' Class : high            
## 

Akurasi dari yang dihasilkan dari classification tree dengan Mean Imputation Method diperoleh sebesar 72.73%. Kemudian, jika dilihat pada confusion matrix terlihat bahwa prediksi dari high menjadi high cenderung lebih besar dibandingkan prediksi dari high menjadi lownya. Sehingga, model ini dapat dikatakan baik dalam memprediksi kriteria ekonomi terbaik untuk dijadikan landasan berinvestasi.

ROC Plot

# Create ROC graph
ROCval5 <- rocit(score=pred5[,2],class=test.data5index$Risk.Level)
plot(ROCval5)

Nilai AUC

# Calculate AUC value
AUC5 <- ROCval5$AUC
AUC5
## [1] 0.7416667

Nilai AUC yang dihasilkan cukup baik yaitu 74.17% metode classification tree dengan Mean Imputation Method cukup bisa mengklasifikasikan data dengan baik karena nilai akurasinya sebanding dengan nilai sensitivity dan spesifisity yaitu (0.5833 dan 0.90)

By Median Imputation Method

Metode keenam untuk menangani missing value adalah dengan Median Imputation. Metode ini mengganti nilai NA dengan nilai median dari kolom (variabel) yang memuat nilai NA.

Persiapan Data

# Memanggil data untuk dimasukkan dalam variabel baru bernama data6
data6 <- data
# Mengganti nilai NA nilai median dari kolom (variabel) yang memuat nilai NA dari data6
data6 <- data6 %>% select(-Country)
data6$X1[is.na(data6$X1)] <- median(data6$X1, na.rm = TRUE)
data6$X8[is.na(data6$X8)] <- median(data6$X8, na.rm = TRUE)
data6$X11[is.na(data6$X11)] <- median(data6$X11, na.rm = TRUE)
data6$X14[is.na(data6$X14)] <- median(data6$X14, na.rm = TRUE)
dim(data6)
## [1] 117  15
data6 <- data.frame(data6)
summary(data6)
##        X1              X2                 X3                X4         
##  Min.   : 4.20   Min.   :   434.5   Min.   :  13.63   Min.   :-0.1510  
##  1st Qu.:16.10   1st Qu.:  4223.5   1st Qu.:  43.11   1st Qu.: 0.8435  
##  Median :18.35   Median : 11363.6   Median :  70.35   Median : 1.6986  
##  Mean   :18.69   Mean   : 22596.3   Mean   : 177.50   Mean   : 3.4418  
##  3rd Qu.:20.70   3rd Qu.: 34641.3   3rd Qu.: 117.76   3rd Qu.: 4.2064  
##  Max.   :47.50   Max.   :124340.4   Max.   :6908.35   Max.   :36.7035  
##        X5                X6               X7                X8        
##  Min.   :-0.8862   Min.   :-5.135   Min.   :-9.8453   Min.   : 34.82  
##  1st Qu.: 0.3751   1st Qu.: 1.754   1st Qu.:-1.1137   1st Qu.: 77.34  
##  Median : 1.0511   Median : 2.844   Median : 0.2912   Median : 90.02  
##  Mean   : 1.1471   Mean   : 3.064   Mean   : 0.2206   Mean   : 98.74  
##  3rd Qu.: 1.8006   3rd Qu.: 4.258   3rd Qu.: 1.9242   3rd Qu.:111.79  
##  Max.   : 4.4021   Max.   :10.076   Max.   : 6.0712   Max.   :359.14  
##        X9                X10                 X11               X12       
##  Min.   :-1955.72   Min.   :    1.171   Min.   : 0.3357   Min.   :12.67  
##  1st Qu.:  -16.23   1st Qu.:   34.539   1st Qu.: 2.1500   1st Qu.:20.16  
##  Median :   12.94   Median :  107.796   Median : 3.6018   Median :23.08  
##  Mean   :  -14.34   Mean   :  710.336   Mean   : 5.8236   Mean   :24.52  
##  3rd Qu.:   33.35   3rd Qu.:  375.191   3rd Qu.: 6.2000   3rd Qu.:27.97  
##  Max.   :  456.49   Max.   :20935.000   Max.   :63.5000   Max.   :46.83  
##       X13              X14          Risk.Level       
##  Min.   : 8.882   Min.   : 0.120   Length:117        
##  1st Qu.:18.419   1st Qu.: 5.000   Class :character  
##  Median :24.226   Median : 7.000   Mode  :character  
##  Mean   :24.362   Mean   : 8.365                     
##  3rd Qu.:29.249   3rd Qu.: 9.700                     
##  Max.   :55.089   Max.   :33.700
class(data6$Risk.Level)
## [1] "character"
# Mengubah tipe data pada variabel respon Y menjadi factor
data6$Risk.Level <- as.factor(data6$Risk.Level)

Splitting Data

Evaluasi performa model machine learning dapat menggunakan Spliting Data. Data akan dibagi menjadi dua bagian, yaitu data train atau (data latih) dan data test (data uji). Data train digunakan untuk membuat model dan data test digunakan untuk evaluasi kebaikan model dari data train.

set.seed(123)
index6 <- createDataPartition(data6$Risk.Level, p = 0.8,list = FALSE)
# Membagi data menjadi data train dan data test
train.data6index <- data6[index6,]
dim(train.data6index)
## [1] 95 15
test.data6index <- data6[-index6,]
dim(test.data6index)
## [1] 22 15
table(data6$Risk.Level)
## 
## high  low 
##   64   53

Interpretasi Model

# Menggunakan fungsi rpart untk memodelkan dengan Classification Tree
Xtree6 <- rpart(Risk.Level~., data = train.data6index, method = "class",
                control = rpart.control(cp = 0.008,minsplit=4))
Xtree6
## n= 95 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 95 43 high (0.54736842 0.45263158)  
##    2) X2< 10001.82 47  3 high (0.93617021 0.06382979)  
##      4) X9>=-8.85936 42  1 high (0.97619048 0.02380952) *
##      5) X9< -8.85936 5  2 high (0.60000000 0.40000000)  
##       10) X4>=2.81052 3  0 high (1.00000000 0.00000000) *
##       11) X4< 2.81052 2  0 low (0.00000000 1.00000000) *
##    3) X2>=10001.82 48  8 low (0.16666667 0.83333333)  
##      6) X2< 22319.62 16  7 low (0.43750000 0.56250000)  
##       12) X10< 66.87607 5  0 high (1.00000000 0.00000000) *
##       13) X10>=66.87607 11  2 low (0.18181818 0.81818182)  
##         26) X3>=177.1846 1  0 high (1.00000000 0.00000000) *
##         27) X3< 177.1846 10  1 low (0.10000000 0.90000000) *
##      7) X2>=22319.62 32  1 low (0.03125000 0.96875000) *

Visualisasi dari model

# Visualisasi dari model
rpart.plot(Xtree6, extra=4,box.palette="RdBu", shadow.col="gray", nn=TRUE)

printcp(Xtree6)
## 
## Classification tree:
## rpart(formula = Risk.Level ~ ., data = train.data6index, method = "class", 
##     control = rpart.control(cp = 0.008, minsplit = 4))
## 
## Variables actually used in tree construction:
## [1] X10 X2  X3  X4  X9 
## 
## Root node error: 43/95 = 0.45263
## 
## n= 95 
## 
##         CP nsplit rel error  xerror     xstd
## 1 0.744186      0  1.000000 1.00000 0.112825
## 2 0.058140      1  0.255814 0.39535 0.086884
## 3 0.023256      3  0.139535 0.48837 0.094058
## 4 0.008000      6  0.069767 0.53488 0.097096

Menghitung best complexity parameter

Dengan menggunakan hasil pemodelan sebelumnya akan dilakukan prun dengan mencari best complexity parameter terlebih dahulu.

# Explicitly request the lowest cp value
bestcp6<-Xtree6$cptable[which.min(Xtree6$cptable[,"xerror"]),"CP"]
data.frame(Xtree6$cptable)
##           CP nsplit  rel.error    xerror       xstd
## 1 0.74418605      0 1.00000000 1.0000000 0.11282508
## 2 0.05813953      1 0.25581395 0.3953488 0.08688434
## 3 0.02325581      3 0.13953488 0.4883721 0.09405789
## 4 0.00800000      6 0.06976744 0.5348837 0.09709568
bestcp6
## [1] 0.05813953

Visualisasi Prunning tree berdasarkan best complexity parameter

Dari hasil best complexity parameter akan dilakukan prun terhadap model untuk mendapatkan model terbaik berdasarkan CP yaitu sebesar 0.05813953 dan minsplit yaitu sebesar 1.

#Prunning tree based on best cp
Xtreebest6 <- prune(Xtree6, cp = bestcp6)
rpart.plot(Xtreebest6)

Variabel important

arrange(varImp(Xtreebest6), desc(Overall))
##      Overall
## X2  28.12333
## X4  14.92130
## X11 13.92716
## X9  11.73722
## X10 11.16581
## X1   0.00000
## X3   0.00000
## X5   0.00000
## X6   0.00000
## X7   0.00000
## X8   0.00000
## X12  0.00000
## X13  0.00000
## X14  0.00000

Dari output variabel important di atas diperoleh bahwa X2 (GDP per capita (USD)) adalah variable terpenting bagi model classification tree dengan Median Imputation Method.

Hasil Prediksi

pred6 <- predict(Xtreebest6, test.data6index)
dim(pred6)
## [1] 22  2
head(pred6, n=5)
##         high       low
## 1  0.1666667 0.8333333
## 2  0.1666667 0.8333333
## 10 0.1666667 0.8333333
## 20 0.1666667 0.8333333
## 24 0.1666667 0.8333333
predRL6 <- ifelse(pred6[,1] > 0.5 , "high", "low")

Confusion Matrix

confusionMatrix(as.factor(predRL6), as.factor(test.data6index$Risk.Level))
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction high low
##       high    7   1
##       low     5   9
##                                           
##                Accuracy : 0.7273          
##                  95% CI : (0.4978, 0.8927)
##     No Information Rate : 0.5455          
##     P-Value [Acc > NIR] : 0.06495         
##                                           
##                   Kappa : 0.4677          
##                                           
##  Mcnemar's Test P-Value : 0.22067         
##                                           
##             Sensitivity : 0.5833          
##             Specificity : 0.9000          
##          Pos Pred Value : 0.8750          
##          Neg Pred Value : 0.6429          
##              Prevalence : 0.5455          
##          Detection Rate : 0.3182          
##    Detection Prevalence : 0.3636          
##       Balanced Accuracy : 0.7417          
##                                           
##        'Positive' Class : high            
## 

Akurasi dari yang dihasilkan dari classification tree dengan Median Imputation Method diperoleh sebesar 72.73%. Kemudian, jika dilihat pada confusion matrix terlihat bahwa prediksi dari high menjadi high cenderung lebih besar dibandingkan prediksi dari high menjadi lownya. Sehingga, model ini dapat dikatakan baik dalam memprediksi kriteria ekonomi terbaik untuk dijadikan landasan berinvestasi.

ROC Plot

# Create ROC graph
ROCval6 <- rocit(score=pred6[,2],class=test.data6index$Risk.Level)
plot(ROCval6)

Nilai AUC

# Calculate AUC value
AUC6 <- ROCval6$AUC
AUC6
## [1] 0.7416667

Nilai AUC yang dihasilkan cukup baik yaitu 74.17% metode classification tree dengan Median Imputation Method ini cukup bisa mengklasifikasikan data dengan baik karena nilai akurasinya sebanding dengan nilai sensitivity dan specificity yaitu (0.5833 dan 0.90).

Komparasi Metode

AUCVal <- c(AUC, AUC2, AUC3, AUC4, AUC5, AUC6)
mod <- c("Ignoring NA", "Removing Row","Removing Column","KNN Imputation", "Mean Imputation", "Median Imputation")
sensitivitymod <- c(0.75, 0.5714, 0.5833, 0.5833, 0.5833, 0.5833)
specificitymod <- c(0.80, 0.75, 0.90, 0.90, 0.90, 0.90)
accuracymod <- c(0.7727, 0.6667, 0.7416667, 0.7416667, 0.7416667, 0.7416667)
kompmodel <- cbind(mod, AUCVal, sensitivitymod, specificitymod,accuracymod)

colnames(kompmodel)<-c("Model", "AUC", "Sensitivity","Specificity", "Accuracy")
kompmodel<-as.data.frame(kompmodel)
kompmodel
##               Model               AUC Sensitivity Specificity  Accuracy
## 1       Ignoring NA 0.741666666666667        0.75         0.8    0.7727
## 2      Removing Row 0.660714285714286      0.5714        0.75    0.6667
## 3   Removing Column 0.741666666666667      0.5833         0.9 0.7416667
## 4    KNN Imputation 0.741666666666667      0.5833         0.9 0.7416667
## 5   Mean Imputation 0.741666666666667      0.5833         0.9 0.7416667
## 6 Median Imputation 0.741666666666667      0.5833         0.9 0.7416667

Kesimpulan

Berdasarkan hasil pemodelan dengan classification tree diperoleh yaitu:

  1. Kriteria ekonomi (variabel) terbaik untuk membantu memprediksi negara mana saja yang potensial untuk dijadikan tempat berinvestasi yaitu dilihat berdasarkan X2 (GDP per capita (USD))

  2. Model terbaiknya yaitu classification tree dengan ignoring NA. Dimana nilai AUC, nilai Sensitivity, dan Specificitynya cukup seimbang dibanding dengan metode lainnya. Sedangkan jika dilihat berdasarkan confusion matrixnya dalam memprediksi high to high juga lebih baik dibanding lainnya.

Referensi

Kang, H. (2013). The prevention and handling of the missing data. Korean journal of anesthesiology, 64(5), 402.

Scheaffer, R. L. Elementary Survey Sampling/by Ricard L. Sheaffer, William Mendenhall III, R. Lyman Ott y Kenneth G. Gerow (No. 519.2 S2Y 2012.).

Holman, R., & Glas, C. A. (2005). Modelling non