Regresión Lineal: Manual práctico en Python

Desde preparar los datos hasta leer el reporte de regresión.

Regresión Lineal: Manual práctico en Python

En esta sección, crearemos una regresión con una base de datos pública, analizaremos el resultado que el reporte del software nos arroja y haremos pruebas a las hipótesis.

Piensa en este post como un cheat sheet (en México los llamamos “acordeones”, porque se hacían en hojitas de papel que se doblaban asemejando al instrumento musical) o un manual práctico para hacer regresiones lineales usando mínimos cuadrados ordinarios. Regresa aquí siempre que necesites.

Si hay algún término que te parezca extraño, recuerda que hicimos un par de posts con la teoría del modelo de mínimos cuadrados.

En este post

  • Aprende a  importar y explorar la base de datos
  • Tips para limpiar los datos
  • Hacer una regresión por mínimos cuadrados
  • Aprende a leer el reporte de regresión que arroja `statsmodels`.

Paso 1. Explora la base de datos

Usaremos la base de datos de precios de casas de Kaggle para este ejercicio. Puedes descargarla directamente desde la página de Kaggle. El archivo de datos tendrá extensión *.csv, con variables separadas por comas.

En la sección "Data" de Kaggle hay cuatro archivos disponibles: uno es una descripción de los datos con información sobre cada columna. La base de datos que descargaremos tiene 81 columnas, y debemos identificar cuáles son útiles para describir los precios de las casas.

El archivo de prueba es igual al de entrenamiento, excepto que no incluye los precios. La idea es entrenar el modelo con la base de datos de entrenamiento y usar los parámetros obtenidos para predecir los precios en el archivo de prueba.

Paso 2: Importa los datos

Primero, importamos los datos de la base de entrenamiento. Luego, verificamos si hay valores nulos y los eliminamos o reemplazamos. También es importante convertir las variables categóricas a números para que puedan ser usadas en el modelo de regresión lineal.

El siguiente bloque de código carga la base de datos "/train.csv" utilizando la librería pandas y se muestra un resumen de los primeros registros con df.head().

# Módulos
import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf

# Cargar la base de datos
df = pd.read_csv("../data/house-prices/train.csv")
df.head()

Aparte de **pandas** usaremos **statsmodels** para hacer la regresión y nos aseguramos de cargar las funciones que nos permiten escribir los modelos como una fórmula. Veremos eso más adelante.

El módulo pandas tiene una función que nos permite cargar los archivos csv. Lo que viene entre comillas del bloque anterior depende de en dónde se ubique tu archivo en la computadora. Cambia ese elemento y corre el código, te debería mostrar una tabla en pantalla con las primeras observaciones de la base de datos.

Primero, importamos los datos de la base de entrenamiento utilizando la librería pandas. Luego, verificamos si hay valores nulos y los eliminamos o reemplazamos. También es importante convertir las variables categóricas a números para que puedan ser usadas en el modelo de regresión lineal.

Usamos el módulo pandas para cargar la base de datos /train.csv y mostrar un resumen de los primeros registros con df.head(). Aparte de pandas, usamos statsmodels para hacer la regresión y nos aseguramos de cargar las funciones que nos permiten escribir los modelos como una fórmula.

El siguiente bloque de código carga la base de datos /train.csv y muestra un resumen de los primeros registros con df.head():

# Módulos
import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf

# Cargar la base de datos
df = pd.read_csv("../data/house-prices/train.csv")
df.head()

La base de datos

Correr el código anterior genera una tabla similar a la que ves aquí en la pantalla, que muestra cómo se compone la base de datos.

Existen otros trucos para comprender mejor cómo es la base de datos. Si ejecutamos df.columns, Python nos mostrará una lista con los nombres de todas las columnas de la base de datos. Al ejecutar df.shape, el resultado nos indicará el número de filas y de columnas que contiene la tabla, respectivamente: en nuestro caso, la base de datos tiene 1460 filas y 81 columnas.

Por último, podemos usar df.describe() para generar un resumen descriptivo de los datos. Este resumen incluye el número de observaciones de cada variable. En la mayoría de los casos, ese número es 1.460, pero en algunos, los valores NA no se tienen en cuenta. Por eso, es importante prestar atención a este resumen.

