B dan C

library(sf)
library(spdep)
library(writexl)
## Warning: package 'writexl' was built under R version 4.4.3
# =========================
# PASTIKAN CRS ADA
# =========================
if (is.na(st_crs(data_merge))) {
  st_crs(data_merge) <- 4326
}

# =========================
# MATIKAN S2
# =========================
sf::sf_use_s2(FALSE)
## Spherical geometry (s2) switched off
# =========================
# TRANSFORM KE UTM
# =========================
data_merge_proj <- st_transform(data_merge, 32750)

# =========================
# PERBAIKI & SEDERHANAKAN GEOMETRY
# =========================
data_merge_proj <- st_make_valid(data_merge_proj)
data_merge_proj <- st_simplify(data_merge_proj, dTolerance = 100)

# =========================
# 1. QUEEN CONTIGUITY
# =========================
nb_queen <- poly2nb(data_merge_proj, queen = TRUE)
## Warning in poly2nb(data_merge_proj, queen = TRUE): some observations have no neighbours;
## if this seems unexpected, try increasing the snap argument.
## Warning in poly2nb(data_merge_proj, queen = TRUE): neighbour object has 2 sub-graphs;
## if this sub-graph count seems unexpected, try increasing the snap argument.
# non-standard (0/1)
lw_queen_B <- nb2listw(nb_queen, style = "B", zero.policy = TRUE)
mat_queen_B <- listw2mat(lw_queen_B)

# standard (row-standardized)
lw_queen <- nb2listw(nb_queen, style = "W", zero.policy = TRUE)
mat_queen <- listw2mat(lw_queen)

# =========================
# 2. KNN (K-Nearest Neighbor)
# =========================
coords <- st_coordinates(st_point_on_surface(data_merge_proj))
## Warning: st_point_on_surface assumes attributes are constant over geometries
# tentukan k (biasanya 4 atau 5)
k <- 4

knn <- knearneigh(coords, k = k)
nb_knn <- knn2nb(knn)

# non-standard
lw_knn_B <- nb2listw(nb_knn, style = "B")
mat_knn_B <- listw2mat(lw_knn_B)

# standard
lw_knn <- nb2listw(nb_knn, style = "W")
mat_knn <- listw2mat(lw_knn)

# =========================
# TAMBAHKAN NAMA WILAYAH
# =========================
rownames(mat_queen_B) <- data_merge_proj$Wilayah
colnames(mat_queen_B) <- data_merge_proj$Wilayah

rownames(mat_queen) <- data_merge_proj$Wilayah
colnames(mat_queen) <- data_merge_proj$Wilayah

rownames(mat_knn_B) <- data_merge_proj$Wilayah
colnames(mat_knn_B) <- data_merge_proj$Wilayah

rownames(mat_knn) <- data_merge_proj$Wilayah
colnames(mat_knn) <- data_merge_proj$Wilayah

# =========================
# EXPORT KE EXCEL (4 SHEET)
# =========================
write_xlsx(
  list(
    Queen_NonStandard = as.data.frame(mat_queen_B),
    Queen_Standard    = as.data.frame(mat_queen),
    KNN_NonStandard   = as.data.frame(mat_knn_B),
    KNN_Standard      = as.data.frame(mat_knn)
  ),
  path = "C:/Users/FIOLA/Downloads/matriks_spasial_kalimantan_KNN.xlsx"
)

# =========================
# CEK
# =========================
file.exists("C:/Users/FIOLA/Downloads/matriks_spasial_kalimantan_KNN.xlsx")
## [1] TRUE

D, E, F

# =========================
# VARIABEL YANG DIGUNAKAN
# =========================
x <- data_merge_proj$Total_Hutan

# =========================
# MORAN'S I - QUEEN
# =========================
moran_queen <- moran.test(x, lw_queen, zero.policy = TRUE)

# =========================
# MORAN'S I - KNN
# =========================
moran_knn <- moran.test(x, lw_knn)

# =========================
# HASIL
# =========================
moran_queen
## 
##  Moran I test under randomisation
## 
## data:  x  
## weights: lw_queen  
## n reduced by no-neighbour observations  
## 
## Moran I statistic standard deviate = 5.4106, p-value = 3.14e-08
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##       0.463555855      -0.018518519       0.007938435
moran_knn
## 
##  Moran I test under randomisation
## 
## data:  x  
## weights: lw_knn    
## 
## Moran I statistic standard deviate = 3.6615, p-value = 0.0001253
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##       0.281657952      -0.018181818       0.006705785

