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 <- "aging_ltc_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)
pt <- A$pt
OUT_DIR <- "outputs"; if(!dir.exists(OUT_DIR)) dir.create(OUT_DIR)
TBL_DIR <- "tables"; if(!dir.exists(TBL_DIR)) dir.create(TBL_DIR)
wcsv <- function(df,name) { write.csv(df, file.path(TBL_DIR, paste0(name,".csv")), row.names=FALSE); df }
## ICD-10 3-char -> disease name (built from data: FKL16A / FKP15A). Used to label dx tables/figures.
ICDLAB <- tryCatch(read.csv("icd3_label.csv", stringsAsFactors=FALSE), error=function(e) data.frame(icd3=character(),disease=character()))
addlab <- function(df) df |> left_join(ICDLAB, by="icd3") |>
mutate(disease=ifelse(is.na(disease)|disease=="","(nama tidak tersedia)",disease),
lbl=paste0(icd3, " ", ifelse(nchar(disease)>44, paste0(substr(disease,1,44),"…"), disease)))
## ---- house style (palet dongker + abu terang) ----
INK<-"#0b1f3a"; NAVY<-"#0b1f3a"; NAVY2<-"#13315c"; BLUE<-"#3d5a80"; STEEL<-"#3d5a80"
SLATE<-"#5b7aa6"; MIST<-"#9fb3c8"; LMIST<-"#c7d2dd"; LGRAY<-"#e3e8ee"; GREY<-"#64748b"
TEAL<-"#13315c"; AMBER<-"#5b7aa6"; RED<-"#274060"; GREEN<-"#13315c"; PURPLE<-"#13315c"; ORANGE<-"#5b7aa6"
PANEL<-"#f3f5f8"; GRID<-"#dbe2ea"; TXT<-"#1f3350"
COLS6 <- c(INK,STEEL,NAVY2,SLATE,MIST,LMIST)
ABAND_COLS <- c("Pra-lansia (45–59)"=LMIST,"Lansia muda (60–69)"=SLATE,
"Lansia madya (70–79)"=NAVY2,"Lansia tua (80+)"=INK)
LVL_COLS <- c("FKTP (Primer)"="#2f9e44","FKRTL Rawat Jalan"=STEEL,"FKRTL Rawat Inap"=INK) # FKTP hijau utk kontras
ISLAND_COLS <- c("Jawa"=INK,"Sumatera"=STEEL,"Sulawesi"=NAVY2,"Kalimantan"=SLATE,"Bali-Nusra"=MIST,"Maluku-Papua"=LMIST,"Tidak diketahui"=LGRAY)
ENTRY_COLS <- c("1 FKTP (Primer)"=INK,
"2 FKRTL Rawat Jalan (langsung ke RS)"=STEEL,
"3 FKRTL Rawat Inap (langsung opname)"=LMIST)
th <- function(b=11) theme_minimal(base_size=b) + theme(
plot.title=element_text(color=INK,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=PANEL,color=NA),
panel.border=element_rect(color=GRID,fill=NA,linewidth=0.4),
panel.grid.major=element_line(color=GRID,linewidth=0.3), panel.grid.minor=element_blank(),
legend.position="bottom", legend.direction="horizontal", legend.box="horizontal",
legend.key.size=unit(.55,"lines"), legend.text=element_text(size=b-2),
strip.background=element_rect(fill=INK,color=NA),
strip.text=element_text(color="white",face="bold",size=b-1))
gfmt <- function(g) g |>
gt::tab_options(heading.background.color=INK, heading.title.font.size=gt::px(13),
column_labels.background.color=STEEL, column_labels.font.weight="bold", column_labels.font.size=gt::px(11),
row.striping.include_table_body=TRUE, row.striping.background_color="#eef2f7",
table.border.top.color=INK, 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 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN)"
fmt <- function(x) formatC(round(as.numeric(x)), format="d", big.mark=",")
pc1 <- function(x) paste0(formatC(x, format="f", digits=1),"%")
yrx <- function() scale_x_continuous(breaks=2015:2024, labels=function(x) paste0("'",substr(x,3,4)))
ABAND_LAB <- A$meta$aband_lab
Unit analisis (tercantum di tiap tabel/figur). Dokumen ini
memakai tiga unit, perhatikan badge · Unit: …: (1) Pasien
unik = orang, dihitung sekali (prevalensi, demografi, mortalitas,
ekuitas, multimorbiditas, sindrom geriatri); (2) Kunjungan/Klaim
= per layanan (volume utilisasi, biaya, INA-CBG, diagnosis tersering);
(3) Episode rawat inap = per perawatan inap (LOS, readmisi,
ACSC).
Cara baca. Setiap angka populasi adalah proyeksi
nasional tertimbang (PSTV15) dari sampel reguler BPJS, angka sampel
mentah dilaporkan terpisah. Definisi lansia mengikuti UU 13/1998: usia
≥60 tahun, kelompok pra-lansia 45–59 disertakan sebagai pembanding. Usia
dihitung dari tanggal lahir (PSTV03) terhadap tahun pelayanan, sehingga
status lansia ditentukan pada saat klaim. Data klaim hanya menggambarkan
populasi yang terlayani JKN, bukan seluruh penduduk lansia.
Peta Pilar (navigasi): Fondasi (kohort, definisi, Tabel
1, validasi desain sampel) · A Beban & Demografi · Kontak
Pertama (pintu masuk layanan) · B FKTP (Layanan Primer) ·
C FKRTL (Rujukan/RS) · D Rujukan & Konektivitas ·
E Geografi Member↔︎Faskes · F Sindrom Geriatri, ACSC &
Akhir Hayat · G Multimorbiditas · H Ekonomi · I
Ekuitas.
Fondasi: kohort,
definisi, dan desain sampel
⓪ Fondasi · Alur Kohort (STROBE) · Definisi Lansia · Tabel 1 · Validasi
Desain Sampel
Inti: Mendefinisikan populasi analisis (peserta JKN usia ≥45
tahun dengan ≥1 klaim FKTP atau FKRTL pada usia tersebut; lansia = ≥60),
karakteristiknya dibanding populasi lansia umum, dan kerangka
keterbatasan klaim.
Sumber & desain: Data Sampel BPJS
Kesehatan 2015–2024, schema reguler (sampel rumah tangga ~1%
peserta JKN, ~2,59 juta individu dalam ~1,07 juta keluarga).
Identifikasi via PSTV01, bobot nasional PSTV15, demografi via codebook
resmi (PSTV05 jenis kelamin, PSTV08 segmentasi, PSTV07 kelas rawat,
PSTV09 provinsi tempat tinggal, PSTV18 tahun meninggal).
cf <- A$cohort_flow
flow <- data.frame(
Tahap=c("Peserta sampel reguler usia ≥45 (snapshot terkini)",
"Kohort analisis usia ≥45 dengan ≥1 klaim (FKTP/FKRTL)",
" di antaranya pasien dengan klaim FKTP",
" di antaranya pasien dengan klaim FKRTL",
" di antaranya pasien dengan ≥1 rawat inap",
"KOHORT LANSIA (≥60) dengan ≥1 klaim"),
`Pasien (sampel mentah)`=c(cf$member_45plus_latest_def, cf$analytic_cohort_45plus,
cf$fktp_pts, cf$fkrtl_pts, cf$inpatient_pts, cf$analytic_cohort_lansia),
check.names=FALSE) |> wcsv("L0_1_cohort_flow")
gt::gt(flow) |>
gt::tab_header(title=gt::md("**Tabel L0.1: Alur Pembentukan Kohort (STROBE)** · _Unit: Pasien unik (sampel)_"),
subtitle=gt::md("_Sampel reguler BPJS 2015–2024, usia dihitung saat pelayanan_")) |>
gt::fmt_number(columns=2, decimals=0, use_seps=TRUE) |>
gt::data_color(columns=2, colors=scales::col_numeric(c("#e3e8ee","#0b1f3a"),domain=NULL)) |>
gt::tab_source_note(gt::md(CAP)) |> gfmt()
| Tabel L0.1: Alur Pembentukan Kohort (STROBE) · Unit: Pasien unik (sampel) |
| Sampel reguler BPJS 2015–2024, usia dihitung saat pelayanan |
| Tahap |
Pasien (sampel mentah) |
| Peserta sampel reguler usia ≥45 (snapshot terkini) |
871,994 |
| Kohort analisis usia ≥45 dengan ≥1 klaim (FKTP/FKRTL) |
590,123 |
| di antaranya pasien dengan klaim FKTP |
552,852 |
| di antaranya pasien dengan klaim FKRTL |
334,727 |
| di antaranya pasien dengan ≥1 rawat inap |
209,887 |
| KOHORT LANSIA (≥60) dengan ≥1 klaim |
246,075 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) |
Definisi lansia & kelompok usia
Mengikuti UU No. 13/1998 dan Permenkes 67/2015:
lanjut usia (lansia) = penduduk berusia ≥60 tahun. Kelompok
analisis: Pra-lansia (45–59) sebagai pembanding, Lansia muda
(60–69), Lansia madya (70–79), Lansia tua (80+). Usia
dihitung dari tanggal lahir (PSTV03) terhadap tahun pelayanan; kolom
umur bawaan basis data (~89% kosong) tidak dipakai.
Konteks demografi (benchmark populasi, BPS & SKI 2023).
Indonesia telah memasuki struktur penduduk menua sejak 2021 (≥10%
penduduk berusia ≥60). Pada 2023 penduduk lansia mencapai 11,75%
populasi dengan rasio ketergantungan lansia 17,08 per 100
penduduk usia produktif; komposisi lansia: 60–69 tahun 63,6%, 70–79
tahun 26,8%, ≥80 tahun 8,7%; mayoritas perempuan (52,3%). Proyeksi:
>14% pada 2030 dan ~20,3% (≈72 juta) pada 2045. Dari sisi
fungsi, SKI 2023 mencatat 95,0% lansia mandiri penuh dalam aktivitas
sehari-hari, 2,1% ketergantungan ringan, dan 2,9% ketergantungan
sedang–total, kelompok terakhir inilah inti kebutuhan perawatan
jangka panjang. Hipertensi terukur pada lansia naik dari 49,5%
(60–64) menjadi 64,0% (75+), namun hanya 8,6% dewasa
yang pernah didiagnosis dokter, mengindikasikan kesenjangan deteksi/tata
laksana yang besar.
Tabel 1,
Karakteristik Pasien Lansia vs Populasi Lansia Umum
Karakteristik pasien lansia (FKTP, FKRTL, Overall =
kohort lansia ≥60) dibandingkan populasi lansia umum (seluruh
peserta sampel reguler usia ≥60, terlepas dari ada/tidaknya klaim).
Angka = % per kolom (tertimbang).
n1 <- A$table1_n
gt::gt(A$table1, groupname_col="char", rowname_col="level") |>
gt::tab_header(title=gt::md("**Tabel 1: Karakteristik Pasien Lansia vs Populasi Lansia JKN** · _Unit: Pasien unik (tertimbang), % per kolom_"),
subtitle=gt::md(sprintf("_FKTP n=%s · FKRTL n=%s · Overall n=%s · Lansia GenPop n=%s (peserta sampel)_",
fmt(n1$raw[n1$kolom=="FKTP"]), fmt(n1$raw[n1$kolom=="FKRTL"]),
fmt(n1$raw[n1$kolom=="Overall (Lansia)"]), fmt(n1$raw[n1$kolom=="Elderly GenPop"])))) |>
gt::cols_label(FKTP="FKTP %", FKRTL="FKRTL %", Overall="Overall %", GeneralPop="Lansia 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("#e3e8ee","#0b1f3a"),domain=NULL)) |>
gt::data_color(columns=GeneralPop, colors=scales::col_numeric(c("#e3e8ee","#13315c"),domain=NULL)) |>
gt::tab_source_note(gt::md(paste(CAP,"| Lansia Umum = seluruh peserta sampel reguler ≥60"))) |> gfmt()
| Tabel 1: Karakteristik Pasien Lansia vs Populasi Lansia JKN · Unit: Pasien unik (tertimbang), % per kolom |
| FKTP n=227,804 · FKRTL n=161,915 · Overall n=246,075 · Lansia GenPop n=383,356 (peserta sampel) |
|
FKTP % |
FKRTL % |
Overall % |
Lansia Umum % |
| Jenis Kelamin |
| Perempuan |
52.4 |
49.8 |
52.1 |
50.6 |
| Laki-laki |
47.6 |
50.2 |
47.9 |
49.4 |
| Kelompok Usia |
| Lansia muda (60–69) |
58.1 |
58.0 |
57.3 |
49.8 |
| Lansia madya (70–79) |
29.1 |
30.8 |
29.6 |
27.7 |
| Lansia tua (80+) |
12.8 |
11.2 |
13.1 |
22.5 |
| Segmentasi |
| PBI APBN |
52.8 |
37.6 |
51.5 |
48.3 |
| Bukan Pekerja |
15.7 |
22.5 |
16.3 |
17.6 |
| PBPU (Mandiri) |
13.8 |
21.6 |
14.5 |
12.6 |
| PBI APBD |
13.9 |
13.0 |
13.9 |
16.6 |
| PPU |
3.9 |
5.3 |
3.8 |
4.9 |
| Kelas Rawat |
| Kelas III |
76.0 |
64.1 |
74.8 |
73.1 |
| Kelas I |
15.5 |
23.9 |
16.2 |
16.6 |
| Kelas II |
8.5 |
12.0 |
9.0 |
10.3 |
| Pulau |
| Jawa |
64.9 |
61.9 |
64.4 |
59.5 |
| Sumatera |
17.5 |
19.5 |
17.7 |
17.5 |
| Sulawesi |
7.5 |
7.9 |
7.5 |
7.1 |
| Bali-Nusra |
5.2 |
5.1 |
5.2 |
5.3 |
| Kalimantan |
3.8 |
4.2 |
3.9 |
4.2 |
| Maluku-Papua |
1.1 |
1.4 |
1.2 |
6.4 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) | Lansia Umum = seluruh peserta sampel reguler ≥60 |
invisible(wcsv(A$table1,"T1_karakteristik"))
sp <- A$strata_patient |> mutate(grp=as.character(grp)) |> filter(!is.na(grp)) |> wcsv("L0_2_strata_usia")
gt::gt(sp) |>
gt::cols_label(grp="Kelompok Usia", weighted="Pasien (tertimbang)", raw="Pasien (sampel)", pct_w="Proporsi (%)") |>
gt::tab_header(title=gt::md("**Tabel L0.2: Distribusi Kelompok Usia (kohort ≥45)** · _Unit: Pasien unik (tertimbang)_")) |>
gt::fmt_number(columns=c(weighted,raw),decimals=0,use_seps=TRUE) |>
gt::data_color(columns=weighted, colors=scales::col_numeric(c("#e3e8ee","#0b1f3a"),domain=NULL)) |>
gt::tab_source_note(gt::md(CAP)) |> gfmt()
| Tabel L0.2: Distribusi Kelompok Usia (kohort ≥45) · Unit: Pasien unik (tertimbang) |
| Kelompok Usia |
Pasien (tertimbang) |
Pasien (sampel) |
Proporsi (%) |
| Pra-lansia (45–59) |
35,997,105 |
344,048 |
56.6 |
| Lansia muda (60–69) |
15,836,344 |
148,307 |
24.9 |
| Lansia madya (70–79) |
8,179,931 |
70,965 |
12.9 |
| Lansia tua (80+) |
3,622,770 |
26,803 |
5.7 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) |
Keterbatasan utama (berlaku di seluruh dokumen). Angka berikut
adalah peserta JKN yang sampai ke fasilitas dan klaimnya tercatat, bukan
seluruh penduduk lansia. Lansia yang tidak pernah mengakses layanan,
atau dilayani lewat program non-klaim (Posyandu/Posbindu Lansia, program
obat tertentu), tidak tertangkap. Kohort dibangun dari sampel rumah
tangga reguler, sehingga tren tahunan relatif valid, namun tahun awal
sedikit under-observed (peserta yang keluar atau meninggal sebelum
penarikan sampel tidak terlihat). Tidak ada nilai laboratorium/vital
(tekanan darah, HbA1c) maupun data dispensing obat lengkap, sehingga
indikator kendali penyakit dan polifarmasi hanya berupa proksi.
Pilar A,
Beban Penyakit & Demografi
① Pilar A · Lansia Terlayani per Tahun · Piramida Usia-Jenis Kelamin ·
Distribusi Geografis
Pertanyaan: Berapa banyak lansia yang terlayani JKN, bagaimana
trennya, profil usia-jenis kelamin, dan sebaran wilayahnya.
Lansia terlayani per
tahun
py <- A$prev_year |> filter(!is.na(grp)) |> mutate(grp=factor(grp, levels=ABAND_LAB)) |> wcsv("A1_prev_year_band")
ggplot(py, aes(yr, wt_pts, fill=grp)) +
geom_col(width=.72) +
annotate("text", x=2020.5, y=max(A$prev_year_total$wt_pts)*1.02, label="dip COVID-19 2020–21", color=RED, size=2.8, fontface="italic") +
scale_fill_manual(values=ABAND_COLS, name=NULL) +
yrx() + scale_y_continuous(labels=label_number(scale_cut=cut_short_scale()), expand=expansion(mult=c(0,.08))) +
labs(title="Penduduk Usia ≥45 Terlayani JKN per Tahun, menurut Kelompok Usia · Unit: pasien unik",
subtitle="Pasien unik tertimbang (proyeksi nasional). Layanan menurun pada 2020–2021 (pembatasan pandemi).",
x=NULL, y="Pasien (tertimbang)", caption=CAP) + th()

