BUKAN CORONA INI YANG SAYA BICARAKAN.

BUKAN CORONA INI


TAPI CORONA INI COVID-19

COVID-19

COVID-19

COVID-19 merupakan suatu pandemi yang disebabkan oleh virus corona 2019. Informasi tentang pertumbuhan kasus COVID-19 selalu setiap hari diinformasikan baik pada media sosial dan media komunikasi lainnya. Pemerintah baik pada pusat dan daerah masing-masing selalu mengumpulkan, menyediakan, dan mempublikasikan pertumbuhan COVID-19 di Indonesia maupun di daerah. Data pertumbuhan COVID-19 tersebut berupa data mentah yang belum diolah, infografis, maupun suatu dasboard.

Dalam hal ini, saya akan melakukan eksplorasi dan analisis mengenai COVID-19 menggunakan data pada API, API adalah suatu cara komputer untuk berkomunikasi dengan komputer lainnya sehingga dapat terjadi transaksi pertukaran data. Data tersebut tersedia pada https://data.covid19.go.id/public/api/update.json untuk data pertumbuhan COVID-19 di Indonesia dan https://data.covid19.go.id/public/api/prov_detail_JAWA_BARAT.json untuk data pertumbuhan COVID-19 di JAWA BARAT.


COVID-19 di Indonesia


Mengakses data pada API

library(httr)
library(tidyverse)
library(dplyr)
library(ggplot2)
library(hrbrthemes)
library(lubridate)
library(scales)

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

Pada saat mengakses API ada beberapa hasil. Bisa terjadi permintaan sukses, data tidak ditemukan, dll.

Berikut merupakan kode dan arti dari kode ketika mengakses API.

1xx : Informational

2xx : Success

3xx : Redirections

4xx : Client Errors

5xx : Server Error

xxx : Pikiran anda kotor

Selengkapnya dapat dilihat disini

Untuk melihat kode tersebut lakukan :

status_code(API_IND)
## [1] 200

Mengekstrak Isi Respon API

Data masih merupakan file json, sehingga butuh diekstrak supaya menjadi bentuk vector.

cov_id_raw <-
  content(API_IND, as="parsed", simplifyVector=TRUE)

length(cov_id_raw)
## [1] 2
names(cov_id_raw)
## [1] "data"   "update"

Data Pada Vector Data

cov_id_data<-
  cov_id_raw$data

lapply(cov_id_data, names)
## $id
## NULL
## 
## $jumlah_odp
## NULL
## 
## $jumlah_pdp
## NULL
## 
## $total_spesimen
## NULL
## 
## $total_spesimen_negatif
## NULL
cov_id_data
## $id
## [1] 1
## 
## $jumlah_odp
## [1] 124845
## 
## $jumlah_pdp
## [1] 0
## 
## $total_spesimen
## [1] 18734036
## 
## $total_spesimen_negatif
## [1] 13350841

Pada data tersebut terlihat bahwa sebanyak 18734036 spesimen telah dites dan sebanyak 13350841 spesimen negatif COVID-19. Sisa spesimen adalah positif dan hasil test belum keluar.

Data Pada Vector Update

Data dubah dari list menjadi data frame biar enak eksplorasi dan analisisnya.

cov_id_update<-
  cov_id_raw$update

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<-
  as.data.frame(cov_id_update$penambahan)

cov_id_update_total<-
  as.data.frame(cov_id_update$total)

cov_id_update_harian<-
  as.data.frame(cov_id_update$harian)

Eksplorasi dan Analisis Data

Pada data diatas dapat diketahui:

  1. Waktu terakhir penambahan kasus

  2. Jumlah penambahan kasus sembuh, meninggal, positif, dan dirawat pada waktu tersebut

  3. Jumlah penambahan kasus sembuh, meninggal, positif pada waktu tersebut total

  4. Jumlah penambahan kasus sembuh, meninggal, positif, dan dirawat pada waktu tiap waktu

  5. Jumlah penambahan kasus sembuh, meninggal, positif, dan dirawat pada waktu tiap waktu secara kumulatif.

Waktu Terakhir Penambahan Kasus COVID-19

cov_id_update_penambahan$tanggal
## [1] "2021-06-21"

