Quantcast
Channel: Planeta Linux Venezuela
Viewing all articles
Browse latest Browse all 1457

Ernesto Crespo: Analizando datos del cambio climático y niveles de CO2 en la atmosfera con Python y pandas.

$
0
0
Continuando con los artículos sobre ciencia de datos, esta vez se analizará datos sobre información del clima global y por países, así como los niveles de CO2.

Estos datos y proyecto los encontré en el sitio kaggle, este sitio es para publicar proyectos de ciencia de datos. Los datos para este artículo lo encuentran en el siguiente enlace

El código de este artículo se basa en el artículo que se encuentra en kaggle sobre el tema en inglés Climate Change and CO2 levels in atmosphere.

En este artículo se explora los cambios globales de la temperatura media y el incremento de la concentración del CO2 en la atmosfera.

Los datos se obtienen de los siguientes archivos:

  • GlobalLandTemperaturesByCountry.csv: Contiene la información de la temperatura por país.
  • GlobalTemperatures.csv: Contiene la información global de la temperatura.
  • archive.csv: Contiene la información de los niveles de CO2 en la atmosfera.


A continuación se muestra el notebook:

Se importa las librerías de pantas, matplotlib y seaborn.

In [1]:
importpandasaspd
importmatplotlib.pyplotasplt
importseabornassns

Se crea los dataframes a partir de los archivos csv.

In [2]:
# Se crea el dataframe data_pais, data_vzla, data_global y co2_ppm

data_pais=pd.read_csv("./datos/GlobalLandTemperaturesByCountry.csv")
#Se crea una copia del dataframe obteniendo solo la información de Venezuela.
data_vzla=data_pais[data_pais["Country"]=="Venezuela"].copy()
data_vzla["dt"]=pd.to_datetime(data_vzla["dt"])

#Se crea una copia del dataframe obteniendo solo la información de Argentina.
data_arg=data_pais[data_pais["Country"]=="Argentina"].copy()
data_arg["dt"]=pd.to_datetime(data_arg["dt"])

#Se crea una copia del dataframe obteniendo solo la información de USA.
data_canada=data_pais[data_pais["Country"]=="Canada"].copy()
data_canada["dt"]=pd.to_datetime(data_canada["dt"])

#Se crea una copia del dataframe obteniendo solo la información de Mexico.
data_mexico=data_pais[data_pais["Country"]=="Mexico"].copy()
data_mexico["dt"]=pd.to_datetime(data_mexico["dt"])

#Se crea una copia del dataframe obteniendo solo la información de Brasil.
data_brasil=data_pais[data_pais["Country"]=="Brazil"].copy()
data_brasil["dt"]=pd.to_datetime(data_brasil["dt"])

#Se crea una copia del dataframe obteniendo solo la información de Venezuela.
data_chile=data_pais[data_pais["Country"]=="Chile"].copy()
data_chile["dt"]=pd.to_datetime(data_chile["dt"])

#Se crea el dataframe de la temperatura global.
data_global=pd.read_csv("./datos/GlobalTemperatures.csv")
#Se modifica la fecha y hora como datetime.
data_global["dt"]=pd.to_datetime(data_global["dt"])
#Se crea el dataframe del co2.
co2_ppm=pd.read_csv("./datos/archive.csv")

Los dataframes creados.

In [3]:
data_pais.head()
Out[3]:

dtAverageTemperatureAverageTemperatureUncertaintyCountry
01743-11-014.3842.294Åland
11743-12-01NaNNaNÅland
21744-01-01NaNNaNÅland
31744-02-01NaNNaNÅland
41744-03-01NaNNaNÅland
Como se puede observar, se tiene la fecha, la temperatura promedio, la temperatura promedio de incertidumbre y país.
In [4]:
data_pais.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 577462 entries, 0 to 577461
Data columns (total 4 columns):
dt 577462 non-null object
AverageTemperature 544811 non-null float64
AverageTemperatureUncertainty 545550 non-null float64
Country 577462 non-null object
dtypes: float64(2), object(2)
memory usage: 17.6+ MB
Los tipos de datos de las columnas son dt objeto, temperatura promedio y temperatura promedio de incertidumbre son float64 y country como objeto

Venezuela

