Modelo de predicción de precios de viviendas

En este artículo se construirá un modelo de predicción de precios de viviendas en base a un dataset de la ciudad de Boston. El modelo se construirá en base a un regresión lineal pero construido con un algoritmo basado en refuerzo de gradiente (Gradient boosting) en Python, denominado xgboost.

Librerías utilizadas

Análisis exploratorio de los datos

El dataset está formado por las siguientes columnas:

  • CRIM: índice de criminalidad per cápita por ciudad
  • ZN: proporción de suelo residencial para lotes de más de 25.000 pies cuadrados
  • INDUS: proporción de acres de negocios no comerciales por ciudad
  • CHAS: variable dummy del río Charles (1 si la zona limita con el río; 0 en caso contrario)
  • NOX: concentración de óxidos nítricos (partes por 10 millones) 
  • RM: número medio de habitaciones por vivienda 
  • AGE: proporción de unidades ocupadas por sus propietarios construidas antes de 1940 
  • DIS: distancias ponderadas a cinco centros de empleo de Boston
  • RAD: índice de accesibilidad a las autopistas radiales 
  • TAX: tasa de impuesto sobre la propiedad de valor total por 10.000 dólares 
  • PTRATIO: ratio alumno-profesor por ciudad 
  • B: 1000(Bk – 0,63)^2 donde Bk es la proporción de personas de raza negra por ciudad 
  • LSTAT: es el porcentaje de población más baja

Dado que el fichero viene sin especificar las respectivas columnas, para crear el dataframe correctamente es conveniente indicar las distintas columnas. Además, en este caso el delimitado del csv es el espacio en blanco. Un ejemplo de carga y creación del dataframe se puede ver a continuación:

data = pd.read_csv("housing.csv", delimiter=r"\s+", names=['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'PRICE'], header=None)

Una vez creado el dataframe correctamente es conveniente comprobar si existen valores nulos de la siguiente forma:

data.isnull().sum()

Una vez comprobado que no existen valores nulos que puedan alterar el futuro modelo de predicción de precios de viviendas a construir se puede proceder a estudiar estadísticamente los datos. Comenzando con el resumen estadístico que proporciona el método describe.

Continuamos con el visionado de la correlación que existe entre las distintas variables del conjunto de datos, poniendo especial hincapié en las correlacionadas con la variable price, ya que es el objetivo a predecir.

Se puede observar que la variable RM está positivamente correlacionada y LSTAT negativamente. El resto de variables se encuentran parcialmente correlacionadas con la variable a predecir.

Construcción del modelo de predicción de precios de viviendas

El primer paso será dividir el dataset en variables predictoras (X) y variable a predecir (Y):

X = data.drop(['PRICE'], axis=1)
Y = data['PRICE']

Para la construcción de este modelo dividiremos el conjunto de datos en conjunto de entrenamiento (utilizado para construir el modelo) y el conjunto de entrenamiento (para testear el modelo con datos no ajenos a su construcción).

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state = 2)

Creación del modelo

Para la creación del modelo de predicción de precios de viviendas se ha utilizado una librería de código abierto, denominada XGBoost, que implementa algoritmos optimizados de aprendizaje automático de refuerzo de gradiente distribuido en el marco del refuerzo de gradiente.

model = XGBRegressor()
model.fit(X_train, Y_train)

Predicción con datos de entrenamiento

El resultado de la predicción con datos de entrenamiento se obtiene de la siguiente forma:

train_prediction = model.predict(X_train)

Gráficamente podemos apreciar como la predicción de precios se adapta mucho a los precios reales. Esto es debido a que se están prediciendo los precios con los datos utilizados para crear el modelo.

Predicción con datos de testing

La predicción con el conjunto de datos de test se realiza de forma similar:

test_prediction = model.predict(X_test)

Gráficamente se puede observar una mayor dispersión de los datos predecidos a comparación con los datos reales, debido a que este conjunto de datos no se utilizó para construir el modelo. Con lo cual, podemos afirmar que estas predicciones son mucho más realistas que las realizadas con el conjunto de entrenamiento.

Jupyter notebook

Fuentes

Deja un comentario