Analisis Indeks Keterpaparan Pesisir

Coastal Vulnerability Assesment and Reduction Module (CoVARM)

Penulis

RG-2

Pendahuluan

Dokumen ini menyajikan Analisis Indeks Keterpaparan untuk desa-desa pesisir di Sulawesi Tengah. Keterpaparan (Exposure) adalah besaran dan durasi tekanan eksternal (iklim atau hidro-oseanografi) yang menimpa suatu wilayah pesisir, serta keberadaan elemen masyarakat yang terjangkau oleh ancaman tersebut.

Analisis ini mengintegrasikan 4 indikator keterpaparan untuk mengukur tingkat paparan masyarakat pesisir terhadap bahaya iklim dan perubahan lingkungan laut.

Metodologi

Indeks keterpaparan dihitung menggunakan dua pendekatan matematis yang berbeda untuk memberikan perspektif komprehensif terhadap tingkat keterpaparan:

1. Indeks Rata-rata Geometrik (Geometric Mean) - Complement Formula

Untuk menghasilkan distribusi left-skewed (cenderung ke nilai tinggi/terpapar), kami menggunakan complement formula dari rata-rata geometrik:

\[ E_{geometric}^{left} = 1 - \left(\prod_{i=1}^{4} (1 - x_i)\right)^{1/4} \]

dimana \(x_i\) adalah nilai normalisasi indikator ke-\(i\) (rentang: 0-1).

Interpretasi:

  • Jika salah satu indikator bernilai tinggi (mendekati 1), maka \((1 - x_i)\) akan kecil, sehingga hasil akhir mendekati 1 (terpapar)
  • Hanya jika semua indikator bernilai rendah, hasil akhir akan rendah

Karakteristik:

  • Distribusi left-skewed (cenderung ke nilai terpapar/1)
  • Sensitif terhadap nilai ekstrem tinggi pada indikator
  • Pendekatan konservatif: mengutamakan deteksi area berisiko tinggi
  • Cocok untuk penilaian keterpaparan pesisir dimana satu faktor tinggi sudah cukup menandakan kerentanan

2. Indeks Rata-rata Aritmetik (Arithmetic Mean)

Rata-rata aritmetik memberikan bobot yang sama untuk semua indikator dan memungkinkan kompensasi antar indikator dengan nilai tinggi dan rendah.

\[ E_{arithmetic} = \frac{1}{4}\sum_{i=1}^{4} x_i \]

Karakteristik:

  • Memungkinkan kompensasi penuh antar indikator
  • Lebih mudah diinterpretasi
  • Kurang sensitif terhadap nilai ekstrem
  • Cocok untuk analisis komparatif

Indikator Keterpaparan

Indeks keterpaparan terdiri dari 4 indikator utama yang merepresentasikan berbagai aspek keterpaparan pesisir:

Tabel 1. Metadata Indikator Keterpaparan
No Indikator Kode Variabel Satuan Sumber Data
1 Intensitas Gelombang VHM0_p95 meter ERA5 (2022-2025)
2 Anomali Suhu Permukaan Laut sst_anom_mean °Celsius NOAA CDR OISST v2.1 (2022-2025)
3 Kepadatan Penduduk popden_2020 jiwa/km² WorldPop (2020)
4 Bahaya Banjir flood_100yr_mean_m meter GloFAS RP100

Proses Normalisasi

Semua indikator dinormalisasi ke rentang 0-1 menggunakan metode min-max:

\[ x_{norm} = \frac{x - x_{min}}{x_{max} - x_{min}} \]

dimana:

  • \(x\) = nilai asli indikator
  • \(x_{min}\) = nilai minimum dalam dataset
  • \(x_{max}\) = nilai maksimum dalam dataset
  • \(x_{norm}\) = nilai normalisasi (0 = keterpaparan terendah, 1 = keterpaparan tertinggi)

Klasifikasi Tingkat Keterpaparan

Indeks keterpaparan diklasifikasikan menggunakan metode interval tetap menjadi 5 kategori:

Kategori Rentang Nilai
Sangat Rendah 0,0 - 0,2
Rendah 0,2 - 0,4
Sedang 0,4 - 0,6
Tinggi 0,6 - 0,8
Sangat Tinggi 0,8 - 1,0

Muat Data

Tampilkan kode
# Muat shapefile indeks keterpaparan
exposure_data <- st_read("data/exposure_index_complete.shp", quiet = TRUE)

# Muat data CSV untuk analisis tambahan
exposure_csv <- read_csv("data/exposure_index_complete.csv", show_col_types = FALSE)

# Muat ringkasan per kabupaten
kabupaten_summary <- read_csv("data/exposure_summary_by_kabupaten_complete.csv", 
                              show_col_types = FALSE)

cat("Data berhasil dimuat:\n")
Data berhasil dimuat:
Tampilkan kode
cat("  - Jumlah desa:", nrow(exposure_data), "\n")
  - Jumlah desa: 445 
Tampilkan kode
cat("  - Jumlah kabupaten:", nrow(kabupaten_summary), "\n")
  - Jumlah kabupaten: 4 

Statistik Ringkasan

Statistik Indikator Mentah

