1 Introduction

1.1 Our Purpose

Pada project ini, saya menggunakan data polusi udara di kota Seoul, Korea Selatan. Data tersebut didapatkan dari Kaggle dengan link berikut ini: Air Pollution in Seoul.

1.2 Our Data

Data ini menyediakan data polusi udara harian kota Seoul dari tahun 2017 hingga 2019 pada beberapa ruas jalan. Data ini menyediakan rata-rata nilai dari 6 polutan yaitu :

  • SO2
  • NO2
  • CO
  • O3
  • PM10
  • PM2.5

2 Data Preparation

2.1 Read Dataset

Kita mulai dengan membaca dataset yaitu Measurement_summary.csv, lalu kita simpan dalam variabel dataframe air_pollution.

air_pollution <- read.csv("Measurement_summary.csv")

2.2 Data Cleansing

Kemudian kita melakukan pengecekan isi data.

head(air_pollution)
tail(air_pollution)

Kita melihat dimensi dari data air_pollution.

dim(air_pollution)
## [1] 647511     11

Terdapat 11 kolom dan 647.511 baris (jumlah data).

Kemudian, mari kita lihat masing-masing tipe data dari tiap kolom / variabel.

str(air_pollution)
## 'data.frame':    647511 obs. of  11 variables:
##  $ Measurement.date: chr  "2017-01-01 00:00" "2017-01-01 01:00" "2017-01-01 02:00" "2017-01-01 03:00" ...
##  $ Station.code    : int  101 101 101 101 101 101 101 101 101 101 ...
##  $ Address         : chr  "19, Jong-ro 35ga-gil, Jongno-gu, Seoul, Republic of Korea" "19, Jong-ro 35ga-gil, Jongno-gu, Seoul, Republic of Korea" "19, Jong-ro 35ga-gil, Jongno-gu, Seoul, Republic of Korea" "19, Jong-ro 35ga-gil, Jongno-gu, Seoul, Republic of Korea" ...
##  $ Latitude        : num  37.6 37.6 37.6 37.6 37.6 ...
##  $ Longitude       : num  127 127 127 127 127 ...
##  $ SO2             : num  0.004 0.004 0.004 0.004 0.003 0.003 0.003 0.003 0.004 0.003 ...
##  $ NO2             : num  0.059 0.058 0.056 0.056 0.051 0.046 0.049 0.045 0.047 0.047 ...
##  $ O3              : num  0.002 0.002 0.002 0.002 0.002 0.002 0.002 0.002 0.002 0.002 ...
##  $ CO              : num  1.2 1.2 1.2 1.2 1.2 1.1 1.1 1 1.1 1.1 ...
##  $ PM10            : num  73 71 70 70 69 70 66 71 72 74 ...
##  $ PM2.5           : num  57 59 59 58 61 61 57 60 60 63 ...

Dari dataframe air_pollution, 11 variabel tersebut terbagi menjadi 3 tipe data, yaitu character, integer dan numeric (double).

  • Measurement.date : terbaca sebagai tipe data character. Seharusnya, tipe data ini bisa diubah menjadi tipe data date.
  • Station.code : terbaca sebagai tipe data integer, untuk data kode, seharusnya walaupun datanya berupa angka, akan lebih baik jika tipe datanya adalah factor karena Station.code datanya menunjukkan 25 kode district yang ada di Seoul, sehingga lebih cocok jika menggunakan factor.
  • Address : terbaca sebagai character. Sudah sesuai.
  • Latitude, Longitude : terbaca sebagai numeric / double. Sudah sesuai.
  • Seluruh data polutan (SO2, dsb) : terbaca sebagai numeric / double. Sudah sesuai. Karena berpotensi memiliki nilai pecahan dalam satuannya.

Namun sebelum kita melakukan proses manipulasi tipe data, akan lebih baik jika kita melakukan pengecekan missing value pada data kita.

colSums(is.na(air_pollution))
## Measurement.date     Station.code          Address         Latitude 
##                0                0                0                0 
##        Longitude              SO2              NO2               O3 
##                0                0                0                0 
##               CO             PM10            PM2.5 
##                0                0                0
anyNA(air_pollution)
## [1] FALSE

Tidak ditemukan data NA pada data air_pollution.

11 kolom tersebut kita butuhkan informasi datanya, jadi tidak ada kolom yang perlu kita subset. Maka sekarang saatnya melakukan manipulasi data.

2.3 Data Manipulation

Kita lakukan proses perubahan tipe data untuk variabel Measurement.date dan Station.code.

Mengubah tipe data character menjadi tipe data date menggunakan library Lubridate.

library(lubridate)
air_pollution$Measurement.date <- ymd_hm(air_pollution$Measurement.date)

Mengubah tipe data integer menjadi tipe data factor.

air_pollution$Station.code <- as.factor(air_pollution$Station.code)

Kita lihat bahwa tipe data Measurement.date dan Station.code sudah berubah.

