Sintaks Projek ADK Kelompok 5

Import Data

library(readxl)
data<-read_excel("C:/Users/User/Downloads/Dataset ADK Kelompok 5.xlsx")

Persiapan Data

#Package yang diperlukan untuk data spasial
library(tmap)
library(raster)
## Loading required package: sp
library(spdep)
## Loading required package: spData
## To access larger datasets in this package, install the spDataLarge
## package with: `install.packages('spDataLarge',
## repos='https://nowosad.github.io/drat/', type='source')`
## Loading required package: sf
## Linking to GEOS 3.13.1, GDAL 3.11.0, PROJ 9.6.0; sf_use_s2() is TRUE
library(spatialreg)
## Loading required package: Matrix
## 
## Attaching package: 'spatialreg'
## The following objects are masked from 'package:spdep':
## 
##     get.ClusterOption, get.coresOption, get.mcOption,
##     get.VerboseOption, get.ZeroPolicyOption, set.ClusterOption,
##     set.coresOption, set.mcOption, set.VerboseOption,
##     set.ZeroPolicyOption
library(gdalraster)
## GDAL 3.11.0 (released 2025-05-06), GEOS 3.13.1, PROJ 9.6.0
## 
## Attaching package: 'gdalraster'
## The following objects are masked from 'package:raster':
## 
##     calc, rasterize
#Packages tambahan untuk asumsi dan membaca excel
library(readxl)
library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(car)
## Loading required package: carData
library(sf)
library(tidyr)
## 
## Attaching package: 'tidyr'
## The following objects are masked from 'package:Matrix':
## 
##     expand, pack, unpack
## The following object is masked from 'package:raster':
## 
##     extract
library(kableExtra)

Input file peta (.shp) di R

#Package yang diperlukan untuk data spasial
setwd("C:/Users/User/Documents/AKA/Tingkat 2/Semester 4/SIG/Modul 8 Material/Data Administrasi")
spKab = shapefile("kab_20201_byindo.shp")
spKab <- st_as_sf(spKab)
# Pastikan idkab sebagai karakter
spKab$idkab <- as.character(spKab$idkab)

# Simpan hanya yang tidak berakhiran “88”
spKab <- spKab[ !grepl("88$", spKab$idkab), ]

Menampilkan Indonesia

##Menampilkan peta jawa
tm_shape(spKab)+tm_polygons()

Join Data ke Shp

# Pastikan kedua objek punya kolom idkab dengan tipe sama (character)
spKab$idkab <- as.character(spKab$idkab)
data$idkab  <- as.character(data$idkab)

# Lakukan merge (left join)
spKabm <- merge(
  x    = spKab,
  y    = data[, c("idkab", "Y", "X1", "X2", "X3", "X4", "X5")],
  by   = "idkab",
  all.x = TRUE   # agar semua baris spKab tetap ada meski data tidak match
)

# Hasilnya spKab sekarang memiliki kolom Y, X1…X5

if (!inherits(spKabm, "sf")) {
  spKabm <- st_as_sf(spKabm)
}


# Proyeksikan ke CRS metrik (contoh: UTM Zone 49S, EPSG:32749)
spKab_utm <- st_transform(spKabm, crs = 32749)
colSums(is.na(spKab_utm))
##    idkab      fid   nmprov    nmkab   kdprov    kdkab   sumber  periode 
##        0        0        0        0        0        0        0        0 
##        Y       X1       X2       X3       X4       X5 geometry 
##        0        0        0        0        0        0        0

Sebaran TPAK Perempuan

library(sf)
library(sp)
library(classInt)
library(RColorBrewer)

# Pastikan data bertipe Spatial* untuk spplot()
spKab_sp <- as(spKab_utm, "Spatial")

# Ambil data nilai
val <- spKab_sp$Y

# Hitung class breaks menggunakan Jenks natural breaks (k = 5)
breaks <- classIntervals(val, n = 5, style = "jenks")$brks

# Potong nilai ke dalam kelas
cat <- cut(val, breaks = breaks, include.lowest = TRUE, dig.lab = 2)

# Label kelas manual
labels <- c("Sangat Rendah", "Rendah", "Sedang", "Tinggi", "Sangat Tinggi")
levels(cat) <- labels

# Simpan kategori ke data
spKab_sp$Y_cat <- factor(cat, levels = labels)

# Gradasi warna: merah → biru
colors <- colorRampPalette(c("#8B0000", "#B22222", "#87CEFA", "#4682B4", "#00008B"))(5)

# Tampilkan peta
print(
  spplot(spKab_sp, zcol = "Y_cat",
         main = "Peta Choropleth: Variabel Y",
         col.regions = colors,
         par.settings = list(
           layout.heights = list(key.bottom = 2),
           axis.line = list(col = NA)
         ),
         colorkey = list(
           space = "bottom",
           labels = list(
             at = 1:5,
             labels = labels,
             cex = 1.1
           ),
           height = 1
         ))
)

Eksplorasi Data

# Cek struktur data
str(data)
## tibble [514 × 8] (S3: tbl_df/tbl/data.frame)
##  $ idkab   : chr [1:514] "1101" "1102" "1103" "1104" ...
##  $ Kab/Kota: chr [1:514] "SIMEULUE" "ACEH SINGKIL" "ACEH SELATAN" "ACEH TENGGARA" ...
##  $ Y       : num [1:514] 59.6 37.7 36.4 59.6 42.6 ...
##  $ X1      : num [1:514] 2.71 3.04 2.39 2.71 2.41 2.51 2.3 2.25 2.35 2.44 ...
##  $ X2      : num [1:514] 81.1 77.7 81.5 81.3 78.4 ...
##  $ X3      : num [1:514] 20 12 10 10 10 ...
##  $ X4      : num [1:514] 9.37 8.28 8.45 9.81 8.38 ...
##  $ X5      : num [1:514] 52.4 58.4 52.3 53.8 52 ...
# Ringkasan statistik deskriptif
summary(data)
##     idkab             Kab/Kota               Y               X1       
##  Length:514         Length:514         Min.   :24.21   Min.   :1.540  
##  Class :character   Class :character   1st Qu.:49.45   1st Qu.:2.150  
##  Mode  :character   Mode  :character   Median :54.90   Median :2.310  
##                                        Mean   :56.42   Mean   :2.377  
##                                        3rd Qu.:62.13   3rd Qu.:2.507  
##                                        Max.   :98.09   Max.   :4.220  
##        X2              X3              X4               X5       
##  Min.   :54.37   Min.   : 0.00   Min.   : 1.370   Min.   : 6.07  
##  1st Qu.:81.65   1st Qu.: 8.89   1st Qu.: 7.460   1st Qu.:46.77  
##  Median :84.56   Median :15.56   Median : 8.250   Median :51.70  
##  Mean   :84.00   Mean   :15.66   Mean   : 8.360   Mean   :50.80  
##  3rd Qu.:86.85   3rd Qu.:22.16   3rd Qu.: 9.295   3rd Qu.:56.26  
##  Max.   :95.50   Max.   :48.57   Max.   :12.870   Max.   :72.92
# Cek missing values
colSums(is.na(data))
##    idkab Kab/Kota        Y       X1       X2       X3       X4       X5 
##        0        0        0        0        0        0        0        0
# Visualisasi distribusi tiap variabel
library(ggplot2)
library(reshape2)
## 
## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr':
## 
##     smiths
data_long <- melt(data)
## Using idkab, Kab/Kota as id variables
ggplot(data_long, aes(x = value)) + 
  facet_wrap(~variable, scales = "free") +
  geom_histogram(bins = 30, fill = "steelblue", color = "white") +
  theme_minimal()

# Korelasi antar variabel numerik
cor_matrix <- cor(data[, c("Y", "X1", "X2", "X3", "X4", "X5")])
print(cor_matrix)
##             Y         X1           X2          X3         X4           X5
## Y   1.0000000  0.2182337  0.396781513 -0.21275680 -0.3371861 -0.100980462
## X1  0.2182337  1.0000000 -0.117695637 -0.31784225 -0.3291743 -0.157704519
## X2  0.3967815 -0.1176956  1.000000000 -0.09882240 -0.4383793 -0.001864755
## X3 -0.2127568 -0.3178422 -0.098822396  1.00000000  0.2427632  0.035496441
## X4 -0.3371861 -0.3291743 -0.438379266  0.24276322  1.0000000  0.356098011
## X5 -0.1009805 -0.1577045 -0.001864755  0.03549644  0.3560980  1.000000000
# Visualisasi korelasi
library(corrplot)
## corrplot 0.95 loaded
corrplot(cor_matrix, method = "number", type = "upper")

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:kableExtra':
## 
##     group_rows
## The following object is masked from 'package:car':
## 
##     recode
## The following object is masked from 'package:gdalraster':
## 
##     combine
## The following objects are masked from 'package:raster':
## 
##     intersect, select, union
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)

