COVID-19 “coronavirus disease 2019”

Covid-19 adalah penyakit menular yang disebabkan oleh SARS-CoV-2, salah satu jenis coronavirus yang baru ditemukan. Virus dan penyakit ini pertama kali ditemukan di Wuhan, Tiongkok pada bulan Desember 2019. Covid-19 mengakibatkan seluruh negera di berbagai belahan dunia termasuk Indonesia mengalami krisis kesehatan akibat penyebarannya yang sangat luas dan cepat. Covid-19 telah menjadi pandemi yang sampai saat ini belum berakhir dan masih dalam proses pengkajian oleh semua pihak yang terdampak.

Pemerintah telah mengumpulkan dan menyediakan data perkembangan kasus Covid-19 yang terjadi di negeri ini dan dapat diakses secara langsung oleh publik. Data kasus Covid-19 tersebut dilengkapi pula dengan gambaran secara visual agar publik dapat mengetahui dan memahami secara mudah data yang publikasikan. Dalam kesempatan kali ini, menggunakan Modul yang disediakan oleh DQLab yang dimentori oleh Muhammad Aswan Syahputra, akan dilakukan eksplorasi dan analisis mengenai data Covid-19 di Indonesia yang diambil langsung dari API (Application Programming Interface) tersedia di covid19.go.id.

Library

if(!require(httr)) install.packages("httr")
if(!require(dplyr)) install.packages("dplyr")
if(!require(hrbrthemes)) install.packages("hrbrthemes")
if(!require(ggplot2)) install.packages("ggplot2")
if(!require(lubridate)) install.packages("lubridate")
if(!require(tidyr)) install.packages("tidyr")

library(httr)
library(dplyr)
library(hrbrthemes)
library(ggplot2)
library(lubridate)
library(tidyr)

Mengakses API

Data yang digunakan adalah data yang tersedia di situs resmi covid19.go.id. Data yang akan diambil secara langsung dari API (Application Programming Interface) website tersebut. API (Application Programming Interface) adalah kode yang memungkinkan dua program perangkat lunak untuk saling terhubung. Akses API covid19.go.id dapat diakses di data.covid19.go.id/public/api/update.json. Untuk mengakses API dapat dilakukan dengan mengaktifkan paket httr dan menggunakan fungsi GET() . Fungsi GET() digunakan untuk membuat permintaan kepada server penyedia API. Permintaan yang diminta akan diproses dan dijawab sebagai respon.

resp <- GET ("https://data.covid19.go.id/public/api/update.json")

Status Code

Kita akan mengetahui status code dari permintaan akses terhadap API yang kita minta

status_code(resp)
## [1] 200

Status Code tersebut berarti permintaan akses yang diminta sukses dilakukan

Headers API

setelah mengetahui status permintaan akses melalui API sudah terpenuhi, selanjutkan jalankan fungsi headers() pada resp untuk mengetahui metadata apa saja yang tersimpan.

headers(resp)
## $server
## [1] "nginx"
## 
## $date
## [1] "Tue, 15 Sep 2020 03:21:39 GMT"
## 
## $`content-type`
## [1] "application/json"
## 
## $`last-modified`
## [1] "Tue, 15 Sep 2020 03:19:29 GMT"
## 
## $`transfer-encoding`
## [1] "chunked"
## 
## $connection
## [1] "keep-alive"
## 
## $vary
## [1] "Accept-Encoding"
## 
## $etag
## [1] "W/\"5f6032c1-1251f\""
## 
## $`x-content-type-options`
## [1] "nosniff"
## 
## $`x-xss-protection`
## [1] "1; mode=block"
## 
## $`strict-transport-security`
## [1] "max-age=31536000; includeSubDomains; preload"
## 
## $`content-encoding`
## [1] "gzip"
## 
## attr(,"class")
## [1] "insensitive" "list"

Mengekstrak Isi Respon

Untuk mengekstrak kontek, bisa dilakukan dengan menggunakan fungsi content dengan menambahkan argumen as = "parsed" dan simplifyVector = TRUE. Hasilnya akan terlihat komponen-komponen apa saja yang ada dalam berkas tersebut.

