Library

library(ggplot2)    
library(readr)      
library(dplyr)      
library(ggfortify)  
library(gridExtra) 
library(readxl)
library(psych)
library(factoextra)

Data yang digunakan

#### Data ####
data <- read_excel("D:/Files/Data Anmul.xlsx", 
                   col_types = c("text", "numeric", "numeric", "numeric", 
                                 "numeric", "numeric", "numeric"))

head(data)
## # A tibble: 6 × 7
##   Kabupaten    `UHH (X1)` `HLS (X2)` `RLS (X3)` `Per Kapita (X4)`
##   <chr>             <dbl>      <dbl>      <dbl>             <dbl>
## 1 Cilacap            74.7       12.7       7.39             11432
## 2 Banyumas           74.2       13.3       7.87             12492
## 3 Purbalingga        74.0       12.0       7.34             10964
## 4 Banjarnegara       74.5       11.8       6.86             10226
## 5 Kebumen            75.0       13.4       7.86              9734
## 6 Purworejo          75.4       13.5       8.46             11110
## # ℹ 2 more variables: `Penduduk Miskin(%) (X5)` <dbl>,
## #   `Tenaga Kesehatan (X6)` <dbl>

Statistik Deskriptif

#### Statistika Deskriptif ####
# Pilih hanya kolom numerik
data_numerik <- data %>% select_if(is.numeric)
data_numerik
## # A tibble: 35 × 6
##    `UHH (X1)` `HLS (X2)` `RLS (X3)` `Per Kapita (X4)` `Penduduk Miskin(%) (X5)`
##         <dbl>      <dbl>      <dbl>             <dbl>                     <dbl>
##  1       74.7       12.7       7.39             11432                     11.0 
##  2       74.2       13.3       7.87             12492                     12.5 
##  3       74.0       12.0       7.34             10964                     15.0 
##  4       74.5       11.8       6.86             10226                     14.9 
##  5       75.0       13.4       7.86              9734                     16.3 
##  6       75.4       13.5       8.46             11110                     11.3 
##  7       74.0       11.8       6.89             11577                     15.6 
##  8       74.4       12.6       7.82             10493                     11.0 
##  9       76.2       12.7       8.09             13716                      9.81
## 10       77.1       13.4       9.27             12968                     12.3 
## # ℹ 25 more rows
## # ℹ 1 more variable: `Tenaga Kesehatan (X6)` <dbl>
# mean, standar deviasi, nilai maksimum, dan minimum
means <- sapply(data_numerik, mean)
sds <- sapply(data_numerik, sd)
maxs <- sapply(data_numerik, max)
mins <- sapply(data_numerik, min)
# Tabel Statistika Deskriptif
deskriptif_t <- rbind(Min = mins, Max = maxs, Mean = means, StDev = sds)
print(round(deskriptif_t, 4))
##       UHH (X1) HLS (X2) RLS (X3) Per Kapita (X4) Penduduk Miskin(%) (X5)
## Min    73.9500  11.8000   6.4000         9587.00                  4.2300
## Max    77.9300  15.5500  11.2400        16650.00                 16.3400
## Mean   75.5494  13.0483   8.2546        12024.43                 10.3969
## StDev   1.3224   0.9129   1.3100         1796.66                  3.2647
##       Tenaga Kesehatan (X6)
## Min                1730.000
## Max               13929.000
## Mean               3649.943
## StDev              2283.232

Principal Component Analysis

Normalisasi Data

# 1. Normalisasi data numerik (mean = 0, sd = 1)
data_norm <- scale(data_numerik)

Koefisien Korelasi

# 2. Koefisien Korelasi
cov_matrix <- cov(data_norm)
cov_matrix
##                           UHH (X1)   HLS (X2)   RLS (X3) Per Kapita (X4)
## UHH (X1)                 1.0000000  0.7762180  0.8026797       0.5990208
## HLS (X2)                 0.7762180  1.0000000  0.9061398       0.7711449
## RLS (X3)                 0.8026797  0.9061398  1.0000000       0.8088042
## Per Kapita (X4)          0.5990208  0.7711449  0.8088042       1.0000000
## Penduduk Miskin(%) (X5) -0.5869470 -0.6381257 -0.6946812      -0.6053703
## Tenaga Kesehatan (X6)    0.3372269  0.5359939  0.3483334       0.4347980
##                         Penduduk Miskin(%) (X5) Tenaga Kesehatan (X6)
## UHH (X1)                             -0.5869470             0.3372269
## HLS (X2)                             -0.6381257             0.5359939
## RLS (X3)                             -0.6946812             0.3483334
## Per Kapita (X4)                      -0.6053703             0.4347980
## Penduduk Miskin(%) (X5)               1.0000000            -0.1861587
## Tenaga Kesehatan (X6)                -0.1861587             1.0000000

