Analyse de données sur la biodiversité des parcs nationaux américains#
Introduction#
L’objectif de ce TP est d’étudier la biodiversité au sein de parcs nationaux. Pour cela nous utiliserons des données d’observations de plusieurs espèces dans différents lieux.
En science des données vous devrez préparer les données, les analyser (statistiquement) et produire des figures pertinentes dans l’objectif de répondre à différentes questions.
Sources
Les fichiers Observations.csv
et Species_info.csv
sont issus
originellement d’un projet de
Kaggle.
Remarques: les données pour ce projet sont inventées bien qu”inspirées par des données réelles.
Objectifs du projet#
Vous êtes deux analystes de la biodiversité pour le service des parcs nationaux. Le service veut assurer la survie des espèces en péril et maintenir le niveau de biodiversité au sein de leurs parcs. Par conséquent, vos principaux objectifs seront de comprendre les caractéristiques des espèces et leur état de conservation, ainsi que ces espèces et leurs relations avec les parcs nationaux. Quelques questions qui se posent :
Quel animal est le plus répandu ? Quel parc possède le plus d’espèces ?
Quelle est la répartition des statuts de conservation des espèces ?
Certains types d’espèces sont-ils plus susceptibles d’être menacés ?
Chargement des données#
Ce TP contient deux ensembles de données. Le premier fichier CSV (comma separated values) contient des informations sur chaque espèce et un autre contient des observations d’espèces avec des emplacements de parc. Ces données seront utilisées pour répondre aux questions ci-dessus.
Analyse des données#
Des statistiques descriptives et des techniques de visualisation des données seront utilisées pour mieux comprendre les données. L’inférence statistique sera également utilisée pour tester si les valeurs observées sont statistiquement significatives. Certaines des mesures clés qui seront calculées incluent :
distributions,
comptage,
relation entre les espèces,
état de conservation des espèces.
Évaluation et conclusion#
Enfin, nous reviendrons aux questions posées. A-t-on pu répondre à toutes les questions? Peut-on aller plus loin? Nous réfléchirons aux limites et nous verrons si l’une des analyses aurait pu être effectuée à l’aide de méthodes différentes.
Chargement des données#
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
Chargez les fichiers media/species_info.csv
et
media/observations.csv
sous forme de tables (data frames) appelées
species
et observations
respectivement.
Indication: La fonction .head()
permet d’avoir un apercu du
contenu de chaque table.
# VOTRE CODE ICI
raise NotImplementedError()
species.head()
# VOTRE CODE ICI
raise NotImplementedError()
observations.head()
assert isinstance(observations, pd.DataFrame)
assert isinstance(species, pd.DataFrame)
assert observations.shape == (23296, 3)
assert species.shape == (5824, 4)
assert (observations.isna()).any(axis=None)
Caractéristiques des jeux de données#
Quelles sont les dimensions des jeux de données?
Consigne
Vous utiliserez la cellule de code ci-dessous pour mener les calculs dont vous aurez besoin, puis vous rédigerez votre réponse dans la cellule de texte qui suit, sous forme de phrase complète explicitant les nombres de lignes et de colonnes.
Vous procéderez de même dans tout le reste du TP, pour avoir les points.
# VOTRE CODE ICI
raise NotImplementedError()
VOTRE RÉPONSE ICI
Jeu de données species
#
Il est temps d’explorer un peu plus en profondeur la table
species
.
Répondez aux questions suivantes :
Combien y a-t-il d’espèces différentes? Y a t il des données manquantes pour cette colonne ?
Ce nombre est-il égal aux nombre de lignes? Pourquoi?
Proposez des hypothèses permettant d’expliquer cette observation.
Indication
Vous pouvez afficher le nombre de noms uniques d’un objet Pandas en utilisant
nunique()
.
# VOTRE CODE ICI
raise NotImplementedError()
VOTRE RÉPONSE ICI
Calculez dans la variable
ncat
le nombre de catégories présentes dans la table. À quoi cette colonne correspond-t-elle?
# VOTRE CODE ICI
raise NotImplementedError()
VOTRE RÉPONSE ICI
assert ncat**2+32 == 81
Calculez dans l’objet
species_cat
le nombre d’espèces par catégorie. Vous utiliserez la méthodegroupby
vue en cours. Faites un barplot pour représenter ce résultat. Quelle catégorie a le plus d’espèces? Est-ce surprenant?
Remarque
Les Vascular Plant correspondent aux Trachéophytes et regroupent les plantes à fleurs Angiospermes. Les Nonvascular plant correspondent aux plantes non-vasculaires*
# VOTRE CODE ICI
raise NotImplementedError()
assert isinstance(species_cat, pd.Series)
assert species_cat.size == 7
assert species_cat['Bird']>20
VOTRE RÉPONSE ICI
Créer la variable
species_status
qui contient les différents statuts possibles de ces espèces. Dans un paragraphe de texte, décrivez chacune de ces catégories. A votre avis, que signifie une valeurnan
?
# VOTRE CODE ICI
raise NotImplementedError()
import hashlib
assert hashlib.md5(species_status[1].encode("utf-8")).hexdigest() == '5b98e09fa16ca9ffb8a4e6481fab1ef7'
assert hashlib.md5(species_status[2].encode("utf-8")).hexdigest() == 'e8ffc938d2592b28a666523cc1c80a5a'
assert hashlib.md5(species_status[3].encode("utf-8")).hexdigest() == '667cebca285ad56866f34c25309d99f3'
assert hashlib.md5(species_status[4].encode("utf-8")).hexdigest() == 'dd283e78058345d5e2ad72b7c7769579'
VOTRE RÉPONSE ICI
Jeu de données observations
#
On passe à l’observation de l’autre table, observations
.
observations.shape
observations.describe(include="all")
À partir des commandes ci-dessus, répondez aux questions suivantes :
Décrivez le contenu de la colonne
observations
.Combien y a-t-il de données manquantes dans la table
observations
?Combien d’espèces ont été vues au Yosemite ? Ce chiffre peut-il inclure des redondances ?
Rappel: utilisez systématiquement des phrases complètes.
VOTRE RÉPONSE ICI
Indiquez dans
npark
le nombre de parcs étudiés. Où se situent-ils (faites une recherche internet)?
# VOTRE CODE ICI
raise NotImplementedError()
assert npark**2+93 == 109
VOTRE RÉPONSE ICI
Indiquez dans
speciesMax
le nom scientifique de l’espèce la plus observée. Quel est son nom dans le langage courant (faites une recherche internet) ?
# VOTRE CODE ICI
raise NotImplementedError()
assert hashlib.md5(speciesMax.encode("utf-8")).hexdigest() == 'eb0f1d26ae3ad8053d8291c2c24ad349'
VOTRE RÉPONSE ICI
Mettez dans l’objet
parkMax
le nom du parc dans lequel on trouve le plus d’observations.
# VOTRE CODE ICI
raise NotImplementedError()
assert hashlib.md5(parkMax.encode("utf-8")).hexdigest() == '5702641a382396a92985fd8020739b63'
Trouvez toutes les observations réalisées dans
parkMax
pour l’espèce « Sasa palmata ». Mettez le résultat dansparkMax_sasa
.
# VOTRE CODE ICI
raise NotImplementedError()
assert parkMax_sasa.index == 23287
Analyse des données#
La première étape est de nettoyer et préparer les données.
Y a-t-il des valeurs manquantes dans la table
observations
? Supprimez les lignes avec des données manquantes et stockez le résultat dansobservations_cleaned
# VOTRE CODE ICI
raise NotImplementedError()
assert observations_cleaned.shape == (23291, 3)
assert (observations_cleaned.notna()).all(axis=None)
Dans la colonne
conservation_status
de la tablespecies
, remplacez les valeursNaN
parNo Intervention
. En effet,NaN
signifie qu’il n’y a pas de spécification de conservation.
# VOTRE CODE ICI
raise NotImplementedError()
species_obs = observations.groupby("scientific_name")["observations"].sum()
species_obs = species_obs.sort_values(ascending = False).reset_index()
species_obs
assert (species_obs.notna()).all(axis=None)
On calcule ensuite, sous la forme d’un tableau, le nombre d’espèces
pour chaque catégorie et chaque statut de conservation dans l’objet
group_status
. Pour cela, on utilise entre autres les fonctions
groupby()
et
unstack()
.
group_status = species.groupby('category')['conservation_status'].value_counts().unstack()
♣ Représentez ces données sous forme de carte de chaleur (heatmap).
# VOTRE CODE ICI
raise NotImplementedError()
♣ Pareil avec Seaborn et sous forme d’une figure avec titre, etc.
# VOTRE CODE ICI
raise NotImplementedError()
assert isinstance(group_status, pd.DataFrame)
assert group_status.shape == (7,5)
À quoi sert l’opération
unstack
?
VOTRE RÉPONSE ICI
♣ Dans la pratique, la plupart des espèces sont sans intervention, notamment pour les plantes. Refaites la figure en éliminant les espèces sans intervention. Gardez le nombre d’espèces par catégorie et par statut de conservation dans l’objet
group_status_conserv
.
# VOTRE CODE ICI
raise NotImplementedError()
assert isinstance(group_status_conserv, pd.DataFrame)
assert group_status_conserv.shape == (7,4)
♣ Faites une nouvelle figure à partir de
group_status_conserv
de type barplot avec l’optionstacked=True
.
# VOTRE CODE ICI
raise NotImplementedError()
A l’aide des analyses précédentes, répondez aux questions initiales en quelques phrases:
Quelle est la répartition des statuts de conservation des espèces?
Quel type d’être vivant est particulièrement en danger?
Commentez vos figures.
VOTRE RÉPONSE ICI
Conservation#
On passe maintenant à la question : quelles sont les espèces plus susceptibles d’être suivies dans le cadre de la conservation?
Créez une nouvelle colonne
is_protected
qui vautFalse
pour toutes les espèces de statutNo Intervention
etTrue
pour les autres.
# VOTRE CODE ICI
raise NotImplementedError()
assert species.shape == (5824, 5)
assert species['is_protected'].mean() < 0.033
Pour chaque catégorie calculez la proportion d’espèces protégées et
mettez le resultat dans la variable prop_cat
. Observez les
résultats.
# VOTRE CODE ICI
raise NotImplementedError()
assert prop_cat.mean() == 0.08455896094419532
assert prop_cat.max() == 0.17757009345794392
Évaluation#
Nous avons fini cette première partie de ce cours consacré aux analyses de données, avec un accent mis sur la [VI]sualisation des données. La semaine prochaine et jusqu’à fin du cours nous nous concentrerons sur la classification d’image par apprentissage statistiques, avec le schema d’analyse complet: VI-MÉ-BA-BAR.
Ce TP a permis d’analyser la composition en être vivants de quatre parcs nationaux.
Répondez de facon succinte aux questions du début du TP:
Quel animal est le plus répandu ? Quel parc possède le plus d’espèces ?
Quelle est la répartition des statuts de conservation des espèces ?
Certains types d’espèces sont-ils plus susceptibles d’être menacés ?
VOTRE RÉPONSE ICI
Obtenez votre score
Bravo, vous avez fini le TP.
Depuis le tableau de bord :
Déposez votre travail
Vérifiez que votre binôme est bien configuré, et notamment que le dépôt principal, marqué par une étoile, est le bon. Au besoin, consultez la page web
Rappel: nous ne corrigerons que votre dépôt principal, tel que vous l’avez configuré!Consultez votre score.
Rappel: le calcul du score peut prendre quelques minutes. Vous devez relancer le tableau de bord, ou consultez le dépôt pour le voir. Cliquez sur le badge avec le score pour avoir les détails et les commentaires. Les commentaires et donc le score total sera mis à jour seulement après correction par votre enseignant ou enseignante.