Klasifikasi dan Clustering Algoritma

pada Data Ukuran Baju

Logo-Resmi-Unhas-1

Disusun Oleh

Ahmad Ghulam Ghazi

H081231054

Dosen Pengampun : Edy Saputra Rusdi, S.Si., M.Si.


Program Studi Ilmu Aktuaria

Fakultas Matematika dan Ilmu Pengetahuan Alam

Universitas Hasanuddin

2025

——————————————————


A. Pendahuluan : Library, Klasifikasi dan Clustering Algoritma

——————————————————

A.0 Library yang dipakai

library(tidymodels) # Metapaket tidymodels untuk pemodelan
library(kernlab) # Engine SVM
library(caret) # Caret untuk Pembagian Data dan Evaluasi Model
library(class) # Class untuk KNN
library(partykit) # Partykit untuk Membangun Model Decision Tree
library(dplyr) # Dplyr untuk Manipulasi Data
library(randomForest) # Random Forest untuk Membangun Model Random Forest
library(caretEnsemble) # CaretEnsemble untuk Membangun Model Ensemble
library(yardstick) # Yardstick untuk Evaluasi Model
library(tidyverse) # Tidyverse untuk Manipulasi Data
library(cluster) # Cluster untuk Membangun Model
library(factoextra) # Factoextra untuk Visualisasi Hasil Clustering
library(dplyr) # Dplyr untuk Manipulasi Data
library(dbscan) # DBSCAN untuk Membangun Model DBSCAN
library(ggplot2) # Untuk Visualisasi Data
library(ggthemes) # Untuk Tema Visualisasi
library(fishualize) # Untuk Visualisasi Hasil Clustering
library(clValid) # ClValid untuk Validasi Hasil Clustering

A.1 Klasifikasi

Klasifikasi

+ Pengertian / Definisi

Klasifikasi adalah proses mengelompokkan data ke dalam kategori atau label yang telah ditentukan sebelumnya. Dalam klasifikasi, model akan dilatih menggunakan dataset yang memiliki label, sehingga dapat belajar untuk mengenai pola dan membuat prediksi untuk data baru. Metode ini pada umumnya digunakan dalam supervised learning, di mana model belajar dari data yang sudah diberi label.

+ Proses Klasifikasi

Dalam mengklasifikasikan suatu dataset, melibatkan beberapa langkah sebagai berikut :

  1. Pengumpulan Data (Gathering Data) : Mengumpulkan data yang digunakan untuk analisis.

  2. Pembersihan Data (Cleaning Data) : Menghapus data yang tidak digunakan atau tidak akurat.

  3. Pembagian Data (Split Data) : Memisahkan data menjadi data pelatihan (train data) dan data pengujian (test data).

  4. Pelatihan Model (Train Model) : Menggunakan algoritma klasifikasi untuk melatih model dalam data pelatihan.

  5. Evaluasi Model (Model Evaluation) : Menguji model dengan data pengujian untuk menilai akurasi.

  6. Prediksi (Prediction) : Menggunakan model untuk mengklasifikasikan data baru.

+ Contoh Klasifikasi

Beberapa contoh penerapan klasifikasi, ialah sebagai berikut :

  1. Deteksi Spam (Spam Detection) : Menggunakan klasifikasi untuk menentukan apakah sebuah email adalah spam atau tidak

  2. Pengenalan Wajah (Recognition Face) : Mengidentifikasi jenis penyakit berdasarkan gejala yang ada

——————————————————

A.2 Clustering

Klasifikasi

+ Pengertian / Definisi

Clustering adalah teknik untuk mengelompokkan data ke dalam kelompok atau cluster berdasarkan kesamaan di antara data tersebut. Berbeda dengan klasifikasi, clustering tidak menggunakan label yang telah ditentukan sebelumnya; oleh karena itu, ini termasuk dalam unsupervised learning. Tujuan utama dari clustering adalah menemukan pola atau struktur dalam data yang tidak berlabel.

+ Proses Clustering

Dalam melakukan clustering, juga melibatkan beberapa langkah sebagai berikut

  1. Pengumpulan Data (Gathering Data) : Mengumpulkan data yang akan dianalisis.

  2. Pembersihan Data (Cleaning Data) : Menghilangkan data yang tidak digunakan atau tidak akurat.

  3. Pemilihan Algoritma (Algorithm) : Memilih algoritma clustering yang sesuai (misalnya, K-means, Hierarchical Clustering, dll).

  4. Penentuan Jumlah Cluster (Dteremining the Number of Clusters) : Menentukan jumlah cluster yang diinginkan (jika diperlukan).

  5. Penerapan Algoritma (Algorithm Applications) : Mengaplikasikan algoritma pada dataset untuk mengelompokkan data.

  6. Analisis Cluster (Cluster Analyst) : Menganalisis hasil clustering untuk memahami pola yang ada.

+ Contoh Clustering

Beberapa contoh penerapan clustering, ialah sebagai berikut :

  1. Segmentasi Pelanggan (Customer Segmentation) : Mengelompokkan pelanggan berdasarkan perilaku pembelian untuk startegi pemasaran yang lebih efektif.

  2. Analisis Gambar (Picture Analyst) : Mengelompokkan piksel dalam citra untuk mengidentifikasi objek.

  3. Dalam Bidang Biologi (Biologist) : Mengelompokkan spesies berdasarkan genetik atau karakteristik lainnya.

——————————————————

A.3 Perbandingan antara Klasifikasi dan Clustering

+ Tujuannya

=> Klasifikasi : Tujuannya adalah mengklasifikasikan data ke dalam kategori yang telah ditentukan.

=> Clustering : Tujuannya adalah menemukan struktur atau pola dalam data yang tak berlabel.

+ Jenis Pembelajaran (Learning Type)

=> Klasifikasi : Termasuk dalam supervised learning karena memerlukan data pelatihan yang sudah diberi label.

=> Clustering : Termasuk dalam unsupervised learning karena tidak memerlukan label pada data

+ Algoritma yang Digunakan

=> Klasifikasi : Algoritma yang umum digunakan termasuk Decision Trees, Random Forests, Support Vector Machines (SVM), dan Neural Networks.

=> Clustering : Algoritma yang umum digunakan termasuk K-means, Hierarchical Clustering, DBSCAN, dan Gaussian Mixture Models.

+ Hasil Output

=> Klasifikasi : Hasilnya berupa label atau kategori untuk setiap data baru yang dianalisis.

=> Clustering : Hasilnya berupa kelompok atau cluster dari data yang memiliki kesamaan.

——————————————————

B. Algoritma Klasifikasi

——————————————————

B.1 Support Vector Machines (SVM)

Support Vector Machines (SVM) adalah algoritma machine learning yang diawasi yang mengklasifikasikan data dengan menemukan garis optimal atau hyperplane yang memaksimalkan jarak antara setiap kelas dalam ruang N dimensi. Support Vector Machine (SVM) merupakan salah satu metode dalam supervised learning yang biasanya digunakan untuk klasifikasi (seperti Support Vector Classification) dan regresi (Support Vector Regression). Dalam pemodelan klasifikasi, SVM memiliki konsep yang lebih matang dan lebih jelas secara matematis dibandingkan dengan teknik-teknik klasifikasi lainnya. SVM juga dapat mengatasi masalah klasifikasi dan regresi dengan linear maupun non linear.

SVM digunakan untuk mencari hyperplane terbaik dengan memaksimalkan jarak antar kelas. Hyperplane adalah sebuah fungsi yang dapat digunakan untuk pemisah antar kelas. Dalam 2-D fungsi yang digunakan untuk klasifikasi antar kelas disebut sebagai line whereas, fungsi yang digunakan untuk klasifikasi antas kelas dalam 3-D disebut plane similarly, sedangan fungsi yang digunakan untuk klasifikasi di dalam ruang kelas dimensi yang lebih tinggi di sebut hyperplane.

Klasifikasi

Hyperplane yang ditemukan SVM diilustrasikan seperti Gambar di atas posisinya berada ditengah-tengah antara dua kelas, artinya jarak antara hyperplane dengan objek-objek data berbeda dengan kelas yang berdekatan (terluar) yang diberi tanda bulat kosong dan positif. Dalam SVM objek data terluar yang paling dekat dengan hyperplane disebut support vector. Objek yang disebut support vector paling sulit diklasifikasikan dikarenakan posisi yang hampir tumpang tindih (overlap) dengan kelas lain. Mengingat sifatnya yang kritis, hanya support vector inilah yang diperhitungkan untuk menemukan hyperplane yang paling optimal oleh SVM.

+ Jenis pengklasifikasi SVM

1. SVM Linier

SVM linier digunakan dengan data yang dapat dipisahkan secara linier; ini berarti bahwa data tidak perlu menjalani transformasi apa pun untuk memisahkan data ke dalam berbagai kelas yang berbeda.

2. SVM Nonlinier

Sebagian besar data dalam skenario dunia nyata tidak dapat dipisahkan secara linier, dan di situlah SVM nonlinier akan berguna. Untuk membuat data dapat dipisahkan secara linear, metode prapemrosesan diterapkan pada data pelatihan untuk mengubahnya menjadi ruang fitur berdimensi lebih tinggi. Meskipun demikian, ruang dimensi yang lebih tinggi dapat menciptakan lebih banyak kerumitan dengan meningkatkan risiko overfitting data dan menjadi beban komputasi. “Kernel trickl” membantu mengurangi beberapa kerumitan tersebut, membuat komputasi menjadi lebih efisien, dan hal ini dilakukan dengan mengganti perhitungan dot produk dengan fungsi kernel yang setara.

Ada sejumlah jenis kernel yang berbeda yang dapat diterapkan untuk mengklasifikasikan data. Beberapa fungsi kernel populer meliputi :

A. Kernel polinomial

B. Kernel fungsi basis radial (juga dikenal sebagai kernel Gaussian atau RBF)

C. Kernel sigmoid

3. Support Vector Regression (SVR)

Support vector regression (SVR) adalah perluasan dari SVM, yang diterapkan pada masalah regression (yaitu hasil yang bersifat kontinu). Mirip dengan SVM linier, SVR menemukan hyperplane dengan margin maksimum di antara titik-titik data, dan biasanya digunakan untuk prediksi deret waktu.

SVR berbeda dari regresi linier, kita perlu menentukan hubungan antara variabel independen dan dependen. Pemahaman tentang hubungan antara variabel dan arahnya sangat penting ketika menggunakan regression linier. Ini tidak diperlukan untuk SVR karena mereka menentukan hubungan ini sendiri.

+ Penerapan SVM Via RStudio

1.) Memanggil Library

Pada penerapan RStudio ini, kita akan menggunakan metapaket tidymodels untuk menangani setiap tahap pemodelan, mulai dari pra-pemrosesan data, pemodelan, evaluasi hingga tuning hyperparameter model. Pada tahap pemodelan, kita akan menggunakan engine dari paket kernlab. Oleh karena itu, kita perlu menginstal kedua paket tersebut untuk melanjutkan.

tidymodels adalah sekumpulan paket dalam R yang dirancang untuk memudahkan proses analisis data dan pembuatan model prediktif. Dengan menggunakan tidymodels, kita dapat melakukan semua langkah pemodelan secara sistematis dan konsisten, mulai dari membersihkan data hingga mengevaluasi performa model.

Pada tahap pemodelan, kernlab akan digunakan sebagai engine untuk membangun model SVM. kernlab menyediakan berbagai metode kernel dan SVM yang dapat disesuaikan dengan kebutuhan analisis kita. Penggunaan kernlab memungkinkan kita untuk melakukan pemodelan yang lebih fleksibel dan komprehensif.

2.) Memasukkan Data

Pada tahap ini, kita akan memuat dataset yang berisi informasi tentang klaim asuransi. Dataset ini memiliki 1338 observasi dan terdiri dari 11 variabel, meliputi age, sex, bmi, children, smoker, region, charges dan insuranceclaim. Variabel respom dalam dataset ini adalah insuranceclaim, di mana nilai 0 menunjukkan tidak bisa mengajukan klaim asuransi dan nilai 1 menunjukkan bisa mengajukan klaim asuransi. Dataset ini menggunakan teknik SVM untuk membangun model yang dapat memprediksi kelayakan seseorang untuk mengajukan klaim asuransi. Kita juga akan mengubah kolom respon menjadi faktor agar dapat digunakan dalam pemodelan klasifikasi.

# Memuat dataset klaim asuransi
data_claim <- read.csv("C:/Users/Lenovo/Downloads/insurance.csv")

# Menampilkan data klaim asuransi
head(data_claim)
# Merubah kolom respon menjadi factor
data_claim$insuranceclaim <- as.factor(data_claim$insuranceclaim)

# Menampilkan struktur data klaim asuransi
str(data_claim)
## 'data.frame':    1338 obs. of  8 variables:
##  $ age           : int  19 18 28 33 32 31 46 37 37 60 ...
##  $ sex           : int  0 1 1 1 1 0 0 0 1 0 ...
##  $ bmi           : num  27.9 33.8 33 22.7 28.9 ...
##  $ children      : int  0 1 3 0 0 0 1 3 2 0 ...
##  $ smoker        : int  1 0 0 0 0 0 0 0 0 0 ...
##  $ region        : int  3 2 2 1 1 2 2 1 0 1 ...
##  $ charges       : num  16885 1726 4449 21984 3867 ...
##  $ insuranceclaim: Factor w/ 2 levels "0","1": 2 2 1 1 2 1 2 1 1 1 ...
# Menampilkan ringkasan data klaim asuransi pada kolom respon
table(data_claim$insuranceclaim)
## 
##   0   1 
## 555 783

3.) Membagi Data dan Preprocessing

Pada tahap ini, kita akan membagi dataset menjadi dua bagian: data latih dan data uji. Data latih akan digunakan untuk melatih model, sedangkan data uji akan digunakan untuk mengevaluasi performa model.

Pembagian data dilakukan dengan menggunakan fungsi initial_split dari paket rsample, di mana kita akan membagi data dengan proporsi 80% untuk data latih dan 20% untuk data uji. Setelah itu, kita akan menggunakan fungsi training dan testing untuk mendapatkan data latih dan data uji.

