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

dades_meteo %>%
  summarise(Mostres = n(),
            Temp_mitjana = mean(Temp),
            Sensacio_mitjana = mean(Temp_sensacio),
            Humitat_mitjana = mean(Humitat),
            Precipitacio_mitjana = mean(Pluja)) %>%
  kable(digits = 2,
        caption = "Resum inicial de temperatura, sensació, humitat i pluja.")
Resum inicial de temperatura, sensació, humitat i pluja.
Mostres Temp_mitjana Sensacio_mitjana Humitat_mitjana Precipitacio_mitjana
336 7.78 7.17 87.66 0.13

En aquesta primera exploració es presenta una taula resum amb el nombre d’observacions i les mitjanes de temperatura real, sensació de temperatura, humitat i pluja, que permet tenir una visió global del conjunt de dades. Es complementa amb un núvol de punts de la temperatura real enfront de la sensació de temperatura, que actua com a gràfic inicial clau per a la pregunta d’estudi.

ggplot(dades_meteo, aes(x = Temp, y = Temp_sensacio)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "lm", se = FALSE, colour = "red") +
  labs(title = "Relació inicial entre temperatura real i sensació",
       x = "Temperatura real (°C)",
       y = "Sensació de temperatura (°C)")
## `geom_smooth()` using formula = 'y ~ x'

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()

Tant a la taula com en els gràfics s’observa que la temperatura real es troba al voltant dels 8 ºC de mitjana, amb una variabilitat moderada al llarg dels dies considerats. La sensació de temperatura és lleugerament inferior, presenta valors molt propers a la temperatura real sense arribar a sobrepassar-la, cosa que ja suggereix una relació gairebé lineal entre ambdues variables. També podem apreciar que aquestes temperatures tendeixen a disminuir per igual quan la humitat augmenta. En canvi, si aquesta disminueix, la diferència entre temperatures es fa més notable, sent la sensació de temperatura més baixa que la real. La precipitació mitjana és baixa, indicant que la major part del període és sec.

El núvol de punts mostra un patró clarament creixent: a mesura que augmenta la temperatura real, també ho fa la sensació tèrmica, amb poca dispersió al voltant de la recta d’ajust. No es detecten valors clarament extrems en aquesta relació, tot i que es podria revisar més a fons si hi ha observacions amb sensacions inusualment diferents de la temperatura per comprovar possibles errors o condicions meteorològiques especials.

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.

Aquesta exploració inicial connecta directament amb la pregunta d’estudi, ja que confirma que la sensació de temperatura està fortament vinculada a la temperatura real, i planteja com variables com la humitat, el vent o la pluja poden modular aquesta relació.

# 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),
    Direccio_mitjana = mean(Vent_dir, 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 Direccio_mitjana Diferencia_mitjana Humitat_mitjana
Pluja 33 8.32 7.68 3.7 0.63 99.00
Sec 303 7.72 7.11 5.8 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"))

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

La matriu de correlacions mostra una correlació molt alta i positiva entre la temperatura real i la sensació de temperatura (al voltant de 0.92), fet que confirma quantitativament el que ja es veia en el núvol de punts. La correlació de la humitat amb la sensació de temperatura és més feble i lleugerament negativa, mentre que la relació amb la pluja és també feble i positiva.

# Influència de la direcció del vent en la temperatura real
# Ordenem les direccions per la mediana de temperatura per facilitar la lectura
dades_meteo %>%
  mutate(Vent_direccio = fct_reorder(Vent_direccio, Temp, .fun = median)) %>%
  ggplot(aes(x = Vent_direccio, y = Temp, fill = Vent_direccio)) +
  geom_boxplot(alpha = 0.6, outlier.colour = "red") +
  labs(title = "Distribució de la temperatura real segons la direcció del vent",
       x = "Direcció del vent",
       y = "Temperatura real (ºC)") +
  theme_minimal() +
  theme(legend.position = "none", axis.text.x = element_text(angle = 45, hjust = 1))

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

Aquests dos gràfics, representen, per cadascun de les direccions del vent, la temperatura real i la sensació tèrmica respectivament. De forma individual l’únic que podem veure que pels vents SE (Sud-est) i ESE (Est-sud-est), tant la temperatura real com la sensació tèrmica té un valor mitjà notablement superior a la resta de direccions.

Mirant totes dues taules juntes, es pot observar que la diferència entre la temperatura real i la sensació tèrmica és gairebé nul·la, excepte pels vents del N (nord) i NNE (nord-nord-est) on es pot notar que la sensació és molt lleugerament inferior a la temperatura.

ggplot(dades_meteo, aes(x = Humitat, y = Temp_sensacio)) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = "lm", se = FALSE, colour = "red") +
  labs(title = "Sensació de temperatura en funció de la humitat",
       x = "Humitat relativa (%)",
       y = "Sensació de temperatura (°C)")
## `geom_smooth()` using formula = 'y ~ x'

En el diagrama de punts anterior observem la sensació de temperatura depenent del percentatge d’humitat relatiu on podem veure, gràcies a la línia de mitjana, que a mesura que la humitat creix, la sensació de temperatura disminueix lleument.

# 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 (%)",
       y = "Freqüència",
       fill = "Condició") +
  theme_minimal()

Aquest últim diagrama ens indica que a major precipitació major percentatge d’humitat relativa, aquesta era una informació esperable, però amb aquest gràfic la podem confirmar.

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

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)) %>%
  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

Amb aquesta taula podem plantejar la següent hipòtesi: És la humitat el que provoca aquesta petita diferència entre la temperatura real i la sensació tèrmica?

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.

Amb la nostra base de dades, en podem extreure les següents conclusions:

  • La direcció del vent afecta molt lleugerament les temperatures mesurades, tant de sensació com la real.

  • Com més baixa és la humitat, major és la diferència entre la sensació tèrmica i la temperatura real.

  • Quan plou, la sensació tèrmica i la temperatura real augmenten lleugerament.

La nostra base de dades ens podria generar alguna limitació pel fet que no conté cap variable continua sobre la qual mirar els canvis que pateixen les variables. El que hauríem de fer a continuació per solucionar això és el següent: Crear una variable continua a partir de l’hora i dia en què s’ha realitzat una mesura.