title: “Capstone Project - Fasilitas Kesehatan BPJS di Indonesia”
author: “Dina Diana Tambunan”
date: “Updated: Juli 17, 2020”
output:
html_document
knitr::opts_chunk$set(cache=TRUE)
options(scipen = 9999)
rm(list=ls())
echo=FALSE
message=FALSE
warning=FALSE

Background

Proyek visualiasi ini dilakukan untuk pemenuhan penugasan capstone project pada akhir sesi training “Data Visualization” di Algoritma

Tujuan

Tujuan yang ingin dicapai atau informasi yang ingin disampaikan adalah sbb:
- Summary data fasilitas kesehatan per provinsi di Indonesia
- Jumlah Tipe fasilitas Kesehatan per wilayah
- Informasi Sebaran fasilitas kesehatan BPJS di seluruh Indonesia

Manfaat

Dashboard ini berisi informasi daftar fasilitas kesehatan yang bermanfaat bagi :
- Petugas Dinas Kesehatan
- Pekerja BPJS
- Pihak Rumah Sakit
- Tenaga medis
- Masyarakat yang membutuhkan informasi fasilitas kesehatan BPJS
- Lembaga kesehatan lainnya

Sumber Data

Data diperoleh dari menu dataset pada website Kaggle : https://www.kaggle.com/israhabibi/list-faskes-bpjs-indonesia dengan tanggal last update : 21 Januari 2020.

Libraries and Setup

Library yang akan digunakan untuk melakukan visualisasi adalah ggplot2, plotly dan leaflet. Sedangkan untuk proses EDA(exploratory data analysis) menggunakan library tidyverse dan dplyr. Agar dapat mengakses library ini, pastikan anda telah melakukan installasi seluruh library yang dibutuhkan.

library(tidyverse)
library(dplyr)
library(tidyr)
library(ggplot2)
library(plotly)
library(reshape2)
library(leaflet)
library(scales)
library(ggthemes)

Exploratory Data Analysis (EDA)

Sebelum melakukan visualisasi, kita akan melakukan ekstraksi dan cleansing data terlebih dahulu. Berikut tahapan yang dilakukan.

Extract Data

Data hasil download dari Kaggle berbentuk .csv (Data Faskes BPJS 2019.csv) dan disimpan pada folder Data sebelum diolah lebih lanjut. Pada tahap ini, kita menggunakan fungsi read.csv untuk membaca file dan menyimpan data ke dalam bentuk dataframe dataBPJS_Temp, dan menampikan 6 data teratas dengan menggunkan function head().