Uji Asumsi Multikolinearitas

# Uji Asumsi Multikolinearitas
cov_matrix <- cov(data_norm)
cov_matrix
##                           UHH (X1)   HLS (X2)   RLS (X3) Per Kapita (X4)
## UHH (X1)                 1.0000000  0.7762180  0.8026797       0.5990208
## HLS (X2)                 0.7762180  1.0000000  0.9061398       0.7711449
## RLS (X3)                 0.8026797  0.9061398  1.0000000       0.8088042
## Per Kapita (X4)          0.5990208  0.7711449  0.8088042       1.0000000
## Penduduk Miskin(%) (X5) -0.5869470 -0.6381257 -0.6946812      -0.6053703
## Tenaga Kesehatan (X6)    0.3372269  0.5359939  0.3483334       0.4347980
##                         Penduduk Miskin(%) (X5) Tenaga Kesehatan (X6)
## UHH (X1)                             -0.5869470             0.3372269
## HLS (X2)                             -0.6381257             0.5359939
## RLS (X3)                             -0.6946812             0.3483334
## Per Kapita (X4)                      -0.6053703             0.4347980
## Penduduk Miskin(%) (X5)               1.0000000            -0.1861587
## Tenaga Kesehatan (X6)                -0.1861587             1.0000000

Analisis Factor (Kayser Mayer Olkin KMO)

# Uji Asumsi Kayser Mayer Olkin
kmo_result <- KMO(data_norm)
print(kmo_result)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = data_norm)
## Overall MSA =  0.81
## MSA for each item = 
##                UHH (X1)                HLS (X2)                RLS (X3) 
##                    0.91                    0.79                    0.75 
##         Per Kapita (X4) Penduduk Miskin(%) (X5)   Tenaga Kesehatan (X6) 
##                    0.87                    0.95                    0.59

Matriks Varians dan Kovarians

# 3. Hitung nilai eigen dan vektor eigen
eigen_result <- eigen(cov_matrix)

Nilai Eigen dan Vektor Eigen

Nilai eigen (\(\lambda\))

eigen_values <- eigen_result$values
cat("Nilai Eigen:\n")
## Nilai Eigen:
print(round(eigen_values, 5))
## [1] 4.11667 0.87010 0.42464 0.35805 0.16836 0.06219

Vektor eigen (\(\overrightarrow{v}\))

eigen_vectors <- eigen_result$vectors
cat("Vektor Eigen:\n")
## Vektor Eigen:
print(round(eigen_vectors, 5))
##          [,1]     [,2]     [,3]     [,4]     [,5]     [,6]
## [1,] -0.41722 -0.13244  0.68141 -0.27011  0.51344 -0.08659
## [2,] -0.46665  0.08940  0.14162  0.06459 -0.61325 -0.61150
## [3,] -0.46657 -0.15692  0.13777  0.22327 -0.35878  0.74842
## [4,] -0.42603  0.03175 -0.37053  0.65686  0.47227 -0.16029
## [5,]  0.37636  0.41345  0.58125  0.58920 -0.04618  0.01640
## [6,] -0.25946  0.88198 -0.14666 -0.30723  0.08007  0.18022

Komponen Korelasi