G

# =========================
# VARIABEL
# =========================
x <- data_merge_proj$Total_Hutan

# =========================
# LISA - QUEEN
# =========================
lisa_queen <- localmoran(x, lw_queen, zero.policy = TRUE)

# =========================
# LISA - KNN
# =========================
lisa_knn <- localmoran(x, lw_knn)

# =========================
# JADIKAN DATA FRAME
# =========================
hasil_lisa <- data.frame(
  Wilayah = data_merge_proj$Wilayah,
  
  # Queen
  Ii_Queen = lisa_queen[,1],
  Z_Queen  = lisa_queen[,4],
  p_Queen  = lisa_queen[,5],
  
  # KNN
  Ii_KNN = lisa_knn[,1],
  Z_KNN  = lisa_knn[,4],
  p_KNN  = lisa_knn[,5]
)

# tampilkan
hasil_lisa
##                Wilayah    Ii_Queen     Z_Queen      p_Queen       Ii_KNN
## 1             BALANGAN  0.08857683  0.61105040 5.411662e-01  0.173275499
## 2           BALIKPAPAN  0.07454010  0.19831772 8.427965e-01  0.250522496
## 3               BANJAR  0.20061748  1.44610264 1.481484e-01  0.273883393
## 4           BANJARBARU  0.33112075  0.73618503 4.616181e-01  0.381440244
## 5          BANJARMASIN  0.35826169  0.78713249 4.312043e-01  0.387453814
## 6         BARITO KUALA  0.19898848  0.80206054 4.225179e-01  0.387131962
## 7       BARITO SELATAN  0.06578590  0.82999189 4.065434e-01  0.042457210
## 8         BARITO TIMUR  0.24695666  0.68010263 4.964395e-01  0.241513932
## 9         BARITO UTARA -0.32313293 -2.02266248 4.310796e-02 -0.122173639
## 10          BENGKAYANG  0.23106766  1.11183273 2.662101e-01  0.269661607
## 11               BERAU  1.88297027  2.70984272 6.731512e-03  0.075446721
## 12             BONTANG -0.68684226 -1.06122059 2.885897e-01 -0.038737982
## 13            BULUNGAN  0.50794590  2.11718487 3.424416e-02  0.010548607
## 14          GUNUNG MAS -0.26514437 -1.66943668 9.503087e-02 -0.164761516
## 15 HULU SUNGAI SELATAN  0.21593833  0.95106759 3.415701e-01  0.318681675
## 16  HULU SUNGAI TENGAH  0.15741097  0.73807225 4.604705e-01  0.157410972
## 17   HULU SUNGAI UTARA  0.30688886  1.43721202 1.506578e-01  0.371370422
## 18              KAPUAS  0.10439537  0.39204485 6.950251e-01 -0.161862193
## 19         KAPUAS HULU  8.40954993  4.79710241 1.609773e-06  3.414450883
## 20            KATINGAN -0.04760570 -0.28320663 7.770184e-01  0.105737435
## 21        KAYONG UTARA -0.12260399 -0.65154958 5.146918e-01  0.003327671
## 22            KETAPANG  0.06367487  0.26731588 7.892260e-01 -0.418517950
## 23            KOTABARU -0.04262713 -0.84624307 3.974172e-01 -0.048683686
## 24  KOTAWARINGIN BARAT  0.32672377  0.89127205 3.727832e-01  0.339016794
## 25  KOTAWARINGIN TIMUR  0.26859326  0.68319682 4.944825e-01  0.314829453
## 26           KUBU RAYA -0.01020159 -0.51905026 6.037257e-01 -0.024319562
## 27         KUTAI BARAT -0.18684618 -1.17483239 2.400618e-01 -0.238476683
## 28   KUTAI KARTANEGARA  0.29667807  2.07464965 3.801902e-02  0.340827123
## 29         KUTAI TIMUR  1.08606339  2.11641486 3.430954e-02  0.096084995
## 30            LAMANDAU  0.02666367  0.20659048 8.363297e-01  0.075342280
## 31              LANDAK  0.11859016  0.64699991 5.176320e-01  0.234798590
## 32         MAHAKAM ULU  4.53232890  4.05148935 5.089264e-05  1.281179381
## 33             MALINAU  2.56401708  2.75797356 5.816090e-03  0.862907729
## 34              MELAWI  0.14157277  0.64074811 5.216864e-01  0.075830412
## 35            MEMPAWAH  0.23852628  0.78263218 4.338431e-01  0.266223079
## 36         MURUNG RAYA  2.76699422  3.86375958 1.116551e-04  2.955077134
## 37             NUNUKAN  0.15540348  1.66612686 9.568815e-02  0.071073436
## 38        PALANGKARAYA  0.04665620  0.15421187 8.774427e-01 -0.052982600
## 39               PASER  0.01755946  0.82587374 4.088757e-01  0.026111730
## 40 PENAJAM PASER UTARA  0.09758711  0.32700776 7.436620e-01  0.273194993
## 41           PONTIANAK  0.19618454  0.43875467 6.608393e-01  0.270479967
## 42        PULANG PISAU -0.10496217 -0.33256342 7.394639e-01 -0.109353274
## 43           SAMARINDA -0.26579165 -0.38826338 6.978211e-01  0.243175097
## 44              SAMBAS  0.29894126  0.82848197 4.073976e-01  0.282937965
## 45             SANGGAU -0.03814983 -0.61233289 5.403175e-01 -0.020731125
## 46             SEKADAU -0.26043597 -1.41554609 1.569084e-01 -0.136593673
## 47             SERUYAN  0.14761021  0.69238417 4.886961e-01  0.280311837
## 48          SINGKAWANG  0.33330595  0.73349121 4.632589e-01  0.336209813
## 49             SINTANG  1.21291261  2.27518723 2.289470e-02  1.573704101
## 50            SUKAMARA  0.02139141  0.07795219 9.378661e-01  0.099922704
## 51            TABALONG  0.10255597  1.01506318 3.100757e-01  0.111814951
## 52         TANA TIDUNG -0.78553725 -2.06664514 3.876760e-02 -0.486147219
## 53         TANAH BUMBU  0.05974185  0.52291357 6.010344e-01  0.067363412
## 54          TANAH LAUT  0.25124768  0.76777009 4.426238e-01  0.285675724
## 55               TAPIN  0.34646955  1.19012578 2.339970e-01  0.346469554
## 56             TARAKAN  0.00000000         NaN          NaN -0.178690377
##          Z_KNN        p_KNN
## 1   1.04646954 0.2953443018
## 2   0.91028473 0.3626723685
## 3   1.33436796 0.1820832958
## 4   1.21893106 0.2228703609
## 5   1.22525167 0.2204804106
## 6   1.22560294 0.2203481304
## 7   0.43139503 0.6661811666
## 8   0.77603998 0.4377253787
## 9  -0.55066610 0.5818625844
## 10  1.14608396 0.2517604131
## 11  0.17180707 0.8635892110
## 12 -0.10080879 0.9197022526
## 13  0.06665178 0.9468589259
## 14 -0.82461728 0.4095889072
## 15  1.23353646 0.2173756842
## 16  0.73807225 0.4604705477
## 17  1.17541211 0.2398298804
## 18 -0.41531316 0.6779126701
## 19  2.36197051 0.0181780881
## 20  0.51329783 0.6077430042
## 21  0.03554243 0.9716472129
## 22 -0.94371921 0.3453131568
## 23 -0.77417095 0.4388297056
## 24  1.07736925 0.2813153353
## 25  1.15085002 0.2497939415
## 26 -0.99285393 0.3207811457
## 27 -1.33166647 0.1829698109
## 28  1.74565052 0.0808716971
## 29  0.22408601 0.8226903758
## 30  0.49543071 0.6202961241
## 31  1.26707941 0.2051268967
## 32  1.01585233 0.3096997099
## 33  0.76175278 0.4462075702
## 34  0.31306829 0.7542287799
## 35  0.87072659 0.3839034555
## 36  3.29740446 0.0009758287
## 37  1.10121820 0.2708017031
## 38 -0.15592877 0.8760891694
## 39  0.98190945 0.3261444575
## 40  0.87118781 0.3836516136
## 41  0.86277060 0.3882636093
## 42 -0.34741782 0.7282774481
## 43  0.77815768 0.4364760638
## 44  1.13149788 0.2578455949
## 45 -0.26365082 0.7920489934
## 46 -0.85999969 0.3897892143
## 47  1.14747324 0.2511860870
## 48  1.06645566 0.2862177118
## 49  1.98432440 0.0472196878
## 50  0.33424407 0.7381953891
## 51  0.88485237 0.3762362574
## 52 -1.48188204 0.1383716848
## 53  0.68652397 0.4923827559
## 54  1.01486037 0.3101723895
## 55  1.19012578 0.2339969597
## 56 -0.56335631 0.5731922816
library(writexl)
write_xlsx(
  hasil_lisa,
  path = "C:/Users/FIOLA/Downloads/hasil_lisa_kalimantan.xlsx"
)