Kita juga akan melakukan preprocessing pada data latih dengan melakukan standardisasi fitur menggunakan step_center dan step_scale dari paket recipes. Standardisasi fitur bertujuan untuk mengurangi skala variabel agar memiliki rata-rata 0 dan deviasi standar 1.

set.seed(20) # Mengatur seed untuk reprodusibilitas

# Membagi data latih dan data uji
data_split <- initial_split(data_claim, prop = 0.8) # 80% untuk data latih dan 20% untuk data uji
data_train <- training(data_split)
data_test <- testing(data_split)

# Menyiapkan tahapan preprocessing data
data_recipe <- recipe(insuranceclaim ~ ., data = data_train) %>%
               step_center(all_numeric_predictors()) %>%    # Mengurangi rata-rata fitur
               step_scale(all_numeric_predictors())         # Mengurangi deviasi standar fitur
data_recipe
## 
## ── Recipe ──────────────────────────────────────────────────────────────────────
## 
## ── Inputs
## Number of variables by role
## outcome:   1
## predictor: 7
## 
## ── Operations
## • Centering for: all_numeric_predictors()
## • Scaling for: all_numeric_predictors()

4.) Membangun Model SVM

Pada tahap ini, kita akan membangun model SVM menggunakan kernel radial basis function (RBF). Kernel RBF adalah salah satu kernel yang paling umum digunakan dalam SVM karena kemampuannya untuk menangani data non-linear. Kita akan menggunakan fungsi svm_rbf dari paket kernlab untuk membangun model SVM dengan parameter cost dan rbf_sigma yang telah ditentukan.

svm_rbf adalah fungsi yang digunakan untuk membangun model SVM dengan kernel RBF. Parameter cost mengontrol kompleksitas model, sedangkan rbf_sigma mengontrol lebar dari fungsi kernel RBF. Kita akan menggunakan nilai default untuk parameter ini, tetapi kita juga dapat melakukan tuning hyperparameter untuk meningkatkan performa model.

# Inisiasi model
svm_model <- svm_rbf(mode = "classification", cost = 2, rbf_sigma = 1) %>%
  set_engine("kernlab")

Selanjutnya, kita akan membuat workflow model dengan menggunakan fungsi workflow dari paket workflows. Workflow model menggabungkan tahapan preprocessing dan model SVM menjadi satu kesatuan yang dapat dilatih. Workflow model adalah cara untuk mengorganisir tahapan pemodelan dalam satu objek yang dapat digunakan untuk melatih dan mengevaluasi model. Dengan menggunakan workflow, kita dapat dengan mudah mengelola tahapan preprocessing dan pemodelan secara bersamaan.

# Membuat workflow model
svm_workflow <- workflow() %>%
  add_recipe(data_recipe) %>%
  add_model(svm_model)

# Melatih model dengan data latih
svm_fit <- svm_workflow %>%
  fit(data = data_train)

print(svm_fit)
## ══ Workflow [trained] ══════════════════════════════════════════════════════════
## Preprocessor: Recipe
## Model: svm_rbf()
## 
## ── Preprocessor ────────────────────────────────────────────────────────────────
## 2 Recipe Steps
## 
## • step_center()
## • step_scale()
## 
## ── Model ───────────────────────────────────────────────────────────────────────
## Support Vector Machine object of class "ksvm" 
## 
## SV type: C-svc  (classification) 
##  parameter : cost C = 2 
## 
## Gaussian Radial Basis kernel function. 
##  Hyperparameter : sigma =  1 
## 
## Number of Support Vectors : 608 
## 
## Objective Function Value : -379.3854 
## Training error : 0.016822 
## Probability model included.

5.) Evaluasi Model

Pada tahap ini, kita akan mengevaluasi model SVM yang telah dibangun dengan menggunakan data uji. Kita akan menggunakan fungsi predict untuk memprediksi kelas pada data uji dan menghitung metrik akurasi menggunakan fungsi metrics dari paket yardstick. Selain itu, kita juga akan menghitung confusion matrix untuk melihat performa model dalam mengklasifikasikan data.

# Memprediksi data uji
svm_preds <- predict(svm_fit, data_test, type = "class") %>%
  bind_cols(data_test)

print(svm_preds)
## # A tibble: 268 × 9
##    .pred_class   age   sex   bmi children smoker region charges insuranceclaim
##    <fct>       <int> <int> <dbl>    <int>  <int>  <int>   <dbl> <fct>         
##  1 1              32     1  28.9        0      0      1   3867. 1             
##  2 1              62     0  26.3        0      1      2  27809. 1             
##  3 1              23     1  34.4        0      0      3   1827. 1             
##  4 1              56     1  40.3        0      0      3  10602. 1             
##  5 0              37     1  28.0        2      0      1   6204. 0             
##  6 1              31     1  36.3        2      1      3  38711  1             
##  7 1              22     1  35.6        0      1      3  35586. 1             
##  8 0              19     0  28.6        5      0      3   4688. 0             
##  9 0              26     1  20.8        0      0      3   2302. 0             
## 10 1              28     0  34.8        0      0      1   3557. 1             
## # ℹ 258 more rows
# Menghitung metrik akurasi
svm_metrics <- svm_preds %>%
  metrics(truth = insuranceclaim, estimate = .pred_class)

print(svm_metrics)
## # A tibble: 2 × 3
##   .metric  .estimator .estimate
##   <chr>    <chr>          <dbl>
## 1 accuracy binary         0.903
## 2 kap      binary         0.802
# Menghitung confusion matrix
cm <- svm_preds %>%
  conf_mat(truth = insuranceclaim, estimate = .pred_class)

print(cm)
##           Truth
## Prediction   0   1
##          0 101  10
##          1  16 141

Dari hasil evaluasi model, kita dapat melihat akurasi model SVM dan confusion matrix yang menunjukkan jumlah prediksi benar dan salah untuk setiap kelas. Akurasi adalah metrik yang menunjukkan seberapa baik model dalam mengklasifikasikan data uji. Nilai akurasi yang didapatkan adalah sebesar 0.903 atau secara umum model mampu memprediksi benar sekitar 90% dari data uji.

6.) Tuning Hyperparameter

Pada tahap ini, kita akan melakukan tuning hyperparameter untuk meningkatkan performa model SVM. Tuning hyperparameter adalah proses mencari kombinasi terbaik dari parameter model yang dapat meningkatkan akurasi model. Kita akan menggunakan fungsi tune_grid dari paket tune untuk melakukan pencarian hyperparameter.

Pencarian dengan Random Search adalah metode untuk menemukan kombinasi terbaik dari hyperparameter model dengan cara melakukan pencarian acak dalam ruang parameter. Dalam hal ini, kita akan mencari nilai terbaik untuk parameter cost dan rbf_sigma pada model SVM. Misalkan untuk cost dan rbf_sigma kita akan mencari nilai dari 10^-2 hingga 10^2. Kita juga akan menggunakan k-fold cross-validation untuk mengevaluasi performa model dengan kombinasi hyperparameter yang berbeda.

Nilai parameter terbaik yang ditemukan selama pencarian hyperparameter akan digunakan untuk membangun model akhir. Kita akan menggunakan fungsi select_best untuk memilih kombinasi hyperparameter terbaik berdasarkan metrik akurasi.

set.seed(20)

# Inisiasi model svm
svm_tune_model <- svm_rbf(mode = "classification", 
                          cost = tune(), 
                          rbf_sigma = tune()) %>%
  set_engine("kernlab")


# Membuat model workflow
svm_tune_workflow <- workflow() %>%
  add_recipe(data_recipe) %>%
  add_model(svm_tune_model)


# Mendefinisikan grid parameter (random search)
param_grid <- grid_random( 
  cost(range = c(-2, 2)),       #  Rentang pencarian nilai cost dari 10^-2 hingga 10^2
  rbf_sigma(range = c(-2, 2)),  #  Rentang pencarian nilai sigma dari 10^-2 hingga 10^2
  size=100                     #  Buat kombinasi random search sebanyak 100 kali  
)

# Membuat data untuk k-fold cv dengan 3 fold
folds <- vfold_cv(data_train, v = 3)

# Melatih model dengan pencarian hyperparameter
svm_tune <- tune_grid(
  svm_tune_workflow,
  resamples = folds,
  grid = param_grid
)

# Menentukan hyperaprameter terbaik
svm_best <- select_best(svm_tune, metric="accuracy")

print(svm_best)
## # A tibble: 1 × 3
##    cost rbf_sigma .config               
##   <dbl>     <dbl> <chr>                 
## 1 0.896    0.0442 Preprocessor1_Model058

Dari output di atas, kita dapat melihat nilai hyperparameter terbaik yang ditemukan selama pencarian hyperparameter. Nilai cost terbaik adalah 0.896 dan nilai rbf_sigma terbaik adalah 0.0442. Kita akan menggunakan nilai-nilai ini untuk membangun model akhir.

7.) Membangun Model Akhir

Pada tahap ini, kita akan membangun model akhir dengan menggunakan hyperparameter terbaik yang ditemukan selama pencarian hyperparameter. Kita akan menggunakan fungsi finalize_workflow untuk menggabungkan workflow model dengan hyperparameter terbaik. Setelah itu, kita akan melatih model akhir dengan data latih dan mengevaluasi performa model dengan data uji.

# Finalisasi alur kerja dengan hyperparameter terbaik
final_svm_workflow <- finalize_workflow(
  svm_tune_workflow,
  svm_best
)

# Latih model dengan data latih
best_fit <- final_svm_workflow %>% 
  fit(data = data_train)

# Evaluasi model dengan data uji
best_preds <- predict(best_fit, data_test) %>%
  bind_cols(data_test)

svm_metrics_best <- best_preds %>%
  metrics(truth = insuranceclaim, estimate = .pred_class)

print(svm_metrics_best)
## # A tibble: 2 × 3
##   .metric  .estimator .estimate
##   <chr>    <chr>          <dbl>
## 1 accuracy binary         0.907
## 2 kap      binary         0.812
# Buat confusion matrix
cm_best <- best_preds %>%
  conf_mat(truth = insuranceclaim, estimate = .pred_class)

print(cm_best)
##           Truth
## Prediction   0   1
##          0 110  18
##          1   7 133

Dari hasil evaluasi model akhir, kita dapat melihat akurasi model SVM yang telah dituning dengan hyperparameter terbaik. Akurasi model akhir adalah sebesar 0.907 yang di mana adanya peningkatan akurasi dibandingkan dengan model awal yang hanya sebesar 0.903. Selain itu, kita juga dapat melihat confusion matrix yang menunjukkan jumlah prediksi benar dan salah untuk setiap kelas.

8.) Menyimpan Model

Pada tahap ini, kita akan menyimpan model akhir yang telah dibangun ke dalam file dengan format .rds. Penyimpanan model ke dalam file memungkinkan kita untuk menggunakan model tersebut di lain waktu tanpa perlu melatih ulang model. Kita akan menggunakan fungsi saveRDS untuk menyimpan model ke dalam file. dan kemudian kita akan menggunakan fungsi readRDS untuk membuka model dari file.

# Menyimpan model ke dalam file .rds
saveRDS(best_fit, file = "final_model.rds")

# Membuka model dari file .rds
loaded_final_model <- readRDS(file = "final_model.rds")

9.) Menggunakan Model untuk Prediksi

Pada tahap ini, kita akan menggunakan model yang telah dibangun untuk melakukan prediksi pada data baru. Kita akan membuat data baru dengan format yang sama seperti data latih dan data uji, kemudian menggunakan fungsi predict untuk memprediksi kelas pada data baru tersebut. Data baru ini harus memiliki struktur yang sama dengan data latih dan data uji, termasuk kolom-kolom yang digunakan dalam model. Kita akan menggunakan fungsi bind_cols untuk menggabungkan hasil prediksi dengan data baru.

# Contoh data baru untuk prediksi
data_1 <- data.frame(
  age = 34,
  sex = 1,
  bmi = 23.650,
  children = 0,
  smoker = 0,
  region = 1,
  charges = 22000
)

data_2 <- data.frame(
  age = 56,
  sex = 1,
  bmi = 40.350,
  children = 0,
  smoker = 0,
  region = 0,
  charges = 2543
)

# Data baru untuk prediksi
data_baru = data.frame(rbind(data_1, data_2))

# Memprediksi data baru
predictions <- predict(loaded_final_model, data_baru) %>%
  bind_cols(data_baru)

predictions

——————————————————

B.2 K-Nearest Neighbors (KNN)

Klasifikasi

Algoritma K-Nearest Neighbor (KNN) adalah metode klasifikasi dan regresi yang mengklasifikasikan data baru berdasarkan kesamaan dengan data yang sudah ada, dengan menggunakan k tetangga terdekat dalam data pelatihan untuk menentukan kelas atau nilai dari data baru tersebut. Metode yang bersifat non-parametric memiliki makna bahwa metode tersebut tidak membuat asumsi apa pun tentang distribusi data yang mendasarinya. Dengan kata lain, tidak ada jumlah parameter atau estimasi parameter yang tetap dalam model, terlepas data tersebut berukuran kecil ataupun besar.

Algoritma non-parametric seperti KNN menggunakan sejumlah parameter yang fleksibel, dan jumlah parameter seringkali bertambah seiring data yang semakin banyak. Algoritma non-parametric secara komputasi lebih lambat, tetapi membuat lebih sedikit asumsi tentang data. Algoritma KNN juga bersifat lazy learning, yang artinya tidak menggunakan titik data training untuk membuat model. Singkatnya pada algoritma KNN tidak ada fase training, kalaupun ada juga sangat minim.

Semua data training digunakan pada tahap testing. Hal ini membuat proses training lebih cepat dan tahap testing lebih lambat dan cenderung mahal atau membutuhkan banyak cost dari sisi waktu dan memori. Dalam kasus terburuk, KNN membutuhkan lebih banyak waktu untuk memindai semua titik data. Proses ini juga akan membutuhkan lebih banyak memori untuk menyimpan data training.

K-Nearest Neighbor termasuk salah satu algoritma paling sederhana yang digunakan dalam machine learning untuk regresi dan klasifikasi. KNN mengikuti strategi “bird of a feather” dalam menentukan di mana data baru sebaiknya ditempatkan. Algoritma KNN mengasumsikan bahwa sesuatu yang mirip akan ada dalam jarak yang berdekatan atau bertetangga. Artinya data-data yang cenderung serupa akan dekat satu sama lain.