# Hitung summary statistik
summary_stats <- data %>%
  dplyr::select(Y, X1, X2, X3, X4, X5) %>%
  summarise_all(list(
    Min = ~min(.),
    Q1 = ~quantile(., 0.25),
    Median = ~median(.),
    Mean = ~mean(.),
    Q3 = ~quantile(., 0.75),
    Max = ~max(.),
    SD = ~sd(.)
  )) %>%
  pivot_longer(everything(),
               names_to = c("Variable", "Statistic"),
               names_sep = "_") %>%
  pivot_wider(names_from = Statistic, values_from = value)

# Hitung korelasi masing-masing variabel ke Y
# Karena korelasi Y ke Y = 1, variabel lain korelasi ke Y dihitung
variabel <- c("Y", "X1", "X2", "X3", "X4", "X5")
korelasi_ke_Y <- sapply(variabel, function(v) cor(data[[v]], data$Y))

# Buat data frame korelasi agar bisa digabung
df_korelasi <- data.frame(Variable = variabel,
                          Korelasi_ke_Y = korelasi_ke_Y)

# Gabungkan summary dengan korelasi
summary_final <- summary_stats %>%
  left_join(df_korelasi, by = "Variable")

kable(summary_final)
Variable Min Q1 Median Mean Q3 Max SD Korelasi_ke_Y
Y 24.21 49.45 54.900 56.417821 62.1350 98.09 10.8420715 1.0000000
X1 1.54 2.15 2.310 2.377237 2.5075 4.22 0.3829212 0.2182337
X2 54.37 81.65 84.565 84.002860 86.8525 95.50 4.3760083 0.3967815
X3 0.00 8.89 15.560 15.657763 22.1650 48.57 8.9755422 -0.2127568
X4 1.37 7.46 8.250 8.359630 9.2950 12.87 1.7317112 -0.3371861
X5 6.07 46.77 51.705 50.800175 56.2575 72.92 8.6782500 -0.1009805

OLS Model

wr_formula <- Y ~ X1 + X2+X3+X4+X5
# Model OLS
ols_model <- lm(wr_formula, data = spKab_utm)

# Ringkasan hasil regresi
summary(ols_model)
## 
## Call:
## lm(formula = wr_formula, data = spKab_utm)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -33.984  -6.329  -0.025   6.225  24.160 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -29.69830   12.41627  -2.392   0.0171 *  
## X1            5.85012    1.26421   4.627 4.70e-06 ***
## X2            0.95153    0.11397   8.349 6.58e-16 ***
## X3           -0.11140    0.05002  -2.227   0.0264 *  
## X4           -0.39788    0.32156  -1.237   0.2165    
## X5           -0.05219    0.05260  -0.992   0.3216    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 9.481 on 508 degrees of freedom
## Multiple R-squared:  0.2427, Adjusted R-squared:  0.2353 
## F-statistic: 32.57 on 5 and 508 DF,  p-value: < 2.2e-16
# Library
library(car)

# Variance Inflation Factor
vif(ols_model)
##       X1       X2       X3       X4       X5 
## 1.337372 1.419524 1.150292 1.769555 1.189331
# Library
library(lmtest)

# Uji Breusch-Pagan
bptest(ols_model)
## 
##  studentized Breusch-Pagan test
## 
## data:  ols_model
## BP = 40.709, df = 5, p-value = 1.074e-07
# Histogram residual
hist(residuals(ols_model), main = "Histogram Residual", xlab = "Residuals")

library(tseries)
jarque.bera.test(residuals(ols_model))
## 
##  Jarque Bera Test
## 
## data:  residuals(ols_model)
## X-squared = 0.36987, df = 2, p-value = 0.8312

Geographically Weighted Regression (GWR)

Persiapan Data GWR

library(spgwr)
## NOTE: This package does not constitute approval of GWR
## as a method of spatial analysis; see example(gwr)
library(sf)
library(dplyr)
spKab_utm <- st_as_sf(spKab_utm)
# 1. Ubah ke lon-lat (WGS84)
gabung_final<-spKab_utm
gabung_final_ll <- st_transform(spKab_utm, crs = 4326)

# 2. Validasi geometri
gabung_final_ll <- st_make_valid(gabung_final_ll)

# 3. Hitung centroid dan ekstrak koordinat
centroid <- st_centroid(gabung_final_ll)
## Warning: st_centroid assumes attributes are constant over geometries
coords <- st_coordinates(centroid)

# 4. Tambah koordinat ke data
gabung_final_ll$lon_centroid <- coords[, 1]
gabung_final_ll$lat_centroid <- coords[, 2]

# 5. Buat salinan data.frame
# Tambahkan ID ke data yang akan dikonversi
gabung_df <- st_drop_geometry(gabung_final_ll)
gabung_df$idkab <- gabung_final_ll$idkab


# 6. Konversi ke SpatialPointsDataFrame
coordinates(gabung_df) <- ~lon_centroid + lat_centroid
proj4string(gabung_df) <- CRS("+proj=longlat +datum=WGS84")

# → Ini adalah objek final untuk spgwr
gabung_sp <- gabung_df

Pemilihan Pembobot dan Bandwith Terbaik

library(spgwr)
library(tibble)
library(dplyr)

# Formula tetap
gwr_formula <-  Y ~ X1 + X2+X3+X4+X5
# Model OLS
y_actual <- gabung_sp$Y

# Fungsi menangkap ringkasan GWR
capture_gwr_summary <- function(model, y_actual, formula) {
  printed <- capture.output(print(model))
  ambil <- function(kunci) {
    baris <- grep(kunci, printed, value = TRUE)
    if (length(baris) == 0) return(NA_real_)
    as.numeric(sub(".*:\\s*", "", baris))
  }
  aic_val  <- ambil("^AIC \\(GWR")
  aicc_val <- ambil("^AICc")
  rss      <- ambil("^Residual sum of squares")
  r2       <- ambil("^Quasi-global R2")
  tr_S     <- model$results$edf
  n <- length(y_actual)
  k <- length(all.vars(formula)) - 1
  adj_r2 <- 1 - ((1 - r2) * (n - 1) / (n - k - 1))
  tibble(AIC = aic_val, AICc = aicc_val, RSS = rss, R2 = r2, Adjusted_R2 = adj_r2, traceS = tr_S)
}

# Daftar kernel dan tipe bandwidth
kernels <- c("gaussian", "bisquare")
bandwidth_types <- c("adaptive", "fixed")

# Simpan hasil GWR
result_list <- list()

for (kernel in kernels) {
  for (bw_type in bandwidth_types) {
    
    # Pilih fungsi bobot
    gweight_fun <- if (kernel == "gaussian") gwr.Gauss else gwr.bisquare
    
    # Pilih bandwidth
    bw <- gwr.sel(
      formula = gwr_formula,
      data = gabung_sp,
      gweight = gweight_fun,
      adapt = (bw_type == "adaptive"),
      longlat = TRUE,
      verbose = FALSE
    )
    
    # Jalankan GWR
    model <- gwr(
      formula = gwr_formula,
      data = gabung_sp,
      gweight = gweight_fun,
      hatmatrix = TRUE,
      se.fit = TRUE,
      longlat = TRUE,
      adapt = if (bw_type == "adaptive") bw else NULL,
      bandwidth = if (bw_type == "fixed") bw else NULL
    )
    
    # Ringkasan hasil
    summary_tbl <- capture_gwr_summary(model, y_actual, gwr_formula)
    summary_tbl$Kernel <- kernel
    summary_tbl$Bandwidth <- bw_type
    result_list[[length(result_list)+1]] <- summary_tbl
  }
}
## Warning in optimize(gwr.cv.f, lower = beta1, upper = beta2, maximum = FALSE, :
## NA/NaN replaced by maximum positive value
# Tambahkan model OLS
ols_model <- lm(gwr_formula, data = gabung_sp)
ols_rss <- sum(resid(ols_model)^2)
ols_tss <- sum((y_actual - mean(y_actual))^2)
ols_r2 <- 1 - (ols_rss / ols_tss)
n <- nrow(gabung_sp)
k <- length(all.vars(gwr_formula)) - 1
ols_adj_r2 <- 1 - ((1 - ols_r2) * (n - 1) / (n - k - 1))
ols_aic <- AIC(ols_model)
ols_aicc <- ols_aic + (2 * k * (k + 1)) / (n - k - 1)

