Skip to content

Introduction to Regression with statsmodels in Python

Run the hidden code cell below to import the data used in this course.

# Importing pandas
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from statsmodels.formula.api import ols

# Importing the course arrays
conversion = pd.read_csv("datasets/ad_conversion.csv")
churn = pd.read_csv("datasets/churn.csv")
fish = pd.read_csv("datasets/fish.csv")
sp500 = pd.read_csv("datasets/sp500_yearly_returns.csv")
taiwan = pd.read_csv("datasets/taiwan_real_estate2.csv")
# Scatter plot con una linea horizontal donde el valor es igual en los dos ejes
sp500_yearly_returns = sp500[["symbol", "return_2018", "return_2019"]]
# Create a new figure, fig
fig = plt.figure()

# Plot the first layer: y = x
plt.axline(xy1=(0,0), slope=1, linewidth=2, color="green")

# Add scatter plot with linear regression trend line
sns.regplot(x="return_2018",
                y="return_2019",
                data=sp500_yearly_returns,
                ci=None,
                line_kws={"color": "black"})

# Set the axes so that the distances along the x and y axes look the same
plt.axis("equal")

# Show the plot
plt.show()
taiwan_real_estate = taiwan
# Create sqrt_dist_to_mrt_m
taiwan_real_estate["sqrt_dist_to_mrt_m"] = np.sqrt(taiwan_real_estate["dist_to_mrt_m"])

# Run a linear regression of price_twd_msq vs. sqrt_dist_to_mrt_m
mdl_price_vs_dist = ols("price_twd_msq ~ sqrt_dist_to_mrt_m", data=taiwan_real_estate).fit()

# Use this explanatory data
explanatory_data = pd.DataFrame({"sqrt_dist_to_mrt_m": np.sqrt(np.arange(0, 81, 10) ** 2),
                                "dist_to_mrt_m": np.arange(0, 81, 10) ** 2})

# Use mdl_price_vs_dist to predict explanatory_data
prediction_data = explanatory_data.assign(
    price_twd_msq = mdl_price_vs_dist.predict(explanatory_data)
)

fig = plt.figure()
sns.regplot(x="sqrt_dist_to_mrt_m", y="price_twd_msq", data=taiwan_real_estate, ci=None)

# Add a layer of your prediction points
sns.scatterplot(data=prediction_data, x="sqrt_dist_to_mrt_m", y="price_twd_msq", color="red")
plt.show()

Evaluacion de ajuste del modelo

Coeficiente de determinacion

Tambien llamado r-squared, para regresiones lineales simples o R-squared cuando se tienen mas de una variable explicativa.

Se define como la proporcion de la varianza en la variable de respuesta que es predecible a partir de la varibale explicativa.

  • 1 significa un ajuste perfecto.
  • 0 significa el peor ajuste.

Forma de acceder r-squared

print(mdl_bream.rsquared)

Forma de acceder residual (mse)

print(mdl_bream.mse_resid)

Para calcular RSE

np.sqrt(mdl_bream.mse_resid)

Para modelos lineales simples, el coeficiente es simplemente la correlacion entre las varibales explicativas y de respuesta, al cuadrado.

Residual standard error (RSE)

Es una medida del tamaño tipico de los residuos, es deciar, cuanto suelen estar equivocadas las predicciones. Tiene la misma unidad que la varibale de respuesta.

Una metrica menos comun es el MSE (Error estandard residual cuadratico)

Propiedades residuales de un buen ajuste de una regresion lineal

  • Los residuos se distribuyen normalmente.
  • La media de los residuos son zero.

Los graficos de Residuos vs Ajuste

La linea azul es una línea de tendencia LOWESS, que es una curva suave que sigue los datos.Si los residuos cumplen el supuesto de que normalmente se distribuyen con media cero, entonces la linea de tendencia debe seguir de cerca la linea y es igual a cero en el grafico.

Q-Q plot

Muestra si los residuos siguen una distribucion normal.En el eje x, los punos son cuantiles de la distribución normal. En el eje y, obtiene los cuantiles de muestra, que son los cuantiles derivados de su conjunto de datos. Si los puntos siguen la línea recta, estan distribuidos de manera normal, si no, no lo estan.

Scale-location plot

El tercer grafico muestra la raíz cuadrada de los residuos estandarizados frente a los valores ajustados. Donde el primer grafico mostró si los residuos se vuelven positivos o negativos a medida que los valores ajustados cambian, este gráfico muestra si el tamaño de los residuos aumenta o disminuye.

# Plot the residuals vs. fitted values
sns.residplot(x="n_convenience", y="price_twd_msq", data=taiwan_real_estate, lowess=True)
plt.xlabel("Fitted values")
plt.ylabel("Residuals")