cov_id_raw <- content(resp, as = "parsed", simplifyVector = TRUE)
length(cov_id_raw)
## [1] 2
names(cov_id_raw)
## [1] "data"   "update"
# Di ekstrak dengan variabel baru lagi yaitu cov_id_update
cov_id_update <- cov_id_raw$update

Analisis Data

Fokus analisis adalah pada cov_id_update untuk mengetahui :

Sebelumnya, kita lihat dulu apa saja nama yang ada dalam objek dengan menggunakan fungsi lappy

lapply(cov_id_update, names)
## $penambahan
## [1] "jumlah_positif"   "jumlah_meninggal" "jumlah_sembuh"    "jumlah_dirawat"  
## [5] "tanggal"          "created"         
## 
## $harian
##  [1] "key_as_string"        "key"                  "doc_count"           
##  [4] "jumlah_meninggal"     "jumlah_sembuh"        "jumlah_positif"      
##  [7] "jumlah_dirawat"       "jumlah_positif_kum"   "jumlah_sembuh_kum"   
## [10] "jumlah_meninggal_kum" "jumlah_dirawat_kum"  
## 
## $total
## [1] "jumlah_positif"   "jumlah_dirawat"   "jumlah_sembuh"    "jumlah_meninggal"

Kapan tanggal pembaharuan data penambahan kasus?

cov_id_update$penambahan$tanggal
## [1] "2020-09-14"

Didapatkan, pembaharuan data penambahan kasus Covid-19 pada tanggal 14 September 2020.

Berapa jumlah penambahan kasus sembuh?

cov_id_update$penambahan$jumlah_sembuh
## [1] 3395

Didapatkan, jumlah penambahan kasus sembuh sebanyak 3395 orang.

Berapa jumlah penambahan kasus meninggal?

cov_id_update$penambahan$jumlah_meninggal
## [1] 118

Didapatkan, jumlah penambahan kasus meninggal sebanyak 118 orang.

Berapa jumlah total kasus positif hingga saat ini?

cov_id_update$total$jumlah_positif
## [1] 221523

Didapatkan, jumlah total kasus positif hingga saat ini sebanyak 221523 orang

Berapa jumlah total kasus meninggal hingga saat ini?

cov_id_update$total$jumlah_meninggal
## [1] 8841

Didapatkan, jumlah kasus meninggal hingga saat ini sebanyak orang

Apa kabar DKI Jakarta?

DKI Jakarta yang kini melakukan kembali PSBB secara total dapat kita untuk mengetahui keadaan terkini yang terjadi akibat Covid-19. Selanjutnya, akan dilakukan analisa terhadap data Covid-19 pada Provinsi DKI Jakarta dengan alamat API https://data.covid19.go.id/public/api/prov_detail_DKI_JAKARTA.json

resp_dki_jakarta <- GET("https://data.covid19.go.id/public/api/prov_detail_DKI_JAKARTA.json")
status_code(resp_dki_jakarta)
## [1] 200

Ketika menghasilkan output 200 maka permintaan sukses. Selanjutnya dilakukan ekstak isi responnya dan menjalankan fungsi names() untuk mengetahui nama_nama elemen yang tersedia.

cov_dkijakarta_raw <- content(resp_dki_jakarta, as = "parsed", simplifyVector = TRUE)
names(cov_dkijakarta_raw)
##  [1] "last_date"            "provinsi"             "kasus_total"         
##  [4] "kasus_tanpa_tgl"      "kasus_dengan_tgl"     "meninggal_persen"    
##  [7] "meninggal_tanpa_tgl"  "meninggal_dengan_tgl" "sembuh_persen"       
## [10] "sembuh_tanpa_tgl"     "sembuh_dengan_tgl"    "list_perkembangan"   
## [13] "data"

Analisis Data

Berapa jumlah total kasus Covid-19 di DKI Jakarta?

cov_dkijakarta_raw$kasus_total
## [1] 55099

Didapatkan, jumlah total kasus positif hingga saat ini di Provinsi DKI Jakarta sebesar 5509 orang

