Analisis ini menerapkan algoritma K-Means Clustering pada dataset harga rumah (Housing.csv) untuk mengelompokkan properti berdasarkan karakteristiknya. Tujuan utama adalah memahami segmentasi pasar properti. Dataset terdiri atas 545 baris observasi serta 13 variabel yang meliputi informasi mengenai harga rumah, luas bangunan, jumlah kamar tidur, jumlah kamar mandi, jumlah lantai, dan ketersediaan berbagai fasilitas.
data <- read.csv("Housing.csv")
Langkah pertama adalah memahami struktur data: tipe setiap kolom, skala nilainya, dan apakah terdapat data kosong yang perlu ditangani.
colSums(is.na(data))
## price area bedrooms bathrooms
## 0 0 0 0
## stories mainroad guestroom basement
## 0 0 0 0
## hotwaterheating airconditioning parking prefarea
## 0 0 0 0
## furnishingstatus
## 0
str(data)
## 'data.frame': 545 obs. of 13 variables:
## $ price : int 13300000 12250000 12250000 12215000 11410000 10850000 10150000 10150000 9870000 9800000 ...
## $ area : int 7420 8960 9960 7500 7420 7500 8580 16200 8100 5750 ...
## $ bedrooms : int 4 4 3 4 4 3 4 5 4 3 ...
## $ bathrooms : int 2 4 2 2 1 3 3 3 1 2 ...
## $ stories : int 3 4 2 2 2 1 4 2 2 4 ...
## $ mainroad : chr "yes" "yes" "yes" "yes" ...
## $ guestroom : chr "no" "no" "no" "no" ...
## $ basement : chr "no" "no" "yes" "yes" ...
## $ hotwaterheating : chr "no" "no" "no" "no" ...
## $ airconditioning : chr "yes" "yes" "no" "yes" ...
## $ parking : int 2 3 2 3 2 2 2 0 2 1 ...
## $ prefarea : chr "yes" "no" "yes" "yes" ...
## $ furnishingstatus: chr "furnished" "furnished" "semi-furnished" "furnished" ...
Dari output str(), teridentifikasi dua kategori variabel yang memerlukan transformasi: 1. Biner 2. Multinomial
# Binary encoding variabel yes/no
data$mainroad <- ifelse(data$mainroad == "yes", 1, 0)
data$guestroom <- ifelse(data$guestroom == "yes", 1, 0)
data$basement <- ifelse(data$basement == "yes", 1, 0)
data$hotwaterheating <- ifelse(data$hotwaterheating == "yes", 1, 0)
data$airconditioning <- ifelse(data$airconditioning == "yes", 1, 0)
data$prefarea <- ifelse(data$prefarea == "yes", 1, 0)
Variabel furnishingstatus memiliki tiga kategori: “furnished”, “semi-furnished”, dan “unfurnished”. Karena terdapat lebih dari dua nilai, binary encoding tidak cukup. Solusinya adalah one-hot encoding (dummy coding) menggunakan model.matrix()
data_dummy <- model.matrix(~ furnishingstatus -1, data = data)
data <- cbind(data, data_dummy)
data$furnishingstatus <- NULL
Seluruh fitur dinormalisasi menggunakan fungsi scale() yang menerapkan standardisasi z-score.
# Scaling semua fitur (kecuali price)
data_clust <- data[, !names(data) %in% c("price")]
data_scaled <- scale(data_clust)
wss <- function(k){
kmeans(data_scaled, k, nstart = 10)$tot.withinss
}
k.values <- 1:10
wss_values <- sapply(k.values, wss)
plot(k.values, wss_values, type="b",
xlab="Jumlah Cluster", ylab="WSS")
Grafik menunjukkan penurunan WSS yang tajam dari k=1 ke k=3, lalu mulai
mendatar. Titik “siku” berada di k = 3, sehingga dipilih sebagai jumlah
cluster optimal.
set.seed(123)
kmeans_result <- kmeans(data_scaled, centers = 3, nstart = 25)
data$cluster <- kmeans_result$cluster
table(data$cluster)
##
## 1 2 3
## 140 178 227
Model K-Means dijalankan dengan jumlah cluster sebanyak 3 (k = 3) dan menggunakan nstart = 25 untuk memastikan hasil yang lebih stabil melalui beberapa inisialisasi centroid.
Hal ini menunjukkan bahwa:
Cluster 3 merupakan kelompok terbesar, yang berarti sebagian besar data memiliki karakteristik yang relatif mirip dalam cluster ini.
Cluster 1 merupakan kelompok terkecil, yang mengindikasikan adanya segmen data yang lebih spesifik atau unik dibandingkan yang lain.
Distribusi antar cluster tidak terlalu timpang, sehingga hasil clustering masih cukup seimbang dan tidak didominasi oleh satu cluster ekstrem.
Secara umum, hasil ini menunjukkan bahwa algoritma K-Means berhasil membagi data menjadi tiga kelompok dengan ukuran yang cukup proporsional, sehingga dapat digunakan untuk analisis lanjutan seperti profiling karakteristik masing-masing cluster.
aggregate(data[, -which(names(data)=="cluster")],
by = list(cluster = data$cluster),
mean)
## cluster price area bedrooms bathrooms stories mainroad guestroom
## 1 1 5495696 5688.100 3.064286 1.378571 1.942857 0.9357143 0.2428571
## 2 2 4013831 4707.596 2.831461 1.191011 1.702247 0.7921348 0.1235955
## 3 3 4907524 5166.339 3.008811 1.303965 1.801762 0.8634361 0.1806167
## basement hotwaterheating airconditioning parking prefarea
## 1 0.4071429 0.04285714 0.4428571 0.8857143 0.3071429
## 2 0.2696629 0.02808989 0.2528090 0.4887640 0.1853933
## 3 0.3788546 0.06167401 0.2863436 0.7356828 0.2290749
## furnishingstatusfurnished furnishingstatussemi-furnished
## 1 1 0
## 2 0 0
## 3 0 1
## furnishingstatusunfurnished
## 1 0
## 2 1
## 3 0
Hasil agregasi menunjukkan adanya perbedaan karakteristik yang cukup jelas antar cluster. Cluster 1 memiliki rata-rata harga rumah tertinggi (±5,5 juta) dengan luas area paling besar serta jumlah kamar tidur dan kamar mandi yang relatif lebih banyak, sehingga dapat diinterpretasikan sebagai kelompok rumah dengan spesifikasi lebih premium. Sebaliknya, Cluster 2 memiliki rata-rata harga terendah (±4,0 juta) dengan luas bangunan yang lebih kecil dan jumlah fasilitas yang lebih sedikit, sehingga merepresentasikan segmen rumah dengan karakteristik lebih sederhana. Sementara itu, Cluster 3 berada di antara keduanya dengan nilai rata-rata yang moderat baik dari sisi harga, luas, maupun jumlah ruangan, sehingga dapat dianggap sebagai kelompok menengah. Pola ini mengindikasikan bahwa proses clustering berhasil mengelompokkan data berdasarkan tingkat nilai properti dan kelengkapan fasilitasnya.
Principal Component Analysis (PCA) mereduksi dimensi data ke 2 komponen utama agar cluster dapat divisualisasikan dalam bidang 2D.
pca <- prcomp(data_scaled)
plot(pca$x[,1:2],
col = data$cluster,
pch = 19,
xlab = "PC1",
ylab = "PC2")
Secara keseluruhan, hasil clustering membagi properti menjadi tiga segmen utama berdasarkan harga, luas, dan kelengkapan fasilitas. Cluster 2 merepresentasikan rumah kelas premium dengan harga tertinggi, ukuran besar, lokasi strategis, dan fasilitas paling lengkap. Cluster 1 berada di kategori menengah dengan harga dan fasilitas yang cukup memadai, cocok untuk kebutuhan hunian standar. Sementara itu, Cluster 3 merupakan segmen ekonomis dengan harga paling rendah, ukuran lebih kecil, dan fasilitas terbatas, namun tetap memiliki aksesibilitas yang cukup baik. Pembagian ini menunjukkan bahwa data berhasil dikelompokkan secara logis sesuai tingkat nilai dan kualitas properti
Berdasarkan hasil analisis, metode K-Means Clustering terbukti efektif dalam mengelompokkan data perumahan di India menjadi tiga segmen utama berdasarkan karakteristik fisik dan fasilitas rumah. Melalui proses preprocessing dan penentuan jumlah cluster optimal menggunakan metode Elbow, diperoleh tiga kelompok properti.
Rumah premium dengan harga tinggi, luas bangunan besar, serta fasilitas lengkap
Rumah kelas menengah dengan spesifikasi yang seimbang
Rumah ekonomis dengan harga lebih terjangkau serta fasilitas lebih sederhana.
Visualisasi menggunakan PCA menunjukkan pemisahan cluster yang cukup jelas, sehingga hasil segmentasi dinilai representatif. Temuan ini menunjukkan bahwa pendekatan clustering dapat dimanfaatkan sebagai dasar pengambilan keputusan strategis dalam pemasaran, pengembangan produk, maupun analisis pasar properti.