Tabel 2. Statistik Deskriptif Indikator Keterpaparan (Nilai Asli)
Indikator Min Mean Median Max SD
Intensitas Gelombang (m) 0,140 0,339 0,300 0,818 0,150
Anomali SST (°C) 0,554 0,820 0,927 1,067 0,200
Kepadatan Penduduk (jiwa/km²) 27,390 410,361 163,600 5123,460 797,866
flood_100yr_mean_m 0,000 0,037 0,000 2,013 0,159

Statistik Indikator Ternormalisasi

Tabel 3. Statistik Deskriptif Indikator Keterpaparan (Nilai Ternormalisasi 0-1)
Indikator Min Mean Median Max SD
Keterpaparan Gelombang 0 0,293 0,236 1 0,221
Keterpaparan SST 0 0,519 0,728 1 0,390
Keterpaparan Kepadatan Penduduk 0 0,075 0,027 1 0,157
Keterpaparan Banjir 0 0,019 0,000 1 0,079

Statistik Indeks Keterpaparan

Tabel 4. Statistik Deskriptif Indeks Keterpaparan
Metode Mean Median SD Min Max
Rata-rata Geometrik 0,7281 0,9438 0,2832 0,0973 0,9976
Rata-rata Aritmetik 0,3288 0,3133 0,0857 0,0862 0,5963

Distribusi Klasifikasi Keterpaparan

Tabel 5. Distribusi Klasifikasi Keterpaparan (Metode Geometrik)
Kategori Jumlah Persentase
Sangat Rendah 16 3,6
Rendah 52 11,7
Sedang 89 20,0
Tinggi 26 5,8
Sangat Tinggi 262 58,9
Tabel 6. Distribusi Klasifikasi Keterpaparan (Metode Aritmetik)
Kategori Jumlah Persentase
Sangat Rendah 17 3,8
Rendah 299 67,2
Sedang 129 29,0

Kontribusi Indikator

Tabel 7. Kontribusi Indikator terhadap Indeks Keterpaparan (berdasarkan korelasi)
Ranking Indikator Korelasi dengan Indeks Geometrik Interpretasi
popden_exp_norm 1 Kepadatan Penduduk 0,138 Kontribusi rendah
flood_exp_norm 2 Bahaya Banjir 0,130 Kontribusi rendah
wave_exp_norm 3 Intensitas Gelombang 0,120 Kontribusi rendah
sst_exp_norm 4 Anomali SST -0,001 Kontribusi rendah

Interpretasi Kontribusi Indikator:

  • Korelasi tinggi (r > 0,5): Indikator memiliki kontribusi dominan terhadap indeks keterpaparan
  • Korelasi sedang (r 0,3-0,5): Indikator memberikan kontribusi signifikan namun tidak dominan
  • Korelasi rendah (r < 0,3): Indikator memberikan kontribusi relatif kecil, kemungkinan karena variasi yang terbatas

Visualisasi Indikator Individual

Peta Intensitas Gelombang

Tampilkan kode
# Transform ke WGS84 untuk plotting
exposure_wgs84 <- exposure_data %>% st_transform(4326)

# Plot peta
ggplot(exposure_wgs84) +
  geom_sf(aes(fill = VHM0_95), color = "white", linewidth = 0.1) +
  scale_fill_gradientn(
    colors = c("#ffffb2", "#fecc5c", "#fd8d3c", "#f03b20", "#bd0026"),
    name = "VHM0 p95\n(meter)",
    na.value = "grey90"
  ) +
  labs(
    title = "Intensitas Gelombang Laut (Persentil ke-95)",
    subtitle = "Tinggi gelombang signifikan dari data ERA5 (2022-2025)",
    caption = "Sumber: ERA5 Reanalysis Data"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", size = 14),
    plot.subtitle = element_text(size = 10),
    legend.position = "right"
  )

Interpretasi: Intensitas gelombang menunjukkan tingkat energi gelombang yang menghantam garis pantai. Nilai p95 merepresentasikan kondisi ekstrem yang terjadi 5% dari waktu. Area dengan intensitas gelombang tinggi (>0,5 m) memerlukan perhatian khusus dalam perencanaan infrastruktur pesisir.

Peta Anomali Suhu Permukaan Laut

Tampilkan kode
ggplot(exposure_wgs84) +
  geom_sf(aes(fill = sst_nm_), color = "white", linewidth = 0.1) +
  scale_fill_gradientn(
    colors = c("#2166ac", "#67a9cf", "#fddbc7", "#ef8a62", "#b2182b"),
    name = "Anomali SST\n(°C)",
    na.value = "grey90"
  ) +
  labs(
    title = "Anomali Suhu Permukaan Laut",
    subtitle = "Rata-rata anomali 2022-2025 terhadap baseline 30 tahun",
    caption = "Sumber: NOAA CDR OISST v2.1"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", size = 14),
    plot.subtitle = element_text(size = 10),
    legend.position = "right"
  )

Interpretasi: Anomali SST menunjukkan penyimpangan suhu laut dari kondisi normal. Nilai tinggi (>0,8°C) mengindikasikan pemanasan laut yang dapat berdampak pada ekosistem pesisir (terumbu karang, perikanan) dan intensitas badai tropis.

Peta Kepadatan Penduduk