# 4. Komponen Korelasi (Loading Matrix) #
loading_matrix <- eigen_vectors %*% diag(sqrt(eigen_values))
# Beri nama baris dan kolom sesuai variabel dan komponen utama
rownames(loading_matrix) <- colnames(data_norm)
colnames(loading_matrix) <- paste0("PC", 1:ncol(loading_matrix))
cat("Komponen Korelasi (Loading Matrix):\n")
## Komponen Korelasi (Loading Matrix):
print(round(loading_matrix, 3))
##                            PC1    PC2    PC3    PC4    PC5    PC6
## UHH (X1)                -0.847 -0.124  0.444 -0.162  0.211 -0.022
## HLS (X2)                -0.947  0.083  0.092  0.039 -0.252 -0.152
## RLS (X3)                -0.947 -0.146  0.090  0.134 -0.147  0.187
## Per Kapita (X4)         -0.864  0.030 -0.241  0.393  0.194 -0.040
## Penduduk Miskin(%) (X5)  0.764  0.386  0.379  0.353 -0.019  0.004
## Tenaga Kesehatan (X6)   -0.526  0.823 -0.096 -0.184  0.033  0.045

Persamaan Principal Component

\[PC_1=-0,847Z_1 + -0,947Z_2 + -0,947Z_3 + -0,864Z_4 + -0,764Z_5 + -0,526Z_6\]

K-Means dengan PCA

Transformasi Data Set melalui Principal Component Analysis (PCA)

pca_scores <- data_norm %*% eigen_vectors
pca_df <- as.data.frame(pca_scores[, 1])
pca_df
##    pca_scores[, 1]
## 1       0.87423778
## 2       0.16624472
## 3       2.21961815
## 4       2.52949465
## 5       1.31228510
## 6       0.18696159
## 7       2.50405631
## 8       1.28507448
## 9      -0.39425673
## 10     -1.17420253
## 11     -2.22315008
## 12      0.69526786
## 13     -1.28594030
## 14      0.03735791
## 15      1.12929170
## 16      1.56449909
## 17      1.61669272
## 18     -0.12743070
## 19     -1.27673564
## 20     -0.23076963
## 21      0.33565787
## 22     -0.53895854
## 23      0.89143266
## 24      0.29385206
## 25      1.48551044
## 26      1.31367357
## 27      2.79528972
## 28      0.83394408
## 29      2.23678860
## 30     -2.92111017
## 31     -4.24105389
## 32     -4.57690303
## 33     -5.85180284
## 34     -0.67468895
## 35     -0.79022803

Penentuan Jumlah Klaster Optimal

Metode Elbow

fviz_nbclust(pca_df,  # gunakan data frame dengan kolom PC1
             kmeans, 
             method = "wss",
             k.max = 10,
             nstart = 25) +
  labs(title = "Elbow Method Berdasarkan PCA")

Metode Silhoutte

fviz_nbclust(pca_df,  # gunakan data frame dengan kolom PC1
             kmeans, 
             method = "silhouette",
             k.max = 10,
             nstart = 25) +
  labs(title = "silhouette Method Berdasarkan PCA")

Proses K-Means Cluster terhadap PCA dengan k Optimal

Menghitung Jarak Euclid Data Pengamatan terhadap Pusat Cluster k = 3

