Dosen Pengampun : Edy Saputra Rusdi, S.Si., M.Si.
Program Studi Ilmu Aktuaria
Fakultas Matematika dan Ilmu Pengetahuan Alam
Universitas Hasanuddin
2025
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
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.
Dalam mengklasifikasikan suatu dataset, melibatkan beberapa langkah sebagai berikut :
Pengumpulan Data (Gathering Data) : Mengumpulkan data yang digunakan untuk analisis.
Pembersihan Data (Cleaning Data) : Menghapus data yang tidak digunakan atau tidak akurat.
Pembagian Data (Split Data) : Memisahkan data menjadi data pelatihan (train data) dan data pengujian (test data).
Pelatihan Model (Train Model) : Menggunakan algoritma klasifikasi untuk melatih model dalam data pelatihan.
Evaluasi Model (Model Evaluation) : Menguji model dengan data pengujian untuk menilai akurasi.
Prediksi (Prediction) : Menggunakan model untuk mengklasifikasikan data baru.
Beberapa contoh penerapan klasifikasi, ialah sebagai berikut :
Deteksi Spam (Spam Detection) : Menggunakan klasifikasi untuk menentukan apakah sebuah email adalah spam atau tidak
Pengenalan Wajah (Recognition Face) : Mengidentifikasi jenis penyakit berdasarkan gejala yang ada
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.
Dalam melakukan clustering, juga melibatkan beberapa langkah sebagai berikut
Pengumpulan Data (Gathering Data) : Mengumpulkan data yang akan dianalisis.
Pembersihan Data (Cleaning Data) : Menghilangkan data yang tidak digunakan atau tidak akurat.
Pemilihan Algoritma (Algorithm) : Memilih algoritma clustering yang sesuai (misalnya, K-means, Hierarchical Clustering, dll).
Penentuan Jumlah Cluster (Dteremining the Number of Clusters) : Menentukan jumlah cluster yang diinginkan (jika diperlukan).
Penerapan Algoritma (Algorithm Applications) : Mengaplikasikan algoritma pada dataset untuk mengelompokkan data.
Analisis Cluster (Cluster Analyst) : Menganalisis hasil clustering untuk memahami pola yang ada.
Beberapa contoh penerapan clustering, ialah sebagai berikut :
Segmentasi Pelanggan (Customer Segmentation) : Mengelompokkan pelanggan berdasarkan perilaku pembelian untuk startegi pemasaran yang lebih efektif.
Analisis Gambar (Picture Analyst) : Mengelompokkan piksel dalam citra untuk mengidentifikasi objek.
Dalam Bidang Biologi (Biologist) : Mengelompokkan spesies berdasarkan genetik atau karakteristik lainnya.
=> Klasifikasi : Tujuannya adalah mengklasifikasikan data ke dalam kategori yang telah ditentukan.
=> Clustering : Tujuannya adalah menemukan struktur atau pola dalam data yang tak berlabel.
=> Klasifikasi : Termasuk dalam supervised learning karena memerlukan data pelatihan yang sudah diberi label.
=> Clustering : Termasuk dalam unsupervised learning karena tidak memerlukan label pada data
=> 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.
=> Klasifikasi : Hasilnya berupa label atau kategori untuk setiap data baru yang dianalisis.
=> Clustering : Hasilnya berupa kelompok atau cluster dari data yang memiliki kesamaan.
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.
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.
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.
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
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.
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.
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
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()
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.
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.
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.
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.
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")
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
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.
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.
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.
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.
Menghitung Jarak: Algoritma menghitung jarak antara titik data yang akan diprediksi dengan semua titik data dalam set pelatihan.
Menentukan Tetangga Terdekat: Algoritma memilih k tetangga terdekat berdasarkan jarak yang dihitung sebelumnya.
Menentukan Kelas Prediksi: kelas mayoritas dari tetangga terdekat digunakan sebagai prediksi untuk titik data yang dipertanyakan.
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.
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.
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
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
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
##
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
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.
Decision Tree dibentuk dari 3 tipe dari simpul (node) yaitu:
Simpul leaf (leaf node): Simpul yang tidak memiliki cabang lagi, yang menunjukkan hasil akhir dari proses klasifikasi atau regresi.
Simpul root (root node): Simpul pertama dari pohon keputusan yang berfungsi sebagai titik awal untuk membagi data ke dalam cabang-cabang.
Setiap simpul perantara berhubungan dengan simpul root dan leaf, yang menunjukkan keputusan yang diambil berdasarkan fitur tertentu.
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.
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.
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…
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
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.
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
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.
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.
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.
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.
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)
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, ]
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.
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.
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
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.
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.
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.
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.
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)
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.
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.
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.
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 :
directly density-reachable : Observasi q berhubungan
langsung dengan p, jika p adalah core point dan q merupakan tetangga
dari p dalam jangkauan epsilon.
density-reachable : Observasi q dan x dalam satu
cluster namun x bukan tetangga dari q dalam jangkauan epsilon.
core point : Core point merupakan observasi yang
memiliki jumlah tetangga lebih dari sama dengan dari MinPts pada
jangkauan Eps.
border point : Border point memiliki tetangga lebih
sedikit dari Minpts namun ia merupakan tetangga dari core
point.
outlier/noise point : Observasi yang bukan border
points atau core points.
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 :
Tentukan nilai minPts dan epsilon (eps) yang akan digunakan.
Pilih data awal “p” secara acak.
Hitung jarak antara data “p” terhadap semua data menggunakan Euclidian distance.
Ambil semua amatan yang density-reachable dengan amatan “p”.
Jika amatan yang memenuhi nilai epsilon lebih dari jumlah minimal amatan dalam satu gerombol maka amatan “p” dikategorikan sebagai core points dan gerombol terbentuk.
Jika amatan “p” adalah border points dan tidak ada amatan yang density-reachable dengan amatan “p”, maka lanjutkan pada amatan lainnya.
Ulangi langkah 3 sampai 6 hingga semua amatan diproses.
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.
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]
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()
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.
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.
Dalam Agglomerative Method, teknik pengelompokan yang digunakan adalah sebagai berikut:
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”).
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.
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”.
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.
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.
Linkage method akan menentukan rupa dari dendrogram yang terbentuk.
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.
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)
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
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.
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.
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:
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.
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.
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.
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.
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")
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.