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.

1 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.

1.1 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.

2 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.

2.1 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)

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

2.3 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)

3 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.

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

3.2 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)

3.5 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.

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

4.1 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

4.2 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)
prol <- A$prolanis_fktp
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.

5 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.

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

5.2 LOS menurut kelompok usia

lb <- A$los_band |> filter(!is.na(grp)) |> mutate(grp=factor(grp,levels=ABAND_LAB)) |> wcsv("C2_los_band")
ggplot(lb, aes(grp, median_los, fill=grp)) + geom_col(width=.6) +
  geom_errorbar(aes(ymin=q1, ymax=q3), width=.2, color=NAVY) +
  geom_text(aes(label=median_los), vjust=-0.6, size=3.2, color=NAVY, fontface="bold") +
  scale_fill_manual(values=ABAND_COLS, guide="none") +
  scale_y_continuous(expand=expansion(mult=c(0,.12)), limits=c(0,NA)) +
  labs(title="Lama Rawat Inap (LOS) Median menurut Kelompok Usia · Unit: episode rawat inap",
       subtitle="Median (batang) dengan rentang interkuartil (Q1–Q3). Hari.",
       x=NULL, y="LOS median (hari)", caption=CAP) + th()

5.3 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

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

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

8 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.

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

8.2 Sindrom geriatri menurut usia

gbb <- A$geriatric_by_band |> filter(!is.na(grp)) |>
  group_by(key) |> filter(max(pct)>=1) |> ungroup() |>
  mutate(grp=factor(grp,levels=ABAND_LAB)) |> wcsv("F2_geriatric_by_band")
ggplot(gbb, aes(grp, pct, group=syndrome, color=syndrome)) +
  geom_line(linewidth=.8) + geom_point(size=1.6) +
  scale_y_continuous(limits=c(0,NA)) +
  labs(title="Gradien Sindrom Geriatri menurut Kelompok Usia · Unit: pasien unik",
       subtitle="% terlayani per kelompok usia (kondisi dengan prevalensi ≥1% ditampilkan). Beban meningkat tajam pada usia tua.",
       x=NULL, y="% terlayani", color=NULL, caption=CAP) + th() +
  guides(color=guide_legend(nrow=3))

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

8.4 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.

9 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.

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

9.2 Multimorbiditas menurut usia

mb <- A$mm_by_band |> filter(!is.na(grp)) |> mutate(grp=factor(grp,levels=ABAND_LAB)) |> arrange(grp) |> wcsv("G2_mm_by_band")
gt::gt(mb) |>
  gt::cols_label(grp="Kelompok usia", n="Pasien (sampel)", mean_ncc="Rerata jumlah kondisi",
                 pct_mm2="≥2 kondisi (%)", pct_mm3="≥3 kondisi (%)") |>
  gt::tab_header(title=gt::md("**Tabel G.2: Multimorbiditas menurut Kelompok Usia** · _Unit: Pasien unik_")) |>
  gt::fmt_number(columns=n,decimals=0,use_seps=TRUE) |>
  gt::data_color(columns=pct_mm2, colors=scales::col_numeric(c("#e3e8ee","#274060"),domain=NULL)) |>
  gt::tab_source_note(gt::md(CAP)) |> gfmt()
Tabel G.2: Multimorbiditas menurut Kelompok Usia · Unit: Pasien unik
Kelompok usia Pasien (sampel) Rerata jumlah kondisi ≥2 kondisi (%) ≥3 kondisi (%)
Pra-lansia (45–59) 344,048 0.79 19.8 9.3
Lansia muda (60–69) 148,307 1.41 37.2 20.5
Lansia madya (70–79) 70,965 1.52 39.6 22.4
Lansia tua (80+) 26,803 1.28 32.7 17.9
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN)

9.3 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.

10 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.

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

10.2 Biaya per kapita menurut usia

cpb <- A$cost_percapita_band |> filter(!is.na(grp)) |> mutate(grp=factor(grp,levels=ABAND_LAB)) |> arrange(grp) |> wcsv("H2_cost_percapita_band")
gt::gt(cpb) |>
  gt::cols_label(grp="Kelompok usia", n="Pasien (sampel)", wt_pts="Pasien (tertimbang)",
                 tot_cost_bil="Total biaya (miliar Rp)", mean_cost_pp="Biaya rerata/pasien (Rp)") |>
  gt::tab_header(title=gt::md("**Tabel H.2: Biaya FKRTL per Kapita menurut Kelompok Usia** · _Unit: Pasien unik_")) |>
  gt::fmt_number(columns=c(n,wt_pts,tot_cost_bil,mean_cost_pp),decimals=0,use_seps=TRUE) |>
  gt::data_color(columns=mean_cost_pp, colors=scales::col_numeric(c("#e3e8ee","#0b1f3a"),domain=NULL)) |>
  gt::tab_source_note(gt::md(CAP)) |> gfmt()
Tabel H.2: Biaya FKRTL per Kapita menurut Kelompok Usia · Unit: Pasien unik
Kelompok usia Pasien (sampel) Pasien (tertimbang) Total biaya (miliar Rp) Biaya rerata/pasien (Rp)
Pra-lansia (45–59) 344,048 35,997,105 168,057 11,239,001
Lansia muda (60–69) 148,307 15,836,344 130,063 14,875,759
Lansia madya (70–79) 70,965 8,179,931 69,669 14,986,629
Lansia tua (80+) 26,803 3,622,770 21,401 12,705,107
Sumber: Data Sampel BPJS Kesehatan 2015–2024 | sampel reguler (rumah tangga ~1%) | usia ≥60 (pembanding 45–59) | tertimbang PSTV15 (proyeksi nasional peserta JKN)

10.3 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.

11 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.

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

11.2 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

11.3 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.

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

13 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.