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)
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")
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
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"
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
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"
cov_id_update$penambahan$tanggal
## [1] "2020-09-14"
Didapatkan, pembaharuan data penambahan kasus Covid-19 pada tanggal 14 September 2020.
cov_id_update$penambahan$jumlah_sembuh
## [1] 3395
Didapatkan, jumlah penambahan kasus sembuh sebanyak 3395 orang.
cov_id_update$penambahan$jumlah_meninggal
## [1] 118
Didapatkan, jumlah penambahan kasus meninggal sebanyak 118 orang.
cov_id_update$total$jumlah_positif
## [1] 221523
Didapatkan, jumlah total kasus positif hingga saat ini sebanyak 221523 orang
cov_id_update$total$jumlah_meninggal
## [1] 8841
Didapatkan, jumlah kasus meninggal hingga saat ini sebanyak orang
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"
cov_dkijakarta_raw$kasus_total
## [1] 55099
Didapatkan, jumlah total kasus positif hingga saat ini di Provinsi DKI Jakarta sebesar 5509 orang
cov_dkijakarta_raw$meninggal_persen
## [1] 2.573549
Didapatkan, persentase tingkat kematian akibat Covid-19 di DKI Jakarta sebesar 2,6%.
cov_dkijakarta_raw$sembuh_persen
## [1] 76.67108
Didapatkan, persentase tingkat kesembuhan akibat Covid-19 di DKI Jakarta sebesar 76,7%.
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.
Ada beberapa tahapan yang akan dilakukan untuk menjinakan data cov_dkijakarta, yaitu :
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
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.
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.
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.
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...
Untuk menjawab pertanyaan tersebut, perlu dilakukan kalkulasi sederhana dengan tahapan berikut:
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.
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()
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 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