Aquest document presenta una anàlisi descriptiva del conjunt de dades
meteorològiques incloses al fitxer dades_meteo.RData.
L’objectiu és explorar les seves característiques, dimensions i
distribucions, així com també generar gràfics exploratoris.
El conjunt de dades dades_meteo és un recull de dades
meteorològiques d’una setmana de desembre de l’any 2024. Aquestes dades
s’han extret d’un conjunt superior que conté les mostres que agafa
l’estació meteorològica d’un familiar d’un membre del grup cada mitja
hora.
Més concretament, hem escollit la setmana del 09/12/2024 al 15/12/2024 perquè és una data pròxima als dies que farem l’anàlisi del conjunt, i casualment hi ha dades i valors molt diversos que ens podran donar molt de joc en les observacions.
L’objectiu del projecte és aprendre a interactuar amb un conjunt de dades per resoldre diferents situacions estadístiques.
Per començar a treballar amb el conjunt de dades, i així trencar una mica el gel, ens hem plantejat la següent qüestió:
Aquest conjunt és perfecte per respondre aquesta pregunta perquè conté els paràmetres meteorològics que necessitem, la temperatura, la humitat, el vent i la precipitació, i de les mesures que s’han anat registrant al llarg de la setmana.
Per importar el conjunt de dades col·loquem el fitxer dins del directori del projecte i el carreguem executant la següent ordre:
load("dades_meteo.RData")
L’objecte del conjunt amb el que ens referirem d’ara en endavant serà
dades_meteo.
ls()
## [1] "dades_meteo"
El format original del fitxer era XLSX (Excel), però l’hem canviat a .RData per poder treballar amb R.
head(dades_meteo) %>% kable(caption = "Primeres files del dataset")
| Dia | Data | Hora | Temp | Temp_max | Temp_min | Pressio | Humitat | Rosada | Vent | Vent_max | Vent_dir | Vent_direccio | Temp_sensacio | Pluja |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Dilluns | 9/12/2024 | 00:30 | 4.4 | 4.6 | 4.3 | 1010.7 | 92 | 3.2 | 3.2 | 9.7 | 10 | SW | 4.3 | 0 |
| Dilluns | 9/12/2024 | 01:00 | 4.3 | 4.4 | 4.0 | 1010.4 | 92 | 3.1 | 1.6 | 6.4 | 6 | SE | 4.3 | 0 |
| Dilluns | 9/12/2024 | 01:30 | 3.9 | 4.2 | 3.6 | 1010.3 | 93 | 2.9 | 0.0 | 4.8 | 6 | SE | 3.9 | 0 |
| Dilluns | 9/12/2024 | 02:00 | 3.5 | 3.7 | 3.3 | 1010.4 | 94 | 2.6 | 3.2 | 6.4 | 9 | SSW | 3.3 | 0 |
| Dilluns | 9/12/2024 | 02:30 | 3.2 | 3.4 | 2.9 | 1010.3 | 95 | 2.5 | 1.6 | 8.0 | 9 | SSW | 3.2 | 0 |
| Dilluns | 9/12/2024 | 03:00 | 2.8 | 3.1 | 2.6 | 1010.3 | 96 | 2.2 | 1.6 | 6.4 | 9 | SSW | 2.8 | 0 |
Inicialment dades_meteo no disposava d’una columna amb
el nom dels dies de la setmana, i l’hem afegit per complir els
requeriments del projecte. Per contra, hem eliminat la columna del
període de mostra perquè es tractava del mateix interval (30 minuts) i
era una dada redundant.
El nostre conjunt de dades recull un total de 336 mostres de 15 paràmetres meteorològics.
# Vista ràpida del conjunt
glimpse(dades_meteo)
## Rows: 336
## Columns: 15
## $ Dia <chr> "Dilluns", "Dilluns", "Dilluns", "Dilluns", "Dilluns", "…
## $ Data <chr> "9/12/2024", "9/12/2024", "9/12/2024", "9/12/2024", "9/1…
## $ Hora <chr> "00:30", "01:00", "01:30", "02:00", "02:30", "03:00", "0…
## $ Temp <dbl> 4.4, 4.3, 3.9, 3.5, 3.2, 2.8, 2.6, 2.3, 2.0, 1.9, 2.0, 2…
## $ Temp_max <dbl> 4.6, 4.4, 4.2, 3.7, 3.4, 3.1, 2.8, 2.4, 2.2, 2.1, 2.2, 2…
## $ Temp_min <dbl> 4.3, 4.0, 3.6, 3.3, 2.9, 2.6, 2.3, 2.2, 1.8, 1.7, 1.8, 2…
## $ Pressio <dbl> 1010.7, 1010.4, 1010.3, 1010.4, 1010.3, 1010.3, 1010.2, …
## $ Humitat <dbl> 92, 92, 93, 94, 95, 96, 96, 97, 97, 97, 97, 97, 96, 96, …
## $ Rosada <dbl> 3.2, 3.1, 2.9, 2.6, 2.5, 2.2, 2.0, 1.9, 1.6, 1.5, 1.6, 1…
## $ Vent <dbl> 3.2, 1.6, 0.0, 3.2, 1.6, 1.6, 0.0, 1.6, 0.0, 1.6, 3.2, 1…
## $ Vent_max <dbl> 9.7, 6.4, 4.8, 6.4, 8.0, 6.4, 3.2, 6.4, 4.8, 9.7, 8.0, 8…
## $ Vent_dir <dbl> 10, 6, 6, 9, 9, 9, 9, 9, 14, 10, 10, 7, 10, 10, 9, 8, 8,…
## $ Vent_direccio <chr> "SW", "SE", "SE", "SSW", "SSW", "SSW", "SSW", "SSW", "NW…
## $ Temp_sensacio <dbl> 4.3, 4.3, 3.9, 3.3, 3.2, 2.8, 2.6, 2.3, 2.0, 1.9, 1.6, 2…
## $ Pluja <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
La unitat d’anàlisi del dataset és l’estació meteorològica.
| Variable | Tipus | Descripció | Valors possibles / rang |
|---|---|---|---|
| Dia | caràcter | Nom del dia de la setmana | Dilluns – Diumenge |
| Data | caràcter | Data en format dd/mm/aaaa | 09/12/2024 – 15/12/2024 |
| Hora | caràcter | Hora en format hh:mm | 00:00 – 23:30 |
| Temp | numèrica | Temperatura mitjana en ºC | 1.9 – 14.4 |
| Temp_max | numèrica | Temperatura màxima en ºC | 2.1 – 14.5 |
| Temp_min | numèrica | Temperatura mínima en ºC | 1.6 – 14.2 |
| Pressio | numèrica | Pressió atmosfèrica en hPa (o mbar) | 1010.0 – 1037.1 |
| Humitat | numèrica | Humitat relativa en % | 50 – 100 |
| Rosada | numèrica | Punt de rosada en ºC | 1.2 – 11.2 |
| Vent | numèrica | Velocitat mitjana del vent en km/h | 0 – 27,4 |
| Vent_max | numèrica | Velocitat màxima del vent en km/h | 1,6 – 59,5 |
| Vent_dir | numèrica | Direcció del vent codificada | 0 – 15 |
| Vent_direcció | caràcter | Direcció del vent cardinal | N – NNW |
| Temp_sensació | numèrica | Sensació de temperatura en ºC | 1,6 – 14,4 |
| Pluja | numèrica | Precipitació en mm (o l/m²) | 0 – 6,20 |
# Resum estadístic general
summary(dades_meteo)
## Dia Data Hora Temp
## Length:336 Length:336 Length:336 Min. : 1.900
## Class :character Class :character Class :character 1st Qu.: 6.100
## Mode :character Mode :character Mode :character Median : 8.100
## Mean : 7.776
## 3rd Qu.: 9.100
## Max. :14.400
## Temp_max Temp_min Pressio Humitat
## Min. : 2.100 Min. : 1.600 Min. :1010 Min. : 50.00
## 1st Qu.: 6.300 1st Qu.: 5.900 1st Qu.:1019 1st Qu.: 75.00
## Median : 8.300 Median : 7.900 Median :1022 Median : 96.00
## Mean : 8.011 Mean : 7.547 Mean :1022 Mean : 87.66
## 3rd Qu.: 9.300 3rd Qu.: 8.900 3rd Qu.:1025 3rd Qu.: 99.00
## Max. :14.500 Max. :14.200 Max. :1037 Max. :100.00
## Rosada Vent Vent_max Vent_dir
## Min. : 1.200 Min. : 0.000 Min. : 1.60 Min. : 0.000
## 1st Qu.: 3.100 1st Qu.: 1.600 1st Qu.: 6.40 1st Qu.: 0.000
## Median : 5.650 Median : 3.200 Median : 8.85 Median : 8.000
## Mean : 5.626 Mean : 5.099 Mean :12.87 Mean : 5.595
## 3rd Qu.: 8.100 3rd Qu.: 6.400 3rd Qu.:14.90 3rd Qu.: 9.000
## Max. :11.200 Max. :27.400 Max. :59.50 Max. :15.000
## Vent_direccio Temp_sensacio Pluja
## Length:336 Min. : 1.600 Min. :0.000
## Class :character 1st Qu.: 5.575 1st Qu.:0.000
## Mode :character Median : 7.050 Median :0.000
## Mean : 7.170 Mean :0.128
## 3rd Qu.: 8.700 3rd Qu.:0.000
## Max. :14.400 Max. :6.200
Els valors són tots complets, no hi ha cap valor NULL o perdut i tampoc hi ha valors estranys.
sum(is.na(dades_meteo))
## [1] 0
Per alguns càlculs amb la variable Hora, com per exemple, trobar la durada entre dues hores, l’haurem de transformar a una variable numèrica.
# Selecció de variables d'interès per a la pregunta
seleccio <- dades_meteo %>% select(Temp, Temp_sensacio, Humitat, Vent_direccio, Pluja)
# Taula resum amb format net
summary(seleccio) %>% kable(caption = "Resum estadístic de les variables meteorològiques seleccionades")
| Temp | Temp_sensacio | Humitat | Vent_direccio | Pluja | |
|---|---|---|---|---|---|
| Min. : 1.900 | Min. : 1.600 | Min. : 50.00 | Length:336 | Min. :0.000 | |
| 1st Qu.: 6.100 | 1st Qu.: 5.575 | 1st Qu.: 75.00 | Class :character | 1st Qu.:0.000 | |
| Median : 8.100 | Median : 7.050 | Median : 96.00 | Mode :character | Median :0.000 | |
| Mean : 7.776 | Mean : 7.170 | Mean : 87.66 | NA | Mean :0.128 | |
| 3rd Qu.: 9.100 | 3rd Qu.: 8.700 | 3rd Qu.: 99.00 | NA | 3rd Qu.:0.000 | |
| Max. :14.400 | Max. :14.400 | Max. :100.00 | NA | Max. :6.200 |
ggplot(dades_meteo, aes(x = Temp, y = Temp_sensacio, color = Humitat)) +
geom_point(alpha = 0.7, size = 2) +
# Afegim una línia de referència (y=x) vermella discontínua
# que indica igualtat entre temperatura i sensació.
# Si el punt està sobre la línia, Sensació = Real.
# Si està per sota, fa més fred del que marca el termòmetre.
geom_abline(intercept = 0, slope = 1, linetype = "dashed", color = "red") +
scale_color_viridis_c(option = "C") +
labs(
title = "Temperatura Real vs. Sensació Tèrmica",
x = "Temperatura Real (ºC)",
y = "Sensació Tèrmica (ºC)",
color = "Humitat (%)"
) +
theme_minimal()
Com podem veure en el següent gràfic, la sensació tèrmica generalment no supera la temperatura real i aquestes dues tendeixen a disminuir quan la humitat augmenta.
També podem veure que com menor és la humitat, major és la diferència entre la sensació tèrmica amb la temperatura real, essent la primera menor que la segona.
Ara bé, en funció de la base de dades amb la que treballem, la humitat no disminueix del 50%. Per tant, la fiabilitat dels resultats no té una precisió exacta.
# Creem una nova variable categòrica per Pluja
dades_meteo %>%
mutate(Estat = ifelse(Pluja > 0, "Pluja", "Sec")) %>%
group_by(Estat) %>%
summarise(
Observacions = n(),
Temperatura_mitjana = mean(Temp, na.rm = TRUE),
Sensacio_mitjana = mean(Temp_sensacio, na.rm = TRUE),
Diferencia_mitjana = mean(Temp - Temp_sensacio, na.rm = TRUE),
Humitat_mitjana = mean(Humitat, na.rm = TRUE)
) %>%
kable(digits = 2, caption = "Comparativa: Dies de pluja vs. Dies secs")
| Estat | Observacions | Temperatura_mitjana | Sensacio_mitjana | Diferencia_mitjana | Humitat_mitjana |
|---|---|---|---|---|---|
| Pluja | 33 | 8.32 | 7.68 | 0.63 | 99.00 |
| Sec | 303 | 7.72 | 7.11 | 0.60 | 86.43 |
Per altra banda, a la taula, podem veure quines mitjanes obtenim per les variables del conjunt, separant-les per les mesures on no ha plogut, i les que sí que ha plogut.
Podem veure que quan plou, tant la temperatura real com la sensació tèrmica són lleugerament superiors, i que la humitat és notablement superior a què quan no ha plogut. La diferència entre temperatura real i sensació tèrmica mitjana és gairebé la mateixa plogui o no plogui, per tant, la podem negligir.
Aquesta exploració ens ajuda a verificar que per la nostra pregunta inicial, la humitat i la pluja influeixen en certa manera en les altres variables gràcies al gràfic i a la taula, respectivament.
# Matriu de correlacions
# Quantifiquem la relació lineal entre les variables numèriques
vars_num <- dades_meteo %>% select(Temp, Temp_sensacio, Humitat, Pluja)
cor_matrix <- cor(vars_num, use = "complete.obs")
ggcorrplot(cor_matrix,
lab = TRUE,
type = "lower",
title = "Matriu de correlacions",
colors = c("#6D9EC1", "white", "#E46726"))
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## ℹ The deprecated feature was likely used in the ggcorrplot package.
## Please report the issue at <https://github.com/kassambara/ggcorrplot/issues>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
vars_num <- dades_meteo %>% select(Temp, Temp_sensacio, Humitat, Pluja)
cor_mat <- cor(vars_num, use = "complete.obs")
kable(round(cor_mat, 3), caption = "Matriu de correlacions entre temperatura, sensació, humitat i pluja.")
| Temp | Temp_sensacio | Humitat | Pluja | |
|---|---|---|---|---|
| Temp | 1.000 | 0.922 | -0.424 | 0.078 |
| Temp_sensacio | 0.922 | 1.000 | -0.176 | 0.088 |
| Humitat | -0.424 | -0.176 | 1.000 | 0.182 |
| Pluja | 0.078 | 0.088 | 0.182 | 1.000 |
# Influència de la direcció del vent en la sensació tèrmica
# Ordenem les direccions per la mediana de sensació per facilitar la lectura
dades_meteo %>%
mutate(Vent_direccio = fct_reorder(Vent_direccio, Temp_sensacio, .fun = median)) %>%
ggplot(aes(x = Vent_direccio, y = Temp_sensacio, fill = Vent_direccio)) +
geom_boxplot(alpha = 0.6, outlier.colour = "red") +
labs(
title = "Distribució de la sensació tèrmica segons la direcció del vent",
x = "Direcció del vent",
y = "Sensació tèrmica (ºC)"
) +
theme_minimal() +
theme(legend.position = "none", axis.text.x = element_text(angle = 45, hjust = 1))
# Relació Pluja i Humitat
# Com es comporta la humitat quan plou vs quan no plou?
# Assegurem que pluja es tracti com a factor per al gràfic
dades_meteo %>%
mutate(Pluja_factor = ifelse(Pluja > 0, "Amb Pluja", "Sense Pluja")) %>%
ggplot(aes(x = Humitat, fill = Pluja_factor)) +
geom_density(alpha = 0.5) +
labs(
title = "Densitat de la Humitat segons presència de Pluja",
x = "Humitat (%)",
fill = "Condició"
) +
theme_minimal()
ggplot(dades_meteo, aes(x = Temp)) +
geom_histogram(aes(y = after_stat(density)), bins = 30, alpha = 0.6, colour = "white") +
geom_density(color = "red", linewidth = 1) +
labs(
title = "Distribució de la temperatura real",
x = "Temperatura (°C)",
y = "Freqüència")
ggplot(dades_meteo, aes(x = Humitat)) +
geom_histogram(aes(y = after_stat(density)), bins = 30, alpha = 0.6, colour = "white") +
geom_density(color = "blue", linewidth = 1) +
labs(
title = "Distribució de la humitat relativa",
x = "Humitat (%)",
y = "Freqüència")
summary_tbl <- dades_meteo %>%
summarise(
Mostres = n(),
Temp_mitjana = mean(Temp),
Temp_sd = sd(Temp),
Sensacio_mitjana = mean(Temp_sensacio),
Humitat_mitjana = mean(Humitat),
Precipitacio_mitjana = mean(Pluja))
kable(summary_tbl, digits = 2, caption = "Resum inicial de temperatura, sensació, humitat i pluja.")
| Mostres | Temp_mitjana | Temp_sd | Sensacio_mitjana | Humitat_mitjana | Precipitacio_mitjana |
|---|---|---|---|---|---|
| 336 | 7.78 | 2.57 | 7.17 | 87.66 | 0.13 |
ggplot(dades_meteo, aes(x = Temp, y = Temp_sensacio)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE, colour = "red") +
labs(
x = "Temperatura real (°C)",
y = "Sensació de temperatura (°C)",
title = "Relació inicial entre temperatura real i sensació")
## `geom_smooth()` using formula = 'y ~ x'
ggplot(dades_meteo, aes(x = Humitat, y = Temp_sensacio)) +
geom_point(alpha = 0.5) +
geom_smooth(method = "lm", se = FALSE, colour = "red") +
labs(
x = "Humitat relativa (%)",
y = "Sensació de temperatura (°C)",
title = "Sensació de temperatura en funció de la humitat")
## `geom_smooth()` using formula = 'y ~ x'
dades_meteo %>%
mutate(
Estat_Temp = ifelse(Temp > (Temp_sensacio + 0.5),
"Temp > Sensació + 0.5",
"Temp ≤ Sensació + 0.5")
) %>%
group_by(Estat_Temp) %>%
summarise(
N_observacions = n(),
Mitjana_Temp = mean(Temp, na.rm = TRUE),
Mitjana_Sensacio = mean(Temp_sensacio, na.rm = TRUE),
Dif_Mitjana = mean(Temp - Temp_sensacio, na.rm = TRUE),
Humitat_Mitjana = mean(Humitat, na.rm = TRUE)
) %>%
knitr::kable(
digits = 2,
caption = "Comparativa: Quan la temperatura és superior a (sensació + 0.5)"
)
| Estat_Temp | N_observacions | Mitjana_Temp | Mitjana_Sensacio | Dif_Mitjana | Humitat_Mitjana |
|---|---|---|---|---|---|
| Temp > Sensació + 0.5 | 107 | 8.72 | 6.87 | 1.84 | 75.75 |
| Temp ≤ Sensació + 0.5 | 229 | 7.34 | 7.31 | 0.03 | 93.23 |
hist(dades_meteo$Temp, main = "Histograma de temperatura", xlab = "Temperatura", ylab = 'Freqüència')
boxplot(dades_meteo$Pressio, main = "Diagrama de caixa de la pressió")
ggplot(dades_meteo, aes(x = Temp, y = Rosada)) + geom_point(alpha = 0.6) +
labs(title = "Relació entre la temperatura i el punt de rosada", x = "Temperatura (°C)", y = "Punt de rosada (°C)")
barplot(dades_meteo$Vent_max, xlab = 'Vent_max (km/h)', main = "Diagrama de barres de les ràfegues de vent")
ggplot(dades_meteo, aes(x = Vent_max)) + geom_histogram(bins = 25, alpha = 0.7) +
labs(title = "Distribució de les ràfegues de vent", x = "Vent_max (km/h)", y = "Recompte")
ggplot(dades_meteo, aes(x = Data, y = Pluja)) + geom_col() +
labs(title = "Evolució temporal de la precipitació", y = "Pluja (mm)")
Amb totes aquestes dades i variables en fem més que suficient per poder analitzar el conjunt de dades i respondre la pregunta inicial. Sempre que l’interval de temps sobre el qual volem obtenir una resposta no superi la totalitat del nostre conjunt, és a dir, una setmana (09/12/2024 – 15/12/2024).
En el cas que hàgim de fer un estudi per una duració superior a una setmana, podríem obtenir més mesures a partir de la base de dades superior d’on s’ha extret aquest fragment.