Existen otros trucos para comprender mejor cómo es la base de datos. Si ejecutamos df.columns, Python nos mostrará una lista con los nombres de todas las columnas de la base de datos. Al ejecutar df.shape, el resultado nos indicará el número de filas y de columnas que contiene la tabla, respectivamente: en nuestro caso, la base de datos tiene 1460 filas y 81 columnas.

Por último, podemos usar df.describe() para generar un resumen descriptivo de los datos. Este resumen incluye el número de observaciones de cada variable. En la mayoría de los casos, ese número es 1.460, pero en algunos, los valores NA no se tienen en cuenta. Por eso, es importante prestar atención a este resumen.

Recomendaciones sobre la limpieza de los datos

  • La base de datos no se toca. Antes de comenzar a hacer modificaciones, crea una copia de la base de datos y trabaja sobre la copia. En caso de que algo salga mal (y si deseas llegar a ser experto, algo va a salir mal), siempre puedes empezar de nuevo con la base de datos original. Puedes hacer una copia con el siguiente código.
# Hacer una copia de la base de datos
df2 = df.copy()
  • Verificar los valores nulos. Si existen valores nulos, reemplázalos con algún valor. Por ejemplo, si hay una variable con valores nulos, puedes reemplazarlos con la media de esa variable. Otra alternativa es eliminar las observaciones con valores nulos, pero es una decisión que hay que tomar con cuidado.
  • Convertir variables categóricas. Si hay variables categóricas, como por ejemplo "Tipo de vivienda" con valores como "Casa", "Apartamento" y "Cabaña", es necesario convertir esas variables a números para que el modelo las reconozca. El módulo pandas tiene una función para hacer esta conversión.
# Convertir variables categóricas a números
df2 = pd.get_dummies(df2, columns=["Tipo de vivienda"])

  • Eliminar variables irrelevantes. Si hay variables que no aportan ninguna información al modelo, como por ejemplo un número de identificación único, puedes eliminarlas. Esto ayuda a mejorar el rendimiento del modelo y evitar problemas como la multicolinealidad.

Una vez que has hecho los cambios apropiados a la base de datos, estamos listos para ejecutar la regresión.

Paso 3: Prepárate para la regresión

Para hacer nuestra regresión, el primer paso es diseñar el modelo. En nuestro caso, haremos un modelo que compara el precio de venta en función del área de los lotes. En otras palabras, esperamos que el modelo se comporte de la siguiente manera.

¿Es esto cierto? veamos cómo se vería un gráfico de nuestra base de datos. Ejecuta el siguiente bloque de código para generar un gráfico de dispersión.

import matplotlib.pyplot as plt

plt.scatter(df['LotArea'], df['SalePrice'], c = "#154954")
plt.show()

Este gráfico muestra en el eje horizontal el área de los lotes y en eje vertical los precios de venta. Desafortunadamente, ambas métricas tienen una distribución muy extensa. Las áreas de los lotes van desde 1,300 hasta 215 mil, que son esos puntos solitarios a la derecha.

Veremos un poco más sobre las transformaciones más adelante, pero algo muy práctico que podemos hacer para estos casos es transformar los datos a logaritmo. El siguiente bloque de código realiza la transformación en una copia de la base de datos y genera nuevas columnas transformadas con un logaritmo. El resultado muestra el grafico de nuestras variables transformadas.

import numpy as np

df2 = df.copy()

df2['LSalePrice'] = np.log(df2['SalePrice'])
df2['LLotArea'] = np.log(df2['LotArea'])

plt.scatter(df2['LLotArea'], df2['LSalePrice'], c = "#154954")
plt.show()

Este gráfico nos indica que los datos ahora “se comportan mejor” y aún seremos capaces de interpretarlos. Ahora si podemos hacer nuestra regresión.

Paso 4: Ejecuta la regresión

Haremos dos regresiones. La del modelo inicial que presentamos arriba y la del modelo transformado con logaritmos que transformamos y presentamos en gráfico.

Cuando la regresión es con una sola variable, es posible realizarla sin acudir a una fórmula. Basta usar la función OLS de statsmodels para generar nuestro reporte.

Ejecuta el siguiente bloque de código para que te aparezca un reporte como el que te muestro:

