K-Means Clustering merupakan salah satu metode data clustering nonhierarki yang cukup populer dan banyak digunakan untuk mengelompokkan data ke dalam beberapa klaster berdasarkan kesamaan karakteristik. Dalam perkembangan ilmu, kemampuan untuk menyederhanakan dan mengelompokkan data menjadi sangat penting. Metode K-Means Clustering ini bekerja dengan cara mempartisi data menjadi sejumlah klaster yang telah ditentukan sebelumnya, dimana setiap data dalam satu klaster memiliki karakteristik yang mirip.

Salah satu dasar utama penggunaan K-Means Clustering adalah kesederhanaan dan efisiensinya dalam mengelola data dengan jumlah besar. Algoritma ini cepat dan mudah diterapkan pada data yang memiliki atribut numerik. Selain itu, dimungkinkan penyesuaian yang fleksibel terhadap jumlah klaster yang diinginkan dan memberi peneliti kontrol lebih dalam menentukan tingkat granularitas analisis.

pacman::p_load(readxl, magrittr, knitr, ggplot2, factoextra, 
               cluster, prettydoc, tinytex, psych, GPArotation, 
               clValid, tidyverse, PerformanceAnalytics)

Dataset

Dataset yang digunakan adalah data IKPS tahun 2022 kab/kota di Provinsi Sulawesi Selatan.

X1: Imunisasi Dasar Lengkap

X2: Penolong persalinan di fasilitas kesehatan oleh tenaga kesehatan

X3: Penggunaan alat KB Modern

X4: ASI Eksklusif

X5: Complementary Feeding

X6: Akses Air Minum Layak

X7: Akses Sanitasi Layak

X8: Pendidikan Anak Usia Dini (PAUD)

X9: Kepemilikan JKN/jamkesda

X10: Penerima KPS/KKS atau bantuan pangan

1 Statistik Deskriptif

Cek missing data:

## kabu    y   x1   x2   x3   x4   x5   x6   x7   x8   x9  x10 
##    0    0    0    0    0    0    0    0    0    0    0    0

Tidak terdapat data yang hilang (missing).

summary(dataku[, -c(1,2)])
##        x1              x2               x3              x4        
##  Min.   :34.60   Min.   : 84.60   Min.   :35.20   Min.   : 52.00  
##  1st Qu.:63.08   1st Qu.: 94.28   1st Qu.:41.23   1st Qu.: 69.75  
##  Median :70.35   Median : 95.60   Median :45.75   Median : 84.90  
##  Mean   :67.01   Mean   : 95.29   Mean   :46.37   Mean   : 82.02  
##  3rd Qu.:76.78   3rd Qu.: 97.60   3rd Qu.:48.83   3rd Qu.: 94.83  
##  Max.   :88.20   Max.   :100.00   Max.   :61.60   Max.   :100.00  
##        x5              x6              x7              x8       
##  Min.   :56.30   Min.   :73.60   Min.   :80.80   Min.   :18.90  
##  1st Qu.:62.15   1st Qu.:86.58   1st Qu.:89.15   1st Qu.:25.23  
##  Median :69.20   Median :92.10   Median :92.90   Median :29.95  
##  Mean   :69.03   Mean   :91.06   Mean   :91.55   Mean   :30.57  
##  3rd Qu.:74.28   3rd Qu.:97.45   3rd Qu.:94.60   3rd Qu.:34.45  
##  Max.   :82.30   Max.   :98.20   Max.   :96.90   Max.   :46.70  
##        x9             x10       
##  Min.   :62.70   Min.   :17.30  
##  1st Qu.:73.08   1st Qu.:32.23  
##  Median :79.15   Median :41.40  
##  Mean   :80.96   Mean   :42.10  
##  3rd Qu.:89.00   3rd Qu.:50.55  
##  Max.   :98.30   Max.   :64.50

Dari output di atas dapat diketahui ukuran tendensi sentral dari tiap variabel seperti Mean dan Median.

