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)
| 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:
- Dibiarkan
- Dengan menghapus baris atau kolom yang memuat missing value
- 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:
Kriteria ekonomi (variabel) terbaik untuk membantu memprediksi negara mana saja yang potensial untuk dijadikan tempat berinvestasi yaitu dilihat berdasarkan X2 (GDP per capita (USD))
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