email             :
ntraktir          : https://trakteer.id/contekansial
nyawer          : https://saweria.co/contekansial
github            : https://bit.ly/origin-AL-GitHub
youtube         : https://bit.ly/origin-AL-youtube



1 Pengantar

1.1 Latar Belajang Project

COVID-19 merupakan penyakit yang saat ini telah menjadi pandemi secara global. Kondisi menjadi semakin mengkhawatirkan karena hingga detik ini masih belum ditemukan vaksin yang efektif untuk virus penyebab COVID-19. Pemerintah di berbagai negara umumnya dengan sigap membentuk gugus tugas (task force unit) untuk menangani penyebaran COVID-19 di masyarakat, termasuk pemerintah di Indonesia.

Salah satu bentuk aksi yang dilakukan oleh pemerintah adalah dengan mengumpulkan dan menyediakan data pertumbuhan kasus COVID-19 kepada publik. Data pertumbuhan kasus tersebut tidak jarang juga dilengkapi dengan dasbor dan grafik visualisasi pendukung dengan harapan masyarakat dapat memahami informasi dengan lebih mudah. Sebagai contoh adalah portal covid19.go.id besutan Gugus Tugas Penanganan COVID-19 Nasional dan portal PIKOBAR milik pemerintah Provinsi Jawa Barat. Serta banyak portal data COVID-19 lainnya yang disediakan oleh masing-masing pemerintah daerah.

1.2 Pemanasan

Sebagai pemanasan sebelum Anda memulai proyek ini, buatlah sebuah vektor karakter dengan 3 elemen dengan nama lawan.covid yang merupakan kunci dasar menghindari COVID-19 !

Jangan lupa untuk mencetak vektor lawan.covid tersebut !

Begini :

#membuat vektor
lawan.covid <- c("cuci tangan", "jaga jarak", "pakai masker")

#menampilkan hasil
lawan.covid
[1] "cuci tangan"  "jaga jarak"   "pakai masker"

1.3 Siap ?

Dalam proyek ini, kamu akan diminta untuk melakukan eksplorasi dan analisis mengenai COVID-19 di Indonesia. Data yang Anda pergunakan diambil langsung dari API (Application Programming Interface) yang tersedia di covid19.go.id. Sehingga dalam proyek ini kamu akan mempelajari teknik mengambil data dari API, teknik mempersiapkan data, serta analisis dan visualisasi data.

Apakah kamu siap untuk mengerjakan proyek analisis data ini ?

Jawablah dengan YA apabila kamu siap atau TIDAK jika kmau belum siap karena belum memakai masker.

Begini :

"YA"
[1] "YA"

2 Bermain API

2.1 Mengakses API covid.go.id

Rekapitulasi data COVID-19 Indonesia tersedia dalam API publik.

Salah satu cara untuk mengakses API adalah dengan menggunakan fungsi GET() dari paket httr.

Sekarang aktifkanlah paket httr dan jalankan fungsi GET() pada alamat API yang telah disebutkan !

Simpan hasil fungsi tersebut dalam obyek bernama respon.

Begini :

#set library yang dibutuhkan
library(httr)

#membuat konfigurasi
set_config(config(ssl_verifypeer = 0L))

#membuat variabel dataset
respon <- GET("https://storage.googleapis.com/dqlab-dataset/update.json")

2.2 Mengevaluasi Respon

Saat kamu menjalankan fungsi GET(), pada dasarnya hal yang terjadi adalah kamu membuat sebuah permintaan kepada server penyedia API. Permintaan kamu tersebut selanjutnya diproses dan dijawab oleh server sebagai sebuah respon. Objek respon yang telah kamu buat memiliki informasi respon oleh server.

Ada tiga informasi utama dalam sebuah respon API, yaitu status, headers, dan body. Status memiliki informasi apakah permintaan kamu berhasil atau tidak dan dinyatakan dalam status code. Headers umumnya mengandung informasi metadata. Sedangkan body berisikan konten atas permintaan yang telah dibuat.

2.3 Status Code

Ada beberapa jenis status code yang umumnya dijumpai, antara lain:

  • 200 = permintaan sukses dipenuhi
  • 404 = berkas yang diminta tidak dapat ditemukan
  • 403 = akses permintaan ditolak
  • 500 = terjadi kesalahan pada server.

