Laporan ini menganalisis pengelompokan (clustering) wilayah di Indonesia berdasarkan indikator perumahan. Data yang digunakan mencakup status kepemilikan bangunan dan kelayakan hunian untuk mengidentifikasi pola sebaran kualitas hunian antar provinsi.
# Install packages otomatis jika belum ada
if (!require("pacman")) install.packages("pacman")
pacman::p_load(readr, dplyr, ggplot2, cluster, factoextra, dendextend, tidyr, kableExtra)
# Set tema visualisasi default ke Minimal
theme_set(theme_minimal(base_size = 12))
# --- IMPORT DATA HUNIAN ---
# Skenario: Menggunakan Data Dummy jika file asli tidak ditemukan agar tidak error
file_path <- "data_UAS.csv"
if(file.exists(file_path)){
# BACA FILE ASLI
data_hunian <- read_delim(file_path, delim = ";", skip = 3, col_names = FALSE,
locale = locale(decimal_mark = ","), show_col_types = FALSE)
colnames(data_hunian) <- c("Provinsi", "Milik_Sendiri", "Sewa_Kontrak", "Lainnya", "Layak_Huni")
data_bersih <- data_hunian %>%
filter(Milik_Sendiri != "..." & !is.na(Provinsi)) %>%
mutate(across(c(Milik_Sendiri, Sewa_Kontrak, Lainnya, Layak_Huni), as.numeric)) %>%
na.omit()
} else {
# DATA DUMMY (Cadangan agar bisa di-Knit)
set.seed(123)
provs <- c("DKI JAKARTA", "JAWA BARAT", "JAWA TENGAH", "DI YOGYAKARTA", "JAWA TIMUR",
"BANTEN", "BALI", "SUMATERA UTARA", "SUMATERA BARAT", "RIAU", "JAMBI",
"KALIMANTAN TIMUR", "SULAWESI SELATAN", "PAPUA", "MALUKU")
data_bersih <- data.frame(
Provinsi = provs,
Milik_Sendiri = sample(50:90, length(provs), replace=T),
Sewa_Kontrak = sample(5:40, length(provs), replace=T),
Lainnya = sample(0:5, length(provs), replace=T),
Layak_Huni = sample(60:98, length(provs), replace=T)
)
}
# Finalisasi Data Frame untuk Cluster
df_cluster <- as.data.frame(data_bersih)
rownames(df_cluster) <- df_cluster$Provinsi
df_cluster_num <- df_cluster[, -1] # Hanya angka
Analisis deskriptif untuk melihat karakteristik data sebelum dilakukan pengelompokan.
kbl(summary(df_cluster_num), caption = "Statistik Deskriptif Data Hunian") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = F)
| Milik_Sendiri | Sewa_Kontrak | Lainnya | Layak_Huni | |
|---|---|---|---|---|
| Min. :54.44 | Min. : 0.510 | Min. : 4.970 | Min. :30.72 | |
| 1st Qu.:80.28 | 1st Qu.: 2.215 | 1st Qu.: 6.763 | 1st Qu.:60.11 | |
| Median :85.52 | Median : 3.345 | Median : 9.895 | Median :66.05 | |
| Mean :84.30 | Mean : 5.375 | Mean :10.321 | Mean :65.16 | |
| 3rd Qu.:90.61 | 3rd Qu.: 7.055 | 3rd Qu.:12.717 | 3rd Qu.:72.00 | |
| Max. :94.20 | Max. :21.300 | Max. :24.250 | Max. :86.68 |
ggplot(data_bersih, aes(x = reorder(Provinsi, Layak_Huni), y = Layak_Huni)) +
geom_bar(stat = "identity", fill = "#1976d2") + # Biru Matana
coord_flip() +
labs(title = "Persentase Hunian Layak per Provinsi",
subtitle = "Urutan dari terendah ke tertinggi",
x = NULL, y = "Persentase (%)")
data_pie <- data_bersih %>%
mutate(Wilayah = if_else(toupper(Provinsi) %in% c("DKI JAKARTA", "JAWA BARAT", "JAWA TENGAH", "DI YOGYAKARTA", "JAWA TIMUR", "BANTEN"),
"Pulau Jawa", "Luar Jawa")) %>%
group_by(Wilayah) %>%
summarise(Rata_Layak = mean(Layak_Huni))
ggplot(data_pie, aes(x = "", y = Rata_Layak, fill = Wilayah)) +
geom_bar(stat = "identity", width = 1, color = "white") +
coord_polar("y") +
scale_fill_manual(values = c("#bbdefb", "#1976d2")) + # Gradasi Biru
theme_void() +
geom_text(aes(label = paste0(round(Rata_Layak, 1), "%")),
position = position_stack(vjust = 0.5), color = "black") +
labs(title = "Rata-rata Kelayakan Hunian")
Melihat apakah tingginya angka sewa berhubungan dengan kualitas hunian di suatu daerah.
ggplot(data_bersih, aes(x = Sewa_Kontrak, y = Layak_Huni)) +
geom_point(color = "#1565c0", size = 3, alpha = 0.8) +
geom_smooth(method = "lm", color = "#d32f2f", fill = "#ffcdd2") +
labs(title = "Hubungan Status Sewa dan Kelayakan Hunian",
x = "Persentase Sewa/Kontrak (%)",
y = "Persentase Layak Huni (%)")
Metode yang digunakan adalah Ward’s Method dengan jarak Euclidean.
# Scaling Data
data_scaled <- scale(df_cluster_num)
# Hitung Jarak & Cluster
dist_matrix <- dist(data_scaled, method = "euclidean")
hc_ward <- hclust(dist_matrix, method = "ward.D2")
# Visualisasi Dendrogram Biru
avg_dend_obj <- as.dendrogram(hc_ward)
avg_col_dend <- color_branches(avg_dend_obj, k = 3, col = c("#1976d2", "#0d47a1", "#42a5f5"))
plot(avg_col_dend,
main = "Dendrogram Pengelompokan Provinsi",
ylab = "Jarak Euclidean")
rect.hclust(hc_ward, k = 3, border = "#d32f2f")
Berikut adalah karakteristik rata-rata dari 3 kelompok yang terbentuk:
# Gabung hasil cluster
df_cluster$Cluster <- as.factor(cutree(hc_ward, k = 3))
# Hitung rata-rata per cluster
summary_cluster <- df_cluster %>%
group_by(Cluster) %>%
summarise(across(where(is.numeric), mean)) %>%
mutate(across(where(is.numeric), round, 2))
# Tampilkan Tabel Rapih
kbl(summary_cluster, caption = "Karakteristik Tiap Klaster") %>%
kable_styling(bootstrap_options = "striped", full_width = FALSE) %>%
row_spec(0, bold = TRUE, color = "white", background = "#1976d2")
| Cluster | Milik_Sendiri | Sewa_Kontrak | Lainnya | Layak_Huni |
|---|---|---|---|---|
| 1 | 88.44 | 2.98 | 8.58 | 63.18 |
| 2 | 77.77 | 9.29 | 12.94 | 72.32 |
| 3 | 54.44 | 21.30 | 24.25 | 39.00 |
Berdasarkan analisis klaster dengan tema biru ini, wilayah Indonesia terbagi menjadi 3 kelompok karakteristik hunian:
Visualisasi dendrogram menunjukkan pembagian yang jelas antara wilayah-wilayah tersebut.
```