Load Library

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.2     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(sf)
## Linking to GEOS 3.13.1, GDAL 3.11.0, PROJ 9.6.0; sf_use_s2() is TRUE
library(janitor)
## Warning: package 'janitor' was built under R version 4.5.2
## 
## Attaching package: 'janitor'
## 
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(ggplot2)
library(ggridges)
library(treemapify)
## Warning: package 'treemapify' was built under R version 4.5.2
library(viridis)
## Loading required package: viridisLite
library(patchwork)
library(ggthemes)
## Warning: package 'ggthemes' was built under R version 4.5.2

1. Pendahuluan

Analisis statistika deskriptif pada konteks statistika lingkungan bertujuan untuk memahami karakteristik spasial dan non-spasial dari wilayah tertentu sebagai dasar pengambilan keputusan lingkungan.

Unit observasi yang digunakan adalah kecamatan di Kabupaten Banjarnegara, dengan fokus pada variabel-variabel lingkungan seperti:

2. Persiapan Data

Data spasial menggunakan file “33.04_kecamatan_di_Banjarnegara.geojson”, sedangkan variabel lingkungan berasal dari data simulasi.

# Baca shapefile
peta <- st_read("D:/Kuliah/Semester 5/4) Statistika Lingkungan/33.04_Banjarnegara/33.04_kecamatan_di_Banjarnegara.geojson")
## Reading layer `33.04_kecamatan_di_Banjarnegara' from data source 
##   `D:\Kuliah\Semester 5\4) Statistika Lingkungan\33.04_Banjarnegara\33.04_kecamatan_di_Banjarnegara.geojson' 
##   using driver `GeoJSON'
## Simple feature collection with 20 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XYZ
## Bounding box:  xmin: 109.3615 ymin: -7.540894 xmax: 109.9177 ymax: -7.170981
## z_range:       zmin: 0 zmax: 0
## Geodetic CRS:  WGS 84
peta
## Simple feature collection with 20 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XYZ
## Bounding box:  xmin: 109.3615 ymin: -7.540894 xmax: 109.9177 ymax: -7.170981
## z_range:       zmin: 0 zmax: 0
## Geodetic CRS:  WGS 84
## First 10 features:
##    kd_propinsi kd_dati2 kd_kecamatan      nm_kecamatan
## 1           33       04          014          Pagentan
## 2           33       04          015         Pejawaran
## 3           33       04          016             Batur
## 4           33       04          017          Wanayasa
## 5           33       04          018        Kalibening
## 6           33       04          019        Pandanarum
## 7           33       04          020        Pagedongan
## 8           33       04          001           Susukan
## 9           33       04          002 Purworeja Klampok
## 10          33       04          003         Mandiraja
##                          geometry
## 1  MULTIPOLYGON Z (((109.7863 ...
## 2  MULTIPOLYGON Z (((109.7775 ...
## 3  MULTIPOLYGON Z (((109.9003 ...
## 4  MULTIPOLYGON Z (((109.7507 ...
## 5  MULTIPOLYGON Z (((109.6687 ...
## 6  MULTIPOLYGON Z (((109.6198 ...
## 7  MULTIPOLYGON Z (((109.7185 ...
## 8  MULTIPOLYGON Z (((109.3977 ...
## 9  MULTIPOLYGON Z (((109.471 -...
## 10 MULTIPOLYGON Z (((109.4623 ...
# Simulasi data variabel lingkungan untuk tiap kecamatan
set.seed(3346)
n <- nrow(peta)  # jumlah kecamatan

data_simulasi <- data.frame(
  kecamatan = peta$nm_kecamatan,

  # Kepadatan penduduk (jiwa/km2)
  kepadatan_penduduk = round(runif(n, min = 1000, max = 7500)),

  # Luas wilayah (km2)
  luas_wilayah = round(runif(n, min = 0.5, max = 12), 2),

  # Akses sanitasi (%)
  akses_sanitasi = round(runif(n, min = 40, max = 100), 1),

  # Akses air bersih (%)
  akses_air_bersih = round(runif(n, min = 50, max = 100), 1),

  # Ruang terbuka hijau (%)
  ruang_terbuka_hijau = round(runif(n, min = 10, max = 60), 1)
)

