Sumber: mycanyonlake.com
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 covid19.sulselprov.go.id milik pemerintah Provinsi Sulawesi Selatan. Serta banyak portal data COVID-19 lainnya yang disediakan oleh masing-masing pemerintah daerah.
Sebagai pemanasan sebelum Anda memulai proyek ini, buatlah sebuah vektor karakter dengan 3 elemen dengan nama bersatulawancovid yang merupakan kunci dasar menghindari COVID-19!
Jangan lupa untuk mencetak vektor bersatulawancovid tersebut pada layar konsol!
bersatulawancovid<-c("cuci tangan","pakai masker","jaga jarak")
bersatulawancovid
## [1] "cuci tangan" "pakai masker" "jaga jarak"
Dalam proyek ini, Anda 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 Anda akan mempelajari teknik mengambil data dari API, teknik mempersiapkan data, serta analisis dan visualisasi data.
Apakah Anda siap untuk mengerjakan proyek analisis data ini? Jawablah dengan TRUE apabila Anda siap atau FALSE jika Anda belum siap karena belum mencuci tangan.
TRUE
## [1] TRUE
Rekapitulasi data COVID-19 Indonesia tersedia dalam API publik yang beralamat di https://data.covid19.go.id/public/api/update.json.
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 resp.
library(httr)
resp <- GET ("https://data.covid19.go.id/public/api/update.json")
Saat Anda menjalankan fungsi GET(), pada dasarnya hal yang terjadi adalah Anda membuat sebuah permintaan kepada server penyedia API. Permintaan Anda tersebut selanjutnya diproses dan dijawab oleh server sebagai sebuah respon. Objek resp yang telah Anda buat memiliki informasi respon oleh server.
Ada tiga informasi utama dalam sebuah respon API, yaitu status, headers, dan body. Status memiliki informasi apakah permintaan Anda berhasil atau tidak dan dinyatakan dalam status code, headers umumnya mengandung informasi metadata, sedangkan body berisikan konten atas permintaan yang telah dibuat.
Ada beberapa jenis status code yang umumnya dijumpai, antara lain:
https://restfulapi.net/http-status-codes/
Anda dapat menggunakan fungsi status_code() untuk mengetahui status atas permintaan Anda melalui API. Sekarang coba lihatlah status atas permintaan yang telah Anda buat! Apakah permintaan Anda berhasil?
status_code(resp)
## [1] 200
Selain menggunakan fungsi status_code(), Anda 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!
resp$status_code
## [1] 200
identical(resp$status_code, status_code(resp))
## [1] TRUE
Selamat status permintaan Anda melalui API sukses dipenuhi! Sekarang cobalah Anda jalankan fungsi headers() pada resp untuk mengetahui metadata apa saja yang tersimpan. Apakah isi dari elemen content-type? Kapan terakhir kali informasi diperbaharui?
headers(resp)
## $server
## [1] "nginx"
##
## $date
## [1] "Sun, 02 Aug 2020 22:37:07 GMT"
##
## $`content-type`
## [1] "application/json"
##
## $`last-modified`
## [1] "Sun, 02 Aug 2020 22:33:46 GMT"
##
## $`transfer-encoding`
## [1] "chunked"
##
## $connection
## [1] "keep-alive"
##
## $vary
## [1] "Accept-Encoding"
##
## $etag
## [1] "W/\"5f273f4a-e464\""
##
## $`content-encoding`
## [1] "gzip"
##
## attr(,"class")
## [1] "insensitive" "list"
Respon API dengan status code 200 menyatakan bahwa permintaan Anda berhasil dipenuhi dan konten yang diminta tersedia untuk diekstrak. Selain itu Anda juga telah mengetahui lewat fungsi headers() bahwa konten yang diminta tersedia dalam bentuk application/json, yaitu berkas JSON.
Selanjutnya Anda 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 resp dan tambahkan argumen as = "parsed" dan simplifyVector = TRUE. Simpanlah hasilnya sebagai cov_id_raw!
cov_id_raw <- content(resp, as = "parsed", simplifyVector = TRUE)
Dengan menggunakan fungsi length() dan names() cobalah amati ada berapa komponen serta apa saja nama komponen dalam obyek cov_id_raw tersebut! Kemudian ekstraklah komponen ke-2 dan simpan dengan nama cov_id_update.
length(cov_id_raw)
## [1] 2
names(cov_id_raw)
## [1] "data" "update"
cov_id_update <- cov_id_raw$update
Sekarang Anda diminta untuk fokus pada obyek cov_id_update untuk menjawab pertanyaan-pertanyaan berikut:
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"
cov_id_update$penambahan$tanggal
## [1] "2020-08-02"
cov_id_update$penambahan$jumlah_sembuh
## [1] 1056
cov_id_update$penambahan$jumlah_meninggal
## [1] 43
cov_id_update$total$jumlah_positif
## [1] 111455
cov_id_update$total$jumlah_meninggal
## [1] 5236
Dari data yang ditampilkan, terlihat bahwa
Anda telah berhasil menjawab pertanyaan mengenai kondisi COVID-19 di Indonesia dengan menggunakan data yang langsung diambil menggunakan API. Namun bagaimana jika Anda 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 Sulawesi Selatan, tempat tinggal saya sekarang, tersedia di https://data.covid19.go.id/public/api/prov_detail_SULAWESI_SELATAN.json dan dapat diakses menggunakan baris kode berikut:
resp_sulsel <- GET("https://data.covid19.go.id/public/api/prov_detail_SULAWESI_SELATAN.json")
cov_sulsel_raw <- content(resp_sulsel, as = "parsed", simplifyVector = TRUE)
Sekarang jalankanlah fungsi names() pada cov_sulsel_raw tersebut untuk mengetahui nama-nama elemen utama yang tersedia dan jawablah pertanyaan berikut:
names(cov_sulsel_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"
cov_sulsel_raw$kasus_total
## [1] 9552
cov_sulsel_raw$meninggal_persen
## [1] 3.360553
cov_sulsel_raw$sembuh_persen
## [1] 68.59296
Terdapat 9.552 total kasus COVID-19 di Sulawesi Selatan, persentase kematian akibat COVID-19 di Sulawesi Selatan sebesar 3.3360553%, dan persentase tingkat kesembuhan dari COVID-19 di Sulawesi Selatan sebesar 68.59296%.
Informasi umum mengenai COVID-19 di Sulawesi Selatan telah Anda dapatkan. Namun informasi akan lebih lengkap jika Anda memiliki data perkembangan COVID-19 dari waktu ke waktu, apakah Anda setuju?
Kabar baiknya adalah informasi tersebut juga disediakan oleh covid19.go.id melalui permintaan API yang telah Anda buat sebelumnya. Data historis perkembangan COVID-19 tersebut tersimpan dengan nama list_perkembangan. Silakan Anda ekstrak data tersebut dari cov_sulsel_raw dan simpanlah hasilnya sebagai obyek bernama cov_sulsel! Amati struktur cov_sulsel menggunakan fungsi str() dan head().
cov_sulsel <- cov_sulsel_raw$list_perkembangan
str(cov_sulsel)
## 'data.frame': 136 obs. of 9 variables:
## $ tanggal : num 1.58e+12 1.58e+12 1.58e+12 1.58e+12 1.58e+12 ...
## $ KASUS : int 1 0 0 0 0 2 9 14 2 3 ...
## $ MENINGGAL : int 0 0 0 0 1 0 0 0 0 0 ...
## $ SEMBUH : int 0 0 0 0 0 0 0 0 0 0 ...
## $ DIRAWAT_OR_ISOLASI : int 1 0 0 0 -1 2 9 14 2 3 ...
## $ AKUMULASI_KASUS : int 1 1 1 1 1 3 12 26 28 31 ...
## $ AKUMULASI_SEMBUH : int 0 0 0 0 0 0 0 0 0 0 ...
## $ AKUMULASI_MENINGGAL : int 0 0 0 0 1 1 1 1 1 1 ...
## $ AKUMULASI_DIRAWAT_OR_ISOLASI: int 1 1 1 1 0 2 11 25 27 30 ...
head(cov_sulsel)
Setelah mengekstrak dan mengamati cov_sulsel, Anda menemukan beberapa kejanggalan pada data tersebut. Diantaranya adalah kejanggalan data pada kolom tanggal dan format penulisan kolom yang tidak konsisten. Sekarang Anda akan mencoba melakukan beberapa tahapan untuk menjinakan data tersebut sehingga dapat diolah dan dianalisis dengan lebih mudah.
Sebelum itu, silakan Anda aktifkan paket dplyr yang akan dipergunakan untuk melakukan pengolahan data.
Ada beberapa tahapan yang akan Anda lakukan untuk menjinakan data cov_sulsel, yaitu:
Lengkapilah baris kode berikut untuk melakukan menjinakan data sesuai dengan tahapan yang telah Anda rencanakan! Anda akan menggunakan operator pipe (%>%) untuk merangkai fungsi menjadi sebuah pipeline. Simpan hasil pengolahan Anda dengan nama new_cov_sulsel.
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
new_cov_sulsel <-
cov_sulsel %>%
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)
)
str(new_cov_sulsel)
## 'data.frame': 136 obs. of 4 variables:
## $ tanggal : Date, format: "2020-03-19" "2020-03-20" ...
## $ kasus_baru: int 1 0 0 0 0 2 9 14 2 3 ...
## $ meninggal : int 0 0 0 0 1 0 0 0 0 0 ...
## $ sembuh : int 0 0 0 0 0 0 0 0 0 0 ...
Sekarang buatlah grafik serupa dengan menggunakan data kasus sembuh Pergunakan warna "olivedrab2" untuk grafik kasus sembuh!
ggplot(new_cov_sulsel, aes(tanggal, sembuh)) +
geom_col(fill = "olivedrab2") +
labs(
x = NULL,
y = "Jumlah kasus",
title = "Kasus Harian Sembuh Dari COVID-19 di Sulawesi Selatan",
caption = "Sumber data: covid.19.go.id"
) +
theme_ipsum(
base_size = 13,
plot_title_size = 15,
grid = "Y",
ticks = TRUE
) +
theme(plot.title.position = "plot")
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
Sekarang buatlah grafik serupa dengan menggunakan data kasus meninggal. Pergunakan warna "darkslategray4" untuk kasus meninggal!
ggplot(new_cov_sulsel, aes(tanggal, meninggal)) +
geom_col(fill = "darkslategray4") +
labs(
x = NULL,
y = "Jumlah kasus",
title = "Kasus Harian Meninggal Akibat COVID-19 di Sulawesi Selatan",
caption = "Sumber data: covid.19.go.id"
) +
theme_ipsum(
base_size = 13,
plot_title_size = 15,
grid = "Y",
ticks = TRUE
) +
theme(plot.title.position = "plot")
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
Setelah mengamati grafik perkembangan kasus Anda menyadari bahwa terjadi fluktuasi pertambahan kasus harian. Dilandasi hal tersebut Anda kemudian ingin mencoba mengamati bagaimana perkembangan kasus dalam rentang waktu pekanan. Bagaimanakah caranya?
Anda dapat dengan mudah bekerja dengan data tanggal apabila menggunakan paket lubridate. Adapun yang akan digunakan untuk mengekstrak informasi pekan dalam satu tahun adalah fungsi week().
Lengkapilah baris kode berikut untuk menghitung pertambahan kasus pekanan dan simpanlah hasilnya sebagai cov_sulsel_pekanan! Anda juga diminta untuk menggunakan fungsi glimpse() dari dplyr untuk melakukan inspeksi data.
library(lubridate)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
cov_sulsel_pekanan <- new_cov_sulsel %>%
count(
tahun = year(tanggal),
pekan_ke = week(tanggal),
wt = kasus_baru,
name = "jumlah"
)
glimpse(cov_sulsel_pekanan)
## Rows: 20
## Columns: 3
## $ tahun <dbl> 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020...
## $ pekan_ke <dbl> 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26...
## $ jumlah <int> 3, 47, 70, 108, 145, 79, 187, 108, 316, 285, 275, 558, 911...
Pertanyaan baru muncul di benak Anda setelah melakukan inspeksi terhadap data cov_sulsel_pekanan tersebut: "Apakah pekan ini lebih baik dari pekan kemarin?".
Demi menjawab hal tersebut Anda melakukan kalkulasi sederhana dengan tahapan berikut:
NA pada kolom "jumlah_pekanlalu" dengan nilai 0TRUE apabila jumlah kasus baru pekan ini lebih rendah dibandingkan jumlah kasus pekan laluLengkapilah baris kode berikut untuk mengerjakan tahapan yang telah Anda rencanakan! Anda akan menggunakan fungsi lag() dari dplyr untuk membuat kolom "jumlah_pekanlalu". Perhatikan bahwa disini fungsi tersebut dituliskan sebagai dplyr::lag() untuk menghindari konflik dengan fungsi lag() dari paket stats. Inspeksi hasil pekerjaan Anda dengan menggunakan fungsi glimpse()!
cov_sulsel_pekanan <-
cov_sulsel_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_sulsel_pekanan)
## Rows: 20
## Columns: 5
## $ tahun <dbl> 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 20...
## $ pekan_ke <dbl> 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24...
## $ jumlah <int> 3, 47, 70, 108, 145, 79, 187, 108, 316, 285, 275, ...
## $ jumlah_pekanlalu <dbl> 0, 3, 47, 70, 108, 145, 79, 187, 108, 316, 285, 27...
## $ lebih_baik <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TR...
Anda sungguh luar biasa! Dengan menggunakan data hasil perhitungan tersebut maka sekarang Anda dapat membuat bar-chat penambahan kasus pekanan yang ditambahkan informasi baru untuk menjawab pertanyaan: "Apakah pekan ini lebih baik?"
ggplot(cov_sulsel_pekanan, aes(pekan_ke, jumlah, fill = lebih_baik)) +
geom_col(show.legend = FALSE) +
scale_x_continuous(breaks = 12:31, 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 Sulawesi Selatan",
subtitle = "Kolom hijau menunjukan penambahan kasus baru lebih sedikit dibandingkan satu pekan sebelumnya",
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")
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
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 Anda: "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 Anda minta. Namun tidak ada salahnya jika Anda mencoba menghitungnya sendiri, apakah Anda setuju?
Jumlah kasus aktif dapat dihitung dengan cara mengurangi jumlah akumulasi positif dengan jumlah akumulasi sembuh dan jumlah akumulasi meninggal. Anda dapat menggunakan fungsi cumsum() untuk menghitung nilai akumulasi dari suatu vektor numerik. Lengkapilah baris kode berikut untuk menghitung jumlah akumulasi kasus aktif, kasus sembuh, dan kasus meninggal!
cov_sulsel_akumulasi <-
new_cov_sulsel %>%
transmute(
tanggal,
akumulasi_aktif = cumsum(kasus_baru) - cumsum(sembuh) - cumsum(meninggal),
akumulasi_sembuh = cumsum(sembuh),
akumulasi_meninggal = cumsum(meninggal)
)
tail(cov_sulsel_akumulasi)
Sekarang cobalah Anda buat line-chart pola kasus aktif dengan menggunakan fungsi geom_line(). Sebagai pengingat, Anda dapat menggunakan templat kode berikut untuk membuat grafik menggunakan ggplot2():
ggplot(data = ..., aes(x = ..., y = ...)) +
geom_xxx()
ggplot(data = cov_sulsel_akumulasi, aes(x = tanggal, y = akumulasi_aktif)) +
geom_line()
Sebagai penutup analisis dalam proyek ini Anda diminta untuk membuat grafik komparasi antara akumulasi kasus aktif, kasus sembuh, dan kasus meninggal.
Ada dua pilihan cara yang dapat Anda tempuh untuk membuat grafik tersebut:
Menggunakan data cov_sulsel_akumulasi, kemudian buat tiga layer geom_line() untuk setiap kolom satu per satu dengan warna garis yang berbeda; atau
Melakukan pivot pada data cov_sulsel_akumulasi, kemudian buat satu layer geom_line() dengan menggunakan colour aesthetic
Anda akan diminta untuk menempuh cara nomor 2, yaitu dengan cara melakukan pivot pada data terlebih dahulu.
ggplot(data = cov_sulsel_akumulasi, aes(x = tanggal)) +
geom_line(aes(x = tanggal, y = akumulasi_aktif), color = "blue") +
geom_line(aes(x = tanggal, y = akumulasi_sembuh), color = "green") +
geom_line(aes(x = tanggal, y = akumulasi_meninggal), color = "red")
Anda akan menggunakan fungsi gather() dari paket tidyr untuk mentransformasi data cov_sulsel_akumulasi. Data tersebut akan dirubah dari yang semula berformat wide menjadi format long. AKtifkanlah paket tidyr terlebih dahulu dan lengkapilah baris kode berikut untuk melakukan pivot data. Simpan hasil transformasi data tersebut sebagai cov_sulsel_akumulasi_pivot! Perhatikan hasil dari fungsi dim() sebelum dan setelah Anda melakukan transformasi data.
library(tidyr)
dim(cov_sulsel_akumulasi)
## [1] 136 4
cov_sulsel_akumulasi_pivot <-
cov_sulsel_akumulasi %>%
gather(
key = "kategori",
value = "jumlah",
-tanggal
) %>%
mutate(
kategori = sub(pattern = "akumulasi_", replacement = "", kategori)
)
dim(cov_sulsel_akumulasi_pivot)
## [1] 408 3
glimpse(cov_sulsel_akumulasi_pivot)
## Rows: 408
## Columns: 3
## $ tanggal <date> 2020-03-19, 2020-03-20, 2020-03-21, 2020-03-22, 2020-03-2...
## $ kategori <chr> "aktif", "aktif", "aktif", "aktif", "aktif", "aktif", "akt...
## $ jumlah <int> 1, 1, 1, 1, 0, 2, 11, 25, 27, 30, 45, 47, 46, 60, 54, 69, ...
Semenjak tidyr versi 1.0.0, Anda 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_sulsel_akumulasi menjadi cov_sulsel_akumulasi_pivot dapat dikerjakan dengan menggunakan pivot_longer() sebagai berikut:
cov_sulsel_akumulasi_pivot <-
cov_sulsel_akumulasi %>%
pivot_longer(
cols = -tanggal,
names_to = "kategori",
names_prefix = "akumulasi_",
values_to = "jumlah"
)
dim(cov_sulsel_akumulasi_pivot)
## [1] 408 3
glimpse(cov_sulsel_akumulasi_pivot)
## Rows: 408
## Columns: 3
## $ tanggal <date> 2020-03-19, 2020-03-19, 2020-03-19, 2020-03-20, 2020-03-2...
## $ kategori <chr> "aktif", "sembuh", "meninggal", "aktif", "sembuh", "mening...
## $ jumlah <int> 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 2, 0, 1, 11, ...
Anda hampir selesai! Pada tahap terakhir ini Anda cukup salin dan jalankan baris kode berikut di konsol untuk membuat grafik komparasi antara akumulasi kasus aktif, kasus sembuh dan kasus meninggal:
ggplot(cov_sulsel_akumulasi_pivot, 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" = "salmon",
"meninggal" = "darkslategray4",
"sembuh" = "olivedrab2"
),
labels = c("Aktif", "Meninggal", "Sembuh")
) +
labs(
x = NULL,
y = "Jumlah kasus akumulasi",
colour = NULL,
title = "Dinamika Kasus COVID-19 di Sulawesi Selatan",
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"
)
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
Dari hasil analisis data dan gambaran grafik yang ditampilkan di atas, diperoleh beberapa kesimpulan, yaitu:
Data COVID-19 di Indonesia diupdate terakhir tanggal 2 Agustus 2020, dengan rincian: 1.056 jumlah penambahan kasus sembuh, 43 jumlah penambahan kasus meninggal, 111.455 jumlah total kasus positif hingga saat ini, dan 5.236 jumlah total kasus meninggal saat ini.
Terdapat 9.552 total kasus COVID-19 di Sulawesi Selatan, persentase kematian akibat COVID-19 di Sulawesi Selatan sebesar 3.3360553%, dan persentase tingkat kesembuhan dari COVID-19 di Sulawesi Selatan sebesar 68.59296%.
Tren grafik kasus baru harian positif COVID-19 di Sulawesi Selatan bisa dikatakan masih fluktuatif (kadang turun dan kadang naik). Kasus baru harian positif COVID-19 di Sulawesi Selatan tertinggi terjadi sekitar pertengahan Juli 2020 dengan capaian lebih dari 200 kasus.
Tren grafik kasus sembuh COVID-19 di Sulawesi Selatan masih fluktuatif sama halnya tren grafik kasus baru harian positif. Kasus sembuh terjadi pelonjakan tertinggi sekitar akhir bulan Juli 2020 dengan capaian lebih dari 500 kasus namun kurang dari 600 kasus.
Tren grafik kasus harian meninggal akibat COVID-19 di Sulawesi Selatan juga masih fluktuatif. Kasus harian meninggal tertinggi terjadi pada awal bulan Juli 2020, yaitu mendekati jumlah 25 kasus.
Dari grafik yang ditampilkan menunjukkan bahwa empat pekan terakhir ini, penambahan kasus baru positif COVID-19 di Sulawesi Selatan semakin berkurang. Tentu diharapkan di pekan selanjutnya jauh lebih berkurang dibandingkan pekan sebelumnya.
Kasus COVID-19 di Sulawesi Selatan yang masih aktif memiliki tren grafik yang naik dari bulan Maret hingga mencapai puncak pada sekitar pertengahan Juli 2020. Kasus yang sembuh memiliki kecenderungan selalu meningkat dari waktu ke waktu (dari bulan Maret sampai saat ini). Sedangkan untuk kasus yang meninggal akibat COVID-19 di Sulawesi Selatan memiliki kecenderungan meningkat, tetapi perlahan-lahan menunjukkan kecenderungan yang mulai stabil.
Tambahan saran:
Selamat, Anda sudah menyelesaikan modul ini.