Berapa persentase tingkat kematian akibat Covid-19 di DKI Jakarta?

cov_dkijakarta_raw$meninggal_persen
## [1] 2.573549

Didapatkan, persentase tingkat kematian akibat Covid-19 di DKI Jakarta sebesar 2,6%.

Berapa persentase tingkat kesembuhan dari Covid-19 di DKI Jakarta

cov_dkijakarta_raw$sembuh_persen
## [1] 76.67108

Didapatkan, persentase tingkat kesembuhan akibat Covid-19 di DKI Jakarta sebesar 76,7%.

Memperoleh informasi yang Lebih Lengkap

Informasi umum mengenai COVID-19 di Jawa Barat telah di dapatkan. Namun informasi akan lebih lengkap jika memiliki data perkembangan COVID-19 dari waktu ke waktu. Informasi tersebut juga disediakan oleh covid19.go.id melalui permintaan API yang telah dibuat sebelumnya. Data akan di ekstrak dan dilihat struktur datanya. Akan ditampilkan pula data teratasnya.

cov_dkijakarta <- cov_dkijakarta_raw$list_perkembangan
str(cov_dkijakarta)
## 'data.frame':    198 obs. of  9 variables:
##  $ tanggal                     : num  1.58e+12 1.58e+12 1.58e+12 1.58e+12 1.58e+12 ...
##  $ KASUS                       : int  2 2 2 2 0 0 0 0 0 0 ...
##  $ MENINGGAL                   : int  0 0 0 0 1 0 2 0 1 0 ...
##  $ SEMBUH                      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ DIRAWAT_OR_ISOLASI          : int  2 2 2 2 -1 0 -2 0 -1 0 ...
##  $ AKUMULASI_KASUS             : int  2 4 6 8 8 8 8 8 8 8 ...
##  $ AKUMULASI_SEMBUH            : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ AKUMULASI_MENINGGAL         : int  0 0 0 0 1 1 3 3 4 4 ...
##  $ AKUMULASI_DIRAWAT_OR_ISOLASI: int  2 4 6 8 7 7 5 5 4 4 ...
head(cov_dkijakarta)
##        tanggal KASUS MENINGGAL SEMBUH DIRAWAT_OR_ISOLASI AKUMULASI_KASUS
## 1 1.583021e+12     2         0      0                  2               2
## 2 1.583107e+12     2         0      0                  2               4
## 3 1.583194e+12     2         0      0                  2               6
## 4 1.583280e+12     2         0      0                  2               8
## 5 1.583366e+12     0         1      0                 -1               8
## 6 1.583453e+12     0         0      0                  0               8
##   AKUMULASI_SEMBUH AKUMULASI_MENINGGAL AKUMULASI_DIRAWAT_OR_ISOLASI
## 1                0                   0                            2
## 2                0                   0                            4
## 3                0                   0                            6
## 4                0                   0                            8
## 5                0                   1                            7
## 6                0                   1                            7

Dilihat dari 6 data teratas tersebut, dapat kita lihat isi dari kolom tanggal terlihat tidak beraturan dan tidak sesuai format tanggal. Begitupun dengan format penulisan kolomnya tidak konsisten. Maka akan dilakukan beberapa tahapan untuk menjinakan data tersebut sehingga dapat diolah dan dianalisis dengan lebih mudah.

Menjinakan Data

Ada beberapa tahapan yang akan dilakukan untuk menjinakan data cov_dkijakarta, yaitu :

  1. Menghapus kolom “DIRAWAT_OR_ISOLASI”
  2. Menghapus semua kolom yang berisi nilai kumulatif
  3. Mengganti nama kolom “KASUS” menjadi “kasus_baru”
  4. Merubah format penulisan kolom berikut menjadi huruf kecil
    • kolom MENINGGAL
    • kolom SEMBUH
  5. Memperbaiki data pada kolom tanggal

Dengan mengaktifkan paket dply digunakan untuk melakukan pengolahan data.

