1. Pendahuluan

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.


2. Tujuan

Tujuan analisis ini adalah:

  1. Mengelompokkan negara berdasarkan indikator pembangunan
  2. Membandingkan hasil dari lima metode clustering
  3. Menginterpretasikan karakteristik masing-masing cluster

3. Library

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

4. Load dan Persiapan Data

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.

5. Standardisasi Data

data_scaled <- scale(data)

Data distandardisasi karena setiap variabel memiliki skala berbeda, sehingga perlu disamakan agar tidak bias dalam perhitungan jarak.

6. Penentuan Jumlah Cluster

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.

7. Implementasi Clustering

7.1 K-Means

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

7.2 K-Median (K-Medoids)

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

7.3 DBSCAN

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

## 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

7.5 Fuzzy C-Means

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

8. Visualisasi

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.

9. Evaluasi Cluster (Silhouette)

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.

10. Interpretasi Cluster

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

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

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

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

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

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.

11. Perbandingan Metode

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.

12. Kesimpulan

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.