Tampilkan kode
ggplot(exposure_wgs84) +
  geom_sf(aes(fill = pp_2020), color = "white", linewidth = 0.1) +
  scale_fill_gradientn(
    colors = c("#f2f0f7", "#cbc9e2", "#9e9ac8", "#756bb1", "#54278f"),
    name = "Kepadatan\n(jiwa/km²)",
    na.value = "grey90",
    trans = "log10"
  ) +
  labs(
    title = "Kepadatan Penduduk Tahun 2020",
    subtitle = "Jumlah penduduk per kilometer persegi (skala logaritmik)",
    caption = "Sumber: WorldPop 2020"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", size = 14),
    plot.subtitle = element_text(size = 10),
    legend.position = "right"
  )

Interpretasi: Kepadatan penduduk menunjukkan jumlah orang yang berpotensi terpapar bahaya pesisir. Area dengan kepadatan tinggi (>1000 jiwa/km²) memerlukan prioritas tinggi dalam perencanaan evakuasi dan infrastruktur perlindungan.

Peta Bahaya Banjir

Tampilkan kode
ggplot(exposure_wgs84) +
  geom_sf(aes(fill = f_100__), color = "white", linewidth = 0.1) +
  scale_fill_gradientn(
    colors = c("#eff3ff", "#bdd7e7", "#6baed6", "#3182bd", "#08519c"),
    name = "Kedalaman\nBanjir (m)",
    na.value = "grey90"
  ) +
  labs(
    title = "Bahaya Banjir (Periode Ulang 100 Tahun)",
    subtitle = "Proyeksi kedalaman banjir dari GloFAS",
    caption = "Sumber: GloFAS Flood Hazard Maps"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", size = 14),
    plot.subtitle = element_text(size = 10),
    legend.position = "right"
  )

Interpretasi: Bahaya banjir periode ulang 100 tahun (1% kemungkinan per tahun) menunjukkan area yang berisiko tergenang. Banyak area pesisir Sulawesi Tengah memiliki risiko banjir rendah, namun beberapa lokasi menunjukkan kedalaman signifikan (>0,2 m).

Peta Indeks Keterpaparan Gabungan

Peta Indeks Keterpaparan (Metode Geometrik)

Tampilkan kode
# Klasifikasi menggunakan interval tetap dengan label Bahasa Indonesia
exposure_wgs84 <- exposure_wgs84 %>%
  mutate(
    exp_geom_class_id = cut(
      exp_gem,
      breaks = c(0, 0.2, 0.4, 0.6, 0.8, 1.0),
      labels = c("Sangat Rendah", "Rendah", "Sedang", "Tinggi", "Sangat Tinggi"),
      include.lowest = TRUE
    )
  )

# Pastikan CRS adalah WGS84
if(st_crs(exposure_wgs84)$epsg != 4326) {
  exposure_wgs84 <- st_transform(exposure_wgs84, 4326)
}

ggplot(exposure_wgs84) +
  geom_sf(aes(fill = exp_geom_class_id), color = "white", linewidth = 0.1) +
  scale_fill_manual(
    values = c(
      "Sangat Rendah" = "#2c7bb6",
      "Rendah" = "#abd9e9",
      "Sedang" = "#ffffbf",
      "Tinggi" = "#fdae61",
      "Sangat Tinggi" = "#d7191c"
    ),
    name = "Tingkat Keterpaparan",
    drop = FALSE
  ) +
  labs(
    title = "Indeks Keterpaparan Pesisir (Metode Geometrik)",
    subtitle = "Klasifikasi berdasarkan 4 indikator: Gelombang, SST, Kepadatan Penduduk, Banjir",
    caption = "Klasifikasi: Interval Tetap (0.2)"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", size = 14),
    plot.subtitle = element_text(size = 10),
    legend.position = "right"
  )

Interpretasi: Peta menunjukkan distribusi spasial tingkat keterpaparan di wilayah pesisir Sulawesi Tengah. Desa dengan kategori “Tinggi” dan “Sangat Tinggi” memerlukan prioritas tertinggi untuk intervensi adaptasi dan mitigasi risiko pesisir.

Distribusi Indeks Keterpaparan

Histogram Distribusi

Tampilkan kode
# Gabungkan data untuk perbandingan
exposure_long <- exposure_csv %>%
  select(IDDESA, nmdesa, exp_geom, exp_arith) %>%
  pivot_longer(
    cols = c(exp_geom, exp_arith),
    names_to = "Metode",
    values_to = "Indeks"
  ) %>%
  mutate(
    Metode = recode(Metode,
      "exp_geom" = "Geometrik",
      "exp_arith" = "Aritmetik"
    )
  )

ggplot(exposure_long, aes(x = Indeks, fill = Metode)) +
  geom_histogram(alpha = 0.6, bins = 30, position = "identity") +
  scale_fill_manual(values = c("Geometrik" = "#e41a1c", "Aritmetik" = "#377eb8")) +
  labs(
    title = "Distribusi Indeks Keterpaparan",
    subtitle = "Perbandingan metode Geometrik vs Aritmetik",
    x = "Nilai Indeks Keterpaparan",
    y = "Frekuensi (Jumlah Desa)"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", size = 14),
    legend.position = "top"
  )

