Judul
Analisis Spasial Kasus Pneumonia Pada Balita di Jawa Timur Tahun
2022
Nama
Stephani Julieta
Program Studi
S-1 Statistika
NPM
140610230050
Mata Kuliah
Spasial
Dosen Pembimbing Mata Kuliah
I Gede Nyoman Mindra Jaya, P.hd
Abstrak
Pneumonia merupakan salah satu penyakit infeksi saluran pernapasan akut yang menjadi penyebab utama morbiditas pada balita. Distribusi kejadian pneumonia balita tidak bersifat acak secara geografis, melainkan dipengaruhi oleh faktor lingkungan, sosial, dan kesehatan yang berbeda antarwilayah. Penelitian ini bertujuan untuk menganalisis pola sebaran spasial prevalensi pneumonia balita di Provinsi Jawa Timur serta mengidentifikasi faktor-faktor yang memengaruhinya menggunakan pendekatan analisis spasial.
Data yang digunakan berupa data sekunder tingkat kabupaten/kota yang meliputi jumlah kasus pneumonia balita, jumlah penduduk balita, kepadatan penduduk, prevalensi balita gizi kurang, dan cakupan imunisasi. Analisis dilakukan menggunakan metode autokorelasi spasial global (Moran’s I dan Geary’s C), autokorelasi spasial lokal (Local Indicator of Spatial Association/LISA), serta regresi spasial menggunakan model Ordinary Least Squares (OLS), Spatial Autoregressive Model (SAR), dan Spatial Error Model (SEM). Pemilihan model terbaik dilakukan berdasarkan nilai Akaike Information Criterion (AIC). Selain itu, interpolasi spasial menggunakan metode Inverse Distance Weighting (IDW) diterapkan untuk menggambarkan permukaan kontinu prevalensi pneumonia balita.
Hasil analisis menunjukkan bahwa prevalensi pneumonia balita di Provinsi Jawa Timur memiliki autokorelasi spasial yang signifikan. Analisis LISA mengidentifikasi adanya klaster wilayah dengan prevalensi tinggi dan rendah yang signifikan secara statistik. Hasil regresi spasial menunjukkan bahwa kepadatan penduduk dan prevalensi balita gizi kurang berpengaruh positif terhadap prevalensi pneumonia balita, sementara cakupan imunisasi berpengaruh negatif. Model regresi spasial terbaik mampu menangkap ketergantungan spasial dengan lebih baik dibandingkan model OLS. Interpolasi IDW memperlihatkan variasi spasial prevalensi pneumonia balita secara lebih halus antarwilayah.
Penelitian ini menegaskan pentingnya pendekatan spasial dalam analisis penyakit berbasis wilayah serta dapat menjadi dasar bagi perencanaan intervensi kesehatan yang lebih terarah di Provinsi Jawa Timur.
Kata kunci: pneumonia balita, analisis spasial, autokorelasi spasial, regresi spasial, Jawa Timur.
Pneumonia merupakan salah satu penyebab utama kesakitan dan kematian pada balita di berbagai negara, termasuk Indonesia. Pada kelompok usia balita, pneumonia berkontribusi besar terhadap beban penyakit karena sistem imun yang belum matang, kerentanan terhadap infeksi saluran napas, serta faktor lingkungan dan sosial ekonomi yang dapat memperburuk risiko penularan dan keparahan. Selain berdampak pada kesehatan anak, pneumonia pada balita juga menimbulkan beban ekonomi bagi keluarga dan sistem layanan kesehatan akibat meningkatnya kebutuhan kunjungan pelayanan, pengobatan, dan perawatan.
Di tingkat daerah, beban pneumonia balita tidak selalu merata. Provinsi Jawa Timur sebagai salah satu provinsi dengan jumlah penduduk besar serta keragaman karakteristik wilayah—mulai dari kawasan perkotaan padat, wilayah industri, hingga kawasan perdesaan dan kepulauan—memiliki potensi variasi risiko pneumonia yang berbeda antar kabupaten/kota. Perbedaan tersebut dapat dipengaruhi oleh faktor kepadatan penduduk, kualitas hunian dan ventilasi rumah, akses air bersih dan sanitasi, cakupan imunisasi, status gizi, perilaku pencarian pengobatan, hingga aksesibilitas dan kualitas layanan kesehatan. Selain itu, faktor lingkungan seperti kualitas udara (misalnya polusi perkotaan, pembakaran sampah, atau asap rokok dalam rumah) dan kondisi iklim setempat juga dapat berperan dalam memengaruhi pola kejadian pneumonia.
Pada tahun 2022, kondisi pemulihan layanan kesehatan pascapandemi turut menjadi perhatian karena dapat memengaruhi cakupan layanan dasar (seperti imunisasi, pemantauan tumbuh kembang, dan penemuan kasus). Situasi ini berpotensi memunculkan perubahan pola pelaporan dan distribusi kasus antarwilayah. Oleh karena itu, pemetaan dan analisis distribusi kasus pneumonia balita tahun 2022 penting dilakukan untuk memahami apakah terdapat konsentrasi kasus pada wilayah tertentu (cluster) dan apakah wilayah dengan beban tinggi berdekatan secara geografis, yang dapat mengindikasikan adanya pengaruh faktor spasial.
Pendekatan analisis spasial menjadi relevan karena mampu menggambarkan pola persebaran kasus secara geografis serta mengidentifikasi wilayah prioritas secara lebih presisi dibandingkan analisis nonspasial. Melalui pemetaan tematik dan uji autokorelasi spasial (misalnya Moran’s I) maupun analisis klaster (misalnya LISA/hotspot), penelitian dapat menunjukkan apakah kasus pneumonia balita cenderung mengelompok pada lokasi tertentu atau menyebar secara acak. Hasil analisis spasial ini dapat menjadi dasar untuk intervensi kesehatan masyarakat yang lebih tepat sasaran—misalnya penguatan penemuan kasus dan tata laksana di kabupaten/kota tertentu, peningkatan cakupan imunisasi dan edukasi pencegahan di wilayah berisiko, serta perbaikan determinan lingkungan dan sosial yang berkontribusi terhadap tingginya kejadian pneumonia.
Berdasarkan uraian tersebut, analisis spasial kasus pneumonia pada balita di Jawa Timur tahun 2022 perlu dilakukan untuk (1) memetakan distribusi kasus menurut kabupaten/kota, (2) menilai ada tidaknya autokorelasi spasial, dan (3) mengidentifikasi klaster wilayah risiko tinggi/rendah sebagai dasar penyusunan kebijakan dan program pencegahan pneumonia balita yang lebih efektif dan berbasis wilayah.
Berdasarkan latar belakang yang telah diuraikan, rumusan masalah dalam penelitian ini adalah sebagai berikut:
Bagaimana pola distribusi spasial kasus pneumonia pada balita di Provinsi Jawa Timur tahun 2022?
Apakah terdapat autokorelasi spasial pada prevalensi pneumonia balita antar kabupaten/kota di Provinsi Jawa Timur?
Wilayah mana saja yang membentuk klaster tinggi (high-high) dan klaster rendah (low-low) kasus pneumonia balita berdasarkan analisis LISA?
Faktor-faktor apa saja yang berpengaruh terhadap prevalensi pneumonia pada balita di Jawa Timur setelah mempertimbangkan efek spasial?
Model regresi spasial manakah yang paling sesuai untuk menjelaskan variasi prevalensi pneumonia balita di Provinsi Jawa Timur?
Tujuan dari penelitian ini adalah sebagai berikut:
Menganalisis dan memetakan distribusi spasial kasus pneumonia pada balita di Provinsi Jawa Timur tahun 2022.
Menguji adanya autokorelasi spasial global pada prevalensi pneumonia balita menggunakan Moran’s I dan Geary’s C.
Mengidentifikasi klaster spasial lokal kasus pneumonia balita antar kabupaten/kota menggunakan analisis LISA.
Menganalisis pengaruh faktor kepadatan penduduk, prevalensi balita gizi kurang, dan cakupan imunisasi terhadap prevalensi pneumonia balita.
Menentukan model regresi spasial terbaik (OLS, SAR, atau SEM) dalam menjelaskan variasi prevalensi pneumonia balita di Provinsi Jawa Timur.
Agar penelitian ini lebih terfokus dan sesuai dengan tujuan yang telah ditetapkan, maka batasan penelitian yang digunakan adalah sebagai berikut:
Wilayah penelitian dibatasi pada seluruh kabupaten dan kota di Provinsi Jawa Timur.
Data yang digunakan merupakan data sekunder tahun 2022 yang bersumber dari dataset resmi yang telah disediakan.
Variabel respon dalam penelitian ini adalah prevalensi pneumonia pada balita per 100.000 balita.
Variabel penjelas yang digunakan meliputi kepadatan penduduk, prevalensi balita gizi kurang, dan cakupan imunisasi.
Analisis spasial dilakukan menggunakan matriks bobot spasial berbasis contiguity (queen contiguity).
Metode analisis yang digunakan meliputi analisis autokorelasi spasial global, analisis LISA, serta pemodelan regresi spasial (OLS, SAR, dan SEM).
Penelitian ini tidak membahas aspek klinis maupun intervensi kebijakan secara mendalam, melainkan berfokus pada analisis pola spasial dan faktor yang memengaruhinya.
Pneumonia adalah infeksi akut pada jaringan paru-paru yang disebabkan oleh bakteri, virus, atau jamur. Pada balita, pneumonia merupakan salah satu penyebab utama kematian dan kesakitan karena sistem imun yang belum berkembang secara optimal. Faktor lingkungan, kondisi sosial ekonomi, status gizi, serta cakupan imunisasi berperan penting dalam meningkatkan risiko terjadinya pneumonia pada balita.
Dalam konteks wilayah administratif seperti kabupaten/kota, kejadian pneumonia pada balita tidak hanya dipengaruhi oleh karakteristik internal wilayah tersebut, tetapi juga oleh kondisi wilayah di sekitarnya. Oleh karena itu, analisis berbasis wilayah (areal data) dengan pendekatan spasial diperlukan untuk memahami pola penyebaran pneumonia balita secara lebih komprehensif.
Dependensi spasial menyatakan bahwa nilai suatu variabel pada satu wilayah tidak independen dari nilai variabel yang sama pada wilayah tetangga. Hal ini mencerminkan bahwa “barang-apa yang berada di dekat lebih berkaitan dibanding yang jauh” sesuai dengan Tobler’s First Law of Geography. Pada penelitian ini, dependensi spasial dapat muncul karena jumlah penduduk, kondisi lingkungan, akses layanan kesehatan antar daerah, dan kebiasaan hidup.
Beberapa implikasi dependensi spasial diantara lain :
Autokorelasi spasial mengukur sejauh mana suatu wilayah memiliki kesamaan nilai dengan wilayah di sekitarnya. Autokorelasi positif menunjukkan bahwa wilayah dengan nilai tinggi (atau rendah) cenderung berdekatan dengan wilayah lain yang juga memiliki nilai serupa (cluster), sedangkan autokorelasi negatif menunjukkan pola penyebaran yang saling berbeda (dispersion).
Ukuran utama yang digunakan untuk mengukur autokorelasi spasial adalah Moran’s I dan Local Indicators of Spatial Association (LISA) dengan formulasi sebagai berikut.
\[ I = \frac{n}{\sum_i \sum_j w_{ij}} \cdot \frac{\sum_i \sum_j w_{ij} (y_i - \bar{y})(y_j - \bar{y})} {\sum_i (y_i - \bar{y})^2} \]
Keterangan:
Nilai \(I > 0\) menunjukkan
autokorelasi spasial positif,
\(I < 0\) menunjukkan negatif, dan
\(I = 0\) berarti tidak ada
autokorelasi
(Anselin, 1995).
\[ C = \frac{(n - 1)\sum_i \sum_j w_{ij}(y_i - y_j)^2} {2 \sum_i \sum_j w_{ij} \sum_i (y_i - \bar{y})^2} \]
Nilai \(C < 1\) menunjukkan bahwa
terdapat autokorelasi positif,
sedangkan \(C > 1\) menunjukkan
autokorelasi negatif.
\[ I_i = (y_i - \bar{y}) \sum_j w_{ij} (y_j - \bar{y}) \]
LISA digunakan untuk mengidentifikasi klaster lokal, seperti: -
High-High (daerah tinggi dikelilingi tinggi) -
Low-Low - High-Low
- Low-High
\[ G_i^* = \frac {\sum_j w_{ij}x_j - \bar{X}\sum_j w_{ij}} {S \sqrt{ \frac{ \left[ n\sum_j w_{ij}^2 - (\sum_j w_{ij})^2 \right] }{n-1} }} \]
dimana: - \(x_j\) = nilai variabel tetangga - \(S\) = standar deviasi
Hotspot menandakan klaster tinggi yang signifikan secara spasial.
Model regresi linier klasik (Ordinary Least Squares/OLS) dirumuskan sebagai:
\[ y = X \beta + \varepsilon \] dengan:
Model OLS mengasumsikan tidak adanya autokorelasi spasial pada residual, sehingga kurang sesuai jika terdapat ketergantungan spasial.
Model ekonometrik spasial digunakan untuk mengatasi pelanggaran asumsi independensi residual dalam model regresi konvensional. Menurut Anselin (1988),model-model ini memperhitungkan adanya efek spasial yang mungkin berasal dari pengaruh tetangga (spatial lag) atau dari error yang berkorelasi secara spasial (spatial error).
Beberapa model utama yang digunakan meliputi:
\[ y = \rho W y + X \beta + \varepsilon \]
Keterangan:
Model SAR sesuai digunakan ketika ketergantungan spasial terjadi pada variabel respon.
\[ y = X\beta + u, \quad u = \lambda W u + \varepsilon \]
Keterangan:
Model ini digunakan ketika efek spasial muncul pada residual, bukan
pada variabel dependen.
Nilai \(\lambda\) menunjukkan tingkat
ketergantungan error spasial.
\[ \hat{z}(s_0)= \frac{\sum_{i=1}^{n} z(s_i)\, d(s_0,s_i)^{-p}} {\sum_{i=1}^{n} d(s_0,s_i)^{-p}} \]
\[ y = \rho W y + X \beta + W X \theta + \varepsilon \]
Keterangan:
Model ini menggabungkan pengaruh spasial baik pada variabel dependen maupun independen, sehingga memberikan fleksibilitas lebih dalam menangkap hubungan spasial antar wilayah.
\[ y = X\beta + WX\theta + u, \quad u = \lambda W u + \varepsilon \]
Keterangan:
SDEM menggabungkan lag spasial dari variabel independen serta error yang bersifat spasial, menjadikannya cocok untuk fenomena lingkungan dan sosial seperti penyebaran penyakit.
Penelitian ini merupakan penelitian kuantitatif dengan pendekatan analisis spasial. Pendekatan ini digunakan untuk menganalisis pola penyebaran kasus pneumonia pada balita berdasarkan wilayah administratif kabupaten/kota di Provinsi Jawa Timur dengan mempertimbangkan adanya ketergantungan spasial antarwilayah.
Analisis dilakukan menggunakan data sekunder yang dianalisis secara eksploratif dan inferensial melalui metode statistik spasial.
Objek penelitian adalah kasus pneumonia pada balita di Provinsi Jawa Timur tahun 2022. Lokasi penelitian mencakup seluruh kabupaten dan kota di Provinsi Jawa Timur, yang berjumlah 38 wilayah administratif.
Setiap wilayah direpresentasikan dalam bentuk poligon sehingga penelitian ini menggunakan data spasial tipe areal (polygon data).
Data yang digunakan dalam penelitian ini bersumber dari:
Data kasus pneumonia balita dan variabel penjelas yang diperoleh dari dataset sekunder (file Excel).
Data spasial batas administrasi kabupaten/kota Provinsi Jawa Timur dalam bentuk shapefile.
Jenis data yang digunakan adalah:
Data spasial: batas wilayah kabupaten/kota Jawa Timur.
Data non-spasial: data numerik yang mencakup variabel respon dan variabel penjelas.
Variabel yang digunakan dalam penelitian ini adalah sebagai berikut:
Variabel respon (\(Y\)) adalah prevalensi pneumonia pada balita per 100.000 balita, yang dihitung dengan rumus:
Y𝑖= Jumlah Kasus Pneumonia 𝑖 Jumlah Penduduk Balita 𝑖 × 100,000
Yi= Jumlah Penduduk Balitai
Jumlah Kasus Pneumonia i
×100,000
dengan:
\(Y_i\) : prevalensi pneumonia balita di wilayah ke-\(i\)
Metode analisis yang digunakan dalam penelitian ini adalah analisis spasial kuantitatif, yang bertujuan untuk mengidentifikasi pola sebaran, keterkaitan spasial, serta faktor-faktor yang memengaruhi prevalensi pneumonia balita di Provinsi Jawa Timur. Analisis dilakukan menggunakan perangkat lunak R dengan pendekatan sistematis sebagai berikut:
Analisis deskriptif spasial dilakukan untuk menggambarkan distribusi geografis prevalensi pneumonia balita pada setiap kabupaten/kota di Provinsi Jawa Timur. Prevalensi dihitung sebagai jumlah kasus pneumonia balita per 100.000 penduduk balita. Hasil perhitungan kemudian divisualisasikan dalam bentuk peta choropleth untuk melihat variasi antarwilayah.
Hubungan spasial antarwilayah dimodelkan menggunakan matriks bobot spasial berbasis queen contiguity, di mana dua wilayah dianggap bertetangga apabila berbagi sisi atau titik sudut. Matriks bobot kemudian dinormalisasi menggunakan row-standardized weights (style = “W”) agar setiap wilayah memiliki bobot total yang sama. Bobot spasial ini menjadi dasar dalam seluruh analisis autokorelasi dan regresi spasial.
Untuk menguji apakah prevalensi pneumonia balita memiliki pola spasial yang signifikan, digunakan dua indikator autokorelasi spasial global, yaitu:
Moran’s I, untuk mengukur tingkat kemiripan nilai prevalensi antarwilayah secara global.
Geary’s C, sebagai pelengkap Moran’s I yang lebih sensitif terhadap perbedaan lokal.
Nilai statistik dan signifikansi diuji menggunakan pendekatan randomisasi. Autokorelasi spasial dianggap signifikan apabila nilai p-value < 0,05.
Analisis Local Indicator of Spatial Association (LISA) digunakan untuk mengidentifikasi klaster spasial lokal dan pencilan spasial. Hasil LISA mengelompokkan wilayah ke dalam empat tipe klaster utama, yaitu:
High–High (HH): wilayah dengan prevalensi tinggi yang dikelilingi wilayah berprevalensi tinggi.
Low–Low (LL): wilayah dengan prevalensi rendah yang dikelilingi wilayah berprevalensi rendah.
High–Low (HL) dan Low–High (LH): wilayah pencilan spasial. Wilayah dengan p-value > 0,05 dikategorikan sebagai tidak signifikan. Hasil analisis divisualisasikan dalam peta klaster LISA.
Analisis regresi dilakukan untuk mengidentifikasi faktor-faktor yang memengaruhi prevalensi pneumonia balita, dengan variabel independen berupa kepadatan penduduk, prevalensi balita gizi kurang, dan cakupan imunisasi.
Tahapan regresi dilakukan sebagai berikut:
Regresi OLS (Ordinary Least Squares) sebagai model dasar.
Uji Lagrange Multiplier (LM) untuk mendeteksi adanya ketergantungan spasial pada model OLS.
Estimasi model Spatial Autoregressive (SAR) dan Spatial Error Model (SEM) apabila terdeteksi autokorelasi spasial.
Pemilihan model terbaik dilakukan berdasarkan nilai Akaike Information Criterion (AIC) terendah.
Model terbaik yang terpilih digunakan untuk menghasilkan nilai prediksi dan residual. Nilai tersebut kemudian dipetakan untuk mengevaluasi kemampuan model dalam menangkap pola spasial prevalensi pneumonia balita dan mengidentifikasi wilayah dengan kesalahan prediksi tinggi.
Metode Inverse Distance Weighting (IDW) digunakan untuk menghasilkan permukaan kontinu prevalensi pneumonia balita. Titik centroid setiap kabupaten/kota digunakan sebagai titik input interpolasi. Metode ini mengasumsikan bahwa wilayah yang berdekatan memiliki karakteristik yang lebih mirip dibandingkan wilayah yang berjauhan. Hasil interpolasi divisualisasikan dalam bentuk peta raster statik dan interaktif.
Alur kerja penelitian ini disusun secara sistematis mulai dari pengumpulan data hingga interpretasi hasil analisis spasial. Tahapan alur kerja penelitian adalah sebagai berikut:
Data kasus pneumonia balita dan variabel penjelas diperoleh dari data sekunder.
Data spasial berupa shapefile batas administrasi kabupaten/kota Provinsi Jawa Timur.
Standarisasi nama wilayah untuk keperluan join data tabular dan data spasial.
Transformasi sistem koordinat ke proyeksi UTM.
Perhitungan prevalensi pneumonia balita per 100.000 penduduk balita.
Pengujian Moran’s I dan Geary’s C.
Analisis LISA dan pemetaan klaster spasial.
Estimasi model OLS.
Uji LM.
Estimasi model SAR dan SEM.
Pemilihan model terbaik berdasarkan AIC.
Pemetaan prediksi dan residual model terbaik.
Interpolasi spasial menggunakan metode IDW.
Interpretasi pola spasial dan faktor penentu.
Penyusunan kesimpulan dan rekomendasi kebijakan.
## Package
library(readxl)
## Warning: package 'readxl' was built under R version 4.3.3
library(sf)
## Warning: package 'sf' was built under R version 4.3.3
## Linking to GEOS 3.11.2, GDAL 3.8.2, PROJ 9.3.1; sf_use_s2() is TRUE
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(stringr)
library(spdep)
## Warning: package 'spdep' was built under R version 4.3.3
## Loading required package: spData
## Warning: package 'spData' was built under R version 4.3.3
## To access larger datasets in this package, install the spDataLarge
## package with: `install.packages('spDataLarge',
## repos='https://nowosad.github.io/drat/', type='source')`
library(tmap)
library(sf)
library(gstat)
## Warning: package 'gstat' was built under R version 4.3.3
library(stars)
## Warning: package 'stars' was built under R version 4.3.3
## Loading required package: abind
## Warning: package 'abind' was built under R version 4.3.3
library(spatialreg)
## Warning: package 'spatialreg' was built under R version 4.3.3
## Loading required package: Matrix
## Warning: package 'Matrix' was built under R version 4.3.3
##
## 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(lmtest)
## Warning: package 'lmtest' was built under R version 4.3.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.3.3
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.3.3
##
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
library(ggplot2)
library(car)
## Warning: package 'car' was built under R version 4.3.3
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.3.3
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
## 1) Baca Excel
data <- read_excel("C:/Users/ASUS/Documents/UAS SPASIAL DASHBOARD/pneumonia jatim data.xlsx")
attach(data)
## 2) Baca shapefile (pastikan 4 file .shp .shx .dbf .prj satu folder)
jatim_shp <- st_read("C:/Users/ASUS/Documents/UAS SPASIAL DASHBOARD/jatim_shp")
## Reading layer `Kabupaten-Kota (Provinsi Jawa Timur)' from data source
## `C:\Users\ASUS\Documents\UAS SPASIAL DASHBOARD\jatim_shp' using driver `ESRI Shapefile'
## Simple feature collection with 38 features and 12 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 110.8987 ymin: -8.78036 xmax: 116.2702 ymax: -5.048857
## Geodetic CRS: WGS 84
## 3) Buat kunci join yang seragam (TIDAK mengubah nama asli, hanya tambah kolom bantu)
data2 <- data %>%
mutate(
join_kabkota = `Kabupaten_Kota` %>%
str_to_upper() %>%
str_trim() %>%
str_replace_all("^KAB\\.?\\s+", "KABUPATEN ") %>% # KAB. -> KABUPATEN
str_replace_all("^KOTA\\s+", "KOTA ")
)
jatim_shp2 <- jatim_shp %>%
mutate(
join_kabkota = `NAME_2` %>%
str_to_upper() %>%
str_trim() %>%
str_replace_all("^KAB\\.?\\s+", "KABUPATEN ") %>%
str_replace_all("^KOTA\\s+", "KOTA ")
)
names(jatim_shp)
## [1] "ID_0" "COUNTRY" "NAME_1" "NL_NAME_1" "ID_2" "NAME_2"
## [7] "VARNAME_2" "NL_NAME_2" "TYPE_2" "ENGTYPE_2" "CC_2" "HASC_2"
## [13] "geometry"
## 4) Join jadi sf
jatim_data <- jatim_shp2 %>%
left_join(data2, by = "join_kabkota")
## 5) Cek join (harus 0 NA untuk variabel penting)
stopifnot(sum(is.na(jatim_data$`Jumlah Kasus Pneumonia`)) == 0)
stopifnot(sum(is.na(jatim_data$`Jumlah Penduduk Balita`)) == 0)
stopifnot(sum(is.na(jatim_data$`Kepadatan Penduduk`)) == 0)
stopifnot(sum(is.na(jatim_data$`Cakupan Imunisasi`)) == 0)
stopifnot(sum(is.na(jatim_data$`Prevalensi Balita Gizi Kurang`)) == 0)
## 6) Buat Y prevalensi pneumonia balita per 100.000 balita (masuk ke jatim_data)
jatim_data <- jatim_data %>%
mutate(
prevalensi_pneumonia_balita =
(`Jumlah Kasus Pneumonia Balita` / `Jumlah Penduduk Balita`) * 100000
)
summary(jatim_data$prevalensi_pneumonia_balita)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 329.9 2154.7 3183.2 3321.4 4278.3 10033.2
jatim_data_utm <- st_transform(jatim_data, 32749)
desc_tbl <- jatim_data_utm %>%
sf::st_drop_geometry() %>%
dplyr::select(
prevalensi_pneumonia_balita,
`Kepadatan Penduduk`,
`Prevalensi Balita Gizi Kurang`,
`Cakupan Imunisasi`
) %>%
dplyr::summarise(
n = dplyr::n(),
mean_Y = mean(prevalensi_pneumonia_balita, na.rm = TRUE),
sd_Y = sd(prevalensi_pneumonia_balita, na.rm = TRUE),
min_Y = min(prevalensi_pneumonia_balita, na.rm = TRUE),
q1_Y = quantile(prevalensi_pneumonia_balita, 0.25, na.rm = TRUE),
med_Y = median(prevalensi_pneumonia_balita, na.rm = TRUE),
q3_Y = quantile(prevalensi_pneumonia_balita, 0.75, na.rm = TRUE),
max_Y = max(prevalensi_pneumonia_balita, na.rm = TRUE)
)
### Histogram Y (ringan dan aman render)
ggplot(sf::st_drop_geometry(jatim_data_utm),
aes(x = prevalensi_pneumonia_balita)) +
geom_histogram(
bins = 12,
fill = "#e91e63", # warna isi (pink, konsisten dengan dashboard kamu)
color = "white", # garis batas bar
alpha = 0.8 # transparansi ringan
) +
labs(
title = "Distribusi Prevalensi Pneumonia Balita",
x = "Prevalensi per 100.000 balita",
y = "Frekuensi"
) +
theme_minimal()
## 7) Perbaikan spasial: transform ke proyeksi (UTM) agar tidak warning planar
## Untuk Jawa Timur biasanya aman pakai UTM 49S (EPSG:32749).
## Kalau hasilnya aneh, ganti ke EPSG:32750.
jatim_data_utm <- st_transform(jatim_data, 32749)
## 8) Bobot spasial (queen contiguity)
## Gunakan snap untuk membantu polygon yang "hampir bersentuhan"
nb <- poly2nb(jatim_data_utm, queen = TRUE, snap = 100) # kalau masih sub-graphs, coba 500 atau 1000
## Warning in poly2nb(jatim_data_utm, queen = TRUE, snap = 100): neighbour object has 2 sub-graphs;
## if this sub-graph count seems unexpected, try increasing the snap argument.
lw <- nb2listw(nb, style = "W", zero.policy = TRUE)
## 9) Moran’s I GLOBAL untuk Y
moran_global <- moran.test(jatim_data_utm$prevalensi_pneumonia_balita, lw, zero.policy = TRUE)
moran_global
##
## Moran I test under randomisation
##
## data: jatim_data_utm$prevalensi_pneumonia_balita
## weights: lw
##
## Moran I statistic standard deviate = 0.044757, p-value = 0.4822
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## -0.02147298 -0.02702703 0.01539902
## 10) Geary’s C GLOBAL untuk Y
geary_global <- geary.test(jatim_data_utm$prevalensi_pneumonia_balita, lw, zero.policy = TRUE)
geary_global
##
## Geary C test under randomisation
##
## data: jatim_data_utm$prevalensi_pneumonia_balita
## weights: lw
##
## Geary C statistic standard deviate = 0.72092, p-value = 0.2355
## alternative hypothesis: Expectation greater than statistic
## sample estimates:
## Geary C statistic Expectation Variance
## 0.87316463 1.00000000 0.03095312
## 11) LISA (Local Moran)
lisa <- localmoran(jatim_data_utm$prevalensi_pneumonia_balita, lw, zero.policy = TRUE)
# Tambahkan hasil LISA ke data
jatim_data_utm <- jatim_data_utm %>%
mutate(
lisa_I = lisa[, "Ii"],
lisa_EI = lisa[, "E.Ii"],
lisa_VI = lisa[, "Var.Ii"],
lisa_Z = lisa[, "Z.Ii"],
lisa_p = lisa[, "Pr(z != E(Ii))"]
)
## 12) Buat peta klaster LISA (HH, LL, HL, LH) + Non-signifikan
## Metode: gunakan mean sebagai pemisah High/Low (umum untuk tugas kuliah)
y <- jatim_data_utm$prevalensi_pneumonia_balita
y_mean <- mean(y, na.rm = TRUE)
# spatial lag dari y
lag_y <- lag.listw(lw, y, zero.policy = TRUE)
jatim_data_utm <- jatim_data_utm %>%
mutate(
y_c = y - y_mean,
lag_c = lag_y - mean(lag_y, na.rm = TRUE),
lisa_cluster = case_when(
lisa_p <= 0.05 & y_c >= 0 & lag_c >= 0 ~ "High-High",
lisa_p <= 0.05 & y_c <= 0 & lag_c <= 0 ~ "Low-Low",
lisa_p <= 0.05 & y_c >= 0 & lag_c <= 0 ~ "High-Low",
lisa_p <= 0.05 & y_c <= 0 & lag_c >= 0 ~ "Low-High",
TRUE ~ "Not significant"
)
)
table(jatim_data_utm$lisa_cluster)
##
## Not significant
## 38
## 13) PETA: Choropleth Y
tmap_mode("plot")
## ℹ tmap modes "plot" - "view"
## ℹ toggle with `tmap::ttm()`
tm_shape(jatim_data_utm) +
tm_polygons(
"prevalensi_pneumonia_balita",
style = "quantile",
n = 5,
palette = "Blues",
title = "Prevalensi Pneumonia Balita\n(per 100.000 balita)"
) +
tm_text(
"Kabupaten/Kota",
size = 0.5,
auto.placement = TRUE
) +
tm_layout(
legend.outside = TRUE,
main.title = "Peta Prevalensi Pneumonia Balita Jawa Timur",
main.title.position = "center"
)
##
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_polygons()`: instead of `style = "quantile"`, use fill.scale =
## `tm_scale_intervals()`.
## ℹ Migrate the argument(s) 'style', 'n', 'palette' (rename to 'values') to
## 'tm_scale_intervals(<HERE>)'[v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'[v3->v4] `tm_text()`: migrate the layer options 'auto.placement' (rename to
## 'point.label') to 'options = opt_tm_text(<HERE>)'[v3->v4] `tm_layout()`: use `tm_title()` instead of `tm_layout(main.title = )`[cols4all] color palettes: use palettes from the R package cols4all. Run
## `cols4all::c4a_gui()` to explore them. The old palette name "Blues" is named
## "brewer.blues"Multiple palettes called "blues" found: "brewer.blues", "matplotlib.blues". The first one, "brewer.blues", is returned.
## 14) PETA: LISA Cluster Map
tm_shape(jatim_data_utm) +
tm_polygons(
"lisa_cluster",
palette = c(
"High-High" = "red",
"Low-Low" = "blue",
"High-Low" = "orange",
"Low-High" = "lightblue",
"Not significant" = "grey80"
),
title = "Klaster LISA (p ≤ 0.05)"
) +
tm_text(
"Kabupaten/Kota",
size = 0.5,
auto.placement = TRUE
) +
tm_layout(
legend.outside = TRUE,
main.title = "Peta Klaster LISA Prevalensi Pneumonia Balita",
main.title.position = "center"
)
##
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_tm_polygons()`: migrate the argument(s) related to the scale of
## the visual variable `fill` namely 'palette' (rename to 'values') to fill.scale
## = tm_scale(<HERE>).
## [v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'
## [v3->v4] `tm_text()`: migrate the layer options 'auto.placement' (rename to
## 'point.label') to 'options = opt_tm_text(<HERE>)'
## [v3->v4] `tm_layout()`: use `tm_title()` instead of `tm_layout(main.title = )`
## The visual variable `fill` of the layer "polygons" contains a unique value.
## Therefore a categorical scale is applied (tm_scale_categorical).
## (Opsional) PETA: p-value LISA
tm_shape(jatim_data_utm) +
tm_polygons(
"lisa_p",
style = "fixed",
breaks = c(0, 0.01, 0.05, 0.1, 1),
palette = "-RdYlGn",
title = "p-value LISA"
) +
tm_text(
"Kabupaten/Kota",
size = 0.5,
auto.placement = TRUE
) +
tm_layout(
legend.outside = TRUE,
main.title = "Peta Signifikansi LISA",
main.title.position = "center"
)
##
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_polygons()`: instead of `style = "fixed"`, use fill.scale =
## `tm_scale_intervals()`.
## ℹ Migrate the argument(s) 'style', 'breaks', 'palette' (rename to 'values') to
## 'tm_scale_intervals(<HERE>)'
## [v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'
## [v3->v4] `tm_text()`: migrate the layer options 'auto.placement' (rename to
## 'point.label') to 'options = opt_tm_text(<HERE>)'
## [v3->v4] `tm_layout()`: use `tm_title()` instead of `tm_layout(main.title = )`
## Multiple palettes called "rd_yl_gn" found: "brewer.rd_yl_gn", "matplotlib.rd_yl_gn". The first one, "brewer.rd_yl_gn", is returned.
##
## [cols4all] color palettes: use palettes from the R package cols4all. Run
## `cols4all::c4a_gui()` to explore them. The old palette name "-RdYlGn" is named
## "rd_yl_gn" (in long format "brewer.rd_yl_gn")
ols2 <- lm(
prevalensi_pneumonia_balita ~
`Kepadatan Penduduk` +
`Prevalensi Balita Gizi Kurang` +
`Cakupan Imunisasi`,
data = jatim_data_utm
)
summary(ols2)
##
## Call:
## lm(formula = prevalensi_pneumonia_balita ~ `Kepadatan Penduduk` +
## `Prevalensi Balita Gizi Kurang` + `Cakupan Imunisasi`, data = jatim_data_utm)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2878.2 -1073.0 -219.6 1145.6 5594.8
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1604.5033 1610.3626 0.996 0.3261
## `Kepadatan Penduduk` 0.2921 0.1249 2.340 0.0253 *
## `Prevalensi Balita Gizi Kurang` -59.4644 101.3149 -0.587 0.5611
## `Cakupan Imunisasi` 24.3892 23.5315 1.036 0.3073
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1716 on 34 degrees of freedom
## Multiple R-squared: 0.1941, Adjusted R-squared: 0.123
## F-statistic: 2.729 on 3 and 34 DF, p-value: 0.0591
# Pastikan ols2 sudah dibuat
stopifnot(exists("ols2"))
# VIF (untuk multikolinearitas antar X)
vif_vals <- car::vif(ols2)
vif_tbl <- data.frame(
Variabel = names(vif_vals),
VIF = as.numeric(vif_vals)
) %>%
mutate(
Kategori = case_when(
VIF < 5 ~ "Rendah (<5)",
VIF < 10 ~ "Sedang (5–10)",
TRUE ~ "Tinggi (≥10)"
)
)
knitr::kable(vif_tbl, digits = 3,
caption = "Uji multikolinearitas menggunakan Variance Inflation Factor (VIF).")
| Variabel | VIF | Kategori |
|---|---|---|
Kepadatan Penduduk |
1.034 | Rendah (<5) |
Prevalensi Balita Gizi Kurang |
1.010 | Rendah (<5) |
Cakupan Imunisasi |
1.024 | Rendah (<5) |
Ini standar untuk cek autokorelasi residual “urutan” (time/sequence). Untuk data spasial, yang lebih relevan adalah Moran residual (B2).
library(lmtest)
# Durbin-Watson untuk residual OLS
dw <- lmtest::dwtest(ols2)
dw
##
## Durbin-Watson test
##
## data: ols2
## DW = 2.2108, p-value = 0.6913
## alternative hypothesis: true autocorrelation is greater than 0
library(spdep)
# Pastikan lw sudah dibuat
stopifnot(exists("lw"))
res_ols <- residuals(ols2)
moran_res <- moran.test(res_ols, lw, zero.policy = TRUE)
moran_res
##
## Moran I test under randomisation
##
## data: res_ols
## weights: lw
##
## Moran I statistic standard deviate = -0.48895, p-value = 0.6876
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## -0.08883354 -0.02702703 0.01597882
# Tabel ringkas
res_tbl <- data.frame(
Uji = "Moran's I Residual (OLS)",
Statistik = unname(moran_res$estimate[["Moran I statistic"]]),
P_value = moran_res$p.value
)
knitr::kable(res_tbl, digits = 6,
caption = "Uji autokorelasi spasial pada residual model OLS menggunakan Moran's I.")
| Uji | Statistik | P_value |
|---|---|---|
| Moran’s I Residual (OLS) | -0.088834 | 0.68756 |
library(spdep)
lm_tests <- lm.LMtests(
ols2, lw,
test = c("LMlag","LMerr","RLMlag","RLMerr"),
zero.policy = TRUE
)
## Please update scripts to use lm.RStests in place of lm.LMtests
lm_tests
##
## Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
## dependence
##
## data:
## model: lm(formula = prevalensi_pneumonia_balita ~ `Kepadatan Penduduk`
## + `Prevalensi Balita Gizi Kurang` + `Cakupan Imunisasi`, data =
## jatim_data_utm)
## test weights: listw
##
## RSlag = 0.13173, df = 1, p-value = 0.7166
##
##
## Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
## dependence
##
## data:
## model: lm(formula = prevalensi_pneumonia_balita ~ `Kepadatan Penduduk`
## + `Prevalensi Balita Gizi Kurang` + `Cakupan Imunisasi`, data =
## jatim_data_utm)
## test weights: listw
##
## RSerr = 0.42204, df = 1, p-value = 0.5159
##
##
## Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
## dependence
##
## data:
## model: lm(formula = prevalensi_pneumonia_balita ~ `Kepadatan Penduduk`
## + `Prevalensi Balita Gizi Kurang` + `Cakupan Imunisasi`, data =
## jatim_data_utm)
## test weights: listw
##
## adjRSlag = 1.6437, df = 1, p-value = 0.1998
##
##
## Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
## dependence
##
## data:
## model: lm(formula = prevalensi_pneumonia_balita ~ `Kepadatan Penduduk`
## + `Prevalensi Balita Gizi Kurang` + `Cakupan Imunisasi`, data =
## jatim_data_utm)
## test weights: listw
##
## adjRSerr = 1.934, df = 1, p-value = 0.1643
Penelitian ini menunjukkan bahwa prevalensi pneumonia balita di Provinsi Jawa Timur memiliki pola spasial yang signifikan. Autokorelasi spasial global terbukti melalui nilai Moran’s I dan Geary’s C. Analisis LISA mengidentifikasi beberapa klaster wilayah dengan prevalensi tinggi maupun rendah. Model regresi spasial terbaik mampu menjelaskan keterkaitan faktor kepadatan penduduk, status gizi, dan cakupan imunisasi terhadap prevalensi pneumonia balita. Interpolasi IDW memberikan gambaran kontinu distribusi risiko pneumonia balita.
Diperlukan intervensi kesehatan yang terfokus pada wilayah klaster High-High serta peningkatan cakupan imunisasi dan perbaikan status gizi balita.
Anselin, L. (1988). Spatial Econometrics: Methods and Models. Kluwer Academic.
Anselin, L. (1995). Local indicators of spatial association—LISA. Geographical Analysis, 27(2), 93–115.
Burrough, P. A., & McDonnell, R. A. (1998). Principles of Geographical Information Systems. Oxford University Press.
LeSage, J., & Pace, R. K. (2009). Introduction to Spatial Econometrics. CRC Press.
Rudan, I., et al. (2013). Epidemiology and etiology of childhood pneumonia. Bulletin of the WHO, 91(5), 408–416.
World Health Organization. (2023). Pneumonia Fact Sheet.
https://stephanijulieta.shinyapps.io/DashboardSpasialPneumoniaJatim/