new_cov_dkijakarta <-
  cov_dkijakarta %>%
  select(-contains("DIRAWAT_OR_ISOLASI")) %>%
  select(-starts_with("AKUMULASI")) %>%
  rename(
    kasus_baru = KASUS,
    meninggal = MENINGGAL,
    sembuh = SEMBUH
    ) %>%
  mutate(
    tanggal = as.POSIXct(tanggal / 1000, origin = "1970-01-01"),
    tanggal = as.Date(tanggal)
  )

#Dilihat struktur data dari new_cov_dkijakarta
str(new_cov_dkijakarta)
## 'data.frame':    198 obs. of  4 variables:
##  $ tanggal   : Date, format: "2020-03-01" "2020-03-02" ...
##  $ kasus_baru: int  2 2 2 2 0 0 0 0 0 0 ...
##  $ meninggal : int  0 0 0 0 1 0 2 0 1 0 ...
##  $ sembuh    : int  0 0 0 0 0 0 0 0 0 0 ...

Setelah menjinakan data cov_dkijakarta sehingga data lebih mudah untuk diolah dan data yang kita miliki sudah dalam keadaan rapi

Kasus Harian Positif

ggplot(new_cov_dkijakarta, aes(tanggal, kasus_baru)) +
  geom_col(fill = "salmon") +
  labs(
    x = NULL,
    y = "Jumlah Kasus",
    width = "2000%",
    title = "Kasus Harian Positif COVID-19 di DKI Jakarta",
    caption = "Sumber Data : covid19.go.id"
  ) +
  theme_ipsum(
    base_size = 10,
    plot_title_size = 21,
    grid = "Y",
    ticks = TRUE
  ) +
  theme(plot.title.position = "plot")

Penambahan kasus harian CovID-19 di Provinsi DKI Jakarta selalu mengalami peningkatan. terdapat perlonjakan kasus yang meningkat drastis dan semakin hari penambahan semakin terlihat.

Kasus Harian Sembuh

ggplot(new_cov_dkijakarta, aes(tanggal, sembuh)) +
  geom_col(fill = "olivedrab2") +
  labs(
    x = NULL,
    y = "Jumlah Kasus",
    title = "Kasus Harian Sembuh Covid-19 di DKI Jakarta",
    caption = "Sumber Data : covid19.go.id"
  ) +
  theme_ipsum(
    base_size = 10,
    plot_title_size = 21,
    grid = "Y",
    ticks = TRUE
  ) +
  theme(plot.title.position =  "plot")

Fluktuasi terlihat pada penambahan kasus sembuh setiap harinya. Dan terdapat kenaikan drastis kasus sembuh pada bulan Agustus.

Kasus Harian Meninggal

ggplot(new_cov_dkijakarta, aes(tanggal, meninggal)) +
  geom_col(fill = "darkslategray4") +
  labs(
    x = NULL,
    y = "Jumlah Kasus",
    title = "Kasus Harian Meninggal Akibat Covid-19 di DKI Jakarta",
    caption = "Sumber Data : covid19.go.id"
  ) +
  theme_ipsum(
    base_size = 10,
    plot_title_size = 18,
    grid = "Y",
    ticks = TRUE
  ) +
  theme(plot.title.position = "plot")

Fluktuasi juga terlihat pada penambahan kasus meninggal setiap harinya.

Penambahan Kasus Mingguan

Setelah mengamati grafik perkembangan kasus harian. Kita amati pula bagaimana perkembangan kasus dalam rentang waktu mingguan.

Paket lubridate dapat mmemudahkan bekerja dengan data tanggal. Adapun fungsi yang digunakan adalah fungsi week() untuk mengekstrak informasi mingguan dalam satu tahun.

cov_dkijakarta_pekanan <- new_cov_dkijakarta %>%
  count(
    tahun = year(tanggal),
    pekan_ke = week(tanggal),
    wt = kasus_baru,
    name = "jumlah"
  )

# Melihat struktur datanya
glimpse(cov_dkijakarta_pekanan)
## Rows: 29
## Columns: 3
## $ tahun    <dbl> 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020...
## $ pekan_ke <dbl> 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,...
## $ jumlah   <int> 6, 2, 8, 2, 287, 546, 924, 858, 679, 635, 677, 789, 641, 7...