ols_summary <- tibble(
  AIC = ols_aic,
  AICc = ols_aicc,
  RSS = ols_rss,
  R2 = ols_r2,
  Adjusted_R2 = ols_adj_r2,
  traceS = NA_real_,
  Kernel = "OLS",
  Bandwidth = "NA"
)

# Gabungkan semua hasil
final_results <- bind_rows(result_list, ols_summary)

# Tampilkan tabel
kable(final_results)
AIC AICc RSS R2 Adjusted_R2 traceS Kernel Bandwidth
3449.166 3535.771 21775.50 0.6389011 0.6353470 427.8478 gaussian adaptive
3480.210 3559.867 23325.90 0.6131911 0.6093839 433.0405 gaussian fixed
3417.553 3558.648 19322.01 0.6795868 0.6764331 394.1002 bisquare adaptive
3510.019 3572.649 25261.23 0.5810978 0.5769747 451.1563 bisquare fixed
3778.920 3779.038 45665.27 0.2427415 0.2352882 NA OLS NA

Model GWR Terbaik

library(spgwr)

# 1. Definisikan formula GWR
gwr_formula <-  Y ~ X1 + X2+X3+X4+X5
# Model OLS

# 2. Pilih kernel dan tipe bandwidth
kernel <- "Gauss"
bw_type <- "adaptive"

# 3. Pilih fungsi bobot
gweight_fun <- gwr.bisquare

# 4. Cari bandwidth adaptif
bw_adaptive <- gwr.sel(
  formula = gwr_formula,
  data = gabung_sp,
  gweight = gweight_fun,
  adapt = TRUE,
  longlat = TRUE
)
## Adaptive q: 0.381966 CV score: 31929.74 
## Adaptive q: 0.618034 CV score: 35681.72 
## Adaptive q: 0.236068 CV score: 29680.01 
## Adaptive q: 0.145898 CV score: 28795.93 
## Adaptive q: 0.09016994 CV score: 29331.07 
## Adaptive q: 0.154129 CV score: 28905.6 
## Adaptive q: 0.1314287 CV score: 28690.72 
## Adaptive q: 0.1156693 CV score: 28762.37 
## Adaptive q: 0.1293638 CV score: 28701.21 
## Adaptive q: 0.1369555 CV score: 28706.1 
## Adaptive q: 0.1328487 CV score: 28698.69 
## Adaptive q: 0.131224 CV score: 28689.58 
## Adaptive q: 0.1305135 CV score: 28686.3 
## Adaptive q: 0.1300743 CV score: 28689.99 
## Adaptive q: 0.130665 CV score: 28686.9 
## Adaptive q: 0.1303457 CV score: 28685.77 
## Adaptive q: 0.1302421 CV score: 28687.38 
## Adaptive q: 0.1304098 CV score: 28685.92 
## Adaptive q: 0.130305 CV score: 28686.4 
## Adaptive q: 0.1303457 CV score: 28685.77
# 5. Jalankan GWR dengan bandwidth adaptif
gwr_adaptive_model <- gwr(
  formula = gwr_formula,
  data = gabung_sp,
  gweight = gweight_fun,
  adapt = bw_adaptive,
  hatmatrix = TRUE,
  se.fit = TRUE,
  longlat = TRUE
)

# 6. Lihat hasil
gwr_adaptive_model
## Call:
## gwr(formula = gwr_formula, data = gabung_sp, gweight = gweight_fun, 
##     adapt = bw_adaptive, hatmatrix = TRUE, longlat = TRUE, se.fit = TRUE)
## Kernel function: gweight_fun 
## Adaptive quantile: 0.1303457 (about 66 of 514 data points)
## Summary of GWR coefficient estimates at data points:
##                     Min.     1st Qu.      Median     3rd Qu.        Max.
## X.Intercept. -1.7214e+02 -8.8497e+01 -3.6525e+01 -1.2294e+01  1.0369e+02
## X1           -2.0044e+01 -9.7814e-01  4.6349e+00  1.6714e+01  2.7901e+01
## X2           -7.0028e-01  5.3061e-01  7.6404e-01  1.1814e+00  1.9528e+00
## X3           -4.2284e-01 -1.5797e-01 -5.9619e-03  1.0149e-01  3.3372e-01
## X4           -2.8709e+00  8.5916e-02  1.4626e+00  1.9098e+00  5.8301e+00
## X5           -6.7801e-01 -1.1615e-01  1.4915e-01  4.0478e-01  8.4654e-01
##                Global
## X.Intercept. -29.6983
## X1             5.8501
## X2             0.9515
## X3            -0.1114
## X4            -0.3979
## X5            -0.0522
## Number of data points: 514 
## Effective number of parameters (residual: 2traceS - traceS'S): 119.8998 
## Effective degrees of freedom (residual: 2traceS - traceS'S): 394.1002 
## Sigma (residual: 2traceS - traceS'S): 7.002011 
## Effective number of parameters (model: traceS): 94.7208 
## Effective degrees of freedom (model: traceS): 419.2792 
## Sigma (model: traceS): 6.78851 
## Sigma (ML): 6.131187 
## AICc (GWR p. 61, eq 2.33; p. 96, eq. 4.21): 3558.648 
## AIC (GWR p. 96, eq. 4.22): 3417.553 
## Residual sum of squares: 19322.01 
## Quasi-global R2: 0.6795868

Uji Anova

# Ambil RSS (Residual Sum of Squares) dari model OLS
ols_model
## 
## Call:
## lm(formula = gwr_formula, data = gabung_sp)
## 
## Coefficients:
## (Intercept)           X1           X2           X3           X4           X5  
##   -29.69830      5.85012      0.95153     -0.11140     -0.39788     -0.05219
RSS_OLS <- sum(residuals(ols_model)^2)
DF_OLS <- df.residual(ols_model)

# Ambil RSS dan DOF dari GWR
RSS_GWR <- sum(gwr_adaptive_model$SDF$gwr.e^2)
EDF_GWR <- gwr_adaptive_model$results$edf  # Effective Degrees of Freedom
DF_GWR <- EDF_GWR                 # Sesuai definisi DOF residual GWR

# Hitung peningkatan penyesuaian model
Improvement <- RSS_OLS - RSS_GWR
DF_Improvement <- DF_OLS - DF_GWR

# Mean Square (MS)
MS_Improvement <- Improvement / DF_Improvement
MS_GWR <- RSS_GWR / DF_GWR

# F-Hitung
F_hit <- MS_Improvement / MS_GWR

# Tabel ANOVA manual GWR
anova_manual <- data.frame(
  Sumber = c("Global Residuals (OLS)", "GWR Improvement", "GWR Residuals"),
  SS = c(RSS_OLS, Improvement, RSS_GWR),
  DF = c(DF_OLS, DF_Improvement, DF_GWR),
  MS = c(NA, MS_Improvement, MS_GWR),
  F = c(NA, NA, F_hit)
)

print(anova_manual)
##                   Sumber       SS       DF        MS        F
## 1 Global Residuals (OLS) 45665.27 508.0000        NA       NA
## 2        GWR Improvement 26343.26 113.8998 231.28451       NA
## 3          GWR Residuals 19322.01 394.1002  49.02816 4.717381
# Tampilkan hasil
kable(anova_manual)
Sumber SS DF MS F
Global Residuals (OLS) 45665.27 508.0000 NA NA
GWR Improvement 26343.26 113.8998 231.28451 NA
GWR Residuals 19322.01 394.1002 49.02816 4.71738
anova(gwr_adaptive_model,ols_model)
## Analysis of Variance Table 
##                    Df Sum Sq Mean Sq F value
## OLS Residuals     6.0  45665                
## GWR Improvement 113.9  26343 231.285        
## GWR Residuals   394.1  19322  49.028  4.7174
qf(1-0.05,DF_Improvement,DF_GWR)
## [1] 1.269287
qf(0.05,DF_Improvement,DF_GWR)
## [1] 0.7724948

Visualiasasi dan Tabel

library(sf)
library(dplyr)