str(air_pollution)
## 'data.frame':    647511 obs. of  11 variables:
##  $ Measurement.date: POSIXct, format: "2017-01-01 00:00:00" "2017-01-01 01:00:00" ...
##  $ Station.code    : Factor w/ 25 levels "101","102","103",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ Address         : chr  "19, Jong-ro 35ga-gil, Jongno-gu, Seoul, Republic of Korea" "19, Jong-ro 35ga-gil, Jongno-gu, Seoul, Republic of Korea" "19, Jong-ro 35ga-gil, Jongno-gu, Seoul, Republic of Korea" "19, Jong-ro 35ga-gil, Jongno-gu, Seoul, Republic of Korea" ...
##  $ Latitude        : num  37.6 37.6 37.6 37.6 37.6 ...
##  $ Longitude       : num  127 127 127 127 127 ...
##  $ SO2             : num  0.004 0.004 0.004 0.004 0.003 0.003 0.003 0.003 0.004 0.003 ...
##  $ NO2             : num  0.059 0.058 0.056 0.056 0.051 0.046 0.049 0.045 0.047 0.047 ...
##  $ O3              : num  0.002 0.002 0.002 0.002 0.002 0.002 0.002 0.002 0.002 0.002 ...
##  $ CO              : num  1.2 1.2 1.2 1.2 1.2 1.1 1.1 1 1.1 1.1 ...
##  $ PM10            : num  73 71 70 70 69 70 66 71 72 74 ...
##  $ PM2.5           : num  57 59 59 58 61 61 57 60 60 63 ...

Membuat kolom baru Year.

air_pollution$year <- year(air_pollution$Measurement.date)
head(air_pollution)

2.4 Data Explanation

summary(air_pollution)
##  Measurement.date                  Station.code      Address         
##  Min.   :2017-01-01 00:00:00.00   110    : 25906   Length:647511     
##  1st Qu.:2017-09-27 19:00:00.00   116    : 25906   Class :character  
##  Median :2018-06-24 14:00:00.00   101    : 25905   Mode  :character  
##  Mean   :2018-06-27 21:39:49.24   102    : 25905                     
##  3rd Qu.:2019-03-30 15:30:00.00   106    : 25905                     
##  Max.   :2019-12-31 23:00:00.00   111    : 25905                     
##                                   (Other):492079                     
##     Latitude       Longitude          SO2                 NO2          
##  Min.   :37.45   Min.   :126.8   Min.   :-1.000000   Min.   :-1.00000  
##  1st Qu.:37.52   1st Qu.:126.9   1st Qu.: 0.003000   1st Qu.: 0.01600  
##  Median :37.54   Median :127.0   Median : 0.004000   Median : 0.02500  
##  Mean   :37.55   Mean   :127.0   Mean   :-0.001795   Mean   : 0.02252  
##  3rd Qu.:37.58   3rd Qu.:127.0   3rd Qu.: 0.005000   3rd Qu.: 0.03800  
##  Max.   :37.66   Max.   :127.1   Max.   : 3.736000   Max.   :38.44500  
##                                                                        
##        O3                 CO               PM10             PM2.5        
##  Min.   :-1.00000   Min.   :-1.0000   Min.   :  -1.00   Min.   :  -1.00  
##  1st Qu.: 0.00800   1st Qu.: 0.3000   1st Qu.:  22.00   1st Qu.:  11.00  
##  Median : 0.02100   Median : 0.5000   Median :  35.00   Median :  19.00  
##  Mean   : 0.01798   Mean   : 0.5092   Mean   :  43.71   Mean   :  25.41  
##  3rd Qu.: 0.03400   3rd Qu.: 0.6000   3rd Qu.:  53.00   3rd Qu.:  31.00  
##  Max.   :33.60000   Max.   :71.7000   Max.   :3586.00   Max.   :6256.00  
##                                                                          
##       year     
##  Min.   :2017  
##  1st Qu.:2017  
##  Median :2018  
##  Mean   :2018  
##  3rd Qu.:2019  
##  Max.   :2019  
## 

Summary : 1. Data ini diambil dari tanggal 1 Januari 2017 hingga 31 Desember 2019 tiap hari. 2. Data diambil setiap 1 jam selama 24 jam dari pukul 00 s.d 23. 3. Data diambil pada 25 titik yang berbeda yang ditandai dengan 25 station code yang berbeda dari 101 s.d 125. 4. Total data ini memiliki data 647.511 baris. 5. Data polutan yang diukur adalah SO2, NO2, O3, CO, PM10 dan PM2.5.

3 Data Exploratory

Kemudian kita hitung nilai rata-rata dari masing-masing polutan tiap tahunnya.

3.1 SO2

Kita hitung rata-rata polutan SO2 tiap tahunnya:

aggregate(SO2 ~ year, data = air_pollution, FUN = mean)

3.2 NO2

Kita hitung rata-rata polutan NO2 tiap tahunnya:

aggregate(NO2 ~ year, data = air_pollution, FUN = mean)

3.3 O3

Kita hitung rata-rata polutan O3 tiap tahunnya:

aggregate(O3 ~ year, data = air_pollution, FUN = mean)

3.4 CO

Kita hitung rata-rata polutan CO tiap tahunnya:

aggregate(CO ~ year, data = air_pollution, FUN = mean)

3.5 PM10

Kita hitung rata-rata polutan PM10 tiap tahunnya:

aggregate(PM10 ~ year, data = air_pollution, FUN = mean)

3.6 PM2.5

Kita hitung rata-rata polutan PM2.5 tiap tahunnya:

aggregate(PM2.5 ~ year, data = air_pollution, FUN = mean)

4 Conclusion

Data ini dapat kita analisis dan hitung rata-rata nilai polutan dari tiap titik station yang ada serta tiap satuan waktu yang ada selama 3 tahun data tersebut. Jadi kita bisa melakukan analisis kualitas udara di kota Seoul per harinya atau per bulan atau bahkan dalam satuan jam. Hal ini dapat membantu pemerintah dan masyarakat untuk meningkatkan kewaspadaan akan kualitas udara setiap harinya.