# Simulasi timbulan sampah (Ton/hari)
# Rumus realistis: populasi × 0.5 kg per orang per hari
data_simulasi <- data_simulasi %>%
  mutate(
    populasi = kepadatan_penduduk * luas_wilayah,
    timbulan_sampah = round((populasi * 0.5) / 1e6, 3)  # ton/hari
  )

data_simulasi
##            kecamatan kepadatan_penduduk luas_wilayah akses_sanitasi
## 1           Pagentan               2369         7.21           75.2
## 2          Pejawaran               2995         3.77           86.0
## 3              Batur               1490         9.77           52.8
## 4           Wanayasa               4290        10.40           80.7
## 5         Kalibening               4016         0.97           51.2
## 6         Pandanarum               6022         3.83           91.1
## 7         Pagedongan               2745         0.53           95.3
## 8            Susukan               5559         8.18           55.2
## 9  Purworeja Klampok               1236         2.55           63.8
## 10         Mandiraja               1132         1.07           73.7
## 11       Purwanegara               3453         0.68           41.6
## 12            Bawang               4808         7.38           57.6
## 13      Banjarnegara               5317         9.12           53.8
## 14           Sigaluh               6918         1.64           53.1
## 15          Madukara               2994        11.22           86.5
## 16       Banjarmangu               1352         5.08           46.0
## 17          Wanadadi               1418        11.87           77.1
## 18             Rakit               3806         7.70           41.3
## 19         Punggelan               6129         9.82           40.1
## 20       Karangkobar               3042         4.41           78.7
##    akses_air_bersih ruang_terbuka_hijau populasi timbulan_sampah
## 1              92.9                56.9 17080.49           0.009
## 2              79.3                41.3 11291.15           0.006
## 3              91.1                22.6 14557.30           0.007
## 4              73.4                34.5 44616.00           0.022
## 5              76.9                44.4  3895.52           0.002
## 6              54.6                53.7 23064.26           0.012
## 7              72.5                49.5  1454.85           0.001
## 8              86.0                39.2 45472.62           0.023
## 9              72.0                26.5  3151.80           0.002
## 10             74.9                15.5  1211.24           0.001
## 11             70.4                25.5  2348.04           0.001
## 12             62.6                15.4 35483.04           0.018
## 13             84.2                44.3 48491.04           0.024
## 14             95.3                14.9 11345.52           0.006
## 15             91.5                43.6 33592.68           0.017
## 16             99.7                33.4  6868.16           0.003
## 17             85.6                22.0 16831.66           0.008
## 18             73.6                47.5 29306.20           0.015
## 19             90.6                48.0 60186.78           0.030
## 20             57.9                29.5 13415.22           0.007
# Gabungkan data simulasi dengan peta
data_siap <- left_join(peta, data_simulasi, by=c("nm_kecamatan"="kecamatan"))
data_siap
## Simple feature collection with 20 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XYZ
## Bounding box:  xmin: 109.3615 ymin: -7.540894 xmax: 109.9177 ymax: -7.170981
## z_range:       zmin: 0 zmax: 0
## Geodetic CRS:  WGS 84
## First 10 features:
##    kd_propinsi kd_dati2 kd_kecamatan      nm_kecamatan kepadatan_penduduk
## 1           33       04          014          Pagentan               2369
## 2           33       04          015         Pejawaran               2995
## 3           33       04          016             Batur               1490
## 4           33       04          017          Wanayasa               4290
## 5           33       04          018        Kalibening               4016
## 6           33       04          019        Pandanarum               6022
## 7           33       04          020        Pagedongan               2745
## 8           33       04          001           Susukan               5559
## 9           33       04          002 Purworeja Klampok               1236
## 10          33       04          003         Mandiraja               1132
##    luas_wilayah akses_sanitasi akses_air_bersih ruang_terbuka_hijau populasi
## 1          7.21           75.2             92.9                56.9 17080.49
## 2          3.77           86.0             79.3                41.3 11291.15
## 3          9.77           52.8             91.1                22.6 14557.30
## 4         10.40           80.7             73.4                34.5 44616.00
## 5          0.97           51.2             76.9                44.4  3895.52
## 6          3.83           91.1             54.6                53.7 23064.26
## 7          0.53           95.3             72.5                49.5  1454.85
## 8          8.18           55.2             86.0                39.2 45472.62
## 9          2.55           63.8             72.0                26.5  3151.80
## 10         1.07           73.7             74.9                15.5  1211.24
##    timbulan_sampah                       geometry
## 1            0.009 MULTIPOLYGON Z (((109.7863 ...
## 2            0.006 MULTIPOLYGON Z (((109.7775 ...
## 3            0.007 MULTIPOLYGON Z (((109.9003 ...
## 4            0.022 MULTIPOLYGON Z (((109.7507 ...
## 5            0.002 MULTIPOLYGON Z (((109.6687 ...
## 6            0.012 MULTIPOLYGON Z (((109.6198 ...
## 7            0.001 MULTIPOLYGON Z (((109.7185 ...
## 8            0.023 MULTIPOLYGON Z (((109.3977 ...
## 9            0.002 MULTIPOLYGON Z (((109.471 -...
## 10           0.001 MULTIPOLYGON Z (((109.4623 ...