#read data dari file Data Faskes BPJS 2019.csv
dataBPJS_temp <- read.csv("Data/Data Faskes BPJS 2019.csv")
#menampilkan 6 data teratas dengan menggunakan fungsi head()
head (dataBPJS_temp)
##   NoLink                 Provinsi
## 1      0 Nanggroe Aceh Darussalam
## 2      0 Nanggroe Aceh Darussalam
## 3      0 Nanggroe Aceh Darussalam
## 4      0 Nanggroe Aceh Darussalam
## 5      0 Nanggroe Aceh Darussalam
## 6      0 Nanggroe Aceh Darussalam
##                                                               KotaKab
## 1 Kode Faskes dan Alamat Rumah Sakit BPJS di Kota\n            Langsa
## 2 Kode Faskes dan Alamat Rumah Sakit BPJS di Kota\n            Langsa
## 3 Kode Faskes dan Alamat Rumah Sakit BPJS di Kota\n            Langsa
## 4 Kode Faskes dan Alamat Rumah Sakit BPJS di Kota\n            Langsa
## 5 Kode Faskes dan Alamat Rumah Sakit BPJS di Kota\n            Langsa
## 6 Kode Faskes dan Alamat Rumah Sakit BPJS di Kota\n            Langsa
##                                                 Link  TipeFaskes No KodeFaskes
## 1 https://lovia.life/id/health/bpjs/area/kota-langsa Rumah Sakit  1   0001R001
## 2 https://lovia.life/id/health/bpjs/area/kota-langsa Rumah Sakit  2   0001R004
## 3 https://lovia.life/id/health/bpjs/area/kota-langsa Rumah Sakit  3   0105R001
## 4 https://lovia.life/id/health/bpjs/area/kota-langsa Rumah Sakit  4   0105R013
## 5 https://lovia.life/id/health/bpjs/area/kota-langsa   Puskesmas  1   00010001
## 6 https://lovia.life/id/health/bpjs/area/kota-langsa   Puskesmas  2   00010801
##                                                                  NamaFaskes
## 1    RSU Cut Nyak Dhien\n                    \n                        \n\n
## 2 RSU Cut Meutia Langsa\n                    \n                        \n\n
## 3           RSUD Langsa\n                    \n                        \n\n
## 4             RSU Ummi \n                    \n                        \n\n
## 5           Langsa Lama\n                    \n                        \n\n
## 6           Langsa Baro\n                    \n                        \n\n
##                                    LatLongFaskes                 AlamatFaskes
## 1 http://maps.google.co.id/?q=4.488058,97.947963   Jl. Tm Bahrum No. 1 Langsa
## 2 http://maps.google.co.id/?q=4.488088,97.947781  Jl.Garuda Kebun Baru Langsa
## 3 http://maps.google.co.id/?q=4.472208,97.975533      Jln.A.Yani No. 1 Langsa
## 4 http://maps.google.co.id/?q=4.470376,97.991915 Jln. Prof. A. Madjid Ibrahim
## 5 http://maps.google.co.id/?q=4.478172,97.949988      Gampong Meurandeh Dayah
## 6 http://maps.google.co.id/?q=4.474268,97.957391        Jl. Lilawangsa Langsa
##            TelpFaskes
## 1   \n 0641-0621039\n
## 2  \n 0641- 4840076\n
## 3     \n 0641-22051\n
## 4     \n 0641-22886\n
## 5 \n 0641-064121218\n
## 6  \n 0000-00000000\n

Data fasilitas kesehatan BPJS terdiri dari:

1. NoLink : ID untuk URL pada pada kolom link
2. Provinsi : Nama Provinsi lokasi fasilitas kesehatan berada
3. KotaKab : Nama Kota atau Kabupaten lokasi fasilitas kesehatan berada
4. Link : Sumber url data fasilitas kesehatan
5. TipeFaskes : Jenis fasilitas kesehatan (Rumah sakit, puskesmas, dokter, dll)
6. No : Nomor
7. Kode Faskes : Kode fasilitas kesehatan
8. Nama Faskes : Nama fasilitas commercial Kesehatan
9. LatLongFaskes : lokasi fasilitas kesehatan di google map
10. AlamatFaskes : Alamat lengkap fasilitas kesehatan berada
11. TelpFaskes : Telepon yang dapat dihubungi untuk komunikasi


Tipe data dan dimensi dari dataframe dataBPJS_temp :

glimpse(dataBPJS_temp)
## Rows: 29,157
## Columns: 11
## $ NoLink        <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
## $ Provinsi      <chr> "Nanggroe Aceh Darussalam", "Nanggroe Aceh Darussalam...
## $ KotaKab       <chr> "Kode Faskes dan Alamat Rumah Sakit BPJS di Kota\n   ...
## $ Link          <chr> "https://lovia.life/id/health/bpjs/area/kota-langsa",...
## $ TipeFaskes    <chr> "Rumah Sakit", "Rumah Sakit", "Rumah Sakit", "Rumah S...
## $ No            <chr> "1", "2", "3", "4", "1", "2", "3", "4", "5", "-", "-"...
## $ KodeFaskes    <chr> "0001R001", "0001R004", "0105R001", "0105R013", "0001...
## $ NamaFaskes    <chr> "RSU Cut Nyak Dhien\n                    \n          ...
## $ LatLongFaskes <chr> "http://maps.google.co.id/?q=4.488058,97.947963", "ht...
## $ AlamatFaskes  <chr> "Jl. Tm Bahrum No. 1 Langsa", "Jl.Garuda Kebun Baru L...
## $ TelpFaskes    <chr> "\n 0641-0621039\n", "\n 0641- 4840076\n", "\n 0641-2...

