Kuis ini merupakan bagian dari proses penilaian Algoritma Academy. Selamat anda sudah menyelesaikan materi Classification in Machine Learning II! Kami akan melakukan penilaian berupa kuis untuk menguji materi yang sudah dipelajari. Pengerjaan Kuis diharapkan dapat dilakukan di dalam kelas, silakan hubungi tim instruktur kami jika Anda melewatkan kesempatan untuk mengambilnya di kelas.
Dalam kuis ini, Anda akan menganalisis dataset loan (pinjaman bank) yang menyimpan data historis nasabah bank yang cenderung default (gagal bayar pinjaman) atau tidak. Data tersimpan dalam repositori ini sebagai loan.csv. Untuk menyelesaikan tugas ini, Anda perlu membuat model klasifikasi menggunakan algoritma Naive Bayes, Decision Tree, dan Random Forest dengan mengikuti langkah-langkah berikut:
Sebelum kita membuat model, kita akan coba memahami data terlebih dahulu. Muat data yang diberikan ke R (loan.csv) dan simpan ke dalam objek bernamaloan, kemudian cek data secara singkat menggunakan fungsi str() atau glimpse().
# your code here
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.0.5
##
## 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
loan <- read.csv("loan.csv", stringsAsFactors = TRUE)
str(loan)
## 'data.frame': 1000 obs. of 17 variables:
## $ checking_balance : Factor w/ 4 levels "< 0 DM","> 200 DM",..: 1 3 4 1 1 4 4 3 4 3 ...
## $ months_loan_duration: int 6 48 12 42 24 36 24 36 12 30 ...
## $ credit_history : Factor w/ 5 levels "critical","good",..: 1 2 1 2 4 2 2 2 2 1 ...
## $ purpose : Factor w/ 6 levels "business","car",..: 5 5 4 5 2 4 5 2 5 2 ...
## $ amount : int 1169 5951 2096 7882 4870 9055 2835 6948 3059 5234 ...
## $ savings_balance : Factor w/ 5 levels "< 100 DM","> 1000 DM",..: 5 1 1 1 1 5 4 1 2 1 ...
## $ employment_duration : Factor w/ 5 levels "< 1 year","> 7 years",..: 2 3 4 4 3 3 2 3 4 5 ...
## $ percent_of_income : int 4 2 2 2 3 2 3 2 2 4 ...
## $ years_at_residence : int 4 2 3 4 4 4 4 2 4 2 ...
## $ age : int 67 22 49 45 53 35 53 35 61 28 ...
## $ other_credit : Factor w/ 3 levels "bank","none",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ housing : Factor w/ 3 levels "other","own",..: 2 2 2 1 1 1 2 3 2 2 ...
## $ existing_loans_count: int 2 1 1 1 2 1 1 1 1 2 ...
## $ job : Factor w/ 4 levels "management","skilled",..: 2 2 4 2 2 4 2 1 4 1 ...
## $ dependents : int 1 1 2 2 2 2 1 1 1 1 ...
## $ phone : Factor w/ 2 levels "no","yes": 2 1 1 1 1 2 1 2 1 1 ...
## $ default : Factor w/ 2 levels "no","yes": 1 2 1 1 2 1 1 1 1 2 ...
#glimpse(loan)
Berdasarkan investigasi di atas, data loan memiliki 1000 observasi dan 17 variabel. Berikut adalah deskripsi detail dari setiap kolom:
checking_balance dan savings_balance: Status akun checking/savings yang adamonths_loan_duration: Durasi periode pinjaman (dalam bulan)credit_history: Status kredit yang terdiri dari critical (kritis), good (baik), perfect (sempurna), poor (buruk), dan very good (sangat baik)purpose: Tujuan mengajukan pinjaman yang terdiri dari business (bisnis), car(new) (mobil baru), car(used) (mobil bekas), education (pendidikan), furniture (perabot rumah), dan renovations (renovasi)amount: Jumlah pinjaman dalam DM (Deutsche Mark)employment_duration: Durasi bekerja pada pekerjaan saat inipercent_of_income: Tingkat angsuran dalam persentase pendapatan bebas pajakyears_at_residence: Durasi tinggal di alamat domisili saat ini (dalam tahun)age: Umur nasabahother_credit: Rencana cicilan lainnya (bank/store)housing: Kepemilikan rumah yang terdiri dari rent (sewa), own (milik sendiri), atau for free (gratis)existing_loans_count: Jumlah pinjaman yang sedang berjalanjob: Pekerjaan yang terdiri dari management (manajemen), skilled (ahli), unskilled (tidak ahli) dan unemployed (pengangguran)dependents: Jumlah orang yang bertanggung jawab untuk melakukan pemeliharaanphone: Apakah terdaftar atas nama nasabah (antara yes/no)default: Apakah nasabah gagal bayar/charged off/lewat tanggal jatuh tempo (antara yes/no).Kita juga perlu memastikan bahwa setiap kolom telah menyimpan tipe data yang tepat. Anda dapat melakukan data wrangling pada chunk di bawah ini bila dibutuhkan.
Tips: Anda dapat menggunakan parameter stringsAsFactors = TRUE dari read.csv() sehingga semua kolom karakter akan otomatis disimpan sebagai faktor.
Sebagai data scientist, Anda akan mengembangkan model yang dapat membantu manajemen dalam proses pengambilan keputusan. Hal pertama yang perlu kita ketahui adalah pertanyaan bisnis yang ingin kita pecahkan. Pinjaman adalah hal yang berisiko, namun pada saat yang sama juga menghasilkan keuntungan bagi lembaga melalui suku bunga pinjaman. Mengidentifikasi nasabah yang berisiko tinggi untuk gagal bayar adalah salah satu cara untuk meminimalisir kerugian pemberi pinjaman. Untuk itu, kita akan coba memprediksi kemungkinan nasabah gagal bayar menggunakan prediktor-prediktor yang disediakan.
Sebelum melakukan modeling, luangkan waktu Anda untuk melakukan langkah eksplorasi. Coba selidiki jumlah historis nasabah yang gagal bayar dari setiap tujuan pinjaman. Silakan lakukan agregasi data untuk mendapatkan jawabannya.
Petunjuk: Karena kita hanya fokus pada nasabah yang default/gagal bayar, filter data historis dengan kondisi yang dibutuhkan (default == “yes”)
# your code here
purposes <- loan %>%
filter (default == "yes") %>%
summarise(purpose)
table(purposes)
## purposes
## business car car0
## 34 106 5
## education furniture/appliances renovations
## 23 124 8
Sebelum kita membuat model, kita harus membagi dataset menjadi data train dan test. Silahkan bagi data dengan proporsi 80% train dan 20% test menggunakan fungsi sample(), set.seed(100), dan simpan ke dalam obyek data_train dan data_test.
Note: Pastikan Anda menggunakan fungsi
RNGkind()danset.seed()sebelum membagi data dan menjalankannya bersamaan dengan codesample()Anda.
library(rsample)
## Warning: package 'rsample' was built under R version 4.0.5
RNGkind(sample.kind = "Rounding")
## Warning in RNGkind(sample.kind = "Rounding"): non-uniform 'Rounding' sampler
## used
set.seed(100)
# your code here
index <- initial_split(data = loan, prop = 0.8, strata = "default")
loan_train <- training(index)
loan_test <- testing(index)
Mari kita lihat proporsi kelas target pada data train menggunakan fungsi prop.table (table(object$target)) untuk memastikan data train memiliki proporsi kelas target yang seimbang.
# your code here
prop.table(table(loan$default))
##
## no yes
## 0.7 0.3
prop.table(table(loan_train$default))
##
## no yes
## 0.7 0.3
prop.table(table(loan_test$default))
##
## no yes
## 0.7 0.3
Berdasarkan proporsi di atas, dapat disimpulkan bahwa proporsi kelas target tidak seimbang; kita harus menyeimbangkannya sebelum menggunakannya pada model kita. Satu hal penting yang harus diingat adalah semua metode sub-sampling hanya boleh diterapkan pada data train. Lakukanlah metode downsampling pada data_train menggunakan fungsi downSample() dari package caret, lalu simpan data hasil downsample dalam objek data_train_down. Anda juga perlu memastikan bahwa variabel target sudah dalam tipe faktor.
Note: atur parameter
yname = "default"
library(caret)
## Warning: package 'caret' was built under R version 4.0.5
## Loading required package: lattice
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.0.5
## Warning in (function (kind = NULL, normal.kind = NULL, sample.kind = NULL) :
## non-uniform 'Rounding' sampler used
set.seed(100)
# your code here
data_train_down <- downSample(x = loan_train %>% select(-default),
y = loan_train$default,
yname = "defaults")
table(data_train_down$defaults)
##
## no yes
## 240 240
prop.table(table(data_train_down$defaults))
##
## no yes
## 0.5 0.5
Setelah membagi data menjadi data train dan test serta melakukan downsample pada data train, mari kita buat model pertama dengan algoritma Naive Bayes. Ada beberapa keuntungan dalam menggunakan model ini, misalnya:
Referensi Opsi Bahasa Inggris: - [ ] Assume that among the predictor variables are independent - [ ] Assume that between target and predictor variables are independent - [ ] Skewness due to data scarcity ___
Buat model Naive Bayes menggunakan fungsi naiveBayes() dari package e1071, lalu atur parameter laplace = 1. Simpan model ke dalam objek model_naive sebelum melanjutkan ke tahap berikutnya.
library(e1071)
##
## Attaching package: 'e1071'
## The following object is masked from 'package:rsample':
##
## permutations
# your code here
model_naive <- naiveBayes(x = data_train_down,
y = data_train_down$defaults,
laplace = 1)
Lakukan prediksi ke data test menggunakan model_naive. Gunakan fungsi predict() dengan parameter type = "class" untuk mendapatkan prediksi kelas. Simpan hasil prediksi ke dalam objek pred_naive.
# your code here
pred_naive <- predict(object = model_naive,
newdata = loan_test,
type = "class")
head(pred_naive)
## [1] no yes no no yes no
## Levels: no yes
Bagian terakhir dari pembuatan model adalah evaluasi model. Anda dapat memeriksa performa model Naive Bayes menggunakan confusionMatrix() dan membandingkan kelas hasil prediksi (pred_naive) dengan label sebenarnya dari data_test. Pastikan Anda mengatur status pelanggan yang default sebagai kelas positif (positive = "yes").
# your code here
confusionMatrix(data = pred_naive,
reference = loan_test$default,
positive = "yes")
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 104 19
## yes 36 41
##
## Accuracy : 0.725
## 95% CI : (0.6576, 0.7856)
## No Information Rate : 0.7
## P-Value [Acc > NIR] : 0.24545
##
## Kappa : 0.3943
##
## Mcnemar's Test P-Value : 0.03097
##
## Sensitivity : 0.6833
## Specificity : 0.7429
## Pos Pred Value : 0.5325
## Neg Pred Value : 0.8455
## Prevalence : 0.3000
## Detection Rate : 0.2050
## Detection Prevalence : 0.3850
## Balanced Accuracy : 0.7131
##
## 'Positive' Class : yes
##
Mari buat model Decision Tree menggunakan fungsi ctree() dan simpan ke dalam objek model_dt. Untuk melakukan tuning model, mari kita atur parameter mincriterion = 0.90.
library(partykit)
## Warning: package 'partykit' was built under R version 4.0.5
## Loading required package: grid
## Loading required package: libcoin
## Warning: package 'libcoin' was built under R version 4.0.5
## Loading required package: mvtnorm
set.seed(100)
# your code here
model_dt <- partykit::ctree(formula = default ~ .,
data = loan_train,
mincriterion = 0.90)
mincriterion = 0.90 adalah …Referensi Opsi Bahasa Inggris: - [ ] To prune our model, we let the tree that has p-value <= 0.10 to split the node - [ ] To prune our model, we let the tree that has p-value <= 0.90 to split the node - [ ] To prune our model, we let the tree that has a maximum of 10% of the data in the terminal nodes
Untuk mendapatkan pemahaman yang lebih baik tentang model, buatlah plot dari model dan gunakan parameter type = "simple".
# your code here
plot(model_dt,
type = "simple"
)
checking_balance > 200 DM, dan credit_history tecatat “perfect”, serta saving_balance yang “unknown” (tidak diketahui) diekspektasikan akan defaultchecking_balance 1-200 DM, dan months_loan_duration < 21 diekspektasikan akan defaultchecking_balance tercatat “unknown” (tidak diketahui), dan other_credit berupa “store” diekspektasikan akan defaultReferensi Opsi Bahasa Inggris: - [ ] a customer who has checking_balance > 200 DM, with credit_history labelled “perfect”, and saving_balance that is “unknown” is expected to default - [ ] a customer who has checking_balance 1-200 DM, with months_loan_duration < 21 is expected to default - [ ] a customer who has checking_balance that is “unknown”, with other_credit consist of “store” is expected to default
Setelah kita membuat model, coba lakukan prediksi ke data test berdasarkan model_dt menggunakan fungsi predict() dengan mengatur parameter type = "response".
# your code here
pred_dt <- predict(object = model_dt,
newdata = loan_test,
type = "response")
Untuk memeriksa performa model, kita dapat menggunakan confusionMatrix(). Pastikan Anda mengatur status pelanggan yang default sebagai kelas positif (positive = "yes").
# your code here
confusionMatrix(pred_dt, loan_test$default, positive = "yes")
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 114 30
## yes 26 30
##
## Accuracy : 0.72
## 95% CI : (0.6523, 0.781)
## No Information Rate : 0.7
## P-Value [Acc > NIR] : 0.2972
##
## Kappa : 0.3204
##
## Mcnemar's Test P-Value : 0.6885
##
## Sensitivity : 0.5000
## Specificity : 0.8143
## Pos Pred Value : 0.5357
## Neg Pred Value : 0.7917
## Prevalence : 0.3000
## Detection Rate : 0.1500
## Detection Prevalence : 0.2800
## Balanced Accuracy : 0.6571
##
## 'Positive' Class : yes
##
Model terakhir yang ingin kita buat adalah Randon Forest. Di bawah ini merupakan keunggulan dari model Random Forest:
Sekarang, coba eksplorasi model random forest yang telah kami siapkan yaitu model_rf.RDS. Model tersebut dibuat menggunakan hyperparameter di bawah ini:
set.seed(100) # angka seednumber = 5 # jumlah k-fold cross-validationrepeats = 3 # jumlah iterasiBacalah model Random Forest tersebut (model_rf.RDS) menggunakan fungsi readRDS() dan simpan ke dalam objek model_rf.
# your code here
model_rf <- readRDS("model_rf.RDS")
model_rf
## Random Forest
##
## 476 samples
## 16 predictor
## 2 classes: 'no', 'yes'
##
## No pre-processing
## Resampling: Cross-Validated (5 fold, repeated 3 times)
## Summary of sample sizes: 381, 382, 380, 381, 380, 381, ...
## Resampling results across tuning parameters:
##
## mtry Accuracy Kappa
## 2 0.6812466 0.3623815
## 18 0.6708007 0.3414363
## 35 0.6694115 0.3387421
##
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was mtry = 2.
Kemudian, lihatlah rangkuman final model dari model Random Forest menggunakan model_rf$finalModel
library(randomForest)
## Warning: package 'randomForest' was built under R version 4.0.5
## randomForest 4.6-14
## Type rfNews() to see new features/changes/bug fixes.
##
## Attaching package: 'randomForest'
## The following object is masked from 'package:ggplot2':
##
## margin
## The following object is masked from 'package:dplyr':
##
## combine
# your code here
model_rf$finalModel
##
## Call:
## randomForest(x = x, y = y, mtry = param$mtry)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 2
##
## OOB estimate of error rate: 33.61%
## Confusion matrix:
## no yes class.error
## no 158 80 0.3361345
## yes 80 158 0.3361345
Dalam praktiknya, random forest telah memiliki estimasi out-of-bag (OOB) yang merepresentasikan akurasi pada out-of-bag data (data yang tidak diambil ketika sampling/tidak digunakan dalam pembuatan random forest).
model_rf$finalModel di atas, bagaimana cara menginterpretasikan out-of-bag error dari model?Referensi Opsi Bahasa Inggris: - [ ] We have 33.61% error of our unseen data - [ ] We have 33.61% error of our train data - [ ] We have 33.61% error of our loan data - [ ] We have 33.61% error of our in-sample data ___
Kita juga bisa menggunakan informasi Variable Importance, untuk mendapatkan daftar variabel penting yang digunakan pada model Random Forest. Banyak yang berargumen bahwa Random Forest, sebgai model Black Box, tidak dapat menawarkan informasi penting lain selain akurasinya yang amat tinggi. Namun, memberikan perhatian khusus pada atribut seperti Variable Importance sering kali membantu kita dalam mendapatkan informasi berharga tentang data.
Tentukan variabel yang memiliki pengaruh penting dalam menghasilkan prediksi (Variable Importance) menggunakan fungsi varImp(), kemudian masukkan ke dalam fungsi plot() untuk mendapatkan visualisasinya.
# your code here
varImp(model_rf)
## rf variable importance
##
## only 20 most important variables shown (out of 35)
##
## Overall
## amount 100.00
## months_loan_duration 90.17
## age 89.60
## checking_balanceunknown 82.43
## percent_of_income 42.50
## years_at_residence 37.09
## savings_balanceunknown 25.77
## existing_loans_count 20.97
## phoneyes 20.97
## checking_balance1 - 200 DM 19.95
## other_creditnone 19.87
## credit_historygood 19.46
## housingown 17.71
## credit_historyperfect 17.64
## jobskilled 17.30
## savings_balance> 1000 DM 16.72
## purposefurniture/appliances 15.88
## employment_duration1 - 4 years 15.08
## purposecar 14.44
## employment_duration4 - 7 years 13.36
plot(varImp(model_rf))
Setelah membangun model, kini kita dapat memprediksi data test menggunakan model_rf. Gunakan fungsi predict() dan atur parameter type = "raw" untuk mendapatkan prediksi kelas.
# your code here
pred_rf <- predict(model_rf, loan_test, type = "raw")
Selanjutnya, mari kita evaluasi model random forest dengan fungsi confusionMatrix().
# your code here
confusionMatrix(data = pred_rf,
reference = loan_test$default)
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 116 4
## yes 24 56
##
## Accuracy : 0.86
## 95% CI : (0.8041, 0.9049)
## No Information Rate : 0.7
## P-Value [Acc > NIR] : 9.991e-08
##
## Kappa : 0.6957
##
## Mcnemar's Test P-Value : 0.0003298
##
## Sensitivity : 0.8286
## Specificity : 0.9333
## Pos Pred Value : 0.9667
## Neg Pred Value : 0.7000
## Prevalence : 0.7000
## Detection Rate : 0.5800
## Detection Prevalence : 0.6000
## Balanced Accuracy : 0.8810
##
## 'Positive' Class : no
##
Referensi Opsi Bahasa Inggris: - [ ] 90.51% means that the model performance is good because the closer to 1 the better - [ ] 90.51% means that the model performance is good in classifying positive classes - [ ] 95.11% means that the model performance is good in classifying both positive and negative class - [ ] 95.11% as Area under ROC Curve represent the accuracy of the model ___
Referensi Opsi Bahasa Inggris: - [ ] Naive Bayes because all the conditional probabilities are well calculated - [ ] Decision Tree because a decision tree model is easily translatable to a set of rules - [ ] Random Forest because it is possible to traceback the rule using variable importance information
Tujuan dari pembuatan model machine learning adalah untuk menggeneralisasi pola yang ada pada data train agar dapat menerapkannya pada data mana pun yang berasal dari domain (topik masalah) yang sama. Ini memungkinkan kita untuk membuat prediksi pada data baru yang belum pernah dilihat oleh model. Ada terminologi yang digunakan dalam machine learning ketika berbicara tentang seberapa baik model belajar dan kemampuannya dalam menggeneralisasi ke data baru, yaitu overfitting dan underfitting.
Untuk memvalidasi apakah model kita cukup baik (good fit), kita dapat memprediksi ke data train dan test, lalu mengevaluasi performa model di kedua data tersebut. Kita dapat memeriksa apakah performanya seimbang (tidak jauh berbeda pada kedua data) berdasarkan batas toleransi yang telah kita tetapkan. ___ 10. Berdasarkan pengetahuan Anda terkait karakteristik model machine learning, pernyataan manakah di bawah ini yang SALAH? - [ ] Overfitting adalah kondisi dimana model baik dalam memprediksi data train, namun amat buruk dalam memprediksi data test. - [x] Underfitting adalah kondisi dimana model buruk dalam memprediksi data train, namun baik dalam memprediksi data test. - [ ] Model Machine Learning yang baik mungkin memiliki performa yang sedikit lebih rendah pada data test dibandingkan pada data train.
Referensi Opsi Bahasa Inggris: - [ ] Overfitting is a condition where a model performs well on the training data but performs very poorly in test data. - [ ] Underfitting is a condition where a model performs poor in the training data but performs well on the test data. - [ ] Machine Learning model that fit just right may have a slightly lower performance in its test data than in its training data. ___