pyt <- A$prev_year_total |> left_join(A$prev_year_lansia |> rename(lansia_raw=raw_pts, lansia_wt=wt_pts), by="yr") |>
transmute(Tahun=yr, `Usia ≥45 (sampel)`=raw_pts, `Usia ≥45 (tertimbang)`=wt_pts,
`Lansia ≥60 (sampel)`=lansia_raw, `Lansia ≥60 (tertimbang)`=lansia_wt) |> wcsv("A1_prev_year_total")
gt::gt(pyt) |>
gt::tab_header(title=gt::md("**Tabel A.1: Penduduk ≥45 & Lansia ≥60 Terlayani JKN per Tahun** · _Unit: Pasien unik (tertimbang)_")) |>
gt::fmt_number(columns=2:5, decimals=0, use_seps=TRUE) |>
gt::tab_source_note(gt::md(CAP)) |> gfmt()
| Tabel A.1: Penduduk ≥45 & Lansia ≥60 Terlayani JKN per Tahun · Unit: Pasien unik (tertimbang) |
| Tahun |
Usia ≥45 (sampel) |
Usia ≥45 (tertimbang) |
Lansia ≥60 (sampel) |
Lansia ≥60 (tertimbang) |
| 2015 |
99,900 |
8,445,870 |
37,139 |
3,378,952 |
| 2016 |
130,838 |
10,508,558 |
47,662 |
4,080,945 |
| 2017 |
183,000 |
19,025,247 |
65,988 |
7,386,420 |
| 2018 |
210,186 |
22,215,950 |
77,598 |
8,747,018 |
| 2019 |
234,588 |
25,329,517 |
88,222 |
10,050,800 |
| 2020 |
217,600 |
22,844,849 |
83,822 |
9,208,301 |
| 2021 |
222,929 |
23,110,229 |
84,432 |
9,118,251 |
| 2022 |
252,625 |
26,229,325 |
95,644 |
10,176,227 |
| 2023 |
281,364 |
29,593,704 |
110,101 |
11,875,655 |
| 2024 |
306,558 |
32,751,039 |
121,614 |
13,331,471 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) |
Piramida usia-jenis
kelamin
pyr <- A$pyramid |> mutate(sex_lab=ifelse(sex==1,"Laki-laki","Perempuan"),
wt_signed=ifelse(sex==1,-wt,wt)) |> wcsv("A2_pyramid")
ord <- pyr |> distinct(ageband) |> arrange(ageband) |> pull(ageband)
pyr <- pyr |> mutate(ageband=factor(ageband, levels=ord))
mx <- max(pyr$wt)
ggplot(pyr, aes(wt_signed, ageband, fill=sex_lab)) +
geom_col(width=.85) +
scale_fill_manual(values=c("Laki-laki"=INK,"Perempuan"=MIST), name=NULL) +
scale_x_continuous(labels=function(x) label_number(scale_cut=cut_short_scale())(abs(x)),
limits=c(-mx,mx)) +
labs(title="Piramida Usia-Jenis Kelamin Penduduk ≥45 Terlayani JKN · Unit: pasien unik",
subtitle="Pasien unik tertimbang. Dominasi perempuan menguat pada kelompok usia tertua.",
x="Pasien (tertimbang)", y="Kelompok usia (5 tahun)", caption=CAP) + th()

