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.

Introducció

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.

1. Pregunta d’estudi

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.

2. Descripció del conjunt de dades

2.1. Importació de les dades

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")
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.

2.2. Dimensions del dataset

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.

2.3. Diccionari de variables

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

2.4. Estadístiques descriptives

# 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")
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

3. Exploració inicial de les dades

3.1. Visualització inicial

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")
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.

4. Anàlisi descriptiva

# 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.")
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.")
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)"
  )
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)")

5. Conclusió preliminar i pròximes passes

5.1. Variables externes i dades addicionals

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.