library(readxl)
library(knitr)
library(dplyr)
library(ggplot2)
library(mclust)
library(psych)
library(FactoMineR)
library(cluster)
library(clusterSim)
library(factoextra)
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 |
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 ...
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.
sum(duplicated(data))
## [1] 0
Terlihat bahwa tidak terdapat duplikasi data.
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
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 |
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.
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.
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 |
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 |
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.
# 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.
# 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.
## 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 |
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 |
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.
# 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.