Team Based Project Pengantar Data Mining

KLASTERISASI DENGAN K-MEDOIDS DAN GAUSSIAN MIXTURE MODEL(GMM)

GAUSSIAN MIXTURE MODEL(GMM)

1. Library

library(readxl)
library(knitr)
library(dplyr)
library(ggplot2)
library(mclust)
library(psych)
library(FactoMineR)
library(cluster)
library(clusterSim)
library(factoextra)

2. Import data

data = read_excel("E:/MATERI UNS/SEMESTER 5/PENGANTAR DATA MINING/DATA PDM TBP.xlsx")
kable(head(data))
PROVINSI Tingkat Pengangguran Terbuka 2024 Pengeluaran per Kapita (ribu rupiah) 2024 Indeks Kedalaman Kemiskinan (P1) 2024 Indeks Keparahan Kemiskinan (P2) 2024
ACEH 5.75 10811 2.285 0.590
SUMATERA UTARA 5.60 11460 1.155 0.275
SUMATERA BARAT 5.75 11718 0.735 0.150
RIAU 3.70 11857 0.920 0.220
JAMBI 4.48 11621 1.185 0.335
SUMATERA SELATAN 3.86 12015 1.670 0.390

3. Preprocessing Data

3.1 Cek tipe data

str(data)
## tibble [38 × 5] (S3: tbl_df/tbl/data.frame)
##  $ PROVINSI                                 : chr [1:38] "ACEH" "SUMATERA UTARA" "SUMATERA BARAT" "RIAU" ...
##  $ Tingkat Pengangguran Terbuka 2024        : num [1:38] 5.75 5.6 5.75 3.7 4.48 3.86 3.11 4.19 4.63 6.39 ...
##  $ Pengeluaran per Kapita (ribu rupiah) 2024: num [1:38] 10811 11460 11718 11857 11621 ...
##  $ Indeks Kedalaman Kemiskinan (P1) 2024    : num [1:38] 2.285 1.155 0.735 0.92 1.185 ...
##  $ Indeks Keparahan Kemiskinan (P2) 2024    : num [1:38] 0.59 0.275 0.15 0.22 0.335 0.39 0.43 0.365 0.18 0.145 ...

3.2 Cek missing value

colSums(is.na(data))
##                                  PROVINSI 
##                                         0 
##         Tingkat Pengangguran Terbuka 2024 
##                                         0 
## Pengeluaran per Kapita (ribu rupiah) 2024 
##                                         0 
##     Indeks Kedalaman Kemiskinan (P1) 2024 
##                                         0 
##     Indeks Keparahan Kemiskinan (P2) 2024 
##                                         0

Terlihat bahwa tidak terdapat nilai yang hilang.

3.3 Cek duplikat

sum(duplicated(data))
## [1] 0

Terlihat bahwa tidak terdapat duplikasi data.

3.4 Deteksi outlier

data_num = data %>% select_if(is.numeric)

kable(head(data_num))
Tingkat Pengangguran Terbuka 2024 Pengeluaran per Kapita (ribu rupiah) 2024 Indeks Kedalaman Kemiskinan (P1) 2024 Indeks Keparahan Kemiskinan (P2) 2024
5.75 10811 2.285 0.590
5.60 11460 1.155 0.275
5.75 11718 0.735 0.150
3.70 11857 0.920 0.220
4.48 11621 1.185 0.335
3.86 12015 1.670 0.390
boxplot(data_num$`Tingkat Pengangguran Terbuka 2024`, main = "Deteksi Outlier Tingkat Pengangguran")

boxplot(data_num$`Pengeluaran per Kapita (ribu rupiah) 2024`, main = "Deteksi Outlier Pengeluaran per Kapita")

boxplot(data_num$`Indeks Kedalaman Kemiskinan (P1) 2024`, main = "Deteksi Outlier P1")

boxplot(data_num$`Indeks Keparahan Kemiskinan (P2) 2024`, main = "Deteksi Outlier P2")

