pkgs <- c("bit64", "svglite", "dplyr", "tidyr", "stringr", "forcats", "ggplot2", "scales", "patchwork", "ggrepel", "gt")
invisible(lapply(pkgs, function(p){ if(!requireNamespace(p, quietly=TRUE))
  install.packages(p, quiet=TRUE, repos="https://cloud.r-project.org")
  suppressPackageStartupMessages(library(p, character.only=TRUE)) }))
BUNDLE  <- "maternal_jkn_aggregates.rds"
A  <- readRDS(BUNDLE)
fix64 <- function(x){
  if(is.data.frame(x)){ x[] <- lapply(x, function(c) if(inherits(c, "integer64")) as.numeric(c) else c); x }
  else if(is.list(x)) lapply(x, fix64)
  else if(inherits(x, "integer64")) as.numeric(x) else x }
A  <- fix64(A)
OUT_DIR <- "outputs"; if(!dir.exists(OUT_DIR)) dir.create(OUT_DIR)

## ---- house style (palet terkunci ARC) ----
NAVY<-"#1e3a5f"; BLUE<-"#2d5a9e"; RED<-"#dc2626"; AMBER<-"#d97706"
TEAL<-"#0f766e"; GREY<-"#6b7280"; GREEN<-"#16a34a"; PURPLE<-"#7c3aed"; ORANGE<-"#ea580c"; PINK<-"#be185d"
COLS6 <- c(NAVY, BLUE, TEAL, AMBER, RED, PURPLE)
RANK_LAB <- A$meta$rank_lab
GRP_COLS <- setNames(c(RED, ORANGE, AMBER, PURPLE, PINK, BLUE, TEAL, GREEN), RANK_LAB)
LVL_COLS <- c("FKTP (Primer)"=TEAL, "FKRTL Rawat Jalan"=BLUE, "FKRTL Rawat Inap"=NAVY)
ISLAND_COLS <- c("Jawa"=NAVY, "Sumatera"=BLUE, "Sulawesi"=TEAL, "Kalimantan"=AMBER,
                 "Bali-Nusra"=PURPLE, "Maluku-Papua"=RED, "Tidak diketahui"=GREY)

th <- function(b=11) theme_minimal(base_size=b) + theme(
  plot.title=element_text(color=NAVY, face="bold", size=b+2, margin=margin(b=4), family="serif"),
  plot.subtitle=element_text(color=GREY, size=b-1, lineheight=1.3),
  plot.caption=element_text(color=GREY, size=b-3, hjust=1),
  plot.background=element_rect(fill="white", color=NA),
  panel.background=element_rect(fill="#f9fafb", color=NA),
  panel.border=element_rect(color="#e5e7eb", fill=NA, linewidth=0.4),
  panel.grid.major=element_line(color="#e5e7eb", linewidth=0.3), panel.grid.minor=element_blank(),
  legend.position="bottom", strip.background=element_rect(fill=NAVY, color=NA),
  strip.text=element_text(color="white", face="bold", size=b-1))

gfmt <- function(g) g |>
  gt::tab_options(heading.background.color=NAVY, heading.title.font.size=gt::px(13),
    column_labels.background.color=BLUE, column_labels.font.weight="bold", column_labels.font.size=gt::px(11),
    row.striping.include_table_body=TRUE, row.striping.background_color="#f0f4ff",
    table.border.top.color=NAVY, table.border.top.width=gt::px(3), table.width=gt::pct(100),
    data_row.padding=gt::px(5), source_notes.font.size=gt::px(10)) |>
  gt::tab_style(style=gt::cell_text(color="white", weight="bold"),
    locations=gt::cells_column_labels(gt::everything()))

CAP <- "Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional)"
fmt <- function(x) formatC(round(x), format="d", big.mark=",")
yrx <- function() scale_x_continuous(breaks=2015:2024, labels=function(x) paste0("'", substr(x,3,4)))

Unit analisis (penting, tercantum di tiap tabel/figur). Dokumen ini memakai unit berbeda, perhatikan badge · Unit: … pada judul tabel & subjudul/sumbu figur: (1) Perempuan unik = ibu, dihitung sekali (kohort, demografi, peta, ekuitas, mortalitas); (2) Kunjungan/Klaim = per layanan (volume utilisasi, tipologi, biaya, INA-CBG); (3) Klaim/episode persalinan / rawat inap = per persalinan/perawatan (mode persalinan, sesar, LOS, near-miss). Catatan: hitungan persalinan = klaim persalinan O80–O84 (≈ episode; deduplikasi ke ibu+tgl-masuk hanya menggeser <0,1%, tetapi belum dideduplikasi lintas-klaim).

Cara baca dokumen. Angka populasi adalah proyeksi nasional tertimbang (PSTV15) dari data sampel; angka sampel mentah dilaporkan terpisah bila relevan. Kunjungan maternal = kode ICD-10 O00–O99 (kehamilan, persalinan, nifas) di diagnosis masuk/primer/sekunder, ATAU kode pengawasan kehamilan (Z32–Z37, Z39, Z3A), ATAU poli Kebidanan & Kandungan (FKL11=6). Keluarga Berencana (Z30/Z31) dan bayi (Z38) dikecualikan. Data klaim hanya menggambarkan layanan yang terlayani & terklaim ke JKN, bukan cakupan/insidens sejati (lihat Treatment Gap & peringatan di Pilar F).

Peta Pilar (navigasi): Fondasi (kohort, definisi, stratifikasi, treatment gap) · A Beban & Demografi · B FKTP (Layanan Primer) · C FKRTL (Rujukan/RS) · D Inter, Rujukan & Konektivitas · E Geografi Member↔︎Faskes · F Proses & Outcome Maternal (persalinan, sesar, ANC, PNC, morbiditas berat, kematian) · G Komorbiditas & Beban Non-Maternal · H Ekonomi · I Ekuitas vs Perempuan Usia Reproduktif.

1 Layer 0, Fondasi: kohort, definisi kasus, & treatment gap

⓪ Fondasi · Alur Kohort (STROBE) · Definisi Kasus Maternal · Stratifikasi Diagnostik · Treatment Gap

Inti: Mendefinisikan populasi analisis (perempuan di kohort KIA-Ibu dengan ≥1 klaim maternal), stratifikasi diagnostik berbasis keparahan obstetrik, dan kerangka treatment gap, pengingat bahwa klaim JKN hanya menangkap layanan yang sampai ke fasilitas dan diklaimkan fee-for-service.
Sumber & desain: Data Sampel BPJS Kesehatan 2015–2024, kohort KIA-Ibu; identifikasi peserta via PSTV01; bobot nasional PSTV15; demografi via codebook resmi (PSTV03 usia, PSTV08 segmentasi, PSTV07 kelas, PSTV09 provinsi tempat tinggal, PSTV18 tahun meninggal).

cf <- A$cohort_flow
flow <- data.frame(
  Tahap=c("Kohort KIA-Ibu (peserta tersampel)", "Punya ≥1 klaim FKRTL (semua sebab)",
          "Perempuan dengan ≥1 klaim maternal di FKRTL", "Perempuan dengan ≥1 klaim maternal di FKTP",
          "KOHORT ANALISIS, ≥1 klaim maternal (FKTP/FKRTL)"),
  `Perempuan (sampel mentah)`=c(cf$member_cohort, cf$any_fkrtl_claim, cf$fkrtl_mat_pts, cf$fktp_mat_pts, cf$analytic_cohort),
  check.names=FALSE)
gt::gt(flow) |>
  gt::tab_header(title=gt::md("**Tabel L0.1, Alur Pembentukan Kohort (STROBE)** · _Unit: Perempuan unik (sampel)_"),
    subtitle=gt::md("_Angka sampel mentah, kohort KIA-Ibu BPJS 2015–2024_")) |>
  gt::fmt_number(columns=2, decimals=0, use_seps=TRUE) |>
  gt::data_color(columns=2, colors=scales::col_numeric(c("#dbeafe", "#1e3a5f"), domain=NULL)) |>
  gt::tab_source_note(gt::md(CAP)) |> gfmt()
Tabel L0.1, Alur Pembentukan Kohort (STROBE) · Unit: Perempuan unik (sampel)
Angka sampel mentah, kohort KIA-Ibu BPJS 2015–2024
Tahap Perempuan (sampel mentah)
Kohort KIA-Ibu (peserta tersampel) 523,352
Punya ≥1 klaim FKRTL (semua sebab) 409,532
Perempuan dengan ≥1 klaim maternal di FKRTL 390,300
Perempuan dengan ≥1 klaim maternal di FKTP 452,364
KOHORT ANALISIS, ≥1 klaim maternal (FKTP/FKRTL) 523,092
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional)

1.1 Definisi kasus maternal & catatan field (penting)

Bagaimana sebuah kunjungan disebut “kunjungan maternal”

Kunjungan dihitung maternal bila ada kode O00–O99 (kehamilan, persalinan, nifas) di diagnosis masuk (FKL15A), primer (FKL17A), atau sekunder (SDX), ATAU kode pengawasan kehamilan/nifas (Z32–Z37, Z39, Z3A), ATAU dilayani di poli Kebidanan & Kandungan (FKL11=6). Kode masuk (FKL15A) = diagnosis klinis sebenarnya; FKL17A “primer” sering kode administratif. Keluarga Berencana (Z30/Z31) dan perawatan bayi baru lahir (Z38, kode P) dikecualikan agar fokus pada episode kehamilan-persalinan-nifas ibu. FKTP memakai diagnosis tunggal FKP15.

1.2 Stratifikasi diagnostik (kondisi paling berat per ibu)

Aturan stratifikasi

Tiap ibu diberi satu kelompok primer = kondisi obstetrik paling berat yang pernah tercatat, prioritas klinis: Eklampsia/PE Berat › Perdarahan Obstetrik › Hipertensi Gestasional/PE Ringan › Sepsis/Komplikasi Puerperium › Kehamilan Abortif/Ektopik › Persalinan Macet/Komplikasi Intrapartum › Komplikasi Kehamilan Lain › Persalinan & ANC Normal. Mode persalinan (sesar vs vaginal) dianalisis terpisah di Pilar F.

sp <- A$strata_patient |> filter(!is.na(grp)) |> mutate(grp=as.character(grp))
gt::gt(sp) |>
  gt::cols_label(grp="Kelompok Diagnostik Primer", weighted="Ibu (tertimbang)",
                 raw="Ibu (sampel)", pct_w="Proporsi (%)") |>
  gt::tab_header(title=gt::md("**Tabel L0.2, Distribusi Kelompok Diagnostik Primer** · _Unit: Perempuan unik (tertimbang)_")) |>
  gt::fmt_number(columns=c(weighted, raw), decimals=0, use_seps=TRUE) |>
  gt::data_color(columns=weighted, colors=scales::col_numeric(c("#fce7f3", "#be185d"), domain=NULL)) |>
  gt::tab_source_note(gt::md(CAP)) |> gfmt()
Tabel L0.2, Distribusi Kelompok Diagnostik Primer · Unit: Perempuan unik (tertimbang)
Kelompok Diagnostik Primer Ibu (tertimbang) Ibu (sampel) Proporsi (%)
Persalinan & ANC Normal (O80-84,O09,Z3x) 5,999,638 212,672 38.8
Komplikasi Kehamilan Lain (O20-O48,O92-99) 4,430,692 139,552 28.6
Persalinan Macet & Komplikasi Intrapartum (O60-O77) 1,703,431 55,886 11.0
Kehamilan Abortif/Ektopik (O00-O08) 1,414,437 51,143 9.1
Eklampsia & PE Berat (O11,O14,O15) 796,264 23,900 5.1
Perdarahan Obstetrik (O44-46,O67,O72) 507,904 19,789 3.3
Sepsis & Komplikasi Puerperium (O85-91,O98) 381,808 12,899 2.5
Hipertensi Gestasional/PE Ringan (O10,O12,O13,O16) 237,444 7,188 1.5
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional)
write.csv(sp, file.path(OUT_DIR, "T_L0_2_strata_diagnostik.csv"), row.names=FALSE)
sp2 <- sp |> mutate(grp=fct_reorder(grp, weighted))
ggplot(sp2, aes(weighted, grp, fill=grp)) +
  geom_col(width=.72) +
  geom_text(aes(label=paste0(fmt(weighted), " (", pct_w, "%)")), hjust=-0.05, size=3, color=NAVY, fontface="bold") +
  scale_fill_manual(values=GRP_COLS, guide="none") +
  scale_x_continuous(labels=label_number(scale_cut=cut_short_scale()),
                     expand=expansion(mult=c(0, .20)), limits=c(0, NA)) +
  labs(title="Beban Kondisi Maternal Terlayani JKN menurut Kelompok Diagnostik · Unit: ibu unik",
       subtitle="Ibu unik tertimbang (proyeksi nasional), kohort kumulatif 2015–2024; tiap ibu di kondisi terberatnya",
       x="Ibu (tertimbang)", y=NULL, caption=CAP) + th()

