1 Background

Polusi udara merupakan salah satu tantangan lingkungan utama yang dihadapi oleh kota-kota besar di seluruh dunia, termasuk Jakarta, ibu kota Indonesia. Pertumbuhan populasi yang cepat, urbanisasi yang tak terelakkan, dan aktivitas industri yang meningkat telah berkontribusi terhadap peningkatan polusi udara di Jakarta. Polusi udara tidak hanya memiliki dampak buruk terhadap kesehatan manusia, tetapi juga terhadap ekosistem dan kualitas hidup secara keseluruhan.

Kualitas udara yang buruk dapat berdampak serius terhadap kesehatan masyarakat. Partikel-partikel berbahaya dan zat kimia seperti nitrogen dioksida (NO2), sulfur dioksida (SO2), ozon (O3), dan partikel berukuran mikro dapat masuk ke saluran pernapasan manusia dan menyebabkan berbagai penyakit pernapasan seperti asma, bronkitis, serta meningkatkan risiko penyakit kardiovaskular. Anak-anak, lansia, dan individu dengan kondisi medis tertentu menjadi lebih rentan terhadap dampak-dampak ini.

Selain itu, polusi udara juga memiliki dampak negatif terhadap lingkungan. Tanaman dan ekosistem alam dapat rusak akibat paparan ozon troposferik, sedangkan hewan-hewan juga dapat terpengaruh oleh perubahan kualitas udara. Kerusakan ekosistem ini dapat berdampak pada keseimbangan alamiah dan keanekaragaman hayati.

Di Jakarta, pertumbuhan ekonomi dan perkembangan infrastruktur telah meningkatkan mobilitas penduduk dan kendaraan bermotor. Aktivitas industri dan pembangunan juga turut berperan dalam pelepasan polutan udara.

Meskipun langkah-langkah telah diambil untuk mengurangi polusi udara, seperti peraturan kendaraan bersih dan usaha untuk membatasi emisi industri, tantangan dalam mengidentifikasi, mengukur, dan memantau polusi udara tetap ada.

Oleh karena itu, proyek identifikasi polusi udara di Jakarta menjadi suatu kebutuhan masyarakat. Melalui upaya ini, data dan informasi dapat dikumpulkan secara sistematis untuk :

  • memprediksi tingkat polusi udara di berbagai lokasi kota,
  • memprediksi sumber-sumber utama polusi, dan
  • memahami pola-pola perubahan dalam kualitas udara seiring waktu.
  • mengelompokkan daerah atau waktu dengan tingkat polutan yang serupa. Ini bisa membantu dalam mengidentifikasi pola polusi di berbagai daerah atau pada waktu tertentu.

Dengan pemahaman yang lebih baik tentang polusi udara, masyarakat dapat mengetahui prediksi polusi udara yang terjadi di DKI Jakarta. Hal ini berguna sebagai salah satu faktor pengambil keputusan untuk beberapa kasus, seperti dalam menentukan tujuan perjalanan, menetukan lokasi tempat tinggal, menentukan peralatan kesehatan yang harus dipersiapkan bila berada pada daerah tersebut dan lain-lain.

Begitu pula dengan pemerintah dan pemangku kepentingan lainnya dapat mengembangkan strategi yang lebih efektif untuk mengurangi dan mengendalikan polusi udara di Jakarta, serta menjaga kesehatan masyarakat dan kelestarian lingkungan. Mereka dapat mengatur kebijakan-kebijakan yang lebih baik, seperti pembatasan lalu lintas, mengurangi emisi industri, dan menggalakkan penggunaan transportasi berkelanjutan. Dengan demikian, proyek ini dapat membantu meningkatkan kualitas udara secara keseluruhan di Jakarta.

Selanjutnya, proyek ini memiliki implikasi langsung terhadap kesehatan masyarakat. Polusi udara dapat menyebabkan berbagai masalah kesehatan seperti gangguan pernapasan, penyakit jantung, dan bahkan kematian dini. Dengan memiliki informasi AQI yang akurat, individu dan keluarga dapat mengambil langkah-langkah perlindungan yang lebih baik untuk menjaga kesehatan mereka.

Di samping itu, proyek ini juga mendukung kelestarian lingkungan. Polusi udara bukan hanya berdampak buruk pada kesehatan manusia, tetapi juga pada ekosistem dan keberlanjutan alam. Dengan mengurangi polusi udara, proyek ini akan membantu menjaga ekosistem dan keanekaragaman hayati di sekitar Jakarta.