Apakah pekan ini lebih baik dari kemarin?

Untuk menjawab pertanyaan tersebut, perlu dilakukan kalkulasi sederhana dengan tahapan berikut:

  1. Membuat kolom baru yang berisi jumlah kasus baru dalam satu pekan sebelumnya. Kolom ini diberi nama “jumlah_pekanlalu”.
  2. Mengganti nilai NA pada kolom “jumlah_pekanlalu” dengan nilai 0
  3. Melakukan komparasi antara kolom “jumlah” dengan kolom “jumlah_pekanlalu”. Hasil komparasi ini disimpan dalam kolom baru dengan nama “lebih_baik”, isinya adalah TRUE apabila jumlah kasus baru pekan ini lebih rendah dibandingkan jumlah kasus pekan lalu.

Gunakan fungsi lag() dari dplyr untuk membuat kolom jumlah_pekanbaru fungsi dituliskan sebagai dplyr::lag() untuk menghindari konflik dengan fungsi lag() dari paket stats. Dan inpeksi kembali dengan fungsi glimpse().

cov_dkijakarta_pekanan <-
  cov_dkijakarta_pekanan %>%
  mutate(
    jumlah_pekanlalu = dplyr::lag(jumlah, 1),
    jumlah_pekanlalu = ifelse(is.na(jumlah_pekanlalu), 0, jumlah_pekanlalu),
    lebih_baik = jumlah < jumlah_pekanlalu
  )
glimpse(cov_dkijakarta_pekanan)
## Rows: 29
## Columns: 5
## $ tahun            <dbl> 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 20...
## $ pekan_ke         <dbl> 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,...
## $ jumlah           <int> 6, 2, 8, 2, 287, 546, 924, 858, 679, 635, 677, 789...
## $ jumlah_pekanlalu <dbl> 0, 6, 2, 8, 2, 287, 546, 924, 858, 679, 635, 677, ...
## $ lebih_baik       <lgl> FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, TRU...

Untuk menjawab pernyataan Apakah pekan ini lebih baik dari pekan kemarin? digunakan bar chart untuk menjawab pernyataan tersebut.

ggplot(cov_dkijakarta_pekanan, aes(pekan_ke, jumlah, fill = lebih_baik)) +
  geom_col(show.legend = FALSE) +
  scale_x_continuous(breaks = 9:40, expand = c(0,0)) +
  scale_fill_manual(values = c("TRUE" = "seagreen3", "FALSE" = "salmon")) +
  labs(
    x = NULL,
    y = "Jumlah Kasus",
    title = "Kasus Pekanan Positif Covid-19 di DKI Jakarta",
    subtitle = "kolom hijau menunjukkan penambahan kasus baru < dibandingkan pekan sebelumnya",
    caption = "Sumber Data : covid19.go.id"
  ) +
  theme_ipsum(
    base_size = 5,
    plot_title_size = 21,
    grid = "Y",
    ticks = TRUE
  ) +
  theme(plot.title.position = "plot")

Penambahan kasus baru semakin bertambah dari pekan ke pekan berikutnya. Namun penambahan kasus baru meningkat dan mencapai puncaknya di pekan ke 36 sebanyak lebih dari 6000 kasus.

Hingga saat ini, berapa banyak kasus yang masih aktif?

Aktif dalam artian sedang dalam perawatan atau isolasi.Jumlah kasus yang masih aktif dapat dihitung dengan mengurangi jumlah akumulasi kasus positif dengan jumlah akumulasi kasus yang sembuh, dan menguranginya juga dengan jumlah akumulasi kasus meninggal. Nilai akumulasi dihitung dengan fungsi cumsum().

cov_dkijakarta_akumulasi <-
  new_cov_dkijakarta %>%
  transmute(
    tanggal,
    akumulasi_aktif = cumsum(kasus_baru) - cumsum(sembuh) - cumsum(meninggal),
    akumulasi_sembuh = cumsum(sembuh),
    skumulasi_meninggal = cumsum(meninggal)
  )