In [5]:
data_vzla.head()
Out[5]:

dtAverageTemperatureAverageTemperatureUncertaintyCountry
5623391824-01-0124.6130.824Venezuela
5623401824-02-0124.6702.017Venezuela
5623411824-03-0125.5271.065Venezuela
5623421824-04-0125.7321.771Venezuela
5623431824-05-0124.9991.157Venezuela
Se tiene la misma información anterior pero sólo de Venezuela.
In [6]:
data_vzla.describe().T
Out[6]:

countmeanstdmin25%50%75%max
AverageTemperature2086.025.0256860.70318922.77724.5232524.982525.4952527.807
AverageTemperatureUncertainty2086.00.5860000.3984600.0840.310000.45400.760004.120
Se tiene 2086 datos, los cuales la temperatura promedio es 25.025 grados, y la incertidumbre es de 0.586, la desviación de la temperatura promedio es de 0.703, y de la incertidumbre es de 0.398, la mínima temperatura fue de 22.77, la máxima de 27.807.
In [7]:
data_vzla.corr()
Out[7]:

AverageTemperatureAverageTemperatureUncertainty
AverageTemperature1.000000-0.319882
AverageTemperatureUncertainty-0.3198821.000000
Las dos variables tienen una correlación contraria en cierta manera.

Argentina

In [8]:
data_arg.head()
Out[8]:

dtAverageTemperatureAverageTemperatureUncertaintyCountry
254661855-05-0110.7451.499Argentina
254671855-06-016.9952.073Argentina
254681855-07-016.9011.568Argentina
254691855-08-019.0971.412Argentina
254701855-09-0111.3161.384Argentina
In [9]:
data_arg.describe().T
Out[9]:

countmeanstdmin25%50%75%max
AverageTemperature1900.014.6211944.8468854.79610.1322514.630519.2787523.290
AverageTemperatureUncertainty1900.00.5273380.4656520.0830.209000.30350.745252.974

Brasil

In [10]:
data_brasil.head()
Out[10]:

dtAverageTemperatureAverageTemperatureUncertaintyCountry
771101832-01-0124.9351.372Brazil
771111832-02-0124.5051.953Brazil
771121832-03-0124.6171.359Brazil
771131832-04-0123.9902.013Brazil
771141832-05-0123.1241.592Brazil
In [11]:
data_brasil.describe().T
Out[11]:

countmeanstdmin25%50%75%max
AverageTemperature2164.024.6992560.97878721.79724.0225024.829525.4497527.151
AverageTemperatureUncertainty2164.00.5729400.4117940.0600.243750.41600.840003.353

Chile

In [12]:
data_chile.head()
Out[12]:

dtAverageTemperatureAverageTemperatureUncertaintyCountry
1082481855-05-017.1521.296Chile
1082491855-06-014.2571.641Chile
1082501855-07-014.1131.313Chile
1082511855-08-015.5081.168Chile
1082521855-09-016.6841.153Chile
In [13]:
data_chile.describe().T
Out[13]:

countmeanstdmin25%50%75%max
AverageTemperature1900.09.3834743.1790813.2066.5029.381512.3777515.493
AverageTemperatureUncertainty1900.00.5726540.4180110.1140.2810.38250.803002.408

Mexico

In [14]:
data_mexico.head()
Out[14]:

dtAverageTemperatureAverageTemperatureUncertaintyCountry
3384381835-01-0115.8101.484Mexico
3384391835-02-0114.9111.579Mexico
3384401835-03-0116.8261.858Mexico
3384411835-04-0119.9251.966Mexico
3384421835-05-0122.0371.609Mexico
In [15]:
data_mexico.describe().T
Out[15]:

countmeanstdmin25%50%75%max
AverageTemperature2145.020.5675583.75334312.06417.10921.05024.16426.926
AverageTemperatureUncertainty2145.00.6382330.5476050.0910.2260.3980.9703.699

Canadá

In [16]:
data_canada.head()
Out[16]:

dtAverageTemperatureAverageTemperatureUncertaintyCountry
972551768-09-015.2573.107Canada
972561768-10-01-3.3932.981Canada
972571768-11-01-12.8293.967Canada
972581768-12-01-20.5824.622Canada
972591769-01-01-24.7564.722Canada
In [17]:
data_canada.describe().T
Out[17]:

countmeanstdmin25%50%75%max
AverageTemperature2504.0-5.21665912.878074-28.736-17.7025-4.72857.4127514.796
AverageTemperatureUncertainty2504.01.2562111.0461270.1230.28700.89802.120255.275
Se nota que las variaciones de la temperatura promedio de incertidumbre es mayor en Brasil, Venezuela, Mexico y Canadá en ese orden, con respecto a Chile y Argentina.

Incremento anual de la temperatura promedio global

In [18]:
annual_mean_global=data_global.groupby(data_global["dt"].dt.year).mean()
reference_temperature_global=annual_mean_global.loc[1951:1980].mean()["LandAndOceanAverageTemperature"]
annual_mean_global["Anomaly"]=annual_mean_global["LandAndOceanAverageTemperature"]-reference_temperature_global
In [19]:
plt.figure()
plt.style.use("fivethirtyeight")
annual_mean_global.loc[1960:2015]["Anomaly"].plot(figsize=(10,5),grid=True,legend=True)
plt.title("Anomalia anual de la temperatura promedio global")
plt.xlabel('')
plt.ylabel('Anomalia de la temperatura')
plt.show()



Se nota que anualmente el incremento de la temperatura tiene una tendencia ascendente que ha aumentado en los últimos años, este incremento en el año 2015 fue de 0.75 grados que es conscistente con el cambio climático.

Venezuela.

Se hace el mismo cálculo para el caso de Venezuela.
In [20]:
annual_mean_vzla=data_vzla.groupby(data_vzla["dt"].dt.year).mean()
reference_temperature_vzla=annual_mean_vzla.loc[1951:1980].mean()["AverageTemperature"]
annual_mean_vzla["Anomaly"]=annual_mean_vzla["AverageTemperature"]-reference_temperature_vzla
In [21]:
annual_mean_vzla.head()
Out[21]:

AverageTemperatureAverageTemperatureUncertaintyAnomaly
dt
182424.8965451.516091-0.420966
182525.0715831.552083-0.245928
182624.8719001.440800-0.445611
182725.1562731.474182-0.161238
182824.7518181.516727-0.565693
In [22]:
annual_mean_vzla.tail()
Out[22]:

AverageTemperatureAverageTemperatureUncertaintyAnomaly
dt
200926.0849170.3539170.767406
201026.1502500.3413330.832739
201125.6773330.3367500.359822
201225.6885830.4014170.371072
201325.9128750.4845000.595364
El último registro es del año 2013, el cual el incremento fue de 0.595 grados, hubo un pico en el año 2010 de 0.8332 grados.
In [23]:
plt.figure()
plt.style.use("fivethirtyeight")
annual_mean_vzla.loc[1960:2012]["Anomaly"].plot(figsize=(10,5),grid=True,legend=True)
plt.title("Variación promedio anual de la temperatura de Venezuela")
plt.xlabel('')
plt.ylabel('Incremento de la temperatura')
plt.show()




Argentina

In [24]:
annual_mean_arg=data_arg.groupby(data_arg["dt"].dt.year).mean()
reference_temperature_arg=annual_mean_arg.loc[1951:1980].mean()["AverageTemperature"]
annual_mean_arg["Anomaly"]=annual_mean_arg["AverageTemperature"]-reference_temperature_arg
In [25]:
annual_mean_arg.head()
Out[25]:

AverageTemperatureAverageTemperatureUncertaintyAnomaly
dt
185511.7292501.711875-3.090742
185613.9987501.553167-0.821242
185714.2210831.993417-0.598908
185814.0156671.770750-0.804325
185914.4145831.635583-0.405408
In [26]:
annual_mean_arg.tail()
Out[26]:

AverageTemperatureAverageTemperatureUncertaintyAnomaly
dt
200915.5344170.2157500.714425
201015.0788330.2189170.258842
201115.3396670.2198330.519675
201215.6890000.2657500.869008
201314.4571250.276500-0.362867
In [27]:
plt.figure()
plt.style.use("fivethirtyeight")
annual_mean_arg.loc[1960:2012]["Anomaly"].plot(figsize=(10,5),grid=True,legend=True)
plt.title("Variación promedio anual de la temperatura de Argentina")
plt.xlabel('')
plt.ylabel('Incremento de la temperatura')
plt.show()