Secara keseluruhan, proyek ini memiliki manfaat yang sangat luas, dari kesehatan masyarakat hingga keberlanjutan lingkungan, dan dapat menjadi alat penting dalam upaya mengurangi polusi udara dan menjaga Jakarta sebagai lingkungan yang lebih bersih dan sehat.

2 Problem Statement

Polusi udara adalah salah satu tantangan lingkungan utama yang dihadapi oleh kota-kota besar di seluruh dunia, termasuk Jakarta, ibu kota Indonesia. Pertumbuhan populasi yang cepat, urbanisasi yang tak terelakkan, dan aktivitas industri yang meningkat telah berkontribusi terhadap peningkatan polusi udara di Jakarta. Polusi udara memiliki dampak buruk terhadap kesehatan manusia, ekosistem, dan kualitas hidup secara keseluruhan.

Dalam konteks ini, permasalahan yang perlu dipecahkan adalah:

  1. Prediksi Tingkat Polusi Udara: Bagaimana kita dapat memprediksi tingkat polusi udara di berbagai lokasi di Jakarta? Dengan pemahaman tentang polusi yang akan datang, tindakan pencegahan dan mitigasi dapat diambil lebih efektif.

  2. Identifikasi Sumber Polusi Utama: Apa saja sumber-sumber utama polusi udara di Jakarta? Mengetahui sumber-sumber ini akan membantu dalam mengarahkan upaya pengurangan emisi yang lebih terfokus.

  3. Memahami Pola Perubahan Kualitas Udara: Bagaimana pola perubahan kualitas udara di Jakarta seiring waktu? Informasi ini penting untuk merencanakan langkah-langkah pengendalian polusi jangka panjang.

  4. Pengelompokan Daerah dan Waktu: Bagaimana kita dapat mengelompokkan daerah atau waktu dengan tingkat polutan yang serupa? Hal ini akan membantu dalam mengidentifikasi pola polusi di berbagai daerah atau pada waktu tertentu, memungkinkan respons yang lebih tepat waktu.

3 Project Idea

Idea proyek ini adalah mengembangkan sebuah sistem pemantauan dan prediksi polusi udara yang komprehensif untuk Jakarta. Sistem ini akan menggunakan teknologi terkini dan analisis data untuk mencapai tujuan berikut:

  1. Prediksi Tingkat Polusi Udara: Menggunakan data historis pada polutan yang telah diukur dan memprediksi data jumlah polutan ini di masa depan dengan menggunakan analisis time series .
  2. Identifikasi Sumber Polusi Utama: Mengidentifikasi sumber-sumber utama polusi udara di Jakarta, di antaranya jumlah asap kendaraan bermotor(CO), asap pembakaran sampah(NO2 dan PM10),asap batu bara(SO2), debu dan kotoran(PM2.5) dan ozon(O3) dengan menggunakan analisis regresi.
  3. Memahami Pola Perubahan Kualitas Udara: Melakukan analisis tren jangka tertentu terhadap data kualitas udara untuk memahami pola perubahan dalam kualitas udara seiring waktu dari hasil prediksi polutan dengan menggunakan analisis regresi(dengan catatan tidak ada rumus yang saat ini digunakan untuk menghasilkan dataset)
  4. Pengelompokan Daerah dan Waktu: Mengelompokkan daerah atau waktu dengan tingkat polutan yang serupa untuk membantu dalam mengidentifikasi pola polusi di berbagai daerah atau pada waktu tertentu dengan algoritma k-means.

4 Problem Scope