KNN menggunakan semua data yang tersedia dan mengklasifikasikan data atau kasus baru berdasarkan ukuran kesamaan atau fungsi jarak. Data baru kemudian ditugaskan ke kelas tempat sebagian besar data tetangga berada.

+ Poin Penting dalam KNN

Tujuan dari algoritma KNN adalah untuk mengklasifikasikan data baru berdasarkan jarak ke titik data yang sudah ada. Ada beberapa poin penting yang perlu diperhatikan dalam algoritma KNN: 1. Menentukan Metrik Jarak. Menentukan titik data mana yang paling dekat dengan titik kueri tertentu, jarak antara titik kueri dan titik data lainnya perlu dihitung. Metrik jarak ini membantu membentuk batasan keputusan yang mengarahkan kueri partisi ke kelas yang berbeda. Metrik jarak yang umum digunakan adalah Euclidean, Hamming, Manhattan, dan Minkowski.

  1. Mendefinisikan Nilai K. Nilai k pada algoritma KNN mendefinisikan berapa banyak tetangga yang akan diperiksa untuk menentukan klasifikasi titik kueri tertentu. Misalnya, jika k=1, instance akan ditugaskan ke kelas yang sama dengan tetangga terdekatnya.

Mendefinisikan k dapat menjadi tindakan penyeimbang karena nilai yang berbeda dapat menyebabkan overfitting atau underfitting. Nilai k yang lebih rendah dapat memiliki varians yang tinggi, tetapi bias yang rendah. Sedangkan nilai k yang lebih besar dapat menyebabkan bias yang tinggi dan varians yang lebih rendah.

Pilihan k akan sangat bergantung pada data input karena data dengan lebih banyak outlier atau noise kemungkinan akan berkinerja lebih baik dengan nilai k yang lebih tinggi. Secara keseluruhan, disarankan untuk memilih nilai k berupa angka ganjil untuk menghindari ikatan dalam klasifikasi. Strategi cross validation juga dapat digunakan untuk membantu kita memilih k yang optimal untuk dataset yang kita miliki.

+ Cara Kerja KNN

Berikut adalah langkah-langkah cara kerja algoritma KNN: 1. Menentukan Parameter k: Pemilihan nilai k adalah bagian kritis dari algoritma KNN. Nilai k yang terlalu kecil dapat menyebabkan model rentan terhadap noise, sedangkan nilai k yang besar dapat mengaburkan batas keputusan yang sebenarnya.

  1. Menghitung Jarak: Algoritma menghitung jarak antara titik data yang akan diprediksi dengan semua titik data dalam set pelatihan.

  2. Menentukan Tetangga Terdekat: Algoritma memilih k tetangga terdekat berdasarkan jarak yang dihitung sebelumnya.

  3. Menentukan Kelas Prediksi: kelas mayoritas dari tetangga terdekat digunakan sebagai prediksi untuk titik data yang dipertanyakan.

Klasifikasi

+ K-Nearest Neighbor Regression

K-Nearest Neighbor Regression adalah metode regresi yang menggunakan prinsip yang sama dengan KNN, tetapi alih-alih mengklasifikasikan data ke dalam kelas, KNN regresi memprediksi nilai kontinu berdasarkan rata-rata atau median dari nilai tetangga terdekat. KNN regresi juga menggunakan jarak untuk menentukan tetangga terdekat, tetapi hasilnya adalah nilai numerik daripada kelas.

+ Penerapan KNN Via RStudio

1.) Memanggil Library

Pada penerapan RStudio ini, kita akan menggunakan paket caret untuk membagi data, melakukan preprocessing, dan evaluasi model. Kita juga akan menggunakan paket class untuk menerapkan algoritma KNN. Paket caret adalah paket yang sangat berguna dalam R untuk membangun model prediktif dan melakukan analisis data.

2.) Memasukkan Data

Pada tahap ini, kita akan memuat dataset yang berisi informasi tentang klaim asuransi. Dataset ini memiliki 1338 observasi dan terdiri dari 11 variabel, meliputi age, sex, bmi, children, smoker, region, charges dan insuranceclaim. Variabel respom dalam dataset ini adalah insuranceclaim, di mana nilai 0 menunjukkan tidak bisa mengajukan klaim asuransi dan nilai 1 menunjukkan bisa mengajukan klaim asuransi. Dataset ini menggunakan teknik KNN untuk membangun model yang dapat memprediksi kelayakan seseorang untuk mengajukan klaim asuransi. Kita juga akan mengubah kolom respon menjadi faktor agar dapat digunakan dalam pemodelan klasifikasi.

# Memuat dataset klaim asuransi
data_claim <- read.csv("C:/Users/Lenovo/Downloads/insurance.csv")

# Menampilkan data klaim asuransi
head(data_claim)
# Merubah kolom respon menjadi factor
data_claim$insuranceclaim <- as.factor(data_claim$insuranceclaim)

# Menampilkan struktur data klaim asuransi
str(data_claim)
## 'data.frame':    1338 obs. of  8 variables:
##  $ age           : int  19 18 28 33 32 31 46 37 37 60 ...
##  $ sex           : int  0 1 1 1 1 0 0 0 1 0 ...
##  $ bmi           : num  27.9 33.8 33 22.7 28.9 ...
##  $ children      : int  0 1 3 0 0 0 1 3 2 0 ...
##  $ smoker        : int  1 0 0 0 0 0 0 0 0 0 ...
##  $ region        : int  3 2 2 1 1 2 2 1 0 1 ...
##  $ charges       : num  16885 1726 4449 21984 3867 ...
##  $ insuranceclaim: Factor w/ 2 levels "0","1": 2 2 1 1 2 1 2 1 1 1 ...
# Menampilkan ringkasan data klaim asuransi pada kolom respon
table(data_claim$insuranceclaim)
## 
##   0   1 
## 555 783
# Melihat jumlah dan komposisi masing-masing kategori
insuranceclaim <- data.frame(table(data_claim$insuranceclaim))

insuranceclaim$Prop <- round(insuranceclaim$Freq / sum(insuranceclaim$Freq), 3)

print(insuranceclaim)
##   Var1 Freq  Prop
## 1    0  555 0.415
## 2    1  783 0.585

3.) Membagi Data dan Preprocessing

Pada tahap ini, kita akan membagi dataset menjadi dua bagian: data latih dan data uji. Data latih akan digunakan untuk melatih model, sedangkan data uji akan digunakan untuk mengevaluasi performa model. Kita menggunakan fungsi createDataPartition dari paket caret untuk membagi data dengan proporsi 80% untuk data latih dan 20% untuk data uji.

# Membagi data sebagai data Latih dan data Uji
set.seed(111) # Mengatur seed tertentu untuk hasil yang dapat direproduksi

# Data latih = 80%, Data uji = 20%
trainIndex <- createDataPartition(data_claim$insuranceclaim, p = 0.8, list = FALSE, times = 1)

# Buat data latih dan data uji berdasarkan indeks yang dihasilkan
data.train <- data_claim[trainIndex, ]
data.test <- data_claim[-trainIndex, ]

# Melihat komposisi setiap kelas pada data train dan test
cbind("train" = table(data.train$insuranceclaim), "test" = table(data.test$insuranceclaim))
##   train test
## 0   444  111
## 1   627  156

Setelah itu, kita akan menggunakan fungsi preProcess untuk melakukan scaling pada fitur numerik. Fungsi preProcess akan menghitung parameter yang diperlukan untuk melakukan scaling, seperti rata-rata dan deviasi standar, dan kemudian menerapkannya pada data latih dan data uji.

## Features Scaling
# Menerapkan scaling menggunakan preProcess untuk semua fitur numerik
preproc.params <- preProcess(data.train[, -8], method = "range")

scaled.data.train <- predict(preproc.params, data.train[, -8])
scaled.data.test <- predict(preproc.params, data.test[, -8])

summary(scaled.data.train)
##       age              sex              bmi            children     
##  Min.   :0.0000   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.:0.1739   1st Qu.:0.0000   1st Qu.:0.2786   1st Qu.:0.0000  
##  Median :0.4565   Median :1.0000   Median :0.3874   Median :0.2000  
##  Mean   :0.4562   Mean   :0.5117   Mean   :0.3940   Mean   :0.2183  
##  3rd Qu.:0.7174   3rd Qu.:1.0000   3rd Qu.:0.4969   3rd Qu.:0.4000  
##  Max.   :1.0000   Max.   :1.0000   Max.   :1.0000   Max.   :1.0000  
##      smoker           region          charges       
##  Min.   :0.0000   Min.   :0.0000   Min.   :0.00000  
##  1st Qu.:0.0000   1st Qu.:0.3333   1st Qu.:0.05743  
##  Median :0.0000   Median :0.6667   Median :0.13253  
##  Mean   :0.2073   Mean   :0.5082   Mean   :0.19338  
##  3rd Qu.:0.0000   3rd Qu.:1.0000   3rd Qu.:0.24882  
##  Max.   :1.0000   Max.   :1.0000   Max.   :1.00000

4.) Membangun Model KNN

Selanjutnya kita membuat prediksi pada data uji dengan menggunakan fungsi knn dari paket class. Fungsi knn akan menghitung jarak antara data uji dan data latih, kemudian menentukan kelas berdasarkan k tetangga terdekat. Kita akan menggunakan nilai k=8 untuk melakukan klasifikasi.

## KNN dengan paket `class`
pred.knn <- knn(train = scaled.data.train, test=scaled.data.test,
                cl = data.train$insuranceclaim, k=8)

# Menampilkan hasil prediksi
print(pred.knn)
##   [1] 0 0 0 0 0 1 0 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 0 1 1 1 0 1 1 1 0 1 0 0 1
##  [38] 1 0 0 1 1 1 0 0 0 1 0 1 0 1 1 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 0
##  [75] 1 0 0 0 0 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 0 1 0
## [112] 0 0 1 0 1 1 1 0 1 1 0 0 0 1 1 1 1 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 1 1 0 1
## [149] 1 0 1 0 1 1 0 1 1 1 1 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 1 0 1 1 0 1 1 0 1 0 0
## [186] 0 0 1 1 1 0 1 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1 0 1 0 1 1 0 1
## [223] 1 1 1 0 1 1 0 1 1 0 0 1 1 0 0 1 1 0 0 0 1 0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 0
## [260] 0 0 1 0 0 1 1 1
## Levels: 0 1
# Evaluasi hasil prediksi pada data uji
conf_matrix <- confusionMatrix(pred.knn, data.test$insuranceclaim)
print(conf_matrix)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0  88  22
##          1  23 134
##                                           
##                Accuracy : 0.8315          
##                  95% CI : (0.7811, 0.8743)
##     No Information Rate : 0.5843          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.6526          
##                                           
##  Mcnemar's Test P-Value : 1               
##                                           
##             Sensitivity : 0.7928          
##             Specificity : 0.8590          
##          Pos Pred Value : 0.8000          
##          Neg Pred Value : 0.8535          
##              Prevalence : 0.4157          
##          Detection Rate : 0.3296          
##    Detection Prevalence : 0.4120          
##       Balanced Accuracy : 0.8259          
##                                           
##        'Positive' Class : 0               
## 

Berdasarkan output di atas, disajikan prediksi kelas dari data uji. Misalkan pada data uji yang pertama diprediksi masuk kelas 0, data uji kedua masuk kelas 0 sampai dengan data uji terakhir diprediksi masuk sebagai kelas 1. Hasil ini selanjutnya dapat dibandingkan dengan kelas sebenarnya pada data uji melalui confusion matrix.

Secara keseluruhan, nilai akurasi prediksi sebesar 0.8315 atau algoritma KNN berhasil memprediksi benar 83,15% dari data uji. Jika dilihat menurut masing-masing kelas, dari 111 data uji dengan kelas 0, 88 diprediksi benar, sementara 23 salah. Hasil ini memberikan nilai sensitivity (prediksi benar kelas positif) sebesar 0.7928. Selanjutnya, dari 156 data uji dengan kelas 1, 134 diprediksi benar dan 22 salah atau memiliki nilai spesifisitas sebesar 0.8590.

Pustaka caret memiliki fungsi train yang dapat dimanfaatkan untuk melakukan iterasi berbagai nilai k. Selain melakukan iterasi, fungsi train juga memungkinkan kita melakukan validasi silang sehingga hasil yang diperoleh bisa lebih dapat dipercaya dan dapat mengurangi kecenderungan overfitting.

Kode berikut ini menunjukkan bagaimana penggunaan fungsi train untuk mencari nilai k terbaik pada algoritma KNN.

## KNN dengan paket `caret`
set.seed(111) # Mengatur seed tertentu untuk hasil yang dapat direproduksi

# Proses penginsuranceclaim menggunakan k-fold cv dengan 5 fold
control = trainControl(method = "cv", number = 5)

# Pencarian dilakukan untuk k=1,2,...,100 (Iterasi)
grid = expand.grid(k = 1:100)

knn.grid <- train(x=scaled.data.train,
                  y=data.train$insuranceclaim,
                  method = "knn",
                  trControl = control,
                  tuneGrid = grid)