Distribusi geografis
(lansia ≥60)
gi <- A$geo_island |> mutate(island=fct_reorder(island, wt_pts)) |> wcsv("A3_geo_island")
ggplot(gi, aes(wt_pts, island, fill=island)) + geom_col(width=.7) +
geom_text(aes(label=paste0(fmt(wt_pts)," (",pc1(pct),")")), hjust=-0.04, size=3, color=NAVY, fontface="bold") +
scale_fill_manual(values=ISLAND_COLS, guide="none") +
scale_x_continuous(labels=label_number(scale_cut=cut_short_scale()), expand=expansion(mult=c(0,.2))) +
labs(title="Sebaran Lansia (≥60) Terlayani menurut Pulau · Unit: pasien unik",
subtitle="Pasien unik tertimbang", x="Lansia (tertimbang)", y=NULL, caption=CAP) + th()

gp <- A$geo_prov |> select(Provinsi=prov_name, Pulau=island, `Sampel`=raw_pts, `Tertimbang`=wt_pts, `%`=pct) |>
head(15) |> wcsv("A3_geo_prov")
gt::gt(gp) |>
gt::tab_header(title=gt::md("**Tabel A.3: 15 Provinsi dengan Lansia Terlayani Terbanyak** · _Unit: Pasien unik (tertimbang)_")) |>
gt::fmt_number(columns=c(Sampel,Tertimbang),decimals=0,use_seps=TRUE) |>
gt::data_color(columns=Tertimbang, colors=scales::col_numeric(c("#e3e8ee","#0b1f3a"),domain=NULL)) |>
gt::tab_source_note(gt::md(CAP)) |> gfmt()
| Tabel A.3: 15 Provinsi dengan Lansia Terlayani Terbanyak · Unit: Pasien unik (tertimbang) |
| Provinsi |
Pulau |
Sampel |
Tertimbang |
% |
| Jawa Timur |
Jawa |
36,982 |
5,240,006 |
19.0 |
| Jawa Tengah |
Jawa |
42,528 |
5,039,944 |
18.2 |
| Jawa Barat |
Jawa |
31,959 |
4,449,205 |
16.1 |
| DKI Jakarta |
Jawa |
5,697 |
1,316,903 |
4.8 |
| Sumatera Utara |
Sumatera |
13,548 |
1,247,214 |
4.5 |
| Sulawesi Selatan |
Sulawesi |
10,385 |
1,023,546 |
3.7 |
| Banten |
Jawa |
5,025 |
887,440 |
3.2 |
| DI Yogyakarta |
Jawa |
5,930 |
782,127 |
2.8 |
| Lampung |
Sumatera |
7,514 |
748,069 |
2.7 |
| Sumatera Selatan |
Sumatera |
8,393 |
676,056 |
2.4 |
| Sumatera Barat |
Sumatera |
5,929 |
625,246 |
2.3 |
| Bali |
Bali-Nusra |
6,979 |
520,849 |
1.9 |
| Nusa Tenggara Barat |
Bali-Nusra |
3,227 |
498,362 |
1.8 |
| Aceh |
Sumatera |
3,921 |
491,881 |
1.8 |
| Nusa Tenggara Timur |
Bali-Nusra |
6,106 |
419,488 |
1.5 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) |
Kontak
Pertama, pintu masuk layanan
▶ Kontak Pertama · Berapa Banyak Lansia Berkunjung · Ke Mana Visit
Pertama · menurut Usia/Segmen/Tahun
Pertanyaan: Berapa banyak lansia yang benar-benar mengakses
layanan, dan saat kontak pertama yang teramati, lewat pintu mana mereka
masuk, layanan primer (FKTP) atau langsung ke rumah sakit (FKRTL rawat
jalan/rawat inap). Ini menggambarkan fungsi gatekeeping dan
kesinambungan layanan untuk lansia.
Definisi kontak pertama
Kontak pertama = klaim bertanggal paling awal yang teramati
untuk tiap lansia (≥60) dalam jendela 2015–2024. Bila pada tanggal yang
sama terdapat klaim FKTP dan FKRTL, kontak dihitung lewat FKTP
(masuk via layanan primer). Karena jendela pengamatan terbatas, ini
adalah kontak pertama yang teramati, bukan tentu kontak pertama
seumur hidup.
Berapa banyak lansia
berkunjung
lvy <- A$lansia_visiting_year |> wcsv("E0_lansia_visiting_year")
ggplot(lvy, aes(yr, wt_pts)) +
geom_col(width=.7, fill=TEAL) +
geom_text(aes(label=label_number(scale_cut=cut_short_scale())(wt_pts)), vjust=-0.5, size=3, color=NAVY, fontface="bold") +
yrx() + scale_y_continuous(labels=label_number(scale_cut=cut_short_scale()), expand=expansion(mult=c(0,.1))) +
labs(title="Jumlah Lansia (≥60) yang Berkunjung ke Layanan JKN per Tahun · Unit: pasien unik",
subtitle=sprintf("Total lansia unik pernah berkunjung 2015–2024 (sampel): %s orang | tertimbang per tahun di bawah",
fmt(A$lansia_visiting_total$n_lansia_visiting)),
x=NULL, y="Lansia (tertimbang)", caption=CAP) + th()

Ke mana visit
pertama
eo <- A$entry_overall |> wcsv("E1_entry_overall")
eo2 <- eo |> mutate(entry=factor(entry, levels=names(ENTRY_COLS)))
ggplot(eo2, aes(x=pct, y="", fill=entry)) + geom_col(width=.5) +
geom_text(aes(label=paste0(pc1(pct))), position=position_stack(vjust=.5), color="white", fontface="bold", size=3.4) +
scale_fill_manual(values=ENTRY_COLS, name=NULL) +
scale_x_continuous(labels=scales::percent_format(scale=1), expand=expansion(mult=c(0,.02))) +
guides(fill=guide_legend(nrow=1)) +
labs(title="Pintu Masuk Kontak Pertama Lansia ke Sistem JKN · Unit: pasien unik (lansia)",
subtitle="Proporsi lansia menurut jenis fasilitas pada kontak pertama yang teramati",
x="Proporsi lansia", y=NULL, caption=CAP) + th() + theme(axis.text.y=element_blank())

