IMPORT DATA
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.4.3
## Warning: package 'ggplot2' was built under R version 4.4.3
## Warning: package 'tidyr' was built under R version 4.4.3
## Warning: package 'readr' was built under R version 4.4.3
## Warning: package 'purrr' was built under R version 4.4.3
## Warning: package 'dplyr' was built under R version 4.4.3
## Warning: package 'forcats' was built under R version 4.4.3
## Warning: package 'lubridate' was built under R version 4.4.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.2 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.0.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(cluster)
## Warning: package 'cluster' was built under R version 4.4.3
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.4.3
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
data <- read.csv("keadaan sd jatim 2023.csv", header = TRUE, sep = ";")
data
## Kabupaten.Kota Sekolah Siswa Mengulang Putus.Sekolah
## 1 Kab. Gresik 389 57111 37 90
## 2 Kab. Sidoarjo 464 108427 28 118
## 3 Kab. Mojokerto 385 54712 8 18
## 4 Kab. Jombang 475 61570 39 32
## 5 Kab. Bojonegoro 692 63700 24 26
## 6 Kab. Tuban 541 60257 18 23
## 7 Kab. Lamongan 597 44054 17 21
## 8 Kab. Madiun 401 34939 18 16
## 9 Kab. Ngawi 475 40483 10 42
## 10 Kab. Magetan 385 29401 15 11
## 11 Kab. Ponorogo 552 42603 15 18
## 12 Kab. Pacitan 408 30522 12 56
## 13 Kab. Kediri 611 79131 75 38
## 14 Kab. Nganjuk 573 63148 22 30
## 15 Kab. Blitar 634 56636 38 27
## 16 Kab. Tulungagung 569 54152 49 36
## 17 Kab. Trenggalek 417 36815 11 21
## 18 Kab. Malang 1061 150119 225 161
## 19 Kab. Pasuruan 657 105904 241 112
## 20 Kab. Probolinggo 574 63710 300 76
## 21 Kab. Lumajang 525 59638 50 67
## 22 Kab. Bondowoso 441 46650 69 91
## 23 Kab. Situbondo 397 39599 167 51
## 24 Kab. Jember 905 140604 183 282
## 25 Kab. Banyuwangi 747 92861 46 63
## 26 Kab. Pamekasan 411 49503 184 111
## 27 Kab. Sampang 513 63115 917 271
## 28 Kab. Sumenep 567 47479 192 350
## 29 Kab. Bangkalan 617 90683 931 208
## 30 Kota Surabaya 284 129711 113 74
## 31 Kota Malang 195 47557 60 13
## 32 Kota Madiun 52 10762 2 3
## 33 Kota Kediri 111 18008 8 0
## 34 Kota Mojokerto 44 8101 1 0
## 35 Kota Blitar 48 8749 13 0
## 36 Kota Pasuruan 46 12706 7 2
## 37 Kota Probolinggo 75 15958 23 13
## 38 Kota Batu 64 11442 4 8
## 39 Kab. Gresik 72 16163 3 16
## 40 Kab. Sidoarjo 121 34715 4 19
## 41 Kab. Mojokerto 34 5192 0 1
## 42 Kab. Jombang 47 7805 14 10
## 43 Kab. Bojonegoro 19 3982 2 1
## 44 Kab. Tuban 26 5711 2 1
## 45 Kab. Lamongan 41 5683 1 1
## 46 Kab. Madiun 4 1359 0 0
## 47 Kab. Ngawi 30 5820 0 0
## 48 Kab. Magetan 17 5605 0 0
## 49 Kab. Ponorogo 21 6815 1 1
## 50 Kab. Pacitan 10 2846 0 3
## 51 Kab. Kediri 89 16130 1 15
## 52 Kab. Nganjuk 35 6173 0 2
## 53 Kab. Blitar 31 6586 1 0
## 54 Kab. Tulungagung 63 11118 2 7
## 55 Kab. Trenggalek 21 3719 0 22
## 56 Kab. Malang 92 19466 13 32
## 57 Kab. Pasuruan 67 11644 15 13
## 58 Kab. Probolinggo 52 6665 15 4
## 59 Kab. Lumajang 32 5864 7 2
## 60 Kab. Bondowoso 23 3328 6 6
## 61 Kab. Situbondo 29 4430 2 8
## 62 Kab. Jember 143 21832 37 63
## 63 Kab. Banyuwangi 60 11625 3 2
## 64 Kab. Pamekasan 64 8490 4 20
## 65 Kab. Sampang 113 9239 173 122
## 66 Kab. Sumenep 84 6347 26 170
## 67 Kab. Bangkalan 66 7213 48 46
## 68 Kota Surabaya 366 88522 82 131
## 69 Kota Malang 90 22089 50 10
## 70 Kota Madiun 16 2862 0 10
## 71 Kota Kediri 27 7004 2 2
## 72 Kota Mojokerto 11 3293 0 1
## 73 Kota Blitar 15 3774 0 1
## 74 Kota Pasuruan 21 5040 6 3
## 75 Kota Probolinggo 11 2405 0 2
## 76 Kota Batu 15 3775 2 1
## Kepala.Sekolah...Guru Tenaga.Kependidikan Rombel Ruang.Kelas.Rusak.Berat
## 1 3810 365 2929 651
## 2 6078 438 4499 182
## 3 3596 177 2584 416
## 4 3454 200 3093 181
## 5 5003 135 4321 536
## 6 4238 275 3466 350
## 7 4789 75 3648 196
## 8 2827 300 2458 481
## 9 3960 251 2960 421
## 10 2909 182 2372 182
## 11 3777 291 3385 603
## 12 3362 259 2478 671
## 13 4915 224 4160 290
## 14 4602 311 3682 890
## 15 4563 194 3944 429
## 16 5219 282 3562 439
## 17 3030 360 2565 171
## 18 7976 334 6998 607
## 19 5764 688 4680 528
## 20 3989 402 3708 814
## 21 3320 230 3395 142
## 22 4353 326 2988 237
## 23 3819 294 2608 222
## 24 6919 712 6632 1138
## 25 5798 368 4979 615
## 26 4233 220 2786 448
## 27 3959 40 3286 337
## 28 5609 226 3619 645
## 29 4829 290 4239 749
## 30 5595 755 4521 53
## 31 2341 294 1859 136
## 32 658 157 471 46
## 33 1037 141 727 24
## 34 470 107 303 39
## 35 507 61 368 31
## 36 750 98 505 16
## 37 771 145 619 44
## 38 729 75 534 21
## 39 761 75 725 28
## 40 2043 236 1463 7
## 41 348 22 263 6
## 42 468 43 380 0
## 43 165 10 183 3
## 44 333 34 256 0
## 45 351 24 311 6
## 46 54 7 56 0
## 47 324 35 266 4
## 48 209 19 224 0
## 49 357 44 272 11
## 50 150 15 121 4
## 51 727 52 767 0
## 52 295 32 298 1
## 53 359 21 312 1
## 54 734 50 535 12
## 55 196 25 182 0
## 56 936 58 850 2
## 57 626 53 530 19
## 58 400 28 383 23
## 59 371 42 275 2
## 60 236 18 170 6
## 61 306 13 246 11
## 62 1239 103 1100 50
## 63 569 33 506 3
## 64 481 30 452 49
## 65 523 9 623 56
## 66 657 21 547 50
## 67 370 28 412 32
## 68 5267 564 3869 6
## 69 1387 191 984 10
## 70 135 23 136 0
## 71 441 61 304 0
## 72 223 36 138 0
## 73 224 41 168 6
## 74 273 41 217 0
## 75 128 21 107 0
## 76 216 27 162 0
## Ruang.Kelas.Rusak.Sedang Ruang.Kelas.Rusak.Ringan Ruang.Kelas.Baik
## 1 577 957 706
## 2 260 1217 2534
## 3 520 985 1006
## 4 789 1062 1229
## 5 831 1384 1713
## 6 551 1327 1534
## 7 1384 1257 965
## 8 493 674 982
## 9 845 1111 733
## 10 545 1052 755
## 11 674 1151 1082
## 12 370 658 816
## 13 1204 1426 1619
## 14 769 970 1271
## 15 691 1590 1486
## 16 822 1158 1361
## 17 648 892 1018
## 18 914 2855 2946
## 19 702 1590 1880
## 20 688 1225 1145
## 21 798 1407 1229
## 22 683 944 1202
## 23 780 1021 705
## 24 998 1849 3055
## 25 969 1957 1805
## 26 736 895 923
## 27 1012 1018 1086
## 28 878 1373 790
## 29 1005 1378 804
## 30 152 911 2996
## 31 185 416 1237
## 32 64 86 290
## 33 235 198 305
## 34 44 95 149
## 35 40 113 231
## 36 56 164 341
## 37 49 113 429
## 38 93 133 299
## 39 22 187 524
## 40 56 226 1329
## 41 24 63 176
## 42 27 66 305
## 43 6 85 103
## 44 8 46 200
## 45 31 104 172
## 46 0 36 17
## 47 16 71 183
## 48 16 81 157
## 49 11 29 242
## 50 5 39 75
## 51 25 157 645
## 52 5 48 246
## 53 10 56 270
## 54 29 148 395
## 55 3 66 122
## 56 39 179 659
## 57 46 169 315
## 58 67 158 140
## 59 7 54 222
## 60 21 32 119
## 61 20 76 157
## 62 76 315 726
## 63 19 139 359
## 64 76 126 251
## 65 141 260 148
## 66 138 182 171
## 67 99 102 169
## 68 71 542 3601
## 69 19 132 870
## 70 2 15 127
## 71 11 83 225
## 72 0 19 126
## 73 6 55 105
## 74 12 60 159
## 75 0 45 68
## 76 0 33 144
## Total.Ruang.Kelas Status
## 1 2891 Negeri
## 2 4193 Negeri
## 3 2927 Negeri
## 4 3261 Negeri
## 5 4464 Negeri
## 6 3762 Negeri
## 7 3802 Negeri
## 8 2630 Negeri
## 9 3110 Negeri
## 10 2534 Negeri
## 11 3510 Negeri
## 12 2515 Negeri
## 13 4539 Negeri
## 14 3900 Negeri
## 15 4196 Negeri
## 16 3780 Negeri
## 17 2729 Negeri
## 18 7322 Negeri
## 19 4700 Negeri
## 20 3872 Negeri
## 21 3576 Negeri
## 22 3066 Negeri
## 23 2728 Negeri
## 24 7040 Negeri
## 25 5346 Negeri
## 26 3002 Negeri
## 27 3453 Negeri
## 28 3686 Negeri
## 29 3936 Negeri
## 30 4112 Negeri
## 31 1974 Negeri
## 32 486 Negeri
## 33 762 Negeri
## 34 327 Negeri
## 35 415 Negeri
## 36 577 Negeri
## 37 635 Negeri
## 38 546 Negeri
## 39 761 Swasta
## 40 1618 Swasta
## 41 269 Swasta
## 42 398 Swasta
## 43 197 Swasta
## 44 254 Swasta
## 45 313 Swasta
## 46 53 Swasta
## 47 274 Swasta
## 48 254 Swasta
## 49 293 Swasta
## 50 123 Swasta
## 51 827 Swasta
## 52 300 Swasta
## 53 337 Swasta
## 54 584 Swasta
## 55 191 Swasta
## 56 879 Swasta
## 57 549 Swasta
## 58 388 Swasta
## 59 285 Swasta
## 60 178 Swasta
## 61 264 Swasta
## 62 1167 Swasta
## 63 520 Swasta
## 64 502 Swasta
## 65 605 Swasta
## 66 541 Swasta
## 67 402 Swasta
## 68 4220 Swasta
## 69 1031 Swasta
## 70 144 Swasta
## 71 319 Swasta
## 72 145 Swasta
## 73 172 Swasta
## 74 231 Swasta
## 75 113 Swasta
## 76 177 Swasta
cat("Jumlah baris:", nrow(data), "\n")
## Jumlah baris: 76
cat("Nama kolom:\n")
## Nama kolom:
print(names(data))
## [1] "Kabupaten.Kota" "Sekolah"
## [3] "Siswa" "Mengulang"
## [5] "Putus.Sekolah" "Kepala.Sekolah...Guru"
## [7] "Tenaga.Kependidikan" "Rombel"
## [9] "Ruang.Kelas.Rusak.Berat" "Ruang.Kelas.Rusak.Sedang"
## [11] "Ruang.Kelas.Rusak.Ringan" "Ruang.Kelas.Baik"
## [13] "Total.Ruang.Kelas" "Status"
Analisis Statistika Diskriptif
str(data)
## 'data.frame': 76 obs. of 14 variables:
## $ Kabupaten.Kota : chr "Kab. Gresik" "Kab. Sidoarjo" "Kab. Mojokerto" "Kab. Jombang" ...
## $ Sekolah : int 389 464 385 475 692 541 597 401 475 385 ...
## $ Siswa : int 57111 108427 54712 61570 63700 60257 44054 34939 40483 29401 ...
## $ Mengulang : int 37 28 8 39 24 18 17 18 10 15 ...
## $ Putus.Sekolah : int 90 118 18 32 26 23 21 16 42 11 ...
## $ Kepala.Sekolah...Guru : int 3810 6078 3596 3454 5003 4238 4789 2827 3960 2909 ...
## $ Tenaga.Kependidikan : int 365 438 177 200 135 275 75 300 251 182 ...
## $ Rombel : int 2929 4499 2584 3093 4321 3466 3648 2458 2960 2372 ...
## $ Ruang.Kelas.Rusak.Berat : int 651 182 416 181 536 350 196 481 421 182 ...
## $ Ruang.Kelas.Rusak.Sedang: int 577 260 520 789 831 551 1384 493 845 545 ...
## $ Ruang.Kelas.Rusak.Ringan: int 957 1217 985 1062 1384 1327 1257 674 1111 1052 ...
## $ Ruang.Kelas.Baik : int 706 2534 1006 1229 1713 1534 965 982 733 755 ...
## $ Total.Ruang.Kelas : int 2891 4193 2927 3261 4464 3762 3802 2630 3110 2534 ...
## $ Status : chr "Negeri" "Negeri" "Negeri" "Negeri" ...
summary(data)
## Kabupaten.Kota Sekolah Siswa Mengulang
## Length:76 Min. : 4.0 Min. : 1359 Min. : 0.00
## Class :character 1st Qu.: 33.5 1st Qu.: 6304 1st Qu.: 2.00
## Mode :character Median : 89.5 Median : 16146 Median : 13.00
## Mean : 249.7 Mean : 33301 Mean : 61.76
## 3rd Qu.: 466.8 3rd Qu.: 54292 3rd Qu.: 46.50
## Max. :1061.0 Max. :150119 Max. :931.00
## Putus.Sekolah Kepala.Sekolah...Guru Tenaga.Kependidikan Rombel
## Min. : 0.00 Min. : 54.0 Min. : 7.00 Min. : 56.0
## 1st Qu.: 2.00 1st Qu.: 358.5 1st Qu.: 32.75 1st Qu.: 301.8
## Median : 16.00 Median : 766.0 Median : 86.50 Median : 726.0
## Mean : 43.78 Mean :2190.0 Mean :164.04 Mean :1772.7
## 3rd Qu.: 52.25 3rd Qu.:3967.2 3rd Qu.:263.00 3rd Qu.:3310.8
## Max. :350.00 Max. :7976.0 Max. :755.00 Max. :6998.0
## Ruang.Kelas.Rusak.Berat Ruang.Kelas.Rusak.Sedang Ruang.Kelas.Rusak.Ringan
## Min. : 0.0 Min. : 0.0 Min. : 15.00
## 1st Qu.: 4.0 1st Qu.: 19.0 1st Qu.: 79.75
## Median : 35.5 Median : 73.5 Median : 180.50
## Mean : 189.3 Mean : 318.7 Mean : 564.42
## 3rd Qu.: 340.2 3rd Qu.: 684.2 3rd Qu.:1028.75
## Max. :1138.0 Max. :1384.0 Max. :2855.00
## Ruang.Kelas.Baik Total.Ruang.Kelas Status
## Min. : 17.0 Min. : 53.0 Length:76
## 1st Qu.: 175.0 1st Qu.: 309.8 Class :character
## Median : 476.5 Median : 761.5 Mode :character
## Mean : 772.1 Mean :1844.5
## 3rd Qu.:1100.8 3rd Qu.:3467.2
## Max. :3601.0 Max. :7322.0
Cek missing value
mv <- colSums(is.na(data))
print(mv)
## Kabupaten.Kota Sekolah Siswa
## 0 0 0
## Mengulang Putus.Sekolah Kepala.Sekolah...Guru
## 0 0 0
## Tenaga.Kependidikan Rombel Ruang.Kelas.Rusak.Berat
## 0 0 0
## Ruang.Kelas.Rusak.Sedang Ruang.Kelas.Rusak.Ringan Ruang.Kelas.Baik
## 0 0 0
## Total.Ruang.Kelas Status
## 0 0
Memilih Kolom
library(dplyr)
data_cluster <- data %>%
select(Sekolah,
Siswa,
Mengulang,
Putus.Sekolah,
Kepala.Sekolah...Guru,
Tenaga.Kependidikan,
Ruang.Kelas.Rusak.Berat,
Ruang.Kelas.Rusak.Sedang,
Ruang.Kelas.Rusak.Ringan,
Ruang.Kelas.Baik,
Total.Ruang.Kelas,
Status)
colSums(is.na(data_cluster))
## Sekolah Siswa Mengulang
## 0 0 0
## Putus.Sekolah Kepala.Sekolah...Guru Tenaga.Kependidikan
## 0 0 0
## Ruang.Kelas.Rusak.Berat Ruang.Kelas.Rusak.Sedang Ruang.Kelas.Rusak.Ringan
## 0 0 0
## Ruang.Kelas.Baik Total.Ruang.Kelas Status
## 0 0 0
EDA
library(ggplot2)
library(tidyr)
data_long <- data_cluster %>%
select(where(is.numeric)) %>%
pivot_longer(cols = everything(), names_to = "Variabel", values_to = "Nilai")
ggplot(data_long, aes(x = Nilai)) +
facet_wrap(~ Variabel, scales = "free", ncol = 3) +
geom_histogram(bins = 30, fill = "steelblue", color = "white") +
theme_minimal() +
labs(title = "Distribusi Setiap Variabel Numerik")

