Memprediksi Level Risiko Investasi Menggunakan SVM
Package
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice
library(readxl)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(mice)
##
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
##
## filter
## The following objects are masked from 'package:base':
##
## cbind, rbind
library(e1071)
library(VIM)
## Loading required package: colorspace
## Loading required package: grid
## VIM is ready to use.
## Suggestions and bug-reports can be submitted at: https://github.com/statistikat/VIM/issues
##
## Attaching package: 'VIM'
## The following object is masked from 'package:datasets':
##
## sleep
library(ggplot2)
library(kableExtra)
##
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
Data
Investment Risk adalah kemungkinan atau ketidakpastian kerugian daripada keuntungan yang diharapkan dari investasi karena jatuhnya harga wajar sekuritas seperti obligasi, saham, real estate, dan sebagainya.
Pada Analisis ini digunakan data level risiko investasi dengan 14 peubah bebas yaitu :
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 years
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
Dengan perubah respon yaitu Risk Level terdiri atas dua kategori yaitu high dan low
Input Data
Data pada halaman Training dimasukan kedalam train.data sedangkan untuk data pada halaman Testing dimasukkan kedalama test.data
train.data <- read_excel("Level Risiko Investasi.xlsx", sheet = "Training")
test.data <- read_excel("Level Risiko Investasi.xlsx", sheet = "Testing")
test.data.ori <- test.data
glimpse(train.data)
## Rows: 100
## Columns: 16
## $ Country <chr> "AD", "AE", "AE-AZ", "AE-RK", "AM", "AO", "AR", "AT", "AU…
## $ X1 <dbl> 17.5000, 18.2000, 18.7000, NA, 14.0000, NA, 23.2527, 18.5…
## $ X2 <dbl> 38674.616, 40105.120, 76037.997, 27882.829, 4251.398, 203…
## $ X3 <dbl> 172.75400, 103.52280, 31.03626, 24.78532, 89.61882, 57.05…
## $ X4 <dbl> 0.68000, 1.76600, 2.63056, 1.29416, 1.44000, 22.35646, 36…
## $ X5 <dbl> 1.2206, 0.8698, 1.4893, 1.7530, 0.2562, 3.3422, 0.9657, 0…
## $ X6 <dbl> 1.78560, 2.65884, 1.85034, 2.23192, 4.74800, -0.87800, -0…
## $ X7 <dbl> -2.0843, -0.7254, -1.9008, -1.1355, 2.3318, -5.2032, -3.7…
## $ X8 <dbl> 55.00000, 102.52738, 102.52738, 102.52738, 166.80851, 34.…
## $ X9 <dbl> -26.52000, -13.59890, -56.24160, 24.78532, 47.27262, 15.4…
## $ X10 <dbl> 2.857862, 352.910575, 199.928422, 10.108892, 12.645460, 6…
## $ X11 <dbl> 8.0000, 8.1550, 8.1550, NA, 6.6000, 10.3000, 10.6000, 2.0…
## $ X12 <dbl> 23.08410, 24.85976, 20.39940, 21.69104, 19.40300, 31.1238…
## $ X13 <dbl> 26.94344, 32.47740, 31.03926, 17.30888, 15.11172, 20.5721…
## $ X14 <dbl> 3.0000, 2.4500, NA, NA, 18.5000, 10.5000, 11.0500, 6.0000…
## $ `Risk Level` <chr> "low", "low", "low", "low", "high", "high", "high", "low"…
glimpse(test.data)
## Rows: 17
## Columns: 15
## $ Country <chr> "SE", "SG", "SI", "SK", "SM", "SV", "TH", "TN", "TR", "TW", "U…
## $ X1 <dbl> 23.2000, 16.8056, 18.2857, 19.6715, 11.9000, NA, 19.8000, 12.9…
## $ X2 <dbl> 60338.0204, 62432.9952, 28684.1682, 21042.7221, 49356.2618, 39…
## $ X3 <dbl> 175.42230, 409.69700, 103.06040, 102.73060, 60.15464, 65.55750…
## $ X4 <dbl> 1.62000, 0.10510, 0.84352, 1.17400, 0.89594, 0.39400, 0.34500,…
## $ X5 <dbl> 0.6755, 0.9068, 0.0746, 0.0734, 0.5865, 0.5042, 0.3153, 1.1173…
## $ X6 <dbl> 2.47168, 2.77600, 3.55290, 3.21976, 1.75420, 2.44734, 3.44058,…
## $ X7 <dbl> 0.3526, 0.2912, 1.9299, 1.2325, -1.1342, -0.1248, 1.2787, -1.5…
## $ X8 <dbl> 185.64097, 94.00211, 72.30708, 111.78982, 88.60514, 88.88685, …
## $ X9 <dbl> 64.14972, -200.98100, 16.23838, 33.35258, -145.43800, 27.33332…
## $ X10 <dbl> 537.609866, 339.988210, 52.761781, 102.567122, 1.490827, 24.63…
## $ X11 <dbl> 0.5000, 1.3095, 3.0176, 2.5300, 63.5000, 1.5706, 3.2000, 13.60…
## $ X12 <dbl> 25.11320, 26.76784, 19.90742, 22.83084, 17.79208, 16.78238, 23…
## $ X13 <dbl> 27.95256, 47.25374, 25.76882, 20.95780, 23.21144, 14.52982, 32…
## $ X14 <dbl> 8.6000, 3.0000, 5.0000, 7.0000, 7.3000, 9.0000, 2.0000, 17.000…
Eksplorasi Data
Melihat Struktur Data
Pada output terlihat bahwa Country dan Risk Level merupakan character (string), peubah Country nantinya akan dihapus dan Risk Level akan menjadi faktor pada analisa ini
str(train.data)
## tibble [100 × 16] (S3: tbl_df/tbl/data.frame)
## $ Country : chr [1:100] "AD" "AE" "AE-AZ" "AE-RK" ...
## $ X1 : num [1:100] 17.5 18.2 18.7 NA 14 ...
## $ X2 : num [1:100] 38675 40105 76038 27883 4251 ...
## $ X3 : num [1:100] 172.8 103.5 31 24.8 89.6 ...
## $ X4 : num [1:100] 0.68 1.77 2.63 1.29 1.44 ...
## $ X5 : num [1:100] 1.221 0.87 1.489 1.753 0.256 ...
## $ X6 : num [1:100] 1.79 2.66 1.85 2.23 4.75 ...
## $ X7 : num [1:100] -2.084 -0.725 -1.901 -1.135 2.332 ...
## $ X8 : num [1:100] 55 103 103 103 167 ...
## $ X9 : num [1:100] -26.5 -13.6 -56.2 24.8 47.3 ...
## $ X10 : num [1:100] 2.86 352.91 199.93 10.11 12.65 ...
## $ X11 : num [1:100] 8 8.15 8.15 NA 6.6 ...
## $ X12 : num [1:100] 23.1 24.9 20.4 21.7 19.4 ...
## $ X13 : num [1:100] 26.9 32.5 31 17.3 15.1 ...
## $ X14 : num [1:100] 3 2.45 NA NA 18.5 ...
## $ Risk Level: chr [1:100] "low" "low" "low" "low" ...
str(test.data)
## tibble [17 × 15] (S3: tbl_df/tbl/data.frame)
## $ Country: chr [1:17] "SE" "SG" "SI" "SK" ...
## $ X1 : num [1:17] 23.2 16.8 18.3 19.7 11.9 ...
## $ X2 : num [1:17] 60338 62433 28684 21043 49356 ...
## $ X3 : num [1:17] 175.4 409.7 103.1 102.7 60.2 ...
## $ X4 : num [1:17] 1.62 0.105 0.844 1.174 0.896 ...
## $ X5 : num [1:17] 0.6755 0.9068 0.0746 0.0734 0.5865 ...
## $ X6 : num [1:17] 2.47 2.78 3.55 3.22 1.75 ...
## $ X7 : num [1:17] 0.353 0.291 1.93 1.232 -1.134 ...
## $ X8 : num [1:17] 185.6 94 72.3 111.8 88.6 ...
## $ X9 : num [1:17] 64.1 -201 16.2 33.4 -145.4 ...
## $ X10 : num [1:17] 537.61 339.99 52.76 102.57 1.49 ...
## $ X11 : num [1:17] 0.5 1.31 3.02 2.53 63.5 ...
## $ X12 : num [1:17] 25.1 26.8 19.9 22.8 17.8 ...
## $ X13 : num [1:17] 28 47.3 25.8 21 23.2 ...
## $ X14 : num [1:17] 8.6 3 5 7 7.3 9 2 17 13.2 3.7 ...
Ringkasan Data
Ringkasan dari train.data dan test.data ada pada output dibawah ini, terdapat variabel yang memiliki missing value atau data hilang
summary(train.data)
## Country X1 X2 X3
## Length:100 Min. : 4.20 Min. : 434.5 Min. : 13.63
## Class :character 1st Qu.:15.93 1st Qu.: 4265.9 1st Qu.: 42.96
## Mode :character Median :18.58 Median : 11659.1 Median : 70.42
## Mean :18.97 Mean : 22641.6 Mean : 191.94
## 3rd Qu.:21.80 3rd Qu.: 34815.2 3rd Qu.: 130.63
## Max. :47.50 Max. :124340.4 Max. :6908.35
## NA's :12
## X4 X5 X6 X7
## Min. :-0.151 Min. :-0.8862 Min. :-5.135 Min. :-9.84530
## 1st Qu.: 0.869 1st Qu.: 0.4419 1st Qu.: 1.765 1st Qu.:-1.18720
## Median : 1.700 Median : 1.1402 Median : 2.984 Median : 0.07155
## Mean : 3.263 Mean : 1.2019 Mean : 3.076 Mean : 0.10804
## 3rd Qu.: 3.939 3rd Qu.: 1.9502 3rd Qu.: 4.305 3rd Qu.: 1.94108
## Max. :36.703 Max. : 4.4021 Max. :10.076 Max. : 6.07120
##
## X8 X9 X10 X11
## Min. : 34.82 Min. :-1955.72 Min. : 1.171 Min. : 0.3357
## 1st Qu.: 76.95 1st Qu.: -14.11 1st Qu.: 32.813 1st Qu.: 1.9250
## Median : 90.19 Median : 12.67 Median : 106.872 Median : 3.9000
## Mean : 99.94 Mean : -13.58 Mean : 582.318 Mean : 5.5346
## 3rd Qu.:113.39 3rd Qu.: 36.67 3rd Qu.: 366.370 3rd Qu.: 7.9500
## Max. :359.14 Max. : 456.49 Max. :14866.703 Max. :26.9780
## NA's :7 NA's :17
## X12 X13 X14 Risk Level
## Min. :12.67 Min. :10.95 Min. : 0.120 Length:100
## 1st Qu.:20.79 1st Qu.:19.06 1st Qu.: 4.818 Class :character
## Median :23.40 Median :24.28 Median : 6.800 Mode :character
## Mean :24.96 Mean :24.48 Mean : 8.441
## 3rd Qu.:28.38 3rd Qu.:29.36 3rd Qu.:10.500
## Max. :46.83 Max. :55.09 Max. :24.650
## NA's :11
summary(test.data)
## Country X1 X2 X3
## Length:17 Min. :11.90 Min. : 786.9 Min. : 30.05
## Class :character 1st Qu.:15.76 1st Qu.: 3955.1 1st Qu.: 48.51
## Mode :character Median :17.52 Median : 8653.0 Median : 65.56
## Mean :17.42 Mean :22330.4 Mean : 92.59
## 3rd Qu.:19.70 3rd Qu.:31854.3 3rd Qu.:103.06
## Max. :23.20 Max. :69324.7 Max. :409.70
## NA's :1
## X4 X5 X6 X7
## Min. : 0.1051 Min. :-0.3906 Min. :0.340 Min. :-2.3230
## 1st Qu.: 0.8435 1st Qu.: 0.3153 1st Qu.:1.754 1st Qu.:-0.1248
## Median : 1.6200 Median : 0.6255 Median :2.539 Median : 0.4867
## Mean : 4.4949 Mean : 0.8249 Mean :2.994 Mean : 0.8826
## 3rd Qu.: 5.5560 3rd Qu.: 1.1173 3rd Qu.:3.553 3rd Qu.: 1.8906
## Max. :19.1730 Max. : 3.6551 Max. :6.946 Max. : 5.2762
##
## X8 X9 X10 X11
## Min. : 49.06 Min. :-200.98 Min. : 1.491 Min. : 0.500
## 1st Qu.: 72.28 1st Qu.: -42.56 1st Qu.: 52.762 1st Qu.: 1.571
## Median : 88.89 Median : 15.04 Median : 155.582 Median : 2.530
## Mean : 96.54 Mean : -18.76 Mean : 1463.386 Mean :11.258
## 3rd Qu.:109.52 3rd Qu.: 28.57 3rd Qu.: 501.644 3rd Qu.: 3.336
## Max. :185.64 Max. : 64.46 Max. :20935.000 Max. :63.500
## NA's :2 NA's :4
## X12 X13 X14
## Min. :16.45 Min. : 8.882 Min. : 2.000
## 1st Qu.:17.79 1st Qu.:17.208 1st Qu.: 4.675
## Median :22.03 Median :23.211 Median : 7.150
## Mean :21.91 Mean :23.693 Mean : 8.963
## 3rd Qu.:24.86 3rd Qu.:27.953 3rd Qu.: 9.700
## Max. :31.60 Max. :47.254 Max. :33.700
## NA's :1
Mengubah Nama Kolom
Function ini memilikik kegunaan dalam mengubah nama kolom yang memiliki tujuan agar valid dalam R. Hal ini bermaksud jika nama kolom mengandung spasi, karakter khusus, atau dimulai dengan angka akan mengganti katakter yang tidak valid dengan titik (.) Function : maka.names()
colnames(train.data) <- make.names(colnames(train.data))
Encoding
Mengubah Risk.Level menjadi faktor dengan 1 = Low dan 0 = High
train.data$Risk.Level <- as.factor(train.data$Risk.Level)
str(train.data)
## tibble [100 × 16] (S3: tbl_df/tbl/data.frame)
## $ Country : chr [1:100] "AD" "AE" "AE-AZ" "AE-RK" ...
## $ X1 : num [1:100] 17.5 18.2 18.7 NA 14 ...
## $ X2 : num [1:100] 38675 40105 76038 27883 4251 ...
## $ X3 : num [1:100] 172.8 103.5 31 24.8 89.6 ...
## $ X4 : num [1:100] 0.68 1.77 2.63 1.29 1.44 ...
## $ X5 : num [1:100] 1.221 0.87 1.489 1.753 0.256 ...
## $ X6 : num [1:100] 1.79 2.66 1.85 2.23 4.75 ...
## $ X7 : num [1:100] -2.084 -0.725 -1.901 -1.135 2.332 ...
## $ X8 : num [1:100] 55 103 103 103 167 ...
## $ X9 : num [1:100] -26.5 -13.6 -56.2 24.8 47.3 ...
## $ X10 : num [1:100] 2.86 352.91 199.93 10.11 12.65 ...
## $ X11 : num [1:100] 8 8.15 8.15 NA 6.6 ...
## $ X12 : num [1:100] 23.1 24.9 20.4 21.7 19.4 ...
## $ X13 : num [1:100] 26.9 32.5 31 17.3 15.1 ...
## $ X14 : num [1:100] 3 2.45 NA NA 18.5 ...
## $ Risk.Level: Factor w/ 2 levels "high","low": 2 2 2 2 1 1 1 2 2 1 ...
Menghapus Variabel Country
Karena pada analisa ini tidak memakai variabel Country maka kita menghapus Country dari train.data dan test.data
train.data <- train.data[, -which(names(train.data) == "Country")]
test.data <- test.data[, -which(names(test.data) == "Country")]
Mencari banyaknya Missing Values pada Data Training dan Data Testing
Terlihat bahwa pada data training terdapat Missing Values untuk variabel :
X1 = 12
X8 = 7
X11 = 17
X14 = 11
Sedangkan untuk data testing terdapat Missing values pada variabel :
X1 = 1
X8 = 2
X11 = 4
X14 = 1
colSums(is.na(train.data))
## X1 X2 X3 X4 X5 X6 X7
## 12 0 0 0 0 0 0
## X8 X9 X10 X11 X12 X13 X14
## 7 0 0 17 0 0 11
## Risk.Level
## 0
colSums(is.na(test.data))
## X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14
## 1 0 0 0 0 0 0 2 0 0 4 0 0 1
Missing Values pada Data Training
Proporsi Missing Values
Terlihat missing values pada variabel X1, X8, X11, dan X14 dengan missing values paling besar pada X11 dan paling kecil pada X8
Ket :
Merah : Missing Values
Biru : Data Set
aggr(train.data)
Mengisi Missing Values (MICE)
Menggunakan Multivariate Imputation by Chained Equations dalam mengatasi missing values serta menggunakan model statistik untuk memprediksi nilai yang hilang berdasarkan variabel lain dalam dataset, proses imputasi dilakukan dalam beberapa langkah. Pada analisa ini fungsi MICE menghasilkan 20 dataset yang berbeda dan imputasi yang digunakan adalah pmm (Predictive Mean Matching)
train.data_imp <- mice(train.data, m = 20, method = 'pmm', seed = 500)
##
## iter imp variable
## 1 1 X1 X8 X11 X14
## 1 2 X1 X8 X11 X14
## 1 3 X1 X8 X11 X14
## 1 4 X1 X8 X11 X14
## 1 5 X1 X8 X11 X14
## 1 6 X1 X8 X11 X14
## 1 7 X1 X8 X11 X14
## 1 8 X1 X8 X11 X14
## 1 9 X1 X8 X11 X14
## 1 10 X1 X8 X11 X14
## 1 11 X1 X8 X11 X14
## 1 12 X1 X8 X11 X14
## 1 13 X1 X8 X11 X14
## 1 14 X1 X8 X11 X14
## 1 15 X1 X8 X11 X14
## 1 16 X1 X8 X11 X14
## 1 17 X1 X8 X11 X14
## 1 18 X1 X8 X11 X14
## 1 19 X1 X8 X11 X14
## 1 20 X1 X8 X11 X14
## 2 1 X1 X8 X11 X14
## 2 2 X1 X8 X11 X14
## 2 3 X1 X8 X11 X14
## 2 4 X1 X8 X11 X14
## 2 5 X1 X8 X11 X14
## 2 6 X1 X8 X11 X14
## 2 7 X1 X8 X11 X14
## 2 8 X1 X8 X11 X14
## 2 9 X1 X8 X11 X14
## 2 10 X1 X8 X11 X14
## 2 11 X1 X8 X11 X14
## 2 12 X1 X8 X11 X14
## 2 13 X1 X8 X11 X14
## 2 14 X1 X8 X11 X14
## 2 15 X1 X8 X11 X14
## 2 16 X1 X8 X11 X14
## 2 17 X1 X8 X11 X14
## 2 18 X1 X8 X11 X14
## 2 19 X1 X8 X11 X14
## 2 20 X1 X8 X11 X14
## 3 1 X1 X8 X11 X14
## 3 2 X1 X8 X11 X14
## 3 3 X1 X8 X11 X14
## 3 4 X1 X8 X11 X14
## 3 5 X1 X8 X11 X14
## 3 6 X1 X8 X11 X14
## 3 7 X1 X8 X11 X14
## 3 8 X1 X8 X11 X14
## 3 9 X1 X8 X11 X14
## 3 10 X1 X8 X11 X14
## 3 11 X1 X8 X11 X14
## 3 12 X1 X8 X11 X14
## 3 13 X1 X8 X11 X14
## 3 14 X1 X8 X11 X14
## 3 15 X1 X8 X11 X14
## 3 16 X1 X8 X11 X14
## 3 17 X1 X8 X11 X14
## 3 18 X1 X8 X11 X14
## 3 19 X1 X8 X11 X14
## 3 20 X1 X8 X11 X14
## 4 1 X1 X8 X11 X14
## 4 2 X1 X8 X11 X14
## 4 3 X1 X8 X11 X14
## 4 4 X1 X8 X11 X14
## 4 5 X1 X8 X11 X14
## 4 6 X1 X8 X11 X14
## 4 7 X1 X8 X11 X14
## 4 8 X1 X8 X11 X14
## 4 9 X1 X8 X11 X14
## 4 10 X1 X8 X11 X14
## 4 11 X1 X8 X11 X14
## 4 12 X1 X8 X11 X14
## 4 13 X1 X8 X11 X14
## 4 14 X1 X8 X11 X14
## 4 15 X1 X8 X11 X14
## 4 16 X1 X8 X11 X14
## 4 17 X1 X8 X11 X14
## 4 18 X1 X8 X11 X14
## 4 19 X1 X8 X11 X14
## 4 20 X1 X8 X11 X14
## 5 1 X1 X8 X11 X14
## 5 2 X1 X8 X11 X14
## 5 3 X1 X8 X11 X14
## 5 4 X1 X8 X11 X14
## 5 5 X1 X8 X11 X14
## 5 6 X1 X8 X11 X14
## 5 7 X1 X8 X11 X14
## 5 8 X1 X8 X11 X14
## 5 9 X1 X8 X11 X14
## 5 10 X1 X8 X11 X14
## 5 11 X1 X8 X11 X14
## 5 12 X1 X8 X11 X14
## 5 13 X1 X8 X11 X14
## 5 14 X1 X8 X11 X14
## 5 15 X1 X8 X11 X14
## 5 16 X1 X8 X11 X14
## 5 17 X1 X8 X11 X14
## 5 18 X1 X8 X11 X14
## 5 19 X1 X8 X11 X14
## 5 20 X1 X8 X11 X14
Merge Data
Menggunakan fungsi complete() dalam mengambil dataset yang telah diimputasi dari train.data_imp yang dihasilkan oleh MICE, dataset yang diambil adalah dataset ke 18
train.data_comp <- complete(train.data_imp, action = 18)
Proporsi Missing Values setelah di Input
Berdasarkan output diagram dibawah ini, sudah tidak terdapat lagi missing values pada variabel X1, X8, X11, dan X14
aggr(train.data_comp)
Plot Density untuk Setiap Variabel yang memiliki nilai
NA
Hal ini bertujuan dalam melihat perbandingan dataset sebelum dan sesudah dilakukannya proses MICE
Keterangan :
Hitam = Sebelum
Hijau = Sesudah
plot(density(train.data$X1, na.rm = T), main = "Data X1 dengan NA")
lines(density(train.data_comp$X1, na.rm = T), col = "green", lty =3)
plot(density(train.data$X8, na.rm = T), main = "Data X8 dengan NA")
lines(density(train.data_comp$X8, na.rm = T), col = "green", lty =3)
plot(density(train.data$X11, na.rm = T), main = "Data X11 dengan NA")
lines(density(train.data_comp$X11, na.rm = T), col = "green", lty = 3)
plot(density(train.data$X14, na.rm = T), main = "Data X14 dengan NA")
lines(density(train.data_comp$X14, na.rm = T), col = "green", lty = 3)
Missing Values pada Data Testing
Proporsi Missing Value
Terlihat missing values pada variabel X1, X8, X11, dan X14 dengan missing values paling besar pada X11 dan paling kecil pada X1 dan X14
Keterangan :
Merah = Missing Values
Biru = Data Set
aggr(test.data)
Mengisi Missing Values (MICE)
Menggunakan Multivariate Imputation by Chained Equations dalam mengatasi missing values serta menggunakan model statistik untuk memprediksi nilai yang hilang berdasarkan variabel lain dalam dataset, proses imputasi dilakukan dalam beberapa langkah. Pada analisa ini fungsi MICE menghasilkan 20 dataset yang berbeda dan imputasi yang digunakan adalah pmm (Predictive Mean Matching)
test.data_imp <- mice(test.data, m = 20, method = 'pmm', seed = 500)
##
## iter imp variable
## 1 1 X1 X8 X11 X14
## 1 2 X1 X8 X11 X14
## 1 3 X1 X8 X11 X14
## 1 4 X1 X8 X11 X14
## 1 5 X1 X8 X11 X14
## 1 6 X1 X8 X11 X14
## 1 7 X1 X8 X11 X14
## 1 8 X1 X8 X11 X14
## 1 9 X1 X8 X11 X14
## 1 10 X1 X8 X11 X14
## 1 11 X1 X8 X11 X14
## 1 12 X1 X8 X11 X14
## 1 13 X1 X8 X11 X14
## 1 14 X1 X8 X11 X14
## 1 15 X1 X8 X11 X14
## 1 16 X1 X8 X11 X14
## 1 17 X1 X8 X11 X14
## 1 18 X1 X8 X11 X14
## 1 19 X1 X8 X11 X14
## 1 20 X1 X8 X11 X14
## 2 1 X1 X8 X11 X14
## 2 2 X1 X8 X11 X14
## 2 3 X1 X8 X11 X14
## 2 4 X1 X8 X11 X14
## 2 5 X1 X8 X11 X14
## 2 6 X1 X8 X11 X14
## 2 7 X1 X8 X11 X14
## 2 8 X1 X8 X11 X14
## 2 9 X1 X8 X11 X14
## 2 10 X1 X8 X11 X14
## 2 11 X1 X8 X11 X14
## 2 12 X1 X8 X11 X14
## 2 13 X1 X8 X11 X14
## 2 14 X1 X8 X11 X14
## 2 15 X1 X8 X11 X14
## 2 16 X1 X8 X11 X14
## 2 17 X1 X8 X11 X14
## 2 18 X1 X8 X11 X14
## 2 19 X1 X8 X11 X14
## 2 20 X1 X8 X11 X14
## 3 1 X1 X8 X11 X14
## 3 2 X1 X8 X11 X14
## 3 3 X1 X8 X11 X14
## 3 4 X1 X8 X11 X14
## 3 5 X1 X8 X11 X14
## 3 6 X1 X8 X11 X14
## 3 7 X1 X8 X11 X14
## 3 8 X1 X8 X11 X14
## 3 9 X1 X8 X11 X14
## 3 10 X1 X8 X11 X14
## 3 11 X1 X8 X11 X14
## 3 12 X1 X8 X11 X14
## 3 13 X1 X8 X11 X14
## 3 14 X1 X8 X11 X14
## 3 15 X1 X8 X11 X14
## 3 16 X1 X8 X11 X14
## 3 17 X1 X8 X11 X14
## 3 18 X1 X8 X11 X14
## 3 19 X1 X8 X11 X14
## 3 20 X1 X8 X11 X14
## 4 1 X1 X8 X11 X14
## 4 2 X1 X8 X11 X14
## 4 3 X1 X8 X11 X14
## 4 4 X1 X8 X11 X14
## 4 5 X1 X8 X11 X14
## 4 6 X1 X8 X11 X14
## 4 7 X1 X8 X11 X14
## 4 8 X1 X8 X11 X14
## 4 9 X1 X8 X11 X14
## 4 10 X1 X8 X11 X14
## 4 11 X1 X8 X11 X14
## 4 12 X1 X8 X11 X14
## 4 13 X1 X8 X11 X14
## 4 14 X1 X8 X11 X14
## 4 15 X1 X8 X11 X14
## 4 16 X1 X8 X11 X14
## 4 17 X1 X8 X11 X14
## 4 18 X1 X8 X11 X14
## 4 19 X1 X8 X11 X14
## 4 20 X1 X8 X11 X14
## 5 1 X1 X8 X11 X14
## 5 2 X1 X8 X11 X14
## 5 3 X1 X8 X11 X14
## 5 4 X1 X8 X11 X14
## 5 5 X1 X8 X11 X14
## 5 6 X1 X8 X11 X14
## 5 7 X1 X8 X11 X14
## 5 8 X1 X8 X11 X14
## 5 9 X1 X8 X11 X14
## 5 10 X1 X8 X11 X14
## 5 11 X1 X8 X11 X14
## 5 12 X1 X8 X11 X14
## 5 13 X1 X8 X11 X14
## 5 14 X1 X8 X11 X14
## 5 15 X1 X8 X11 X14
## 5 16 X1 X8 X11 X14
## 5 17 X1 X8 X11 X14
## 5 18 X1 X8 X11 X14
## 5 19 X1 X8 X11 X14
## 5 20 X1 X8 X11 X14
## Warning: Number of logged events: 124
Merge Data
Menggunakan fungsi complete() dalam mengambil dataset yang telah diimputasi dari train.data_imp yang dihasilkan oleh MICE, dataset yang diambil adalah dataset ke 15
test.data_comp <- complete(test.data_imp, action = 15)
Proporsi Missing Values setelah di Input
Berdasarkan output diagram dibawah ini, sudah tidak terdapat lagi missing values pada variabel X1, X8, X11, dan X14
aggr(test.data_comp)
Plot Density untuk Setiap Variabel yang memiliki nilai
NA
Hal ini bertujuan dalam melihat perbandingan dataset sebelum dan sesudah dilakukannya proses MICE
Keterangan :
Hitam = Sebelum
Hijau = Sesudah
plot(density(test.data$X1, na.rm = T), main = "Data X1 dengan NA")
lines(density(test.data_comp$X1, na.rm = T), col = "green", lty = 3)
plot(density(test.data$X8, na.rm = T), main = "Data X8 dengan NA")
lines(density(test.data_comp$X8, na.rm = T), col = "green", lty = 3)
plot(density(test.data$X11, na.rm = T), main = "Data X11 dengan NA")
lines(density(test.data_comp$X11, na.rm = T), col = "green", lty = 3)
plot(density(test.data$X14, na.rm = T), main = "Data X14 dengan NA")
lines(density(test.data_comp$X14, na.rm = T), col = "green", lty = 3)
Data Tanpa Missing Values
glimpse(train.data_comp)
## Rows: 100
## Columns: 15
## $ X1 <dbl> 17.5000, 18.2000, 18.7000, 24.8200, 14.0000, 26.0000, 23.25…
## $ X2 <dbl> 38674.616, 40105.120, 76037.997, 27882.829, 4251.398, 2033.…
## $ X3 <dbl> 172.75400, 103.52280, 31.03626, 24.78532, 89.61882, 57.0556…
## $ X4 <dbl> 0.68000, 1.76600, 2.63056, 1.29416, 1.44000, 22.35646, 36.7…
## $ X5 <dbl> 1.2206, 0.8698, 1.4893, 1.7530, 0.2562, 3.3422, 0.9657, 0.7…
## $ X6 <dbl> 1.78560, 2.65884, 1.85034, 2.23192, 4.74800, -0.87800, -0.2…
## $ X7 <dbl> -2.0843, -0.7254, -1.9008, -1.1355, 2.3318, -5.2032, -3.729…
## $ X8 <dbl> 55.00000, 102.52738, 102.52738, 102.52738, 166.80851, 34.81…
## $ X9 <dbl> -26.52000, -13.59890, -56.24160, 24.78532, 47.27262, 15.449…
## $ X10 <dbl> 2.857862, 352.910575, 199.928422, 10.108892, 12.645460, 62.…
## $ X11 <dbl> 8.0000, 8.1550, 8.1550, 0.9250, 6.6000, 10.3000, 10.6000, 2…
## $ X12 <dbl> 23.08410, 24.85976, 20.39940, 21.69104, 19.40300, 31.12380,…
## $ X13 <dbl> 26.94344, 32.47740, 31.03926, 17.30888, 15.11172, 20.57210,…
## $ X14 <dbl> 3.0000, 2.4500, 4.9000, 15.0000, 18.5000, 10.5000, 11.0500,…
## $ Risk.Level <fct> low, low, low, low, high, high, high, low, low, high, high,…
glimpse(test.data_comp)
## Rows: 17
## Columns: 14
## $ X1 <dbl> 23.2000, 16.8056, 18.2857, 19.6715, 11.9000, 14.1400, 19.8000, 12.…
## $ X2 <dbl> 60338.0204, 62432.9952, 28684.1682, 21042.7221, 49356.2618, 3989.1…
## $ X3 <dbl> 175.42230, 409.69700, 103.06040, 102.73060, 60.15464, 65.55750, 33…
## $ X4 <dbl> 1.62000, 0.10510, 0.84352, 1.17400, 0.89594, 0.39400, 0.34500, 5.5…
## $ X5 <dbl> 0.6755, 0.9068, 0.0746, 0.0734, 0.5865, 0.5042, 0.3153, 1.1173, 1.…
## $ X6 <dbl> 2.47168, 2.77600, 3.55290, 3.21976, 1.75420, 2.44734, 3.44058, 1.6…
## $ X7 <dbl> 0.3526, 0.2912, 1.9299, 1.2325, -1.1342, -0.1248, 1.2787, -1.5047,…
## $ X8 <dbl> 185.64097, 94.00211, 72.30708, 111.78982, 88.60514, 88.88685, 100.…
## $ X9 <dbl> 64.14972, -200.98100, 16.23838, 33.35258, -145.43800, 27.33332, -4…
## $ X10 <dbl> 537.609866, 339.988210, 52.761781, 102.567122, 1.490827, 24.638720…
## $ X11 <dbl> 0.5000, 1.3095, 3.0176, 2.5300, 63.5000, 1.5706, 3.2000, 13.6000, …
## $ X12 <dbl> 25.11320, 26.76784, 19.90742, 22.83084, 17.79208, 16.78238, 23.059…
## $ X13 <dbl> 27.95256, 47.25374, 25.76882, 20.95780, 23.21144, 14.52982, 32.479…
## $ X14 <dbl> 8.6000, 3.0000, 5.0000, 7.0000, 7.3000, 9.0000, 2.0000, 17.0000, 1…
Visualisasi Data
Bar Chart untuk Variabel Risk.Level pada train.data_comp
risk_count <- train.data_comp %>%
group_by(Risk.Level) %>%
summarize(count = n())
ggplot(risk_count, aes(x = Risk.Level, y = count, fill = Risk.Level)) +
geom_bar(stat = "identity") +
geom_text(aes(label = count), vjust
= -0.5, size =5) +
scale_fill_manual(values = c("low" = "pink", "high" = "red")) +
labs(title = "Frekuensi Risk Level", x = "Risk Level", y = "Frekuensi") + theme_minimal()
SVM
Splitting Data
Data training.data_comp dibagi menjadi dua bagian yaitu data training sebanyak 80% dan data testing sebanyak 20% dari total keseluruhan data
set.seed(123)
train_index <- createDataPartition(train.data_comp$Risk.Level, p = 0.8, list = FALSE)
train_data <- train.data_comp[train_index, ]
test_data <- train.data_comp[-train_index, ]
Model (Training)
Menggunakan model SVM dengan kernel linear. Melatih model SVM dengan kernel linear menggunakan data pelatihan train_data. Peubah targetnya adalah Risk.Level dan semua peubah lain digunakan sebagai prediktor.
svm_model <- svm(Risk.Level ~ ., data = train_data, kernel = "linear")
Prediksi (Testing)
Melakukan prediksi menggunakan data uji test_data dan menyimpan hasil prediksinya dalam svm_pred
svm_pred <- predict(svm_model, newdata = test_data)
Akurasi
Menghitung akurasi dari prediksi model dengan membandingkan prediksi svm_pred dengan nilai pada data uji test_data$Risk.Level. Akurasi dihitung sebagai presentase dari prediksi yang benar
akurasi_svm <- sum(svm_pred == test_data$Risk.Level) / nrow(test_data)
print(paste("SVM Akurasi Model:", round(akurasi_svm * 100, 2),"%"))
## [1] "SVM Akurasi Model: 100 %"
Confusion Matrix
confusion_matrix <- confusionMatrix(as.factor(svm_pred), as.factor(test_data$Risk.Level))
print(confusion_matrix)
## Confusion Matrix and Statistics
##
## Reference
## Prediction high low
## high 10 0
## low 0 9
##
## Accuracy : 1
## 95% CI : (0.8235, 1)
## No Information Rate : 0.5263
## P-Value [Acc > NIR] : 5.055e-06
##
## Kappa : 1
##
## Mcnemar's Test P-Value : NA
##
## Sensitivity : 1.0000
## Specificity : 1.0000
## Pos Pred Value : 1.0000
## Neg Pred Value : 1.0000
## Prevalence : 0.5263
## Detection Rate : 0.5263
## Detection Prevalence : 0.5263
## Balanced Accuracy : 1.0000
##
## 'Positive' Class : high
##
Visualisasi COnfusion Matrix
10 prediksi benar untuk kelas high (model memprediksi high dan benar-benar high)
9 prediksi benar untuk kelas low (model memprediksi low dan benar-benar low)
Tidak ada prediksi yang salah, baik untuk kelas high maupun low, menunjukan model berkerja dengan baik.
confusion_data <- as.data.frame(confusion_matrix$table)
ggplot(confusion_data, aes(x = Reference, y = Prediction)) +
geom_tile(aes(fill = Freq), color = "pink") +
scale_fill_gradient(low = "pink", high = "purple") +
theme_minimal() +
labs(title = "Confusion Matrix", x = "Actual", y = "Predicted") +
geom_text(aes(label = Freq), vjust = 1)
Perbandingan Data Asli dan Data Prediksi
predictions <- data.frame(Actual = test_data$Risk.Level, Predicted = svm_pred)
print(predictions)
## Actual Predicted
## 1 low low
## 5 high high
## 6 high high
## 12 high high
## 22 low low
## 30 high high
## 32 low low
## 42 high high
## 50 low low
## 51 low low
## 58 high high
## 62 low low
## 66 high high
## 68 low low
## 71 high high
## 73 high high
## 75 low low
## 93 high high
## 94 low low
Melakukan Prediksi Menggunakan Model SVM
Prediksi dilakukan menggunakan model yang sudah dilatih dan diterapkan untuk memprediksi Risk.Level pada data test.data_comp
svm_pred.excel <- predict(svm_model, newdata = test.data_comp)
print(svm_pred.excel)
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
## low low low low high high low high low high high high low high high low
## 17
## high
## Levels: high low
Menyimpan Hasil
Data yang dihasilkan dari prediksi disimpan dengan nama Prediksi.Risk.Level dan akan masuk dalam data frame test.data_comp
test.data_comp$Prediksi.Risk.Level <- svm_pred.excel
Akurasi
Menghitung akurasi dari prediksi dengan membandingkan prediksi svm_pred dengan nilai aktual pada data uji test.data_comp$Prediksi.Risk.Level. Akurasi dihitung sebagai persentase dari prediksi yang benar
accuracy_svm.excel <- sum(test.data_comp$Prediksi.Risk.Level== svm_pred.excel) / nrow(test.data_comp)
print(paste("SVM Akurasi untuk Data Excel:", round(accuracy_svm.excel * 100,2),"%"))
## [1] "SVM Akurasi untuk Data Excel: 100 %"
Tabel Hasil Prediksi
Menambahkan Peubah Country ke Tabel
test.data_comp <- cbind(Country = test.data.ori$Country, test.data_comp)
Tabel
test.data_comp <- test.data_comp %>%
mutate(Prediksi.Risk.Level = ifelse(
Prediksi.Risk.Level == "high",
cell_spec(Prediksi.Risk.Level, background = "red", bold = TRUE),
cell_spec(Prediksi.Risk.Level, background = "pink", bold = TRUE)
))
test.data_comp %>%
kbl(escape = FALSE) %>%
kable_material_dark() %>%
row_spec(0, bold = TRUE, color = "white") %>%
kable_styling(font_size = 9)
| Country | X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | X9 | X10 | X11 | X12 | X13 | X14 | Prediksi.Risk.Level |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| SE | 23.2000 | 60338.0204 | 175.42230 | 1.62000 | 0.6755 | 2.47168 | 0.3526 | 185.64097 | 64.14972 | 537.609866 | 0.5000 | 25.11320 | 27.95256 | 8.6000 | low |
| SG | 16.8056 | 62432.9952 | 409.69700 | 0.10510 | 0.9068 | 2.77600 | 0.2912 | 94.00211 | -200.98100 | 339.988210 | 1.3095 | 26.76784 | 47.25374 | 3.0000 | low |
| SI | 18.2857 | 28684.1682 | 103.06040 | 0.84352 | 0.0746 | 3.55290 | 1.9299 | 72.30708 | 16.23838 | 52.761781 | 3.0176 | 19.90742 | 25.76882 | 5.0000 | low |
| SK | 19.6715 | 21042.7221 | 102.73060 | 1.17400 | 0.0734 | 3.21976 | 1.2325 | 111.78982 | 33.35258 | 102.567122 | 2.5300 | 22.83084 | 20.95780 | 7.0000 | low |
| SM | 11.9000 | 49356.2618 | 60.15464 | 0.89594 | 0.5865 | 1.75420 | -1.1342 | 88.60514 | -145.43800 | 1.490827 | 63.5000 | 17.79208 | 23.21144 | 7.3000 | high |
| SV | 14.1400 | 3989.1913 | 65.55750 | 0.39400 | 0.5042 | 2.44734 | -0.1248 | 88.88685 | 27.33332 | 24.638720 | 1.5706 | 16.78238 | 14.52982 | 9.0000 | high |
| TH | 19.8000 | 7450.5523 | 33.22256 | 0.34500 | 0.3153 | 3.44058 | 1.2787 | 100.19298 | -42.56340 | 501.644054 | 3.2000 | 23.05990 | 32.47950 | 2.0000 | low |
| TN | 12.9000 | 3616.8650 | 85.26668 | 5.55600 | 1.1173 | 1.60820 | -1.5047 | 134.47988 | 64.46288 | 39.218118 | 13.6000 | 18.80654 | 8.88180 | 17.0000 | high |
| TR | 18.0000 | 8652.9973 | 51.65878 | 11.65444 | 1.4844 | 4.15702 | 1.8070 | 116.52826 | 28.56998 | 720.244499 | 2.5300 | 28.55834 | 26.32778 | 13.2000 | low |
| TW | 14.1400 | 31854.2815 | 48.51016 | 0.72360 | 0.1015 | 2.53870 | 2.7686 | 71.08310 | -189.14000 | 668.122597 | 49.0000 | 22.02936 | 33.80118 | 3.7000 | high |
| UA | 22.0000 | 3955.0704 | 103.90710 | 19.17300 | -0.3906 | 0.34000 | 1.8906 | 72.25639 | -5.46582 | 155.581868 | 49.0000 | 17.79388 | 16.04966 | 9.5000 | high |
| UG | 21.5689 | 786.8776 | 42.26784 | 4.29470 | 3.6551 | 5.73874 | 0.4207 | 69.45587 | 21.88058 | 33.538172 | 3.3357 | 24.85996 | 19.47826 | 17.0000 | high |
| US | 16.3000 | 69324.7338 | 104.17110 | 1.55316 | 0.6255 | 2.45554 | 0.4867 | 134.47988 | 47.70210 | 20935.000000 | 1.0000 | 17.40650 | 17.20802 | 5.6146 | low |
| UY | 17.0400 | 15968.2306 | 73.01010 | 8.00348 | 0.3592 | 0.82090 | -0.7169 | 49.05568 | -16.23150 | 53.628838 | 2.5300 | 16.44666 | 17.57796 | 10.3000 | high |
| UZ | 18.4000 | 1872.6699 | 30.04996 | 12.29840 | 1.6065 | 5.84000 | 3.0735 | 72.25639 | -45.16010 | 57.707193 | 2.1000 | 31.60162 | 29.24286 | 6.0000 | high |
| VN | 12.0977 | 3886.5162 | 34.52492 | 2.79600 | 0.8506 | 6.94570 | 5.2762 | 86.56201 | 7.39622 | 351.683014 | 1.6900 | 23.54764 | 25.80812 | 2.5000 | low |
| ZA | 16.6000 | 6404.6725 | 50.79576 | 4.98278 | 1.4772 | 0.78940 | -2.3230 | 107.24859 | 15.04496 | 302.141270 | 3.3357 | 19.11740 | 16.25316 | 33.7000 | high |