Key takeaway L0: Kohort analisis mencakup 523,092 ibu sampel (≈15,474,978 tertimbang). Mayoritas (38.8%) berada di kelompok persalinan/ANC normal, tetapi beban komplikasi nyata: komplikasi kehamilan lain %, komplikasi intrapartum 11%, dan tiga “killer” obstetrik langsung, eklampsia/PE berat %, perdarahan %, sepsis puerperium %, yang akan menjadi fokus indikator outcome di Pilar F.

1.3 Treatment gap & batas interpretasi data klaim

Keterbatasan utama (wajib diingat di seluruh dokumen). (1) Bukan cakupan sejati. Klaim hanya menangkap layanan yang sampai ke fasilitas dan diklaimkan fee-for-service ke JKN. Sebagian besar ANC dan persalinan normal ditangani bidan/Puskesmas dalam skema kapitasi, sering tidak tercatat sebagai klaim individual, sehingga ANC dan persalinan normal under-captured secara sistematis. (2) Rasio sesar di FKRTL ≠ rasio sesar populasi. Persalinan yang muncul di FKRTL adalah yang dirujuk/berisiko; persalinan vaginal normal di FKTP/bidan sebagian besar tak terlihat → rasio sesar di sini melebih-lebihkan rasio sesar nasional sejati. (3) Kematian maternal under-counted, hanya kematian in-hospital pada admisi maternal yang tertangkap (FKL14=3); kematian setelah pulang atau di luar fasilitas tidak terlihat. (4) Akrual/left-truncation, kohort dibingkai pada kepesertaan terkini, tahun awal under-observed; tahun 2023 ter-load tidak lengkap (~103rb klaim vs ~298rb/389rb di 2022/2024) → jangan over-baca titik 2023.

2 Pilar A, Beban Penyakit & Demografi

① Pilar A · Volume Layanan Maternal · Persalinan Tahunan · Demografi · Distribusi Geografis
Pertanyaan: Seberapa besar volume layanan maternal yang terlayani JKN, bagaimana tren persalinan, profil demografi ibu, dan sebarannya secara geografis.

2.1 Volume layanan maternal & persalinan per tahun

pyt <- A$prev_year_total
dy  <- A$deliveries_year
p1 <- ggplot(pyt, aes(yr, wt_pts)) +
  geom_area(fill=PINK, alpha=.15) + geom_line(color=PINK, linewidth=1.1) + geom_point(color=PINK, size=2) +
  geom_text(aes(label=label_number(scale_cut=cut_short_scale())(wt_pts)), vjust=-0.9, size=2.8, color=NAVY, fontface="bold") +
  annotate("rect", xmin=2022.5, xmax=2023.5, ymin=0, ymax=Inf, fill=AMBER, alpha=.12) +
  annotate("text", x=2023, y=max(pyt$wt_pts)*.45, label="2023 ter-load\ntak lengkap", color=AMBER, size=2.7, fontface="italic", lineheight=.9) +
  yrx() + scale_y_continuous(labels=label_number(scale_cut=cut_short_scale()), limits=c(0, NA), expand=expansion(mult=c(0, .12))) +
  labs(title="Ibu dengan Layanan Maternal Terlayani JKN per Tahun (tertimbang) · Unit: ibu unik/tahun",
       subtitle="Ibu unik dengan ≥1 klaim maternal per tahun (FKTP+FKRTL), proyeksi nasional",
       x=NULL, y="Ibu (tertimbang)", caption=CAP) + th()
dyl <- dy |> transmute(yr, Sesar=wt_cs, Vaginal=wt_vag) |> tidyr::pivot_longer(-yr, names_to="mode", values_to="wt")
p2 <- ggplot(dyl, aes(yr, wt, fill=mode)) + geom_area(alpha=.9, color="white", linewidth=.2) +
  scale_fill_manual(values=c("Sesar"=RED, "Vaginal"=TEAL), name=NULL) +
  yrx() + scale_y_continuous(labels=label_number(scale_cut=cut_short_scale()), expand=expansion(mult=c(0, .05))) +
  labs(title="Persalinan FKRTL per Tahun menurut Mode (tertimbang) · Unit: episode persalinan",
       subtitle="Persalinan di FKRTL/RS (O80–O84), dirujuk/berisiko; persalinan normal bidan/FKTP tak tercakup penuh",
       x=NULL, y="Persalinan (tertimbang)") + th(10)
p1 / p2 + patchwork::plot_layout(heights=c(1,1))

dyt <- A$deliveries_year |> transmute(Tahun=yr, `Persalinan FKRTL (sampel)`=raw_tot,
  `Persalinan FKRTL (tertimbang)`=wt_tot, `Sesar (sampel)`=raw_cs, `Vaginal (sampel)`=raw_vag,
  `Rasio sesar FKRTL (%)`=round(100*raw_cs/(raw_cs+raw_vag),1))
gt::gt(dyt) |>
  gt::tab_header(title=gt::md("**Tabel A.1, Persalinan di FKRTL per Tahun & Mode** · _Unit: Klaim persalinan (O80–O84)_"),
    subtitle=gt::md("_Klaim persalinan FKRTL (≈ episode; deduplikasi ke ibu+tgl masuk menggeser &lt;0,1%); hanya yang muncul di FKRTL (dirujuk/berisiko), bukan total persalinan nasional_")) |>
  gt::fmt_number(columns=2:5, decimals=0, use_seps=TRUE) |>
  gt::data_color(columns=`Rasio sesar FKRTL (%)`, colors=scales::col_numeric(c("#fee2e2", "#b91c1c"), domain=NULL)) |>
  gt::tab_style(style=gt::cell_fill(color="#fef9c3"), locations=gt::cells_body(rows=Tahun==2023)) |>
  gt::tab_source_note(gt::md(paste(CAP, "| Baris 2023 disorot = data ter-load tidak lengkap"))) |> gfmt()
Tabel A.1, Persalinan di FKRTL per Tahun & Mode · Unit: Klaim persalinan (O80–O84)
Klaim persalinan FKRTL (≈ episode; deduplikasi ke ibu+tgl masuk menggeser <0,1%); hanya yang muncul di FKRTL (dirujuk/berisiko), bukan total persalinan nasional
Tahun Persalinan FKRTL (sampel) Persalinan FKRTL (tertimbang) Sesar (sampel) Vaginal (sampel) Rasio sesar FKRTL (%)
2015 5,850 127,927 2,245 3,605 38.4
2016 6,724 157,348 2,677 4,047 39.8
2017 7,577 176,733 2,865 4,712 37.8
2018 26,787 515,120 11,925 14,862 44.5
2019 31,903 876,935 15,804 16,099 49.5
2020 30,953 789,564 16,488 14,465 53.3
2021 31,603 919,688 17,756 13,847 56.2
2022 35,349 1,057,506 20,184 15,165 57.1
2023 16,500 952,822 9,546 6,954 57.9
2024 27,123 1,215,855 16,830 10,293 62.1
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional) | Baris 2023 disorot = data ter-load tidak lengkap
write.csv(dyt, file.path(OUT_DIR, "T_A_1_persalinan_tahun.csv"), row.names=FALSE)

2.2 Struktur usia ibu

t1 <- A$table1 |> filter(char=="Kelompok Usia") |>
  mutate(level=factor(level, levels=c("<20", "20-24", "25-29", "30-34", "35-39", "≥40")))
ggplot(t1, aes(level, Overall)) +
  geom_col(fill=PINK, width=.7) +
  geom_text(aes(label=paste0(Overall, "%")), vjust=-0.4, size=3.2, color=NAVY, fontface="bold") +
  scale_y_continuous(limits=c(0, NA), expand=expansion(mult=c(0, .12))) +
  labs(title="Distribusi Usia Ibu Terlayani Maternal JKN · Unit: ibu unik (% kolom Overall)",
       subtitle="Usia saat kontak maternal pertama; risiko obstetrik meningkat pada <20 th dan ≥35 th",
       x="Kelompok usia", y="% ibu", caption=CAP) + th()

2.3 Distribusi geografis (provinsi tempat tinggal)

isl <- A$geo_island |> filter(island!="Tidak diketahui") |> mutate(island=fct_reorder(island, wt_pts))
ggplot(isl, aes(wt_pts, island)) + geom_col(fill=NAVY, width=.7) +
  geom_text(aes(label=paste0(fmt(wt_pts), " (", pct, "%)")), hjust=-0.05, size=3, color=NAVY, fontface="bold") +
  scale_x_continuous(labels=label_number(scale_cut=cut_short_scale()), expand=expansion(mult=c(0, .2))) +
  labs(title="Sebaran Ibu Terlayani Maternal menurut Pulau · Unit: ibu unik",
       subtitle="Ibu tertimbang berdasarkan provinsi tempat tinggal (PSTV09)", x="Ibu (tertimbang)", y=NULL, caption=CAP) + th()

gtop <- A$geo_prov |> filter(prov_name!="Tidak diketahui") |> head(12) |>
  mutate(Rank=row_number()) |> select(Rank, prov_name, island, wt_pts, pct)
gt::gt(gtop) |>
  gt::cols_label(prov_name="Provinsi", island="Pulau", wt_pts="Ibu (tertimbang)", pct="%") |>
  gt::tab_header(title=gt::md("**Tabel A.2, 12 Provinsi dengan Beban Maternal Terlayani Tertinggi** · _Unit: Ibu unik (tertimbang)_")) |>
  gt::fmt_number(columns=wt_pts, decimals=0, use_seps=TRUE) |>
  gt::data_color(columns=wt_pts, colors=scales::col_numeric(c("#dbeafe", "#1e3a5f"), domain=NULL)) |>
  gt::tab_style(style=list(gt::cell_fill(color="#fef3c7"), gt::cell_text(weight="bold")),
    locations=gt::cells_body(rows=Rank<=3)) |>
  gt::tab_source_note(gt::md(CAP)) |> gfmt()
Tabel A.2, 12 Provinsi dengan Beban Maternal Terlayani Tertinggi · Unit: Ibu unik (tertimbang)
Rank Provinsi Pulau Ibu (tertimbang) %
1 Jawa Barat Jawa 2,469,423 16.0
2 Jawa Tengah Jawa 2,161,986 14.0
3 Jawa Timur Jawa 1,956,949 12.6
4 Sumatera Utara Sumatera 758,807 4.9
5 Sulawesi Selatan Sulawesi 745,421 4.8
6 Banten Jawa 718,958 4.6
7 DKI Jakarta Jawa 668,398 4.3
8 Aceh Sumatera 564,416 3.6
9 Lampung Sumatera 470,861 3.0
10 Sumatera Selatan Sumatera 430,022 2.8
11 Sumatera Barat Sumatera 381,926 2.5
12 Nusa Tenggara Barat Bali-Nusra 372,929 2.4
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional)
Key takeaway A: Volume layanan maternal terklaim meningkat sepanjang periode, mencerminkan campuran ekspansi kepesertaan JKN dan akrual data (tahun awal under-observed; lihat peringatan), bukan semata kenaikan insidens; 2024 = tahun terlengkap (titik paling andal), 2023 ter-load tidak lengkap. Beban terkonsentrasi di Jawa; wilayah timur tampak kecil saat tertimbang karena di-oversample (bobot kecil), sampel mentahnya tidak minim. Mode persalinan FKRTL didominasi sesar, dibahas tuntas (dengan caveat populasi) di Pilar F.

