Clustering merupakan metode dalam analisis multivariat yang digunakan untuk mengelompokkan objek berdasarkan kemiripan karakteristik. Dalam studi ini digunakan lima metode clustering, yaitu:
Dataset yang digunakan berisi indikator sosial, ekonomi, dan kesehatan dari berbagai negara.
Tujuan analisis ini adalah:
library(readr)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(cluster)
library(factoextra)
## Loading required package: ggplot2
## Welcome to factoextra!
## Want to learn more? See two factoextra-related books at https://www.datanovia.com/en/product/practical-guide-to-principal-component-methods-in-r/
library(dbscan)
##
## Attaching package: 'dbscan'
## The following object is masked from 'package:stats':
##
## as.dendrogram
library(kernlab)
##
## Attaching package: 'kernlab'
## The following object is masked from 'package:ggplot2':
##
## alpha
library(e1071)
##
## Attaching package: 'e1071'
## The following object is masked from 'package:ggplot2':
##
## element
data <- read.csv("Country-data.csv")
# Simpan nama negara
country <- data$country
# Hapus kolom country
data <- data %>% select(-country)
# Statistik deskriptif
summary(data)
## child_mort exports health imports
## Min. : 2.60 Min. : 0.109 Min. : 1.810 Min. : 0.0659
## 1st Qu.: 8.25 1st Qu.: 23.800 1st Qu.: 4.920 1st Qu.: 30.2000
## Median : 19.30 Median : 35.000 Median : 6.320 Median : 43.3000
## Mean : 38.27 Mean : 41.109 Mean : 6.816 Mean : 46.8902
## 3rd Qu.: 62.10 3rd Qu.: 51.350 3rd Qu.: 8.600 3rd Qu.: 58.7500
## Max. :208.00 Max. :200.000 Max. :17.900 Max. :174.0000
## income inflation life_expec total_fer
## Min. : 609 Min. : -4.210 Min. :32.10 Min. :1.150
## 1st Qu.: 3355 1st Qu.: 1.810 1st Qu.:65.30 1st Qu.:1.795
## Median : 9960 Median : 5.390 Median :73.10 Median :2.410
## Mean : 17145 Mean : 7.782 Mean :70.56 Mean :2.948
## 3rd Qu.: 22800 3rd Qu.: 10.750 3rd Qu.:76.80 3rd Qu.:3.880
## Max. :125000 Max. :104.000 Max. :82.80 Max. :7.490
## gdpp
## Min. : 231
## 1st Qu.: 1330
## Median : 4660
## Mean : 12964
## 3rd Qu.: 14050
## Max. :105000
# Korelasi
cor(data)
## child_mort exports health imports income inflation
## child_mort 1.0000000 -0.3180932 -0.20040206 -0.12721092 -0.5243150 0.2882762
## exports -0.3180932 1.0000000 -0.11440840 0.73738083 0.5167836 -0.1072944
## health -0.2004021 -0.1144084 1.00000000 0.09571668 0.1295786 -0.2553758
## imports -0.1272109 0.7373808 0.09571668 1.00000000 0.1224062 -0.2469943
## income -0.5243150 0.5167836 0.12957861 0.12240625 1.0000000 -0.1477560
## inflation 0.2882762 -0.1072944 -0.25537579 -0.24699428 -0.1477560 1.0000000
## life_expec -0.8866761 0.3163126 0.21069212 0.05439053 0.6119625 -0.2397050
## total_fer 0.8484781 -0.3200106 -0.19667399 -0.15904843 -0.5018401 0.3169211
## gdpp -0.4830322 0.4187248 0.34596553 0.11549817 0.8955714 -0.2216311
## life_expec total_fer gdpp
## child_mort -0.88667610 0.8484781 -0.4830322
## exports 0.31631260 -0.3200106 0.4187248
## health 0.21069212 -0.1966740 0.3459655
## imports 0.05439053 -0.1590484 0.1154982
## income 0.61196247 -0.5018401 0.8955714
## inflation -0.23970496 0.3169211 -0.2216311
## life_expec 1.00000000 -0.7608747 0.6000891
## total_fer -0.76087469 1.0000000 -0.4549103
## gdpp 0.60008913 -0.4549103 1.0000000
Berdasarkan statistik deskriptif, terdapat beberapa variabel dengan
rentang nilai yang sangat besar seperti income, gdpp, dan inflation. Hal
ini menunjukkan adanya potensi outlier yang dapat mempengaruhi hasil
clustering, terutama pada metode berbasis jarak seperti K-Means.
Dari matriks korelasi, terlihat bahwa:
- income memiliki korelasi sangat tinggi dengan gdpp (0.89), menunjukkan
bahwa kedua variabel merepresentasikan tingkat kemakmuran negara.
- child_mort memiliki korelasi negatif kuat dengan life_expec (-0.88),
yang berarti semakin tinggi angka kematian anak, semakin rendah harapan
hidup.
Hubungan ini menunjukkan bahwa dataset memiliki struktur yang jelas dan
cocok untuk analisis clustering.
data_scaled <- scale(data)
Data distandardisasi karena setiap variabel memiliki skala berbeda, sehingga perlu disamakan agar tidak bias dalam perhitungan jarak.
fviz_nbclust(data_scaled, kmeans, method = "wss")
fviz_nbclust(data_scaled, kmeans, method = "silhouette")
Berdasarkan grafik Elbow Method, terlihat adanya penurunan signifikan
pada nilai Within Sum of Squares (WSS) hingga k = 3, setelah itu
penurunannya melambat. Hal ini menunjukkan bahwa jumlah cluster optimal
adalah 3.
Hasil ini diperkuat oleh metode silhouette yang menunjukkan nilai
rata-rata silhouette relatif tinggi pada k = 3 dibandingkan jumlah
cluster lainnya.
Dengan demikian, analisis selanjutnya menggunakan 3 cluster sebagai
jumlah cluster optimal.
set.seed(123)
kmeans_result <- kmeans(data_scaled, centers = 3, nstart = 25)
kmeans_result$cluster
## [1] 3 2 2 3 2 2 2 1 1 2 2 1 2 2 2 1 2 3 2 2 2 3 2 1 2 3 3 2 3 1 2 3 3 2 2 2 3
## [38] 3 3 2 3 2 1 1 1 2 2 2 2 3 3 2 2 1 1 3 3 2 1 3 1 2 2 3 3 2 3 2 1 2 2 2 3 1
## [75] 1 1 2 1 2 2 3 3 1 2 3 2 2 3 3 2 2 1 2 3 3 2 2 3 1 3 2 2 2 2 2 2 3 2 3 2 1
## [112] 1 3 3 1 2 3 2 2 2 2 2 1 1 2 2 3 2 2 3 2 2 3 1 1 1 2 3 1 1 2 2 3 2 1 1 2 3
## [149] 2 3 3 2 2 2 2 3 2 1 1 1 2 2 2 2 2 3 3
kmedoid_result <- pam(data_scaled, k = 3)
kmedoid_result$clustering
## [1] 1 2 2 1 2 2 2 3 3 2 3 2 2 2 2 3 2 1 2 2 2 1 2 3 2 1 1 2 1 3 2 1 1 2 2 2 1
## [38] 1 1 2 1 2 3 2 3 2 2 2 2 1 1 2 2 3 3 1 1 2 3 1 3 2 2 1 1 2 1 2 3 1 2 2 1 3
## [75] 3 3 2 3 2 2 1 1 3 2 1 2 2 1 1 2 2 3 2 1 1 2 2 1 2 1 2 2 2 2 2 2 1 1 1 1 3
## [112] 3 1 1 3 2 1 2 2 2 2 2 3 3 2 2 1 2 2 1 2 2 1 2 2 3 2 1 2 3 2 2 1 2 3 3 1 1
## [149] 2 1 1 2 2 2 2 1 2 3 3 3 2 2 2 2 2 1 1
kNNdistplot(data_scaled, k = 5)
abline(h = 1.5, col = "red")
dbscan_result <- dbscan(data_scaled, eps = 1.5, minPts = 5)
dbscan_result$cluster
## [1] 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1
## [38] 0 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 0
## [75] 1 1 1 1 1 1 1 0 0 1 1 1 1 0 0 1 1 0 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1
## [112] 1 1 0 0 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1
## [149] 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 0 1 1 1
Hasil DBSCAN menunjukkan bahwa sebagian besar data tergabung dalam
satu cluster utama, dengan beberapa data dikategorikan sebagai noise
(cluster 0). Hal ini menunjukkan bahwa struktur data tidak memiliki
pemisahan densitas yang kuat, sehingga sebagian besar negara memiliki
karakteristik yang relatif mirip.
Namun, keberadaan noise menunjukkan adanya negara dengan karakteristik
ekstrem yang berbeda signifikan dari kelompok utama.
## 7.4 Mean Shift
library(meanShiftR)
# Convert ke matrix
data_matrix <- as.matrix(data_scaled)
# Mean Shift
ms_result <- meanShift(
data_matrix,
bandwidth = rep(2, ncol(data_matrix)),
kernelType = "NORMAL"
)
# Cluster hasil
ms_clusters <- ms_result$assignment
# Jumlah cluster terbentuk
length(unique(ms_clusters))
## [1] 5
Mean Shift menghasilkan 5 cluster berdasarkan kepadatan data. Namun,
beberapa cluster hanya berisi sedikit data dengan nilai ekstrem, seperti
negara dengan income dan gdpp sangat tinggi atau inflasi sangat
besar.
Hal ini menunjukkan bahwa Mean Shift cenderung memisahkan outlier
menjadi cluster tersendiri, sehingga menghasilkan cluster kecil yang
kurang representatif untuk analisis global.
Oleh karena itu, meskipun Mean Shift mampu mendeteksi struktur densitas
data, metode ini kurang optimal untuk segmentasi utama pada dataset
ini.
pca <- prcomp(data_scaled)
pca_data <- as.data.frame(pca$x[,1:2])
pca_data$cluster <- as.factor(ms_clusters)
library(ggplot2)
ggplot(pca_data, aes(x = PC1, y = PC2, color = cluster)) +
geom_point(size = 2) +
labs(title = "Mean Shift Clustering (PCA)") +
theme_minimal()
data_ms <- data
data_ms$cluster <- ms_clusters
aggregate(data_ms,
by = list(cluster = data_ms$cluster),
mean)
## cluster child_mort exports health imports income inflation
## 1 1 43.23094 37.56474 6.693453 45.33932 13461.89 7.708151
## 2 2 2.80000 175.00000 7.770000 142.00000 91700.00 3.620000
## 3 3 130.00000 25.30000 5.070000 17.40000 5150.00 104.000000
## 4 4 9.85600 49.73600 7.641200 47.80400 32920.40 4.822360
## 5 5 2.80000 200.00000 3.960000 174.00000 72100.00 -0.046000
## life_expec total_fer gdpp cluster
## 1 69.23094 3.144604 9847.942 1
## 2 81.30000 1.630000 105000.000 2
## 3 60.50000 5.840000 2330.000 3
## 4 77.40800 1.863600 25688.800 4
## 5 82.70000 1.150000 46600.000 5
fuzzy_result <- cmeans(data_scaled, centers = 3)
fuzzy_result$cluster
## [1] 3 2 2 3 2 2 2 1 1 2 1 1 2 2 2 1 2 3 2 2 2 3 2 1 2 3 3 2 3 1 2 3 3 2 2 2 3
## [38] 3 3 2 3 2 1 1 1 2 2 2 2 3 3 2 2 1 1 3 3 2 1 3 1 2 2 3 3 2 3 2 1 2 2 2 3 1
## [75] 1 1 2 1 2 2 3 3 1 2 3 2 2 3 3 2 2 1 2 3 3 2 2 3 1 3 2 2 2 2 2 2 3 3 3 2 1
## [112] 1 3 3 1 2 3 2 2 2 2 2 1 1 2 2 3 2 2 3 2 2 3 1 1 1 2 3 1 1 2 2 3 2 1 1 2 3
## [149] 2 3 3 2 2 2 2 3 2 1 1 1 2 2 2 2 2 3 3
pca <- prcomp(data_scaled)
pca_data <- as.data.frame(pca$x[,1:2])
pca_data$cluster_kmeans <- as.factor(kmeans_result$cluster)
ggplot(pca_data, aes(PC1, PC2, color = cluster_kmeans)) +
geom_point() +
ggtitle("K-Means")
pca_data$cluster_kmedoid <- as.factor(kmedoid_result$clustering)
ggplot(pca_data, aes(PC1, PC2, color = cluster_kmedoid)) +
geom_point() +
ggtitle("K-Medoids")
pca_data$cluster_dbscan <- as.factor(dbscan_result$cluster)
ggplot(pca_data, aes(PC1, PC2, color = cluster_dbscan)) +
geom_point() +
ggtitle("DBSCAN")
pca_data$cluster_ms <- as.factor(ms_clusters)
ggplot(pca_data, aes(PC1, PC2, color = cluster_ms)) +
geom_point() +
ggtitle("Mean Shift")
pca_data$cluster_fuzzy <- as.factor(fuzzy_result$cluster)
ggplot(pca_data, aes(PC1, PC2, color = cluster_fuzzy)) +
geom_point() +
ggtitle("Fuzzy C-Means")
Visualisasi PCA menunjukkan bahwa metode K-Means, K-Medoids, dan
Fuzzy C-Means menghasilkan pemisahan cluster yang relatif jelas dengan
tiga kelompok utama.
DBSCAN menunjukkan satu cluster besar dengan beberapa titik yang
tersebar sebagai noise, yang merepresentasikan outlier.
Mean Shift menghasilkan beberapa cluster kecil yang tersebar,
menunjukkan bahwa metode ini lebih sensitif terhadap kepadatan lokal
dibandingkan pemisahan global.
Secara umum, K-Means dan K-Medoids memberikan struktur cluster yang
paling mudah diinterpretasikan.
library(cluster)
# Distance matrix
dist_matrix <- dist(data_scaled)
# K-Means
sil_kmeans <- silhouette(kmeans_result$cluster, dist_matrix)
mean(sil_kmeans[,3])
## [1] 0.2832958
# K-Medoids
sil_kmedoid <- silhouette(kmedoid_result$clustering, dist_matrix)
mean(sil_kmedoid[,3])
## [1] 0.2810419
# DBSCAN (hanya jika cluster >1)
if(length(unique(dbscan_result$cluster)) > 1){
sil_dbscan <- silhouette(dbscan_result$cluster, dist_matrix)
mean(sil_dbscan[,3])
}
## [1] 0.288296
# Mean Shift (setelah bandwidth diperbaiki)
if(length(unique(ms_clusters)) > 1){
sil_ms <- silhouette(ms_clusters, dist_matrix)
mean(sil_ms[,3])
}
## [1] 0.08049555
# Fuzzy (gunakan cluster hasil)
sil_fuzzy <- silhouette(fuzzy_result$cluster, dist_matrix)
mean(sil_fuzzy[,3])
## [1] 0.2790529
Berdasarkan nilai silhouette:
- DBSCAN memiliki nilai tertinggi (~0.288), menunjukkan kualitas cluster
terbaik secara numerik.
- K-Means dan K-Medoids memiliki nilai yang hampir sama (~0.28),
menunjukkan stabilitas yang baik.
- Fuzzy C-Means juga memberikan hasil yang sebanding dengan
K-Means.
- Mean Shift memiliki nilai silhouette sangat rendah (~0.08), yang
menunjukkan bahwa cluster yang dihasilkan kurang terpisah dengan
baik.
Meskipun DBSCAN memiliki nilai terbaik, metode ini hanya menghasilkan
satu cluster utama sehingga kurang informatif untuk segmentasi. Oleh
karena itu, K-Means dan K-Medoids dianggap lebih optimal dalam konteks
interpretasi.
data_clustered <- data
data_clustered$cluster <- kmeans_result$cluster
aggregate(data_clustered,
by = list(cluster = data_clustered$cluster),
mean)
## cluster child_mort exports health imports income inflation life_expec
## 1 1 5.00000 58.73889 8.807778 51.49167 45672.222 2.671250 80.12778
## 2 2 21.92738 40.24392 6.200952 47.47340 12305.595 7.600905 72.81429
## 3 3 92.96170 29.15128 6.388511 42.32340 3942.404 12.019681 59.18723
## total_fer gdpp cluster
## 1 1.752778 42494.444 1
## 2 2.307500 6486.452 2
## 3 5.008085 1922.383 3
K-Means berhasil membagi negara menjadi tiga kelompok utama: - Cluster 1: Negara maju (income tinggi, life expectancy tinggi, child mortality rendah) - Cluster 2: Negara berkembang (nilai indikator sedang) - Cluster 3: Negara tertinggal (child mortality tinggi, income rendah)
K-Medoids menghasilkan pembagian yang mirip dengan K-Means, namun lebih robust terhadap outlier. Hal ini membuat hasil clustering lebih stabil terhadap data ekstrem.
DBSCAN mengelompokkan sebagian besar negara ke dalam satu cluster utama dan mendeteksi beberapa negara sebagai noise. Hal ini menunjukkan adanya outlier dalam data, namun metode ini kurang efektif untuk segmentasi kelompok utama.
Mean Shift menghasilkan beberapa cluster kecil yang dipengaruhi oleh kepadatan lokal. Beberapa cluster hanya berisi satu atau dua negara dengan nilai ekstrem, sehingga kurang representatif untuk analisis global.
Fuzzy C-Means memberikan hasil yang mirip dengan K-Means, namun memungkinkan setiap negara memiliki derajat keanggotaan pada beberapa cluster. Hal ini mencerminkan kondisi nyata bahwa suatu negara dapat memiliki karakteristik campuran.
| Metode | Kelebihan | Kekurangan |
|---|---|---|
| K-Means | Cepat dan sederhana | Sensitif terhadap outlier |
| K-Median | Lebih robust | Lebih lambat |
| DBSCAN | Bisa deteksi noise | Sensitif parameter |
| Mean Shift | Tidak perlu jumlah cluster | Komputasi berat |
| Fuzzy C-Means | Fleksibel | Interpretasi lebih kompleks |
Setiap metode memiliki keunggulan masing-masing:
- K-Means: paling stabil dan mudah diinterpretasikan
- K-Medoids: lebih tahan terhadap outlier
- DBSCAN: unggul dalam mendeteksi noise
- Mean Shift: sensitif terhadap kepadatan data
- Fuzzy C-Means: fleksibel dalam keanggotaan cluster
Dalam konteks dataset ini, K-Means dan K-Medoids merupakan metode yang
paling sesuai untuk segmentasi negara.
Berdasarkan hasil analisis, K-Means dan K-Medoids memberikan hasil
clustering yang paling optimal karena mampu membagi negara menjadi
kelompok yang jelas dan mudah diinterpretasikan.
DBSCAN memiliki nilai silhouette tertinggi, namun kurang efektif dalam
segmentasi karena hanya menghasilkan satu cluster utama.
Mean Shift kurang optimal karena menghasilkan cluster kecil yang
dipengaruhi oleh outlier, yang tercermin dari nilai silhouette yang
rendah.
Fuzzy C-Means memberikan fleksibilitas dalam analisis dengan
memungkinkan keanggotaan ganda, namun hasilnya tidak jauh berbeda dari
K-Means.
Dengan demikian, K-Means direkomendasikan sebagai metode terbaik untuk
analisis clustering pada dataset ini.