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 :

  1. distributions,

  2. comptage,

  3. relation entre les espèces,

  4. é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.

  1. 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

  1. 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
  1. Calculez dans l’objet species_cat le nombre d’espèces par catégorie. Vous utiliserez la méthode groupby 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

  1. Créer la variable species_statusqui 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 valeur nan?

# 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")
  1. À 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

  1. 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

  1. 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

  1. 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'
  1. Trouvez toutes les observations réalisées dans parkMax pour l’espèce « Sasa palmata ». Mettez le résultat dans parkMax_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.

  1. Y a-t-il des valeurs manquantes dans la table observations? Supprimez les lignes avec des données manquantes et stockez le résultat dans observations_cleaned

# VOTRE CODE ICI
raise NotImplementedError()
assert observations_cleaned.shape == (23291, 3)
assert (observations_cleaned.notna()).all(axis=None)
  1. Dans la colonne conservation_status de la table species, remplacez les valeurs NaN par No 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()
  1. ♣ Représentez ces données sous forme de carte de chaleur (heatmap).

# VOTRE CODE ICI
raise NotImplementedError()
  1. ♣ 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)
  1. À quoi sert l’opération unstack?

VOTRE RÉPONSE ICI

  1. ♣ 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)
  1. ♣ Faites une nouvelle figure à partir de group_status_conserv de type barplot avec l’option stacked=True.

# VOTRE CODE ICI
raise NotImplementedError()
  1. 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 vaut False pour toutes les espèces de statut No Intervention et True 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 :

  1. Déposez votre travail

  2. 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é!

  3. 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.