Soal

Suatu perusahaan perbank-kan meneliti 75 jenis skema pinjaman yang telah diberi rating oleh para customernya pada data ann.csv.

Tujuan penelitian yang dilakukan ialah memprediksi rating skema pinjaman berdasarkan variabel-variabel tersebut.

Bantulah peneliti tersebut untuk memprediksi reating skema pinjaman dengan neural network, hitunglah RMSE prediksinya.

library(readxl)
library(neuralnet)
library(keras)
library(tensorflow)
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice
## 
## Attaching package: 'caret'
## The following object is masked from 'package:tensorflow':
## 
##     train
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ lubridate 1.9.2     ✔ tibble    3.2.1
## ✔ purrr     1.0.1     ✔ tidyr     1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::compute() masks neuralnet::compute()
## ✖ dplyr::filter()  masks stats::filter()
## ✖ dplyr::lag()     masks stats::lag()
## ✖ purrr::lift()    masks caret::lift()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

DATA

Variabel yang digunakan ialah:

data <- read.csv("C:/Users/ASUS/OneDrive/Documents/sem 6/TPM/data ann.csv", stringsAsFactors = T,)
head(data)

Menampilka struktur data:

str(data)
## 'data.frame':    75 obs. of  6 variables:
##  $ besar_pinjaman     : int  70 120 70 50 110 110 130 90 90 120 ...
##  $ lama_pembayaran    : int  4 3 4 4 2 2 3 2 3 1 ...
##  $ bunga              : int  1 5 1 0 2 0 2 1 0 2 ...
##  $ pembayaran_perbulan: int  130 15 260 140 180 125 210 200 210 220 ...
##  $ banyak_cashback    : num  10 2 9 14 1.5 1 2 4 5 0 ...
##  $ rating             : num  68.4 34 59.4 93.7 29.5 ...

Menampilkan ringkasan data:

summary(data)
##  besar_pinjaman  lama_pembayaran     bunga       pembayaran_perbulan
##  Min.   : 50.0   Min.   :1.000   Min.   :0.000   Min.   :  0.0      
##  1st Qu.:100.0   1st Qu.:2.000   1st Qu.:0.000   1st Qu.:132.5      
##  Median :110.0   Median :3.000   Median :1.000   Median :180.0      
##  Mean   :106.9   Mean   :2.547   Mean   :1.013   Mean   :160.2      
##  3rd Qu.:110.0   3rd Qu.:3.000   3rd Qu.:1.500   3rd Qu.:215.0      
##  Max.   :160.0   Max.   :6.000   Max.   :5.000   Max.   :320.0      
##  banyak_cashback      rating     
##  Min.   : 0.000   Min.   :18.04  
##  1st Qu.: 0.500   1st Qu.:32.69  
##  Median : 2.000   Median :40.40  
##  Mean   : 2.183   Mean   :42.48  
##  3rd Qu.: 3.000   3rd Qu.:50.80  
##  Max.   :14.000   Max.   :93.70

Pengecekan missing value

colSums(is.na(data))
##      besar_pinjaman     lama_pembayaran               bunga pembayaran_perbulan 
##                   0                   0                   0                   0 
##     banyak_cashback              rating 
##                   0                   0

Pada dataset tidak terdapat data hilang / missing values sehingga tidak perlu dilakukan penanganan. Pada dataset juga tidak terdapat data yang bertipe kategorik sehingga tidak perlu dilakukan encoding peubah kategorik.

Eksplorasi Data

par(mfrow=c(2,3))
hist(data$besar_pinjaman, col="orange")
hist(data$lama_pembayaran, col="orange")
hist(data$bunga, col="orange")
hist(data$pembayaran_perbulan, col="orange")
hist(data$banyak_cashback, col="orange")
hist(data$rating, col="coral")

Berdasarkan eksplorasi di atas, dapat dilihat bahwa sebaran dari rata-rata data tiap peubah baik peubah bebas maupun peubah respon tidak mengikuti distribusi normal sehingga perlu dilakukan normalisasi data agar data berdistribusi secara normal.

Normalisasi Data

data.norm<-as.data.frame(scale(data[,-6]))
data.norm$rating <- data$rating

Normalisasi diperlukan agar model-model pada neural network dapat memberikan hasil yang lebih akurat ketika data yang dianalisis memiliki sebaran normal.

Scaling dan Spliting Data

Scaling data dilakukan agar seluruh peubah berada pada range yang sama atau memiliki sebaran yang sama, yaitu Normal(0,1). Setelah itu, data akan dibagi menjadi 2 bagian, yaitu 70% data latih dan 30% data uji.

