Le monde est confronté à de nombreux problèmes importants et terrifiants qui mettent en danger la vie de l'humanité. La pollution de l'air fait partie malheureusement de ces problèmes majeurs entrainant le décès plusieurs millions de morts dans le monde.
La pollution atmosphérique désigne le rejet dans l'air de polluants qui sont préjudiciables à la santé humaine et à la planète dans son ensemble. Elle peut être décrite comme l'une des menaces les plus dangereuses auxquelles l'humanité ait jamais été confrontée. Elle cause des dommages aux animaux, aux cultures, aux forêts et aux organismes aquatiques. Elle contribue également à l'appauvrissement de la couche d'ozone, qui protège la Terre des rayons ultrat-violets (UV) du soleil. Parmi les autres effets de la pollution atmosphérique sur l'environnement, citons la brume sèche, l'eutrophisation et les changements climatiques mondiaux. Cela nous montre donc à quel point il est primordial pour nous de comprendre et trouver une solution adéquate à ce problème majeur. Pour ce faire, nous allons commencer par analyser judicieusement et comprendre les zones geographiques les plus touchées au fil des années et surtout de comprendre l'évenement majeur pouvant entrainer la cause de cette pollution quand cela est possible.
from IPython.display import Image
Image("figure/img_pollution.jpg")
#!pip install pycountry
#!pip install pycountry_convert
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import cufflinks as cf
import geopandas as gpd
import plotly.express as px
import plotly.graph_objects as go
from pycountry import countries
import pycountry_convert as pc
import warnings
warnings.filterwarnings("ignore")
%matplotlib inline
from plotly.offline import download_plotlyjs,init_notebook_mode, plot, iplot
init_notebook_mode(connected=True)
cf.go_offline()
Données:
Dans cette première partie, nous utiliserons plusieurs données provenant du site $\textbf{Our World in Data}$. Ce site regroupe plusieurs bases de données très variés concernant plusieurs problèmes existant dans le monde tels que la pauvreté, maladie, faim, changement climatique, guerre, risques existentiels et inégalité ,... Les données que nous allons étudier dans cette première partie concerne le nombre de décès causé par plusieurs facteurs dans le monde y compris la pollution de l'air. Les données ont été colléctées annuellement pour chaque pays dans le monde entre la période 1990 à 2015. Pour une étude plus approfondie, nous allons également croiser ces données avec d'autres données concernant l'emission des gaz carbonique(CO2),du méthane, la concentration d'ozone, les particules fines et le protoxyde d'azote.
Les variables utilisées dans cette étude sont pondérées en fonction de la population afin de ne pas biaiser le resultat.
df_death_world =pd.read_csv("data/number-of-deaths-by-risk-factor.csv",sep=";")
df_death_world= df_death_world.drop(['Unnamed: 38','Unnamed: 39'],axis=1)
df_death_world.head()
Entity | Code | Year | Deaths - Diet low in vegetables - Sex: Both - Age: All Ages (Number) | Deaths - Diet low in whole grains - Sex: Both - Age: All Ages (Number) | Deaths - Diet low in nuts and seeds - Sex: Both - Age: All Ages (Number) | Deaths - Diet low in calcium - Sex: Both - Age: All Ages (Number) | Deaths - Unsafe sex - Sex: Both - Age: All Ages (Number) | Deaths - No access to handwashing facility - Sex: Both - Age: All Ages (Number) | Deaths - Child wasting - Sex: Both - Age: All Ages (Number) | ... | Deaths - High body-mass index - Sex: Both - Age: All Ages (Number) | Deaths - Low bone mineral density - Sex: Both - Age: All Ages (Number) | Deaths - Diet low in fruits - Sex: Both - Age: All Ages (Number) | Deaths - Diet low in legumes - Sex: Both - Age: All Ages (Number) | Deaths - Low birth weight for gestation - Sex: Both - Age: All Ages (Number) | Deaths - Unsafe water source - Sex: Both - Age: All Ages (Number) | Deaths - Unsafe sanitation - Sex: Both - Age: All Ages (Number) | Deaths - Household air pollution from solid fuels - Sex: Both - Age: All Ages (Number) | Deaths - Air pollution - Sex: Both - Age: All Ages (Number) | Deaths – Outdoor air pollution (all ages) (IHME) | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Afghanistan | AFG | 1990 | 7678.717644 | 11381.377345 | 7299.867330 | 181.287701 | 387.167582 | 5412.314513 | 22778.849249 | ... | 7701.581280 | 374.844056 | 8538.964137 | 3418.965194 | 12168.564631 | 7554.049543 | 5887.747628 | 22388.497233 | 26598.006727 | 4383.83 |
1 | Afghanistan | AFG | 1991 | 7789.773033 | 11487.832390 | 7386.764303 | 184.251584 | 394.448285 | 5287.891103 | 22292.691113 | ... | 7747.774903 | 379.854237 | 8642.847151 | 3457.398250 | 12360.635374 | 7359.676749 | 5732.770160 | 22128.758206 | 26379.532218 | 4426.36 |
2 | Afghanistan | AFG | 1992 | 8083.234634 | 11866.235572 | 7640.628526 | 191.318450 | 422.453302 | 5506.657363 | 23102.197940 | ... | 7991.018971 | 388.130434 | 8961.526496 | 3586.490291 | 13459.593716 | 7650.437822 | 5954.804987 | 22873.768789 | 27263.127914 | 4568.91 |
3 | Afghanistan | AFG | 1993 | 8452.242405 | 12335.961682 | 7968.311853 | 199.767293 | 448.328317 | 7104.620351 | 27902.669960 | ... | 8281.564408 | 405.577931 | 9377.118485 | 3746.266658 | 18458.429133 | 10270.731383 | 7986.736613 | 25599.756284 | 30495.561499 | 5080.29 |
4 | Afghanistan | AFG | 1994 | 8755.372045 | 12672.950191 | 8244.368430 | 206.619714 | 464.506355 | 8051.515953 | 32929.005932 | ... | 8472.297780 | 415.349195 | 9688.448554 | 3869.288402 | 19958.388545 | 11409.177112 | 8863.010065 | 28013.167200 | 33323.161401 | 5499.23 |
5 rows × 38 columns
head_col = ["Entity","Code","Year"]
colonne_d = []
for col in df_death_world.columns[3:]:
col_name = col.split("-")
if len(col_name)>1:
colonne_d.append(col_name[1])
else:
colonne_d.append(col_name)
col_final = head_col + colonne_d
col_final[-1] = "Outdoor air pollution"
colonne_d = col_final[3:]
df_death_world.columns = col_final
#df_death_world.head()
colonne_d = np.asarray(colonne_d).flatten().tolist()
df_death = df_death_world.groupby(["Year"])[colonne_d].sum()
df_death = df_death.iloc[2:,:]
df_death.head()
Diet low in vegetables | Diet low in whole grains | Diet low in nuts and seeds | Diet low in calcium | Unsafe sex | No access to handwashing facility | Child wasting | Child stunting | Diet high in red meat | Diet low in fiber | ... | High body | Low bone mineral density | Diet low in fruits | Diet low in legumes | Low birth weight for gestation | Unsafe water source | Unsafe sanitation | Household air pollution from solid fuels | Air pollution | Outdoor air pollution | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Year | |||||||||||||||||||||
1990 | 5.579176e+06 | 9.327172e+06 | 6.197559e+06 | 464908.837283 | 2.190842e+06 | 5.446405e+06 | 1.475378e+07 | 4.376233e+06 | 62371.984805 | 2.615823e+06 | ... | 9.661706e+06 | 667884.089373 | 8.127860e+06 | 1.770209e+06 | 8.452891e+06 | 9.163278e+06 | 7.095039e+06 | 1.138135e+07 | 1.989655e+07 | 9160523.23 |
1991 | 5.624173e+06 | 9.460549e+06 | 6.273026e+06 | 476388.796321 | 2.549163e+06 | 5.416547e+06 | 1.448716e+07 | 4.275670e+06 | 63262.304620 | 2.649371e+06 | ... | 9.933452e+06 | 682154.369880 | 8.230030e+06 | 1.792674e+06 | 8.389022e+06 | 9.108674e+06 | 7.044254e+06 | 1.125514e+07 | 2.000852e+07 | 9408004.53 |
1992 | 5.709048e+06 | 9.654211e+06 | 6.384863e+06 | 488270.933365 | 2.963181e+06 | 5.331182e+06 | 1.411180e+07 | 4.156469e+06 | 63954.940218 | 2.699332e+06 | ... | 1.027215e+07 | 697621.411744 | 8.384543e+06 | 1.829575e+06 | 8.318822e+06 | 8.933712e+06 | 6.900140e+06 | 1.114029e+07 | 2.011810e+07 | 9638559.84 |
1993 | 5.852533e+06 | 9.975794e+06 | 6.588321e+06 | 503228.195622 | 3.407305e+06 | 5.246986e+06 | 1.376073e+07 | 4.046425e+06 | 65504.189105 | 2.783902e+06 | ... | 1.080256e+07 | 716722.074874 | 8.628856e+06 | 1.909508e+06 | 8.223404e+06 | 8.770290e+06 | 6.761211e+06 | 1.096505e+07 | 2.022139e+07 | 9919298.89 |
1994 | 5.932201e+06 | 1.018312e+07 | 6.700211e+06 | 513642.030130 | 3.879726e+06 | 5.165670e+06 | 1.345567e+07 | 3.946716e+06 | 66156.677107 | 2.835616e+06 | ... | 1.120452e+07 | 732026.486869 | 8.802091e+06 | 1.955549e+06 | 8.084732e+06 | 8.613781e+06 | 6.627828e+06 | 1.080272e+07 | 2.024440e+07 | 10106396.81 |
5 rows × 35 columns
test_2015 = df_death[df_death.index=="2015"]
test_2015 = ((test_2015.T).sort_values(by="2015",ascending=False)).iloc[:20,:]
fig = px.bar(test_2015,x="2015",y=test_2015.index,color=test_2015.index,text="2015",
labels={"index":" ","color":" Cause de la mortalité","2015":"Année 2015"},
color_continuous_scale=px.colors.sequential.Inferno,
color_continuous_midpoint=2)
fig.update_traces(texttemplate='%{text:.3s}',textposition="outside")
fig.update_layout(uniformtext_minsize=8)
test_1990 = df_death[df_death.index=="1990"]
test_1990 = ((test_1990.T).sort_values(by="1990",ascending=False)).iloc[:20,:]
fig = px.bar(test_1990,x="1990",y=test_1990.index,color=test_1990.index,text="1990",labels={"index":" ","1990":" Année 1990"}
)
fig.update_traces(texttemplate='%{text:.3s}',textposition="outside")
fig.update_layout(uniformtext_minsize=8)
On peut constater la pollution de l'air est un vrai problème pour la survie de l'humanité. Soit 20 millions de personnes environ, dans le monde, sont décédées par ce dernier en 1990 et près de 21 millions de personnes en 2015. Ces chiffres nous montrent à quel point la situation peut encore s'aggraver si nous ne prenons pas les précautions nécessaires pour protéger notre environnement.
plt.figure(figsize=(15,5))
plt.plot(df_death[' Air pollution '],label="nombre de Décès")
plt.legend()
plt.xticks(rotation=90)
plt.yticks([19.5e6,20e6,20.5e6,21e6],["19.5M","20M","20.5M","21M"])
plt.ylabel("Nombre en million")
plt.title("Evolution du nombre de décès causé par la pollution de l'air dans le monde")
plt.show()
df_death_ = df_death_world[['Entity', 'Code', 'Year',"Outdoor air pollution"]].rename(columns={"Outdoor air pollution":"death_count"})
for col in df_death_.select_dtypes("object"):
df_death_[col]= df_death_[col].astype("string")
df_death_ = df_death_.loc[(df_death_["Year"]>='1990') ]
df_death_ = df_death_.loc[(df_death_["Year"]<='2016') ]
#df_death_
df_CO2_coutry = pd.read_csv("data/annual-co2-emissions-per-country.csv")
for col in df_CO2_coutry.select_dtypes("object"):
df_CO2_coutry[col]= df_CO2_coutry[col].astype("string")
df_CO2_coutry["Year"] = df_CO2_coutry.Year.astype("string")
df_CO2_coutry = df_CO2_coutry.loc[(df_CO2_coutry["Year"]>='1990') ]
df_CO2_coutry = df_CO2_coutry.loc[(df_CO2_coutry["Year"]<='2016') ]
df_CO2_coutry=(df_CO2_coutry.reset_index()).drop("index",axis=1)
#df_CO2_coutry
df_1 = pd.merge(df_death_,df_CO2_coutry, on=['Entity', 'Code', 'Year'])
#df_1
df_CH4_coutry = pd.read_csv("data/methane-emissions.csv")
for col in df_CH4_coutry.select_dtypes("object"):
df_CH4_coutry[col]= df_CH4_coutry[col].astype("string")
df_CH4_coutry["Year"] = df_CH4_coutry.Year.astype("string")
df_CH4_coutry=((df_CH4_coutry.reset_index()).drop("index",axis=1)).rename(columns={'Total including LUCF (CH4 emissions, CAIT)':'CH4'})
df_CH4_coutry = df_CH4_coutry.loc[(df_CH4_coutry["Year"]<='2016') ]
#df_CH4_coutry
df_2 = pd.merge(df_1,df_CH4_coutry, on=['Entity', 'Code', 'Year'])
#df_2
df_N20_coutry = pd.read_csv("data/nitrous-oxide-emissions.csv")
for col in df_N20_coutry.select_dtypes("object"):
df_N20_coutry[col]= df_N20_coutry[col].astype("string")
df_N20_coutry["Year"] = df_N20_coutry.Year.astype("string")
df_N20_coutry=((df_N20_coutry.reset_index()).drop("index",axis=1)).rename(columns={'Total including LUCF (N2O emissions, CAIT)':'N2O'})
#df_N20_coutry
df_3 = pd.merge(df_2,df_N20_coutry, on=['Entity', 'Code', 'Year'])
#df_3
df_O3_coutry = pd.read_csv("data/ozone-o3-concentration-in-ppb.csv")
for col in df_O3_coutry.select_dtypes("object"):
df_O3_coutry[col]= df_O3_coutry[col].astype("string")
df_O3_coutry["Year"] = df_O3_coutry.Year.astype("string")
df_O3_coutry=((df_O3_coutry.reset_index()).drop("index",axis=1)).rename(columns={'Ozone concentration-StateofGlobalAir':'O3'})
#df_O3_coutry
df_4 = pd.merge(df_3,df_O3_coutry, on=['Entity', 'Code', 'Year'])
#df_4
df_PM25_coutry = pd.read_csv("data/PM25-air-pollution.csv")
for col in df_PM25_coutry.select_dtypes("object"):
df_PM25_coutry[col]= df_PM25_coutry[col].astype("string")
df_PM25_coutry["Year"] = df_PM25_coutry.Year.astype("string")
df_PM25_coutry=((df_PM25_coutry.reset_index()).drop("index",axis=1)).rename(columns={'PM2.5 air pollution, mean annual exposure (micrograms per cubic meter)':'PM25'})
#df_PM25_coutry
df_5 =pd.merge(df_4,df_PM25_coutry, on=['Entity', 'Code', 'Year'])
df_5["Year"] = df_5["Year"].astype("int")
df_5.head()
Entity | Code | Year | death_count | Annual CO2 emissions | CH4 | N2O | O3 | PM25 | |
---|---|---|---|---|---|---|---|---|---|
0 | Afghanistan | AFG | 1990 | 4383.83 | 2.603238 | 8.97 | 3.25 | 62 | 60.936690 |
1 | Afghanistan | AFG | 1995 | 5641.29 | 1.230463 | 9.15 | 3.07 | 62 | 56.136628 |
2 | Afghanistan | AFG | 2000 | 5587.68 | 0.757672 | 10.59 | 3.62 | 62 | 56.092028 |
3 | Afghanistan | AFG | 2005 | 6189.71 | 1.303267 | 11.68 | 3.97 | 62 | 43.234032 |
4 | Afghanistan | AFG | 2010 | 6154.12 | 8.397779 | 30.04 | 6.03 | 63 | 46.536809 |
fig = px.choropleth(df_5,
locationmode = "country names",
locations =df_5["Entity"],
color = df_5["death_count"] ,
labels={"death_count":"Nombre de décès"},
animation_frame="Year"
)
fig.update_layout(title="Pourcentage de décès par pays",template="plotly_dark")
fig.show()
On constate que depuis l'année 1990 , le nombre de décès annuel dans le monde n'a cessé d'augmenter. Ce nombre est plus particulièrement important pour la Chine et l'Inde car si on comptait environ 618 milles morts pour la Chine et 368 milles morts en Inde en 1990, ces chiffres sont passés à environ un million de morts pour la Chine et 763 milles presonnes décédés pour l'Inde en 2015.
fig = px.choropleth(df_5,
locationmode = "country names",
locations =df_5["Entity"],
color = df_5["N2O"] ,
animation_frame="Year")
fig.update_layout(title="Concentration de N2O par pays")
fig.show()
Sur cette figure, on peut voir la concentration du gaz protoxyde d'azote ($N_2 O$) dans le monde. Cette concentration voit une augmentation majeure durant la période 1990 et 2015 dans certains pays. Après la Chine, on voit que l'Inde, les Etats-Unis et le Brésil en possèdent également une forte concentration. On remarque tout de même qu'à part la Chine et l'Inde, les concentrations baissent légèrement surtout en Russie.
fig = px.choropleth(df_5,
locationmode = "country names",
locations =df_5["Entity"],
color = df_5["CH4"] ,
animation_frame="Year")
fig.update_layout(title="Concentration du méthane(CH4)")
fig.show()
Trois pays dominent aujourd'hui le marché mondial des productions animales en termes de volumes produits et de croissance de la production : Chine, Brésil et Inde, dépassant les pays développés. Le Brésil est le premier exportateur mondial de viande bovine, dont il fournit près de 20 % des échanges.
En effet, l'élévage bovin est produit une quantité très importante du méthane dans le monde. Les pets de vache relachés dans l'atmosphère contiennent enormement de méthane qui est l'un gaz à effet de serre le plus nocif.Une vache laitière produit par jour jusqu'à 200 litres de gaz méthane. Il faudra alors changer leur régime alimentaire pour reduire la production du méthane.
Actuellement, les scientifiques savent que 25 % du réchauffement actuel est dù au gaz méthane. Pour rappel, un kilogramme de méthane a autant d'effet sur le réchauffement climatique que 23 kg de CO2.
fig = px.choropleth(df_5,
locationmode = "country names",
locations =df_5["Entity"],
color = df_5["Annual CO2 emissions"] ,
animation_frame="Year")
fig.update_layout(title="Concentration en CO2 dans l'atmosphère")
fig.show()
fig = px.choropleth(df_5,
locationmode = "country names",
locations =df_5["Entity"],
color = df_5["O3"] ,
animation_frame="Year")
fig.update_layout(title="Concentration d'ozone(O3)",template="plotly_dark")
fig.show()
fig = px.choropleth(df_5,
locationmode = "country names",
locations =df_5["Entity"],
color = df_5["PM25"] ,
animation_frame="Year")
fig.update_layout(title="Concentration des particules fines (PM2.5)",template="plotly_dark")
fig.show()
Les particules fines, également connue sous le nom de pollution particulaire ou PM, est un terme qui décrit les particules solides extrêmement petites et les gouttelettes liquides en suspension dans l'air. Les particules peuvent être composées de divers composants, notamment de nitrates, de sulfates, de produits chimiques organiques, de métaux, de particules de sol ou de poussière et d'allergènes (tels que des fragments de pollen ou des spores de moisissure). La pollution par les particules provient principalement des véhicules à moteur, des chauffages à bois et de l'industrie. Lors de feux de brousse ou de tempêtes de poussière, la pollution particulaire peut atteindre des concentrations extrêmement élevées.
$\textbf{Effets potentiels sur la santé de l'exposition aux particules:}$
Il existe de nombreux effets sur la santé liés à l'exposition aux particules. De nombreuses études ont montré des associations entre l'exposition aux particules et l'augmentation des admissions à l'hôpital ainsi que des décès dus à des maladies cardiaques ou pulmonaires. Malgré des recherches épidémiologiques approfondies, il n'existe actuellement aucune preuve d'un seuil en dessous duquel l'exposition aux particules n'entraîne aucun effet sur la santé. Les effets sur la santé peuvent se produire après une exposition à court et à long terme aux particules.
On pense que l'exposition à court et à long terme a des mécanismes d'action différents. L'exposition à court terme semble exacerber les maladies préexistantes, tandis que l'exposition à long terme provoque très probablement une maladie et en augmente la vitesse de progression.
$\textbf{L'exposition à court terme (de quelques heures à quelques jours) peut entraîner :}$
$\textbf{Une exposition à long terme (plusieurs années) peut entraîner :}$
Les variables n'ont pas les mêmes grandeurs, il est alors nécessaire de les normaliser afin de leurs donner une même importance lors de l'ACP.
from sklearn.preprocessing import StandardScaler
#recuperation de données et normalisation des données
df_acp = df_5.groupby("Entity")[['death_count', 'Annual CO2 emissions', 'CH4',
'N2O', 'O3', 'PM25']].mean()
#NORMALISATION
scaler = StandardScaler()
df_acp_norm = scaler.fit_transform(df_acp)
df_acp_norm = pd.DataFrame(df_acp_norm, columns=['death_count', 'Annual CO2 emissions', 'CH4',
'N2O', 'O3', 'PM25'],index=df_acp.index)
df_acp_norm = df_acp_norm.reset_index()
df_acp_norm
Entity | death_count | Annual CO2 emissions | CH4 | N2O | O3 | PM25 | |
---|---|---|---|---|---|---|---|
0 | Afghanistan | -0.123658 | -0.233731 | -0.111301 | -0.228329 | 0.589413 | 1.025517 |
1 | Albania | -0.192597 | -0.234177 | -0.324418 | -0.318999 | 1.119308 | -0.714101 |
2 | Algeria | -0.067475 | -0.070569 | -0.019187 | -0.164475 | 1.086865 | 0.042081 |
3 | Andorra | -0.201928 | -0.239771 | -0.353320 | -0.348636 | 0.600227 | -0.886610 |
4 | Angola | -0.161977 | -0.209349 | 0.060832 | 0.123168 | 2.189912 | 0.206867 |
... | ... | ... | ... | ... | ... | ... | ... |
175 | Venezuela | -0.114305 | 0.005135 | 0.282677 | -0.049444 | -0.838059 | -0.127359 |
176 | Vietnam | 0.058450 | -0.094586 | 0.250729 | 0.106208 | -0.308164 | -0.162208 |
177 | Yemen | -0.139674 | -0.214969 | -0.300938 | -0.282857 | -0.178394 | 1.090758 |
178 | Zambia | -0.181725 | -0.236269 | 0.548885 | 0.336800 | 0.459643 | -0.061778 |
179 | Zimbabwe | -0.178517 | -0.221289 | -0.261513 | -0.200716 | 0.005447 | -0.284863 |
180 rows × 7 columns
df_acp = df_acp.reset_index()
f = px.choropleth(df_acp,
locationmode ="country names",
locations=df_acp["Entity"],
color=df_acp["death_count"],
labels={"death_count":"nombre de décès"}
)
f.update_layout(title="Nombre de décès moyen de 1990 à 2015")
f.show()
Le graphe ci-dessus montre le nombre de décès moyen dans chaque pays entre l'année 1990 et 2015. On remarque que la Chine et l'Inde possède le nombre de décès le plus important avec un écart très significatif par rapport aux autres pays dans le monde.
Pour mieux appréhender cet écart, nous allons effectuer une analyse en composante principale et trouver les facteurs majeurs de ces décès parmi les facteurs que nous disposons tels que l'émission de CO2 moyen durant cette même période de chaque pays, la concentration moyenne en méthane, en ozone, en particules fines ayant un diamètre inférieur à 2.5 micronmètres et la concentration en N2O dans l'atmosphère.
Remarque: Les resultats sur l'ACP ont été obtenus via l'implémentation du code en language R de Rstudio en utilisant le package FactoMiner
df_acp_norm.to_csv("data/df_acp_norm.csv")
L’inertie des axes factoriels indique d’une part si les variables sont structurées et suggère d’autre part le nombre judicieux de composantes principales à étudier.
Les 2 premiers axes de l’ analyse expriment 82.34% de l’inertie totale du jeu de données ; cela signifie que 82.34% de la variabilité totale du nuage des individus (ou des variables) est représentée dans ce plan. C’est un pourcentage élevé, et le premier plan représente donc bien la variabilité contenue dans une très large part du jeu de données actif. Cette valeur est nettement supérieure à la valeur référence de 41.92%, la variabilité expliquée par ce plan est donc hautement significative .
Du fait de ces observations, il n’est probablement pas nécessaire pour l’analyse d’interpréter les dimensions suivantes.
Image("figure/inertie.png",height=500,width=600)
Décomposition de l’inertie totale Le premier facteur est prépondérant :
Il explique a lui seul 57.9% de la variabilité totale des données. Il convient de noter que dans un tel cas, la variabilité liée aux autres composantes peut être dénuée de sens, en dépit d’un pourcentage élevé.
Une estimation du nombre pertinent d’axes à interpréter suggère de restreindre l’analyse à la description des 2 premiers axes. Cette observation suggère que seuls ces axes sont porteurs d’une véritable information. En conséquence, la description de l’analyse sera restreinte à ces seuls axes.
Image("figure/individu.png")
Image("figure/variables.png")
Le groupe auquel les individus China, India et United States appartiennent (caractérisés par une coordonnée positive sur l’axe) partage de fortes valeurs pour les variables CH4, N2O, Annual.CO2.emissions et death_count (de la plus extrême à la moins extrême).
Le groupe 2 (caractérisés par une coordonnées négative sur l’axe) partage de faibles valeurs pour les variables PM25, O3, CH4, N2O, death_count et Annual.CO2.emissions (de la plus extrême à la moins extrême).
Notons que la variable N2O est extrêmement corrélée à cette dimension (corrélation de 0.95). Cette variable pourrait donc résumer à elle seule la dimension 1.
Le groupe auquel les individus Qatar, United Arab Emirates et Bahrain appartiennent (caractérisés par une coordonnée positive sur l’axe) partage :
de fortes valeurs pour les variables PM25 et O3 (de la plus extrême à la moins extrême). Le groupe 2 (caractérisés par une coordonnées négative sur l’axe) partage :
de faibles valeurs pour les variables PM25, O3, CH4, N2O, death_count et Annual.CO2.emissions (de la plus extrême à la moins extrême).
Nous allons faire deux tests ici pour vérifier la significativité de la corrélation entre le nombre de morts et les trois variables N2O,CO2 et CH4. Pour ce faire , nous utiliserons deux méthodes différentes : méthode de Pearson et méthode de Spearman. On obtient ainsi les resultats suivants:
Image("figure/N2O_corr.png",width=500,height=300)
Pour un niveau de test de 5%,la p-valeur obtenue est strictement inférieur 5% donc la corrélation est significativement différente de 0 entre la variable N2O et le nombre de mort. Cette corrélation est positive.
Image("figure/CO2_corr.png",width=500,height=300)
Pour un niveau de test de 5%,la p-valeur obtenue est strictement inférieur 5% donc la corrélation est significativement différente de 0 entre la variable CO2 et le nombre de mort. Cette corrélation est positive.
Image("figure/CH4_corr.png",width=500,height=300)
Pour un niveau de test de 5%,la p-valeur obtenue est strictement inférieur 5% donc la corrélation est significativement différente de 0 entre la variable CH4 et le nombre de mort. Cette corrélation est positive.
Source des données:
Les données proviennent du plate-forme de l'organisation $\textbf{National Atmospheric Deposition Program}$. Il s'agit des données annuelles sur l'acidité de la précipitation aux Etats-Unis avec quelques informations de ses composants chimiques tels que le 'Ca','Mg', 'K', 'Na', 'NH4', 'NO3', 'Cl', 'SO4'.
Le but est de pouvoir expliquer à partir de ces composants chimiques la variation de l'acidité d'une précipitation.
Image("figure/foret.jpg",width=900)
Le FAO (Food and Agriculture Organisation) a affirmé en juillet 2020 que la superficie forestière mondiale continue de diminuer et la perte forestière enregistrée depuis 1990 à l'échelle mondiale s'élève à 178 millions d'hectares. Toutefois, le taux de perte forestière nette a considérablement baissé sur la période 1990-2020 grâce au recul de la déforestation dans certains pays et à l'augmentation du terrain forestier dans d'autres grâce au reboisement et à l'expansion naturelle des forêts
import pandas as pd
import matplotlib.pyplot as plt
df_ph = pd.read_csv("data/NTN-All-cy.csv",sep=";")
df_ph = df_ph[[ 'yr', 'Ca',
'Mg', 'K', 'Na', 'NH4', 'NO3', 'Cl', 'SO4', 'ppt','pH']]
plt.figure(figsize=(15,5))
df_ph[['yr','pH']].groupby("yr")["pH"].mean().plot(legend=True,xticks=range(1978,2020),rot=90)
plt.axhline(5.6,color="red",linestyle='--',label="valeur référence")
plt.legend()
plt.xlabel("Année")
plt.ylabel("Valeur")
#plt.fill_between(range(1978,2020),y1=0,y2=df_ph.pH,color="cyan")
plt.ylim(4.4,5.7)
plt.xlim(1978,2019)
plt.show()
# Pour faire une classification: O si pH<5 et 1 sinon
df_ph_brute = df_ph[[ 'Ca',
'Mg', 'K', 'Na', 'NH4', 'NO3', 'Cl', 'SO4', 'ppt','pH']]
df_ph_brute["acidité"] = df_ph_brute["pH"].apply(lambda x: 0 if x<5 else 1)
df_ph_brute = df_ph_brute.drop(["pH"],axis=1)
Cette figure montre que l'acidité de la pluie baisse (ou encore la valeur de pH augmente ) au fil des années de manière générale. Cela est dù en effet à la baisse de l'emission de monoxyde d'azote qui l'un des causes de l'acidification de la précipitation comme montre la figure
df_ph = df_ph.groupby("yr")[['Ca','Mg', 'K', 'Na', 'NH4', 'NO3', 'Cl', 'SO4', 'ppt','pH']].mean()
df_ph.head()
Ca | Mg | K | Na | NH4 | NO3 | Cl | SO4 | ppt | pH | |
---|---|---|---|---|---|---|---|---|---|---|
yr | ||||||||||
1978 | 0.171714 | 0.056476 | 0.041524 | 0.445286 | 0.224571 | 1.191286 | 0.456286 | 2.130143 | 26.932905 | 4.608095 |
1979 | 0.212263 | 0.045237 | 0.037711 | 0.405474 | 0.257053 | 1.283289 | 0.324553 | 2.312816 | 86.041553 | 4.671368 |
1980 | 0.257988 | 0.062000 | 0.055358 | 0.413753 | 0.299160 | 1.372395 | 0.590247 | 2.131568 | 65.082654 | 4.755185 |
1981 | 0.152770 | -0.017410 | -0.048300 | 0.151630 | 0.173390 | 1.025720 | 0.291960 | 1.920480 | 79.181920 | 4.639180 |
1982 | 0.209575 | 0.053920 | 0.039991 | 0.210575 | 0.233389 | 1.019973 | 0.368009 | 1.656947 | 93.613115 | 4.826690 |
df_ph.to_csv("data/data_pH.csv")
plt.figure(figsize=(15,5))
df_ph.corr()["pH"].sort_values(ascending=True).plot.barh(colormap="turbo_r")
plt.legend()
plt.xlabel('valeur')
plt.title("La corrélation de chaque variable avec la variable pH")
plt.show()
Une analyse en composante principale de ces données donne alors la figure suivante:
Image("figure/ph.png",width=700,height=700)
On peut remarquer que la dimension 2 oppose l'acidité de la précipitation (pH) et les variables SO4 et NO3. Ces variables sont très bien projétées , on peut donc les interpréter convenablement. Il est évident que la variable pH est extrêmement corrélée à cette dimension 2. Tout ceci voudrait dire alors que plus le pH d'une précipitation augmente ( donc une précipitation basique ) moins il y a des NO3 et SO4 dans la précipitation. En revanche, plus les valeurs en NO3 et SO4 sont importantes ,le pH diminue de plus en plus , donc la précipitation est très acide.
On peut donc conclure ici que les variables SO4 et NO3 sont les causes de la variation de l'acidité de la précipitation.
df_ph[['Ca','Mg', 'K', 'Na', 'NH4', 'NO3', 'Cl', 'SO4']].plot(figsize=(15,6))
plt.xlabel("Année")
plt.xticks(range(1978,2020),rotation=90)
plt.show()
Les pluies acides sont une forme de pollution atmosphérique participant à la dégradation des forêts et des lacs. En effet, comme montre cette figure, les deux causes principales sont les oxydes d'azote ($NO_x$) rejetés par les transports aériens et les transports routiers et les oxydes de souffre ($SO_x$) emis par certaines industries.
Sous l'action de la lumière solaire, ces oxydes de souffre et d'azote réagissent avec l'humidité atmosphérique. Ils forment de l'acide sulfurique($H_2 SO_4$) et de l'acide nitrique ($HNO_3$). Ils sont ensuite transportés sur des longues distances dans l'atmosphère. En tombant sur les forêts, les pluies acides brûlent les feuilles et les racines. Les arbres dépérissent , parfois jusqu'à la mort. Par l'écoulement des eaux, les pluies acides polluent également les lacs. Elles font disparaître le phytoplancton entrainant l'appauvrissement du milieu. Ces phytoplanctons sont des micro-organismes végétaux qui absorbent des milliards de tonnes du $CO_2$ présents dans l'atmosphère et produisent plus de la moitié de l'oxygène terrestre.
Dans l’atmosphère, les oxydes d’azote (NOx) se transforment en acide nitrique (HNO3),qui participe à l’acidification des précipitations et à l’apport de nitrates. Les NOx proviennent majoritairement des transports routiers et dans une moindre mesure des secteurs de l’agriculture/sylviculture et de l’industrie.
On sait également que l’ammoniac (NH3) est à l’origine de la présence d’ammonium dans les précipitations. Il est émis dans l’air majoritairement par le secteur de l’agriculture, principalement l’élevage. Il réagit dans l’atmosphère pour former des sels d’ammonium. Les dépôts d’ammonium ne sont pas acides en tant que tels mais peuvent avoir un effet acidifiant au contact du sol en libérant des ions H+ par transformation en nitrites (NO2-) ou nitrates(NO3-). De ce fait, ils ont également un effet eutrophisant sur les écosystèmes.
Pour confirmer ce resultat, nous allons faire un test sur la nullité de coefficient de corrélation entre le pH et les variables NO3 et SO4. Nous allons donc exmainer deux méthodes de corrélation qui sont la méthode de Pearson et la méthode de Spearman. On obtient ainsi les resultats suivants:
Image("figure/NO3_corr.png",width=500,height=300)
Selon les deux méthodes de corrélation calculées, la corrélation est bien significativement différente de 0 pour un test au seuil 5% . On voit alors une forte corrélation négative entre pH et NO3. Ce qui valide notre affirmation précédemment.
Image("figure/SO4_corr.png",width=500,height=300)
De même pour SO4,les deux méthodes de corrélation calculées montrent chacune que la corrélation est bien significativement différente de 0 pour un test au seuil 5% . On voit également une forte corrélation négative entre pH et SO4. Ce qui valide notre affirmation précédemment.
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df_ph = pd.read_csv("data/NTN-All-cy.csv",sep=";")
df_ph = df_ph.groupby("yr")[['Ca','Mg', 'K', 'Na', 'NH4', 'NO3', 'Cl', 'SO4', 'ppt','pH']].mean()
Dans cette partie, l'objectif est de faire une prédiction de l'acidité de la précipitation selon ses compositions chimiques.
plt.figure(figsize=(15,5))
df_ph.drop(['ppt'],axis=1).corr()["pH"].sort_values(ascending=True).plot.barh(colormap="turbo_r")
plt.legend()
plt.xlabel('valeur')
plt.title("La corrélation de chaque variable avec la variable pH")
plt.show()
Ce resultat nous montre certainement que la variable "ppt" n'est pas corrélée avec la variable "pH". En effet la quantité totale de précipitations mesurée par le pluviomètre pendant la période de synthèse n'est pas prise en compte dans le calcul de l'acidité d'une quelconque solution. Il est alors préférable de la supprimer pour que le modèle utilisé puisse apprendre plus facilement sur le reste de nos données qui semblent être pertinentes.
target = df_ph['pH'].values
data_ph = df_ph.drop(['ppt','pH'],axis=1)
data_ph.head()
Ca | Mg | K | Na | NH4 | NO3 | Cl | SO4 | |
---|---|---|---|---|---|---|---|---|
yr | ||||||||
1978 | 0.171714 | 0.056476 | 0.041524 | 0.445286 | 0.224571 | 1.191286 | 0.456286 | 2.130143 |
1979 | 0.212263 | 0.045237 | 0.037711 | 0.405474 | 0.257053 | 1.283289 | 0.324553 | 2.312816 |
1980 | 0.257988 | 0.062000 | 0.055358 | 0.413753 | 0.299160 | 1.372395 | 0.590247 | 2.131568 |
1981 | 0.152770 | -0.017410 | -0.048300 | 0.151630 | 0.173390 | 1.025720 | 0.291960 | 1.920480 |
1982 | 0.209575 | 0.053920 | 0.039991 | 0.210575 | 0.233389 | 1.019973 | 0.368009 | 1.656947 |
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split,KFold,cross_val_score
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LinearRegression
from sklearn.svm import SVR
X_train, X_test, y_train, y_test = train_test_split(data_ph,target,test_size=0.2,random_state=0)
model1 = SVR(C=100)
cv =KFold(5)
cross_val_score(model1, X_train,y_train,cv=cv)
array([0.90670375, 0.78967753, 0.89871238, 0.31067534, 0.89329718])
$\Longrightarrow$ Le modèle de SVR semble donner le meilleur resultat parmi ces trois modèles testés. On pourrait alors essayer de calibrer ses hyperparamètres pour apprendre un peu plus sur son efficacité sur nos données.
from sklearn.model_selection import GridSearchCV
param = {"C":[20,30,40,50],"degree":[3,4,5]}
model_svr = SVR()
grid = GridSearchCV(model_svr,param_grid=param,cv=5)
grid.fit(X_train,y_train)
grid.best_score_
model_svr = grid.best_estimator_
model_svr
Dans cette partie, nous allons faire une analyse d'une série chronologique concernant la température mondiale. L'objectif est de pouvoir déterminer les valeurs futures de la température moyenne mondiale dependamment des valeurs dont nous disposons depuis l'année 1743. Pour cela, il va falloir comprendre le type de la série que nos données représente.
Pour faire cela, nous devons étudier la stationnarité de la série,les tendances, la saisonalité de la série et ensuite proposer un modèle capable de prédire au mieux les valeurs futures en se basant sur nos données de validation.
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# Ignorer les warnings
import warnings
warnings.filterwarnings("ignore")
df_00 = pd.read_csv("GlobalLandTemperatures_GlobalLandTemperaturesByCountry.csv")
df_00 = df_00.dropna()
#changer les types de dennées
df_00["dt"] = pd.to_datetime(df_00["dt"])
df_00["Country"] = df_00["Country"].astype("string")
#resupération de l'année
df_00["year"] = df_00["dt"].dt.year
df_00 = (df_00.groupby(["year"])[['AverageTemperature']].mean()).rename(columns={'AverageTemperature':"Temperature moyenne"})
df_00.plot(figsize=(13,5),grid=True)
plt.xlabel("Année")
plt.ylabel("valeur en °C")
plt.title("Evolution de la température moyenne mondiale")
plt.show()
df_00.to_csv("data/ts_R.csv")
from statsmodels.tsa.stattools import adfuller,kpss
def kpss_test(timeseries):
print ('Results of KPSS Test:')
kpsstest = kpss(timeseries, regression='c', nlags="auto")
kpss_output = pd.Series(kpsstest[0:3], index=['Test Statistic','p-value','Lags Used'])
for key,value in kpsstest[3].items():
kpss_output['Critical Value (%s)'%key] = value
print (kpss_output)
kpss_test(df_00)
Results of KPSS Test: Test Statistic 2.291169 p-value 0.010000 Lags Used 10.000000 Critical Value (10%) 0.347000 Critical Value (5%) 0.463000 Critical Value (2.5%) 0.574000 Critical Value (1%) 0.739000 dtype: float64
/Users/christianotheddynasa/opt/anaconda3/lib/python3.8/site-packages/statsmodels/tsa/stattools.py:1881: InterpolationWarning: The test statistic is outside of the range of p-values available in the look-up table. The actual p-value is smaller than the p-value returned. warnings.warn(
Ce resultat nous montre que la série chronologique n'est pas stationnaire. Il faut d'abord commencer par stationnariser cette série pour pouvoir mener des études statistiques avec celles-ci.
Pour la rendre stationnaire, nous allons procéder à une différentiation d'ordre 1
df_PH_diff = df_00.diff().dropna(axis=0)
kpss_test(df_PH_diff)
Results of KPSS Test: Test Statistic 0.162877 p-value 0.100000 Lags Used 8.000000 Critical Value (10%) 0.347000 Critical Value (5%) 0.463000 Critical Value (2.5%) 0.574000 Critical Value (1%) 0.739000 dtype: float64
/Users/christianotheddynasa/opt/anaconda3/lib/python3.8/site-packages/statsmodels/tsa/stattools.py:1885: InterpolationWarning: The test statistic is outside of the range of p-values available in the look-up table. The actual p-value is greater than the p-value returned. warnings.warn(
$\longrightarrow $Ce resultat de test nous montre que la série est bien stationnaire car la p-valeur est de 0.1 donc on ne rejette pas l'hypothèse nulle pour une valeur critique de 5%
df_PH_diff.plot(figsize=(12,5),legend=True,grid=True)
plt.title("La série stationnaire après une différenciation")
plt.show()
H0 : La série possede une série unitaire - NON stationnaire
H1 : La série est stationnaire
def adf_test(timeseries):
print ('Results of Dickey-Fuller Test:')
dftest = adfuller(timeseries, autolag='AIC')
dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
for key,value in dftest[4].items():
dfoutput['Critical Value (%s)'%key] = value
print (dfoutput)
adf_test(df_PH_diff)
Results of Dickey-Fuller Test: Test Statistic -7.766162e+00 p-value 9.176211e-12 #Lags Used 5.000000e+00 Number of Observations Used 2.600000e+02 Critical Value (1%) -3.455754e+00 Critical Value (5%) -2.872721e+00 Critical Value (10%) -2.572728e+00 dtype: float64
La série est cette fois-ci bien stationnaire donc on va pouvoir faire des études statistiques correctement en regardant l'ecart-type, la moyenne .
from statsmodels.graphics.tsaplots import plot_acf,plot_pacf
ax1 = plot_acf(df_PH_diff)
ax2 = plot_pacf(df_PH_diff)
Remarque: L'implémentation du code pour la suite est traité en language R dans l'environnement RStudio
En tenant compte des resultats sur les deux figures d'autocorrélation et autocorrélation partielle, on peut dire que le modèle approprié est un ARIMA(4,1,2). On entrainant ce modèle pour la prévision de la température, on obtient alors la figure suivante :
Image("figure/prevision.png")
Nous avons vu durant cette étude que la pollution de l'air est un des problèmes majeurs que nous faisons face actuellement. Malheureusement la principale source de cette pollution vient de nos activités comme la combustion des fossils, les transports aériens et routiers qui produisent énormément de CO2 et d'autres polluants nocifs pour notre santé, l'élévage bovin qui poduit énormément du méthane (CH4) qui est un gaz à effet de serre contribuant de manière importante au rechauffement climatique.