gt::gt(eo |> mutate(entry=stringr::str_remove(entry,"^[0-9] "))) |>
gt::cols_label(entry="Pintu masuk (kontak pertama)", raw="Lansia (sampel)", wt="Lansia (tertimbang)", pct="%") |>
gt::tab_header(title=gt::md("**Tabel KP.1: Pintu Masuk Kontak Pertama Lansia** · _Unit: Pasien unik (lansia)_")) |>
gt::fmt_number(columns=c(raw,wt),decimals=0,use_seps=TRUE) |>
gt::tab_source_note(gt::md(CAP)) |> gfmt()
| Tabel KP.1: Pintu Masuk Kontak Pertama Lansia · Unit: Pasien unik (lansia) |
| Pintu masuk (kontak pertama) |
Lansia (sampel) |
Lansia (tertimbang) |
% |
| FKTP (Primer) |
194,992 |
22,347,989 |
79.2 |
| FKRTL Rawat Jalan (langsung ke RS) |
21,173 |
2,026,888 |
8.6 |
| FKRTL Rawat Inap (langsung opname) |
29,910 |
3,264,169 |
12.2 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) |
Fasilitas &
alasan saat masuk langsung ke RS
ec <- A$entry_fkrtl_class |> wcsv("E5_entry_fkrtl_class")
gt::gt(ec) |>
gt::cols_label(kelas_rs="Kelas RS (saat masuk langsung ke FKRTL)", raw="Kunjungan (sampel)", pct="%") |>
gt::tab_header(title=gt::md("**Tabel KP.2: Kelas RS pada Kontak Pertama yang Langsung ke FKRTL** · _Unit: Pasien unik (entry FKRTL)_")) |>
gt::fmt_number(columns=raw,decimals=0,use_seps=TRUE) |>
gt::tab_source_note(gt::md(CAP)) |> gfmt()
| Tabel KP.2: Kelas RS pada Kontak Pertama yang Langsung ke FKRTL · Unit: Pasien unik (entry FKRTL) |
| Kelas RS (saat masuk langsung ke FKRTL) |
Kunjungan (sampel) |
% |
| RS Kelas C |
24,923 |
48.8 |
| RS Kelas B |
15,284 |
29.9 |
| RS Kelas D |
7,541 |
14.8 |
| RS Kelas A |
1,784 |
3.5 |
| RS Khusus/Lain |
1,551 |
3.0 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) |
ed <- A$entry_dx_top |> filter(icd3!="" & !is.na(icd3) & nchar(icd3)==3) |> head(12) |> addlab() |> wcsv("E6_entry_dx_top")
gt::gt(ed |> select(icd3, disease, raw)) |>
gt::cols_label(icd3="ICD-10", disease="Penyakit (diagnosis kontak pertama)", raw="Kunjungan (sampel)") |>
gt::tab_header(title=gt::md("**Tabel KP.3: 12 Diagnosis Tersering pada Kontak Pertama Lansia (kode + nama)** · _Unit: Kunjungan (sampel)_")) |>
gt::fmt_number(columns=raw,decimals=0,use_seps=TRUE) |>
gt::tab_source_note(gt::md(paste(CAP,"| kode Z (kontak administratif) dikecualikan"))) |> gfmt()
| Tabel KP.3: 12 Diagnosis Tersering pada Kontak Pertama Lansia (kode + nama) · Unit: Kunjungan (sampel) |
| ICD-10 |
Penyakit (diagnosis kontak pertama) |
Kunjungan (sampel) |
| I10 |
Essential (primary) hypertension |
18,798 |
| M79 |
Myalgia |
10,833 |
| J06 |
Acute upper respiratory infection, unspecified |
8,876 |
| K30 |
Dyspepsia |
7,271 |
| K29 |
Gastritis, unspecified |
6,830 |
| J00 |
Acute nasopharyngitis [common cold] |
6,056 |
| E11 |
Non-insulin-dependent diabetes mellitus with unspecified complications |
5,691 |
| R51 |
Headache |
3,503 |
| H25 |
Senile cataract |
3,462 |
| R50 |
Fever, unspecified |
3,120 |
| A09 |
Diarrhoea and gastroenteritis of presumed infectious origin |
2,858 |
| M54 |
Low back pain |
2,665 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) | kode Z (kontak administratif) dikecualikan |
Key takeaway kontak pertama: Mayoritas lansia masuk ke sistem JKN
lewat layanan primer (FKTP), namun sebagian masuk langsung ke
rumah sakit, dan porsi masuk-langsung-opname meningkat pada
kelompok usia tertua, konsisten dengan presentasi yang lebih
berat/akut pada lansia tua. Pola per segmen menunjukkan apakah pintu
masuk berbeda antara peserta subsidi (PBI) dan non-PBI, sinyal penting
untuk penguatan gatekeeping dan deteksi dini di tingkat primer.
Pilar B,
FKTP (Layanan Primer)
② Pilar B · Volume FKTP · Diagnosis Tersering · Cakupan FKTP/FKRTL ·
Penyakit Kronis (Prolanis)
Pertanyaan: Bagaimana lansia memanfaatkan layanan primer,
penyakit apa yang dikelola di FKTP, dan seberapa besar peran FKTP dalam
pengelolaan penyakit kronis (hipertensi & diabetes, sasaran
Prolanis).
Volume &
diagnosis FKTP
fd <- A$fktp_dx_top |> filter(icd3!="" & !is.na(icd3) & nchar(icd3)==3) |> head(15) |> addlab() |>
mutate(lbl=fct_reorder(lbl, wt)) |> wcsv("B1_fktp_dx_top")
ggplot(fd, aes(wt, lbl)) + geom_col(width=.7, fill=TEAL) +
geom_text(aes(label=fmt(wt)), hjust=-0.05, size=2.9, color=NAVY) +
scale_x_continuous(labels=label_number(scale_cut=cut_short_scale()), expand=expansion(mult=c(0,.32))) +
labs(title="15 Diagnosis FKTP Tersering pada Lansia/Pra-lansia · Unit: kunjungan (tertimbang)",
subtitle="Kode ICD-10 3-digit + nama penyakit, kode Z dikecualikan", x="Kunjungan (tertimbang)", y=NULL, caption=CAP) + th()

gt::gt(fd |> select(icd3, disease, raw, wt)) |>
gt::cols_label(icd3="ICD-10", disease="Penyakit", raw="Kunjungan (sampel)", wt="Kunjungan (tertimbang)") |>
gt::tab_header(title=gt::md("**Tabel B.1: 15 Diagnosis FKTP Tersering (kode + nama penyakit)** · _Unit: Kunjungan_")) |>
gt::fmt_number(columns=c(raw,wt),decimals=0,use_seps=TRUE) |>
gt::data_color(columns=wt, colors=scales::col_numeric(c("#e3e8ee","#0b1f3a"),domain=NULL)) |>
gt::tab_source_note(gt::md(paste(CAP,"| nama penyakit dari FKP15A"))) |> gfmt()
| Tabel B.1: 15 Diagnosis FKTP Tersering (kode + nama penyakit) · Unit: Kunjungan |
| ICD-10 |
Penyakit |
Kunjungan (sampel) |
Kunjungan (tertimbang) |
| I10 |
Essential (primary) hypertension |
882,856 |
71,744,841 |
| E11 |
Non-insulin-dependent diabetes mellitus with unspecified complications |
596,534 |
46,833,760 |
| M79 |
Myalgia |
404,050 |
35,144,185 |
| J06 |
Acute upper respiratory infection, unspecified |
393,054 |
31,226,963 |
| K30 |
Dyspepsia |
280,159 |
21,390,740 |
| J00 |
Acute nasopharyngitis [common cold] |
274,862 |
21,672,320 |
| K29 |
Gastritis, unspecified |
232,162 |
18,779,412 |
| R51 |
Headache |
160,827 |
13,811,426 |
| I11 |
Hypertensive heart disease |
141,640 |
10,959,973 |
| K04 |
Pulpitis |
129,696 |
11,153,512 |
| M54 |
Low back pain |
107,546 |
8,103,949 |
| R50 |
Fever, unspecified |
103,865 |
8,504,834 |
| J02 |
Acute pharyngitis, unspecified |
95,420 |
6,919,873 |
| I50 |
Congestive heart failure |
93,149 |
7,749,006 |
| I15 |
Secondary hypertension |
86,315 |
5,969,524 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) | nama penyakit dari FKP15A |
Cakupan layanan
cov <- A$coverage |> wcsv("B2_coverage")
gt::gt(cov) |>
gt::cols_label(grpc="Cakupan layanan (lansia)", wt="Pasien (tertimbang)", raw="Pasien (sampel)", pct="%") |>
gt::tab_header(title=gt::md("**Tabel B.2: Cakupan FKTP vs FKRTL pada Lansia** · _Unit: Pasien unik (tertimbang)_")) |>
gt::fmt_number(columns=c(wt,raw),decimals=0,use_seps=TRUE) |>
gt::tab_source_note(gt::md(CAP)) |> gfmt()
| Tabel B.2: Cakupan FKTP vs FKRTL pada Lansia · Unit: Pasien unik (tertimbang) |
| Cakupan layanan (lansia) |
Pasien (tertimbang) |
Pasien (sampel) |
% |
| FKTP + FKRTL |
13,081,710 |
143,644 |
47.3 |
| FKTP saja |
12,562,519 |
84,160 |
45.5 |
| FKRTL saja |
1,994,816 |
18,271 |
7.2 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) |
Penyakit kronis di layanan primer (relevansi Prolanis): Di antara
pasien FKTP, terdapat 157,929 pasien dengan diagnosis hipertensi
dan 64,759 dengan diabetes (sampel), dua penyakit kronis utama
yang menjadi sasaran Program Pengelolaan Penyakit Kronis (Prolanis) JKN.
Besarnya kontak hipertensi/diabetes di FKTP menegaskan peran sentral
layanan primer dalam manajemen penyakit kronis lansia.
Pilar C,
FKRTL (Rujukan/Rumah Sakit)
③ Pilar C · Volume Rawat Jalan/Inap · LOS menurut Usia & Kelas RS ·
Keparahan · Diagnosis Tersering
Pertanyaan: Bagaimana pola perawatan rumah sakit pada lansia,
lama rawat (LOS), tingkat keparahan, jenis RS, dan penyakit yang membawa
lansia ke rawat inap.
Volume utilisasi per
tahun
uy <- A$util_year |> wcsv("C1_util_year")
ggplot(uy, aes(yr, wt_visits, color=level)) + geom_line(linewidth=1) + geom_point(size=1.9) +
geom_text(aes(label=label_number(accuracy=0.1, scale_cut=cut_short_scale())(wt_visits)),
vjust=-0.9, size=2.5, fontface="bold", show.legend=FALSE) +
scale_color_manual(values=LVL_COLS, name=NULL) +
yrx() + scale_y_continuous(labels=label_number(scale_cut=cut_short_scale()), limits=c(0,NA), expand=expansion(mult=c(.02,.13))) +
guides(color=guide_legend(nrow=1)) +
labs(title="Volume Kunjungan menurut Tingkat Layanan per Tahun (usia ≥45) · Unit: kunjungan",
subtitle="Kunjungan tertimbang. Penurunan 2020–2021 mencerminkan pembatasan pandemi.",
x=NULL, y="Kunjungan (tertimbang)", caption=CAP) + th()

