El dataset emprat en aquesta pràctica conté les dades i les metadades de les estacions automàtiques operatives, recollides durant un any i cada trenta minuts, fins al 3 de desembre de 2025. Les estacions formen part de la Xarxa d’Estacions Meteorològiques Automàtiques (XEMA) de Catalunya i les dades s’han obtingut fent web scraping a dues pàgines de meteo.cat.
En el dataset, primer tenim les variables de l’estació que es va obtenir a la pàgina “Llistat d’estacions”:
| # | Nom | Descripció | Tipus | Valors possibles |
|---|---|---|---|---|
| 1 | Comarca | Comarca on es troba l’estació | Categòrica | Text |
| 2 | Municipi | Municipi on es troba l’estació | Categòrica | Text |
| 3 | Estació Codi | Nom de l’estació i codi identificador | Categòrica | Text |
| 4 | Latitud | Latitud de l’estació | Quantitativa contínua | Valors reals [-90.0, 90.0] |
| 5 | Longitud | Longitud de l’estació | Quantitativa contínua | Valors reals [-180.0, 180.0] |
| 6 | Altitud (m) | Altitud de l’estació en metres | Quantitativa contínua | Valors reals [0.0, 3200.0] |
| 7 | Data alta | Data d’alta de l’estació | Data | Data en format dd.mm.aaaa |
| 8 | Data baixa | Data de baixa de l’estació | Data | Data en format dd.mm.aaaa |
| 9 | Estat actual | Estat actual de l’estació | Categòrica | “Desmantellada” o “Operativa” |
| 10 | code | Codi identificador de l’estació | Categòrica | Text de 2 caràcters de longitud |
| 11 | date | Data de la mesura | Data | Data en format dd.mm.aaaa |
| 12 | Període TU | Hora de la mesura en Temps Universal | Categòrica | Període en format HH:MM - HH:MM |
Després tenim les variables amb la informació meteorològica dels sensors, que es va obtenir fent web scraping a la pàgina “Dades d’estació”:
| # | Nom | Descripció | Tipus | Valors possibles |
|---|---|---|---|---|
| 13 | TM °C | Temperatura mitjana en graus Celsius | Quantitativa contínua | Valors reals [-20.0, 50.0] |
| 14 | TX °C | Temperatura màxima en graus Celsius | Quantitativa contínua | Valors reals [-20.0, 50.0] |
| 15 | TN °C | Temperatura mínima en graus Celsius | Quantitativa contínua | Valors reals [-20.0, 50.0] |
| 16 | HRM % | Humitat relativa mitjana en percentatge | Quantitativa contínua | Valors reals [0.0, 100.0] |
| 17 | PPT mm | Precipitació en mil·límetres | Quantitativa contínua | Valors reals [0.0, Inf) |
| 18 | VVM (2 m) km/h | Velocitat mitjana del vent a 2 metres en km/h | Quantitativa contínua | Valors reals [0.0, Inf) |
| 19 | DVM (2 m) graus | Direcció del vent a 2 metres en graus | Quantitativa contínua | Valors reals [0.0, 360.0] |
| 20 | VVX (2 m) km/h | Velocitat màxima del vent a 2 metres en km/h | Quantitativa contínua | Valors reals [0.0, Inf) |
| 21 | RS W/m2 | Radiació solar en watts per metre quadrat | Quantitativa contínua | Valors reals [0.0, Inf) |
| 22 | VVM (10 m) km/h | Velocitat mitjana del vent a 10 metres en km/h | Quantitativa contínua | Valors reals [0.0, Inf) |
| 23 | DVM (10 m) graus | Direcció del vent a 10 metres en graus | Quantitativa contínua | Valors reals [0.0, 360.0] |
| 24 | VVX (10 m) km/h | Velocitat màxima del vent a 10 metres en km/h | Quantitativa contínua | Valors reals [0.0, Inf) |
| 25 | PM hPa | Pressió atmosfèrica mitjana en hectopascals | Quantitativa discreta | Valors enters |
| 26 | VVM (6 m) km/h | Velocitat mitjana del vent a 6 metres en km/h | Quantitativa contínua | Valors reals [0.0, inf) |
| 27 | DVM (6 m) graus | Direcció del vent a 6 metres en graus | Quantitativa contínua | Valors reals [0.0, 360.0] |
| 28 | VVX (6 m) km/h | Velocitat màxima del vent a 6 metres en km/h | Quantitativa contínua | Valors reals [0.0, Inf) |
| 29 | GN cm | Gruix de neu en centímetres | Quantitativa contínua | Valors reals [0.0, Inf) |
En cas que no es vulguin baixar les dades i es desitgi utilitzar el
dataset comprimit en aquest repositori, cal descomprimir-lo i executar
l’script per generar el fitxer dataset.csv:
tar xvfa ./backup/dataset.tar.xz
python3 source/main.py -w
En cas que es vulguin baixar les dades més recents, cal executar els
següents ordres en la terminal. En l’exemple, s’obté el fitxer
dataset.csv amb les dades de les estacions de l’últim any
fins al 3 de desembre de 2025:
python3 source/main.py -d 365 -b 03.12.2025
En el següent bloc de codi es carrega el fitxer
dataset.csv amb el conjunt de dades:
dataset_measurements <- fread(
"../dataset/dataset.csv", # Camí al fitxer
dec = ".", # Separador decimal
na.strings = c("", "(s/d)"), # Valors que representen NA
data.table = FALSE # Retorna data.frame per compatibilitat
)El conjunt de dades té 29 variables (columnes) i 3.251.663 registres (files).
La integració pròpiament dita es realitza durant el procés de web
scraping, on es recullen les dades de les dues pàgines web i es combinen
en un únic conjunt de dades. En aquest cas, no és necessari realitzar
una integració addicional ja que les dades ja estan integrades en el
fitxer dataset.csv.
No obstant això, s’ha modificat la integració per utilitzar un únic
separador de decimals (el punt) per a totes les variables numèriques.
Originàriament en el fitxer dataset.csv, les variables
Latitud i Longitud utilitzaven la coma com a
separador decimal, mentre que la resta de variables numèriques utilitzen
el punt.
Aquest canvi ha permès una millor gestió de les dades numèriques,
evitar problemes de conversió de tipus de dades i utilitzar la funció
fread de la biblioteca data.table per carregar
el conjunt de dades de manera eficient.
En aquest apartat, un cop carregades les dades, es du a terme una
anàlisi preliminar del conjunt de dades per conèixer millor les seves
característiques. Al final d’aquest apartat, s’hauran eliminat les
variables innecessàries (Estació [Codi], code,
Data baixa i Estat actual) i s’hauran creat
dues noves variables (Nom estació i
Codi estació).
El conjunt de dades final només tindrà les variables necessàries per fer l’anàlisi de les dades; no obstant això, no s’eliminen les variables innecessàries fins després d’haver fet la imputació dels valors perduts, ja que poden ser útils per a la imputació.
Les dades meteorològiques es van recollir en un període d’un any, des
del 4 de desembre de 2024 fins al 3 de desembre de 2025. El conjunt de
dades recull les dades meteorològiques de 189 estacions meteorològiques,
durant 364 dies, amb 48 observacions per dia. Per tant, una estació
meteorològica com a molt pot tenir 17.472 registres (files) o una
variable d’una estació pot tenir com a molt 17.472 observacions,
corresponents a 364 dies (date) amb 48 observacions/dia
(una cada 30 minuts, Període TU).
No totes les estacions tenen el mateix nombre de registres, de fet hi ha 108 estacions meteorològiques que tenen exactament 17.472 files. Hi ha diversos motius que expliquen aquest fet, com ara problemes tècnics en les estacions, errors en la transmissió de dades, o que les estacions es van donar d’alta després de l’inici del període de recollida de dades.
| Estació Codi | Data d’alta |
|---|---|
| Cantonigròs [YU] | 2025-02-18 |
| Mataró [YV] | 2025-06-11 |
| Batea [YX] | 2025-07-30 |
En la taula següent es mosta un resum del nombre de registres de les estacions meteorològiques restants (78), on per temes d’espai, només es mostren les 5 primeres i les 5 últimes estacions, ordenades pel nombre de registres.
| Estació Codi | Nombre de files |
|---|---|
| Primeres 5 estacions | |
| Anglesola - Tornabous [XX] | 17.424 |
| Caldes de Montbui [X9] | 17.424 |
| Castellbisbal [XC] | 17.424 |
| Gandesa [XP] | 17.424 |
| Granollers [YM] | 17.424 |
| Últimes 5 estacions | |
| la Llacuna [XB] | 17.184 |
| la Panadella [XA] | 17.184 |
| la Seu d’Urgell - Bellestar [CD] | 17.184 |
| Òdena [H1] | 17.184 |
| Bonabé (1.693 m) [YT] | 7.104 |
En el conjunt de dades hi ha un total de 182 municipis i 42 comarques diferents.
En la següent taula es mostra el nombre de valors diferents per cada variable del conjunt de dades.
| Variable | Nombre de valors diferents |
|---|---|
| Data baixa | 1 |
| Estat actual | 1 |
| Comarca | 42 |
| Període TU | 48 |
| HRM % | 100 |
| VVM (2 m) km/h | 130 |
| Altitud (m) | 172 |
| Data alta | 176 |
| Municipi | 182 |
| GN cm | 182 |
| Estació Codi | 189 |
| Latitud | 189 |
| Longitud | 189 |
| code | 189 |
| VVM (6 m) km/h | 232 |
| VVX (2 m) km/h | 242 |
| VVM (10 m) km/h | 318 |
| PPT mm | 334 |
| VVX (6 m) km/h | 342 |
| DVM (2 m) graus | 362 |
| DVM (6 m) graus | 362 |
| DVM (10 m) graus | 362 |
| date | 364 |
| VVX (10 m) km/h | 467 |
| TN °C | 574 |
| TM °C | 579 |
| TX °C | 581 |
| PM hPa | 895 |
| RS W/m2 | 1.172 |
A partir dels valors observats en la taula anterior, s’eliminen les
variables Data baixa i Estat actual perquè
només tenen un únic valor, ja que totes les estacions estan
operatives.
# Elimina les variables del conjunt de dades
dataset_measurements <- dataset_measurements |>
select(-`Data baixa`, -`Estat actual`)Per facilitar la visualització de les gràfiques i taules, es creen
dues variables noves Nom estació i
Codi estació a partir de la variable
Estació [Codi].
Abans de continuar amb l’anàlisi de les dades, és important
assegurar-se que les variables tinguin el tipus de dada correcte. Això
facilitarà l’anàlisi i la visualització de les dades. Al final d’aquest
apartat, s’hauran convertit les variables al tipus de dada adequat i
s’hauran eliminat dues variables innecessàries (Període TU
i date) i s’haurà creat una nova variable
Data i hora.
## Rows: 3,251,663
## Columns: 27
## $ `Nom estació` <chr> "Nulles", "Nulles", "Nulles", "Nulles", "Nulles", "…
## $ `Codi estació` <chr> "VY", "VY", "VY", "VY", "VY", "VY", "VY", "VY", "VY…
## $ Comarca <chr> "Alt Camp", "Alt Camp", "Alt Camp", "Alt Camp", "Al…
## $ Municipi <chr> "Nulles", "Nulles", "Nulles", "Nulles", "Nulles", "…
## $ Latitud <dbl> 41.25095, 41.25095, 41.25095, 41.25095, 41.25095, 4…
## $ Longitud <dbl> 1.29863, 1.29863, 1.29863, 1.29863, 1.29863, 1.2986…
## $ `Altitud (m)` <int> 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 2…
## $ `Data alta` <chr> "18.09.2000", "18.09.2000", "18.09.2000", "18.09.20…
## $ date <chr> "05.12.2024", "05.12.2024", "05.12.2024", "05.12.20…
## $ `Període TU` <chr> "00:00 - 00:30", "00:30 - 01:00", "01:00 - 01:30", …
## $ `TM °C` <dbl> 7.2, 8.4, 9.0, 9.2, 8.1, 7.0, 6.8, 6.0, 7.2, 7.3, 6…
## $ `TX °C` <dbl> 8.1, 8.7, 9.8, 9.9, 9.0, 7.4, 7.4, 7.3, 7.7, 8.3, 7…
## $ `TN °C` <dbl> 6.7, 8.0, 8.6, 8.3, 7.2, 6.0, 5.5, 4.6, 6.9, 6.0, 6…
## $ `HRM %` <dbl> 62, 59, 52, 50, 55, 61, 63, 66, 60, 58, 65, 64, 62,…
## $ `PPT mm` <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ `VVM (2 m) km/h` <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ `DVM (2 m) graus` <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ `VVX (2 m) km/h` <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ `RS W/m2` <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ `VVM (6 m) km/h` <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ `DVM (6 m) graus` <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ `VVX (6 m) km/h` <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ `VVM (10 m) km/h` <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ `DVM (10 m) graus` <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ `VVX (10 m) km/h` <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ `PM hPa` <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ `GN cm` <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
En la conversió del tipus de dades, s’han realitzat les següents accions:
Data alta al tipus de dada
Date.Data i hora que combina les
variables date i Període TU, convertint-les al
tipus de dada POSIXct.Codi estació, Nom estació,
Comarca, Municipi i Codi estació
al tipus de dada Factor.Altitud (m), Longitud i Latitud
al tipus de dada Numeric.TM °C, TX °C i TN °C al tipus de
dada Numeric.DVM (2 m) graus, DVM (6 m) graus i
DVM (10 m) graus al tipus de dada Numeric.VVM (2 m) km/h, VVM (6 m) km/h,
VVM (10 m) km/h, VVX (2 m) km/h i
VVX (10 m) km/h al tipus de dada Numeric.GN cm,
HRM %, PM hPa, PPT mm i
RS W/m2 al tipus de dada Numeric.Període TU i la variable
date del conjunt de dades.# Conversió del tipus de dades de les variables i eliminació
dataset_measurements <- dataset_measurements |>
mutate(
# Variables de dates (2)
`Data alta` = as.Date(`Data alta`, format = "%d.%m.%Y"),
`Data i hora` = as.POSIXct(
paste(date, substr(`Període TU`, 1, 5)),
format = "%d.%m.%Y %H:%M", tz = "UTC"
),
# Variables categòriques (5)
`Codi estació` = as.factor(`Codi estació`),
`Nom estació` = as.factor(`Nom estació`),
Comarca = as.factor(Comarca),
Municipi = as.factor(Municipi),
# Variables numèriques geogràfiques (3)
`Altitud (m)` = as.numeric(`Altitud (m)`),
Longitud = as.numeric(Longitud),
Latitud = as.numeric(Latitud),
# Variables numèriques de temperatura (3)
`TM °C` = as.numeric(`TM °C`),
`TX °C` = as.numeric(`TX °C`),
`TN °C` = as.numeric(`TN °C`),
# Variables numèriques de direcció del vent (3)
`DVM (2 m) graus` = as.numeric(`DVM (2 m) graus`),
`DVM (6 m) graus` = as.numeric(`DVM (6 m) graus`),
`DVM (10 m) graus` = as.numeric(`DVM (10 m) graus`),
# Variables numèriques de velocitat del vent (5)
`VVM (2 m) km/h` = as.numeric(`VVM (2 m) km/h`),
`VVM (6 m) km/h` = as.numeric(`VVM (6 m) km/h`),
`VVM (10 m) km/h` = as.numeric(`VVM (10 m) km/h`),
`VVX (2 m) km/h` = as.numeric(`VVX (2 m) km/h`),
`VVX (10 m) km/h` = as.numeric(`VVX (10 m) km/h`),
# Altres variables numèriques (5)
`GN cm` = as.numeric(`GN cm`),
`HRM %` = as.numeric(`HRM %`),
`PM hPa` = as.numeric(`PM hPa`),
`PPT mm` = as.numeric(`PPT mm`),
`RS W/m2` = as.numeric(`RS W/m2`)
) |>
select(-`Període TU`, -date)A continuació es mostra un resum estadístic del conjunt de dades després de la conversió de tipus.
## Nom estació Codi estació Comarca
## Albesa : 17472 C6 : 17472 Segrià : 192192
## Alcarràs: 17472 C8 : 17472 Alt Empordà : 154656
## Alfarràs: 17472 C9 : 17472 Noguera : 139776
## Algerri : 17472 CC : 17472 Vallès Occidental: 121968
## Alguaire: 17472 CG : 17472 Osona : 118560
## Amposta : 17472 CI : 17472 Pallars Sobirà : 111936
## (Other) :3146831 (Other):3146831 (Other) :2412575
## Municipi Latitud Longitud
## Barcelona : 52367 Min. :40.56 Min. :0.3056
## El Prat de Llobregat: 51696 1st Qu.:41.36 1st Qu.:0.8818
## Lleida : 34944 Median :41.68 Median :1.5212
## Vielha e Mijaran : 34848 Mean :41.71 Mean :1.5652
## Alt Àneu : 24576 3rd Qu.:42.09 3rd Qu.:2.1552
## Albesa : 17472 Max. :42.77 Max. :3.1815
## (Other) :3035760
## Altitud (m) Data alta TM °C TX °C
## Min. : 0.0 Min. :1988-08-31 Min. :-15.10 Min. :-14.90
## 1st Qu.: 148.0 1st Qu.:1996-02-29 1st Qu.: 8.10 1st Qu.: 8.40
## Median : 325.0 Median :2000-06-22 Median : 13.80 Median : 14.20
## Mean : 523.9 Mean :2003-05-31 Mean : 14.24 Mean : 14.66
## 3rd Qu.: 684.0 3rd Qu.:2010-01-26 3rd Qu.: 20.40 3rd Qu.: 20.80
## Max. :2535.0 Max. :2025-07-30 Max. : 43.40 Max. : 43.80
## NA's :87560 NA's :88947
## TN °C HRM % PPT mm VVM (2 m) km/h
## Min. :-15.30 Min. : 2.00 Min. : 0.000 Min. : 0.00
## 1st Qu.: 7.70 1st Qu.: 57.00 1st Qu.: 0.000 1st Qu.: 1.80
## Median : 13.40 Median : 75.00 Median : 0.000 Median : 3.60
## Mean : 13.84 Mean : 72.49 Mean : 0.037 Mean : 4.63
## 3rd Qu.: 20.00 3rd Qu.: 91.00 3rd Qu.: 0.000 3rd Qu.: 6.50
## Max. : 43.00 Max. :100.00 Max. :63.700 Max. :57.20
## NA's :88933 NA's :88167 NA's :34765 NA's :2416412
## DVM (2 m) graus VVX (2 m) km/h RS W/m2 VVM (6 m) km/h
## Min. : 0.0 Min. : 0.00 Min. : 0.0 Min. : 0.00
## 1st Qu.:102.0 1st Qu.: 5.40 1st Qu.: 0.0 1st Qu.: 2.90
## Median :192.0 Median : 9.70 Median : 4.0 Median : 6.10
## Mean :189.3 Mean : 11.74 Mean :181.4 Mean : 7.68
## 3rd Qu.:278.0 3rd Qu.: 16.20 3rd Qu.:312.0 3rd Qu.:10.80
## Max. :360.0 Max. :103.70 Max. :999.0 Max. :98.30
## NA's :2416856 NA's :2416448 NA's :635082 NA's :3035498
## DVM (6 m) graus VVX (6 m) km/h VVM (10 m) km/h DVM (10 m) graus
## Min. : 0.0 Min. : 0.00 Min. : -0.70 Min. : 0.0
## 1st Qu.:118.0 1st Qu.: 8.30 1st Qu.: 3.60 1st Qu.: 99.0
## Median :227.0 Median : 14.80 Median : 6.80 Median :197.0
## Mean :204.3 Mean : 17.23 Mean : 8.67 Mean :188.2
## 3rd Qu.:285.0 3rd Qu.: 23.00 3rd Qu.: 11.50 3rd Qu.:276.0
## Max. :360.0 Max. :143.30 Max. :123.10 Max. :360.0
## NA's :3036151 NA's :3035498 NA's :1534470 NA's :1535904
## VVX (10 m) km/h PM hPa GN cm
## Min. : 0.00 Min. : 829.7 Min. : -2.00
## 1st Qu.: 8.30 1st Qu.:1013.3 1st Qu.: 0.00
## Median : 14.00 Median :1017.2 Median : 0.00
## Mean : 17.05 Mean :1011.1 Mean : 13.28
## 3rd Qu.: 22.70 3rd Qu.:1020.7 3rd Qu.: 5.00
## Max. :173.90 Max. :1046.6 Max. :178.00
## NA's :1534563 NA's :1895297 NA's :2914019
## Data i hora
## Min. :2024-12-05 00:00:00
## 1st Qu.:2025-03-06 11:00:00
## Median :2025-06-05 12:00:00
## Mean :2025-06-05 14:48:20
## 3rd Qu.:2025-09-05 09:00:00
## Max. :2025-12-03 23:30:00
##
A causa que les estacions meteorològiques són dispositius electrònics que poden fallar o tenir problemes tècnics, és comú trobar valors perduts en els conjunts de dades meteorològiques. Aquests valors perduts poden ser deguts a diversos motius, com ara errors en la transmissió de dades, problemes amb els sensors, o condicions meteorològiques extremes que impedeixen la recollida de dades.
Per tal de garantir la qualitat i la fiabilitat de l’anàlisi, els valors perduts s’imputaran utilitzant diferents tècniques segons la variable i el context. No obstant això, s’utilitzarà l’anàlisi de valors perduts per comprendre millor la distribució i el patró dels valors perduts en el conjunt de dades.
La majoria de les estacions meteorològiques estan distribuïdes per tota la geografia de Catalunya. En les següents gràfiques es mostren les ubicacions de les estacions meteorològiques sobre els límits administratius de Catalunya.
Abans de tot, eliminen els valors inicials i finals de les estacions quan són NA.
## [1] "Removing leading NAs for station code: YV"
## [1] "Removing leading NAs for station code: YX"
## [1] "Removing trailing NAs for station code: D5"
En la següent gràfica es mostra un mapa de calor dels valors perduts en el conjunt de dades.
##
## Variables sorted by number of missings:
## Variable Count
## DVM (6 m) graus 0.93372218
## VVM (6 m) km/h 0.93352136
## VVX (6 m) km/h 0.93352136
## GN cm 0.89616213
## DVM (2 m) graus 0.74326633
## VVX (2 m) km/h 0.74314086
## VVM (2 m) km/h 0.74312979
## PM hPa 0.58286788
## DVM (10 m) graus 0.47234139
## VVX (10 m) km/h 0.47192899
## VVM (10 m) km/h 0.47190039
## RS W/m2 0.19530570
## TX °C 0.02734923
## TN °C 0.02734492
## HRM % 0.02710935
## TM °C 0.02692267
## PPT mm 0.01068628
## Nom estació 0.00000000
## Codi estació 0.00000000
## Comarca 0.00000000
## Municipi 0.00000000
## Latitud 0.00000000
## Longitud 0.00000000
## Altitud (m) 0.00000000
## Data alta 0.00000000
## Data i hora 0.00000000
Les variables amb un percentatge de valors perduts igual a \(0.00000000\) no tenen valors perduts:
## [1] "Nom estació" "Codi estació" "Comarca" "Municipi" "Latitud"
## [6] "Longitud" "Altitud (m)" "Data alta" "Data i hora"
En la gràfica es mostra la matriu de correlació entre les variables numèriques del conjunt de dades, per tal de veure si hi ha alguna variable correlacionada que pugui ajudar en la imputació dels valors perduts. S’exclouen les variables categòriques i les variables que tenen més del 20% de valors perduts.
En els següents subapartats s’analitzaran el valors perduts de cada variable, per ordre de més a menys valors perduts. En el recompte s’han exclòs les estacions que tenen gairebé tots els valors perduts (>17.000) o bé no tenen cap valor perdut (0).
PPT mmEn la variable PPT mm, els valors perduts es consideren
com a zero, ja que aquest és el valor que pren la precipitació quan no
hi ha pluja, una vegada s’ha comprovat que els valors perduts
coincideixen amb períodes sense precipitació.
TM ºCEn la variable TM °C, s’utilitza la imputació amb
interpolació estacional per als valors perduts, ja que aquesta tècnica
és adequada per a sèries temporals amb patrons estacionals, com és el
cas de les dades de temperatura.
HRM %En la variable HRM %, s’utilitza la imputació
interpolació estacional per als valors perduts, ja que aquesta tècnica
és adequada per a sèries temporals amb patrons estacionals, com és el
cas de les dades d’humitat relativa.
GN cmEn la variable GN cm, els valors perduts s’imputen
mitjançant la interpolació no estacional, ja que aquesta tècnica
d’imputació és adequada per a sèries temporals sense patrons
estacionals.
PM hPaEn la variable PM hPa, s’utilitza la imputació basada en
les estacions veïnes més properes geogràficament, ja que la pressió
atmosfèrica tendeix a ser similar en ubicacions properes.
VVM (10 m) km/hEn la variable VVM (10 m) km/h, s’utilitza la imputació
basada en interpolació estacional per a les estacions amb menys de 500
valors perduts.
VVX (10 m) km/hEn la variable VVM (10 m) km/h, s’utilitza la imputació
basada en interpolació estacional per a les estacions amb menys de 500
valors perduts.
RS W/m2En la variable RS W/m2, s’utilitza la imputació amb
interpolació estacional per als valors perduts, ja que aquesta tècnica
és adequada per a sèries temporals amb patrons estacionals, com és el
cas de les dades de radiació solar.
No s’han detectat valors anòmals en les variables numèriques.
Les velocitats del vent, les direccions del vent i les temperatures no presenten valors extrems segons els criteris establerts.
Les variables geogràfiques no presenten valors extrems segons els criteris establerts.
Les altres variables numèriques no presenten valors extrems segons els criteris establerts.
# Eliminem les variables innecessàries del dataset
dataset_measurements <- dataset_measurements[, c(
"Codi estació", "Data i hora", "Altitud (m)", "Longitud", "Latitud",
"PPT mm", "TM °C", "HRM %", "RS W/m2", "PM hPa", "VVM (10 m) km/h",
"VVX (10 m) km/h", "GN cm"
)]
# Desem el conjunt de dades netejat en un fitxer CSV
write.csv(
dataset_measurements,
file = "../dataset/dataset_data_analysis.csv",
append = FALSE, # no afegim al final del fitxer
na = "NA", # com es representen els valors perduts
sep = ",", # separador de camps
dec = ".", # separador decimal
row.names = FALSE, # no escrivim els noms de les files
fileEncoding = "UTF-8", # codificació del fitxer
eol = "\n" # final de línia
)En aquest apartat volem calcular la Temperatura Mitjana (TM °C) en funció de les variables que ens proporciona el Meteocat, el mes i l’hora. Primer crearem un model de regressió lineal amb totes les variables numèriques i després veurem la multicol·linealitat entre les variables. Després crearem un segon model de regressió lineal amb menys predictors per evitar la multicol·linealitat.
# Dataset numèric, afegim mes i hora
dataset_numeric <- dataset_measurements |>
select(
where(is.numeric),
`Data i hora`
)
# Convertir els mesos i les hores a una variable numerica
dataset_numeric$Mes <- month(dataset_numeric$`Data i hora`)
dataset_numeric$Hora <- hour(dataset_numeric$`Data i hora`)
# Model de regressió lineal per a la predicció de TM °C
model_regressio <- lm(
`TM °C` ~ `Altitud (m)` + Latitud + Longitud + `HRM %` + `RS W/m2` +
`PM hPa` + `PPT mm` + `VVM (10 m) km/h` + `VVX (10 m) km/h` + `GN cm` +
Mes + Hora,
data = dataset_numeric
)
# Mostrem el resumen del model de regressió lineal
summary(model_regressio)##
## Call:
## lm(formula = `TM °C` ~ `Altitud (m)` + Latitud + Longitud +
## `HRM %` + `RS W/m2` + `PM hPa` + `PPT mm` + `VVM (10 m) km/h` +
## `VVX (10 m) km/h` + `GN cm` + Mes + Hora, data = dataset_numeric)
##
## Residuals:
## Min 1Q Median 3Q Max
## -25.0307 -4.1994 -0.0839 4.5347 23.3601
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.898e+01 1.817e+00 48.982 < 2e-16 ***
## `Altitud (m)` -3.497e-03 3.684e-05 -94.928 < 2e-16 ***
## Latitud -1.664e+00 4.222e-02 -39.417 < 2e-16 ***
## Longitud 1.584e-01 2.452e-02 6.461 1.04e-10 ***
## `HRM %` -5.849e-02 6.137e-04 -95.313 < 2e-16 ***
## `RS W/m2` 1.024e-02 5.556e-05 184.254 < 2e-16 ***
## `PM hPa` -4.005e-03 2.457e-04 -16.301 < 2e-16 ***
## `PPT mm` 4.893e-01 2.535e-02 19.300 < 2e-16 ***
## `VVM (10 m) km/h` 4.774e-02 2.999e-03 15.921 < 2e-16 ***
## `VVX (10 m) km/h` -9.331e-02 1.918e-03 -48.655 < 2e-16 ***
## `GN cm` -6.389e-02 6.068e-04 -105.291 < 2e-16 ***
## Mes 2.901e-01 4.170e-03 69.567 < 2e-16 ***
## Hora 8.550e-02 1.970e-03 43.408 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.932 on 189943 degrees of freedom
## (3061690 observations deleted due to missingness)
## Multiple R-squared: 0.4124, Adjusted R-squared: 0.4123
## F-statistic: 1.111e+04 on 12 and 189943 DF, p-value: < 2.2e-16
# Obtenim els valors de VIF per al model de regressió lineal simple creat
vif_model_regressio <- vif(model_regressio)
# Canviem el nom de les files del VIF per a què siguin més llegibles
names(vif_model_regressio) <- c(
"Altitud", "Latitud", "Longitud", "HRM", "RS", "PM", "PPT", "VVM", "VVX",
"GN", "Mes", "Hora"
)
# Mostrem els valors de VIF en un taula ordenats de major a menor
sort(vif_model_regressio, decreasing = TRUE)## VVX VVM Latitud Altitud Longitud PM GN HRM
## 5.046499 4.967224 2.368867 1.960408 1.421967 1.271239 1.250743 1.142291
## Mes RS PPT Hora
## 1.104444 1.084090 1.035575 1.003018
Perquè les variables no presentin multicol·linealitat han de ser inferiors a 5.
Per tant, farem un segon model de regressió lineal amb menys predictors: eliminem la neu, vents (molts NA) i longitud.
# Creació del model de regressió més simple
model_regressio_simple <- lm(
`TM °C` ~ `Altitud (m)` + Latitud + Longitud + `HRM %` + `RS W/m2` +
`PPT mm` + `VVX (10 m) km/h` + Mes + Hora,
data = dataset_numeric
)
# Obtenim els coeficients del model de regressió lineal simple
coef_model_regressio_simple <- coef(model_regressio_simple)
# Canviem el nom dels coeficients per a què siguin més llegibles
names(coef_model_regressio_simple) <- c(
"Intercept", "Altitud", "Latitud", "Longitud", "HRM", "RS", "PPT", "VVX",
"Mes", "Hora"
)
# Mostrem el resum del model de regressió lineal simple
resum_model_regressio_simple <- summary(model_regressio_simple)
resum_model_regressio_simple##
## Call:
## lm(formula = `TM °C` ~ `Altitud (m)` + Latitud + Longitud +
## `HRM %` + `RS W/m2` + `PPT mm` + `VVX (10 m) km/h` + Mes +
## Hora, data = dataset_numeric)
##
## Residuals:
## Min 1Q Median 3Q Max
## -27.5524 -4.2362 0.0857 4.6754 20.4352
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.760e+01 6.476e-01 135.27 <2e-16 ***
## `Altitud (m)` -4.649e-03 1.122e-05 -414.53 <2e-16 ***
## Latitud -1.632e+00 1.578e-02 -103.41 <2e-16 ***
## Longitud 5.069e-01 8.163e-03 62.10 <2e-16 ***
## `HRM %` -1.177e-01 2.900e-04 -406.05 <2e-16 ***
## `RS W/m2` 1.096e-02 2.131e-05 514.23 <2e-16 ***
## `PPT mm` 5.402e-01 1.061e-02 50.94 <2e-16 ***
## `VVX (10 m) km/h` -5.028e-02 4.327e-04 -116.19 <2e-16 ***
## Mes 3.802e-01 1.406e-03 270.47 <2e-16 ***
## Hora 1.139e-01 7.071e-04 161.09 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.128 on 1611246 degrees of freedom
## (1640390 observations deleted due to missingness)
## Multiple R-squared: 0.4861, Adjusted R-squared: 0.4861
## F-statistic: 1.694e+05 on 9 and 1611246 DF, p-value: < 2.2e-16
# Obtenim els valors de VIF per al model de regressió lineal simple
vif_model_regressio_simple <- vif(model_regressio_simple)
# Canviem el nom de les files del VIF per a què siguin més llegibles
names(vif_model_regressio_simple) <- c(
"Altitud", "Latitud", "Longitud", "HRM", "RS", "PPT", "VVX", "Mes", "Hora"
)
# Mostrem els valors de VIF en un taula ordenats de major a menor
sort(vif_model_regressio_simple, decreasing = TRUE)## Latitud Altitud Longitud HRM RS VVX Hora PPT
## 2.486951 2.077845 1.675162 1.558180 1.411310 1.207702 1.027991 1.018368
## Mes
## 1.004381
Fem servir el PCA per reduir la dimensionalitat
# Ens quedem amb les variables continues, no amb les temporals que són cícliques
variables_continues <- c(
"Altitud (m)",
"Latitud",
"Longitud",
"HRM %",
"RS W/m2",
"PPT mm",
"VVX (10 m) km/h"
)
# Fem subset ometent valors NA
df_pca <- dataset_numeric[, c(variables_continues, "TM °C")]
df_pca <- na.omit(df_pca)
# Apliquem PCA
pca_resultat <- prcomp(
df_pca[, variables_continues],
center = TRUE, scale. = TRUE
)
# Mostrem la importància dels components
summary(pca_resultat)## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6 PC7
## Standard deviation 1.3315 1.2974 1.0685 1.0022 0.8600 0.66943 0.45819
## Proportion of Variance 0.2533 0.2405 0.1631 0.1435 0.1057 0.06402 0.02999
## Cumulative Proportion 0.2533 0.4937 0.6569 0.8003 0.9060 0.97001 1.00000
## PC1 PC2 PC3 PC4 PC5
## Altitud (m) 0.19083568 0.54398825 0.49980239 0.25583127 0.1500679
## Latitud 0.07700351 0.71944521 -0.09996889 0.04767065 0.1144227
## Longitud -0.07120927 0.39274413 -0.70021138 -0.29003237 -0.2425774
## HRM % -0.62629515 0.10361530 0.14357910 -0.01310692 -0.1284971
## RS W/m2 0.56464704 -0.12720369 -0.25491501 -0.06771749 0.4609906
## PPT mm -0.06691837 0.06982954 0.32483048 -0.89370610 0.2778619
## VVX (10 m) km/h 0.48685879 0.02084111 0.24247958 -0.21140258 -0.7741526
## PC6 PC7
## Altitud (m) -0.043560176 -0.572702883
## Latitud 0.024555327 0.671198381
## Longitud 0.006682246 -0.455387820
## HRM % -0.747444436 0.032354633
## RS W/m2 -0.618551050 -0.017548036
## PPT mm 0.095784964 -0.006190169
## VVX (10 m) km/h -0.216798406 0.112840597
En el diagrama de colze (Scree Plot) podem observar la variància explicada per cada component principal. Els dos primers components principals expliquen una gran part de la variància total (gairebé el 50%), i les següents components explicaran menys variància.
| Component Principal | Variància Explicada | % Variància |
|---|---|---|
| Altitud (m) | 1,77 | 25,3 |
| Latitud | 1,68 | 24,0 |
| Longitud | 1,14 | 16,3 |
| HRM % | 1,00 | 14,3 |
| RS W/m2 | 0,74 | 10,6 |
| PPT mm | 0,45 | 6,4 |
| VVX (10 m) km/h | 0,21 | 3,0 |
PC1 explica la màxima variància del conjunt de dades.
Un valor alt en PC1 indica una estació amb molta Radiació Solar (RS) i Vent Màxim (VVX), i baixa Humitat Relativa (HRM). Això es podria interpretar com a condicions de temps assolellat, sec i ventós.
PC2 explica la següent major quantitat de variància independent de PC2. Els pesos més alts i significatius són:
Aquest component representa clarament la geografia. Un valor alt en PC2 indica una estació amb una Latitud alta (Nord) i Altitud alta (muntanya/interior).
També cal destacar aquest component, que està gairebé totalment dominat per la Precipitació (PPT mm). Essencialment, PC4 aïlla la variabilitat lligada als episodis de pluja de la resta de factors climàtics.
Primer projectem la Temperatura Mitjana sobre els PCA1 i PCA2.
# Gràfic d'estacions per la Temperatura Mitjana
fviz_pca_ind(pca_resultat,
geom.ind = "point",
col.ind = df_pca$`TM °C`, # Pintem segons la temperatura
# Blau (fred) a Vermell (calent)
gradient.cols = c("cadetblue3", "bisque2", "salmon"),
legend.title = "Temp. Mitjana (°C)",
title = "Mapa climàtic: PC1 (meteorologia) vs PC2 (geografia)"
) +
theme_minimal()PCA1
Aquest eix separa les zones humides (esquerra) de zones assolellades i ventoses (dreta).
PCA2
Aquest eix és el que determina la temperatura segons la geografia: a més alçada i latitud hi ha més fred.
Anàlisis per quadrants
Gràfic Biplot
# Biplot de les variables i les observacions
fviz_pca_biplot(pca_resultat,
label = "var",
col.var = "black",
col.ind = df_pca$`TM °C`,
gradient.cols = c("cadetblue3", "bisque2", "salmon"),
repel = TRUE,
title = "Relació entre variables principals i la temperatura"
)El biplot mostra com les variables influeixen en els dos primers eixos, explicant conjuntament gairebé un 50% de la variabilitat: 25.4% el PC1 i 24% el PC2 respectivament. Corrobora els anàlisis previs.
Primerament aconseguim la mediana d’altituds.
mediana_global_altitud <- median(dataset_numeric$`Altitud (m)`, na.rm = TRUE)
mediana_global_altitud## [1] 325
Pregunta: Existeix una diferència significativa en la Humitat Relativa Mitjana (HRM %) entre les estacions de baixa altitud (\(\le 325\text{m}\)) i les d’alta altitud (\(\ge 325\text{m}\))?
dataset_grups <- dataset_numeric |>
select(`Altitud (m)`, `HRM %`) |>
na.omit() |>
mutate(Grup_Altitud = case_when(
`Altitud (m)` < 325 ~ "Baixa",
`Altitud (m)` >= 325 ~ "Alta",
TRUE ~ "Altres"
)) |>
filter(Grup_Altitud != "Altres")En una població de 189 individus, no podem aplicar el teorema del límit central, en el qual podem assumir una distrubució normal de les mitjanes en poblacions grans.
# Separa les dades en dos grups segons l'altitud
hrm_alta_altitud <- dataset_grups$`HRM %`[dataset_grups$Grup_Altitud == "Alta"]
hrm_baixa_altitud <- dataset_grups$`HRM %`[dataset_grups$Grup_Altitud == "Baixa"]
# Mostra la normalitat de les mostres en la mateixa gràfica
par(mfrow = c(1, 2))
qqnorm(hrm_alta_altitud, main = "Q-Q Plot HRM Alta Altitud")
qqline(hrm_alta_altitud, col = "red")
qqnorm(hrm_baixa_altitud, main = "Q-Q Plot HRM Baixa Altitud")
qqline(hrm_baixa_altitud, col = "red")par(mfrow = c(1, 1))
# Calcula asimetria i curtosi
c(skewness(hrm_alta_altitud), skewness(hrm_baixa_altitud))## [1] -0.5029054 -0.3531036
## [1] 2.302179 2.183348
Un cop comprovada la normalitat de les mostres (visualment amb els gràfics Q-Q; numericament amb l’asimetria: la normal té una asimetria de 0, una asimetria entre -0.5 i +0.5 s’acostuma a considerar simètrica en la pràctica, -0,53 indica una lleugera cua més llarga cap a l’esquerra, però res dramàtic; numèricament amb la curtosi: la normal té curtosi igual a 3, 2.30 és una mica més baixa, distribució lleugerament platicúrtica, però continua sent molt propera a la normal), abans d’aplicar el test d’hipòtesi de dues mostres independents sobre la humitat d’estacions d’alta i baixa altitud amb variàncies desconegudes, comprovem l’homoscedasticitat amb la prova d’igualtat de variàncies.
# Test d'homoscedasticitat
var_test <- var.test(
hrm_alta_altitud, hrm_baixa_altitud,
alternative = "two.sided"
)
if (var_test$p.value < 0.05) {
print("Les variàncies no són iguals, s'utilitza el test de Welch")
var_equal <- FALSE
} else {
print("Les variàncies són iguals, s'utilitza el test de Student")
var_equal <- TRUE
}## [1] "Les variàncies no són iguals, s'utilitza el test de Welch"
##
## F test to compare two variances
##
## data: hrm_alta_altitud and hrm_baixa_altitud
## F = 1.2213, num df = 1575629, denom df = 1588943, p-value < 2.2e-16
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
## 1.218593 1.223987
## sample estimates:
## ratio of variances
## 1.221286
# Prova T de Welch o Student segons homoscedasticitat
prova_t <- t.test(
hrm_alta_altitud, hrm_baixa_altitud,
alternative = "greater",
var.equal = var_equal
)
print(prova_t)##
## Welch Two Sample t-test
##
## data: hrm_alta_altitud and hrm_baixa_altitud
## t = 13.25, df = 3128091, p-value < 2.2e-16
## alternative hypothesis: true difference in means is greater than 0
## 95 percent confidence interval:
## 0.2749149 Inf
## sample estimates:
## mean of x mean of y
## 72.64778 72.33390
Accés al repositori amb el codi disponible al següent enllaç: https://github.com/norabolivar/PRACT1_Tipologia.git
L’enllaç al vídeo: Google Drive
| Contribucions | Signatura |
|---|---|
| Investigació prèvia | N.B., R.B. |
| Redacció de les respostes | N.B., R.B. |
| Desenvolupament del codi | N.B., R.B. |
| Participació al vídeo | N.B., R.B. |