PROJET 4 DATA ANALYST

Réalisez une étude de santé publique avec Python

Etape 1 - Importation des librairies et chargement des fichiers

1.1a - Importation des librairies

In [ ]:
import pandas as pd
import numpy as np

#Afin d'éviter ce genre d'erreur: "SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame"
pd.options.mode.chained_assignment = None  # default='warn'

1.1b - Définition des fonctions

In [ ]:
def etiquette_serie_sans_mot(etiquette_serie, mots):
    """Transforme les séries Tonne en Kg"""

    for mot in mots:
        if mot in etiquette_serie:
            return False
    return True


def split_milliers(nombre):
    """Diviser les milliers par une marque, ex: 5346578 -> 5'346'578 """

    nombre = int(nombre)
    nombre = str(nombre)
    nombre = list(nombre)
    i = -3
    multiple_3 = len(nombre)%3
    x = len(nombre)//3

    if (multiple_3 == 0) or (nombre[0] == "-"):
         x -= 1

    if len(nombre)>3:
        for millier in range(x):
                nombre.insert(i,"'")
                i -= 4
    
    return "".join(nombre)


def dict_sum_series(list_series, df):
    """Applique un .sum() sur chaque séries données
    Les séries doivent être numériques"""

    valeurs_cat = {}
    for serie in list_series:
        valeurs_cat[serie] = serie
        valeurs_cat[serie] = df[serie].sum()
    return valeurs_cat

#Afin de créer des graphiques plus travaillés pour un .ptt, j'envoie des données dans un fichier Excel ciblé
def savedto_excel(df, slide_name):
    """ 
    Envoie les valeurs et les clés correspondantes dans une feuille Excel à chaque fois créée
    dans le fichier data-slides.xlsx de mon GoogleDrive
    -- UTILISATION PRIVÉE -- 
    """
    with pd.ExcelWriter("data-slides.xlsx",
                    mode='a', engine="openpyxl", if_sheet_exists="overlay" ) as writer:  
        df.to_excel(writer, sheet_name=slide_name)

1.2 - Chargement des fichiers Excel

In [ ]:
dossier_data = "DATA-FAO"
#Importation du fichier population.csv
population = pd.read_csv(dossier_data +'/population.csv')

#Importation du fichier dispo_alimentaire.csv
dispo_alimentaire = pd.read_csv(dossier_data +"/dispo_alimentaire.csv")

#Importation du fichier aide_alimentaire.csv
aide_alimentaire = pd.read_csv(dossier_data +"/aide_alimentaire.csv")

#Importation du fichier sous_nutrition.csv
sous_nutrition = pd.read_csv(dossier_data +"/sous_nutrition.csv")

#Importation du fichier cereales.csv
infos_cereales = pd.read_csv(dossier_data + "/FAOSTAT_cereales.csv")

Etape 2 - Analyse exploratoire des fichiers

2.1 - Analyse exploratoire du fichier population

In [ ]:
#Afficher les dimensions du dataset
print("Le tableau comporte {} observation(s) ou article(s)".format(population.shape[0]))
print("Le tableau comporte {} colonne(s)".format(population.shape[1]))
Le tableau comporte 1416 observation(s) ou article(s)
Le tableau comporte 3 colonne(s)
In [ ]:
#Création du dataframe
df_population = pd.DataFrame(population)
#Consulter le nombre de colonnes
#La nature des données dans chacune des colonnes
#Le nombre de valeurs présentes dans chacune des colonnes
df_population.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1416 entries, 0 to 1415
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Zone    1416 non-null   object 
 1   Année   1416 non-null   int64  
 2   Valeur  1416 non-null   float64
dtypes: float64(1), int64(1), object(1)
memory usage: 33.3+ KB
In [ ]:
#Affichage les 5 premières lignes de la table
df_population.head()
Out[ ]:
Zone Année Valeur
0 Afghanistan 2013 32269.589
1 Afghanistan 2014 33370.794
2 Afghanistan 2015 34413.603
3 Afghanistan 2016 35383.032
4 Afghanistan 2017 36296.113
In [ ]:
#Nous allons harmoniser les unités. Pour cela, nous avons décidé de multiplier la population par 1000
#Multiplication de la colonne valeur par 1000
df_population["Valeur"] = df_population["Valeur"].astype("int") * 1000
In [ ]:
#Changement du nom de la colonne Valeur par Population
df_population.rename(columns={"Valeur":"Population"}, inplace=True)
In [ ]:
#Affichage les 5 premières lignes de la table pour voir les modifications
df_population.head()
Out[ ]:
Zone Année Population
0 Afghanistan 2013 32269000
1 Afghanistan 2014 33370000
2 Afghanistan 2015 34413000
3 Afghanistan 2016 35383000
4 Afghanistan 2017 36296000

2.2 - Analyse exploratoire du fichier disponibilité alimentaire

In [ ]:
#Création du dataframe disponibilité alimentaire
df_dispo_alimentaire = pd.DataFrame(dispo_alimentaire)

#Afficher les dimensions du dataset
df_dispo_alimentaire.shape
Out[ ]:
(15605, 18)
In [ ]:
#Consulter le nombre de colonnes
print("\nLe tableau comporte {} séries:\n".format(df_dispo_alimentaire.shape[1]))

df_dispo_alimentaire.info()
Le tableau comporte 18 séries:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15605 entries, 0 to 15604
Data columns (total 18 columns):
 #   Column                                                         Non-Null Count  Dtype  
---  ------                                                         --------------  -----  
 0   Zone                                                           15605 non-null  object 
 1   Produit                                                        15605 non-null  object 
 2   Origine                                                        15605 non-null  object 
 3   Aliments pour animaux                                          2720 non-null   float64
 4   Autres Utilisations                                            5496 non-null   float64
 5   Disponibilité alimentaire (Kcal/personne/jour)                 14241 non-null  float64
 6   Disponibilité alimentaire en quantité (kg/personne/an)         14015 non-null  float64
 7   Disponibilité de matière grasse en quantité (g/personne/jour)  11794 non-null  float64
 8   Disponibilité de protéines en quantité (g/personne/jour)       11561 non-null  float64
 9   Disponibilité intérieure                                       15382 non-null  float64
 10  Exportations - Quantité                                        12226 non-null  float64
 11  Importations - Quantité                                        14852 non-null  float64
 12  Nourriture                                                     14015 non-null  float64
 13  Pertes                                                         4278 non-null   float64
 14  Production                                                     9180 non-null   float64
 15  Semences                                                       2091 non-null   float64
 16  Traitement                                                     2292 non-null   float64
 17  Variation de stock                                             6776 non-null   float64
dtypes: float64(15), object(3)
memory usage: 2.1+ MB
In [ ]:
#remplacement des NaN dans le dataset par des 0
df_dispo_alimentaire.fillna(0, inplace=True)
In [ ]:
#Affichage les 5 premières lignes de la table
df_dispo_alimentaire.head()
Out[ ]:
Zone Produit Origine Aliments pour animaux Autres Utilisations Disponibilité alimentaire (Kcal/personne/jour) Disponibilité alimentaire en quantité (kg/personne/an) Disponibilité de matière grasse en quantité (g/personne/jour) Disponibilité de protéines en quantité (g/personne/jour) Disponibilité intérieure Exportations - Quantité Importations - Quantité Nourriture Pertes Production Semences Traitement Variation de stock
0 Afghanistan Abats Comestible animale 0.0 0.0 5.0 1.72 0.20 0.77 53.0 0.0 0.0 53.0 0.0 53.0 0.0 0.0 0.0
1 Afghanistan Agrumes, Autres vegetale 0.0 0.0 1.0 1.29 0.01 0.02 41.0 2.0 40.0 39.0 2.0 3.0 0.0 0.0 0.0
2 Afghanistan Aliments pour enfants vegetale 0.0 0.0 1.0 0.06 0.01 0.03 2.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 0.0
3 Afghanistan Ananas vegetale 0.0 0.0 0.0 0.00 0.00 0.00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
4 Afghanistan Bananes vegetale 0.0 0.0 4.0 2.70 0.02 0.05 82.0 0.0 82.0 82.0 0.0 0.0 0.0 0.0 0.0
In [ ]:
#Multiplication de toutes les lignes contenant des milliers de tonnes en Kg
serie_sans_tonne = ["(Kcal/personne/jour)", "(kg/personne/an)","(g/personne/jour)"]

for serie in df_dispo_alimentaire:
    if (df_dispo_alimentaire[serie].dtype == "float64") and (etiquette_serie_sans_mot(serie, serie_sans_tonne)):
        df_dispo_alimentaire[serie] = df_dispo_alimentaire[serie] * 1000 * 1000
        df_dispo_alimentaire.rename(columns={serie:serie +" (kg)"}, inplace=True)
In [ ]:
#Affichage les 5 premières lignes de la table
df_dispo_alimentaire.head()
Out[ ]:
Zone Produit Origine Aliments pour animaux (kg) Autres Utilisations (kg) Disponibilité alimentaire (Kcal/personne/jour) Disponibilité alimentaire en quantité (kg/personne/an) Disponibilité de matière grasse en quantité (g/personne/jour) Disponibilité de protéines en quantité (g/personne/jour) Disponibilité intérieure (kg) Exportations - Quantité (kg) Importations - Quantité (kg) Nourriture (kg) Pertes (kg) Production (kg) Semences (kg) Traitement (kg) Variation de stock (kg)
0 Afghanistan Abats Comestible animale 0.0 0.0 5.0 1.72 0.20 0.77 53000000.0 0.0 0.0 53000000.0 0.0 53000000.0 0.0 0.0 0.0
1 Afghanistan Agrumes, Autres vegetale 0.0 0.0 1.0 1.29 0.01 0.02 41000000.0 2000000.0 40000000.0 39000000.0 2000000.0 3000000.0 0.0 0.0 0.0
2 Afghanistan Aliments pour enfants vegetale 0.0 0.0 1.0 0.06 0.01 0.03 2000000.0 0.0 2000000.0 2000000.0 0.0 0.0 0.0 0.0 0.0
3 Afghanistan Ananas vegetale 0.0 0.0 0.0 0.00 0.00 0.00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
4 Afghanistan Bananes vegetale 0.0 0.0 4.0 2.70 0.02 0.05 82000000.0 0.0 82000000.0 82000000.0 0.0 0.0 0.0 0.0 0.0

2.3 - Analyse exploratoire du fichier aide alimentaire

In [ ]:
#Création du dataframe aide alimentaire
df_aide_alimentaire = pd.DataFrame(aide_alimentaire)