Karena masih terdapat outlier maka dilakukan standardisasi dengan Robust Scaler agar tidak perlu menghilangkan outlier, karena outlier dalam data masih dianggap penting dan tidak bisa dihapus

4. Standardisasi Robuts Scaler

Standarisasi data dilakukan menggunakan Robust Scaler berbasis median dan interquartile range (IQR) untuk mengurangi pengaruh outlier tanpa menghilangkan observasi ekstrem (outlier) dari analisis.

data_scaled <- apply(data_num, 2, function(data_num){
  (data_num - median(data_num)) / IQR(data_num)
})
data_scaled <- as.data.frame(data_scaled)
kable(head(data_scaled))
Tingkat Pengangguran Terbuka 2024 Pengeluaran per Kapita (ribu rupiah) 2024 Indeks Kedalaman Kemiskinan (P1) 2024 Indeks Keparahan Kemiskinan (P2) 2024
0.6252505 -0.3895631 0.5165919 0.5968254
0.5651303 -0.0745146 -0.2941704 -0.2031746
0.6252505 0.0507282 -0.5955157 -0.5206349
-0.1963928 0.1182039 -0.4627803 -0.3428571
0.1162325 0.0036408 -0.2726457 -0.0507937
-0.1322645 0.1949029 0.0753363 0.0888889

5. Klasterisasi dengan GMM

5.1 Menentukan Jumlah Klaster optimal berdasarkan nilai BIC

set.seed(123)

gmm <- Mclust(data_scaled) # otomatis mencoba beberapa jumlah klaster

summary(gmm)
## ---------------------------------------------------- 
## Gaussian finite mixture model fitted by EM algorithm 
## ---------------------------------------------------- 
## 
## Mclust EEV (ellipsoidal, equal volume and shape) model with 2 components: 
## 
##  log-likelihood  n df       BIC       ICL
##       -61.74058 38 25 -214.4208 -214.4451
## 
## Clustering table:
##  1  2 
##  6 32
plot(gmm, what = "BIC")

Interpretasi:

Berdasarkan grafik Bayesian Information Criterion (BIC), dilakukan evaluasi terhadap berbagai kombinasi jumlah klaster dan tipe model kovarians pada Gaussian Mixture Model (GMM). Nilai BIC digunakan sebagai kriteria pemilihan model terbaik, di mana nilai yang mendekati nol menunjukkan keseimbangan yang lebih baik antara kecocokan model terhadap data dan kompleksitas model.

Hasil analisis menunjukkan bahwa nilai BIC mendekati nol secara keseluruhan diperoleh pada jumlah klaster sebanyak dua klaster, khususnya pada model EEV. Hal ini mengindikasikan bahwa model dengan dua klaster memberikan representasi struktur data yang paling optimal dibandingkan dengan model lain yang diuji. Penambahan jumlah klaster lebih dari dua tidak menghasilkan peningkatan nilai BIC yang lebih rendah, sehingga tidak memberikan perbaikan model yang signifikan.

Dengan demikian, dapat disimpulkan bahwa jumlah klaster optimal yang dipilih adalah dua klaster, dengan asumsi bahwa setiap klaster memiliki volume, bentuk, dan orientasi kovarians yang sama, sesuai dengan karakteristik model EEV.

5.2 Hasil Klasterisasi dengan k optimal

data$cluster_gmm <- gmm$classification
table(data$cluster_gmm)
## 
##  1  2 
##  6 32

Hasil klasterisasi menunjukkan terbentuknya dua klaster, dimana klaster pertama terdiri dari 6 provinsi dan klaster kedua terdiri dari 32 provinsi.

6. Karakteristik Klaster

karakteristik_klaster <- data %>%
  group_by(cluster_gmm) %>%
  summarise(across(where(is.numeric), mean, na.rm = TRUE))