Para el caso de Argentina la pendiente de la tendencia de incremento de la temperatura es menos pronunciada.

Brasil

In [28]:
annual_mean_brasil=data_brasil.groupby(data_brasil["dt"].dt.year).mean()
reference_temperature_brasil=annual_mean_brasil.loc[1951:1980].mean()["AverageTemperature"]
annual_mean_brasil["Anomaly"]=annual_mean_brasil["AverageTemperature"]-reference_temperature_brasil
In [29]:
annual_mean_brasil.head()
Out[29]:

AverageTemperatureAverageTemperatureUncertaintyAnomaly
dt
183223.8585831.734500-1.072247
183324.5178331.450083-0.412997
183424.3467501.498083-0.584081
183523.5375001.298583-1.393331
183623.9211671.426083-1.009664
In [30]:
annual_mean_brasil.tail()
Out[30]:

AverageTemperatureAverageTemperatureUncertaintyAnomaly
dt
200925.6005830.1856670.669753
201025.8124170.1580000.881586
201125.4289170.2048330.498086
201225.7170830.2310000.786253
201325.3481250.2622500.417294
In [31]:
plt.figure()
plt.style.use("fivethirtyeight")
annual_mean_brasil.loc[1960:2012]["Anomaly"].plot(figsize=(10,5),grid=True,legend=True)
plt.title("Variación promedio anual de la temperatura de Brasil")
plt.xlabel('')
plt.ylabel('Incremento de la temperatura')
plt.show()


En el caso de Brasil se nota un fuerte incremento en la decada de los 90s con un pico de más de 1 grado, luego la tendencia se ha estabilizado en 0.79 grados.

Chile

In [32]:
annual_mean_chile=data_chile.groupby(data_chile["dt"].dt.year).mean()
reference_temperature_chile=annual_mean_chile.loc[1951:1980].mean()["AverageTemperature"]
annual_mean_chile["Anomaly"]=annual_mean_chile["AverageTemperature"]-reference_temperature_chile
In [33]:
annual_mean_chile.head()
Out[33]:

AverageTemperatureAverageTemperatureUncertaintyAnomaly
dt
18557.0701251.424125-2.510742
18568.6640831.319250-0.916783
18578.6459171.439250-0.934950
18588.8102501.428333-0.770617
18599.2455831.376917-0.335283
In [34]:
annual_mean_chile.tail()
Out[34]:

AverageTemperatureAverageTemperatureUncertaintyAnomaly
dt
20099.9944170.2819170.413550
20109.7128330.3400000.131967
201110.0322500.3222500.451383
201210.2725830.3845830.691717
20139.8773750.3938750.296508
In [35]:
plt.figure()
plt.style.use("fivethirtyeight")
annual_mean_chile.loc[1960:2012]["Anomaly"].plot(figsize=(10,5),grid=True,legend=True)
plt.title("Variación promedio anual de la temperatura de Chile")
plt.xlabel('')
plt.ylabel('Incremento de la temperatura')
plt.show()




La variación no supera el 0.8 grados de temperatura, con un aumento fuerte entre los 70s y 80s y luego un pico en los 90s.

Mexico

In [36]:
annual_mean_mexico=data_mexico.groupby(data_mexico["dt"].dt.year).mean()
reference_temperature_mexico=annual_mean_mexico.loc[1951:1980].mean()["AverageTemperature"]
annual_mean_mexico["Anomaly"]=annual_mean_mexico["AverageTemperature"]-reference_temperature_mexico
In [37]:
annual_mean_mexico.head()
Out[37]:

AverageTemperatureAverageTemperatureUncertaintyAnomaly
dt
183518.9932501.684083-1.745911
183619.5871671.695333-1.151994
183719.6710831.647667-1.068078
183819.3370001.862417-1.402161
183919.7858331.603000-0.953328
In [38]:
annual_mean_mexico.tail()
Out[38]:

AverageTemperatureAverageTemperatureUncertaintyAnomaly
dt
200921.5460830.2059170.806922
201020.8529170.2177500.113756
201121.5993330.2453330.860172
201221.6524170.3245000.913256
201322.2192220.3651111.480061
In [39]:
plt.figure()
plt.style.use("fivethirtyeight")
annual_mean_mexico.loc[1960:2012]["Anomaly"].plot(figsize=(10,5),grid=True,legend=True)
plt.title("Variación promedio anual de la temperatura de Mexico")
plt.xlabel('')
plt.ylabel('Incremento de la temperatura')
plt.show()




Se nota la tendencia al alsa de la temperatura en Mexico pasando el año 2013 a estar por 1.48 grados por encima del promedio.

Canadá

In [40]:
annual_mean_canada=data_canada.groupby(data_canada["dt"].dt.year).mean()
reference_temperature_canada=annual_mean_canada.loc[1951:1980].mean()["AverageTemperature"]
annual_mean_canada["Anomaly"]=annual_mean_canada["AverageTemperature"]-reference_temperature_canada
In [41]:
annual_mean_canada.head()
Out[41]:

AverageTemperatureAverageTemperatureUncertaintyAnomaly
dt
1768-7.8867503.66925-2.969253
1769-3.4278753.505501.489622
1770NaNNaNNaN
1771NaNNaNNaN
1772NaNNaNNaN
In [42]:
annual_mean_canada.tail()
Out[42]:

AverageTemperatureAverageTemperatureUncertaintyAnomaly
dt
2009-4.1350830.2318330.782414
2010-1.8879170.2185833.029581
2011-3.5570830.2325831.360414
2012-3.1768330.3000831.740664
2013-1.6406670.5336673.276831
In [43]:
plt.figure()
plt.style.use("fivethirtyeight")
annual_mean_canada.loc[1960:2012]["Anomaly"].plot(figsize=(10,5),grid=True,legend=True)
plt.title("Variación promedio anual de la temperatura de Canadá")
plt.xlabel('')
plt.ylabel('Incremento de la temperatura')
plt.show()



Se nota la tendencia al alsa de la temperatura en Canadá y lo preocupante es que la variación pase los 3 grados de temperatura en el año 2013.

Niveles anuales de CO2 en la Atmosfera

In [44]:
plt.figure()
plt.style.use("fivethirtyeight")
annual_co2_ppm=co2_ppm.groupby(co2_ppm["Year"]).mean()
annual_co2_ppm.loc[1960:2015]["Carbon Dioxide (ppm)"].plot(figsize=(10,5),grid=True,legend=True)
plt.title("Nivel anual global de CO2 en la Atmosfera")
plt.ylabel("CO2 partes por millón")
plt.show()





Se nota el incremento anual con tendencia al alza.

Se cálcula la relación del CO2 con la temperatura.

In [45]:
annual_co2_temp=pd.merge(annual_mean_global.loc[1960:2015],annual_co2_ppm.loc[1960:2015],left_index=True,right_index=True)
annual_co2_temp=annual_co2_temp[["LandAndOceanAverageTemperature","Anomaly","Carbon Dioxide (ppm)"]].copy()
annual_co2_temp.corr()
Out[45]:

LandAndOceanAverageTemperatureAnomalyCarbon Dioxide (ppm)
LandAndOceanAverageTemperature1.0000001.0000000.923603
Anomaly1.0000001.0000000.923603
Carbon Dioxide (ppm)0.9236030.9236031.000000
In [46]:
sns.heatmap(annual_co2_temp.corr())
Out[46]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fcacea9cdd8>
In [47]:
plt.figure(figsize=(10,8))
sns.scatterplot(x="Anomaly",y="Carbon Dioxide (ppm)",data=annual_co2_temp)
Out[47]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fcace8d6c50>
" />
Con la gráfica de calor y la scatter, se nota la relación practicamente lineal del incremento de la temperatura y del Dioxido de Carbono. Ambas están relacionadas en el Cambio climático.
In [ ]:


En el sitio donde se almacenan los datos hay más archivos, temperatura por ciudad por ejemplo para ir más a detalle de la situación por ciudad. También pueden seguir buscando info de otros países, en el artículo original se hizo el de Grecia, y acá probé con Argentina, Brasil, Chile, Canadá, México y Venezuela.


Viewing all articles
Browse latest Browse all 1457

Latest Images

Trending Articles