#Afficher les dimensions du dataset
df_aide_alimentaire.shape
Out[ ]:
(1475, 4)
In [ ]:
#Consulter le nombre de colonnes
print("\nLe tableau comporte {} séries:\n".format(df_aide_alimentaire.shape[1]))

df_aide_alimentaire.info()
Le tableau comporte 4 séries:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1475 entries, 0 to 1474
Data columns (total 4 columns):
 #   Column             Non-Null Count  Dtype 
---  ------             --------------  ----- 
 0   Pays bénéficiaire  1475 non-null   object
 1   Année              1475 non-null   int64 
 2   Produit            1475 non-null   object
 3   Valeur             1475 non-null   int64 
dtypes: int64(2), object(2)
memory usage: 46.2+ KB
In [ ]:
#Affichage les 5 premières lignes de la table
df_aide_alimentaire.head()
Out[ ]:
Pays bénéficiaire Année Produit Valeur
0 Afghanistan 2013 Autres non-céréales 682
1 Afghanistan 2014 Autres non-céréales 335
2 Afghanistan 2013 Blé et Farin 39224
3 Afghanistan 2014 Blé et Farin 15160
4 Afghanistan 2013 Céréales 40504
In [ ]:
#Changement du nom de la colonne Pays bénéficiaire par Zone
df_aide_alimentaire.rename(columns={"Pays bénéficiaire":"Zone"}, inplace=True)
In [ ]:
#Changement du nom de la colonne Valeur par Aide_alimentaire
df_aide_alimentaire.rename(columns={"Valeur":"Aide alimentaire"}, inplace=True)
In [ ]:
#Multiplication de la colonne Aide_alimentaire qui contient des tonnes par 1000 pour avoir des kg
df_aide_alimentaire["Aide alimentaire"] = df_aide_alimentaire["Aide alimentaire"] * 1000

#Changement du nom de la colonne Aide alimentaire par Aide alimentaire (kg)
df_aide_alimentaire.rename(columns={"Aide alimentaire":"Aide alimentaire (kg)"}, inplace=True)
In [ ]:
#Affichage les 5 premières lignes de la table
df_aide_alimentaire.head()
Out[ ]:
Zone Année Produit Aide alimentaire (kg)
0 Afghanistan 2013 Autres non-céréales 682000
1 Afghanistan 2014 Autres non-céréales 335000
2 Afghanistan 2013 Blé et Farin 39224000
3 Afghanistan 2014 Blé et Farin 15160000
4 Afghanistan 2013 Céréales 40504000

2.3 - Analyse exploratoire du fichier sous nutrition

In [ ]:
#Création du dataframe aide alimentaire
df_sous_nutrition = pd.DataFrame(sous_nutrition)

#Afficher les dimensions du dataset
df_sous_nutrition.shape
Out[ ]:
(1218, 3)
In [ ]:
#Consulter le nombre de colonnes
print("\nLe tableau comporte {} séries:\n".format(df_sous_nutrition.shape[1]))

df_sous_nutrition.info()
Le tableau comporte 3 séries:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1218 entries, 0 to 1217
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   Zone    1218 non-null   object
 1   Année   1218 non-null   object
 2   Valeur  624 non-null    object
dtypes: object(3)
memory usage: 28.7+ KB
In [ ]:
#Afficher les 5 premières lignes de la table
df_sous_nutrition.head()
Out[ ]:
Zone Année Valeur
0 Afghanistan 2012-2014 8.6
1 Afghanistan 2013-2015 8.8
2 Afghanistan 2014-2016 8.9
3 Afghanistan 2015-2017 9.7
4 Afghanistan 2016-2018 10.5
In [ ]:
#Conversion de la colonne (avec l'argument errors=coerce qui permet de convertir automatiquement les lignes qui ne sont pas des nombres en NaN)
df_sous_nutrition['Valeur'] = pd.to_numeric(df_sous_nutrition['Valeur'], errors="coerce")
In [ ]:
#Puis remplacement des NaN en 0
df_sous_nutrition.fillna(0, inplace=True)
In [ ]:
#Vérification de valeurs manquantes dans Valeur
df_sous_nutrition.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1218 entries, 0 to 1217
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Zone    1218 non-null   object 
 1   Année   1218 non-null   object 
 2   Valeur  1218 non-null   float64
dtypes: float64(1), object(2)
memory usage: 28.7+ KB
In [ ]:
#Changement du nom de la colonne Valeur par sous_nutrition
df_sous_nutrition.rename(columns={"Valeur":"Sous nutrition"}, inplace=True)
In [ ]:
#Multiplication de la colonne sous_nutrition par 1000000
df_sous_nutrition["Sous nutrition"] = df_sous_nutrition["Sous nutrition"] * 1000000
In [ ]:
#Afficher les 5 premières lignes de la table
df_sous_nutrition.head()
Out[ ]:
Zone Année Sous nutrition
0 Afghanistan 2012-2014 8600000.0
1 Afghanistan 2013-2015 8800000.0
2 Afghanistan 2014-2016 8900000.0
3 Afghanistan 2015-2017 9700000.0
4 Afghanistan 2016-2018 10500000.0

Vérification des clés primaires de chaque data frame¶

In [ ]:
#Récupération des zones afin de vérifier que chaque zone sera écrit de la même manière entre les différents dataframe
zones_population = df_population["Zone"].unique()

len(zones_population)
Out[ ]:
236
In [ ]:
#Récupération des zones afin de vérifier que chaque zone sera écrit de la même manière entre les différents dataframe
zones_dispo_alim = df_dispo_alimentaire["Zone"].unique()

len(zones_dispo_alim)
Out[ ]:
174
In [ ]:
#Récupération des zones afin de vérifier que chaque zone sera écrit de la même manière entre les différents dataframe
zones_aide_alim = df_aide_alimentaire["Zone"].unique()

len(zones_aide_alim)
Out[ ]:
76
In [ ]:
#Récupération des zones afin de vérifier que chaque zone sera écrit de la même manière entre les différents dataframe
zones_ss_nutrition = df_sous_nutrition["Zone"].unique()

len(zones_ss_nutrition)
Out[ ]:
203
In [ ]:
#Création de la liste de toutes les zones des 3 dataframe
total_listes = zones_dispo_alim.tolist() + zones_aide_alim.tolist() + zones_ss_nutrition.tolist()

Pays = []
#Comparaison des noms de zone entre la plus grande base de données(zones_population) et toutes les autres zones
#En partant du principe que la casse est respéctée
for zone_unique in zones_population:
    for zone in total_listes:
        #Si le nom de la zone de la liste total_listes est dans le nom de la zone zone_unique
        if (zone.find(zone_unique) != -1):
            Pays.append(zone.partition(zone_unique))

        #Si le nom de la zone de la liste zone_unique est dans le nom de la zone total_listes
        elif (zone_unique.find(zone) != -1):
            Pays.append(zone_unique.partition(zone))

#Ajout des zones potentiellement concernées
differentes_zones = []
for i in Pays:
    if i[0] != i[2]:
        differentes_zones.append(i)


differentes_zones
Out[ ]:
[('République démocratique du ', 'Congo', ''),
 ('République démocratique du ', 'Congo', ''),
 ('', 'Guinée', '-Bissau'),
 ('', 'Guinée', '-Bissau'),
 ('', 'Guinée', ' équatoriale'),
 ('', 'Guinée', '-Bissau'),
 ('Papouasie-Nouvelle-', 'Guinée', ''),
 ('', 'Guinée', ' équatoriale'),
 ('', 'Guinée', ' équatoriale'),
 ('', 'Guinée', ' équatoriale'),
 ('', 'Guinée', '-Bissau'),
 ('', 'Guinée', '-Bissau'),
 ('', 'Guinée', '-Bissau'),
 ("Royaume-Uni de Grande-Bretagne et d'", 'Irlande', ' du Nord'),
 ('Papouasie-Nouvelle-', 'Guinée', ''),
 ('Papouasie-Nouvelle-', 'Guinée', ''),
 ('Papouasie-Nouvelle-', 'Guinée', ''),
 ('République démocratique du ', 'Congo', ''),
 ('République démocratique du ', 'Congo', ''),
 ('République démocratique du ', 'Congo', ''),
 ("Royaume-Uni de Grande-Bretagne et d'", 'Irlande', ' du Nord'),
 ('', 'Royaume-Uni', " de Grande-Bretagne et d'Irlande du Nord"),
 ("Royaume-Uni de Grande-Bretagne et d'", 'Irlande', ' du Nord'),
 ('', 'Samoa', ' américaines'),
 ('', 'Samoa', ' américaines'),
 ('', 'Samoa', ' américaines'),
 ('', 'Soudan', ' du Sud'),
 ('', 'Soudan', ' du Sud'),
 ('', 'Soudan', ' du Sud'),
 ('', 'Soudan', ' du Sud'),
 ('', 'Soudan', ' du Sud'),
 ('', 'Tchéquie', ' (la)')]

Il y existe effectivement plusieurs pays portant le mot Guinée, Congo, Soudan et Samoa.
En revanche, nous pouvons normaliser les zones Royaume-Uni et Tchéquie.

In [ ]:
#Remplacement des variation de noms de zones par un nom strictement similaire à chacun
royaume_uni = "Royaume-Uni"
tchequie = "Tchéquie"
list_df = [df_aide_alimentaire, df_dispo_alimentaire, df_sous_nutrition, df_population]

for df in list_df:
    for zone_unique in df["Zone"]:
        if zone_unique.find(royaume_uni) != -1:
            df["Zone"].replace(zone_unique,royaume_uni, inplace=True)

        elif zone_unique.find(tchequie) != -1:
            df["Zone"].replace(zone_unique,tchequie, inplace=True)

3.1 - Proportion de personnes en sous nutrition

In [ ]:
# Il faut tout d'abord faire une jointure entre la table population et la table sous nutrition, en ciblant l'année 2017
#Sélection année 2017 et visualisation du nombre de pays dans le tableau sous_nutrition
df_sous_nutrition_2017 = df_sous_nutrition.loc[df_sous_nutrition["Année"] == "2016-2018"]

#Suppression de la colonne année pour éviter une redondance lors de la jointure
df_sous_nutrition_2017.drop(columns="Année", inplace=True)

df_sous_nutrition_2017.info()
<class 'pandas.core.frame.DataFrame'>
Index: 203 entries, 4 to 1216
Data columns (total 2 columns):
 #   Column          Non-Null Count  Dtype  
---  ------          --------------  -----  
 0   Zone            203 non-null    object 
 1   Sous nutrition  203 non-null    float64
