pkgs <- c("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)) }))
H <- readRDS("data/hrh_supply_aggregates.rds") # workforce
F <- readRDS("data/facilities_supply_aggregates.rds") # facilities
M <- readRDS("data/medicines_aggregates.rds") # psychotropic medicines (HTA)
G <- readRDS("data/governance_aggregates.rds") # policy/regulation + PNPK
## financing/integration numbers from the ARC9.3 REGULER claims bundle (unbiased basis)
JKN <- tryCatch(readRDS("/home/arcinstitute/1. Project Center/ARC9. Mental Health Institute/9.3 JKN on Mental Health/analysis/reguler/mental_reguler_aggregates.rds"), error=function(e) NULL)
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 }
if(!is.null(JKN)) JKN <- fix64(JKN)
OUT_DIR <- "outputs"; if(!dir.exists(OUT_DIR)) dir.create(OUT_DIR)
NAVY<-"#1e3a5f"; BLUE<-"#2d5a9e"; RED<-"#dc2626"; AMBER<-"#d97706"
TEAL<-"#0f766e"; GREY<-"#6b7280"; GREEN<-"#16a34a"; PURPLE<-"#7c3aed"; ORANGE<-"#ea580c"
ISL_COLS <- c("Jawa"=NAVY,"Sumatera"=BLUE,"Sulawesi"=TEAL,"Kalimantan"=AMBER,"Bali-Nusra"=PURPLE,"Maluku-Papua"=RED,"Lainnya"=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: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025"
fmt <- function(x) formatC(round(x), format="d", big.mark=",")
figtab <- function(df, title="Data figur"){
df <- as.data.frame(df)
g <- gt::gt(df) |> gt::tab_header(title=gt::md(paste0("**",title,", tabel data figur**"))) |>
gt::tab_source_note(gt::md(CAP)) |> gfmt()
for(j in seq_along(df)) if(is.numeric(df[[j]])){ v<-df[[j]]; isint<-all(abs(v-round(v))<1e-9,na.rm=TRUE)
g <- gt::fmt_number(g, columns=j, decimals=if(isint)0 else if(max(abs(v),na.rm=TRUE)<10)3 else 1, use_seps=TRUE) }
g <- gt::sub_missing(g, columns=gt::everything(), missing_text="–")
g
}
## visible companion table (shown INSIDE the tab, not collapsed), "tiap figure tampilkan tabelnya"
showtab <- function(df, title){
df <- as.data.frame(df)
g <- gt::gt(df) |> gt::tab_header(title=gt::md(paste0("**",title,", tabel data figur**"))) |>
gt::opt_table_font(size=gt::pct(88)) |> gt::tab_source_note(gt::md(CAP)) |> gfmt()
for(j in seq_along(df)) if(is.numeric(df[[j]])){ v<-df[[j]]; isint<-all(abs(v-round(v))<1e-9,na.rm=TRUE)
g <- gt::fmt_number(g, columns=j, decimals=if(isint)0 else if(max(abs(v),na.rm=TRUE)<10)3 else 1, use_seps=TRUE) }
g <- gt::sub_missing(g, columns=gt::everything(), missing_text="–")
g
}
core3 <- c("psikiater","psikolog","perawat_jiwa")
## urban (Kota) vs rural (Kabupaten): BPS kabupaten code last-2-digits >= 71 = Kota
H$pop_kab <- H$pop_kab |> mutate(area=ifelse(code%%100>=71,"Kota","Kabupaten"))
H$by_kab <- H$by_kab |> mutate(area=ifelse(code%%100>=71,"Kota","Kabupaten"))
## density (per 100k) of a cadre, broken by a grouping col present in BOTH pop_kab & by_kab
dens_by <- function(ck, grp){
hc <- H$by_kab |> filter(key==ck) |> group_by(.g=.data[[grp]]) |> summarise(hc=sum(hc,na.rm=TRUE),.groups="drop")
pp <- H$pop_kab |> group_by(.g=.data[[grp]]) |> summarise(pop=sum(pop,na.rm=TRUE),.groups="drop")
left_join(pp, hc, by=".g") |> mutate(hc=coalesce(hc,0), per100k=round(hc/pop*1e5,3)) |>
rename(!!grp := .g) |> arrange(desc(per100k))
}
NATPOP <- H$meta$nat_pop
Apa itu laporan ini. Analisis sisi suplai (supply side)
sistem kesehatan jiwa Indonesia, dipandu kerangka WHO building blocks
/ WHO-AIMS dan lensa Availability (ketersediaan) – Accessibility
(akses) – Quality (mutu). Berbeda dari analisis klaim JKN (ARC9.3,
sisi demand/utilisasi), laporan ini menanyakan: apa kapasitas sistem
yang tersedia untuk merespons gangguan jiwa, tenaga, fasilitas,
pembiayaan, regulasi, obat, sistem informasi, dan mutu/HAM.
Unit & denominator. Tenaga & fasilitas dinyatakan per
100.000 (atau per 1 juta) penduduk, denominator = proyeksi
penduduk BPS 2025 (284,438,930 jiwa, 514 kabupaten/kota).
Headcount DREAMS = posisi tenaga per fasilitas (seorang nakes
yang praktik di >1 faskes terhitung lebih dari sekali); SIP =
jumlah izin praktik. Keduanya dilaporkan; rate memakai headcount
kecuali disebut lain.
Peta Pilar (WHO building blocks): 1 Governance &
Kebijakan · 2 Pembiayaan · 3 Fasilitas & Organisasi
Layanan · 4 SDM/Tenaga (HRH) · 5 Obat & Teknologi ·
6 Sistem Informasi · 7 Mutu & HAM. Tiap pilar
dibaca lewat lensa Availability–Accessibility–Quality. Pilar yang kaya
data (3 Fasilitas, 4 SDM) disajikan kuantitatif; pilar bertumpu
regulasi/kualitatif (1, 5, 6, 7) disajikan naratif dengan penanda data
yang ada vs senjang.
Ringkasan
eksekutif
psy <- H$national |> filter(key=="psikiater")
psyc <- H$national |> filter(key=="psikolog")
nrs <- H$national |> filter(key=="perawat_jiwa")
covp <- H$coverage |> filter(key=="psikiater")
cat(sprintf('<div class="cardrow">
<div class="card red"><div class="big">%.2f</div><div class="lab">Psikiater per 100.000 penduduk (Sp.KJ). Ambang WHO ≈ 1/100.000; negara berpenghasilan tinggi ~10.</div></div>
<div class="card red"><div class="big">%.0f%%</div><div class="lab">Kabupaten/kota <b>tanpa satu pun psikiater</b> (%d dari %d). Layanan terkonsentrasi di kota besar.</div></div>
<div class="card amber"><div class="big">%d</div><div class="lab">RS Jiwa (RSJ) nasional = %.2f per 1 juta penduduk; <b>%d provinsi tanpa RSJ</b>.</div></div>
<div class="card amber"><div class="big">%.0f%%</div><div class="lab">RS umum/khusus yang menyediakan layanan <b>kesehatan jiwa dewasa</b> (%d dari %d RS).</div></div>
<div class="card"><div class="big">%.2f</div><div class="lab">Psikolog klinis per 100.000; perawat jiwa %.2f/100.000.</div></div>
</div>',
psy$per100k, covp$pct_kab_zero, covp$n_kab_total-covp$n_kab_covered, covp$n_kab_total,
F$rsj_national$n_rsj, F$rsj_national$rsj_per1m, sum(F$rsj_prov$n_rsj==0),
F$svc_national$pct_rs[1], F$svc_national$n_rs_ada[1], F$meta$n_rs,
psyc$per100k, nrs$per100k))
0.51
Psikiater per 100.000 penduduk (Sp.KJ). Ambang WHO ≈ 1/100.000; negara
berpenghasilan tinggi ~10.
38%
Kabupaten/kota tanpa satu pun psikiater (196 dari 514). Layanan
terkonsentrasi di kota besar.
42
RS Jiwa (RSJ) nasional = 0.15 per 1 juta penduduk; 7 provinsi tanpa
RSJ.
27%
RS umum/khusus yang menyediakan layanan kesehatan jiwa dewasa
(895 dari 3275 RS).
0.85
Psikolog klinis per 100.000; perawat jiwa 1.74/100.000.
Temuan inti: Kapasitas suplai keswa Indonesia sangat terbatas
dan timpang secara geografis. Tenaga psikiatri jauh di bawah ambang
WHO dan terkonsentrasi di Jawa/kota besar, dengan ratusan kabupaten
tanpa psikiater maupun RS berlayanan jiwa. Sub-spesialis (jiwa
anak-remaja, adiksi, forensik, komunitas) nyaris tidak ada.
Suplai bertumpu pada model RSJ rujukan, bukan layanan
komunitas/primer yang terdesentralisasi. Senjang terbesar untuk
pelaporan: data tempat tidur psikiatri, obat psikotropika tingkat
puskesmas, dan indikator mutu/HAM (pasung, restraint) belum tersedia
terpilah secara rutin.
Kerangka & sumber
data
Kerangka Analitik · WHO Building Blocks / WHO-AIMS ·
Availability–Accessibility–Quality
WHO-AIMS (Assessment Instrument for Mental Health Systems)
memetakan sistem keswa ke domain kebijakan, layanan, SDM, obat,
pembiayaan, informasi, dan HAM. Tiap domain ditimbang lewat tiga
pertanyaan: Availability (apakah sumber daya ada dan berapa
banyak), Accessibility (apakah terjangkau secara
geografis/finansial/sosial bagi yang membutuhkan), Quality
(apakah layanan bermutu, berbasis bukti, dan menghormati hak).
src <- tibble::tribble(
~`Pilar (building block)`, ~`Sumber data utama`, ~`Status`,
"1. Governance & kebijakan", "ARC Indonesia Health Policy Review: 12,4k regulasi & 21,8k pasal ter-tag; UU 17/2023 omnibus (mencabut UU 18/2014); PP 28/2024; PNPK", "Kuantitatif",
"2. Pembiayaan", "Klaim BPJS keswa (ARC9.3, sampel reguler); APBD kesehatan (BPS)", "Kuantitatif parsial",
"3. Fasilitas & layanan", "SIRS Kemenkes 2025 (3.275 RS): RSJ, layanan jiwa per-RS; BPJS FKTP (integrasi primer)", "Kuantitatif",
"4. SDM / tenaga (HRH)", "DREAMS/SI-SDMK Kemenkes 2025 (headcount + SIP per faskes); denominator BPS", "Kuantitatif (inti)",
"5. Obat & teknologi", "Dashboard HTA Watchdog ARC: WHO EML × Fornas × INAPROC × NICE (psikotropika N03/N05/N06)", "Kuantitatif",
"6. Sistem informasi", "DREAMS, SIRS, SATUSEHAT, BPJS sebagai substrat SIK", "Naratif + meta",
"7. Mutu & HAM", "Akreditasi RS; pasung/restraint; mhGAP, belum rutin terpilah", "Senjang data")
gt::gt(src) |> gt::tab_header(title=gt::md("**Tabel 0, Pemetaan pilar ke sumber data & status ketersediaan**")) |>
gt::data_color(columns=`Status`, fn=function(x) dplyr::case_when(grepl("inti",x)~"#bbf7d0", grepl("Kuantitatif",x)~"#dcfce7", grepl("Senjang",x)~"#fee2e2", TRUE~"#fef9c3")) |>
gt::tab_source_note(gt::md("Senjang data = jujur dilaporkan; bukan ketiadaan masalah, melainkan ketiadaan data rutin terpilah. Lihat tiap pilar.")) |> gfmt()
| Tabel 0, Pemetaan pilar ke sumber data & status ketersediaan |
| Pilar (building block) |
Sumber data utama |
Status |
| 1. Governance & kebijakan |
ARC Indonesia Health Policy Review: 12,4k regulasi & 21,8k pasal ter-tag; UU 17/2023 omnibus (mencabut UU 18/2014); PP 28/2024; PNPK |
Kuantitatif |
| 2. Pembiayaan |
Klaim BPJS keswa (ARC9.3, sampel reguler); APBD kesehatan (BPS) |
Kuantitatif parsial |
| 3. Fasilitas & layanan |
SIRS Kemenkes 2025 (3.275 RS): RSJ, layanan jiwa per-RS; BPJS FKTP (integrasi primer) |
Kuantitatif |
| 4. SDM / tenaga (HRH) |
DREAMS/SI-SDMK Kemenkes 2025 (headcount + SIP per faskes); denominator BPS |
Kuantitatif (inti) |
| 5. Obat & teknologi |
Dashboard HTA Watchdog ARC: WHO EML × Fornas × INAPROC × NICE (psikotropika N03/N05/N06) |
Kuantitatif |
| 6. Sistem informasi |
DREAMS, SIRS, SATUSEHAT, BPJS sebagai substrat SIK |
Naratif + meta |
| 7. Mutu & HAM |
Akreditasi RS; pasung/restraint; mhGAP, belum rutin terpilah |
Senjang data |
| Senjang data = jujur dilaporkan; bukan ketiadaan masalah, melainkan ketiadaan data rutin terpilah. Lihat tiap pilar. |
Pilar 4, SDM / Tenaga
Kesehatan Jiwa (HRH)
④ Pilar 4 · SDM/HRH · Densitas · Maldistribusi · Sub-spesialis ·
Headcount vs Izin Praktik
Pilar dengan temuan terkuat. Dibaca lewat lensa
Availability (densitas nasional per 100k), Accessibility
(sebaran provinsi/pulau/kota-kabupaten & wilayah tanpa tenaga), dan
Quality (bauran kompetensi sub-spesialis & izin praktik
aktif). Tiap tabset di bawah menampilkan indikator yang sama dipecah
menurut breakdown berbeda; setiap tab memuat figur beserta tabel
datanya.
Key takeaway SDM: Densitas seluruh kader keswa jauh di
bawah standar internasional dan sangat terkonsentrasi di Jawa dan
kota. Psikiater 0.51/100k (ambang WHO ~1), dengan 38.1% kabupaten
tanpa psikiater dan Gini distribusi 0.771. Sub-spesialis (jiwa
anak-remaja, adiksi, forensik, komunitas) berjumlah puluhan orang
untuk seluruh negeri.
Densitas tenaga kesehatan
jiwa
Indikator sama: tenaga per 100.000 penduduk. Tab = breakdown
berbeda (per kader · per provinsi · per pulau · kota vs kabupaten).
Denominator selalu proyeksi penduduk BPS 2025.
Per kader
(nasional)
## 3.1, sub-spesialis DIGABUNG ke psikiater (rincian per sub-spesialis ada di seksi Sub-spesialis 3.x);
## breakdown geografis ada di tab Per provinsi/pulau/kota. Denominator BPS 2025.
psy_tot <- H$national |> filter(key=="psikiater" | !core) |>
summarise(headcount=sum(headcount), sip=sum(sip,na.rm=TRUE)) |>
transmute(label="Psikiater (Sp.KJ + sub-spesialis)", headcount, sip,
per100k=round(headcount/NATPOP*1e5,3), per1m=round(headcount/NATPOP*1e6,2))
nd <- bind_rows(psy_tot, H$national |> filter(key %in% c("psikolog","perawat_jiwa")) |>
select(label,headcount,sip,per100k,per1m)) |>
mutate(pop_per=round(NATPOP/headcount), label=fct_reorder(label, per100k))
ggplot(nd, aes(per100k, label)) + geom_col(width=.58, fill=NAVY) +
geom_text(aes(label=sprintf("%.2f/100k · 1 tenaga : %s penduduk", per100k, fmt(pop_per))),
hjust=-0.04, size=3, color=NAVY, fontface="bold") +
geom_vline(xintercept=1, linetype="dashed", color=RED) +
annotate("text", x=1, y=0.6, label="ambang WHO ~1", color=RED, size=2.7, hjust=-0.05, fontface="italic") +
scale_x_continuous(expand=expansion(mult=c(0,.5))) +
labs(title="Densitas Tenaga Kesehatan Jiwa Nasional, per 100.000 Penduduk (2025) · Unit: tenaga/100k",
subtitle="Tiga kader inti; sub-spesialis psikiatri digabung ke psikiater (rincian di seksi Sub-spesialis). Ambang WHO psikiater ≈ 1/100.000.",
x="Tenaga per 100.000 penduduk", y=NULL, caption=CAP) + th()

| Densitas tenaga keswa nasional (sub-spesialis digabung ke psikiater), tabel data figur |
| Kader |
Headcount |
SIP (izin praktik) |
Per 100k |
Per 1 juta |
1 tenaga melayani (penduduk) |
| Perawat Kesehatan Jiwa |
4,961 |
5,101 |
1.744 |
17.4 |
57,335 |
| Psikolog Klinis |
2,423 |
3,103 |
0.852 |
8.5 |
117,391 |
| Psikiater (Sp.KJ + sub-spesialis) |
1,525 |
3,360 |
0.536 |
5.4 |
186,517 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Per provinsi
(psikiater)
pp <- H$by_prov |> filter(key=="psikiater") |> mutate(prov_name=fct_reorder(prov_name, per100k))
ggplot(pp, aes(per100k, prov_name, color=island)) +
geom_segment(aes(x=0, xend=per100k, yend=prov_name), linewidth=.5, color="#cbd5e1") +
geom_point(size=3) + geom_text(aes(label=sprintf("%.2f",per100k)), hjust=-0.4, size=2.6, color=NAVY) +
scale_color_manual(values=ISL_COLS, name=NULL) + scale_x_continuous(expand=expansion(mult=c(0,.12))) +
geom_vline(xintercept=H$national$per100k[H$national$key=="psikiater"], linetype="dotted", color=GREY) +
labs(title="Psikiater (Sp.KJ) per 100.000 Penduduk menurut Provinsi · Unit: psikiater/100k",
subtitle=sprintf("Garis putus = rata-rata nasional %.2f. DKI/DIY/Bali tertinggi; provinsi timur mendekati nol.",
H$national$per100k[H$national$key=="psikiater"]),
x="Psikiater per 100.000 penduduk", y=NULL, caption=CAP) + th(10)

| Psikiater per 100k per provinsi, tabel data figur |
| Provinsi |
Pulau |
Penduduk 2025 |
Psikiater (headcount) |
Per 100k |
1 psikiater melayani (penduduk) |
| DKI JAKARTA |
Jawa |
10,677,990 |
205 |
1.920 |
52,088 |
| DI YOGYAKARTA |
Jawa |
3,781,550 |
62 |
1.640 |
60,993 |
| BALI |
Bali-Nusra |
4,461,270 |
70 |
1.569 |
63,732 |
| SULAWESI SELATAN |
Sulawesi |
9,563,130 |
73 |
0.763 |
131,002 |
| ACEH |
Sumatera |
5,625,960 |
40 |
0.711 |
140,649 |
| KALIMANTAN SELATAN |
Kalimantan |
4,323,340 |
29 |
0.671 |
149,081 |
| KALIMANTAN UTARA |
Kalimantan |
749,370 |
5 |
0.667 |
149,874 |
| KEPULAUAN RIAU |
Sumatera |
2,213,460 |
13 |
0.587 |
170,266 |
| KEPULAUAN BANGKA BELITUNG |
Sumatera |
1,550,820 |
9 |
0.580 |
172,313 |
| PAPUA BARAT |
Maluku-Papua |
1,224,090 |
7 |
0.572 |
174,870 |
| SUMATERA BARAT |
Sumatera |
5,914,280 |
31 |
0.524 |
190,783 |
| BANTEN |
Jawa |
12,537,440 |
65 |
0.518 |
192,884 |
| KALIMANTAN TIMUR |
Kalimantan |
4,267,610 |
22 |
0.516 |
193,982 |
| KALIMANTAN TENGAH |
Kalimantan |
2,845,010 |
14 |
0.492 |
203,215 |
| GORONTALO |
Sulawesi |
1,242,250 |
6 |
0.483 |
207,042 |
| JAWA TENGAH |
Jawa |
38,233,920 |
182 |
0.476 |
210,076 |
| SUMATERA UTARA |
Sumatera |
15,785,840 |
72 |
0.456 |
219,248 |
| BENGKULU |
Sumatera |
2,138,060 |
9 |
0.421 |
237,562 |
| RIAU |
Sumatera |
6,811,180 |
27 |
0.396 |
252,266 |
| SULAWESI TENGAH |
Sulawesi |
3,156,110 |
12 |
0.380 |
263,009 |
| JAMBI |
Sumatera |
3,768,490 |
14 |
0.372 |
269,178 |
| JAWA TIMUR |
Jawa |
42,089,260 |
154 |
0.366 |
273,307 |
| JAWA BARAT |
Jawa |
50,758,990 |
185 |
0.364 |
274,373 |
| MALUKU UTARA |
Maluku-Papua |
1,373,830 |
5 |
0.364 |
274,766 |
| SULAWESI TENGGARA |
Sulawesi |
2,836,760 |
10 |
0.353 |
283,676 |
| SULAWESI UTARA |
Sulawesi |
2,721,440 |
9 |
0.331 |
302,382 |
| SULAWESI BARAT |
Sulawesi |
1,525,340 |
5 |
0.328 |
305,068 |
| NUSA TENGGARA BARAT |
Bali-Nusra |
5,731,120 |
18 |
0.314 |
318,396 |
| NUSA TENGGARA TIMUR |
Bali-Nusra |
5,742,580 |
17 |
0.296 |
337,799 |
| KALIMANTAN BARAT |
Kalimantan |
5,766,020 |
17 |
0.295 |
339,178 |
| MALUKU |
Maluku-Papua |
1,970,560 |
5 |
0.254 |
394,112 |
| SUMATERA SELATAN |
Sumatera |
8,928,510 |
22 |
0.246 |
405,841 |
| LAMPUNG |
Sumatera |
9,522,900 |
19 |
0.200 |
501,205 |
| PAPUA |
Maluku-Papua |
4,600,450 |
0 |
0.000 |
– |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Per pulau
di <- bind_rows(lapply(core3, function(k) dens_by(k,"island") |>
filter(island!="Lainnya") |> mutate(kader=H$national$label[H$national$key==k])))
di <- di |> mutate(kader=factor(kader, levels=H$national$label[match(core3,H$national$key)]),
island=fct_reorder(island, per100k, .fun=max))
ggplot(di, aes(per100k, island, fill=kader)) + geom_col(position="dodge", width=.72) +
geom_text(aes(label=sprintf("%.2f",per100k)), position=position_dodge(width=.72), hjust=-0.12, size=2.4, color=NAVY) +
scale_fill_manual(values=c(NAVY,TEAL,AMBER), name=NULL) + scale_x_continuous(expand=expansion(mult=c(0,.16))) +
labs(title="Densitas Kader Inti Keswa menurut Pulau, per 100.000 Penduduk · Unit: tenaga/100k",
subtitle="Jawa unggul di seluruh kader; Maluku-Papua terendah. Denominator = penduduk pulau (BPS 2025).",
x="Tenaga per 100.000 penduduk", y=NULL, caption=CAP) + th()

| Densitas kader inti per pulau, tabel data figur |
| Pulau |
Kader |
Penduduk |
Headcount |
Per 100k |
1 tenaga melayani (penduduk) |
| Bali-Nusra |
Psikiater (Sp.KJ) |
15,934,970 |
105 |
0.659 |
151,762 |
| Sulawesi |
Psikiater (Sp.KJ) |
21,045,030 |
115 |
0.546 |
183,000 |
| Jawa |
Psikiater (Sp.KJ) |
158,079,150 |
853 |
0.540 |
185,321 |
| Kalimantan |
Psikiater (Sp.KJ) |
17,951,350 |
87 |
0.485 |
206,337 |
| Sumatera |
Psikiater (Sp.KJ) |
62,259,500 |
256 |
0.411 |
243,201 |
| Maluku-Papua |
Psikiater (Sp.KJ) |
9,168,930 |
17 |
0.185 |
539,349 |
| Kalimantan |
Psikolog Klinis |
17,951,350 |
179 |
0.997 |
100,287 |
| Jawa |
Psikolog Klinis |
158,079,150 |
1,552 |
0.982 |
101,855 |
| Bali-Nusra |
Psikolog Klinis |
15,934,970 |
116 |
0.728 |
137,370 |
| Sumatera |
Psikolog Klinis |
62,259,500 |
435 |
0.699 |
143,125 |
| Sulawesi |
Psikolog Klinis |
21,045,030 |
110 |
0.523 |
191,318 |
| Maluku-Papua |
Psikolog Klinis |
9,168,930 |
23 |
0.251 |
398,649 |
| Kalimantan |
Perawat Kesehatan Jiwa |
17,951,350 |
574 |
3.198 |
31,274 |
| Bali-Nusra |
Perawat Kesehatan Jiwa |
15,934,970 |
407 |
2.554 |
39,152 |
| Sulawesi |
Perawat Kesehatan Jiwa |
21,045,030 |
430 |
2.043 |
48,942 |
| Sumatera |
Perawat Kesehatan Jiwa |
62,259,500 |
1,160 |
1.863 |
53,672 |
| Jawa |
Perawat Kesehatan Jiwa |
158,079,150 |
2,299 |
1.454 |
68,760 |
| Maluku-Papua |
Perawat Kesehatan Jiwa |
9,168,930 |
71 |
0.774 |
129,140 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Kota vs
Kabupaten
da <- bind_rows(lapply(core3, function(k) dens_by(k,"area") |> mutate(kader=H$national$label[H$national$key==k])))
da <- da |> mutate(kader=factor(kader, levels=H$national$label[match(core3,H$national$key)]))
ggplot(da, aes(per100k, kader, fill=area)) + geom_col(position="dodge", width=.66) +
geom_text(aes(label=sprintf("%.2f",per100k)), position=position_dodge(width=.66), hjust=-0.12, size=2.7, color=NAVY, fontface="bold") +
scale_fill_manual(values=c("Kota"=NAVY,"Kabupaten"=AMBER), name=NULL) + scale_x_continuous(expand=expansion(mult=c(0,.16))) +
labs(title="Densitas Kader Inti Keswa: Kota vs Kabupaten, per 100.000 Penduduk · Unit: tenaga/100k",
subtitle="Kota (kode BPS ≥71) vs kabupaten. Tenaga keswa berlipat lebih padat di kota, beban perkotaan menyerap suplai.",
x="Tenaga per 100.000 penduduk", y=NULL, caption=CAP) + th()

| Densitas kader inti: kota vs kabupaten, tabel data figur |
| Kader |
Wilayah |
Penduduk |
Headcount |
Per 100k |
1 tenaga melayani (penduduk) |
| Psikiater (Sp.KJ) |
Kota |
60,748,210 |
871 |
1.434 |
69,745 |
| Psikiater (Sp.KJ) |
Kabupaten |
223,690,720 |
573 |
0.256 |
390,385 |
| Psikolog Klinis |
Kota |
60,748,210 |
1,526 |
2.512 |
39,809 |
| Psikolog Klinis |
Kabupaten |
223,690,720 |
897 |
0.401 |
249,376 |
| Perawat Kesehatan Jiwa |
Kota |
60,748,210 |
3,087 |
5.082 |
19,679 |
| Perawat Kesehatan Jiwa |
Kabupaten |
223,690,720 |
1,874 |
0.838 |
119,365 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Sub-spesialis
psikiatri, kapasitas tersier
ss <- H$national |> filter(!core) |> left_join(H$coverage |> select(key, n_kab_covered), by="key") |>
mutate(label=fct_reorder(label, headcount))
ggplot(ss, aes(headcount, label)) + geom_col(fill=AMBER, width=.66) +
geom_text(aes(label=sprintf("%d org · %d kab", headcount, n_kab_covered)), hjust=-0.05, size=2.8, color=NAVY, fontface="bold") +
scale_x_continuous(expand=expansion(mult=c(0,.28))) +
labs(title="Sub-spesialis Psikiatri: Jumlah Nasional & Jangkauan Kabupaten · Unit: orang",
subtitle="Seluruh negeri. Jiwa anak-remaja, adiksi, forensik, komunitas, CLP, kapasitas tersier nyaris tak ada.",
x="Headcount nasional", y=NULL, caption=CAP) + th()

| Sub-spesialis: jumlah & jangkauan, tabel data figur |
| Sub-spesialis |
Headcount |
SIP |
Kabupaten terjangkau |
% kabupaten |
| Subsp. Jiwa Anak & Remaja |
40 |
73 |
27 |
5.300 |
| Subsp. Psikiatri Adiksi |
19 |
25 |
13 |
2.500 |
| Subsp. Psikiatri Forensik |
11 |
15 |
9 |
1.800 |
| Subsp. Psikiatri Komunitas |
4 |
5 |
4 |
0.800 |
| Subsp. Konsultasi-Liaison (CLP) |
4 |
8 |
4 |
0.800 |
| Subsp. Psikoseksual & Marital |
2 |
2 |
2 |
0.400 |
| Subsp. Biologi & Psikofarmakologi |
1 |
5 |
1 |
0.200 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Headcount vs izin
praktik (SIP)
hs <- H$national |> filter(core) |> select(label, headcount, sip) |>
tidyr::pivot_longer(-label, names_to="metric", values_to="n") |>
mutate(metric=recode(metric, headcount="Headcount (posisi/faskes)", sip="SIP (izin praktik)"))
ggplot(hs, aes(n, fct_reorder(label,n), fill=metric)) + geom_col(position="dodge", width=.66) +
geom_text(aes(label=fmt(n)), position=position_dodge(width=.66), hjust=-0.1, size=2.8, color=NAVY) +
scale_fill_manual(values=c("Headcount (posisi/faskes)"=NAVY,"SIP (izin praktik)"=TEAL), name=NULL) +
scale_x_continuous(expand=expansion(mult=c(0,.16))) +
labs(title="Headcount Faskes vs Jumlah Izin Praktik (SIP), Kader Inti · Unit: orang/izin",
subtitle="SIP > headcount karena satu tenaga dapat memegang beberapa izin praktik; headcount DREAMS = posisi terlapor per faskes.",
x=NULL, y=NULL, caption=CAP) + th()

| Headcount vs SIP kader inti, tabel data figur |
| Kader |
Headcount |
SIP |
Rasio SIP/Headcount |
| Psikiater (Sp.KJ) |
1,444 |
3,227 |
2.230 |
| Psikolog Klinis |
2,423 |
3,103 |
1.280 |
| Perawat Kesehatan Jiwa |
4,961 |
5,101 |
1.030 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Di fasilitas tingkat
apa tenaga bekerja
catfac <- function(x) dplyr::case_when(x=="Rumah Sakit"~"Rumah Sakit",
x %in% c("Puskesmas","Puskesmas Pembantu")~"Puskesmas", x=="Klinik"~"Klinik",
x=="Praktek Nakes Mandiri"~"Praktik Mandiri", TRUE~"Lainnya")
FAC_COLS <- c("Rumah Sakit"=NAVY,"Puskesmas"=TEAL,"Klinik"=AMBER,"Praktik Mandiri"=PURPLE,"Lainnya"=GREY)
fm <- H$fac_mix |> filter(key %in% core3) |> mutate(cat=factor(catfac(Tipe_Faskes), levels=names(FAC_COLS)),
label=H$national$label[match(key,H$national$key)]) |>
group_by(label, cat) |> summarise(hc=sum(hc), .groups="drop") |> group_by(label) |> mutate(pct=100*hc/sum(hc)) |> ungroup()
ggplot(fm, aes(pct, label, fill=cat)) + geom_col(width=.62) +
scale_fill_manual(values=FAC_COLS, name=NULL) + scale_x_continuous(labels=function(x)paste0(x,"%"), expand=c(0,0)) +
labs(title="Di Mana Tenaga Keswa Bekerja: Bauran Tipe Fasilitas · Unit: % posisi (headcount)",
subtitle="Semua tipe faskes dikategorikan (tak ada kategori tak-berlabel). Tenaga psikiatri terpusat di rumah sakit, bukan puskesmas.",
x=NULL, y=NULL, caption=CAP) + th()

| Bauran tipe fasilitas tenaga keswa, tabel data figur |
| Kader |
Tipe fasilitas |
Posisi (headcount) |
% |
| Perawat Kesehatan Jiwa |
Rumah Sakit |
4,417 |
89.0 |
| Perawat Kesehatan Jiwa |
Puskesmas |
290 |
5.8 |
| Perawat Kesehatan Jiwa |
Klinik |
232 |
4.7 |
| Perawat Kesehatan Jiwa |
Lainnya |
19 |
0.4 |
| Perawat Kesehatan Jiwa |
Praktik Mandiri |
3 |
0.1 |
| Psikiater (Sp.KJ) |
Rumah Sakit |
1,345 |
93.1 |
| Psikiater (Sp.KJ) |
Klinik |
70 |
4.8 |
| Psikiater (Sp.KJ) |
Praktik Mandiri |
22 |
1.5 |
| Psikiater (Sp.KJ) |
Lainnya |
7 |
0.5 |
| Psikolog Klinis |
Rumah Sakit |
1,243 |
51.3 |
| Psikolog Klinis |
Klinik |
522 |
21.5 |
| Psikolog Klinis |
Praktik Mandiri |
381 |
15.7 |
| Psikolog Klinis |
Puskesmas |
195 |
8.0 |
| Psikolog Klinis |
Lainnya |
82 |
3.4 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Cakupan & pemerataan
Indikator sama: pemerataan tenaga. Tab = breakdown (per kader ·
kota vs kabupaten · Jawa vs luar Jawa).
Kabupaten tanpa
tenaga (per kader)
cz <- H$coverage |> filter(key %in% core3) |>
transmute(label=fct_reorder(label, -pct_kab_zero),
`Kabupaten tanpa tenaga`=pct_kab_zero, `Kabupaten dengan >=1`=pct_kab_covered) |>
tidyr::pivot_longer(-label, names_to="status", values_to="pct")
ggplot(cz, aes(pct, label, fill=status)) + geom_col(width=.62) +
geom_text(aes(label=paste0(pct,"%")), position=position_stack(vjust=.5), size=3, color="white", fontface="bold") +
scale_fill_manual(values=c("Kabupaten tanpa tenaga"=RED,"Kabupaten dengan >=1"=NAVY), name=NULL) +
scale_x_continuous(labels=function(x)paste0(x,"%"), expand=c(0,0)) +
labs(title="Cakupan Kabupaten/Kota: Punya vs Tanpa Tenaga Keswa · Unit: % kabupaten",
subtitle=sprintf("Dari %d kabupaten/kota. Merah = tak punya satu pun tenaga kader tsb.", H$coverage$n_kab_total[1]),
x=NULL, y=NULL, caption=CAP) + th()

| Cakupan & maldistribusi kader inti, tabel data figur |
| Kader |
% kab dgn >=1 |
% kab tanpa |
% populasi tercakup |
Gini distribusi |
| Psikiater (Sp.KJ) |
61.9 |
38.1 |
81.0 |
0.771 |
| Psikolog Klinis |
59.1 |
40.9 |
79.3 |
0.804 |
| Perawat Kesehatan Jiwa |
62.3 |
37.7 |
76.5 |
0.881 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Kota vs
Kabupaten
zarea <- bind_rows(lapply(core3, function(k){
bk <- H$by_kab |> filter(key==k)
H$pop_kab |> mutate(has = code %in% bk$code[bk$hc>0]) |> group_by(area) |>
summarise(pct_zero=round(100*mean(!has),1), .groups="drop") |> mutate(kader=H$national$label[H$national$key==k]) }))
zarea <- zarea |> mutate(kader=factor(kader, levels=H$national$label[match(core3,H$national$key)]))
ggplot(zarea, aes(pct_zero, kader, fill=area)) + geom_col(position="dodge", width=.66) +
geom_text(aes(label=paste0(pct_zero,"%")), position=position_dodge(width=.66), hjust=-0.1, size=2.7, color=NAVY, fontface="bold") +
scale_fill_manual(values=c("Kota"=NAVY,"Kabupaten"=AMBER), name=NULL) +
scale_x_continuous(labels=function(x)paste0(x,"%"), expand=expansion(mult=c(0,.14))) +
labs(title="Persen Wilayah TANPA Tenaga Keswa: Kota vs Kabupaten · Unit: % wilayah",
subtitle="Kekosongan tenaga jauh lebih parah di kabupaten (rural) ketimbang kota.",
x="% wilayah tanpa tenaga kader tsb", y=NULL, caption=CAP) + th()

| Kekosongan tenaga: kota vs kabupaten, tabel data figur |
| Kader |
Wilayah |
% tanpa tenaga |
| Psikiater (Sp.KJ) |
Kabupaten |
45.2 |
| Psikiater (Sp.KJ) |
Kota |
15.3 |
| Psikolog Klinis |
Kabupaten |
49.0 |
| Psikolog Klinis |
Kota |
12.2 |
| Perawat Kesehatan Jiwa |
Kabupaten |
43.0 |
| Perawat Kesehatan Jiwa |
Kota |
25.5 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Jawa vs luar
Jawa
jw <- H$coverage |> filter(key %in% core3) |>
transmute(kader=H$national$label[match(key,H$national$key)],
`Share tenaga di Jawa`=java_share_hc, `Share penduduk di Jawa`=java_pop_share) |>
tidyr::pivot_longer(-kader, names_to="ukuran", values_to="pct")
ggplot(jw, aes(pct, kader, fill=ukuran)) + geom_col(position="dodge", width=.62) +
geom_text(aes(label=paste0(pct,"%")), position=position_dodge(width=.62), hjust=-0.1, size=2.7, color=NAVY, fontface="bold") +
scale_fill_manual(values=c("Share tenaga di Jawa"=NAVY,"Share penduduk di Jawa"=GREY), name=NULL) +
scale_x_continuous(labels=function(x)paste0(x,"%"), expand=expansion(mult=c(0,.14))) +
labs(title="Konsentrasi di Jawa: Share Tenaga vs Share Penduduk · Unit: %",
subtitle="Bila batang tenaga > batang penduduk, Jawa menyerap tenaga melebihi proporsi penduduknya (over-konsentrasi).",
x=NULL, y=NULL, caption=CAP) + th()

| Konsentrasi Jawa vs penduduk, tabel data figur |
| Kader |
Share tenaga Jawa (%) |
Share penduduk Jawa (%) |
Rasio konsentrasi |
| Psikiater (Sp.KJ) |
59.1 |
55.6 |
1.060 |
| Psikolog Klinis |
64.1 |
55.6 |
1.150 |
| Perawat Kesehatan Jiwa |
46.3 |
55.6 |
0.830 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Pilar 3, Fasilitas
& Organisasi Layanan
③ Pilar 3 · RS Jiwa (RSJ) · Layanan Jiwa di RS Umum · Gurun Layanan ·
Kepemilikan
Availability = jumlah RSJ & RS berlayanan jiwa;
Accessibility = sebaran provinsi/pulau & kabupaten tanpa
fasilitas; Quality = ragam layanan & kepemilikan. Tiap figur
disertai tabelnya.
Key takeaway fasilitas: Indonesia bertumpu pada 42 RS Jiwa
(0.15/juta penduduk), dengan 7 provinsi tanpa RSJ. Hanya 27.3%
RS menyediakan layanan jiwa dewasa dan 7.6% layanan
anak-remaja. Hanya 53.3% kabupaten/kota memiliki >=1 RS
berlayanan jiwa.
Ketersediaan layanan
jiwa di rumah sakit
sv <- F$svc_national |> mutate(layanan=fct_reorder(layanan, pct_rs))
ggplot(sv, aes(pct_rs, layanan)) + geom_col(fill=NAVY, width=.68) +
geom_text(aes(label=sprintf("%.1f%% (%s RS)", pct_rs, fmt(n_rs_ada))), hjust=-0.05, size=2.9, color=NAVY, fontface="bold") +
scale_x_continuous(labels=function(x)paste0(x,"%"), expand=expansion(mult=c(0,.24))) +
labs(title="Ketersediaan Layanan Kesehatan Jiwa di Rumah Sakit Indonesia · Unit: % dari 3.275 RS",
subtitle="Berapa persen RS (umum+khusus) menawarkan tiap layanan jiwa (flag layanan SIRS 2025).",
x="% rumah sakit menyediakan", y=NULL, caption=CAP) + th()

| Ketersediaan layanan jiwa di RS, tabel data figur |
| Layanan |
RS menyediakan |
% dari total RS |
| Jiwa dewasa |
895 |
27.3 |
| Jiwa lansia |
747 |
22.8 |
| Jiwa anak & remaja |
248 |
7.6 |
| Jiwa masyarakat |
563 |
17.2 |
| NAPZA/adiksi (psikiatri) |
122 |
3.7 |
| Rehab mental |
295 |
9.0 |
| Konseling & psikoterapi |
737 |
22.5 |
| Psikologi & psikometri |
709 |
21.6 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
RS Jiwa (RSJ)
Indikator sama: jumlah RS Jiwa. Tab = breakdown (per provinsi ·
per pulau · kepemilikan).
Per provinsi
rp <- F$rsj_prov |> mutate(prov_name=fct_reorder(prov_name, n_rsj))
ggplot(rp, aes(n_rsj, prov_name, fill=island)) + geom_col(width=.72) +
geom_text(aes(label=n_rsj), hjust=-0.3, size=2.7, color=NAVY, fontface="bold") +
scale_fill_manual(values=ISL_COLS, name=NULL) + scale_x_continuous(expand=expansion(mult=c(0,.1))) +
labs(title="Jumlah RS Jiwa (RSJ) menurut Provinsi · Unit: RSJ",
subtitle=sprintf("%d provinsi tanpa RSJ. Terkonsentrasi di Jawa & ibu kota provinsi besar.", sum(F$rsj_prov$n_rsj==0)),
x="Jumlah RSJ", y=NULL, caption=CAP) + th(10)

| RSJ per provinsi, tabel data figur |
| Provinsi |
Pulau |
Penduduk 2025 |
RSJ |
RSJ per 1 juta |
| DKI JAKARTA |
Jawa |
10,677,990 |
4 |
0.370 |
| JAWA TENGAH |
Jawa |
38,233,920 |
4 |
0.100 |
| SUMATERA UTARA |
Sumatera |
15,785,840 |
3 |
0.190 |
| SUMATERA BARAT |
Sumatera |
5,914,280 |
2 |
0.340 |
| JAWA BARAT |
Jawa |
50,758,990 |
2 |
0.040 |
| DI YOGYAKARTA |
Jawa |
3,781,550 |
2 |
0.530 |
| JAWA TIMUR |
Jawa |
42,089,260 |
2 |
0.050 |
| KALIMANTAN BARAT |
Kalimantan |
5,766,020 |
2 |
0.350 |
| ACEH |
Sumatera |
5,625,960 |
1 |
0.180 |
| RIAU |
Sumatera |
6,811,180 |
1 |
0.150 |
| JAMBI |
Sumatera |
3,768,490 |
1 |
0.270 |
| SUMATERA SELATAN |
Sumatera |
8,928,510 |
1 |
0.110 |
| BENGKULU |
Sumatera |
2,138,060 |
1 |
0.470 |
| LAMPUNG |
Sumatera |
9,522,900 |
1 |
0.110 |
| KEPULAUAN BANGKA BELITUNG |
Sumatera |
1,550,820 |
1 |
0.640 |
| BANTEN |
Jawa |
12,537,440 |
1 |
0.080 |
| BALI |
Bali-Nusra |
4,461,270 |
1 |
0.220 |
| NUSA TENGGARA BARAT |
Bali-Nusra |
5,731,120 |
1 |
0.170 |
| NUSA TENGGARA TIMUR |
Bali-Nusra |
5,742,580 |
1 |
0.170 |
| KALIMANTAN TENGAH |
Kalimantan |
2,845,010 |
1 |
0.350 |
| KALIMANTAN SELATAN |
Kalimantan |
4,323,340 |
1 |
0.230 |
| KALIMANTAN TIMUR |
Kalimantan |
4,267,610 |
1 |
0.230 |
| SULAWESI UTARA |
Sulawesi |
2,721,440 |
1 |
0.370 |
| SULAWESI SELATAN |
Sulawesi |
9,563,130 |
1 |
0.100 |
| SULAWESI TENGGARA |
Sulawesi |
2,836,760 |
1 |
0.350 |
| MALUKU |
Maluku-Papua |
1,970,560 |
1 |
0.510 |
| MALUKU UTARA |
Maluku-Papua |
1,373,830 |
1 |
0.730 |
| KEPULAUAN RIAU |
Sumatera |
2,213,460 |
0 |
0.000 |
| KALIMANTAN UTARA |
Kalimantan |
749,370 |
0 |
0.000 |
| SULAWESI TENGAH |
Sulawesi |
3,156,110 |
0 |
0.000 |
| GORONTALO |
Sulawesi |
1,242,250 |
0 |
0.000 |
| SULAWESI BARAT |
Sulawesi |
1,525,340 |
0 |
0.000 |
| PAPUA BARAT |
Maluku-Papua |
1,224,090 |
0 |
0.000 |
| PAPUA |
Maluku-Papua |
4,600,450 |
0 |
0.000 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Per pulau
ri <- F$rsj_prov |> group_by(island) |> summarise(n_rsj=sum(n_rsj), pop=sum(pop), .groups="drop") |>
mutate(rsj_per1m=round(n_rsj/pop*1e6,2), island=fct_reorder(island, n_rsj))
ggplot(ri, aes(n_rsj, island, fill=island)) + geom_col(width=.66) +
geom_text(aes(label=sprintf("%d RSJ · %.2f/juta", n_rsj, rsj_per1m)), hjust=-0.05, size=2.8, color=NAVY, fontface="bold") +
scale_fill_manual(values=ISL_COLS, guide="none") + scale_x_continuous(expand=expansion(mult=c(0,.3))) +
labs(title="RS Jiwa menurut Pulau · Unit: RSJ (& per 1 juta penduduk)",
subtitle="Jawa memuat mayoritas RSJ; Indonesia timur paling kosong relatif terhadap penduduk.",
x="Jumlah RSJ", y=NULL, caption=CAP) + th()

| RSJ per pulau, tabel data figur |
| Pulau |
Penduduk |
RSJ |
RSJ per 1 juta |
| Jawa |
158,079,150 |
15 |
0.090 |
| Sumatera |
62,259,500 |
12 |
0.190 |
| Kalimantan |
17,951,350 |
5 |
0.280 |
| Bali-Nusra |
15,934,970 |
3 |
0.190 |
| Sulawesi |
21,045,030 |
3 |
0.140 |
| Maluku-Papua |
9,168,930 |
2 |
0.220 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Kepemilikan
ow <- F$rsj_owner |> mutate(pct=round(100*n/sum(n),1), pemilik=fct_reorder(pemilik, n))
ggplot(ow, aes(n, pemilik)) + geom_col(fill=NAVY, width=.66) +
geom_text(aes(label=sprintf("%d (%.1f%%)", n, pct)), hjust=-0.1, size=2.9, color=NAVY, fontface="bold") +
scale_x_continuous(expand=expansion(mult=c(0,.2))) +
labs(title="Kepemilikan RS Jiwa (RSJ) · Unit: RSJ",
subtitle="Mayoritas RSJ milik pemerintah (provinsi/pusat), kapasitas swasta terbatas.",
x="Jumlah RSJ", y=NULL, caption=CAP) + th()

| Kepemilikan RSJ, tabel data figur |
| Kepemilikan |
Jumlah RSJ |
% |
| Pemprop |
30 |
71.4 |
| Organisasi Sosial |
5 |
11.9 |
| Kemkes |
4 |
9.5 |
| Organisasi Islam |
1 |
2.4 |
| Pemkab |
1 |
2.4 |
| SWASTA/LAINNYA |
1 |
2.4 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Cakupan fasilitas
jiwa tingkat kabupaten
mc <- tibble::tibble(status=c("Kabupaten dengan >=1 RS layanan jiwa","Kabupaten tanpa RS layanan jiwa"),
pct=c(F$mh_coverage$pct_kab_with_mh_rs, 100-F$mh_coverage$pct_kab_with_mh_rs))
ggplot(mc, aes(x=pct, y="", fill=status)) + geom_col(width=.5) +
geom_text(aes(label=paste0(round(pct),"%")), position=position_stack(vjust=.5), color="white", fontface="bold", size=4) +
scale_fill_manual(values=c("Kabupaten dengan >=1 RS layanan jiwa"=NAVY,"Kabupaten tanpa RS layanan jiwa"=RED), name=NULL) +
scale_x_continuous(labels=function(x)paste0(x,"%"), expand=c(0,0)) +
labs(title=sprintf("Cakupan Fasilitas Jiwa Tingkat Kabupaten/Kota (n=%d) · Unit: %% kabupaten", F$mh_coverage$n_kab_total),
subtitle=sprintf("Kabupaten dengan RSJ atau RS umum berlayanan jiwa dewasa. Wilayah tercakup memuat %.0f%% penduduk.", F$mh_coverage$pop_covered_pct),
x=NULL, y=NULL, caption=CAP) + th() + theme(legend.position="bottom")

| Cakupan kabupaten RS-jiwa, tabel data figur |
| Status |
Jumlah kab |
% |
| Kabupaten dengan >=1 RS layanan jiwa |
274 |
53.3 |
| Kabupaten tanpa RS layanan jiwa |
240 |
46.7 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Senjang data, tempat tidur psikiatri. Indikator WHO-AIMS kunci
adalah tempat tidur psikiatri per 100.000. Sumber bed RS yang
tersedia (pivot SIRS) hanya mencakup sampel parsial rumah sakit
dan tidak memilah bangsal jiwa, sehingga tidak dilaporkan di sini
untuk menghindari angka menyesatkan. Estimasi tempat tidur psikiatri =
langkah lanjut (ekstraksi bed-per-RSJ lengkap dari SIRS/Ditjen Yankes).
Pilar 2,
Pembiayaan
② Pilar 2 · Belanja JKN Keswa · Konsentrasi RSJ vs Komunitas · Beban
Out-of-Pocket
Availability = besar belanja keswa dalam JKN;
Accessibility = sejauh mana pembiayaan menjangkau layanan
primer/komunitas (bukan hanya RS); Quality = apakah belanja
menutup kontinuitas (rawat jalan, obat) bukan sekadar rawat inap krisis.
if(!is.null(JKN)){
cy <- JKN$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.5, size=2.7, color=NAVY, fontface="bold") +
scale_x_continuous(breaks=2015:2024, labels=function(x)paste0("'",substr(x,3,4))) +
scale_y_continuous(expand=expansion(mult=c(0,.12))) +
labs(title="Belanja Klaim FKRTL Gangguan Jiwa dalam JKN per Tahun · Unit: Miliar Rupiah (tertimbang)",
subtitle=sprintf("Basis sampel reguler BPJS (proyeksi nasional). Kumulatif 2015–2024 ≈ Rp%s Miliar. FKTP kapitasi tak termasuk (bukan fee-for-service).", JKN$cost_total_bil),
x=NULL, y="Belanja (Miliar Rp)", caption="Sumber: ARC9.3 Data Sampel BPJS reguler 2015–2024 (tertimbang PSTV15)") + th()
} else { plot.new(); text(.5,.5,"Bundle JKN 9.3 tidak tersedia") }

