Uvodni tečaj v analizo okoljskih podatkov:Praktični primeri
dr. Asta Gregorič, Maruška Mole (Nova Gorica, oktober 2016)
Najprej namestimo knjižnjico openair :
library("openair", lib.loc="/usr/local/lib/R/site-library")
6.1 Prepoznavanje in spreminjanje časovnega zapisa
a) V R uvozite oba podatkovna niza.
bilje.meteo <- read.delim("bilje-meteo-primeri.txt")go.air <- read.csv("NG-air-primeri.csv")
b) Uredite imena stolpcev za oba podatkovna okvirja.
names(bilje.meteo)[1:9] <- c("date","p","T","rh","rain","ws","wd","glob.rad","diff.rad")
c) Uredite časovni zapis - pretvorite zapis časa v pravilen format, nastavite čas v UTC.
bilje.meteo$date <- as.POSIXct(strptime(bilje.meteo$date, format = "%Y-%m-%d %H:%M"),tz="Etc/GMT-1")
bilje.meteo$date.UTC <- strftime(bilje.meteo$date, format = "%Y-%m-%d %H:%M", tz = "GMT")bilje.meteo$date <- as.POSIXct(strptime(bilje.meteo$date.UTC, format = "%Y-%m-%d %H:%M"),
tz = "GMT")
go.air$date <- as.POSIXct(strptime(go.air$date, format = "%Y-%m-%d %H:%M:%S"),tz = "Etc/GMT-1")
go.air$date.UTC <- strftime(go.air$date, format = "%Y-%m-%d %H:%M", tz = "GMT")go.air$date <- as.POSIXct(strptime(go.air$date.UTC, format = "%Y-%m-%d %H:%M"),
tz = "GMT")
6.2 Urejanje in združevanje podatkov
a) Najpej za oba podatkovna okvirja uskladite časovni korak. Urejene podatke shranite v nov podatkovniokvir.
bilje.meteo.1h <- timeAverage(bilje.meteo, avg.time = "1 hour")
1
summary(bilje.meteo.1h)
## date p T## Min. :2015-08-31 23:00:00 Min. : 983 Min. :-7.75## 1st Qu.:2015-12-01 10:45:00 1st Qu.:1005 1st Qu.: 7.35## Median :2016-03-01 22:30:00 Median :1010 Median :12.95## Mean :2016-03-01 22:30:00 Mean :1010 Mean :13.35## 3rd Qu.:2016-06-01 10:15:00 3rd Qu.:1015 3rd Qu.:19.10## Max. :2016-08-31 22:00:00 Max. :1031 Max. :34.55## NA's :28 NA's :28## rh rain ws wd## Min. : 22.67 Min. : 0.00000 Min. :0.000 Min. : 0.00## 1st Qu.: 57.50 1st Qu.: 0.00000 1st Qu.:0.900 1st Qu.: 90.55## Median : 82.00 Median : 0.00000 Median :1.350 Median :102.26## Mean : 75.92 Mean : 0.07585 Mean :1.969 Mean :138.30## 3rd Qu.: 95.17 3rd Qu.: 0.00000 3rd Qu.:2.700 3rd Qu.:196.97## Max. :100.00 Max. :19.80000 Max. :9.500 Max. :360.00## NA's :17 NA's :26 NA's :26## glob.rad diff.rad## Min. : 0.0 Min. : 0.00## 1st Qu.: 0.0 1st Qu.: 0.00## Median : 5.5 Median : 5.25## Mean : 152.5 Mean : 63.47## 3rd Qu.: 227.4 3rd Qu.: 94.50## Max. :1016.5 Max. :620.00## NA's :8 NA's :6
summary(go.air)
## date PM10 O3## Min. :2016-01-31 23:00:00 Min. : 0.00 Min. : 0.00## 1st Qu.:2016-02-23 09:15:00 1st Qu.: 12.50 1st Qu.: 19.68## Median :2016-03-17 01:30:00 Median : 19.70 Median : 43.35## Mean :2016-03-16 22:28:59 Mean : 22.09 Mean : 46.54## 3rd Qu.:2016-04-08 11:45:00 3rd Qu.: 29.80 3rd Qu.: 68.92## Max. :2016-04-30 22:00:00 Max. :137.60 Max. :129.90## NA's :117 NA's :510## NO NO2 NOx date.UTC## Min. : 1.40 Min. : 1.60 Min. : 2.20 Length:2150## 1st Qu.: 4.20 1st Qu.: 9.90 1st Qu.: 14.30 Class :character## Median : 6.80 Median :17.00 Median : 23.50 Mode :character## Mean : 13.86 Mean :20.35 Mean : 32.73## 3rd Qu.: 14.78 3rd Qu.:27.90 3rd Qu.: 41.30## Max. :132.40 Max. :76.80 Max. :179.50## NA's :348 NA's :369 NA's :447
b) Izvozite podatke s spremenjenim časovnim korakom v .csv datoteko.
write.csv(bilje.meteo.1h, file = "bilje-meteo-1h.csv", row.names = FALSE)
2
c) Združite podatkovna okvirja po času v skupen podatkovni okvir.
meteo.air <- merge(bilje.meteo.1h, go.air, by = "date", all = TRUE)
d) Iz združenih podatkov izločite podatke od 1. 2. 2016 do 30. 4. 2016 in izrišite povzetek za izločenepodatke.
meteo.air.pomlad <- selectByDate(meteo.air, start = "1/2/2016", end = "30/4/2016")
summaryPlot(meteo.air.pomlad, period = "months", par.settings=list(fontsize=list(text=8)))
date
Feb 01 Feb 15 Mar 01 Mar 15 Apr 01 Apr 15
missing = 0 (0%)min = 983max = 1024
mean = 1006.4median = 1007
95th percentile = 1018
100 % 100 % 100 %
p
missing = 0 (0%)min = −2max = 22.8
mean = 9.9median = 9.6
95th percentile = 18.8
100 % 100 % 100 %
T
missing = 0 (0%)min = 27.5max = 100
mean = 74.7median = 78.9
95th percentile = 98.3
100 % 100 % 100 %
rela
tive
hum
idity
missing = 0 (0%)min = 0max = 7.2
mean = 0.1median = 0
95th percentile = 0.5
100 % 100 % 100 %
rain
missing = 0 (0%)min = 0max = 9.5
mean = 2.4median = 1.7
95th percentile = 6.5
100 % 100 % 100 %
win
d sp
d.
missing = 0 (0%)min = 1.4max = 360
mean = 143.3median = 103.7
95th percentile = 294.6
100 % 100 % 100 %
win
d di
r.
missing = 0 (0%)min = 0max = 931
mean = 130.1median = 3.5
95th percentile = 646.6
100 % 100 % 100 %
glob
.rad
missing = 0 (0%)min = 0max = 496.5
mean = 64.9median = 3.5
95th percentile = 288.5
100 % 100 % 100 %
diff.
rad
missing = 127 (5.9%)min = 0max = 137.6
mean = 22.1median = 19.7
95th percentile = 45.7
94.7 % 88.2 % 99.7 %
PM
10
missing = 521 (24.1%)min = 0max = 129.9
mean = 46.6median = 43.4
95th percentile = 101.7
80 % 56 % 92.4 %
O3
missing = 359 (16.6%)min = 1.4max = 132.4
mean = 13.8median = 6.8
95th percentile = 52
88.1 % 93.7 % 68.2 %
NO
missing = 380 (17.6%)min = 1.6max = 76.8
mean = 20.3median = 17
95th percentile = 46.1
84.8 % 94 % 68.2 %
NO
2
missing = 458 (21.2%)min = 2.2max = 179.5
mean = 32.7median = 23.5
95th percentile = 90.5
76.6 % 93.8 % 65.4 %
NO
x
value
Per
cent
of T
otal
010
990 1000 1010 1020
010
0 5 10 15 20
010
40 60 80 100
060
0.0 0.5 1.0 1.5
015
0 2 4 6
020
0 100 200 300
040
0 200 400 600 800
040
0 100 200 300 400
010
0 10 20 30 40 50 60
06
0 20 40 60 80 100
030
0 20 40 60 80
010
0 10 20 30 40 50
020
0 50 100
3
6.3 Analiza in prikaz meteoroloških podatkov
a) Izrišite časovni potek vremenskih parametrov za celotno obdobje (pozorni bodite na imena osi in zapisenot).
timePlot(meteo.air, pollutant = c("p","T","rh","glob.rad","rain"),date.format = "%d/%m", key.columns = 3,name.pol = c("p (hPa)",expression("T (" * degree * "C)"),"RH (%)",
expression("glob. sevanje (W m" ^-2 * ")"),"padavine (mm)"), strip = FALSE, ylab = "Vremenske spremenljivke",
par.settings=list(fontsize=list(text=10)))
Vre
men
ske
spre
men
ljivk
e
990
1000
1010
1020
1030
0
10
20
30
20
40
60
80
100
0
200
400
600
800
1000
0
5
10
15
20
01/10 01/01 01/04 01/07
p (hPa)T (°C)
RH (%)glob. sevanje (W m−2)
padavine (mm)
4
b) Prikažite razmerje med temperaturo in relativno vlažnostjo, grupirano po posameznih mesecih.
scatterPlot(meteo.air, x = "rh", y = "T", group = "month",xlab = "RH (%)", ylab = expression("T (" * degree * "C)"),key.title = "Mesec",cex = 0.8)
RH (%)
T (
°C)
0
10
20
30
20 40 60 80 100
Mesec January February March April May June July August September October November December
c) Prikažite razmerje med temperaturo in relativno vlažnostjo glede na sončno obsevanje za obdobja, koni padavin.
scatterPlot(subset(meteo.air, rain == 0), x = "T", y = "rh", z = "glob.rad",main = "Odvisnost relativne vlaznosti od temperature zraka \n glede na soncnosevanje",xlab = expression("T (" * degree * "C)"), ylab = "RH (%)",key.title = "Glob. sevanje", cex = 0.6)
Odvisnost relativne vlaznosti od temperature zraka
glede na soncno sevanje
T (°C)
RH
(%
)
20
40
60
80
100
0 10 20 30
0
200
400
600
800
1000
5
d) Prikažite razmerje med temperaturo in relativno vlažnostjo glede na sončno obsevanje za vsa opazovanjav aprilu 2016 med 12. in 16. uro po lokalnem času.
scatterPlot(selectByDate(meteo.air, hour = 10:14, month = 5),x = "T", y = "rh", z = "glob.rad",main = "Odvisnost RH od T zraka glede na soncno sevanje (april, od 12:00 do16:00)",xlab = expression("T (" * degree * "C)"), ylab = "RH (%)",key.title = "Glob. sevanje")
Odvisnost RH od T zraka glede na soncno sevanje
(april, od 12:00 do 16:00)
T (°C)
RH
(%
)
40
60
80
15 20 25
100
200
300
400
500
600
700
800
900
1000
6
e) Veter prikažite z vetrovno rožo po posameznih sezonah.
windRose(meteo.air, angle = 45, ws.int = 1, breaks = 7, paddle = F,annotate = F, main = "Vetrovna roza",key = list(height = 1),type = "season")
Vetrovna roza
W
S
N
E
10%
20%
30%
40%
50%
60%
70%
80%
90%
100%
110%
spring (MAM)
W
S
N
E
10%
20%
30%
40%
50%
60%
70%
80%
90%
100%
110%
summer (JJA)
W
S
N
E
10%
20%
30%
40%
50%
60%
70%
80%
90%
100%
110%
autumn (SON)
W
S
N
E
10%
20%
30%
40%
50%
60%
70%
80%
90%
100%
110%
winter (DJF)
0 to 1 1 to 2 2 to 3 3 to 4 4 to 5 5 to 6 6 to 9.5
(m s−1)
7
f) Prikažite povprečen dnevni potek hitrosti vetra.
dnevni.ws <- timeVariation(meteo.air, pollutant = "ws", local.tz = "Europe/Ljubljana",type = "season", ylab = expression("ws (m s" ^-1 * ")"),xlab = c("ura","ura","mesec","dan"),sub = " povprecna vrednost in 95% interval zaupanja",par.settings=list(fontsize=list(text=8)))
ura
ws
(m s
−1)
12345
Monday
sprin
g (M
AM
)
0 6 12 18 23
Tuesday Wednesday
0 6 12 18 23
Thursday Friday
0 6 12 18 23
Saturday Sunday
sum
mer
(JJ
A)
12345
12345
autu
mn
(SO
N)
0 6 12 18 23
win
ter
(DJF
)
0 6 12 18 23 0 6 12 18 23 0 6 12 18 23
12345
wind spd.
ura
ws
(m s
−1)
1.0
1.5
2.0
2.5
3.0
3.5
4.0
spring (MAM)
0 6 12 18 23
summer (JJA)
0 6 12 18 23
autumn (SON)
1.0
1.5
2.0
2.5
3.0
3.5
4.0
winter (DJF)
mesec
ws
(m s
−1)
1.0
1.5
2.0
2.5
3.0
spring (MAM)
J FMAMJ J ASOND
summer (JJA)
J FMAMJ J ASOND
autumn (SON)
1.0
1.5
2.0
2.5
3.0
winter (DJF)
dan
ws
(m s
−1)
1.5
2.0
2.5
3.0spring (MAM)
MonTueWedThuFriSatSun
summer (JJA)
MonTueWedThuFriSatSun
autumn (SON)
1.5
2.0
2.5
3.0winter (DJF)
povprecna vrednost in 95% interval zaupanja
8
print(dnevni.ws, subset = "hour")
ura
ws
(m s
−1)
1.0
1.5
2.0
2.5
3.0
3.5
4.0
spring (MAM)
0 6 12 18 23
summer (JJA)
0 6 12 18 23
autumn (SON)
1.0
1.5
2.0
2.5
3.0
3.5
4.0
winter (DJF)
wind spd.
9
6.4 Analiza in prikaz podatkov o kakovosti zraka
a) Prikažite časovni potek parametrov kakovosti zraka za obdobje februar - april.
timePlot(meteo.air.pomlad, pollutant = c("PM10", "O3","NO","NO2","NOx"),ylab = expression("(" * mu * "g m" ^-3 * ")"), key = FALSE,date.format = "%d/%m", date.breaks = 20)
(µg
m−3
)
0
50
100
PM
10
0
50
100
O3
0
50
100
NO
0
20
40
60
80
NO
2
0
50
100
150
01/02 08/02 15/02 22/02 29/02 07/03 14/03 21/03 28/03 04/04 11/04 18/04 25/04
NO
x
10
b) Prikažite potek koncentracij PM10 in O3 za obdobje 9. 4. 2016 do 12. 4. 2016.
timePlot(selectByDate(meteo.air.pomlad, start = "9/4/2016", end = "12/4/2016"),pollutant = c("PM10", "O3"), group = T,ylab = expression("O"[3] * ", PM"[10] * " (" * mu * "g m" ^-3 * ")"),date.format = "%d/%m", date.breaks = 20)
Koncentracija O3 in PM10 (9. − 12. 4. 2016)
O3,
PM
10 (
µg m
−3)
0
20
40
60
80
100
120
09/04/1600:00
09/04/1612:00
10/04/1600:00
10/04/1612:00
11/04/1600:00
11/04/1612:00
12/04/1600:00
12/04/1612:00
PM10 O3
11
c) Prikažite povprečen dnevni potek koncentracij PM10 in O3 v lokalnem času.
timeVariation(meteo.air.pomlad, pollutant = c("O3","PM10"),local.tz = "Europe/Ljubljana", xlab = c("ura","ura","mesec","dan"),sub = " povprecna vrednost in 95% interval zaupanja",par.settings=list(fontsize=list(text=8)))
ura
O3,
PM
10
20
40
60
80
100
0 6 12 18 23
Monday
0 6 12 18 23
Tuesday
0 6 12 18 23
Wednesday
0 6 12 18 23
Thursday
0 6 12 18 23
Friday
0 6 12 18 23
Saturday
0 6 12 18 23
Sunday
O3 PM10
ura
O3,
PM
10
20
30
40
50
60
70
80
0 6 12 18 23
mesec
O3,
PM
10
30
40
50
J F M A M J J A S O N D
dan
O3,
PM
10
20
30
40
50
Mon Tue Wed Thu Fri Sat Sun
povprecna vrednost in 95% interval zaupanja
12
dnevni.plini <- timeVariation(meteo.air.pomlad,pollutant = c("NO","NO2", "NOx", "O3"),local.tz = "Europe/Ljubljana",xlab = c("ura","ura","mesec","dan"),sub = " povprecna vrednost in 95% interval zaupanja",type = "month",par.settings=list(fontsize=list(text=8)))
ura
NO
, NO
2, N
Ox,
O3 0
50
100
150
Monday
Feb
ruar
y
0 6 12 18 23
Tuesday Wednesday
0 6 12 18 23
Thursday Friday
0 6 12 18 23
Saturday Sunday
Mar
ch
0
50
100
150
0
50
100
150
0 6 12 18 23
Apr
il
0 6 12 18 23 0 6 12 18 23 0 6 12 18 23
NO NO2 NOx O3
ura
NO
, NO
2, N
Ox,
O3
20
40
60
80
100
February
0 6 12 18 23
March
0 6 12 18 23
20
40
60
80
100
April
mesec
NO
, NO
2, N
Ox,
O3
10
20
30
40
50
60
February
J FMAM J J A SOND
March
J FMAM J J A SOND
10
20
30
40
50
60
April
dan
NO
, NO
2, N
Ox,
O3 20
40
60
February
MonTueWedThuFri SatSun
March
MonTueWedThuFri SatSun
20
40
60
April
povprecna vrednost in 95% interval zaupanja
13
print(dnevni.plini, subset = "hour")
ura
NO
, NO
2, N
Ox,
O3
20
40
60
80
100
February
0 6 12 18 23
March
0 6 12 18 23
20
40
60
80
100
April
NO NO2 NOx O3
d) Prikažite povprečen dnevni potek koncentracij NO, NO2, NOx in O3.
scatterPlot(meteo.air.pomlad, x = "ws", y = "PM10", type = "wd",main = "Odvisnost PM10 od smeri in hitrosti vetra",xlab = expression("Hitrost vetra (m s" ^-1 * ")"),ylab = expression("PM"[10] * " (" * mu * "g m" ^-3 * ")"))
Odvisnost PM10 od smeri in hitrosti vetra
Hitrost vetra (m s−1)
PM
10 (
µg m
−3)
0
50
100
NW
0 2 4 6 8
N NE
W
0
50
100
E
0
50
100
0 2 4 6 8
SW S
0 2 4 6 8
SE
14
e) Prikažite odvisnost koncentracij PM10 od hitrosti vetra glede grupirano po smeri vetra.
polarPlot(meteo.air.pomlad,pollutant = "PM10")
0
2
4 ws
6
8
10
W
S
N
E
mean
PM10
10
15
20
25
f) Prikažite razmerje med NO2, NOx in NO pri različnih koncentracijah O3.
scatterPlot(meteo.air.pomlad, x = "NOx", y = "NO2", z = "NO", type = "O3",main = "Razmerje med NO2, NOx in NO pri razlicnih koncentracijah O3")
Razmerje med NO2, NOx in NO pri razlicnih koncentracijah O3
NOx
NO
2 0
20
40
60
O3 0 to 19.8
0 50 100 150
O3 19.8 to 43.4
0 50 100 150
O3 43.4 to 69
0
20
40
60
O3 69 to 130
20
40
60
80
100
120
15