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 vecteurx
(conseil: faire attention à l’index dex
)
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
dansdf
- 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 copiedf_copy = df.copy()
etdf_copy2 = df.copy()
afin de ne pas écraser le DataFramedf
- Utiliser la variable
dep
comme indice pourdf_copy
et retirer tout index pourdf_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 ?