if(!is.null(JKN) && !is.null(JKN$care_setting_total)){
cs <- JKN$care_setting_total |> mutate(pct=round(pct,1))
gt::gt(cs |> select(setting, pct)) |> gt::cols_label(setting="Tempat layanan FKRTL", pct="% kunjungan FKRTL jiwa") |>
gt::tab_header(title=gt::md("**Tabel 2.1, Distribusi Kunjungan FKRTL Jiwa menurut Tempat Layanan** · _proxy orientasi RSJ vs RS umum_")) |>
gt::data_color(columns=pct, colors=scales::col_numeric(c("#dbeafe","#1e3a5f"),domain=NULL)) |>
gt::tab_source_note(gt::md("Sumber: ARC9.3 reguler. RSJ menampung porsi besar rawat, orientasi sistem masih hospital-centric.")) |> gfmt()
}
| Tabel 2.1, Distribusi Kunjungan FKRTL Jiwa menurut Tempat Layanan · proxy orientasi RSJ vs RS umum |
| Tempat layanan FKRTL |
% kunjungan FKRTL jiwa |
| RS Umum |
78.1 |
| RS Khusus Jiwa (RSJ) |
20.0 |
| RS Khusus Lain |
1.3 |
| Lainnya |
0.5 |
| Sumber: ARC9.3 reguler. RSJ menampung porsi besar rawat, orientasi sistem masih hospital-centric. |
Key takeaway pembiayaan: JKN telah menjadi pembiaya utama
layanan keswa formal, dengan belanja FKRTL jiwa tumbuh menjadi
triliunan rupiah kumulatif. Namun pembiayaan terorientasi rumah
sakit (rawat jalan/inap FKRTL), sementara kapitasi FKTP untuk
keswa kecil dan layanan komunitas hampir tak terbiayai, selaras
dengan maldistribusi tenaga & fasilitas. Anggaran keswa dalam
APBD umumnya tak terpilah (menyatu di “kesehatan umum”), menyulitkan
pelacakan komitmen daerah; ini sendiri adalah temuan tata-kelola
pembiayaan.
Pilar 1, Governance
& Kebijakan
① Pilar 1 · Kerangka Hukum · Lini Masa Historis→Terkini→Arah Depan ·
Anatomi Pasal · Pedoman Klinis (PNPK)
Availability = adakah kerangka hukum & pedoman;
Accessibility = apakah mandat menjangkau daerah (desentralisasi);
Quality = kelengkapan pasal mutu/hak & pedoman klinis.
Sumber: ARC Indonesia Health Policy Review (korpus 12.454
regulasi, 21.810 pasal ter-tag) + PNPK (HTA Watchdog). Filter
keswa: judul/tema “Kesehatan Jiwa & NAPZA”.
Key takeaway governance: Kerangka hukum keswa ada dan baru
saja ditata ulang: UU 18/2014 Kesehatan Jiwa (berdiri sendiri)
dicabut & dilebur ke UU 17/2023 (omnibus Kesehatan) +
PP 28/2024. Namun beban regulasi bergeser ke daerah, 35 dari 50
regulasi keswa adalah Perda/Perbup/Pergub/Perwali (mayoritas
terbit 2025), sementara instrumen nasional sedikit. Dari 890 pasal
ber-tema keswa, hampir semua “Pengaturan”; pasal yang menyasar
layanan primer jauh lebih sedikit dari tersier/khusus. Pedoman
klinis (PNPK) keswa hanya 2 (Kedokteran Jiwa 2015; Tata Laksana
Skizofrenia 2025) dari puluhan topik PNPK nasional, menandai senjang
standar mutu klinis.
Lanskap regulasi
keswa: nasional vs daerah
il <- G$inv_level |> mutate(status=factor(status, levels=c("Berlaku","Tidak Berlaku")),
level=factor(level, levels=c("Nasional","Daerah (Perda/Perbup/Pergub/Perwali)")))
ggplot(il, aes(n, level, fill=status)) + geom_col(width=.55) +
geom_text(aes(label=n), position=position_stack(vjust=.5), color="white", fontface="bold", size=3.2) +
scale_fill_manual(values=c("Berlaku"=NAVY,"Tidak Berlaku"=GREY), name=NULL) +
scale_x_continuous(expand=expansion(mult=c(0,.05))) +
labs(title="Regulasi Kesehatan Jiwa: Tingkat Nasional vs Daerah · Unit: jumlah regulasi",
subtitle="Beban regulasi keswa bertumpu di DAERAH (Perda/Perbup/Pergub/Perwali); instrumen nasional sedikit.",
x="Jumlah regulasi", y=NULL, caption=G$meta$source) + th()