Kamu dapat menggunakan fungsi status_code() untuk mengetahui status atas permintaan kamu melalui API.

Sekarang coba lihatlah status atas permintaan yang telah kamu buat !

Begini :

#set library yang dibutuhkan
library(httr)

#membuat konfigurasi
set_config(config(ssl_verifypeer = 0L))

#membuat variabel dataset
respon <- GET("https://storage.googleapis.com/dqlab-dataset/update.json")

#cek status
status_code(respon)
[1] 200

2.4 Status Code 2

Selain menggunakan fungsi status_code(), kamu juga dapat mengetahui status permintaan dengan cara mengakses elemen dari resp. Status code tersebut tersedia dengan nama status_code dan dapat diakses dengan menggunakan operator $ pada obyek resp.

Cobalah kembali akses status code dengan cara tersebut dan bandingkan hasilnya dengan cara pertama !

Begini :

#set library yang dibutuhkan
library(httr)

#membuat konfigurasi
set_config(config(ssl_verifypeer = 0L))

#membuat variabel dataset
respon <- GET("https://storage.googleapis.com/dqlab-dataset/update.json")

#cek status cara lain
respon$status_code
[1] 200
#membandingkan hasil
identical(respon$status_code, status_code(respon))
[1] TRUE

2.5 Headers API

Selamat status permintaan kamu melalui API sukses dipenuhi. Sekarang cobalah kamu jalankan fungsi headers() pada resp untuk mengetahui metadata apa saja yang tersimpan.

  • Apakah isi dari elemen content-type ?
  • Kapan terakhir kali informasi diperbaharui ?

Begini :

#set library yang dibutuhkan
library(httr)

#membuat konfigurasi
set_config(config(ssl_verifypeer = 0L))

#membuat variabel dataset
respon <- GET("https://storage.googleapis.com/dqlab-dataset/update.json")

#mengetahui metadata
headers(respon)
$`x-guploader-uploadid`
[1] "ADPycdsREuXigfU_gRy8_qKVDl4iBuD2p0EutSJNzqbvHWD0ySTXS8djhp9XnjVonNe3TW1CNlbTKiO4P2428vrbT90ge-DqboH7"

$`x-goog-generation`
[1] "1654513959565478"

$`x-goog-metageneration`
[1] "1"

$`x-goog-stored-content-encoding`
[1] "identity"

$`x-goog-stored-content-length`
[1] "311897"

$`x-goog-hash`
[1] "crc32c=GMMqEA=="

$`x-goog-hash`
[1] "md5=8aR/820+lfYyWNlv5bLUOQ=="

$`x-goog-storage-class`
[1] "STANDARD"

$`accept-ranges`
[1] "bytes"

$`content-length`
[1] "311897"

$server
[1] "UploadServer"

$date
[1] "Mon, 20 Feb 2023 22:25:49 GMT"

$expires
[1] "Mon, 20 Feb 2023 23:25:49 GMT"

$`cache-control`
[1] "public, max-age=3600"

$age
[1] "1"

$`last-modified`
[1] "Mon, 06 Jun 2022 11:12:39 GMT"

$etag
[1] "\"f1a47ff36d3e95f63258d96fe5b2d439\""

$`content-type`
[1] "application/json"

$`alt-svc`
[1] "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\""

attr(,"class")
[1] "insensitive" "list"       

2.6 Mengekstrak isi Respon

Respon API dengan status code 200 menyatakan bahwa permintaan kamu berhasil dipenuhi dan konten yang diminta tersedia untuk diekstrak. Selain itu kamu juga telah mengetahui lewat fungsi headers() bahwa konten yang diminta tersedia dalam bentuk application/json, yaitu berkas JSON.

Selanjutnya kamu dapat mengekstrak konten tersebut dengan menggunakan fungsi content(). Fungsi content() tersebut secara cerdas akan menyesuaikan output sesuai dengan jenis berkas yang tersedia, dalam hal ini adalah berkas JSON.

Jalankan fungsi tersebut pada obyek respon dan tambahkan argumen as = "parsed" dan simplifyVector = TRUE !

Simpanlah hasilnya sebagai cov.id !

Begini :

#set library yang dibutuhkan
library(httr)

#membuat konfigurasi
set_config(config(ssl_verifypeer = 0L))

#membuat variabel dataset
respon <- GET("https://storage.googleapis.com/dqlab-dataset/update.json")

