Predecir precios de automóviles

En este post se construirán varios modelos para predecir precios de automóviles en base a un dataset que aglutina datos comunes de éstos. Se construirán dos modelos, el primero de ellos basado en regresión lineal común y el segundo con una variante este.

Librerías utilizadas

Análisis exploratorio de los datos

El dataset está formado por las siguientes columnas:

  • Car_Name: nombre del coche.
  • Year: el año en que se compró el coche.
  • Selling_Price: el precio al que el propietario quiere vender el coche.
  • Present_Price: el precio actual del coche.
  • Kms_Driven: la distancia recorrida por el coche en km.
  • Fuel: tipo de combustible del coche.
  • Seller_Type: define si el vendedor es un concesionario o un particular.
  • Transmission: define si el coche es manual o automático.
  • Owner: define el número de propietarios que ha tenido el coche anteriormente.

El fichero que contiene los datos es un CSV común, por lo tanto su lectura se realiza utilizando pandas sin ninguna peculiaridad.

data = pd.read_csv('./car data.csv')

Una vez cargados los datos en un dataframe se puede comprobar si existen valores nulos y en este caso no es así. Si se puede observar que tenemos varias variables categóricas, que no se recomiendan para construir modelos. Por ello, se debe realizar una conversión a variables dummy.

# encoding "Fuel_Type" Column
data.replace({'Fuel_Type':{'Petrol':0,'Diesel':1,'CNG':2}},inplace=True)
# encoding "Seller_Type" Column
data.replace({'Seller_Type':{'Dealer':0,'Individual':1}},inplace=True)
# encoding "Transmission" Column
data.replace({'Transmission':{'Manual':0,'Automatic':1}},inplace=True)

Por último, antes de comenzar con la construcción de modelos, es conveniente preparar el conjunto de datos. Esta preparación consiste, en primer lugar, en eliminar las variables Car_Name y Selling_Price. La primera de ellas es conveniente eliminarla porque es una variable categórica que no es útil para la construcción de un modelo. La segunda de ellas se elimina porque es la variable a predecir y se almacena de forma separada, para el posterior estudio y comparación de resultados.

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

Con el conjunto de datos resultante de las modificaciones anteriores, se divide el mismo en conjunto de entrenamiento y de test. El primer conjunto será usado para construir los modelos y el segundo para ver el comportamiento del modelo con datos que no han sido utilizados para su creación.

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

Modelos para predecir precios de automóviles

A continuación, se van a crear dos modelos de predicción de precios de automóviles. El primero de ellos será en base a una regresión lineal convencional, y el segundo de ellos será en base a una variante de esta regresión, denominada como Lasso.

Modelo de regresión lineal

La construcción del modelo se ha realizado de la siguiente forma:

lin_reg_model = LinearRegression()
lin_reg_model.fit(X_train,Y_train)
training_data_prediction = lin_reg_model.predict(X_train)

El resultado obtenido prediciendo los datos utilizados para la construcción del modelo (datos de entrenamiento) se puede observar gráficamente en la siguiente imagen:

Exceptuando valores muy alejados (outliers) se puede observar una gran concentración de datos en una distribución lineal, es decir, se puede considerar que los datos predecidos se asemejan a los datos reales. Aunque, como se están prediciendo datos utilizados para la construcción del modelo no podemos afirmar de momento que el modelo sea fiable. Para confirmarlo se van a predecir los datos del conjunto de test.

Los resultados se pueden observar en la imagen anterior, en la cual se puede ver una mayor dispersión pero la concentración de los datos sigue siendo lineal y podemos darla como aceptable.

Modelo de regresión lasso

El modelo de regresión lasso es una variante del modelo de regresión lineal convencional que nos permitirá un modelo para predecir los precios de automóviles de forma diferente al anterior modelo creado.

La construcción del modelo es bastante similar al caso anterior:

lass_reg_model = Lasso()
lass_reg_model.fit(X_train,Y_train)
training_data_prediction = lass_reg_model.predict(X_train)

Los resultados en la predicción sobre datos de entrenamiento se pueden observar como son bastante similares al modelo anterior.

En los resultados con el conjunto de test se puede observar más diferencia respecto al modelo anterior, a simple vista se puede ver una menor dispersión y mayor linealidad.

Comparación de modelos

Para comparar ambos modelos se van a estudiar los valores obtenidos para el cálculo del R squared Error.

Teniendo en cuenta que cuanto mayor es el valor de R-Squared mayor precisión tiene el modelo podemos afirmar lo siguiente:

  • En el modelo de regresión lineal convencional se observa una mayor precisión para los datos de entrenamiento. 
  • En el modelo de regresión lasso se observa una mayor precisión con los datos de test.
  • Con datos de entrenamiento ha sido más preciso el método convencional.
  • Con datos de test ha sido más preciso el método lasso.
ModeloEntrenamientoTest
Regresión Lineal0.87994516604937110.8365766715027051
Regresión Lasso0.84278561234357940.8709167941173195
Error R-Squared

Las diferencias entre los distintos valores de R-Squared no son muy grandes, es decir, que no existe una gran diferencia entre los dos modelos construidos. Aún así, si tuviera que elegir uno de los modelos me quedaría con el método lasso, porque su comportamiento con los datos de test es muy bueno. 

Jupyter Notebook

Fuentes

Deja un comentario