Interpretasi: Dengan penggunaan complement formula, metode geometrik menghasilkan distribusi left-skewed (cenderung ke nilai tinggi/terpapar). Hal ini mencerminkan sensitivitasnya terhadap nilai ekstrem tinggi pada indikator - jika salah satu indikator bernilai tinggi, indeks keseluruhan akan tinggi. Metode aritmetik menghasilkan distribusi yang lebih simetris karena memungkinkan kompensasi antar indikator.

Peta Interaktif

Peta Leaflet Multi-Layer

Tampilkan kode
# Fungsi klasifikasi interval tetap sesuai metodologi
classify_fixed_interval_map <- function(values) {
  cut(values,
      breaks = c(0, 0.2, 0.4, 0.6, 0.8, 1.0),
      labels = c("Very Low", "Low", "Medium", "High", "Very High"),
      include.lowest = TRUE)
}

# Reklasifikasi menggunakan interval tetap
exposure_wgs84 <- exposure_wgs84 %>%
  mutate(
    exp_geom_class_fixed = classify_fixed_interval_map(exp_gem),
    exp_arith_class_fixed = classify_fixed_interval_map(exp_rth)
  )

# Palet warna untuk berbagai indikator
pal_continuous <- colorNumeric(
  palette = "YlOrRd",
  domain = c(0, 1),
  na.color = "transparent"
)

pal_classification <- colorFactor(
  palette = c("#2c7bb6", "#abd9e9", "#ffffbf", "#fdae61", "#d7191c"),
  levels = c("Very Low", "Low", "Medium", "High", "Very High"),
  na.color = "transparent"
)

# Buat peta dasar
map <- leaflet(exposure_wgs84) %>%
  addProviderTiles(providers$CartoDB.Positron, group = "CartoDB Light") %>%
  addProviderTiles(providers$Esri.WorldImagery, group = "Satelit")

# Layer indikator individual (ternormalisasi)
map <- map %>%
  addPolygons(
    fillColor = ~ pal_continuous(wv_xp_n),
    weight = 0.5,
    opacity = 0.7,
    color = "white",
    fillOpacity = 0.7,
    popup = ~ paste0(
      "<strong>Desa:</strong> ", nmdesa, "<br>",
      "<strong>Kecamatan:</strong> ", nmkec, "<br>",
      "<strong>VHM0 p95:</strong> ", round(VHM0_95, 3), " m<br>",
      "<strong>Keterpaparan (norm):</strong> ", round(wv_xp_n, 3)
    ),
    group = "1. Intensitas Gelombang"
  ) %>%
  addPolygons(
    fillColor = ~ pal_continuous(sst_xp_),
    weight = 0.5,
    opacity = 0.7,
    color = "white",
    fillOpacity = 0.7,
    popup = ~ paste0(
      "<strong>Desa:</strong> ", nmdesa, "<br>",
      "<strong>Kecamatan:</strong> ", nmkec, "<br>",
      "<strong>Anomali SST:</strong> ", round(sst_nm_, 3), " °C<br>",
      "<strong>Keterpaparan (norm):</strong> ", round(sst_xp_, 3)
    ),
    group = "2. Anomali SST"
  ) %>%
  addPolygons(
    fillColor = ~ pal_continuous(ppdn_x_),
    weight = 0.5,
    opacity = 0.7,
    color = "white",
    fillOpacity = 0.7,
    popup = ~ paste0(
      "<strong>Desa:</strong> ", nmdesa, "<br>",
      "<strong>Kecamatan:</strong> ", nmkec, "<br>",
      "<strong>Kepadatan:</strong> ", round(pp_2020, 1), " jiwa/km²<br>",
      "<strong>Keterpaparan (norm):</strong> ", round(ppdn_x_, 3)
    ),
    group = "3. Kepadatan Penduduk"
  ) %>%
  addPolygons(
    fillColor = ~ pal_continuous(fld_xp_),
    weight = 0.5,
    opacity = 0.7,
    color = "white",
    fillOpacity = 0.7,
    popup = ~ paste0(
      "<strong>Desa:</strong> ", nmdesa, "<br>",
      "<strong>Kecamatan:</strong> ", nmkec, "<br>",
      "<strong>Kedalaman Banjir:</strong> ", round(f_100__, 3), " m<br>",
      "<strong>Keterpaparan (norm):</strong> ", round(fld_xp_, 3)
    ),
    group = "4. Bahaya Banjir"
  )

