Data yang digunakan adalah pembiayaan kapitasi di BPJS Kesehatan Cabang Bojonegoro. Kapitasi adalah besaran pembayaran per bulan yang dibayar dimuka oleh BPJS Kesehatan kepada Fasilitas Kesehatan Tingkat Pertama (FKTP) berdasarkan jumlah Peserta yang terdaftar tanpa memperhitungkan jenis dan jumlah pelayanan kesehatan yang diberikan. BPJS Kesehatan Cabang Bojonegoro meliputi 2 (dua) Kabupaten, antara lain Kabupaten Bojonegoro dan Kabupaten Tuban.

Data Kapitasi

choose.files()
## [1] "D:\\MMT-ITS\\Materi Kuliah Semester 3\\Big Data Analytics\\Wahyu Wibowo\\R BDA\\kapitasi_bjn_okt20.csv"
setwd("D://MMT-ITS//Materi Kuliah Semester 3//Big Data Analytics//Wahyu Wibowo//R BDA")
library(stats)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.2     v purrr   0.3.4
## v tibble  3.0.4     v stringr 1.4.0
## v tidyr   1.1.2     v forcats 0.5.0
## v readr   1.4.0
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
kapitasi <- read.csv("kapitasi_bjn_okt20.csv", sep = ",", 
                      fileEncoding="UTF-8-BOM")
str(kapitasi)
## 'data.frame':    32995 obs. of  39 variables:
##  $ insertdate        : chr  "10/18/2020 10:06:54 AM" "10/18/2020 10:06:54 AM" "10/18/2020 10:06:54 AM" "10/18/2020 10:06:54 AM" ...
##  $ jeniskoreksi      : chr  "" "" "" "" ...
##  $ jnspstreg         : chr  "Non PBI" "Non PBI" "PBI" "PBI" ...
##  $ kddati2           : int  203 203 203 203 203 203 203 203 203 203 ...
##  $ kdjnsppk          : chr  "B" "B" "U" "U" ...
##  $ kdkc              : int  1302 1302 1302 1302 1302 1302 1302 1302 1302 1302 ...
##  $ kdkepemilikan     : chr  "2" "4" "S" "S" ...
##  $ kdkr              : int  7 7 7 7 7 7 7 7 7 7 ...
##  $ kdppk             : chr  "02030001" "02030002" "0203U002" "0203U019" ...
##  $ kdprov            : int  14 14 14 14 14 14 14 14 14 14 ...
##  $ kdtypeppk         : chr  "BP" "BP" "DU" "DU" ...
##  $ nmdati2           : chr  "KAB. TUBAN" "KAB. TUBAN" "KAB. TUBAN" "KAB. TUBAN" ...
##  $ nmjnsppk          : chr  "Klinik Pratama" "Klinik Pratama" "Dokter Umum" "Dokter Umum" ...
##  $ nmkc              : chr  "BOJONEGORO" "BOJONEGORO" "BOJONEGORO" "BOJONEGORO" ...
##  $ nmkepemilikan     : chr  "TNI AD" "POLRI" "Swasta" "Swasta" ...
##  $ nmppk             : chr  "POSKES 05.10.07 TUBAN" "POLRES TUBAN" "LILIANA NENI ISDWIYATI,dr" "HUSIN ALMASHUR,dr" ...
##  $ nmprov            : chr  "JAWA TIMUR" "JAWA TIMUR" "JAWA TIMUR" "JAWA TIMUR" ...
##  $ nmtypeppk         : chr  "Klinik Non Rawat Inap" "Klinik Non Rawat Inap" "Dokter Prakter Perorangan" "Dokter Prakter Perorangan" ...
##  $ nofpk             : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ noreg             : chr  "1302K011500001" "1302K011500002" "1302K011500011" "1302K011500012" ...
##  $ noregkoreksi      : chr  "" "" "" "" ...
##  $ tanggalbayar      : chr  "1/15/2015" "1/15/2015" "1/15/2015" "1/15/2015" ...
##  $ tglkoreksi        : chr  "" "" "" "" ...
##  $ tglpelayanan      : chr  "1/1/2015" "1/1/2015" "1/1/2015" "1/1/2015" ...
##  $ tglreg            : chr  "1/12/2015" "1/12/2015" "1/12/2015" "1/12/2015" ...
##  $ tglstjkeu         : chr  "1/15/2015" "1/15/2015" "1/15/2015" "1/15/2015" ...
##  $ tglstjreg         : chr  "1/12/2015" "1/12/2015" "1/12/2015" "1/12/2015" ...
##  $ tglverreg         : chr  "1/12/2015" "1/12/2015" "1/12/2015" "1/12/2015" ...
##  $ userakses         : chr  "True" "True" "True" "True" ...
##  $ bpjkoreksi        : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ bykapitasi        : int  13696000 20944000 24000 8000 56000 8075000 37335000 8435000 76830000 5580000 ...
##  $ flagjarkomdat     : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ flagkapitasikhusus: int  NA NA NA NA NA NA NA NA NA NA ...
##  $ jmlpstkap         : int  1712 2618 3 1 7 1615 7467 1687 15366 1116 ...
##  $ jmlpstkoreksi     : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ kapbpj            : int  8000 8000 8000 8000 8000 5000 5000 5000 5000 5000 ...
##  $ konskbk           : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ normakapitasi     : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ Number.of.Records : int  1 1 1 1 1 1 1 1 1 1 ...

