UTS Statistika Ekonomi & Industri

Level Risiko Investasi

Memanggil library yang dibutuhkan

Beberapa library di R dipanggil untuk mendukung analisis data, seperti caret, readxl, dplyr, dan lainnya. Library-library ini membantu dalam proses imputasi data, visualisasi, dan pembuatan model.

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(reshape2)
library(corrplot)
## corrplot 0.95 loaded
library(ggplot2)
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(e1071)
Input Data

Data dimuat menggunakan fungsi read_excel() dari file eksternal dengan dua sheet, yaitu “Training” dan “Testing”. Data ini kemudian ditampilkan menggunakan print() dan diperiksa struktur serta ringkasannya dengan str() dan summary().

train_data <- read_excel("C:\\Users\\LENOVO\\OneDrive\\Dokumen\\SMT 3\\Statistika Ekonomi & Industri\\Level Risiko Investasi.xlsx", sheet = "Training")
test_data <- read_excel("C:\\Users\\LENOVO\\OneDrive\\Dokumen\\SMT 3\\Statistika Ekonomi & Industri\\Level Risiko Investasi.xlsx", sheet = "Testing")
print(train_data)
## # A tibble: 100 × 16
##    Country    X1     X2    X3    X4    X5     X6      X7    X8     X9     X10
##    <chr>   <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
##  2 AE       18.2 40105. 104.   1.77 0.870  2.66  -0.725  103.  -13.6   353.  
##  3 AE-AZ    18.7 76038.  31.0  2.63 1.49   1.85  -1.90   103.  -56.2   200.  
##  4 AE-RK    NA   27883.  24.8  1.29 1.75   2.23  -1.14   103.   24.8    10.1 
##  5 AM       14    4251.  89.6  1.44 0.256  4.75   2.33   167.   47.3    12.6 
##  6 AO       NA    2034.  57.1 22.4  3.34  -0.878 -5.20    34.8  15.4    62.5 
##  7 AR       23.3  9203.  43.3 36.7  0.966 -0.237 -3.73    NA    -5.01  375.  
##  8 AT       18.6 53174. 159.   1.52 0.726  1.88  -0.300  116.   15.4   430.  
##  9 AU       15.7 63972. 122.   1.65 1.48   2.45   0.0306 192.   58.0  1359.  
## 10 AW       33.5 24643.  92.8  1.22 0.797  2.06  -4.72    80.5  28.1     2.38
## # ℹ 90 more rows
## # ℹ 5 more variables: X11 <dbl>, X12 <dbl>, X13 <dbl>, X14 <dbl>,
## #   `Risk Level` <chr>
print(test_data)
## # A tibble: 17 × 15
##    Country    X1     X2    X3     X4      X5    X6     X7    X8      X9      X10
##    <chr>   <dbl>  <dbl> <dbl>  <dbl>   <dbl> <dbl>  <dbl> <dbl>   <dbl>    <dbl>
##  1 SE       23.2 60338. 175.   1.62   0.676  2.47   0.353 186.    64.1    538.  
##  2 SG       16.8 62433. 410.   0.105  0.907  2.78   0.291  94.0 -201.     340.  
##  3 SI       18.3 28684. 103.   0.844  0.0746 3.55   1.93   72.3   16.2     52.8 
##  4 SK       19.7 21043. 103.   1.17   0.0734 3.22   1.23  112.    33.4    103.  
##  5 SM       11.9 49356.  60.2  0.896  0.586  1.75  -1.13   88.6 -145.       1.49
##  6 SV       NA    3989.  65.6  0.394  0.504  2.45  -0.125  88.9   27.3     24.6 
##  7 TH       19.8  7451.  33.2  0.345  0.315  3.44   1.28  100.   -42.6    502.  
##  8 TN       12.9  3617.  85.3  5.56   1.12   1.61  -1.50  134.    64.5     39.2 
##  9 TR       18    8653.  51.7 11.7    1.48   4.16   1.81  117.    28.6    720.  
## 10 TW       14.1 31854.  48.5  0.724  0.102  2.54   2.77   71.1 -189.     668.  
## 11 UA       22    3955. 104.  19.2   -0.391  0.34   1.89   72.3   -5.47   156.  
## 12 UG       21.6   787.  42.3  4.29   3.66   5.74   0.421  69.5   21.9     33.5 
## 13 US       16.3 69325. 104.   1.55   0.626  2.46   0.487  NA     47.7  20935   
## 14 UY       17.0 15968.  73.0  8.00   0.359  0.821 -0.717  49.1  -16.2     53.6 
## 15 UZ       18.4  1873.  30.0 12.3    1.61   5.84   3.07   NA    -45.2     57.7 
## 16 VN       12.1  3887.  34.5  2.80   0.851  6.95   5.28   86.6    7.40   352.  
## 17 ZA       16.6  6405.  50.8  4.98   1.48   0.789 -2.32  107.    15.0    302.  
## # ℹ 4 more variables: X11 <dbl>, X12 <dbl>, X13 <dbl>, X14 <dbl>
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 ...
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
Pengolahan data