Cleansing Data


1. cleansing data dilakukan pada kolom KotaKab, NamaFaskes, TelpFaskes,KotaKab, LatLongFaskes dengan cara menghapus pattern string/charackter yang tidak dibutuhkan.

dataBPJS_temp <- dataBPJS_temp %>% 
  #cleansing \n dan trim spasi pada setiap kolom dataframe dataBPJS_temp dengan 
  mutate_all(str_squish) %>% 
  #cleansing data Kota Kabupaten pada kolom KotaKab"
  mutate(KotaKab =str_replace_all(KotaKab,"Kode Faskes dan Alamat Rumah Sakit BPJS di ","")) %>% 
  # data hasil cleansing di urutkan berdasarkan Provinsi dan Kota/Kabupaten
  arrange(Provinsi,KotaKab)


2. Dilanjutkan data Wrangling untuk mendambahkan 2 kolom baru yaitu Latitude & Longitude dengan melakukan substring pada kolom LatLongFaskes dengan batas pengambilan data adalah tanda koma(“,”) . Kemudian menyimpan data yang sudah clean ke dataBPJS. Tujuan pemisahan Latitude dan Longitude adala sebagai alat bantu untuk visualisasi pada map di tahap selanjutnya.

  dataBPJS<- dataBPJS_temp %>% 
  mutate(Latitude =substr(LatLongFaskes,str_length("http://maps.google.co.id/?q=")+1, str_locate(LatLongFaskes,",")-1)) %>% 
  mutate(Longitude =substr(LatLongFaskes,str_locate(LatLongFaskes,",")+1, str_length(LatLongFaskes))) 


3. Ubah tipe data pada kolom Latitude & Longitude

#cek apakah terdapat data NA pada setiap kolom dataBPJS dengan menggunakan colSums() dan terdapat 5408 data latitude & longitude yang N/A
  colSums(is.na(dataBPJS))
##        NoLink      Provinsi       KotaKab          Link    TipeFaskes 
##             0             0             0             0             0 
##            No    KodeFaskes    NamaFaskes LatLongFaskes  AlamatFaskes 
##             0             0             0             0             0 
##    TelpFaskes      Latitude     Longitude 
##             0          5408          5408
  dataBPJS <- dataBPJS %>% 
  mutate(Latitude = as.double(Latitude)) %>% 
  mutate(Longitude = as.double(Longitude)) 

Data Visualisation

Data visualisasi terdiri dari 4 report sebagai berikut :

4.1. Report Summary Ketersediaan Fasilitas Kesehatan Perprovinsi Per Tipe Fasilitas Kesehatan


Agar memudahkan pada saat visualisasi, create template theme yang ingin digunakan. Contoh adalah theme algoritma.

theme_algoritma <- theme(legend.key = element_rect(fill="skyblue"),
           legend.background = element_rect(color="white", fill="#263238"),
           plot.subtitle = element_text(size=6, color="white"),
           panel.background = element_rect(fill="white"),
           panel.border = element_rect(fill=NA),
           panel.grid.minor.x = element_blank(),
           panel.grid.major.x = element_blank(),
           panel.grid.major.y = element_line(color="darkgrey", linetype=2),
           panel.grid.minor.y = element_blank(),
           plot.background = element_rect(fill="#263238"),
           text = element_text(color="white"),
           axis.text = element_text(color="white")
           
           )

*Plot Pertama
data wranggling untuk mendapatkan data jumlah fasilitas kesehatan per tipe per provinsi

# Summary data fasilitas kesehatan per provinsi di Indonesia
   faskes_prov <- dataBPJS %>% 
   group_by(Provinsi, TipeFaskes) %>% 
   summarise(count=n()) %>% 
   arrange(desc(count)) %>% 
   ungroup()