Cek korelasi:

Dari gambar di atas diperoleh informasi mengenai hubungan keeratan antar variabel. Jika antar variabel memiliki korelasi yang cukup tinggi, maka bisa dilakukan eliminasi pada salah satu variabel untuk menghindari terjadinya kolinearitas.

Dari gambar korelasi di atas, tampak sudah tidak ada lagi kolinearitas.

2 Asumsi Analisis Cluster

2.1 Asumsi Non-Multikolinearitas

Gujarati (1995) mengatakan bahwa apabila nilai koefisien korelasi antar variabel bebas menunjukkan nilai mutlak lebih dari 0.8, dikatakan telah terjadi masalah multikolinearitas, dan sebaliknya.

korelasi <- round(cor(dataku[, c(6:12)], method = 'pearson'),2)
print(korelasi)
##        x4    x5    x6    x7    x8    x9   x10
## x4   1.00  0.19  0.25 -0.18 -0.13  0.24  0.28
## x5   0.19  1.00 -0.14 -0.39  0.21  0.25  0.06
## x6   0.25 -0.14  1.00  0.22  0.01  0.06 -0.27
## x7  -0.18 -0.39  0.22  1.00 -0.17 -0.18 -0.07
## x8  -0.13  0.21  0.01 -0.17  1.00  0.09 -0.31
## x9   0.24  0.25  0.06 -0.18  0.09  1.00  0.17
## x10  0.28  0.06 -0.27 -0.07 -0.31  0.17  1.00

Berdasarkan output dapat dilihat bahwa nilai korelasi antar variabel kurang dari 0.8 sehingga disimpulkan bahwa tidak terjadi multikolinearitas antar variabel.

2.2 Asumsi Representatif

Sampel representatif adalah keadaan ketika sampel yang diambil dapat merepresentasikan atau mewakili populasi yang ada. Asumsi sampel representatif ini dapat dilakukan menggunakan uji Kaiser Mayer Olkin (KMO).

\[ KMO = \frac{\sum_{i=1}^p \sum_{j=1}^p r_{ij}^2}{\sum_{i=1}^p \sum_{j=1}^p r_{ij}^2 + \sum_{i=1}^p \sum_{j=1}^p (1 - r_{ij}^2)} \]

di mana \(r_{ij}\) adalah koefisien korelasi antara variabel i dan variabel j.

kmo <- KMO(dataku[, c(6:12)])
print(kmo)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = dataku[, c(6:12)])
## Overall MSA =  0.51
## MSA for each item = 
##   x4   x5   x6   x7   x8   x9  x10 
## 0.46 0.64 0.35 0.61 0.56 0.66 0.45

Dari output diatas, variabel x4, x6, x10 memiliki nilai <0.5, selanjutnya variabel-variabel tersebut di-drop.

kmo <- KMO(dataku[, c(7,9:11)])
print(kmo)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = dataku[, c(7, 9:11)])
## Overall MSA =  0.63
## MSA for each item = 
##   x5   x7   x8   x9 
## 0.59 0.62 0.71 0.69

Dari output di atas, nilai uji KMO tiap variabel sudah bernilai > 0.5 sehingga dapat disimpulkan sampel telah representatif terhadap populasi.

3 Standardisasi Variabel

Setelah dilakukan uji asumsi dan mendapatkan hasil yang telah memenuhi asumsi, maka dilanjutkan dengan proses standardisasi variabel ke bentuk Z-Score (transformasi data dalam bentuk normal baku N(0,1)).

Tujuan dari standardisasi variabel adalah menyamakan perbedaan satuan yang signifikan diantara variabel-variabel yang diteliti.

\[ Z = \frac{x - \bar{x}}{\sigma} \] dimana:

  • \(x\) adalah nilai yang ingin dihitung Z-score-nya,

  • \(\bar{x}\) adalah rata-rata dari data,

  • \(\sigma\) adalah deviasi standar dari data.