Pada project ini akan digunakan 2 dataset sekunder yang diambil dari data.jakarta.go.id.

  1. Dataset ISPU Jakarta. Dataset ini berisi mengenai Indeks Standar Pencemar Udara (ISPU) yang diukur dari 5 stasiun pemantau kualitas udara (SPKU) yang ada di Provinsi DKI Jakarta Tahun 2021. Dataset ini dikumpulkan oleh Dinas Lingkungan Hidup Provinsi DKI Jakarta. Dataset ini mengandung informasi sebagai berikut:

    • tanggal : Tanggal pengukuran kualitas udara
    • stasiun : Lokasi pengukuran di stasiun
    • pm10 : Partikulat salah satu parameter yang diukur
    • pm25 : Partikulat salah satu parameter yang diukur
    • so2 : Sulfida (dalam bentuk SO2) salah satu parameter yang diukur
    • co : Carbon Monoksida salah satu parameter yand diukur
    • o3 : Ozon salah satu parameter yang diukur
    • no2 : NItrogen dioksida salah satu parameter yang diukur
    • max : Nilai ukur paling tinggi dari seluruh parameter yang diukur dalam waktu yang sama
    • critical : Parameter yang hasil pengukurannya paling tinggi
    • categori : Kategori hasil perhitungan indeks standar pencemaran udara
  2. Dataset penumpang Transjakarta. Data Penumpang Transjakarta tahun 2021, disajikan dalam bentuk data bulanan dan dikumpulkan oleh Dinas Perhubungan. Dataset ini mengandung informasi sebagai berikut:

    • tahun : waktu pelaksanaan pengambilan data
    • bulan : bulan pengambilan data
    • jenis : jenis angkutan
    • kode_trayek : kode trayek
    • trayek : trayek
    • jumlah_penumpang : jumlah Penumpang

Untuk kebutuhan pembuatan model machine learning apa saja yang akan digunakan, sudah tercantum di poin Project Idea

5 Output

Output dari project ini berupa :

  1. Dashboard analisis yang menampilkan prediksi jumlah polutan dan kategori kualitas udara berdasarkan data historis terkait polusi udara di Jakarta (contoh:kolom pm10,co,so2, dll).
  2. Dashboard ini akan berisi visualisasi dan matriks yang membantu pengguna memahami tren polusi udara di berbagai lokasi dan periode waktu tertentu berdasarkan data masa lalu(kolom categori).
  3. Dashboard ini juga akan memvisualisasikan kontribusi jenis polutan yang terdapat pada dataset terhadap polusi udara di berbagai wilayah kota(contoh:kolom pm10,co,so2,.. di daerah Jakarta Pusat,Jakarta Timur,..).
  4. Dashboard ini juga akan berisi visualisasi seperti peta spasial (jika memungkinkan) dan grafik pembanding yang akan membantu pengguna dalam mengidentifikasi pola polusi di berbagai daerah atau pada waktu tertentu, dengan referensi pada data masa lalu.

6 Exploratory Data Analysis

6.1 Import Library

library(dplyr)
library(ggplot2)
library(scales)
library(glue)
library(plotly)
library(lubridate)
library(DT)
library(stringr)
library(tidyverse)
library(padr) # complete data frame
library(zoo) # Missing value imputation
library(ggfortify) # autoplot
library(tseries) # adf.test
options(scipen = 100)

6.2 Membaca Data

ispu <- rbind(
  read.csv("data_input/indeks-standar-pencemar-udara-di-spku-bulan-januari-tahun-2021.csv"),
  read.csv("data_input/indeks-standar-pencemar-udara-di-spku-bulan-februari-tahun-2021.csv"), 
  read.csv("data_input/indeks-standar-pencemar-udara-di-spku-bulan-maret-tahun-2021.csv"),
  read.csv("data_input/indeks-standar-pencemar-udara-di-spku-bulan-april-tahun-2021.csv"), 
  read.csv("data_input/indeks-standar-pencemar-udara-di-spku-bulan-mei-tahun-2021.csv"),
  read.csv("data_input/indeks-standar-pencemar-udara-di-spku-bulan-juni-tahun-2021.csv"), 
  read.csv("data_input/indeks-standar-pencemar-udara-di-spku-bulan-juli-tahun-2021.csv"),
  read.csv("data_input/indeks-standar-pencemar-udara-di-spku-bulan-agustus-tahun-2021.csv"), 
  read.csv("data_input/indeks-standar-pencemar-udara-di-spku-bulan-september-tahun-2021.csv"),
  read.csv("data_input/indeks-standar-pencemar-udara-di-spku-bulan-oktober-tahun-2021.csv"), 
  read.csv("data_input/indeks-standar-pencemar-udara-di-spku-bulan-november-tahun-2021.csv"),
  read.csv("data_input/indeks-standar-pencemar-udara-di-spku-bulan-desember-tahun-2021.csv")
  
)

ispu

Sekarang mari kita baca dataset kedua