dtypes: float64(1), object(1)
memory usage: 4.8+ KB
In [ ]:
#Sélection année 2017 et visualisation du nombre de pays dans le tableau population
df_population_2017 = df_population.loc[df_population["Année"] == 2017]

df_population_2017.info()
<class 'pandas.core.frame.DataFrame'>
Index: 236 entries, 4 to 1414
Data columns (total 3 columns):
 #   Column      Non-Null Count  Dtype 
---  ------      --------------  ----- 
 0   Zone        236 non-null    object
 1   Année       236 non-null    int64 
 2   Population  236 non-null    int32 
dtypes: int32(1), int64(1), object(1)
memory usage: 6.5+ KB
In [ ]:
# Merge sur df_population_2017 car plus de pays
df_sous_nutrition = df_population_2017.merge(df_sous_nutrition_2017, on='Zone')

df_sous_nutrition.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 203 entries, 0 to 202
Data columns (total 4 columns):
 #   Column          Non-Null Count  Dtype  
---  ------          --------------  -----  
 0   Zone            203 non-null    object 
 1   Année           203 non-null    int64  
 2   Population      203 non-null    int32  
 3   Sous nutrition  203 non-null    float64
dtypes: float64(1), int32(1), int64(1), object(1)
memory usage: 5.7+ KB
In [ ]:
#Affichage du dataset
df_sous_nutrition.head()
Out[ ]:
Zone Année Population Sous nutrition
0 Afghanistan 2017 36296000 10500000.0
1 Afrique du Sud 2017 57009000 3100000.0
2 Albanie 2017 2884000 100000.0
3 Algérie 2017 41389000 1300000.0
4 Allemagne 2017 82658000 0.0
In [ ]:
df_sous_nutrition.tail()
Out[ ]:
Zone Année Population Sous nutrition
198 Venezuela (République bolivarienne du) 2017 29402000 8000000.0
199 Viet Nam 2017 94600000 6500000.0
200 Yémen 2017 27834000 0.0
201 Zambie 2017 16853000 0.0
202 Zimbabwe 2017 14236000 0.0
In [ ]:
#Calcul et affichage du nombre de personnes en état de sous nutrition
ss_nourris = df_sous_nutrition["Sous nutrition"].sum()

print("Il y a",split_milliers(ss_nourris)," personnes en sous nutrition dans le monde en 2017.")
Il y a 535'700'000  personnes en sous nutrition dans le monde en 2017.
In [ ]:
#Calcul et affichage du nombre total de personnes sur le globe
population = df_sous_nutrition["Population"].sum()

print("Il y a",split_milliers(population)," personnes dans le monde en 2017.")
Il y a 7'543'700'000  personnes dans le monde en 2017.
In [ ]:
#Calcul et affichage de la proportion de personnes sous-nourries sur Terre 
ratio_ss_nourri = ss_nourris *  100 / population

print("Il y a {}% personnes en sous nutrition dans le monde en 2017.".format(ratio_ss_nourri.round(2)))
Il y a 7.1% personnes en sous nutrition dans le monde en 2017.

3.2 - Nombre théorique de personne qui pourrait être nourries

In [ ]:
#Combien mange en moyenne un être humain ? 
#Source => https://www.msdmanuals.com/fr/accueil/multimedia/table/nombre-de-calories-n%C3%A9cessaires-estim%C3%A9-dapr%C3%A8s-l%C3%A2ge-le-sexe-et-le-niveau-dactivit%C3%A9-physique
"""
Nombre de calories nécessaires estimé d’après l’âge, le sexe et le niveau d’activité physique (en kcal/jour/pers)

Moyennes calculées sur le sexe et l'activité moyenne (Sedentaire + Actif)
Moyenne Jeunes enfants (âgés de 2 à 6 ans): 1250
Moyenne Enfants plus âgés et adolescents (âgés de 7 à 18 ans): 1950
Moyenne Adultes (âgés de 19 à 60 ans): 2250
Moyenne Adultes (âgés de 61 ans et plus): 1975

Moyenne global : 1856 -> arrondi à 1900 kcal (stable chaque année)
"""

kcal_moy_pers_jour = 1900
print("La consommation moyenne dans le monde est de {} calories par personne et par jour.".format(kcal_moy_pers_jour))
La consommation moyenne dans le monde est de 1900 calories par personne et par jour.
In [ ]:
#On veut faire une jointure entre le df_population et df_dispo_alimentaire, mais avant vérifions leur taille
print("Nombre de zone pour:\n df_dispo_alimentaire =",df_dispo_alimentaire["Zone"].unique().shape[0],
      "\n df_sous_nutrition =",df_sous_nutrition["Zone"].unique().shape[0])
Nombre de zone pour:
 df_dispo_alimentaire = 174 
 df_sous_nutrition = 203
In [ ]:
#Il semble manquer des zones dans le df_dispo_alimentaire
zones_ss_nutr = df_sous_nutrition["Zone"].unique()
zones_disp_alim = df_dispo_alimentaire["Zone"].unique()

zones_manquantes = []
for zone in zones_ss_nutr:
    if zone not in zones_disp_alim:
        zones_manquantes.append(zone)

print(len(zones_manquantes),"zones manquantes, dont:", zones_manquantes)
29 zones manquantes, dont: ['Andorre', 'Bahreïn', 'Bhoutan', 'Burundi', 'Comores', 'Érythrée', 'Groenland', 'Guinée équatoriale', 'Îles Cook', 'Îles Marshall', 'Libye', 'Micronésie (États fédérés de)', 'Nauru', 'Nioué', 'Palaos', 'Palestine', 'Papouasie-Nouvelle-Guinée', 'Porto Rico', 'Qatar', 'République arabe syrienne', 'République démocratique du Congo', 'Samoa américaines', 'Seychelles', 'Singapour', 'Somalie', 'Soudan du Sud', 'Tokélaou', 'Tonga', 'Tuvalu']

Ce sont majoritairement des ìles qui ne sont pas recencées dans le data frame df_dispo_alimentaire

In [ ]:
#On commence par faire une jointure entre le data frame population et Dispo_alimentaire afin d'ajouter dans ce dernier la population
#Merge sur df_sous_nutrition pour garder les zones non_renseignées de df_dispo_alimentaire
df_sous_nutrition = df_sous_nutrition.merge(df_dispo_alimentaire, how="left", on='Zone')
In [ ]:
#Affichage du nouveau dataframe
df_sous_nutrition.info()
df_sous_nutrition.head()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15634 entries, 0 to 15633
Data columns (total 21 columns):
 #   Column                                                         Non-Null Count  Dtype  
---  ------                                                         --------------  -----  
 0   Zone                                                           15634 non-null  object 
 1   Année                                                          15634 non-null  int64  
 2   Population                                                     15634 non-null  int32  
 3   Sous nutrition                                                 15634 non-null  float64
 4   Produit                                                        15605 non-null  object 
 5   Origine                                                        15605 non-null  object 
 6   Aliments pour animaux (kg)                                     15605 non-null  float64
 7   Autres Utilisations (kg)                                       15605 non-null  float64
 8   Disponibilité alimentaire (Kcal/personne/jour)                 15605 non-null  float64
 9   Disponibilité alimentaire en quantité (kg/personne/an)         15605 non-null  float64
 10  Disponibilité de matière grasse en quantité (g/personne/jour)  15605 non-null  float64
 11  Disponibilité de protéines en quantité (g/personne/jour)       15605 non-null  float64
 12  Disponibilité intérieure (kg)                                  15605 non-null  float64
 13  Exportations - Quantité (kg)                                   15605 non-null  float64
 14  Importations - Quantité (kg)                                   15605 non-null  float64
 15  Nourriture (kg)                                                15605 non-null  float64
 16  Pertes (kg)                                                    15605 non-null  float64
 17  Production (kg)                                                15605 non-null  float64
 18  Semences (kg)                                                  15605 non-null  float64
 19  Traitement (kg)                                                15605 non-null  float64
 20  Variation de stock (kg)                                        15605 non-null  float64
dtypes: float64(16), int32(1), int64(1), object(3)
memory usage: 2.4+ MB
Out[ ]:
Zone Année Population Sous nutrition Produit Origine Aliments pour animaux (kg) Autres Utilisations (kg) Disponibilité alimentaire (Kcal/personne/jour) Disponibilité alimentaire en quantité (kg/personne/an) ... Disponibilité de protéines en quantité (g/personne/jour) Disponibilité intérieure (kg) Exportations - Quantité (kg) Importations - Quantité (kg) Nourriture (kg) Pertes (kg) Production (kg) Semences (kg) Traitement (kg) Variation de stock (kg)
0 Afghanistan 2017 36296000 10500000.0 Abats Comestible animale 0.0 0.0 5.0 1.72 ... 0.77 53000000.0 0.0 0.0 53000000.0 0.0 53000000.0 0.0 0.0 0.0
1 Afghanistan 2017 36296000 10500000.0 Agrumes, Autres vegetale 0.0 0.0 1.0 1.29 ... 0.02 41000000.0 2000000.0 40000000.0 39000000.0 2000000.0 3000000.0 0.0 0.0 0.0
2 Afghanistan 2017 36296000 10500000.0 Aliments pour enfants vegetale 0.0 0.0 1.0 0.06 ... 0.03 2000000.0 0.0 2000000.0 2000000.0 0.0 0.0 0.0 0.0 0.0
3 Afghanistan 2017 36296000 10500000.0 Ananas vegetale 0.0 0.0 0.0 0.00 ... 0.00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
4 Afghanistan 2017 36296000 10500000.0 Bananes vegetale 0.0 0.0 4.0 2.70 ... 0.05 82000000.0 0.0 82000000.0 82000000.0 0.0 0.0 0.0 0.0 0.0

5 rows × 21 columns