Hal ini berarti data mencakup dari awal kasus pertama COVID-19 di Indonesia sampai tanggal 2021-06-21.

Jumlah penambahan kasus sembuh, meninggal, positif, dan dirawat pada waktu tersebut

cov_id_update_penambahan %>%
  select(-c("tanggal", "created"))
##   jumlah_positif jumlah_meninggal jumlah_sembuh jumlah_dirawat
## 1          14536              294          9233           5009
cov_id_penambahan_pivot <-
  cov_id_update_penambahan %>%
  select(-c("tanggal", "created"))%>%
  pivot_longer(
    cols = starts_with("jumlah_"),
    names_to = "kategori",
    names_prefix = "jumlah_",
    values_to = "jumlah"
  )

cov_id_penambahan_pivot
## # A tibble: 4 x 2
##   kategori  jumlah
##   <chr>      <int>
## 1 positif    14536
## 2 meninggal    294
## 3 sembuh      9233
## 4 dirawat     5009
ggplot(cov_id_penambahan_pivot, aes(x=kategori, y= jumlah, fill = kategori))+
  geom_col(show.legend = FALSE)+
  scale_fill_manual(
    values = c(
      "positif" = "salmon",
      "meninggal" = "darkslategray4",
      "sembuh" = "olivedrab2",
      "dirawat" = "lightblue"
    )
    )+
  scale_y_continuous(limits = c(0,max(cov_id_penambahan_pivot$jumlah)), breaks = seq(0,max(cov_id_penambahan_pivot$jumlah), by = 1000))+
  labs(
    x = NULL,
    y = NULL,
    colour = NULL,
    title = "Penambahan Kasus COVID-19 di Indonesia\npada Hari Terakhir Update",
    caption = "Sumber data: covid.19.go.id"
  ) +
  theme_ipsum_ps(
    base_size = 13,
    plot_title_size = 21,
    grid = "Y",
    ticks = TRUE
  ) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

Berikut merupakan data kasus COVID-19 di Indonesia pada tanggal 2021-06-21.

Jumlah penambahan kasus sembuh, meninggal, positif, dan dirawat pada waktu tersebut total

cov_id_total_pivot <-
  cov_id_update_total %>%
  select(-jumlah_dirawat)%>%
  pivot_longer(
    cols = starts_with("jumlah_"),
    names_to = "kategori",
    names_prefix = "jumlah_",
    values_to = "jumlah"
  )

cov_id_total_pivot
## # A tibble: 3 x 2
##   kategori   jumlah
##   <chr>       <int>
## 1 positif   2004445
## 2 sembuh    1801761
## 3 meninggal   54956
ggplot(cov_id_total_pivot, aes(x=kategori, y= jumlah, fill = kategori))+
  geom_col(show.legend = FALSE)+
  scale_fill_manual(
    values = c(
      "positif" = "salmon",
      "meninggal" = "darkslategray4",
      "sembuh" = "olivedrab2",
      "dirawat" = "lightblue"
    )
    )+
  scale_y_continuous(limits = c(0,max(cov_id_total_pivot$jumlah)), breaks =
                       seq(0,max(cov_id_total_pivot$jumlah), by = 100000))+
  labs(
    x = NULL,
    y = NULL,
    colour = NULL,
    title = "Total Kasus COVID-19 di Indonesia\nSampai Hari Terakhir Update",
    caption = "Sumber data: covid.19.go.id"
  ) +
  theme_ipsum_ps(
    base_size = 13,
    plot_title_size = 21,
    grid = "Y",
    ticks = TRUE
  ) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

Berikut merupakan data kasus COVID-19 di Indonesia dari awal kasus sampai tanggal 2021-06-21, dengan rasio kematian 2.7417066%. Walaupun rasio kematian COVID-19 di Indonesia hanya sebesar 2.7417066%, namun untuk nyawa seseorang angka tersebut sangatlah besar (kata Pak Nar, pas kuliah).

Jumlah penambahan kasus sembuh, meninggal, positif, dan dirawat pada waktu tiap waktu