3 Pilar B, FKTP (Layanan Primer)

② Pilar B · Layanan Primer (FKTP/Kapitasi) · ANC primer · Cakupan FKTP↔︎FKRTL
Pertanyaan: Apa peran FKTP/Puskesmas/bidan jejaring sebagai pintu masuk layanan maternal, dan seberapa besar overlap dengan rujukan.
uy <- A$util_year |> mutate(level=factor(level, levels=c("FKTP (Primer)", "FKRTL Rawat Jalan", "FKRTL Rawat Inap")))
ggplot(uy, aes(yr, wt_visits, fill=level)) +
  geom_area(alpha=.9, color="white", linewidth=.2) +
  scale_fill_manual(values=LVL_COLS, name=NULL) +
  yrx() + scale_y_continuous(labels=label_number(scale_cut=cut_short_scale()), expand=expansion(mult=c(0, .05))) +
  labs(title="Volume Kunjungan Maternal per Tingkat Layanan (tertimbang) · Unit: kunjungan",
       subtitle="FKTP (primer/kapitasi) vs FKRTL rawat jalan vs rawat inap, klaim maternal per tahun",
       x=NULL, y="Kunjungan (tertimbang)", caption=CAP) + th()

cov <- A$coverage |> filter(grpc!="Lainnya")
gt::gt(cov) |>
  gt::cols_label(grpc="Pola cakupan layanan", wt="Ibu (tertimbang)", raw="Ibu (sampel)", pct="%") |>
  gt::tab_header(title=gt::md("**Tabel B.1, Cakupan Layanan FKTP vs FKRTL** · _Unit: Perempuan unik (tertimbang)_")) |>
  gt::fmt_number(columns=c(wt, raw), decimals=0, use_seps=TRUE) |>
  gt::data_color(columns=wt, colors=scales::col_numeric(c("#ccfbf1", "#0f766e"), domain=NULL)) |>
  gt::tab_source_note(gt::md(CAP)) |> gfmt()
Tabel B.1, Cakupan Layanan FKTP vs FKRTL · Unit: Perempuan unik (tertimbang)
Pola cakupan layanan Ibu (tertimbang) Ibu (sampel) %
FKTP + FKRTL 9,401,408 319,572 60.8
FKTP saja 3,572,332 132,792 23.1
FKRTL saja 2,501,237 70,728 16.2
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional)
Key takeaway B: Sebagian besar ibu memakai FKTP dan FKRTL atau salah satunya; pola “FKTP saja” menandai layanan maternal primer (ANC, persalinan normal) yang tidak naik ke rujukan, sedangkan “FKRTL saja” menandai ibu yang langsung muncul di RS (rujukan/darurat/persalinan RS). Catatan: kapitasi FKTP membuat banyak ANC/persalinan bidan tak tercatat sebagai klaim individual → cakupan FKTP di sini adalah batas bawah.

4 Pilar C, FKRTL (Rujukan / Rumah Sakit)

③ Pilar C · Rawat Jalan vs Inap · Lama Rawat (LOS) · Kelas & Kepemilikan RS · IGD Obstetrik
Pertanyaan: Bagaimana ibu dilayani di tingkat rujukan, intensitas rawat inap, lama rawat menurut kondisi & kelas RS, dan beban kegawatdaruratan.
los <- A$los |> filter(!is.na(grp)) |> mutate(grp=fct_reorder(as.character(grp), mean_los))
ggplot(los, aes(mean_los, grp, fill=grp)) + geom_col(width=.7) +
  geom_text(aes(label=paste0(mean_los, " hr (n=", fmt(n_inp), ")")), hjust=-0.05, size=2.9, color=NAVY, fontface="bold") +
  scale_fill_manual(values=GRP_COLS, guide="none") +
  scale_x_continuous(limits=c(0, NA), expand=expansion(mult=c(0, .25))) +
  labs(title="Rata-rata Lama Rawat Inap menurut Kelompok Diagnostik · Unit: episode rawat inap",
       subtitle="Episode rawat inap dengan diagnosis maternal (strict); LOS 0–120 hari",
       x="Rata-rata LOS (hari)", y=NULL, caption=CAP) + th()

lc <- A$los_class |> filter(kelas_rs!="Lainnya/Missing")
own <- A$ownership
gt::gt(lc) |>
  gt::cols_label(kelas_rs="Kelas RS", n_inp="Episode inap", mean_los="LOS rata2",
                 median_los="LOS median", q1="Q1", q3="Q3") |>
  gt::tab_header(title=gt::md("**Tabel C.1, Lama Rawat Inap Maternal menurut Kelas RS** · _Unit: Episode rawat inap_"),
    subtitle=gt::md(sprintf("_Kepemilikan: Publik %s%% vs Swasta %s%% kunjungan FKRTL (tertimbang)_",
      round(100*own$wt[own$owner=="Publik"]/sum(own$wt)), round(100*own$wt[own$owner=="Swasta"]/sum(own$wt))))) |>
  gt::fmt_number(columns=c(n_inp), decimals=0, use_seps=TRUE) |>
  gt::fmt_number(columns=c(mean_los, median_los, q1, q3), decimals=1) |>
  gt::data_color(columns=mean_los, colors=scales::col_numeric(c("#dbeafe", "#1e3a5f"), domain=NULL)) |>
  gt::tab_source_note(gt::md(CAP)) |> gfmt()
Tabel C.1, Lama Rawat Inap Maternal menurut Kelas RS · Unit: Episode rawat inap
Kepemilikan: Publik 34% vs Swasta 66% kunjungan FKRTL (tertimbang)
Kelas RS Episode inap LOS rata2 LOS median Q1 Q3
RS Kelas C 281,580 2.2 2.0 1.0 3.0
RS Kelas D 92,555 2.1 2.0 1.0 3.0
RS Kelas B 83,708 2.4 2.0 1.0 3.0
RS Khusus 59,532 2.0 2.0 1.0 3.0
RS Kelas A 6,234 3.3 3.0 2.0 4.0
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional)
eg <- A$emergency_year
ggplot(eg, aes(yr, pct_igd)) + geom_line(color=RED, linewidth=1.1) + geom_point(color=RED, size=2) +
  geom_text(aes(label=paste0(pct_igd, "%")), vjust=-0.8, size=2.8, color=RED, fontface="bold") +
  yrx() + scale_y_continuous(limits=c(0, NA), expand=expansion(mult=c(0, .15))) +
  labs(title="Proporsi Kunjungan Maternal FKRTL Terkode Poli IGD per Tahun · Unit: kunjungan",
       subtitle="Poli IGD (FKL11=7); hanya menangkap kunjungan yang eksplisit terkode IGD, banyak admisi darurat masuk via poli kebidanan → angka ini lantai/under-count, baca sebagai tren relatif",
       x=NULL, y="% kunjungan terkode IGD", caption=CAP) + th()

Key takeaway C: Lama rawat tertinggi pada kelompok berat (eklampsia, sepsis, perdarahan), menandai beban perawatan intensif. Sebagian besar kunjungan maternal FKRTL melalui poli kebidanan; porsi terkode IGD kecil dan kemungkinan under-count presentasi darurat sejati (banyak admisi gawat obstetrik masuk lewat poli kebidanan, bukan kode IGD), gunakan sebagai lantai/tren relatif, bukan estimasi pangsa kedaruratan.

5 Pilar D, Inter: Rujukan & Konektivitas

④ Pilar D · Gate FKTP→FKRTL · Jenis Perujuk · Geografi Rujukan
Pertanyaan: Bagaimana ibu masuk ke layanan rujukan, lewat gate FKTP, siapa perujuknya, dan seberapa jauh rujukan lintas wilayah (krusial untuk rujukan obstetrik darurat).
rt <- A$referrer_type |> filter(raw>=500) |> head(8) |> select(perujuk, raw, pct)
rg <- A$referral_geo
geo <- data.frame(Pola=c("Dalam kabupaten yang sama", "Lintas kabupaten (dalam provinsi)", "Lintas provinsi"),
  Klaim=c(rg$same_kab, rg$cross_kab, rg$cross_prov),
  `%`=round(100*c(rg$same_kab, rg$cross_kab, rg$cross_prov)/rg$tot,1), check.names=FALSE)
gt::gt(rt) |>
  gt::cols_label(perujuk="Jenis perujuk (rawat inap rujukan)", raw="Klaim (sampel)", pct="%") |>
  gt::tab_header(title=gt::md("**Tabel D.1, Jenis Perujuk untuk Rawat Inap Maternal** · _Unit: Klaim rujukan_")) |>
  gt::fmt_number(columns=raw, decimals=0, use_seps=TRUE) |>
  gt::data_color(columns=raw, colors=scales::col_numeric(c("#dbeafe", "#1e3a5f"), domain=NULL)) |>
  gt::tab_source_note(gt::md(CAP)) |> gfmt()
Tabel D.1, Jenis Perujuk untuk Rawat Inap Maternal · Unit: Klaim rujukan
Jenis perujuk (rawat inap rujukan) Klaim (sampel) %
Rumah Sakit 519,702 85.0
Puskesmas 61,675 10.1
Klinik Pratama 19,372 3.2
Dokter Umum 7,936 1.3
Klinik Utama 2,892 0.5
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional)
gt::gt(geo) |>
  gt::tab_header(title=gt::md("**Tabel D.2, Geografi Rujukan Rawat Inap Maternal** · _Unit: Klaim rawat inap rujukan_")) |>
  gt::fmt_number(columns=Klaim, decimals=0, use_seps=TRUE) |>
  gt::data_color(columns=`%`, colors=scales::col_numeric(c("#fef3c7", "#b45309"), domain=NULL)) |>
  gt::tab_source_note(gt::md(paste(CAP, "| Rujukan lintas kab/provinsi = sinyal akses & waktu tempuh, kritis untuk obstetri darurat"))) |> gfmt()
Tabel D.2, Geografi Rujukan Rawat Inap Maternal · Unit: Klaim rawat inap rujukan
Pola Klaim %
Dalam kabupaten yang sama 588,926 96.3
Lintas kabupaten (dalam provinsi) 18,989 3.1
Lintas provinsi 3,803 0.6
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional) | Rujukan lintas kab/provinsi = sinyal akses & waktu tempuh, kritis untuk obstetri darurat
Key takeaway D: Mayoritas rujukan rawat inap maternal berasal dari Puskesmas & RS; rujukan yang keluar kabupaten/provinsi menandai keterbatasan kapasitas obstetrik setempat dan risiko keterlambatan rujukan (delay ketiga model “three delays”), penentu langsung keselamatan ibu pada perdarahan/eklampsia.

6 Pilar E, Geografi Member ↔︎ Faskes

⑤ Pilar E · Tempat Tinggal vs Faskes Terdaftar (kesesuaian kabupaten)
Pertanyaan: Seberapa dekat faskes terdaftar ibu dengan tempat tinggalnya, proksi aksesibilitas layanan maternal primer.
mf <- A$mf_geo
mfp <- A$mf_geo_prov |> left_join(tibble::tibble(prov=A$geo_prov$prov, prov_name=A$geo_prov$prov_name) |> distinct(), by="prov") |>
  filter(!is.na(prov_name)) |> arrange(pct_same_kab) |> head(10) |>
  select(prov_name, members, pct_same_kab)
gt::gt(mfp) |>
  gt::cols_label(prov_name="Provinsi", members="Anggota (sampel)", pct_same_kab="% faskes se-kabupaten") |>
  gt::tab_header(title=gt::md("**Tabel E.1, 10 Provinsi dengan Kesesuaian Tempat Tinggal–Faskes Terendah** · _Unit: Anggota_"),
    subtitle=gt::md(sprintf("_Rata-rata nasional: %s%% se-provinsi, %s%% se-kabupaten (PSTV09/10 vs PSTV13/14)_", mf$same_prov, mf$same_kab))) |>
  gt::fmt_number(columns=members, decimals=0, use_seps=TRUE) |>
  gt::data_color(columns=pct_same_kab, colors=scales::col_numeric(c("#fee2e2", "#16a34a"), domain=NULL)) |>
  gt::tab_source_note(gt::md(CAP)) |> gfmt()