# Show the plot
plt.show()
# Import qqplot
from statsmodels.api import qqplot

# Create the Q-Q plot of the residuals
qqplot(data=mdl_price_vs_dist.resid, fit=True, line="45")

# Show the plot
plt.show()
# Preprocessing steps
model_norm_residuals = mdl_price_vs_dist.get_influence().resid_studentized_internal
model_norm_residuals_abs_sqrt = np.sqrt(np.abs(model_norm_residuals))

# Create the scale-location plot
sns.regplot(x=mdl_price_vs_dist.fittedvalues, y=model_norm_residuals_abs_sqrt, ci=None, lowess=True)
plt.xlabel("Fitted values")
plt.ylabel("Sqrt of abs val of stdized residuals")

# Show the plot
plt.show()

Valores atípicos, apalancamiento e influencia

El primero tipo de valor atipico(outlier) es cuando tiene variables explicativas que son extremas. La otra propiedad de los outliers es cuando el punto se encuentra muy lejos de las predicciones del modelo.

El apalancamiento(Leverage) cuantifica cuanto extremos son los valores de las variables explicativas, es decir, mide el primer tipo de valor atipico de discutimos.

La influencia (Influence) mide cuanto cambiaría el modelo si lo volviera a ejecutar sin ese punto de datos.

El apalancamiento lo obtenemos llamando al metodo get_influence() en el modelo ajustado, luego llamando al método summary_frame().

Por razones históricas, el apalancamiento se describe en la denominada matriz hat. Por lo tanto, los valores de apalancamiento se almacenan en la columna hat_diag del marco de resumen. Al igual que los metodos de valores ajustado y residuos, devuelve una matriz con tantos valores como observaciones haya. En este caso, cada uno de estos valores de apalancamiento indica cuán extremas son las longitudes de las roach.

Recuerde que la influencia se basa en el tamaño de los residuos y el apalancamiento. No es una multiplicación sencilla; en su lugar, usamos una métrica llamada distancia de Cook, se almacena en el marco de resumen como "cooks_d".

Podemos encontrar las roach mas influyentes ordenando las filas descendiendo los valores de distancia de Cook. Aqui, puede ver los dos puntos altamente apalancados y el pez con masa cero que le dio un gran residual.

Para ver como funciona la influencia, eliminemos la cucaracha mas influyente, este es el que tiene la longitud mas corta, 12.9cm. Dibujamos la gráfica de regresión habitual, pero agregamos otra línea de regresión usando el conjunto de datos sin ese pex pequeño. La pendiente de la linea ha cambiado por completo solo por tener un punto de datos menos.

Apalancamiento

El apalancamiento mide cuán inusuales o extremas son las variables explicativas para cada observación. En términos muy generales, un apalancamiento alto significa que la variable explicativa tiene valores que son diferentes de otros puntos en el conjunto de datos. En el caso de la regresión lineal simple, donde solo hay un valor explicativo, esto generalmente significa valores con un valor explicativo muy alto o muy bajo.

Aquí, observará valores altamente apalancados en el modelo de precio de la vivienda frente a la raíz cuadrada de la distancia desde la estación de MRT más cercana en el conjunto de datos de bienes raíces de Taiwán.

Adivine qué observaciones cree que tendrán un alto apalancamiento, luego mueva el control deslizante para averiguarlo.

¿Qué afirmación es verdadera?

Las observaciones con una gran distancia a la estación MRT más cercana tienen el apalancamiento más alto, porque la mayoría de las observaciones tienen una distancia corta, por lo que las distancias largas son más extremas.

Los puntos altamente apalancados son aquellos cuyas variables explicativas están más alejadas de los demás.

Influencia

La influencia mide cuánto cambiaría un modelo si cada observación se dejara fuera de los cálculos del modelo, una a la vez. Es decir, mide qué tan diferente se vería la línea de predicción si ejecutara una regresión lineal en todos los puntos de datos excepto ese punto, en comparación con ejecutar una regresión lineal en todo el conjunto de datos.

La métrica estándar para la influencia es la distancia de Cook, que calcula la influencia en función del tamaño residual y el apalancamiento del punto.

Puede ver el mismo modelo que la última vez: el precio de la vivienda frente a la raíz cuadrada de la distancia desde la estación MRT más cercana en el conjunto de datos inmobiliarios de Taiwán.

Adivina qué observaciones crees que tendrán una gran influencia, luego mueve el control deslizante para averiguarlo.

¿Qué afirmación es verdadera?

Las observaciones alejadas de la línea de tendencia tienen una gran influencia porque tienen residuos grandes y están alejadas de otras observaciones.

La mayoría de las casas influyentes eran aquellas con precios muy superiores a los previstos por el modelo (y una con un precio mucho más bajo).

