Projet Guidé : Explorer le Développement Mondial avec Gapminder
Manipulation et visualisation avec Pandas et Seaborn
Author
Affiliation
Wilson Toussile
ENSPY & ESSFAR
1 Introduction : Raconter l’Histoire du Monde en Données
L’analyse de données ne se résume pas à des modèles complexes ; elle commence par la curiosité et l’exploration. Dans cet atelier, nous allons nous mettre dans la peau d’un analyste pour explorer l’un des jeux de données les plus emblématiques de la data visualisation : Gapminder.
Notre objectif est de mener une Analyse Exploratoire des Données (EDA) complète pour comprendre les grandes tendances de l’évolution du monde au cours de la seconde moitié du 20ème siècle. Nous allons manipuler, agréger et visualiser les données pour répondre à des questions sur l’espérance de vie, la richesse et la démographie.
Cet atelier est une opportunité de mettre en pratique et de renforcer vos compétences avec les outils essentiels de l’écosystème Python : Pandas pour la manipulation et Seaborn/Matplotlib pour la visualisation.
2 Le Jeu de Données Gapminder
Rendu célèbre par les conférences TED du statisticien suédois Hans Rosling, ce jeu de données est un extrait de la base de données de la Fondation Gapminder. Il compile des indicateurs de développement pour 142 pays, collectés tous les cinq ans de 1952 à 2007.
2.1 Description des Variables
country (qualitative) : Le nom du pays.
continent (qualitative) : Le continent auquel le pays appartient.
year (temporelle/discrète) : L’année de l’observation (de 1952 à 2007, par pas de 5 ans).
lifeExp (quantitative) : L’espérance de vie à la naissance, en années.
pop (quantitative) : La population totale du pays.
gdpPercap (quantitative) : Le Produit Intérieur Brut (PIB) par habitant, en dollars internationaux (ajusté pour l’inflation, base 2005).
2.2 Chargement des Données
Nous allons commencer par charger les bibliothèques nécessaires et le jeu de données.
import pandas as pdimport numpy as npimport seaborn as snsimport plotly.express as pximport matplotlib.pyplot as plt# Configuration du style des graphiquessns.set_theme(style="whitegrid", context="talk")plt.rcParams['figure.figsize'] = (14, 8)# Charger le jeu de données depuis une URLgapminder = px.data.gapminder()# Premières infosprint("Jeu de données Gapminder chargé. Dimensions initiales :", gapminder.shape)print("\nAperçu des données :")gapminder.head()
Jeu de données Gapminder chargé. Dimensions initiales : (1704, 8)
Aperçu des données :
country
continent
year
lifeExp
pop
gdpPercap
iso_alpha
iso_num
0
Afghanistan
Asia
1952
28.801
8425333
779.445314
AFG
4
1
Afghanistan
Asia
1957
30.332
9240934
820.853030
AFG
4
2
Afghanistan
Asia
1962
31.997
10267083
853.100710
AFG
4
3
Afghanistan
Asia
1967
34.020
11537966
836.197138
AFG
4
4
Afghanistan
Asia
1972
36.088
13079460
739.981106
AFG
4
3 Objectifs de l’Atelier
Voici le plan de match. Pour chaque section, des tâches précises vous seront demandées pour explorer progressivement le jeu de données.
3.1 A. Inspection et Gestion des Données
Avant toute analyse, un premier contact avec les données est essentiel pour s’assurer de leur qualité.
Exploration Initiale : Utilisez les méthodes .info() et .describe() pour comprendre la structure, les types de données et les statistiques de base.
Gestion des Valeurs Manquantes :
Quantifier le nombre de valeurs manquantes par colonne.
Proposer une stratégie simple pour les traiter (suppression) et l’appliquer pour nettoyer le jeu de données.
3.2 B. Manipulation et Agrégation avec Pandas
Nous allons maintenant transformer les données pour répondre à des questions spécifiques.
Sélection & Filtrage :
Créez un DataFrame contenant uniquement les données pour l’année 2007.
Filtrez ce nouveau DataFrame pour n’afficher que les pays africains.
Groupement & Agrégation (groupby) :
Calculez l’espérance de vie moyenne et le PIB par habitant moyen pour chaque continent en 2007.
Calculez la population mondiale totale pour chaque année présente dans le jeu de données.
3.3 C. Analyse Exploratoire par la Visualisation (Seaborn)
Un graphique est souvent plus parlant qu’un tableau.
Analyse Univariée :
Visualisez la distribution de l’espérance de vie dans le monde en 2007.
Visualisez la distribution du PIB par habitant en 2007 (en utilisant une échelle logarithmique).
Analyse Bivariée :
Explorez la relation entre gdpPercap et lifeExp pour l’année 2007 avec un nuage de points.
Comparez la distribution de lifeExp par continent en 2007 avec des boîtes à moustaches.
Analyse Multivariée et Temporelle :
Visualisez l’évolution de l’espérance de vie pour une sélection de pays avec un graphique en lignes.
Recréez une version du célèbre graphique de Hans Rosling pour l’année 2007.
4 Atelier Pratique
4.1 Inspection et Gestion des Données
# --- 1. Exploration Initiale ---print("--- Informations sur le DataFrame ---")gapminder.info()print("\n--- Statistiques Descriptives ---")print(gapminder.describe())# --- 2. Gestion des Valeurs Manquantes ---print("\n--- Vérification des Valeurs Manquantes par Colonne ---")missing_values = gapminder.isnull().sum()print(missing_values)# Interprétation et actionif missing_values.sum() ==0:print("\nBonne nouvelle ! Il n'y a aucune valeur manquante dans ce jeu de données.")else:print(f"\nIl y a un total de {missing_values.sum()} valeurs manquantes à traiter.")print("Pour cet atelier, nous allons opter pour une stratégie simple : la suppression complète des lignes contenant au moins une valeur manquante.")# Sauvegarde des dimensions avant suppression rows_before = gapminder.shape[0]# Suppression des lignes avec des valeurs manquantes# .dropna() supprime les lignes (axis=0) par défaut gapminder_cleaned = gapminder.dropna() rows_after = gapminder_cleaned.shape[0]print("\nDimensions avant suppression :", (rows_before, gapminder.shape[1]))print("Dimensions après suppression :", (rows_after, gapminder_cleaned.shape[1]))print(f"Nous avons perdu {rows_before - rows_after} lignes.")# On remplace le dataframe original par le dataframe nettoyé pour la suite de l'atelier gapminder = gapminder_cleaned# Vérification finaleprint("\nVérification après nettoyage :")print(gapminder.isnull().sum().sum(), "valeurs manquantes restantes.")
--- Informations sur le DataFrame ---
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1704 entries, 0 to 1703
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 country 1704 non-null object
1 continent 1704 non-null object
2 year 1704 non-null int64
3 lifeExp 1704 non-null float64
4 pop 1704 non-null int64
5 gdpPercap 1704 non-null float64
6 iso_alpha 1704 non-null object
7 iso_num 1704 non-null int64
dtypes: float64(2), int64(3), object(3)
memory usage: 106.6+ KB
--- Statistiques Descriptives ---
year lifeExp pop gdpPercap iso_num
count 1704.00000 1704.000000 1.704000e+03 1704.000000 1704.000000
mean 1979.50000 59.474439 2.960121e+07 7215.327081 425.880282
std 17.26533 12.917107 1.061579e+08 9857.454543 248.305709
min 1952.00000 23.599000 6.001100e+04 241.165876 4.000000
25% 1965.75000 48.198000 2.793664e+06 1202.060309 208.000000
50% 1979.50000 60.712500 7.023596e+06 3531.846989 410.000000
75% 1993.25000 70.845500 1.958522e+07 9325.462346 638.000000
max 2007.00000 82.603000 1.318683e+09 113523.132900 894.000000
--- Vérification des Valeurs Manquantes par Colonne ---
country 0
continent 0
year 0
lifeExp 0
pop 0
gdpPercap 0
iso_alpha 0
iso_num 0
dtype: int64
Bonne nouvelle ! Il n'y a aucune valeur manquante dans ce jeu de données.
4.2 Conclusion de l’étape A
Notre jeu de données est maintenant propre et prêt pour l’analyse. Dans ce cas précis, le jeu de données était déjà complet, mais la procédure de vérification et de nettoyage reste une étape non négociable de tout projet d’analyse.
(Le reste de l’atelier utiliserait maintenant le DataFrame gapminder nettoyé pour les étapes B et C, comme défini dans les objectifs).