cov_id_update_harian<-cov_id_update_harian%>%
  unlist(recursive = T, use.names = F)%>%
  matrix(ncol = 11, byrow = F)%>%
  as_tibble()%>%
  select(-c(V2,V3, V7))%>%
  rename(tanggal = V1, 
         jumlah_meninggal = V4,
         jumlah_sembuh = V5,
         jumlah_positif = V6,
         jumlah_positif_kumulatif = V8,
         jumlah_sembuh_kumulatif = V9,
         jumlah_meninggal_kumulatif = V10,
         jumlah_dirawat_kumulatif = V11)%>%
  mutate(tanggal= as.Date(tanggal))%>%
  mutate_if(is.character, as.double)

cov_id_per_hari <-
  cov_id_update_harian%>%
  select(- contains("_kum"))%>%
  pivot_longer(
    cols = starts_with("jumlah_"),
    names_to = "kategori",
    names_prefix = "jumlah_",
    values_to = "jumlah"
  )
cov_id_per_hari
## # A tibble: 1,431 x 3
##    tanggal    kategori  jumlah
##    <date>     <chr>      <dbl>
##  1 2020-03-02 meninggal      0
##  2 2020-03-02 sembuh         0
##  3 2020-03-02 positif        2
##  4 2020-03-03 meninggal      0
##  5 2020-03-03 sembuh         0
##  6 2020-03-03 positif        0
##  7 2020-03-04 meninggal      0
##  8 2020-03-04 sembuh         0
##  9 2020-03-04 positif        0
## 10 2020-03-05 meninggal      0
## # ... with 1,421 more rows
lapply(cov_id_per_hari, class)
## $tanggal
## [1] "Date"
## 
## $kategori
## [1] "character"
## 
## $jumlah
## [1] "numeric"
ggplot(cov_id_per_hari, aes(tanggal, jumlah, colour= kategori))+
  geom_line(size=1)+
  facet_grid(. ~kategori)+
  scale_fill_manual(
    values = c(
      "positif" = "salmon",
      "meninggal" = "darkslategray4",
      "sembuh" = "olivedrab2"
    )
    )+
  scale_y_continuous(limits = c(0,max(cov_id_per_hari$jumlah)), breaks =
                       seq(0,max(cov_id_per_hari$jumlah), by = 1000))+
  scale_x_date(date_breaks = "4 month", date_labels = "%m %y")+
  labs(
    x = NULL,
    y = NULL,
    colour = NULL,
    title = "Kasus COVID-19 di Indonesia\ndari Hari ke Hari",
    caption = "Sumber data: covid.19.go.id"
  ) +
  theme_ipsum_ps(
    base_size = 13,
    plot_title_size = 21,
    grid = "Y",
    ticks = TRUE
  ) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    legend.position = "bottom"
  )

Kasus COVID-19 di Indonesia cenderung selalu bertambah dari hari ke hari. Namun pada awal tahun 2021 sekitar awal Februari sampai akhir Mei, walaupun kembali meningkat sekitar pada awal Juni.

Jumlah penambahan kasus positif COVID-19 Tiap Pekannya

cov_ID_per_pekan <- cov_id_update_harian %>%
  select(c(tanggal, jumlah_positif))%>%
  count(
    tahun = year(tanggal),
    pekan_ke = week(tanggal),
    wt = jumlah_positif,
    name = "jumlah"
  )%>%
  mutate(
    jumlah_pekanlalu = dplyr::lag(jumlah, 1),
    jumlah_pekanlalu = ifelse(is.na(jumlah_pekanlalu), 0, jumlah_pekanlalu),
    lebih_baik = jumlah < jumlah_pekanlalu
  )