Interpretasi: Nilai kepadatan penduduk menunjukkan variasi besar antarkecamatan, di mana beberapa wilayah memiliki lebih dari 7.000 jiwa per km². Akses sanitasi dan air bersih juga bervariasi dengan rentang 40–100%, mencerminkan kesenjangan layanan. Timbulan sampah mengikuti pola populasi total, sehingga kecamatan dengan penduduk lebih padat menghasilkan sampah harian lebih tinggi.

3. Visualisasi

3.1. Choropleth Map

Choropleth adalah peta tematik yang warnanya mewakili besaran data di tiap wilayah.

# Plot choropleth
ggplot(data_siap) +
  geom_sf(aes(fill=kepadatan_penduduk), color="white", size = 0.2) +
  scale_fill_viridis_c(option = "C") +
  labs(title = "Peta Kepadatan Penduduk per Kecamatan") +
  theme_minimal()

Peta menunjukkan variasi tingkat kepadatan penduduk antar kecamatan di Kabupaten Banjarnegara. Warna yang semakin cerah (kuning) menggambarkan wilayah dengan kepadatan lebih tinggi, sedangkan warna gelap (biru–ungu) menunjukkan wilayah dengan populasi yang lebih jarang.

Beberapa kecamatan tampak memiliki tingkat kepadatan yang jauh lebih tinggi dibandingkan kecamatan lainnya. Hal ini mengindikasikan adanya pusat–pusat aktivitas yang lebih terkonsentrasi, kemungkinan berhubungan dengan: kedekatan dengan pusat ekonomi, kondisi topografi yang lebih datar, aksesibilitas transportasi, dan keberadaan fasilitas umum yang lebih lengkap.

Sebaliknya, kecamatan yang berada di area pegunungan atau pinggiran memperlihatkan kepadatan yang lebih rendah. Pola ini umum ditemukan pada wilayah dengan keterbatasan layanan publik atau transportasi, serta karakteristik geografis yang kurang mendukung pemukiman padat.

3.2. Bubble Map

# 1. Hitung centroid
kec_centroid <- st_centroid(data_siap)
## Warning: st_centroid assumes attributes are constant over geometries
## st_as_s2(): dropping Z and/or M coordinate
# 2. Siapkan data untuk geom_point
centroid_df <- bind_cols(
  st_coordinates(kec_centroid) |> as.data.frame(),
  st_drop_geometry(kec_centroid)
)

# 3. Plot Bubble Map
ggplot() +
  geom_sf(data = data_siap, fill = "grey90", color = "white") +
  geom_point(
    data = centroid_df,
    aes(X, Y, size = timbulan_sampah),
    color = "red", alpha = 0.5
  ) +
  scale_size(range = c(3, 15)) +
  labs(
    title = "Bubble Map Timbulan Sampah (ton/hari)",
    x = NULL, y = NULL
  ) +
  theme_void()

Bubble map menggambarkan besarnya timbulan sampah harian di setiap kecamatan. Ukuran lingkaran memperlihatkan besaran timbulan sampah: semakin besar lingkarannya, semakin tinggi volume sampah yang dihasilkan.

Terlihat bahwa kecamatan dengan bubble terbesar umumnya adalah wilayah yang: memiliki kepadatan penduduk tinggi, merupakan pusat kegiatan sosial–ekonomi, memiliki aktivitas perdagangan atau pasar lebih aktif.

