APLICACIÓN DE UN MODELO DE REGRESIÓN LINEAL MÚLTIPLE (MRLM)
Por: Heber Hernández Guerra: heber@nubeminera.cl
En el presente notebook se presenta un caso en el cual se debió ajustar un MRLM para con el regresando NO$_x$, correspondiente a un grupo de gases de óxido de nitrógeno, especificamente de los regresores NO y NO$_2$. Los datos fueron extraidos desde 43 estaciones de monitoreo dispuestas en las tres provincias del País Vasco durante el año 2019.
Contaminantes:
1. Bibliotecas utilizadas:
import statsmodels.formula.api as sfm #Biblioteca para estimar modelos estadísticos y realizar pruebas estadísticas.
import pandas as pd #Biblioteca para manipulación de marcos de datos
from pandas.plotting import scatter_matrix #Herramienta de Pandas para diagramas de dispersión en matriz.
import matplotlib.pyplot as plt #Biblioteca para la salida gráfica.
import numpy as np # Biblioteca de funciones matemáticas.
df = pd.read_excel("C:/Users/heber/Desktop/CURSO_GRAFICOS_EN_PYTHON/Regresión Lineal Multiple/" + "datos.xlsx", sep=",") #Ruta del archivo datos.xlsx
df.head() #Despliegue de las 5 primeras filas del DataFrame
df_2 = df.iloc[:,[3,4,5,6]] # Dataframe solo con los 4 contaminantes, excluyendo coordenadas.
df_2.rename(columns={'PM10 (µg/m3)': "PM$_1$$_0$ (µg/m$^3$)", "NO2 (µg/m3)": "NO$_2$ (µg/m$^3$)", "NOX (µg/m3)":"NO$_x$ (µg/m$^3$)" }, inplace=True) #Edición de los titulos de columnas.
df_2.describe().transpose()
2. Ploteo Diagrama de dispersión en forma de matriz:
axes = scatter_matrix(df_2, alpha=1, figsize=(10,10), color="skyblue")
corr = df_2.corr().as_matrix()
for i, j in zip(*plt.np.triu_indices_from(axes, k=1)):
axes[i, j].annotate("%.2f" %corr[i,j], (0.8, 0.8), xycoords='axes fraction', ha='center', va='center')
plt.savefig("C:/Users/heber/Desktop/CURSO_GRAFICOS_EN_PYTHON/Regresión Lineal Multiple/matrix_scatter.png", dpi=300) #ruta imagen guardada
plt.show()
3. Variables de interés para el MLRM:
variables = ["NO (µg/m3)", "NO2 (µg/m3)", "NOX (µg/m3)"] #Variables con mayor correlación, se descarta el PM10.
data = df[variables]
data.rename(columns={'NO (µg/m3)':'NO',
'NO2 (µg/m3)':'NO2',
'NOX (µg/m3)':'NOX'},
inplace=True)
data.head()
lm = sfm.ols(formula="NOX~NO+NO2", data=data).fit() #NOX = regresando, NO+NO2 = regresores
#ols = Ordinary Least Squares o "mínimos cuadrados ordinarios"
lm.params #parametros de la ecuación
Modelo regresión multiple: NO$_x$ = 0.290262 + 1.559730NO + 0.966350NO$_2$
4. Evaluación del MLRM:
lm.pvalues #nivel de significancia, se entiende que bajo 0.05 el p-value, se aprueba la hipotesis
lm.summary()
5. Ploteo del regresando versus NO$_x$ real:
NOX_predict = lm.predict(data[["NO", "NO2"]])
data["NOX_predict"] = NOX_predict
x = data["NOX"] #todos los valores de la variable NOx
y = data["NOX_predict"] #todos los valores de la variable Nox estimada con MLRM
#Calculando los coeficientes del ajuste de regresión:
a, b = np.polyfit(x, y, 1) # 1 es el grado del polinomio
r = np.corrcoef(x, y) # r = coeficiente de correlación
plt.subplot(111)
plt.scatter(x,y, color="r", s=20)
plt.xlabel("NO$_x$ (µg/$m^3$)")
plt.ylabel("NO$_x$ Predict (µg/$m^3$)")
plt.plot(x, a * x + b, color="skyblue")
plt.text(10,55, 'r = {0:2.2f}'.format(r[0,1]))
#plt.text(10,55, 'NO$_x$ = {0:2.2f} NO$_x$ Predict + {1:2.3f}'.format(a,b))
plt.savefig("C:/Users/heber/Desktop/CURSO_GRAFICOS_EN_PYTHON/Regresión Lineal Multiple/nox_predict.png", dpi=300) #ruta imagen guardada
plt.subplots_adjust(left=0.0, bottom=0.0, right=2, top=2, wspace=0.2, hspace=0.2)
plt.show()