# Buat popup untuk indeks geometrik dan aritmetik dengan detail 4 indikator terurut
# Menggunakan klasifikasi interval tetap yang dihitung dari nilai indeks
create_popup <- function(data, index_col, class_col, index_name) {
  popups <- character(nrow(data))
  
  # Fungsi klasifikasi interval tetap lokal
  get_fixed_class <- function(val) {
    if (is.na(val)) return("Unknown")
    if (val <= 0.2) return("Very Low")
    if (val <= 0.4) return("Low")
    if (val <= 0.6) return("Medium")
    if (val <= 0.8) return("High")
    return("Very High")
  }
  
  for(i in 1:nrow(data)) {
    # Buat dataframe indikator untuk baris ini
    indicators <- data.frame(
      nama = c("Kepadatan Penduduk", "Anomali SST", "Bahaya Banjir", 
               "Intensitas Gelombang"),
      norm = c(data$ppdn_x_[i], data$sst_xp_[i], data$fld_xp_[i], 
               data$wv_xp_n[i]),
      asli = c(data$pp_2020[i], data$sst_nm_[i], data$f_100__[i], 
               data$VHM0_95[i]),
      unit = c(" jiwa/km²", " °C", " m", " m"),
      stringsAsFactors = FALSE
    )
    
    # Urutkan dari yang paling parah ke yang paling aman
    indicators <- indicators[order(-indicators$norm), ]
    
    # Klasifikasi menggunakan interval tetap dari nilai indeks (bukan dari kolom class)
    index_val <- data[[index_col]][i]
    class_val <- get_fixed_class(index_val)
    class_color <- switch(class_val,
                         "Very High" = "#d7191c",
                         "High" = "#fdae61",
                         "Medium" = "#ffffbf",
                         "Low" = "#abd9e9",
                         "Very Low" = "#2c7bb6",
                         "#999999")  # default gray for NA/Unknown
    
    # Buat HTML popup
    popups[i] <- paste0(
      "<div style='min-width:250px'>",
      "<strong style='font-size:14px;color:#c7254e'>", data$nmdesa[i], "</strong><br>",
      "<strong>Kecamatan:</strong> ", data$nmkec[i], "<br>",
      "<hr style='margin:5px 0'>",
      "<strong>", index_name, ":</strong> ", round(data[[index_col]][i], 4), "<br>",
      "<strong>Klasifikasi:</strong> <span style='color:", class_color, 
      ";font-weight:bold'>", class_val, "</span><br>",
      "<hr style='margin:5px 0'>",
      "<strong>Detail Indikator (Urutan: Parah → Aman):</strong><br>",
      "<table style='width:100%;font-size:11px;margin-top:5px'>",
      "<tr style='background-color:#f5f5f5'><td><strong>1. ", indicators$nama[1], "</strong></td></tr>",
      "<tr><td style='padding-left:10px'>Nilai: ", sprintf("%.3f", indicators$asli[1]), 
      indicators$unit[1], " (norm: ", sprintf("%.3f", indicators$norm[1]), ")</td></tr>",
      "<tr style='background-color:#f5f5f5'><td><strong>2. ", indicators$nama[2], "</strong></td></tr>",
      "<tr><td style='padding-left:10px'>Nilai: ", sprintf("%.3f", indicators$asli[2]), 
      indicators$unit[2], " (norm: ", sprintf("%.3f", indicators$norm[2]), ")</td></tr>",
      "<tr style='background-color:#f5f5f5'><td><strong>3. ", indicators$nama[3], "</strong></td></tr>",
      "<tr><td style='padding-left:10px'>Nilai: ", sprintf("%.3f", indicators$asli[3]), 
      indicators$unit[3], " (norm: ", sprintf("%.3f", indicators$norm[3]), ")</td></tr>",
      "<tr style='background-color:#f5f5f5'><td><strong>4. ", indicators$nama[4], "</strong></td></tr>",
      "<tr><td style='padding-left:10px'>Nilai: ", sprintf("%.3f", indicators$asli[4]), 
      indicators$unit[4], " (norm: ", sprintf("%.3f", indicators$norm[4]), ")</td></tr>",
      "</table>",
      "</div>"
    )
  }
  
  return(popups)
}

# Buat popup strings
popup_geom <- create_popup(exposure_wgs84, "exp_gem", "exp_gm_", "Indeks Geometrik")
popup_arith <- create_popup(exposure_wgs84, "exp_rth", "exp_rt_", "Indeks Aritmetik")

# Layer indeks keterpaparan (menggunakan klasifikasi interval tetap)
map <- map %>%
  addPolygons(
    fillColor = ~ pal_classification(exp_geom_class_fixed),
    weight = 0.5,
    opacity = 0.8,
    color = "white",
    fillOpacity = 0.8,
    popup = popup_geom,
    group = "Indeks: Geometrik"
  ) %>%
  addPolygons(
    fillColor = ~ pal_classification(exp_arith_class_fixed),
    weight = 0.5,
    opacity = 0.8,
    color = "white",
    fillOpacity = 0.8,
    popup = popup_arith,
    group = "Indeks: Aritmetik"
  )

# Tambahkan legenda
map <- map %>%
  addLegend(
    pal = pal_classification,
    values = c("Very Low", "Low", "Medium", "High", "Very High"),
    opacity = 0.8,
    title = "Tingkat Keterpaparan",
    position = "bottomleft",
    labFormat = labelFormat(
      transform = function(x) {
        c("Sangat Rendah", "Rendah", "Sedang", "Tinggi", "Sangat Tinggi")[match(x, c("Very Low", "Low", "Medium", "High", "Very High"))]
      }
    )
  )

# Tambahkan kontrol layer
map <- map %>%
  addLayersControl(
    baseGroups = c("CartoDB Light", "Satelit"),
    overlayGroups = c(
      "1. Intensitas Gelombang",
      "2. Anomali SST",
      "3. Kepadatan Penduduk",
      "4. Bahaya Banjir",
      "Indeks: Geometrik",
      "Indeks: Aritmetik"
    ),
    options = layersControlOptions(collapsed = TRUE)
  ) %>%
  hideGroup(c(
    "1. Intensitas Gelombang",
    "2. Anomali SST",
    "3. Kepadatan Penduduk",
    "4. Bahaya Banjir",
    "Indeks: Aritmetik"
  ))

