%%html
<style>
.container{
width: 80% !important;
margin-left: 10% !important;
margin-right: 10% !important;
}
.MathJax {
font-size: 1.3em;
}
.rendered_html tr, .rendered_html th, .rendered_html td {
text-align: right !important;
}
a[data-snippet-code]::after {
background: #262931 !important;
}
.titre-pers{
font-family: arial;
font-size: 250% !important;
line-height: 200% !important;
text-align: center !important;
color: #4c8be2 !important;
}
.rendered_html h1,
.text_cell_render h1 {
color: #86bed9 !important;
line-height: 150% !important;
}
.rendered_html h2,
.text_cell_render h2 {
color: #b08c20 !important;
padding-left: .5rem !important;
line-height: 150% !important;
}
.rendered_html h3,
.text_cell_render h3 {
color: #3aa237 !important;
padding-left: 1rem !important;
line-height: 150% !important;
font-size: 120% !important;
}
.rendered_html h4,
.text_cell_render h4 {
color: #29858a !important;
padding-left: 2rem !important;
font-size: 110% !important;
}
.rendered_html h5,
.text_cell_render h5 {
color: #21417d !important;
padding-left: 2.5rem !important;
font-size: 110% !important;
}
.rendered_html h6,
.text_cell_render h6 {
color: #d8a802c2 !important;
padding-left: 1rem !important;
font-family: sans-serif !important;
font-size: 120% !important;
font-weight: normal !important;
font-style: normal !important;
}
.renf{
font-size: 18px !important;
font-family: Arial !important;
color: #14db9a !important;
}
.renf2{
font-size: 18px !important;
font-family: Arial !important;
color: orangered !important;
}
.alert{
padding: 5px 0 5px 15px;
border-radius: 5px;
margin-left: 10px;
width: auto;
}
.output_subarea jupyter-widgets-view{
padding: 0 !important;
}
</style>
# importation des différents modules
import statistics
import seaborn as sns
import matplotlib
import matplotlib.patches as mpatches
import matplotlib.ticker as mtick
import matplotlib.pylab as pylab
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from statsmodels.formula.api import ols
import statsmodels.api as sm
from scipy.stats import spearmanr
from scipy.stats import chi2_contingency
from scipy.stats import ttest_ind
import scipy.stats as st
import scipy as sp
import math
from math import sqrt
import numpy as np
import pandas as pd
from PIL import Image
import os, glob
from IPython.core.interactiveshell import InteractiveShell
from IPython.core.display import display, HTML
InteractiveShell.ast_node_interactivity = "all"
plt.style.use('seaborn-white')
%matplotlib inline
pd.options.mode.chained_assignment = None # default='warn'
#import jtplot module in notebook
from jupyterthemes import jtplot
# choose which theme to inherit plotting style from
# onedork | grade3 | oceans16 | chesterish | monokai | solarizedl | solarizedd
jtplot.style(theme='grade3')
# set "context" (paper, notebook, talk, poster)
# scale font-size of ticklabels, legend, etc.
# remove spines from x and y axes and make grid dashed
jtplot.style(context='notebook', fscale=0.8, ticks=True, grid=False)
# turn on X- and Y-axis tick marks (default=False)
# turn off the axis grid lines (default=True)
# and set the default figure size
jtplot.style(ticks=True, fscale=1, grid=False, figsize=(8,5))
# reset default matplotlib rcParams
jtplot.reset()
# importations de modules "local"
import sys
sys.path.append('functions/')
import fonctions_ocr
import acp_perso
import adjust_text
import fonctions_perso
Objet de la mission :
On importe les données suivantes, pour tous les pays et pour la dernière année disponible (2018), depuis le
site de la FAO :
data = pd.read_csv('data/FAOSTAT_data_mini.csv')
pd.set_option('display.max_columns', data.shape[1]+1)
data
Code Domaine | Domaine | Code zone | Zone | Code Élément | Élément | Code Produit | Produit | Code année | Année | Unité | Valeur | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | FBS | Nouveaux Bilans Alimentaire | 2 | Afghanistan | 664 | Disponibilité alimentaire (Kcal/personne/jour) | 2901 | Total General | 2018 | 2018 | Kcal/personne/jour | 2040.00 |
1 | FBS | Nouveaux Bilans Alimentaire | 2 | Afghanistan | 674 | Disponibilité de protéines en quantité (g/pers... | 2901 | Total General | 2018 | 2018 | g/personne/jour | 55.52 |
2 | FBS | Nouveaux Bilans Alimentaire | 2 | Afghanistan | 664 | Disponibilité alimentaire (Kcal/personne/jour) | 2903 | Produits Vegetaux | 2018 | 2018 | Kcal/personne/jour | 1849.00 |
3 | FBS | Nouveaux Bilans Alimentaire | 2 | Afghanistan | 674 | Disponibilité de protéines en quantité (g/pers... | 2903 | Produits Vegetaux | 2018 | 2018 | g/personne/jour | 44.73 |
4 | FBS | Nouveaux Bilans Alimentaire | 2 | Afghanistan | 664 | Disponibilité alimentaire (Kcal/personne/jour) | 2941 | Produits Animaux | 2018 | 2018 | Kcal/personne/jour | 191.00 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1033 | FBS | Nouveaux Bilans Alimentaire | 181 | Zimbabwe | 674 | Disponibilité de protéines en quantité (g/pers... | 2901 | Total General | 2018 | 2018 | g/personne/jour | 44.15 |
1034 | FBS | Nouveaux Bilans Alimentaire | 181 | Zimbabwe | 664 | Disponibilité alimentaire (Kcal/personne/jour) | 2903 | Produits Vegetaux | 2018 | 2018 | Kcal/personne/jour | 1749.00 |
1035 | FBS | Nouveaux Bilans Alimentaire | 181 | Zimbabwe | 674 | Disponibilité de protéines en quantité (g/pers... | 2903 | Produits Vegetaux | 2018 | 2018 | g/personne/jour | 32.56 |
1036 | FBS | Nouveaux Bilans Alimentaire | 181 | Zimbabwe | 664 | Disponibilité alimentaire (Kcal/personne/jour) | 2941 | Produits Animaux | 2018 | 2018 | Kcal/personne/jour | 159.00 |
1037 | FBS | Nouveaux Bilans Alimentaire | 181 | Zimbabwe | 674 | Disponibilité de protéines en quantité (g/pers... | 2941 | Produits Animaux | 2018 | 2018 | g/personne/jour | 11.59 |
1038 rows × 12 columns
# On supprime les colonnes inutiles
data=data.drop(['Code Domaine', 'Domaine', 'Code année'], axis=1)
# On renomme les colonnes
data.columns = ['code_pays', 'pays', 'code_element', 'element', 'code_prod', 'prod', 'annee', 'unite', 'valeur']
# Table-pivot pour avoir les vatiables en colonnes
data = data.pivot_table(index=['code_pays', 'pays', 'code_prod', 'prod', 'annee', 'unite'], columns=['element'], values=['valeur']).reset_index()
data.sample(2)
code_pays | pays | code_prod | prod | annee | unite | valeur | ||
---|---|---|---|---|---|---|---|---|
element | Disponibilité alimentaire (Kcal/personne/jour) | Disponibilité de protéines en quantité (g/personne/jour) | ||||||
572 | 134 | Malte | 2903 | Produits Vegetaux | 2018 | Kcal/personne/jour | 2462.0 | NaN |
226 | 57 | Bélarus | 2941 | Produits Animaux | 2018 | Kcal/personne/jour | 838.0 | NaN |
data = data[data['pays'] != 'France']
On crée le df minimal, df_mini, c'est-à-dire celui qui comprend les 4 variables exigéees :
evol_pop_pct
part_prot_anim
dispo_prot_g_p_j
dispo_alim_kcal_j_pers
Remarque:
-> On ne s'occupe que des 3 dernières variables pour le moment, c'est-à-dire celles relatives à
l'alimentation
data.columns = ['code_pays', 'pays', 'code_prod', 'prod', 'annee', 'unite', 'dispo_alim_kcal_j_pers', 'dispo_prot_g_p_j']
# on crée le df minimal, c'est à dire celui qui comprend les 4 variables exigéees
df_mini = data.copy()
df_mini = df_mini[df_mini['code_prod'] == 2901]
df_mini_temp=df_mini.copy()
df_mini_temp['val']=df_mini.loc[:,['dispo_alim_kcal_j_pers', 'dispo_prot_g_p_j']].max(axis=1)
df_mini_temp=df_mini_temp.groupby(['code_pays', 'pays', 'code_prod', 'prod', 'annee', 'unite'])[['val']].max()
df_mini_temp=df_mini_temp.unstack().reset_index()
df_mini=df_mini_temp.copy()
df_mini.columns = ['code_pays', 'pays', 'code_prod', 'prod', 'annee', 'dispo_alim_kcal_j_pers', 'dispo_prot_g_p_j']
df_mini = df_mini[['code_pays', 'pays', 'annee', 'dispo_alim_kcal_j_pers', 'dispo_prot_g_p_j']]
df_mini.sample(2)
# on vérifie la présence éventuelle de valeurs nulles
df_mini.isna().sum()
code_pays | pays | annee | dispo_alim_kcal_j_pers | dispo_prot_g_p_j | |
---|---|---|---|---|---|
19 | 32 | Cameroun | 2018 | 2733.0 | 71.89 |
44 | 70 | Polynésie française | 2018 | 2910.0 | 96.28 |
code_pays 0 pays 0 annee 0 dispo_alim_kcal_j_pers 0 dispo_prot_g_p_j 0 dtype: int64
df_part_prot = data[((data['code_prod'] == 2941) | (data['code_prod'] == 2903)) & (data['unite'] == 'g/personne/jour')]
df_part_prot = df_part_prot[['code_pays', 'pays', 'code_prod', 'prod', 'annee', 'dispo_prot_g_p_j']]
df_part_prot_temp = df_part_prot.groupby(['code_pays', 'pays', 'code_prod'])['dispo_prot_g_p_j'].max()
df_part_prot_temp = df_part_prot_temp.unstack().reset_index()
df_part_prot_temp['part_prot_anim'] = (df_part_prot_temp[2941] / (df_part_prot_temp[2941] + df_part_prot_temp[2903]))*100
df_part_prot_temp=df_part_prot_temp[['code_pays', 'part_prot_anim']]
df_mini=pd.merge(df_mini, df_part_prot_temp)
df_mini
code_pays | pays | annee | dispo_alim_kcal_j_pers | dispo_prot_g_p_j | part_prot_anim | |
---|---|---|---|---|---|---|
0 | 1 | Arménie | 2018 | 2997.0 | 94.35 | 48.050021 |
1 | 2 | Afghanistan | 2018 | 2040.0 | 55.52 | 19.434438 |
2 | 3 | Albanie | 2018 | 3360.0 | 115.74 | 53.347732 |
3 | 4 | Algérie | 2018 | 3322.0 | 91.83 | 26.930197 |
4 | 7 | Angola | 2018 | 2385.0 | 53.05 | 30.744581 |
... | ... | ... | ... | ... | ... | ... |
167 | 256 | Luxembourg | 2018 | 3465.0 | 108.65 | 62.098481 |
168 | 272 | Serbie | 2018 | 2828.0 | 84.36 | 49.851843 |
169 | 273 | Monténégro | 2018 | 3500.0 | 114.53 | 61.355103 |
170 | 276 | Soudan | 2018 | 2578.0 | 72.98 | 27.610304 |
171 | 351 | Chine | 2018 | 3191.0 | 100.63 | 39.749578 |
172 rows × 6 columns
df_mini.isna().sum()
df_mini.duplicated().sum()
code_pays 0 pays 0 annee 0 dispo_alim_kcal_j_pers 0 dispo_prot_g_p_j 0 part_prot_anim 0 dtype: int64
0
pop = pd.read_csv('data/FAOSTAT_pop.csv')
pop.sample(5)
Code Domaine | Domaine | Code zone | Zone | Code Élément | Élément | Code Produit | Produit | Code année | Année | Valeur | Note | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
109 | OA | Séries temporelles annuelles | 54 | Danemark | 511 | Population totale | 3010 | Population-Estimations | 2018 | 2018 | 5752.126 | NaN |
405 | OA | Séries temporelles annuelles | 197 | Sierra Leone | 511 | Population totale | 3010 | Population-Estimations | 2018 | 2018 | 7650.150 | NaN |
226 | OA | Séries temporelles annuelles | 112 | Jordanie | 511 | Population totale | 3010 | Population-Estimations | 2008 | 2008 | 6556.478 | NaN |
117 | OA | Séries temporelles annuelles | 60 | El Salvador | 511 | Population totale | 3010 | Population-Estimations | 2018 | 2018 | 6420.746 | NaN |
406 | OA | Séries temporelles annuelles | 200 | Singapour | 511 | Population totale | 3010 | Population-Estimations | 2008 | 2008 | 4775.804 | NaN |
pop = pop[['Code zone', 'Zone', 'Année', 'Valeur']]
pop.columns = ['code_pays', 'pays', 'annee', 'pop']
pop = pop.groupby(['code_pays', 'pays', 'annee'])[['pop']].max()
pop=pop.unstack().reset_index()
pop.columns = ['code_pays', 'pays', 'pop_2008', 'pop_2018']
pop['evol_pop_pct']=((pop['pop_2018'] - pop['pop_2008'])/pop['pop_2008'])*100
pop.head(2)
code_pays | pays | pop_2008 | pop_2018 | evol_pop_pct | |
---|---|---|---|---|---|
0 | 1 | Arménie | 2907.618 | 2951.745 | 1.517634 |
1 | 2 | Afghanistan | 27722.276 | 37171.921 | 34.086830 |
pop[(pop['pop_2008'].isna()) | (pop['pop_2018'].isna()) ][['pays', 'pop_2008', 'pop_2018']].sort_values(by="pays")
pays | pop_2008 | pop_2018 | |
---|---|---|---|
231 | Bonaire, Saint-Eustache et Saba | NaN | 25.711 |
232 | Curaçao | NaN | 162.752 |
235 | Saint-Barthélemy | NaN | 9.816 |
234 | Saint-Martin (partie française) | NaN | 37.264 |
233 | Sint Maarten (partie néerlandaise) | NaN | 41.940 |
229 | Soudan | NaN | 41801.533 |
183 | Soudan (ex) | 41797.776 | NaN |
230 | Soudan du Sud | NaN | 10975.927 |
pop_comp = pd.read_csv("data/Bq_Mondiale_Complement.csv")
pop_comp['pop_2008']=pop_comp['pop_2008']/1000
pop_comp['pop_2018']=pop_comp['pop_2018']/1000
z=0
for i in [232, 234, 233, 229, 230]:
pop.iloc[i,2] = pop_comp.iloc[z,4]
pop.iloc[i,4] = ((pop.iloc[i,3] - pop.iloc[i,2])/pop.iloc[i,2])*100
z+=1
pop.iloc[229,:]
code_pays 276 pays Soudan pop_2008 33060.837 pop_2018 41801.533 evol_pop_pct 26.438218 Name: 229, dtype: object
On vérifie que la somme des populations nationales est cohérent avec les chiffres officiels de la population mondiale en 2018 (≈ 7.6 milliards)
pop_mondiale=pop['pop_2018'].sum()
pop_mondiale
9090746.135
On constate que la somme donne un résultat trop important
-> on vérifie que les données de la Chine ne sont pas en double
pattern = pop.pays.str.contains("chine", case=False)
chaine_chine = pop[pattern]
liste_chine=chaine_chine['pays'].unique()
liste_chine
df_liste = []
for x in liste_chine:
z=pop[pop['pays'] == x]
df_liste.append(z)
chine = pd.concat(df_liste)
chine
array(['Chine, continentale', 'Chine - RAS de Hong-Kong', 'Chine - RAS de Macao', 'Chine, Taiwan Province de', 'Chine'], dtype=object)
code_pays | pays | pop_2008 | pop_2018 | evol_pop_pct | |
---|---|---|---|---|---|
35 | 41 | Chine, continentale | 1353569.484 | 1427647.786 | 5.472811 |
81 | 96 | Chine - RAS de Hong-Kong | 6881.863 | 7371.730 | 7.118232 |
112 | 128 | Chine - RAS de Macao | 515.239 | 631.636 | 22.590875 |
191 | 214 | Chine, Taiwan Province de | 23019.045 | 23726.460 | 3.073173 |
237 | 351 | Chine | 1383985.631 | 1459377.612 | 5.447454 |
Les données de la population de la Chine apparaissent 2 fois
-> On supprime les données correspondant au code pays 351
pop=pop[pop['code_pays'] != 351]
On vérifie à nouveau
pop['pop_2018'].sum()
7631368.523
Le résultat est maintenant cohérent
On peut maintenant merger les données relatives à l'alimentation et à la population
df_mini=pd.merge(df_mini, pop[['code_pays', 'evol_pop_pct']])
df_mini.sample(5)
code_pays | pays | annee | dispo_alim_kcal_j_pers | dispo_prot_g_p_j | part_prot_anim | evol_pop_pct | |
---|---|---|---|---|---|---|---|
42 | 66 | Fidji | 2018 | 2781.0 | 71.14 | 39.957836 | 4.509553 |
49 | 79 | Allemagne | 2018 | 3554.0 | 105.40 | 60.749526 | 2.539502 |
142 | 211 | Suisse | 2018 | 3354.0 | 95.47 | 62.700325 | 11.843253 |
41 | 63 | Estonie | 2018 | 3247.0 | 105.38 | 62.080091 | -1.280005 |
82 | 119 | Lettonie | 2018 | 3229.0 | 102.72 | 61.409657 | -11.182452 |
dispo_kcal
dispo_prot
df_mini.columns
Index(['code_pays', 'pays', 'annee', 'dispo_alim_kcal_j_pers', 'dispo_prot_g_p_j', 'part_prot_anim', 'evol_pop_pct'], dtype='object')
df_mini=df_mini.drop('annee', axis=1)
df_mini.columns=['code_pays', 'pays', 'dispo_kcal', 'dispo_prot', 'part_prot_anim', 'evol_pop_pct']
df_mini.sample(5)
code_pays | pays | dispo_kcal | dispo_prot | part_prot_anim | evol_pop_pct | |
---|---|---|---|---|---|---|
45 | 72 | Djibouti | 2694.0 | 65.75 | 21.323194 | 17.463539 |
143 | 213 | Turkménistan | 2830.0 | 88.62 | 40.385917 | 18.540867 |
170 | 276 | Soudan | 2578.0 | 72.98 | 27.610304 | 26.438218 |
148 | 220 | Trinité-et-Tobago | 2991.0 | 85.58 | 51.781750 | 5.736270 |
54 | 86 | Grenade | 2402.0 | 71.32 | 56.668069 | 5.687680 |
On va ajouter plusieurs variables explicatives qui nous permettront de mieux caractériser nos groupes de
pays:
Ainsi, pour chaque pays, on va indiquer :
df_global = df_mini.copy()
df_global.shape
(171, 6)
## on crée un df de correspondance 'pays_continent' qui associe tous les pays à leur continent
import pathlib2 as pl2
# le dossier 'pop_contient' contient 5 fichiers, 1 par continent
ps = pl2.Path('data/pop_continent')
df_liste = []
for p in ps.glob('*.csv'):
n=str(p).split('_')[-1][:-4].capitalize()
df = pd.read_csv(p)
df['continent'] = n
df_liste.append(df)
pays_continent = pd.concat(df_liste)
pays_continent = pays_continent[['Code zone', 'Zone', 'continent']]
pays_continent.columns = ['code_pays', 'pays', 'continent']
pays_continent.duplicated().sum()
pays_continent = pays_continent.sort_values(by="code_pays")
pays_continent.sample(4)
df_global = pd.merge(df_global, pays_continent, on='code_pays')
# on crée un code_continent pour faciliter l'utilisation de cette variable
liste_continents = df_global['continent'].unique()
# on crée un dictionnaire de la forme cont_dico = {'code_cont': 'nom_cont'}
cont_dico = {}
def code_cont(cont):
for i in range(5):
cont_dico[i] = liste_continents[i]
if cont == liste_continents[i]:
return i
df_global['code_cont'] = df_global['continent'].apply(lambda x: code_cont(x))
df_global['pays']=df_global['pays_x']
df_global.drop(columns=['pays_x', 'pays_y'], inplace=True)
df_global.sample(1)
for k, val in cont_dico.items():
print(k, val, sep=' : ')
0
code_pays | pays | continent | |
---|---|---|---|
45 | 216 | Thaïlande | Asie |
10 | 148 | Nauru | Oceanie |
50 | 191 | Saint-Vincent-et-les Grenadines | Ameriques |
30 | 140 | Monaco | Europe |
code_pays | dispo_kcal | dispo_prot | part_prot_anim | evol_pop_pct | continent | code_cont | pays | |
---|---|---|---|---|---|---|---|---|
106 | 154 | 3072.0 | 84.49 | 43.283229 | 0.756731 | Europe | 1 | Macédoine du Nord |
0 : Asie 1 : Europe 2 : Afrique 3 : Ameriques 4 : Oceanie
df_global.shape
(171, 8)
pop_glo = pop[['code_pays', 'pop_2018']]
pop_glo.columns=['code_pays', 'pop_M']
df_global = pd.merge(df_global, pop_glo, how='left')
df_global
code_pays | dispo_kcal | dispo_prot | part_prot_anim | evol_pop_pct | continent | code_cont | pays | pop_M | |
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2997.0 | 94.35 | 48.050021 | 1.517634 | Asie | 0 | Arménie | 2951.745 |
1 | 2 | 2040.0 | 55.52 | 19.434438 | 34.086830 | Asie | 0 | Afghanistan | 37171.921 |
2 | 3 | 3360.0 | 115.74 | 53.347732 | -3.994368 | Europe | 1 | Albanie | 2882.740 |
3 | 4 | 3322.0 | 91.83 | 26.930197 | 21.588450 | Afrique | 2 | Algérie | 42228.408 |
4 | 7 | 2385.0 | 53.05 | 30.744581 | 42.009157 | Afrique | 2 | Angola | 30809.787 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
166 | 255 | 3769.0 | 99.87 | 58.656253 | 6.525984 | Europe | 1 | Belgique | 11482.178 |
167 | 256 | 3465.0 | 108.65 | 62.098481 | 24.482649 | Europe | 1 | Luxembourg | 604.245 |
168 | 272 | 2828.0 | 84.36 | 49.851843 | -2.840464 | Europe | 1 | Serbie | 8802.754 |
169 | 273 | 3500.0 | 114.53 | 61.355103 | 1.044389 | Europe | 1 | Monténégro | 627.809 |
170 | 276 | 2578.0 | 72.98 | 27.610304 | 26.438218 | Afrique | 2 | Soudan | 41801.533 |
171 rows × 9 columns
On importe les données du site de la FAO
le PIB/hab est exprimé en $ PPA internationaux constants de 2011
data_secu=pd.read_csv('data/FAOSTAT_secu_alim.csv')
pib=data_secu[data_secu['Code Élément'] == 6126]
pib=pib[['Code zone', 'Valeur']]
pib.columns=['code_pays', 'pib_hab']
pib.sample(2)
code_pays | pib_hab | |
---|---|---|
105 | 225 | 66968.3 |
371 | 234 | 21590.8 |
Methode : left
depuis df_global
-> nous permettra de détecter la présence éventuelle de valeurs nulles
df_global = pd.merge(df_global, pib, how='left')
df_global.isna().sum()
pays_manque_pib=list(df_global[df_global['pib_hab'].isna()]['pays'])
pays_manque_pib
code_pays 0 dispo_kcal 0 dispo_prot 0 part_prot_anim 0 evol_pop_pct 0 continent 0 code_cont 0 pays 0 pop_M 0 pib_hab 8 dtype: int64
['Cuba', 'Polynésie française', "Iran (République islamique d')", 'République populaire démocratique de Corée', 'Nouvelle-Calédonie', 'Chine, Taiwan Province de', 'Venezuela (République bolivarienne du)', 'Yémen']
On traite ces valeurs manquantes en cherchant ces valeurs dans la base de la Banque Mondiale
-> Mais ces éléments sont également absents dans la base de la Banque Mondiale
-> On exclut ces pays de notre analyse (on crée un dataframe à part pour ces pays)
df_pays_sans_pib = df_global.loc[df_global['pays'].isin(pays_manque_pib),:]
df_pays_sans_pib
code_pays | dispo_kcal | dispo_prot | part_prot_anim | evol_pop_pct | continent | code_cont | pays | pop_M | pib_hab | |
---|---|---|---|---|---|---|---|---|---|---|
30 | 49 | 3344.0 | 84.89 | 40.570150 | 0.900269 | Ameriques | 3 | Cuba | 11338.134 | NaN |
44 | 70 | 2910.0 | 96.28 | 66.046946 | 5.157142 | Oceanie | 4 | Polynésie française | 277.679 | NaN |
66 | 102 | 3087.0 | 85.73 | 28.858043 | 13.421385 | Asie | 0 | Iran (République islamique d') | 81800.188 | NaN |
79 | 116 | 2019.0 | 53.34 | 19.122610 | 5.098539 | Asie | 0 | République populaire démocratique de Corée | 25549.604 | NaN |
105 | 153 | 2825.0 | 84.66 | 57.517421 | 13.497639 | Oceanie | 4 | Nouvelle-Calédonie | 279.993 | NaN |
144 | 214 | 2983.0 | 86.20 | 50.556845 | 3.073173 | Asie | 0 | Chine, Taiwan Province de | 23726.460 | NaN |
160 | 236 | 2120.0 | 54.17 | 45.357209 | 4.527767 | Ameriques | 3 | Venezuela (République bolivarienne du) | 28887.118 | NaN |
164 | 249 | 2154.0 | 54.52 | 19.035393 | 30.177658 | Asie | 0 | Yémen | 28498.683 | NaN |
df_global = df_global.dropna()
df_global.shape
df_global.sample(2)
(163, 10)
code_pays | dispo_kcal | dispo_prot | part_prot_anim | evol_pop_pct | continent | code_cont | pays | pop_M | pib_hab | |
---|---|---|---|---|---|---|---|---|---|---|
26 | 41 | 3194.0 | 100.72 | 39.362653 | 5.472811 | Asie | 0 | Chine, continentale | 1427647.786 | 15243.2 |
131 | 194 | 3307.0 | 86.94 | 37.658155 | 30.184069 | Asie | 0 | Arabie saoudite | 33702.756 | 47596.7 |
risque=pd.read_csv('data/risque.csv')
risque.sample(2)
pays | risque | |
---|---|---|
59 | Gabon | 5 |
145 | Sao Tomé-et-Principe | 6 |
df_global = pd.merge(df_global, risque, how='left')
df_global.isna().sum()
code_pays 0 dispo_kcal 0 dispo_prot 0 part_prot_anim 0 evol_pop_pct 0 continent 0 code_cont 0 pays 0 pop_M 0 pib_hab 0 risque 0 dtype: int64
Pas de valeurs nulles pour notre variable risque
df_global.shape
df_global.sample(2)
(163, 11)
code_pays | dispo_kcal | dispo_prot | part_prot_anim | evol_pop_pct | continent | code_cont | pays | pop_M | pib_hab | risque | |
---|---|---|---|---|---|---|---|---|---|---|---|
11 | 16 | 2563.0 | 60.73 | 20.681706 | 11.830941 | Asie | 0 | Bangladesh | 161376.708 | 4441.4 | 5 |
59 | 97 | 3316.0 | 89.64 | 57.150826 | -2.845995 | Europe | 1 | Hongrie | 9707.499 | 31072.9 | 3 |
prods = pd.read_csv('data/FAOSTAT_tous_prod.csv')
prods.head(2)
Code Domaine | Domaine | Code zone | Zone | Code Élément | Élément | Code Produit | Produit | Code année | Année | Unité | Valeur | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | FBS | Nouveaux Bilans Alimentaire | 2 | Afghanistan | 5142 | Nourriture | 2511 | Blé et produits | 2018 | 2018 | Milliers de tonnes | 5898.0 |
1 | FBS | Nouveaux Bilans Alimentaire | 2 | Afghanistan | 5142 | Nourriture | 2805 | Riz et produits | 2018 | 2018 | Milliers de tonnes | 589.0 |
tous_prods = prods.groupby(['Zone'])[['Valeur']].sum()
tous_prods=tous_prods.reset_index()
tous_prods.columns=['Zone','Total_Nourr']
volaille = prods[prods['Code Produit'] == 2734]
volaille=pd.merge(volaille, tous_prods)
volaille['part_vol_nourr'] = round((volaille['Valeur'] / volaille['Total_Nourr']) * 100, 2)
volaille['qte_volaille_kg'] = volaille['Valeur']*1000
volaille=volaille[['Code zone', 'part_vol_nourr', 'qte_volaille_kg']]
volaille.columns=['code_pays', 'part_vol_nourr', 'qte_volaille_kg']
volaille.sample(5)
code_pays | part_vol_nourr | qte_volaille_kg | |
---|---|---|---|
154 | 211 | 1.74 | 132000.0 |
156 | 208 | 0.59 | 30000.0 |
162 | 220 | 12.04 | 88000.0 |
53 | 231 | 5.94 | 18526000.0 |
151 | 276 | 0.32 | 67000.0 |
df_global = pd.merge(df_global, volaille, how='left')
df_global['qte_volaille_kg']=df_global['qte_volaille_kg']/df_global['pop_M']
df_global.isna()['part_vol_nourr'].sum()
df_global.sample(3)
0
code_pays | dispo_kcal | dispo_prot | part_prot_anim | evol_pop_pct | continent | code_cont | pays | pop_M | pib_hab | risque | part_vol_nourr | qte_volaille_kg | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
136 | 210 | 3184.0 | 105.56 | 63.992042 | 7.959895 | Europe | 1 | Suède | 9971.638 | 53146.5 | 1 | 2.16 | 16.847784 |
31 | 52 | 3149.0 | 94.42 | 34.452447 | 12.782592 | Asie | 0 | Azerbaïdjan | 9949.537 | 14209.6 | 5 | 1.67 | 13.869992 |
56 | 93 | 2121.0 | 49.62 | 21.342201 | 15.306959 | Ameriques | 3 | Haïti | 11123.178 | 1767.2 | 6 | 1.96 | 8.630627 |
df_global.sample(5)
code_pays | dispo_kcal | dispo_prot | part_prot_anim | evol_pop_pct | continent | code_cont | pays | pop_M | pib_hab | risque | part_vol_nourr | qte_volaille_kg | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
66 | 105 | 3528.0 | 126.94 | 58.834187 | 19.380598 | Asie | 0 | Israël | 8381.516 | 39543.2 | 2 | 7.83 | 67.529550 |
158 | 255 | 3769.0 | 99.87 | 58.656253 | 6.525984 | Europe | 1 | Belgique | 11482.178 | 51246.0 | 2 | 1.33 | 11.496077 |
62 | 100 | 2533.0 | 63.35 | 23.677979 | 12.657312 | Asie | 0 | Inde | 1352642.280 | 6496.8 | 5 | 0.42 | 2.320643 |
6 | 9 | 3307.0 | 106.77 | 64.671724 | 10.681070 | Ameriques | 3 | Argentine | 44361.150 | 22745.9 | 6 | 5.71 | 44.250431 |
133 | 207 | 2698.0 | 60.73 | 40.688292 | 11.383559 | Ameriques | 3 | Suriname | 575.990 | 16609.4 | 6 | 5.87 | 32.986684 |
part_imp_vol
= (Importations / (Production + Exportations + Variation des Stocks)) * 100
Remarque :
Production + Exportations + Variation des Stocks
= 0, alors
part_imp_vol
= infImportations
!= 0, cela veut dire que ce pays importe tout ce qu'il consomme part_imp_vol
par le max de vol['part_imp_vol']vol = pd.read_csv('data/FAOSTAT_volaille.csv')
vol.head(5)
Code Domaine | Domaine | Code zone | Zone | Code Élément | Élément | Code Produit | Produit | Code année | Année | Unité | Valeur | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | FBS | Nouveaux Bilans Alimentaire | 2 | Afghanistan | 5511 | Production | 2734 | Viande de Volailles | 2018 | 2018 | Milliers de tonnes | 29 |
1 | FBS | Nouveaux Bilans Alimentaire | 2 | Afghanistan | 5611 | Importations - Quantité | 2734 | Viande de Volailles | 2018 | 2018 | Milliers de tonnes | 25 |
2 | FBS | Nouveaux Bilans Alimentaire | 2 | Afghanistan | 5072 | Variation de stock | 2734 | Viande de Volailles | 2018 | 2018 | Milliers de tonnes | 0 |
3 | FBS | Nouveaux Bilans Alimentaire | 2 | Afghanistan | 5911 | Exportations - Quantité | 2734 | Viande de Volailles | 2018 | 2018 | Milliers de tonnes | 0 |
4 | FBS | Nouveaux Bilans Alimentaire | 2 | Afghanistan | 5301 | Disponibilité intérieure | 2734 | Viande de Volailles | 2018 | 2018 | Milliers de tonnes | 53 |
vol=vol[['Code zone', 'Élément', 'Valeur']]
vol.columns = ['code_pays', 'element', 'valeur']
vol = vol.pivot_table(index=['code_pays'], columns=['element'], values=['valeur'])
vol = vol.reset_index()
vol.columns = ['code_pays', 'dispo_int', 'exp', 'imp', 'nourr', 'prod', 'var_stocks']
vol=vol.fillna(0)
vol.sample(10)
code_pays | dispo_int | exp | imp | nourr | prod | var_stocks | |
---|---|---|---|---|---|---|---|
60 | 95 | 223.0 | 1.0 | 18.0 | 222.0 | 206.0 | 0.0 |
144 | 211 | 132.0 | 2.0 | 45.0 | 132.0 | 97.0 | 8.0 |
36 | 56 | 400.0 | 6.0 | 57.0 | 396.0 | 349.0 | 0.0 |
7 | 10 | 1211.0 | 39.0 | 16.0 | 1211.0 | 1235.0 | 0.0 |
1 | 2 | 53.0 | 0.0 | 25.0 | 53.0 | 29.0 | 0.0 |
171 | 273 | 10.0 | 0.0 | 9.0 | 10.0 | 4.0 | 2.0 |
130 | 189 | 11.0 | 0.0 | 10.0 | 11.0 | 2.0 | 0.0 |
147 | 215 | 81.0 | 0.0 | 1.0 | 81.0 | 79.0 | 0.0 |
116 | 167 | 252.0 | 26.0 | 121.0 | 238.0 | 169.0 | 12.0 |
31 | 50 | 34.0 | 1.0 | 14.0 | 30.0 | 26.0 | 5.0 |
vol['part_imp_vol'] = round(vol['imp'] / (vol['exp'] + vol['var_stocks'] + vol['prod']) * 100, 2)
vol[vol['part_imp_vol'] == np.inf]
code_pays | dispo_int | exp | imp | nourr | prod | var_stocks | part_imp_vol | |
---|---|---|---|---|---|---|---|---|
35 | 55 | 5.0 | 0.0 | 4.0 | 3.0 | 0.0 | 0.0 | inf |
46 | 72 | 3.0 | 0.0 | 3.0 | 3.0 | 0.0 | 0.0 | inf |
129 | 188 | 4.0 | 0.0 | 3.0 | 3.0 | 0.0 | 0.0 | inf |
131 | 191 | 9.0 | 0.0 | 8.0 | 8.0 | 0.0 | 0.0 | inf |
vol = vol.replace([np.inf, -np.inf], np.nan)
vol[vol['part_imp_vol'].isna()][['code_pays', 'exp', 'imp', 'prod', 'var_stocks', 'part_imp_vol']].sort_values(by="code_pays")
code_pays | exp | imp | prod | var_stocks | part_imp_vol | |
---|---|---|---|---|---|---|
35 | 55 | 0.0 | 4.0 | 0.0 | 0.0 | NaN |
46 | 72 | 0.0 | 3.0 | 0.0 | 0.0 | NaN |
129 | 188 | 0.0 | 3.0 | 0.0 | 0.0 | NaN |
131 | 191 | 0.0 | 8.0 | 0.0 | 0.0 | NaN |
z = vol['part_imp_vol'].max()
vol = vol.fillna(z)
vol.sample(3)
code_pays | dispo_int | exp | imp | nourr | prod | var_stocks | part_imp_vol | |
---|---|---|---|---|---|---|---|---|
18 | 28 | 1615.0 | 0.0 | 1.0 | 1563.0 | 1896.0 | 282.0 | 0.05 |
22 | 37 | 9.0 | 0.0 | 5.0 | 9.0 | 7.0 | 2.0 | 55.56 |
167 | 251 | 58.0 | 1.0 | 11.0 | 58.0 | 49.0 | 1.0 | 21.57 |
vol=vol[['code_pays', 'part_imp_vol']]
df_global = pd.merge(df_global, vol, how='left')
df_global.shape
(163, 14)
df_global.sample(3)
code_pays | dispo_kcal | dispo_prot | part_prot_anim | evol_pop_pct | continent | ... | pop_M | pib_hab | risque | part_vol_nourr | qte_volaille_kg | part_imp_vol | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2997.0 | 94.35 | 48.050021 | 1.517634 | Asie | ... | 2951.745 | 12715.0 | 6 | 1.71 | 15.245219 | 275.00 |
92 | 137 | 3051.0 | 88.93 | 46.339818 | 2.253196 | Afrique | ... | 1267.185 | 22208.2 | 4 | 7.42 | 39.457538 | 6.12 |
19 | 32 | 2733.0 | 71.89 | 15.662818 | 30.975456 | Afrique | ... | 25216.267 | 3603.5 | 5 | 0.45 | 3.172555 | 2.53 |
3 rows × 14 columns
df_global.loc[df_global['code_pays'] == 229, 'pays'] = 'Royaume-Uni'
df_global.loc[df_global['code_pays'] == 19, 'pays'] = 'Bolivie'
df_global.loc[df_global['code_pays'] == 231, 'pays'] = 'États-Unis'
df_global.loc[df_global['code_pays'] == 117, 'pays'] = 'Corée du Sud'
df_global.loc[df_global['code_pays'] == 215, 'pays'] = 'Tanzanie'
df_global.loc[df_global['code_pays'] == 41, 'pays'] = 'Chine Continentale'
df_global.loc[df_global['code_pays'] == 214, 'pays'] = 'Chine - Taiwan'
imposition = pd.read_csv("data/imposition.csv")
imposition.sample(3)
pays | taux_imposition | |
---|---|---|
31 | Cambodge | 21.7 |
178 | Trinité-et-Tobago | 39.7 |
123 | Nicaragua | 60.6 |
df_global=pd.merge(df_global, imposition, how='left')
liste_pays_manque_imposition=list(df_global[df_global['taux_imposition'].isna()]['pays'].sort_values())
liste_pays_manque_imposition
['Chine - RAS de Macao', 'Guyana', 'Kirghizistan', 'République de Moldova', 'Slovaquie', 'Tchéquie', 'Turkménistan']
Ces 7 pays ne fournissent pas d'information sur leur taux d'imposition
-> on les exclut de l'analyse (on crée un df spécifique pour ces pays)
df_pays_sans_impot = df_global.loc[df_global['pays'].isin(liste_pays_manque_imposition),:]
df_pays_sans_impot
code_pays | dispo_kcal | dispo_prot | part_prot_anim | evol_pop_pct | continent | ... | pib_hab | risque | part_vol_nourr | qte_volaille_kg | part_imp_vol | taux_imposition | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
55 | 91 | 2913.0 | 86.51 | 41.081956 | 4.310159 | Ameriques | ... | 9312.1 | 6 | 3.98 | 38.510615 | 1.96 | NaN |
73 | 113 | 2729.0 | 84.41 | 40.172965 | 19.962991 | Asie | ... | 5133.2 | 6 | 0.42 | 3.331202 | 362.50 | NaN |
84 | 128 | 3327.0 | 109.47 | 64.775738 | 22.590875 | Asie | ... | 131908.0 | 3 | 4.63 | 34.830187 | 216.67 | NaN |
97 | 146 | 2383.0 | 61.64 | 49.107722 | -1.481853 | Europe | ... | 12373.0 | 5 | 3.26 | 18.756429 | 55.88 | NaN |
110 | 167 | 3277.0 | 86.98 | 60.738101 | 2.306042 | Europe | ... | 39452.8 | 3 | 2.72 | 22.314570 | 58.45 | NaN |
130 | 199 | 2871.0 | 70.57 | 53.011195 | 0.993505 | Europe | ... | 32067.4 | 3 | 1.96 | 14.120631 | 54.72 | NaN |
138 | 213 | 2830.0 | 88.62 | 40.385917 | 18.540867 | Asie | ... | 14845.3 | 6 | 0.70 | 4.614674 | 67.39 | NaN |
7 rows × 15 columns
df_global=df_global.dropna()
df_global.shape
df_global.sample(10)
(156, 15)
code_pays | dispo_kcal | dispo_prot | part_prot_anim | evol_pop_pct | continent | ... | pib_hab | risque | part_vol_nourr | qte_volaille_kg | part_imp_vol | taux_imposition | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
114 | 173 | 3537.0 | 105.59 | 54.863150 | -1.134595 | Europe | ... | 31765.7 | 3 | 3.36 | 30.457582 | 2.00 | 40.7 |
42 | 67 | 3343.0 | 117.99 | 63.923729 | 3.818572 | Europe | ... | 48191.2 | 1 | 1.99 | 19.375016 | 9.83 | 37.3 |
8 | 11 | 3695.0 | 109.12 | 60.328079 | 6.591787 | Europe | ... | 55687.2 | 1 | 2.07 | 18.557283 | 46.91 | 51.5 |
50 | 83 | 3078.0 | 73.57 | 48.987359 | 17.300351 | Oceanie | ... | 2258.9 | 5 | 2.83 | 17.264150 | 100.00 | 32.7 |
74 | 114 | 2197.0 | 61.75 | 24.161943 | 29.153070 | Afrique | ... | 4203.8 | 4 | 0.12 | 0.603200 | 3.33 | 37.2 |
136 | 210 | 3184.0 | 105.56 | 63.992042 | 7.959895 | Europe | ... | 53146.5 | 1 | 2.16 | 16.847784 | 37.85 | 49.1 |
149 | 230 | 3102.0 | 86.45 | 44.261916 | -4.143432 | Europe | ... | 12338.0 | 6 | 2.81 | 24.567106 | 8.22 | 41.7 |
71 | 110 | 2705.0 | 87.36 | 55.638237 | -1.039729 | Asie | ... | 41074.1 | 1 | 3.35 | 18.773261 | 34.64 | 46.7 |
61 | 99 | 3654.0 | 146.13 | 71.840142 | 8.317999 | Europe | ... | 56157.5 | 2 | 3.24 | 29.698883 | 10.00 | 30.6 |
104 | 157 | 2582.0 | 63.53 | 30.946010 | 14.081669 | Ameriques | ... | 5694.9 | 6 | 4.27 | 20.416051 | 4.55 | 60.6 |
10 rows × 15 columns
df_global = df_global.reindex(columns=['code_pays', 'pays', 'code_cont', 'continent',
'pop_M', 'evol_pop_pct', 'pib_hab', 'risque', 'taux_imposition',
'dispo_kcal', 'dispo_prot', 'part_prot_anim',
'qte_volaille_kg', 'part_vol_nourr', 'part_imp_vol'])
df_global.columns = ['code_pays', 'pays', 'code_cont', 'continent',
'pop_M', 'evol_pop', 'pib_hab', 'risque', 'taux_impot',
'dispo_kcal', 'dispo_prot', 'part_prot_anim',
'qte_volaille', 'vol_part_nourr', 'vol_part_import']
df_global.sample(1)
df_global.dtypes
code_pays | pays | code_cont | continent | pop_M | evol_pop | ... | dispo_kcal | dispo_prot | part_prot_anim | qte_volaille | vol_part_nourr | vol_part_import | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
98 | 147 | Namibie | 2 | Afrique | 2448.301 | 19.815415 | ... | 2469.0 | 65.78 | 35.025844 | 9.802716 | 1.75 | 118.18 |
1 rows × 15 columns
code_pays int64 pays object code_cont int64 continent object pop_M float64 evol_pop float64 pib_hab float64 risque int64 taux_impot object dispo_kcal float64 dispo_prot float64 part_prot_anim float64 qte_volaille float64 vol_part_nourr float64 vol_part_import float64 dtype: object
df_global['taux_impot'] = df_global['taux_impot'].astype('float64')
df_index_pays=df_global.set_index('pays')
df_index_pays=df_index_pays[['dispo_kcal', 'dispo_prot', 'part_prot_anim', 'evol_pop']]
df_index_pays.to_csv("data/exports/df_index_pays.csv", index=True, header = True)
df_global[df_global['pop_M'] <= 1000].value_counts().sum()
df_global.shape
23
(156, 15)
df_global.to_csv("data/exports/global.csv", index = False, header = True)
evol_pop
part_prot_anim
dispo_kcal
dispo_prot
data = df_global.copy()
data=data[['dispo_kcal', 'dispo_prot', 'part_prot_anim', 'evol_pop']]
data.sample(3)
data.to_csv("data/exports/data_apc.csv", index=False, header = True)
dispo_kcal | dispo_prot | part_prot_anim | evol_pop | |
---|---|---|---|---|
34 | 2952.0 | 79.08 | 55.538695 | 1.126689 |
147 | 1981.0 | 46.94 | 26.097145 | 40.409459 |
100 | 3297.0 | 106.69 | 65.432562 | 2.966278 |
data = df_global.copy()
data.set_index('pays',inplace = True)
data=data[['dispo_kcal', 'dispo_prot', 'part_prot_anim', 'evol_pop']]
data.sample(3)
data.to_csv("data/exports/data_apc.csv", index=False, header = True)
dispo_kcal | dispo_prot | part_prot_anim | evol_pop | |
---|---|---|---|---|
pays | ||||
Népal | 2769.0 | 74.34 | 19.101426 | 5.359286 |
Dominique | 2952.0 | 79.08 | 55.538695 | 1.126689 |
Ouganda | 1981.0 | 46.94 | 26.097145 | 40.409459 |
from scipy import stats
def corrfunc(x, y, **kws):
r, _ = stats.pearsonr(x, y)
ax = plt.gca()
ax.annotate("r = {:.2f}".format(r),
xy=(.1, .9), xycoords=ax.transAxes)
sns.set_context('notebook', font_scale = 0.8)
sns.set_theme(style="white", palette="Set2", font_scale= 0.8)
g=sns.pairplot(data, height=2)
g.map_lower(corrfunc)
plt.savefig('data/exports/img_charts/1.correlation_var_actives_pairplot.png', dpi = 300)
plt.show(g);