# 1. Data GWR dari SDF, tambahkan idkab dari spKab_utm (asumsi urutannya cocok)
gwr_sf <- st_as_sf(gwr_adaptive_model$SDF)
gwr_sf$idkab <- spKab_utm$idkab  # <- pastikan ini cocok!

# 2. Ambil geometri asli dari spKab_utm (pastikan ini adalah polygon, bukan titik!)nmkab
geom_ref <- spKab_utm %>% dplyr::select(idkab,nmkab ,geometry)

# 3. Gabungkan: gunakan data dari GWR (gwr_sf) dan ambil geometri dari geom_ref
gwr_joined <- left_join(st_drop_geometry(gwr_sf), geom_ref, by = "idkab") %>%
  st_as_sf()

# 4. Visualisasi: geometri harus polygon, bukan titik!
plot(st_geometry(gwr_joined))  # Cek, harus terlihat area, bukan titik

# 5. Jika perlu ubah ke Spatial untuk spplot:
gwr_sp <- as(gwr_joined, "Spatial")

Uji Signifikansi Parsial Lokal

Peta Lengkap Signifikansi Parsial

library(sf)
library(sp)


vars <- c("X1","X2","X3","X4","X5")



for (v in vars) {
  # Koefisien dan standar error
  coef_val <- gwr_sp@data[[v]]
  se_val <- gwr_sp@data[[paste0(v, "_se")]]
  t_val <- coef_val / se_val
  
  # 1. Simpan koefisien
  gwr_sp@data[[paste0("b_", v)]] <- coef_val
  
  # 2. Simpan status signifikan
  signif_flag <- ifelse(abs(t_val) > 1.96, "Ya", "Tidak")
  gwr_sp@data[[paste0("sig_", v)]] <- factor(signif_flag, levels = c("Tidak", "Ya"))
  
  # 3. Simpan koefisien hanya signifikan
  gwr_sp@data[[paste0("b_", v, "_sig")]] <- ifelse(abs(t_val) > 1.96, coef_val, NA)
  
  # --- Peta 1: Koefisien
  print(spplot(gwr_sp, zcol = paste0("b_", v),
               main = paste("Peta Koefisien", v),
               col.regions = colorRampPalette(c("blue", "white", "red"))(100),
               na.col = "grey"))
  
  # --- Peta 2: Signifikansi
  print(spplot(gwr_sp, zcol = paste0("sig_", v),
               main = paste("Signifikansi", v),
               col.regions = c("black", "red")))
  
  # --- Peta 3: Koefisien Hanya Signifikan
  print(spplot(gwr_sp, zcol = paste0("b_", v, "_sig"),
               main = paste("Koefisien Signifikan", v),
               col.regions = colorRampPalette(c("blue", "green", "red"))(100),
               na.col = "black"))
}

Tabel Jumlah Kabupaten berdasarkan Variabel Signifikan

# Hitung jumlah kabupaten/kota yang signifikan (bernilai "Ya")
sig_counts <- sapply(vars, function(v) {
  kolom_nama <- paste0("sig_", v)
  sum(gwr_sp@data[[kolom_nama]] == "Ya", na.rm = TRUE)
})

# Buat data frame hasil
tabel7 <- data.frame(
  `Variabel Independen` = vars,
  `Jumlah Kabupaten/Kota Signifikan` = sig_counts
)

# Tampilkan tabel
kable(tabel7)
Variabel.Independen Jumlah.Kabupaten.Kota.Signifikan
X1 X1 151
X2 X2 257
X3 X3 77
X4 X4 149
X5 X5 234

Visualisasi Final Koefisien Signifikan

library(RColorBrewer)
library(classInt)
library(sp)

for (v in vars) {
  val <- gwr_sp@data[[paste0("b_", v, "_sig")]]
  
  # Inisialisasi vektor kategori NA
  cat_val <- rep(NA_character_, length(val))
  
  label_list <- c()
  color_list <- c()
  
  # --- NEGATIF ---
  val_neg <- val[val < 0 & !is.na(val)]
  if (length(val_neg) >= 3) {
    brk_neg <- classIntervals(val_neg, n = 3, style = "quantile")$brks
    neg_cuts <- cut(val, breaks = brk_neg, include.lowest = TRUE, dig.lab = 2)
    neg_lvls <- levels(neg_cuts)

    # Format label
    labels_neg <- gsub(",", ";", neg_lvls)
    labels_neg <- gsub("\\.", ",", labels_neg)
    
    cat_val[val < 0 & !is.na(val)] <- labels_neg[as.numeric(neg_cuts[val < 0 & !is.na(val)])]
    
    label_list <- c(label_list, labels_neg)
    color_list <- c(color_list, c("#8B0000", "#B22222", "#CD5C5C")[1:length(labels_neg)])
  }

  # --- POSITIF ---
  val_pos <- val[val > 0 & !is.na(val)]
  if (length(val_pos) >= 3) {
    brk_pos <- classIntervals(val_pos, n = 3, style = "quantile")$brks
    pos_cuts <- cut(val, breaks = brk_pos, include.lowest = TRUE, dig.lab = 2)
    pos_lvls <- levels(pos_cuts)

    # Format label
    labels_pos <- gsub(",", ";", pos_lvls)
    labels_pos <- gsub("\\.", ",", labels_pos)
    
    cat_val[val > 0 & !is.na(val)] <- labels_pos[as.numeric(pos_cuts[val > 0 & !is.na(val)])]
    
    label_list <- c(label_list, labels_pos)
    color_list <- c(color_list, c("#87CEFA", "#4682B4", "#00008B")[1:length(labels_pos)])
  }

  # --- Tidak Signifikan (NA) ---
  cat_val[is.na(cat_val)] <- "Tidak Signifikan"
  label_list <- c(label_list, "Tidak Signifikan")
  color_list <- c(color_list, "black")
  
  # Faktor berurutan
  cat_val <- factor(cat_val, levels = label_list)

  # Tambahkan ke data
  gwr_sp@data[[paste0("b_", v, "_sig_cat")]] <- cat_val

 

  # Plot
  print(
    spplot(gwr_sp, zcol = paste0("b_", v, "_sig_cat"),
           main = paste("Koefisien Signifikan", v),
           col.regions = setNames(color_list, label_list),
           par.settings = list(layout.heights = list(key.bottom = 2), axis.line = list(col = NA)),
           colorkey = list(
             space = "bottom",
             labels = list(
               at = 1:length(label_list),
               labels = label_list,
               cex = 1
             ),
             height = 1
           ))
  )

}

Pengelompokkan Nilai Koefisien dan Signifikansi Parsial

# Daftar variabel yang dianalisis (misalnya sudah didefinisikan sebelumnya)
vars <- c("X1","X2","X3","X4","X5")  # ganti sesuai variabelmu

# Inisialisasi hasil
hasil_tabel <- data.frame(Koef = c("Positif", "Negatif"), stringsAsFactors = FALSE)

# Loop per variabel (misalnya X1 sampai Xn)
for (v in vars) {
  kolom_nama <- paste0("b_", v, "_sig")  # Kolom berisi koefisien signifikan
  
  # Pastikan kolom ada
  if (!kolom_nama %in% names(gwr_sp@data)) next
  
  val <- gwr_sp@data[[kolom_nama]]
  nama <- gwr_sp@data$nmkab  # atau NAMOBJ jika itu nama wilayah
  
  # Filter yang signifikan dan positif/negatif
  positif <- nama[which(val > 0 & !is.na(val))]
  negatif <- nama[which(val < 0 & !is.na(val))]
  
  # Gabungkan nama kecamatan
  hasil_tabel[[v]] <- c(
    if (length(positif) > 0) paste(sort(positif), collapse = ", ") else "-",
    if (length(negatif) > 0) paste(sort(negatif), collapse = ", ") else "-"
  )
}