Tabel E.1, 10 Provinsi dengan Kesesuaian Tempat Tinggal–Faskes Terendah · Unit: Anggota
Rata-rata nasional: 96.5% se-provinsi, 89.6% se-kabupaten (PSTV09/10 vs PSTV13/14)
Provinsi Anggota (sampel) % faskes se-kabupaten
Tidak diketahui 196 0.0
Papua 24,797 79.4
DKI Jakarta 43,315 82.5
Sumatera Utara 78,894 85.8
Papua Barat 13,857 85.8
Bali 25,393 86.2
Maluku 11,336 86.9
DI Yogyakarta 15,696 87.0
Maluku Utara 12,446 87.6
Banten 47,497 88.3
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional)
Key takeaway E: Nasional 89.6% ibu terdaftar di faskes se-kabupaten dengan domisilinya. Provinsi dengan kesesuaian rendah menandai “service desert” maternal, ibu harus menempuh jarak lebih jauh untuk ANC/persalinan, faktor risiko keterlambatan akses.

7 Pilar F, Proses & Outcome Maternal

⑥ Pilar F · Mode Persalinan & Sesar (tren + Robson) · ANC (trimester, lintas FKTP+FKRTL) · PNC · Morbiditas Berat · Kematian · Validasi Literatur
Pertanyaan inti (jantung laporan): Indikator proses & outcome maternal yang diakui internasional (WHO ANC, ENAP/EPMM, OECD obstetrik) yang dapat dihitung dari klaim, rasio sesar, kontak ANC, kunjungan nifas, morbiditas berat (PE/eklampsia, perdarahan, sepsis), serta kematian & near-miss maternal.

7.1 Mode persalinan & rasio sesar

Peringatan rasio sesar (wajib). Angka utama dalam dokumen ini adalah tertimbang (proyeksi nasional, PSTV15): rasio sesar di antara persalinan FKRTL = 60.2% (tertimbang) / 52.8% (sampel mentah). Ini BUKAN rasio sesar populasi Indonesia (SDKI 2017 ≈ 17%; tren naik). Persalinan FKRTL didominasi kasus dirujuk/berisiko/elektif-sesar, sedangkan persalinan vaginal normal sebagian besar ditangani bidan/Puskesmas (kapitasi) dan tak muncul sebagai klaim FKRTL. Identifikasi persalinan/sesar memakai kode persalinan terselesaikan (O80–O84/O82): persalinan yang diadmisi dengan kode komplikasi sebagai diagnosis masuk dikelompokkan pada komplikasinya, sehingga definisi diterapkan konsisten antar-strata tetapi bukan total persalinan absolut. Interpretasikan sebagai case-mix RS, bukan cakupan populasi.
dm <- A$delivery_mode |> filter(!is.na(mode)) |> mutate(mode=fct_reorder(mode, wt), pct=round(100*wt/sum(wt),1))
ggplot(dm, aes(wt, mode, fill=grepl("Sesar", mode))) + geom_col(width=.7) +
  geom_text(aes(label=paste0(fmt(wt), " (", pct, "%)")), hjust=-0.05, size=3, color=NAVY, fontface="bold") +
  scale_fill_manual(values=c(`TRUE`=RED, `FALSE`=TEAL), guide="none") +
  scale_x_continuous(labels=label_number(scale_cut=cut_short_scale()), expand=expansion(mult=c(0, .22))) +
  labs(title="Distribusi Mode Persalinan di FKRTL · Unit: klaim persalinan (O80–O84, tertimbang)",
       subtitle=sprintf("Rasio sesar FKRTL = %s%% tertimbang (%s%% sampel), case-mix rujukan RS, BUKAN rasio sesar populasi",
         round(A$cs_rate_overall$cs_pct_wt,1), round(A$cs_rate_overall$cs_pct,1)),
       x="Persalinan (tertimbang)", y=NULL, caption=CAP) + th()

css <- A$cs_rate_segment |> filter(segmen!="Missing")
ggplot(css, aes(segmen, cs_pct_wt, fill=segmen)) + geom_col(width=.55) +
  geom_text(aes(label=paste0(cs_pct_wt, "%\n(n sampel=", fmt(deliv), ")")), vjust=-0.3, size=3, color=NAVY, fontface="bold", lineheight=.85) +
  scale_fill_manual(values=c("Non-PBI"=RED, "PBI (Disubsidi)"=TEAL), guide="none") +
  scale_y_continuous(limits=c(0, NA), expand=expansion(mult=c(0, .2))) +
  labs(title="Rasio Sesar FKRTL menurut Segmen Kepesertaan · Unit: klaim persalinan (tertimbang)",
       subtitle="Non-PBI (mampu bayar/PPU/mandiri) vs PBI (disubsidi), proksi gradien sosioekonomi akses sesar; % tertimbang",
       x=NULL, y="% sesar di antara persalinan FKRTL (tertimbang)", caption=CAP) + th()

csc <- A$cs_rate_class |> filter(deliv>=500) |> select(kelas_rs, cs, deliv, cs_pct_wt, cs_pct)
gt::gt(csc) |>
  gt::cols_label(kelas_rs="Kelas RS", cs="Sesar (sampel)", deliv="Persalinan (sampel)",
                 cs_pct_wt="Rasio sesar (% tertimbang)", cs_pct="(% sampel)") |>
  gt::tab_header(title=gt::md("**Tabel F.1, Rasio Sesar FKRTL menurut Kelas RS** · _Unit: Klaim persalinan_")) |>
  gt::fmt_number(columns=c(cs, deliv), decimals=0, use_seps=TRUE) |>
  gt::data_color(columns=cs_pct_wt, colors=scales::col_numeric(c("#fee2e2", "#b91c1c"), domain=NULL)) |>
  gt::tab_source_note(gt::md(paste(CAP, "| Benchmark WHO: rasio sesar populasi optimal 10–15% (tidak langsung dibandingkan ke case-mix RS ini)"))) |> gfmt()
Tabel F.1, Rasio Sesar FKRTL menurut Kelas RS · Unit: Klaim persalinan
Kelas RS Sesar (sampel) Persalinan (sampel) Rasio sesar (% tertimbang) (% sampel)
RS Kelas C 73,734 132,054 64.3 55.8
RS Kelas D 15,770 31,818 56.9 49.6
RS Kelas B 14,082 31,815 50.2 44.3
RS Khusus/Lainnya 11,832 22,922 55.9 51.6
RS Kelas A 902 1,760 55.5 51.3
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional) | Benchmark WHO: rasio sesar populasi optimal 10–15% (tidak langsung dibandingkan ke case-mix RS ini)
write.csv(A$cs_rate_prov |> select(prov_name, island, cs, deliv, cs_pct, cs_pct_wt), file.path(OUT_DIR, "T_F_csrate_provinsi.csv"), row.names=FALSE)

7.2 Tren rasio sesar FKRTL per tahun (vs benchmark)

cy <- A$cs_rate_year
ggplot(cy, aes(yr, cs_pct_wt)) +
  annotate("rect", xmin=2014.5, xmax=2024.5, ymin=10, ymax=15, fill=GREEN, alpha=.12) +
  annotate("text", x=2016, y=13, label="WHO 10–15% (populasi)", color=GREEN, size=2.8, fontface="italic") +
  geom_hline(yintercept=17, linetype="dashed", color=GREY, linewidth=.5) +
  annotate("text", x=2016, y=19, label="Pop. Indonesia ~17–18% (SDKI 2017)", color=GREY, size=2.8, fontface="italic") +
  geom_hline(yintercept=38, linetype="dotted", color=BLUE, linewidth=.5) +
  annotate("text", x=2017, y=40, label="BPJS klaim (Robson, 2017–18) ~37–39%", color=BLUE, size=2.8, fontface="italic") +
  geom_line(color=RED, linewidth=1.2) + geom_point(color=RED, size=2.4) +
  geom_text(aes(label=paste0(cs_pct_wt, "%")), vjust=-0.9, size=2.9, color=RED, fontface="bold") +
  yrx() + scale_y_continuous(limits=c(0, NA), expand=expansion(mult=c(0, .12))) +
  labs(title="Tren Rasio Sesar di antara Persalinan FKRTL, 2015–2024 (tertimbang) · Unit: episode persalinan",
       subtitle="Rasio sesar FKRTL naik tajam sepanjang periode; jauh di atas rasio populasi (case-mix rujukan). 2023 ter-load tidak lengkap.",
       x=NULL, y="% sesar di antara persalinan FKRTL (tertimbang)", caption=CAP) + th()

write.csv(cy, file.path(OUT_DIR, "T_F_csrate_tahun.csv"), row.names=FALSE)
Key takeaway tren sesar: Rasio sesar di antara persalinan FKRTL meningkat dari 49.5% (2015) ke 66% (2024, tertimbang), kenaikan tajam yang konsisten dengan tren naik sesar nasional dan studi klaim BPJS. Tetap diingat: ini case-mix rujukan RS (bukan populasi); kenaikan sebagian mencerminkan pergeseran komposisi kasus yang dirujuk ke RS dan perubahan praktik, bukan semata indikasi medis.

7.3 Audit sesar Robson tergeneralisasi (proksi klaim)

Klasifikasi Robson (proksi)
Robson Ten-Group Classification System (TGCS) adalah standar WHO untuk audit sesar dan metode yang direkomendasikan untuk klaim BPJS (studi nasional klaim BPJS, medRxiv 2024). Klaim tidak mengkode paritas dan onset persalinan (induksi/spontan), sehingga grup 1–4 digabung; kelompok yang dapat diidentifikasi: bekas sesar (R5; O34.2), presentasi sungsang/abnormal (R6-7-9; O32/O32.1), kehamilan multipel (R8; O30/O84), dan preterm (R10; O60). Bersifat proksi level-ibu, bukan tabel Robson tervalidasi per-persalinan.
rb <- A$robson |> mutate(robson=fct_reorder(robson, n_deliv))
ggplot(rb, aes(n_deliv, robson)) +
  geom_col(aes(fill=cs_pct), width=.7) +
  geom_text(aes(label=paste0(fmt(n_deliv), " | sesar ", cs_pct, "% | ", grp_share, "% kontribusi")), hjust=-0.03, size=2.8, color=NAVY, fontface="bold") +
  scale_fill_gradient(low="#fca5a5", high="#7f1d1d", name="Rasio sesar (%)") +
  scale_x_continuous(labels=label_number(scale_cut=cut_short_scale()), expand=expansion(mult=c(0, .42))) +
  labs(title="Dekomposisi Robson (proksi) Persalinan FKRTL: Rasio Sesar per Kelompok · Unit: ibu bersalin (sampel)",
       subtitle="Warna = rasio sesar kelompok. Bekas sesar (R5) hampir 100% sesar; kelompok term-sefalik (R1-4, kontribusi terbesar) = target audit utama",
       x="Ibu bersalin (sampel)", y=NULL, caption=CAP) + th()

write.csv(A$robson, file.path(OUT_DIR, "T_F_robson.csv"), row.names=FALSE)

Key takeaway Robson: Rasio sesar didominasi R5 bekas sesar (98.7% sesar), sekali sesar hampir pasti sesar berulang, serta presentasi abnormal & multipel. Namun kontribusi terbesar datang dari R1-4 (term, sefalik, tunggal; 79% persalinan, sesar 56.9%), inilah kelompok yang secara klinis paling bisa dikurangi melalui audit indikasi & dukungan persalinan normal terbantu. Pola ini cermin studi klaim BPJS nasional (kontributor utama: bekas sesar, induksi/gagal kemajuan). Keterbatasan: paritas & onset persalinan tak terkode → R1-4 tak terurai.

7.4 Antenatal care (ANC), lintas FKTP + FKRTL, per trimester & kelompok

