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")
| 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 |
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")
| 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 |
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
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")
| 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.
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)
| 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 |
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")
| Cluster | Luas_Kecamatan | Jumlah_Penduduk | Jarak_ke_Pusat_Kota |
|---|---|---|---|
| 1 | 11.08 | 76377.89 | 4.52 |
| 2 | 39.15 | 147860.00 | 12.19 |
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.