kable(karakteristik_klaster)
cluster_gmm Tingkat Pengangguran Terbuka 2024 Pengeluaran per Kapita (ribu rupiah) 2024 Indeks Kedalaman Kemiskinan (P1) 2024 Indeks Keparahan Kemiskinan (P2) 2024
1 4.201667 8641.167 4.829167 1.4950000
2 4.413125 12145.250 1.387031 0.3298437

7. Menampilkan anggota setiap klaster

data_split <- split(data, data$cluster_gmm)

# Tampilkan Klaster 1
kable(data_split[[1]])
PROVINSI Tingkat Pengangguran Terbuka 2024 Pengeluaran per Kapita (ribu rupiah) 2024 Indeks Kedalaman Kemiskinan (P1) 2024 Indeks Keparahan Kemiskinan (P2) 2024 cluster_gmm
PAPUA BARAT 4.13 8805 4.460 1.375 1
PAPUA BARAT DAYA 6.48 8733 3.710 1.225 1
PAPUA 6.48 11037 4.325 1.505 1
PAPUA SELATAN 4.05 9756 4.170 1.285 1
PAPUA TENGAH 2.75 7809 5.620 1.650 1
PAPUA PEGUNUNGAN 1.32 5707 6.690 1.930 1
# Tampilkan Klaster 2
kable(data_split[[2]])
PROVINSI Tingkat Pengangguran Terbuka 2024 Pengeluaran per Kapita (ribu rupiah) 2024 Indeks Kedalaman Kemiskinan (P1) 2024 Indeks Keparahan Kemiskinan (P2) 2024 cluster_gmm
ACEH 5.75 10811 2.285 0.590 2
SUMATERA UTARA 5.60 11460 1.155 0.275 2
SUMATERA BARAT 5.75 11718 0.735 0.150 2
RIAU 3.70 11857 0.920 0.220 2
JAMBI 4.48 11621 1.185 0.335 2
SUMATERA SELATAN 3.86 12015 1.670 0.390 2
BENGKULU 3.11 11733 1.975 0.430 2
LAMPUNG 4.19 11258 1.635 0.365 2
KEP. BANGKA BELITUNG 4.63 13667 0.705 0.180 2
KEP. RIAU 6.39 15573 0.670 0.145 2
DKI JAKARTA 6.21 19953 0.600 0.120 2
JAWA BARAT 6.75 12157 1.130 0.265 2
JAWA TENGAH 4.78 12276 1.620 0.365 2
DI YOGYAKARTA 3.48 15361 1.715 0.395 2
JAWA TIMUR 4.19 12852 1.510 0.330 2
BANTEN 6.68 13097 0.885 0.200 2
BALI 1.79 14920 0.470 0.075 2
NUSA TENGGARA BARAT 2.73 11606 2.200 0.530 2
NUSA TENGGARA TIMUR 3.02 8534 3.490 0.905 2
KALIMANTAN BARAT 4.86 10321 0.870 0.180 2
KALIMANTAN TENGAH 4.01 12303 0.730 0.160 2
KALIMANTAN SELATAN 4.20 13399 0.525 0.105 2
KALIMANTAN TIMUR 5.14 13793 0.705 0.125 2
KALIMANTAN UTARA 3.90 10197 0.655 0.135 2
SULAWESI UTARA 5.85 11998 1.160 0.295 2
SULAWESI TENGAH 2.94 10536 1.910 0.470 2
SULAWESI SELATAN 4.19 12275 1.385 0.345 2
SULAWESI TENGGARA 3.09 10606 1.945 0.500 2
GORONTALO 3.13 11539 2.590 0.680 2
SULAWESI BARAT 2.68 10208 1.650 0.370 2
MALUKU 6.11 9684 2.835 0.740 2
MALUKU UTARA 4.03 9320 0.870 0.185 2

8. Hitung Silhouette Score untuk GMM

library(cluster)

# Silhoetter Score
sil_gmm <- silhouette(data$cluster_gmm, dist(data_scaled))
mean(sil_gmm[, 3])
## [1] 0.5889693
# Plot Silhouette Score
plot(
  sil_gmm,
  main = "Silhouette Plot Klasterisasi GMM",
  col = rainbow(length(unique(data$cluster_gmm))),
  border = NA
)