# Menampilkan hasil model
print(knn.grid)
## k-Nearest Neighbors 
## 
## 1071 samples
##    7 predictor
##    2 classes: '0', '1' 
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 856, 856, 857, 858, 857 
## Resampling results across tuning parameters:
## 
##   k    Accuracy   Kappa    
##     1  0.8450282  0.6812099
##     2  0.8338698  0.6579823
##     3  0.8412853  0.6734024
##     4  0.8253885  0.6397241
##     5  0.8235281  0.6356525
##     6  0.8291183  0.6476115
##     7  0.8281531  0.6456607
##     8  0.8310093  0.6508475
##     9  0.8244235  0.6369257
##    10  0.8197375  0.6273692
##    11  0.8272273  0.6416822
##    12  0.8216371  0.6303975
##    13  0.8132172  0.6112777
##    14  0.8094963  0.6024337
##    15  0.8113873  0.6070272
##    16  0.8132345  0.6113408
##    17  0.8094831  0.6020295
##    18  0.8048057  0.5922061
##    19  0.7973553  0.5766761
##    20  0.8048189  0.5914210
##    21  0.8066880  0.5953553
##    22  0.8011067  0.5851827
##    23  0.7927260  0.5655401
##    24  0.7955167  0.5729938
##    25  0.7927085  0.5658295
##    26  0.7927172  0.5664196
##    27  0.8029714  0.5864597
##    28  0.8020411  0.5844547
##    29  0.8020455  0.5844845
##    30  0.7982941  0.5761326
##    31  0.7983029  0.5764985
##    32  0.7899177  0.5583014
##    33  0.7955078  0.5706802
##    34  0.7899046  0.5583952
##    35  0.7945863  0.5673527
##    36  0.7973988  0.5731593
##    37  0.7880354  0.5534880
##    38  0.7880353  0.5526551
##    39  0.7927127  0.5620849
##    40  0.7983377  0.5738883
##    41  0.7945949  0.5660015
##    42  0.7871357  0.5503077
##    43  0.7871270  0.5509580
##    44  0.7974031  0.5725718
##    45  0.7936429  0.5644106
##    46  0.7852796  0.5470222
##    47  0.7908697  0.5585659
##    48  0.7936516  0.5647422
##    49  0.7908436  0.5585887
##    50  0.7899265  0.5560293
##    51  0.7861837  0.5480289
##    52  0.7889788  0.5549649
##    53  0.7899177  0.5555794
##    54  0.7861750  0.5481142
##    55  0.7908654  0.5572479
##    56  0.7936560  0.5632527
##    57  0.7918043  0.5591934
##    58  0.7945994  0.5652678
##    59  0.7964773  0.5698109
##    60  0.7927215  0.5625436
##    61  0.7973857  0.5719588
##    62  0.7927303  0.5621510
##    63  0.7936518  0.5644965
##    64  0.7899352  0.5559560
##    65  0.7871052  0.5510425
##    66  0.7833624  0.5436367
##    67  0.7833669  0.5437071
##    68  0.7814977  0.5399373
##    69  0.7777550  0.5324987
##    70  0.7786939  0.5349300
##    71  0.7740340  0.5246466
##    72  0.7749599  0.5274653
##    73  0.7814976  0.5402581
##    74  0.7796328  0.5359204
##    75  0.7833755  0.5445788
##    76  0.7824234  0.5422559
##    77  0.7814844  0.5413320
##    78  0.7796284  0.5364847
##    79  0.7805674  0.5384440
##    80  0.7796503  0.5366878
##    81  0.7805892  0.5391433
##    82  0.7787244  0.5349027
##    83  0.7749860  0.5269262
##    84  0.7721910  0.5222578
##    85  0.7759250  0.5301979
##    86  0.7777898  0.5344725
##    87  0.7768683  0.5326358
##    88  0.7731212  0.5246709
##    89  0.7777898  0.5345389
##    90  0.7731037  0.5238813
##    91  0.7805936  0.5411061
##    92  0.7833974  0.5464452
##    93  0.7740253  0.5271086
##    94  0.7777724  0.5347956
##    95  0.7758945  0.5301697
##    96  0.7759076  0.5310656
##    97  0.7768247  0.5325983
##    98  0.7712128  0.5217112
##    99  0.7721431  0.5242598
##   100  0.7684090  0.5154363
## 
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was k = 1.

Hasil di atas menunjukkan bahwa nilai k yang menghasilkan akurasi tertinggi berdasarkan validasi silang adalah k=1 yaitu sebesar 0.8451. Namun, perlu diingat bahwa nilai tersebut adalah berdasarkan data latih. Kita perlu mengukur performa sebenarnya menggunakan data uji seperti sebelumnya. Evaluasi pada data uji menunjukkan nilai akurasi sebesar 0.9064 sementara nilai sensitivity sebesar 0.8919 dan specificity sebesar 0.9167.

set.seed(111) # Mengatur seed tertentu untuk hasil yang dapat direproduksi

# Membuat prediksi untuk data uji
predictions <- predict(knn.grid, newdata = scaled.data.test)

# Evaluasi model
conf_matrix <- confusionMatrix(predictions, data.test$insuranceclaim)
print(conf_matrix)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0  99  13
##          1  12 143
##                                           
##                Accuracy : 0.9064          
##                  95% CI : (0.8649, 0.9385)
##     No Information Rate : 0.5843          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.8075          
##                                           
##  Mcnemar's Test P-Value : 1               
##                                           
##             Sensitivity : 0.8919          
##             Specificity : 0.9167          
##          Pos Pred Value : 0.8839          
##          Neg Pred Value : 0.9226          
##              Prevalence : 0.4157          
##          Detection Rate : 0.3708          
##    Detection Prevalence : 0.4195          
##       Balanced Accuracy : 0.9043          
##                                           
##        'Positive' Class : 0               
## 

5.) Melakukan Prediksi untuk Data Baru

Pada tahap ini, kita akan melakukan prediksi untuk data baru menggunakan model KNN yang telah dibangun. Kita akan membuat data baru dengan format yang sama seperti data latih dan data uji, kemudian menggunakan fungsi knn untuk memprediksi kelas pada data baru tersebut. Data baru ini harus memiliki struktur yang sama dengan data latih dan data uji, termasuk kolom-kolom yang digunakan dalam model.

# Memasukkan data baru
dataclaim.baru <- cbind(34, 1, 23.650, 0, 0, 1, 22000)
row.names(dataclaim.baru)<-("dataclaim.baru")
dataclaim.baru
##                [,1] [,2]  [,3] [,4] [,5] [,6]  [,7]
## dataclaim.baru   34    1 23.65    0    0    1 22000
dataclaim.baru2 <- cbind(56, 1, 40.350, 0, 0, 0, 2543)
row.names(dataclaim.baru2)<-("dataclaim.baru2")
dataclaim.baru2
##                 [,1] [,2]  [,3] [,4] [,5] [,6] [,7]
## dataclaim.baru2   56    1 40.35    0    0    0 2543
# Melakukan prediksi pada data baru
klasifikasi<-knn(data_claim[1:7],dataclaim.baru,data_claim$insuranceclaim,k=1,prob=TRUE)
klasifikasi
## [1] 0
## attr(,"prob")
## [1] 1
## Levels: 0 1
klasifikasi2<-knn(data_claim[1:7],dataclaim.baru2,data_claim$insuranceclaim,k=1,prob=TRUE)
klasifikasi2
## [1] 1
## attr(,"prob")
## [1] 1
## Levels: 0 1

B.3 Decision Tree

Klasifikasi

Decision Tree merupakan salah satu cara data processing dalam memprediksi masa depan dengan cara membangun klasifikasi atau regresi model dalam bentuk struktur pohon. Hal tersebut dilakukan dengan cara memecah terus ke dalam himpunan bagian yang lebih kecil lalu pada saat itu juga sebuah pohon keputusan secara bertahap dikembangkan. Hasil akhir dari proses tersebut adalah pohon dengan node keputusan dan node daun. Decision Tree juga berguna untuk dieksplorasi data, menemukan hubungan antara sejumlah calon variabel input dengan sebuah variabel target. Pohon keputusan eksplorasi data dan pemodelan yang salah langkah pertama yang sangat baik dalam proses pemodelan yang digunakan sebagai model akhir untuk beberapa teknik lainnya.

+ Struktur Decision Tree

Decision Tree dibentuk dari 3 tipe dari simpul (node) yaitu:

  1. Simpul leaf (leaf node): Simpul yang tidak memiliki cabang lagi, yang menunjukkan hasil akhir dari proses klasifikasi atau regresi.

  2. Simpul root (root node): Simpul pertama dari pohon keputusan yang berfungsi sebagai titik awal untuk membagi data ke dalam cabang-cabang.

  3. Setiap simpul perantara berhubungan dengan simpul root dan leaf, yang menunjukkan keputusan yang diambil berdasarkan fitur tertentu.

+ Catatan Penting dalam Decision Tree

Kelebihan lain dari metode ini adalah mampu mengeliminasi perhitungan atau data-data yang tidak diperlukan. Karena sampel yang ada biasanya hanya diuji berdasarkan kriteria atau kelas tertentu.

Meski memiliki banyak kelebihan, namun bukan berarti ini tidak memiliki kekurangan. Pohon keputusan ini mungkin tumpang tindih, terutama jika kelas dan kriteria yang digunakan sangat sering dapat meningkatkan waktu pengambilan keputusan sesuai dengan kapasitas memori yang diperlukan.

+ Penerapan Decision Tree Via RStudio

1.) Memanggil Library

Pada penerapan RStudio ini, kita akan menggunakan paket baru yaitu partykit untuk membangun model Decision Tree. Paket partykit adalah paket yang sangat berguna dalam R untuk membangun pohon keputusan dan melakukan analisis data. dan juga menggunakan paket dplyr untuk manipulasi data. Paket dplyr adalah paket yang sangat berguna dalam R untuk melakukan manipulasi data, seperti pemilihan kolom, pengelompokan, dan agregasi.

2.) Memasukkan Data

Pada tahap ini, kita akan memuat dataset yang berisi informasi tentang penjualan. Dataset ini memiliki 400 observasi dan terdiri dari 4 variabel, meliputi Gender, Age, EstimatedSalary, dan Purchased. Variabel respom dalam dataset ini adalah satisfied, di mana kelas no menunjukkan tidak puas dan nilai yes menunjukkan puas. Dataset ini menggunakan teknik Decision Tree untuk membangun model yang dapat memprediksi kepuasan pelanggan berdasarkan fitur-fitur yang ada.

# Memuat dataset penjualan
data_sale <- read.csv("C:/Users/Lenovo/Downloads/sale.csv")

# Menampilkan data penjualan
head(data_sale)
# Menampilkan struktur data penjualan
str(data_sale)
## 'data.frame':    400 obs. of  5 variables:
##  $ Gender         : chr  "Male" "Male" "Female" "Female" ...
##  $ Age            : int  19 35 26 27 19 27 27 32 25 35 ...
##  $ EstimatedSalary: int  19000 20000 43000 57000 76000 58000 84000 150000 33000 65000 ...
##  $ Purchased      : int  0 0 0 0 0 0 0 1 0 0 ...
##  $ satisfied      : chr  "no" "no" "no" "no" ...
# Melakukan pengecekan apakah variasi dari data yang digunakan mendekati 0 atau tidak
nearZeroVar(data_sale)
## integer(0)
# Melakukan pengecekan apakah ada data yang hilang
colSums(is.na(data_sale))
##          Gender             Age EstimatedSalary       Purchased       satisfied 
##               0               0               0               0               0
# Merubah semua kolom menjadi factor
data_sale <- data_sale %>%
  mutate_if(is.character, as.factor)
glimpse(data_sale)
## Rows: 400
## Columns: 5
## $ Gender          <fct> Male, Male, Female, Female, Male, Male, Female, Female…
## $ Age             <int> 19, 35, 26, 27, 19, 27, 27, 32, 25, 35, 26, 26, 20, 32…
## $ EstimatedSalary <int> 19000, 20000, 43000, 57000, 76000, 58000, 84000, 15000…
## $ Purchased       <int> 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, …
## $ satisfied       <fct> no, no, no, no, no, no, no, no, no, no, no, no, no, no…

3.) Membagi Data

Pada tahap ini, kita akan membagi dataset menjadi dua bagian: data latih dan data uji. Data latih akan digunakan untuk melatih model, sedangkan data uji akan digunakan untuk mengevaluasi performa model. Kita menggunakan fungsi sample untuk membagi data dengan proporsi 60% untuk data latih dan 40% untuk data uji. Kita juga akan menggunakan fungsi prop.table untuk menghitung proporsi masing-masing kelas pada data latih dan data uji.

# Membagi data sebagai data Latih dan data Uji
set.seed(100) # Mengatur seed tertentu untuk hasil yang dapat direproduksi
intrain <- sample(nrow(data_sale),nrow(data_sale)*0.6)
data_train <- data_sale[intrain, ]
data_test <- data_sale[-intrain, ]

# Melihat komposisi setiap kelas pada data train dan test
prop.table(table(data_sale$satisfied))
## 
##   no  yes 
## 0.25 0.75
prop.table(table(data_train$satisfied))
## 
##  no yes 
## 0.2 0.8
prop.table(table(data_test$satisfied))
## 
##    no   yes 
## 0.325 0.675

4.) Membangun Model Decision Tree

Pada tahap ini, kita akan membangun model Decision Tree menggunakan fungsi ctree dari paket partykit. Fungsi ctree akan membangun pohon keputusan berdasarkan data latih yang telah dibagi sebelumnya. Kita juga akan menggunakan fungsi plot untuk memvisualisasikan pohon keputusan yang telah dibangun.

## Build Model
data_tree <- ctree(satisfied~., data = data_train)
data_tree
## 
## Model formula:
## satisfied ~ Gender + Age + EstimatedSalary + Purchased
## 
## Fitted party:
## [1] root
## |   [2] Age <= 34: no (n = 80, err = 50.0%)
## |   [3] Age > 34: yes (n = 160, err = 5.0%)
## 
## Number of inner nodes:    1
## Number of terminal nodes: 2
plot(data_tree, type = "simple")

Berdasarkan hasil model decision tree yang tebentuk, root node adalah variabel Age. inner node yang terbentuk sebanyak 1. Ketika nilai age kurang dari atau sama dengan 45, sebanyak 80 observasi diklasifikaikan sebagai no dengan nilai error sebesar 50%. Sedangkan ketika nilai age lebih dari 45, sebanyak 160 observasi diklasifikasikan sebagai yes dengan nilai error sebesar 5%.