Nama kolom diformat ulang dengan make.names() agar sesuai dengan format R, dan tipe data variabel target (Risk.Level) diubah menjadi faktor. Dimana ini menjadi penting untuk pemrosesan data.

colnames(train_data) <- make.names(colnames(train_data))
colnames(test_data) <- make.names(colnames(test_data))

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 ...
Mengetahui jumlah missing value pada setiap kolom

colSums(is.na()) digunakan untuk menghitung jumlah nilai yang hilang di setiap kolom dalam data.

colSums(is.na(train_data))
##    Country         X1         X2         X3         X4         X5         X6 
##          0         12          0          0          0          0          0 
##         X7         X8         X9        X10        X11        X12        X13 
##          0          7          0          0         17          0          0 
##        X14 Risk.Level 
##         11          0
colSums(is.na(test_data))
## Country      X1      X2      X3      X4      X5      X6      X7      X8      X9 
##       0       1       0       0       0       0       0       0       2       0 
##     X10     X11     X12     X13     X14 
##       0       4       0       0       1
aggr(train_data)

Imputasi nilai missing menggunakan metode PMM (Predictive Mean Matching)

Missing value diimputasi menggunakan metode Predictive Mean Matching (pmm) dari package mice. Data hasil imputasi ditampilkan dan diperiksa kembali untuk memastikan tidak ada missing value.

train_data_imp <- mice(train_data, m = 10, method = "pmm", seed = 123)
## 
##  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
##   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
##   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
##   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
##   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
## Warning: Number of logged events: 1
train_data_comp <- complete(train_data_imp, action = 10)
aggr(train_data_comp)

aggr(test_data)

test_data_imp <- mice(test_data)
## 
##  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
##   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
##   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
##   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
##   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
## Warning: Number of logged events: 31
test_data_comp <- complete(test_data_imp)
aggr(test_data_comp)

train_data_comp$Risk.Level <- as.factor(train_data_comp$Risk.Level)
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,]
str(train_data)
## 'data.frame':    81 obs. of  16 variables:
##  $ Country   : chr  "AE" "AE-AZ" "AE-RK" "AR" ...
##  $ X1        : num  18.2 18.7 22.7 23.3 18.6 ...
##  $ X2        : num  40105 76038 27883 9203 53174 ...
##  $ X3        : num  103.5 31 24.8 43.3 159.4 ...
##  $ X4        : num  1.77 2.63 1.29 36.7 1.52 ...
##  $ X5        : num  0.87 1.489 1.753 0.966 0.726 ...
##  $ X6        : num  2.659 1.85 2.232 -0.237 1.88 ...
##  $ X7        : num  -0.725 -1.901 -1.135 -3.73 -0.3 ...
##  $ X8        : num  102.5 102.5 102.5 50.1 116.4 ...
##  $ X9        : num  -13.6 -56.24 24.79 -5.01 15.37 ...
##  $ X10       : num  352.9 199.9 10.1 375.2 430 ...
##  $ X11       : num  8.15 8.15 6.2 10.6 2.02 ...
##  $ X12       : num  24.9 20.4 21.7 16.7 24.8 ...
##  $ X13       : num  32.5 31 17.3 13.8 26.9 ...
##  $ X14       : num  2.45 4.9 7.5 11.05 6 ...
##  $ Risk.Level: Factor w/ 2 levels "high","low": 2 2 2 1 2 2 1 1 2 2 ...
str(test_data)
## 'data.frame':    19 obs. of  16 variables:
##  $ Country   : chr  "AD" "AM" "AO" "BD" ...
##  $ X1        : num  17.5 14 16 4.2 19.3 ...
##  $ X2        : num  38675 4251 2034 2324 89771 ...
##  $ X3        : num  172.8 89.6 57.1 19.7 275.6 ...
##  $ X4        : num  0.68 1.44 22.35646 5.812 0.00116 ...
##  $ X5        : num  1.221 0.256 3.342 1.057 0.84 ...
##  $ X6        : num  1.786 4.748 -0.878 7.39 1.885 ...
##  $ X7        : num  -2.084 2.332 -5.203 6.071 0.173 ...
##  $ X8        : num  55 166.8 34.8 78.4 82.5 ...
##  $ X9        : num  -26.52 47.27 15.45 4.92 -152.44 ...
##  $ X10       : num  2.86 12.65 62.49 347.15 749.02 ...
##  $ X11       : num  8 6.6 10.3 7.7 0.75 ...
##  $ X12       : num  23.1 19.4 31.1 32.7 24.4 ...
##  $ X13       : num  26.9 15.1 20.6 32.2 32.8 ...
##  $ X14       : num  3 18.5 10.5 5 3.17 ...
##  $ Risk.Level: Factor w/ 2 levels "high","low": 2 1 1 1 2 1 2 1 2 2 ...
train_data <- train_data[, -which(names(train_data) == "Country")]
test_data <- test_data[, -which(names(test_data) == "Country")]
dim(train_data_comp)
## [1] 100  16
dim(test_data_comp)
## [1] 17 15
Buat model SVM linear

