Air Quality Index (AQI)

空氣品質指數是定量描述空氣品質狀況的非線性無量綱指數。其數值越大、級別和類別越高、表征顏色越深,說明空氣污染狀況越嚴重,對人體的健康危害也就越大。


Caculation

IAQI

對照各項污染物的分級濃度限值,以細顆粒物(PM2.5)、可吸入顆粒物(PM10)、二氧化硫(SO2)、二氧化氮(NO2)、臭氧(O3)、一氧化碳(CO)等各項污染物的實測濃度值(其中PM2.5、PM10為24小時平均濃度)分別計算得出空氣品質分指數(Individual Air Quality Index, IAQI)。


IAQIP = IAQIHi - IAQILo/BPHi - BPLo (CP - BPLo) + IAQILo


IAQIP:污染物項目P的空氣品質分指數;

CP:污染物項目P的質量濃度值;

BPHi:相應地區的空氣品質分指數及對應的污染物項目濃度指數表中與CP相近的污染物濃度限值的高位值;

BPLo:相應地區的空氣品質分指數及對應的污染物項目濃度指數表中與CP相近的污染物濃度限值的低位值;

IAQIHi:相應地區的空氣品質分指數及對應的污染物項目濃度指數表中與BPHi對應的空氣品質分指數;

IAQILo:相應地區的空氣品質分指數及對應的污染物項目濃度指數表中與BPLo對應的空氣品質分指數。


AQI


AQI = max {IAQI1, IAQI2, IAQI3,…, IAQIn}


IAQI:空氣品質分指數;

n:污染物項目。

簡單來說,AQI就是在各IAQI中取最大值。 AQI大於50時,IAQI最大的污染物為首要污染物。若IAQI最大的污染物為兩項或兩項以上時,並列為首要污染物。IAQI大於100的污染物為超標污染物。


Criteria

中華民國空氣污染指標(Pollutant Standards Index,PSI)是空氣污染情況的一項指標,由中華民國行政院環境保護署於1993年擴充測站後推出,目標乃藉由本測站系統監控全台灣所有的空氣品質並加以通報改善。將上述空氣品質指數(AQI)轉化為一個由0至500的單一數字,並按照指數高低而劃分為良好普通對敏感族群不健康對所有族群不健康非常不健康危害六種級別。

空氣品質指標(AQI)與健康影響表

空氣質量指數(AQI) 健康令人擔憂的程度 顏色
0 to 50 良好 綠色
51 to 100 普通 黃色
101 to 150 對敏感族群不健康 橘色
151 to 200 對所有族群不健康 紅色
201 to 300 非常不健康 紫色
301 to 500 危害 棗紅色


Real-time AQI of Taiwan

Import libraries

library(httr)
library(jsonlite)
library(ggplot2)
library(ggmap)

Real-time update

z <- Sys.time()
z <- unclass(z)
z <- floor(z*1000) # get interger

Import json on-line and normalize

url_AQI <- paste0("https://taqm.epa.gov.tw/taqm/aqs.ashx?lang=tw&act=aqi-epa&ts=",z)
AQI.list <- fromJSON(content(GET(url_AQI), "text"))
AQI.v <- unlist(AQI.list$Data)
AQI.m <- matrix(AQI.v, byrow = F, ncol = 28)
AQI.df <- as.data.frame(AQI.m)

cname <- names(AQI.list$Data)
names(AQI.df) <- cname

Convert character to number

AQI.df$AQI <- as.numeric(AQI.df$AQI)
AQI.df$lat <- as.numeric(AQI.df$lat)
AQI.df$lng <- as.numeric(AQI.df$lng)

Define levels of AQI to show unused index

AQI.df$AQIStyle <- factor(AQI.df$AQIStyle, levels=c("AQI0","AQI1","AQI2","AQI3","AQI4","AQI5","AQI6"))

Problem

即時資料直接在R檔中運行沒有問題,但轉移至Markdown後會出現以下警告:

Warning: Removed 78 rows containing missing values (geom_point).

經查證發現(lng,lat)的座標點在Markdown中有做變動,geom_point無法順利地顯示在地圖上,但確切的數值無法得知,也無法推算。以下嘗試出一個辦法是:額外定義(lng,lat)的數值,其數值由data.frame裡copy出來,但在使用上較不切實際。

Redefine (lng,lat), and AQIStyle (refer to problem)

location <- data.frame(
  lng=c(121.7601, 121.6408, 121.6899, 121.5378, 121.4519, 121.4587, 121.4325, 121.4810, 121.3657, 121.4492, 121.5154, 121.5265, 121.5080, 121.5296, 121.5786, 121.5133, 121.3200, 121.2018, 121.0828, 121.2040, 121.2164, 121.0387, 121.0889, 120.9721, 120.8986, 120.8202, 120.7588, 120.7417, 120.5688, 120.6777, 120.6411, 120.6169, 120.5415, 120.4691, 120.4097, 120.6853, 120.5450, 120.3487, 120.3455, 120.2473, 120.2028, 120.4408, 120.3173, 120.2971, 120.2183, 120.2026, 120.5305, 120.3057, 120.3326, 120.3581, 120.4253, 120.4117, 120.3283, 120.2929, 120.2881, 120.3076, 120.3377, 120.4880, 120.5612, 120.7889, 121.1505, 121.5998, 121.5296, 121.7464, 121.7929, 121.4938, 121.2217, 120.6773, 121.5163, 120.3120, 120.9679, 119.9499, 118.3123, 119.5662, 121.1619, 120.2518, 120.2846, 121.7492),
  lat=c(25.12917, 25.06567, 25.17967, 24.97722, 24.98253, 25.01297, 25.03797, 25.06895, 25.07857, 25.16450, 25.10542, 25.06236, 25.04650, 25.02061, 25.05000, 25.06320, 24.99479, 25.06034, 25.03550, 24.95279, 24.86387, 24.90014, 24.74064, 24.80562, 24.69697, 24.56527, 24.38294, 24.25659, 24.22563, 24.09961, 24.15196, 24.16220, 24.06600, 24.13167, 23.92517, 23.91300, 23.71185, 23.75755, 23.55484, 23.46531, 23.71753, 23.46278, 23.30563, 23.11510, 23.04833, 22.98458, 22.88358, 22.75751, 22.68906, 22.62739, 22.56414, 22.47950, 22.73367, 22.67486, 22.63257, 22.60539, 22.56583, 22.67308, 22.52311, 21.95807, 22.75536, 23.97131, 25.18272, 24.74792, 24.63220, 25.07261, 24.95328, 23.75639, 25.01700, 22.60871, 23.96884, 26.16047, 24.43213, 23.56903, 23.04508, 23.75351, 23.84802, 24.30814),
  AQIStyle=AQI.df$AQIStyle
  )

Create a Taiwan map

map = 
  ggmap(
    get_googlemap(
      center=c(120.6968965,23.7504154),
      zoom=7,
      maptype='hybrid'),
    darken = 0.2
    )
## Map from URL : http://maps.googleapis.com/maps/api/staticmap?center=23.750415,120.696896&zoom=7&size=640x640&scale=2&maptype=hybrid&sensor=false

Create points of site, and define labels, color values of indeies

map +
  geom_point(
    data=location,
    aes(x=lng, y=lat, color=AQIStyle), # according AQIStyle to change different color
    size=3,
    alpha=0.4
    ) +
  scale_color_manual(
    "Air Quality \nIndex",
    labels=c("No data","0~50","51~100","101~150","151~200","201~300","301~500"),
    values=c("black","green","yellow","orange","red","purple","#750000"),
    guide=guide_legend(reverse=TRUE),
    drop=FALSE
    )