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
Variabel yang digunakan ialah:
Besar pinjaman (dalam juta rupiah)
Lama pembayaran (dalam tahun)
Tambahan bunga yang ditetapkan (dalam %)
Pembayaran per bulan (dalam 10000)
Banyak cash back yang diterapkan pada skema tersebut
Rating (peubah respon)
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.
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.
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 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,]
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")
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
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
#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.
#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.
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.