# kolom PCA adalah "PC1"
colnames(pca_df)[1] <- "PC1"
# kolom No 
data$No <- 1:nrow(data)
# Misal pca_df adalah data PCA yang sudah memiliki kolom PC1
# Lakukan clustering k = 3
set.seed(123)
kmeans_3 <- kmeans(pca_df[, "PC1", drop = FALSE], centers = 3, nstart = 25)
# Ambil pusat (centroid) dari setiap cluster
centers_k3 <- kmeans_3$centers
# Tampilkan hasil pusat cluster
print(centers_k3)
##          PC1
## 1 -4.3977175
## 2  1.5804473
## 3 -0.5130858
# Ambil pusat cluster
centers_k3 <- kmeans_3$centers
# Hitung jarak Euclidean dari tiap data ke masing-masing pusat cluster
euclid_distances <- sapply(1:3, function(k) {
  abs(pca_df$PC1 - centers_k3[k])  # Karena 1 dimensi, cukup ambil selisih absolut
})
# Ubah ke data frame dan beri nama kolom
euclid_df <- as.data.frame(euclid_distances)
colnames(euclid_df) <- paste0("Cluster_", 1:3)
# Tambahkan kolom nomor data
euclid_df$Data <- 1:nrow(euclid_df)
# Urutkan kolom agar sesuai dengan format tabel
euclid_df <- euclid_df[, c("Data", "Cluster_1", "Cluster_2", "Cluster_3")]
euclid_df
##    Data Cluster_1  Cluster_2  Cluster_3
## 1     1 5.2719553 0.70620953 1.38732357
## 2     2 4.5639622 1.41420258 0.67933052
## 3     3 6.6173356 0.63917084 2.73270394
## 4     4 6.9272121 0.94904734 3.04258044
## 5     5 5.7100026 0.26816220 1.82537090
## 6     6 4.5846791 1.39348572 0.70004738
## 7     7 6.9017738 0.92360901 3.01714211
## 8     8 5.6827920 0.29537283 1.79816028
## 9     9 4.0034608 1.97470403 0.11882907
## 10   10 3.2235150 2.75464984 0.66111673
## 11   11 2.1745674 3.80359739 1.71006428
## 12   12 5.0929853 0.88517944 1.20835366
## 13   13 3.1117772 2.86638761 0.77285450
## 14   14 4.4350754 1.54308940 0.55044371
## 15   15 5.5270092 0.45115561 1.64237750
## 16   16 5.9622166 0.01594822 2.07758489
## 17   17 6.0144102 0.03624541 2.12977852
## 18   18 4.2702868 1.70787800 0.38565510
## 19   19 3.1209818 2.85718294 0.76364984
## 20   20 4.1669479 1.81121693 0.28231617
## 21   21 4.7333754 1.24478943 0.84874367
## 22   22 3.8587589 2.11940584 0.02587274
## 23   23 5.2891501 0.68901465 1.40451845
## 24   24 4.6915695 1.28659525 0.80693786
## 25   25 5.8832279 0.09493686 1.99859624
## 26   26 5.7113911 0.26677374 1.82675937
## 27   27 7.1930072 1.21484241 3.30837552
## 28   28 5.2316616 0.74650323 1.34702988
## 29   29 6.6345061 0.65634129 2.74987440
## 30   30 1.4766073 4.50155748 2.40802438
## 31   31 0.1566636 5.82150120 3.72796809
## 32   32 0.1791855 6.15735034 4.06381723
## 33   33 1.4540854 7.43225014 5.33871704
## 34   34 3.7230285 2.25513625 0.16160315
## 35   35 3.6074894 2.37067534 0.27714224
# Tampilkan sebagian isi tabel seperti contoh
head(euclid_df, 10)
##    Data Cluster_1 Cluster_2 Cluster_3
## 1     1  5.271955 0.7062095 1.3873236
## 2     2  4.563962 1.4142026 0.6793305
## 3     3  6.617336 0.6391708 2.7327039
## 4     4  6.927212 0.9490473 3.0425804
## 5     5  5.710003 0.2681622 1.8253709
## 6     6  4.584679 1.3934857 0.7000474
## 7     7  6.901774 0.9236090 3.0171421
## 8     8  5.682792 0.2953728 1.7981603
## 9     9  4.003461 1.9747040 0.1188291
## 10   10  3.223515 2.7546498 0.6611167

Pengelompokkan Kabupaten/Kota Berdasarkan Hasil Clustering k = 3

set.seed(123)
kmeans_3 <- kmeans(pca_df[, "PC1", drop = FALSE], centers = 3, nstart = 25)

