Partie 1 : Téléchargement et mise en forme des données

Projet 3 - Estimations de population à partir du recensement

Le but de ce projet est de réaliser une analyse statistique rapide d’un jeu de données dont le format n’est pas directement optimisé pour une analyse en python. Nous allons utiliser exclusivement la librairie pandas pour l’analyse de données. Pour reproduire au mieux une situation à laquelle vous pouvez être confrontés, nous vous invitons vivement à consulter la documentation de la librairie (docs).

Nous allons nous intéresser à l’estimation de la population au 1er janvier de chaque année, cette estimation étant effectuée à partir des recensements et des modèles d’évolution de la population. Les données sont accessibles sur le site de l’Insee à l’adresse suivante : https://www.insee.fr/fr/statistiques/1893198. Le fichier que nous allons utilisé peut être téléchargé directement via cet url : https://www.insee.fr/fr/statistiques/fichier/1893198/estim-pop-dep-sexe-aq-1975-2023.xls.

import copy
import pandas as pd
import matplotlib.pyplot as plt
import geopandas as gpd
import seaborn as sns

import solutions

Avant d’effectuer le téléchargement des données avec python il est nécessaire de connaître le format de nos données. Dans notre cas, il s’agit du format Excel (.xlsx). De plus, il peut être utile de regarder à quoi ressemble les données que l’on souhaite importer, notamment lorsque leur format n’est pas standard. Ainsi, avant de commencer, prenez le temps de jeter un œil aux données.

Question 0

Téléchargez les données en cliquant sur ce lien et ouvrez-le avec votre logiciel tableur préféré. Analysez la structure des données.

Question 1

Définir la fonction load_data() qui n’a pas de paramètre et renvoie un Dict où les clés correspondent aux noms des onglets de notre fichier et les valeurs correspondent aux données des différentes feuilles de calcul. Pour cela, utilisez une fonction de la librairie pandas en spécifiant les bons paramètres.

Résultat attendu

data = solutions.load_data()
data["2022"]

À vous de jouer !

def load_data():
    # Votre code ici
    return data

Question 2

Maintenant que les données sont importées nous allons les mettre sous la forme d’un seul DataFrame dont les colonnes sont :

  • genre ;

  • age ;

  • population ;

  • dep_code ;

  • dep ;

  • annee.

2.1 - Pour ce faire créez une fonction reshape_data_by_year(df, year) qui prend en argument un DataFrame issu de votre Dict data et une année donnée.

Résultat attendu

annee = 2022
df = solutions.reshape_table_by_year(data[f"{annee}"], annee)
df

À vous de jouer !

def reshape_table_by_year(df, year):
    # Votre code ici
    return df

2.2 - Créer une fonction reshape_data(data) qui produit un DataFrame avec les données pour toutes les années entre 1975 et 2022.

Résultat attendu

df = solutions.reshape_data(data)
df

À vous de jouer !

def reshape_data(data):
    # Votre code ici
    return df

Partie 2 : Visualisation des données

Nous avons maintenant un jeu de données prêt à être analysé ! Commençons tout d’abord par visualiser l’évolution de la population pour différents départements.

Question 3

Ecrire une fonction plot_population_by_gender_per_department(df, department_code) qui renvoie un graphique représentant l’évolution de la population dans un département donné. Utilisez la librairie matplotlib. Vous pouvez regarder les données de la Haute Garonne (31), du Loir-et-Cher (41) et de la Réunion (974) pour constater des disparités d’évolutions.

Résultat attendu

solutions.plot_population_by_gender_per_department(df, "31")

À vous de jouer !

def plot_population_by_gender_per_department(data, department_code):
    # Votre code ici

Question 4

Afin de comparer 2 graphiques il est parfois utile de les afficher côte à côte. Grâce à la méthode subplots() de matplotlib cela est très facile à réaliser en python. Pour le constater, nous allons représenter la pyramide des âges de la France en 1975 et en 2022.

4.1- Définissez la fonction get_age_pyramid_data(df, year) qui, à partir du DataFrame généré par la fonction reshape_data(), renvoie un DataFrame avec les colonnes age, Femmes, Hommes. La colonne age doit contenir toutes les tranches d’âges présentes dans le jeu de données, les colonnes Femmes/Hommes correspond à la population féminine/masculine pour une tranche d’âge donnée. Dans un souci d’esthétique, la colonne Hommes sera au préalable multipliée par -1.

Résultat attendu

pyramide_data = solutions.get_age_pyramid_data(df, 2022)
pyramide_data

À vous de jouer !

def get_age_pyramid_data(df, year):
    # Votre code ici
    return pyramide_data