# Tampilkan hasil
kable(hasil_tabel, row.names = FALSE)
Koef X1 X2 X3 X4 X5
Positif ACEH BARAT, ACEH BARAT DAYA, ACEH BESAR, ACEH JAYA, ACEH SELATAN, ACEH SINGKIL, ACEH TAMIANG, ACEH TENGAH, ACEH TENGGARA, ACEH TIMUR, ACEH UTARA, AGAM, ASAHAN, BANDA ACEH, BANGGAI, BANGGAI KEPULAUAN, BANGGAI LAUT, BANTAENG, BARRU, BATU BARA, BAUBAU, BENER MERIAH, BENGKALIS, BINJAI, BIREUEN, BOMBANA, BONE, BONTANG, BUKITTINGGI, BULUKUMBA, BURU, BURU SELATAN, BUTON, BUTON SELATAN, BUTON TENGAH, BUTON UTARA, D U M A I, DAIRI, DELI SERDANG, DONGGALA, ENREKANG, GAYO LUES, GOWA, GUNUNGSITOLI, HUMBANG HASUNDUTAN, JENEPONTO, KAMPAR, KARO, KENDARI, KEPULAUAN MENTAWAI, KEPULAUAN SELAYAR, KEPULAUAN SULA, KOLAKA, KOLAKA TIMUR, KOLAKA UTARA, KONAWE, KONAWE KEPULAUAN, KONAWE SELATAN, KONAWE UTARA, LABUHAN BATU, LABUHAN BATU SELATAN, LABUHAN BATU UTARA, LANGKAT, LANGSA, LHOKSEUMAWE, LIMA PULUH KOTA, LUWU, LUWU TIMUR, LUWU UTARA, MAJENE, MAKASSAR, MAMASA, MAMUJU, MAMUJU TENGAH, MANDAILING NATAL, MANGGARAI, MANGGARAI BARAT, MANGGARAI TIMUR, MAROS, MEDAN, MOROWALI, MOROWALI UTARA, MUNA, MUNA BARAT, NAGAN RAYA, NIAS, NIAS BARAT, NIAS SELATAN, NIAS UTARA, PADANG, PADANG LAWAS, PADANG LAWAS UTARA, PADANG PANJANG, PADANG PARIAMAN, PADANGSIDIMPUAN, PAKPAK BHARAT, PALOPO, PALU, PANGKAJENE DAN KEPULAUAN, PAREPARE, PARIAMAN, PASAMAN, PASAMAN BARAT, PASANGKAYU, PAYAKUMBUH, PEKANBARU, PEMATANG SIANTAR, PIDIE, PIDIE JAYA, PINRANG, POLEWALI MANDAR, POSO, PULAU TALIABU, ROKAN HILIR, ROKAN HULU, S I A K, SABANG, SAMOSIR, SAWAH LUNTO, SERDANG BEDAGAI, SIBOLGA, SIDENRENG RAPPANG, SIGI, SIJUNJUNG, SIMALUNGUN, SIMEULUE, SINJAI, SOLOK, SOLOK, SOPPENG, SUBULUSSALAM, TAKALAR, TANA TORAJA, TANAH DATAR, TANJUNG BALAI, TAPANULI SELATAN, TAPANULI TENGAH, TAPANULI UTARA, TEBING TINGGI, TOBA, TOJO UNA-UNA, TORAJA UTARA, WAJO, WAKATOBI ACEH BARAT, ACEH BARAT DAYA, ACEH BESAR, ACEH JAYA, ACEH SELATAN, ACEH SINGKIL, ACEH TAMIANG, ACEH TENGAH, ACEH TENGGARA, ACEH TIMUR, ACEH UTARA, AMBON, ASAHAN, ASMAT, BANDA ACEH, BANDUNG, BANDUNG, BANGGAI KEPULAUAN, BANGGAI LAUT, BANJAR, BANJARNEGARA, BANTAENG, BANTUL, BANYU ASIN, BANYUMAS, BARRU, BATANG, BATU, BATU BARA, BENER MERIAH, BENGKULU SELATAN, BIAK NUMFOR, BINJAI, BIREUEN, BLITAR, BLITAR, BLORA, BOJONEGORO, BOMBANA, BONE, BOVEN DIGOEL, BOYOLALI, BREBES, BULUKUMBA, BURU, BURU SELATAN, CIAMIS, CILACAP, CIMAHI, CIREBON, CIREBON, DAIRI, DEIYAI, DELI SERDANG, DEMAK, DOGIYAI, EMPAT LAWANG, ENREKANG, FAKFAK, GARUT, GAYO LUES, GOWA, GROBOGAN, GUNUNG KIDUL, GUNUNGSITOLI, HALMAHERA BARAT, HALMAHERA TENGAH, HALMAHERA TIMUR, HALMAHERA UTARA, HUMBANG HASUNDUTAN, INDRAMAYU, INTAN JAYA, JAYAPURA, JAYAPURA, JAYAWIJAYA, JENEPONTO, JEPARA, JOMBANG, KAIMANA, KARANGANYAR, KARO, KAUR, KEBUMEN, KEDIRI, KEDIRI, KEEROM, KENDAL, KENDARI, KEPULAUAN ARU, KEPULAUAN SELAYAR, KEPULAUAN SULA, KEPULAUAN TANIMBAR, KEPULAUAN YAPEN, KLATEN, KOLAKA, KOLAKA TIMUR, KOLAKA UTARA, KONAWE, KONAWE SELATAN, KONAWE UTARA, KUDUS, KULON PROGO, KUNINGAN, LABUHAN BATU, LABUHAN BATU SELATAN, LABUHAN BATU UTARA, LAHAT, LAMONGAN, LAMPUNG BARAT, LANGKAT, LANGSA, LANNY JAYA, LHOKSEUMAWE, LUMAJANG, LUWU, LUWU TIMUR, LUWU UTARA, MADIUN, MADIUN, MAGELANG, MAGELANG, MAGETAN, MAJALENGKA, MAJENE, MAKASSAR, MALANG, MALANG, MALUKU BARAT DAYA, MALUKU TENGAH, MALUKU TENGGARA, MAMASA, MAMBERAMO RAYA, MAMBERAMO TENGAH, MAMUJU, MANDAILING NATAL, MANOKWARI, MANOKWARI SELATAN, MAPPI, MAROS, MAYBRAT, MEDAN, MERAUKE, MIMIKA, MOJOKERTO, MOJOKERTO, MOROWALI, MUARA ENIM, MUSI BANYUASIN, NABIRE, NAGAN RAYA, NDUGA, NGANJUK, NGAWI, NIAS, NIAS BARAT, NIAS SELATAN, NIAS UTARA, OGAN ILIR, OGAN KOMERING ULU, OGAN KOMERING ULU SELATAN, OGAN KOMERING ULU TIMUR, PACITAN, PADANG LAWAS, PADANG LAWAS UTARA, PADANGSIDIMPUAN, PAGAR ALAM, PAKPAK BHARAT, PALEMBANG, PALOPO, PANGANDARAN, PANGKAJENE DAN KEPULAUAN, PANIAI, PAREPARE, PASURUAN, PASURUAN, PATI, PEGUNUNGAN ARFAK, PEGUNUNGAN BINTANG, PEKALONGAN, PEKALONGAN, PEMALANG, PEMATANG SIANTAR, PENUKAL ABAB LEMATANG ILIR, PESISIR BARAT, PIDIE, PIDIE JAYA, PINRANG, POLEWALI MANDAR, PONOROGO, PRABUMULIH, PULAU MOROTAI, PULAU TALIABU, PUNCAK, PUNCAK JAYA, PURBALINGGA, PURWOREJO, RAJA AMPAT, REMBANG, SABANG, SALATIGA, SAMOSIR, SARMI, SEMARANG, SEMARANG, SERAM BAGIAN BARAT, SERAM BAGIAN TIMUR, SERDANG BEDAGAI, SIBOLGA, SIDENRENG RAPPANG, SIDOARJO, SIMALUNGUN, SIMEULUE, SINJAI, SLEMAN, SOPPENG, SORONG, SORONG, SORONG SELATAN, SRAGEN, SUBULUSSALAM, SUKOHARJO, SUMEDANG, SUPIORI, SURABAYA, SURAKARTA, TAKALAR, TAMBRAUW, TANA TORAJA, TANJUNG BALAI, TAPANULI SELATAN, TAPANULI TENGAH, TAPANULI UTARA, TASIKMALAYA, TASIKMALAYA, TEBING TINGGI, TEGAL, TEGAL, TELUK BINTUNI, TELUK WONDAMA, TEMANGGUNG, TIDORE KEPULAUAN, TOBA, TOLIKARA, TORAJA UTARA, TRENGGALEK, TUAL, TUBAN, TULANG BAWANG BARAT, TULUNGAGUNG, WAJO, WAROPEN, WAY KANAN, WONOGIRI, WONOSOBO, YAHUKIMO, YALIMO, YOGYAKARTA KENDARI, KOLAKA, KOLAKA TIMUR, KOLAKA UTARA, KONAWE, KONAWE KEPULAUAN, KONAWE SELATAN, KONAWE UTARA, LUWU TIMUR, MOROWALI ACEH BARAT, ACEH BARAT DAYA, ACEH BESAR, ACEH JAYA, ACEH SELATAN, ACEH SINGKIL, ACEH TAMIANG, ACEH TENGAH, ACEH TENGGARA, ACEH TIMUR, ACEH UTARA, ASAHAN, BANDA ACEH, BANGGAI, BANGGAI KEPULAUAN, BANGGAI LAUT, BANYU ASIN, BATU BARA, BENER MERIAH, BENGKALIS, BINJAI, BIREUEN, BURU, BURU SELATAN, D U M A I, DAIRI, DELI SERDANG, GAYO LUES, GUNUNGSITOLI, HUMBANG HASUNDUTAN, KAMPAR, KARO, KAUR, KENDARI, KEPULAUAN SULA, KOLAKA UTARA, KONAWE, KONAWE KEPULAUAN, KONAWE UTARA, LABUHAN BATU, LABUHAN BATU SELATAN, LABUHAN BATU UTARA, LAMPUNG BARAT, LAMPUNG TENGAH, LAMPUNG UTARA, LANGKAT, LANGSA, LHOKSEUMAWE, LUWU TIMUR, MAJENE, MAMASA, MAMUJU, MAMUJU TENGAH, MEDAN, MESUJI, MOROWALI, MUARA ENIM, NAGAN RAYA, NIAS, NIAS BARAT, NIAS UTARA, OGAN ILIR, OGAN KOMERING ILIR, OGAN KOMERING ULU, OGAN KOMERING ULU SELATAN, OGAN KOMERING ULU TIMUR, PADANG LAWAS, PADANG LAWAS UTARA, PADANGSIDIMPUAN, PAGAR ALAM, PAKPAK BHARAT, PALEMBANG, PALU, PASANGKAYU, PEKANBARU, PEMATANG SIANTAR, PENUKAL ABAB LEMATANG ILIR, PESISIR BARAT, PIDIE, PIDIE JAYA, PRABUMULIH, PRINGSEWU, PULAU TALIABU, ROKAN HILIR, ROKAN HULU, S I A K, SABANG, SAMOSIR, SERDANG BEDAGAI, SIBOLGA, SIGI, SIMALUNGUN, SIMEULUE, SUBULUSSALAM, TANGGAMUS, TANJUNG BALAI, TAPANULI SELATAN, TAPANULI TENGAH, TAPANULI UTARA, TEBING TINGGI, TOBA, TULANG BAWANG BARAT, TULANGBAWANG, WAY KANAN AGAM, ASMAT, B A T A M, BANDAR LAMPUNG, BANDUNG, BANDUNG, BANDUNG BARAT, BANGGAI, BANGGAI KEPULAUAN, BANGGAI LAUT, BANJAR, BANJARNEGARA, BANYUMAS, BARRU, BATANG, BEKASI, BEKASI, BENGKALIS, BIAK NUMFOR, BOGOR, BOGOR, BOMBANA, BONE, BOVEN DIGOEL, BREBES, BUKITTINGGI, BUNGO, BURU, BURU SELATAN, BUTON UTARA, CIAMIS, CIANJUR, CILACAP, CILEGON, CIMAHI, CIREBON, CIREBON, D U M A I, DEIYAI, DEPOK, DHARMASRAYA, DOGIYAI, DONGGALA, ENREKANG, FAKFAK, GARUT, GOWA, INDRAGIRI HILIR, INDRAGIRI HULU, INDRAMAYU, INTAN JAYA, JAKARTA BARAT, JAKARTA PUSAT, JAKARTA SELATAN, JAKARTA TIMUR, JAKARTA UTARA, JAYAPURA, JAYAPURA, JAYAWIJAYA, KAIMANA, KAMPAR, KARAWANG, KARIMUN, KEBUMEN, KEEROM, KENDARI, KEPULAUAN ARU, KEPULAUAN MERANTI, KEPULAUAN SERIBU, KEPULAUAN TANIMBAR, KEPULAUAN YAPEN, KERINCI, KOLAKA, KOLAKA TIMUR, KOLAKA UTARA, KONAWE, KONAWE KEPULAUAN, KONAWE SELATAN, KONAWE UTARA, KUANTAN SINGINGI, KUNINGAN, LAMPUNG SELATAN, LAMPUNG TIMUR, LANNY JAYA, LEBAK, LIMA PULUH KOTA, LUWU, LUWU TIMUR, LUWU UTARA, MAJALENGKA, MAJENE, MAKASSAR, MALUKU TENGGARA, MAMASA, MAMBERAMO RAYA, MAMBERAMO TENGAH, MAMUJU, MAMUJU TENGAH, MANOKWARI, MANOKWARI SELATAN, MAPPI, MAROS, MAYBRAT, MERAUKE, METRO, MIMIKA, MOROWALI, MOROWALI UTARA, MUNA, MUNA BARAT, NABIRE, NDUGA, PADANG, PADANG PANJANG, PADANG PARIAMAN, PALOPO, PALU, PANDEGLANG, PANGANDARAN, PANGKAJENE DAN KEPULAUAN, PANIAI, PAREPARE, PARIAMAN, PARIGI MOUTONG, PASAMAN, PASANGKAYU, PAYAKUMBUH, PEGUNUNGAN ARFAK, PEGUNUNGAN BINTANG, PEKALONGAN, PEKALONGAN, PEKANBARU, PELALAWAN, PEMALANG, PESAWARAN, PESISIR SELATAN, PINRANG, POLEWALI MANDAR, POSO, PULAU TALIABU, PUNCAK, PUNCAK JAYA, PURBALINGGA, PURWAKARTA, ROKAN HULU, S I A K, SARMI, SAWAH LUNTO, SERANG, SERANG, SIDENRENG RAPPANG, SIGI, SIJUNJUNG, SINJAI, SOLOK, SOLOK, SOLOK SELATAN, SOPPENG, SUBANG, SUKABUMI, SUKABUMI, SUMEDANG, SUNGAI PENUH, SUPIORI, TAMBRAUW, TANA TORAJA, TANAH DATAR, TANGERANG, TANGERANG, TANGERANG SELATAN, TANJUNG JABUNG BARAT, TANJUNG PINANG, TASIKMALAYA, TASIKMALAYA, TEBO, TEGAL, TEGAL, TELUK BINTUNI, TELUK WONDAMA, TOJO UNA-UNA, TOLIKARA, TORAJA UTARA, TUAL, WAJO, WAROPEN, WONOSOBO, YAHUKIMO, YALIMO
Negatif BANJARNEGARA, BANYUMAS, KEBUMEN, PEKALONGAN, PEMALANG, PURBALINGGA, TANAH LAUT - ALOR, BADUNG, BANGKALAN, BANGLI, BANYUWANGI, BATU, BELU, BIMA, BIMA, BLITAR, BLITAR, BOJONEGORO, BONDOWOSO, BULELENG, DENPASAR, DOMPU, ENDE, FLORES TIMUR, GIANYAR, GRESIK, JEMBER, JEMBRANA, JOMBANG, KARANGASEM, KEDIRI, KEDIRI, KEPULAUAN SELAYAR, KLUNGKUNG, KUPANG, KUPANG, LAMONGAN, LEMBATA, LUMAJANG, MADIUN, MALAKA, MALANG, MALANG, MANGGARAI, MANGGARAI BARAT, MANGGARAI TIMUR, MOJOKERTO, MOJOKERTO, NAGEKEO, NGADA, NGANJUK, PAMEKASAN, PASURUAN, PASURUAN, PONOROGO, PROBOLINGGO, PROBOLINGGO, ROTE NDAO, SABU RAIJUA, SAMPANG, SIDOARJO, SIKKA, SITUBONDO, SUMBA TENGAH, SUMBA TIMUR, SUMENEP, SURABAYA, TABANAN, TIMOR TENGAH SELATAN, TIMOR TENGAH UTARA, TRENGGALEK, TUBAN, TULUNGAGUNG ASMAT, BIAK NUMFOR, BOVEN DIGOEL, DEIYAI, DOGIYAI, FAKFAK, INTAN JAYA, JAYAPURA, JAYAPURA, JAYAWIJAYA, KAIMANA, KEEROM, KEPULAUAN ARU, KEPULAUAN TANIMBAR, KEPULAUAN YAPEN, LANNY JAYA, MALUKU TENGGARA, MAMBERAMO RAYA, MAMBERAMO TENGAH, MANOKWARI, MANOKWARI SELATAN, MAPPI, MAYBRAT, MERAUKE, MIMIKA, NABIRE, NDUGA, PANIAI, PEGUNUNGAN ARFAK, PEGUNUNGAN BINTANG, PUNCAK, PUNCAK JAYA, SARMI, SORONG, SORONG, SORONG SELATAN, SUPIORI, TAMBRAUW, TELUK BINTUNI, TELUK WONDAMA, TOLIKARA, TUAL, WAROPEN, YAHUKIMO, YALIMO ACEH BARAT, ACEH BARAT DAYA, ACEH BESAR, ACEH JAYA, ACEH SELATAN, ACEH SINGKIL, ACEH TAMIANG, ACEH TENGAH, ACEH TENGGARA, ACEH TIMUR, ACEH UTARA, ASAHAN, BANDA ACEH, BATU BARA, BENER MERIAH, BINJAI, BIREUEN, DAIRI, DELI SERDANG, GAYO LUES, GUNUNGSITOLI, HUMBANG HASUNDUTAN, KARO, LANGKAT, LANGSA, LHOKSEUMAWE, MEDAN, NAGAN RAYA, NIAS, NIAS BARAT, NIAS UTARA, PAKPAK BHARAT, PEMATANG SIANTAR, PIDIE, PIDIE JAYA, SABANG, SAMOSIR, SERDANG BEDAGAI, SIBOLGA, SIMALUNGUN, SIMEULUE, SUBULUSSALAM, TAPANULI TENGAH, TAPANULI UTARA, TEBING TINGGI, TOBA