In [ ]:
df_sous_nutrition.tail()
Out[ ]:
Zone Année Population Sous nutrition Produit Origine Aliments pour animaux (kg) Autres Utilisations (kg) Disponibilité alimentaire (Kcal/personne/jour) Disponibilité alimentaire en quantité (kg/personne/an) ... Disponibilité de protéines en quantité (g/personne/jour) Disponibilité intérieure (kg) Exportations - Quantité (kg) Importations - Quantité (kg) Nourriture (kg) Pertes (kg) Production (kg) Semences (kg) Traitement (kg) Variation de stock (kg)
15629 Zimbabwe 2017 14236000 0.0 Viande de Suides animale 0.0 0.0 24.0 2.65 ... 0.83 37000000.0 0.0 6000000.0 37000000.0 0.0 32000000.0 0.0 0.0 0.0
15630 Zimbabwe 2017 14236000 0.0 Viande de Volailles animale 0.0 0.0 17.0 4.97 ... 1.69 70000000.0 0.0 6000000.0 70000000.0 0.0 64000000.0 0.0 0.0 0.0
15631 Zimbabwe 2017 14236000 0.0 Viande, Autre animale 0.0 1000000.0 7.0 2.29 ... 1.12 34000000.0 3000000.0 1000000.0 32000000.0 0.0 36000000.0 0.0 0.0 0.0
15632 Zimbabwe 2017 14236000 0.0 Vin vegetale 0.0 0.0 1.0 0.27 ... 0.00 4000000.0 0.0 2000000.0 4000000.0 0.0 2000000.0 0.0 0.0 0.0
15633 Zimbabwe 2017 14236000 0.0 Épices, Autres vegetale 0.0 0.0 1.0 0.06 ... 0.02 1000000.0 0.0 0.0 1000000.0 0.0 1000000.0 0.0 0.0 0.0

5 rows × 21 columns

In [ ]:
#Création de la colonne dispo_kcal avec calcul des kcal disponibles mondialement
df_sous_nutrition["Disponibilité alimentaire (Kcal)"] = df_sous_nutrition["Disponibilité alimentaire (Kcal/personne/jour)"] * df_sous_nutrition["Population"] * 365

#Création de la variable contenant le total de calories disponibles mondialement pour la consommation humaine
kcal_dispo_monde = df_sous_nutrition["Disponibilité alimentaire (Kcal)"].sum() 

print("Il y a",split_milliers(kcal_dispo_monde), "kcal disponibles au niveau mondial sur une année.")
Il y a 7'731'400'519'315'000 kcal disponibles au niveau mondial sur une année.
In [ ]:
#Calcul du nombre d'humains pouvant être nourris
capacite_pop_mondiale = kcal_dispo_monde / kcal_moy_pers_jour  / 365

print("Il est possible de nourrir",split_milliers(capacite_pop_mondiale),
       "personnes à raison de", split_milliers(kcal_moy_pers_jour),
       "kcal par personnes et par jour pendant une année.")
Il est possible de nourrir 11'148'378'542 personnes à raison de 1'900 kcal par personnes et par jour pendant une année.
In [ ]:
# Calcule de la population mondiale en 2017
df_temp = df_sous_nutrition.groupby(["Zone"])["Population"].mean()
df_temp = df_temp.reset_index()

#Création de la variable contenant la population mondiale en 2017
population_mondiale = df_temp["Population"].sum()

3.3 - Nombre théorique de personne qui pourrait être nourrie avec les produits végétaux

In [ ]:
#Transfert des données avec les végétaux dans un nouveau dataframe
df_vegetaux = df_sous_nutrition.loc[df_sous_nutrition["Origine"] == "vegetale"].reset_index()
In [ ]:
#Affichage de la taille du data frame
df_vegetaux.shape
Out[ ]:
(11896, 23)
In [ ]:
#Calcul du nombre de kcal disponible pour les végétaux
kcal_vege_dispo_monde = df_vegetaux["Disponibilité alimentaire (Kcal)"].sum() 

print("Il y a",split_milliers(kcal_vege_dispo_monde), "kcal végétales disponibles au niveau mondial sur une année.")
Il y a 6'368'999'610'730'000 kcal végétales disponibles au niveau mondial sur une année.
In [ ]:
#Calcul du nombre d'humains pouvant être nourris avec les végétaux
capacite_vege_pop_mondiale = kcal_vege_dispo_monde / kcal_moy_pers_jour  / 365

print("Il est possible de nourrir",split_milliers(capacite_vege_pop_mondiale),
       "personnes à raison de", split_milliers(kcal_moy_pers_jour),
       "calories végétales par personnes et par jour pendant une année.")
Il est possible de nourrir 9'183'849'474 personnes à raison de 1'900 calories végétales par personnes et par jour pendant une année.
In [ ]:
#Calcul du ratio de calories végétales sur le total des calories
ratio_vege = round(kcal_vege_dispo_monde * 100 / kcal_dispo_monde,2)

print("Les calories végétales représentent {}% des calories totales disponibles.".format(ratio_vege))
Les calories végétales représentent 82.38% des calories totales disponibles.

3.4 - Utilisation de la disponibilité intérieure

In [ ]:
#Affichage global du data frame
df_sous_nutrition.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15634 entries, 0 to 15633
Data columns (total 22 columns):
 #   Column                                                         Non-Null Count  Dtype  
---  ------                                                         --------------  -----  
 0   Zone                                                           15634 non-null  object 
 1   Année                                                          15634 non-null  int64  
 2   Population                                                     15634 non-null  int32  
 3   Sous nutrition                                                 15634 non-null  float64
 4   Produit                                                        15605 non-null  object 
 5   Origine                                                        15605 non-null  object 
 6   Aliments pour animaux (kg)                                     15605 non-null  float64
 7   Autres Utilisations (kg)                                       15605 non-null  float64
 8   Disponibilité alimentaire (Kcal/personne/jour)                 15605 non-null  float64
 9   Disponibilité alimentaire en quantité (kg/personne/an)         15605 non-null  float64
 10  Disponibilité de matière grasse en quantité (g/personne/jour)  15605 non-null  float64
 11  Disponibilité de protéines en quantité (g/personne/jour)       15605 non-null  float64
 12  Disponibilité intérieure (kg)                                  15605 non-null  float64
 13  Exportations - Quantité (kg)                                   15605 non-null  float64
 14  Importations - Quantité (kg)                                   15605 non-null  float64
 15  Nourriture (kg)                                                15605 non-null  float64
 16  Pertes (kg)                                                    15605 non-null  float64
 17  Production (kg)                                                15605 non-null  float64
 18  Semences (kg)                                                  15605 non-null  float64
 19  Traitement (kg)                                                15605 non-null  float64
 20  Variation de stock (kg)                                        15605 non-null  float64
 21  Disponibilité alimentaire (Kcal)                               15605 non-null  float64
dtypes: float64(17), int32(1), int64(1), object(3)
memory usage: 2.6+ MB
In [ ]:
#Création d'une boucle for pour afficher les différentes valeurs en fonction des colonnes aliments pour animaux, pertes, nourritures, etc...
cat_disponibilites = ["Production (kg)", "Importations - Quantité (kg)", 
                      "Exportations - Quantité (kg)", "Variation de stock (kg)", "Disponibilité intérieure (kg)"]

#Création d'un dictionnaire avec chaque série aggrégée en somme
dict_series = dict_sum_series(cat_disponibilites, df_sous_nutrition)
In [ ]:
#Calcul Disponibilité interieur par les mouvements
a = dict_series["Production (kg)"] + dict_series["Importations - Quantité (kg)"] - dict_series["Exportations - Quantité (kg)"] + dict_series["Variation de stock (kg)"]

#Récupération de la Disponibilité interieur
b = dict_series["Disponibilité intérieure (kg)"]
In [ ]:
#Calcul Disponibilité interieur par la distribution des ressources

#Création d'une boucle for pour afficher les différentes valeurs en fonction des colonnes aliments pour animaux, pertes, nourritures, 
cat_disponibilites = [ "Aliments pour animaux (kg)", "Pertes (kg)", "Nourriture (kg)", 
                      "Semences (kg)", "Traitement (kg)", "Autres Utilisations (kg)"]

#Création d'un dictionnaire avec chaque série aggrégée en somme
dict_series = dict_sum_series(cat_disponibilites, df_sous_nutrition)

c = 0
for serie in dict_series:
    c += dict_series[serie]
In [ ]:
print("\nIl y a:\n",split_milliers(b),"k tonnes de Disponibilité intérieur\n",
      split_milliers(a),"k tonnes de Prod. + Import. - Export. + Variation\n",
      split_milliers(c),"k tonnes d'Alim. animaux + Pertes + Nourriture + Semences + Traitement + Autres  util.")
Il y a:
 9'848'994'000'000 k tonnes de Disponibilité intérieur
 9'849'173'000'000 k tonnes de Prod. + Import. - Export. + Variation
 9'858'592'000'000 k tonnes d'Alim. animaux + Pertes + Nourriture + Semences + Traitement + Autres  util.
In [ ]:
#Organisation des données pour Excel
for serie in dict_series:
    print(split_milliers(dict_series[serie]),"kg dédiés pour:", serie)

dict_series = pd.DataFrame(list(dict_series.items()))
1'304'245'000'000 kg dédiés pour: Aliments pour animaux (kg)
453'698'000'000 kg dédiés pour: Pertes (kg)
4'876'258'000'000 kg dédiés pour: Nourriture (kg)
154'681'000'000 kg dédiés pour: Semences (kg)
2'204'687'000'000 kg dédiés pour: Traitement (kg)
865'023'000'000 kg dédiés pour: Autres Utilisations (kg)
In [ ]:
#Envoie des valeurs affichées ci-dessus dans un fichier Excel pour le slide n°7
savedto_excel( dict_series, "Slide 7")

3.5 - Utilisation des céréales

In [ ]:
#Création d'une liste avec toutes les variables selon Julien Laole (exercice)
#Julien propose d'ajouter le Soja -> Soja == légumineuse sèche != céréale
cereales = ["Blé","Riz (Eq Blanchi)","Orge","Maïs","Seigle","Avoine","Millet","Sorgho","Céréales, Autres"]

cereales
Out[ ]:
['Blé',
 'Riz (Eq Blanchi)',
 'Orge',
 'Maïs',
 'Seigle',
 'Avoine',
 'Millet',
 'Sorgho',
 'Céréales, Autres']
In [ ]:
#Vérification qu'il n'en manque pas
verif_cereales = df_vegetaux["Produit"].unique()

#Passage d'un array (matrice de 1) en liste
verif_cereales = verif_cereales.tolist()