## Model Evaluation
pred_data_train <- predict(data_tree, data_train)
confusionMatrix(pred_data_train, data_train$satisfied)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  no yes
##        no   40  40
##        yes   8 152
##                                           
##                Accuracy : 0.8             
##                  95% CI : (0.7437, 0.8487)
##     No Information Rate : 0.8             
##     P-Value [Acc > NIR] : 0.5385          
##                                           
##                   Kappa : 0.5             
##                                           
##  Mcnemar's Test P-Value : 7.66e-06        
##                                           
##             Sensitivity : 0.8333          
##             Specificity : 0.7917          
##          Pos Pred Value : 0.5000          
##          Neg Pred Value : 0.9500          
##              Prevalence : 0.2000          
##          Detection Rate : 0.1667          
##    Detection Prevalence : 0.3333          
##       Balanced Accuracy : 0.8125          
##                                           
##        'Positive' Class : no              
## 
pred_data_test <- predict(data_tree, data_test)
confusionMatrix(pred_data_test, data_test$satisfied)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction no yes
##        no  36  30
##        yes 16  78
##                                           
##                Accuracy : 0.7125          
##                  95% CI : (0.6357, 0.7812)
##     No Information Rate : 0.675           
##     P-Value [Acc > NIR] : 0.17696         
##                                           
##                   Kappa : 0.3875          
##                                           
##  Mcnemar's Test P-Value : 0.05527         
##                                           
##             Sensitivity : 0.6923          
##             Specificity : 0.7222          
##          Pos Pred Value : 0.5455          
##          Neg Pred Value : 0.8298          
##              Prevalence : 0.3250          
##          Detection Rate : 0.2250          
##    Detection Prevalence : 0.4125          
##       Balanced Accuracy : 0.7073          
##                                           
##        'Positive' Class : no              
## 

Dari hasil evaluasi model, kita akan gunakan nilai recall karena kita tidak ingin salah tebak orang yang sebenarnya No kita prediksi Yes. Nilai recall yang diperoleh sebesar 80%. Cukup tinggi. Selanjutnya coba menggunakan data test. Saat model diinputkan untuk memprediksi data test, kita mendapatkan nilai recall sebesar 71,25%. Adanya penurunan pada prediksi data test. Untuk melakukan improve model, kita bisa melakukan resampling agar klasifikasi untuktarget variabel menjadi lebih stabil.

set.seed(100) # Mengatur seed tertentu untuk hasil yang dapat direproduksi
intrain <- sample(nrow(data_sale), nrow(data_sale)*0.6)
re_train <- data_sale[intrain,]
re_train <- upSample(re_train[,-5], re_train[,5], yname = "satisfied" )
re_test <- data_sale[-intrain,]

# Melihat komposisi setiap kelas pada data train dan test
prop.table(table(re_train$satisfied))
## 
##  no yes 
## 0.5 0.5
prop.table(table(re_test$satisfied))
## 
##    no   yes 
## 0.325 0.675

Setelah itu, kita akan membangun model Decision Tree baru menggunakan data latih yang telah di-resample. Kita akan menggunakan fungsi ctree untuk membangun model Decision Tree baru dan memvisualisasikannya.

# Membangun model Decision Tree baru
data_tree_new <- ctree(satisfied~., re_train)
data_tree_new
## 
## Model formula:
## satisfied ~ Gender + Age + EstimatedSalary + Purchased
## 
## Fitted party:
## [1] root
## |   [2] Age <= 35: no (n = 229, err = 22.7%)
## |   [3] Age > 35
## |   |   [4] EstimatedSalary <= 29000: no (n = 18, err = 33.3%)
## |   |   [5] EstimatedSalary > 29000: yes (n = 137, err = 2.2%)
## 
## Number of inner nodes:    2
## Number of terminal nodes: 3
plot(data_tree_new, type = "simple")

Berdasarkan plot model decision tree yang baru, memiliki inner nodes sebanyak 2 dan menghasilkan terminal nodes sebanyak 3.

# Model Evaluation
# Evaluasi model Decision Tree baru
pred_train <- predict(data_tree_new, re_train)
confusionMatrix(pred_train, re_train$satisfied)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  no yes
##        no  189  58
##        yes   3 134
##                                           
##                Accuracy : 0.8411          
##                  95% CI : (0.8007, 0.8763)
##     No Information Rate : 0.5             
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.6823          
##                                           
##  Mcnemar's Test P-Value : 4.712e-12       
##                                           
##             Sensitivity : 0.9844          
##             Specificity : 0.6979          
##          Pos Pred Value : 0.7652          
##          Neg Pred Value : 0.9781          
##              Prevalence : 0.5000          
##          Detection Rate : 0.4922          
##    Detection Prevalence : 0.6432          
##       Balanced Accuracy : 0.8411          
##                                           
##        'Positive' Class : no              
## 
pred_test <- predict(data_tree_new, re_test)
confusionMatrix(pred_test, re_test$satisfied)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction no yes
##        no  48  44
##        yes  4  64
##                                           
##                Accuracy : 0.7             
##                  95% CI : (0.6226, 0.7698)
##     No Information Rate : 0.675           
##     P-Value [Acc > NIR] : 0.2796          
##                                           
##                   Kappa : 0.4299          
##                                           
##  Mcnemar's Test P-Value : 1.811e-08       
##                                           
##             Sensitivity : 0.9231          
##             Specificity : 0.5926          
##          Pos Pred Value : 0.5217          
##          Neg Pred Value : 0.9412          
##              Prevalence : 0.3250          
##          Detection Rate : 0.3000          
##    Detection Prevalence : 0.5750          
##       Balanced Accuracy : 0.7578          
##                                           
##        'Positive' Class : no              
## 

Hasil recall yang diperoleh yaitu sebesar 84.1% untuk data train dan 70% untuk data test. Adanya peningkatan pada data train, namun penurunan pada data test. Hal ini menunjukkan bahwa model yang dibangun sudah cukup baik.

5.) Melakukan Prediksi untuk Data Baru

Pada tahap ini, kita akan melakukan prediksi untuk data baru menggunakan model Decision Tree yang telah dibangun. Kita akan membuat data baru dengan format yang sama seperti data latih dan data uji, kemudian menggunakan fungsi predict untuk memprediksi kelas pada data baru tersebut. Data baru ini harus memiliki struktur yang sama dengan data latih dan data uji, termasuk kolom-kolom yang digunakan dalam model.

# Membuat data baru untuk prediksi
new_data <- tribble(
  ~Gender, ~Age, ~EstimatedSalary, ~Purchased,
  "Male", 19, 19000, 0,
)
new_data2 <- tribble(
  ~Gender, ~Age, ~EstimatedSalary, ~Purchased,
  "Female", 36, 70000, 0,
)

# Melakukan prediksi pada data baru
predictions <- predict(data_tree_new, new_data)
print(predictions)
##  1 
## no 
## Levels: no yes
predictions2 <- predict(data_tree_new, new_data2)
print(predictions2)
##   1 
## yes 
## Levels: no yes

B.4 Random Forest

Klasifikasi

Random Forest adalah algoritma dalam machine learning yang digunakan untuk pengklasifikasian data set dalam jumlah besar. Karena fungsinya bisa digunakan untuk banyak dimensi dengan berbagai skala dan performa yang tinggi. Klasifikasi ini dilakukan melalui penggabungan tree dalam decision tree dengan cara training dataset yang dimiliki.

Salah satu algoritma terbaik dalam machine learning ini menggunakan decision tree atau pohon keputusan untuk melangsungkan proses seleksi, di mana tree atau pohon decision tree akan dibagi secara rekursif berdasarkan data pada kelas yang sama. Dalam hal ini, penggunaan tree yang semakin banyak akan memengaruhi akurasi yang didapat menjadi lebih optimal. Penentuan klasifikasi dengan Random Forest dilakukan berdasarkan hasil voting dan tree yang terbentuk.

+ Cara Kerja Random Forest

Random Forest bekerja dengan cara membangun banyak pohon keputusan (decision trees) dari subset acak dari data pelatihan. “Hutan” yang dibangun oleh Random Forest adalah kumpulan decision tree di mana biasanya dilatih dengan metode bagging. Algoritma Random Forest meningkatkan keacakan pada model sambil menumbuhkan tree. Alih-alih mencari fitur yang paling penting saat memisahkan sebuah node, Random Forest mencari fitur terbaik di antara subset fitur yang acak. Alhasil, cara ini menghasilkan keragaman yang luas dan umumnya menghasilkan model yang lebih baik.

+ Perbedaan Random Forest dengan Decision Tree

Random forest pada dasarnya merupakan kumpulan dari beberapa decision trees. “Pohon-pohon” tersebut saling berhubungan hingga akhirnya dapat menghasilkan prediksi yang lebih akurat dan stabil. Caranya adalah dengan mengambil rata-rata output dari “pohon-pohon” tersebut. Makin banyak decision tree yang digunakan, maka makin tinggi tingkat akurasinya.

Perbedaan random forest dan decision tree juga bisa dilihat dari kedalamannya. Sebuah decision tree yang terlalu dalam akan mudah mengalami overfitting. Padahal, overfitting bisa mengurangi akurasi hasil. Pada random forest, hal tersebut tidak dicegah dengan membuat subset fitur secara acak. Subset tersebut kemudian digunakan untuk membuat “pohon” yang lebih kecil dan kemudian digabungkan kembali.

+ Penerapan Random Forest Via RStudio

1.) Memanggil Library

Pada penerapan RStudio ini, kita akan menggunakan paket baru yaitu randomForest untuk membangun model Random Forest. Paket randomForest adalah paket yang sangat berguna dalam R untuk membangun model Random Forest dan melakukan analisis data. Kita juga akan menggunakan paket caret untuk manipulasi data dan evaluasi model. Paket caret adalah paket yang sangat berguna dalam R untuk melakukan manipulasi data, seperti pemilihan kolom, pengelompokan, dan agregasi. Kita juga akan menggunakan paket caretEnsemble untuk membangun model ensemble. dan paket yardstick untuk mengevaluasi model.

2.) Memasukkan Data

Pada tahap ini, kita akan memuat dataset yang berisi informasi tentang penjualan. Dataset ini memiliki 400 observasi dan terdiri dari 4 variabel, meliputi Gender, Age, EstimatedSalary, dan Purchased. Variabel respom dalam dataset ini adalah satisfied, di mana kelas no menunjukkan tidak puas dan nilai yes menunjukkan puas.

# Memuat dataset penjualan
data_sale <- read.csv("C:/Users/Lenovo/Downloads/sale.csv")

# Menampilkan data penjualan
head(data_sale)
# Menampilkan struktur data penjualan
str(data_sale)
## 'data.frame':    400 obs. of  5 variables:
##  $ Gender         : chr  "Male" "Male" "Female" "Female" ...
##  $ Age            : int  19 35 26 27 19 27 27 32 25 35 ...
##  $ EstimatedSalary: int  19000 20000 43000 57000 76000 58000 84000 150000 33000 65000 ...
##  $ Purchased      : int  0 0 0 0 0 0 0 1 0 0 ...
##  $ satisfied      : chr  "no" "no" "no" "no" ...
# Melakukan pengecekan apakah variasi dari data yang digunakan mendekati 0 atau tidak
nearZeroVar(data_sale)
## integer(0)
# Melakukan pengecekan apakah ada data yang hilang
colSums(is.na(data_sale))
##          Gender             Age EstimatedSalary       Purchased       satisfied 
##               0               0               0               0               0
# Mengubah tipe kolom `satisfied` menjadi factor
data_sale$satisfied  <- as.factor(data_sale$satisfied)

3.) Membagi Data

Pada tahap ini, kita akan membagi dataset menjadi dua bagian: data latih dan data uji. Data latih akan digunakan untuk melatih model, sedangkan data uji akan digunakan untuk mengevaluasi performa model. Kita menggunakan fungsi sample untuk membagi data dengan proporsi 70% untuk data latih dan 30% untuk data uji. Kita juga akan menggunakan fungsi prop.table untuk menghitung proporsi masing-masing kelas pada data latih dan data uji.

# Membagi data sebagai data Latih dan data Uji
set.seed(123) # Mengatur seed tertentu untuk hasil yang dapat direproduksi
intrain <- sample(nrow(data_sale),nrow(data_sale)*0.7)
data_train <- data_sale[intrain, ]
data_test <- data_sale[-intrain, ]

4.) Membangun Model Random Forest

Pada tahap ini, kita akan membangun model Random Forest menggunakan fungsi randomForest dari paket randomForest. Fungsi randomForest akan membangun model Random Forest berdasarkan data latih yang telah dibagi sebelumnya. Pertama-tama kita akan melakukan tuning parameter untuk mendapatkan model yang optimal. Kita akan menggunakan fungsi train dari paket caret untuk melakukan tuning parameter. Kita juga akan menggunakan fungsi plot untuk memvisualisasikan hasil tuning parameter.

## Model Fitting
set.seed(123)
ctrl <- trainControl(method = "repeatedcv", number = 5, repeats = 3)
# Parameter method dapat disesuaikan dengan metode klasifikasi yang digunakan

model_rf_train <- train(satisfied~. , 
                        data = data_sale,
                        method = "rf",
                        trControl = ctrl)
saveRDS(model_rf_train, "model_rf_train.RDS") # Simpan modelnya

model_rf_train <- readRDS("model_rf_train.RDS")
model_rf_train
## Random Forest 
## 
## 400 samples
##   4 predictor
##   2 classes: 'no', 'yes' 
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold, repeated 3 times) 
## Summary of sample sizes: 320, 320, 320, 320, 320, 320, ... 
## Resampling results across tuning parameters:
## 
##   mtry  Accuracy   Kappa    
##   2     0.7641667  0.3664869
##   3     0.7533333  0.3451413
##   4     0.7466667  0.3263904
## 
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was mtry = 2.

Hasil output di atas menunjukkan bahwa model Random Forest yang optimal memiliki mtry sebesar 2 dengan akurasi sebesar 0.7641667 dan kappa sebesar 0.3664869.

Berikutnya, kita ingin melihat Out-of-Bag (OOB) error dari model yang telah dibangun. OOB error adalah ukuran kesalahan yang dihasilkan oleh model Random Forest pada data yang tidak digunakan untuk membangun pohon keputusan. OOB error dapat digunakan untuk mengevaluasi performa model Random Forest.

# Out-of-Bag (OOB) Error
model_rf_train$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: 22.25%
## Confusion matrix:
##     no yes class.error
## no  52  48   0.4800000
## yes 41 259   0.1366667
# Interpretation
varImp(model_rf_train)
## rf variable importance
## 
##                 Overall
## Age             100.000
## EstimatedSalary  83.099
## GenderMale        2.375
## Purchased         0.000

Nilai estimasi OOB error sebesar 22.25% menunjukkan bahwa model Random Forest yang dibangun memiliki performa yang baik. Selain itu, kita juga dapat melihat variabel mana yang paling berpengaruh terhadap model yang dibangun. Pada output di atas, kita dapat melihat bahwa variabel Age dan EstimatedSalary memiliki pengaruh yang signifikan terhadap model.