1. Data Preprocessing

Select Data Kapitasi

Sebelum membuat visualisasi data maka dilakukan seleksi terhadap variabel data yang akan digunakan.

kapitasi <- kapitasi %>%
            select(tglpelayanan, jmlpstkap, bykapitasi, nmdati2, nmjnsppk, nmppk)
str(kapitasi)
## 'data.frame':    32995 obs. of  6 variables:
##  $ tglpelayanan: chr  "1/1/2015" "1/1/2015" "1/1/2015" "1/1/2015" ...
##  $ jmlpstkap   : int  1712 2618 3 1 7 1615 7467 1687 15366 1116 ...
##  $ bykapitasi  : int  13696000 20944000 24000 8000 56000 8075000 37335000 8435000 76830000 5580000 ...
##  $ nmdati2     : chr  "KAB. TUBAN" "KAB. TUBAN" "KAB. TUBAN" "KAB. TUBAN" ...
##  $ nmjnsppk    : chr  "Klinik Pratama" "Klinik Pratama" "Dokter Umum" "Dokter Umum" ...
##  $ nmppk       : chr  "POSKES 05.10.07 TUBAN" "POLRES TUBAN" "LILIANA NENI ISDWIYATI,dr" "HUSIN ALMASHUR,dr" ...
head(kapitasi, n=20)

Variabel yang akan digunakan yaitu:

  • tglpelayanan : Bulan Kapitasi
  • nmdati2 : Nama Kabupaten
  • nmjnsppk : Nama Jenis FKTP
  • nmppk : Nama FKTP
  • jmlpstkap : Jumlah Peserta Terdaftar
  • bykapitasi : Biaya Kapitasi

Mengubah data menjadi data frame: df.kapitasi

kapitasi$tglpelayanan <- as.Date(kapitasi$tglpelayanan, format = "%m/%d/%Y")
df.kapitasi <-  data.frame(kapitasi)

Untuk mendapatkan agregat per bulan, maka data frame disusun perbulan kapitasi. Mengubah format tanggal pelayanan as Date dan mengelompokkan as Month Year (Bulan Tahun) menjadi: bln.kapitasi

df.kapitasi$tglpelayanan <- format(as.Date(df.kapitasi$tglpelayanan), "%m/%Y")
df.kapitasi$tglpelayanan <- paste("01/", df.kapitasi$tglpelayanan)
df.kapitasi$tglpelayanan <- as.Date(df.kapitasi$tglpelayanan, format = "%d/%m/%Y")
# Suppress summarise info
options(dplyr.summarise.inform = FALSE)
bln.kapitasi <- df.kapitasi %>%
              group_by(tglpelayanan, nmdati2, nmjnsppk, nmppk)%>%
              summarize(jmlpstkap = sum(jmlpstkap), 
                        bykapitasi = sum(bykapitasi))