# Simpan hasil cluster
pca_df$Cluster_k3 <- kmeans_3$cluster
pca_df$Cluster_k3
##  [1] 2 3 2 2 2 3 2 2 3 3 3 2 3 3 2 2 2 3 3 3 3 3 2 3 2 2 2 2 2 1 1 1 1 3 3
data$Cluster_k3 <- kmeans_3$cluster
data$Cluster_k3
##  [1] 2 3 2 2 2 3 2 2 3 3 3 2 3 3 2 2 2 3 3 3 3 3 2 3 2 2 2 2 2 1 1 1 1 3 3
# Tampilkan daerah per cluster (berdasarkan No)
cat("Tabel Daerah Berdasarkan Cluster (k = 3):\n")
## Tabel Daerah Berdasarkan Cluster (k = 3):
for (i in 1:3) {
  anggota_cluster <- data$No[data$Cluster_k3 == i]
  cat(paste0("Cluster ", i, ": {", paste(anggota_cluster, collapse = ","), "}\n"))
}
## Cluster 1: {30,31,32,33}
## Cluster 2: {1,3,4,5,7,8,12,15,16,17,23,25,26,27,28,29}
## Cluster 3: {2,6,9,10,11,13,14,18,19,20,21,22,24,34,35}
# Tampilkan kabupaten per cluster
for (i in 1:3) {
  cat(paste0("\nCluster ", i, ":\n"))
  print(data %>% filter(Cluster_k3 == i) %>% select(No, Kabupaten))
}
## 
## Cluster 1:
## # A tibble: 4 × 2
##      No Kabupaten     
##   <int> <chr>         
## 1    30 Kota Magelang 
## 2    31 Kota Surakarta
## 3    32 Kota Salatiga 
## 4    33 Kota Semarang 
## 
## Cluster 2:
## # A tibble: 16 × 2
##       No Kabupaten   
##    <int> <chr>       
##  1     1 Cilacap     
##  2     3 Purbalingga 
##  3     4 Banjarnegara
##  4     5 Kebumen     
##  5     7 Wonosobo    
##  6     8 Magelang    
##  7    12 Wonogiri    
##  8    15 Grobogan    
##  9    16 Blora       
## 10    17 Rembang     
## 11    23 Temanggung  
## 12    25 Batang      
## 13    26 Pekalongan  
## 14    27 Pemalang    
## 15    28 Tegal       
## 16    29 Brebes      
## 
## Cluster 3:
## # A tibble: 15 × 2
##       No Kabupaten      
##    <int> <chr>          
##  1     2 Banyumas       
##  2     6 Purworejo      
##  3     9 Boyolali       
##  4    10 Klaten         
##  5    11 Sukoharjo      
##  6    13 Karanganyar    
##  7    14 Sragen         
##  8    18 Pati           
##  9    19 Kudus          
## 10    20 Jepara         
## 11    21 Demak          
## 12    22 Semarang       
## 13    24 Kendal         
## 14    34 Kota Pekalongan
## 15    35 Kota Tegal

Silhoutte Coefficient (SC)

# Pastikan semua library yang dibutuhkan sudah dipasang
library(cluster)
library(graphics)

# 1. Hitung jarak antar data berdasarkan PC1
dk <- dist(pca_df[, "PC1", drop = FALSE], method = "euclidean")

# 2. Hitung nilai silhouette menggunakan cluster dari hasil k-means
sik <- silhouette(data$Cluster_k3, dk)

# 3. Buat warna yang konsisten berdasarkan urutan cluster asli
# Pastikan warna urutannya sesuai nomor cluster asli (1, 2, 3)
warna_cluster <- c("red", "green", "blue")
warna_sik <- warna_cluster[as.numeric(factor(data$Cluster_k3, levels = sort(unique(data$Cluster_k3))))]

# 4. Plot silhouette
plot(sik,
     col = warna_sik[sort.list(data$Cluster_k3)], # urut warnanya sesuai label
     border = NA,
     main = "Silhouette Plot (K = 3, PCA - PC1)",
     cex.main = 1.2,
     cex.names = 0.9,
     cex.axis = 0.9)

K-Means Tanpa PCA

Analisis Korelasi Antar Variabel