| Regulasi keswa menurut jenis & status, tabel data figur |
| Jenis regulasi |
Status |
Jumlah |
| Perbup |
Berlaku |
14 |
| Pergub |
Berlaku |
10 |
| Permenkes |
Berlaku |
7 |
| Perwali |
Berlaku |
7 |
| Perda |
Berlaku |
4 |
| Permenkes |
Tidak Berlaku |
3 |
| KepeselonI |
Berlaku |
1 |
| Pergub |
Tidak Berlaku |
1 |
| Permensos |
Berlaku |
1 |
| UU |
Berlaku |
1 |
| UU |
Tidak Berlaku |
1 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Lini masa: historis →
terkini → arah ke depan
tl <- G$timeline |> filter(year>=2009) |> mutate(status=factor(status, levels=c("Berlaku","Tidak Berlaku")))
ggplot(tl, aes(year, n, fill=status)) + geom_col(width=.8) +
annotate("segment", x=2014, xend=2014, y=0, yend=Inf, color=RED, linetype="dashed") +
annotate("text", x=2014, y=Inf, label="UU 18/2014 Keswa", color=RED, size=2.6, vjust=1.3, hjust=1.05, fontface="italic") +
annotate("segment", x=2023, xend=2023, y=0, yend=Inf, color=NAVY, linetype="dashed") +
annotate("text", x=2023, y=Inf, label="UU 17/2023 (omnibus)
mencabut UU 18/2014", color=NAVY, size=2.6, vjust=1.2, hjust=1.05, fontface="italic", lineheight=.9) +
scale_fill_manual(values=c("Berlaku"=NAVY,"Tidak Berlaku"=GREY), name=NULL) +
scale_x_continuous(breaks=seq(2010,2026,2)) + scale_y_continuous(expand=expansion(mult=c(0,.16))) +
labs(title="Lini Masa Penerbitan Regulasi Kesehatan Jiwa (2009–2026) · Unit: regulasi/tahun",
subtitle="Aktivitas regulasi keswa berlanjut 2015–2026 (mayoritas DAERAH). Abu-abu = sudah dicabut/diganti (termasuk UU 18/2014).",
x=NULL, y="Regulasi terbit", caption=G$meta$source) + th()

| Regulasi keswa tingkat nasional (lini masa), tabel data figur |
| Judul |
Jenis |
Tahun |
Status |
| Undang-undang (UU) Nomor 18 Tahun 2014 tentang Kesehatan Jiwa |
UU |
2,014 |
Tidak Berlaku |
| Peraturan Menteri Kesehatan Nomor 77 Tahun 2015 tentang Pedoman Pemeriksaan Kesehatan J... |
Permenkes |
2,015 |
Berlaku |
| Peraturan Menteri Kesehatan Nomor 77 Tahun 2015 tentang Pedoman Pemeriksaan Kesehatan J... |
Permenkes |
2,015 |
Berlaku |
| Peraturan Menteri Kesehatan Nomor 60 Tahun 2015 tentang Standar Kompetensi manajerial J... |
Permenkes |
2,015 |
Berlaku |
| Peraturan Menteri Kesehatan Nomor 55 Tahun 2015 tentang Pengurangan Dampak Buruk pada P... |
Permenkes |
2,015 |
Tidak Berlaku |
| Peraturan Menteri Kesehatan Nomor 55 Tahun 2015 tentang Pengurangan Dampak Buruk Pada P... |
Permenkes |
2,015 |
Tidak Berlaku |
| Peraturan Menteri Kesehatan Nomor 54 Tahun 2017 tentang Penanggulangan Pemasungan pada ... |
Permenkes |
2,017 |
Berlaku |
| Peraturan Menteri Kesehatan Nomor 54 Tahun 2017 tentang Penanggulangan Pemasungan pada ... |
Permenkes |
2,017 |
Berlaku |
| Peraturan Menteri Kesehatan Nomor 45 Tahun 2017 tentang Izin dan Penyelenggaraan Prakti... |
Permenkes |
2,017 |
Tidak Berlaku |
| Peraturan Menteri Sosial Nomor 12 Tahun 2018 tentang Pedoman Pencegahan dan Penanganan ... |
Permensos |
2,018 |
Berlaku |
| Peraturan Menteri Kesehatan Nomor 29 Tahun 2022 tentang Pedoman Pemeriksaan Kesehatan J... |
Permenkes |
2,022 |
Berlaku |
| Peraturan Menteri Kesehatan Nomor 29 Tahun 2022 tentang Pedoman Pemeriksaan Kesehatan J... |
Permenkes |
2,022 |
Berlaku |
| Undang-undang (UU) Nomor 23 Tahun 2022 tentang Pendidikan dan Layanan Psikologi |
UU |
2,022 |
Berlaku |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Transisi kerangka: dari UU khusus ke bab dalam omnibus
HISTORIS. UU No. 18 Tahun 2014 tentang Kesehatan Jiwa
adalah undang-undang
berdiri sendiri yang mengatur upaya keswa,
hak ODGJ/ODMK, dan larangan pemasungan. Status kini:
Dicabut.
TERKINI. UU No. 17 Tahun 2023 tentang Kesehatan
(omnibus)
mencabut UU 18/2014 dan meleburnya menjadi bagian/bab
keswa dalam satu undang-undang kesehatan terpadu, dilaksanakan oleh
PP No. 28 Tahun 2024; ditopang
UU 23/2022 (Pendidikan &
Layanan Psikologi) untuk tenaga psikolog. Implikasi: keswa
tidak
lagi punya UU sendiri, kekuatan/kelemahannya kini bergantung pada
turunan (Permenkes/SPM) dan implementasi daerah.
ARAH KE
DEPAN. Korpus ini
tidak menandai RUU/draft secara eksplisit,
sehingga “future law” dibaca dari sinyal: (1) gelombang
regulasi
daerah keswa 2025–2026; (2)
turunan UU 17/2023/PP 28/2024 yang
masih terbit bertahap (Permenkes standar layanan, tarif, SPM); (3)
penguatan kelembagaan (mis. akreditasi
Pusat Kesehatan Jiwa
Nasional 2026); (4)
PNPK baru (Skizofrenia 2025) sebagai
sinyal pembaruan standar klinis.
Anatomi pasal keswa
(korpus 890 pasal ber-tema “Kesehatan Jiwa & NAPZA”)
pa <- G$pasal_arah |> filter(arah_kebijakan!="Tidak-spesifik") |> mutate(arah_kebijakan=fct_reorder(arah_kebijakan, n))
ggplot(pa, aes(n, arah_kebijakan)) + geom_col(fill=NAVY, width=.62) +
geom_text(aes(label=n), hjust=-0.15, size=3, color=NAVY, fontface="bold") +
scale_x_continuous(expand=expansion(mult=c(0,.12))) +
labs(title="Arah Kebijakan Pasal-Pasal Kesehatan Jiwa · Unit: pasal",
subtitle="Tag arah kebijakan pada pasal ber-tema keswa (satu pasal bisa >1 arah). Mutu vs akses vs equity vs restriktif.",
x="Jumlah pasal", y=NULL, caption=G$meta$source) + th()

| Pasal keswa menurut tahap layanan, tabel data figur |
| Tahap layanan disasar pasal |
Jumlah pasal |
| Tidak-spesifik |
825 |
| Primer |
38 |
| Sekunder |
24 |
| Khusus |
12 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
| Regulasi dengan pasal keswa terbanyak, tabel data figur |
| Regulasi |
Tahun |
Pasal keswa |
| Peraturan Menteri Kesehatan Nomor 5 Tahun 2023 tentang Narkotika, Psikotropik... |
2,023 |
97 |
| Peraturan Menteri Kesehatan Nomor 5 Tahun 2023 tentang Narkotika, Psikotropik... |
2,023 |
97 |
| Peraturan Menteri Sosial Nomor 56/HUK/2009 Tahun 2009 tentang Pelayanan dan R... |
2,009 |
46 |
| Undang-undang (UU) Nomor 23 Tahun 2022 tentang Pendidikan dan Layanan Psikologi |
2,022 |
46 |
| Qanun Kabupaten Aceh Utara Nomor 1 Tahun 2022 tentang Pencegahan, Penanggulan... |
2,022 |
45 |
| Peraturan Pemerintah (PP) Nomor 40 Tahun 2011 tentang Pembinaan Pendampingan ... |
2,011 |
43 |
| Peraturan Menteri Sosial Nomor 8 Tahun 2014 tentang Pedoman Rehabilitasi Sosi... |
2,014 |
30 |
| Peraturan Menteri Kesehatan Nomor 47 Tahun 2016 tentang Penyelenggaraan Terap... |
2,016 |
27 |
| Peraturan Menteri Kesehatan Nomor 47 Tahun 2016 tentang Penyelenggaraan Terap... |
2,016 |
26 |
| Peraturan Pemerintah (PP) Nomor 28 Tahun 2024 tentang Peraturan Pelaksanaan U... |
2,024 |
24 |
| Peraturan Menteri Kesehatan Nomor 77 Tahun 2015 tentang Pedoman Pemeriksaan K... |
2,015 |
21 |
| Peraturan Menteri Kesehatan Nomor 16 Tahun 2022 tentang Tata Cara Penyelengga... |
2,022 |
21 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Pedoman klinis (PNPK)
kesehatan jiwa
PNPK (Pedoman Nasional Pelayanan Kedokteran) = standar tata
laksana klinis resmi Kemenkes, instrumen mutu inti. Untuk keswa,
jumlahnya sangat sedikit dibanding kebutuhan spektrum gangguan
jiwa.
| Pedoman klinis (PNPK) kesehatan jiwa yang tersedia, tabel data figur |
| PNPK Kesehatan Jiwa |
Tahun |
| PNPK Kedokteran Jiwa |
2,015 |
| Pedoman Nasional Pelayanan Klinis Tata Laksana Skizofrenia |
2,025 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Senjang pedoman klinis. Hanya 2 PNPK keswa yang
teridentifikasi (Kedokteran Jiwa 2015; Tata Laksana Skizofrenia 2025),
padahal beban gangguan jiwa mencakup depresi, ansietas, bipolar,
gangguan zat, demensia, gangguan anak-remaja, dll. Mayoritas tata
laksana keswa belum berpedoman PNPK nasional, standar mutu klinis
bertumpu pedoman organisasi profesi/PPK lokal, menyulitkan keseragaman
& penjaminan mutu lintas-fasilitas.
Pilar 5, Obat &
Teknologi (Psikotropika)
⑤ Pilar 5 · Psikotropika Esensial · WHO EML → Fornas → Primer → Harga ·
Acuan NICE
Availability = apakah psikotropika esensial ada di formularium
nasional (Fornas); Accessibility = apakah tersedia di tingkat
PRIMER (FPKTP), bukan hanya rumah sakit (FPKTL); Quality =
keselarasan dengan acuan internasional WHO Essential Medicines List
(EML) dan NICE UK. Sumber: dashboard HTA Watchdog ARC
(100.64.0.5:1320), integrasi WHO EML × Fornas × INAPROC
e-katalog × NICE; psikotropika = ATC N03/N05/N06 (64 obat).
Key takeaway obat: Dari 31 psikotropika esensial WHO,
23 (74.2%) masuk Fornas Indonesia, tetapi hanya 9 (29%)
tersedia di tingkat primer (FPKTP), sisanya terbatas di rumah
sakit (FPKTL). Pola ini memperkuat temuan SDM & fasilitas:
obat jiwa esensial pun terkunci di tingkat rumah sakit,
menyulitkan kontinuitas pengobatan di puskesmas. 8 obat esensial WHO
bahkan belum di Fornas.
Kaskade ketersediaan:
dari WHO EML ke layanan primer
cc <- M$eml_cascade
ggplot(cc, aes(n, fct_rev(tahap), fill=tahap)) + geom_col(width=.62) +
geom_text(aes(label=sprintf("%d (%.0f%%)", n, pct)), hjust=-0.08, size=3.2, color=NAVY, fontface="bold") +
scale_fill_manual(values=c("WHO EML (esensial)"=NAVY,"Ada di Fornas Indonesia"=BLUE,
"Tersedia di Primer (FPKTP)"=RED,"Procurable (INAPROC e-katalog)"=TEAL), guide="none") +
scale_x_continuous(expand=expansion(mult=c(0,.18))) +
labs(title="Kaskade Ketersediaan Psikotropika Esensial: WHO EML → Fornas → Primer · Unit: jenis obat",
subtitle="Penyusutan tiap tahap = senjang akses. Penurunan tajam di 'Primer (FPKTP)' = obat esensial terkunci di RS.",
x="Jumlah jenis psikotropika", y=NULL, caption=M$meta$source) + th()

| Kaskade ketersediaan psikotropika esensial, tabel data figur |
| Tahap |
Jumlah obat |
% dari WHO EML |
| WHO EML (esensial) |
31 |
100.0 |
| Ada di Fornas Indonesia |
23 |
74.2 |
| Tersedia di Primer (FPKTP) |
9 |
29.0 |
| Procurable (INAPROC e-katalog) |
19 |
61.3 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Per kelompok terapi:
esensial vs di Fornas vs di primer
bg <- M$by_group |> select(group, `WHO EML`=n_eml, `EML di Fornas`=n_eml_fornas, `EML di Primer (FPKTP)`=n_eml_fpktp) |>
tidyr::pivot_longer(-group, names_to="tahap", values_to="n") |>
mutate(tahap=factor(tahap, levels=c("WHO EML","EML di Fornas","EML di Primer (FPKTP)")),
group=fct_reorder(group, n, .fun=max))
ggplot(bg, aes(n, group, fill=tahap)) + geom_col(position="dodge", width=.72) +
geom_text(aes(label=n), position=position_dodge(width=.72), hjust=-0.3, size=2.6, color=NAVY) +
scale_fill_manual(values=c("WHO EML"=NAVY,"EML di Fornas"=BLUE,"EML di Primer (FPKTP)"=RED), name=NULL) +
scale_x_continuous(expand=expansion(mult=c(0,.1))) +
labs(title="Psikotropika Esensial menurut Kelompok Terapi: Esensial vs Tersedia · Unit: jenis obat",
subtitle="Untuk tiap kelompok: jumlah di WHO EML, yang masuk Fornas, dan yang tersedia di layanan primer (FPKTP).",
x="Jumlah jenis obat", y=NULL, caption=M$meta$source) + th()

| Psikotropika per kelompok terapi: esensial vs tersedia, tabel data figur |
| Kelompok terapi |
Total (HTA) |
WHO EML |
EML di Fornas |
EML di Primer |
Procurable (INAPROC) |
| Antipsikotik (N05A) |
16 |
12 |
9 |
2 |
11 |
| Antiepilepsi/Mood-stabilizer (N03) |
16 |
8 |
7 |
3 |
10 |
| Antidepresan (N06A) |
12 |
5 |
2 |
2 |
5 |
| Ansiolitik/Sedatif (N05B/C) |
13 |
3 |
3 |
2 |
10 |
| Psikostimulan (N06B) |
6 |
2 |
1 |
0 |
3 |
| Lain (N06 lain) |
1 |
1 |
1 |
0 |
1 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Psikotropika esensial
WHO yang belum optimal tersedia
| Esensial WHO tetapi TIDAK di Fornas, tabel data figur |
| Kelompok |
Obat (WHO EML) |
ATC |
Indikasi WHO |
| Antidepresan (N06A) |
Clomipramine |
N06AA04 |
Obsessive-compulsive disorder |
| Antidepresan (N06A) |
Phenelzine |
N06AF03 |
Other specified depressive disorders |
| Antidepresan (N06A) |
Bupropion |
N06AX12 |
Nicotine dependence |
| Antiepilepsi/Mood-stabilizer (N03) |
Ethosuximide |
N03AD01 |
Absence seizures, typical |
| Antipsikotik (N05A) |
Fluphenazine |
N05AB02 |
Schizophrenia or other primary psychotic disorders |
| Antipsikotik (N05A) |
Zuclopenthixol Decanoate |
N05AF05 |
Schizophrenia or other primary psychotic disorders |
| Antipsikotik (N05A) |
Brexpiprazole |
N05AX16 |
Depressive disorders |
| Psikostimulan (N06B) |
Caffeine Citrate |
N06BC01 |
Apnoea of newborn |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
| Esensial WHO di Fornas tetapi HANYA tingkat RS (bukan primer), tabel data figur |
| Kelompok |
Obat (WHO EML) |
ATC |
Tier Fornas |
Indikasi WHO |
| Ansiolitik/Sedatif (N05B/C) |
Midazolam |
N05CD08 |
RS saja (FPKTL) |
Status epilepticus; Status epilepticus; Sedative-hypnotic and anxiolytic drugs; Palliative care |
| Antiepilepsi/Mood-stabilizer (N03) |
Clonazepam |
N03AE01 |
RS saja (FPKTL) |
Generalised myoclonic seizure |
| Antiepilepsi/Mood-stabilizer (N03) |
Valproic Acid (Sodium Valproate) |
N03AG01 |
RS saja (FPKTL) |
Epilepsy or seizures; Status epilepticus; Bipolar or related disorders |
| Antiepilepsi/Mood-stabilizer (N03) |
Lamotrigine |
N03AX09 |
RS saja (FPKTL) |
Epilepsy or seizures |
| Antiepilepsi/Mood-stabilizer (N03) |
Levetiracetam |
N03AX14 |
RS saja (FPKTL) |
Epilepsy or seizures; Status epilepticus |
| Antipsikotik (N05A) |
Clozapine |
N05AH02 |
RS saja (FPKTL) |
Schizophrenia or other primary psychotic disorders |
| Antipsikotik (N05A) |
Olanzapine |
N05AH03 |
RS saja (FPKTL) |
Schizophrenia or other primary psychotic disorders; Schizophrenia or other primary psychotic disorders |
| Antipsikotik (N05A) |
Quetiapine |
N05AH04 |
RS saja (FPKTL) |
Schizophrenia or other primary psychotic disorders; Bipolar or related disorders |
| Antipsikotik (N05A) |
Lithium Carbonate |
N05AN01 |
RS saja (FPKTL) |
Bipolar or related disorders |
| Antipsikotik (N05A) |
Risperidone |
N05AX08 |
RS saja (FPKTL) |
Schizophrenia or other primary psychotic disorders; Schizophrenia or other primary psychotic disorders |
| Antipsikotik (N05A) |
Aripiprazole |
N05AX12 |
RS saja (FPKTL) |
Schizophrenia or other primary psychotic disorders; Schizophrenia or other primary psychotic disorders |
| Antipsikotik (N05A) |
Paliperidone |
N05AX13 |
RS saja (FPKTL) |
Schizophrenia or other primary psychotic disorders; Schizophrenia or other primary psychotic disorders |
| Lain (N06 lain) |
Donepezil |
N06DA02 |
RS saja (FPKTL) |
Dementia due to Alzheimer disease |
| Psikostimulan (N06B) |
Methylphenidate |
N06BA04 |
RS saja (FPKTL) |
Attention deficit hyperactivity disorder |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Biaya pengadaan
bulanan (INAPROC), psikotropika Fornas terpilih
| Estimasi biaya pengadaan bulanan psikotropika (proxy INAPROC e-katalog), tabel data figur |
| Kelompok |
Obat |
Biaya/bulan (Rp, proxy INAPROC) |
| Ansiolitik/Sedatif (N05B/C) |
Alprazolam |
5,100 |
| Ansiolitik/Sedatif (N05B/C) |
Lorazepam |
22,500 |
| Ansiolitik/Sedatif (N05B/C) |
Clobazam |
24,480 |
| Antidepresan (N06A) |
Maprotiline |
119,700 |
| Antidepresan (N06A) |
Sertraline |
119,880 |
| Antidepresan (N06A) |
Escitalopram |
144,000 |
| Antiepilepsi/Mood-stabilizer (N03) |
Carbamazepine |
75,000 |
| Antiepilepsi/Mood-stabilizer (N03) |
Lamotrigine |
84,360 |
| Antiepilepsi/Mood-stabilizer (N03) |
Valproic Acid (Sodium Valproate) |
251,910 |
| Antipsikotik (N05A) |
Risperidone |
11,100 |
| Antipsikotik (N05A) |
Trifluoperazine |
21,060 |
| Antipsikotik (N05A) |
Clozapine |
64,800 |
| Psikostimulan (N06B) |
Methylphenidate |
618,000 |
| Sumber: DREAMS/SI-SDMK Kemenkes 2025 (headcount per faskes) & SIRS Kemenkes 2025-10 · denominator proyeksi penduduk BPS 2025 |
Acuan NICE UK & teknologi digital
NICE UK sebagai pembanding HTA: appraisal teknologi NICE untuk
psikotropika tergolong
jarang (fokus pada obat baru/biaya tinggi,
mis. aripiprazole untuk skizofrenia remaja & bipolar), sehingga
WHO EML menjadi acuan “harus-tersedia” yang lebih lengkap untuk
obat esensial keswa.
Telemedicine/layanan digital keswa
berkembang pasca-pandemi (telekonsultasi jiwa) namun cakupan nasionalnya
belum terukur sistematis.
Catatan cakupan. Analisis ini menilai status formularium
(Fornas) & kelayakan tingkat layanan (FPKTP/FPKTL) serta harga
pengadaan (INAPROC), bukan stok riil tiap puskesmas
(kekosongan/stockout), yang memerlukan data ASPAK/SILADAK dan tetap
menjadi senjang. Artinya: bahkan obat yang boleh di primer belum
tentu ada fisik di rak puskesmas.
Pilar 7, Kualitas &
Hak Asasi Manusia
⑦ Pilar 7 · Standar Layanan · Akreditasi · Praktik Koersif
(Pasung/Restraint) · Mekanisme Pengaduan
Apa yang diketahui & senjang data
Dimensi mutu & HAM adalah inti agenda keswa modern
(deinstitusionalisasi, layanan berbasis hak, anti-koersi). Indonesia
memiliki kerangka (akreditasi RS termasuk RSJ; program
Bebas
Pasung; larangan pemasungan dalam UU 18/2014). Namun indikator
mutu/HAM rutin,
prevalensi pasung, praktik restraint/seklusi,
kepatuhan standar mhGAP, mekanisme pengaduan,
tidak tersedia
terpilah dalam data yang diakses laporan ini.
Senjang data, mutu & HAM. Penilaian penuh memerlukan
instrumen seperti WHO QualityRights, audit fasilitas, dan survei
berbasis komunitas (termasuk estimasi pasung yang tak terlihat di
klaim). Dilaporkan sebagai senjang prioritas untuk situational
analysis NMHP fase lanjut, bukan sebagai indikasi ketiadaan masalah,
justru area dengan risiko pelanggaran hak tertinggi.
Sintesis, Scorecard
Availability–Accessibility–Quality
aaq <- tibble::tribble(
~Pilar, ~Availability, ~Accessibility, ~Quality,
"SDM (HRH)", sprintf("Psikiater %.2f/100k (≪ WHO ~1)", H$national$per100k[H$national$key=="psikiater"]),
sprintf("%.0f%% kab tanpa psikiater; Gini %.2f", H$coverage$pct_kab_zero[H$coverage$key=="psikiater"], H$coverage$gini_kab[H$coverage$key=="psikiater"]),
"Sub-spesialis puluhan org; tenaga di RS bukan primer",
"Fasilitas", sprintf("%d RSJ; %.0f%% RS berlayanan jiwa dewasa", F$rsj_national$n_rsj, F$svc_national$pct_rs[1]),
sprintf("%d prov tanpa RSJ; %.0f%% kab punya RS-jiwa", sum(F$rsj_prov$n_rsj==0), F$mh_coverage$pct_kab_with_mh_rs),
"Layanan anak-remaja/NAPZA/rehab langka; bed tak terdata",
"Pembiayaan", "JKN biayai keswa (triliunan kumulatif)", "Terorientasi RS; APBD tak terpilah", "Kapitasi FKTP & komunitas minim",
"Governance", sprintf("%d regulasi keswa; UU 17/2023 omnibus + PP 28/2024", G$meta$n_mh_docs), sprintf("%d/%d regulasi = daerah; nasional sedikit", G$inv_level$n[G$inv_level$level!="Nasional"&G$inv_level$status=="Berlaku"], G$meta$n_mh_docs), sprintf("hanya %d PNPK keswa; pasal mutu/akses minim", nrow(G$pnpk_mh_u)),
"Obat", sprintf("%d/%d psikotropika WHO-EML ada di Fornas", M$eml_cascade$n[2], M$eml_cascade$n[1]), sprintf("hanya %d (%.0f%%) tersedia di primer (FPKTP)", M$eml_cascade$n[3], M$eml_cascade$pct[3]), "Kontinuitas obat (PDC) tertantang; stok faskes tak terdata",
"Sistem informasi", "DREAMS/SIRS/SATUSEHAT/BPJS aktif", "Indikator keswa tak terstandar", "Integrasi antar-sistem parsial",
"Mutu & HAM", "Kerangka akreditasi & Bebas Pasung", "Data pasung/restraint tak rutin", "Audit hak (QualityRights) belum")
gt::gt(aaq) |> gt::tab_header(title=gt::md("**Tabel Sintesis, Scorecard Sisi Suplai Keswa menurut Availability–Accessibility–Quality**")) |>
gt::tab_style(style=gt::cell_text(weight="bold",color=NAVY), locations=gt::cells_body(columns=Pilar)) |>
gt::tab_source_note(gt::md("Ringkasan kualitatif dari pilar-pilar di atas. Sel merujuk temuan kuantitatif (SDM, Fasilitas, Pembiayaan) atau penilaian naratif + senjang data (Governance, Obat, SIK, Mutu/HAM).")) |> gfmt()
| Tabel Sintesis, Scorecard Sisi Suplai Keswa menurut Availability–Accessibility–Quality |
| Pilar |
Availability |
Accessibility |
Quality |
| SDM (HRH) |
Psikiater 0.51/100k (≪ WHO ~1) |
38% kab tanpa psikiater; Gini 0.77 |
Sub-spesialis puluhan org; tenaga di RS bukan primer |
| Fasilitas |
42 RSJ; 27% RS berlayanan jiwa dewasa |
7 prov tanpa RSJ; 53% kab punya RS-jiwa |
Layanan anak-remaja/NAPZA/rehab langka; bed tak terdata |
| Pembiayaan |
JKN biayai keswa (triliunan kumulatif) |
Terorientasi RS; APBD tak terpilah |
Kapitasi FKTP & komunitas minim |
| Governance |
50 regulasi keswa; UU 17/2023 omnibus + PP 28/2024 |
35/50 regulasi = daerah; nasional sedikit |
hanya 2 PNPK keswa; pasal mutu/akses minim |
| Obat |
23/31 psikotropika WHO-EML ada di Fornas |
hanya 9 (29%) tersedia di primer (FPKTP) |
Kontinuitas obat (PDC) tertantang; stok faskes tak terdata |
| Sistem informasi |
DREAMS/SIRS/SATUSEHAT/BPJS aktif |
Indikator keswa tak terstandar |
Integrasi antar-sistem parsial |
| Mutu & HAM |
Kerangka akreditasi & Bebas Pasung |
Data pasung/restraint tak rutin |
Audit hak (QualityRights) belum |
| Ringkasan kualitatif dari pilar-pilar di atas. Sel merujuk temuan kuantitatif (SDM, Fasilitas, Pembiayaan) atau penilaian naratif + senjang data (Governance, Obat, SIK, Mutu/HAM). |
Sintesis: Sisi suplai keswa Indonesia menampilkan pola
konsisten lintas pilar: kerangka kebijakan & pembiayaan
ada, tetapi kapasitas riil (tenaga, fasilitas, obat) langka dan
terkonsentrasi di Jawa/kota, dengan layanan berorientasi rumah
sakit ketimbang komunitas/primer. Hambatan terbesar bukan ketiadaan
mandat hukum, melainkan distribusi sumber daya dan data
mutu/HAM yang tak terpantau. Prioritas kebijakan: perluasan &
redistribusi tenaga (task-shifting/mhGAP ke puskesmas), penguatan
layanan keswa primer & komunitas, dan pembangunan sistem indikator
keswa yang terstandar.
Keterbatasan &
langkah lanjut
Keterbatasan
(1) Headcount = posisi per-faskes, bukan orang unik, kemungkinan
hitung-ganda lintas faskes (SIP dilaporkan sebagai pembanding).
(2)
Cakupan DREAMS/SIRS bergantung pelaporan faskes; faskes tak melapor
→ under-count.
(3) Tempat tidur psikiatri, obat tingkat puskesmas,
indikator mutu/HAM belum tersedia terpilah → dilaporkan sebagai
senjang, bukan nol.
(4) Pembiayaan bertumpu klaim JKN (ARC9.3);
APBD keswa tak terpilah.
(5) Denominator = proyeksi penduduk BPS
2025 (bukan populasi berisiko spesifik).
Langkah lanjut prioritas: (a) ekstraksi tempat tidur psikiatri
per RSJ/RS lengkap (SIRS/Ditjen Yankes) untuk indikator
WHO-AIMS;
(b) peta choropleth kabupaten densitas psikiater
& gurun layanan (skill indonesia-district-map);
(c) ketersediaan
psikotropika tingkat puskesmas (ASPAK/SILADAK);
(d) integrasi
ke situational analysis NMHP (9 domain WHO) di Research
Center;
(e) puskesmas mampu jiwa (Rifaskes/ASPAK) untuk
kapasitas primer;
(f) standardisasi usia/kebutuhan untuk densitas
berbasis kebutuhan, bukan populasi kasar.
ARC9 Mental Health Institute, Arc Research Center · Sisi Suplai
Sistem Kesehatan Jiwa · June 2026. Sumber: DREAMS/SI-SDMK Kemenkes 2025;
SIRS Kemenkes 2025-10; proyeksi penduduk BPS 2020–2035; klaim BPJS
(ARC9.3). Counterpart manuscript: Research Center ARC9, 9.3 Indonesia
Mental Health Plan (NMHP situational analysis).