Keparahan &
diagnosis rawat inap
sev <- A$severity |> mutate(pct=round(100*wt/sum(wt),1)) |> wcsv("C3_severity")
gt::gt(sev) |>
gt::cols_label(severity="Tingkat keparahan (FKL23, lansia)", raw="Episode (sampel)", wt="Episode (tertimbang)", pct="%") |>
gt::tab_header(title=gt::md("**Tabel C.3: Tingkat Keparahan Rawat Inap Lansia** · _Unit: Episode rawat inap_")) |>
gt::fmt_number(columns=c(raw,wt),decimals=0,use_seps=TRUE) |>
gt::tab_source_note(gt::md(paste(CAP,"| FKL23: 1=Ringan, 2=Sedang, 3=Berat"))) |> gfmt()
| Tabel C.3: Tingkat Keparahan Rawat Inap Lansia · Unit: Episode rawat inap |
| Tingkat keparahan (FKL23, lansia) |
Episode (sampel) |
Episode (tertimbang) |
% |
| 2 Sedang |
142,144 |
12,729,098 |
63.7 |
| 3 Berat |
55,411 |
5,078,601 |
25.4 |
| 9 Lainnya |
22,583 |
2,164,340 |
10.8 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) | FKL23: 1=Ringan, 2=Sedang, 3=Berat |
idx <- A$fkrtl_inp_dx_top |> filter(icd3!="" & !is.na(icd3) & nchar(icd3)==3) |> head(15) |> addlab() |> wcsv("C4_inp_dx_top")
gt::gt(idx |> select(icd3, disease, raw, wt)) |>
gt::cols_label(icd3="ICD-10", disease="Penyakit (diagnosis rawat inap)", raw="Episode (sampel)", wt="Episode (tertimbang)") |>
gt::tab_header(title=gt::md("**Tabel C.4: 15 Diagnosis Rawat Inap Tersering pada Lansia (kode + nama)** · _Unit: Episode rawat inap_")) |>
gt::fmt_number(columns=c(raw,wt),decimals=0,use_seps=TRUE) |>
gt::data_color(columns=wt, colors=scales::col_numeric(c("#e3e8ee","#0b1f3a"),domain=NULL)) |>
gt::tab_source_note(gt::md(paste(CAP,"| nama penyakit dari FKL16A, kode Z dikecualikan"))) |> gfmt()
| Tabel C.4: 15 Diagnosis Rawat Inap Tersering pada Lansia (kode + nama) · Unit: Episode rawat inap |
| ICD-10 |
Penyakit (diagnosis rawat inap) |
Episode (sampel) |
Episode (tertimbang) |
| R06 |
Dyspnoea |
8,205 |
776,381 |
| I50 |
Congestive heart failure |
6,793 |
635,553 |
| R10 |
Other and unspecified abdominal pain |
6,614 |
603,008 |
| K30 |
Dyspepsia |
6,389 |
531,945 |
| R50 |
Fever, unspecified |
5,357 |
497,984 |
| E11 |
Non-insulin-dependent diabetes mellitus with unspecified complications |
5,251 |
471,383 |
| I64 |
Stroke, not specified as haemorrhage or infarction |
4,972 |
512,093 |
| A09 |
Diarrhoea and gastroenteritis of presumed infectious origin |
4,561 |
421,629 |
| N18 |
Chronic kidney disease, stage 5 |
4,497 |
364,095 |
| I10 |
Essential (primary) hypertension |
4,002 |
336,761 |
| D64 |
Anaemia, unspecified |
3,838 |
343,017 |
| J18 |
Bronchopneumonia, unspecified |
3,778 |
349,262 |
| I63 |
Cerebral infarction, unspecified |
3,283 |
317,135 |
| J44 |
Chronic obstructive pulmonary disease, unspecified |
3,040 |
272,683 |
| R11 |
Nausea and vomiting |
2,938 |
261,637 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) | nama penyakit dari FKL16A, kode Z dikecualikan |
odx <- A$fkrtl_out_dx_top |> filter(icd3!="" & !is.na(icd3) & nchar(icd3)==3) |> head(15) |> addlab() |> wcsv("C5_out_dx_top")
gt::gt(odx |> select(icd3, disease, raw, wt)) |>
gt::cols_label(icd3="ICD-10", disease="Penyakit (diagnosis rawat jalan)", raw="Kunjungan (sampel)", wt="Kunjungan (tertimbang)") |>
gt::tab_header(title=gt::md("**Tabel C.5: 15 Diagnosis Rawat Jalan FKRTL Tersering pada Lansia (kode + nama)** · _Unit: Kunjungan rawat jalan_")) |>
gt::fmt_number(columns=c(raw,wt),decimals=0,use_seps=TRUE) |>
gt::data_color(columns=wt, colors=scales::col_numeric(c("#e3e8ee","#13315c"),domain=NULL)) |>
gt::tab_source_note(gt::md(paste(CAP,"| nama penyakit dari FKL16A, kode Z dikecualikan"))) |> gfmt()
| Tabel C.5: 15 Diagnosis Rawat Jalan FKRTL Tersering pada Lansia (kode + nama) · Unit: Kunjungan rawat jalan |
| ICD-10 |
Penyakit (diagnosis rawat jalan) |
Kunjungan (sampel) |
Kunjungan (tertimbang) |
| N18 |
Chronic kidney disease, stage 5 |
128,796 |
10,607,488 |
| E11 |
Non-insulin-dependent diabetes mellitus with unspecified complications |
114,785 |
10,690,608 |
| I50 |
Congestive heart failure |
95,677 |
8,382,589 |
| M54 |
Low back pain |
92,379 |
7,920,154 |
| I11 |
Hypertensive heart disease |
83,480 |
7,373,754 |
| H25 |
Senile cataract |
70,310 |
6,408,179 |
| I25 |
Chronic ischaemic heart disease |
69,007 |
6,555,977 |
| I64 |
Stroke, not specified as haemorrhage or infarction |
46,493 |
4,429,230 |
| J44 |
Chronic obstructive pulmonary disease, unspecified |
42,571 |
3,904,093 |
| H26 |
Cataract, unspecified |
41,582 |
3,765,020 |
| I63 |
Cerebral infarction, unspecified |
31,649 |
2,958,375 |
| N40 |
Hyperplasia of prostate |
30,961 |
3,115,673 |
| M19 |
Arthrosis, unspecified |
26,517 |
2,436,244 |
| M51 |
Intervertebral disc disorder, unspecified |
24,231 |
2,211,309 |
| M17 |
narthrosis [arthrosis of knee] |
23,443 |
2,262,922 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) | nama penyakit dari FKL16A, kode Z dikecualikan |
Pilar D,
Rujukan & Konektivitas
④ Pilar D · Rujukan via FKTP · Jenis Perujuk · Geografi Rujukan
Pertanyaan: Apakah rawat inap lansia didahului rujukan dari
layanan primer, siapa perujuk utamanya, dan seberapa jauh lansia harus
berpindah wilayah untuk dirawat.
rr <- A$referral_rate_year |> wcsv("D1_referral_rate_year")
rt <- A$referrer_type |> head(8) |> wcsv("D2_referrer_type")
gt::gt(rt |> select(perujuk, raw, pct)) |>
gt::cols_label(perujuk="Jenis perujuk (rawat inap lansia)", raw="Kunjungan (sampel)", pct="%") |>
gt::tab_header(title=gt::md("**Tabel D.2: Jenis Perujuk Rawat Inap Lansia (FKL28)** · _Unit: Kunjungan rawat inap_")) |>
gt::fmt_number(columns=raw,decimals=0,use_seps=TRUE) |>
gt::tab_source_note(gt::md(CAP)) |> gfmt()
| Tabel D.2: Jenis Perujuk Rawat Inap Lansia (FKL28) · Unit: Kunjungan rawat inap |
| Jenis perujuk (rawat inap lansia) |
Kunjungan (sampel) |
% |
| Rumah Sakit |
176,047 |
83.4 |
| Puskesmas |
21,072 |
10.0 |
| Dokter Umum |
7,124 |
3.4 |
| Klinik Pratama |
5,162 |
2.4 |
| Klinik Utama |
1,536 |
0.7 |
| Apotik |
47 |
0.0 |
| Lainnya |
14 |
0.0 |
| Lainnya |
14 |
0.0 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) |
rg <- A$referral_geo
rgd <- data.frame(Kategori=c("Dalam kabupaten/kota yang sama","Lintas kabupaten (dalam provinsi)","Lintas provinsi"),
`Kunjungan (sampel)`=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) |> wcsv("D3_referral_geo")
gt::gt(rgd) |>
gt::tab_header(title=gt::md("**Tabel D.3: Geografi Rujukan Rawat Inap Lansia** · _Unit: Kunjungan rawat inap_")) |>
gt::fmt_number(columns=2,decimals=0,use_seps=TRUE) |>
gt::tab_source_note(gt::md(CAP)) |> gfmt()
| Tabel D.3: Geografi Rujukan Rawat Inap Lansia · Unit: Kunjungan rawat inap |
| Kategori |
Kunjungan (sampel) |
% |
| Dalam kabupaten/kota yang sama |
199,367 |
94.5 |
| Lintas kabupaten (dalam provinsi) |
9,533 |
4.5 |
| Lintas provinsi |
2,132 |
1.0 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) |
Catatan konektivitas: Tautan rujukan FKTP→FKRTL (FKP02) hanya
terisi pada ~2018–2023 sehingga persentase rujukan-via-FKTP merupakan
batas bawah. Proporsi rawat inap lintas kabupaten/provinsi menunjukkan
beban perjalanan dan ketimpangan distribusi RS rujukan bagi lansia,
relevan untuk perencanaan layanan geriatri regional (Permenkes 79/2014).
Pilar E, Geografi
Member ↔︎ Faskes
⑤ Pilar E · Kesesuaian Tempat Tinggal vs Faskes Terdaftar
Pertanyaan: Apakah faskes primer tempat lansia terdaftar berada
di wilayah tempat tinggalnya (akses dekat), atau di luar kabupaten
(potensi hambatan akses).
mg <- A$mf_geo
mgd <- data.frame(Indikator=c("Faskes terdaftar di provinsi yang sama","Faskes terdaftar di kabupaten/kota yang sama"),
`%`=c(mg$same_prov, mg$same_kab), check.names=FALSE) |> wcsv("E1_member_faskes")
gt::gt(mgd) |>
gt::tab_header(title=gt::md("**Tabel E.1: Kesesuaian Tempat Tinggal & Faskes Terdaftar (lansia)** · _Unit: Peserta (member)_")) |>
gt::tab_source_note(gt::md(CAP)) |> gfmt()
| Tabel E.1: Kesesuaian Tempat Tinggal & Faskes Terdaftar (lansia) · Unit: Peserta (member) |
| Indikator |
% |
| Faskes terdaftar di provinsi yang sama |
96.1 |
| Faskes terdaftar di kabupaten/kota yang sama |
90.6 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) |
Pilar F,
Sindrom Geriatri, ACSC & Akhir Hayat
⑥ Pilar F (Inti Tema) · Sindrom Geriatri · Rawat Inap Dapat Dicegah
(ACSC) · Readmisi · Mortalitas · Akhir Hayat
Pertanyaan: Seberapa besar beban sindrom geriatri klasik
(jatuh/fraktur, demensia, stroke, inkontinensia, dekubitus, kerentaan),
berapa banyak rawat inap lansia yang sebenarnya dapat dicegah dengan
layanan primer baik (ACSC), serta pola readmisi, mortalitas, dan
perawatan akhir hayat. Indikator dipetakan ke kerangka WHO Healthy
Ageing/ICOPE dan OECD Long-Term Care.
Sindrom geriatri
(prevalensi terlayani)
gpv <- A$geriatric_prev |> filter(n_pts>0) |> mutate(syndrome=fct_reorder(syndrome, pct)) |> wcsv("F1_geriatric_prev")
ggplot(gpv, aes(pct, syndrome)) + geom_col(width=.7, fill=PURPLE) +
geom_text(aes(label=paste0(pc1(pct)," (",fmt(wt_pts),")")), hjust=-0.04, size=2.8, color=NAVY) +
scale_x_continuous(expand=expansion(mult=c(0,.22)), limits=c(0,NA)) +
labs(title="Prevalensi Terlayani Sindrom Geriatri pada Lansia (≥60) · Unit: pasien unik",
subtitle="% lansia terlayani dengan ≥1 klaim kondisi terkait (diagnosis utama atau sekunder). Angka dalam kurung = pasien tertimbang.",
x="% lansia terlayani", y=NULL, caption=CAP) + th()