transjakarta <- rbind(
  read.csv("data_input/data-penumpang-bus-transjakarta-januari-2021.csv"), 
  read.csv("data_input/data-penumpang-bus-transjakarta-februari-2021.csv "), 
  read.csv("data_input/data-penumpang-bus-transjakarta-maret-2021.csv"), 
  read.csv("data_input/data-penumpang-bus-transjakarta-april-2021.csv"),
  read.csv("data_input/data-penumpang-bus-transjakarta-mei-2021.csv"), 
  read.csv("data_input/data-penumpang-bus-transjakarta-juni-2021.csv"), 
  read.csv("data_input/data-penumpang-bus-transjakarta-juli-2021.csv"), 
  read.csv("data_input/data-penumpang-bus-transjakarta-agustus-2021.csv"), 
  read.csv("data_input/data-penumpang-bus-transjakarta-september-2021.csv"), 
  read.csv("data_input/data-penumpang-bus-transjakarta-oktober-2021.csv"), 
  read.csv("data_input/data-penumpang-bus-transjakarta-november-2021.csv"), 
  read.csv("data_input/data-penumpang-bus-transjakarta-desember-2021.csv") )

 
transjakarta

6.3 Check null value and data type

Setelah membaca data, kita cek null value. Kita mulai dari data ispu.

colSums(is.na(ispu))
#>  tanggal  stasiun     pm10     pm25      so2       co       o3      no2 
#>        0        0        0        0        0        0        0        0 
#>      max critical categori 
#>        0        0        0

Seolah-olah, tidak ada null value, tapi mari kita cek nilai tidak wajar

ispu <- ispu %>%
  mutate(pm10 = ifelse(pm10 == "---", NA, pm10),
         pm25 = ifelse(pm25 == "---", NA, pm25),
         so2 = ifelse(so2 == "---", NA, so2),
         co = ifelse(co == "---", NA, co),
         o3 = ifelse(o3 == "---", NA, o3),
         no2 = ifelse(no2 == "---", NA, no2)) %>%
  mutate(pm10 = ifelse(pm10 == "", NA, pm10),
         pm25 = ifelse(pm25 == "", NA, pm25),
         so2 = ifelse(so2 == "", NA, so2),
         co = ifelse(co == "", NA, co),
         o3 = ifelse(o3 == "", NA, o3),
         no2 = ifelse(no2 == "", NA, no2))

Cek null value lagi

colSums(is.na(ispu))
#>  tanggal  stasiun     pm10     pm25      so2       co       o3      no2 
#>        0        0       68      100      114       36       68       35 
#>      max critical categori 
#>        0        0        0