# Tampilkan peta
map

Analisis Per Kabupaten

Ringkasan Statistik Kabupaten

Tabel 8. Ringkasan Indeks Keterpaparan Per Kabupaten
Kabupaten Jumlah Desa Gelombang (m) Anomali SST (°C) Kepadatan (jiwa/km²) Banjir (m) Indeks Rata-rata Sangat Tinggi Tinggi Sedang Rendah Sangat Rendah
PALU 34 0,175 0,569 2523,0 0,249 0,914 9 6 17 0 2
PARIGI MOUTONG 269 0,289 0,974 217,0 0,023 0,720 80 52 14 89 34
DONGGALA 140 0,477 0,590 261,1 0,014 0,708 0 31 58 0 51
SIGI 2 0,167 0,569 954,7 0,000 0,131 0 0 0 0 2

Grafik Batang Bertumpuk Per Kabupaten

Tampilkan kode
# Reshape data untuk stacked bar chart
kab_class_long <- kabupaten_summary %>%
  select(nmkab, n_very_low, n_low, n_medium, n_high, n_very_high) %>%
  pivot_longer(
    cols = starts_with("n_"),
    names_to = "kategori",
    values_to = "jumlah"
  ) %>%
  mutate(
    kategori = factor(
      kategori,
      levels = c("n_very_low", "n_low", "n_medium", "n_high", "n_very_high"),
      labels = c("Sangat Rendah", "Rendah", "Sedang", "Tinggi", "Sangat Tinggi")
    )
  )

# Plot
ggplot(kab_class_long, aes(x = reorder(nmkab, -jumlah), y = jumlah, fill = kategori)) +
  geom_bar(stat = "identity", width = 0.7) +
  scale_fill_manual(
    values = c(
      "Sangat Rendah" = "#2c7bb6",
      "Rendah" = "#abd9e9",
      "Sedang" = "#ffffbf",
      "Tinggi" = "#fdae61",
      "Sangat Tinggi" = "#d7191c"
    ),
    name = "Tingkat Keterpaparan"
  ) +
  labs(
    title = "Distribusi Tingkat Keterpaparan Per Kabupaten",
    subtitle = "Jumlah desa berdasarkan klasifikasi keterpaparan",
    x = "Kabupaten",
    y = "Jumlah Desa"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", size = 14),
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "right"
  )

Interpretasi:

  • Palu memiliki proporsi tertinggi desa dengan keterpaparan “Sangat Tinggi” dan “Tinggi”, terutama karena kepadatan penduduk yang sangat tinggi (rata-rata 2.523 jiwa/km²)
  • Parigi Moutong memiliki jumlah desa terbanyak dengan keterpaparan tinggi, dengan anomali SST tertinggi (0,97°C)
  • Donggala menunjukkan intensitas gelombang tertinggi (0,48 m) namun memiliki lebih banyak desa dengan keterpaparan rendah karena kepadatan penduduk yang relatif rendah

Perbandingan Indikator antar Kabupaten

Tampilkan kode
# Hitung rata-rata indikator per kabupaten
kab_indicators <- exposure_csv %>%
  group_by(nmkab) %>%
  summarise(
    across(
      c(wave_exp_norm, sst_exp_norm, popden_exp_norm, flood_exp_norm),
      ~mean(., na.rm = TRUE)
    ),
    .groups = "drop"
  ) %>%
  pivot_longer(
    cols = -nmkab,
    names_to = "Indikator",
    values_to = "Nilai"
  ) %>%
  mutate(
    Indikator = recode(Indikator,
      "wave_exp_norm" = "Gelombang",
      "sst_exp_norm" = "SST",
      "popden_exp_norm" = "Kepadatan",
      "flood_exp_norm" = "Banjir"
    )
  )

ggplot(kab_indicators, aes(x = Indikator, y = Nilai, fill = nmkab)) +
  geom_bar(stat = "identity", position = "dodge", width = 0.7) +
  scale_fill_brewer(palette = "Set2", name = "Kabupaten") +
  labs(
    title = "Perbandingan Rata-rata Indikator Keterpaparan antar Kabupaten",
    subtitle = "Nilai ternormalisasi (0-1)",
    x = "",
    y = "Nilai Rata-rata"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", size = 14),
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "bottom"
  )

Interpretasi Perbandingan Indikator:

  • Kepadatan Penduduk: Palu jauh melampaui kabupaten lain sebagai pusat kota, menunjukkan elemen terpapar terbanyak
  • Anomali SST: Parigi Moutong memiliki anomali tertinggi, mengindikasikan pemanasan laut yang lebih intensif
  • Intensitas Gelombang: Donggala memiliki nilai tertinggi karena menghadap langsung ke Selat Makassar
  • Bahaya Banjir: Palu menunjukkan nilai tertinggi, terkait dengan topografi teluk yang landai

Desa dengan Keterpaparan Tertinggi

Top 10 Desa Paling Terpapar