Interpretasi:

Plot silhouette menunjukkan bahwa sebagian besar observasi memiliki nilai silhouette positif dengan rata-rata sebesar 0,59, yang mengindikasikan struktur klaster yang cukup baik. Terdapat beberapa observasi dengan nilai silhouette negatif yang mengindikasikan adanya overlap antar klaster, yang wajar terjadi pada data sosial ekonomi dan tidak mengganggu struktur klaster secara keseluruhan.

Karena terdapat beberapa provinsi dengan karakteristik yang berada di batas antar klaster sehingga jaraknya relatif lebih dekat ke klaster lain. Hal ini menunjukkan adanya overlap alami antar kelompok dan tidak menandakan kegagalan klastering secara keseluruhan.

KLASTERISASI DENGAN K-MEDOID

1. Pemilihan Jumlah Klaster Optimal

Metode Silhouette Coefficient

# Silhouette Method untuk K-Medoids
fviz_nbclust(
  data_scaled,
  FUNcluster = pam,
  method = "silhouette"
) +
  labs(
    title = "Silhouette Method (K-Medoids)",
    x = "Jumlah Klaster (k)",
    y = "Average Silhouette Width"
  )

maka nilai k optimal menurut metode silhouette coefficient adalah saat k=2.

2. Proses Klasterisasi dengan K-Medoid

# Menambahkan hasil klaster ke data
data$cluster_kmedoids <- kmedoids_model$clustering
table(data$cluster_kmedoids)
## 
##  1  2 
## 31  7

Hasil klasterisasi dengan k-medoids menunjukkan terbentuknya dua klaster, dimana klaster pertama terdiri dari 31 provinsi dan klaster kedua terdiri dari 7 provinsi.

3. Karakteristik Klaster

## Karakteristik Klaster
karakteristik_klaster <- data %>%
  group_by(cluster_kmedoids) %>%
  summarise(across(where(is.numeric), mean, na.rm = TRUE))
kable(karakteristik_klaster)
cluster_kmedoids Tingkat Pengangguran Terbuka 2024 Pengeluaran per Kapita (ribu rupiah) 2024 Indeks Kedalaman Kemiskinan (P1) 2024 Indeks Keparahan Kemiskinan (P2) 2024 cluster_gmm
1 4.458064 12261.742 1.319193 0.3112903 2.000000
2 4.032857 8625.857 4.637857 1.4107143 1.142857

4. Menampilkan anggota setiap klaster

data_split1 <- split(data, data$cluster_kmedoids)

