Une comparaison entre les données de Montbéliard et et celles de Besançon complète l’étude des données météorologiques à Besançon d’août à octobre 2018. La station de Montbéliard fait partie du réseau StatIC (relevés amateurs) et du réseau “Météo à l’École”.

infoclimat <- read_rds("infoclimat.rds")
infoclimat_mont <- read_rds("infoclimat_mont.rds")

Relevés de la station Montbéliard

Observation chronologique

On va commencer par afficher les relevés sur une période de 3 jours au cœur de la période étudié (à partir du 1er septembre 2018) avec les données de la station amateur.

infoclimat_mont %>%
  gather(mesure, valeur, Température, pluie_heure, Humidité, vent_heure,
         direction, Pression) %>%
  filter(Heure > make_date(2018, 9, 1)) %>%
  filter(Heure < make_date(2018, 9, 4)) %>%
  ggplot(aes(x = Heure, y = valeur)) +
  facet_wrap(~ mesure, scales = "free_y") +
  geom_point(size = 1)
## Warning: Removed 356 rows containing missing values (geom_point).

Ça semble cohérent avec les données de Besançon mais le vent ne semble pas provenir des mêmes directions.

Vent

Observons la rose des vents (entre 22h et 5h UTC, 0h à 7h CET).

# compass rose
infoclimat_mont %>%
  filter(vent_heure != 0) %>%
  filter(Heure > make_date(2018, 8, 22)) %>%
  filter(Heure < make_date(2018, 10, 31)) %>%
  filter(hour(Heure) < 5 | 22 < hour(Heure)) %>%
  ggplot(aes(x = direction,
             fill = cut_number(pmax(0, jitter(vent_heure)), 5))) +
  geom_histogram(breaks = (0:16) * (360 / 16)) +
  scale_x_continuous(breaks = (0:3) * 90) +
  scale_fill_viridis_d("Wind speed") +
  coord_polar()

Les vents sont répartis différemment qu’à Besançon : sud/sud-est (avec la majeur partie des vents faibles) et nord/nord-ouest (avec la moitié des vents forts).

Pluie

Zoomons sur le 6 septembre qui était le jour le plus pluvieux à Besançon.

infoclimat_mont %>%
  gather(mesure, valeur, pluie_heure, pluie_inst) %>%
  filter(Heure > make_date(2018, 9, 6)) %>%
  filter(Heure < make_date(2018, 9, 7)) %>%
  ggplot(aes(x = Heure, y = valeur)) +
  facet_wrap(~ mesure, scales = "free_y", nrow = 2) +
  geom_point()
## Warning: Removed 249 rows containing missing values (geom_point).

Les deux types de relevés pour la pluie semblent cohérents.

pluie_data <- infoclimat_mont %>%
  mutate(Heure_heure = ceiling_date(Heure, "1 hour")) %>%
  group_by(Heure_heure) %>%
  summarise(pluie_heure = max(pluie_heure, na.rm = TRUE),
            pluie_inst_agg = sum(pluie_inst, na.rm = TRUE) / 6) %>%
  arrange(pluie_heure, desc(pluie_inst_agg))
pluie_data %>%
  filter(is.finite(pluie_heure)) %>%
  summarise(corr = cor(pluie_heure, pluie_inst_agg))
## # A tibble: 1 x 1
##    corr
##   <dbl>
## 1 0.929
pluie_data %>%
  ggplot(aes(x = pluie_heure, y = pluie_inst_agg, color = Heure_heure)) +
  geom_abline(slope = 1) +
  stat_smooth(method = "lm") +
  geom_jitter() +
  scale_x_log10() +
  scale_y_log10()
## Warning in self$trans$transform(x): production de NaN
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning in self$trans$transform(x): production de NaN
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 2142 rows containing non-finite values (stat_smooth).
## Warning: Removed 48 rows containing missing values (geom_point).

Les deux types de relevés sont plus corrélés que sur la station amateur à Besançon.

Comparaison et cohérence avec une station de Besançon

Évaluons la proximité avec les données de la station amateur de Besançon.

meteo <- infoclimat %>%
  full_join(infoclimat_mont, by = "Heure")
meteo %>%
  mutate(Pression = Pression.x - Pression.y,
         Température = Température.x - Température.y,
         Humidité = Humidité.x - Humidité.y,
         Pluie = ifelse(pluie_heure.x == 0 & pluie_heure.y == 0, NA,
                        pluie_heure.x - pluie_heure.y),
         pluie_inst = pluie_inst.x - pluie_inst.y,
         Direction = ifelse(vent_heure.x == 0 & vent_heure.y == 0, NA,
                            pmin((direction.x - direction.y + 360) %% 360,
                                 (direction.y - direction.x + 360) %% 360)),
         Vent = vent_heure.x - vent_heure.y) %>%
  select(Pression, Température, Humidité, Pluie, Direction, Vent) %>%
  summary()
##     Pression      Température         Humidité           Pluie        
##  Min.   :10.30   Min.   :-7.9000   Min.   :-51.000   Min.   :-21.400  
##  1st Qu.:12.70   1st Qu.:-0.3000   1st Qu.: -6.000   1st Qu.: -0.400  
##  Median :13.10   Median : 0.7000   Median : -1.000   Median : -0.200  
##  Mean   :13.12   Mean   : 0.9453   Mean   : -1.999   Mean   : -0.288  
##  3rd Qu.:13.50   3rd Qu.: 2.1000   3rd Qu.:  3.000   3rd Qu.:  0.200  
##  Max.   :16.10   Max.   :14.1000   Max.   : 36.000   Max.   :  3.800  
##  NA's   :364     NA's   :364       NA's   :364       NA's   :13086    
##    Direction           Vent        
##  Min.   :  0.00   Min.   :-19.000  
##  1st Qu.: 56.00   1st Qu.:  0.000  
##  Median : 91.00   Median :  2.000  
##  Mean   : 89.53   Mean   :  3.291  
##  3rd Qu.:123.00   3rd Qu.:  6.000  
##  Max.   :180.00   Max.   : 29.000  
##  NA's   :3235     NA's   :364