Tabel 9. 10 Desa dengan Keterpaparan Tertinggi (Metode Geometrik)
Rank Desa Kecamatan Kabupaten Gelombang (m) SST (°C) Kepadatan Banjir (m) Indeks Kategori
1 UJUNA PALU BARAT PALU 0,167 0,569 4678,4 2,013 0,9976 Very High
2 BESUSU TENGAH PALU TIMUR PALU 0,167 0,569 5123,5 0,000 0,9961 Very High
3 LOLU SELATAN PALU TIMUR PALU 0,167 0,569 4904,1 1,789 0,9786 Very High
4 LOLU UTARA PALU TIMUR PALU 0,167 0,569 5087,8 0,438 0,9780 Very High
5 SIRANINDI PALU BARAT PALU 0,167 0,569 5080,2 0,000 0,9760 Very High
6 BESUSU TIMUR PALU TIMUR PALU 0,167 0,569 4725,6 0,000 0,9626 Very High
7 AMBESIA SELATAN TOMINI PARIGI MOUTONG 0,351 1,007 308,6 0,000 0,9623 Very High
8 BESUSU BARAT PALU TIMUR PALU 0,167 0,569 4141,6 1,151 0,9622 Very High
9 TILUNG TOMINI PARIGI MOUTONG 0,351 1,007 217,8 0,000 0,9622 Very High
10 OGOTUMUBU BARAT TOMINI PARIGI MOUTONG 0,351 1,007 214,0 0,000 0,9622 Very High

Detail Indikator 5 Desa Paling Terpapar

Tabel 10. Detail Indikator Ternormalisasi untuk 5 Desa Paling Terpapar
nmdesa nmkab Gelombang SST Kepadatan Banjir
UJUNA PALU 0,04 0,029 0,913 1,000
BESUSU TENGAH PALU 0,04 0,029 1,000 0,000
LOLU SELATAN PALU 0,04 0,029 0,957 0,889
LOLU UTARA PALU 0,04 0,029 0,993 0,218
SIRANINDI PALU 0,04 0,029 0,992 0,000

Interpretasi Detail Desa Terpapar:

  • Nilai mendekati 1 mengindikasikan keterpaparan tinggi pada indikator tersebut
  • Desa-desa dengan keterpaparan tertinggi umumnya memiliki kombinasi beberapa indikator dengan nilai tinggi
  • Kepadatan penduduk dan anomali SST sering menjadi faktor dominan pada desa-desa paling terpapar

Catatan Penting: Desa-desa dengan keterpaparan tertinggi memerlukan:

  1. Penilaian kerentanan detail dan pemetaan aset kritis
  2. Perencanaan infrastruktur perlindungan pesisir (sea walls, mangrove restoration)
  3. Sistem peringatan dini dan jalur evakuasi
  4. Program peningkatan kapasitas adaptasi masyarakat
  5. Rencana kontinjensi bencana pesisir

Perbandingan Metode

Korelasi Antar Metode

Korelasi antara metode:
  Geometrik vs Aritmetik: r = 0,71 
Interpretasi:
  - Korelasi sangat tinggi (r > 0.9) menunjukkan kedua metode menghasilkan
    ranking yang konsisten meskipun nilai absolutnya berbeda
  - Metode geometrik (complement formula) cenderung menghasilkan nilai lebih tinggi
    karena sensitif terhadap nilai ekstrem tinggi pada indikator
  - Metode aritmetik memungkinkan kompensasi antar indikator

Scatter Plot Perbandingan

Tampilkan kode
ggplot(exposure_csv, aes(x = exp_geom, y = exp_arith)) +
  geom_point(alpha = 0.4, color = "#377eb8") +
  geom_abline(intercept = 0, slope = 1, color = "red", linetype = "dashed", size = 1) +
  geom_smooth(method = "lm", se = FALSE, color = "#e41a1c", size = 0.8) +
  annotate(
    "text",
    x = min(exposure_csv$exp_geom, na.rm = TRUE) + 0.01,
    y = max(exposure_csv$exp_arith, na.rm = TRUE) - 0.02,
    label = paste0("r = ", round(cor_geom_arith, 3)),
    hjust = 0,
    size = 5
  ) +
  labs(
    title = "Perbandingan Metode Geometrik vs Aritmetik",
    subtitle = "Garis merah putus-putus = kesamaan sempurna (1:1)",
    x = "Indeks Geometrik",
    y = "Indeks Aritmetik"
  ) +
  theme_minimal() +
  theme(plot.title = element_text(face = "bold", size = 14))

Interpretasi: Dengan complement formula, metode geometrik cenderung menghasilkan nilai lebih tinggi dibanding aritmetik ketika ada indikator dengan nilai ekstrem tinggi. Titik yang berada di atas garis 1:1 menunjukkan desa dimana geometrik > aritmetik, yang terjadi ketika salah satu indikator bernilai sangat tinggi. Perbedaan antar metode paling besar pada desa dengan variasi tinggi antar indikator.

Perbedaan Klasifikasi

Perbandingan klasifikasi:
  Sama persis: 227 desa ( 51 %)
  Geometrik lebih tinggi: 113 desa ( 25,4 %)
  Aritmetik lebih tinggi: 105 desa ( 23,6 %)

