Python pour un data scientist/economist

Lino Galiana

Pratique de pandas: un exemple complet

Dans ce tutoriel pandas, nous allons utiliser:

  • Les émissions de gaz à effet de serre estimées au niveau communal par l’ADEME. Le jeu de données est disponible sur data.gouv et requêtable directement dans python avec cet url
  • Quelques données de contexte au niveau communal. Idéalement, on utiliserait les données disponibles sur le site de l’Insee. Pour faciliter l’import de celles-ci, les données ont été mises à disposition dans le dépôt github, sur cet url

pandas offre la possibilité d’importer des données directement depuis un url. C’est l’option prise dans ce tutoriel. Si vous préfèrez, pour des raisons d’accès au réseau ou de performance, importer depuis un poste local, vous pouvez télécharger les données et changer les commandes d’import avec le chemin adéquat plutôt que l’url.

Nous suivrons les conventions habituelles dans l’import des packages

Exploration de la structure des données

Commencer par importer les données de l’Ademe à l’aide du package pandas. Vous pouvez les nommer df

Pour les données de cadrage au niveau communal (source Insee), une version arrangée et facile à requêter est fournie sur github

## sys:1: DtypeWarning: Columns (0) have mixed types.Specify dtype option on import or set low_memory=False.

Exercice 1: Afficher des données

L’objectif de cet exercice est de vous amener à afficher des informations sur les données dans un bloc de code (notebook) ou dans la console

Commencer sur df:

* Utiliser les méthodes adéquates pour les 10 premières valeurs, les 15 dernières et un échantillon aléatoire de 10 valeurs
* Tirer 5 pourcent de l'échantillon sans remise
* Ne conserver que les 10 premières lignes et tirer aléatoirement dans celles-ci pour obtenir un DataFrame de 100 données.
* Faire 100 tirages à partir des 6 premières lignes avec une probabilité de 1/2 pour la première observation et une probabilité uniforme pour les autres

Faire la même chose sur df_city


Cette première approche exploratoire donne une idée assez précise de la manière dont les données sont organisées. On remarque ainsi une différence entre df et df_city quant aux valeurs manquantes: la première base est relativement complète, la seconde comporte beaucoup de valeurs manquantes. Autrement dit, si on désire exploiter df_city, il faut faire attention à la variable choisie.


Exercice 2: structure des données

La première chose à vérifier est le format des données, afin d’identifier des types de variables qui ne conviennent pas. Ici, comme c’est pandas qui a géré automatiquement les types de variables, il y a peu de chances que les types ne soient pas adéquats mais une vérification ne fait pas de mal.

  • Vérifier les types des variables. S’assurer que les types des variables communes aux deux bases soient cohérents.

Ensuite, on vérifie les dimensions des DataFrames et la structure de certaines variables clé. En l’occurrence, les variables fondamentales pour lier nos données sont les variables communales. Ici, on a deux variables géographiques: un code commune et un nom de commune.

  • Vérifier les dimensions des DataFrames
  • Vérifier le nombre de valeurs uniques des variables géographiques dans chaque base. Les résultats apparaissent-ils cohérents ?
  • Identifier les libellés pour lesquels on a plusieurs codes communes dans df_city et les stocker dans un vecteur x (conseil: faire attention à l’index de x)

On se focalise temporairement sur les observations où le libellé comporte plus de deux codes communes différents

  • Regarder dans df_city ces observations
  • Pour mieux y voir, réordonner la base obtenue par order alphabétique
  • Déterminer la taille moyenne (variable nombre de personnes: NBPERSMENFISC16) et quelques statistiques descriptives de ces données. Comparer aux mêmes statistiques sur les données où libellés et codes communes coïncident
  • Vérifier sur les grandes villes (plus de 100 000 personnes), la proportion de villes où libellés et codes communes ne coïncident pas. Identifier ces observations.
  • Vérifier dans df_city les villes dont le libellé est égal à Montreuil. Vérifier également celles qui contiennent le terme ‘Saint-Denis’

Ce petit exercice permet de se rassurer car les libellés dupliqués sont en fait des noms de commune identiques mais qui ne sont pas dans le même département. Il ne s’agit donc pas d’observations dupliquées. On se fiera ainsi aux codes communes, qui eux sont uniques.

Les indices

Les indices sont des éléments spéciaux d’un DataFrame puisqu’ils permettent d’identifier certaines observations. Il est tout à fait possible d’utiliser plusieurs indices, par exemple si on a des niveaux imbriqués.


Exercice 3: Les indices