Kita bisa lihat ada beberapa komponen dengan nilai null value. Mari kita lakukan teknik na.aggregate() dengan function `mean

ispu<-ispu %>% 
   mutate(pm10 = na.fill(object = pm10, fill = "extend"),
          pm25 = na.fill(object = pm25, fill = "extend"),
          so2 = na.fill(object = so2, fill = "extend"),
          co = na.fill(object = co, fill = "extend"),
          o3 = na.fill(object = o3, fill = "extend"),
          no2 = na.fill(object = no2, fill = "extend"))

Sekarang, sudah tidak ada null value lagi

colSums(is.na(ispu))
#>  tanggal  stasiun     pm10     pm25      so2       co       o3      no2 
#>        0        0        0        0        0        0        0        0 
#>      max critical categori 
#>        0        0        0

Ubah field menjadi datatype yang diinginkan

ispu <- ispu%>%
  mutate(tanggal = as.Date(tanggal, format = "%Y-%m-%d"),
         stasiun = as.factor(stasiun),
         pm10 = as.numeric(pm10),
         pm25 = as.numeric(pm25),
         so2 = as.numeric(so2),
         co = as.numeric(co),
         o3 = as.numeric(o3),
         no2 = as.numeric(no2),
         critical = as.factor(critical),
         categori = as.factor(categori)
         )
summary(ispu)
#>     tanggal                                       stasiun         pm10       
#>  Min.   :2021-01-01   DKI1 (Bunderan HI)              :365   Min.   : 14.00  
#>  1st Qu.:2021-04-02   DKI2 (Kelapa Gading)            :365   1st Qu.: 44.00  
#>  Median :2021-07-02   DKI3 (Jagakarsa)                :365   Median : 54.00  
#>  Mean   :2021-07-02   DKI4 (Lubang Buaya)             :365   Mean   : 52.23  
#>  3rd Qu.:2021-10-01   DKI5 (Kebon Jeruk) Jakarta Barat:365   3rd Qu.: 62.00  
#>  Max.   :2021-12-31                                          Max.   :179.00  
#>       pm25             so2              co              o3        
#>  Min.   : 13.00   Min.   : 2.00   Min.   : 2.00   Min.   :  7.00  
#>  1st Qu.: 62.00   1st Qu.:25.00   1st Qu.: 9.00   1st Qu.: 22.00  
#>  Median : 77.00   Median :34.00   Median :11.00   Median : 29.00  
#>  Mean   : 77.09   Mean   :34.79   Mean   :11.94   Mean   : 31.82  
#>  3rd Qu.: 92.00   3rd Qu.:44.00   3rd Qu.:14.00   3rd Qu.: 38.00  
#>  Max.   :174.00   Max.   :82.00   Max.   :47.00   Max.   :151.00  
#>       no2             max         critical              categori   
#>  Min.   : 1.00   Min.   :  0.00       :  16   BAIK          : 188  
#>  1st Qu.:13.00   1st Qu.: 62.00   CO  :  34   SEDANG        :1349  
#>  Median :18.00   Median : 77.00   O3  :  56   TIDAK ADA DATA:  16  
#>  Mean   :19.57   Mean   : 76.96   PM10:  63   TIDAK SEHAT   : 272  
#>  3rd Qu.:25.00   3rd Qu.: 91.00   PM25:1631                        
#>  Max.   :65.00   Max.   :179.00   SO2 :  25

Sekarang, kita ke dataset transjakarta.

colSums(is.na(transjakarta))
#>            tahun            bulan            jenis      kode_trayek 
#>                0                0                0                0 
#>           trayek jumlah_penumpang 
#>                0                0

Data kita sudah lengkap. Sekarang , kita ubah tipe datanya sesuai dengan yang kita inginkan

transjakarta <- transjakarta%>%
  mutate(tahun = as.factor(tahun),
         bulan = as.factor(bulan),
         jenis = as.factor(jenis),
         kode_trayek = as.factor(kode_trayek),
         trayek = as.factor(trayek),
         jumlah_penumpang = as.numeric(jumlah_penumpang) 
         )
 
summary(transjakarta)
#>   tahun          bulan                         jenis      kode_trayek  
#>  2021:1473   11     :129   Angkutan Umum Integrasi:469   1      :  12  
#>              7      :126   BRT                    :156   10     :  12  
#>              5      :125   Mikrotrans             :848   10K    :  12  
#>              3      :124                                 11     :  12  
#>              6      :122                                 11D    :  12  
#>              8      :122                                 11Q    :  12  
#>              (Other):725                                 (Other):1401  
#>                                     trayek     jumlah_penumpang 
#>  Cililitan - Condet via Kayu Manis     :  24   Min.   :      0  
#>  Andara - Stasiun Universitas Pancasila:  12   1st Qu.:  25016  
#>  Batu Sari-Tanah Abang                 :  12   Median :  49628  
#>  Bintara - Cipinang Indah              :  12   Mean   :  81676  
#>  Bintaro - Blok M                      :  12   3rd Qu.:  75138  
#>  Blok M - Andara                       :  12   Max.   :1131439  
#>  (Other)                               :1389

6.4 Beberapa visualisasi data

6.4.1 Visualisasi dataset ISPU

# Histogram untuk pm10
hist(ispu$pm10, main = "Distribusi PM10", xlab = "Nilai PM10", ylab = "Frekuensi")

Kita bisa melihat bahwa nilai PM 10 yang paling banyak berada di kisaran 50-100 yang berarti sedang. Mari kita coba lihat polutan yang lain

hist(ispu$pm25, main = "Distribusi PM25", xlab = "Nilai PM25", ylab = "Frekuensi")

hist(ispu$so2, main = "Distribusi SO2", xlab = "Nilai SO2", ylab = "Frekuensi")

hist(ispu$co, main = "Distribusi CO", xlab = "Nilai CO", ylab = "Frekuensi")

hist(ispu$o3, main = "Distribusi O3", xlab = "Nilai O3", ylab = "Frekuensi")

hist(ispu$no2, main = "Distribusi NO2", xlab = "Nilai NO2", ylab = "Frekuensi")

Kita juga bisa cek polutan yang paling sering masuk kategori kritis:

barplot(table(ispu$critical), main = "Parameter Kritis", xlab = "Parameter", ylab = "Frekuensi")

Kita bisa lihat polutan PM2.5 paling sering masuk dalam parameter kritis. Seperti dalam histogram polutan di atas, PM25 memang memiliki nilai di atas 50 yang sering.

ispu%>%filter(categori=='')
# Hitung frekuensi setiap kategori
kategori_counts <- table(ispu$categori)

# Buat data frame dari frekuensi
kategori_data <- data.frame(Kategori = names(kategori_counts), Frekuensi = as.numeric(kategori_counts))
 
# Buat bar chart menggunakan ggplot2
ggplot(kategori_data, aes(x = reorder(Kategori, -Frekuensi), y = Frekuensi, fill = Kategori)) +
  geom_bar(stat = "identity") +
  labs(title = "Komposisi Kategori") +
  scale_fill_brewer(palette = "Set3") +  # Menggunakan palet warna yang berbeda
  theme_minimal() +
  theme(legend.position = "right") +
  xlab("Kategori") +
  ylab("Frekuensi")

Dari grafik ini, kita bisa mengetahui bahwa kondisi kualitas udara sebagian besar adalah sedang

# Menggunakan ggplot2 untuk membuat grafik batang dengan sumbu x yang lebih panjang
library(ggplot2)

# Membuat data frame frekuensi
frekuensi_df <- ispu %>%
  count(categori, stasiun)

# Membuat grafik batang dengan sumbu x yang lebih panjang
ggplot(frekuensi_df, aes(x = stasiun, y = n, fill = categori)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Frekuensi berdasarkan Kategori dan Stasiun", x = "Stasiun", y = "Frekuensi") +
  theme_minimal() +
  theme(legend.position = "top", axis.text.x = element_text(angle = 45, hjust = 1))  # Menambahkan elemen tema untuk memiringkan teks sumbu x

Dari grafik di atas, kita bisa melihat daerah DKI4(Lubang Buaya) memiliki kualitas udara yang tidak sehat lebih sering dibandingkan dengan daerah lainnya

Mari kita cek pm10 di DKI1 (Bunderan HI)

ispu_dki1 <- ispu %>%
  filter(stasiun == "DKI1 (Bunderan HI)")
 
pm10_dki1_ts <- ts(ispu_dki1$pm10, frequency = 365)

summary(ispu_dki1)
#>     tanggal                                       stasiun         pm10      
#>  Min.   :2021-01-01   DKI1 (Bunderan HI)              :365   Min.   :19.00  
#>  1st Qu.:2021-04-02   DKI2 (Kelapa Gading)            :  0   1st Qu.:41.00  
#>  Median :2021-07-02   DKI3 (Jagakarsa)                :  0   Median :52.00  
#>  Mean   :2021-07-02   DKI4 (Lubang Buaya)             :  0   Mean   :49.83  
#>  3rd Qu.:2021-10-01   DKI5 (Kebon Jeruk) Jakarta Barat:  0   3rd Qu.:58.00  
#>  Max.   :2021-12-31                                          Max.   :79.00  
#>       pm25             so2              co              o3       
#>  Min.   : 20.00   Min.   : 9.00   Min.   : 4.00   Min.   : 7.00  
#>  1st Qu.: 57.00   1st Qu.:23.00   1st Qu.:10.00   1st Qu.:17.00  
#>  Median : 70.00   Median :27.00   Median :12.00   Median :21.00  
#>  Mean   : 69.07   Mean   :27.17   Mean   :13.21   Mean   :21.76  
#>  3rd Qu.: 81.00   3rd Qu.:30.00   3rd Qu.:16.00   3rd Qu.:25.00  
#>  Max.   :112.00   Max.   :61.00   Max.   :43.00   Max.   :62.00  
#>       no2             max         critical             categori  
#>  Min.   : 4.00   Min.   : 20.00       :  0   BAIK          : 57  
#>  1st Qu.:16.00   1st Qu.: 57.00   CO  :  0   SEDANG        :294  
#>  Median :26.00   Median : 70.00   O3  :  2   TIDAK ADA DATA:  0  
#>  Mean   :25.05   Mean   : 69.22   PM10:  3   TIDAK SEHAT   : 14  
#>  3rd Qu.:33.00   3rd Qu.: 81.00   PM25:354                       
#>  Max.   :49.00   Max.   :112.00   SO2 :  6

Cek class dari pm10_dki1_ts

class(pm10_dki1_ts)
#> [1] "ts"

Mari kita visualisasikan object TS

plot.ts(pm10_dki1_ts)

6.4.2 Visualisasi dataset transjakarta

Sekarang, kita visualisasikan dataset transjakarta yang kita miliki

# Membuat grafik bar jumlah penumpang per jenis angkutan
library(ggplot2)

ggplot(transjakarta, aes(x = jenis, y = jumlah_penumpang)) +
  geom_bar(stat = "identity", fill = "blue") +
  labs(title = "Jumlah Penumpang per Jenis Angkutan", x = "Jenis Angkutan", y = "Jumlah Penumpang") +
  theme_minimal()

Dari diagram di atas kita bisa lihat bahwa BRT memiliki jumlah penumpang terbanyak diikuti mikrotrans dan angkutan umum intergrasi.

# Menghitung total jumlah penumpang per jenis angkutan per bulan
transjakarta_total <- transjakarta %>%
  group_by(bulan, jenis) %>%
  summarise(Total_Penumpang = sum(jumlah_penumpang))
 

# Membuat grafik line chart
ggplot(transjakarta_total, aes(x = bulan, y = Total_Penumpang, group = jenis, color = jenis)) +
  geom_line() +
  labs(title = "Total Jumlah Penumpang per Jenis Angkutan per Bulan", x = "Bulan", y = "Total Penumpang") +
  theme_minimal() +
  scale_color_manual(values = c("blue", "red", "green"))  # Menentukan warna garis per jenis angkutan

Dari grafik di atas, kita bisa melihat tren total penumpang per jenis angkutan . Rata-rata mengalami penurunan di bulan Juni-Juli. Kemungkinan hal itu terjadi karena libur anak sekolah.

# Memilih variabel yang akan digunakan dalam analisis klaster
data_klaster <- transjakarta %>% select(jumlah_penumpang)

# Standarisasi data
data_scaled <- scale(data_klaster)

# Menjalankan analisis klaster dengan metode K-means (misalnya, dengan 3 klaster)
kmeans_model <- kmeans(data_scaled, centers = 3)

# Menambahkan hasil klaster ke data asli
data_with_clusters <- transjakarta %>%
  mutate(cluster = kmeans_model$cluster)
# Menambahkan kolom label yang berisi informasi trayek dan jumlah penumpang
data_with_clusters <- data_with_clusters %>%
  mutate(label = paste("Jenis angkutan:", jenis,"\nTrayek:", trayek, "\nJumlah Penumpang:", jumlah_penumpang))


# Membuat plotly scatterplot dengan label hover
plot_ly(data_with_clusters, x = ~bulan, y = ~jumlah_penumpang, color = ~factor(cluster), text = ~label, type = 'scatter', mode = 'markers') %>%
  layout(title = "Scatterplot Berdasarkan Klaster", xaxis = list(title = "Bulan"), yaxis = list(title = "Jumlah Penumpang"))

Dari grafik di atas kita bisa melihat klasterisasi berdasarkan jumlah penumpang.

# Contoh klasterisasi berdasarkan pola waktu
ggplot(data_with_clusters, aes(x = bulan, y = jumlah_penumpang, color = factor(cluster))) +
  geom_line() +
  facet_wrap(~cluster, scales = "free_y") +
  labs(title = "Klasterisasi Berdasarkan Pola Waktu", x = "Bulan", y = "Jumlah Penumpang") +
  theme_minimal() +
  scale_color_discrete(name = "Klaster")

Dari grafik ini, kita bisa melihat bahwa ada klaster memiliki jumlah penumpang yang stabil, sedangkan klaster lain bahkan ada yang sangat renggang di bulan 7 sampai 9.

# Contoh klasterisasi berdasarkan jenis angkutan
ggplot(data_with_clusters, aes(x = factor(cluster), fill = jenis)) +
  geom_bar() +
  labs(title = "Klasterisasi Berdasarkan Jenis Angkutan", x = "Klaster", y = "Jumlah Penumpang") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set3")

Dari grafik di atas, kita bisa melihat bahwa klaster yang berisi hanya mikrotrans dan angkutan umum integrasi dengan jumlah penumpang yang paling stabil dan tidak ada seasonal nya. Sedangkan di klaster yang hanya berisi BRT, kita bisa lihat bahwa klaster ini ternyata memiliki jumlah penumpang yang sangat jarang di bulan 7-9 sehingga mungkin bisa dikurangi trayeknya di waktu tersebut untuk mengurangi polusi udara