#Scaling data
data.max <- apply(data.norm, 2, max) 
data.min <- apply(data.norm, 2, min) 
data.scaling <- as.data.frame(scale(data.norm, center=data.min, scale=data.max-data.min))
head(data.scaling)
#Spliting data
set.seed(043)
index <- sample(1:nrow(data.scaling), round(0.7*nrow(data.scaling)))
data.scaling.train <- data.scaling[index,]
data.scaling.test <- data.scaling[-index,] 

Pemodelan Neural Network

Pengaturan model neural network yang akan digunakan menggunakan 1 hidden layer yang terdiri dari 2 neuron. Dalam kasus ini, satu hidden layer sudah cukup baik untuk mempelajari representasi data. Selain itu, penggunaan hidden layer yang terlalu banyak dapat menyebabkan overfitting, dimana model terlalu “menghafal” data pelatihan dan tidak dapat melakukan generalisasi dengan baik pada data baru.

set.seed(043)

#Neural Network Modelling
nn <- neuralnet(rating~., data.scaling.train, hidden=c(2), linear.output=F) 

#Plot Neural Network
plot(nn, rep="best")

Prediksi

Prediksi Data Train

predict.train <- nn %>% predict(data.scaling.train[,-6]) 
predict.train
##         [,1]
## 44 0.2219538
## 40 0.3636534
## 68 0.1809201
## 21 0.2828218
## 66 0.5258704
## 5  0.1885913
## 56 0.5017098
## 7  0.1822920
## 39 0.1677977
## 2  0.2681112
## 14 0.1561189
## 41 0.1862277
## 55 0.4392806
## 33 0.2679836
## 29 0.3263700
## 52 0.3025137
## 19 0.2854095
## 45 0.1705808
## 22 0.2900710
## 74 0.3558255
## 65 0.2486872
## 36 0.1879983
## 25 0.5520910
## 3  0.7471294
## 46 0.2469210
## 27 0.3615046
## 62 0.5904474
## 53 0.5667468
## 63 0.6413400
## 24 0.2008447
## 8  0.3703406
## 10 0.1238105
## 20 0.2367554
## 43 0.2436655
## 4  0.8421978
## 67 0.5224628
## 70 0.3558255
## 18 0.1561189
## 17 0.2292586
## 54 0.6717653
## 34 0.1307363
## 59 0.4918008
## 73 0.3383155
## 31 0.3923465
## 75 0.1980372
## 30 0.1424648
## 51 0.3544468
## 15 0.2037232
## 6  0.2698907
## 57 0.3143150
## 42 0.4391810
## 37 0.2076927

Prediksi Data Test

predict.test <- nn %>% predict(data.scaling.test[,-6]) 
predict.test
##         [,1]
## 1  0.7864075
## 9  0.5600793
## 11 0.3805511
## 12 0.1217521
## 13 0.2643329
## 16 0.2590026
## 23 0.2245098
## 26 0.2961678
## 28 0.1651086
## 32 0.3858599
## 35 0.2374409
## 38 0.1892547
## 47 0.1618675
## 48 0.1758427
## 49 0.5086809
## 50 0.1890490
## 58 0.3167636
## 60 0.1789923
## 61 0.2020772
## 64 0.6093330
## 69 0.2197110
## 71 0.1697150
## 72 0.1640046

Evaluasi Model

Evaluasi Data Training

#Hasil RMSE, Rsquare, dan MAE data train
postResample(predict.train[,1], data.scaling.train$rating)
##       RMSE   Rsquared        MAE 
## 0.07447700 0.84350588 0.06109883

Berdasarkan output di atas, model pada data train memiliki nilai RMSE cukup kecil yaitu 0.074.

Evaluasi Data Testing

#Hasil RMSE, Rsquare, dan MAE data test
postResample(predict.test[,1], data.scaling.test$rating)
##       RMSE   Rsquared        MAE 
## 0.07914068 0.80187843 0.06865769

Berdasarkan output di atas, model pada data test memiliki nilai RMSE cukup kecil, yaitu 0.079.

SIMPULAN

Berdasarkan hasil pemodelan data menggunakan Artificial Neural Network, diperoleh nilai RMSE pada data training lebih kecil daripada nilai RMSE pada data testing (0.074 < 0.079). Oleh karena itu, dapat dikatakan bahwa pemodelan ANN dapat menghasilkan hasil yang lebih akurat ketika jumlah data yang digunakan semakin banyak.