verif_cereales
Out[ ]:
['Agrumes, Autres',
 'Aliments pour enfants',
 'Ananas',
 'Bananes',
 'Bière',
 'Blé',
 'Boissons Alcooliques',
 'Café',
 'Coco (Incl Coprah)',
 'Céréales, Autres',
 'Dattes',
 'Edulcorants Autres',
 'Feve de Cacao',
 'Fruits, Autres',
 'Graines de coton',
 'Graines de tournesol',
 'Huil Plantes Oleif Autr',
 'Huile Graines de Coton',
 "Huile d'Arachide",
 "Huile d'Olive",
 'Huile de Colza&Moutarde',
 'Huile de Palme',
 'Huile de Soja',
 'Huile de Sésame',
 'Huile de Tournesol',
 'Légumes, Autres',
 'Légumineuses Autres',
 'Maïs',
 'Miel',
 'Millet',
 'Miscellanees',
 'Noix',
 'Olives',
 'Oranges, Mandarines',
 'Orge',
 'Plantes Oleiferes, Autre',
 'Poivre',
 'Pommes',
 'Pommes de Terre',
 'Raisin',
 'Riz (Eq Blanchi)',
 'Sucre Eq Brut',
 'Sucre, betterave',
 'Sucre, canne',
 'Sésame',
 'Thé',
 'Tomates',
 'Vin',
 'Épices, Autres',
 'Alcool, non Comestible',
 'Arachides Decortiquees',
 'Avoine',
 'Bananes plantains',
 'Boissons Fermentés',
 'Citrons & Limes',
 'Girofles',
 'Graines Colza/Moutarde',
 'Haricots',
 'Huile de Coco',
 'Huile de Germe de Maïs',
 'Huile de Palmistes',
 'Ignames',
 'Manioc',
 'Oignons',
 'Palmistes',
 'Pamplemousse',
 'Patates douces',
 'Piments',
 'Pois',
 'Racines nda',
 'Seigle',
 'Soja',
 'Sorgho',
 'Huile de Son de Riz',
 'Sucre non centrifugé']
In [ ]:
#Création d'un dataframe avec les informations uniquement pour ces céréales 
df_cereales = df_sous_nutrition.loc[df_sous_nutrition["Produit"].isin(cereales)]

#Affichage de la taille du data frame
df_cereales.shape
Out[ ]:
(1497, 22)
In [ ]:
#Affichage du data frame
df_cereales.head()
Out[ ]:
Zone Année Population Sous nutrition Produit Origine Aliments pour animaux (kg) Autres Utilisations (kg) Disponibilité alimentaire (Kcal/personne/jour) Disponibilité alimentaire en quantité (kg/personne/an) ... Disponibilité intérieure (kg) Exportations - Quantité (kg) Importations - Quantité (kg) Nourriture (kg) Pertes (kg) Production (kg) Semences (kg) Traitement (kg) Variation de stock (kg) Disponibilité alimentaire (Kcal)
7 Afghanistan 2017 36296000 10500000.0 Blé vegetale 0.0 0.0 1369.0 160.23 ... 5.992000e+09 0.0 1.173000e+09 4.895000e+09 775000000.0 5.169000e+09 322000000.0 0.0 -350000000.0 1.813657e+13
12 Afghanistan 2017 36296000 10500000.0 Céréales, Autres vegetale 0.0 0.0 0.0 0.00 ... 0.000000e+00 0.0 0.000000e+00 0.000000e+00 0.0 0.000000e+00 0.0 0.0 0.0 0.000000e+00
32 Afghanistan 2017 36296000 10500000.0 Maïs vegetale 200000000.0 0.0 21.0 2.50 ... 3.130000e+08 0.0 1.000000e+06 7.600000e+07 31000000.0 3.120000e+08 5000000.0 0.0 0.0 2.782088e+11
34 Afghanistan 2017 36296000 10500000.0 Millet vegetale 0.0 0.0 3.0 0.40 ... 1.300000e+07 0.0 0.000000e+00 1.200000e+07 1000000.0 1.300000e+07 0.0 0.0 0.0 3.974412e+10
40 Afghanistan 2017 36296000 10500000.0 Orge vegetale 360000000.0 0.0 26.0 2.92 ... 5.240000e+08 0.0 1.000000e+07 8.900000e+07 52000000.0 5.140000e+08 22000000.0 0.0 0.0 3.444490e+11

5 rows × 22 columns

In [ ]:
#Affichage de la proportion d'alimentation animale
cat_disponibilites = ["Aliments pour animaux (kg)", "Disponibilité intérieure (kg)"]
dict_series = dict_sum_series(cat_disponibilites, df_cereales)

#Création du ratio
ratio_cereales_animale = dict_series["Aliments pour animaux (kg)"] * 100 / dict_series["Disponibilité intérieure (kg)"]

print("Il y a {}% des céréales qui sont dédiés à l'alimentation animale.".format(ratio_cereales_animale.round(2))) 
Il y a 36.29% des céréales qui sont dédiés à l'alimentation animale.
In [ ]:
#Affichage de la proportion d'alimentation humaine
cat_disponibilites = ["Nourriture (kg)", "Disponibilité intérieure (kg)"]
dict_series = dict_sum_series(cat_disponibilites, df_cereales)

ratio_cereales_humain = dict_series["Nourriture (kg)"] * 100 / dict_series["Disponibilité intérieure (kg)"]

print("Il y a", ratio_cereales_humain.round(2),"% des céréales qui sont dédiés à l'alimentation humaine.")
Il y a 42.75 % des céréales qui sont dédiés à l'alimentation humaine.
In [ ]:
#Affichage de la proportion d'utilisations diverses
cat_disponibilites = ["Pertes (kg)","Semences (kg)","Traitement (kg)",
                      "Autres Utilisations (kg)", "Disponibilité intérieure (kg)"]

dict_series = dict_sum_series(cat_disponibilites, df_cereales)

autres_utilisations = dict_series["Pertes (kg)"] + dict_series["Semences (kg)"] + dict_series["Traitement (kg)"] + dict_series["Autres Utilisations (kg)"]

ratio_cereales_divers = autres_utilisations * 100 / dict_series["Disponibilité intérieure (kg)"]

print("Il y a", ratio_cereales_divers.round(2),"% des céréales qui sont dédiés à diverses utilisations ou pertes.")
Il y a 20.98 % des céréales qui sont dédiés à diverses utilisations ou pertes.
In [ ]:
#Vérification que l'on tombe bien sur un total à 100%
Test_parts_disponibilite_cereales = ratio_cereales_animale + ratio_cereales_humain + ratio_cereales_divers

Test_parts_disponibilite_cereales.round(1)
Out[ ]:
100.0
In [ ]:
#On va envoyer les valeurs si dessus dans notre fichier excel

#Création du dictionnaire de valeurs
dict_ratio_cereales = pd.DataFrame(list({
                        "Alimentation animaux":ratio_cereales_animale,
                       "Alimentations humaine":ratio_cereales_humain,
                       "Utilisations diverses & pertes":ratio_cereales_divers
                       }.items()))
In [ ]:
#Envoie des valeurs affichées ci-dessus dans un fichier Excel pour le slide n°8
savedto_excel(dict_ratio_cereales,"Slide 8")
In [ ]:
#Nous allons regarder comment sont distribués les différents céréales

#Création du dataframe
df_details_cereales = df_cereales.groupby(["Produit"])[["Aliments pour animaux (kg)", "Disponibilité intérieure (kg)","Nourriture (kg)"]].sum().reset_index()

df_details_cereales
Out[ ]:
Produit Aliments pour animaux (kg) Disponibilité intérieure (kg) Nourriture (kg)
0 Avoine 1.625100e+10 2.340700e+10 3.903000e+09
1 Blé 1.296680e+11 6.794980e+11 4.578240e+11
2 Céréales, Autres 1.903500e+10 2.748500e+10 5.324000e+09
3 Maïs 5.461160e+11 9.557990e+11 1.251840e+11
4 Millet 3.306000e+09 2.991100e+10 2.304000e+10
5 Orge 9.265800e+10 1.404390e+11 6.794000e+09
6 Riz (Eq Blanchi) 3.359400e+10 4.756560e+11 3.772860e+11
7 Seigle 8.099000e+09 1.656700e+10 5.502000e+09
8 Sorgho 2.480800e+10 5.823700e+10 2.415300e+10
In [ ]:
#Affichage de la proportion des différents céréales pour l'alimentation animale
dict_details_cereales_animale = {}

#Création des ratios Quantité animale vs Quantité intérieur
for produit in df_details_cereales["Produit"]:
    produit_animal = df_details_cereales.loc[df_details_cereales["Produit"] == produit]["Aliments pour animaux (kg)"].sum()
    produit_interieur = df_details_cereales.loc[df_details_cereales["Produit"] == produit]["Disponibilité intérieure (kg)"].sum()
    dict_details_cereales_animale[produit] = round( produit_animal * 100 / produit_interieur, 2)
In [ ]:
#Organisation des données pour Excel
dict_details_cereales_animale = pd.DataFrame(list(dict_details_cereales_animale.items()))
dict_details_cereales_animale.rename(columns={0:"Produit", 1:"Ratio Quantité animale / Quantité intérieur"}, inplace=True)
dict_details_cereales_animale
Out[ ]:
Produit Ratio Quantité animale / Quantité intérieur
0 Avoine 69.43
1 Blé 19.08
2 Céréales, Autres 69.26
3 Maïs 57.14
4 Millet 11.05
5 Orge 65.98
6 Riz (Eq Blanchi) 7.06
7 Seigle 48.89
8 Sorgho 42.60
In [ ]:
#Envoie des valeurs affichées ci-dessus dans un fichier Excel pour le slide n°8 - détail animale
savedto_excel(dict_details_cereales_animale,"Slide 8 - details animale")
In [ ]:
#Affichage de la proportion des différents céréales pour l'alimentation humaine
dict_details_cereales_humaine = {}

#Création des ratios Quantité nourriture vs Quantité intérieur
for produit in df_details_cereales["Produit"]:
    produit_nourriture = df_details_cereales.loc[df_details_cereales["Produit"] == produit]["Nourriture (kg)"].sum()
    produit_interieur = df_details_cereales.loc[df_details_cereales["Produit"] == produit]["Disponibilité intérieure (kg)"].sum()
    
    dict_details_cereales_humaine[produit] = round(produit_nourriture * 100 /produit_interieur, 2)
In [ ]:
#Organisation des données pour Excel
dict_details_cereales_humaine = pd.DataFrame(list(dict_details_cereales_humaine.items()))
dict_details_cereales_humaine.rename(columns={0:"Produit", 1:"Ratio Quantité nourriture / Quantité intérieur"}, inplace=True)

dict_details_cereales_humaine
Out[ ]:
Produit Ratio Quantité nourriture / Quantité intérieur
0 Avoine 16.67
1 Blé 67.38
2 Céréales, Autres 19.37
3 Maïs 13.10
4 Millet 77.03
5 Orge 4.84
6 Riz (Eq Blanchi) 79.32
7 Seigle 33.21
8 Sorgho 41.47
In [ ]:
#Envoie des valeurs affichées ci-dessus dans un fichier Excel pour le slide n°8 - détail humaine
savedto_excel( dict_details_cereales_humaine, "Slide 8 - details humain")

