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.
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) |
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.
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.
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.
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.
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 <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)
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()

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.
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.
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.
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.
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.
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.
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)
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.
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.
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.
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.
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).
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.
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.
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.
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.
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)?
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 |
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.
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.