# Create summary_info
summary_info = mdl_price_vs_dist.get_influence().summary_frame()

# Add the hat_diag column to taiwan_real_estate, name it leverage
taiwan_real_estate["leverage"] = summary_info["hat_diag"]

# Add the cooks_d column to taiwan_real_estate, name it cooks_dist
taiwan_real_estate["cooks_dist"] = summary_info["cooks_d"]

# Sort taiwan_real_estate by cooks_dist in descending order and print the head.
print(taiwan_real_estate.sort_values("cooks_dist", ascending=False).head())

Modelado de regresión logística simple

Por qué necesita la regresión logística

Todos los conjuntos de datos que ha visto ahora tenian una variable de respuesta numerica, ahora exploraremos el caso de una variable de respuesta binaria. Considere este conjunto de datos sobre la deserción en una empresa europea de servicios financieros en 2006. Hay 400 filas, cada una representa a un cliente, si el cliente cerro todas sus cuentas durante el periodo de tiempo, se considero batido, y esa columna está marcada con un uno. Las dos variables explicativas son el tiempo transcurrido desde que el cliente compró un servicio por primera vez y el tiempo transcurrido desde la ultima vez que compró un servicio. Respectivamente, miden la duracion de la relación con el cliente y la actualidad de la actividad del cliente. Las columnas de tiempo contienen valores negativos porque se han estandarizado por razones de confidencialidad.

Ejecutemos un modelo lineal de abandono vs antigüedad y veamos que sucede:

La interesección es aproximadamente 0.5 y la pendiente es ligeramente positiva en 0.06.

Aqui hay una gráfica de los puntos de datos con la tendencia lineal. Se utilizo plt.axline en lugar de sns.regplot para que la línea no se limite a la extensión de los datos:

Todos los valores de abandono son cero o uno, pero las predicciones del modelo son fraccionarias. Puede pensar en las predicciones como probabilidades de que el cliente abandone.

Al alejarse estableciendo límites de eje con xlim e ylim, se muestra el problema de usar un modelo lineal. En la parte inferior izquierda de la gráfica, el modelo predice probabilidades negativas. En la esquina superior derecha, el modelo predice probabilidades mayores que uno. Ambas situaciones son imposibles.

La solución es utilizar modelos de regresión logística, que son un tipo de modelo lineal generalizado, que se utiliza cuando la variable de respuesta es lógica. Mientras que los modelos lineales dan como resultado predicciones que siguen una línea recta, los modelos logísticos dan como resultado predicciones que siguen una curva logística, que tiene forma de S.

Para ejecutar una regresión logística, necesita una nueva función de statsmodels. Desde el mismo paquete statsmodels dot formula dot api, importe la función logit. Esta función inicia el proceso de ajuste de un modelo de regresión logística a sus datos. El nombre de la función es la única diferencia entre ajustar una regresión lineal y una regresión logística: la fórmula y el argumento de datos siguen siendo los mismos y se utiliza el método de ajuste de puntos para ajustar el modelo. Como antes, obtienes dos coeficientes, uno para el intercepto y otro para la variable explicativa numérica. La interpretación es un poco diferente; llegaremos a eso más tarde.

Agreguemos las predicciones de regresión logística a la gráfica. regplot dibujará una línea de tendencia de regresión logística cuando establezca el argumento logístico en Verdadero. Observe que la línea de regresión logística, que se muestra en azul, está ligeramente curvada. Especialmente cuando hay más tiempo desde los últimos valores de compra, la línea de tendencia azul ya no sigue a la línea de tendencia lineal negra.

Ahora, alejar muestra que la curva de regresión logística nunca cae por debajo de cero o por encima de uno. Para interpretar esta curva, cuando el tiempo estandarizado desde la última compra es muy pequeño, la probabilidad de churning es cercana a cero. Cuando el tiempo desde la última compra es muy alto, la probabilidad es cercana a uno. Es decir, los clientes que compraron cosas recientemente tienen menos probabilidades de abandonar.

Explorando las variables explicativas

Cuando la variable de respuesta es lógica, todos los puntos se encuentran en las líneas y=0 e y=1, lo que dificulta ver lo que sucede. En el video, hasta que vio la línea de tendencia, no estaba claro cómo se distribuía la variable explicativa en cada línea. Esto se puede resolver con un histograma de la variable explicativa, agrupada por la respuesta.

Utilizará estos histogramas para conocer el conjunto de datos de rotación de servicios financieros que se ve en el video.

churn está disponible como pandas DataFrame.

# Create the histograms of time_since_last_purchase split by has_churned
sns.displot(x="time_since_last_purchase", data=churn, col="has_churned")

plt.show()