Peringatan ANC (wajib). Indikator ANC dihitung per episode persalinan FKRTL, dengan kontak ANC dihitung lintas FKTP dan FKRTL dalam ~300 hari sebelum persalinan. Trimester ditaksir dari jarak-hari-ke-persalinan (proksi usia gestasi, anchor 40 minggu: T1 = 189–300 hr, T2 = 92–188 hr, T3 = 1–91 hr). Proksi ini memusatkan kontak dekat-persalinan & preterm ke T3 sehingga membesar-besarkan T3 relatif terhadap T1, pembandingan ke pola WHO 1/2/5 bersifat indikatif (menunjukkan “perawatan terlambat & back-loaded”), bukan ukuran trimester presisi (butuh LMP/HPHT yang tak tersedia). Karena ANC rutin oleh bidan/Puskesmas dalam kapitasi sebagian besar tak terekam sebagai klaim individual, angka ini jauh di bawah cakupan sejati (SKI 2023: K1 96,9%, K4 68,1%, K6 17,6%) dan harus dibaca sebagai kontinuitas yang terekam JKN, bukan cakupan ANC.
ai <- A$anc_ind
ancL <- data.frame(
  Indikator=c("≥1 kontak (proksi K1)", "≥4 kontak (proksi K4)", "≥6 kontak (proksi K6, standar Indonesia)",
              "≥8 kontak (WHO 2016)", "Inisiasi dini (kontak pertama di Trimester 1)", "Ada kontak di ketiga trimester",
              "Tanpa kontak ANC terklaim"),
  `JKN terkapture (%)`=c(ai$k1, ai$k4, ai$k6, ai$anc8, ai$early_t1, ai$all3trim, ai$zero),
  `Benchmark nasional (SKI 2023 / WHO)`=c("K1 96,9%", "K4 68,1%", "K6 17,6%", "WHO ≥8", "T1 inisiasi (target dini)", "distribusi 1/2/5", ", "),
  check.names=FALSE)
gt::gt(ancL) |>
  gt::tab_header(title=gt::md("**Tabel F.2, Indikator ANC Strategis (terkapture JKN) vs Benchmark** · _Unit: Episode persalinan FKRTL_"),
    subtitle=gt::md(sprintf("_Kontak lintas FKTP+FKRTL, ~300 hr pra-persalinan; n=%s episode; %s%% kontak terjadi di FKTP_", fmt(ai$n_ep), ai$pct_at_fktp))) |>
  gt::fmt_number(columns=2, decimals=1) |>
  gt::data_color(columns=2, colors=scales::col_numeric(c("#fee2e2", "#16a34a"), domain=c(0,100))) |>
  gt::tab_source_note(gt::md(paste(CAP, "| Benchmark cakupan nasional dari survei (SKI 2023), JKN-claims jauh lebih rendah karena ANC kapitasi tak terklaim; bandingkan POLA, bukan level absolut"))) |> gfmt()
Tabel F.2, Indikator ANC Strategis (terkapture JKN) vs Benchmark · Unit: Episode persalinan FKRTL
Kontak lintas FKTP+FKRTL, ~300 hr pra-persalinan; n=220,150 episode; 80.3% kontak terjadi di FKTP
Indikator JKN terkapture (%) Benchmark nasional (SKI 2023 / WHO)
≥1 kontak (proksi K1) 65.3 K1 96,9%
≥4 kontak (proksi K4) 24.3 K4 68,1%
≥6 kontak (proksi K6, standar Indonesia) 12.2 K6 17,6%
≥8 kontak (WHO 2016) 5.7 WHO ≥8
Inisiasi dini (kontak pertama di Trimester 1) 14.4 T1 inisiasi (target dini)
Ada kontak di ketiga trimester 9.5 distribusi 1/2/5
Tanpa kontak ANC terklaim 34.7 ,
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional) | Benchmark cakupan nasional dari survei (SKI 2023), JKN-claims jauh lebih rendah karena ANC kapitasi tak terklaim; bandingkan POLA, bukan level absolut
at <- A$anc_trim |> tidyr::pivot_longer(c(mean_contacts, who_target), names_to="seri", values_to="val") |>
  mutate(seri=recode(seri, mean_contacts="Rerata kontak terkapture JKN", who_target="Target WHO 2016 (1/2/5)"))
p_trim <- ggplot(at, aes(trimester, val, fill=seri)) +
  geom_col(position="dodge", width=.6) +
  geom_text(aes(label=val), position=position_dodge(.6), vjust=-0.3, size=3, color=NAVY, fontface="bold") +
  scale_fill_manual(values=c("Rerata kontak terkapture JKN"=BLUE, "Target WHO 2016 (1/2/5)"=GREEN), name=NULL) +
  scale_y_continuous(limits=c(0, NA), expand=expansion(mult=c(0, .14))) +
  labs(title="Rerata Kontak ANC per Trimester vs Target WHO · Unit: kontak/episode",
       subtitle="Kontak ANC terklaim terkonsentrasi di Trimester 3 (terlambat); inisiasi Trimester 1 sangat rendah, pola 'too little, too late'",
       x=NULL, y="Rerata kontak per episode", caption=CAP) + th()

pat <- A$anc_pattern |> mutate(wk=as.numeric(dbd_hi), wt=as.numeric(n_contacts))
p_pat <- ggplot(pat, aes(wk, wt)) +
  geom_col(fill=TEAL, width=24) +
  scale_x_reverse(breaks=c(0,91,188,300), labels=c("persalinan", "91 (T3)", "188 (T2)", "300 (T1)")) +
  scale_y_continuous(labels=label_number(scale_cut=cut_short_scale())) +
  labs(title="Pola Waktu Kontak ANC (jarak hari ke persalinan)", subtitle="Kontak menumpuk dekat persalinan (T3); sedikit di trimester awal",
       x="Hari sebelum persalinan", y="Jumlah kontak ANC") + th(10)
p_trim / p_pat + patchwork::plot_layout(heights=c(1,0.9))

abs <- A$anc_by_seg |> filter(segmen!="Missing") |> select(segmen, n_ep, mean_anc, k4, k6, early_t1)
abi <- A$anc_by_island
gt::gt(abs) |>
  gt::cols_label(segmen="Segmen", n_ep="Episode", mean_anc="Rerata kontak", k4="≥4 (%)", k6="≥6 (%)", early_t1="Inisiasi T1 (%)") |>
  gt::tab_header(title=gt::md("**Tabel F.3a, ANC menurut Segmen Kepesertaan** · _Unit: Episode persalinan_")) |>
  gt::fmt_number(columns=n_ep, decimals=0, use_seps=TRUE) |>
  gt::fmt_number(columns=c(mean_anc, k4, k6, early_t1), decimals=1) |>
  gt::data_color(columns=k4, colors=scales::col_numeric(c("#fee2e2", "#16a34a"), domain=NULL)) |>
  gt::tab_source_note(gt::md(CAP)) |> gfmt()
Tabel F.3a, ANC menurut Segmen Kepesertaan · Unit: Episode persalinan
Segmen Episode Rerata kontak ≥4 (%) ≥6 (%) Inisiasi T1 (%)
PBI (Disubsidi) 88,932 2.3 25.2 12.7 13.5
Non-PBI 131,214 2.2 23.6 11.9 14.9
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional)
gt::gt(abi) |>
  gt::cols_label(island="Pulau", n_ep="Episode", k4="≥4 kontak ANC (%)") |>
  gt::tab_header(title=gt::md("**Tabel F.3b, ANC (≥4 kontak terkapture) menurut Pulau** · _Unit: Episode persalinan_")) |>
  gt::fmt_number(columns=n_ep, decimals=0, use_seps=TRUE) |>
  gt::fmt_number(columns=k4, decimals=1) |>
  gt::data_color(columns=k4, colors=scales::col_numeric(c("#fee2e2", "#16a34a"), domain=NULL)) |>
  gt::tab_source_note(gt::md(paste(CAP, "| Pola geografis: Jawa tertinggi, Maluku-Papua terendah, cermin gradien akses ANC survei"))) |> gfmt()
Tabel F.3b, ANC (≥4 kontak terkapture) menurut Pulau · Unit: Episode persalinan
Pulau Episode n_k4 ≥4 kontak ANC (%)
Jawa 79,362 27155 34.2
Bali-Nusra 16,888 3960 23.4
Sulawesi 32,259 7367 22.8
Kalimantan 17,847 4022 22.5
Sumatera 57,558 9215 16.0
Maluku-Papua 16,192 1718 10.6
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional) | Pola geografis: Jawa tertinggi, Maluku-Papua terendah, cermin gradien akses ANC survei

Key takeaway ANC: Dari kontak ANC yang terklaim JKN, hanya 24.3% mencapai ≥4 kontak (proksi K4) dan 12.2% ≥6 (standar K6 Indonesia), jauh di bawah cakupan survei (K4 68,1%, K6 17,6%; SKI 2023), didominasi celah kapitasi (80.3% kontak terjadi di FKTP, tempat ANC bidan/Puskesmas tak terklaim individual). Yang tetap informatif: pola temporal, inisiasi Trimester 1 hanya 14.4% dan kontak menumpuk di Trimester 3 (“too little, too late”), serta gradien geografis (Jawa > Indonesia Timur) yang cermin disparitas akses ANC pada survei nasional, sinyal valid meski levelnya under-captured.

7.5 Kunjungan nifas (PNC), jadwal WHO, lintas FKTP + FKRTL

Peringatan PNC (definisi, wajib). Jendela PNC di bawah dihitung sejak PULANG dari persalinan (bukan sejak lahir). Akibatnya kontak nifas ≤2 hari dalam fasilitas (KF1 segera, 6–48 jam pasca-lahir) sudah terbungkus dalam klaim admisi persalinan dan TIDAK muncul sebagai kontak terpisah → bucket “≤2 hari pasca-pulang” secara struktural mendekati kosong dan tidak boleh dibandingkan langsung ke target EPMM PNC-dini 80%. Angka ini = follow-up nifas pasca-pulang yang terklaim terpisah, bukan cakupan KF1.
pn <- A$pnc_ind
pnL <- data.frame(
  Jendela=factor(c("≤2 hr pasca-pulang", "3–7 hr", "8–28 hr", "29–42 hr"),
                 levels=c("≤2 hr pasca-pulang", "3–7 hr", "8–28 hr", "29–42 hr")),
  pct=c(pn$pnc_2d, pn$pnc_3_7d, pn$pnc_8_28d, pn$pnc_29_42d))
ggplot(pnL, aes(Jendela, pct, fill=Jendela)) + geom_col(width=.62) +
  geom_text(aes(label=paste0(pct, "%")), vjust=-0.4, size=3.2, color=NAVY, fontface="bold") +
  scale_fill_manual(values=c(GREY, AMBER, BLUE, TEAL), guide="none") +
  scale_y_continuous(limits=c(0, NA), expand=expansion(mult=c(0, .14))) +
  labs(title="Follow-up Nifas (PNC) Terklaim Pasca-Pulang menurut Jendela Waktu · Unit: episode persalinan",
       subtitle=sprintf("≥1 follow-up nifas terekam: %s%%; %s%% di FKTP. ⚠ KF1 dalam-fasilitas (≤2 hr pasca-lahir) terbungkus klaim persalinan → bucket ≤2 hr pasca-pulang struktural rendah", pn$any_pnc, pn$pct_at_fktp),
       x="Jendela waktu pasca-PULANG", y="% episode dengan kontak", caption=CAP) + th()

Key takeaway PNC: Hanya 21.1% episode persalinan memiliki follow-up nifas terklaim terpisah pasca-pulang dalam 42 hari, didominasi under-capture kapitasi (52.6% di FKTP) dan oleh bundling KF1 dalam admisi persalinan (sehingga PNC dini tampak rendah secara artefaktual; jangan baca terhadap target EPMM 80%). Kontinuitas nifas terpisah yang terekam JKN rendah; penguatan pencatatan KF1–KF3 (terutama via kapitasi/bidan) diperlukan agar kontinuitas nifas dapat dipantau.

7.6 Morbiditas obstetrik berat (the “near-miss drivers”)

