# Oprération réalisée directement
1 + 2
[1] 3
Discussion : Avez-vous une expérience avec R ? Partagez-vous ces objectifs ? Quels sont vos commentaires à leur égard ?
L’interface comporte quatre fenêtres :
Sans entrer dans les détails, quelques notions élementaires pour ne pas être (trop) déroutés par les lignes de codes qui vont suivre.
On peut effectuer une opération directement :
# Oprération réalisée directement
1 + 2
[1] 3
Le plus souvent, on va assigner les valeurs à des objets :
# Stockage des termes de l'opération dans des variables
<- 1
a <- 2
b + b # Le résultat de l'opération est réalisé directement a
[1] 3
Le résultat peut lui-même être stocké dans un objet, qu’il faut appeler pour afficher :
<- a + b # Le résultat de l'opération est stocké dans un objet
c # l'objet est affiché c
[1] 3
Les opérations peuvent être “chainées” avec l’opérateur de “pipe” (tuyaux), qui s’écrit %>%
ou |>
qu’on peut lire en lisant “puis”.
library(tidyverse, quietly = TRUE)
"UN MOT" %>% # on commence par une chaîne de caractères (string)
str_to_lower() %>% # puis on la passe en minuscules
paste("puis un autre") # puis on lui accole une deuxième chaîne de caractères
[1] "un mot puis un autre"
Il existe différents raccourcis clavier pour faciliter la mise en forme et l’exécution du code :
mon_fichier.R
) qui exécutent du codemon_fichier.qmd
qui produisent en sortie :
Discussion : Quels sont les avantages et inconvénients du recours à R pour l’analyse de données ? Dans quels cas de figure s’agit-il d’une solution appropriée ?
Lors de l’ouverture d’un fichier mobilisant des librairies non encore installées, RStudio affiche dans un bandeau au-dessus dudit fichier une invitation à installer les librairies manquantes. Un autre moyen simple d’installer une librairie est d’utiliser le menu “packages” dans le panneau d’exploration (en bas à droite). Les librairies peuvent sinon être installées avec la commande install.packages(sf)
pour la librairie sf
par exemple.
# Chargement des librairies nécessaires
library(tidyverse)
library(geodata)
library(sf)
library(tmap)
library(wdpar)
library(gt)
library(dplyr)
library(lubridate)
library(tmap)
library(mapme.biodiversity)
library(DiagrammeR)
L’initiative WDPA (World Database on Protected Areas) est un projet international coordonné par l’UICN (Union internationale pour la conservation de la nature) et visant à recueillir, à gérer et à diffuser des informations sur les aires protégées à travers le monde. La base de données WDPA constitue une source d’information étendue sur les aires protégées, y compris les parcs nationaux, les réserves naturelles, les sites du patrimoine mondial, les aires marines protégées et d’autres types d’espaces préservés.Elle rassemble des données sur les limites géographiques, les statuts juridiques, les catégories de gestion, la taille, la biodiversité, les écosystèmes et d’autres caractéristiques des aires protégées.
# Téléchargement des données WDPA avec le package wdpar
# On teste si le fichier est présent localement
if (file.exists("data/WDPA/WDPA_Jun2023_SEN-shapefile.zip")) {
# S'il l'est, cette fonction lit le fichier existant
<- wdpa_read("data/WDPA/WDPA_Jun2023_SEN-shapefile.zip")
WDPA_Senegal else {
} # Sinon, cette fonction récupère le fichier en question
<- wdpa_fetch("Senegal", wait = TRUE,
WDPA_Senegal download_dir = "data/WDPA")
}
On charge de l’information géographique, il est important de connaître les caractéristiques de base des objets à savoir :
Quels types de géométrie ? Quel système de projection ?
# | tbl-cap: "Caractéristiques spatiales des données d'aires protégées WDPA du Sénégal"
# On crée une colonne pour connaître la géométrie de chaque observation (mutate)
# On trie les données en fonction de leur géométrie (group_by)
# On résume l'effectif total pour chaque catégorie de géométrie (summarise).
%>%
WDPA_Senegal mutate(geom_type = st_geometry_type(.)) %>%
group_by(geom_type) %>%
summarise(n = n()) %>%
st_drop_geometry() %>%
gt() # Cette fonction sert à produire un affichage "propre
geom_type | n |
---|---|
MULTIPOINT | 5 |
MULTIPOLYGON | 133 |
Afin d’avoir un aperçu synthétique des données manquantes, il est possible d’exécuter les commandes suivantes.
Pour rappel, la fonction gt() sert à produire de jolis tableaux. Elle arrive en fin de code, une fois qu’on a synthétisé ce que l’on veut retenir comme variables de notre tableau.
La fonction pivot_long() doit être exécutée avant d’utiliser gt() car le package traite la donnée en format “long” et non en format “large” comme c’est le cas pour le moment dans l’objet WDPA Senegal.
# Tableau de synthèse avec des indicateurs sur le jeu de données
%>%
WDPA_Senegal st_drop_geometry() %>% # Suppression de la colonne geometry
summarise("Nombre total d'aires protégées" = n(),
"Catégorie IUCN manquante" = sum(IUCN_CAT == "Not Reported"),
"Année de création manquante" = sum(STATUS_YR == 0)) %>%
pivot_longer(cols = everything(),
names_to = " ",
values_to = "Nombre d'aires") %>%
gt() %>% # Le package gt facilite la mise en forme des tableaux
tab_header("Valeurs manquantes dans les données WDPA pour le Sénégal") %>%
tab_source_note("Source : WDPA (juin 2023)")
Valeurs manquantes dans les données WDPA pour le Sénégal | |
Nombre d'aires | |
---|---|
Nombre total d'aires protégées | 138 |
Catégorie IUCN manquante | 101 |
Année de création manquante | 97 |
Source : WDPA (juin 2023) |
Exercice : Ajouter une colonne correspondant au nombre d’aires protégées pour lesquelles la variable gestionnaire est manquantes (colonne MANG_AUTH égale à “Not Reported”)
La table attributaire du WDPA est suffisamment renseignée pour pouvoir produire des cartes thématiques pour mettre en avant une variable de notre jeu de données.
# Cartes thématiques avec le package tmap
tmap_mode(mode = "view") # Pour des cartes thématiques
tm_shape(WDPA_Senegal) +
tm_polygons(col = "DESIG", alpha = 0.6,
title = "Catégories d'aires protégées au Sénégal",
id = "NAME",
popup.vars = c("Type" = "DESIG",
"Catégorie IUCN" = "IUCN_CAT",
"Surface déclarée" = "REP_AREA",
"Année du statut" = "STATUS_YR"))
Catégories d’aires protégées au Sénégal (Source : WDPA 2023)
Le package “mapme.biodiversity” facilite l’analyse de données statistiques sur les aires protégées partout dans le monde (Görgen and Bhandari 2023). Il permet l’importation d’un nombre important de base de données et le calcul d’indicateurs associés relatifs à la biodiversité qui peuvent être utilisés pour surveiller et évaluer l’efficacité des efforts de protection. Le processus est volontairement simple :
mermaid("
graph TB
AA(Définition des polygones d'analyse)
A(Initialisation du portefeuille)
B(Acquisition des ressources)
C(Calcul des indicateurs)
D(Analyse statistique avec R)
E(Export vers QGIS ou autre)
AA-->A
A-->B
B-->C
C-->D
C-->E
")
Processus de traitement avec mapme.biodiversity
Pour l’analyse des données géographiques, le package utilise sf pour l’exploitation des données vectorielles et terra pour les données rasters.
help(package = "mapme.biodiversity")
Le package permet de calculer, via une importation de données provenant de sources open data, des indicateurs, disponibles sur des intervalles de temps réguliers pour environ deux décennies (2020-2020).
Ces indicateurs permettent aux usagers d’analyser des dynamiques spatiales et temporelles relatives aux aires protégées.
Pour connaître les ressources et les indicateurs associés disponibles :
# Liste des indicateurs disponibles
names(available_indicators())
# active_fire_counts: Calculate active fire counts based on NASA FIRMS
#active_fire_properties: Calculate active fire properties based on NASA FIRMS polygons
# biome: Calculate biomes statistics (TEOW) based on WWF
# drought_indicator: Calculate drought indicator statistics
# ecoregion: Calculate terrestrial ecoregions statistics (TEOW) based on WWF
# landcover: Calculate area of different landcover classes
# mangroves_area: Calculate mangrove extent based on Global Mangrove Watch (GMW)
# population_count: Calculate population count statistics (Worldpop)
# precipitation_chirps: Calculate precipitation statistics based on CHIRPS
# precipitation_wc: Calculate precipitation statistics
# soilproperties: Calculate Zonal Soil Properties
# temperature_max_wc: Calculate maximum temperature statistics
# temperature_min_wc: Calculate minimum temperature statistics based on WorldClim
# traveltime: Calculate accessibility statistics
# treecover_area: Calculate treecover statistics
# treecover_area_and_emissions: Calculate treeloss statistics
# treecoverloss_emissions: Calculate emission statistics
# tri: Calculate Terrain Ruggedness Index (TRI) statistics
A la lecture de la liste, l’utilisateur choisit quels sont les indicateurs qui l’intéresse en fonction de ses objectifs d’analyse.
Plus de détails sur les indicateurs (source, unité, limites) sont consultables sur le site : https://mapme-initiative.github.io/mapme.biodiversity/reference/index.html
Une fois le choix de ressources et d’indicateurs effectué, il faut d’abord initier un portefeuille de la biodiversité. Ce principe de création de portefeuille est un traitement spécifique qu’on applique à un objet spatial sf.
sf
en géométries de type “polygone” avant d’appliquer la fonction init_portfolio()
. L’idée est d’avoir des indicateurs pour chaque partie de l’aire protégée. Il suffira ensuite de fusionner ces polygones pour avoir des résultats globaux pour les aires protégées composées de plusieurs polygones .*Chaque ligne de l’objet est alors considérée comme un actif unique dans le portefeuille pour lequel des indicateurs environnementaux seront calculés plus loin dans la chaîne de traitement. C’est-à-dire que le portefeuille produit des colonnes imbriquées pour chaque observation, car dans bien des cas, on peut avoir plusieurs valeurs (par année) pour une même observation, voire plusieurs variables.
Par exemple, le calcul de l’indicateur précipitations… plusieurs observations par année…
En créant le portefeuille, certaines vérifications préliminaires seront automatiquement effectuées, par exemple que le SRS de l’objet est EPSG:4326, sinon il sera transformé.
Certains paramètres globaux du portefeuille, tels que le répertoire de sortie pour les ensembles de données téléchargés, un répertoire temporaire pour les calculs intermédiaires, peuvent être définis par l’utilisateur pour avoir un contrôle plus précis du flux de travail. Cependant, ces paramètres sont également définis sur des valeurs par défaut sensibles et peuvent donc être omis lors de l’initialisation du portefeuille.
# Besoin de scinder les entités pour lesquelles on pourrait avoir plusieurs poluygones
<- WDPA_Senegal %>%
WDPA_Senegal filter(st_geometry_type(geometry) != "MULTIPOINT") %>%
st_cast("POLYGON")
# Création du portefuille.
<- init_portfolio(x = WDPA_Senegal,
WDPA_Senegal years = 2000:2020,
outdir = "data/mapme_Senegal",
add_resources = TRUE,
verbose = TRUE)
Une fois le portefeuille lancé, on peut récupérer les données de notre intérêt en ligne puis lancer le calcul d’indicateurs pour chaque observation de notre objet sf. Cela peut prendre un peu de temps en fonction du volume de données importées.
Jeu de données constitué par Global Mangrove Watch (GMW), dispositif de suivi animé par la Global Mangrove Alliance, qui associe notamment universités, ONG et le world Resource Institute. Il distribue des cartes de l’étendue des mangroves en 1996, pour chaque année entre 2007 et 2010, et pour chaque année entre 2015 et 2020.
# Données de Global Mangrove Watch (GMW) sur la surface de mangroves
<- get_resources(x = WDPA_Senegal, resources = "gmw")
WDPA_Senegal
if (file.exists("WDPA_mapme_mangrove.rds")) {
<- read_rds("WDPA_mapme_mangrove.rds")
WDPA_Senegal else {
} ::with_progress({ # Calcul des indicateurs GMW
progressr<- calc_indicators(WDPA_Senegal,
WDPA_Senegal indicators = "mangroves_area")
})write_rds(WDPA_Senegal, "WDPA_mapme_mangrove.rds")
}
Nous allons maintenant récupérer les données brutes téléchargées pour le suivi des mangroves, pour les années 2007 et 2020. Nous les superoposons afin de visualiser les zones qui étaient couvertes de mangrove en 2007 et qui ne le sont plus en 2020. Nous allons focaliser l’analyse sur le Parc National du Delta du Saloum.
# On filtre la base d'aires protégées pour garder le PN Delta du Saloum
<- WDPA_Senegal %>%
pn_saloum filter(DESIG == "Parc National" & NAME == "Delta du Saloum")
# Chargement des données de mangroves
<- st_read("data/mapme_Senegal/gmw/gmw-extent_2007.gpkg") %>%
mgv_senegal_07 st_intersection(pn_saloum)
Reading layer `gmw-extent_2007' from data source
`/home/onyxia/work/JUMI_R/data/mapme_Senegal/gmw/gmw-extent_2007.gpkg'
using driver `GPKG'
Simple feature collection with 6378 features and 3 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -17.08911 ymin: 12.34933 xmax: -16.04467 ymax: 16.20511
Geodetic CRS: WGS 84
<- st_read("data/mapme_Senegal/gmw/gmw-extent_2020.gpkg") %>%
mgv_senegal_20 st_intersection(pn_saloum)
Reading layer `gmw-extent_2020' from data source
`/home/onyxia/work/JUMI_R/data/mapme_Senegal/gmw/gmw-extent_2020.gpkg'
using driver `GPKG'
Simple feature collection with 6139 features and 3 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -17.08911 ymin: 12.34933 xmax: -16.04467 ymax: 16.20489
Geodetic CRS: WGS 84
# Création d'une carte thématique
tmap_mode("view")
tm_shape(mgv_senegal_07) +
tm_fill(col = "red") +
tm_shape(mgv_senegal_20) +
tm_fill(col = "darkgreen")
Perte de surfaces de mangrove entre 2007 et 2020 (Source: GMW)
Une fois que l’indicateur a été calculé individuellement pour toutes les aires protégées, les données apparaîssent sous la forme d’une colonne de liste imbriquée à dans chaque cellule de la colonne l’objet d’origine. Si on a plusieurs indicateurs, on aura plusieurs colonnes avec des listes ayant une, deux ou plusieurs variables.
Par exemple, ceci est le contenu de la cellule “mangroves_area” de la deuxième ligne du tableau des aires protégées (correspondant au parc naturel du Delta du Saloum) :
# On récupère les données
"mangroves_area"]][[2]] %>%
WDPA_Senegal[[gt()
mangrove_extent | year |
---|---|
5025.219 | 2007 |
5021.317 | 2008 |
5011.101 | 2009 |
4979.966 | 2010 |
4895.599 | 2015 |
4847.650 | 2016 |
4829.719 | 2017 |
4827.473 | 2018 |
4821.841 | 2019 |
4806.545 | 2020 |
Cette imbrication n’est pas toujours effectuée, si par exemple on n’a qu’une année. Par exemple, pour les variables calculées ici (surface de mangrove), on ne cherche qu’une valeur par observation. On va donc désimbriquer les données à l’aide de la fonction unnest() et ne garder qu’une seule année
On doit aussi se rappeler que les aires protégées sont parfois composées de plusieurs polygones disjoints et que précédemment, pour l’utilisation de mapme.biodiversity, on a calculé chaque indicateur pour chaque polygone séparément. Pour chaque aire protégée, on va donc faire la moyenne de ces indicateurs, pondérée par la surface respective de chaque polygone.
# Désimbrication des données des colonnes calculées
<- WDPA_Senegal %>%
WDPA_stats unnest(c(mangroves_area)) %>%
filter(year == 2020) %>% # On ne garde que l'année 2020
st_drop_geometry() %>%
select(-assetid, -year) %>%
group_by(across(-mangrove_extent)) %>%
summarise(mangrove_extent = sum(mangrove_extent))
Exercice : Sélectionner les aires protégées qui ont des surfaces de mangove en 2020. Les représenter.