Examiner les intervalles du suivi de caribous
Comment les intervalles entre positions influencent-ils la lecture des distances et des vitesses?
À produire : Un tableau d'effectifs, un tableau d'intervalles, un graphique et une comparaison de deux résumés de vitesse.
Prérequis : Importer un CSV dans R et utiliser group_by et summarise.
Préparation enseignante
Extraire la trousse, ouvrir le projet RStudio et installer les packages avec installer-packages.R. Le script utilise ensuite les trois CSV sans téléchargement. La carte de la fiche demande Internet pour son fond OpenStreetMap.
Télécharger la trousse avec les données
194 Ko. Préparation : 08/10/2026 à 14:02 (heure du Québec).
Les fichiers de données sont inclus dans la trousse.
Conditions de la source · Provenance et empreinte du ZIP
Fichiers inclus
-
pas_caribous.csv: 1 592 lignes, 16 colonnes. -
positions_caribous.csv: 1 911 lignes, 24 colonnes. -
segments_caribous.csv: 319 lignes, 15 colonnes.
Contexte
Les données décrivent des segments sélectionnés autour de grands plans d’eau du nord du Québec, entre 2007 et 2014. L’activité examine les unités d’observation et les intervalles entre positions de ce suivi historique.
Consignes
- Exécuter le script. Expliquer la relation entre 1 911 positions, 319 segments et 1 592 pas.
- Lire les effectifs par catégorie. Vérifier pourquoi les nombres d’individus ne s’additionnent pas.
- Comparer les intervalles minimaux, médians et maximaux. Repérer les pas dépassant 13,1 heures, sans les supprimer automatiquement.
- Examiner le graphique. Expliquer pourquoi une vitesse par ligne droite sur plusieurs heures ne mesure pas une vitesse instantanée.
- Comparer la moyenne non pondérée des vitesses par pas au rapport entre distance totale et durée totale d’un segment. Retrouver un cas où ces deux valeurs diffèrent.
- Rédiger une conclusion de 150 mots qui nomme les unités, la sélection des segments et les limites des coordonnées et des heures. Ne pas attribuer causalement les différences au mode de déplacement.
Limites à faire nommer
Les segments sont des extraits sélectionnés autour des plans d’eau. Le datum GPS est traité comme WGS84 par hypothèse et le fuseau horaire reste inconnu. Les six discordances d’identité sont conservées. Le seuil de 13,1 heures est un contrôle de fréquence, pas une frontière écologique. Plusieurs pas appartiennent au même individu; les tailles des groupes sont inégales. Les scores de la fiche sont une appréciation éditoriale, sans essai en classe documenté.
Vérifier le travail
- Les 1 592 pas relient seulement des positions du même segment.
- Les effectifs d'individus par catégorie ne sont pas additionnés.
- La conclusion précise le poids des pas, les répétitions et la sélection des extraits.
- Les deux résumés de vitesse sont distingués et exprimés en km/h.
Objectifs et adaptations
Objectifs
- Distinguer position, pas, segment et individu.
- Lire des intervalles irréguliers et des indicateurs de qualité.
- Comparer une moyenne de vitesses et un rapport distance sur durée.
Adaptations
- Commencer par les tableaux déjà produits, puis interpréter le graphique.
- Approfondir les résumés en donnant un poids égal aux individus.
Statut documenté : Script vérifié dans la trousse; utilisation en classe non documentée.
Contribution pédagogique : Aurélien Nicosia. Usage en cours non documenté.
- Ajout
- Mise à jour
Script complet
Afficher le script R
# Examiner les intervalles d'observation sans interprétation causale.
# Exécuter depuis la racine de la trousse entièrement extraite.
library(readr)
library(dplyr)
library(ggplot2)
positions <- read_csv("data/processed/caribous-riviere-aux-feuilles/positions_caribous.csv",
col_types = cols(id_individu_source = col_character(), id_annee_source = col_character(),
id_depuis_idyr = col_character(), heure_source = col_character(),
date_heure_source = col_character()), show_col_types = FALSE)
pas <- read_csv("data/processed/caribous-riviere-aux-feuilles/pas_caribous.csv",
col_types = cols(id_individu_source = col_character(),
date_heure_depart = col_character(), date_heure_arrivee = col_character()), show_col_types = FALSE) |>
mutate(vitesse_ligne_droite_kmh = vitesse_pas_m_h / 1000)
segments <- read_csv("data/processed/caribous-riviere-aux-feuilles/segments_caribous.csv",
col_types = cols(id_individu_source = col_character(), id_annees_source = col_character(),
date_heure_debut = col_character(), date_heure_fin = col_character()), show_col_types = FALSE)
# Les pas restent dans leur segment; une position initiale n'a pas de pas entrant.
stopifnot(nrow(positions) == 1911L, nrow(segments) == 319L, nrow(pas) == 1592L,
nrow(pas) == nrow(positions) - nrow(segments),
!anyDuplicated(segments$cle_segment), all(pas$cle_segment %in% segments$cle_segment),
all(pas$duree_h > 0), all(positions$id_individu_source %in% segments$id_individu_source))
effectifs <- positions |> group_by(type_deplacement) |> summarise(
positions = n(), individus = n_distinct(id_individu_source),
segments = n_distinct(cle_segment), .groups = "drop")
print(effectifs)
# Chaque ligne pèse un pas : ce résumé ne donne pas un poids égal aux individus.
intervalles <- pas |> group_by(type_deplacement) |> summarise(
pas = n(), mediane_h = median(duree_h), minimum_h = min(duree_h),
maximum_h = max(duree_h), au_dela_13_1h = sum(intervalle_sup_13_1h), .groups = "drop")
print(intervalles)
print(positions |> filter(!id_coherent) |>
select(id_individu_source, id_annee_source, cle_segment, date_heure_source))
graphique <- ggplot(pas, aes(x = duree_h, y = vitesse_ligne_droite_kmh,
color = type_deplacement)) +
geom_point(alpha = 0.5, size = 1.4) +
scale_color_manual(values = c("Traversée sur glace" = "#087A94",
"Traversée à la nage" = "#D26B29", "Contournement" = "#724E91")) +
labs(x = "Intervalle entre deux observations (heures civiles)",
y = "Vitesse par ligne droite (km/h)", color = "Type du segment",
caption = "Extraits sélectionnés; mesures répétées. Datum GPS : hypothèse WGS84. Fuseau non documenté.") +
theme_minimal(base_size = 12) + theme(legend.position = "bottom")
print(graphique)
# La vitesse moyenne temporelle d'un segment est distance totale / durée totale.
resume_segments <- pas |> group_by(cle_segment) |> summarise(
distance_km = sum(distance_ligne_droite_m) / 1000, duree_h = sum(duree_h),
moyenne_non_ponderee_kmh = mean(vitesse_ligne_droite_kmh), .groups = "drop") |>
mutate(vitesse_par_duree_kmh = distance_km / duree_h)
print(resume_segments |> arrange(desc(abs(moyenne_non_ponderee_kmh - vitesse_par_duree_kmh))) |> head(10))