Tabel Jumlah Kabupaten dengan Kelompok Kombinasi Signifikansi Parsial

# Ambil kolom signifikan (TRUE/FALSE) dari variabel tertentu
sig_df <- gwr_sp@data[, paste0("sig_", vars)]

# Pastikan dalam bentuk logical TRUE/FALSE
sig_df <- lapply(sig_df, function(x) {
  if (is.factor(x)) as.logical(as.numeric(as.character(x) == "Ya")) else as.logical(x)
})
sig_df <- as.data.frame(sig_df)

# Buat kolom var_sig (nama variabel yang signifikan)
gwr_sf$var_sig <- apply(sig_df, 1, function(row) {
  signif_vars <- vars[which(row)]
  if (length(signif_vars) == 0) {
    return("Tidak ada")
  } else {
    return(paste(signif_vars, collapse = ", "))
  }
})
library(dplyr)

# --- Ambil nilai signifikan dari gwr_sp
sig_df <- gwr_sp@data[, paste0("sig_", vars)]

# --- Pastikan hasilnya logical
sig_df <- lapply(sig_df, function(x) {
  if (is.factor(x)) as.character(x) == "Ya" else as.logical(x)
})
sig_df <- as.data.frame(sig_df)

# --- Buat kolom var_sig langsung di @data
gwr_sp@data$var_sig <- apply(sig_df, 1, function(row) {
  signif_vars <- vars[which(row)]
  if (length(signif_vars) == 0) {
    return("Tidak ada")
  } else {
    return(paste(sort(signif_vars), collapse = ", "))
  }
})