H

# =========================
# VARIABEL
# =========================
x <- data_merge_proj$Total_Hutan

# pastikan tidak ada NA
x[is.na(x)] <- 0

# =========================
# HITUNG LISA
# =========================
lisa_queen <- localmoran(x, lw_queen, zero.policy = TRUE)
lisa_knn   <- localmoran(x, lw_knn, zero.policy = TRUE)

# =========================
# STANDARDISASI
# =========================
z_x <- as.numeric(scale(x))

# =========================
# SPATIAL LAG
# =========================
lag_queen <- lag.listw(lw_queen, z_x, zero.policy = TRUE)
lag_knn   <- lag.listw(lw_knn, z_x, zero.policy = TRUE)

# =========================
# FUNGSI KLASIFIKASI (LEBIH AMAN)
# =========================
cluster_func <- function(z, lag, p){
  if(is.na(z) | is.na(lag) | is.na(p) | p > 0.05){
    return("Not Significant")
  }
  if(z > 0 & lag > 0) return("High-High")
  if(z < 0 & lag < 0) return("Low-Low")
  if(z > 0 & lag < 0) return("High-Low")
  if(z < 0 & lag > 0) return("Low-High")
}

# =========================
# HASIL FINAL (PASTI 56)
# =========================
hasil_lisa <- data.frame(
  Wilayah = data_merge_proj$Wilayah,
  Cluster_Queen = mapply(cluster_func, z_x, lag_queen, lisa_queen[,5]),
  Cluster_KNN   = mapply(cluster_func, z_x, lag_knn, lisa_knn[,5]),
  stringsAsFactors = FALSE
)