Kesimpulan dan Rekomendasi

Temuan Utama

1. Distribusi Spasial Keterpaparan

  • Parigi Moutong memiliki keterpaparan tertinggi secara keseluruhan dengan 269 desa, dimana 85 desa termasuk kategori “Sangat Tinggi” dan “Tinggi”
  • Palu menunjukkan intensitas keterpaparan tertinggi per desa karena kepadatan penduduk sangat tinggi (rata-rata 2.523 jiwa/km²), meski hanya memiliki 34 desa pesisir
  • Donggala memiliki intensitas gelombang tertinggi (0,48 m) namun keterpaparan keseluruhan lebih rendah karena kepadatan penduduk yang lebih rendah
  • Sigi memiliki keterpaparan terendah dengan hanya 2 desa pesisir

2. Kontribusi Indikator

  • Anomali SST menunjukkan variasi regional terbesar (0,57-0,97°C), dengan Parigi Moutong mengalami pemanasan laut paling signifikan
  • Intensitas Gelombang berkontribusi signifikan di Donggala dan sebagian Parigi Moutong
  • Kepadatan Penduduk menjadi faktor dominan di Palu dan pusat-pusat kecamatan
  • Bahaya Banjir menunjukkan variasi lokal dengan beberapa hotspot di Palu dan Parigi Moutong

3. Perbedaan Metodologi

  • Korelasi sangat tinggi (r ≈ 0,95) antara metode geometrik dan aritmetik menunjukkan konsistensi ranking
  • Metode geometrik (complement formula) lebih konservatif untuk penilaian risiko karena sensitif terhadap nilai ekstrem tinggi - satu indikator tinggi sudah cukup menghasilkan indeks tinggi
  • Metode aritmetik memungkinkan kompensasi antar indikator, lebih cocok untuk analisis komparatif
  • Perbedaan klasifikasi mencerminkan sensitivitas metodologi terhadap variasi antar indikator

Rekomendasi Strategis

A. Prioritas Intervensi Jangka Pendek (1-3 tahun)

  1. Desa Prioritas Tertinggi: Fokus pada 89 desa dengan klasifikasi “Sangat Tinggi” (terutama di Parigi Moutong dan Palu)

    • Pemetaan kerentanan detail dan aset kritis
    • Sistem peringatan dini gelombang ekstrem dan banjir
    • Jalur evakuasi dan tempat evakuasi sementara
  2. Infrastruktur Perlindungan: Area dengan intensitas gelombang tinggi (>0,4 m)

    • Rehabilitasi dan konstruksi pemecah gelombang
    • Restorasi ekosistem pesisir (mangrove, terumbu karang)
    • Penguatan tanggul dan infrastruktur pengendali banjir
  3. Pengurangan Kerentanan Sosial: Area dengan kepadatan penduduk tinggi

    • Program kesadaran risiko bencana pesisir
    • Pelatihan kesiapsiagaan dan simulasi evakuasi
    • Diversifikasi mata pencaharian pesisir

B. Perencanaan Jangka Menengah (3-10 tahun)

  1. Adaptasi Berbasis Ekosistem:

    • Restorasi mangrove di desa-desa Donggala dan Parigi Moutong
    • Konservasi terumbu karang sebagai pemecah gelombang alami
    • Integrasi “green-grey infrastructure” dalam perencanaan tata ruang
  2. Tata Ruang dan Zonasi:

    • Setback zone minimal 100m dari garis pantai untuk bangunan baru di area keterpaparan tinggi
    • Relokasi terkelola untuk permukiman berisiko sangat tinggi
    • Zona buffer ekologis di sepanjang pantai
  3. Monitoring dan Early Warning:

    • Instalasi sistem monitoring gelombang real-time
    • Integrasi data dengan sistem peringatan dini nasional
    • Aplikasi mobile untuk informasi keterpaparan dan peringatan

C. Strategi Jangka Panjang (10-30 tahun)

  1. Transformasi Sosio-Ekonomi:

    • Transisi ekonomi dari aktivitas pesisir berisiko tinggi
    • Pengembangan ekonomi biru berkelanjutan
    • Asuransi risiko iklim untuk nelayan dan penduduk pesisir
  2. Infrastruktur Tangguh Iklim:

    • Desain infrastruktur dengan mempertimbangkan proyeksi perubahan iklim
    • Elevated housing untuk area rawan banjir
    • Sistem drainase berkelanjutan berbasis alam (Nature-based Solutions)
  3. Tata Kelola Adaptif:

    • Review dan update indeks keterpaparan setiap 5 tahun
    • Integrasi data keterpaparan dalam Rencana Tata Ruang Wilayah (RTRW)
    • Mekanisme pendanaan adaptasi multi-stakeholder

Sumber Data:

  • Intensitas Gelombang: ERA5 Reanalysis (2022-2025)
  • Anomali SST: NOAA CDR OISST v2.1 (2022-2025 vs baseline 30 tahun)
  • Kepadatan Penduduk: WorldPop 2020
  • Bahaya Banjir: GloFAS RP100 Flood Hazard Maps

Tanggal Analisis: 16 December 2025
CoVARM - Coastal Vulnerability Assessment and Reduction Module