Disusun oleh: Vindy Andrea Pratiwi (24050123120014)
Dosen Pengampu: Iut Tri Utami, S.Si., M.Si.
Program Studi Statistika
Fakultas Sains dan Matematika
Universitas Diponegoro
Semarang 2025
Tingkat Pengangguran Terbuka (TPT) merupakan salah satu indikator utama dalam menggambarkan kondisi ketenagakerjaan suatu wilayah. TPT menunjukkan persentase angkatan kerja yang belum memperoleh pekerjaan, sedang mencari pekerjaan, atau sedang mempersiapkan usaha. Nilai TPT yang tinggi dapat mengindikasikan adanya ketidakseimbangan antara penawaran dan permintaan tenaga kerja, keterbatasan kesempatan kerja, serta adanya perbedaan karakteristik sosial-ekonomi antarwilayah.
Provinsi Jawa Tengah terdiri atas kabupaten/kota dengan karakteristik ekonomi, sosial, pendidikan, dan kependudukan yang beragam. Perbedaan karakteristik tersebut menyebabkan TPT tidak selalu tersebar secara merata. Wilayah yang berdekatan secara geografis dapat memiliki kondisi ketenagakerjaan yang mirip karena adanya keterkaitan aktivitas ekonomi, mobilitas penduduk, konektivitas transportasi, dan pengaruh pusat-pusat pertumbuhan. Oleh sebab itu, analisis yang hanya menggunakan pendekatan statistik biasa belum cukup untuk menjelaskan kemungkinan adanya ketergantungan antarwilayah.
Analisis spasial digunakan untuk mengidentifikasi apakah persebaran TPT membentuk pola acak, mengelompok (cluster), atau seragam. Selain itu, analisis autokorelasi spasial seperti Moran’s I, Geary’s C, dan Getis-Ord dapat digunakan untuk mengukur hubungan spasial secara global maupun lokal. Melalui pendekatan ini, wilayah dengan karakteristik TPT tinggi atau rendah yang berdekatan dapat diidentifikasi secara lebih jelas.
Selain pengujian autokorelasi, interpolasi spasial seperti Kriging digunakan untuk membentuk permukaan prediksi TPT berdasarkan lokasi kabupaten/kota. Kriging mempertimbangkan struktur ketergantungan spasial melalui variogram sehingga dapat memberikan prediksi dan ukuran ketidakpastian. Selanjutnya, pemodelan spasial seperti Spatial Autoregressive Model (SAR) digunakan untuk menjelaskan hubungan TPT dengan variabel penjelas seperti Rata-rata Lama Sekolah (RLS), Indeks Pembangunan Manusia (IPM), jumlah penduduk miskin, dan Produk Domestik Regional Bruto (PDRB), dengan tetap mempertimbangkan pengaruh wilayah tetangga.
Berdasarkan latar belakang tersebut, rumusan masalah dalam penelitian ini adalah sebagai berikut.
Tujuan penelitian ini adalah sebagai berikut.
Analisis pola spasial digunakan untuk mengetahui apakah lokasi pengamatan membentuk pola acak, mengelompok, atau seragam. Salah satu ukuran yang dapat digunakan adalah Average Nearest Neighbor Index (ANNI), yaitu perbandingan antara rata-rata jarak tetangga terdekat yang diamati dan rata-rata jarak harapan pada pola acak. Nilai rasio kurang dari 1 menunjukkan pola mengelompok, nilai mendekati 1 menunjukkan pola acak, dan nilai lebih dari 1 menunjukkan pola seragam atau teratur.
Matriks pembobot spasial merupakan matriks yang menggambarkan hubungan ketetanggaan antarunit wilayah. Pembobot dapat dibentuk berdasarkan kontiguitas, jarak, atau jumlah tetangga terdekat. Pada data kabupaten/kota, pembobot kontiguitas sering digunakan karena wilayah administratif dapat dikatakan bertetangga jika memiliki batas wilayah yang bersinggungan. Dalam penelitian ini, pembobot utama yang digunakan adalah Queen Contiguity, yaitu dua wilayah dianggap bertetangga jika berbagi sisi atau titik sudut.
Autokorelasi spasial menunjukkan hubungan antara nilai suatu variabel pada satu wilayah dengan nilai variabel pada wilayah lain yang berdekatan. Autokorelasi positif menunjukkan bahwa wilayah yang berdekatan memiliki nilai yang mirip, sedangkan autokorelasi negatif menunjukkan bahwa wilayah yang berdekatan memiliki nilai yang berbeda.
Moran’s I merupakan ukuran autokorelasi spasial global yang digunakan untuk mengetahui apakah suatu variabel memiliki pola spasial secara keseluruhan. Nilai Moran’s I positif menunjukkan kecenderungan pengelompokan nilai yang mirip, nilai negatif menunjukkan pola menyebar atau berbeda antarwilayah bertetangga, dan nilai mendekati nol menunjukkan pola acak.
Geary’s C juga digunakan untuk mengukur autokorelasi spasial global. Nilai Geary’s C kurang dari 1 menunjukkan autokorelasi positif, nilai lebih dari 1 menunjukkan autokorelasi negatif, dan nilai mendekati 1 menunjukkan tidak adanya autokorelasi spasial.
Getis-Ord G digunakan untuk mengidentifikasi konsentrasi nilai tinggi atau rendah secara spasial. Secara lokal, Getis-Ord dapat menunjukkan wilayah Hot Spot jika nilai tinggi terkonsentrasi di sekitar wilayah tersebut, atau Cold Spot jika nilai rendah terkonsentrasi.
Kriging merupakan metode interpolasi geostatistik yang memperkirakan nilai pada lokasi yang tidak teramati berdasarkan nilai pada lokasi pengamatan dan struktur variogram. Ordinary Kriging global menggunakan seluruh titik pengamatan dalam proses prediksi, sedangkan Kriging lokal membatasi jumlah tetangga terdekat yang digunakan dalam prediksi, sehingga lebih menekankan pengaruh lokal.
Spatial Autoregressive Model (SAR) digunakan ketika variabel dependen pada suatu wilayah dipengaruhi oleh nilai variabel dependen pada wilayah tetangga. Persamaan umum model SAR adalah:
\[ y = \rho Wy + X\beta + \varepsilon \]
Keterangan:
Data yang digunakan dalam penelitian ini adalah data kabupaten/kota
di Provinsi Jawa Tengah yang diperoleh dari file Excel yang dilampirkan,
yaitu Data Spasial Vindy.xlsx. Data batas wilayah
kabupaten/kota diperoleh dari shapefile
gadm41_IDN_2.shp.
Variabel yang digunakan adalah sebagai berikut.
| Variabel | Keterangan |
|---|---|
| Y | Tingkat Pengangguran Terbuka (TPT) |
| X1 | Rata-rata Lama Sekolah (RLS) |
| X2 | Indeks Pembangunan Manusia (IPM) |
| X3 | Jumlah Penduduk Miskin |
| X4 | Produk Domestik Regional Bruto (PDRB) |
Tahapan analisis dalam penelitian ini adalah sebagai berikut.
required_packages <- c(
"sf", "readxl", "dplyr", "tidyr", "stringr", "spdep", "spatialreg",
"ggplot2", "gstat", "sp", "knitr", "car", "broom"
)
new_packages <- required_packages[!(required_packages %in% installed.packages()[, "Package"])]
if (length(new_packages) > 0) {
install.packages(new_packages, dependencies = TRUE)
}
invisible(lapply(required_packages, library, character.only = TRUE))
sf::sf_use_s2(FALSE)
# Fungsi pembulatan aman untuk tabel: hanya kolom numerik yang dibulatkan.
round_df <- function(x, digits = 3) {
if (is.data.frame(x)) {
return(dplyr::mutate(x, dplyr::across(where(is.numeric), ~ round(.x, digits))))
}
if (is.matrix(x)) return(round(x, digits))
x
}
# 1. Mencari path file secara otomatis
base_dir <- "C:/Users/ACER SWIFT/Documents/Vindy Andrea/Kuliah/Semester 6/STATISTIKA SPASIAL/Tugas Poyek"
data_path <- file.path(base_dir, "Data Spasial Vindy.xlsx")
shp_path <- file.path(base_dir, "gadm41_IDN_2.shp")
cat("Working directory saat Knit:\n", getwd(), "\n\n")
## Working directory saat Knit:
## C:/Users/ACER SWIFT/Downloads
cat("Folder data yang dipakai:\n", base_dir, "\n\n")
## Folder data yang dipakai:
## C:/Users/ACER SWIFT/Documents/Vindy Andrea/Kuliah/Semester 6/STATISTIKA SPASIAL/Tugas Poyek
cat("File Excel dipakai:\n", data_path, "\n")
## File Excel dipakai:
## C:/Users/ACER SWIFT/Documents/Vindy Andrea/Kuliah/Semester 6/STATISTIKA SPASIAL/Tugas Poyek/Data Spasial Vindy.xlsx
cat("File shapefile dipakai:\n", shp_path, "\n\n")
## File shapefile dipakai:
## C:/Users/ACER SWIFT/Documents/Vindy Andrea/Kuliah/Semester 6/STATISTIKA SPASIAL/Tugas Poyek/gadm41_IDN_2.shp
if (!file.exists(data_path)) {
stop(paste0(
"File Excel tidak ditemukan di path berikut:\n", data_path,
"\nPastikan nama file dan folder sudah sama persis."
))
}
if (!file.exists(shp_path)) {
stop(paste0(
"File .shp tidak ditemukan di path berikut:\n", shp_path,
"\nPastikan nama file shapefile sudah sama persis."
))
}
# Cek komponen shapefile wajib agar st_read tidak gagal.
shp_base <- tools::file_path_sans_ext(shp_path)
required_shp_parts <- paste0(shp_base, c(".shp", ".shx", ".dbf"))
missing_shp_parts <- required_shp_parts[!file.exists(required_shp_parts)]
if (length(missing_shp_parts) > 0) {
stop(paste("Komponen shapefile wajib belum lengkap:", paste(basename(missing_shp_parts), collapse = ", ")))
}
# File .prj dipakai untuk CRS. Jika tidak terbaca, nanti CRS tetap diset manual ke EPSG:4326.
optional_prj <- paste0(shp_base, ".prj")
if (!file.exists(optional_prj)) {
cat("Catatan: file .prj tidak ditemukan. CRS akan diset manual ke EPSG:4326 setelah st_read().\n")
}
# 2. Fungsi membersihkan nama wilayah
clean_name <- function(x) {
x %>%
as.character() %>%
stringr::str_to_upper() %>%
stringr::str_replace_all("^\\s*[0-9]{4}\\s*", "") %>%
stringr::str_replace_all("\\s+", " ") %>%
stringr::str_trim()
}
make_admin_name <- function(type, name) {
type2 <- stringr::str_to_upper(type)
name2 <- clean_name(name)
dplyr::case_when(
stringr::str_detect(name2, "^KOTA\\s+") ~ name2,
stringr::str_detect(name2, "^KABUPATEN\\s+") ~ name2,
stringr::str_detect(type2, "KOTA|MUNICIPALITY") ~ clean_name(paste("Kota", name2)),
stringr::str_detect(type2, "KABUPATEN|REGENCY") ~ clean_name(paste("Kabupaten", name2)),
TRUE ~ name2
)
}
# 3. Membaca data Excel
data_raw <- readxl::read_excel(data_path)
# Samakan nama kolom agar aman jika ada spasi di header Excel.
names(data_raw) <- names(data_raw) %>%
stringr::str_replace_all("\\s+", "") %>%
stringr::str_trim()
needed_cols <- c("KabKota", "TPT", "RLS", "IPM", "Miskin", "PDRB")
missing_cols <- setdiff(needed_cols, names(data_raw))
if (length(missing_cols) > 0) {
stop(paste("Kolom berikut tidak ditemukan pada Excel:", paste(missing_cols, collapse = ", ")))
}
# Format data sesuai variabel pada file Vindy.
data_tbl <- data_raw %>%
dplyr::mutate(
NAMA = clean_name(KabKota),
TPT = as.numeric(TPT),
RLS = as.numeric(RLS),
IPM = as.numeric(IPM),
Miskin = as.numeric(Miskin),
PDRB = as.numeric(PDRB)
) %>%
dplyr::select(NAMA, KabKota, TPT, RLS, IPM, Miskin, PDRB)
# Cek NA sebelum imputasi.
na_awal <- sapply(data_tbl[, c("TPT", "RLS", "IPM", "Miskin", "PDRB")], function(x) sum(is.na(x)))
cat("Jumlah NA sebelum imputasi:
")
## Jumlah NA sebelum imputasi:
print(na_awal)
## TPT RLS IPM Miskin PDRB
## 0 1 0 0 0
# Agar analisis regresi dan spasial tidak error, nilai kosong pada variabel numerik
# diisi dengan rata-rata variabel tersebut.
for (v in c("TPT", "RLS", "IPM", "Miskin", "PDRB")) {
data_tbl[[v]][is.na(data_tbl[[v]])] <- mean(data_tbl[[v]], na.rm = TRUE)
}
# 4. Membaca shapefile GADM Level 2 dan memilih Jawa Tengah
shp_raw <- sf::st_read(shp_path, quiet = TRUE)
# GADM Indonesia level 2 menggunakan sistem koordinat geografis WGS84 (EPSG:4326).
# Pada beberapa komputer, CRS shapefile bisa tidak terbaca walaupun file .prj ada.
# Karena itu, jika CRS kosong, CRS diset manual terlebih dahulu agar st_transform() tidak error.
if (is.na(sf::st_crs(shp_raw))) {
cat("CRS shapefile tidak terbaca. CRS diset manual ke EPSG:4326 (WGS84) sebelum transformasi.\n")
shp_raw <- sf::st_set_crs(shp_raw, 4326)
}
if (!all(c("NAME_1", "NAME_2", "TYPE_2") %in% names(shp_raw))) {
stop("Kolom NAME_1, NAME_2, atau TYPE_2 tidak ditemukan pada shapefile GADM level 2.")
}
jateng_shp <- shp_raw %>%
dplyr::filter(NAME_1 == "Jawa Tengah", TYPE_2 != "Water Body") %>%
sf::st_make_valid() %>%
dplyr::mutate(NAMA = make_admin_name(TYPE_2, NAME_2))
if (nrow(jateng_shp) == 0) {
stop("Tidak ada wilayah dengan NAME_1 == 'Jawa Tengah' pada shapefile. Pastikan shapefile yang digunakan adalah GADM Indonesia level 2.")
}
# 5. Cek kecocokan nama wilayah
cek_data_tidak_ada_peta <- dplyr::anti_join(data_tbl, sf::st_drop_geometry(jateng_shp), by = "NAMA")
cek_peta_tidak_ada_data <- dplyr::anti_join(sf::st_drop_geometry(jateng_shp), data_tbl, by = "NAMA")
cat("Wilayah pada data tetapi tidak ada di peta:
")
## Wilayah pada data tetapi tidak ada di peta:
print(cek_data_tidak_ada_peta[, c("NAMA", "KabKota")])
## # A tibble: 0 × 2
## # ℹ 2 variables: NAMA <chr>, KabKota <chr>
cat("Wilayah pada peta tetapi tidak ada di data:
")
## Wilayah pada peta tetapi tidak ada di data:
print(cek_peta_tidak_ada_data[, c("NAMA", "NAME_2", "TYPE_2")])
## [1] NAMA NAME_2 TYPE_2
## <0 rows> (or 0-length row.names)
if (nrow(cek_data_tidak_ada_peta) > 0 | nrow(cek_peta_tidak_ada_data) > 0) {
stop("Masih ada nama wilayah yang belum cocok. Periksa tabel hasil anti_join di atas.")
}
# 6. Merge data atribut (kalau yang saya pake merupakan data yang terdapat di Excel) dan spasial
jateng <- jateng_shp %>%
dplyr::left_join(data_tbl, by = "NAMA") %>%
dplyr::arrange(NAMA)
# Gunakan proyeksi UTM Zona 49S agar analisis jarak dan kriging menggunakan satuan meter.
# Jika CRS masih kosong setelah merge, set kembali ke EPSG:4326 sebelum transformasi.
if (is.na(sf::st_crs(jateng))) {
sf::st_crs(jateng) <- 4326
}
jateng <- sf::st_transform(jateng, 32749)
# Membuat titik label agar seluruh peta menampilkan nama kabupaten/kota.
# LABEL dibuat lebih ringkas dengan menghapus awalan KABUPATEN/KOTA.
jateng <- jateng %>%
dplyr::mutate(
LABEL = stringr::str_replace_all(NAMA, "KABUPATEN\\s+|KOTA\\s+", ""),
LABEL = stringr::str_to_title(LABEL)
)
label_points <- sf::st_point_on_surface(jateng)
cat("Jumlah kabupaten/kota yang berhasil digabung:", nrow(jateng), "
")
## Jumlah kabupaten/kota yang berhasil digabung: 35
print(jateng[, c("NAMA", "TPT", "RLS", "IPM", "Miskin", "PDRB")])
## Simple feature collection with 35 features and 6 fields
## Geometry type: GEOMETRY
## Dimension: XY
## Bounding box: xmin: 230132 ymin: 9092271 xmax: 576407.7 ymax: 9367063
## Projected CRS: WGS 84 / UTM zone 49S
## First 10 features:
## NAMA TPT RLS IPM Miskin PDRB
## 1 KABUPATEN BANJARNEGARA 5.57 6.870000 69.60 137.68 27685
## 2 KABUPATEN BANYUMAS 6.18 8.332941 74.52 207.78 40236
## 3 KABUPATEN BATANG 5.67 7.080000 70.74 68.85 36295
## 4 KABUPATEN BLORA 3.67 7.260000 71.39 99.14 36598
## 5 KABUPATEN BOYOLALI 3.16 8.170000 75.96 95.96 41699
## 6 KABUPATEN BREBES 8.35 6.410000 68.46 283.28 30040
## 7 KABUPATEN CILACAP 7.83 7.400000 72.38 186.08 67203
## 8 KABUPATEN DEMAK 4.75 8.280000 74.57 142.91 28313
## 9 KABUPATEN GROBOGAN 3.23 7.290000 72.02 159.00 24908
## 10 KABUPATEN JEPARA 3.34 8.270000 74.32 80.84 32894
## geometry
## 1 POLYGON ((325676.6 9166909,...
## 2 MULTIPOLYGON (((328016 9158...
## 3 POLYGON ((380429.7 9204672,...
## 4 POLYGON ((548863.8 9186970,...
## 5 POLYGON ((448766 9156579, 4...
## 6 POLYGON ((282776.3 9187000,...
## 7 MULTIPOLYGON (((266525.8 91...
## 8 POLYGON ((451609.5 9215806,...
## 9 MULTIPOLYGON (((455031.8 92...
## 10 MULTIPOLYGON (((427149.5 93...
Berdasarkan hasil persiapan data, seluruh kabupaten/kota pada data atribut dicocokkan dengan batas administrasi kabupaten/kota Provinsi Jawa Tengah dari shapefile. Tahap ini penting karena analisis spasial hanya dapat dilakukan jika setiap baris data sosial-ekonomi memiliki pasangan geometri yang tepat. Nama wilayah dibersihkan terlebih dahulu agar perbedaan penulisan, spasi, atau awalan administratif tidak menghambat proses penggabungan. Nilai kosong pada variabel numerik diisi dengan rata-rata masing-masing variabel agar jumlah unit analisis tetap lengkap dan tidak ada kabupaten/kota yang terhapus dari peta. Setelah data digabung, sistem koordinat diubah ke UTM Zona 49S supaya perhitungan jarak, tetangga terdekat, dan kriging menggunakan satuan meter yang lebih sesuai untuk analisis wilayah.
vars <- c("TPT", "RLS", "IPM", "Miskin", "PDRB")
stat_deskriptif <- data.frame(
Variabel = vars,
Minimum = sapply(vars, function(v) min(jateng[[v]], na.rm = TRUE)),
Q1 = sapply(vars, function(v) quantile(jateng[[v]], 0.25, na.rm = TRUE)),
Median = sapply(vars, function(v) median(jateng[[v]], na.rm = TRUE)),
Mean = sapply(vars, function(v) mean(jateng[[v]], na.rm = TRUE)),
Q3 = sapply(vars, function(v) quantile(jateng[[v]], 0.75, na.rm = TRUE)),
Maximum = sapply(vars, function(v) max(jateng[[v]], na.rm = TRUE)),
SD = sapply(vars, function(v) sd(jateng[[v]], na.rm = TRUE)),
row.names = NULL
)
knitr::kable(round_df(stat_deskriptif, 3), caption = "Statistika Deskriptif Variabel Penelitian")
| Variabel | Minimum | Q1 | Median | Mean | Q3 | Maximum | SD |
|---|---|---|---|---|---|---|---|
| TPT | 2.35 | 3.500 | 3.97 | 4.520 | 5.32 | 8.35 | 1.495 |
| RLS | 6.41 | 7.380 | 7.87 | 8.333 | 9.27 | 11.48 | 1.373 |
| IPM | 68.46 | 71.855 | 74.32 | 74.749 | 77.22 | 85.72 | 4.502 |
| Miskin | 7.25 | 72.860 | 95.96 | 105.838 | 139.76 | 283.28 | 59.435 |
| PDRB | 22652.00 | 30632.000 | 38792.00 | 51391.371 | 54210.50 | 156607.00 | 33188.236 |
# Korelasi antarvariabel numerik
cor_matrix <- cor(sf::st_drop_geometry(jateng[, vars]), use = "complete.obs")
knitr::kable(round_df(cor_matrix, 3), caption = "Matriks Korelasi Variabel Penelitian")
| TPT | RLS | IPM | Miskin | PDRB | |
|---|---|---|---|---|---|
| TPT | 1.000 | -0.182 | -0.198 | 0.464 | 0.002 |
| RLS | -0.182 | 1.000 | 0.976 | -0.644 | 0.759 |
| IPM | -0.198 | 0.976 | 1.000 | -0.625 | 0.781 |
| Miskin | 0.464 | -0.644 | -0.625 | 1.000 | -0.464 |
| PDRB | 0.002 | 0.759 | 0.781 | -0.464 | 1.000 |
Statistika deskriptif digunakan untuk memahami karakter awal setiap variabel sebelum masuk ke analisis spasial dan pemodelan. Nilai minimum dan maksimum TPT menunjukkan rentang perbedaan tingkat pengangguran antar kabupaten/kota. Jika rentangnya lebar, berarti kondisi ketenagakerjaan antarwilayah tidak homogen dan ada wilayah yang jauh lebih bermasalah dibanding wilayah lain. Nilai mean menggambarkan tingkat TPT rata-rata Jawa Tengah, sedangkan median membantu melihat nilai tengah yang lebih tahan terhadap pengaruh wilayah ekstrem. Standar deviasi menunjukkan besar kecilnya variasi; standar deviasi yang tinggi menandakan perbedaan TPT antarwilayah cukup kuat. Untuk variabel penjelas, RLS dan IPM merepresentasikan kualitas pendidikan dan pembangunan manusia, Miskin menggambarkan tekanan sosial-ekonomi, sedangkan PDRB menunjukkan kapasitas ekonomi wilayah. Matriks korelasi dibaca sebagai indikasi awal hubungan linear antarvariabel. Korelasi yang kuat antara variabel independen perlu diperhatikan karena dapat mengarah pada multikolinearitas saat model OLS dan SAR dijalankan.
peta_tpt <- ggplot2::ggplot(jateng) +
ggplot2::geom_sf(ggplot2::aes(fill = TPT), color = "grey20", linewidth = 0.25) +
ggplot2::geom_sf_text(
data = label_points,
ggplot2::aes(label = LABEL),
size = 1.8,
color = "black"
) +
ggplot2::scale_fill_viridis_c(option = "C", name = "TPT (%)") +
ggplot2::labs(
title = "Sebaran Tingkat Pengangguran Terbuka (TPT)",
subtitle = "Kabupaten/Kota di Provinsi Jawa Tengah",
caption = "Sumber: Data Spasial Vindy.xlsx dan GADM Level 2"
) +
ggplot2::theme_minimal()
peta_tpt
Peta deskriptif TPT memperlihatkan sebaran tingkat pengangguran terbuka pada setiap kabupaten/kota di Jawa Tengah. Setiap wilayah diberi label nama kabupaten/kota agar posisi wilayah dapat dikenali langsung tanpa harus melihat tabel atribut. Warna yang semakin pekat menunjukkan TPT yang semakin tinggi, sedangkan warna yang lebih muda menunjukkan TPT yang lebih rendah. Jika beberapa wilayah berwarna pekat terlihat saling berdekatan, kondisi tersebut memberi indikasi awal adanya klaster TPT tinggi. Sebaliknya, jika wilayah berwarna muda tampak terkumpul, terdapat indikasi klaster TPT rendah. Peta ini belum membuktikan autokorelasi secara statistik, tetapi sangat membantu membaca pola visual awal. Wilayah yang tampak memiliki TPT tinggi dapat dipandang sebagai area prioritas karena pengangguran tidak hanya muncul sebagai angka tunggal, tetapi juga memiliki konteks lokasi dan kedekatan dengan wilayah sekitar.
Analisis pola spasial dilakukan menggunakan Average Nearest
Neighbor Index (ANNI) berdasarkan titik representatif
kabupaten/kota. Karena data berupa wilayah administratif, titik
representatif yang digunakan adalah st_point_on_surface,
yaitu titik yang berada di dalam setiap wilayah.
# Titik representatif wilayah
jateng_point <- sf::st_point_on_surface(jateng)
coords <- sf::st_coordinates(jateng_point)
# Nearest neighbor k = 1
knn_1 <- spdep::knearneigh(coords, k = 1)
nb_1 <- spdep::knn2nb(knn_1)
dist_nn <- unlist(spdep::nbdists(nb_1, coords))
n <- nrow(jateng)
area_total <- as.numeric(sf::st_area(sf::st_union(jateng)))
mean_obs <- mean(dist_nn)
mean_exp <- 0.5 / sqrt(n / area_total)
se_exp <- 0.26136 / sqrt((n^2) / area_total)
ann_index <- mean_obs / mean_exp
z_ann <- (mean_obs - mean_exp) / se_exp
p_ann <- 2 * pnorm(-abs(z_ann))
pola_spasial <- ifelse(
p_ann < 0.05 & ann_index < 1, "Mengelompok / Cluster",
ifelse(p_ann < 0.05 & ann_index > 1, "Seragam / Teratur", "Acak / Random")
)
ann_table <- data.frame(
Jumlah_Wilayah = n,
Rata_rata_Jarak_Terdekat_Observasi = mean_obs,
Rata_rata_Jarak_Terdekat_Harapan = mean_exp,
ANN_Index = ann_index,
Z_score = z_ann,
P_value = p_ann,
Keputusan_Pola = pola_spasial
)
knitr::kable(round_df(ann_table, 4), caption = "Average Nearest Neighbor Index")
| Jumlah_Wilayah | Rata_rata_Jarak_Terdekat_Observasi | Rata_rata_Jarak_Terdekat_Harapan | ANN_Index | Z_score | P_value | Keputusan_Pola |
|---|---|---|---|---|---|---|
| 35 | 24395.33 | 15673.7 | 1.5564 | 6.2978 | 0 | Seragam / Teratur |
Berdasarkan nilai ANN Index sebesar 1.5564 dengan p-value sebesar 0, pola spasial lokasi kabupaten/kota dikategorikan sebagai Seragam / Teratur. Jika nilai ANN Index kurang dari 1, jarak antartitik representatif kabupaten/kota lebih dekat dibandingkan pola acak, sehingga posisi wilayah cenderung mengelompok. Jika nilainya lebih dari 1, jarak antartitik relatif lebih jauh dan pola cenderung seragam. Jika p-value tidak signifikan, pola lokasi belum cukup kuat untuk dinyatakan berbeda dari pola acak. Interpretasi ini hanya membaca susunan lokasi kabupaten/kota, bukan nilai TPT-nya. Karena itu, hasil ANN dipakai sebagai informasi awal tentang struktur posisi wilayah, sedangkan hubungan nilai TPT antarwilayah tetap harus diuji melalui Moran’s I, Geary’s C, Getis-Ord, dan LISA.
ggplot2::ggplot() +
ggplot2::geom_sf(data = jateng, fill = "white", color = "grey40") +
ggplot2::geom_sf(data = jateng_point, color = "red", size = 1.8) +
ggplot2::geom_sf_text(
data = label_points,
ggplot2::aes(label = LABEL),
size = 1.8,
color = "black"
) +
ggplot2::labs(
title = "Titik Representatif Kabupaten/Kota Jawa Tengah",
subtitle = "Digunakan untuk analisis pola spasial nearest neighbor"
) +
ggplot2::theme_minimal()
Matriks pembobot utama yang digunakan adalah queen contiguity. Pembobot ini dipilih karena unit analisis berupa wilayah administratif kabupaten/kota. Dua wilayah dianggap bertetangga jika memiliki sisi atau titik sudut yang bersinggungan. Selain itu, pembobot K-nearest neighbors dengan k = 4 juga dibentuk sebagai pembanding berbasis jarak.
# Pembobot queen contiguity
nb_queen <- spdep::poly2nb(jateng, queen = TRUE, row.names = jateng$NAMA)
lw_queen <- spdep::nb2listw(nb_queen, style = "W", zero.policy = TRUE)
lw_queen_b <- spdep::nb2listw(nb_queen, style = "B", zero.policy = TRUE)
# Pembobot rook contiguity sebagai pembanding
nb_rook <- spdep::poly2nb(jateng, queen = FALSE, row.names = jateng$NAMA)
lw_rook <- spdep::nb2listw(nb_rook, style = "W", zero.policy = TRUE)
# Pembobot K-nearest neighbors berbasis jarak centroid/point-on-surface
nb_knn4 <- spdep::knn2nb(spdep::knearneigh(coords, k = 4), row.names = jateng$NAMA)
lw_knn4 <- spdep::nb2listw(nb_knn4, style = "W", zero.policy = TRUE)
ringkasan_tetangga <- data.frame(
Wilayah = jateng$NAMA,
Jumlah_Tetangga_Queen = spdep::card(nb_queen),
Jumlah_Tetangga_Rook = spdep::card(nb_rook),
Jumlah_Tetangga_KNN4 = spdep::card(nb_knn4)
)
knitr::kable(ringkasan_tetangga, caption = "Jumlah Tetangga Berdasarkan Beberapa Matriks Pembobot")
| Wilayah | Jumlah_Tetangga_Queen | Jumlah_Tetangga_Rook | Jumlah_Tetangga_KNN4 |
|---|---|---|---|
| KABUPATEN BANJARNEGARA | 6 | 6 | 4 |
| KABUPATEN BANYUMAS | 7 | 7 | 4 |
| KABUPATEN BATANG | 5 | 5 | 4 |
| KABUPATEN BLORA | 3 | 3 | 4 |
| KABUPATEN BOYOLALI | 8 | 8 | 4 |
| KABUPATEN BREBES | 4 | 4 | 4 |
| KABUPATEN CILACAP | 3 | 3 | 4 |
| KABUPATEN DEMAK | 5 | 5 | 4 |
| KABUPATEN GROBOGAN | 7 | 7 | 4 |
| KABUPATEN JEPARA | 3 | 3 | 4 |
| KABUPATEN KARANGANYAR | 5 | 5 | 4 |
| KABUPATEN KEBUMEN | 5 | 5 | 4 |
| KABUPATEN KENDAL | 5 | 5 | 4 |
| KABUPATEN KLATEN | 3 | 2 | 4 |
| KABUPATEN KUDUS | 4 | 4 | 4 |
| KABUPATEN MAGELANG | 7 | 6 | 4 |
| KABUPATEN PATI | 5 | 5 | 4 |
| KABUPATEN PEKALONGAN | 5 | 5 | 4 |
| KABUPATEN PEMALANG | 4 | 4 | 4 |
| KABUPATEN PURBALINGGA | 4 | 4 | 4 |
| KABUPATEN PURWOREJO | 3 | 3 | 4 |
| KABUPATEN REMBANG | 2 | 2 | 4 |
| KABUPATEN SEMARANG | 8 | 8 | 4 |
| KABUPATEN SRAGEN | 3 | 3 | 4 |
| KABUPATEN SUKOHARJO | 5 | 5 | 4 |
| KABUPATEN TEGAL | 4 | 4 | 4 |
| KABUPATEN TEMANGGUNG | 4 | 4 | 4 |
| KABUPATEN WONOGIRI | 2 | 2 | 4 |
| KABUPATEN WONOSOBO | 7 | 7 | 4 |
| KOTA MAGELANG | 1 | 1 | 4 |
| KOTA PEKALONGAN | 2 | 2 | 4 |
| KOTA SALATIGA | 1 | 1 | 4 |
| KOTA SEMARANG | 3 | 3 | 4 |
| KOTA SURAKARTA | 3 | 3 | 4 |
| KOTA TEGAL | 2 | 2 | 4 |
cat("Rata-rata jumlah tetangga Queen:", mean(spdep::card(nb_queen)), "\n")
## Rata-rata jumlah tetangga Queen: 4.228571
cat("Wilayah tanpa tetangga Queen:", sum(spdep::card(nb_queen) == 0), "\n")
## Wilayah tanpa tetangga Queen: 0
plot(sf::st_geometry(jateng), border = "grey50", main = "Struktur Tetangga Queen Contiguity")
plot(nb_queen, coords, add = TRUE, col = "red", lwd = 1)
points(coords, pch = 19, col = "blue", cex = 0.7)
text(coords[, 1], coords[, 2], labels = jateng$LABEL, cex = 0.55, pos = 3)
Dalam analisis berikutnya, matriks pembobot yang digunakan adalah queen contiguity dengan standardisasi baris (style = W). Pembobot queen dipilih karena data berbentuk wilayah administrasi, bukan titik murni. Dua kabupaten/kota dianggap bertetangga jika berbagi sisi batas ataupun titik sudut. Pendekatan ini lebih inklusif dibanding rook contiguity karena tetap menangkap hubungan wilayah yang bersentuhan pada sudut. Jumlah tetangga pada tabel menunjukkan seberapa banyak wilayah lain yang berhubungan langsung dengan suatu kabupaten/kota. Wilayah dengan banyak tetangga memiliki potensi interaksi spasial yang lebih luas, sedangkan wilayah di tepi provinsi biasanya memiliki tetangga lebih sedikit. Standardisasi baris membuat total bobot setiap wilayah bernilai satu, sehingga lag spasial dapat dibaca sebagai rata-rata kondisi wilayah tetangga. Pada peta struktur tetangga, garis merah memperlihatkan hubungan antarwilayah yang menjadi dasar perhitungan autokorelasi dan model SAR.
moran_global <- spdep::moran.test(jateng$TPT, lw_queen, zero.policy = TRUE, alternative = "greater")
moran_global_perm <- spdep::moran.mc(jateng$TPT, lw_queen, nsim = 999, zero.policy = TRUE)
print(moran_global)
##
## Moran I test under randomisation
##
## data: jateng$TPT
## weights: lw_queen
##
## Moran I statistic standard deviate = 5.767, p-value = 0.000000004036
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 0.63175126 -0.02941176 0.01314389
print(moran_global_perm)
##
## Monte-Carlo simulation of Moran I
##
## data: jateng$TPT
## weights: lw_queen
## number of simulations + 1: 1000
##
## statistic = 0.63175, observed rank = 1000, p-value = 0.001
## alternative hypothesis: greater
Nilai Moran’s I sebesar 0.6318 dengan p-value sebesar 0. Moran’s I membaca apakah TPT antarwilayah yang bertetangga cenderung mirip secara keseluruhan. Jika nilai Moran’s I positif dan p-value kurang dari 0,05, maka terdapat autokorelasi spasial positif; kabupaten/kota dengan TPT tinggi cenderung berada dekat dengan kabupaten/kota yang juga tinggi, sedangkan wilayah dengan TPT rendah cenderung berada dekat dengan wilayah yang juga rendah. Jika nilai Moran’s I negatif dan signifikan, pola yang muncul adalah ketidaksamaan, misalnya wilayah TPT tinggi dikelilingi wilayah rendah atau sebaliknya. Jika tidak signifikan, maka persebaran TPT belum menunjukkan pola global yang kuat. Hasil Moran global penting karena menjadi dasar apakah analisis lokal dan model spasial perlu diperhatikan lebih lanjut.
geary_global <- spdep::geary.test(jateng$TPT, lw_queen, zero.policy = TRUE, alternative = "greater")
print(geary_global)
##
## Geary C test under randomisation
##
## data: jateng$TPT
## weights: lw_queen
##
## Geary C statistic standard deviate = 4.8995, p-value = 0.0000004804
## alternative hypothesis: Expectation greater than statistic
## sample estimates:
## Geary C statistic Expectation Variance
## 0.34757812 1.00000000 0.01773194
Nilai Geary’s C sebesar 0.3476 dengan p-value sebesar 0. Geary’s C menekankan perbedaan nilai TPT antara suatu wilayah dan tetangganya. Nilai kurang dari 1 menunjukkan autokorelasi spasial positif, artinya wilayah bertetangga cenderung memiliki TPT yang tidak terlalu berbeda. Nilai lebih dari 1 menunjukkan autokorelasi spasial negatif, artinya wilayah bertetangga cenderung memiliki perbedaan TPT yang besar. Jika p-value signifikan, pola tersebut dapat dinyatakan kuat secara statistik. Geary’s C melengkapi Moran’s I karena lebih sensitif pada ketidaksamaan lokal, sehingga berguna untuk mendeteksi apakah ada wilayah tertentu yang berbeda tajam dibanding daerah sekitarnya.
# Getis-Ord G lebih sesuai menggunakan pembobot biner.
getis_global <- spdep::globalG.test(jateng$TPT, lw_queen_b, zero.policy = TRUE, alternative = "greater")
print(getis_global)
##
## Getis-Ord global G statistic
##
## data: jateng$TPT
## weights: lw_queen_b
##
## standard deviate = 1.0011, p-value = 0.1584
## alternative hypothesis: greater
## sample estimates:
## Global G statistic Expectation Variance
## 0.13059241499 0.12436974790 0.00003863361
Getis-Ord G global digunakan untuk melihat apakah terdapat konsentrasi nilai TPT tinggi atau rendah secara spasial. Jika p-value signifikan dan arah statistik menunjukkan kecenderungan nilai tinggi, maka TPT tinggi tidak tersebar acak, melainkan terkonsentrasi pada wilayah yang saling berdekatan. Jika kecenderungan yang muncul adalah nilai rendah, maka terdapat konsentrasi wilayah dengan TPT rendah. Perbedaan utama Getis-Ord dengan Moran’s I adalah fokusnya pada keberadaan hot spot atau cold spot. Dengan demikian, hasil Getis-Ord membantu memperjelas apakah masalah pengangguran tinggi terkumpul pada zona tertentu yang perlu menjadi prioritas kebijakan.
ringkasan_global <- data.frame(
Statistik = c("Moran's I", "Geary's C", "Getis-Ord G"),
Nilai = c(
as.numeric(moran_global$estimate[1]),
as.numeric(geary_global$estimate[1]),
as.numeric(getis_global$estimate[1])
),
Z_score = c(
as.numeric(moran_global$statistic),
as.numeric(geary_global$statistic),
as.numeric(getis_global$statistic)
),
P_value = c(
moran_global$p.value,
geary_global$p.value,
getis_global$p.value
)
)
knitr::kable(round_df(ringkasan_global, 5), caption = "Ringkasan Autokorelasi Spasial Global")
| Statistik | Nilai | Z_score | P_value |
|---|---|---|---|
| Moran’s I | 0.63175 | 5.76696 | 0.00000 |
| Geary’s C | 0.34758 | 4.89948 | 0.00000 |
| Getis-Ord G | 0.13059 | 1.00114 | 0.15838 |
Ringkasan autokorelasi global memperlihatkan tiga ukuran yang saling melengkapi. Moran’s I digunakan untuk membaca kemiripan nilai TPT antarwilayah bertetangga secara umum. Geary’s C lebih menekankan perbedaan nilai antarwilayah tetangga, sehingga sensitif terhadap wilayah yang berbeda dari lingkungan sekitarnya. Getis-Ord G digunakan untuk melihat apakah nilai tinggi atau rendah terkonsentrasi dalam ruang. Jika ketiga statistik mengarah pada kesimpulan yang sama, maka bukti pola spasial TPT menjadi lebih kuat. Jika hasilnya berbeda, interpretasi perlu dilakukan hati-hati karena setiap statistik menekankan aspek spasial yang tidak sama.
lisa <- spdep::localmoran(jateng$TPT, lw_queen, zero.policy = TRUE)
jateng$Local_Moran_I <- lisa[, 1]
jateng$Local_Moran_Z <- lisa[, 4]
jateng$P_Moran <- lisa[, 5]
mean_tpt <- mean(jateng$TPT, na.rm = TRUE)
lag_tpt <- spdep::lag.listw(lw_queen, jateng$TPT, zero.policy = TRUE)
jateng$Cluster_Moran <- "Tidak Signifikan"
jateng$Cluster_Moran[jateng$TPT >= mean_tpt & lag_tpt >= mean_tpt & jateng$P_Moran <= 0.05] <- "High-High"
jateng$Cluster_Moran[jateng$TPT < mean_tpt & lag_tpt < mean_tpt & jateng$P_Moran <= 0.05] <- "Low-Low"
jateng$Cluster_Moran[jateng$TPT >= mean_tpt & lag_tpt < mean_tpt & jateng$P_Moran <= 0.05] <- "High-Low"
jateng$Cluster_Moran[jateng$TPT < mean_tpt & lag_tpt >= mean_tpt & jateng$P_Moran <= 0.05] <- "Low-High"
lisa_table <- sf::st_drop_geometry(jateng) %>%
dplyr::select(NAMA, TPT, Local_Moran_I, Local_Moran_Z, P_Moran, Cluster_Moran) %>%
dplyr::arrange(P_Moran)
knitr::kable(round_df(lisa_table, 4), caption = "Hasil Moran's I Lokal / LISA")
| NAMA | TPT | Local_Moran_I | Local_Moran_Z | P_Moran | Cluster_Moran |
|---|---|---|---|---|---|
| KABUPATEN BANYUMAS | 6.18 | 1.5633 | 4.1729 | 0.0000 | High-High |
| KABUPATEN BREBES | 8.35 | 4.1223 | 3.8385 | 0.0001 | High-High |
| KABUPATEN TEGAL | 7.53 | 3.1080 | 3.4899 | 0.0005 | High-High |
| KOTA TEGAL | 5.88 | 2.1442 | 3.3676 | 0.0008 | High-High |
| KABUPATEN CILACAP | 7.83 | 3.0719 | 2.7354 | 0.0062 | High-High |
| KABUPATEN PATI | 3.87 | 0.3790 | 2.0565 | 0.0397 | Low-Low |
| KABUPATEN BOYOLALI | 3.16 | 0.5027 | 1.8186 | 0.0690 | Tidak Signifikan |
| KABUPATEN MAGELANG | 3.55 | 0.3906 | 1.7777 | 0.0755 | Tidak Signifikan |
| KABUPATEN KARANGANYAR | 3.47 | 0.5078 | 1.7376 | 0.0823 | Tidak Signifikan |
| KABUPATEN GROBOGAN | 3.23 | 0.4872 | 1.6978 | 0.0896 | Tidak Signifikan |
| KABUPATEN SUKOHARJO | 3.65 | 0.3999 | 1.6416 | 0.1007 | Tidak Signifikan |
| KABUPATEN PEKALONGAN | 3.30 | -0.5780 | -1.6001 | 0.1096 | Tidak Signifikan |
| KABUPATEN KEBUMEN | 5.07 | 0.2481 | 1.5904 | 0.1117 | Tidak Signifikan |
| KABUPATEN SRAGEN | 3.53 | 0.5624 | 1.5193 | 0.1287 | Tidak Signifikan |
| KABUPATEN PEMALANG | 6.63 | 0.9461 | 1.4984 | 0.1340 | Tidak Signifikan |
| KABUPATEN BLORA | 3.67 | 0.4724 | 1.4796 | 0.1390 | Tidak Signifikan |
| KOTA SURAKARTA | 4.61 | -0.0455 | -1.3039 | 0.1923 | Tidak Signifikan |
| KABUPATEN KLATEN | 3.97 | 0.2702 | 1.2971 | 0.1946 | Tidak Signifikan |
| KABUPATEN PURBALINGGA | 4.96 | 0.1827 | 1.2834 | 0.1993 | Tidak Signifikan |
| KABUPATEN SEMARANG | 3.73 | 0.2014 | 1.2348 | 0.2169 | Tidak Signifikan |
| KABUPATEN KUDUS | 3.19 | 0.4426 | 1.0816 | 0.2794 | Tidak Signifikan |
| KABUPATEN DEMAK | 4.75 | -0.0698 | -1.0393 | 0.2987 | Tidak Signifikan |
| KABUPATEN WONOGIRI | 2.40 | 0.9375 | 1.0135 | 0.3108 | Tidak Signifikan |
| KABUPATEN REMBANG | 2.84 | 0.5804 | 0.7830 | 0.4336 | Tidak Signifikan |
| KABUPATEN JEPARA | 3.34 | 0.3170 | 0.7457 | 0.4558 | Tidak Signifikan |
| KABUPATEN TEMANGGUNG | 2.35 | 0.4422 | 0.7340 | 0.4629 | Tidak Signifikan |
| KABUPATEN BANJARNEGARA | 5.57 | 0.1679 | 0.6774 | 0.4982 | Tidak Signifikan |
| KOTA MAGELANG | 4.40 | 0.0535 | 0.6513 | 0.5149 | Tidak Signifikan |
| KOTA SALATIGA | 3.86 | 0.2401 | 0.5430 | 0.5871 | Tidak Signifikan |
| KABUPATEN PURWOREJO | 3.89 | 0.0889 | 0.3895 | 0.6969 | Tidak Signifikan |
| KABUPATEN KENDAL | 5.01 | -0.0456 | -0.2994 | 0.7646 | Tidak Signifikan |
| KABUPATEN WONOSOBO | 4.02 | 0.0174 | 0.1767 | 0.8598 | Tidak Signifikan |
| KABUPATEN BATANG | 5.67 | 0.0224 | 0.1226 | 0.9024 | Tidak Signifikan |
| KOTA PEKALONGAN | 4.91 | -0.0062 | -0.0224 | 0.9822 | Tidak Signifikan |
| KOTA SEMARANG | 5.82 | -0.0138 | 0.0184 | 0.9853 | Tidak Signifikan |
table(jateng$Cluster_Moran)
##
## High-High Low-Low Tidak Signifikan
## 5 1 29
peta_lisa <- ggplot2::ggplot(jateng) +
ggplot2::geom_sf(ggplot2::aes(fill = Cluster_Moran), color = "grey20", linewidth = 0.25) +
ggplot2::geom_sf_text(
data = label_points,
ggplot2::aes(label = LABEL),
size = 1.8,
color = "black"
) +
ggplot2::scale_fill_manual(
values = c(
"High-High" = "red",
"Low-Low" = "blue",
"High-Low" = "orange",
"Low-High" = "skyblue",
"Tidak Signifikan" = "grey85"
),
name = "Cluster LISA"
) +
ggplot2::labs(
title = "Peta Local Moran's I / LISA",
subtitle = "Klasifikasi cluster lokal TPT, alpha = 0,05"
) +
ggplot2::theme_minimal()
peta_lisa
LISA digunakan untuk mengidentifikasi wilayah yang memiliki pola lokal signifikan. Peta LISA sudah menampilkan nama kabupaten/kota sehingga wilayah yang masuk kategori tertentu dapat langsung dikenali. Kategori High-High menunjukkan kabupaten/kota dengan TPT tinggi yang dikelilingi tetangga bertingkat TPT tinggi; kategori ini dapat dipahami sebagai klaster pengangguran tinggi. Kategori Low-Low menunjukkan wilayah TPT rendah yang dikelilingi tetangga TPT rendah; kategori ini dapat disebut klaster pengangguran rendah. Kategori High-Low menunjukkan wilayah dengan TPT tinggi tetapi berada di sekitar wilayah TPT rendah, sehingga dapat dipandang sebagai pencilan lokal. Kategori Low-High menunjukkan wilayah TPT rendah di tengah lingkungan tetangga yang relatif tinggi. Wilayah tidak signifikan berarti hubungan lokal antara nilai TPT wilayah tersebut dan tetangganya belum cukup kuat pada taraf signifikansi 5%. Hasil ini lebih operasional dibanding Moran global karena dapat menunjukkan kabupaten/kota mana yang perlu diperhatikan secara spesifik.
# Local Geary's C
local_c_obs <- as.numeric(spdep::localC(jateng$TPT, lw_queen, zero.policy = TRUE))
# P-value pseudo-permutation sederhana untuk local Geary.
# Nilai local C yang besar menunjukkan perbedaan lokal yang kuat.
set.seed(123)
nsim_c <- 999
perm_local_c <- replicate(
nsim_c,
as.numeric(spdep::localC(sample(jateng$TPT), lw_queen, zero.policy = TRUE))
)
p_local_c <- sapply(seq_along(local_c_obs), function(i) {
valid_perm <- perm_local_c[i, !is.na(perm_local_c[i, ])]
(sum(valid_perm >= local_c_obs[i], na.rm = TRUE) + 1) / (length(valid_perm) + 1)
})
jateng$Local_Geary_C <- local_c_obs
jateng$P_Geary_Local <- p_local_c
jateng$Cluster_Geary <- ifelse(jateng$P_Geary_Local <= 0.05, "Signifikan", "Tidak Signifikan")
geary_local_table <- sf::st_drop_geometry(jateng) %>%
dplyr::select(NAMA, TPT, Local_Geary_C, P_Geary_Local, Cluster_Geary) %>%
dplyr::arrange(P_Geary_Local)
knitr::kable(round_df(geary_local_table, 4), caption = "Hasil Geary's C Lokal")
| NAMA | TPT | Local_Geary_C | P_Geary_Local | Cluster_Geary |
|---|---|---|---|---|
| KABUPATEN PEKALONGAN | 3.30 | 2.4360 | 0.264 | Tidak Signifikan |
| KOTA TEGAL | 5.88 | 1.9751 | 0.357 | Tidak Signifikan |
| KABUPATEN PEMALANG | 6.63 | 1.6666 | 0.423 | Tidak Signifikan |
| KABUPATEN CILACAP | 7.83 | 1.5834 | 0.443 | Tidak Signifikan |
| KABUPATEN TEMANGGUNG | 2.35 | 1.4784 | 0.481 | Tidak Signifikan |
| KABUPATEN BREBES | 8.35 | 1.3154 | 0.559 | Tidak Signifikan |
| KOTA SEMARANG | 5.82 | 0.9206 | 0.606 | Tidak Signifikan |
| KABUPATEN KEBUMEN | 5.07 | 1.0382 | 0.649 | Tidak Signifikan |
| KOTA MAGELANG | 4.40 | 0.3235 | 0.666 | Tidak Signifikan |
| KABUPATEN KENDAL | 5.01 | 0.9657 | 0.673 | Tidak Signifikan |
| KOTA PEKALONGAN | 4.91 | 0.7095 | 0.677 | Tidak Signifikan |
| KABUPATEN WONOGIRI | 2.40 | 0.6060 | 0.693 | Tidak Signifikan |
| KABUPATEN PURBALINGGA | 4.96 | 0.8288 | 0.696 | Tidak Signifikan |
| KOTA SURAKARTA | 4.61 | 0.6452 | 0.709 | Tidak Signifikan |
| KABUPATEN BATANG | 5.67 | 0.8383 | 0.725 | Tidak Signifikan |
| KABUPATEN DEMAK | 4.75 | 0.7985 | 0.746 | Tidak Signifikan |
| KABUPATEN TEGAL | 7.53 | 0.6746 | 0.761 | Tidak Signifikan |
| KABUPATEN REMBANG | 2.84 | 0.3917 | 0.767 | Tidak Signifikan |
| KABUPATEN BANYUMAS | 6.18 | 0.8026 | 0.784 | Tidak Signifikan |
| KABUPATEN WONOSOBO | 4.02 | 0.6545 | 0.846 | Tidak Signifikan |
| KABUPATEN BANJARNEGARA | 5.57 | 0.6387 | 0.848 | Tidak Signifikan |
| KABUPATEN JEPARA | 3.34 | 0.3420 | 0.872 | Tidak Signifikan |
| KABUPATEN KUDUS | 3.19 | 0.3268 | 0.910 | Tidak Signifikan |
| KABUPATEN SEMARANG | 3.73 | 0.5359 | 0.911 | Tidak Signifikan |
| KABUPATEN PURWOREJO | 3.89 | 0.2276 | 0.917 | Tidak Signifikan |
| KOTA SALATIGA | 3.86 | 0.0076 | 0.947 | Tidak Signifikan |
| KABUPATEN BLORA | 3.67 | 0.1377 | 0.948 | Tidak Signifikan |
| KABUPATEN KLATEN | 3.97 | 0.1395 | 0.959 | Tidak Signifikan |
| KABUPATEN SUKOHARJO | 3.65 | 0.2560 | 0.961 | Tidak Signifikan |
| KABUPATEN KARANGANYAR | 3.47 | 0.2307 | 0.967 | Tidak Signifikan |
| KABUPATEN PATI | 3.87 | 0.2018 | 0.973 | Tidak Signifikan |
| KABUPATEN SRAGEN | 3.53 | 0.0344 | 0.990 | Tidak Signifikan |
| KABUPATEN GROBOGAN | 3.23 | 0.2085 | 0.993 | Tidak Signifikan |
| KABUPATEN MAGELANG | 3.55 | 0.1829 | 0.994 | Tidak Signifikan |
| KABUPATEN BOYOLALI | 3.16 | 0.2078 | 0.999 | Tidak Signifikan |
table(jateng$Cluster_Geary)
##
## Tidak Signifikan
## 35
ggplot2::ggplot(jateng) +
ggplot2::geom_sf(ggplot2::aes(fill = Cluster_Geary), color = "grey20", linewidth = 0.25) +
ggplot2::geom_sf_text(
data = label_points,
ggplot2::aes(label = LABEL),
size = 1.8,
color = "black"
) +
ggplot2::scale_fill_manual(
values = c("Signifikan" = "purple", "Tidak Signifikan" = "grey85"),
name = "Local Geary"
) +
ggplot2::labs(
title = "Peta Signifikansi Local Geary's C",
subtitle = "Wilayah signifikan menunjukkan ketidakmiripan lokal yang relatif kuat"
) +
ggplot2::theme_minimal()
Local Geary’s C digunakan untuk melihat wilayah yang memiliki perbedaan lokal kuat dibandingkan wilayah sekitarnya. Pada peta, wilayah signifikan menunjukkan kabupaten/kota yang nilai TPT-nya relatif tidak mirip dengan tetangganya. Artinya, wilayah tersebut berpotensi menjadi pencilan lokal atau daerah transisi antara kelompok TPT tinggi dan rendah. Jika suatu kabupaten/kota signifikan pada Local Geary, wilayah tersebut perlu dibaca lebih hati-hati karena masalah penganggurannya mungkin tidak mengikuti pola lingkungan sekitar. Local Geary penting sebagai pelengkap LISA: LISA lebih mudah membaca jenis klaster tinggi-rendah, sedangkan Local Geary lebih menekankan besar kecilnya perbedaan nilai antarwilayah bertetangga.
local_getis_z <- as.numeric(spdep::localG(jateng$TPT, lw_queen_b, zero.policy = TRUE))
local_getis_p <- 2 * pnorm(-abs(local_getis_z))
jateng$Getis_Z <- local_getis_z
jateng$P_Getis <- local_getis_p
jateng$Cluster_Getis <- "Tidak Signifikan"
jateng$Cluster_Getis[jateng$Getis_Z > 0 & jateng$P_Getis <= 0.05] <- "Hot Spot"
jateng$Cluster_Getis[jateng$Getis_Z < 0 & jateng$P_Getis <= 0.05] <- "Cold Spot"
getis_local_table <- sf::st_drop_geometry(jateng) %>%
dplyr::select(NAMA, TPT, Getis_Z, P_Getis, Cluster_Getis) %>%
dplyr::arrange(P_Getis)
knitr::kable(round_df(getis_local_table, 4), caption = "Hasil Getis-Ord Lokal")
| NAMA | TPT | Getis_Z | P_Getis | Cluster_Getis |
|---|---|---|---|---|
| KABUPATEN BANYUMAS | 6.18 | 4.1729 | 0.0000 | Hot Spot |
| KABUPATEN BREBES | 8.35 | 3.8385 | 0.0001 | Hot Spot |
| KABUPATEN TEGAL | 7.53 | 3.4899 | 0.0005 | Hot Spot |
| KOTA TEGAL | 5.88 | 3.3676 | 0.0008 | Hot Spot |
| KABUPATEN CILACAP | 7.83 | 2.7354 | 0.0062 | Hot Spot |
| KABUPATEN PATI | 3.87 | -2.0565 | 0.0397 | Cold Spot |
| KABUPATEN BOYOLALI | 3.16 | -1.8186 | 0.0690 | Tidak Signifikan |
| KABUPATEN MAGELANG | 3.55 | -1.7777 | 0.0755 | Tidak Signifikan |
| KABUPATEN KARANGANYAR | 3.47 | -1.7376 | 0.0823 | Tidak Signifikan |
| KABUPATEN GROBOGAN | 3.23 | -1.6978 | 0.0896 | Tidak Signifikan |
| KABUPATEN SUKOHARJO | 3.65 | -1.6416 | 0.1007 | Tidak Signifikan |
| KABUPATEN PEKALONGAN | 3.30 | 1.6001 | 0.1096 | Tidak Signifikan |
| KABUPATEN KEBUMEN | 5.07 | 1.5904 | 0.1117 | Tidak Signifikan |
| KABUPATEN SRAGEN | 3.53 | -1.5193 | 0.1287 | Tidak Signifikan |
| KABUPATEN PEMALANG | 6.63 | 1.4984 | 0.1340 | Tidak Signifikan |
| KABUPATEN BLORA | 3.67 | -1.4796 | 0.1390 | Tidak Signifikan |
| KOTA SURAKARTA | 4.61 | -1.3039 | 0.1923 | Tidak Signifikan |
| KABUPATEN KLATEN | 3.97 | -1.2971 | 0.1946 | Tidak Signifikan |
| KABUPATEN PURBALINGGA | 4.96 | 1.2834 | 0.1993 | Tidak Signifikan |
| KABUPATEN SEMARANG | 3.73 | -1.2348 | 0.2169 | Tidak Signifikan |
| KABUPATEN KUDUS | 3.19 | -1.0816 | 0.2794 | Tidak Signifikan |
| KABUPATEN DEMAK | 4.75 | -1.0393 | 0.2987 | Tidak Signifikan |
| KABUPATEN WONOGIRI | 2.40 | -1.0135 | 0.3108 | Tidak Signifikan |
| KABUPATEN REMBANG | 2.84 | -0.7830 | 0.4336 | Tidak Signifikan |
| KABUPATEN JEPARA | 3.34 | -0.7457 | 0.4558 | Tidak Signifikan |
| KABUPATEN TEMANGGUNG | 2.35 | -0.7340 | 0.4629 | Tidak Signifikan |
| KABUPATEN BANJARNEGARA | 5.57 | 0.6774 | 0.4982 | Tidak Signifikan |
| KOTA MAGELANG | 4.40 | -0.6513 | 0.5149 | Tidak Signifikan |
| KOTA SALATIGA | 3.86 | -0.5430 | 0.5871 | Tidak Signifikan |
| KABUPATEN PURWOREJO | 3.89 | -0.3895 | 0.6969 | Tidak Signifikan |
| KABUPATEN KENDAL | 5.01 | -0.2994 | 0.7646 | Tidak Signifikan |
| KABUPATEN WONOSOBO | 4.02 | -0.1767 | 0.8598 | Tidak Signifikan |
| KABUPATEN BATANG | 5.67 | 0.1226 | 0.9024 | Tidak Signifikan |
| KOTA PEKALONGAN | 4.91 | -0.0224 | 0.9822 | Tidak Signifikan |
| KOTA SEMARANG | 5.82 | 0.0184 | 0.9853 | Tidak Signifikan |
table(jateng$Cluster_Getis)
##
## Cold Spot Hot Spot Tidak Signifikan
## 1 5 29
ggplot2::ggplot(jateng) +
ggplot2::geom_sf(ggplot2::aes(fill = Cluster_Getis), color = "grey20", linewidth = 0.25) +
ggplot2::geom_sf_text(
data = label_points,
ggplot2::aes(label = LABEL),
size = 1.8,
color = "black"
) +
ggplot2::scale_fill_manual(
values = c(
"Hot Spot" = "red",
"Cold Spot" = "blue",
"Tidak Signifikan" = "grey85"
),
name = "Getis-Ord"
) +
ggplot2::labs(
title = "Peta Getis-Ord Lokal",
subtitle = "Hot spot dan cold spot TPT, alpha = 0,05"
) +
ggplot2::theme_minimal()
Getis-Ord lokal mengidentifikasi konsentrasi nilai tinggi dan rendah secara lebih langsung. Pada peta, Hot Spot menunjukkan kabupaten/kota yang berada dalam konsentrasi TPT tinggi, sedangkan Cold Spot menunjukkan kabupaten/kota yang berada dalam konsentrasi TPT rendah. Jika suatu wilayah menjadi hot spot, maka persoalan pengangguran di wilayah tersebut tidak berdiri sendiri, melainkan berkaitan dengan kondisi wilayah di sekitarnya yang juga tinggi. Wilayah hot spot dapat menjadi prioritas intervensi ketenagakerjaan regional, misalnya perluasan kesempatan kerja lintas kabupaten/kota, penguatan pelatihan kerja, atau dukungan aktivitas ekonomi. Cold spot dapat dijadikan pembanding karena wilayah tersebut menunjukkan kondisi pengangguran yang relatif lebih rendah dan dapat ditelusuri faktor pendukungnya.
Kriging dilakukan menggunakan titik representatif kabupaten/kota.
Ordinary Kriging global menggunakan seluruh titik pengamatan, sedangkan
Kriging lokal menggunakan maksimal 8 titik tetangga terdekat
(nmax = 8).
# Titik pengamatan untuk kriging
points_sf <- sf::st_point_on_surface(jateng)
points_sp <- as(points_sf, "Spatial")
# Grid prediksi dalam wilayah Jawa Tengah
cellsize <- 5000 # meter; dapat diperkecil untuk peta lebih halus, tetapi komputasi lebih lama
boundary_jateng <- sf::st_union(jateng)
grid_sfc <- sf::st_make_grid(boundary_jateng, cellsize = cellsize, what = "centers")
grid_sf <- sf::st_sf(id = seq_along(grid_sfc), geometry = grid_sfc, crs = sf::st_crs(jateng))
grid_sf <- sf::st_filter(grid_sf, boundary_jateng, .predicate = sf::st_intersects)
grid_sp <- as(grid_sf, "Spatial")
cat("Jumlah titik grid prediksi:", nrow(grid_sf), "\n")
## Jumlah titik grid prediksi: 1383
vario_emp <- gstat::variogram(TPT ~ 1, points_sp)
print(vario_emp)
## np dist gamma dir.hor dir.ver id
## 1 1 4544.197 0.3612500 0 0 var1
## 2 2 13277.745 0.2346250 0 0 var1
## 3 2 19128.100 1.3286500 0 0 var1
## 4 24 26560.347 0.9184500 0 0 var1
## 5 28 33422.476 0.8873429 0 0 var1
## 6 21 40133.908 0.9633238 0 0 var1
## 7 19 48519.816 0.5361000 0 0 var1
## 8 35 55142.637 1.0912500 0 0 var1
## 9 27 62534.752 1.2578278 0 0 var1
## 10 26 68974.863 1.0308442 0 0 var1
## 11 22 75938.070 0.9561250 0 0 var1
## 12 38 84254.783 1.3208882 0 0 var1
## 13 31 90685.718 1.1827710 0 0 var1
## 14 29 97976.854 1.2206500 0 0 var1
## 15 19 105703.743 1.2157079 0 0 var1
initial_psill <- stats::var(points_sf$TPT, na.rm = TRUE)
initial_range <- max(sp::spDists(sp::coordinates(points_sp))) / 3
fit_variogram_safely <- function(model_name) {
initial_model <- gstat::vgm(
psill = initial_psill,
model = model_name,
range = initial_range,
nugget = 0
)
suppressWarnings(
tryCatch(
gstat::fit.variogram(vario_emp, initial_model),
error = function(e) NULL
)
)
}
vario_models <- list(
Spherical = fit_variogram_safely("Sph"),
Exponential = fit_variogram_safely("Exp"),
Gaussian = fit_variogram_safely("Gau")
)
sse_models <- sapply(vario_models, function(m) {
if (is.null(m)) Inf else attr(m, "SSErr")
})
best_vario_name <- names(which.min(sse_models))
vario_model <- vario_models[[best_vario_name]]
if (is.null(vario_model) || !is.finite(min(sse_models))) {
best_vario_name <- "Spherical_Default"
vario_model <- gstat::vgm(psill = initial_psill, model = "Sph", range = initial_range, nugget = 0)
}
cat("Model variogram terbaik:", best_vario_name, "\n")
## Model variogram terbaik: Exponential
print(vario_model)
## model psill range
## 1 Nug 0.1798728 0.00
## 2 Exp 0.9790047 24044.99
plot(vario_emp, vario_model, main = paste("Variogram Empiris dan Model", best_vario_name))
kriging_global <- gstat::krige(
formula = TPT ~ 1,
locations = points_sp,
newdata = grid_sp,
model = vario_model
)
## [using ordinary kriging]
kriging_global_sf <- sf::st_as_sf(kriging_global)
kriging_global_df <- data.frame(
sf::st_coordinates(kriging_global_sf),
sf::st_drop_geometry(kriging_global_sf)
)
summary_kriging_global <- data.frame(
Statistik = c("Minimum", "Mean", "Maximum", "Mean Variance"),
Nilai = c(
min(kriging_global_df$var1.pred, na.rm = TRUE),
mean(kriging_global_df$var1.pred, na.rm = TRUE),
max(kriging_global_df$var1.pred, na.rm = TRUE),
mean(kriging_global_df$var1.var, na.rm = TRUE)
)
)
knitr::kable(round_df(summary_kriging_global, 4), caption = "Ringkasan Ordinary Kriging Global")
| Statistik | Nilai |
|---|---|
| Minimum | 2.8320 |
| Mean | 4.5772 |
| Maximum | 7.8274 |
| Mean Variance | 0.7909 |
ggplot2::ggplot() +
ggplot2::geom_raster(
data = kriging_global_df,
ggplot2::aes(x = X, y = Y, fill = var1.pred)
) +
ggplot2::geom_sf(data = jateng, fill = NA, color = "black", linewidth = 0.25) +
ggplot2::geom_sf(data = points_sf, color = "red", size = 1) +
ggplot2::geom_sf_text(
data = label_points,
ggplot2::aes(label = LABEL),
size = 1.8,
color = "black"
) +
ggplot2::scale_fill_viridis_c(option = "C", name = "Prediksi TPT") +
ggplot2::coord_sf(crs = sf::st_crs(jateng)) +
ggplot2::labs(
title = "Ordinary Kriging Global - Prediksi TPT",
subtitle = "Menggunakan seluruh titik pengamatan"
) +
ggplot2::theme_minimal()
ggplot2::ggplot() +
ggplot2::geom_raster(
data = kriging_global_df,
ggplot2::aes(x = X, y = Y, fill = var1.var)
) +
ggplot2::geom_sf(data = jateng, fill = NA, color = "black", linewidth = 0.25) +
ggplot2::geom_sf(data = points_sf, color = "blue", size = 1) +
ggplot2::geom_sf_text(
data = label_points,
ggplot2::aes(label = LABEL),
size = 1.8,
color = "black"
) +
ggplot2::scale_fill_viridis_c(option = "A", name = "Variance") +
ggplot2::coord_sf(crs = sf::st_crs(jateng)) +
ggplot2::labs(
title = "Ordinary Kriging Global - Variance",
subtitle = "Varians menunjukkan ketidakpastian prediksi"
) +
ggplot2::theme_minimal()
kriging_local <- gstat::krige(
formula = TPT ~ 1,
locations = points_sp,
newdata = grid_sp,
model = vario_model,
nmax = 8
)
## [using ordinary kriging]
kriging_local_sf <- sf::st_as_sf(kriging_local)
kriging_local_df <- data.frame(
sf::st_coordinates(kriging_local_sf),
sf::st_drop_geometry(kriging_local_sf)
)
summary_kriging_local <- data.frame(
Statistik = c("Minimum", "Mean", "Maximum", "Mean Variance"),
Nilai = c(
min(kriging_local_df$var1.pred, na.rm = TRUE),
mean(kriging_local_df$var1.pred, na.rm = TRUE),
max(kriging_local_df$var1.pred, na.rm = TRUE),
mean(kriging_local_df$var1.var, na.rm = TRUE)
)
)
knitr::kable(round_df(summary_kriging_local, 4), caption = "Ringkasan Ordinary Kriging Lokal")
| Statistik | Nilai |
|---|---|
| Minimum | 2.6642 |
| Mean | 4.5769 |
| Maximum | 7.9856 |
| Mean Variance | 0.8043 |
ggplot2::ggplot() +
ggplot2::geom_raster(
data = kriging_local_df,
ggplot2::aes(x = X, y = Y, fill = var1.pred)
) +
ggplot2::geom_sf(data = jateng, fill = NA, color = "black", linewidth = 0.25) +
ggplot2::geom_sf(data = points_sf, color = "red", size = 1) +
ggplot2::geom_sf_text(
data = label_points,
ggplot2::aes(label = LABEL),
size = 1.8,
color = "black"
) +
ggplot2::scale_fill_viridis_c(option = "C", name = "Prediksi TPT") +
ggplot2::coord_sf(crs = sf::st_crs(jateng)) +
ggplot2::labs(
title = "Ordinary Kriging Lokal - Prediksi TPT",
subtitle = "Menggunakan maksimum 8 tetangga terdekat"
) +
ggplot2::theme_minimal()
ggplot2::ggplot() +
ggplot2::geom_raster(
data = kriging_local_df,
ggplot2::aes(x = X, y = Y, fill = var1.var)
) +
ggplot2::geom_sf(data = jateng, fill = NA, color = "black", linewidth = 0.25) +
ggplot2::geom_sf(data = points_sf, color = "blue", size = 1) +
ggplot2::geom_sf_text(
data = label_points,
ggplot2::aes(label = LABEL),
size = 1.8,
color = "black"
) +
ggplot2::scale_fill_viridis_c(option = "A", name = "Variance") +
ggplot2::coord_sf(crs = sf::st_crs(jateng)) +
ggplot2::labs(
title = "Ordinary Kriging Lokal - Variance",
subtitle = "Varians menunjukkan ketidakpastian prediksi lokal"
) +
ggplot2::theme_minimal()
perbandingan_kriging <- data.frame(
Metode = c("Kriging Global", "Kriging Lokal nmax=8"),
Minimum = c(min(kriging_global_df$var1.pred, na.rm = TRUE), min(kriging_local_df$var1.pred, na.rm = TRUE)),
Mean = c(mean(kriging_global_df$var1.pred, na.rm = TRUE), mean(kriging_local_df$var1.pred, na.rm = TRUE)),
Maximum = c(max(kriging_global_df$var1.pred, na.rm = TRUE), max(kriging_local_df$var1.pred, na.rm = TRUE)),
Mean_Variance = c(mean(kriging_global_df$var1.var, na.rm = TRUE), mean(kriging_local_df$var1.var, na.rm = TRUE))
)
knitr::kable(round_df(perbandingan_kriging, 4), caption = "Perbandingan Kriging Global dan Lokal")
| Metode | Minimum | Mean | Maximum | Mean_Variance |
|---|---|---|---|---|
| Kriging Global | 2.8320 | 4.5772 | 7.8274 | 0.7909 |
| Kriging Lokal nmax=8 | 2.6642 | 4.5769 | 7.9856 | 0.8043 |
Kriging global menghasilkan permukaan prediksi yang lebih halus karena menggunakan seluruh titik pengamatan dalam proses estimasi. Hasilnya cocok untuk membaca kecenderungan umum TPT di seluruh Jawa Tengah. Warna pada peta prediksi menunjukkan area yang diperkirakan memiliki TPT lebih tinggi atau lebih rendah, sedangkan nama kabupaten/kota membantu menghubungkan permukaan prediksi dengan wilayah administrasi. Peta varians global menunjukkan tingkat ketidakpastian prediksi. Area dengan varians lebih tinggi berarti prediksinya kurang pasti, biasanya karena posisi area tersebut relatif jauh dari titik pengamatan atau karena variasi lokal tidak sepenuhnya dijelaskan oleh model variogram.
Kriging lokal menggunakan maksimum 8 tetangga terdekat sehingga lebih peka terhadap perubahan setempat. Jika peta lokal terlihat lebih bervariasi dibanding peta global, hal itu wajar karena pengaruh titik yang jauh dikurangi. Kriging lokal berguna untuk melihat detail spasial yang mungkin tersamarkan pada kriging global. Perbandingan ringkasan kriging global dan lokal menunjukkan apakah metode lokal menghasilkan rentang prediksi dan rata-rata varians yang berbeda. Jika mean variance kriging lokal lebih rendah, prediksi lokal cenderung lebih pasti pada lingkungan terdekat. Jika lebih tinggi, berarti pembatasan tetangga membuat ketidakpastian meningkat pada beberapa area.
Pada bagian ini digunakan model SAR karena model tersebut memasukkan
pengaruh TPT wilayah tetangga melalui komponen lag spasial
WY. Sebelum membentuk model SAR, model OLS digunakan
sebagai pembanding awal.
model_ols <- lm(TPT ~ RLS + IPM + Miskin + PDRB, data = sf::st_drop_geometry(jateng))
summary(model_ols)
##
## Call:
## lm(formula = TPT ~ RLS + IPM + Miskin + PDRB, data = sf::st_drop_geometry(jateng))
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.4211 -0.6294 -0.1513 0.7012 3.1865
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 15.36682855 12.18160827 1.261 0.21686
## RLS 0.72849132 0.77370633 0.942 0.35394
## IPM -0.25848784 0.24144307 -1.071 0.29289
## Miskin 0.01459710 0.00501563 2.910 0.00674 **
## PDRB 0.00001672 0.00001101 1.518 0.13950
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.329 on 30 degrees of freedom
## Multiple R-squared: 0.3027, Adjusted R-squared: 0.2097
## F-statistic: 3.256 on 4 and 30 DF, p-value: 0.02483
# Cek multikolinearitas
car::vif(model_ols)
## RLS IPM Miskin PDRB
## 21.751065 22.755978 1.711626 2.573365
# Uji Lagrange Multiplier / Rao's Score untuk indikasi model spasial.
# Perbaikan: beberapa versi spdep tidak menerima daftar test manual.
# Gunakan test = "all" agar kompatibel lintas versi spdep.
lm_spatial_test <- tryCatch({
if ("lm.RStests" %in% getNamespaceExports("spdep")) {
spdep::lm.RStests(
model_ols,
listw = lw_queen,
test = "all",
zero.policy = TRUE
)
} else {
spdep::lm.LMtests(
model_ols,
listw = lw_queen,
test = "all",
zero.policy = TRUE
)
}
}, error = function(e) {
cat("Uji LM/Rao's Score tidak dapat dijalankan pada versi spdep ini.
")
cat("Pesan error:", e$message, "
")
NULL
})
if (!is.null(lm_spatial_test)) {
print(lm_spatial_test)
}
##
## Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
## dependence
##
## data:
## model: lm(formula = TPT ~ RLS + IPM + Miskin + PDRB, data =
## sf::st_drop_geometry(jateng))
## test weights: lw_queen
##
## RSerr = 13.108, df = 1, p-value = 0.000294
##
##
## Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
## dependence
##
## data:
## model: lm(formula = TPT ~ RLS + IPM + Miskin + PDRB, data =
## sf::st_drop_geometry(jateng))
## test weights: lw_queen
##
## RSlag = 21.678, df = 1, p-value = 0.000003224
##
##
## Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
## dependence
##
## data:
## model: lm(formula = TPT ~ RLS + IPM + Miskin + PDRB, data =
## sf::st_drop_geometry(jateng))
## test weights: lw_queen
##
## adjRSerr = 1.343, df = 1, p-value = 0.2465
##
##
## Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
## dependence
##
## data:
## model: lm(formula = TPT ~ RLS + IPM + Miskin + PDRB, data =
## sf::st_drop_geometry(jateng))
## test weights: lw_queen
##
## adjRSlag = 9.9134, df = 1, p-value = 0.001641
##
##
## Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
## dependence
##
## data:
## model: lm(formula = TPT ~ RLS + IPM + Miskin + PDRB, data =
## sf::st_drop_geometry(jateng))
## test weights: lw_queen
##
## SARMA = 23.021, df = 2, p-value = 0.00001002
Model OLS digunakan sebagai model dasar untuk melihat hubungan TPT dengan RLS, IPM, Miskin, dan PDRB tanpa mempertimbangkan efek spasial. Koefisien pada OLS menunjukkan arah hubungan masing-masing variabel penjelas terhadap TPT ketika variabel lain dianggap tetap. Nilai p-value pada ringkasan OLS digunakan untuk melihat apakah pengaruh variabel tersebut signifikan secara statistik. VIF digunakan untuk memeriksa multikolinearitas; nilai VIF yang tinggi menunjukkan adanya hubungan kuat antarvariabel independen sehingga interpretasi koefisien perlu hati-hati. Uji LM atau Rao’s Score digunakan untuk mengecek apakah residual model OLS masih memiliki indikasi ketergantungan spasial. Jika uji lag spasial signifikan, maka model SAR lebih tepat dipertimbangkan karena TPT suatu wilayah mungkin dipengaruhi oleh TPT wilayah tetangga.
model_sar <- spatialreg::lagsarlm(
TPT ~ RLS + IPM + Miskin + PDRB,
data = sf::st_drop_geometry(jateng),
listw = lw_queen,
zero.policy = TRUE,
method = "eigen"
)
summary(model_sar)
##
## Call:spatialreg::lagsarlm(formula = TPT ~ RLS + IPM + Miskin + PDRB,
## data = sf::st_drop_geometry(jateng), listw = lw_queen, method = "eigen",
## zero.policy = TRUE)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.42091 -0.57402 -0.11877 0.61847 1.80233
##
## Type: lag
## Coefficients: (asymptotic standard errors)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.4868763672 7.6962406342 -0.0633 0.949558
## RLS 0.1630976682 0.4852828730 0.3361 0.736805
## IPM -0.0143924195 0.1515216617 -0.0950 0.924326
## Miskin 0.0104549395 0.0031948248 3.2725 0.001066
## PDRB 0.0000090320 0.0000068993 1.3091 0.190498
##
## Rho: 0.70266, LR test value: 22.189, p-value: 0.0000024711
## Asymptotic standard error: 0.11157
## z-value: 6.2978, p-value: 0.00000000030196
## Wald statistic: 39.662, p-value: 0.00000000030196
##
## Log likelihood: -45.8159 for lag model
## ML residual variance (sigma squared): 0.68907, (sigma: 0.8301)
## Number of observations: 35
## Number of parameters estimated: 7
## AIC: 105.63, (AIC for lm: 125.82)
## LM test for residual autocorrelation
## test value: 1.6155, p-value: 0.20372
# Dampak langsung, tidak langsung, dan total pada model SAR.
impacts_sar <- tryCatch(
spatialreg::impacts(model_sar, listw = lw_queen, R = 199),
error = function(e) e
)
if (inherits(impacts_sar, "error")) {
cat("Perhitungan impacts SAR tidak berhasil:", impacts_sar$message, "\n")
} else {
print(summary(impacts_sar, zstats = TRUE))
}
## Impact measures (lag, exact):
## Direct Indirect Total
## RLS 0.19586250692 0.35266077714 0.54852328406
## IPM -0.01728372575 -0.03112026008 -0.04840398583
## Miskin 0.01255524181 0.02260637527 0.03516161708
## PDRB 0.00001084641 0.00001952953 0.00003037594
## ========================================================
## Simulation results ( variance matrix):
## Direct:
##
## Iterations = 1:198
## Thinning interval = 1
## Number of chains = 1
## Sample size per chain = 198
##
## 1. Empirical mean and standard deviation for each variable,
## plus standard error of the mean:
##
## Mean SD Naive SE Time-series SE
## RLS 0.26299646 0.573048018 0.0407247493 0.0407247493
## IPM -0.03048604 0.188581795 0.0134019246 0.0134019246
## Miskin 0.01363268 0.003865515 0.0002747102 0.0003181798
## PDRB 0.00001075 0.000007827 0.0000005562 0.0000005562
##
## 2. Quantiles for each variable:
##
## 2.5% 25% 50% 75% 97.5%
## RLS -0.879528919 -0.08061172 0.26947212 0.65568110 1.50666279
## IPM -0.377760712 -0.16179809 -0.03822411 0.10879834 0.27894662
## Miskin 0.006802802 0.01122439 0.01354080 0.01588818 0.02112473
## PDRB -0.000003687 0.00000542 0.00001128 0.00001592 0.00002573
##
## ========================================================
## Indirect:
##
## Iterations = 1:198
## Thinning interval = 1
## Number of chains = 1
## Sample size per chain = 198
##
## 1. Empirical mean and standard deviation for each variable,
## plus standard error of the mean:
##
## Mean SD Naive SE Time-series SE
## RLS 0.40953554 1.70036613 0.120839759 0.120839759
## IPM -0.00262626 0.75693642 0.053793129 0.053793129
## Miskin 0.02850611 0.02652551 0.001885086 0.003038327
## PDRB 0.00002024 0.00002751 0.000001955 0.000001561
##
## 2. Quantiles for each variable:
##
## 2.5% 25% 50% 75% 97.5%
## RLS -2.281378842 -0.142707100 0.42132563 1.01727961 3.33806260
## IPM -0.932819455 -0.246635547 -0.05672010 0.15190222 0.89065483
## Miskin 0.007922220 0.016011020 0.02252719 0.03168790 0.08954180
## PDRB -0.000006435 0.000008243 0.00001836 0.00002867 0.00007673
##
## ========================================================
## Total:
##
## Iterations = 1:198
## Thinning interval = 1
## Number of chains = 1
## Sample size per chain = 198
##
## 1. Empirical mean and standard deviation for each variable,
## plus standard error of the mean:
##
## Mean SD Naive SE Time-series SE
## RLS 0.672532 2.19144660 0.155739328 0.15573933
## IPM -0.033112 0.90575710 0.064369354 0.06436935
## Miskin 0.042139 0.02884402 0.002049856 0.00327729
## PDRB 0.000031 0.00003364 0.000002391 0.00000195
##
## 2. Quantiles for each variable:
##
## 2.5% 25% 50% 75% 97.5%
## RLS -3.00472343 -0.23053190 0.74205022 1.72718529 4.40406839
## IPM -1.25610007 -0.41089727 -0.11372097 0.26259284 1.14585505
## Miskin 0.01597635 0.02752009 0.03640328 0.04568676 0.10918401
## PDRB -0.00001034 0.00001394 0.00003055 0.00004435 0.00009896
##
## ========================================================
## Simulated standard errors
## Direct Indirect Total
## RLS 0.573048017690 1.70036613460 2.19144659881
## IPM 0.188581795431 0.75693642308 0.90575709554
## Miskin 0.003865515327 0.02652550886 0.02884402429
## PDRB 0.000007826774 0.00002751145 0.00003363807
##
## Simulated z-values:
## Direct Indirect Total
## RLS 0.4589431 0.240851388 0.3068895
## IPM -0.1616595 -0.003469591 -0.0365576
## Miskin 3.5267444 1.074667790 1.4609194
## PDRB 1.3740339 0.735819406 0.9215067
##
## Simulated p-values:
## Direct Indirect Total
## RLS 0.6462750 0.80967 0.75893
## IPM 0.8715740 0.99723 0.97084
## Miskin 0.0004207 0.28252 0.14404
## PDRB 0.1694311 0.46184 0.35679
Nilai koefisien rho pada model SAR menunjukkan kekuatan
pengaruh spasial dari TPT wilayah tetangga terhadap TPT suatu wilayah.
Jika rho bernilai positif dan signifikan, maka kenaikan TPT
pada wilayah tetangga cenderung diikuti oleh kenaikan TPT pada wilayah
yang diamati. Ini berarti masalah pengangguran bersifat saling berkaitan
antarwilayah dan tidak cukup dijelaskan hanya oleh kondisi internal
kabupaten/kota. Jika rho tidak signifikan, maka setelah
RLS, IPM, Miskin, dan PDRB dimasukkan ke model, pengaruh TPT tetangga
belum cukup kuat secara statistik. Koefisien variabel independen pada
SAR tidak hanya dibaca sebagai pengaruh langsung, karena adanya komponen
spasial dapat menghasilkan dampak tidak langsung. Oleh karena itu,
bagian impacts SAR digunakan untuk membedakan dampak langsung pada
wilayah itu sendiri, dampak tidak langsung ke wilayah lain, dan dampak
total.
perbandingan_model <- data.frame(
Model = c("OLS", "SAR"),
AIC = c(AIC(model_ols), AIC(model_sar)),
LogLik = c(as.numeric(logLik(model_ols)), as.numeric(logLik(model_sar)))
) %>%
dplyr::arrange(AIC)
knitr::kable(round_df(perbandingan_model, 4), caption = "Perbandingan Model OLS dan SAR")
| Model | AIC | LogLik |
|---|---|---|
| SAR | 105.6318 | -45.8159 |
| OLS | 125.8206 | -56.9103 |
best_model <- perbandingan_model$Model[1]
cat("Model terbaik berdasarkan AIC adalah:", best_model, "\n")
## Model terbaik berdasarkan AIC adalah: SAR
Model dengan nilai AIC paling kecil dipilih sebagai model yang lebih baik karena AIC mempertimbangkan kecocokan model sekaligus jumlah parameter. Jika SAR memiliki AIC lebih kecil daripada OLS, maka penambahan efek spasial melalui lag variabel dependen mampu meningkatkan kesesuaian model. Hal tersebut menunjukkan bahwa TPT wilayah tetangga membawa informasi penting untuk menjelaskan TPT suatu kabupaten/kota. Jika OLS memiliki AIC lebih kecil, model nonspasial sudah cukup kompetitif dan efek spasial tidak meningkatkan model secara berarti. Perbandingan ini membuat pemilihan model lebih objektif, tidak hanya berdasarkan dugaan teoritis, tetapi juga berdasarkan ukuran performa model.
jateng$Prediksi_SAR <- as.numeric(fitted(model_sar))
jateng$Residual_SAR <- as.numeric(residuals(model_sar))
summary_pred_res <- data.frame(
Statistik = c("Min", "Mean", "Median", "Max", "SD"),
Prediksi_SAR = c(
min(jateng$Prediksi_SAR, na.rm = TRUE),
mean(jateng$Prediksi_SAR, na.rm = TRUE),
median(jateng$Prediksi_SAR, na.rm = TRUE),
max(jateng$Prediksi_SAR, na.rm = TRUE),
sd(jateng$Prediksi_SAR, na.rm = TRUE)
),
Residual_SAR = c(
min(jateng$Residual_SAR, na.rm = TRUE),
mean(jateng$Residual_SAR, na.rm = TRUE),
median(jateng$Residual_SAR, na.rm = TRUE),
max(jateng$Residual_SAR, na.rm = TRUE),
sd(jateng$Residual_SAR, na.rm = TRUE)
)
)
knitr::kable(round_df(summary_pred_res, 4), caption = "Statistik Prediksi dan Residual SAR")
| Statistik | Prediksi_SAR | Residual_SAR |
|---|---|---|
| Min | 3.3649 | -1.4209 |
| Mean | 4.5197 | 0.0000 |
| Median | 4.1136 | -0.1188 |
| Max | 7.6230 | 1.8023 |
| SD | 1.1133 | 0.8422 |
# Cek autokorelasi residual model SAR
moran_residual_sar <- spdep::moran.test(jateng$Residual_SAR, lw_queen, zero.policy = TRUE)
print(moran_residual_sar)
##
## Moran I test under randomisation
##
## data: jateng$Residual_SAR
## weights: lw_queen
##
## Moran I statistic standard deviate = -0.4654, p-value = 0.6792
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## -0.08338918 -0.02941176 0.01345142
ggplot2::ggplot(jateng) +
ggplot2::geom_sf(ggplot2::aes(fill = Prediksi_SAR), color = "grey20", linewidth = 0.25) +
ggplot2::geom_sf_text(
data = label_points,
ggplot2::aes(label = LABEL),
size = 1.8,
color = "black"
) +
ggplot2::scale_fill_viridis_c(option = "C", name = "Prediksi TPT") +
ggplot2::labs(
title = "Peta Prediksi TPT Model SAR",
subtitle = "Prediksi berdasarkan RLS, IPM, Miskin, PDRB, dan efek spasial"
) +
ggplot2::theme_minimal()
ggplot2::ggplot(jateng) +
ggplot2::geom_sf(ggplot2::aes(fill = Residual_SAR), color = "grey20", linewidth = 0.25) +
ggplot2::geom_sf_text(
data = label_points,
ggplot2::aes(label = LABEL),
size = 1.8,
color = "black"
) +
ggplot2::scale_fill_gradient2(name = "Residual", midpoint = 0) +
ggplot2::labs(
title = "Peta Residual Model SAR",
subtitle = "Residual positif berarti TPT aktual lebih tinggi daripada prediksi model"
) +
ggplot2::theme_minimal()
Peta prediksi SAR menunjukkan nilai TPT hasil estimasi model pada setiap kabupaten/kota dengan mempertimbangkan variabel RLS, IPM, Miskin, PDRB, serta efek spasial dari wilayah tetangga. Wilayah dengan warna prediksi lebih tinggi menunjukkan kabupaten/kota yang menurut model memiliki risiko TPT lebih tinggi. Peta residual memperlihatkan selisih antara TPT aktual dan TPT prediksi. Residual positif berarti TPT aktual lebih tinggi daripada prediksi model, sehingga model masih meremehkan tingkat pengangguran pada wilayah tersebut. Residual negatif berarti TPT aktual lebih rendah daripada prediksi model, sehingga model memperkirakan nilai yang terlalu tinggi. Jika peta residual masih memperlihatkan pola mengelompok, berarti masih ada faktor lain yang belum tertangkap oleh model, misalnya struktur industri, migrasi tenaga kerja, urbanisasi, akses transportasi, atau kebijakan lokal. Uji Moran residual digunakan untuk memeriksa apakah sisa kesalahan model masih memiliki autokorelasi spasial. Model yang baik diharapkan menghasilkan residual yang tidak lagi berpola spasial.
Berdasarkan hasil analisis spasial TPT kabupaten/kota di Provinsi Jawa Tengah, diperoleh beberapa kesimpulan sebagai berikut.
Secara umum, pendekatan spasial penting digunakan karena TPT antarwilayah tidak hanya dipengaruhi oleh karakteristik internal wilayah, tetapi juga dapat berkaitan dengan kondisi wilayah sekitar. Hasil analisis ini dapat menjadi dasar dalam perumusan kebijakan ketenagakerjaan berbasis wilayah, terutama untuk mengidentifikasi daerah prioritas penanganan pengangguran.
Anselin, L. (1995). Local Indicators of Spatial Association—LISA. Geographical Analysis, 27(2), 93–115.
Bivand, R. S., Pebesma, E., & Gómez-Rubio, V. (2013). Applied Spatial Data Analysis with R. Springer.
Cressie, N. (1993). Statistics for Spatial Data. Wiley.
Getis, A., & Ord, J. K. (1992). The analysis of spatial association by use of distance statistics. Geographical Analysis, 24(3), 189–206.
GADM. (2024). Database of Global Administrative Areas, Version 4.1.