# --- Rekap: nama kecamatan per kategori var_sig
tabel_kec_per_kategori <- gwr_sp@data %>%
  group_by(var_sig) %>%
  summarise(
    daftar_kabupaten = paste(sort(unique(nmkab)), collapse = ", "),
    jumlah = dplyr::n()
  ) %>%
  arrange(var_sig)

# --- Tampilkan semua hasil
kable(tabel_kec_per_kategori, n = Inf)
var_sig daftar_kabupaten jumlah
Tidak ada BALANGAN, BALIKPAPAN, BANGKA, BANGKA BARAT, BANGKA SELATAN, BANGKA TENGAH, BANJAR, BANJAR BARU, BANJARMASIN, BARITO KUALA, BARITO SELATAN, BARITO TIMUR, BARITO UTARA, BATANG HARI, BELITUNG, BELITUNG TIMUR, BENGKAYANG, BENGKULU, BENGKULU TENGAH, BENGKULU UTARA, BERAU, BINTAN, BITUNG, BOALEMO, BOLAANG MONGONDOW, BOLAANG MONGONDOW SELATAN, BOLAANG MONGONDOW TIMUR, BOLAANG MONGONDOW UTARA, BONE BOLANGO, BULUNGAN, BUOL, GORONTALO, GORONTALO UTARA, GUNUNG MAS, HALMAHERA SELATAN, HULU SUNGAI SELATAN, HULU SUNGAI TENGAH, HULU SUNGAI UTARA, JAMBI, KAPUAS, KAPUAS HULU, KATINGAN, KAYONG UTARA, KEPAHIANG, KEPULAUAN ANAMBAS, KEPULAUAN SANGIHE, KEPULAUAN TALAUD, KETAPANG, KOTABARU, KOTAMOBAGU, KOTAWARINGIN BARAT, KOTAWARINGIN TIMUR, KUBU RAYA, KUTAI BARAT, KUTAI KARTANEGARA, KUTAI TIMUR, LAMANDAU, LANDAK, LEBONG, LINGGA, LOMBOK BARAT, LOMBOK TENGAH, LOMBOK TIMUR, LOMBOK UTARA, LUBUKLINGGAU, MAHAKAM HULU, MALINAU, MANADO, MATARAM, MELAWI, MEMPAWAH, MERANGIN, MINAHASA, MINAHASA SELATAN, MINAHASA TENGGARA, MINAHASA UTARA, MUARO JAMBI, MUKOMUKO, MURUNG RAYA, MUSI RAWAS, MUSI RAWAS UTARA, NATUNA, NUNUKAN, PALANGKA RAYA, PANGKALPINANG, PASER, PENAJAM PASER UTARA, POHUWATO, PONTIANAK, PULANG PISAU, REJANG LEBONG, SAMARINDA, SAMBAS, SANGGAU, SAROLANGUN, SEKADAU, SELUMA, SERUYAN, SIAU TAGULANDANG BIARO, SINGKAWANG, SINTANG, SUKAMARA, SUMBA BARAT, SUMBA BARAT DAYA, SUMBAWA, SUMBAWA BARAT, TABALONG, TANA TIDUNG, TANAH BUMBU, TANJUNG JABUNG TIMUR, TAPIN, TARAKAN, TERNATE, TOLI-TOLI, TOMOHON 116
X1 BAUBAU, BONTANG, BUTON, BUTON SELATAN, BUTON TENGAH, KEPULAUAN MENTAWAI, PASAMAN BARAT, TANAH LAUT, WAKATOBI 9
X1, X2 BANTAENG, BULUKUMBA, JENEPONTO, MANDAILING NATAL, NIAS SELATAN, TAKALAR 6
X1, X2, X3 KEPULAUAN SELAYAR 1
X1, X2, X3, X4, X5 KENDARI, KOLAKA UTARA, KONAWE, KONAWE UTARA, LUWU TIMUR, MOROWALI 6
X1, X2, X3, X5 KOLAKA, KOLAKA TIMUR, KONAWE SELATAN 3
X1, X2, X4 KEPULAUAN SULA, LABUHAN BATU, LABUHAN BATU SELATAN, LABUHAN BATU UTARA, PADANG LAWAS, PADANG LAWAS UTARA, PADANGSIDIMPUAN, TANJUNG BALAI, TAPANULI SELATAN 9
X1, X2, X4, X5 ACEH BARAT, ACEH BARAT DAYA, ACEH BESAR, ACEH JAYA, ACEH SELATAN, ACEH SINGKIL, ACEH TAMIANG, ACEH TENGAH, ACEH TENGGARA, ACEH TIMUR, ACEH UTARA, ASAHAN, BANDA ACEH, BANGGAI KEPULAUAN, BANGGAI LAUT, BATU BARA, BENER MERIAH, BINJAI, BIREUEN, BURU, BURU SELATAN, DAIRI, DELI SERDANG, GAYO LUES, GUNUNGSITOLI, HUMBANG HASUNDUTAN, KARO, LANGKAT, LANGSA, LHOKSEUMAWE, MAJENE, MAMASA, MAMUJU, MEDAN, NAGAN RAYA, NIAS, NIAS BARAT, NIAS UTARA, PAKPAK BHARAT, PEMATANG SIANTAR, PIDIE, PIDIE JAYA, PULAU TALIABU, SABANG, SAMOSIR, SERDANG BEDAGAI, SIBOLGA, SIMALUNGUN, SIMEULUE, SUBULUSSALAM, TAPANULI TENGAH, TAPANULI UTARA, TEBING TINGGI, TOBA 54
X1, X2, X5 BANJARNEGARA, BANYUMAS, BARRU, BOMBANA, BONE, ENREKANG, GOWA, KEBUMEN, LUWU, LUWU UTARA, MAKASSAR, MAROS, PALOPO, PANGKAJENE DAN KEPULAUAN, PAREPARE, PEKALONGAN, PEMALANG, PINRANG, POLEWALI MANDAR, PURBALINGGA, SIDENRENG RAPPANG, SINJAI, SOPPENG, TANA TORAJA, TORAJA UTARA, WAJO 26
X1, X3 MANGGARAI, MANGGARAI BARAT, MANGGARAI TIMUR 3
X1, X3, X4, X5 KONAWE KEPULAUAN 1
X1, X4 ROKAN HILIR 1
X1, X4, X5 BANGGAI, BENGKALIS, D U M A I, KAMPAR, MAMUJU TENGAH, PALU, PASANGKAYU, PEKANBARU, ROKAN HULU, S I A K, SIGI 11
X1, X5 AGAM, BUKITTINGGI, BUTON UTARA, DONGGALA, LIMA PULUH KOTA, MOROWALI UTARA, MUNA, MUNA BARAT, PADANG, PADANG PANJANG, PADANG PARIAMAN, PARIAMAN, PASAMAN, PAYAKUMBUH, POSO, SAWAH LUNTO, SIJUNJUNG, SOLOK, TANAH DATAR, TOJO UNA-UNA 21
X2 AMBON, BANTUL, BENGKULU SELATAN, BLORA, BOYOLALI, DEMAK, EMPAT LAWANG, GROBOGAN, GUNUNG KIDUL, HALMAHERA BARAT, HALMAHERA TENGAH, HALMAHERA TIMUR, HALMAHERA UTARA, JEPARA, KARANGANYAR, KENDAL, KLATEN, KUDUS, KULON PROGO, LAHAT, MADIUN, MAGELANG, MAGETAN, MALUKU BARAT DAYA, MALUKU TENGAH, MUSI BANYUASIN, NGAWI, PACITAN, PATI, PULAU MOROTAI, PURWOREJO, RAJA AMPAT, REMBANG, SALATIGA, SEMARANG, SERAM BAGIAN BARAT, SERAM BAGIAN TIMUR, SLEMAN, SRAGEN, SUKOHARJO, SURAKARTA, TEMANGGUNG, TIDORE KEPULAUAN, WONOGIRI, YOGYAKARTA 47
X2, X3 BATU, BLITAR, BOJONEGORO, JOMBANG, KEDIRI, LAMONGAN, LUMAJANG, MADIUN, MALANG, MOJOKERTO, NGANJUK, PASURUAN, PONOROGO, SIDOARJO, SURABAYA, TRENGGALEK, TUBAN, TULUNGAGUNG 23
X2, X4 BANYU ASIN, KAUR, LAMPUNG BARAT, MUARA ENIM, OGAN ILIR, OGAN KOMERING ULU, OGAN KOMERING ULU SELATAN, OGAN KOMERING ULU TIMUR, PAGAR ALAM, PALEMBANG, PENUKAL ABAB LEMATANG ILIR, PESISIR BARAT, PRABUMULIH, SORONG, SORONG SELATAN, TULANG BAWANG BARAT, WAY KANAN 18
X2, X4, X5 ASMAT, BIAK NUMFOR, BOVEN DIGOEL, DEIYAI, DOGIYAI, FAKFAK, INTAN JAYA, JAYAPURA, JAYAWIJAYA, KAIMANA, KEEROM, KEPULAUAN ARU, KEPULAUAN TANIMBAR, KEPULAUAN YAPEN, LANNY JAYA, MALUKU TENGGARA, MAMBERAMO RAYA, MAMBERAMO TENGAH, MANOKWARI, MANOKWARI SELATAN, MAPPI, MAYBRAT, MERAUKE, MIMIKA, NABIRE, NDUGA, PANIAI, PEGUNUNGAN ARFAK, PEGUNUNGAN BINTANG, PUNCAK, PUNCAK JAYA, SARMI, SUPIORI, TAMBRAUW, TELUK BINTUNI, TELUK WONDAMA, TOLIKARA, TUAL, WAROPEN, YAHUKIMO, YALIMO 42
X2, X5 BANDUNG, BANJAR, BATANG, BREBES, CIAMIS, CILACAP, CIMAHI, CIREBON, GARUT, INDRAMAYU, KUNINGAN, MAJALENGKA, PANGANDARAN, PEKALONGAN, SUMEDANG, TASIKMALAYA, TEGAL, WONOSOBO 22
X3 ALOR, BADUNG, BANGKALAN, BANGLI, BANYUWANGI, BELU, BIMA, BONDOWOSO, BULELENG, DENPASAR, DOMPU, ENDE, FLORES TIMUR, GIANYAR, GRESIK, JEMBER, JEMBRANA, KARANGASEM, KLUNGKUNG, KUPANG, LEMBATA, MALAKA, NAGEKEO, NGADA, PAMEKASAN, PROBOLINGGO, ROTE NDAO, SABU RAIJUA, SAMPANG, SIKKA, SITUBONDO, SUMBA TENGAH, SUMBA TIMUR, SUMENEP, TABANAN, TIMOR TENGAH SELATAN, TIMOR TENGAH UTARA 40
X4 LAMPUNG TENGAH, LAMPUNG UTARA, MESUJI, OGAN KOMERING ILIR, PRINGSEWU, TANGGAMUS, TULANGBAWANG 7
X5 B A T A M, BANDAR LAMPUNG, BANDUNG BARAT, BEKASI, BOGOR, BUNGO, CIANJUR, CILEGON, DEPOK, DHARMASRAYA, INDRAGIRI HILIR, INDRAGIRI HULU, JAKARTA BARAT, JAKARTA PUSAT, JAKARTA SELATAN, JAKARTA TIMUR, JAKARTA UTARA, KARAWANG, KARIMUN, KEPULAUAN MERANTI, KEPULAUAN SERIBU, KERINCI, KUANTAN SINGINGI, LAMPUNG SELATAN, LAMPUNG TIMUR, LEBAK, METRO, PANDEGLANG, PARIGI MOUTONG, PELALAWAN, PESAWARAN, PESISIR SELATAN, PURWAKARTA, SERANG, SOLOK SELATAN, SUBANG, SUKABUMI, SUNGAI PENUH, TANGERANG, TANGERANG SELATAN, TANJUNG JABUNG BARAT, TANJUNG PINANG, TEBO 48