5.) Evaluasi Model

Pada tahap ini, kita akan melakukan evaluasi model Random Forest yang telah dibangun. Kita akan menggunakan data latih dan data uji untuk mengevaluasi performa model. Kita juga akan menggunakan fungsi confusionMatrix dari paket caret untuk menghitung matriks kebingungan (confusion matrix) dan menghitung akurasi model.

# Evaluasi Data Train dan Data Test
# Data Train
# prediction pada data train
pred_data_train <- predict(model_rf_train, data_train, type = 'raw')
prob_data_train <- predict(model_rf_train, data_train, type = 'prob')
# Hasil prediction pada data train
data_train_table <- select(data_train, satisfied) %>%
  bind_cols(satisfied_pred = pred_data_train) %>% 
  bind_cols(satisfied_eprob = round(prob_data_train[,1],4)) %>% 
  bind_cols(satisfied_pprob = round(prob_data_train[,2],4))
data_train_table %>% 
  conf_mat(satisfied, satisfied_pred)
##           Truth
## Prediction  no yes
##        no   58   6
##        yes   6 210

Untuk data pelatihan, jika dilihat menurut masing-masing kelas, dari 64 data uji dengan kelas no, 58 diprediksi benar, sementara 6 salah. Selanjutnya, dari 216 data uji dengan kelas yes, 210 diprediksi benar dan 6 salah.

# Data Test
# prediction pada data test
pred_data_test <- predict(model_rf_train, data_test, type = 'raw')
prob_data_test <- predict(model_rf_train, data_test, type = 'prob')
# Hasil prediction pada data train
data_test_table <- select(data_test, satisfied) %>%
  bind_cols(satisfied_pred = pred_data_test) %>% 
  bind_cols(satisfied_eprob = round(prob_data_test[,1],4)) %>% 
  bind_cols(satisfied_pprob = round(prob_data_test[,2],4))
data_test_table %>% 
  conf_mat(satisfied, satisfied_pred)
##           Truth
## Prediction no yes
##        no  33   2
##        yes  3  82

Untuk data uji, jika dilihat menurut masing-masing kelas, dari 36 data uji dengan kelas no, 33 diprediksi benar, sementara 3 salah. Selanjutnya, dari 84 data uji dengan kelas yes, 82 diprediksi benar dan 2 salah. Bisa disimpulkan bahwa model Random Forest yang dibangun memiliki performa yang baik dengan akurasi hingga 0.95 pada data uji.

6.) Melakukan Prediksi untuk Data Baru

Pada tahap ini, kita akan melakukan prediksi untuk data baru menggunakan model Random Forest yang telah dibangun. Kita akan membuat data baru dengan format yang sama seperti data latih dan data uji, kemudian menggunakan fungsi predict untuk memprediksi kelas pada data baru tersebut. Data baru ini harus memiliki struktur yang sama dengan data latih dan data uji, termasuk kolom-kolom yang digunakan dalam model.

# Membuat data baru untuk prediksi
new_data <- tribble(
  ~Gender, ~Age, ~EstimatedSalary, ~Purchased,
  "Male", 19, 19000, 0,
)
new_data2 <- tribble(
  ~Gender, ~Age, ~EstimatedSalary, ~Purchased,
  "Female", 36, 70000, 0,
)

# Melakukan prediksi pada data baru
predictions <- predict(model_rf_train, new_data)
print(predictions)
## [1] no
## Levels: no yes
predictions2 <- predict(model_rf_train, new_data2)
print(predictions2)
## [1] yes
## Levels: no yes

——————————————————

C. Algoritma Clustering

——————————————————

C.1 K-Means Clustering

K-means merupakan salah satu algoritma yang bersifat unsupervised learning. K-Means memiliki fungsi untuk mengelompokkan data kedalam data cluster. Algoritma ini dapat menerima data tanpa ada label kategori. K-Means Clustering Algoritma juga merupakan metode non-hierarchy. Metode Clustering Algoritma adalah mengelompokkan beberapa data ke dalam kelompok yang menjelaskan data dalam satu kelompok memiliki karakteristik yang sama dan memiliki karakteristik yang berbeda dengan data yang ada di kelompok lain. Cluster Sampling adalah teknik pengambilan sampel di mana unit-unit populasi dipilih secara acak dari kelompok yang sudah ada yang disebut cluster, nah Clustering atau klasterisasi adalah salah satu masalah yang menggunakan teknik unsupervised learning.

Klasifikasi

K-Means Clustering adalah suatu metode penganalisaan data atau metode Data Mining yang melakukan proses pemodelan unssupervised learning dan menggunakan metode yang mengelompokan data berbagai partisi.

K-Means Clustering memiliki objective yaitu meminimalisasi object function yang telah di atur pada proses clasterisasi. Dengan cara minimalisasi variasi antar 1 cluster dengan maksimalisasi variasi dengan data di cluster lainnya.

+ Cara Kerja K-Means Clustering

K-Means Clustering adalah proses berulang untuk meminimalkan jumlah jarak antara titik-titik data dan pusat klusternya. Algoritma K-Means Clustering beroperasi dengan mengkategorikan titik-titik data ke dalam kluster dengan menggunakan ukuran jarak matematis, biasanya euclidean, dari pusat kluster. Tujuannya adalah untuk meminimalkan jumlah jarak antara titik data dan kluster yang ditugaskan. Titik data yang paling dekat dengan centroid dikelompokkan bersama dalam kategori yang sama. Nilai k yang lebih tinggi, atau jumlah kluster, menandakan kluster yang lebih kecil dengan detail yang lebih besar, sedangkan nilai k yang lebih rendah menghasilkan kluster yang lebih besar dengan detail yang lebih sedikit.

-> Menginisialisasi nilai k (jumlah kluster) yang diinginkan Algoritma K-Means Clustering konvensional membutuhkan beberapa langkah. Langkah pertama adalah menginisialisasi k centroid di mana k sama dengan jumlah kluster yang dipilih untuk kumpulan data tertentu. Pendekatan ini menggunakan seleksi acak atau metode pengambilan sampel centroid awal.

-> Menentukan centroid Langkah selanjutnya mencakup proses berulang dua langkah berdasarkan algoritma machine learning maksimalisasi ekspektasi. Langkah ekspektasi menetapkan setiap titik data ke centroid terdekatnya berdasarkan jarak (sekali lagi, biasanya euclidean). Langkah maksimisasi menghitung rata-rata dari semua titik untuk setiap kluster dan menetapkan kembali pusat kluster, atau centroid. Proses ini berulang hingga posisi centroid mencapai konvergensi atau jumlah iterasi maksimum telah tercapai.

+ Penerapan K-Means Clustering Via RStudio

1.) Memanggil Library

Pada penerapan RStudio ini, kita akan menggunakan paket baru yaitu cluster untuk membangun model K-Means Clustering. Paket cluster adalah paket yang sangat berguna dalam R untuk membangun model K-Means Clustering dan melakukan analisis data. Kita juga akan menggunakan paket factoextra untuk visualisasi hasil clustering. Paket factoextra adalah paket yang sangat berguna dalam R untuk melakukan visualisasi hasil clustering.

2.) Memasukkan Data

Pada tahap ini, kita akan memuat dataset yang berisi informasi tentang penjualan. Dataset ini memiliki 103 observasi dan terdiri dari 10 variabel, meliputi User.ID, Age, Gender, Platform, Daily_Usage_Time..minutes., Posts_Per_Day, dan Likes_Received_Per_Day, Comments_Received_Per_Day, Messages_Sent_Per_Day dan Dominant_Emotion. Variabel yang akan diambil adalah Daily_Usage_Time..minutes., Posts_Per_Day, Likes_Received_Per_Day, Comments_Received_Per_Day, dan Messages_Sent_Per_Day karena merupakan data numerik yang akan digunakan untuk clustering.

Kita juga akan melakukan standarisasi data untuk menghindari pengaruh skala yang berbeda pada hasil clustering. Standarisasi dilakukan dengan cara mengurangi nilai rata-rata dan membagi dengan deviasi standar.

# Memuat dataset social media
data_sm <- read.csv("C:/Users/Lenovo/Downloads/socialmedia.csv")

# Menampilkan data social media
head(data_sm)
# Menampilkan struktur data social media
str(data_sm)
## 'data.frame':    103 obs. of  10 variables:
##  $ User_ID                   : int  500 488 776 869 573 428 528 773 382 505 ...
##  $ Age                       : chr  "27" "21" "28" "27" ...
##  $ Gender                    : chr  "Female" "Non-binary" "Non-binary" "Male" ...
##  $ Platform                  : chr  "Snapchat" "Snapchat" "Snapchat" "Telegram" ...
##  $ Daily_Usage_Time..minutes.: int  120 60 115 105 55 160 160 55 85 45 ...
##  $ Posts_Per_Day             : int  4 1 3 3 3 6 6 3 3 1 ...
##  $ Likes_Received_Per_Day    : int  40 18 38 48 17 85 85 17 33 10 ...
##  $ Comments_Received_Per_Day : int  18 7 18 20 7 26 26 7 20 5 ...
##  $ Messages_Sent_Per_Day     : int  22 12 27 28 12 30 30 12 18 12 ...
##  $ Dominant_Emotion          : chr  "Neutral" "Neutral" "Anxiety" "Anxiety" ...
# Mengambil data numerik
data_sm_num <- data_sm[5:9]

# Standarisasi data
data_sm_st <- scale(data_sm_num)

3.) Mencari Jumlah Kluster yang Optimal

Pada tahap ini, kita akan mencari jumlah kluster yang optimal untuk model K-Means Clustering. Kita akan menggunakan metode Elbow dan Silhouette untuk menentukan jumlah kluster yang optimal. Metode Elbow adalah metode yang digunakan untuk menentukan jumlah kluster yang optimal dengan cara mencari titik di mana penurunan SSE (Sum of Squared Errors) mulai melambat. Metode Silhouette adalah metode yang digunakan untuk menentukan jumlah kluster yang optimal dengan cara menghitung nilai Silhouette untuk setiap titik data.

fviz_nbclust(data_sm_st, kmeans, method = "wss") # Metode Elbow

Metode elbow menggunakan nilai total wss (whitin sum square) sebagai penentu k optimalnya. Dari gambar keluaran diatas, garis mengalami patahan yang membentuk elbow atau siku pada saat k = 3. Maka dengan menggunakan metode ini diperoleh k optimal pada saat berada di k = 3. Untuk menjadi pembanding, dilakukan uji yang lainnya.

fviz_nbclust(data_sm_st, kmeans, method = "silhouette") # Metode Silhouette

Pendekatan rata-rata nilai metode silhoutte untuk menduga kualitas dari klaster yang terbentuk. Semakin tinggi nilai rata-rata nya maka akan semakin baik. Berdasarkan hasil keluaran diatas dipeoleh banyak klaster optimal yang terbentuk pada k = 2. Sedangkan opsi keduanya pada k = 3. Karena nilai rata-rata *silhoutte8 pada k = 2 dan k = 3 merupakan yang tertinggi dari yang lain.

Satu-satunya cara untuk mendapatkan k optimal adalah dengan menggunakan metode gap statistic. Metode ini membandingkan total wss dari kluster yang terbentuk dengan total wss dari kluster yang terbentuk pada data acak. Jika nilai gap statistic lebih besar dari 0, maka jumlah kluster yang terbentuk lebih baik dari data acak.

Pada metode gap statistic ini kita mengambil maksimal 10 kluster dengan 100 iterasi. Kita juga bisa menggunakan metode ini untuk mendapatkan k optimal yang lebih baik dari yang lain.

set.seed(100)
gap_stat <- clusGap(data_sm_st, FUN = kmeans, nstart = 25,
                    K.max = 10, B = 103) # Metode gap statistic
fviz_gap_stat(gap_stat)

Diperoleh hasil output k = 2 adalah yang optimal untuk membentuk klaster. Sehingga jika dibandingkan dengan metode sebelumnya maka dapat ditarik keputusan nilai k yang optimal untuk membentuk klaster adalah 2.

4.) Mengeksekusi Model K-Means Clustering

Pada tahap ini, kita akan mengeksekusi model K-Means Clustering dengan jumlah kluster yang telah ditentukan sebelumnya. Kita akan menggunakan fungsi kmeans dari paket cluster untuk membangun model K-Means Clustering. Kita juga akan menggunakan fungsi fviz_cluster dari paket factoextra untuk memvisualisasikan hasil clustering.

# Membangun model K-Means Clustering
data_sm_final <- kmeans(data_sm_st, 2, nstart = 25)
print(data_sm_final)
## K-means clustering with 2 clusters of sizes 35, 68
## 
## Cluster means:
##   Daily_Usage_Time..minutes. Posts_Per_Day Likes_Received_Per_Day
## 1                  1.0802108     1.1010349              1.1028771
## 2                 -0.5559909    -0.5667091             -0.5676573
##   Comments_Received_Per_Day Messages_Sent_Per_Day
## 1                 1.1388412             1.0750305
## 2                -0.5861683            -0.5533245
## 
## Clustering vector:
##   [1] 1 2 1 1 2 1 1 2 2 2 1 2 1 1 2 2 2 2 1 1 2 2 2 2 2 2 2 1 2 2 2 2 1 1 1 1 2
##  [38] 2 2 2 2 2 2 2 2 2 1 2 1 2 1 1 2 2 1 1 1 1 2 2 1 2 2 2 2 1 1 2 2 2 1 2 2 2
##  [75] 2 2 2 1 2 1 2 2 2 2 2 1 2 1 1 2 1 2 2 2 1 2 2 2 2 2 1 2 2
## 
## Within cluster sum of squares by cluster:
## [1] 106.68987  82.67077
##  (between_SS / total_SS =  62.9 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
# Visualisasi hasil clustering
fviz_cluster(data_sm_final, data = data_sm_st)

Bisa kita lihat dari hasil keluaran diatas bahwa kluster yang terbentuk memiliki dua warna yang berbeda. Warna merah menunjukkan kluster 1 dan warna biru menunjukkan kluster 2. Kita juga bisa melihat bahwa kluster 2 memiliki lebih banyak titik data dibandingkan dengan kluster 1.