datastand <- round(scale(dataku[, c(7,9:11)]), 2)
head(datastand)
##         x5    x7    x8    x9
## [1,]  1.73 -2.60  1.24  1.48
## [2,]  0.50 -0.91  0.35 -1.32
## [3,]  0.59 -0.66  0.38  1.13
## [4,]  0.86 -2.02 -0.65 -0.63
## [5,] -0.32  0.11 -1.19 -0.39
## [6,] -0.77  1.13 -0.97 -0.96

Ukuran Jarak

Jarak Euclidean (Euclidean Distance) merupakan jarak yang paling umum dan paling sering digunakan dalam analisis cluster.

\[ d(\mathbf{x}, \mathbf{y}) = \sqrt{\sum_{i=1}^n (x_i - y_i)^2} \]

di mana \(\mathbf{x}\) dan \(\mathbf{y}\) adalah dua vektor dalam ruang n-dimensi dan \(d(\mathbf{x}, \mathbf{y})\) adalah jarak Euclidean antara keduanya.

jarak <- dist(datastand, method = "euclidean")
#jarak

Koefisien Korelasi Cophenetic

Koefisien Korelasi Cophenetic mengukur sejauh mana jarak dalam dendrogram klaster sesuai dengan jarak Euclidean yang sebenarnya. Oleh karena itu ukuran ini digunakan sebagai dasar dalam menentukan metode terbaik yang akan digunakan dalam analisis klaster. Metode dengan nilai korelasi mendekati 1 yang akan dipilih sebagai metode terbaik.

Formula untuk menghitung Koefisien Korelasi Cophenetic adalah sebagai berikut :

\[ r_c = \frac{\sum_{i < j} (d_{ij} - \bar{d}) \cdot (c_{ij} - \bar{c})}{\sqrt{\sum_{i < j} (d_{ij} - \bar{d})^2 \cdot \sum_{i < j} (c_{ij} - \bar{c})^2}} \]

di mana:

  • \(d_{ij}\) adalah jarak Euclidean antara objek \(i\) dan objek \(j\),

  • \(c_{ij}\) adalah jarak cophenetic antara objek \(i\) dan objek \(j\),

  • \(\bar{d}\) adalah rata-rata dari semua jarak Euclidean,

  • \(\bar{c}\) adalah rata-rata dari semua jarak cophenetic,

  • \(r_c\) adalah Koefisien Korelasi Cophenetic.

4 Determining Optimal Clusters

Dalam metode K-Means banyaknya klaster ditentukan sendiri oleh pengguna. Ini terlalu subjektif. Oleh karena itu, dilakukan penentuan jumlah klaster optimal dengan menggunakan metode Elbow Plot.

4.1 Metode Elbow Plot

Elbow Plot merupakan plot antara banyak klaster dengan total within-cluster variation (total dari simpangan per klaster). Banyak klaster yang dipilih adalah bagian “siku” atau titik dimana terdapat penurunan yang tajam sebelum titik tersebut dan disusul penurunan yang tidak tajam setelah titik tersebut. Hal ini karena penambahan jumlah klaster tidak membawa pengaruh banyak atas variasi yang ada di dalam klaster tersebut.

# Determine number of clusters
jumlah_klaster <- c(1:23)
within_ss <- c()
for (i in jumlah_klaster) {
  within_ss <- c(within_ss, kmeans(x = datastand, centers = i, nstart = 25)$tot.withinss)
}

plot(x = jumlah_klaster, y = within_ss, type = "b", xlab = "Number of Clusters k", ylab = "Total Within Sum of Squares", main = "Elbow Plot")
abline(v = 2, col = 'red')

Dari Elbow Plot di atas terlihat banyaknya klaster yang dipilih adalah 2 klaster.

4.2 Metode Silhouette