ggplot(data, aes(x = Status, fill = Status)) +
geom_bar() +
labs(title = "Distribusi Sekolah Berdasarkan Status", x = "Status Sekolah", y = "Jumlah Sekolah") +
theme_minimal() +
scale_fill_brewer(palette = "Paired")

Standarisasi
data_cluster_numeric <- data_cluster %>%
select(where(is.numeric))
data_scaled <- scale(data_cluster_numeric)
K-Means
Elbow Method
scaled_data <- scale(
data_cluster[, sapply(data_cluster, is.numeric)]
)
wss <- function(k) {
kmeans(scaled_data, centers = k, nstart = 10)$tot.withinss
}
k_values <- 1:10
wss_values <- sapply(k_values, wss)
plot(k_values, wss_values, type = "b",
xlab = "Jumlah Klaster (k)",
ylab = "Total Within Sum of Squares",
main = "Metode Elbow untuk Menentukan K")

set.seed(123)
kmeans_result <- kmeans(data_scaled, centers = 3, nstart = 25)
data_cluster$Cluster <- as.factor(kmeans_result$cluster)
install.packages("factoextra")
## Warning: package 'factoextra' is in use and will not be installed
library(factoextra)
fviz_cluster(kmeans_result, data = data_scaled,
geom = "point",
ellipse.type = "convex",
labelsize = 8)