# =========================
# CEK HASIL
# =========================
cat("Jumlah data:", nrow(hasil_lisa), "\n")
## Jumlah data: 56
# atau di console
hasil_lisa
##                Wilayah   Cluster_Queen     Cluster_KNN
## 1             BALANGAN Not Significant Not Significant
## 2           BALIKPAPAN Not Significant Not Significant
## 3               BANJAR Not Significant Not Significant
## 4           BANJARBARU Not Significant Not Significant
## 5          BANJARMASIN Not Significant Not Significant
## 6         BARITO KUALA Not Significant Not Significant
## 7       BARITO SELATAN Not Significant Not Significant
## 8         BARITO TIMUR Not Significant Not Significant
## 9         BARITO UTARA        Low-High Not Significant
## 10          BENGKAYANG Not Significant Not Significant
## 11               BERAU       High-High Not Significant
## 12             BONTANG Not Significant Not Significant
## 13            BULUNGAN       High-High Not Significant
## 14          GUNUNG MAS Not Significant Not Significant
## 15 HULU SUNGAI SELATAN Not Significant Not Significant
## 16  HULU SUNGAI TENGAH Not Significant Not Significant
## 17   HULU SUNGAI UTARA Not Significant Not Significant
## 18              KAPUAS Not Significant Not Significant
## 19         KAPUAS HULU       High-High       High-High
## 20            KATINGAN Not Significant Not Significant
## 21        KAYONG UTARA Not Significant Not Significant
## 22            KETAPANG Not Significant Not Significant
## 23            KOTABARU Not Significant Not Significant
## 24  KOTAWARINGIN BARAT Not Significant Not Significant
## 25  KOTAWARINGIN TIMUR Not Significant Not Significant
## 26           KUBU RAYA Not Significant Not Significant
## 27         KUTAI BARAT Not Significant Not Significant
## 28   KUTAI KARTANEGARA       High-High Not Significant
## 29         KUTAI TIMUR       High-High Not Significant
## 30            LAMANDAU Not Significant Not Significant
## 31              LANDAK Not Significant Not Significant
## 32         MAHAKAM ULU       High-High Not Significant
## 33             MALINAU       High-High Not Significant
## 34              MELAWI Not Significant Not Significant
## 35            MEMPAWAH Not Significant Not Significant
## 36         MURUNG RAYA       High-High       High-High
## 37             NUNUKAN Not Significant Not Significant
## 38        PALANGKARAYA Not Significant Not Significant
## 39               PASER Not Significant Not Significant
## 40 PENAJAM PASER UTARA Not Significant Not Significant
## 41           PONTIANAK Not Significant Not Significant
## 42        PULANG PISAU Not Significant Not Significant
## 43           SAMARINDA Not Significant Not Significant
## 44              SAMBAS Not Significant Not Significant
## 45             SANGGAU Not Significant Not Significant
## 46             SEKADAU Not Significant Not Significant
## 47             SERUYAN Not Significant Not Significant
## 48          SINGKAWANG Not Significant Not Significant
## 49             SINTANG       High-High       High-High
## 50            SUKAMARA Not Significant Not Significant
## 51            TABALONG Not Significant Not Significant
## 52         TANA TIDUNG        Low-High Not Significant
## 53         TANAH BUMBU Not Significant Not Significant
## 54          TANAH LAUT Not Significant Not Significant
## 55               TAPIN Not Significant Not Significant
## 56             TARAKAN Not Significant Not Significant