3.6 - Pays avec la proportion de personnes sous-alimentée la plus forte en 2017

In [ ]:
#Création de la colonne proportion par pays
df_sous_nutrition["Ratio de population sous nourrie (%)"] = round(df_sous_nutrition["Sous nutrition"] * 100 / df_sous_nutrition["Population"],2)
In [ ]:
#Création d'un dataframe temporaire avec les données aggrégées par Pays
df_temp = df_sous_nutrition.groupby(["Zone"])[["Population","Sous nutrition","Ratio de population sous nourrie (%)"]].mean().reset_index()
In [ ]:
#Affichage après trie des 10 pires pays
df_temp.sort_values("Ratio de population sous nourrie (%)",ascending=False, inplace=True)

df_temp.head(10)
Out[ ]:
Zone Population Sous nutrition Ratio de population sous nourrie (%)
72 Haïti 10982000.0 5300000.0 48.26
151 République populaire démocratique de Corée 25429000.0 12000000.0 47.19
99 Madagascar 25570000.0 10500000.0 41.06
95 Libéria 4702000.0 1800000.0 38.28
91 Lesotho 2091000.0 800000.0 38.26
174 Tchad 15016000.0 5700000.0 37.96
143 Rwanda 11980000.0 4200000.0 35.06
112 Mozambique 28649000.0 9400000.0 32.81
177 Timor-Leste 1243000.0 400000.0 32.18
0 Afghanistan 36296000.0 10500000.0 28.93
In [ ]:
#Organisation des données pour Excel
dict_toppays_ssnourris = {}
for zone in df_temp["Zone"]:
    dict_toppays_ssnourris[zone] = df_temp.loc[df_temp["Zone"] == zone]["Ratio de population sous nourrie (%)"].sum()

dict_toppays_ssnourris = pd.DataFrame(list(dict_toppays_ssnourris.items()))
dict_toppays_ssnourris.rename(columns={0:"Zone", 1:"Ratio de population sous nourrie (%)"}, inplace=True)
In [ ]:
#Envoie des valeurs affichées ci-dessus dans un fichier Excel pour le slide n°9 
savedto_excel( dict_toppays_ssnourris,"Slide 9")

3.7 - Pays qui ont le plus bénéficié d'aide alimentaire depuis 2013

In [ ]:
#Calcul du total de l'aide alimentaire par pays
total_aide_alim_pays = df_aide_alimentaire.groupby(["Zone"])["Aide alimentaire (kg)"].sum()
In [ ]:
#Affichage après trie des 10 pays qui ont bénéficié le plus de l'aide alimentaire
total_aide_alim_pays = total_aide_alim_pays.sort_values(ascending=False).head(10).reset_index()

total_aide_alim_pays
Out[ ]:
Zone Aide alimentaire (kg)
0 République arabe syrienne 1858943000
1 Éthiopie 1381294000
2 Yémen 1206484000
3 Soudan du Sud 695248000
4 Soudan 669784000
5 Kenya 552836000
6 Bangladesh 348188000
7 Somalie 292678000
8 République démocratique du Congo 288502000
9 Niger 276344000
In [ ]:
#Organisation des données pour l'envoie vers Excel
dict_toppays_aide = {}
for zone in total_aide_alim_pays["Zone"]:
    dict_toppays_aide[zone] = total_aide_alim_pays.loc[total_aide_alim_pays["Zone"] == zone]["Aide alimentaire (kg)"].sum()

dict_toppays_aide = pd.DataFrame(list(dict_toppays_aide.items()))
dict_toppays_aide.rename(columns={0:"Zone", 1:"Aide alimentaire (kg)"}, inplace=True)
In [ ]:
dict_toppays_aide
Out[ ]:
Zone Aide alimentaire (kg)
0 République arabe syrienne 1858943000
1 Éthiopie 1381294000
2 Yémen 1206484000
3 Soudan du Sud 695248000
4 Soudan 669784000
5 Kenya 552836000
6 Bangladesh 348188000
7 Somalie 292678000
8 République démocratique du Congo 288502000
9 Niger 276344000
In [ ]:
#Envoie des valeurs affichées ci-dessus dans un fichier Excel pour le slide n°10
savedto_excel(dict_toppays_aide, "Slide 10")

3.8 - Evolution des 5 pays qui ont le plus bénéficiés de l'aide alimentaire entre 2013 et 2016

In [ ]:
#Création d'un dataframe avec la zone, l'année et l'aide alimentaire puis groupby sur zone et année 
df_aide_alim_global = df_aide_alimentaire.groupby(["Zone","Année"])["Aide alimentaire (kg)"].sum().reset_index()

df_aide_alim_global
Out[ ]:
Zone Année Aide alimentaire (kg)
0 Afghanistan 2013 128238000
1 Afghanistan 2014 57214000
2 Algérie 2013 35234000
3 Algérie 2014 18980000
4 Algérie 2015 17424000
... ... ... ...
223 Égypte 2013 1122000
224 Équateur 2013 1362000
225 Éthiopie 2013 591404000
226 Éthiopie 2014 586624000
227 Éthiopie 2015 203266000

228 rows × 3 columns

In [ ]:
#Création d'une liste contenant les 5 pays qui ont le plus bénéficiées de l'aide alimentaire (sur toutes les années)
df_aide_alim_global_total = df_aide_alim_global.groupby(["Zone"])["Aide alimentaire (kg)"].sum().reset_index()
df_aide_alim_global_total = df_aide_alim_global_total.sort_values(["Aide alimentaire (kg)"], ascending=False)

#Récupération des zones du top 5
top5_pays_aides = []
for zone in df_aide_alim_global_total["Zone"].iloc[:5]:
    top5_pays_aides.append(zone)
    
top5_pays_aides
Out[ ]:
['République arabe syrienne', 'Éthiopie', 'Yémen', 'Soudan du Sud', 'Soudan']
In [ ]:
#On filtre sur le dataframe avec notre liste
#Affichage des pays avec l'aide alimentaire par année
df_top5_pays_aides = df_aide_alim_global.loc[df_aide_alim_global["Zone"].isin(top5_pays_aides)]
df_top5_pays_aides
Out[ ]:
Zone Année Aide alimentaire (kg)
157 République arabe syrienne 2013 563566000
158 République arabe syrienne 2014 651870000
159 République arabe syrienne 2015 524949000
160 République arabe syrienne 2016 118558000
189 Soudan 2013 330230000
190 Soudan 2014 321904000
191 Soudan 2015 17650000
192 Soudan du Sud 2013 196330000
193 Soudan du Sud 2014 450610000
194 Soudan du Sud 2015 48308000
214 Yémen 2013 264764000
215 Yémen 2014 103840000
216 Yémen 2015 372306000
217 Yémen 2016 465574000
225 Éthiopie 2013 591404000
226 Éthiopie 2014 586624000
227 Éthiopie 2015 203266000

Transposition des valeurs Aide alimentaire (kg) colonnes années.¶

Afin de simplifier la vue graphique

In [ ]:
#Création d'un tableau des années disponibles
annees_existantes = df_top5_pays_aides["Année"].unique()

#Création des colonne pour ces années
for annee in annees_existantes:
    df_top5_pays_aides[annee] = 0
In [ ]:
#Insertion des valeurs des aides pour chaque année et chaque pays
for zone in df_top5_pays_aides["Zone"].unique():
    for annee in annees_existantes:
        aide_alim_pays = df_top5_pays_aides.loc[(df_top5_pays_aides["Zone"] == zone) & (df_top5_pays_aides["Année"] == annee)]["Aide alimentaire (kg)"].mean()
        
        df_top5_pays_aides[annee].loc[df_top5_pays_aides["Zone"] == zone] = aide_alim_pays
In [ ]:
#Suppression des colonnes inutiles
df_top5_pays_aides.drop(columns={"Année","Aide alimentaire (kg)"}, inplace=True)
In [ ]:
#Suppression des lignes en doublons
df_top5_pays_aides.drop_duplicates(subset="Zone", keep="first", inplace=True)

df_top5_pays_aides
Out[ ]:
Zone 2013 2014 2015 2016
157 République arabe syrienne 563566000 651870000 524949000 118558000.0
189 Soudan 330230000 321904000 17650000 NaN
192 Soudan du Sud 196330000 450610000 48308000 NaN
214 Yémen 264764000 103840000 372306000 465574000.0
225 Éthiopie 591404000 586624000 203266000 NaN
In [ ]:
#Envoie des données du dataframe dans le fichier Excel - Sheet name: Slide 11
savedto_excel(df_top5_pays_aides,'Slide 11')

3.9 - Pays avec le moins de disponibilité par habitant

In [ ]:
#Calcul de la disponibilité en kcal par personne par jour par pays
df_disponibilite = df_sous_nutrition.groupby(["Zone"])["Disponibilité alimentaire (Kcal/personne/jour)"].sum()
In [ ]:
#Affichage des 10 pays qui ont le moins de dispo alimentaire par personne en 2017 - 1er essai 
df_disponibilite.sort_values(ascending=True).head(10)
Out[ ]:
Zone
République démocratique du Congo    0.0
Burundi                             0.0
Groenland                           0.0
Porto Rico                          0.0
Papouasie-Nouvelle-Guinée           0.0
Palestine                           0.0
Samoa américaines                   0.0
Palaos                              0.0
Bhoutan                             0.0
Seychelles                          0.0
Name: Disponibilité alimentaire (Kcal/personne/jour), dtype: float64
In [ ]:
#Ces pays ne semblent pas renseignés, vérifions
df_disponibilite = df_disponibilite.reset_index()

#Création de la liste des pays concernés
zones_dispo_null = []
for zone in df_disponibilite.loc[df_disponibilite["Disponibilité alimentaire (Kcal/personne/jour)"] == 0]["Zone"]:
    zones_dispo_null.append(zone)

zones_dispo_null
Out[ ]:
['Andorre',
 'Bahreïn',
 'Bhoutan',
 'Burundi',
 'Comores',
 'Groenland',
 'Guinée équatoriale',
 'Libye',
 'Micronésie (États fédérés de)',
 'Nauru',
 'Nioué',
 'Palaos',
 'Palestine',
 'Papouasie-Nouvelle-Guinée',
 'Porto Rico',
 'Qatar',
 'République arabe syrienne',
 'République démocratique du Congo',
 'Samoa américaines',
 'Seychelles',
 'Singapour',
 'Somalie',
 'Soudan du Sud',
 'Tokélaou',
 'Tonga',
 'Tuvalu',
 'Érythrée',
 'Îles Cook',
 'Îles Marshall']