table(data_cluster$Cluster)
##
## 1 2 3
## 26 44 6
Silhouette Score
library(cluster)
silhouette_kmeans <- silhouette(kmeans_result$cluster, dist(data_scaled))
fviz_silhouette(silhouette_kmeans)
## cluster size ave.sil.width
## 1 1 26 0.41
## 2 2 44 0.83
## 3 3 6 0.05

Davies-Bouldin Index (DBI)
library(clusterSim)
## Warning: package 'clusterSim' was built under R version 4.4.3
## Loading required package: MASS
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
db_index <- index.DB(data_scaled, kmeans_result$cluster)$DB
cat("Davies-Bouldin Index:", db_index, "\n")
## Davies-Bouldin Index: 1.087653
data_final <- cbind(data_cluster, Cluster = kmeans_result$cluster)
write.csv(data_final, "Hasil cluster Kmeans.csv", row.names = FALSE)
cat("Hasil klasterisasi telah disimpan dalam file 'Hasil cluster Kmeans.csv'")
## Hasil klasterisasi telah disimpan dalam file 'Hasil cluster Kmeans.csv'
Fuzzy C-Means
library(ppclust)
## Warning: package 'ppclust' was built under R version 4.4.3
set.seed(123)
fcm_result <- fcm(data_scaled, centers = 3, m = 2)
# Pusat klaster
print(fcm_result$centers)
## NULL
# Derajat keanggotaan
membership_matrix <- fcm_result$u
head(membership_matrix)
## Cluster 1 Cluster 2 Cluster 3
## 1 0.7543644 0.08291941 0.16271616
## 2 0.3535583 0.09156661 0.55487513
## 3 0.8624167 0.07285403 0.06472927
## 4 0.8803295 0.05173979 0.06793068
## 5 0.7123368 0.06615723 0.22150600
## 6 0.8818301 0.03522679 0.08294309
cluster_assignments <- apply(membership_matrix, 1, which.max)
data_cluster$Cluster_FCM <- as.factor(cluster_assignments)
fcm_ppclust <- ppclust2(fcm_result, "kmeans")
fviz_cluster(fcm_ppclust, data = data_scaled,
ellipse.type = "convex",
geom = "point",
main = "Fuzzy C-Means Clustering",
labelsize = 8)

