En este artículo, vamos a ver cómo realizar una regresión de cuantiles en Python.
La regresión lineal se define como el método estadístico que construye una relación entre una variable dependiente y una variable independiente según el conjunto dado de variables. Mientras realizamos la regresión lineal, tenemos curiosidad por calcular el valor medio de la variable de respuesta. En su lugar, podemos usar un mecanismo conocido como regresión cuantil para calcular o estimar el valor cuantil (percentil) del valor de respuesta. Por ejemplo, percentil 30 , percentil 50 , etc.
Regresión cuantil
La regresión cuantil es simplemente una versión extendida de la regresión lineal. La regresión cuantil construye una relación entre un grupo de variables (también conocidas como variables independientes) y cuantiles (también conocidos como percentiles) variables dependientes.
Realizar regresión de cuantiles en Python
El cálculo de la regresión por cuantiles es un proceso paso a paso. Todos los pasos se discuten en detalle a continuación:
Creación de un conjunto de datos para demostración
Vamos a crear un conjunto de datos ahora. Como ejemplo, estamos creando un conjunto de datos que contiene la información de la distancia total recorrida y la emisión total generada por 20 automóviles de diferentes marcas.
Python3
# Python program to create a dataset # Importing libraries import numpy as np import pandas as pd import statsmodels.api as sm import statsmodels.formula.api as smf import matplotlib.pyplot as plt np.random.seed(0) # Specifying the number of rows rows = 20 # Constructing Distance column Distance = np.random.uniform(1, 10, rows) # Constructing Emission column Emission = 20 + np.random.normal(loc=0, scale=.25*Distance, size=20) # Creating a dataframe df = pd.DataFrame({'Distance': Distance, 'Emission': Emission}) df.head()
Producción:
Distance Emission 0 5.939322 22.218454 1 7.436704 19.618575 2 6.424870 20.502855 3 5.903949 18.739366 4 4.812893 16.928183
Estimación de la regresión cuantil
Ahora construiremos un modelo de regresión por cuantiles con la ayuda de,
- Distancia recorrida: Como variable predictora
- Kilometraje conseguido: Como variable de respuesta
Ahora, haremos uso de este modelo para estimar el percentil 70 de emisión generada en base a la distancia total recorrida por los automóviles.
Python3
# Python program to illustrate # how to estimate quantile regression # Importing libraries import numpy as np import pandas as pd import statsmodels.api as sm import statsmodels.formula.api as smf import matplotlib.pyplot as plt np.random.seed(0) # Number of rows rows = 20 # Constructing Distance column Distance = np.random.uniform(1, 10, rows) # Constructing Emission column Emission = 40 + Distance + np.random.normal(loc=0, scale=.25*Distance, size=20) # Creating the data set df = pd.DataFrame({'Distance': Distance, 'Emission': Emission}) # fit the model model = smf.quantreg('Emission ~ Distance', df).fit(q=0.7) # view model summary print(model.summary())
A partir de la salida de este programa, la ecuación de regresión estimada se puede deducir como,
val = 39,5647 + 1,3042 * X (distancia en km)
Implica que se espera que el percentil 70 de emisión para todos los autos que recorren X km sea val.
Producción:
Regresión de cuantiles de visualización
Para visualizar y comprender la regresión por cuantiles, podemos usar un diagrama de dispersión junto con la regresión por cuantiles ajustada.
Python3
# Python program to visualize quantile regression # Importing libraries import numpy as np import pandas as pd import statsmodels.api as sm import statsmodels.formula.api as smf import matplotlib.pyplot as plt np.random.seed(0) # Number of rows rows = 20 # Constructing Distance column Distance = np.random.uniform(1, 10, rows) # Constructing Emission column Emission = 40 + Distance + np.random.normal(loc=0, scale=.25*Distance, size=20) # Creating a dataset df = pd.DataFrame({'Distance': Distance, 'Emission': Emission}) # #fit the model model = smf.quantreg('Emission ~ Distance', df).fit(q=0.7) # define figure and axis fig, ax = plt.subplots(figsize=(10, 8)) # get y values y_line = lambda a, b: a + Distance y = y_line(model.params['Intercept'], model.params['Distance']) # Plotting data points with the help # pf quantile regression equation ax.plot(Distance, y, color='black') ax.scatter(Distance, Emission, alpha=.3) ax.set_xlabel('Distance Traveled', fontsize=20) ax.set_ylabel('Emission Generated', fontsize=20) # Save the plot fig.savefig('quantile_regression.png')
Producción: