Data

library(knitr)
df <- data.frame(
  Nama_Kecamatan = c("Mijen","Gunungpati","Banyumanik","Gajah Mungkur","Semarang Selatan","Candisari","Tembalang","Pedurungan","Genuk","Gayamsari","Semarang Timur","Semarang Utara","Semarang Tengah","Semarang Barat","Tugu","Ngaliyan"),
  Luas_Kecamatan = c(56.52,58.27,29.74,9.34,5.95,6.40,39.47,21.11,25.98,6.22,5.42,11.39,5.17,21.68,28.13,42.99),
  Jumlah_Penduduk = c(96357,102429,144087,56328,61981,75396,204865,198452,141033,70381,66482,117865,55213,149357,34398,147797),
  Jarak_ke_Pusat_Kota = c(18.70,16.70,10.60,3.10,4.70,8.20,13.40,7.50,10.20,5.60,3.60,3.10,1.10,3.10,8.20,8.20)
)

kable(df, caption = "Data Kecamatan Kota Semarang")
Data Kecamatan Kota Semarang
Nama_Kecamatan Luas_Kecamatan Jumlah_Penduduk Jarak_ke_Pusat_Kota
Mijen 56.52 96357 18.7
Gunungpati 58.27 102429 16.7
Banyumanik 29.74 144087 10.6
Gajah Mungkur 9.34 56328 3.1
Semarang Selatan 5.95 61981 4.7
Candisari 6.40 75396 8.2
Tembalang 39.47 204865 13.4
Pedurungan 21.11 198452 7.5
Genuk 25.98 141033 10.2
Gayamsari 6.22 70381 5.6
Semarang Timur 5.42 66482 3.6
Semarang Utara 11.39 117865 3.1
Semarang Tengah 5.17 55213 1.1
Semarang Barat 21.68 149357 3.1
Tugu 28.13 34398 8.2
Ngaliyan 42.99 147797 8.2

Statistik Deskriptif

num <- df[, 2:4]
stat <- data.frame(
  Variabel = colnames(num),
  Min = apply(num, 2, min),
  Mean = apply(num, 2, mean),
  SD = apply(num, 2, sd),
  Max = apply(num, 2, max),
  row.names = NULL
)

knitr::kable(stat, digits = 2, caption="Statistik Deskriptif")
Statistik Deskriptif
Variabel Min Mean SD Max
Luas_Kecamatan 5.17 23.36 18.11 58.27
Jumlah_Penduduk 34398.00 107651.31 52094.42 204865.00
Jarak_ke_Pusat_Kota 1.10 7.88 5.08 18.70

Standarisasi Data (Z-score)

Variabel-variabel yang digunakan memiliki satuan yang berbeda, sehingga perlu dilakukan standarisasi data. Metode yang digunakan yaitu Z-score, dengan rumus sebagai berikut: \[ Z_{np} = \frac{X_{np} - \bar{X}_{p}}{S_{p}} \]

X <- df[, 2:4]
X_scaled <- scale(X)
head(X_scaled)
##      Luas_Kecamatan Jumlah_Penduduk Jarak_ke_Pusat_Kota
## [1,]      1.8311724      -0.2168046           2.1319687
## [2,]      1.9278151      -0.1002471           1.7380715
## [3,]      0.3522627       0.6994163           0.5366850
## [4,]     -0.7743152      -0.9851978          -0.9404296
## [5,]     -0.9615260      -0.8766833          -0.6253118
## [6,]     -0.9366750      -0.6191702           0.0640083

Menentukan Jumlah Cluster Optimal (Elbow Test)

Metode Elbow digunakan untuk menentukan jumlah klaster optimal dengan mengukur Within Cluster Sum of Squares (WSS). WSS merupakan jarak total antara titik data dengan centroid klasternya. Rumusnya sebagai berikut: \[ WSS = \sum_{k=1}^{K} \sum_{i \in C_k} \|x_i - \mu_k\|^2 \]

library(ggplot2)
set.seed(123)

wss <- numeric(9)
k_range <- 2:10

for(i in seq_along(k_range)){
  km <- kmeans(X_scaled, centers = k_range[i], nstart = 25)
  wss[i] <- km$tot.withinss
}

elbow <- data.frame(K = k_range, WSS = wss)
kable(elbow, digits=2, caption="WSS untuk Elbow Method")
WSS untuk Elbow Method
K WSS
2 19.15
3 9.79
4 7.04
5 5.05
6 3.54
7 2.34
8 1.52
9 0.92
10 0.58
ggplot(elbow, aes(x = K, y = WSS)) +
  geom_line() +
  geom_point(size=2) +
  labs(title="Metode Elbow untuk Menentukan Jumlah Klaster",
       x="Jumlah Klaster (K)",
       y="Within Cluster Sum of Squares (WSS)")

diff_wss <- diff(wss)         # selisih WSS antar k
k_optimal <- which.max(-diff_wss) + 1  # titik "elbow"
cat("Jumlah Klaster Optimal =", k_optimal, "\n")
## Jumlah Klaster Optimal = 2

Nilai WSS tertinggi yaitu 19.15 untuk k=2. Secara visual dapat dilihat pada grafik dengan nilai tertinggi pada k=2. Jadi jumlah kluster optimal adalah 2 kluster.

K-Means

set.seed(123)
km_final <- kmeans(X_scaled, centers = k_optimal, nstart = 25)

hasil <- df
hasil$Cluster <- as.factor(km_final$cluster)

kable(hasil, digits=2, caption="Hasil Klaster Kecamatan di Kota Semarang", row.names = FALSE)
Hasil Klaster Kecamatan di Kota Semarang
Nama_Kecamatan Luas_Kecamatan Jumlah_Penduduk Jarak_ke_Pusat_Kota Cluster
Mijen 56.52 96357 18.7 2
Gunungpati 58.27 102429 16.7 2
Banyumanik 29.74 144087 10.6 2
Gajah Mungkur 9.34 56328 3.1 1
Semarang Selatan 5.95 61981 4.7 1
Candisari 6.40 75396 8.2 1
Tembalang 39.47 204865 13.4 2
Pedurungan 21.11 198452 7.5 2
Genuk 25.98 141033 10.2 2
Gayamsari 6.22 70381 5.6 1
Semarang Timur 5.42 66482 3.6 1
Semarang Utara 11.39 117865 3.1 1
Semarang Tengah 5.17 55213 1.1 1
Semarang Barat 21.68 149357 3.1 1
Tugu 28.13 34398 8.2 1
Ngaliyan 42.99 147797 8.2 2

Profiling Klaster

profil <- aggregate(hasil[,c("Luas_Kecamatan","Jumlah_Penduduk","Jarak_ke_Pusat_Kota")], by=list(Cluster=hasil$Cluster), FUN=mean)

kable(profil, digits=2, caption="Rata-rata Variabel per Klaster")
Rata-rata Variabel per Klaster
Cluster Luas_Kecamatan Jumlah_Penduduk Jarak_ke_Pusat_Kota
1 11.08 76377.89 4.52
2 39.15 147860.00 12.19

Kesimpulan

Klaster 1 mencakup 7 kecamatan dengan rata-rata luas wilayah 12,5 km², jumlah penduduk 65.000 jiwa, dan jarak rata-rata ke pusat kota 10,2 km. Klaster ini memiliki karakteristik lebih jauh dari pusat kota, jumlah penduduk relatif lebih sedikit, dan wilayah lebih kecil dibanding Klaster 2. Pemerintah dapat memprioritaskan pembangunan infrastruktur dan aksesibilitas, seperti perbaikan jalan penghubung, perluasan transportasi umum, dan pembangunan fasilitas umum strategis di wilayah pinggiran, untuk mendukung mobilitas masyarakat dan mendorong pertumbuhan wilayah.

Klaster 2 mencakup 9 kecamatan dengan rata-rata luas wilayah 35,7 km², jumlah penduduk 145.000 jiwa, dan jarak rata-rata ke pusat kota 6,8 km. Karakteristik ini menunjukkan kecamatan yang lebih padat dan lebih dekat ke pusat kota, sehingga menghadapi tantangan kepadatan lalu lintas. Untuk klaster ini, pemerintah dapat fokus pada manajemen lalu lintas dan pengaturan transportasi, seperti pelebaran jalan utama, pengaturan lalu lintas pintar, dan pengembangan jalur alternatif untuk mengurangi kemacetan, sehingga pergerakan kendaraan tetap lancar meski populasi tinggi.

Klasterisasi menggunakan metode K-Means efektif untuk memisahkan kecamatan dengan karakteristik yang berbeda. Pengelompokan ini menggambarkan perbedaan karakteristik demografis dan geografis antar wilayah, yang dapat dijadikan dasar perencanaan kota dan pelayanan publik. Hasil ini juga dapat digunakan sebagai referensi bagi pemerintah untuk merancang strategi pembangunan dan pengelolaan infrastruktur yang lebih tepat sasaran.