Silhouette Score
silhouette_fcm <- silhouette(cluster_assignments, dist(data_scaled))
fviz_silhouette(silhouette_fcm)
## cluster size ave.sil.width
## 1 1 22 0.49
## 2 2 44 0.82
## 3 3 10 -0.04

Davies-Bouldin Index (DBI)
db_index_fcm <- index.DB(data_scaled, cluster_assignments)$DB
cat("Davies-Bouldin Index for FCM:", db_index_fcm, "\n")
## Davies-Bouldin Index for FCM: 1.202335
data_final_fcm <- cbind(data_cluster, Cluster_FCM = cluster_assignments)
write.csv(data_final_fcm, "Hasil cluster FCM.csv", row.names = FALSE)
cat("Hasil klasterisasi FCM telah disimpan dalam file 'Hasil cluster FCM.csv'")
## Hasil klasterisasi FCM telah disimpan dalam file 'Hasil cluster FCM.csv'
Meanshift
library(LPCM)
## Warning: package 'LPCM' was built under R version 4.4.3
##
## Attaching package: 'LPCM'
## The following object is masked from 'package:lubridate':
##
## ms
data_for_meanshift <- data_scaled
meanshift_result <- ms(data_for_meanshift, h = 1.0)

clusters_ms <- meanshift_result$cluster.label
data_cluster$Cluster_MS <- as.factor(clusters_ms)
library(factoextra)
fviz_cluster(list(data = data_scaled, cluster = clusters_ms),
geom = "point",
ellipse.type = "convex",
labelsize = 8,
main = "Visualisasi Clustering - MeanShift")

Silhouette Score
silhouette_ms <- silhouette(clusters_ms, dist(data_scaled))
Davies-Bouldin Index (DBI)
db_index_ms <- index.DB(data_scaled, clusters_ms)$DB
## Warning in max(R[i, ][is.finite(R[i, ])]): no non-missing arguments to max;
## returning -Inf
cat("Davies-Bouldin Index for MeanShift:", db_index_ms, "\n")
## Davies-Bouldin Index for MeanShift: NaN
data_final_ms <- cbind(data_cluster, Cluster_MeanShift = clusters_ms)
write.csv(data_final_ms, "Hasil cluster MeanShift.csv", row.names = FALSE)
cat("Hasil klasterisasi MeanShift telah disimpan dalam file 'Hasil cluster MeanShift.csv'")
## Hasil klasterisasi MeanShift telah disimpan dalam file 'Hasil cluster MeanShift.csv'