glimpse(bln.kapitasi)
## Rows: 11,953
## Columns: 6
## Groups: tglpelayanan, nmdati2, nmjnsppk [655]
## $ tglpelayanan <date> 2014-01-01, 2014-01-01, 2014-01-01, 2014-01-01, 2014-...
## $ nmdati2      <chr> "KAB. BOJONEGORO", "KAB. BOJONEGORO", "KAB. BOJONEGORO...
## $ nmjnsppk     <chr> "Dokter gigi", "Dokter Umum", "Dokter Umum", "Dokter U...
## $ nmppk        <chr> "SUSARTO SUBIANTO, MSc, drg", "AMIROH FARIA, dr", "ART...
## $ jmlpstkap    <int> 9230, 923, 813, 4688, 532, 518, 1705, 403, 142, 921, 5...
## $ bykapitasi   <int> 18460000, 7384000, 6504000, 37504000, 4256000, 4144000...
head(bln.kapitasi, n = 10)

2. Visualisasi Data

Data Per Kabupaten

  • Data Kapitasi Per Bulan Per Kabupaten: Bln.kap.dati (Kab. Bojonegoro dan Kab. Tuban)
Bln.kap.dati <- bln.kapitasi %>%
          dplyr::group_by(tglpelayanan, nmdati2)%>%
          summarize(jmlpstkap = sum(jmlpstkap), 
                    bykapitasi = sum(bykapitasi))
head(Bln.kap.dati, n = 10)
glimpse(Bln.kap.dati)
## Rows: 164
## Columns: 4
## Groups: tglpelayanan [82]
## $ tglpelayanan <date> 2014-01-01, 2014-01-01, 2014-02-01, 2014-02-01, 2014-...
## $ nmdati2      <chr> "KAB. BOJONEGORO", "KAB. TUBAN", "KAB. BOJONEGORO", "K...
## $ jmlpstkap    <int> 635323, 533468, 620525, 537377, 638379, 321661, 655665...
## $ bykapitasi   <dbl> 3306760000, 2610670000, 3211739500, 2635947500, 331289...
  • Contoh subset dan visualisasi (misal: Kab. Tuban)
# Basic line plot (Jumlah Peserta Terdaftar)
ggplot(Bln.kap.dati %>% subset(nmdati2 == "KAB. TUBAN"),
       aes(x = tglpelayanan, y = jmlpstkap))+
  geom_line(color = "#00AFBB", size = 2) +
  geom_smooth(method = "gam", formula = y ~ s(x))

# Plot a subset of the data (Biaya Kapitasi Kab. Tuban mulai Tahun 2018)
ss <- subset(Bln.kap.dati, tglpelayanan >= as.Date("2018-01-01")
             & nmdati2 == "KAB. TUBAN")
ggplot(data = ss, aes(x = tglpelayanan, y = bykapitasi)) + 
  geom_line(color = "#FC4E07", size = 2) +
  geom_smooth(method = "gam", formula = y ~ s(x)) +
  labs(x="Bulan Kapitasi (bulan/tahun)", y="Biaya Kapitasi",
      title="Biaya Kapitasi Kabupaten Tuban Tahun 2018-2020")

  • Contoh subset dan visualisasi “KAB. BOJONEGORO”:
library(hrbrthemes)
hrbrthemes::import_roboto_condensed()
## You will likely need to install these fonts on your system as well.
## 
## You can find them in [C:/Users/Lenovo/Documents/R/win-library/4.0/hrbrthemes/fonts/roboto-condensed]
ggplot(Bln.kap.dati %>% subset (nmdati2 == "KAB. BOJONEGORO"), 
       aes(x = tglpelayanan, y = bykapitasi)) +
            geom_point(color = ft_cols$yellow) +
            geom_smooth(method = "gam", formula = y ~ s(x)) +
            geom_line(color="#69b3a2") +
            labs(x="Bulan Kapitasi (bulan/tahun)", 
                 y="Biaya Kapitasi (Rupiah)",
                 title="Biaya Kapitasi Kabupaten Bojonegoro 2014-2020") +
            theme_ft_rc()

Nama Jenis Fasilitas Kesehatan

  • Visualisasi menurut Jenis Fasilitas Kesehatan dan Nama FKTP
library(ggplot2)
ggplot(bln.kapitasi %>%
       select(nmdati2, nmjnsppk, nmppk, jmlpstkap),
       aes(nmdati2, jmlpstkap)) + 
  geom_point() +
  geom_violin() +
  facet_wrap(~nmjnsppk, ncol = 2)
## Adding missing grouping variables: `tglpelayanan`

