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 :
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.
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:
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.
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.
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.
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.
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:
Pada project ini akan digunakan 2 dataset sekunder yang diambil dari data.jakarta.go.id.
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:
Dataset penumpang Transjakarta. Data Penumpang Transjakarta tahun 2021, disajikan dalam bentuk data bulanan dan dikumpulkan oleh Dinas Perhubungan. Dataset ini mengandung informasi sebagai berikut:
Untuk kebutuhan pembuatan model machine learning apa saja yang akan digunakan, sudah tercantum di poin Project Idea
Output dari project ini berupa :
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)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")
)
ispuSekarang 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") )
transjakartaSetelah membaca data, kita cek null value. Kita mulai dari data 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
#> 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
#> 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)
)#> 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.
#> 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
# 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
Kita juga bisa cek polutan yang paling sering masuk kategori kritis:
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.
# 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
#> [1] "ts"
Mari kita visualisasikan object TS
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