Pendahuluan

Analisis ini bertujuan untuk melakukan clustering atau pengelompokan pada dataset usaha pertanian perorangan tanaman pangan di Kabupaten Flores Timur menggunakan metode K-Means.
Langkah-langkah yang dilakukan meliputi:
1. Import data dan pra-pemrosesan.
2. Statistik deskriptif.
3. Standarisasi (Z-Score).
4. Perhitungan jarak Euclidean.
5. Penentuan jumlah klaster optimal (Elbow & Silhouette).
6. Penerapan K-Means dengan K=3.
7. Evaluasi klaster menggunakan Davies-Bouldin Index (DBI).


Import Data

library(readxl)
DATASET <- read_excel("D:/Downloads/Projet K-Means/datasetpenelitian.xlsx", 
    sheet = "Sheet2")
# Hapus kolom KEC
DATASET <- DATASET[, -1]
head(DATASET)
## # A tibble: 6 × 6
##      X1    X2    X3    X4    X5    X6
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  1665   268    94    14     0     1
## 2   887   400   864   354     9    40
## 3  1053     3   900    15     7    35
## 4  1806   110  1179   185    16   106
## 5   735     2   411    20     2     0
## 6   138     3   293   719     6     5
# Statistik deskriptif
summary(DATASET)
##        X1               X2               X3               X4        
##  Min.   :   3.0   Min.   :  0.00   Min.   :  85.0   Min.   :   2.0  
##  1st Qu.: 162.5   1st Qu.:  2.00   1st Qu.: 387.0   1st Qu.: 106.0  
##  Median : 506.0   Median :  6.00   Median : 623.0   Median : 185.0  
##  Mean   : 611.0   Mean   : 56.42   Mean   : 897.9   Mean   : 462.8  
##  3rd Qu.: 869.5   3rd Qu.: 40.00   3rd Qu.:1171.5   3rd Qu.: 312.0  
##  Max.   :1806.0   Max.   :400.00   Max.   :2562.0   Max.   :2241.0  
##        X5               X6        
##  Min.   : 0.000   Min.   :   0.0  
##  1st Qu.: 1.500   1st Qu.:   2.0  
##  Median : 3.000   Median :  38.0  
##  Mean   : 7.158   Mean   : 226.5  
##  3rd Qu.: 8.000   3rd Qu.: 347.5  
##  Max.   :43.000   Max.   :1434.0
# Standar deviasi tiap variabel
sapply(DATASET, sd)
##       X1       X2       X3       X4       X5       X6 
## 530.4075 107.3118 764.4769 691.9983  10.2538 375.7273
#Standarisasi Data
zscore_data <- scale(DATASET)
head(zscore_data)
##              X1         X2           X3         X4          X5         X6
## [1,]  1.9871514  1.9716288 -1.051561790 -0.6486174 -0.69807261 -0.6000992
## [2,]  0.5203546  3.2016897 -0.044337161 -0.1572867  0.17965104 -0.4963005
## [3,]  0.8333216 -0.4978117  0.002753861 -0.6471723 -0.01539866 -0.5096081
## [4,]  2.2529848  0.4992831  0.367709278 -0.4015069  0.86232499 -0.3206412
## [5,]  0.2337825 -0.5071304 -0.636899183 -0.6399469 -0.50302291 -0.6027607
## [6,] -0.8917672 -0.4978117 -0.791253087  0.3701713 -0.11292351 -0.5894532
#Jarak Euclidean
jarak_euclidean <- dist(zscore_data, method = "euclidean")
jarak_matrix_euclidean <- as.matrix(jarak_euclidean)
jarak_matrix_euclidean[1:5, 1:5]
##          1        2        3        4        5
## 1 0.000000 2.387807 3.002545 2.612815 3.070606
## 2 2.387807 0.000000 3.750292 3.321345 3.859914
## 3 3.002545 3.750292 0.000000 2.002322 1.007570
## 4 2.612815 3.321345 2.002322 0.000000 2.846033
## 5 3.070606 3.859914 1.007570 2.846033 0.000000
#Menentukan K Optimal
library(cluster)
library(factoextra)
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
set.seed(1000)

# Elbow Method
fviz_nbclust(zscore_data, kmeans, k.max = 10, method = "wss") +
  geom_vline(xintercept = 3, linetype = 2, color = "red") +
  ggtitle("K Optimal - Metode Elbow")

# Silhouette Method
fviz_nbclust(zscore_data, kmeans, k.max = 10, method = "silhouette") +
  geom_vline(xintercept = 3, linetype = 2, color = "red") +
  ggtitle("K Optimal - Metode Silhouette")

#K-Means Clustering
library(amap)
set.seed(1000)

km <- Kmeans(zscore_data, 3, method = "euclidean")
km
## K-means clustering with 3 clusters of sizes 2, 4, 13
## 
## Cluster means:
##           X1         X2         X3        X4         X5         X6
## 1 -0.9379581 -0.4884931  2.1695949  1.973499 -0.5030229  2.3594937
## 2  0.9817923  1.6082017 -0.3569692 -0.402952  0.9598498 -0.4796661
## 3 -0.1577887 -0.4196785 -0.2239471 -0.179630 -0.2179503 -0.2154095
## 
## Clustering vector:
##  [1] 2 2 3 2 3 3 3 3 3 3 3 2 3 3 3 1 1 3 3
## 
## Within cluster sum of squares by cluster:
## [1]  1.136992 10.561177  2.547079
## 
## Available components:
## 
## [1] "cluster"  "centers"  "withinss" "size"
dataakhir <- data.frame(zscore_data, Cluster = km$cluster)
head(dataakhir)
##           X1         X2           X3         X4          X5         X6 Cluster
## 1  1.9871514  1.9716288 -1.051561790 -0.6486174 -0.69807261 -0.6000992       2
## 2  0.5203546  3.2016897 -0.044337161 -0.1572867  0.17965104 -0.4963005       2
## 3  0.8333216 -0.4978117  0.002753861 -0.6471723 -0.01539866 -0.5096081       3
## 4  2.2529848  0.4992831  0.367709278 -0.4015069  0.86232499 -0.3206412       2
## 5  0.2337825 -0.5071304 -0.636899183 -0.6399469 -0.50302291 -0.6027607       3
## 6 -0.8917672 -0.4978117 -0.791253087  0.3701713 -0.11292351 -0.5894532       3
#Visualisasi Klaster
fviz_cluster(km, 
             data = zscore_data, 
             geom = "point", 
             ellipse.type = "convex",      
             show.clust.cent = TRUE,       
             palette = "jco",              
             ggtheme = theme_minimal(base_size = 14)) +
  ggtitle("Visualisasi Klaster K-Means (K=3)")

#Evaluasi Klaster (DBI)
library(clusterSim)
## Loading required package: MASS
dbi_score <- index.DB(zscore_data, km$cluster)$DB
cat("Davies-Bouldin Index (DBI):", dbi_score)
## Davies-Bouldin Index (DBI): 1.169572