Model Support Vector Machine (SVM) dengan kernel linear dibuat untuk memprediksi tingkat risiko investasi (Risk.Level) menggunakan semua variabel prediktor.Menggunakan library ‘caret, ’e1071’ dan ‘ggplot2’ untuk membuat model SVM linear. Ini dikonfigurasi untuk memprediksi ‘Risk.Level’ berdasarkan semua fitur (‘.’) dalam (‘train_data’)

svm_model <- svm(Risk.Level ~ ., data = train_data, kernel = "linear")
Prediksi menggunakan model SVM

Model SVM yang telah dibentuk digunakan untuk memprediksi nilai pada data uji.

svm_pred <- predict(svm_model, newdata = test_data)
print(svm_pred)
##    1    5    6   12   22   30   32   42   50   51   58   62   66   68   71   73 
##  low high high high  low high  low high  low high high  low high  low high high 
##   75   93   94 
##  low high  low 
## Levels: high low
Menghitung akurasi prediksi vs label sebenarnya

Akurasi model dihitung dengan membandingkan prediksi model dengan label sebenarnya dari data uji.Akurasi model dihitung dengan menghitung persentase prediksi yang benar (‘svm_pred’) dibandingkan dengan label aktual (‘test_data$Risk.Level’)

accuracy_svm <- sum(svm_pred == test_data$Risk.Level) / nrow(test_data)
print(paste("SVM Akurasi:", accuracy_svm))
## [1] "SVM Akurasi: 0.947368421052632"
Konfirmasi matrix confusio

Confusion matrix dibuat untuk mengevaluasi kinerja model SVM, yang memberikan rincian tentang prediksi yang benar dan salah. Script juga membuat matrix confusio untuk melihat presisi model SVM

confusionMatrix <- confusionMatrix(as.factor(svm_pred), as.factor(test_data$Risk.Level))
print(confusionMatrix)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction high low
##       high   10   1
##       low     0   8
##                                           
##                Accuracy : 0.9474          
##                  95% CI : (0.7397, 0.9987)
##     No Information Rate : 0.5263          
##     P-Value [Acc > NIR] : 9.149e-05       
##                                           
##                   Kappa : 0.8939          
##                                           
##  Mcnemar's Test P-Value : 1               
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.8889          
##          Pos Pred Value : 0.9091          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.5263          
##          Detection Rate : 0.5263          
##    Detection Prevalence : 0.5789          
##       Balanced Accuracy : 0.9444          
##                                           
##        'Positive' Class : high            
## 
Convert konfirmasi matrix ke data frame

Confusion matrix dikonversi menjadi data frame untuk keperluan visualisasi selanjutnya.

confusion_data <- as.data.frame(confusionMatrix$table)
library(ggplot2)
Membuat plot haetmap dari confusion matrix

Heatmap dari confusion matrix dibuat menggunakan ggplot2 untuk memvisualisasikan hubungan antara prediksi dan nilai sebenarnya.

ggplot(confusion_data, aes(x = Prediction, y = Reference, fill = Freq)) +
  geom_tile(color = "white") +
  scale_fill_gradient(low = "white", high = "orange") +
  labs(title = "Confusion Matrix: Test Data vs Prediksi", x = "Predicted", y = "Actual") +
  theme_minimal()

Scatter plot antara dua variabel yang ada di train_data dan test_data

Scatter plot dibuat untuk melihat sebaran data berdasarkan dua variabel di data latih.

ggplot(train_data, aes(x = X1, y = Risk.Level, color = Risk.Level)) +
  geom_point() +
  labs(title = "Scatter Plot Train Data", x = "X1", y = "Risk.Level")

