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

Exploratory Data Analysis (EDA)

Analisis deskriptif untuk melihat karakteristik data sebelum dilakukan pengelompokan.

Sebaran Data

Tabel Ringkasan

kbl(summary(df_cluster_num), caption = "Statistik Deskriptif Data Hunian") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = F)
Statistik Deskriptif Data Hunian
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

Grafik Hunian Layak

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 (%)")

Grafik Pie (Jawa vs Luar)

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")

Hubungan Antar Variabel

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 (%)")

Hierarchical Clustering

Metode yang digunakan adalah Ward’s Method dengan jarak Euclidean.

Dendrogram Klaster

# 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")

Profiling Hasil Cluster

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")
Karakteristik Tiap Klaster
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

Kesimpulan

Berdasarkan analisis klaster dengan tema biru ini, wilayah Indonesia terbagi menjadi 3 kelompok karakteristik hunian:

  1. Cluster 1: Wilayah dengan karakteristik tertentu (lihat tabel di atas).
  2. Cluster 2: Wilayah dengan tingkat hunian layak/sewa tertentu.
  3. Cluster 3: Wilayah sisanya.

Visualisasi dendrogram menunjukkan pembagian yang jelas antara wilayah-wilayah tersebut.


Laporan ini dibuat menggunakan R Markdown dengan tema Matana University Style.

```