ggplot(bln.kapitasi %>%
         subset(nmjnsppk == "Dokter Umum")%>%
          dplyr::group_by(tglpelayanan)%>%
          summarize(jmlpstkap = sum(jmlpstkap), 
                    bykapitasi = sum(bykapitasi)),
       aes(tglpelayanan, bykapitasi)) +
  geom_line(color = "yellow", size = 1) +
  geom_smooth() +
  labs(x="Bulan Kapitasi (bulan/tahun)", 
       y="Biaya Kapitasi (Rupiah)",
       title="Tren Biaya Kapitasi Dokter Umum") +
  theme_ft_rc()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Nm_jnsppk <- bln.kapitasi %>%
          dplyr::group_by(tglpelayanan, nmdati2, nmjnsppk)%>%
          summarize(jmlpstkap = sum(jmlpstkap), 
                    bykapitasi = sum(bykapitasi))
head(Nm_jnsppk, n = 20)
glimpse(Nm_jnsppk)
## Rows: 655
## Columns: 5
## Groups: tglpelayanan, nmdati2 [164]
## $ tglpelayanan <date> 2014-01-01, 2014-01-01, 2014-01-01, 2014-01-01, 2014-...
## $ nmdati2      <chr> "KAB. BOJONEGORO", "KAB. BOJONEGORO", "KAB. BOJONEGORO...
## $ nmjnsppk     <chr> "Dokter gigi", "Dokter Umum", "Puskesmas", "Dokter gig...
## $ jmlpstkap    <int> 9230, 13701, 612392, 9727, 8100, 4555, 511086, 9339, 1...
## $ bykapitasi   <dbl> 18460000, 109608000, 3178692000, 19454000, 64800000, 3...
ggplot(Nm_jnsppk %>% subset(nmjnsppk == "Puskesmas"),
       aes(nmdati2, bykapitasi)) + 
  geom_point() +
  geom_violin()

ggplot(Nm_jnsppk %>% subset(nmjnsppk == "Puskesmas"),
       aes(nmdati2, bykapitasi)) + 
  geom_point() +
  geom_boxplot()

Nama FKTP

  • Seleksi data berdasarkan Nama FKTP: Nm.ppk (dan sorting descending: biaya kapitasi)
Nm.ppk <- bln.kapitasi %>%
          subset(nmdati2 == "KAB. BOJONEGORO")%>%
          dplyr::group_by(tglpelayanan, nmppk)%>%
          summarize(jmlpstkap = sum(jmlpstkap), 
                    bykapitasi = sum(bykapitasi))
Nm.ppk <- Nm.ppk [order(-Nm.ppk$bykapitasi),]
head(Nm.ppk, n = 5)
glimpse(Nm.ppk)
## Rows: 6,922
## Columns: 4
## Groups: tglpelayanan [82]
## $ tglpelayanan <date> 2020-02-01, 2020-04-01, 2020-03-01, 2020-10-01, 2020-...
## $ nmppk        <chr> "BALEN", "BALEN", "BALEN", "BALEN", "BALEN", "BALEN", ...
## $ jmlpstkap    <int> 63012, 62412, 62396, 61845, 61564, 61452, 61443, 61437...
## $ bykapitasi   <int> 340264800, 337024800, 336938400, 333963000, 332445600,...
ggplot(Nm.ppk %>% subset(nmppk == "NGASEM"),
       aes(tglpelayanan, bykapitasi)) + 
  geom_point(color = ft_cols$yellow) +
  geom_smooth(method = "gam", formula = y ~ s(x)) +
  labs(x="Bulan Kapitasi (bulan/tahun)", 
       y="Biaya Kapitasi (Rupiah)",
       title="Trend Biaya Kapitasi Puskesmas Ngasem") +
  theme_ft_rc()

3. Trend Time Series

Time series atau runtun waktu adalah himpunan observasi data terurut dalam waktu (Hanke&Winchern, 2005: 58).

#declaring the data as time series (Kab Tuban)
ts.kap.dati <- ts(Bln.kap.dati %>%
                    select(tglpelayanan, nmdati2, bykapitasi) %>%
                  subset(nmdati2 == "KAB. TUBAN"),
                  start = c(2014,1), end = c(2020,10), frequency = 12)