4.2- Définissez la fonction plot_age_pyramid(df, year, ax=None) qui représente la pyramide des âges de la France pour une année donnée. Vous pouvez vous inspirer de ce qui a été fait dans ce blog.

Résultat attendu

fig,(ax1,ax2) = plt.subplots(1,2,figsize=(15,6))

solutions.plot_age_pyramid(df, 1975, ax=ax1)
solutions.plot_age_pyramid(df, 2022, ax=ax2)

À vous de jouer !

def plot_age_pyramid(df, year, ax=None):
    if ax is None:
        ax = plt.gca()
    # Votre code ici
    return df

Partie 3 : Une introduction aux données géographiques

Les données géographiques sont très utiles car elles permettent de visualiser et d’analyser des informations liées à des emplacements spécifiques sur la terre. Les données géographiques peuvent être utilisées pour créer des cartes, des visualisations en 3D et des analyses spatiales pour comprendre les tendances, les modèles et les relations dans les données. En utilisant des bibliothèques Python telles que Geopandas ou Folium, vous pouvez facilement manipuler et visualiser des données géographiques pour répondre à vos besoins analytiques.

Afin de représenter graphiquement des données géographiques il est nécessaire d’obtenir les données des contours (shapefile) des zones que l’on souhaite représenter. L’objectif de cette partie est de créer une carte choropleth des régions en fonction de leur population respective.

Les données que nous avons actuellement contiennent les informations par département et non par région. Avant toute chose il est nécessaire d’affecter à chaque département sa région correspondante. Pour cela, vous pourrez utiliser le fichier .json disponible à l’adresse suivante : https://static.data.gouv.fr/resources/departements-et-leurs-regions/20190815-175403/departements-region.json.

Question 5

Créez un DataFrame à partir du fichier .json des départements et régions de France précédemment mentionné. Assurez-vous que les colonnes soient au bon format.

Résultat attendu

df_matching = solutions.load_departements_regions("https://static.data.gouv.fr/resources/departements-et-leurs-regions/20190815-175403/departements-region.json")
df_matching

À vous de jouer !

def load_departements_regions(url):
    # Votre code ici
    return df_matching

Question 6

Apparier le DataFrame contenant les données de population par département avec le DataFrame des régions de France.

Résultat attendu

df_regions = solutions.match_department_regions(df, df_matching)
df_regions

À vous de jouer !

def match_department_regions(df, df_matching):
    # Votre code ici
    return df_regions

Question 7

Téléchargez les données des contours géographiques des régions en utilisant le package cartiflette et la librairie geopandas. Les données sont accessibles à cette adresse.

Résultat attendu

geo = solutions.load_geo_data("https://minio.lab.sspcloud.fr/projet-cartiflette/diffusion/shapefiles-test1/year=2022/administrative_level=REGION/crs=4326/FRANCE_ENTIERE=metropole/vectorfile_format='geojson'/provider='IGN'/source='EXPRESS-COG-CARTO-TERRITOIRE'/raw.geojson")
geo

À vous de jouer !

def load_geo_data(url):
    # Votre code ici
    return geo

Question 8

Produire une carte choropleth de la population en 2022 des régions de France. Vous pouvez consulter la documentation de geopandas ici.

Résultat attendu

solutions.plot_population_by_regions(df_regions, geo, 2022)

À vous de jouer !

def plot_population_by_regions(df, geo, year):
    # Votre code ici

Question 9

La population totale d’une région n’est pas suffisante pour analyser la démographie d’une région. Il peut être intéressant de s’intéresser à la croissance démographique.

9.1- Ecrire une fonction compute_population_growth_per_region(df) qui calcule la croissance de la population en pourcentage par an pour chaque région.

Résultat attendu

df_croissance = solutions.compute_population_growth_per_region(df_regions)
df_croissance

À vous de jouer !

def compute_population_growth_per_region(df_regions):
    # Votre code ici
    return df_croissance

9.2- Ecrire une fonction compute_mean_population_growth_per_region(df, min_year, max_year) qui calcule la croissance moyenne de la population entre deux années données.

Résultat attendu

df_croissance = solutions.compute_mean_population_growth_per_region(df_regions, 2015, 2022)
df_croissance

À vous de jouer !

def compute_mean_population_growth_per_region(df, geo, year):
    # Votre code ici
    return df_croissance

9.3- Ecrire une fonction plot_growth_population_by_regions(df, geo, min_year, max_year) qui représente la croissance moyenne de la population entre deux années données pour toutes les régions de France sur une carte choropleth.

Résultat attendu

solutions.plot_growth_population_by_regions(df_regions, geo, 2015, 2022)

À vous de jouer !

def plot_growth_population_by_regions(df, geo, min_year, max_year):
    # Votre code ici