# Melihat Klaster yang terbentuk pada data asli
data_sm_cl <- data.frame(data_sm, data_sm_final$cluster)

# Melihat hasil kluster yang terbentuk
head(data_sm_cl)
# Melihat detail kluster yang terbentuk
data_cl_detail <- data_sm_num %>%
  mutate(Cluster = data_sm_final$cluster) %>%
  group_by(Cluster) %>%
  summarise_all("mean")
data_cl_detail

Berdasarkan hasil cluster yang terbentuk, pada kluster 1 memiliki rata-rata Memiliki rata-rata Daily Usage Time yang tinggi (125 menit). Lebih aktif dalam Posts Per Day (4.77), Likes Received Per Day (58.9), Comments Received Per Day (23), dan Messages Sent Per Day (28.3). Kluster ini dapat diidentifikasi sebagai pengguna sangat aktif di media sosial. Sedangkan pada kluster 2, Memiliki rata-rata Daily Usage Time yang lebih rendah (69.1 menit). Aktivitas lebih rendah dalam Posts Per Day (1.88), Likes Received Per Day (20.4), Comments Received Per Day (9.01), dan Messages Sent Per Day (16.3). Kluster ini dapat diidentifikasi sebagai pengguna kurang aktif di media sosial. Kesimpulannya, kluster 1 merepresentasikan pengguna yang lebih aktif dibandingkan kluster 2 dalam berbagai aktivitas di media sosial.

C.2 DBSCAN

Algoritma Density-based Spatial Clustering of Application with Noise (DBSCAN) merupakan metode clustering yang berbasis kepadatan (density-based) dari posisi amatan data dengan prinsip mengelompokkan data yang relatif berdekatan. DBSCAN sering diterapkan pada data yang banyak mengandung noise, hal ini dikarenakan DBSCAN tidak akan memasukkan data yang dianggap noise kedalam cluster manapun.

Klasifikasi

Noise dalam metode ini digunakan untuk mewakili daerah yang kurang padat yang digunakan untuk memisahkan antara cluster satu dengan cluster lainnya, pada objek dalam ruang data. Dalam menentukan cluster, DBSCAN menggunakan sebuah kumpulan maksimal dari kerapatan titik-titik terhubung dengan menggunakan parameter Eps dan MinPts. Parameter Eps digunakan untuk menentukan radius (jarak maksimal) titik-titik anggota cluster dari pusat cluster. Dan parameter MinPts digunakan untuk memberikan batasan jumlah titik-titik yang menjadi anggota cluster dalam radius Eps tersebut. Selain epsilon dan MinPts ada beberapa terminologi lain dalam metode DBSCAN yaitu :

  1. directly density-reachable : Observasi q berhubungan langsung dengan p, jika p adalah core point dan q merupakan tetangga dari p dalam jangkauan epsilon.

  2. density-reachable : Observasi q dan x dalam satu cluster namun x bukan tetangga dari q dalam jangkauan epsilon.

  3. core point : Core point merupakan observasi yang memiliki jumlah tetangga lebih dari sama dengan dari MinPts pada jangkauan Eps.

  4. border point : Border point memiliki tetangga lebih sedikit dari Minpts namun ia merupakan tetangga dari core point.

  5. outlier/noise point : Observasi yang bukan border points atau core points.

Klasifikasi

+ Cara Kerja DBSCAN

Dalam proses pembuatan cluster menggunakan DBSCAN sebuah data akan dikelompokkan dengan tetangganya. Sepasang amatan dikatakan bertetangga apabila jarak antara dua amatan tersebut kurang dari sama dengan nilai epsilon. Secara sederhana cara kerja DBSCAN adalah sebagai berikut :

  1. Tentukan nilai minPts dan epsilon (eps) yang akan digunakan.

  2. Pilih data awal “p” secara acak.

  3. Hitung jarak antara data “p” terhadap semua data menggunakan Euclidian distance.

  4. Ambil semua amatan yang density-reachable dengan amatan “p”.

  5. Jika amatan yang memenuhi nilai epsilon lebih dari jumlah minimal amatan dalam satu gerombol maka amatan “p” dikategorikan sebagai core points dan gerombol terbentuk.

  6. Jika amatan “p” adalah border points dan tidak ada amatan yang density-reachable dengan amatan “p”, maka lanjutkan pada amatan lainnya.

  7. Ulangi langkah 3 sampai 6 hingga semua amatan diproses.

+ Penerapan DBSCAN Via RStudio

1.) Memanggil Library

Pada penerapan RStudio ini, kita akan menggunakan paket baru yaitu dbscan untuk membangun model DBSCAN. Paket dbscan adalah paket yang sangat berguna dalam R untuk membangun model DBSCAN dan melakukan analisis data. Kita juga akan menggunakan paket factoextra untuk visualisasi hasil clustering. Paket factoextra adalah paket yang sangat berguna dalam R untuk melakukan visualisasi hasil clustering. dan paket baru yaitu fishualize untuk visualisasi hasil clustering.

2.) Memasukkan Data

Pada tahap ini, kita akan memuat dataset yang berisi informasi tentang penjualan. Dataset ini memiliki 200 observasi dan terdiri dari 5 variabel, meliputi CustomerID, Gender, Age, Annual.Income..k.. dan Spending.Score..1.100.. Variabel yang akan diambil adalah Annual.Income..k.. dan Spending.Score..1.100. karena merupakan data numerik yang akan digunakan untuk clustering.

# Memuat dataset mall customers
data_mc <- read.csv("C:/Users/Lenovo/Downloads/mall_customers.csv")

# Menampilkan data mall customers
head(data_mc)
# Menampilkan struktur data mall customers
dim(data_mc)
## [1] 200   5
# Mengambil data numerik
data_mc_num <- data_mc[4:5]

3.) Mengeksplorasi Data

Pada tahap ini, kita akan mengeksplorasi data untuk melihat distribusi data dan hubungan antar variabel. Kita akan menggunakan fungsi ggplot dari paket ggplot2 untuk memvisualisasikan data. Kita juga akan menggunakan fungsi kNNdistplot dari paket dbscan untuk melihat jarak antar titik data.

# Melihat plot distribusi data
ggplot(data = data_mc_num, aes(x = Annual.Income..k.., y = Spending.Score..1.100.)) +
  geom_point(col = "firebrick4") +
  theme_pander()

4.) Clustering

Pada tahap ini, kita akan melakukan clustering menggunakan algoritma DBSCAN. Kita akan menggunakan fungsi dbscan dari paket dbscan untuk membangun model DBSCAN. Kita juga akan menggunakan fungsi kNNdistplot dari paket dbscan untuk melihat jarak antar titik data. Ide utama dari fungsi ini adalah menghitung jarak rata-rata untuk setiap data ke k tetangga terdekatnya (nearest neighbors). Nilai dari K ditentukan oleh user yang nantinya akan digunakan sebagai minPts pada proses clustering. Rata rata jarak yang sudah didapat divisualisasikan dalam plot secara ascending untuk mendapatkan “knee” yang menunjukkan nilai optimal dari eps berdasarkan K yang ditentukan.

kNNdistplot(data_mc_num, k = 3) # Plot jarak kNN

Berdasarkan plot diatas dengan menggunakan K = 3 didapat jarak yang optimal yaitu sekitar 9. Nilai 9 didapat dari posisi “knee” yang terbentuk pada plot. Hasil pencarian nilai eps yang optimal diatas dapat digunakan dalam proses clustering yang mana nilai eps adalah 9 dengan minPts 3. Tahap selanjutnya adalah pembuatan cluster menggunakan function dbscan dengan parameter yang sudah didapat.

# Membangun model DBSCAN
db_clust <- dbscan(data_mc_num, eps = 9, minPts = 3)
db_clust
## DBSCAN clustering for 200 objects.
## Parameters: eps = 9, minPts = 3
## Using euclidean distances and borderpoints = TRUE
## The clustering contains 7 cluster(s) and 11 noise points.
## 
##  0  1  2  3  4  5  6  7 
## 11  7 18 12  3 89 32 28 
## 
## Available fields: cluster, eps, minPts, metric, borderPoints

Hasil clustering dari data multishape dengan 200 observasi adalah 7 cluster dan sebanyak 11 data diidentifikasi sebagai noise. Cluster 5 merupakan cluster dengan anggota cluster terbanyak sedangkan cluster 4 merupakan cluster dengan anggota cluster paling sedikit. Hasil cluster yang sudah dibentuk dapat dilakukan visualisasi agar terlihat pola dari cluster yang didapat.

# Visualisasi hasil clustering
data_mc_num <- data_mc_num %>% 
  mutate(clust = db_clust$cluster, 
         clust = ifelse(clust==0,"Noise",clust)) 

ggplot(data = data_mc_num, aes(x = Annual.Income..k.., y = Spending.Score..1.100.)) +
  geom_point(aes(col = as.factor(clust))) +
  theme_pander() +
  labs(col = "Cluster")

Dari hasil visualisasi diatas bisa dilihat bahwa cluster yang dihasilkan dbscan dapat mengelompokkan data sehingga bisa menangkap beberapa bentuk dari data. Noise yang terdeteksi pada data terlihat menyebar, hal ini dikarenakan data noise tidak berhasil ditangkap oleh eps yang ditentukan.

C.3 Agglomerative Clustering (Hierarchical Clustering)

Agglomerative Clustering atau bottom-up clustering pada dasarnya dimulai dari individual cluster (setiap titik data dianggap sebagai klaster individu, disebut leaf/daun), kemudian dihitung jarak/distance setiap klaster dengan klaster lainnya. Dua klaster dengan jarak terpendek akan bergabung membentuk apa yang kita sebut node/simpul.

Klaster yang baru terbentuk sekali lagi dihitung jaraknya dengan klaster lain di luar klaster mereka. Proses ini diulang hingga semua titik data dimasukkan ke satu klaster yang disebut root/akar. Hasilnya adalah representasi objek berbasis pohon yang disebut dendrogram.

Dendrogram sejatinya merupakan struktur yang menggambarkan kemiripan antar data. Tiap data pada awalnya diletakan di suatu level dasar dimana tiap data berdiri sendiri sebagai satu cluster tunggal.

Klasifikasi

+ Teknik Agglomerative Clustering

Dalam Agglomerative Method, teknik pengelompokan yang digunakan adalah sebagai berikut:

  1. Complete Linkage / Maximum Linkage Pengukuran (dis)similarity atau jarak antar cluster dilakukan dengan mengukur terlebih dahulu jarak antar tiap observasi dari cluster yang berbeda (pairwise distances). Jarak paling tinggi (maximum distance) akan menjadi ukuran (dis)similarity antar cluster. Kemudian, dendrogram akan terbentuk dari cluster-cluster yang memiliki (dis)similarity paling kecil. Hal ini membuat dendrogram yang terbentuk menjadi lebih terpisah antar clusternya (terbentuk cluster yang “compact”).

  2. Single Linkage / Minimum Linkage Pengukuran (dis)similarity atau jarak antar cluster dilakukan dengan mengukur terlebih dahulu jarak antar tiap observasi dari cluster yang berbeda pairwise distances. Jarak paling kecil (minimum distance) akan menjadi ukuran (dis)similarity antar cluster. Dendrogram akan terbentuk dari cluster-cluster yang memiliki (dis)similarity paling kecil. Hal ini membuat dendrogram yang terbentuk menjadi lebih “loose” atau berdekatan antar clusternya.

  3. Average Linkage Pengukuran (dis)similarity atau jarak antar cluster dilakukan dengan mengukur terlebih dahulu jarak antar tiap observasi dari cluster yang berbeda pairwise distances. Kemudian, dihitung rata-rata jarak dari pairwise distance tersebut dan nilai tersebut akan menjadi ukuran (dis)similarity antar cluster. Dendrogram akan terbentuk dari cluster-cluster yang memiliki (dis)similarity paling kecil. Umumnya metode ini akan menghasilkan cluster yang tidak terlalu “loose” maupun “compact”.

  4. Centroid Linkage Perhitungan (dis)similarity atau jarak antar cluster dilakukan dengan mengukur jarak antar centroid pada dua cluster. Perhitungan centroid disini menggunakan rata-rata pada suatu variabel x. Dendrogram yang terbentuk akan berdasarkan cluster dengan jarak antar centroid paling kecil.

  5. Ward’s minimum Variance Pada metode ini, di tiap iterasinya akan dibentuk cluster-cluster yang kemudian dihitung nilai within sum of square tiap cluster (WSS). WSS dapat diartikan sebagai jumlah dari jarak tiap observasi ke nilai tengah cluster. Cluster-cluster yang menghasilkan within sum of square terkecil akan diambil kemudian digabungkan hingga membentuk satu dendrogram utuh.

Klasifikasi

Linkage method akan menentukan rupa dari dendrogram yang terbentuk.

+ Penerapan Agglomerative Clustering Via RStudio

1.) Memanggil Library

Pada penerapan RStudio ini, kita akan menggunakan paket baru yaitu cluster untuk membangun model Agglomerative Clustering. Paket cluster adalah paket yang sangat berguna dalam R untuk membangun model Agglomerative Clustering dan melakukan analisis data. Kita juga akan menggunakan paket factoextra untuk visualisasi hasil clustering. Paket factoextra adalah paket yang sangat berguna dalam R untuk melakukan visualisasi hasil clustering. Kita juga akan menggunakan paket clValid untuk melakukan validasi hasil clustering. Paket clValid adalah paket yang sangat berguna dalam R untuk melakukan validasi hasil clustering.

2.) Menginput Data

Kita akan menggunakan dataset USArrests yang sudah ada di R. Dataset ini berisi informasi tentang tingkat kejahatan di 50 negara bagian di Amerika Serikat pada tahun 1973. Dataset ini memiliki 4 variabel yaitu Murder, Assault, UrbanPop, dan Rape. Kita akan menggunakan semua variabel yang ada pada dataset ini untuk melakukan clustering.

# Melihat dataset
head(USArrests)

3.) Preparasi Data

Selanjutnya, kita ingin melakukan analisis clustering pada dataset USArrests. Sebelum melakukan analisis clustering, kita perlu melakukan beberapa langkah persiapan data. Pertama, kita perlu memeriksa apakah ada nilai yang hilang (missing values) pada dataset. Jika ada, kita perlu menghapus atau mengganti nilai yang hilang tersebut. Kedua, kita perlu melakukan standarisasi data agar semua variabel memiliki skala yang sama. Hal ini penting karena algoritma clustering sensitif terhadap skala variabel.