# Modelo de regresión
model = sm.OLS(df2['SalePrice'], df2['LotArea']).fit()
model.summary()

Paso 5: Cómo leer el reporte de regresión

El reporte se divide en tres secciones. La primera contiene información sobre la regresión, su fecha de realización, las variables que se usaron y algunas estadísticas descriptivas. Una variable que vale la pena notar es el ajuste. Vimos en el gráfico de dispersión que los datos no estaban ajustados, y esto se confirma con el $R^2$ (se lee R cuadrado y se encuentra donde dice R-squared.

El $R^2$ es una medida de dispersión: entre más separados estén los puntos de la línea de regresión, más bajo será su valor. Está entre 0 y 1, donde valores más cercanos a 0 indican mayor dispersión y valores cercanos a 1 indican mayor ajuste. El valor de 0.54 para $R^2$ y $R^2$ ajustada nos dicen que los datos no están muy ajustados.

Esto no es necesariamente malo, pero si es importante tomarlo en cuenta para tener una interpretación correcta de los datos.

En la segunda sección es en la que encontramos los valores de los parámetros y algunos estadísticos que nos indican su veracidad. Por la forma en que hicimos la regresión, el reporte nos indica únicamente el valor de $\beta_1$, que corresponde al efecto del área del terreno en el precio de la casa.

Esta regresión sin logaritmos nos indica que, en promedio, un aumento en una unidad en el área del terreno implica un aumento de 10.04 dólares en el precio de la casa.

Errores y efectos significativos

Esta misma sección contiene los errores estándar de nuestras estimaciones. El error estándar es la desviación estándar de la estimación nivelada con el número de observaciones. Nos sirve para identificar si el efecto que estamos observando es significativo.

¿Qué significa que algo sea significativo en estadística? Significa que el efecto que estamos observando es real y no es producto del azar. Cuando un valor es significativo, significa que este valor se observaría con una alta probabilidad de forma consistente en una muestra de datos similar. Esto nos dice que un resultado significativo es replicable y estadísticamente significativo.

Para medir entonces si es o no significativo el valor de $\beta_1$, usamos el error estándar por medio del estadístico t. El t (algunas veces conocido como t de student) mide el ratio entre la señal y el ruido:

La señal puede ser diferente estadístico, dependiendo de la prueba. En una diferencia de medias, esa diferencia es la señal. En el caso de la regresión $\beta_1$ es la señal. El ruido en este caso sería $\sqrt{\frac{\sigma^2}{n}}$, que se hace más pequeño entre mayor sea el número de observaciones que tenemos disponible y más grande entre mayor sea la varianza de los datos.

El error estándar de esta regresión muestra un número muy pequeño, por lo que nuestro estadístico t tiene un valor de 41.68: la señal es más de cuarenta veces mayor que el ruido de la regresión.

Finalmente se encuentran los intervalos de confianza. El intervalo de confianza nos indica la zona en la que podríamos esperar que la línea de regresión verdadera se encuentre con un 95% de confianza.

Interpretar el intervalo de confianza [9.57 10.52] significa que hay un 95% de confianza de que el verdadero efecto del área del terreno en el precio de la casa se encuentre entre 9.57 y 10.52 dólares. Como estos valores son muy cercanos entre si y no se alejan mucho del valor de $\hat\beta_1$, podemos tener mucha confianza en nuestros resultados.

Lo que sigue: Comprobar los supuestos de regresión

En el próximo post veremos cómo comprobar los supuestos de la regresión. Estos supuestos son condiciones necesarias para que los resultados de la regresión sean estadísticamente válidos. Estos supuestos incluyen normalidad, homocedasticidad, independencia de los residuos y linearidad. Aprenderemos a comprobar estos supuestos y a corregirlos si es necesario, para poder lograr resultados más precisos de nuestra regresión.


¡Genial! Te has registrado exitosamente.

¡Bienvenido de vuelta! Has iniciado sesión correctamente.

Te has suscrito correctamente a Marionomics: Escribe tu paper de economía.

¡Éxito! Revisa tu correo electrónico para obtener el enlace mágico para iniciar sesión.

¡Éxito! Se ha actualizado la información de facturación.

No se actualizó tu información de facturación.