library(ggplot2)
library(readr)
library(dplyr)
library(ggfortify)
library(gridExtra)
library(readxl)
library(psych)
library(factoextra)
#### 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>
#### 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
# 1. Normalisasi data numerik (mean = 0, sd = 1)
data_norm <- scale(data_numerik)
# 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
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 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
# 3. Hitung nilai eigen dan vektor eigen
eigen_result <- eigen(cov_matrix)
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
# 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
\[PC_1=-0,847Z_1 + -0,947Z_2 + -0,947Z_3 + -0,864Z_4 + -0,764Z_5 + -0,526Z_6\]
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
fviz_nbclust(pca_df, # gunakan data frame dengan kolom PC1
kmeans,
method = "wss",
k.max = 10,
nstart = 25) +
labs(title = "Elbow Method Berdasarkan PCA")
fviz_nbclust(pca_df, # gunakan data frame dengan kolom PC1
kmeans,
method = "silhouette",
k.max = 10,
nstart = 25) +
labs(title = "silhouette Method Berdasarkan PCA")
# 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
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
# 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)
# 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
## 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()
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()
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
# 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
# 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)")
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)")
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) |