Rawat inap yang dapat
dicegah (ACSC)
Ambulatory Care Sensitive Conditions (ACSC)
ACSC (kerangka OECD HCQI) = kondisi yang seharusnya dapat
dikelola di layanan primer sehingga rawat inapnya berpotensi dapat
dicegah (gagal jantung, hipertensi, komplikasi diabetes, PPOK, asma,
pneumonia, ISK, dehidrasi, angina, selulitis). Tingginya proporsi ACSC
menandakan peluang penguatan layanan primer untuk lansia.
ab <- A$acsc_breakdown |> filter(n_adm>0) |> mutate(condition=fct_reorder(condition, n_adm)) |> wcsv("F3_acsc_breakdown")
ov <- A$acsc_overall
ggplot(ab, aes(n_adm, condition)) + geom_col(width=.7, fill=AMBER) +
geom_text(aes(label=fmt(n_adm)), hjust=-0.05, size=2.9, color=NAVY) +
scale_x_continuous(labels=label_number(scale_cut=cut_short_scale()), expand=expansion(mult=c(0,.16))) +
labs(title="Rawat Inap Lansia akibat Kondisi yang Dapat Dicegah (ACSC) · Unit: episode rawat inap",
subtitle=sprintf("Total %s dari %s rawat inap lansia (%s) berasal dari kondisi ACSC",
fmt(ov$n_acsc), fmt(ov$n_adm), pc1(ov$pct_acsc)),
x="Episode rawat inap (sampel)", y=NULL, caption=CAP) + th()

Readmisi, mortalitas
& akhir hayat
rd <- A$readmit
po <- A$polypharmacy_proxy
mo <- A$mort_overall
eol <- A$eol
out <- data.frame(
Indikator=c("Readmisi 30 hari (semua sebab)","Readmisi 90 hari (semua sebab)",
"Lansia dengan ≥2 kondisi kronis (proksi beban obat)","Lansia dengan ≥3 kondisi kronis",
"Mortalitas kasar lansia (PSTV18, undercount)",
"Rerata rawat inap di tahun kematian","Rerata biaya FKRTL di tahun kematian (Rp)"),
Nilai=c(pc1(rd$readmit30_pct), pc1(rd$readmit90_pct), pc1(po$pct_mm2), pc1(po$pct_mm3),
pc1(mo$crude_pct), formatC(eol$mean_adm_death_yr,format="f",digits=2),
fmt(eol$mean_cost_death_yr))) |> wcsv("F4_outcomes")
gt::gt(out) |>
gt::tab_header(title=gt::md("**Tabel F.4: Readmisi, Mortalitas & Akhir Hayat (lansia ≥60)** · _Unit: campuran (lihat baris)_")) |>
gt::tab_source_note(gt::md(paste(CAP,"| mortalitas via PSTV18 hanya tahun snapshot, undercount; polifarmasi tak terukur langsung (tanpa data dispensing), digunakan proksi jumlah kondisi kronis"))) |> gfmt()
| Tabel F.4: Readmisi, Mortalitas & Akhir Hayat (lansia ≥60) · Unit: campuran (lihat baris) |
| Indikator |
Nilai |
| Readmisi 30 hari (semua sebab) |
16.1% |
| Readmisi 90 hari (semua sebab) |
25.8% |
| Lansia dengan ≥2 kondisi kronis (proksi beban obat) |
37.4% |
| Lansia dengan ≥3 kondisi kronis |
20.8% |
| Mortalitas kasar lansia (PSTV18, undercount) |
16.5% |
| Rerata rawat inap di tahun kematian |
0.61 |
| Rerata biaya FKRTL di tahun kematian (Rp) |
6,236,232 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) | mortalitas via PSTV18 hanya tahun snapshot, undercount; polifarmasi tak terukur langsung (tanpa data dispensing), digunakan proksi jumlah kondisi kronis |
Catatan proksi (wajib). Polifarmasi sesungguhnya (≥5 obat
bersamaan) dan obat yang berpotensi tidak tepat (kriteria Beers/STOPP)
membutuhkan data dispensing obat yang tidak lengkap dalam sampel ini,
sehingga hanya disajikan proksi jumlah kondisi kronis. Mortalitas
memakai tahun meninggal (PSTV18) yang hanya terisi pada tahun snapshot
dan kematian in-hospital (FKL14=3), keduanya undercount. Angka
akhir hayat menggambarkan pola dalam JKN, bukan seluruh perawatan akhir
hayat.
Pilar G,
Multimorbiditas
⑦ Pilar G · Jumlah Kondisi Kronis · menurut Usia · Prevalensi Penyakit
Kronis · Kombinasi Tersering
Pertanyaan: Seberapa banyak lansia menanggung lebih dari satu
penyakit kronis sekaligus (multimorbiditas), bagaimana gradiennya
menurut usia, dan kombinasi penyakit apa yang paling sering muncul
bersamaan, inti dari kebutuhan perawatan jangka panjang terintegrasi.
Distribusi jumlah
kondisi kronis
md <- A$mm_dist |> mutate(mm_cat=factor(mm_cat, levels=c("0","1","2","3","4+"))) |> wcsv("G1_mm_dist")
ggplot(md, aes(mm_cat, pct, fill=mm_cat)) + geom_col(width=.7) +
geom_text(aes(label=pc1(pct)), vjust=-0.5, size=3.2, color=NAVY, fontface="bold") +
scale_fill_manual(values=c("0"=LGRAY,"1"=MIST,"2"=SLATE,"3"=NAVY2,"4+"=INK), guide="none") +
scale_y_continuous(expand=expansion(mult=c(0,.12)), limits=c(0,NA)) +
labs(title="Distribusi Jumlah Penyakit Kronis pada Lansia (≥60) · Unit: pasien unik",
subtitle="Dari 14 kategori penyakit kronis (lihat Pilar F/G). Tertimbang.",
x="Jumlah kondisi kronis", y="% lansia", caption=CAP) + th()

Prevalensi penyakit
kronis & kombinasi tersering
cp <- A$chronic_prev |> mutate(condition=fct_reorder(condition, pct)) |> wcsv("G3_chronic_prev")
ggplot(cp, aes(pct, condition)) + geom_col(width=.7, fill=BLUE) +
geom_text(aes(label=pc1(pct)), hjust=-0.05, size=2.9, color=NAVY) +
scale_x_continuous(expand=expansion(mult=c(0,.12)), limits=c(0,NA)) +
labs(title="Prevalensi Terlayani Penyakit Kronis pada Lansia (≥60) · Unit: pasien unik",
subtitle="% lansia terlayani dengan ≥1 klaim kondisi (diagnosis utama atau sekunder, FKTP+FKRTL)",
x="% lansia terlayani", y=NULL, caption=CAP) + th()

