Mener un projet de data science avec Python
Introduction
Ce chapitre offre l’occasion de mettre en pratique sur un projet réel une grande partie des concepts et techniques abordés dans cet ouvrage. Les notebooks de ce projet sont disponibles à l’adresse suivante :
https://github.com/eric2mangel/UsedCarPricePredictor
Afin de rendre la démonstration plus fluide, nous ne reprendrons que les parties les plus importantes. L’intégralité des expérimentations sera toutefois disponible dans les notebooks.
Le sujet : déterminer le prix des véhicules d’occasion
1. Les données
Les données du sujet sont issues du site Kaggle et disponibles à cette adresse :
https://www.kaggle.com/datasets/wspirat/germany-used-cars-dataset-2023
La licence est « CC0 : Domain Public », ce qui signifie que les données sont placées dans le domaine public et peuvent être librement utilisées. Attention à toujours bien vérifier et respecter les conditions d’utilisation d’un dataset.
Notre jeu de données est un recueil des offres de ventes de voitures d’occasion issues d’un des plus grands sites allemands en la matière : AutoScout24. Il offre un large éventail de modèles et de versions de véhicules. En tout, il y a 251 079 véhicules.
2. Les étapes du projet
Nous allons mettre en pratique une démarche classique de traitement et de modélisation des données en prenant soin de séparer la partie feature engineering de la partie modélisation. Cette approche est pertinente car elle nous permet de nous consacrer à chaque poste indépendamment. De plus, lors de la modélisation, nous pouvons repartir des données transformées et nous éviter de devoir recharger tout depuis le début.
a. Le notebook de l’EDA
Le notebook...
La modélisation en pratique
1. Notebook 1 : EDA
a. Acquisition et premiers contrôles des données
Avant de débuter, il est nécessaire de récupérer les données dont le lien a été fourni en début de chapitre et de les enregistrer dans un dossier de notre choix.
Procédons maintenant à l’acquisition :
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()


Le fichier, présenté en deux parties pour des contraintes de lisibilité, comporte 15 variables et 251 079 observations.
La première variable est un index incrémentiel qui peut être immédiatement supprimé :
raw = raw.drop(["Unnamed: 0"],axis=1)
Ensuite, nous renommerons la variable offer_description en version pour des raisons de commodités :
raw.rename(columns={'offer_description': 'version'},
inplace=True)
Nous pouvons désormais prendre connaissance des caractéristiques globales du dataset :
raw.info()

La qualité de remplissage est globalement très bonne avec un taux de complétion global moyen de 99,22 %. La variable fuel_comsumption_l_100km a le taux de remplissage le plus bas avec 89,3 %.
En parcourant les données, certains prix sont remplacés par un nom de société. Dans la mesure où notre modélisation va porter sur la prédiction des prix, nous pouvons dès maintenant supprimer toutes les observations n’ayant pas de prix numérique. Nous allons récupérer dans une nouvelle variable price les valeurs numériques et quantifier le nombre d’observations non numériques :
raw['price'] = pd.to_numeric(raw["price_in_euro"],
errors='coerce')
non_num_price = raw[raw['price'].isna() &
raw["price_in_euro"].notna()] ...
Conclusion
Globalement, comme dans la précédente simulation, ce sont les mêmes variables qui ressortent. Bien que les performances se soient améliorées, ces expérimentations montrent que chaque tentative d’optimisation nécessite de composer avec des contraintes, notamment de puissance de calcul. Ici, il serait impossible d’envisager une GridSearchCV, car nos machines ne sont tout simplement pas assez puissantes pour mener à bien ces recherches exhaustives dans des délais raisonnables. L’équilibre entre performance et faisabilité reste, la plupart du temps, le principal enjeu.