A partir de l’exercice précédent, on peut se fier aux codes communes.

  • Fixer comme indice la variable de code commune dans les deux bases. Regarder le changement que cela induit sur le display du dataframe
  • Les deux premiers chiffres des codes communes sont le numéro de département. Créer une variable de département dep dans df
  • Calculer les émissions totales par secteur pour chaque département. Mettre en log ces résultats dans un objet df_log. Garder 5 départements et produire un barplot
  • Repartir de df. Calculer les émissions totales par département et sortir la liste des 10 principaux émetteurs de CO2 et des 5 départements les moins émetteurs. Sans faire de merge, regarder les caractéristiques de ces départements (population et niveau de vie)


Exercice 4: performance des indices

Un des intérêts des indices est qu’il permettent des agrégations efficaces.

  • Repartir de df et créer une copie df_copy = df.copy() et df_copy2 = df.copy() afin de ne pas écraser le DataFrame df
  • Utiliser la variable dep comme indice pour df_copy et retirer tout index pour df_copy2
  • Importer le module timeit et comparer le temps d’exécution de la somme par secteur, pour chaque département, des émissions de CO2

Restructurer les données

On présente généralement deux types de données:

* format __wide__: les données comportent des observations répétées, pour un même individu (ou groupe), dans des colonnes différentes 
* format __long__: les données comportent des observations répétées, pour un même individu, dans des lignes différentes avec une colonne permettant de distinguer les niveaux d'observations

Un exemple de la distinction entre les deux peut être pris à l’ouvrage de référence d’Hadley Wickham, R for Data Science:

L’aide mémoire suivante aidera à se rappeler les fonctions à appliquer si besoin:

Le fait de passer d’un format wide au format long (ou vice-versa) peut être extrêmement pratique car certaines fonctions sont plus adéquates sur une forme de données ou sur l’autre. En règle générale, avec python comme avec R, les formats long sont souvent préférables.


Exercice 5: Restructurer les données: wide to long

  • Créer une copie des données de l’ADEME en faisant df_wide = df.copy()
  • Restructurer les données au format long pour avoir des données d'émissions par secteur en gardant comme niveau d’analyse la commune (attention aux autres variables identifiantes).
  • Faire la somme par secteur et représenter graphiquement
  • Garder, pour chaque département, le secteur le plus polluant


Exercice 6: long to wide

Cette transformation est moins fréquente car appliquer des fonctions par groupe, comme nous le verrons par la suite, est très simple.

  • Repartir de df_wide = df.copy().
  • Reconstruire le DataFrame, au format long, des données d'émissions par secteur en gardant comme niveau d’analyse la commune puis faire la somme par département et secteur
  • Passer au format wide pour avoir une ligne par secteur et une colonne par département
  • Calculer, pour chaque secteur, la place du département dans la hiérarchie des émissions nationales
  • A partir de là, en déduire le rang médian de chaque département dans la hiérarchie des émissions et regarder les 10 plus mauvais élèves, selon ce critère.

Combiner les données

L’information de valeur s’obtient de moins en moins à partir d’une unique base de données. Il devient commun de devoir combiner des données issues de sources différentes. Nous allons ici nous focaliser sur le cas le plus favorable qui est la situation où une information permet d’apparier de manière exacte deux bases de données (autrement nous serions dans une situation, beaucoup plus complexe, d’appariement flou). La situation typique est l’appariement entre deux sources de données selon un identifiant individuel ou un identifiant de code commune, ce qui est notre cas.

Il est recommandé de lire ce guide assez complet sur la question des jointures avec R qui donne des recommandations également utiles en python.

On utilise de manière indifférente les termes merge ou join. Le deuxième terme provient de la syntaxe SQL. En pandas, dans la plupart des cas, on peut utiliser indifféremment df.join et df.merge


Exercice 7: Calculer l’empreinte carbone par habitant

  • Créer une variable emissions qui correspond aux émissions totales d’une commune
  • Faire une jointure à gauche entre les données d'émissions et les données de cadrage. Comparer les émissions moyennes des villes sans match (celles dont des variables bien choisies de la table de droite sont NaN) avec celles où on a bien une valeur correspondante dans la base Insee
  • Faire un inner join puis calculer l’empreinte carbone dans chaque commune. Sortir un histogramme en niveau puis en log et quelques statistiques descriptives sur le sujet.
  • Regarder la corrélation entre les variables de cadrage et l’empreinte carbone. Certaines variables semblent expliquer l’empreinte carbone ?

Last updated on 29 Sep 2020
Published on 9 Jul 2020
Edit on GitHub