data hasil wrangling kemudian di plot dengan menggunakan ggplot

  cplot <- ggplot(faskes_prov, aes(x=count,y=reorder(Provinsi,count)))+
  geom_col(position="stack", aes(fill=TipeFaskes))+
  labs(title = "Summary Ketersediaan Fasilitas Kesehatan Per Provinsi", 
       subtitle = "Per Tipe Fasilitas Kesehatan", 
       caption =  "Source : Kaggle.com",
       x = "Jumlah Fasilitas Kesehatan",
       y = "Provinsi" , 
       fill = "legend")+ 
  theme_algoritma
# hasil plot di input di ggplotly untuk mendapatkan input yang interaktif
  ggplotly(cplot)

Dari grafik di atas dapat disimpulkan bahwa sebagian besar fasilitas kesehatan terdapat di provinsi Jawa Tengah, Jawa Barat dan Jawa timur. Dengan jumlah puskesmas mendominasi. Jumlah fasilitas kesehatan terendah terdapat di provinsi Kalimantan Utara dan Kepulauan Bank Belitung.

4.2. Report Persentase Total Fasilitas Kesehatan Per Tipe di Indonesia

*Plot kedua
data wranggling

Total_faskes <- dataBPJS %>% 
   group_by(TipeFaskes) %>% 
   summarise(count=n()) %>% 
   mutate(persentase = round(count/(sum(count)),4)) %>%
   ungroup() %>% 
   arrange(desc(persentase))


data hasil wrangling kemudian di plot dengan menggunakan ggplot dengan theme_clean

    ggplot(Total_faskes, aes(x = "Faskes", persentase, fill = TipeFaskes)) +
    geom_col(color="white") +
    coord_polar(theta = "y", start=0) +
    labs(title = "Pie Chart") +
    geom_label(aes(label = scales::percent(persentase), x = 1.4),
               position = position_stack(vjust = 0.5),
               color = "black",
               fill="white") +
  labs(title="Pie Chart Total Fasilitas Kesehatan di Indonesia", subtitle="Per Tipe Faisilitas Kesehatan",caption = "source  data: kaggle.com")+
    theme_clean()

4.3. Report Sebaran Ketersediaan Fasilitas Kesehatan di Provinsi Bali

Display report dipilih untuk 1 provinsi sebagai contoh untuk melihat sebaran data.

*Plot ketiga

  Longlat_faskes <- na.omit(dataBPJS)  #remove NA dari data latitude & longitude
  Longlat_faskes<- Longlat_faskes %>% 
  filter(Provinsi=="Bali")


data hasil wrangling kemudian di plot dengan menggunakan map dari leaflet. Dan dibatasi hanya untuk provinsi bali untuk memudahkan proses ploting dari banyaknya data yang ada.

# membuat icon Rumah sakit
ico <- makeIcon(
    iconUrl = "hostpital.png",
    iconWidth= 20, iconHeight=20
)

# membuat object leaflet(), sama seperti awalan ggplot()
map1 <- leaflet()

# membuat tiles atau gambar peta
map1 <- addTiles(map1)

# membuat konten popup dengan gaya penulisan html saat di click
content_popup <- paste(sep = " ", Longlat_faskes$NamaFaskes, "<br>",
                 "Tipe Faskes:", Longlat_faskes$TipeFaskes, "<br>",
                 "Kode:", Longlat_faskes$KodeFaskes
                 )

# memasukkan marker atau titik sesuai dengan data
map1 <- addMarkers(map = map1, 
                   lng =  Longlat_faskes$Longitude, # garis bujur
                   lat =  Longlat_faskes$Latitude, # garis lintang
                   #lng =  109.4105 , # garis bujur
                   #lat =  -7.467487, # garis lintang
                   icon = ico, #icon
                   popup = content_popup, #popup atau tulisan
                   clusterOptions = markerClusterOptions() # membuat cluster supaya tidak overlap
                   )

map1