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