# Tampilkan Klaster 1 
kable(data_split1[[1]][, names(data_split1[[1]]) != "cluster_gmm"])
PROVINSI Tingkat Pengangguran Terbuka 2024 Pengeluaran per Kapita (ribu rupiah) 2024 Indeks Kedalaman Kemiskinan (P1) 2024 Indeks Keparahan Kemiskinan (P2) 2024 cluster_kmedoids
ACEH 5.75 10811 2.285 0.590 1
SUMATERA UTARA 5.60 11460 1.155 0.275 1
SUMATERA BARAT 5.75 11718 0.735 0.150 1
RIAU 3.70 11857 0.920 0.220 1
JAMBI 4.48 11621 1.185 0.335 1
SUMATERA SELATAN 3.86 12015 1.670 0.390 1
BENGKULU 3.11 11733 1.975 0.430 1
LAMPUNG 4.19 11258 1.635 0.365 1
KEP. BANGKA BELITUNG 4.63 13667 0.705 0.180 1
KEP. RIAU 6.39 15573 0.670 0.145 1
DKI JAKARTA 6.21 19953 0.600 0.120 1
JAWA BARAT 6.75 12157 1.130 0.265 1
JAWA TENGAH 4.78 12276 1.620 0.365 1
DI YOGYAKARTA 3.48 15361 1.715 0.395 1
JAWA TIMUR 4.19 12852 1.510 0.330 1
BANTEN 6.68 13097 0.885 0.200 1
BALI 1.79 14920 0.470 0.075 1
NUSA TENGGARA BARAT 2.73 11606 2.200 0.530 1
KALIMANTAN BARAT 4.86 10321 0.870 0.180 1
KALIMANTAN TENGAH 4.01 12303 0.730 0.160 1
KALIMANTAN SELATAN 4.20 13399 0.525 0.105 1
KALIMANTAN TIMUR 5.14 13793 0.705 0.125 1
KALIMANTAN UTARA 3.90 10197 0.655 0.135 1
SULAWESI UTARA 5.85 11998 1.160 0.295 1
SULAWESI TENGAH 2.94 10536 1.910 0.470 1
SULAWESI SELATAN 4.19 12275 1.385 0.345 1
SULAWESI TENGGARA 3.09 10606 1.945 0.500 1
GORONTALO 3.13 11539 2.590 0.680 1
SULAWESI BARAT 2.68 10208 1.650 0.370 1
MALUKU 6.11 9684 2.835 0.740 1
MALUKU UTARA 4.03 9320 0.870 0.185 1
# Tampilkan Klaster 2
kable(data_split1[[2]][, names(data_split1[[1]]) != "cluster_gmm"])
PROVINSI Tingkat Pengangguran Terbuka 2024 Pengeluaran per Kapita (ribu rupiah) 2024 Indeks Kedalaman Kemiskinan (P1) 2024 Indeks Keparahan Kemiskinan (P2) 2024 cluster_kmedoids
NUSA TENGGARA TIMUR 3.02 8534 3.490 0.905 2
PAPUA BARAT 4.13 8805 4.460 1.375 2
PAPUA BARAT DAYA 6.48 8733 3.710 1.225 2
PAPUA 6.48 11037 4.325 1.505 2
PAPUA SELATAN 4.05 9756 4.170 1.285 2
PAPUA TENGAH 2.75 7809 5.620 1.650 2
PAPUA PEGUNUNGAN 1.32 5707 6.690 1.930 2

5. Visualisasi Klaster

clusplot(kmedoids_model, 
         main = paste("K-Medoids Clustering Result (k =", k_optimal, ")"),
         color = TRUE, 
         shade = TRUE, 
         labels = 2, 
         lines = 0)

Terlihat bahwa kedua klaster mampu menjelaskan sebesar 90,01% variasi data, yang menunjukkan bahwa hasil klasterisasi telah merepresentasikan struktur data dengan baik. Selain itu, tidak terlihat adanya tumpang tindih (overlap) antar klaster, sehingga pemisahan klaster dikatakan cukup jelas.

6. Hitung Silhouette Score untuk K-Medoids

# Silhouette Score
sil_kmedoids <- silhouette(data$cluster_kmedoids, dist(data_scaled))
mean(sil_kmedoids[, 3])
## [1] 0.5954573
# Plot Silhouette Score
plot(silhouette(kmedoids_model), 
     main = paste("Silhouette Plot (k =", k_optimal, ")"),
     col = 2:(k_optimal + 1))

Interpretasi Plot silhouette menunjukkan bahwa sebagian besar observasi memiliki nilai silhouette positif dengan rata-rata sebesar 0,6, yang mengindikasikan struktur klaster yang cukup baik. Tidak terdapat observasi dengan nilai silhouette negatif, sehingga tidak ada yang mengindikasikan adanya overlap antar klaster.

Pada klaster pertama. terdapat 31 objek dengan rata-rata nilai silhouette sebesar 0,62, yang mengindikasikan bahwa objek-objek dalam klaster ini memiliki tingkat kohesi internal yang baik serta terpisah dengan cukup jelas dari klaster lainnya.

Sementara itu, klaster kedua terdiri dari 7 objek dengan rata-rata silhouette sebesar 0,51, yang masih berada pada kategori cukup baik, meskipun tingkat pemisahannya lebih rendah dibandingkan klaster pertama.