mb <- A$morbidity |> filter(!grepl("Pernah persalinan", kondisi)) |> mutate(kondisi=fct_reorder(kondisi, n_pts))
ggplot(mb, aes(n_pts, kondisi)) + geom_col(fill=PINK, width=.7) +
  geom_text(aes(label=paste0(fmt(n_pts), " (", pct, "%)")), hjust=-0.05, size=2.9, color=NAVY, fontface="bold") +
  scale_x_continuous(labels=label_number(scale_cut=cut_short_scale()), expand=expansion(mult=c(0, .2))) +
  labs(title="Prevalensi Morbiditas Obstetrik di Kohort Maternal JKN · Unit: ibu unik",
       subtitle="% dari seluruh ibu kohort dengan kondisi tercatat (sampel mentah); penyebab langsung kematian ibu disorot di bawah",
       x="Ibu (sampel)", y=NULL, caption=CAP) + th()

write.csv(A$morbidity, file.path(OUT_DIR, "T_F_morbiditas.csv"), row.names=FALSE)
Key takeaway morbiditas (vs literatur): Urutan beban morbiditas berat di kohort, hipertensi/PE (6%), perdarahan obstetrik (%), dan sepsis/puerperium (2.1%), cermin pola penyebab langsung kematian maternal Indonesia (Syairaji dkk. 2024: hipertensi ~23%, perdarahan ~25%, sepsis ~5%) dan global (Say dkk. 2014: perdarahan 27%, hipertensi 14%, sepsis 11%). Penonjolan hipertensi/PE konsisten dengan temuan Indonesia bahwa gangguan hipertensi kehamilan meningkat sebagai penyebab langsung. Klaim menangkap morbiditas (bukan sebab kematian); kesesuaian urutan ini memperkuat validitas konstruk definisi kasus. Catatan: di kohort FKRTL (rujukan), hipertensi yang tercatat condong ke PE berat/eklampsia, HT gestasional ringan umumnya dikelola di FKTP dan tak terkode di sini, sehingga rasio “berat” tampak tinggi (case-mix rujukan).

7.7 Kematian & near-miss maternal

Peringatan kematian maternal (wajib). Hanya kematian in-hospital pada admisi maternal (FKL14=3) yang tertangkap. Kematian setelah pulang, di rumah, atau di perjalanan rujukan tidak terlihat → angka di bawah adalah batas bawah, bukan Maternal Mortality Ratio (MMR) sejati. MMR nasional (SUPAS 2015 ≈305/100.000 kelahiran hidup) tidak dapat direplikasi dari klaim.
md <- A$mat_death_overall; mp <- A$mmr_proxy
nm <- A$near_miss
mmr_facility <- round(mp$deaths/mp$deliveries*1e5,0)
dtab <- data.frame(
  Indikator=c("Kematian maternal in-hospital (sampel)", "Kematian maternal in-hospital (tertimbang)",
              "Persalinan FKRTL (sampel, denominator)", "Rasio kematian in-facility per 100.000 persalinan FKRTL (proksi)",
              "Near-miss proksi (inap, komplikasi berat + severity-4/meninggal)"),
  Nilai=c(fmt(md$raw_deaths), fmt(md$wt_deaths), fmt(mp$deliveries), fmt(mmr_facility), fmt(nm$near_miss)))
gt::gt(dtab) |>
  gt::tab_header(title=gt::md("**Tabel F.2, Kematian & Near-Miss Maternal (in-facility, proksi)** · _Unit: Klaim/ibu_"),
    subtitle=gt::md("_Batas bawah, hanya kematian in-hospital pada admisi maternal; BUKAN MMR nasional_")) |>
  gt::tab_source_note(gt::md(paste(CAP, "| FKL14=3 = meninggal. 'Near-miss proksi' = definisi operasional klaim (rawat inap kelompok eklampsia/perdarahan/sepsis dengan severity INA-CBG tertinggi atau meninggal), BUKAN kriteria WHO maternal near-miss berbasis disfungsi organ, tidak dapat dibandingkan langsung"))) |> gfmt()
Tabel F.2, Kematian & Near-Miss Maternal (in-facility, proksi) · Unit: Klaim/ibu
Batas bawah, hanya kematian in-hospital pada admisi maternal; BUKAN MMR nasional
Indikator Nilai
Kematian maternal in-hospital (sampel) 287
Kematian maternal in-hospital (tertimbang) 7,595
Persalinan FKRTL (sampel, denominator) 220,369
Rasio kematian in-facility per 100.000 persalinan FKRTL (proksi) 130
Near-miss proksi (inap, komplikasi berat + severity-4/meninggal) 859
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional) | FKL14=3 = meninggal. ‘Near-miss proksi’ = definisi operasional klaim (rawat inap kelompok eklampsia/perdarahan/sepsis dengan severity INA-CBG tertinggi atau meninggal), BUKAN kriteria WHO maternal near-miss berbasis disfungsi organ, tidak dapat dibandingkan langsung
## Pisahkan kelompok obstetrik spesifik (penyebab langsung) dari kelompok non-spesifik
## ("Persalinan & ANC Normal", "Komplikasi Kehamilan Lain") yang TIDAK menunjukkan sebab kematian.
NONSPEC <- c("Persalinan & ANC Normal (O80-84, O09, Z3x)", "Komplikasi Kehamilan Lain (O20-O48, O92-99)")
dc <- A$death_cause |> filter(!is.na(grp), grp!="Lainnya") |>
  mutate(spesifik=ifelse(grp %in% NONSPEC, "Non-spesifik (kode bukan sebab langsung)", "Penyebab langsung obstetrik"),
         grp=fct_reorder(grp, raw))
ggplot(dc, aes(raw, grp, fill=spesifik)) + geom_col(width=.7) +
  geom_text(aes(label=raw), hjust=-0.1, size=3, color=NAVY, fontface="bold") +
  scale_fill_manual(values=c("Penyebab langsung obstetrik"=RED, "Non-spesifik (kode bukan sebab langsung)"=GREY), name=NULL) +
  scale_x_continuous(expand=expansion(mult=c(0, .12))) +
  labs(title="Kematian Maternal In-Hospital menurut Kelompok Diagnostik Terberat Tercatat · Unit: kematian (sampel)",
       subtitle="Klaim TIDAK mengonfirmasi sebab kematian. Kelompok abu-abu = kode non-spesifik (mis. admisi persalinan/komplikasi lain), \nbukan penyebab langsung; di antara penyebab langsung, eklampsia/PE berat, perdarahan, & sepsis menonjol",
       x="Kematian (sampel)", y=NULL, caption=CAP) + th()

Key takeaway F: Tercatat 287 kematian maternal in-hospital (≈130/100.000 persalinan FKRTL, proksi in-facility, batas bawah, bukan MMR). Klaim tidak mengonfirmasi sebab kematian; namun di antara kelompok diagnostik spesifik, pola konsisten dengan penyebab langsung utama global, eklampsia/PE berat, perdarahan, sepsis (sebagian kematian terkode pada kelompok non-spesifik seperti “persalinan/komplikasi lain”, mencerminkan batas koding, bukan sebab tersertifikasi). Kelompok-kelompok ini umumnya responsif terhadap deteksi dini ANC, rujukan tepat waktu (Pilar D), dan kapasitas obstetrik emergensi (PONEK), hipotesis kebijakan, bukan temuan kausal.

7.8 Validasi terhadap literatur & benchmark

Tabel ini menyandingkan angka kunci yang dihitung dari klaim JKN dengan benchmark literatur/survei, dan menilai konsistensinya. Prinsip: klaim = populasi terlayani & terklaim, diharapkan menyimpang sistematis dari angka populasi survei (ANC/persalinan under-capture kapitasi; rasio sesar FKRTL over-estimate populasi). Konsistensi dinilai pada arah/pola, bukan kesetaraan level.
val <- tibble::tribble(
  ~Indikator, ~`Hasil (klaim JKN)`, ~`Benchmark literatur`, ~`Penilaian`,
  "Rasio sesar FKRTL (tertimbang)", sprintf("%.1f%%", A$cs_rate_overall$cs_pct_wt),
    "Pop. ~17–18,5% (SDKI 2017); klaim BPJS 37–39% (Robson, medRxiv 2024); seri RS rujukan 40–65%",
    "KONSISTEN, di atas all-claims karena terbatas FKRTL (rujukan); dalam rentang seri RS rujukan",
  "Robson R5 (bekas sesar) rasio sesar", sprintf("%.1f%%", A$robson$cs_pct[grepl("R5", A$robson$robson)]),
    "Bekas sesar = kontributor utama sesar (studi klaim BPJS); sesar berulang mendekati universal",
    "KONSISTEN, bekas sesar hampir selalu sesar",
  "Gradien sesar PBI vs Non-PBI", sprintf("%.1f%% vs %.1f%%", A$cs_rate_segment$cs_pct_wt[A$cs_rate_segment$segmen=="PBI (Disubsidi)"], A$cs_rate_segment$cs_pct_wt[A$cs_rate_segment$segmen=="Non-PBI"]),
    "Sesar pro-kaya (SDKI 2017: termiskin 6,1% → terkaya 32,0%; concentration index +0,31)",
    "KONSISTEN, PBI (lebih miskin) < Non-PBI",
  "ANC ≥4 (terkapture)", sprintf("%.1f%%", A$anc_ind$k4),
    "K4 nasional 68,1% (SKI 2023)", "DIHARAPKAN LEBIH RENDAH, ANC kapitasi tak terklaim (under-capture)",
  "Morbiditas: urutan HT/perdarahan/sepsis", "HT > perdarahan > sepsis",
    "Penyebab langsung Indonesia (Syairaji 2024): perdarahan ~25%, HT ~23%, sepsis ~5%",
    "KONSISTEN (pola), HT & perdarahan dominan",
  "MMR / kematian maternal", sprintf("%s in-hospital (proksi ~%s/100k persalinan FKRTL)", fmt(A$mat_death_overall$raw_deaths), fmt(round(A$mmr_proxy$deaths/A$mmr_proxy$deliveries*1e5))),
    "MMR nasional: SUPAS 2015 = 305; Sensus 2020 = 189; WHO/UN 2020 = 173/100k (kelahiran hidup)",
    "TAK SETARA, hanya in-hospital, bukan MMR populasi; batas bawah")
gt::gt(val) |>
  gt::tab_header(title=gt::md("**Tabel F.4, Validasi Hasil terhadap Literatur/Benchmark**"),
    subtitle=gt::md("_Konsistensi dinilai pada arah/pola; divergensi level dari survei adalah artefak lensa klaim (lihat caveat)_")) |>
  gt::tab_style(style=gt::cell_text(size=gt::px(10.5)), locations=gt::cells_body()) |>
  gt::tab_source_note(gt::md("Sumber benchmark: SDKI/IDHS 2017; SKI 2023 (BKPK Kemenkes); studi Robson klaim BPJS (medRxiv 2024, doi 10.1101/2024.04.18.24306050); Syairaji dkk. 2024 (BMC Pregnancy Childbirth, PMID 39080562); Say dkk. 2014 (Lancet Glob Health); WHO/UN Trends in Maternal Mortality 2000–2020.")) |> gfmt()