# Pilih hanya kolom numerik
data_numerik <- data %>% select_if(is.numeric)
data_numerik
## # A tibble: 35 × 8
##    `UHH (X1)` `HLS (X2)` `RLS (X3)` `Per Kapita (X4)` `Penduduk Miskin(%) (X5)`
##         <dbl>      <dbl>      <dbl>             <dbl>                     <dbl>
##  1       74.7       12.7       7.39             11432                     11.0 
##  2       74.2       13.3       7.87             12492                     12.5 
##  3       74.0       12.0       7.34             10964                     15.0 
##  4       74.5       11.8       6.86             10226                     14.9 
##  5       75.0       13.4       7.86              9734                     16.3 
##  6       75.4       13.5       8.46             11110                     11.3 
##  7       74.0       11.8       6.89             11577                     15.6 
##  8       74.4       12.6       7.82             10493                     11.0 
##  9       76.2       12.7       8.09             13716                      9.81
## 10       77.1       13.4       9.27             12968                     12.3 
## # ℹ 25 more rows
## # ℹ 3 more variables: `Tenaga Kesehatan (X6)` <dbl>, No <int>, Cluster_k3 <int>
data_norm <- scale(data_numerik)
x=data_norm[,-6]
x[1:6,]
##        UHH (X1)   HLS (X2)   RLS (X3) Per Kapita (X4) Penduduk Miskin(%) (X5)
## [1,] -0.6196684 -0.4143564 -0.6599586      -0.3297388               0.1816825
## [2,] -1.0204650  0.2319019 -0.2935573       0.2602448               0.6533919
## [3,] -1.1868335 -1.1263359 -0.6981254      -0.5902222               1.4069016
## [4,] -0.7935990 -1.3454065 -1.0645267      -1.0009844               1.3793342
## [5,] -0.4306133  0.3523907 -0.3011906      -1.2748259               1.8204131
## [6,] -0.1356875  0.5276472  0.1568110      -0.5089603               0.2858261
##            No Cluster_k3
## [1,] -1.65903 -0.4648348
## [2,] -1.56144  1.0141851
## [3,] -1.46385 -0.4648348
## [4,] -1.36626 -0.4648348
## [5,] -1.26867 -0.4648348
## [6,] -1.17108  1.0141851
cor(data_norm[,1:6])
##                           UHH (X1)   HLS (X2)   RLS (X3) Per Kapita (X4)
## UHH (X1)                 1.0000000  0.7762180  0.8026797       0.5990208
## HLS (X2)                 0.7762180  1.0000000  0.9061398       0.7711449
## RLS (X3)                 0.8026797  0.9061398  1.0000000       0.8088042
## Per Kapita (X4)          0.5990208  0.7711449  0.8088042       1.0000000
## Penduduk Miskin(%) (X5) -0.5869470 -0.6381257 -0.6946812      -0.6053703
## Tenaga Kesehatan (X6)    0.3372269  0.5359939  0.3483334       0.4347980
##                         Penduduk Miskin(%) (X5) Tenaga Kesehatan (X6)
## UHH (X1)                             -0.5869470             0.3372269
## HLS (X2)                             -0.6381257             0.5359939
## RLS (X3)                             -0.6946812             0.3483334
## Per Kapita (X4)                      -0.6053703             0.4347980
## Penduduk Miskin(%) (X5)               1.0000000            -0.1861587
## Tenaga Kesehatan (X6)                -0.1861587             1.0000000

Menentukan k Optimal

Metode Elbow

## Elbow
library(factoextra)
# Misalnya data awal adalah 'data'
data_norm <- scale(data_numerik[, 1:6])           # Normalisasi
# Pastikan format data frame
# Plot Elbow
fviz_nbclust(data_norm, 
             kmeans, 
             method = "wss", 
             k.max = 10, 
             nstart = 25) +
  labs(title = "Elbow Method Non PCA") +
  theme_minimal()

Metode Silhoutte

fviz_nbclust(data_norm, kmeans, method='silhouette')

fviz_nbclust(data_norm, 
             kmeans, 
             method = "silhouette", 
             k.max = 10, 
             nstart = 25) +
  labs(title = "Silhouette Method Non PCA") +
  theme_minimal()

Pemodelan K-Means

Pusat Klaster (Cluster Centers Hasil K-Means k = 3)

kmean <- kmeans(data_norm, 3)
kmean$centers
##     UHH (X1)   HLS (X2)   RLS (X3) Per Kapita (X4) Penduduk Miskin(%) (X5)
## 1  1.7170518  2.4627709  2.1084070       2.3871545              -1.4151864
## 2  0.4566849  0.2421252  0.4036230       0.3091875              -0.4076479
## 3 -0.7059664 -0.6482465 -0.7282098      -0.6940750               0.6094281
##   Tenaga Kesehatan (X6)
## 1             1.8920797
## 2            -0.2238681
## 3            -0.1363657
# Tambahkan hasil kluster ke data asli
data$Cluster_k3 <- kmean$cluster

Pengelompokkan Kabupaten/Kota Berdasarkan Hasil Clustering k = 3

# Lihat anggota tiap kluster per kabupaten
library(dplyr)

data %>%
  select(Kabupaten = 1, Cluster_k3) %>%
  arrange(Cluster_k3)
