Realizar un proyecto de ciencia de datos con Python

Introducción

Este capítulo ofrece la oportunidad de poner en práctica, en un proyecto real, gran parte de los conceptos y técnicas abordados en este libro. Los notebooks de este proyecto están disponibles en la siguiente dirección:  https://github.com/eric2mangel/UsedCarPricePredictor

Para que la demostración sea más fluida, solo retomaremos las partes más importantes. Sin embargo, todos los experimentos estarán disponibles en los notebooks.

El tema: determinar el precio de los vehículos de ocasión

1. Los datos

Los datos provienen del sitio web de Kaggle y están disponibles en esta dirección:  https://www.kaggle.com/datasets/wspirat/germany-used-cars-dataset-2023

La licencia es «CC0: Dominio Público», lo que significa que los datos se colocan en el dominio público y se pueden utilizar libremente. Asegúrese de verificar y respetar siempre los términos de uso de un conjunto de datos.

Nuestro conjunto de datos es una colección de ofertas de venta de coches de ocasión de uno de los sitios web alemanes más grandes en del sector: AutoScout24. Ofrece una amplia gama de modelos y versiones de vehículos. En total, hay 251 079 vehículos.

2. Las etapas del proyecto

Pondremos en práctica un enfoque clásico para el procesamiento y modelado de datos, teniendo cuidado de separar la parte de feature engineering y la parte de modelado. Este enfoque es relevante porque nos permite centrarnos en cada parte de forma independiente. Además, a la hora de modelar, podemos partir de los datos transformados, evitando tener que recargar todo desde el principio.

a. El notebook de EDA

El notebook de EDA cubrirá la adquisición, limpieza, exploración, análisis y finalización de datos. Nuestro conjunto de datos solo presenta 15 variables, pero algunas como la marca, el modelo...

Modelado en la práctica

1. Notebook 1: EDA

a. Adquisición de datos y comprobaciones iniciales

Antes de comenzar, es necesario descargar los datos cuyo enlace se proporcionó al comienzo del capítulo y guardarlos en una carpeta de nuestra elección.

Procedamos, pues, con la adquisición:

import pandas as pd  
import numpy as np  
  
pd.set_option("display.max_columns", 999)  
raw = pd.read_csv(r"YOUR_PATH\data.csv",low_memory=False,sep=",")  
  
brut.head() 
IMAGES/09El02.png
IMAGES/09El03.png

El archivo, presentado en dos partes por restricciones de legibilidad, incluye 15 variables y 251 079 observaciones.

La primera variable es un índice incremental que se puede eliminar inmediatamente:

raw = raw.drop(["Unnamed: 0"],axis=1) 

A continuación, cambiaremos el nombre de la variable offer_description a version para mayor comodidad:

raw.rename(columns={'offer_description': 'version'},  
           inplace=True) 

Ahora podemos ver las características globales del conjunto de datos:

raw.info() 
IMAGES/09El04.png

La calidad de cumplimentación es globalmente muy buena, con una tasa de finalización general promedio del 99,22 %. La variable fuel_comsumption_l_100km tiene la tasa de relleno más baja, con un 89,3 %.

Al desplazarse por los datos, se observa que algunos precios han sido reemplazados por el nombre de la empresa. Dado que nuestro modelo se centrará en la predicción de precios, en este momento podemos eliminar todas las observaciones que no tengan un precio numérico. Recuperaremos los valores numéricos en una nueva variable price y cuantificaremos el número de observaciones no numéricas:

raw['price'] = pd.to_numeric(raw["price_in_euro"],  
                             errors='coerce')  
non_num_price = raw[raw['price'].isna() &  
                    raw["price_in_euro"].notna()]  
non_num_price.shape  
  
# Output: (199,15) 

Disponemos...

Conclusión

En conjunto, al igual que en la simulación anterior, aparecen las mismas variables destacadas. Aunque el rendimiento ha mejorado, estos experimentos muestran que cada intento de optimización requiere lidiar con restricciones, particularmente en términos de potencia de cómputo. Aquí, sería imposible considerar un GridSearchCV porque nuestras máquinas simplemente no son lo bastante potentes como para llevar a cabo estas búsquedas exhaustivas en un período de tiempo razonable. El equilibrio entre el rendimiento y la viabilidad sigue siendo, la mayoría de las veces, el principal reto.