tail(cov_dkijakarta_akumulasi)
##        tanggal akumulasi_aktif akumulasi_sembuh skumulasi_meninggal
## 193 2020-09-09           10412            37184                1314
## 194 2020-09-10           10665            38188                1331
## 195 2020-09-11           10712            39088                1348
## 196 2020-09-12           11233            39754                1366
## 197 2020-09-13           11650            40712                1371
## 198 2020-09-14           11008            42206                1398

Output diatas menunjukan akumulasi kasus aktif dalam kurun waktu 1 pekan terakhir.

Pola kasus aktif di Provinsi DKI Jakarta dapat dilihat dengan membuat line chart dengan fungsi geom_line().

ggplot(data = cov_dkijakarta_akumulasi, aes(x = tanggal, y = akumulasi_aktif)) +
  geom_line()

Transformasi Data

Akan dilakukan pivot pada data cov_dkijakarta_akumulasi dan digunakan fungsi gather() di paket tidyr untuk mentransformasi data. Data akan dirubah dari yang semula berformat wide menjadi format long. Transformasi ini bermanfaat saat kita melakukan grafik komparasi antara kasus aktif, sembuh, dan meninggal.

cov_dkijakarta_akumulasi_pivot <-
  cov_dkijakarta_akumulasi %>%
  gather(
    key = "kategori",
    value = "jumlah",
    -tanggal
  ) %>%
  mutate(
    kategori = sub(pattern = "akumulasi_", replacement = "", kategori)
  )
glimpse(cov_dkijakarta_akumulasi_pivot)
## Rows: 594
## Columns: 3
## $ tanggal  <date> 2020-03-01, 2020-03-02, 2020-03-03, 2020-03-04, 2020-03-0...
## $ kategori <chr> "aktif", "aktif", "aktif", "aktif", "aktif", "aktif", "akt...
## $ jumlah   <int> 2, 4, 6, 8, 7, 7, 5, 5, 4, 4, 4, -1, -5, -6, -3, -6, -6, -...

Membuat Grafik Komparasi Kasus Aktif, Sembuh dan Meninggal

Membuat satu layer geom_line() dengan menggunakan colour aesthetic

ggplot(cov_dkijakarta_akumulasi_pivot, aes(tanggal, jumlah, colours=(kategori))) +
  geom_line(size=0.9) +
  scale_y_continuous(sec.axis = dup_axis(name = NULL)) +
  scale_colour_manual(
    values = c(
      "aktif" = "salmon",
      "meninggal" = "darkslategray4",
      "sembuh" = "olivedrab2"
    ),
    labels = c("Aktif", "Meninggal", "sembuh")
  ) +
  labs(
    x = NULL,
    y = "Jumlah Kasus Akumulasi",
    colours = NULL,
    title = "Dinamika Kasus Covid-19 di Provinsi DKI Jakarta",
    caption = "Sumber Data : covid19.go.id"
  ) +
  theme_ipsum(
    base_size = 8,
    plot_title_size = 18,
    grid = "Y",
    ticks = TRUE
  ) +
  theme(
    plot.title = element_text(hjust = 0,5),
    legend.position = "top"
  )

Grafik diatas merupakan gambaran terkait Kasus Aktif, Sembuh, dan Meninggal di Provinsi DKI Jakarta sejak Bulan Maret 2020 hingga pertengahan September 2020. Penanganan terhadap kasus Covid-19 terlihat masih belum baik dengan terlihatnya kasus positif di Provinsi DKI Jakarta yang terus meningkat. Pencegahan dan penanggulangan harus terus dilakukan dengan sangat maksimal. Karna terlihat dari grafik, garis kasus meninggal naik secara perlahan dan kasus positif pun bisa kembali naik dengan signifikan.

Tidak hanya peran pemerintah yang dibutuhkan dalam mencegah dan mengurangi kasus baru, dalam penanggulangan memutus rantai penularan virus diperlukannya peran seluruh masyarakat agar menjaga pola hidup dan memenuhi aturan protokol kesehatan yang sudah di tetapkan. Jangan lupa untuk rajin mencuci tangan, memakai masker, dan menjaga jarak! #StaySafe #IndonesiaBisa