#mengekstrak konten
cov.id <- content(respon, as = "parsed", simplifyVector = TRUE)

2.7 Mengekstrak isi Respon 2

Dengan menggunakan fungsi length() dan names() cobalah kamu amati ada berapa komponen serta apa saja nama komponen dalam obyek cov.id tersebut !

Kemudian ekstraklah komponen ke-2 dan simpan dengan nama cov.id.apdet.

Begini :

length(cov.id)
[1] 2
names(cov.id)
[1] "data"   "update"
cov.id.apdet <- cov.id$update

2.8 Analisa Data

Sekarang kamu diminta untuk fokus pada obyek cov.id.apdet untuk menjawab pertanyaan-pertanyaan berikut:

  • Kapan tanggal pembaharuan data penambahan kasus ?
  • Berapa jumlah penambahan kasus sembuh ?
  • Berapa jumlah penambahan kasus meninggal ?
  • Berapa jumlah total kasus positif hingga saat ini ?
  • Berapa jumlah total kasus meninggal hingga saat ini ?

Begini :

lapply(cov.id.apdet,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"
#pembaharuan data penambahan kasus
cov.id.apdet$penambahan$tanggal
[1] "2022-05-14"
#penambahan kasus sembuh
cov.id.apdet$penambahan$jumlah_sembuh
[1] 416
#penambahan kasus meninggal
cov.id.apdet$penambahan$jumlah_meninggal
[1] 5
#total kasus positif sampai saat ini
cov.id.apdet$total$jumlah_positif
[1] 6050519
#total kasus meninggal sampai saat ini
cov.id.apdet$total$jumlah_meninggal
[1] 156453

2.9 Lawan COVID-19

Jumlah masyarakat yang terinfeksi dan meninggal akibat COVID-19 sudah sangat banyak. Kita harus waspada namun tetap tenang dalam menghadapi masa pandemi ini. Masih ingatkah kamu apa 3 langkah sederhana melawan COVID-19 ?

Cuci tangan, jaga jarak dan pakai masker.


3 COVID-19 di Sekitar

3.1 Apa Kabar Jawa Barat ?

Kamu telah berhasil menjawab pertanyaan mengenai kondisi COVID-19 di Indonesia dengan menggunakan data yang langsung diambil menggunakan API. Namun bagaimana jika kamu ingin berfokus dengan data COVID-19 di provinsi tempat menetap saat ini ?

covid19.go.id menyediakan data kasus COVID-19 tingkat provinsi di alamat API yang berbeda. Sebagai contoh data mengenai COVID-19 Jawa Barat, tempat tinggal saya sekarang, tersedia di https://data.covid19.go.id/public/api/prov_detail_JAWA_BARAT.json dan dapat diakses menggunakan baris kode berikut:

respon.jabar <- GET("https://data.covid19.go.id/public/api/prov_detail_JAWA_BARAT.json")
covid.jabar <- content(respon.jabar, as = "parsed", simplifyVector = TRUE)

Sekarang jalankanlah fungsi names() pada covid.jabar tersebut untuk mengetahui nama-nama elemen utama yang tersedia dan jawablah pertanyaan berikut:

  • Berapa jumlah total kasus COVID-19 di Jawa Barat ?
  • Berapa persentase kematian akibat COVID-19 di Jawa Barat ?
  • Berapa persentase tingkat kesembuhan dari COVID-19 di Jawa Barat ?

Begini :

#set library yang dibutuhkan
library(httr)

#membuat konfigurasi
set_config(config(ssl_verifypeer = 0L))

#membuat variabel dataset
respon.jabar <- GET("https://storage.googleapis.com/dqlab-dataset/prov_detail_JAWA_BARAT.json")

#mengekstrak konten
covid.jabar <- content(respon.jabar, as = "parsed", simplifyVector = TRUE)

#mengetahui nama elemen utama yang tersedia
names(covid.jabar)
 [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"                
#total kasus COVID-19 di Jabar
covid.jabar$kasus_total
[1] 1105134
#persentase kematian di Jabar
covid.jabar$meninggal_persen
[1] 1.425619
#persentase kesembuhan di Jabar
covid.jabar$sembuh_persen
[1] 98.28238

3.2 Memperoleh Informasi yang Lebih Lengkap

Informasi umum mengenai COVID-19 di Jawa Barat telah kamu dapatkan. Namun informasi akan lebih lengkap jika kamu memiliki data perkembangan COVID-19 dari waktu ke waktu.

Kabar baiknya adalah informasi tersebut juga disediakan oleh covid19.go.id melalui permintaan API yang telah kamu buat sebelumnya. Data historis perkembangan COVID-19 tersebut tersimpan dengan nama list_perkembangan. Silakan kamu ekstrak data tersebut dari covid.jabar dan simpanlah hasilnya sebagai objek bernama cov.jabar! Amati struktur cov.jabar menggunakan fungsi str() dan head().

Begini :

#melihat perkembangan COVID-19 Jabar
cov.jabar <- covid.jabar$list_perkembangan

#melihat tipe data
str(cov.jabar)
'data.frame':   785 obs. of  9 variables:
 $ tanggal                     : num  1.58e+12 1.58e+12 1.58e+12 1.58e+12 1.58e+12 ...
 $ KASUS                       : int  1 1 1 1 0 0 0 0 0 1 ...
 $ MENINGGAL                   : int  1 0 0 0 0 0 0 0 1 0 ...
 $ SEMBUH                      : int  0 0 0 0 0 0 0 0 0 0 ...
 $ DIRAWAT_OR_ISOLASI          : int  0 1 1 1 0 0 0 0 -1 1 ...
 $ AKUMULASI_KASUS             : int  1 2 3 4 4 4 4 4 4 5 ...
 $ AKUMULASI_SEMBUH            : int  0 0 0 0 0 0 0 0 0 0 ...
 $ AKUMULASI_MENINGGAL         : int  1 1 1 1 1 1 1 1 2 2 ...
 $ AKUMULASI_DIRAWAT_OR_ISOLASI: int  0 1 2 3 3 3 3 3 2 3 ...
#menampilkan beberapa data
head(cov.jabar)
       tanggal KASUS MENINGGAL SEMBUH DIRAWAT_OR_ISOLASI AKUMULASI_KASUS
1 1.583194e+12     1         1      0                  0               1
2 1.583280e+12     1         0      0                  1               2
3 1.583366e+12     1         0      0                  1               3
4 1.583453e+12     1         0      0                  1               4
5 1.583539e+12     0         0      0                  0               4
6 1.583626e+12     0         0      0                  0               4
  AKUMULASI_SEMBUH AKUMULASI_MENINGGAL AKUMULASI_DIRAWAT_OR_ISOLASI
1                0                   1                            0
2                0                   1                            1
3                0                   1                            2
4                0                   1                            3
5                0                   1                            3
6                0                   1                            3

3.3 Menjinakkan Data

Setelah mengekstrak dan mengamati cov.jabar, kamu menemukan beberapa kejanggalan pada data tersebut. Diantaranya adalah kejanggalan data pada kolom tanggal dan format penulisan kolom yang tidak konsisten. Sekarang kamu akan mencoba melakukan beberapa tahapan untuk menjinakkan data tersebut sehingga dapat diolah dan dianalisis dengan lebih mudah.

Sebelum itu, silakan kamu aktifkan paket dplyr yang akan dipergunakan untuk melakukan pengolahan data.

Ada beberapa tahapan yang akan kamu lakukan untuk menjinakkan data cov.jabar, yaitu:

  1. Menghapus kolom “DIRAWAT_OR_ISOLASI” dan “AKUMULASI_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
  1. Memperbaiki data pada kolom tanggal

Kamu akan menggunakan operator pipe (%>%) untuk merangkai fungsi menjadi sebuah pipeline. Simpan hasil pengolahan Anda dengan nama cov.jabar.baru.

Begini :

#set libraray yang dibutuhkan
library("dplyr")

#membuat variabel dataset baru
cov.jabar.baru <-
  cov.jabar %>%
  #menghapus kolom
  select(-contains("DIRAWAT_OR_ISOLASI")) %>% 
  select(-starts_with("AKUMULASI")) %>% 
  #mengubah nama kolom
  rename(
    kasus.baru = KASUS,
    meninggal = MENINGGAL,
    sembuh = SEMBUH
    ) %>%
  #memperbaiki data kolom tanggal
  mutate(
    tanggal = as.POSIXct(tanggal / 1000, origin = "1970-01-01"),
    tanggal = as.Date(tanggal)
  )

#melihat tipe data
str(cov.jabar.baru)
'data.frame':   785 obs. of  4 variables:
 $ tanggal   : Date, format: "2020-03-03" "2020-03-04" ...
 $ kasus.baru: int  1 1 1 1 0 0 0 0 0 1 ...
 $ meninggal : int  1 0 0 0 0 0 0 0 1 0 ...
 $ sembuh    : int  0 0 0 0 0 0 0 0 0 0 ...
#melihat beberapa data
head(cov.jabar.baru)
     tanggal kasus.baru meninggal sembuh
1 2020-03-03          1         1      0
2 2020-03-04          1         0      0
3 2020-03-05          1         0      0
4 2020-03-06          1         0      0
5 2020-03-07          0         0      0
6 2020-03-08          0         0      0

3.6 Grafik untuk Kasus Sembuh

Sekarang buatlah grafik serupa dengan menggunakan data kasus sembuh. Pergunakan warna “olivedrab2” untuk grafik kasus sembuh!

Begini ;

#set library yang dibutuhkan
library(ggplot2)
library(hrbrthemes)

#membuat bar chart kasus sembuh
ggplot(cov.jabar.baru, aes(tanggal, sembuh)) +
    geom_col(fill = "olivedrab2") +
  labs(
    x = NULL,
    y = "",
    title = "Kasus Harian Sembuh dari COVID-19 di Jawa Barat",
    subtitle = "",
    caption = "Sumber data: covid.19.go.id"
  ) +
  theme_ipsum(
    base_size = 13,
    plot_title_size = 18,
    grid = "Y",
    ticks = TRUE
  ) +
  theme(plot.title.position = "plot")

3.7 Grafik untuk Kasus Meninggal

Sekarang buatlah grafik serupa dengan menggunakan data kasus meninggal. Pergunakan warna “darkslategray4” untuk kasus meninggal!

Begini :

#set library yang dibutuhkan
library(ggplot2)
library(hrbrthemes)

#membuat bar chart kasus meninggal
ggplot(cov.jabar.baru, aes(tanggal, meninggal)) +
    geom_col(fill = "darkslategray4") +
  labs(
    x = NULL,
    y = "",
    title = "Kasus Harian Meninggal Akibat COVID-19 di Jawa Barat",
    subtitle = "",
    caption = "Sumber data: covid.19.go.id"
  ) +
  theme_ipsum(
    base_size = 13,
    plot_title_size = 18,
    grid = "Y",
    ticks = TRUE
  ) +
  theme(plot.title.position = "plot")


4 Menggali Lebih Dalam

4.1 Apakah Minggu ini Lebih Baik ?

Setelah mengamati grafik perkembangan kasus, kamu menyadari bahwa terjadi fluktuasi pertambahan kasus harian. Dilandasi hal tersebut kamu kemudian ingin mencoba mengamati bagaimana perkembangan kasus dalam rentang waktu mingguan.

Kamu dapat dengan mudah bekerja dengan data tanggal apabila menggunakan paket lubridate. Adapun yang akan digunakan untuk mengekstrak informasi minggu dalam satu tahun adalah fungsi week().

Cobalah untuk menghitung pertambahan kasus mingguan dan simpanlah hasilnya sebagai cov.jabar.mingguan! Anda juga diminta untuk menggunakan fungsi glimpse() dari dplyr untuk melakukan inspeksi data.

Begini :

#set library yang dibutuhkan
library("dplyr")
library(lubridate)

#membuat variabel dataset
cov.jabar.mingguan <- cov.jabar.baru %>% 
  count(
    tahun = year(tanggal),
    pekan_ke = week(tanggal),
    wt = kasus.baru,
    name = "jumlah"
  )

#melakukan inspeksi data
glimpse(cov.jabar.mingguan)
Rows: 115
Columns: 3
$ tahun    <dbl> 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2…
$ pekan_ke <dbl> 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24…
$ jumlah   <int> 1, 3, 16, 41, 98, 149, 153, 155, 156, 284, 803, 175, 395, 203…

4.2 Menjawab Pertanyaan

Pertanyaan baru muncul di benak kamu setelah melakukan inspeksi terhadap data cov.jabar.mingguan tersebut: “Apakah minggu ini lebih baik dari minggu lalu?”.

Demi menjawab hal tersebut kamu melakukan kalkulasi sederhana dengan tahapan berikut:

  • Membuat kolom baru yang berisi jumlah kasus baru dalam satu minggu sebelumnya. Kolom ini diberi nama jumlah.minggulalu.
  • Mengganti nilai NA pada kolom jumlah.minggulalu dengan nilai 0
  • Melakukan komparasi antara kolom jumlah dengan kolom jumlah.minggulalu. Hasil komparasi ini disimpan dalam kolom baru dengan nama lebih.baik. Isinya adalah TRUE apabila jumlah kasus baru minggu ini lebih rendah dibandingkan jumlah kasus minggu lalu.

Kamu akan menggunakan fungsi lag() dari dplyr untuk membuat kolom jumlah.minggulalu. Perhatikan bahwa disini fungsi tersebut dituliskan sebagai dplyr::lag() untuk menghindari konflik dengan fungsi lag() dari paket stats. Inspeksi hasil pekerjaan kamu dengan menggunakan fungsi glimpse()!

Begini :

#set library yang dibutuhkan
library("dplyr")

#membuat variabel dataset
cov.jabar.mingguan <- cov.jabar.mingguan %>% 
  mutate(
    jumlah.minggulalu = dplyr::lag(jumlah, 1),
    jumlah.minggulalu = ifelse(is.na(jumlah.minggulalu), 0, jumlah.minggulalu),
    lebih.baik = jumlah < jumlah.minggulalu
  )

#melakukan inspeksi data
glimpse(cov.jabar.mingguan)
Rows: 115
Columns: 5
$ tahun             <dbl> 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, 2…
$ jumlah            <int> 1, 3, 16, 41, 98, 149, 153, 155, 156, 284, 803, 175,…
$ jumlah.minggulalu <dbl> 0, 1, 3, 16, 41, 98, 149, 153, 155, 156, 284, 803, 1…
$ lebih.baik        <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FAL…

4.3 Membuat Bar Chart

Kamu sungguh luar biasa! Dengan menggunakan data hasil perhitungan tersebut maka sekarang kamu dapat membuat bar chart penambahan kasus mingguan yang ditambahkan informasi baru untuk menjawab pertanyaan: “Apakah minggu ini lebih baik?”

Begini :

#set library yang dibutuhkan
library(ggplot2)
library(hrbrthemes)

#membuat bar chart
ggplot(cov.jabar.mingguan[cov.jabar.mingguan$tahun==2022,], aes(pekan_ke, jumlah, fill = lebih.baik)) +
  geom_col(show.legend = FALSE) +
  scale_x_continuous(breaks = 9:29, expand = c(0, 0)) +
  scale_fill_manual(values = c("TRUE" = "seagreen3", "FALSE" = "darkred")) +
  labs(
    x = NULL,
    y = "",
    title = "Kasus Mingguan Positif COVID-19 di Jawa Barat",
    subtitle = "Data Tahun 2022",
    caption = "Sumber data: covid.19.go.id"
  ) +
  theme_ipsum(
    base_size = 13,
    plot_title_size = 21,
    grid = "Y",
    ticks = TRUE
  ) +
  theme(plot.title.position = "plot")

4.4 Pola dan Dinamika

Ada yang akhirnya sembuh, namun tak sedikit pula yang meninggal akibat COVID-19. Sementara itu penambahan kasus baru terus terjadi di masyarakat. Hal ini mungkin memicu pertanyaan lain di diri kamu: “Hingga saat ini ada berapa kasus yang masih aktif?”. Aktif dalam artian sedang dalam perawatan atau isolasi.

Informasi ini sebenarnya telah disediakan di dalam respon API covid19.go.id yang kamu minta. Namun tidak ada salahnya jika kamu mencoba menghitungnya sendiri.

Jumlah kasus aktif dapat dihitung dengan cara mengurangi jumlah akumulasi positif dengan jumlah akumulasi sembuh dan jumlah akumulasi meninggal. Kamu dapat menggunakan fungsi cumsum() untuk menghitung nilai akumulasi dari suatu vektor numerik.

Begini :

#set library yang dibutuhkan
library("dplyr")

#menghitung jumlah kasus aktif
cov.jabar.akumulasi <- 
  cov.jabar.baru %>% 
  transmute(
    tanggal,
    akumulasi.aktif = cumsum(kasus.baru) - cumsum(sembuh) - cumsum(meninggal),
    akumulasi.sembuh = cumsum(sembuh),
    akumulasi.meninggal = cumsum(meninggal)
  )

#melihat beberapa data
tail(cov.jabar.akumulasi)
       tanggal akumulasi.aktif akumulasi.sembuh akumulasi.meninggal
780 2022-04-21           11628          1077361               15731
781 2022-04-22           10753          1078344               15735
782 2022-04-23            9882          1079297               15737
783 2022-04-24            8709          1080519               15748
784 2022-04-25            5428          1083851               15751
785 2022-04-26            3253          1086129               15752

4.5 Membuat Line Chart

Sekarang cobalah kamu buat line chart pola kasus aktif dengan menggunakan fungsi geom_line(). Sebagai pengingat, kamu dapat menggunakan template kode berikut untuk membuat grafik menggunakan ggplot2():

ggplot(data = ..., aes(x = ..., y = ...)) +
  geom_xxx()

Begini :

#set library yang dibutuhkan
library(ggplot2)

#membuat line chart
ggplot(data = cov.jabar.akumulasi, aes(x = tanggal, y = akumulasi.aktif)) +
  geom_line()

4.6 Kabar Buruk dan Kabar Baik

Sebagai penutup analisis dalam project ini, kamu diminta untuk membuat grafik komparasi antara akumulasi kasus aktif, kasus sembuh, dan kasus meninggal.

Ada dua pilihan cara yang dapat kamu tempuh untuk membuat grafik tersebut:

  1. Menggunakan data cov.jabar.akumulasi, kemudian buat tiga layer geom_line() untuk setiap kolom satu per satu dengan warna garis yang berbeda; atau

  2. Melakukan pivot pada data cov.jabar.akumulasi, kemudian buat satu layer geom_line() dengan menggunakan colour aesthetic

Kamu akan diminta untuk menempuh cara nomor 2, yaitu dengan cara melakukan pivot pada data terlebih dahulu.

4.7 Transformasi Data

Kamu akan menggunakan fungsi gather() dari paket tidyr untuk mentransformasi data cov_jabar_akumulasi. Data tersebut akan diubah dari yang semula berformat wide menjadi format long.

AKtifkanlah paket tidyr terlebih dahulu dan lakukan pivot data. Simpan hasil transformasi data tersebut sebagai pivot.cov.jabar.akumulasi! Perhatikan hasil dari fungsi dim() sebelum dan setelah kamu melakukan transformasi data.

Begini :

#set library yang dibutuhkan
library("dplyr")
library("tidyr")

#mengecek ukuran data
dim(cov.jabar.akumulasi)
[1] 785   4
#membuat pivot
pivot.cov.jabar.akumulasi <- 
  cov.jabar.akumulasi %>% 
  gather(
    key = "kategori",
    value = "jumlah",
    -tanggal
  ) %>% 
  mutate(
    kategori = sub(pattern = "akumulasi_", replacement = "", kategori)
  )

#cek ukuran data baru
dim(pivot.cov.jabar.akumulasi)
[1] 2355    3
#melakukan inspeksi data
glimpse(pivot.cov.jabar.akumulasi)
Rows: 2,355
Columns: 3
$ tanggal  <date> 2020-03-03, 2020-03-04, 2020-03-05, 2020-03-06, 2020-03-07, …
$ kategori <chr> "akumulasi.aktif", "akumulasi.aktif", "akumulasi.aktif", "aku…
$ jumlah   <int> 0, 1, 2, 3, 3, 3, 3, 3, 2, 3, 6, 6, 4, 2, 13, 14, 17, 29, 34,…
#menampilkan beberapa data
head(pivot.cov.jabar.akumulasi)
     tanggal        kategori jumlah
1 2020-03-03 akumulasi.aktif      0
2 2020-03-04 akumulasi.aktif      1
3 2020-03-05 akumulasi.aktif      2
4 2020-03-06 akumulasi.aktif      3
5 2020-03-07 akumulasi.aktif      3
6 2020-03-08 akumulasi.aktif      3

4.8 pivot_longer()

Semenjak tidyr versi 1.0.0, kamu disarankan untuk menggunakan fungsi pivot_longer() sebagai pengganti gather() dan pivot_wider() sebagai pengganti spread(). pivot_longer() dan pivot_wider() memiliki fitur yang lebih lengkap dibandingkan gather() dan spread(). Proses transformasi cov.jabar.akumulasi menjadi pivot.cov.jabar.akumulasi dapat dikerjakan dengan menggunakan pivot_longer().

Kamu dapat mencoba mempraktekkan coding dan apakah kamu menemukan perbedaan signifikan antara baris kode baru dan baris kode sebelumnya yang kamu gunakan?

Begini :

#set library yang dibutuhkan
library("dplyr")
library("tidyr")

#mengecek ukuran data
dim(cov.jabar.akumulasi)
[1] 785   4
#membuat pivot
pivot.cov.jabar.akumulasi <- 
  cov.jabar.akumulasi %>% 
  pivot_longer(
    cols = -tanggal,
    names_to = "kategori",
    names_prefix = "akumulasi_",
    values_to = "jumlah"
  )

#cek ukuran data baru
dim(pivot.cov.jabar.akumulasi)
[1] 2355    3
#melakukan inspeksi data
glimpse(pivot.cov.jabar.akumulasi)
Rows: 2,355
Columns: 3
$ tanggal  <date> 2020-03-03, 2020-03-03, 2020-03-03, 2020-03-04, 2020-03-04, …
$ kategori <chr> "akumulasi.aktif", "akumulasi.sembuh", "akumulasi.meninggal",…
$ jumlah   <int> 0, 0, 1, 1, 0, 1, 2, 0, 1, 3, 0, 1, 3, 0, 1, 3, 0, 1, 3, 0, 1…
#menampilkan beberapa data
head(pivot.cov.jabar.akumulasi)
# A tibble: 6 × 3
  tanggal    kategori            jumlah
  <date>     <chr>                <int>
1 2020-03-03 akumulasi.aktif          0
2 2020-03-03 akumulasi.sembuh         0
3 2020-03-03 akumulasi.meninggal      1
4 2020-03-04 akumulasi.aktif          1
5 2020-03-04 akumulasi.sembuh         0
6 2020-03-04 akumulasi.meninggal      1

4.9 Tahap Terakhir

Kamu hampir selesai! Pada tahap terakhir ini kamu membuat grafik komparasi antara akumulasi kasus aktif, kasus sembuh dan kasus meninggal.

Begini :

#set library yang dibutuhkan
library(ggplot2)
library(hrbrthemes)

#membuat grafik komparasi
ggplot(pivot.cov.jabar.akumulasi, aes(tanggal, jumlah, colour = (kategori))) +
  geom_line(size = 0.9) +
  scale_y_continuous(sec.axis = dup_axis(name = NULL)) +
  scale_colour_manual(
    values = c(
      "aktif" = "red",
      "meninggal" = "darkslategray4",
      "sembuh" = "green"
    ),
    labels = c("Aktif", "Meninggal", "Sembuh")
  ) +
  labs(
    x = NULL,
    y = "Jumlah kasus akumulasi",
    colour = NULL,
    title = "Dinamika Kasus COVID-19 di Jawa Barat",
    caption = "Sumber data: covid.19.go.id"
  ) +
  theme_ipsum(
    base_size = 13,
    plot_title_size = 21,
    grid = "Y",
    ticks = TRUE
  ) +
  theme(
    plot.title = element_text(hjust = 0.5),
    legend.position = "top"
  )


5 Penutup

5.1 Kesimpulan dan Komentar

Selamat kamu telah menyelesaikan project analisis COVID-19 ini! Kamu telah berhasil melakukan import data melalui API, melakukan transformasi data, serta membuat visualisasi untuk mengkomunikasikan hasil analisis data tentang COVID-19.

Kamu dipersilakan untuk selanjutnya mengembangkan analisis dengan cara mengambil studi kasus provinsi lain atau bahkan melakukan komparasi antar provinsi. Kamu dapat menggunakan skrip dasar yang tersedia pada tautan ini untuk memulai analisis. Dengan menggunakan studi kasus provinsi pilihan kamu, dapatkah kamu menjawab dua tantangan ini:

  • Apakah jumlah kasus di minggu ini lebih rendah dibandingkan minggu lalu dan dua minggu lalu secara berturut-turut? Buatlah visualisasinya!

  • Salah satu metrik yang dapat dihitung untuk mengamati persebaran COVID-19 di masyarakat adalah Seventh-Day Amplification Factor (silakan baca ini dan ini). Dapatkah kamu menghitung metrik tersebut?