Selain menggunakan Metode Elbow, untuk menentukan jumlah klaster yang optimal pada K-Means dapat pula digunakan Metode Silhouette. Metode Silhouette ini dilakukan untuk menduga kualitas dari klaster yang terbentuk. Semakin tinggi nilai rata-ratanya, maka klaster yang akan dibentuk semakin baik.

fviz_nbclust(datastand, kmeans, method = "silhouette")

Dengan menggunakan metode ini tampak k optimal sebanyak 2.

5 Cluster with K-Means

5.1 Performa K-Means clustering

Pengelompokkan kabupaten/kota di Provinsi Sulawesi Selatan berdasarkan IKPS dibagi ke dalam 2 kelompok.

kmeans_clustering <- kmeans(x = datastand, centers = 2, nstart = 25)
print(kmeans_clustering)
## K-means clustering with 2 clusters of sizes 18, 6
## 
## Cluster means:
##           x5         x7         x8         x9
## 1 -0.2500000  0.4594444 -0.2483333 -0.1244444
## 2  0.7466667 -1.3750000  0.7433333  0.3733333
## 
## Clustering vector:
##  [1] 2 2 2 2 1 1 2 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1
## 
## Within cluster sum of squares by cluster:
## [1] 47.54219 19.30715
##  (between_SS / total_SS =  27.3 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Untuk jumlah kuadrat dari setiap klaster dapat dilihat pada within cluster sum of squares by cluster yaitu sebesar 47.54219 dan 19.30715. Adapun nilai jarak dekatnya atau jarak antar satu klaster yang sama (between SS) sebesar 27.3%. Adapun anggota kelompok dari masing-masing klaster bisa dilihat pada Clustering Vector.

5.2 Visualisasi

Visualisasi dari kabupaten/kota yang terbentuk di setiap kelompok adalah sebagai berikut:

# Visualize the clusters
fviz_cluster(kmeans_clustering, data = datastand, 
             geom = "point",
             ellipse.type = "convex", 
             palette = "jco", 
             ggtheme = theme_minimal(),
             main = "Cluster Plot")

5.3 Mengembalikan Nilai Centroid ke Skala Asli

# Retrieve centroid values
a = dataku %>%
  mutate(Klaster = kmeans_clustering$cluster) %>%
  group_by(Klaster) %>%
  summarise(across(everything(), mean, na.rm = TRUE))
print(a)
## # A tibble: 2 × 13
##   Klaster  kabu     y    x1    x2    x3    x4    x5    x6    x7    x8    x9
##     <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1       1 7324.  26.8  70.6  95.8  45.3  82.1  67.1  91.4  93.4  28.7  79.7
## 2       2 7306.  31.2  56.2  93.8  49.5  81.9  74.8  89.9  85.9  36.3  84.8
## # ℹ 1 more variable: x10 <dbl>

5.4 Mengelompokkan Objek ke dalam Klaster

# Assign objects to clusters
b = dataku %>%
  mutate(Klaster = kmeans_clustering$cluster) %>%
  select(kabu, Klaster) %>%
  arrange(Klaster)
print(b)
## # A tibble: 24 × 2
##     kabu Klaster
##    <dbl>   <int>
##  1  7305       1
##  2  7306       1
##  3  7308       1
##  4  7309       1
##  5  7310       1
##  6  7311       1
##  7  7312       1
##  8  7313       1
##  9  7314       1
## 10  7315       1
## # ℹ 14 more rows

6 Validasi Klaster

Validasi klaster adalah proses yang menilai hasil analisis klaster secara kuantitatif dan objektif. Menurut Hair dkk (2010), validitas digunakan untuk menentukan apakah kelompok klaster yang terbentuk dapat menjelaskan dan mewakili populasi secara umum. Validitas klaster membantu dalam menyelesaikan masalah utama, yaitu menentukan jumlah kelompok yang optimal. Kelompok optimal adalah kelompok yang memiliki jarak antar individu atau objek yang rapat, dan terpisah atau memiliki jarak yang jauh dari kelompok lainnya (Dubes & Jain, 1988).

