Identifiez les différentes périodicités
Suite à une discussion avec votre cheffe Camille, vous vous êtes rendu compte que les données spatio-temporelles sont rarement analysées pour elles-mêmes, mais plutôt pour voir les variations dans le temps et l’espace des variables qualitatives et quantitatives.
Intuitivement vous vous attendez à avoir des températures plus hautes en été qu’en hiver. Ce savoir est basé sur votre connaissance de la cyclicité des températures. La cyclicité des températures peut être décomposée à plusieurs échelles temporelles :
Tendance journalière : les températures sont plus hautes en journée que la nuit.
Tendance mensuelle : les températures mesurées en janvier sont plus proches de celles de décembre et février.
Tendance saisonnière : les températures en été sont très éloignées de celles de l’hiver.
Les différences de température mesurées entre deux jours consécutifs sont assimilées au bruit. Cette décomposition est représentée dans la partie suivante.
De la même manière, vous vous attendez sûrement à ce que les températures à proximité de la mer Méditerranée soient supérieures à celles mesurées en Bretagne ou près de la mer du Nord.
Représentez les variables quantitatives dans le temps
Seules les mesures de température varient dans le temps, et cela tombe bien car c’est le sujet qui intéresse le plus vos collègues. En effet, Cara est intéressée par la variation des températures entre les départements et Anna par celle entre les mois.
Représentez l’évolution des températures sur les trois années
Afin de suivre l’évolution des températures sur les trois années à l’échelle d’un département, vous décidez de faire un test sur le département du Maine-et-Loire.
Vous allez utiliser la fonction geom_line()
du package {ggplot2}
afin de tracer la température moyenne en fonction de la date d’observation.
donnees_temperature |>
filter(departement == "Maine-et-Loire") |>
ggplot() +
aes(x = date_obs, y = tmoy) +
geom_line() +
ggtitle("Maine et Loire") +
theme_classic()
Vous décidez de rajouter les températures minimales en bleu et moyenne en rouge grâce à la même fonction.
donnees_temperature |>
filter(departement == "Maine-et-Loire") |>
ggplot() +
aes(x = date_obs, y = tmoy) +
geom_line() +
geom_line(aes(y = tmin), color = "blue") +
geom_line(aes(y = tmax), color = "red") +
ggtitle("Maine et Loire") +
ylab("Température") +
theme_classic()
Malheureusement, Cara n’est pas satisfaite de votre graphique. En effet, il ne permet pas aux visiteurs du site de comprendre d’un coup d'œil les évolutions de température au sein du Maine-et-Loire. Elle vous demande donc de n’afficher que les tendances et non les différences journalières. Vous utilisez alors la fonction geom_smooth()
pour lisser vos courbes.
donnees_temperature |>
filter(departement == "Maine-et-Loire") |>
ggplot() +
aes(x = date_obs, y = tmoy) +
geom_smooth(color = "black") +
geom_smooth(aes(y = tmin), color = "blue", se = FALSE) +
geom_smooth(aes(y = tmax), color = "red") +
ggtitle("Maine et Loire") +
ylab("Température") +
theme_classic()
Le résultat convient mieux mais une de vos collègues trouve cette visualisation :
Elle aimerait donc que vous fassiez un diagramme circulaire avec les températures.
Réalisez un radar plot pour comparer les températures moyennes
Vous allez donc avoir besoin du package {fmsb}
pour créer un graphique radar, aussi appelé toile d'araignée.
Pour pouvoir le faire, vous allez avoir besoin de calculer la température moyenne par mois et année grâce à la fonction summarise()
du package {dplyr}
, en groupant par mois et année grâce à group_by()
du même package :
representation_radar <- donnees_temperature |>
filter(departement == "Maine-et-Loire") |>
group_by(mois, annee) |>
summarise(moyenne = mean(tmoy))
Vous avez ensuite besoin de pivoter la table pour avoir une ligne par année et une colonne par mois grâce à la fonction pivot_wider()
du package {tidyr}
:
representation_radar <- donnees_temperature |>
filter(departement == "Maine-et-Loire") |>
group_by(mois, annee) |>
summarise(moyenne = mean(tmoy)) |>
pivot_wider(
names_from = mois,
values_from = moyenne
)
Puis ajoutez le nom de l’année en tant que nom de ligne grâce à l’utilisation de la fonction column_to_rownames()
du package {tibble}
:
representation_radar <- donnees_temperature |>
filter(departement == "Maine-et-Loire") |>
group_by(mois, annee) |>
summarise(
moyenne = mean(tmoy)
) |>
ungroup() |>
pivot_wider(
names_from = mois,
values_from = moyenne
) |>
column_to_rownames("annee")
Il faut ensuite ajouter les limites minimale et maximale pour les températures – donc selon le graphique réalisé précédemment, le minimum sera -5 et le maximum 35 en tant que première ligne – puis réaliser le graphique grâce à la fonction radarchart()
du package {fmsb}
:
rbind(
rep(35, 12),
rep(-5, 12),
representation_radar
) |>
radarchart()
Lors d’une pause repas, une de vos collègues vous demande si les températures moyennes montrent une augmentation au cours des trois années, comme le graphique semble le montrer. Vous lui répondez que vous allez tester et que vous lui répondrez en fin de journée.
Décomposez l’évolution de la température moyenne
Vous commencez donc par visualiser la périodicité grâce à la fonction decompose()
du package {base}
, après avoir transformé les températures moyennes du Maine-et-Loire en série temporelle grâce à la fonction ts()
du même package.
dplyr::filter(
donnees_temperature,
departement == "Maine-et-Loire"
)$tmoy |>
ts(frequency = 365) |>
decompose("additive") |>
plot()
La partie Trend
(tendance générale) montre une augmentation d’environ 1°C sur les trois ans.
Représentez la variation spatiale d’une variable
Lors de l’analyse univariée, vous avez représenté les coordonnées géographiques des différents chefs-lieux, donc vous avez représenté la variation spatiale d’une variable qualitative.
Dans cette section, vous allez apprendre à réaliser des cartes choroplèthes.
Une carte choroplèthe est une carte sur laquelle les zones sont colorées ou remplies en fonction d'une information.
L’information peut être qualitative, par exemple le niveau de densité de la population par département, ou quantitative, comme la température minimale enregistrée.
La carte choroplèthe peut être réalisée avec le package {ggplot2}
ou {leaflet}
.
Représentez la variation spatiale de la densité de population
Pour représenter la densité de population en fonction du département, vous allez pouvoir utiliser{ggplot2}
.
Il est nécessaire d’utiliser la couche département en l’important avec la fonction st_read()
du package {sf}
, à laquelle vous allez ajouter le niveau de densité de population tiré du jeu de données grâce à la fonction left_join()
de {dplyr}
. Il faut ensuite transformer le tableau créé en objet sf
grâce à la fonction st_transform()
de {sf}
:
departement <- st_read(
dsn = "data/departement",
layer = "DEPARTEMENT",
quiet = TRUE
) |>
left_join(
donnees_temperature |>
distinct(departement, densite_pop),
by = join_by(NOM == departement)
) |>
st_transform()
Pensez à utiliser la fonction summary()
pour vérifier qu’il n’y a pas de valeurs manquantes qui seraient apparues : summary(departement)
.
La représentation se fait ensuite grâce à la fonction geom_sf()
du package {ggplot2}
.
ggplot(departement) +
aes(fill = densite_pop) +
geom_sf() +
coord_sf(crs = 4326) +
theme(legend.position = "none") +
theme_classic()
Représentez la variation spatiale des températures en fonction du mois
Il paraît difficile de représenter l’intégralité des températures sur une seule carte. L’idée que votre collègue a eue est de calculer par département la température moyenne moyennée sur les trois ans. C’est la température que la carte montrera. Les températures extrêmes enregistrées seront présentées dans un pop-up.
Pour pouvoir faire cela, vous allez avoir besoin d’une table résumée comme avec la variation temporelle, grâce à summarise()
du package {dplyr}
, et de l’ajout des contours des départements comme précédemment avec {ggplot2}
.
departement_quanti <-
st_read(
dsn = "data/departement",
layer = "DEPARTEMENT"
) |>
inner_join(
donnees_temperature |>
group_by(departement) |>
summarise(
temperature_moyenne = mean(tmoy),
temperature_minimale = min(tmin),
temperature_maximale = max(tmax)
),
by = c("NOM" = "departement")
) |>
st_transform(crs = '+proj=longlat +datum=WGS84')
Une fois le jeu de données créé, il reste à faire la carte interactive grâce au package {leaflet}
, à la fonction addPolygons()
pour créer les polygones et à colorQuantile()
pour créer une échelle de couleurs en fonction des températures.
leaflet() |>
addTiles() |>
addPolygons(
data = departement_quanti,
color = ~ colorQuantile(
"YlOrRd",
temperature_moyenne)(temperature_moyenne),
stroke = 1,
opacity = 0.8,
label = ~ glue::glue("temperature minimal : {temperature_minimale} °C temperature maximal : {temperature_maximale} °C")
)
À vous de jouer
Contexte
Antoine est super content de votre réalisation, mais Anna vous rappelle que vous aviez décidé de réaliser une carte fixe par mois avec la température moyenne uniquement, et qui sera actualisée chaque mois pour ne présenter que le mois choisi, afin d’alléger le trafic sur le site internet.
Consignes
Vous devez donc générer 12 cartes fixes avec la température moyenne.
Pour ce faire, vous devez :
Reprendre les lignes ci-dessous pour faire la table
departement_quanti
en ajoutant lemois
dans la fonctiongroup_by()
en plus du département, et en ne calculant que la température moyenne dans la fonctionsummarise()
.Représenter ces données grâce au package
{ggplot2}
comme dans la carte de densité de population par département.
En résumé
L’ajout d’une dimension temporelle permet de prendre en compte la saisonnalité.
L’ajout d’une dimension spatiale est basé sur le type d’objet géographique : points, vecteurs et polygones.
L’ajout d’une dimension spatio-temporelle permet de mieux comprendre les données.
Les statistiques associées sont trop complexes pour ce cours.
Les graphiques produits sont intéressants.
Vos collègues sont ravis de votre travail et vous félicitent.
Il vous reste à vérifier que tous les points d’analyse du blueprint sont bien traités, et c’est ce que nous allons voir dans le dernier chapitre de ce cours !