Ini konsisten dengan teori lingkungan bahwa timbulan sampah berkorelasi kuat dengan jumlah penduduk dan tingkat aktivitas ekonomi.

Di sisi lain, kecamatan dengan bubble kecil menunjukkan timbulan sampah yang rendah. Hal ini dapat disebabkan oleh: jumlah penduduk yang sedikit, penggunaan lahan dominan untuk pertanian atau kehutanan, aktivitas urban yang minimal.

Visualisasi ini membantu mengidentifikasi kecamatan yang perlu menjadi prioritas dalam manajemen persampahan, seperti penguatan TPS, peningkatan armada pengangkutan, atau edukasi pengurangan sampah.

3.3. Treemap

ggplot(data_siap, aes(
  area = timbulan_sampah,
  fill = akses_sanitasi,
  label = nm_kecamatan
)) +
  geom_treemap() +
  geom_treemap_text(colour = "white", place = "centre") +
  scale_fill_viridis_c() +
  labs(title = "Treemap Timbulan Sampah & Akses Sanitasi") +
  theme_minimal()

Treemap memberikan gambaran mengenai perbandingan volume sampah antar kecamatan (ditunjukkan oleh ukuran kotak), sekaligus memperlihatkan tingkat akses sanitasi (ditunjukkan oleh gradasi warna).

Beberapa poin yang dapat diamati:

  1. Kecamatan dengan kotak terbesar merupakan kecamatan dengan timbulan sampah paling tinggi. Artinya wilayah tersebut memiliki aktivitas penduduk yang lebih besar dan menghasilkan lebih banyak sampah harian.

  2. Warna terang (kuning–hijau cerah) menggambarkan kecamatan dengan akses sanitasi yang baik atau mendekati 100%. Ini mengindikasikan infrastruktur sanitasi yang relatif memadai dan terkelola dengan baik.

  3. Warna gelap (biru–ungu) menunjukkan kecamatan dengan tingkat akses sanitasi lebih rendah. Wilayah ini perlu mendapatkan perhatian khusus dalam: pembangunan fasilitas sanitasi, peningkatan akses jamban layak, penyediaan layanan sanitasi aman.

  4. Beberapa kecamatan terlihat memiliki timbulan sampah besar tetapi akses sanitasi rendah, yang menandakan potensi risiko lingkungan lebih tinggi, seperti: pencemaran air permukaan, sanitasi tidak aman, munculnya sumber penyakit berbasis lingkungan. Kecamatan seperti ini menjadi prioritas dalam perencanaan intervensi lingkungan.

3.4. Polar Bar Plot

ggplot(data_siap, aes(x = nm_kecamatan, y = ruang_terbuka_hijau)) +
  geom_col(fill = "forestgreen") +
  coord_polar() +
  theme_void() +
  labs(title = "Ruang Terbuka Hijau per Kecamatan (Polar Plot)")

Pada grafik polar tersebut, setiap batang mewakili luas/proporsi RTH (Ruang Terbuka Hijau) di masing-masing kecamatan. Panjang batang menunjukkan seberapa besar RTH di kecamatan tersebut.

Beberapa kecamatan memiliki batang yang lebih panjang artinya memiliki RTH yang lebih luas dibanding kecamatan lain. Sebaliknya, kecamatan dengan batang lebih pendek artinya ketersediaan RTH relatif rendah, yang mungkin perlu prioritas dalam penambahan ruang hijau, penguatan vegetasi, atau penataan ruang berkelanjutan.

3.5. Dot Plot

ggplot(data_siap, aes(x = reorder(nm_kecamatan, akses_air_bersih), y = akses_air_bersih)) +
  geom_point(color = "blue", size = 3) +
  coord_flip() +
  labs(title = "Dot Plot Akses Air Bersih per Kecamatan") +
  theme_minimal()

Kecamatan dengan akses air bersih terendah berada di kisaran 50–65%, ini berarti sekitar separuh penduduk belum memperoleh akses air layak. Distribusi akses air bersih cenderung meningkat secara bertahap, bukan melonjak.

Adanya kecamatan dengan nilai sangat rendah menunjukkan ketimpangan layanan air bersih, sehingga perlu: pembangunan sarana air minum, perbaikan pipa distribusi, atau peningkatan kualitas sumber air setempat.