## # A tibble: 35 × 2
##    Kabupaten      Cluster_k3
##    <chr>               <int>
##  1 Kota Surakarta          1
##  2 Kota Salatiga           1
##  3 Kota Semarang           1
##  4 Purworejo               2
##  5 Boyolali                2
##  6 Klaten                  2
##  7 Sukoharjo               2
##  8 Karanganyar             2
##  9 Sragen                  2
## 10 Pati                    2
## # ℹ 25 more rows
# Tampilkan anggota untuk masing-masing kluster
for (i in 1:3) {
  cat(paste("\nAnggota Kluster", i, ":\n"))
  print(data[data$Cluster_k3 == i, 1])
}
## 
## Anggota Kluster 1 :
## # A tibble: 3 × 1
##   Kabupaten     
##   <chr>         
## 1 Kota Surakarta
## 2 Kota Salatiga 
## 3 Kota Semarang 
## 
## Anggota Kluster 2 :
## # A tibble: 15 × 1
##    Kabupaten      
##    <chr>          
##  1 Purworejo      
##  2 Boyolali       
##  3 Klaten         
##  4 Sukoharjo      
##  5 Karanganyar    
##  6 Sragen         
##  7 Pati           
##  8 Kudus          
##  9 Jepara         
## 10 Demak          
## 11 Semarang       
## 12 Kendal         
## 13 Kota Magelang  
## 14 Kota Pekalongan
## 15 Kota Tegal     
## 
## Anggota Kluster 3 :
## # A tibble: 17 × 1
##    Kabupaten   
##    <chr>       
##  1 Cilacap     
##  2 Banyumas    
##  3 Purbalingga 
##  4 Banjarnegara
##  5 Kebumen     
##  6 Wonosobo    
##  7 Magelang    
##  8 Wonogiri    
##  9 Grobogan    
## 10 Blora       
## 11 Rembang     
## 12 Temanggung  
## 13 Batang      
## 14 Pekalongan  
## 15 Pemalang    
## 16 Tegal       
## 17 Brebes

Silhoutte Coefficient (SC) non-PCA

# Pastikan semua library yang dibutuhkan sudah dipasang
library(cluster)

# 1. Hitung matriks jarak antar data
# Gunakan data_norm (data sudah dinormalisasi, tanpa PCA)
dk <- dist(data_norm, method = "euclidean")

# 2. Gunakan hasil kmeans non-PCA yang sudah ada
# Hasil clustering ada di `kmean$cluster`
sik <- silhouette(kmean$cluster, dk)

# 3. Plot silhouette
plot(sik, 
     col = c("red", "green", "blue")[1:max(kmean$cluster)], 
     border = NA, 
     main = "Silhouette Plot K-Means (Non PCA)")

Evaluasi dan Perbandingan K-Means asli dan K-Means Klaster

library(knitr)

evaluasi <- data.frame(
  Metode = c("K-Means + PCA", "K-Means Non-PCA"),
  SC1 = c(0.56, 0.22),
  SC2 = c(0.60, 0.24),
  SC3 = c(0.55, 0.36),
  RataRataSC = c(0.58, 0.29),
  Evaluasi = c("Baik (stabil dan positif)", "Lemah (banyak SC rendah atau negatif)")
)
colnames(evaluasi)[1] <- "Metode Clustering"
colnames(evaluasi)[2] <- "SC Klaster 1"
colnames(evaluasi)[3] <- "SC Klaster 2"
colnames(evaluasi)[4] <- "SC Klaster 3"
colnames(evaluasi)[5] <- "Rata-rata SC"
colnames(evaluasi)[6] <- "Evaluasi Kualitas"

kable(evaluasi, caption = "Tabel Evaluasi dan Perbandingan Silhouette Coefficient (SC)")
Tabel Evaluasi dan Perbandingan Silhouette Coefficient (SC)
Metode Clustering SC Klaster 1 SC Klaster 2 SC Klaster 3 Rata-rata SC Evaluasi Kualitas
K-Means + PCA 0.56 0.60 0.55 0.58 Baik (stabil dan positif)
K-Means Non-PCA 0.22 0.24 0.36 0.29 Lemah (banyak SC rendah atau negatif)