attributes(ts.kap.dati)
## $dim
## [1] 82  3
## 
## $dimnames
## $dimnames[[1]]
## NULL
## 
## $dimnames[[2]]
## [1] "tglpelayanan" "nmdati2"      "bykapitasi"  
## 
## 
## $tsp
## [1] 2014.00 2020.75   12.00
## 
## $class
## [1] "mts"    "ts"     "matrix"
str(ts.kap.dati)
##  Time-Series [1:82, 1:3] from 2014 to 2021: 16071 16102 16130 16161 16191 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : NULL
##   ..$ : chr [1:3] "tglpelayanan" "nmdati2" "bykapitasi"
ts.kap.dati
##          tglpelayanan nmdati2 bykapitasi
## Jan 2014        16071       1 2610670000
## Feb 2014        16102       1 2635947500
## Mar 2014        16130       1 1568092000
## Apr 2014        16161       1 2726967000
## May 2014        16191       1 2766540500
## Jun 2014        16222       1 2779661000
## Jul 2014        16252       1 2793074500
## Aug 2014        16283       1 2792196500
## Sep 2014        16314       1 2780605000
## Oct 2014        16344       1 2810931500
## Nov 2014        16375       1 2819544000
## Dec 2014        16405       1 2825265000
## Jan 2015        16436       1 2876956500
## Feb 2015        16467       1 2986313000
## Mar 2015        16495       1 2965994500
## Apr 2015        16526       1 3024982500
## May 2015        16556       1 3022452000
## Jun 2015        16587       1 3063016000
## Jul 2015        16617       1 3146693000
## Aug 2015        16648       1 2294498750
## Sep 2015        16679       1 3213796500
## Oct 2015        16709       1 3221598000
## Nov 2015        16740       1 3180497000
## Dec 2015        16770       1 3191884500
## Jan 2016        16801       1 3213122000
## Feb 2016        16832       1 3455514500
## Mar 2016        16861       1 3471523000
## Apr 2016        16892       1 3501701500
## May 2016        16922       1 3539175500
## Jun 2016        16953       1 3570539000
## Jul 2016        16983       1 3577812000
## Aug 2016        17014       1 3549006000
## Sep 2016        17045       1 3423793500
## Oct 2016        17075       1 3552735000
## Nov 2016        17106       1 3565846000
## Dec 2016        17136       1 3575573000
## Jan 2017        17167       1 3600736500
## Feb 2017        17198       1 3603592000
## Mar 2017        17226       1 3618488000
## Apr 2017        17257       1 3434247328
## May 2017        17287       1 3510019258
## Jun 2017        17318       1 3513535162
## Jul 2017        17348       1 3647530010
## Aug 2017        17379       1 3451946174
## Sep 2017        17410       1 3558035557
## Oct 2017        17440       1 3634483550
## Nov 2017        17471       1 3647386825
## Dec 2017        17501       1 3674999000
## Jan 2018        17532       1 3658308125
## Feb 2018        17563       1 3600943600
## Mar 2018        17591       1 3694372925
## Apr 2018        17622       1 3739694150
## May 2018        17652       1 3754903625
## Jun 2018        17683       1 3794427000
## Jul 2018        17713       1 3709503054
## Aug 2018        17744       1 3698279598
## Sep 2018        17775       1 3746875129
## Oct 2018        17805       1 3809162136
## Nov 2018        17836       1 3823270247
## Dec 2018        17866       1 3842796156
## Jan 2019        17897       1 3938228527
## Feb 2019        17928       1 3864339373
## Mar 2019        17956       1 3956300722
## Apr 2019        17987       1 3958889148
## May 2019        18017       1 3951811327
## Jun 2019        18048       1 4041370692
## Jul 2019        18078       1 4082220000
## Aug 2019        18109       1 4014930900
## Sep 2019        18140       1 3839193666
## Oct 2019        18170       1 3944894195
## Nov 2019        18201       1 4072085675
## Dec 2019        18231       1 3941142850
## Jan 2020        18262       1 3951231700
## Feb 2020        18293       1 3880526550
## Mar 2020        18322       1 3949330050
## Apr 2020        18353       1 3966319300
## May 2020        18383       1 3927173650
## Jun 2020        18414       1 4016193750
## Jul 2020        18444       1 4027259350
## Aug 2020        18475       1 4036698500
## Sep 2020        18506       1 4017260950
## Oct 2020        18536       1 4014353350
# Log Transform
ts.kap.dati <- log(ts.kap.dati)
plot(ts.kap.dati)

# Decompose
decompose_df <- decompose(ts.kap.dati, type="multiplicative")
plot(decompose_df$figure)