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