Documentos de Académico
Documentos de Profesional
Documentos de Cultura
In [1]: # Importamos las librerías de Pandas Data Frame para realizar análisis de datos
import pandas as pd
# Cargar los datos en una estructura de pandas
datos = pd.read_csv('datos1/contaminazmvt.csv', sep = '|')
# Se crea el dataframe de pandas
df = pd.DataFrame(datos)
#Visualizar datos del dataframe - Entre parentesis se coloca el número de datos
df.head(6)
#Geopandas es una libreria que incorpora datos espaciales
#GDAL - Libreria de python para datos raster
#RASTERING - Libreria de python para datos raster
Out[1]:
FECHA PM10 PM25 O3 NO2 CO SO2 MAXIMO CONTAMINANTE ESTACION ZONA
localhost:8888/notebooks/Documents/ECATSIGCD/contaminazmvt.ipynb 1/20
8/6/22, 10:42 contaminazmvt - Jupyter Notebook
ZONA
0 ZMVT
1 ZMVT
2 ZMVT
3 ZMVT
4 ZMVT
... ...
4013 NORTE
4014 SUR
4015 NORTE
4016 NORTE
4017 NORTE
Out[4]: 0 False
1 False
2 False
3 False
4 False
...
4013 False
4014 False
4015 False
4016 False
4017 False
localhost:8888/notebooks/Documents/ECATSIGCD/contaminazmvt.ipynb 2/20
8/6/22, 10:42 contaminazmvt - Jupyter Notebook
Out[5]: FECHA 0
PM10 0
PM25 1673
O3 0
NO2 0
CO 0
SO2 0
MAXIMO 0
CONTAMINANTE 0
ESTACION 1
ZONA 0
dtype: int64
O3: OZONO
localhost:8888/notebooks/Documents/ECATSIGCD/contaminazmvt.ipynb 3/20
8/6/22, 10:42 contaminazmvt - Jupyter Notebook
In [6]: # Debido a que la fecha no está en un formato adecuado, vamos a convertirla a tip
# corce forza la conversion
df['FECHA'] = pd.to_datetime(df['FECHA'], errors = 'coerce')
df.info()
<class 'pandas.core.frame.DataFrame'>
In [7]: df.head()
Out[7]:
FECHA PM10 PM25 O3 NO2 CO SO2 MAXIMO CONTAMINANTE ESTACION ZONA
ESTADISTICA DESCRIPTIVA
localhost:8888/notebooks/Documents/ECATSIGCD/contaminazmvt.ipynb 4/20
8/6/22, 10:42 contaminazmvt - Jupyter Notebook
In [8]: #describe toma los valores numéricos y me genera las metricas basicas de la estad
#Matriz traspuesta
df.describe().T
Out[8]:
count mean std min 25% 50% 75% max
Out[9]:
FECHA PM10 PM25 O3 NO2 CO SO2 MAXIMO CONTAMINANTE ESTACION ZONA
In [10]: #Datos de los años 2020 y 2021 pero solamente algunas columnas
filtro2 = df[df['FECHA'] >= '01/01/2020'][['FECHA', 'PM25', 'PM10', 'O3', 'NO2',
filtro2.head()
Out[10]:
FECHA PM25 PM10 O3 NO2 CO SO2
localhost:8888/notebooks/Documents/ECATSIGCD/contaminazmvt.ipynb 5/20
8/6/22, 10:42 contaminazmvt - Jupyter Notebook
Out[11]:
FECHA PM10 PM25 O3 NO2 CO SO2 MAXIMO CONTAMINANTE ESTACION ZONA AÑO
2021-
0 160 221.0 43 25 26 5 221 PM2.5 SC ZMVT 2021
01-01
2021-
1 143 203.0 47 23 11 5 203 PM2.5 SC ZMVT 2021
02-01
2021-
2 116 111.0 42 22 14 5 116 PM10 SC ZMVT 2021
03-01
2021-
3 111 104.0 76 28 12 5 111 PM10 SC ZMVT 2021
04-01
2021-
4 115 99.0 67 29 16 5 115 PM10 AJ ZMVT 2021
05-01
Out[12]:
PM25
AÑO
2017 104.558904
2016 103.513661
2018 97.202740
2019 96.997260
2020 95.527322
2015 95.032680
2021 94.410959
2011 NaN
2012 NaN
2013 NaN
2014 NaN
Insight: Los años 2016, 2017, 2018 y 2019 han sido los más
contaminados por particular PMT 2.5
localhost:8888/notebooks/Documents/ECATSIGCD/contaminazmvt.ipynb 6/20
8/6/22, 10:42 contaminazmvt - Jupyter Notebook
Out[13]:
PM10
AÑO
2017 97.767123
2018 97.564384
2021 97.326027
2019 97.016438
2016 93.568306
2011 93.545205
2020 93.038251
2015 90.383562
2014 75.671233
2013 72.082192
2012 71.994536
Out[14]:
FECHA PM10 PM25 O3 NO2 CO SO2 MAXIMO CONTAMINANTE ESTACION ZONA AÑO
2021-
0 160 221.0 43 25 26 5 221 PM2.5 SC ZMVT 2021
01-01
2021-
1 143 203.0 47 23 11 5 203 PM2.5 SC ZMVT 2021
02-01
2021-
2 116 111.0 42 22 14 5 116 PM10 SC ZMVT 2021
03-01
2021-
3 111 104.0 76 28 12 5 111 PM10 SC ZMVT 2021
04-01
2021-
4 115 99.0 67 29 16 5 115 PM10 AJ ZMVT 2021
05-01
localhost:8888/notebooks/Documents/ECATSIGCD/contaminazmvt.ipynb 7/20
8/6/22, 10:42 contaminazmvt - Jupyter Notebook
Out[15]:
PM25
MES
12 115.923810
1 110.172775
2 107.428571
4 104.972973
5 101.083770
11 100.344828
3 99.240838
7 90.476440
10 88.966667
8 88.785714
9 88.162562
6 87.302703
Out[16]:
FECHA PM10 PM25 O3 NO2 CO SO2 MAXIMO CONTAMINANTE ESTACION ZONA AÑO
2021-
0 160 221.0 43 25 26 5 221 PM2.5 SC ZMVT 2021
01-01
2021-
1 143 203.0 47 23 11 5 203 PM2.5 SC ZMVT 2021
02-01
2021-
2 116 111.0 42 22 14 5 116 PM10 SC ZMVT 2021
03-01
2021-
3 111 104.0 76 28 12 5 111 PM10 SC ZMVT 2021
04-01
2021-
4 115 99.0 67 29 16 5 115 PM10 AJ ZMVT 2021
05-01
localhost:8888/notebooks/Documents/ECATSIGCD/contaminazmvt.ipynb 8/20
8/6/22, 10:42 contaminazmvt - Jupyter Notebook
Out[17]:
PM25
DIA
1 129.166667
12 111.464286
2 110.375000
5 110.041667
25 106.766234
3 105.000000
26 103.519481
4 102.861111
24 102.038961
16 99.584416
31 98.755556
28 98.571429
Out[18]: <AxesSubplot:>
localhost:8888/notebooks/Documents/ECATSIGCD/contaminazmvt.ipynb 9/20
8/6/22, 10:42 contaminazmvt - Jupyter Notebook
In [19]: #### Podemos generar clases de los valores de PM2.5 mediante el método cut
pd.cut(df['PM25'], bins = 5).value_counts()
(143.2, 187.8] 35
(187.8, 232.4] 12
(232.4, 277.0] 6
Out[20]: FECHA 0
PM10 0
PM25 1673
O3 0
NO2 0
CO 0
SO2 0
MAXIMO 0
CONTAMINANTE 0
ESTACION 1
ZONA 0
AÑO 0
MES 0
DIA 0
dtype: int64
In [21]: df.count()
PM10 4018
PM25 2345
O3 4018
NO2 4018
CO 4018
SO2 4018
MAXIMO 4018
CONTAMINANTE 4018
ESTACION 4017
ZONA 4018
AÑO 4018
MES 4018
DIA 4018
dtype: int64
In [22]: (1673/2345)*100
## Falta el 29% de valores de PM 2.5
Out[22]: 71.34328358208955
Sckit Learn es una libreria de Machine Learning que nos permite utilizar una serie de
algoritmos de aprendizaje automatico
In [23]: # Nos quedamos con las columnas que son solo de tipo numérico
df = df.drop(columns=['CONTAMINANTE', 'ESTACION', 'ZONA'])
df.head(5)
Out[23]:
FECHA PM10 PM25 O3 NO2 CO SO2 MAXIMO AÑO MES DIA
In [24]: # Nos quedamos con las columnas que son solo de tipo numérico
df = df.drop(columns=['FECHA'])
df.head(5)
Out[24]:
PM10 PM25 O3 NO2 CO SO2 MAXIMO AÑO MES DIA
localhost:8888/notebooks/Documents/ECATSIGCD/contaminazmvt.ipynb 11/20
8/6/22, 10:42 contaminazmvt - Jupyter Notebook
Out[26]: PM10 0
PM25 0
O3 0
NO2 0
CO 0
SO2 0
MAXIMO 0
AÑO 0
MES 0
DIA 0
dtype: int64
In [29]: datos.head()
Out[29]:
PM10 PM25 O3 NO2 CO SO2 MAXIMO AÑO MES DIA
0 160.0 221.0 43.0 25.0 26.0 5.0 221.0 2021.0 1.0 1.0
1 143.0 203.0 47.0 23.0 11.0 5.0 203.0 2021.0 2.0 1.0
2 116.0 111.0 42.0 22.0 14.0 5.0 116.0 2021.0 3.0 1.0
3 111.0 104.0 76.0 28.0 12.0 5.0 111.0 2021.0 4.0 1.0
4 115.0 99.0 67.0 29.0 16.0 5.0 115.0 2021.0 5.0 1.0
localhost:8888/notebooks/Documents/ECATSIGCD/contaminazmvt.ipynb 12/20
8/6/22, 10:42 contaminazmvt - Jupyter Notebook
In [30]: datos['PM25'].hist()
Out[30]: <AxesSubplot:>
Out[31]:
PM10 PM25 O3 NO2 CO SO2 MAXIMO
In [32]: #Mediana
datos['PM25'].median()
Out[32]: 93.9
localhost:8888/notebooks/Documents/ECATSIGCD/contaminazmvt.ipynb 13/20
8/6/22, 10:42 contaminazmvt - Jupyter Notebook
PM25 es una variable continua y sus valores van desde 54 hasta 277 partes por millon
(ppm)
MALA 1549
MUY MALA 31
EXTREMADAMENTE MALA 18
BUENA 0
Out[34]:
PM10 PM25 O3 NO2 CO SO2 MAXIMO AÑO MES DIA CALIDAD
0 160.0 221.0 43.0 25.0 26.0 5.0 221.0 2021.0 1.0 1.0 EXTREMADAMENTE MALA
1 143.0 203.0 47.0 23.0 11.0 5.0 203.0 2021.0 2.0 1.0 EXTREMADAMENTE MALA
2 116.0 111.0 42.0 22.0 14.0 5.0 116.0 2021.0 3.0 1.0 MALA
3 111.0 104.0 76.0 28.0 12.0 5.0 111.0 2021.0 4.0 1.0 MALA
4 115.0 99.0 67.0 29.0 16.0 5.0 115.0 2021.0 5.0 1.0 REGULAR
MALA 1549
MUY MALA 31
EXTREMADAMENTE MALA 18
BUENA 0
MALA 0.385515
BUENA 0.000000
localhost:8888/notebooks/Documents/ECATSIGCD/contaminazmvt.ipynb 14/20
8/6/22, 10:42 contaminazmvt - Jupyter Notebook
In [37]: datos['CALIDAD'].hist()
Out[37]: <AxesSubplot:>
In [38]: # Vamos a generar una columna que nos indique si la calidad del aire es Regular (
# o la calidad del aire es Mala (1)
datos['CALIDAD_NUMERICA'] = pd.cut(datos['PM25'], bins = [0, 100, 350], labels =
datos.head()
Out[38]:
PM10 PM25 O3 NO2 CO SO2 MAXIMO AÑO MES DIA CALIDAD CALIDAD
EXTREMADAMENTE
0 160.0 221.0 43.0 25.0 26.0 5.0 221.0 2021.0 1.0 1.0
MALA
EXTREMADAMENTE
1 143.0 203.0 47.0 23.0 11.0 5.0 203.0 2021.0 2.0 1.0
MALA
2 116.0 111.0 42.0 22.0 14.0 5.0 116.0 2021.0 3.0 1.0 MALA
3 111.0 104.0 76.0 28.0 12.0 5.0 111.0 2021.0 4.0 1.0 MALA
4 115.0 99.0 67.0 29.0 16.0 5.0 115.0 2021.0 5.0 1.0 REGULAR
localhost:8888/notebooks/Documents/ECATSIGCD/contaminazmvt.ipynb 15/20
8/6/22, 10:42 contaminazmvt - Jupyter Notebook
Out[40]:
PM10 PM25 O3 NO2 CO SO2 MAXIMO AÑO
-3.852494e-
O3 0.299078 0.331419 1.000000 0.284944 0.100701 0.098451 0.339216
03
-4.103547e-
NO2 0.338456 0.385270 0.284944 1.000000 0.606256 0.430323 0.292774
01
-5.064623e-
CO 0.301887 0.361460 0.100701 0.606256 1.000000 0.364660 0.252290
01
-5.007257e-
SO2 0.082287 0.151119 0.098451 0.430323 0.364660 1.000000 0.066001
01
-2.366958e-
MES -0.156352 -0.140472 -0.123525 -0.089038 -0.061362 -0.022786 -0.147185
14
-4.414686e-
DIA -0.046107 -0.037764 -0.033124 -0.009355 -0.027731 -0.020427 -0.037031
15
localhost:8888/notebooks/Documents/ECATSIGCD/contaminazmvt.ipynb 16/20
8/6/22, 10:42 contaminazmvt - Jupyter Notebook
Out[41]: <AxesSubplot:>
Recordar que nuestra variable objetivo es el PM25 (target), es decir, la consideramos como
nuestra variable dependiente. Para nuestro objetivo se trata de predecir la calidad del aire
de las partículas PM2.5. Todas las demás variables serán las variables
independientes.
El valor de la columna MAXIMO tiene un porcentaje de correlación muy alto con otra
variable independiente (PM10), esto es un riesgo para el modelo, es decir, porcentajes de
correlación muy altos entre variables independientes se tendrán que analizar porque
alguna de estas variables está de más, y podrían sobreajustar el modelo, es decir,
explicarlo de manera muy optimista o pesimista.
Out[42]:
PM10 PM25 O3 NO2 CO SO2
localhost:8888/notebooks/Documents/ECATSIGCD/contaminazmvt.ipynb 17/20
8/6/22, 10:42 contaminazmvt - Jupyter Notebook
Objetivo: Predecir mediante Regresion Lineal el comportamiento de las particulas PM2.5 (target)
con base en los valores de las demas variavles independientes.
In [44]: #X
#y
Metodo de la exlusión
In [46]: #X_train
#X_test
#y_train
#y_test
Out[47]: (2812, 5)
Out[48]: (1206, 5)
Out[49]: LinearRegression()
localhost:8888/notebooks/Documents/ECATSIGCD/contaminazmvt.ipynb 18/20
8/6/22, 10:42 contaminazmvt - Jupyter Notebook
Intercepto: 28.14095857998423
Out[52]: 0.764598758120575
Out[53]: 94.4702339472375
In [55]: # Calcular el valor de R2, MAE, MSE, RMSE en los datos de prueba
print('Valor de R2', r2_score(y_test, y_pred))
print('\n')
print('MAE: ', metrics.mean_absolute_error(y_test, y_pred))
print('\n')
print('MSE: ', metrics.mean_squared_error(y_test, y_pred))
print('\n')
print('RMSE: ', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
Valor de R2 0.764598758120575
MAE: 7.3663553371845705
MSE: 114.36631544290967
RMSE: 10.694218786003477
localhost:8888/notebooks/Documents/ECATSIGCD/contaminazmvt.ipynb 19/20
8/6/22, 10:42 contaminazmvt - Jupyter Notebook
localhost:8888/notebooks/Documents/ECATSIGCD/contaminazmvt.ipynb 20/20