Visualisasi Kelompok Kombinasi Signifikansi Parsial

library(ggplot2)
library(sf)

# Ubah ke sf jika belum
gwr_sf <- st_as_sf(gwr_sp)
gwr_sf$var_sig <- factor(gwr_sf$var_sig)

warna_kategori_final <- c(
  "black", "#0000CD", "#4169E1", "#4682B4", "#5F9EA0", "#6495ED", "#87CEEB", "#87CEFA",
  "#8B0000", "#A52A2A", "#B22222", "#CD5C5C", "#DC143C", "#E9967A", "#FA8072", "#FFA07A",
  "#008000", "#32CD32", "#3CB371", "#00FA9A", "#20B2AA", "#40E0D0"
)

# Buat warna sesuai urutan faktor
warna_kategori_named <- setNames(warna_kategori_final, levels(gwr_sf$var_sig))

# Plot
ggplot(gwr_sf) +
  geom_sf(aes(fill = var_sig), color = "black", size = 0.2) +
  scale_fill_manual(
    values = warna_kategori_named,
    name = "Signifikansi Variabel Lokal",
    guide = guide_legend(
      direction = "horizontal",
      title.position = "top",
      label.position = "bottom",
      nrow = 2
    )
  ) +
  labs(title = "Peta Choropleth: Kelompok Kombinasi Variabel Signifikan (GWR)") +
  coord_sf(datum = NA) +  # Hilangkan label koordinat dan garis sumbu
  theme_void() +          # Hilangkan seluruh grid & axis
  theme(
    legend.position = "bottom",
    legend.title.align = 0.5,
    legend.text = element_text(size = 12),
    plot.title = element_text(hjust = 0.5, face = "bold")
  )
## Warning: The `legend.title.align` argument of `theme()` is deprecated as of ggplot2
## 3.5.0.
## ℹ Please use theme(legend.title = element_text(hjust)) instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.