cov_ID_per_pekan
## # A tibble: 70 x 5
##    tahun pekan_ke jumlah jumlah_pekanlalu lebih_baik
##    <dbl>    <dbl>  <dbl>            <dbl> <lgl>     
##  1  2020        9      2                0 FALSE     
##  2  2020       10     25                2 FALSE     
##  3  2020       11    145               25 FALSE     
##  4  2020       12    513              145 FALSE     
##  5  2020       13    843              513 FALSE     
##  6  2020       14   1210              843 FALSE     
##  7  2020       15   2101             1210 FALSE     
##  8  2020       16   2296             2101 FALSE     
##  9  2020       17   2376             2296 FALSE     
## 10  2020       18   2560             2376 FALSE     
## # ... with 60 more rows
cov_ID_per_pekan%>%
  ggplot(aes(x = pekan_ke, y = jumlah, fill= lebih_baik))+
  geom_col()+
  facet_grid(.~tahun)+
  scale_y_continuous(limits = c(0,max(cov_ID_per_pekan$jumlah)), breaks =
                       seq(0,max(cov_ID_per_pekan$jumlah), by = 10000))+
  scale_x_continuous(limits = c(0,max(cov_ID_per_pekan$pekan_ke)), breaks =
                       seq(0,max(cov_ID_per_pekan$pekan_ke), by = 4))+
  scale_fill_manual(values = c("TRUE" = "green", "FALSE" = "red")) +
  labs(
    x = NULL,
    y = "Jumlah Kasus",
    colour = NULL,
    subtitle = "hijau berarti terjadi penurunan kasus dari pekan sebelumnya,\nmerah berarti terjadi penambahan kasus dari pekan sebelumnya",
    title = "Kasus Positif COVID-19 di Indonesia\ntiap Pekannya",
    caption = "Sumber data: covid.19.go.id"
  ) +
  theme_ipsum_ps(
    base_size = 10,
    plot_title_size = 21,
    grid = "Y",
    ticks = TRUE
  ) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    plot.subtitle = element_text(size = 9),
    legend.position = "bottom"
  )

Terlihat pada awal Februari sampai akhir Mei mengalami penurunan kasus COVID-19. Hal ini berarti akan lebih baik jika apa yang dilakukan setiap orang pada waktu awal Februari sampai akhir Mei dilakukan kembali sekarang.

Jumlah penambahan kasus sembuh, meninggal, positif, dan dirawat pada waktu tiap waktu secara kumulatif.

cov_id_kumulatif <-
  cov_id_update_harian%>%
  select(c(contains("_kum"),tanggal, - jumlah_dirawat_kumulatif))%>%
  mutate(jumlah_aktif = jumlah_positif_kumulatif - jumlah_meninggal_kumulatif - jumlah_sembuh_kumulatif)%>%
  pivot_longer(
    cols = starts_with("jumlah_"),
    names_to = "kategori",
    names_prefix = "jumlah_",
    values_to = "jumlah"
  )
cov_id_kumulatif
## # A tibble: 1,908 x 3
##    tanggal    kategori            jumlah
##    <date>     <chr>                <dbl>
##  1 2020-03-02 positif_kumulatif        2
##  2 2020-03-02 sembuh_kumulatif         0
##  3 2020-03-02 meninggal_kumulatif      0
##  4 2020-03-02 aktif                    2
##  5 2020-03-03 positif_kumulatif        2
##  6 2020-03-03 sembuh_kumulatif         0
##  7 2020-03-03 meninggal_kumulatif      0
##  8 2020-03-03 aktif                    2
##  9 2020-03-04 positif_kumulatif        2
## 10 2020-03-04 sembuh_kumulatif         0
## # ... with 1,898 more rows
lapply(cov_id_kumulatif, class)
## $tanggal
## [1] "Date"
## 
## $kategori
## [1] "character"
## 
## $jumlah
## [1] "numeric"
ggplot(cov_id_kumulatif, aes(tanggal, jumlah, colour= kategori))+
  geom_line(size=1)+
  facet_grid(. ~kategori)+
  scale_fill_manual(
    values = c(
      "positif_kumulatif" = "red",
      "meninggal_kumulatif" = "darkslategray4",
      "sembuh_kumulatif" = "olivedrab2",
      "aktif" = "salmon"
    )
    )+
  scale_y_continuous(limits = c(0,max(cov_id_kumulatif$jumlah)), breaks =
                       seq(0,max(cov_id_kumulatif$jumlah), by = 250000))+
  scale_x_date(date_breaks = "6 month", date_labels = "%m %y")+
  labs(
    x = NULL,
    y = NULL,
    colour = NULL,
    title = "Total Kasus COVID-19 di Indonesia\ndari Hari ke Hari",
    caption = "Sumber data: covid.19.go.id"
  ) +
  theme_ipsum_ps(
    base_size = 13,
    plot_title_size = 21,
    grid = "Y",
    ticks = TRUE
  ) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    legend.position = "bottom"
  )