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