In [ ]:
#Vérifions si les données sont toutes null ou manquantes
df_sous_nutrition.loc[df_sous_nutrition["Zone"].isin(zones_dispo_null)].head()
Out[ ]:
Zone Année Population Sous nutrition Produit Origine Aliments pour animaux (kg) Autres Utilisations (kg) Disponibilité alimentaire (Kcal/personne/jour) Disponibilité alimentaire en quantité (kg/personne/an) ... Exportations - Quantité (kg) Importations - Quantité (kg) Nourriture (kg) Pertes (kg) Production (kg) Semences (kg) Traitement (kg) Variation de stock (kg) Disponibilité alimentaire (Kcal) Ratio de population sous nourrie (%)
435 Andorre 2017 77000 0.0 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.0
1255 Bahreïn 2017 1494000 0.0 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.0
1888 Bhoutan 2017 745000 0.0 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.0
2539 Burundi 2017 10827000 0.0 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.0
3563 Comores 2017 813000 0.0 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.0

5 rows × 23 columns

In [ ]:
#Suppression de ces pays du dataframe df_disponibilite
zones_a_drop = df_disponibilite.loc[df_disponibilite["Zone"].isin(zones_dispo_null)].index

df_disponibilite.drop(zones_a_drop, inplace=True)
In [ ]:
#Affichage des 10 pays qui ont le moins de dispo alimentaire par personne en 2017 - 2ème essai 
df_disponibilite.sort_values(["Disponibilité alimentaire (Kcal/personne/jour)"],ascending=True).head(10)
Out[ ]:
Zone Disponibilité alimentaire (Kcal/personne/jour)
145 République centrafricaine 1879.0
192 Zambie 1924.0
99 Madagascar 2056.0
0 Afghanistan 2087.0
72 Haïti 2089.0
151 République populaire démocratique de Corée 2093.0
174 Tchad 2109.0
193 Zimbabwe 2113.0
125 Ouganda 2126.0
177 Timor-Leste 2129.0

3.10 - Pays avec le plus de disponibilité par habitant

In [ ]:
#Affichage des 10 pays qui ont le plus de dispo alimentaire par personne en 2017
df_disponibilite.sort_values(["Disponibilité alimentaire (Kcal/personne/jour)"], ascending=False).head(10)
Out[ ]:
Zone Disponibilité alimentaire (Kcal/personne/jour)
12 Autriche 3770.0
18 Belgique 3737.0
184 Turquie 3708.0
198 États-Unis d'Amérique 3682.0
81 Israël 3610.0
79 Irlande 3602.0
82 Italie 3578.0
97 Luxembourg 3540.0
194 Égypte 3518.0
4 Allemagne 3503.0
In [ ]:
#Envoie des données du dataframe dans le fichier Excel - Sheet name: Slide 12
savedto_excel(df_disponibilite, 'Slide 12')

3.11 - Exemple de la Thaïlande pour le Manioc

In [ ]:
#Création d'un dataframe avec uniquement la Thaïlande 
df_thailande = df_sous_nutrition.loc[df_sous_nutrition["Zone"] == "Thaïlande"]

df_thailande.head()
Out[ ]:
Zone Année Population Sous nutrition Produit Origine Aliments pour animaux (kg) Autres Utilisations (kg) Disponibilité alimentaire (Kcal/personne/jour) Disponibilité alimentaire en quantité (kg/personne/an) ... Exportations - Quantité (kg) Importations - Quantité (kg) Nourriture (kg) Pertes (kg) Production (kg) Semences (kg) Traitement (kg) Variation de stock (kg) Disponibilité alimentaire (Kcal) Ratio de population sous nourrie (%)
14331 Thaïlande 2017 69209000 6200000.0 Abats Comestible animale 0.0 0.0 3.0 1.11 ... 5.000000e+06 33000000.0 75000000.0 0.0 4.500000e+07 0.0 0.0 0.0 7.578386e+10 8.96
14332 Thaïlande 2017 69209000 6200000.0 Agrumes, Autres vegetale 0.0 0.0 0.0 0.09 ... 6.000000e+06 2000000.0 6000000.0 0.0 1.200000e+07 0.0 2000000.0 0.0 0.000000e+00 8.96
14333 Thaïlande 2017 69209000 6200000.0 Alcool, non Comestible vegetale 0.0 358000000.0 0.0 0.00 ... 1.100000e+08 21000000.0 0.0 0.0 4.470000e+08 0.0 0.0 0.0 0.000000e+00 8.96
14334 Thaïlande 2017 69209000 6200000.0 Aliments pour enfants vegetale 0.0 0.0 2.0 0.18 ... 7.000000e+06 19000000.0 12000000.0 0.0 0.000000e+00 0.0 0.0 0.0 5.052257e+10 8.96
14335 Thaïlande 2017 69209000 6200000.0 Ananas vegetale 0.0 0.0 10.0 10.02 ... 1.449000e+09 9000000.0 671000000.0 110000000.0 2.209000e+09 0.0 0.0 13000000.0 2.526128e+11 8.96

5 rows × 23 columns

In [ ]:
#Calcul de la sous nutrition en Thaïlande
ratio_ss_nutrition_thai = df_thailande["Ratio de population sous nourrie (%)"].mean().round(2)

pop_ss_nutrition_thai = df_thailande["Sous nutrition"].mean()

print("Il y a {} personnes en sous nutrition en Thaïlande, soit {}% de la population du pays."
      .format(split_milliers(pop_ss_nutrition_thai), ratio_ss_nutrition_thai))
Il y a 6'200'000 personnes en sous nutrition en Thaïlande, soit 8.96% de la population du pays.
In [ ]:
#Combien il y a t-il de calories disponibles par personnes/jour?
df_thailande["Disponibilité alimentaire (Kcal/personne/jour)"].sum()
Out[ ]:
2785.0

2785 calories par pers/jour qui est supérieur à la moyenne necessaire de 1900 calorie et pourtant il y a 9% de population sous-nourrie

In [ ]:
#On crée un dataframe dédié au manioc
df_manioc = df_thailande.loc[df_thailande["Produit"] == "Manioc"]

df_manioc
Out[ ]:
Zone Année Population Sous nutrition Produit Origine Aliments pour animaux (kg) Autres Utilisations (kg) Disponibilité alimentaire (Kcal/personne/jour) Disponibilité alimentaire en quantité (kg/personne/an) ... Exportations - Quantité (kg) Importations - Quantité (kg) Nourriture (kg) Pertes (kg) Production (kg) Semences (kg) Traitement (kg) Variation de stock (kg) Disponibilité alimentaire (Kcal) Ratio de population sous nourrie (%)
14381 Thaïlande 2017 69209000 6200000.0 Manioc vegetale 1.800000e+09 2.081000e+09 40.0 13.0 ... 2.521400e+10 1.250000e+09 871000000.0 1.511000e+09 3.022800e+10 0.0 0.0 0.0 1.010451e+12 8.96

1 rows × 23 columns

In [ ]:
#Valeurs qui nous interresse
manioc_animaux = df_manioc["Aliments pour animaux (kg)"].sum()
manioc_humain = df_manioc["Nourriture (kg)"].sum()
manioc_pertes = df_manioc["Pertes (kg)"].sum()
manioc_exporte = df_manioc["Exportations - Quantité (kg)"].sum()
manioc_dispo = df_manioc["Disponibilité intérieure (kg)"].sum()
manioc_autres =  manioc_dispo - manioc_animaux - manioc_humain - manioc_pertes
In [ ]:
#Calcul de la proportion de manioc pour animaux, pour humain, pour autres-utilsations et exportée par rapport à la nourriture
ratio_manioc_dispo_export = manioc_exporte / manioc_humain
ratio_manioc_dispo_animaux = manioc_animaux / manioc_humain
ratio_manioc_pertes = manioc_pertes / manioc_humain
ratio_manioc_dispo_autres = manioc_autres / manioc_humain

print("La Thaïlande exporte",ratio_manioc_dispo_export.round(1),"fois plus de manioc qu'elle n'en utilise pour nourrir sa population.\n",
      ratio_manioc_dispo_animaux.round(1),"fois plus de manioc pour animaux qu'elle n'en utilise pour nourrir sa population.\n",
      ratio_manioc_pertes.round(1),"fois plus de manioc pour les pertes qu'elle n'en utilise pour nourrir sa population.\n", 
      ratio_manioc_dispo_autres.round(1),"fois plus de manioc pour d'autres utilisations qu'elle n'en utilise pour nourrir sa population.\n"
      )
La Thaïlande exporte 28.9 fois plus de manioc qu'elle n'en utilise pour nourrir sa population.
 2.1 fois plus de manioc pour animaux qu'elle n'en utilise pour nourrir sa population.
 1.7 fois plus de manioc pour les pertes qu'elle n'en utilise pour nourrir sa population.
 2.4 fois plus de manioc pour d'autres utilisations qu'elle n'en utilise pour nourrir sa population.

In [ ]:
#Répartition du manioc
part_manioc_animaux = round(manioc_animaux / manioc_dispo * 100, 2)
part_manioc_humain = round(manioc_humain / manioc_dispo * 100, 2)
part_manioc_autres = round(manioc_autres / manioc_dispo * 100, 2)
part_manioc_pertes = round(manioc_pertes / manioc_dispo * 100, 2)

print(part_manioc_animaux,"% sont destinés pour l'usage animal.\n",
      part_manioc_humain,"% sont destinés pour l'alimentation.\n", 
      part_manioc_pertes,"% sont des pertes.\n",
      part_manioc_autres,"% sont destinés pour d'autres usages.\n"
      )
28.74 % sont destinés pour l'usage animal.
 13.9 % sont destinés pour l'alimentation.
 24.12 % sont des pertes.
 33.24 % sont destinés pour d'autres usages.

Etape 6 - Analyse complémentaires

Hypothèses à confirmer:

  1. Plusieurs pays sont dans le cas de la Thaïlande?:
    Avoir une population en sous-nutrition et exporter plus un produit que le distribué à la nourriture
  2. Des pays sont-ils dépendant de leur importations?
    Des pays peuvent être faibles si ils importent globalement plus de produits qu'ils n'en produisent
    OU
    Que ces pays importent globalement autant qu'ils consomment en nourriture

1 - Il y a t-il d'autres pays dans le cas de la Thaïlande?

In [ ]:
#Il y a t-il d'autres pays dans le cas de la Thaïlande?
variables_interressantes = ["Zone", "Population","Sous nutrition","Produit","Origine","Disponibilité alimentaire (Kcal/personne/jour)",
                            "Aliments pour animaux (kg)","Autres Utilisations (kg)",
                            "Disponibilité intérieure (kg)","Exportations - Quantité (kg)", "Importations - Quantité (kg)",
                            "Nourriture (kg)", "Pertes (kg)", "Production (kg)", "Semences (kg)","Traitement (kg)",
                            "Variation de stock (kg)", "Ratio de population sous nourrie (%)"]