Indeks validitas dapat berupa Connectivity, Silhouette, dan Dunn. Namun berikut yang digunakan adalah Silhouette.

Validasi Klaster dengan Silhouette Score

Silhouette Score mengukur seberapa mirip objek dengan objek di klaster yang sama dan seberapa berbeda objek dari objek di klaster yang berbeda. Nilai ini berkisar antara -1 dan 1.

  • Nilai mendekati 1: menunjukkan objek berada pada klaster yang benar-benar berbeda dari klaster lain. Objek tersebut sangat mirip dengan anggota klasternya sendiri dan jauh dari anggota klaster lain.

  • Nilai mendekati 0: menunjukkan bahwa objek berada di tepi antara dua klaster. Objek tersebut hampir sama baiknya dengan anggota klaster sendiri dan anggota klaster lain.

  • Nilai negatif: menunjukkan bahwa objek mungkin salah diklasifikasikan, yaitu objek lebih mirip dengan anggota klaster lain daripada dengan anggota klaster sendiri.

# Calculate Silhouette Score
silhouette_score <- silhouette(kmeans_clustering$cluster, dist(datastand))
avg_silhouette <- round(mean(silhouette_score[, 3]),2)
print(paste("Average Silhouette Score:", avg_silhouette))
## [1] "Average Silhouette Score: 0.26"

Skor Silhouette diperoleh sebesar 0.26.

fviz_silhouette(silhouette_score)
##   cluster size ave.sil.width
## 1       1   18          0.30
## 2       2    6          0.14

fviz_cluster(object = kmeans_clustering, data = datastand)

table(kmeans_clustering$cluster)
## 
##  1  2 
## 18  6

Output di atas menunjukkan banyaknya anggota dalam tiap klaster.

7 Profiling Klaster

cluster_profile <- dataku[, c(7,9:11)] %>%
  mutate(Cluster = kmeans_clustering$cluster) %>%
  group_by(Cluster) %>%
  summarise(across(everything(), mean, na.rm = TRUE))
cluster_profile 
## # A tibble: 2 × 5
##   Cluster    x5    x7    x8    x9
##     <int> <dbl> <dbl> <dbl> <dbl>
## 1       1  67.1  93.4  28.7  79.7
## 2       2  74.8  85.9  36.3  84.8

Berdasarkan hasil diatas, dapat dilakukan profiling tiap klaster yang terbentuk. Klaster 1 merupakan kab/kota yang memiliki akses sanitasi layak yang tinggi (x7), sedangkan klaster 2 adalah kumpulan kab/kota yang memiliki Complementary Feeding (x5), Partisipasi PAUD (x8) dan Kepemilikan JKN/jamkesda (x9) yang cukup tinggi.

Anggota Cluster 1:

## Anggota Klaster 1 adalah kab/kota dengan kode: 7305, 7306, 7308, 7309, 7310, 7311, 7312, 7313, 7314, 7315, 7316, 7317, 7322, 7325, 7326, 7371, 7372, 7373

Anggota Cluster 2:

## Anggota Klaster 2 adalah kab/kota dengan kode: 7301, 7302, 7303, 7304, 7307, 7318

8 Analisis Lanjutan dengan PCA

# Perform PCA
pca_res <- prcomp(datastand, scale. = TRUE)
summary(pca_res)
## Importance of components:
##                           PC1    PC2    PC3    PC4
## Standard deviation     1.2936 0.9568 0.9021 0.7729
## Proportion of Variance 0.4183 0.2289 0.2034 0.1493
## Cumulative Proportion  0.4183 0.6472 0.8507 1.0000

Standard Deviations

Nilai deviasi standar dari masing-masing komponen menunjukkan seberapa banyak varians yang ditangkap oleh setiap komponen. Komponen 1 memiliki deviasi standar tertinggi (1.29), yang berarti komponen ini menangkap varians terbesar dalam data.