La température, l’humidité et la pluie sont sont assez proches. La pression semble être décalée (plus faible à Montbéliard). Pour ce qui est du vent, les directions sont cependant clairement différentes.

meteo %>%
  drop_na(Pression.x, Pression.y, Température.x, Température.y, Humidité.x,
          Humidité.y) %>%
  summarise(corr_pression = cor(Pression.x, Pression.y),
            corr_temp = cor(Température.x, Température.y),
            corr_humi = cor(Humidité.x, Humidité.y))
## # A tibble: 1 x 3
##   corr_pression corr_temp corr_humi
##           <dbl>     <dbl>     <dbl>
## 1         0.992     0.958     0.862

Les corrélations confirment certaines de ces observations.

Pluie

Groupons les données par nuit pour voir si cette agrégation permet d’avoir une cohérence dans les mesures météorologiques.

meteo %>%
  filter(hour(Heure) < 5 | 22 < hour(Heure)) %>%
  mutate(day = floor_date(Heure - hours(12), "1 day")) %>%
  group_by(day) %>%
  summarise(pluie.x = pmax(sum(pluie_inst.x, na.rm = TRUE) / 6,
                           sum(pluie_heure.x, na.rm = TRUE)),
            pluie.y = pmax(sum(pluie_inst.y, na.rm = TRUE) / 6,
                           sum(pluie_heure.y, na.rm = TRUE))) %>%
  filter(pluie.x != 0 | pluie.y != 0) %>%
  ggplot(aes(x = pluie.x, y = pluie.y, color = day)) +
  geom_jitter() +
  geom_abline(slope = 1)

Même en groupant sur la nuit, on obtient des cas où il ne pleut que sur l’un des sites.

Vent

Pour le vent, la présence de deux variables complique l’analyse. Commençons par la force.

meteo %>%
  filter(hour(Heure) < 5 | 22 < hour(Heure)) %>%
  mutate(day = floor_date(Heure - hours(12), "1 day")) %>%
  group_by(day) %>%
  summarise(vent_heure.x = mean(vent_heure.x, na.rm = TRUE),
            vent_heure.y = mean(vent_heure.y, na.rm = TRUE)) %>%
  ggplot(aes(x = vent_heure.x, y = vent_heure.y, color = day)) +
  geom_jitter() +
  geom_abline(slope = 1)

Les vents semblent beaucoup moins forts sur cette station à Montbéliard. Cela est peut-être lié à sa situation géographique. Elle est situé à quelques mètres (moins de 5) à l’ouest d’un bâtiment allant jusqu’à 3 étage. Ça peut aussi expliquer la rose des vents incohérentes avec ce qui a été mesuré à Besançon.

Conclusion

Pour ce qui est de la pression, la température et l’humidité, les données sont très cohérentes avec celles de Besançon. Par contre, pour la pluie, cela l’est moins, mais une agrégation au niveau de la nuit entière semble satisfaisante (il y a encore de la variabilité, mais ça peut s’expliquer par la distance séparant les 2 villes). Par contre, pour le vent, les données de la station de Montbéliard ne paraissent pas fiables, même après avoir été agrégées par nuit.

## R version 3.6.1 (2019-07-05)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 18.04.3 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/openblas/libblas.so.3
## LAPACK: /usr/lib/x86_64-linux-gnu/libopenblasp-r0.2.20.so
## 
## locale:
##  [1] LC_CTYPE=fr_FR.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=fr_FR.UTF-8        LC_COLLATE=fr_FR.UTF-8    
##  [5] LC_MONETARY=fr_FR.UTF-8    LC_MESSAGES=fr_FR.UTF-8   
##  [7] LC_PAPER=fr_FR.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=fr_FR.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] tidyr_0.8.3     readr_1.3.1     lubridate_1.7.4 ggplot2_3.2.0  
## [5] dplyr_0.8.3    
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_1.0.1        pillar_1.4.2      compiler_3.6.1   
##  [4] tools_3.6.1       zeallot_0.1.0     digest_0.6.20    
##  [7] evaluate_0.14     tibble_2.1.3      gtable_0.3.0     
## [10] viridisLite_0.3.0 pkgconfig_2.0.2   rlang_0.4.0      
## [13] cli_1.1.0         yaml_2.2.0        xfun_0.8         
## [16] withr_2.1.2       stringr_1.4.0     knitr_1.23       
## [19] vctrs_0.2.0       hms_0.5.0         grid_3.6.1       
## [22] tidyselect_0.2.5  glue_1.3.1        R6_2.4.0         
## [25] fansi_0.4.0       rmarkdown_1.14    purrr_0.3.2      
## [28] magrittr_1.5      scales_1.0.0      backports_1.1.4  
## [31] htmltools_0.3.6   assertthat_0.2.1  colorspace_1.4-1 
## [34] labeling_0.3      utf8_1.1.4        stringi_1.4.3    
## [37] lazyeval_0.2.2    munsell_0.5.0     crayon_1.3.4