ggplot(test_data, aes(x = X1, y = Risk.Level, color = Risk.Level)) +
  geom_point() +
  labs(title = "Scatter Plot Test Data", x = "X1", y = "Risk.Level")

Density plot dari train_data dan test_data berdasarkan Risk.Level

Plot distribusi (density plot) dibuat untuk melihat sebaran data di antara kategori Risk.Level dalam data latih dan uji.

ggplot(train_data, aes(x = X1, fill = Risk.Level)) +
  geom_density(alpha = 0.5) +
  labs(title = "Density Plot - Train Data Berdasarkan Risk Level", x = "X1")

ggplot(test_data, aes(x = Risk.Level, fill = Risk.Level)) +
  geom_density(alpha = 0.5) +
  labs(title = "Density Plot - Test Data Berdasarkan Risk Level", x = "Risk.Level")

Line plot dari train_data dan test_data

Plot garis dibuat untuk melihat perubahan data dari waktu ke waktu, berdasarkan variabel X1 dan Risk.Level.

library(ggplot2)
ggplot(train_data, aes(x = X1, y = Risk.Level, color = Risk.Level)) +
  geom_line() +
  labs(title = "Line Plot Train Data Berdasarkan Waktu", x = "X1", y = "Risk.Level")

ggplot(test_data, aes(x = X1 , y = Risk.Level, color = Risk.Level)) +
  geom_line() +
  labs(title = "Line Plot Test Data Berdasarkan Waktu", x = "X1", y = "Risk.Level")

Sample data frame
df <- data.frame(
    x = rep(1:5, each=5),
    y = rep(1:5, times=5),
    Freq = sample(1:100, 25, replace=TRUE)
)
Membuat line plot dari data train_data

Line plot dan heatmap dibuat dari data frame sampel untuk keperluan visualisasi tambahan.

library(ggplot2)
ggplot(train_data, aes(x = X1, y = Risk.Level)) +
  geom_line(color = "blue") + 
  labs(title = "Train Data - Line Plot", x = "X Axis", y = "Y Axis")

Membuat line plot dari data train_data
ggplot(test_data, aes(x = X1, y = Risk.Level)) +
  geom_line(color = "red") + 
  labs(title = "Test Data - Line Plot", x = "X Axis", y = "Y Axis")

Membuat plot
ggplot(df, aes(x = x, y = y, fill = Freq)) +
    geom_tile(color = "black") +
    scale_fill_gradient(low = "white", high = "purple") +
    theme_minimal()

Berdasarkan plot diatas, diketahui : x = nilai akurasi y = nilai prediksi Freq = frekuensi atau intensitas

keterangan : 1. skala warna ~ Low = “white” menunjukkan nilai frekuensi rendah dimana intensitas warna putih menunjukkan sedikit atau tidak ada frekuensi ~ High = “purple” menunjukkan nilai frekuensi yang tinggi dimana dengan intensitas warna ungu menunjukkan banyaknya frekuensi 2. interpretasi visual ~ area dengan warna putih menunjukkan kombinasi nilai aktual dan prediksi yang memiliki frekuensi rendah, yang berarti model mungkin kurang akurat pada titik tersebut ~ dan sebaliknya, area dengan warna ungu menunjukkan kombinasi nilai aktual dan prediksi yang memiliki frekuensi tinggi, menunjukkan bahwa model berhasil memprediksi dengan baik pada titik tersebut

penjelasan keseluruhan :
berdasarkan akurasi model = dengan menggunakan model SVM linear, kita dapat menentukan bahwa akurasinya mencapai % seperti yang ditunjukkan oleh variabel ‘accuracy_svm’. hal ini memberikan gambaran mengenai kemampuan model dalam membedakan antara tingkat rasio investasi yang benar dan salah.
berdasarkan konfirmasi matrix = confusion matrix disediakan sebagai tambahan informasi tentang performa model. dimana nilainya akan membantu dalam evaluasi presisi spesifikitas sensitivitas serta kinerja overall model secara menyeluruh.
berdasarkan penggunaan visualisasi = meskipun tidak ada penggunaan langsung visualisasi dalam contoh kode diatas namun teknik seperti membuat tile plots atau scatterplots bisa sangat berguna jika ingin melihat hubungan antara fitur fitur yang digunakan dalam model SVM.

kesimpulan : Dalam keseluruhan hasil proses analisis ini, kita berhasil mengolah data yang kompleks hingga dapat digunakan dalam pembuatan model prediktif yang efektif. Model SVM telah terbukti memiliki potensi besar dalam mendeteksi tingkat risiko investasi dengan akurasi yang cukup baik. namun perlu dilakukan evaluasi lebih lanjut guna meningkatkan performa hasil.