I

# =========================
# PASTIKAN CLUSTER SUDAH ADA
# =========================
# (pakai ini kalau sebelumnya sudah bikin hasil_lisa)
if(!"Cluster_Queen" %in% names(data_merge_proj)){
  data_merge_proj$Cluster_Queen <- hasil_lisa$Cluster_Queen
  data_merge_proj$Cluster_KNN   <- hasil_lisa$Cluster_KNN
}

# =========================
# CEK PANJANG (WAJIB 56)
# =========================
if(length(data_merge_proj$Cluster_Queen) != nrow(data_merge_proj)){
  stop("Cluster_Queen tidak sesuai jumlah data")
}

# =========================
# BERSIHKAN NA
# =========================
data_merge_proj$Cluster_Queen[is.na(data_merge_proj$Cluster_Queen)] <- "Not Significant"
data_merge_proj$Cluster_KNN[is.na(data_merge_proj$Cluster_KNN)]     <- "Not Significant"

# =========================
# JADIKAN FAKTOR
# =========================
levels_cluster <- c("High-High","Low-Low","High-Low","Low-High","Not Significant")

data_merge_proj$Cluster_Queen <- factor(as.character(data_merge_proj$Cluster_Queen), levels = levels_cluster)
data_merge_proj$Cluster_KNN   <- factor(as.character(data_merge_proj$Cluster_KNN), levels = levels_cluster)

# =========================
# WARNA (NAMED VECTOR)
# =========================
warna_map <- c(
  "High-High" = "red",
  "Low-Low" = "blue",
  "High-Low" = "orange",
  "Low-High" = "lightblue",
  "Not Significant" = "grey"
)

# =========================
# MAPPING WARNA (PASTI SESUAI)
# =========================
col_queen <- warna_map[as.character(data_merge_proj$Cluster_Queen)]
col_knn   <- warna_map[as.character(data_merge_proj$Cluster_KNN)]

# =========================
# PLOT
# =========================
par(mfrow = c(1,2), mar=c(1,1,3,1))

plot(st_geometry(data_merge_proj),
     col = col_queen,
     main = "LISA Cluster - Queen",
     border = "black")

plot(st_geometry(data_merge_proj),
     col = col_knn,
     main = "LISA Cluster - KNN",
     border = "black")

# =========================
# LEGENDA
# =========================
legend("bottomleft",
       legend = names(warna_map),
       fill = warna_map,
       cex = 0.7,
       bty = "n")