Tabel F.4, Validasi Hasil terhadap Literatur/Benchmark
Konsistensi dinilai pada arah/pola; divergensi level dari survei adalah artefak lensa klaim (lihat caveat)
Indikator Hasil (klaim JKN) Benchmark literatur Penilaian
Rasio sesar FKRTL (tertimbang) 60.2% Pop. ~17–18,5% (SDKI 2017); klaim BPJS 37–39% (Robson, medRxiv 2024); seri RS rujukan 40–65% KONSISTEN, di atas all-claims karena terbatas FKRTL (rujukan); dalam rentang seri RS rujukan
Robson R5 (bekas sesar) rasio sesar 98.7% Bekas sesar = kontributor utama sesar (studi klaim BPJS); sesar berulang mendekati universal KONSISTEN, bekas sesar hampir selalu sesar
Gradien sesar PBI vs Non-PBI 56.6% vs 62.4% Sesar pro-kaya (SDKI 2017: termiskin 6,1% → terkaya 32,0%; concentration index +0,31) KONSISTEN, PBI (lebih miskin) < Non-PBI
ANC ≥4 (terkapture) 24.3% K4 nasional 68,1% (SKI 2023) DIHARAPKAN LEBIH RENDAH, ANC kapitasi tak terklaim (under-capture)
Morbiditas: urutan HT/perdarahan/sepsis HT > perdarahan > sepsis Penyebab langsung Indonesia (Syairaji 2024): perdarahan ~25%, HT ~23%, sepsis ~5% KONSISTEN (pola), HT & perdarahan dominan
MMR / kematian maternal 287 in-hospital (proksi ~130/100k persalinan FKRTL) MMR nasional: SUPAS 2015 = 305; Sensus 2020 = 189; WHO/UN 2020 = 173/100k (kelahiran hidup) TAK SETARA, hanya in-hospital, bukan MMR populasi; batas bawah
Sumber benchmark: SDKI/IDHS 2017; SKI 2023 (BKPK Kemenkes); studi Robson klaim BPJS (medRxiv 2024, doi 10.1101/2024.04.18.24306050); Syairaji dkk. 2024 (BMC Pregnancy Childbirth, PMID 39080562); Say dkk. 2014 (Lancet Glob Health); WHO/UN Trends in Maternal Mortality 2000–2020.
Kesimpulan validasi: Seluruh indikator yang dapat dibandingkan konsisten dengan arah literatur: rasio sesar FKRTL (60.2%) berada di atas angka klaim-BPJS nasional (37–39%) karena terbatas pada rujukan, dan dalam rentang seri RS rujukan (40–65%); dekomposisi Robson mereplikasi temuan studi klaim BPJS (bekas sesar = kontributor utama); gradien sesar pro-kaya dan urutan morbiditas (HT/perdarahan/sepsis) sesuai data nasional. Divergensi ANC/PNC/MMR dari survei adalah artefak lensa klaim yang diharapkan (under-capture kapitasi; kematian in-hospital saja), bukan kesalahan.

8 Pilar G, Komorbiditas & Beban Non-Maternal

⑦ Pilar G · Komorbiditas Medis · Beban Klaim Non-Maternal Kohort
Pertanyaan: Kondisi medis penyerta yang memperberat risiko maternal (anemia, hipertensi kronik, diabetes, TB, HIV), dan seberapa besar beban klaim non-maternal pada kohort ini.
cm <- A$comorbid |> filter(n_pts>0)
gt::gt(cm) |>
  gt::cols_label(komorbid="Komorbiditas (FKRTL, FKL15A)", n_pts="Ibu (sampel)", pct="% kohort") |>
  gt::tab_header(title=gt::md("**Tabel G.1, Komorbiditas Medis pada Kohort Maternal** · _Unit: Perempuan unik (sampel)_")) |>
  gt::fmt_number(columns=n_pts, decimals=0, use_seps=TRUE) |>
  gt::data_color(columns=pct, colors=scales::col_numeric(c("#ede9fe", "#7c3aed"), domain=NULL)) |>
  gt::tab_source_note(gt::md(paste(CAP, "| Anemia & hipertensi/diabetes = faktor risiko obstetrik utama yang dapat dimodifikasi"))) |> gfmt()
Tabel G.1, Komorbiditas Medis pada Kohort Maternal · Unit: Perempuan unik (sampel)
Komorbiditas (FKRTL, FKL15A) Ibu (sampel) % kohort
Genitourinari (N) 26,914 5.1
Pernapasan (J) 16,507 3.2
Tuberkulosis (A15-19) 4,534 0.9
Hipertensi kronik (I10-15) 3,199 0.6
Diabetes (E10-14) 2,007 0.4
Anemia (D50-D59) 678 0.1
HIV (B20-24) 537 0.1
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional) | Anemia & hipertensi/diabetes = faktor risiko obstetrik utama yang dapat dimodifikasi
oc <- A$other_chapter |> filter(chap!="Lain") |> head(8) |> mutate(chap=fct_reorder(chap, wt))
ggplot(oc, aes(wt, chap)) + geom_col(fill=GREY, width=.7) +
  geom_text(aes(label=paste0(pct, "%")), hjust=-0.1, size=3, color=NAVY, fontface="bold") +
  scale_x_continuous(labels=label_number(scale_cut=cut_short_scale()), expand=expansion(mult=c(0, .14))) +
  labs(title="Bab ICD Klaim NON-Maternal pada Kohort KIA-Ibu · Unit: kunjungan (tertimbang)",
       subtitle="Beban penyakit fisik lain yang dialami ibu, konteks komorbiditas & integrasi layanan",
       x="Kunjungan (tertimbang)", y=NULL, caption=CAP) + th()

Key takeaway G: Komorbiditas yang dapat dimodifikasi, anemia, hipertensi, diabetes, hadir nyata dan merupakan sasaran intervensi ANC (suplementasi besi, skrining tekanan darah & gula). Beban klaim non-maternal menunjukkan ibu juga pengguna layanan penyakit lain → peluang integrasi ANC dengan layanan NCD/infeksi.

9 Pilar H, Ekonomi

⑧ Pilar H · Tren Biaya · Biaya per Mode Persalinan · INA-CBG Top · Konsentrasi (Pareto)
Pertanyaan: Berapa beban biaya JKN untuk layanan maternal, apa pemicu utamanya (sesar vs vaginal, komplikasi), dan seberapa terkonsentrasi biaya.
cy <- A$cost_year
ggplot(cy, aes(yr, total_bil_idr)) + geom_col(fill=NAVY, width=.7) +
  geom_text(aes(label=paste0("Rp", total_bil_idr, "M")), vjust=-0.4, size=2.7, color=NAVY, fontface="bold") +
  yrx() + scale_y_continuous(labels=label_number(scale_cut=cut_short_scale()), expand=expansion(mult=c(0, .12))) +
  labs(title="Total Biaya Layanan Maternal FKRTL per Tahun (tertimbang) · Unit: kunjungan/klaim",
       subtitle="Total tagihan tertimbang (proyeksi nasional), miliar Rupiah; klaim FKRTL dengan biaya verifikasi tercatat (FKL48)",
       x=NULL, y="Total biaya (miliar Rp)", caption=CAP) + th()

cd <- A$cost_delivery |> filter(!is.na(mode))
par <- A$pareto
gt::gt(cd) |>
  gt::cols_label(mode="Mode persalinan", n_claims="Klaim (sampel)", mean_cost="Biaya rata2 (Rp)",
                 median_cost="Biaya median (Rp)", total_bil_idr="Total (miliar Rp)") |>
  gt::tab_header(title=gt::md("**Tabel H.1, Biaya per Episode Persalinan: Sesar vs Vaginal** · _Unit: Episode persalinan_")) |>
  gt::fmt_number(columns=c(n_claims, mean_cost, median_cost), decimals=0, use_seps=TRUE) |>
  gt::fmt_number(columns=total_bil_idr, decimals=1) |>
  gt::data_color(columns=mean_cost, colors=scales::col_numeric(c("#fee2e2", "#b91c1c"), domain=NULL)) |>
  gt::tab_source_note(gt::md(sprintf("%s | Total biaya maternal kumulatif (tertimbang) ≈ Rp%s triliun; 1%% pasien termahal = %s%% biaya, 10%% = %s%%",
    CAP, round(A$cost_total_bil/1000,1), par$spend_share[par$top_pct==1], par$spend_share[par$top_pct==10]))) |> gfmt()
Tabel H.1, Biaya per Episode Persalinan: Sesar vs Vaginal · Unit: Episode persalinan
Mode persalinan Klaim (sampel) Biaya rata2 (Rp) Biaya median (Rp) Total (miliar Rp)
Sesar (O82) 116,320 4,153,452 5,019,900 16,544.0
Vaginal (O80-81,83-84) 104,048 2,551,711 1,965,100 7,268.8
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional) | Total biaya maternal kumulatif (tertimbang) ≈ Rp70.7 triliun; 1% pasien termahal = 4.2% biaya, 10% = 25.8%
cbg <- A$cbg_top |> head(10)
gt::gt(cbg) |>
  gt::cols_label(cbg="Deskripsi INA-CBG", n_claims="Klaim (sampel)", total_bil_idr="Total (miliar Rp)", mean_cost="Biaya rata2 (Rp)") |>
  gt::tab_header(title=gt::md("**Tabel H.2, 10 Kelompok INA-CBG Maternal Teratas** · _Unit: Klaim_")) |>
  gt::fmt_number(columns=c(n_claims, mean_cost), decimals=0, use_seps=TRUE) |>
  gt::fmt_number(columns=total_bil_idr, decimals=1) |>
  gt::data_color(columns=n_claims, colors=scales::col_numeric(c("#dbeafe", "#1e3a5f"), domain=NULL)) |>
  gt::tab_source_note(gt::md(CAP)) |> gfmt()
Tabel H.2, 10 Kelompok INA-CBG Maternal Teratas · Unit: Klaim
Deskripsi INA-CBG Klaim (sampel) Total (miliar Rp) Biaya rata2 (Rp)
PROSEDUR ULTRASOUND GINEKOLOGIK 406,637 3,824.1 311,649
OPERASI PEMBEDAHAN CAESAR RINGAN 213,267 40,369.7 5,488,365
PERAWATAN LUKA 149,594 1,012.7 193,818
PERSALINAN VAGINAL RINGAN 114,699 5,991.7 1,896,183
PENYAKIT KRONIS KECIL LAIN-LAIN 111,297 685.3 194,815
PERSALINAN VAGINAL SEDANG 48,072 2,928.1 2,195,812
PEMERIKSAAN ANTEPARTUM 40,463 205.6 136,478
GANGGUAN ANTEPARTUM RINGAN 35,261 2,323.3 2,322,224
PROSEDUR ULTRASOUND LAIN-LAIN 34,948 599.0 561,400
OPERASI PEMBEDAHAN CAESAR SEDANG 34,726 6,605.5 5,837,976
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional)
Key takeaway H: Sesar jauh lebih mahal per episode daripada vaginal (rata-rata Rp4,153,452 vs Rp2,551,711), sehingga case-mix sesar yang tinggi di FKRTL adalah pemicu biaya utama. INA-CBG operasi caesar mendominasi belanja maternal. Implikasi kebijakan: audit indikasi sesar dan penguatan persalinan normal terbantu di tingkat yang tepat dapat mengendalikan biaya sekaligus keselamatan.

10 Pilar I, Ekuitas & Representasi vs Perempuan Usia Reproduktif

⑨ Pilar I · Tabel 1 vs WUS · Served-Rate per Provinsi & Segmen · Gradien Sosioekonomi · Indeks Representasi
Pertanyaan: Siapa yang terlayani maternal relatif terhadap perempuan usia reproduktif/WUS 15–49 di populasi JKN umum, apakah ada gradien sosioekonomi & geografis (inverse care law)?

10.1 Tabel 1, Karakteristik ibu maternal vs WUS umum

Karakteristik ibu maternal (FKTP, FKRTL, Overall) dibandingkan WUS 15–49 populasi JKN umum (sample reguler, perempuan 15–49). Angka = % per kolom (tertimbang). “Kelompok Diagnostik” kosong (“,”) untuk WUS umum.
n1 <- A$table1_n
gt::gt(A$table1, groupname_col="char", rowname_col="level") |>
  gt::tab_header(title=gt::md("**Tabel 1, Karakteristik Ibu Maternal vs WUS Populasi JKN Umum** · _Unit: Perempuan unik (tertimbang), % per kolom_"),
    subtitle=gt::md(sprintf("_FKTP n=%s · FKRTL n=%s · Overall n=%s · WUS umum n=%s (peserta sampel)_",
      fmt(n1$raw[n1$kolom=="FKTP"]), fmt(n1$raw[n1$kolom=="FKRTL"]),
      fmt(n1$raw[n1$kolom=="Overall"]), fmt(n1$raw[n1$kolom=="GeneralPop"])))) |>
  gt::cols_label(FKTP="FKTP %", FKRTL="FKRTL %", Overall="Overall %", GeneralPop="WUS umum %") |>
  gt::fmt_number(columns=c(FKTP, FKRTL, Overall, GeneralPop), decimals=1) |>
  gt::sub_missing(columns=everything(), missing_text="–") |>
  gt::data_color(columns=Overall, colors=scales::col_numeric(c("#fce7f3", "#be185d"), domain=NULL)) |>
  gt::data_color(columns=GeneralPop, colors=scales::col_numeric(c("#f0fdf4", "#16a34a"), domain=NULL)) |>
  gt::tab_source_note(gt::md(paste(CAP, "| WUS umum = perempuan 15–49 sample reguler BPJS; Overall = kohort maternal"))) |> gfmt()