# Memeriksa missing values
anyNA(USArrests)
## [1] FALSE
# Mengecek skala tiap variabel data
summary(USArrests)
##      Murder          Assault         UrbanPop          Rape      
##  Min.   : 0.800   Min.   : 45.0   Min.   :32.00   Min.   : 7.30  
##  1st Qu.: 4.075   1st Qu.:109.0   1st Qu.:54.50   1st Qu.:15.07  
##  Median : 7.250   Median :159.0   Median :66.00   Median :20.10  
##  Mean   : 7.788   Mean   :170.8   Mean   :65.54   Mean   :21.23  
##  3rd Qu.:11.250   3rd Qu.:249.0   3rd Qu.:77.75   3rd Qu.:26.18  
##  Max.   :17.400   Max.   :337.0   Max.   :91.00   Max.   :46.00
# z-score standardization
US_Z <- scale(USArrests)
head(US_Z)
##                Murder   Assault   UrbanPop         Rape
## Alabama    1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska     0.50786248 1.1068225 -1.2117642  2.484202941
## Arizona    0.07163341 1.4788032  0.9989801  1.042878388
## Arkansas   0.23234938 0.2308680 -1.0735927 -0.184916602
## California 0.27826823 1.2628144  1.7589234  2.067820292
## Colorado   0.02571456 0.3988593  0.8608085  1.864967207

4.) Mengukur (Dis)similarity Data

Setelah membersihkan dan menyiapkan data, selanjutnya kita dapat melakukan perhitungan (dis)similarity data. Metode yang akan digunakan pada kasus ini yaitu euclidean distance, karena kita akan menjadikan besaran nilai pada tiap variable data sebagai karakteristik yang membedakan tiap observasinya (negara bagian).

# Menghitung jarak antar observasi
US_dist <- dist(x = US_Z, method = "euclidean")

Fungsi dist digunakan untuk menghitung jarak antar observasi pada dataset. Parameter method digunakan untuk menentukan metode yang digunakan dalam perhitungan jarak. Pada contoh ini, kita menggunakan metode euclidean untuk menghitung jarak antar observasi.

5.) Membangun Model Agglomerative Clustering

Setelah menghitung jarak antar observasi, kita dapat membangun model Agglomerative Clustering. Kita akan menggunakan fungsi hclust dari paket cluster untuk membangun model Agglomerative Clustering. Kita juga akan menggunakan fungsi fviz_dend dari paket factoextra untuk memvisualisasikan hasil clustering.

Kita akan memodel dengan menggunakan beberapa metode linkage yaitu complete, single, average, centroid, dan ward. Kita juga akan memvisualisasikan hasil clustering dengan menggunakan dendrogram.

# Membangun model Agglomerative Clustering
hclust_complete <- hclust(US_dist, method = 'complete')
hclust_single <- hclust(US_dist, method = 'single')
hclust_avg <- hclust(US_dist, method = 'average')
set.seed(123)
hclust_centroid <- hclust(US_dist, method = 'centroid')
hclust_ward <- hclust(US_dist, method = 'ward.D2')
# Visualisasi hasil clustering
fviz_dend(hclust_complete, cex = 0.5,
          main = "Cluster Dendrogram Complete  Linkage")
## Warning: The `<scale>` argument of `guides()` cannot be `FALSE`. Use "none" instead as
## of ggplot2 3.3.4.
## ℹ The deprecated feature was likely used in the factoextra package.
##   Please report the issue at <https://github.com/kassambara/factoextra/issues>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Pada dendrogram tersebut, setiap observasi yang memiliki kemiripan akan dihubungkan oleh sebuah garis dan bersatu pada suatu titik. Panjang garis tersebut disebut juga cophenetic distance dan berbeda-beda untuk tiap observasi. Panjang garis tersebut merupakan “Height” (y-axis) yang menggambarkan (dis)similarity/jarak antar kedua observasi.

Hasil yang terbentuk dari dendrogram complete linkage menunjukkan dendrogram yang cukup compact, dimana setiap cluster terlihat memiliki partisi yang cukup jelas. Hal ini akan mempermudah saat pemotongan dendrogram untuk membentuk banyak cluster.

fviz_dend(hclust_single, cex = 0.5,
          main = "Cluster Dendrogram Single  Linkage")

Hasil dendrogram yang terbentuk pada model single linkage terlihat lebih lebar dimana antar anggota cluster yang berbeda pun terlihat memiliki Height / (dis)similarity yang rendah. Cluster yang terbut terlihat rapat dan sangat dekat sehingga partisi dari tiap cluster tidak tervisualisasikan dengan maksimal. Hal ini dikarenakan proses pembuatan hirarki dendrogram menggunakan minimum (dis)similarity pada setiap clusternya.

fviz_dend(hclust_avg, cex = 0.5,
          main = "Cluster Dendrogram Average Linkage")

Hasil dendrogram yang terbentuk pada model average linkage terlihat hampir mirip seperti complete linkage, yaitu terlihat compact. Model average linkage biasa digunakan karena menghasilkan nilai validasi cluster tree yang lebih baik dibandingkan metode linkage yang lain.

fviz_dend(hclust_centroid, cex = 0.5,
          main = "Cluster Dendrogram Centroid  Linkage")

Dendrogram yang terbentuk sangat berbeda dengan dedrogram pada model sebelumnya. Terdapat ketidak teraturan distance pada dendrogram di beberapa cabang, dimana nilai distance antar cluster yang lebih rendah dibandingkan nilai distance antar observasinya. Kondisi ini disebut juga inversion.

Hal ini dikarenakan pada centroid linkage terdapat pembentukan centroid atau pusat cluster yang “memusatkan” seluruh jarak observasi pada cluster. Sehingga ketika dihitung nilai (dis)similarity antar cluster, dapat dihasilkan nilai (dis)similarity yang lebih rendah dibandingkan (dis)similarity antar observasinya. Dalam kata lain, similarity dapat meningkat selama proses clustering.

fviz_dend(hclust_ward, cex = 0.5,
          main = "Cluster Dendrogram Ward's Minimum Variance  Linkage")

Dendrogram yang diperoleh dari metode ward’s minimum variance terlihat terpartisi dengan sangat baik. Pada tiap cluster, terlihat nilai height yang rendah atau similarity yang amat tinggi antar observasinya. Hal ini dikarenakan cara kerja metode ward’s minimum variance yang meminimumkan nilai within sum of squared (wss) tiap cluster. Umumnya, dendrogram metode ini menghasilkan partisi yang baik dan dikatkan yang paling menyerupai hasil k-means clustering (salah satu metode partitional clustering).

Dari kelima dendrogram yang sudah dibuat, kita dapat memilih salah satu yang ingin digunakan. Pemilihannya dapat berdasarkan hasil validasi cluster tree menggunakan korelasi cophenetic distance dengan jarak original masing-masing observasi. Semakin tinggi nilai korelasi yang dihasilkan, maka semakin baik hasil clustering yang terbentuk.

# Menghitung cophenetic distance
complete_coph <- cophenetic(hclust_complete)
single_coph <- cophenetic(hclust_single)
avg_coph <- cophenetic(hclust_avg)
centroid_coph <- cophenetic(hclust_centroid)
ward_coph <- cophenetic(hclust_ward)

# Melihat hasil cophenetic distance
data.frame(complete = cor(complete_coph, US_dist),
           single = cor(single_coph, US_dist),
           average = cor(avg_coph, US_dist),
           centroid = cor(centroid_coph, US_dist),
           ward = cor(ward_coph, US_dist)) %>% 
  tidyr::pivot_longer(cols = colnames(.),names_to = "method", values_to = "correlation")
# Terbaik : Complete

Dapat terlihat bahwa nilai korelasi yang dihasilkan average linkage paling tinggi dibanding metode lainnya, disusul oleh complete linkage, dan ward linkage. Mempertimbangkan pula dendrogram yang dihasilkan, dendrogram dari average linkage menghasilkan cluster outlier yang hanya berisi negara bagian Alaska, dan ditakutkan membuat hasil clustering tidak optimal. Oleh karena itu, akan dipilih metode complete linkage dengan pertimbangan hasil correlation yang tinggi dan menghasilkan dendrogram yang cukup mudah diinterpretasikan.

6.) Validasi Hasil Clustering

Dalam hierarchical clustering, menentukan banyaknya cluster optimal yang harus dibentuk terbilang cukup sulit. Secara umum, untuk menentukan cluster yang baik terdapat dua pengukuran yang sering dilakukan yaitu internal dan stability measures. Internal measures mengukur seberapa baik cluster yang terbentuk dengan cara membandingkan jarak antar observasi dalam cluster dengan jarak antar cluster. Sedangkan stability measures mengukur seberapa stabil cluster yang terbentuk dengan cara membandingkan hasil clustering dengan hasil clustering sebelumnya.

# Internal Measures
internal <- clValid(US_Z, nClust = 3:5, 
                    clMethods = "agnes", 
                    validation = "internal", 
                    metric = "euclidean",
                    method = "complete")
summary(internal)
## 
## Clustering Methods:
##  agnes 
## 
## Cluster sizes:
##  3 4 5 
## 
## Validation Measures:
##                           3       4       5
##                                            
## agnes Connectivity  11.8730 24.7817 25.1067
##       Dunn           0.2648  0.1622  0.1709
##       Silhouette     0.3692  0.3160  0.3174
## 
## Optimal Scores:
## 
##              Score   Method Clusters
## Connectivity 11.8730 agnes  3       
## Dunn          0.2648 agnes  3       
## Silhouette    0.3692 agnes  3

Internal measures merupakan pengukuran untuk melakukan cluster validation berdasarkan informasi internal yang terdapat pada data. Metode yang biasa digunakan pada internal measure yaitu connectivity, dunn index, dan silhouette. Nilai connectivity berkisar antara 0-inf, dimana cluster yang baik memiliki connectivity yang kecil. Sementara itu, nilai silhouette dan dunn index diharapkan tinggi untuk mengatakan bahwa clustering semakin baik.

# Stabilitas measures
stability <- clValid(US_Z, nClust = 3:4, 
                     clMethods = "agnes", 
                     validation = "stability", 
                     metric = "euclidean",
                     method = "complete")

# Hanya menampilkan skor optimal
optimalScores(stability)

Stability measures merupakan pengukuran validation cluster yang lebih mendalam dibandingkan internal measures. Stability mengukur tingkat konsistensi dari hasil cluster yang terbentuk apabila terdapat satu variabel yang dihilangkan dalam satu waktu. Pengukuran yang dilakukan pada stability yaitu:

  1. Average proportion of non-overlap (APN): mengukur proporsi “rata-rata jumlah observasi pada cluster yang sama” antara dendrogram yang dibuat menggunakan data yang lengkap dan data yang sudah dihilangkan satu variabelnya.

  2. Average distance (AD): jarak rata-rata antar observasi dalam cluster yang sama, pada pembuatan cluster dengan data yang lengkap dan data yang sudah dihilangkan satu variabelnya.

  3. Average distance between means (ADM): jarak rata-rata antar pusat cluster pada pembuatan cluster dengan data yang lengkap dan data yang sudah dihilangkan satu variabelnya.

  4. Figure of merit (FOM): rata-rata variansi intra-cluster pada variabel yang dihapus, dimana clustering dilakukan menggunakan sisa kolom yang tidak terhapus.

Nilai dari APN, ADM, dan FOM measure stability diatas memiliki range 0-1, di mana semakin kecil nilainya, maka akan semakin konsisten hasil clustering yang terbentuk. Sedangkan nilai AD berkisar pada range 0-inf, semakin kecil nilainya juga semakin baik hasil clusternya.

Berdasarkan hasil validasi cluster, internal measures menghasilkan jumlah cluster terbaik di angka 3, sementara stability measures menghasilkan angka 4. Penggunaan cluster sebanyak 3 atau 4 bisa dijadikan opsi untuk melakukan partisi data. Nilai yang lebih baik dapat ditentukan berdasarkan kemudahan pengguna untuk melakukan interpretasi (misalnya profiling/analisis karakteristik) untuk tiap clusternya.

7.) Kesimpulan Agglomerative

Kita telah melakukan tahap demi tahap pembuatan hierarchical clustering dari pembacaan data hingga pembentukan dendrogram, berikut pemotongan dendrogramnya untuk clustering data. Berikut adalah tampilan dendrogram terpilih menggunakan pemotongan 4 cluster dan beberapa insight yang dapat diambil.

# Memotong dendrogram menjadi 4 cluster
fviz_dend(hclust_complete, k = 4, k_colors = "jco", rect = T, 
          main = "Complete Linkage Cluster")

D. Kesimpulan

Klasifikasi dan clustering adalah dua pendekatan utama dalam analisis data yang memiliki perbedaan mendasar dalam tujuan dan metode. Klasifikasi bertujuan untuk memprediksi label atau kategori data berdasarkan model yang dilatih menggunakan data berlabel (supervised learning). Beberapa algoritma yang digunakan dalam klasifikasi meliputi Support Vector Machines (SVM), K-Nearest Neighbors (KNN), Decision Tree, dan Random Forest. Algoritma-algoritma ini memiliki keunggulan masing-masing dalam menangani berbagai jenis data dan masalah klasifikasi.

Di sisi lain, clustering adalah metode untuk mengelompokkan data tanpa label berdasarkan kesamaan atau pola tertentu (unsupervised learning). Algoritma seperti K-Means, DBSCAN, dan Agglomerative Clustering digunakan untuk menemukan struktur atau kelompok dalam data. Setiap algoritma memiliki pendekatan unik, seperti berbasis jarak, kepadatan, atau hierarki, yang dapat disesuaikan dengan karakteristik data.

Melalui penerapan algoritma-algoritma ini, kita dapat memahami pola, struktur, dan hubungan dalam data, baik untuk tujuan prediksi maupun eksplorasi. Pemilihan algoritma yang tepat bergantung pada jenis data, tujuan analisis, dan kebutuhan spesifik dari masalah yang dihadapi. Dengan demikian, klasifikasi dan clustering menjadi alat yang sangat penting dalam analisis data dan machine learning.