Dokumen ini menerapkan seluruh teknik eksplorasi data lingkungan yang dibahas pada Pertemuan 2 — statistik deskriptif, visualisasi, deteksi outlier, dan autokorelasi (temporal & spasial) — pada studi kasus kualitas udara di Provinsi Banten.
Dataset yang digunakan adalah data simulasi konsentrasi PM2.5 (µg/m³) rata-rata bulanan dan curah hujan (mm) dari 6 stasiun pemantauan di Provinsi Banten (Cilegon, Kota Serang, Kota Tangerang, Tangerang Selatan, Pandeglang, dan Lebak) sepanjang Januari–Desember 2025 (72 baris = 6 stasiun × 12 bulan), sebagaimana dijelaskan pada slide materi Pertemuan 2. Download data disini (link data)
Keempat pertanyaan ini dijawab bertahap melalui delapan langkah analisis di bawah ini.
library(readxl) # membaca file Excel
library(dplyr) # manipulasi data
library(ggplot2) # visualisasi
library(sf) # objek spasial
library(tmap) # peta tematik
library(spdep) # autokorelasi spasial (Moran's I)
# Membaca data kualitas udara Provinsi Banten
# (sesuaikan path bila file tidak berada di working directory yang sama)
setwd("C:/Users/mifta/OneDrive - untirta.ac.id/UNTIRTA/STATISTIKA/Materi MK Semester Ganjil/Statistika Lingkungan")
data_pm25 <- read_excel("2-Data Simulasi - Kualitas Udara Banten 2025.xlsx")
# Melihat struktur dan ukuran data
str(data_pm25)
## tibble [72 × 10] (S3: tbl_df/tbl/data.frame)
## $ stasiun : chr [1:72] "Cilegon" "Cilegon" "Cilegon" "Cilegon" ...
## $ kabupaten_kota : chr [1:72] "Kota Cilegon" "Kota Cilegon" "Kota Cilegon" "Kota Cilegon" ...
## $ kategori_kawasan: chr [1:72] "Kawasan Industri" "Kawasan Industri" "Kawasan Industri" "Kawasan Industri" ...
## $ bulan : num [1:72] 1 2 3 4 5 6 7 8 9 10 ...
## $ nama_bulan : chr [1:72] "Januari" "Februari" "Maret" "April" ...
## $ tahun : num [1:72] 2025 2025 2025 2025 2025 ...
## $ pm25 : num [1:72] 19 20.6 18.6 22.9 28.3 29.3 33.3 33.5 96.4 28.5 ...
## $ curah_hujan : num [1:72] 288 256 243 165 112 ...
## $ lat : num [1:72] -5.99 -5.99 -5.99 -5.99 -5.99 ...
## $ long : num [1:72] 106 106 106 106 106 ...
head(data_pm25, 6)
dim(data_pm25)
## [1] 72 10
# Memeriksa data hilang (missing value)
sum(is.na(data_pm25))
## [1] 0
Dataset berisi 72 baris dan 10 kolom, sesuai
rancangan 6 stasiun × 12 bulan. Kolom pm25 dan
curah_hujan sudah bertipe numerik, stasiun
bertipe karakter, dan tidak ditemukan nilai hilang
(sum(is.na(...)) = 0) — artinya data siap dianalisis tanpa
perlu tahap imputasi. Kolom lat/long akan
dipakai pada Langkah 5 dan 8, dan kolom bulan (numerik
1–12) akan dipakai pada Langkah 4 dan 7.
# Statistik deskriptif keseluruhan
summary(data_pm25$pm25)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 9.60 18.52 24.95 28.14 33.80 96.40
sd(data_pm25$pm25)
## [1] 14.45932
IQR(data_pm25$pm25)
## [1] 15.275
# Statistik deskriptif per stasiun
rekap_stasiun <- data_pm25 %>%
group_by(stasiun) %>%
summarise(
n = n(),
rerata = mean(pm25),
median = median(pm25),
sd = sd(pm25),
min = min(pm25),
maks = max(pm25)
) %>%
arrange(desc(rerata))
rekap_stasiun
Secara keseluruhan, rata-rata PM2.5 adalah 28,1 µg/m³ dengan median 25,0 µg/m³ dan simpangan baku 14,5 µg/m³; rentang antarkuartil (IQR) sebesar 15,3. Selisih antara mean dan median ini adalah petunjuk awal bahwa distribusi condong ke kanan (right-skewed) — beberapa nilai yang sangat tinggi menarik rata-rata ke atas melebihi median.
Rekap per stasiun memperlihatkan gradien yang jelas:
Pola ini sejalan dengan intuisi: wilayah perkotaan padat dan kawasan industri cenderung memiliki beban pencemaran udara yang lebih tinggi dibanding wilayah pedesaan.
# Histogram distribusi PM2.5 keseluruhan
ggplot(data_pm25, aes(x = pm25)) +
geom_histogram(binwidth = 5, fill = "#147D64", color = "white") +
labs(title = "Distribusi Konsentrasi PM2.5 - Provinsi Banten 2025",
x = "PM2.5 (µg/m³)", y = "Frekuensi") +
theme_minimal()
# Boxplot PM2.5 per stasiun
ggplot(data_pm25, aes(x = reorder(stasiun, pm25, median), y = pm25)) +
geom_boxplot(fill = "#FFC200") +
labs(title = "Sebaran PM2.5 per Stasiun",
x = "Stasiun", y = "PM2.5 (µg/m³)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 25, hjust = 1))
Histogram memperlihatkan sebagian besar pengamatan terkonsentrasi pada rentang 15–40 µg/m³, dengan ekor memanjang ke kanan menuju nilai 80–100 µg/m³ — mengonfirmasi kecondongan (skewness) positif yang sudah terlihat dari selisih mean-median pada Langkah 2.
Boxplot per stasiun (diurutkan dari median terendah ke tertinggi) menunjukkan:
ggplot(data_pm25, aes(x = bulan, y = pm25, color = stasiun)) +
geom_line(linewidth = 1) +
geom_point(size = 1.5) +
scale_x_continuous(breaks = 1:12) +
labs(title = "Tren Bulanan PM2.5 Tahun 2025",
x = "Bulan", y = "PM2.5 (µg/m³)", color = "Stasiun") +
theme_minimal()
# Pembanding: rata-rata PM2.5 vs curah hujan per bulan (semua stasiun)
rerata_bulanan <- data_pm25 %>%
group_by(bulan) %>%
summarise(rerata_pm25 = mean(pm25), rerata_hujan = mean(curah_hujan))
# Membuat scatter plot dengan garis tren
ggplot(rerata_bulanan, aes(x = rerata_pm25, y = rerata_hujan)) +
geom_point(color = "blue", size = 3) +
geom_smooth(method = "lm", color = "red", se = TRUE) + # se=TRUE menampilkan area confidence interval
labs(title = "Scatter Plot Korelasi rata-rata PM2.5 vs curah hujan per bulan",
x = "rata-rata PM2.5 (µg/m³)",
y = "curah hujan (mm)") +
theme_minimal()
cor(rerata_bulanan$rerata_pm25, rerata_bulanan$rerata_hujan)
## [1] -0.8430532
Grafik deret waktu memperlihatkan pola musiman yang jelas dan konsisten di seluruh stasiun: PM2.5 relatif rendah pada Januari–April (rerata ± 22–24 µg/m³), meningkat tajam memasuki musim kemarau (Mei–September), memuncak pada bulan September (rerata lintas-stasiun 43,4 µg/m³), lalu turun kembali begitu musim hujan tiba (Oktober–Desember).
Korelasi antara rata-rata bulanan PM2.5 dan curah hujan bernilai negatif kuat (sekitar -0,84) — mengonfirmasi secara kuantitatif bahwa bulan-bulan dengan curah hujan tinggi cenderung memiliki kualitas udara yang lebih baik (curah hujan “membersihkan” partikulat di udara), sementara musim kemarau yang kering berasosiasi dengan konsentrasi PM2.5 yang lebih tinggi — plot juga menunjukkan lonjakan tajam di Cilegon (September) dan Kota Tangerang (Agustus) yang menonjol dibanding pola musiman stasiun lain.
# Rata-rata PM2.5 per stasiun beserta koordinatnya
rerata_stasiun <- data_pm25 %>%
group_by(kabupaten_kota, lat, long) %>%
summarise(rerata_pm25 = mean(pm25), .groups = "drop")
rerata_stasiun
#Import SHP Banten
shp<-st_read("2-SHPBANTEN/Banten_ADMIN_BPS.shp")
## Reading layer `Banten_ADMIN_BPS' from data source
## `C:\Users\mifta\OneDrive - untirta.ac.id\UNTIRTA\STATISTIKA\Materi MK Semester Ganjil\Statistika Lingkungan\2-SHPBANTEN\Banten_ADMIN_BPS.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 8 features and 6 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 105.0998 ymin: -7.016779 xmax: 106.7799 ymax: -5.807418
## Geodetic CRS: WGS 84
#Gabungkan Data shapefile kabupaten/kota
titik_stasiun <- shp %>%
left_join(rerata_stasiun, by = c("Kabupaten" = "kabupaten_kota"))
#Pemetaan Variabel rerata_pm25
library(mapview)
mapview(titik_stasiun, zcol = "rerata_pm25")
# Ubah menjadi objek spasial
titik_stasiun <- st_as_sf(rerata_stasiun, coords = c("long", "lat"), crs = 4326)
# Peta tematik: ukuran & warna titik merepresentasikan rerata PM2.5
tm_shape(titik_stasiun) +
tm_symbols(size = "rerata_pm25", col = "rerata_pm25",
palette = "YlOrRd", title.col = "Rerata PM2.5",
title.size = "Rerata PM2.5") +
tm_layout(title = "Sebaran Kualitas Udara di Provinsi Banten (Rerata 2025)")
Peta tematik memperlihatkan pola spasial yang cukup rapi: kluster timur (Kota Tangerang dan Tangerang Selatan — wilayah urban padat yang berbatasan dengan DKI Jakarta) tampil dengan simbol besar dan warna gelap (PM2.5 tinggi), sementara kluster barat/selatan (Pandeglang dan Lebak — wilayah pedesaan) tampil dengan simbol kecil dan warna terang (PM2.5 rendah). Cilegon dan Kota Serang berada pada posisi menengah. Pola “yang berdekatan cenderung mirip” ini merupakan petunjuk visual awal adanya autokorelasi spasial positif, yang akan diuji secara formal pada Langkah 8.
# Metode IQR
Q1 <- quantile(data_pm25$pm25, 0.25)
Q3 <- quantile(data_pm25$pm25, 0.75)
IQR_val <- Q3 - Q1
batas_bawah <- Q1 - 1.5 * IQR_val
batas_atas <- Q3 + 1.5 * IQR_val
cat("Batas bawah:", round(batas_bawah, 1), " | Batas atas:", round(batas_atas, 1), "\n")
## Batas bawah: -4.4 | Batas atas: 56.7
outlier_iqr <- data_pm25 %>% filter(pm25 < batas_bawah | pm25 > batas_atas)
outlier_iqr
# Metode Z-score
data_pm25$z_pm25 <- as.numeric(scale(data_pm25$pm25))
outlier_z <- data_pm25 %>% filter(abs(z_pm25) > 3)
outlier_z %>% select(stasiun, bulan, nama_bulan, pm25, z_pm25)
Dengan aturan IQR, batas atas kewajaran adalah 56,7 µg/m³ (batas bawah bernilai negatif sehingga tidak relevan untuk data konsentrasi). Dua pengamatan melampaui batas ini dan kedua metode (IQR dan Z-score) sepakat menandai titik yang sama:
| Stasiun | Bulan | PM2.5 | Z-score |
|---|---|---|---|
| Cilegon | September | 96,4 | +4,72 |
| Kota Tangerang | Agustus | 79,8 | +3,57 |
Kesepakatan dua metode ini memperkuat keyakinan bahwa kedua nilai memang menyimpang signifikan dari pola umum data, bukan sekadar batas ambang yang kebetulan terlampaui. Karena keduanya terjadi tepat pada puncak musim kemarau — periode yang secara konsisten sudah menunjukkan tren meningkat pada Langkah 4 — nilai ini lebih masuk akal diinterpretasikan sebagai episode polusi ekstrem yang nyata (misalnya kabut asap akibat kebakaran lahan/hutan, yang umum terjadi di Indonesia saat kemarau panjang) dibandingkan kesalahan pengukuran. Sesuai prinsip yang dibahas di kelas, kedua titik ini tidak boleh langsung dibuang — sebaliknya, keduanya adalah temuan penting yang layak ditelusuri lebih lanjut (mis. dikonfirmasi dengan data titik panas/hotspot kebakaran pada bulan yang sama).
# Ekstrak deret waktu PM2.5 stasiun Cilegon
ts_cilegon <- data_pm25 %>% filter(stasiun == "Cilegon") %>% pull(pm25)
ts_cilegon <- ts(ts_cilegon, start = c(2025, 1), frequency = 12)
acf(ts_cilegon, main = "ACF PM2.5 - Stasiun Cilegon")
# Pembanding: stasiun tanpa nilai ekstrem (Pandeglang)
ts_pandeglang <- data_pm25 %>% filter(stasiun == "Pandeglang") %>% pull(pm25)
ts_pandeglang <- ts(ts_pandeglang, start = c(2025, 1), frequency = 12)
acf(ts_pandeglang, main = "ACF PM2.5 - Stasiun Pandeglang (pembanding)")
ACF pada Cilegon menunjukkan autokorelasi lag-1 yang relatif lemah (± 0,10) dan tidak melewati garis signifikansi — sekilas seperti “tidak ada pola”. Namun ini perlu dibaca hati-hati: pada Langkah 6 kita sudah tahu Cilegon memiliki outlier ekstrem di bulan September. Satu nilai ekstrem pada deret waktu yang pendek (hanya 12 titik) dapat mendistorsi/menutupi pola autokorelasi musiman yang sebenarnya ada.
Sebagai pembanding, ACF Pandeglang — stasiun dengan pola musiman yang mulus tanpa nilai ekstrem — menunjukkan autokorelasi lag-1 yang kuat dan positif (± 0,73), jauh melewati garis signifikansi. Perbandingan ini adalah contoh nyata mengapa outlier perlu ditangani/diperhatikan sebelum menafsirkan autokorelasi: kesimpulan “tidak ada autokorelasi” pada Cilegon bisa jadi keliru apabila semata didasarkan pada ACF mentah tanpa mempertimbangkan pencilan yang sudah teridentifikasi sebelumnya.
(Sebagai latihan tambahan, coba jalankan acf() untuk
keempat stasiun lainnya dan bandingkan nilai lag-1-nya.)
# Matriks pembobot spasial: k = 3 tetangga terdekat
koordinat <- cbind(rerata_stasiun$long, rerata_stasiun$lat)
knn3 <- knearneigh(koordinat, k = 3)
wij <- nb2listw(knn2nb(knn3), style = "W")
# Melihat daftar tetangga tiap stasiun
knn2nb(knn3)
## Neighbour list object:
## Number of regions: 6
## Number of nonzero links: 18
## Percentage nonzero weights: 50
## Average number of links: 3
## Non-symmetric neighbours list
# Uji Moran's I
moran.test(rerata_stasiun$rerata_pm25, listw = wij)
##
## Moran I test under randomisation
##
## data: rerata_stasiun$rerata_pm25
## weights: wij
##
## Moran I statistic standard deviate = 2.8764, p-value = 0.002011
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 0.28125027 -0.20000000 0.02799318
Dengan skema k = 3 tetangga terdekat, hasil simulasi ini menghasilkan Indeks Moran’s I sekitar +0,28 dengan nilai-p ≈ 0,002 (< 0,05) — menunjukkan autokorelasi spasial positif dan signifikan secara statistik: stasiun yang berdekatan secara geografis cenderung memiliki tingkat PM2.5 yang mirip, bukan acak.
Daftar tetangga (knn2nb) memperjelas struktur
klusternya: Pandeglang dan Lebak konsisten saling bertetangga bersama
Cilegon dan Kota Serang (kluster barat/selatan dengan PM2.5
rendah-menengah), sementara Kota Tangerang dan Tangerang Selatan saling
bertetangga sebagai kluster timur ber-PM2.5 tinggi — namun keduanya juga
menjadikan Cilegon dan Kota Serang sebagai tetangga terdekat ketiga.
Cilegon dan Kota Serang inilah yang berperan sebagai penghubung
antarkluster, yang sedikit melemahkan (namun tidak
menghilangkan) kekuatan pengelompokan spasial secara keseluruhan. Pola
ini konsisten dengan Hukum Pertama Geografi Tobler yang
dibahas di kelas: kedekatan lokasi berasosiasi dengan kedekatan
nilai.
Menjawab keempat pertanyaan analisis di awal:
Secara umum, data PM2.5 Provinsi Banten pada studi kasus ini melanggar asumsi independensi yang disyaratkan banyak metode statistik klasik — baik secara temporal maupun spasial — sehingga analisis lanjutan (Pertemuan 3 dan seterusnya: uji kehomogenan dan stasioneritas) perlu memperhitungkan struktur ketergantungan ini agar kesimpulan yang dihasilkan tetap valid.
readxl, dplyr,
ggplot2, sf, tmap,
spdep (CRAN).Catatan: seluruh data pada dokumen ini bersifat simulasi/ilustratif untuk keperluan pembelajaran (lihat sheet “Panduan” pada file data). Nilai-nilai pada bagian Interpretasi dihitung dari data simulasi tersebut dengan seed tetap, sehingga akan direproduksi persis apabila dokumen ini di-knit ulang dengan file data yang sama.