Proportion of Variance

Komponen 1 menjelaskan 41,83% dari total varians dalam data. Komponen 2 menambah 22,89% lagi, sehingga dua komponen pertama bersama-sama menjelaskan 64,72% dari varians total. Hal ini menunjukkan bahwa sebagian besar informasi dari data asli dapat ditangkap hanya dengan dua komponen pertama.

Cumulative Proportion

Dengan menggunakan tiga komponen, bisa terjelaskan 85,07% dari total varians. Ini biasanya dianggap memadai untuk banyak aplikasi, sehingga bisa diputuskan untuk hanya mempertimbangkan tiga komponen ini dalam analisis lebih lanjut.

Rotation (Loadings)

round(pca_res$rotation,2)
##      PC1   PC2   PC3   PC4
## x5 -0.60 -0.05 -0.23  0.76
## x7  0.56 -0.01  0.56  0.61
## x8 -0.39  0.76  0.52 -0.10
## x9 -0.42 -0.65  0.60 -0.19

Matriks rotasi menunjukkan kontribusi setiap variabel terhadap masing-masing komponen.

Variabel x5 dan x7 memiliki loading tertinggi pada PC4. Ini menunjukkan bahwa x5 dan x7 memiliki kontribusi signifikan terhadap PC4.

Variabel x8 dan x9 memiliki loading tertinggi pada PC2 masing-masing sebesar (0.76 dan 0.65) menunjukkan bahwa kedua variabel ini berkontribusi signifikan terhadap PC2.

#fviz_contrib(pca_res, choice = "ind", axes = 1:4)
fviz_eig(pca_res, addlabels = TRUE)

Berdasarkan tingkat pentingnya komponen, terlihat PC pertama memiliki nilai yang tinggi untuk proporsi variasi. Ini dibuktikan dari pengukuran nilai eigen yang besar untuk PC pertama dan kecil untuk PC selanjutnya, artinya PC pertama sesuai dengan arah dengan jumlah variasi maksimum dalam kumpulan data.

fviz_pca_var(pca_res,
             col.var = "cos2", # Color by the quality of representation
             gradient.cols = c("darkgreen", "darkblue", "red"),
             repel = TRUE
             )

Melalui output di atas, dapat digambarkan kualitas variabel. Variabel yang memiliki korelasi positif dikelompokkan bersama-sama sedangkan variabel dengan korelasi negatif akan ditempatkan di sisi berlawanan dari asal plot. Jarak antara variabel yang jauh dari asal direpresentasikan dengan baik.

Dari gambar tersebut terlihat variabel x7 memiliki nilai cos2 yang paling rendah, yang menunjukkan bahwa variabel tersebut tidak sepenuhnya direpresentasikan oleh PC.

Jika variabel digambarkan dekat dengan pusat lingkaran, maka variabel tersebut kurang penting untuk komponen pertama.

# Visualize PCA with clusters
fviz_pca_ind(pca_res,
             geom.ind = "point", 
             col.ind = as.factor(kmeans_clustering$cluster), 
             palette = "jco",
             addEllipses = TRUE, 
             legend.title = "Cluster",
             title = "PCA - Cluster Plot")

9 References

[1] Badan Pusat Statistik (BPS). (2021). Laporan Indeks Khusus Penanganan Stunting. Jakarta: BPS.

[2] Dubes, R. C., & Jain, A. K. (1988). Algorithms for Clustering Data. Prentice-Hall.

[2] Gujarati, D. N. (1995). Ekonometrika Dasar. Jakarta: Erlangga.

[3] Hair, J. F., dkk. (2006). Multivariate Data Analysis Sixth Edition. New Jersey: Pearson Education Inc.

[4] Johnson, N. & Wichern, D. (2002). Applied Multivariate Statistical Analysis. Prentice-Hall.


Direktorat Statistik Kesejahteraan Rakyat, BPS,