ht_served <- A$chronic_prev$pct[A$chronic_prev$key=="ht"]
dm_served <- A$chronic_prev$pct[A$chronic_prev$key=="dm"]
Triangulasi treatment gap (hipertensi lansia). Survei SKI 2023
mengukur prevalensi hipertensi terukur pada lansia sebesar 49,5%
(60–64 th) hingga 64,0% (75+ th), namun hanya 8,6% dewasa yang pernah
didiagnosis dokter. Dalam data klaim ini, hipertensi
terlayani tercatat pada 46.6% lansia (dan diabetes 18.6%).
Selisih antara prevalensi terukur di komunitas dan yang
terlayani/terdiagnosis menegaskan bahwa angka klaim adalah populasi
terlayani, bukan beban sejati, dan deteksi dini hipertensi/diabetes
lansia di layanan primer masih jauh dari kebutuhan. Angka rasio bersifat
ilustratif karena denominator dan definisi berbeda (terukur vs
terdiagnosis vs terlayani-kumulatif).
dy <- A$mm_dyads |> head(12) |> wcsv("G4_mm_dyads")
gt::gt(dy) |>
gt::cols_label(pair="Kombinasi dua penyakit kronis (lansia)", n_pts="Pasien (sampel)", wt_pts="Pasien (tertimbang)") |>
gt::tab_header(title=gt::md("**Tabel G.4: 12 Kombinasi Penyakit Kronis Tersering pada Lansia** · _Unit: Pasien unik_")) |>
gt::fmt_number(columns=c(n_pts,wt_pts),decimals=0,use_seps=TRUE) |>
gt::data_color(columns=wt_pts, colors=scales::col_numeric(c("#e3e8ee","#0b1f3a"),domain=NULL)) |>
gt::tab_source_note(gt::md(CAP)) |> gfmt()
| Tabel G.4: 12 Kombinasi Penyakit Kronis Tersering pada Lansia · Unit: Pasien unik |
| Kombinasi dua penyakit kronis (lansia) |
Pasien (sampel) |
Pasien (tertimbang) |
| Hipertensi (I10–15) + Diabetes (E10–14) |
34,153 |
2,991,684 |
| Hipertensi (I10–15) + Osteoartritis (M15–19) |
24,324 |
2,032,967 |
| Hipertensi (I10–15) + Penyakit Jantung Iskemik (I20–25) |
21,257 |
1,866,315 |
| Hipertensi (I10–15) + Penyakit Paru Kronik (J40–47) |
20,564 |
1,728,422 |
| Hipertensi (I10–15) + Gagal Jantung (I50) |
20,322 |
1,770,193 |
| Hipertensi (I10–15) + Stroke (I60–69) |
18,866 |
1,686,076 |
| Penyakit Jantung Iskemik (I20–25) + Gagal Jantung (I50) |
14,465 |
1,289,282 |
| Diabetes (E10–14) + Osteoartritis (M15–19) |
11,591 |
956,943 |
| Hipertensi (I10–15) + Anemia (D50–64) |
10,988 |
927,286 |
| Diabetes (E10–14) + Penyakit Jantung Iskemik (I20–25) |
10,631 |
944,642 |
| Hipertensi (I10–15) + Penyakit Ginjal Kronik (N17–19) |
9,783 |
869,967 |
| Diabetes (E10–14) + Gagal Jantung (I50) |
9,675 |
851,192 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) |
Key takeaway multimorbiditas: Mayoritas lansia terlayani
menanggung lebih dari satu penyakit kronis sekaligus, dan jumlahnya
meningkat tajam dengan usia. Dominasi kombinasi kardiometabolik
(hipertensi, diabetes, jantung, ginjal) menegaskan kebutuhan
perawatan terintegrasi berpusat pada orang (ICOPE), bukan layanan
penyakit-tunggal yang terfragmentasi, serta kaitan langsung dengan
kebutuhan perawatan jangka panjang.
Pilar
H, Ekonomi
⑧ Pilar H · Tren Biaya · Biaya menurut Usia & Setting · Biaya per
Kapita · INA-CBG Tertinggi · Konsentrasi (Pareto)
Pertanyaan: Berapa besar belanja JKN untuk perawatan lansia,
bagaimana distribusinya menurut usia, setting layanan, dan jumlah
penyakit kronis, serta seberapa terkonsentrasi belanja pada sebagian
kecil pasien berbiaya tinggi.
Tren & komposisi
biaya
cy <- A$cost_year |> wcsv("H1_cost_year")
ggplot(cy, aes(yr, total_bil_idr/1000)) + geom_col(width=.7, fill=NAVY) +
geom_text(aes(label=formatC(total_bil_idr/1000,format="f",digits=1)), vjust=-0.5, size=2.8, color=NAVY) +
yrx() + scale_y_continuous(expand=expansion(mult=c(0,.12)), limits=c(0,NA)) +
labs(title="Belanja FKRTL JKN untuk Lansia (≥60) per Tahun · Unit: klaim (biaya tertimbang)",
subtitle="Triliun Rupiah, proyeksi nasional (FKL47 × bobot PSTV15)", x=NULL, y="Triliun Rp", caption=CAP) + th()

INA-CBG tertinggi
& konsentrasi biaya
cb <- A$cbg_top |> head(12) |> wcsv("H3_cbg_top")
gt::gt(cb) |>
gt::cols_label(cbg="INA-CBG (lansia)", n_claims="Klaim (sampel)", total_bil_idr="Total (miliar Rp)", mean_cost="Rerata/klaim (Rp)") |>
gt::tab_header(title=gt::md("**Tabel H.3: 12 INA-CBG dengan Klaim Lansia Terbanyak** · _Unit: Klaim_")) |>
gt::fmt_number(columns=c(n_claims,total_bil_idr,mean_cost),decimals=0,use_seps=TRUE) |>
gt::tab_source_note(gt::md(CAP)) |> gfmt()
| Tabel H.3: 12 INA-CBG dengan Klaim Lansia Terbanyak · Unit: Klaim |
| INA-CBG (lansia) |
Klaim (sampel) |
Total (miliar Rp) |
Rerata/klaim (Rp) |
| PENYAKIT KRONIS KECIL LAIN-LAIN |
1,259,668 |
22,069 |
199,751 |
| PROSEDUR THERAPI FISIK DAN PROSEDUR KECIL MUSKULOSKLETAL |
200,847 |
2,182 |
125,262 |
| PROSEDUR DIALISIS |
145,842 |
10,248 |
862,705 |
| 730 |
106,164 |
1,820 |
182,227 |
| PROSEDUR LAIN-LAIN PADA MATA |
68,077 |
1,339 |
236,445 |
| KONSULTASI ATAU PEMERIKSAAN LAIN-LAIN |
46,775 |
615 |
143,550 |
| PENYAKIT KRONIS KECIL LAINLAIN |
46,622 |
851 |
196,154 |
| PROSEDUR REHABILITASI |
44,325 |
604 |
159,278 |
| PERAWATAN LUKA |
38,720 |
683 |
197,655 |
| PENYAKIT AKUT KECIL LAIN-LAIN |
24,145 |
411 |
197,209 |
| PROSEDUR ULTRASOUND LAIN-LAIN |
23,366 |
1,171 |
582,906 |
| PROSEDUR OPERASI KATARAK |
22,406 |
13,047 |
6,555,477 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) |
pareto <- A$pareto |> wcsv("H4_pareto")
gt::gt(pareto) |>
gt::cols_label(top_pct="Top % pasien (biaya tertinggi)", spend_share="Pangsa total belanja (%)") |>
gt::tab_header(title=gt::md("**Tabel H.4: Konsentrasi Belanja (Pareto) Lansia** · _Unit: Pasien unik (tertimbang)_")) |>
gt::tab_source_note(gt::md(paste(CAP,sprintf("| Total belanja FKRTL lansia kumulatif ~Rp %s triliun (tertimbang)", formatC(A$cost_total_bil_lansia/1000,format="f",digits=1))))) |> gfmt()
| Tabel H.4: Konsentrasi Belanja (Pareto) Lansia · Unit: Pasien unik (tertimbang) |
| Top % pasien (biaya tertinggi) |
Pangsa total belanja (%) |
| 1 |
15.5 |
| 5 |
36.9 |
| 10 |
51.2 |
| 20 |
68.1 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) | Total belanja FKRTL lansia kumulatif ~Rp 221.1 triliun (tertimbang) |
Key takeaway ekonomi: Biaya perawatan rumah sakit per lansia
meningkat dengan usia dan jumlah penyakit kronis, dan belanja sangat
terkonsentrasi (sebagian kecil pasien berbiaya tinggi menyerap pangsa
besar). Ini menegaskan nilai investasi pada pencegahan rawat inap yang
dapat dicegah (ACSC) dan manajemen multimorbiditas di layanan primer
untuk menahan laju belanja kuratif lansia.
Pilar
I, Ekuitas & Utilisasi vs Populasi
⑨ Pilar I · Laju Terlayani per Provinsi · Gradien Segmen (SES) · Indeks
Representasi
Pertanyaan: Apakah utilisasi layanan lansia merata antarwilayah
dan antarsegmen sosial-ekonomi, atau menunjukkan ketimpangan (hukum
perawatan terbalik), dan apakah komposisi yang terlayani mewakili
populasi lansia umum.
Laju terlayani per
provinsi
sr <- A$served_rate_prov |> filter(!is.na(rate_per1000)) |> arrange(desc(rate_per1000)) |> head(20) |>
mutate(prov_name=fct_reorder(prov_name, rate_per1000)) |> wcsv("I1_served_rate_prov")
ggplot(sr, aes(rate_per1000, prov_name, fill=island)) + geom_col(width=.72) +
geom_text(aes(label=fmt(rate_per1000)), hjust=-0.06, size=2.7, color=NAVY) +
scale_fill_manual(values=ISLAND_COLS, name=NULL) +
scale_x_continuous(expand=expansion(mult=c(0,.14)), limits=c(0,NA)) +
labs(title="Laju Lansia Terlayani per 1.000 Peserta Lansia, menurut Provinsi · Unit: pasien unik",
subtitle="Lansia terlayani (≥1 klaim) ÷ peserta lansia terdaftar (sampel reguler) × 1.000",
x="Lansia terlayani per 1.000 peserta lansia", y=NULL, caption=CAP) + th()