#Récupération des zones qui ont assez de disponibilité alimentaire totale (kcal/jour/pers) afin de montrer d'autre incohérences
df_temp = df_sous_nutrition.groupby("Zone")["Disponibilité alimentaire (Kcal/personne/jour)"].sum().reset_index()
zones_supmoy_calories = df_temp.loc[df_temp["Disponibilité alimentaire (Kcal/personne/jour)"] >= kcal_moy_pers_jour]["Zone"].unique().tolist()

#Création du dataframe avec seulement les zones sous-nourries ET une dispo alimentaire global suffisante
df_zones_ss_nourries = df_sous_nutrition.loc[(df_sous_nutrition["Ratio de population sous nourrie (%)"] > 0) 
                                             & 
                                             (df_sous_nutrition["Zone"].isin(zones_supmoy_calories)), variables_interressantes
                                             ]
df_zones_ss_nourries = df_zones_ss_nourries.reset_index(drop=True)

df_zones_ss_nourries.head()
Out[ ]:
Zone Population Sous nutrition Produit Origine Disponibilité alimentaire (Kcal/personne/jour) Aliments pour animaux (kg) Autres Utilisations (kg) Disponibilité intérieure (kg) Exportations - Quantité (kg) Importations - Quantité (kg) Nourriture (kg) Pertes (kg) Production (kg) Semences (kg) Traitement (kg) Variation de stock (kg) Ratio de population sous nourrie (%)
0 Afghanistan 36296000 10500000.0 Abats Comestible animale 5.0 0.0 0.0 53000000.0 0.0 0.0 53000000.0 0.0 53000000.0 0.0 0.0 0.0 28.93
1 Afghanistan 36296000 10500000.0 Agrumes, Autres vegetale 1.0 0.0 0.0 41000000.0 2000000.0 40000000.0 39000000.0 2000000.0 3000000.0 0.0 0.0 0.0 28.93
2 Afghanistan 36296000 10500000.0 Aliments pour enfants vegetale 1.0 0.0 0.0 2000000.0 0.0 2000000.0 2000000.0 0.0 0.0 0.0 0.0 0.0 28.93
3 Afghanistan 36296000 10500000.0 Ananas vegetale 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.93
4 Afghanistan 36296000 10500000.0 Bananes vegetale 4.0 0.0 0.0 82000000.0 0.0 82000000.0 82000000.0 0.0 0.0 0.0 0.0 0.0 28.93
In [ ]:
# On calcule la proportion Exportation/Nourriture
df_zones_ss_nourries["Ratio Exportation/Nourriture (%)"] = (df_zones_ss_nourries["Exportations - Quantité (kg)"] / df_zones_ss_nourries["Nourriture (kg)"]*100).round(2)

#Remplacement des valeurs infinies par des NaN
df_zones_ss_nourries.replace([np.inf, -np.inf], np.nan, inplace=True)

#Suppression des NaN
df_zones_ss_nourries.dropna(inplace=True)

#Suppression des ratios Exportation/Nourriture inférieurs à 100%
df_zones_ss_nourries.drop((df_zones_ss_nourries.loc[df_zones_ss_nourries["Ratio Exportation/Nourriture (%)"] < 100]).index, axis = 0, inplace=True)

df_zones_ss_nourries.head()
Out[ ]:
Zone Population Sous nutrition Produit Origine Disponibilité alimentaire (Kcal/personne/jour) Aliments pour animaux (kg) Autres Utilisations (kg) Disponibilité intérieure (kg) Exportations - Quantité (kg) Importations - Quantité (kg) Nourriture (kg) Pertes (kg) Production (kg) Semences (kg) Traitement (kg) Variation de stock (kg) Ratio de population sous nourrie (%) Ratio Exportation/Nourriture (%)
64 Afrique du Sud 57009000 3100000.0 Ananas vegetale 1.0 0.0 0.0 48000000.0 72000000.0 14000000.0 43000000.0 5000000.0 101000000.0 0.0 0.0 4000000.0 5.44 167.44
74 Afrique du Sud 57009000 3100000.0 Boissons Fermentés vegetale 0.0 0.0 0.0 1000000.0 122000000.0 7000000.0 1000000.0 0.0 64000000.0 0.0 0.0 51000000.0 5.44 12200.00
77 Afrique du Sud 57009000 3100000.0 Citrons & Limes vegetale 0.0 0.0 0.0 33000000.0 253000000.0 2000000.0 20000000.0 13000000.0 257000000.0 0.0 0.0 27000000.0 5.44 1265.00
81 Afrique du Sud 57009000 3100000.0 Céréales, Autres vegetale 1.0 8000000.0 0.0 12000000.0 10000000.0 3000000.0 4000000.0 0.0 19000000.0 0.0 0.0 0.0 5.44 250.00
82 Afrique du Sud 57009000 3100000.0 Dattes vegetale 0.0 0.0 0.0 1000000.0 2000000.0 2000000.0 1000000.0 0.0 0.0 0.0 0.0 0.0 5.44 200.00
In [ ]:
#Combien il y a de pays en sous-nutrition
df_temp = df_sous_nutrition.loc[(df_sous_nutrition["Ratio de population sous nourrie (%)"] > 0),["Zone","Ratio de population sous nourrie (%)"]]
df_temp = df_temp.groupby("Zone")["Ratio de population sous nourrie (%)"].mean().reset_index()

nombre_zones_ssnourries = len(df_temp["Zone"].tolist())

print("Il y a",nombre_zones_ssnourries, "zones avec une population en sous-nutrition.")
Il y a 84 zones avec une population en sous-nutrition.
In [ ]:
#Envoie des données du dataframe dans le fichier Excel - Sheet name: Slide extra 2
savedto_excel(df_temp, 'Slide extra 2')
In [ ]:
#Combien de pays dans le cas de la Thaïlande par rapport au nombre de pays en sous-nutrition?
nombre_zones_ssnourries_export = len(df_zones_ss_nourries["Zone"].unique().tolist())
ratio_casthailande = nombre_zones_ssnourries_export * 100 / nombre_zones_ssnourries

print("Il y a", nombre_zones_ssnourries_export, "pays qui sont dans le cas de la Thaïlande. Soit",
      ratio_casthailande.__round__(1),"% des pays avec une population en sous-nutrition.\nIls ont une population en sous-nutrition et pourtant ils exportent plus qu'ils n'en dédient à la nourriture."
      )
Il y a 74 pays qui sont dans le cas de la Thaïlande. Soit 88.1 % des pays avec une population en sous-nutrition.
Ils ont une population en sous-nutrition et pourtant ils exportent plus qu'ils n'en dédient à la nourriture.

2 - Des pays sont-ils dépendant de leur importations?

In [ ]:
#Quels pays n'est pas autonome avec sa production
zones_dependantes = df_sous_nutrition.groupby("Zone")[["Production (kg)", "Nourriture (kg)", "Importations - Quantité (kg)"]].sum()
zones_dependantes["Ratio Nourriture/Production (%)"] = round( zones_dependantes["Nourriture (kg)"] / zones_dependantes["Production (kg)"]  * 100,2)

#Sélection des pays qui ont plus de Nourriture qu'ils ne produisent ( et donc qui importe beaucoup) 
zones_dependantes = zones_dependantes.loc[zones_dependantes["Ratio Nourriture/Production (%)"] >= 100].reset_index()

zones_dependantes.head()
Out[ ]:
Zone Production (kg) Nourriture (kg) Importations - Quantité (kg) Ratio Nourriture/Production (%)
0 Algérie 2.635900e+10 3.172900e+10 1.740300e+10 120.37
1 Antigua-et-Barbuda 2.000000e+07 5.800000e+07 6.300000e+07 290.00
2 Arabie saoudite 8.878000e+09 1.795600e+10 2.772600e+10 202.25
3 Bahamas 1.790000e+08 3.120000e+08 2.990000e+08 174.30
4 Bermudes 6.000000e+06 5.100000e+07 7.700000e+07 850.00
In [ ]:
#Envoie des données du dataframe dans le fichier Excel - Sheet name: Slide Extra 1
savedto_excel(zones_dependantes, 'Slide Extra 1')
In [ ]:
#Top 5 des pays qui sont le plus dépendant
zones_dependantes.sort_values(["Ratio Nourriture/Production (%)"], ascending=False).head(5)
Out[ ]:
Zone Production (kg) Nourriture (kg) Importations - Quantité (kg) Ratio Nourriture/Production (%)
9 Chine - RAS de Macao 1.600000e+07 3.680000e+08 3.670000e+08 2300.00
8 Chine - RAS de Hong-Kong 4.700000e+08 5.778000e+09 9.510000e+09 1229.36
4 Bermudes 6.000000e+06 5.100000e+07 7.700000e+07 850.00
38 Émirats arabes unis 1.192000e+09 6.548000e+09 1.532700e+10 549.33
11 Djibouti 7.600000e+07 3.930000e+08 1.628000e+09 517.11
In [ ]:
#Récupération des zones dépendantes
list_zones_dependantes = zones_dependantes["Zone"].unique().tolist()

# Pays où les pays dependants ont un ratio de population sous nourrie positif
zones_dependantes_ssnourries = df_sous_nutrition.loc[(df_sous_nutrition["Zone"].isin(list_zones_dependantes)) & (df_sous_nutrition["Ratio de population sous nourrie (%)"] > 0),["Zone", "Ratio de population sous nourrie (%)"]].groupby("Zone").mean()

list_zones_dependantes_ssnourries = zones_dependantes_ssnourries.reset_index()["Zone"].tolist()

list_zones_dependantes_ssnourries
Out[ ]:
['Algérie',
 'Arabie saoudite',
 'Botswana',
 'Chine, Taiwan Province de',
 'Gambie',
 'Géorgie',
 'Iraq',
 'Jordanie',
 'Lesotho',
 'Liban',
 'Libéria',
 'Mauritanie',
 'Mongolie',
 'Oman',
 'Sénégal',
 'Timor-Leste',
 'Émirats arabes unis']
In [ ]:
print("Il y a :",len(list_zones_dependantes),"pays dépendants de l'importation, dont", len(list_zones_dependantes_ssnourries), "avec une population sous-nourrie.")
Il y a : 39 pays dépendants de l'importation, dont 17 avec une population sous-nourrie.