Tabel 1, Karakteristik Ibu Maternal vs WUS Populasi JKN Umum · Unit: Perempuan unik (tertimbang), % per kolom
FKTP n=452,364 · FKRTL n=390,300 · Overall n=523,092 · WUS umum n=751,596 (peserta sampel)
FKTP % FKRTL % Overall % WUS umum %
Kelompok Usia
25-29 32.5 33.1 32.4 14.4
20-24 24.5 22.9 23.8 14.7
30-34 21.3 21.8 21.6 14.8
35-39 12.2 12.8 12.6 14.9
<20 5.3 4.7 5.1 13.8
≥40 4.3 4.7 4.5 27.5
Segmentasi (Membership)
PBI APBN 36.0 30.2 34.3 40.7
PPU 31.7 35.7 32.4 27.7
PBPU (Mandiri) 16.8 19.4 17.9 11.4
PBI APBD 15.6 14.7 15.4 19.0
Bukan Pekerja 0.0 0.1 0.1 1.2
Kelas Rawat
Kelas III 66.8 61.7 65.4 68.6
Kelas II 19.3 21.8 20.1 15.0
Kelas I 13.9 16.5 14.4 16.4
Pulau
Jawa 54.9 53.0 52.7 52.8
Sumatera 21.1 22.6 22.8 21.1
Sulawesi 10.0 9.8 9.9 7.8
Bali-Nusra 6.6 5.9 6.3 5.6
Kalimantan 6.1 6.4 6.3 5.8
Maluku-Papua 1.3 2.3 1.9 6.9
Kelompok Diagnostik
Persalinan & ANC Normal (O80-84,O09,Z3x) 38.6 24.5 38.8
Komplikasi Kehamilan Lain (O20-O48,O92-99) 27.7 35.6 28.6
Persalinan Macet & Komplikasi Intrapartum (O60-O77) 10.3 14.0 11.0
Kehamilan Abortif/Ektopik (O00-O08) 10.2 10.3 9.1
Eklampsia & PE Berat (O11,O14,O15) 5.3 6.6 5.1
Perdarahan Obstetrik (O44-46,O67,O72) 3.5 4.1 3.3
Sepsis & Komplikasi Puerperium (O85-91,O98) 2.7 3.0 2.5
Hipertensi Gestasional/PE Ringan (O10,O12,O13,O16) 1.6 2.0 1.5
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional) | WUS umum = perempuan 15–49 sample reguler BPJS; Overall = kohort maternal

10.2 Served-rate maternal per 1.000 WUS menurut provinsi

sr <- A$served_rate_prov |> filter(!is.na(prov_name)) |> arrange(desc(rate_per1000)) |> head(15) |>
  mutate(prov_name=fct_reorder(prov_name, rate_per1000))
ggplot(sr, aes(rate_per1000, prov_name, fill=island)) + geom_col(width=.7) +
  geom_text(aes(label=round(rate_per1000)), hjust=-0.15, size=2.8, color=NAVY, fontface="bold") +
  scale_fill_manual(values=ISLAND_COLS, name=NULL) +
  scale_x_continuous(limits=c(0, NA), expand=expansion(mult=c(0, .12))) +
  labs(title="Served-Rate Maternal per 1.000 WUS (15–49) menurut Provinsi · Unit: ibu/1.000 WUS (kumulatif)",
       subtitle="Ibu maternal KUMULATIF 2015–2024 (tertimbang) ÷ WUS 15–49 stok 2024 (sample reguler) × 1.000, rasio representasi ~satu dekade, BUKAN cakupan tahunan;\nvariasi antar-provinsi juga mencerminkan perbedaan under-capture kapitasi & kecenderungan rujukan FKRTL",
       x="Ibu maternal per 1.000 WUS", y=NULL, caption=CAP) + th()

write.csv(A$served_rate_prov, file.path(OUT_DIR, "T_I_served_rate_provinsi.csv"), row.names=FALSE)

10.3 Gradien sosioekonomi (segmen kepesertaan)

ses <- A$ses_gradient |> filter(!is.na(segmen)) |> mutate(segmen=fct_reorder(segmen, rate_per1000))
ggplot(ses, aes(rate_per1000, segmen, fill=pbi)) + geom_col(width=.65) +
  geom_text(aes(label=round(rate_per1000,1)), hjust=-0.15, size=3, color=NAVY, fontface="bold") +
  scale_fill_manual(values=c("PBI (disubsidi)"=TEAL, "Non-PBI"=RED), name=NULL) +
  scale_x_continuous(limits=c(0, NA), expand=expansion(mult=c(0, .14))) +
  labs(title="Served-Rate Maternal per 1.000 WUS menurut Segmen Kepesertaan · Unit: ibu/1.000 WUS",
       subtitle="Gradien sosioekonomi layanan maternal terklaim (PBI=disubsidi termiskin vs Non-PBI=mampu/PPU/mandiri)",
       x="Ibu maternal per 1.000 WUS dalam segmen", y=NULL, caption=CAP) + th()

eq <- A$equity_segment_detail |> filter(seg_lab!="Missing") |> select(seg_lab, wt_pts, mean_visits, pct_inp, pct_cs)
gt::gt(eq) |>
  gt::cols_label(seg_lab="Segmen", wt_pts="Ibu (tertimbang)", mean_visits="Rata2 kunjungan",
                 pct_inp="% pernah inap", pct_cs="% pernah sesar") |>
  gt::tab_header(title=gt::md("**Tabel I.1, Intensitas & Mode Layanan menurut Segmen** · _Unit: Perempuan unik_")) |>
  gt::fmt_number(columns=wt_pts, decimals=0, use_seps=TRUE) |>
  gt::fmt_number(columns=c(mean_visits, pct_inp, pct_cs), decimals=1) |>
  gt::data_color(columns=pct_cs, colors=scales::col_numeric(c("#fee2e2", "#b91c1c"), na.color="#f3f4f6", domain=NULL)) |>
  gt::sub_missing(columns=everything(), missing_text="–") |>
  gt::tab_source_note(gt::md(paste(CAP, "| % pernah sesar dihitung di antara seluruh ibu segmen (bukan hanya yang bersalin di FKRTL)"))) |> gfmt()
Tabel I.1, Intensitas & Mode Layanan menurut Segmen · Unit: Perempuan unik
Segmen Ibu (tertimbang) Rata2 kunjungan % pernah inap % pernah sesar
PBI APBN 5,309,617 6.0 61.0
PPU 5,011,074 7.0 77.1
PBPU (Mandiri) 2,770,145 5.0 75.6
PBI APBD 2,375,459 6.0 63.8
Bukan Pekerja 8,576 4.0 69.0 18.3
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | Kohort KIA-Ibu | ICD-10 O00–O99 + pengawasan kehamilan | FKTP + FKRTL | tertimbang PSTV15 (proyeksi nasional) | % pernah sesar dihitung di antara seluruh ibu segmen (bukan hanya yang bersalin di FKRTL)
Key takeaway I (ekuitas): Terdapat gradien sosioekonomi: ibu Non-PBI lebih sering sesar (62.4% tertimbang) dibanding PBI (56.6%), konsisten dengan pola global sesar lebih tinggi pada yang mampu bayar. Served-rate maternal per WUS bervariasi antar-provinsi, namun perbedaan ini sebagian mencerminkan perilaku klaim (under-capture kapitasi & rujukan), sehingga served-rate rendah belum tentu akses rendah secara pasti. Implikasi: pemantauan ekuitas maternal menyandingkan kemungkinan under-use di wilayah timur/PBI dengan kemungkinan over-use sesar di segmen mampu.

11 Sintesis & Implikasi Kebijakan

1. Beban & case-mix. Kohort 523,092 ibu sampel; layanan rujukan FKRTL didominasi persalinan berisiko & sesar serta komplikasi obstetrik berat (PE/eklampsia, perdarahan, sepsis). 2. Sesar (tren + Robson). Rasio sesar FKRTL naik dari 49.5% (2015) ke 66% (2024, tertimbang), case-mix rujukan, bukan populasi. Dekomposisi Robson: bekas sesar (R5) hampir 100% sesar berulang, tetapi kelompok term-sefalik (R1-4, 79% persalinan, sesar 56.9%) adalah target audit indikasi utama. Konsisten dengan studi klaim BPJS nasional. 3. Kontinuitas (ANC/PNC), “too little, too late”. ANC terkapture rendah (K4 24.3%, K6 12.2%) karena kapitasi, tetapi pola tetap valid: inisiasi Trimester 1 hanya 14.4% dan kontak menumpuk di Trimester 3, perlu integrasi data kapitasi bidan/Puskesmas + dorongan ANC dini. 4. Keselamatan ibu. Morbiditas berat (HT/PE, perdarahan, sepsis) mereplikasi urutan penyebab langsung kematian maternal Indonesia (Syairaji 2024); titik ungkit = deteksi dini ANC, rujukan tepat waktu (rujukan lintas-kab/provinsi = risiko delay), dan kapasitas PONEK. 5. Ekonomi. Sesar adalah pemicu biaya utama; audit indikasi sesar (terutama R1-4) + penguatan persalinan normal terbantu = efisiensi + keselamatan. 6. Ekuitas. Under-use di timur/PBI (ANC ≥4 Jawa 34.2% vs Maluku-Papua 10.6%) berdampingan dengan over-use sesar di segmen mampu, dua sisi inequity. 7. Validasi. Seluruh indikator komparabel konsisten dengan literatur (lihat Tabel F.4): sesar FKRTL dalam rentang seri RS rujukan, Robson mereplikasi studi BPJS, gradien sesar pro-kaya & urutan morbiditas sesuai data nasional.

Ringkasan keterbatasan (baca bersama setiap angka): klaim = populasi terlayani & terklaim, bukan cakupan/insidens sejati; ANC/persalinan normal under-captured (kapitasi bidan/Puskesmas); rasio sesar FKRTL ≠ rasio sesar populasi; kematian maternal hanya in-hospital (batas bawah, bukan MMR); akrual/left-truncation + 2023 ter-load tidak lengkap; tanpa nilai lab/vital (Hb, tekanan darah, usia gestasi presisi). Semua tabel & figur mencantumkan unit analisis dan status tertimbang vs sampel.
## consolidated workbook
try({
  if(requireNamespace("writexl", quietly=TRUE)){
    writexl::write_xlsx(list(
      Strata=A$strata_patient |> filter(!is.na(grp)),
      Persalinan_tahun=A$deliveries_year,
      Sesar_segmen=A$cs_rate_segment, Sesar_kelasRS=A$cs_rate_class, Sesar_tahun=A$cs_rate_year,
      Sesar_provinsi=A$cs_rate_prov |> select(prov_name, island, cs, deliv, cs_pct, cs_pct_wt),
      Robson=A$robson, ANC_indikator=A$anc_ind, ANC_dist=A$anc_dist, ANC_segmen=A$anc_by_seg,
      ANC_pulau=A$anc_by_island, ANC_trimester=A$anc_trim, ANC_pola=A$anc_pattern, PNC=A$pnc_ind,
      Morbiditas=A$morbidity, Komorbiditas=A$comorbid,
      Biaya_mode=A$cost_delivery, INACBG=A$cbg_top,
      ServedRate_prov=A$served_rate_prov, SES_gradient=A$ses_gradient,
      Tabel1=A$table1, Geo_provinsi=A$geo_prov),
      file.path(OUT_DIR, "maternal_jkn_tables.xlsx"))
  }
}, silent=TRUE)
Reproduksibilitas. Engine: engine_maternal_jkn.R (PostgreSQL bpjs_data.kia_ibu → bundle maternal_jkn_aggregates.rds). Laporan: Maternal_Health_JKN_Analysis.Rmd (tanpa akses DB saat render; cache md5-bundle). Tabel ringkas: outputs/maternal_jkn_tables.xlsx + CSV per-figur. Definisi kasus & gotcha field terdokumentasi di header engine. Dibangun 21 June 2026.