Gradien
sosial-ekonomi (segmen)
eq <- A$equity_segment |> select(segmen, pbi, n_pts, served_rate_per1000, mean_visits, pct_inp, mean_cost_pp, mean_ncc) |> wcsv("I2_equity_segment")
gt::gt(eq) |>
gt::cols_label(segmen="Segmen kepesertaan", pbi="Kelompok", n_pts="Pasien (sampel)",
served_rate_per1000="Terlayani /1.000", mean_visits="Rerata kunjungan",
pct_inp="% pernah rawat inap", mean_cost_pp="Biaya rerata/pasien (Rp)", mean_ncc="Rerata kondisi kronis") |>
gt::tab_header(title=gt::md("**Tabel I.2: Utilisasi & Laju Terlayani Lansia menurut Segmen (SES)** · _Unit: Pasien unik_")) |>
gt::fmt_number(columns=c(n_pts,served_rate_per1000,mean_cost_pp),decimals=0,use_seps=TRUE) |>
gt::data_color(columns=served_rate_per1000, colors=scales::col_numeric(c("#e3e8ee","#13315c"),domain=NULL)) |>
gt::tab_source_note(gt::md(paste(CAP,"| PBI = penerima bantuan iuran (disubsidi); Non-PBI = mandiri/pekerja"))) |> gfmt()
| Tabel I.2: Utilisasi & Laju Terlayani Lansia menurut Segmen (SES) · Unit: Pasien unik |
| Segmen kepesertaan |
Kelompok |
Pasien (sampel) |
Terlayani /1.000 |
Rerata kunjungan |
% pernah rawat inap |
Biaya rerata/pasien (Rp) |
Rerata kondisi kronis |
| PBPU (Mandiri) |
Non-PBI |
66,267 |
630 |
36.9 |
53.0 |
19,432,831 |
1.73 |
| PBI APBN |
PBI (disubsidi) |
93,324 |
585 |
23.0 |
34.8 |
9,000,417 |
0.97 |
| Bukan Pekerja |
Non-PBI |
47,147 |
508 |
49.6 |
55.8 |
20,254,878 |
1.93 |
| PBI APBD |
PBI (disubsidi) |
25,632 |
458 |
25.5 |
42.2 |
11,582,548 |
1.23 |
| PPU |
Non-PBI |
13,705 |
428 |
43.8 |
51.0 |
19,393,674 |
1.74 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) | PBI = penerima bantuan iuran (disubsidi); Non-PBI = mandiri/pekerja |
Indeks representasi
vs populasi lansia umum
ri <- A$repr_index |> filter(!is.na(repr)) |> arrange(desc(abs(repr-1))) |> head(14) |> wcsv("I3_repr_index")
gt::gt(ri) |>
gt::cols_label(char="Karakteristik", level="Kategori", Overall="Terlayani %", GeneralPop="Lansia umum %", repr="Indeks representasi") |>
gt::tab_header(title=gt::md("**Tabel I.3: Indeks Representasi Lansia Terlayani vs Populasi Lansia Umum** · _Unit: Pasien unik_")) |>
gt::fmt_number(columns=c(Overall,GeneralPop),decimals=1) |>
gt::fmt_number(columns=repr,decimals=2) |>
gt::data_color(columns=repr, colors=scales::col_numeric(c("#c7d2dd","#f3f5f8","#0b1f3a"),domain=c(0,2))) |>
gt::tab_source_note(gt::md(paste(CAP,"| Indeks >1 = over-representasi di antara yang terlayani, <1 = under-representasi"))) |> gfmt()
| Tabel I.3: Indeks Representasi Lansia Terlayani vs Populasi Lansia Umum · Unit: Pasien unik |
| Karakteristik |
Kategori |
Terlayani % |
Lansia umum % |
Indeks representasi |
| Pulau |
Maluku-Papua |
1.2 |
6.4 |
0.19 |
| Kelompok Usia |
Lansia tua (80+) |
13.1 |
22.5 |
0.58 |
| Segmentasi |
PPU |
3.8 |
4.9 |
0.78 |
| Segmentasi |
PBI APBD |
13.9 |
16.6 |
0.84 |
| Kelompok Usia |
Lansia muda (60–69) |
57.3 |
49.8 |
1.15 |
| Segmentasi |
PBPU (Mandiri) |
14.5 |
12.6 |
1.15 |
| Kelas Rawat |
Kelas II |
9.0 |
10.3 |
0.87 |
| Pulau |
Jawa |
64.4 |
59.5 |
1.08 |
| Kelompok Usia |
Lansia madya (70–79) |
29.6 |
27.7 |
1.07 |
| Segmentasi |
PBI APBN |
51.5 |
48.3 |
1.07 |
| Segmentasi |
Bukan Pekerja |
16.3 |
17.6 |
0.93 |
| Pulau |
Kalimantan |
3.9 |
4.2 |
0.93 |
| Pulau |
Sulawesi |
7.5 |
7.1 |
1.06 |
| Jenis Kelamin |
Perempuan |
52.1 |
50.6 |
1.03 |
| Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN) | Indeks >1 = over-representasi di antara yang terlayani, <1 = under-representasi |
Key takeaway ekuitas: Laju terlayani per 1.000 peserta lansia
bervariasi antarprovinsi, dan utilisasi serta belanja per pasien berbeda
antarsegmen kepesertaan. Wilayah dengan laju terlayani rendah dan segmen
dengan utilisasi rendah relatif terhadap kebutuhan menandai potensi
akses yang belum merata bagi lansia, sasaran prioritas penguatan
layanan geriatri dan perawatan jangka panjang berbasis komunitas.
Keterbatasan &
langkah lanjut
Keterbatasan utama. 1. Klaim JKN hanya menangkap lansia yang
sampai ke fasilitas dan diklaimkan, bukan seluruh penduduk lansia,
sehingga seluruh angka adalah populasi terlayani, bukan prevalensi
sejati.
2. Layanan berbasis program non-klaim (Posyandu/Posbindu
Lansia, beberapa program obat) tidak tercatat, sehingga manajemen kronis
di komunitas under-captured.
3. Tidak ada nilai laboratorium/vital,
sehingga kendali tekanan darah dan gula darah tidak dapat dihitung. Data
dispensing obat tidak lengkap, sehingga polifarmasi dan obat tidak tepat
hanya berupa proksi jumlah kondisi kronis.
4. Mortalitas (PSTV18,
FKL14=3) under-captured, hanya tahun snapshot dan kematian in-hospital,
sehingga indikator akhir hayat bersifat indikatif.
5. Tautan rujukan
FKTP→FKRTL (FKP02) hanya terisi ~2018–2023, sehingga proporsi
rujukan-via-FKTP adalah batas bawah.
6. Sindrom geriatri dan
penyakit kronis bergantung pada koding diagnosis (utama + sekunder),
kondisi yang tidak terkode (mis. kerentaan, malnutrisi, gangguan
sensorik ringan) akan undercount.
Langkah lanjut. 1. Validasi silang dengan benchmark komunitas
(SKI 2023/Riskesdas 2018, BPS Statistik Penduduk Lansia) untuk kerangka
treatment-gap lansia.
2. Integrasi data dispensing
(Non-Kapitasi/apotek) untuk menghitung polifarmasi dan obat berpotensi
tidak tepat (Beers/STOPP).
3. Analisis perawatan jangka panjang yang
lebih dalam (lansia ketergantungan, perawatan berkesinambungan)
dikaitkan dengan data fungsional/disabilitas (lihat ARC12.2
Disability).
4. Pemetaan kabupaten untuk laju terlayani dan
ketersediaan layanan geriatri (RS dengan poli geriatri, Permenkes
79/2014).
Kerangka indikator
& rujukan
Kerangka indikator internasional yang dipakai
Indikator dalam laporan ini dipetakan ke kerangka penuaan dan
perawatan jangka panjang yang diakui internasional, dengan kelayakan
dihitung dari data klaim: WHO Decade of Healthy Ageing 2021–2030
dan WHO ICOPE (kapasitas intrinsik: lokomotor, vitalitas,
kognisi, psikologis, sensorik, didekati lewat diagnosis hilir); OECD
Health Care Quality Outcomes (rawat inap dapat dicegah/ACSC,
readmisi 30 hari, ketepatan operasi fraktur panggul); OECD Long-Term
Care (indikator struktural penerima/tenaga/belanja LTC bersifat
eksternal, tidak ada di klaim); konsep geriatric giants dan
multimorbiditas (Barnett 2012; algoritma komorbiditas Quan 2005);
serta kebijakan Indonesia (UU 13/1998, Permenkes 67/2015,
Permenkes 79/2014, Prolanis). Catatan kode: BPJS memakai
ICD-10 versi WHO (diabetes tak spesifik E14; demensia F00–F03
dengan G30), dan sarkopenia tidak memiliki kode ICD-10 WHO sehingga
tidak dapat dihitung. Polifarmasi dan obat berpotensi tidak tepat
(Beers/STOPP-START) memerlukan data dispensing obat yang tidak lengkap,
sehingga hanya disajikan proksi.
Rujukan utama
WHO. UN Decade of Healthy Ageing: Plan of Action 2021–2030 (2020). ·
WHO. Integrated Care for Older People (ICOPE) Guidelines (2017). · OECD.
Health at a Glance 2023 & 2025; HCQO Indicator Definitions (2023). ·
Barnett K et al. Epidemiology of multimorbidity. Lancet 2012;380:37–43.
· Quan H et al. Coding algorithms for comorbidities in ICD-10
administrative data. Med Care 2005;43:1130–9. · UU No. 13 Tahun 1998
tentang Kesejahteraan Lanjut Usia. · Permenkes No. 67 Tahun 2015
(pelayanan kesehatan lansia di puskesmas); Permenkes No. 79 Tahun 2014
(pelayanan geriatri di rumah sakit). · BPS. Statistik Penduduk Lanjut
Usia 2023. · Kemenkes RI. Hasil Utama Survei Kesehatan Indonesia (SKI)
2023.
## consolidated multi-sheet workbook
if (requireNamespace("writexl", quietly=TRUE)) {
sheets <- list(
INDEX=data.frame(Sheet=c("cohort_flow","table1","strata_usia","prev_year","entry","geriatric","acsc",
"multimorbidity","chronic_prev","cost","equity"),
Keterangan=c("Alur kohort STROBE","Karakteristik vs populasi lansia","Distribusi usia",
"Lansia terlayani per tahun","Pintu masuk kontak pertama","Sindrom geriatri",
"Rawat inap dapat dicegah","Distribusi multimorbiditas","Prevalensi penyakit kronis",
"Biaya per kapita & INA-CBG","Ekuitas segmen & provinsi")),
cohort_flow=A$cohort_flow, table1=A$table1, strata_usia=A$strata_patient,
prev_year=A$prev_year_total, entry=A$entry_overall, geriatric=A$geriatric_prev,
acsc=A$acsc_breakdown, multimorbidity=A$mm_dist, chronic_prev=A$chronic_prev,
cost=A$cost_percapita_band, equity=A$equity_segment)
sheets <- lapply(sheets, as.data.frame)
names(sheets) <- substr(names(sheets),1,31)
writexl::write_xlsx(sheets, file.path(OUT_DIR,"tables_aging_ltc_jkn.xlsx"))
}
cat("Artefak diekspor ke:", normalizePath(OUT_DIR), "\n")
## Artefak diekspor ke: /opt/project_center_mirror/ARC12. Aging and Chronic Disease Institute/12.3 Aging & LTC JKN Claims/analysis/outputs
Analisis sistem kesehatan berbasis data administratif agregat
(Data Sampel BPJS Kesehatan). Seluruh angka populasi merupakan proyeksi
tertimbang dari sampel dan menggambarkan populasi terlayani
JKN.