Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • ssplab/funathon2023/funathon_sujet2
  • lgaliana/funathon_sujet2
  • stef974/funathon_sujet2
  • krisso/funathon_sujet2
  • mgerradin/funathon_sujet2
  • carolinepinton/funathon_sujet2
  • jdurand/funathon-sujet-2-aura
  • tjobkel/funathon_sujet2
  • evanlebihan/funathon_sujet2
  • sgivois/funathon_sujet2
  • ameliamkd/funathon_sujet2
  • bpipaud/funathon_sujet2
  • vjurie/funathon_sujet2
  • iejulq/funathon_sujet2
  • sesquerre/funathon-sujet-2-se
  • julienpramil/funathon_sujet2
16 results
Show changes
Commits on Source (14)
# Funathon 2023 - Sujet 2
[![Onyxia](https://img.shields.io/badge/Launch-Datalab-orange?logo=R)](https://datalab.sspcloud.fr/launcher/ide/rstudio?autoLaunch=true&onyxia.friendlyName=%C2%ABSujet%202%C2%BB&init.personalInit=%C2%ABhttps%3A%2F%2Fraw.githubusercontent.com%2FInseeFrLab%2Ffunathon2023_sujet2%2Fmain%2Finit.sh%C2%BB)
## Explorer la géographie des cultures agricoles françaises
Ce sujet s'articule autour de la question suivante : dans quelle mesure notre système actuel de cultures est-il exposé au changement climatique ? Il est composé de plusieurs applications décrites ci-dessous qui sont disponible sur ce [site](https://inseefrlab.github.io/funathon2023_sujet2/).
Ce sujet s'articule autour de la question suivante : dans quelle mesure notre système actuel de cultures est-il exposé au changement climatique ? Il est composé de plusieurs applications décrites ci-dessous qui sont disponibles **sur ce [site](https://inseefrlab.github.io/funathon2023_sujet2/)**.
### Les données utilisées
......
......@@ -2116,6 +2116,40 @@
],
"Hash": "0b835f43939178a3cac6712fbe8cc2e8"
},
"shiny": {
"Package": "shiny",
"Version": "1.7.4",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R",
"R6",
"bslib",
"cachem",
"commonmark",
"crayon",
"ellipsis",
"fastmap",
"fontawesome",
"glue",
"grDevices",
"htmltools",
"httpuv",
"jsonlite",
"later",
"lifecycle",
"methods",
"mime",
"promises",
"rlang",
"sourcetools",
"tools",
"utils",
"withr",
"xtable"
],
"Hash": "c2eae3d8c670fa9dfa35a12066f4a1d5"
},
"snakecase": {
"Package": "snakecase",
"Version": "0.11.0",
......@@ -2128,6 +2162,16 @@
],
"Hash": "4079070fc210c7901c0832a3aeab894f"
},
"sourcetools": {
"Package": "sourcetools",
"Version": "0.1.7-1",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R"
],
"Hash": "5f5a7629f956619d519205ec475fe647"
},
"sp": {
"Package": "sp",
"Version": "1.6-0",
......@@ -2529,6 +2573,18 @@
],
"Hash": "7dc765ac9b909487326a7d471fdd3821"
},
"xtable": {
"Package": "xtable",
"Version": "1.8-4",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R",
"stats",
"utils"
],
"Hash": "b8acdf8af494d9ec19ccb2481a9b11c2"
},
"yaml": {
"Package": "yaml",
"Version": "2.3.7",
......
......@@ -25,7 +25,7 @@ Pour créer un service `PostgreSQL` sur le SSP Cloud, aller dans le catalogue de
Le serveur `PostgreSQL` est facilement accessible depuis n'importe quel service interactif (par exemple `RStudio`). Tous les langages de programmation disposent de librairies qui implémentent une interface avec `PostgreSQL`. En `R`, on peut par exemple utiliser la librairie `RPostgres`, basée sur la librairie `DBI`.
Ci-dessous, on crée l'objet `conn` qui va nous permettre de communiquer avec `PostgreSQL`. Les paramètres `user`, `password` et `host` sont disponibles dans le README du service `PostgreSQL` (le paramètre `host` figure dans l'URL du README et a pour valeur `postgresql-xxxxxx`). Ici, on choisit de stocker ces différentes valeurs dans des variables d'environnement, `USER_POSTGRES`, `PASS_POSTGRES` et `HOST_POSTGRES`, ce qui est spécifié dans le fichier `~/.Renviron`. Pour éditer ce fichier, `file.edit("~/.Renviron")` puis relancer la session (ctrl + maj + F10).
Ci-dessous, on crée l'objet `conn` qui va nous permettre de communiquer avec `PostgreSQL`. Les paramètres `user`, `password` et `host` sont disponibles dans le README du service `PostgreSQL` (le paramètre `host` figure dans l'URL du README et a pour valeur `postgresql-xxxxxx`). Ici, on choisit de stocker ces différentes valeurs dans des variables d'environnement, `USER_POSTGRESQL`, `PASS_POSTGRESQL` et `HOST_POSTGRESQL`, ce qui est spécifié dans le fichier `~/.Renviron`. Pour éditer ce fichier, `file.edit("~/.Renviron")` en y ajoutant les lignes `USER_POSTGRESQL = "xxx"`, etc. puis relancer la session (ctrl + maj + F10).
```{r}
#| label: connect-db
......@@ -102,5 +102,5 @@ plot(st_geometry(sf))
## Base de données à disposition
Dans toute la suite du sujet, on propose d'utiliser une base de données déjà préconfigurée, accessible depuis n'importe où sur le SSP Cloud. Pour accéder à cette base de données de la manière décrite ci-dessus, `HOST_POSTGRES` doit avoir pour valeur `postgresql-758156.projet-funathon`. Pour récupérer le nom d'utilisateur et le mot de passe, envoyer un message à Tom Seimandi (par mail ou sur Tchap). Dans la base de données `defaultdb`, les schémas `adminexpress`, `drias` et `rpg` contiennent les données mises à disposition pour traiter le sujet. Les participants ne disposent que des droits de lecture pour ces schémas (commande `SELECT`). Toutefois, le schéma `public` est disponible pour créer des tables temporaires, n'hésitez pas !
Dans toute la suite du sujet, on propose d'utiliser une base de données déjà préconfigurée, accessible depuis n'importe où sur le SSP Cloud. Pour accéder à cette base de données de la manière décrite ci-dessus, `HOST_POSTGRES` doit avoir pour valeur `postgresql-758156.projet-funathon`. Pour récupérer le nom d'utilisateur et le mot de passe, envoyer un message à Tom Seimandi (par mail ou sur Tchap). Dans la base de données `defaultdb`, les schémas `adminexpress`, `drias` et `rpg` contiennent les données mises à disposition pour traiter le sujet. Les participants ne disposent que des droits de lecture pour ces schémas (commande `SELECT`). Toutefois, le schéma `public` est disponible pour créer des tables temporaires, n'hésitez pas à le faire !
This diff is collapsed.
# Contexte et description du sujet {.unnumbered}
Ce sujet s'articule autour de la question suivante : dans quelle mesure notre système actuel de cultures est-il exposé au changement climatique ? Il est composé de plusieurs applications décrites ci-dessous et disponibles sur les pages suivantes. Ces applications sont des points de départ - n'hésitez pas à aller plus loin !
Ce sujet s'articule autour de la question suivante : dans quelle mesure notre système actuel de cultures est-il exposé au changement climatique ? Il est composé de plusieurs applications décrites ci-dessous et disponibles sur les pages suivantes. Ces applications sont des points de départ, tout comme les solutions proposées - n'hésitez pas à aller plus loin !
Avec ce sujet, vous allez pouvoir :
......@@ -8,11 +8,23 @@ Avec ce sujet, vous allez pouvoir :
- Manipuler des données spatiales : vecteurs et rasters avec les packages `sf`, `terra`, `stars`;
- Utiliser une base de données `PostgreSQL` et son extension `PostGIS`;
- Créer des visualisations avec `ggplot2`;
- Développer un tableau de bord interactif avec `Shiny`;
- Développer un tableau de bord interactif avec `shiny`;
- Utiliser le lissage spatial pour synthétiser des données géographiques avec `btb`;
- Estimer des tendances avec un modèle linéaire.
Pour traiter le sujet, commencez par restaurer les packages à utiliser avec `renv::restore()` (~10 min). Bien sûr si vous avez besoin de packages supplémentaires à un moment donné, n'hésitez pas à les installer !
### Mise en route {.unnumbered}
Avant tout, il faut qu'une personne dans l'équipe commence par *fork* ce [dépôt de code sur Gitlab](https://git.lab.sspcloud.fr/ssplab/funathon2023/funathon_sujet2), et donne les droits d'écriture sur le *fork* à ses partenaires (tout ceci est expliqué dans [cette vidéo](https://inseefrlab.github.io/funathon2023/additional.html) de présentation du Funathon). Tous les membres de l'équipe peuvent maintenant ouvrir un service `RStudio` sur le `SSP Cloud` et créer un nouveau projet à partir du dépôt *forké* (**`File`** > **`New project`** > **`Version Control`** > **`Git`**), sur lequel ils pourront pousser leur code !
Pour disposer de toutes les librairies nécessaires, il est possible de faire toutes les installations avec `renv::restore()` (~10 min). Bien sûr si vous avez besoin de packages supplémentaires à un moment donné, n'hésitez pas à les installer !
Pour traiter le sujet, nous vous laissons libres de vous organiser comme vous le souhaitez. Vous pouvez par exemple créer vous-mêmes vos scripts (par exemple un script par application et par personne, avant de mutualiser les avancées - sauf pour l'application `shiny` où nous suggérons explicitement de créer plusieurs scripts à placer dans un répertoire *ad hoc*), et lorsque vous en ressentez le besoin aller tirer des bouts de code des solutions que nous proposons sur ce site.
::: {.callout-note icon=false}
## Note sur l'accès à l'espace de stockage
Si vous lancez un service interactif `RStudio` au cours de la première journée et que utilisez le même lors de la seconde journée, vos identifiants permettant l'accès à l'espace de stockage du `SSP Cloud` auront expiré. Vous trouverez sur [cette page](https://datalab.sspcloud.fr/account/storage) des scripts (`R` notamment) permettant de mettre à jour les variables d'environnement concernées.
:::
### Les données utilisées {.unnumbered}
......@@ -28,7 +40,7 @@ Les données du RPG étant volumineuses, il faut pouvoir les requêter depuis un
### Etape 1 : Première manipulation du RPG {.unnumbered}
L'objectif de cette première étape est d'effectuer des premières requêtes géographiques permettant d'examiner les cultures à proximité d'un point géographique donné, de comparer la composition observée avec les compositions départementale, régionale, etc. Pour aller plus loin, on développera une interface graphique de type tableau de bord permettant d'obtenir ces informations interactivement en cliquant sur une carte.
L'objectif de cette étape est d'effectuer des premières requêtes géographiques permettant d'examiner les cultures à proximité d'un point géographique donné, de comparer la composition observée avec les compositions départementale et nationale. Pour aller plus loin, nous proposons de développer une interface graphique de type tableau de bord permettant d'obtenir ces informations interactivement en cliquant sur une carte.
### Etape 2 : Exposition des cultures au déficit de précipitations {.unnumbered}
......@@ -36,4 +48,4 @@ Cette deuxième étape est fortement inspirée de l'excellente [étude](https://
### Etape 3 : Evolution des cultures, lien avec le climat passé {.unnumbered}
Après avoir regardé vers l'avenir, il est temps de jeter un coup d'oeil dans le rétroviseur, et de regarder comment l'évolution des températures au cours des 40 dernières années a pu influencer certaines cultures en France. On estimera l'évolution des dates potentielles de récolte du maïs grain dans les différents bassins de production français depuis 1980.
Après avoir regardé vers l'avenir, il est temps de jeter un coup d'oeil dans le rétroviseur, et de regarder comment l'évolution des températures au cours des 40 dernières années a pu influencer certaines cultures en France. Nous estimerons l'évolution des dates potentielles de récolte du maïs grain dans les différents bassins de production français depuis 1980.
......@@ -57,6 +57,13 @@ Des données anciennes existent pour certaines cultures, par exemple pour la vig
- [Admin Express](https://geoservices.ign.fr/adminexpress) est le référentiel des limites administratives de l'IGN.
Des tables simplifiées des communes et des régions 2023 ont été intégrées dans la base PostgreSQL/PostGIS.
### Scénario
1. Définir les principaux bassins de production du maïs grain à partir du RPG ;
2. extraire les températures journalières sur un point central de chaque bassin ;
3. calculer les dates de récolte théoriques pour chaque bassin et chaque année ;
4. estimer les tendances par bassin.
## Préparation
......@@ -67,8 +74,8 @@ Le pas-à-pas détaillé est décrit sur [la page de démarrage](app0.html), mai
- Restaurer les packages à utiliser : `renv::restore()` (11 min).
- Si ce n'est pas déjà fait, il faut avoir préalablement copié les données depuis le stockage MinIO :
`$ mc cp -r s3/projet-funathon/2023/sujet2/diffusion/era5/ funathon2023_sujet2/data/era5/`
- Pour se connecter à la base PostgreSQL, il faudra avoir défini votre mot de passe comme variable d'environnement par exemple en ajoutant `PASS_POSTGRESQL=xxxx` dans le fichier *\~/.Renviron* : `file.edit("~/.Renviron")` et relancer la session (ctrl+maj+F10).
`mc cp -r s3/projet-funathon/2023/sujet2/diffusion/era5/ ~/work/funathon2023_sujet2/data/era5/`
- Pour se connecter à la base PostgreSQL, il faudra avoir défini les bonnes variables d'environnements par exemple en ajoutant `PASS_POSTGRESQL = "xxxx"`, etc. dans le fichier *\~/.Renviron* : `file.edit("~/.Renviron")` et en ayant relancé la session (ctrl+maj+F10).
```{r}
#| label: setup
......@@ -99,20 +106,48 @@ options(OutDec = ",",
# Connexion à la base PostgreSQL
cnx <- dbConnect(Postgres(),
user = "projet-funathon",
user = Sys.getenv("USER_POSTGRESQL"),
password = Sys.getenv("PASS_POSTGRESQL"),
host = "postgresql-758156",
host = Sys.getenv("HOST_POSTGRESQL"),
dbname = "defaultdb",
port = 5432,
check_interrupts = TRUE)
```
Vous pouvez vous contenter de la description succinte du scénario ci-dessus pour vous lancer ou poursuivre la lecture pour être plus guidé.
Vous pouvez aussi bien sûr afficher le code si vous êtes bloqués, si vous voulez des pistes de démarrage ou si vous souhaitez comparer nos approches.
## Définition des bassins de production du maïs grain
Le maïs grain (code culture : `MIS`) représente, avec une surface de 1,5·10^6^ ha, la moitié du maïs cultivé[^2] en France en 2021, soit environ 6 % des surfaces déclarées à la PAC.
```{r}
#| label: donnee-generales-mais
#| cache: true
surf_mais <- dbGetQuery(cnx, "
SELECT
code_cultu,
SUM(surf_parc) AS surf_ha
FROM rpg.parcelles
WHERE code_cultu IN ('MIS', 'MIE', 'MID')
GROUP BY code_cultu")
surf_tot_pac <- dbGetQuery(cnx, "
SELECT
SUM(surf_parc) AS surf_ha
FROM rpg.parcelles")
surf <- function(code){
surf_mais %>%
filter(code_cultu == code) %>%
pull(surf_ha)
}
```
Le maïs grain (code culture : `MIS`) représente, avec une surface de `r round(surf("MIS") / 1e6, 2)`·10^6^ ha, la moitié du maïs cultivé[^2] en France en 2021, soit environ `r round(surf("MIS") / surf_tot_pac$surf_ha * 100)` % des surfaces déclarées à la PAC.
Il est utilisé pour l'alimentation animale (essentiellement) et humaine, la transformation en amidon, les agrocarburants...
[^2]: Les autres cultures étant le maïs ensilage (1,3·10^6^ ha, broyé et fermenté) destiné à nourrir le bétail et le maïs doux (23 000 ha) pour l'alimentation humaine.
[^2]: Les autres cultures étant le maïs ensilage (`MIE`, `r round(surf("MIE") / 1e6, 2)`·10^6^ ha, broyé et fermenté) destiné à nourrir le bétail et le maïs doux (`MID`, environ `r format(round(surf("MID"), -3), big.mark = " ")` ha) pour l'alimentation humaine.
&rarr; Pouvez-vous confirmer ces chiffres ? La table `rpg.parcelles` liste chaque parcelle avec son `code_cultu` et sa `surf_parc` en hectare.
Pour déterminer les aires principales de culture on peut, par exemple, extraire les principales zones où la densité de culture du maïs grain est la plus forte. Cela peut se faire par commune, par clustering ou avec un lissage[voir chapitre 8 @loonisManuelAnalyseSpatiale2018].
......@@ -328,11 +363,13 @@ lissage <- function(df, field, bandwidth, resolution, zone = NULL, out_crs = 303
}
```
<!--
NB : le lissage ne peut pas être mis en cache par Quarto car les objets
{terra} ne sont pas cachables.
-->
```{r}
#| label: lissage-traitement
# NB : le lissage ne peut pas être mis en cache par quarto car les objets
# {terra} ne sont pas cachables.
mais_liss <- mais %>%
lissage(surf_parc, bandwidth = bande_passante, resolution = pixel, zone = fr) %>%
rast()
......@@ -432,6 +469,25 @@ temp_points <- era5 %>%
full_join(points, ., by = "geometry")
```
```{r}
#| label: tbl-climat
#| echo: false
#| tbl-cap: Températures moyennes journalières (extrait)
temp_points %>%
head() %>%
select(date, nom, temp_moy_c) %>%
st_drop_geometry() %>%
add_row(nom = "*etc.*") %>%
gt() %>%
cols_label(date ~ "date",
temp_moy_c ~ "température moy. (°C)",
nom ~ "bassin de production") %>%
sub_missing(missing_text = "...") %>%
fmt_markdown(nom)
```
## Calcul des degrés jour et des dates de récolte
```{r}
......@@ -447,21 +503,21 @@ besoin <- 1700 # DJ
$$DJ_{n} = \sum_{j=1}^{n}{\frac{T_{max, j} - T_{min, j}}{2} - T_{base}}$$
Le maïs a une température de base de `r base` °C et il lui faut `r besoin` DJ (variable selon la précocité de la variété) pour être récolté pour le grain[^3]. Les températures supérieures à 30 °C stoppent le développement végétatif. Le semis se fait début avril[^4].
Le maïs a une température de base de `r base` °C et il lui faut `r besoin` DJ (variable selon la précocité de la variété) pour être récolté pour le grain[^3]. Les températures supérieures à 30 °C stoppent le développement végétatif. Le semis commence fin mars et est réalisé à 50 % mi-avril[^4].
[^3]: [*Spotifarm*](https://blog.spotifarm.fr/tour-de-plaine-spotifarm/somme-de-temperature-pourquoi-suivre-levolution-des-degres-jours)
[^4]: [Céré'Obs. *FranceAgrimer*](https://cereobs.franceagrimer.fr/cereobs-sp/assets/pdfjs/web/viewer.html?file=blob:https://cereobs.franceagrimer.fr/f05c19c6-aff4-4701-9af4-80fdef7118d3)
[^4]: [Céré'Obs. *FranceAgrimer*](https://cereobs.franceagrimer.fr/cereobs-sp/#/publications) > Rapport Céré'Obs
On considère que la température moyenne journalière ERA5 correspond bien à $\frac{T_{max} - T_{min}}{2}$.
NB : la date n'est pas un bon indicateur pour suivre précisémment une évolution journalière à cause des années bissextiles. Par exemple le 1er avril ne correspondra pas toujours au même nombre de jours dans l'avancement de la saison de végétation :
NB : la date n'est pas un bon indicateur pour suivre précisémment une évolution journalière à cause des années bissextiles. Par exemple le 15 avril ne correspondra pas toujours au même nombre de jours dans l'avancement de la saison de végétation :
```{r}
#| label: exemple-doy
#| code-fold: false
yday(ymd("2020-04-01"))
yday(ymd("2023-04-01"))
yday(ymd("2020-04-15"))
yday(ymd("2023-04-15"))
```
Cela peut-être impactant si on recherche des tendances qui sont de l'ordre de grandeur du jour. On utilisera donc le jour de l'année (*day of year* ou *doy*).
......@@ -472,7 +528,7 @@ Cela peut-être impactant si on recherche des tendances qui sont de l'ordre de g
recolte <- temp_points %>%
select(date, nom, temp_moy_c) %>%
group_by(nom, annee = year(date)) %>%
mutate(dj = case_when(yday(date) < 91 ~ 0,
mutate(dj = case_when(yday(date) < 105 ~ 0,
temp_moy_c >= 30 ~ 0,
temp_moy_c < base ~ 0,
TRUE ~ temp_moy_c - base),
......@@ -504,7 +560,9 @@ recolte %>%
fmt_markdown(nom)
```
## Visualisation des tendances
## Tendances
### Visualisation des tendances
```{r}
#| label: tendance-avec-interaction
......@@ -537,7 +595,7 @@ recolte %>%
nudge_x = 1.5, size = 3, direction = "y", lineheight = 0.6) +
scale_y_date(date_breaks = "months", date_labels = "%b") +
coord_cartesian(xlim = c(min(recolte$annee) - .5, max(recolte$annee) + 5),
ylim = as.Date(c(NA, "2020-11-08")),
ylim = as.Date(c(NA, "2020-11-15")),
expand = FALSE) +
labs(title = "Date de récolte potentielle",
subtitle = "Maïs grain, par bassin de production",
......@@ -549,7 +607,7 @@ recolte %>%
plot.caption = element_text(size = 6))
```
## Tendance
### Paramètres des tendances
```{r}
#| label: tendance-simple
......@@ -559,6 +617,7 @@ mod_simple <- recolte %>%
evol <- round(mod_simple$coefficients[["annee"]], 1)
ic95 <- round(confint(mod_simple)[2, ], 1)
r2 <- round(with(summary(mod_simple), 1 - deviance / null.deviance), 2)
# Pour les bayesiens
#
......@@ -571,7 +630,7 @@ ic95 <- round(confint(mod_simple)[2, ], 1)
# describe_posterior(mod_bayes, ci = .95, rope_range = c(-.05, 0.5))
```
Au cours des quatre dernières décennies, la date de récolte potentielle moyenne du maïs grain dans les principaux bassins de production français à évolué d'environ `r evol` jour par an (IC~95 %~ \[`r ic95[1]` ; `r ic95[2]`\]).
Au cours des quatre dernières décennies, la date de récolte potentielle moyenne du maïs grain dans les principaux bassins de production français à évolué d'environ `r evol` jour par an (IC~95 %~ \[`r ic95[1]` ; `r ic95[2]`\], *r*^2^ = `r r2`).
```{r}
#| label: tbl-tendance
......@@ -591,7 +650,7 @@ mod_simple %>%
{base} °C)"))
```
## Validation
### Validation
Des données d'observation ponctuelles permettent de confronter notre modèle à la réalité[@torreChangementClimatiqueObservations2004] :
......