Automatiser la recherche de voitures

Automatiser la recherche de voitures avec Python et la science des données

L’achat d’une voiture peut être une activité gênante. Vous devez constamment consulter les sites Web des concessionnaires pour trouver de bonnes affaires. Habituellement, les gens passent quelques mois à le faire avant de prendre une décision sur la voiture à acheter.

Dans cet article, je vais vous montrer comment configurer un pipeline de grattage Web et d’analyse de données avec Python et Jupyter Notebooks pour vous aider dans votre recherche de voiture.

Les marches

Pour commencer, définissons d’abord les étapes de ce que nous voulons accomplir :

  1. Définir les données cibles
  2. Grattez les données pertinentes
  3. Nettoyage et prétraitement des données
  4. L’analyse des données

Dans un premier temps, nous définirons quelles sont nos données cibles, puis nous les scraperons.

(il est important de se rappeler que l’exemple que je vais montrer ici fonctionnera sur un site Web spécifique et vous devez modifier le code de grattage pour qu’il corresponde au site Web sur lequel vous avez l’intention de gratter).

Après cela, nous effectuerons un nettoyage et un prétraitement des données et pour terminer, nous effectuerons une analyse des données sur les données collectées, en visualisant des informations sur les voitures pour aider à la prise de décision.

Définir les données cibles

Les données que nous voulons pour ce projet sont :

  • Marque et modèle de voiture
  • État de la voiture (occasion ou neuf)
  • Prix
  • Kilométrage
  • Carburant
  • Année

Une fois que nous aurons ces données, nous les enregistrerons dans une base de données pandas et commencerons la phase de nettoyage des données.

Grattez les données pertinentes

Pour commencer, définissons d’abord nos importations.

à partir de bs4 importer 
des demandes d'importation BeautifulSoup importer 
des pandas en tant que pd 
importer numpy en tant que np

Nous utiliserons beautifulsoupet les requestspackages pour le grattage Web, ainsi que les packages pandaset numpypour tous les traitements de données nécessaires une fois que nous aurons les données.

Nous commençons par définir le site Web que nous voulons récupérer. Dans mon cas, je vais récupérer les informations d’un site Web de concessionnaire automobile populaire du Portugal.

website = 'https://www.santogal.pt/search-page/'

Maintenant, nous allons écrire une fonction pour récupérer les données du site Web, en ciblant les informations que nous avons définies précédemment.

Notez que pour cet exemple, nous avons extrait les prix des voitures, le kilométrage et les informations sur le carburant de différents divstrouvés sur la page de recherche du site Web. Pour la marque et le modèle, nous avons dû trouver les en h2– h3têtes et et de la même manière nous avons utilisé la headerbalise pour trouver des informations sur l’état de la voiture (utilisée ou neuve).

Les différences entre les sites Web ne doivent pas être trop importantes, de sorte que les ajustements nécessaires pour que cela fonctionne pour votre cas d’utilisation particulier ne doivent pas être trop coûteux.

Exécution de la fonction de grattoir principal

Maintenant que j’ai le code pour obtenir toutes les informations que je désire, tout ce que j’ai à faire est de configurer une boucle for sur toutes les pages disponibles à l’intérieur de la page de recherche principale du site Web.

Ce que fait cette fonction, c’est qu’elle découvre d’abord combien de pages existent pour nous à gratter, puis elle utilise le nombre de pages trouvées pour boucler sur chaque page, en grattant les informations et en les ajoutant à une trame de données pandas.

Bien qu’il s’agisse d’un exemple personnalisé pour le site Web en question, la structure principale ici peut être réutilisée pour n’importe quelle page de recherche de votre choix.

Nous pouvons maintenant jeter un œil aux données que nous avons récupérées.

car_data.head()
png

Très bien, maintenant que nous avons toutes les données dont nous avons besoin, nettoyons-les pour pouvoir exécuter l’analyse des données.

Nettoyage et prétraitement des données

Pour cette partie, nous devrons configurer quelques fonctions personnalisées qui géreront les problèmes courants liés aux données extraites des sites Web, des problèmes tels que les problèmes de chaîne lorsque des nombres sont mélangés avec d’autres caractères et le fait d’avoir des virgules au lieu de points parmi d’autres petits problèmes.

Commençons par la colonne des prix.

png
Image par l’auteur

Ici, je supprime le signe euro des lignes de prix pour pouvoir convertir la colonne en un type entier, ce qui me permettra de visualiser plus facilement les informations sur les prix.

png
Image par l’auteur

Ici, nous enlevons un peu d’encombrement de la car_statecolonne pour montrer uniquement si la voiture est utilisée ou non, dans ce cas, le mot « Usado » signifie utilisé en portugais.

png
Image par l’auteur

Maintenant, cette fonction supprime la Kmschaîne de la colonne de kilométrage, puis nous transformons cette colonne en type entier comme dans la colonne de prix pour les mêmes raisons.

dtype('int64')

Quant à la colonne year, nous la transformons simplement en un entier (qui est la sortie de l’attribut year de l’objet datetime).

Mise à jour de la base de données de voitures CSV

Maintenant que nos données sont nettoyées, nous sommes prêts à les enregistrer, puisque je l’avais déjà fait auparavant, j’avais déjà un fichier CSV avec les données, donc ici je vais juste mettre à jour ce fichier avec les données nouvellement récupérées.

Pour cette partie, je réfléchis toujours à la meilleure approche pour éviter les problèmes tels que les doublons et les modifications du site Web (comme une ancienne offre qui n’est plus disponible), mais pour l’instant, je ne fais que lire le fichier CSV local, en le concaténant avec le jeu de données nouvellement extrait et en supprimant les entrées en double.

Nombre de doublons 0 
Nombre de lignes 1214
png
Image par l’auteur

Enfin, je l’enregistre à nouveau dans un fichier CSV.

car_concat.to_csv('car_data.csv', index=Faux) 

L’analyse des données

Maintenant, pour cette partie, nous examinerons des informations telles que les voitures les moins chères, les voitures à un certain prix et toute autre information qui pourrait être pertinente lorsque vous envisagez d’acheter une voiture d’occasion avec un budget serré. (Si vous avez des idées d’analyses que je pourrais faire sur ce type d’ensemble de données, faites-le moi savoir dans les commentaires !)

Chargement des données

Nous commençons par importer des packages supplémentaires dont nous aurons besoin pour la visualisation ainsi que par charger les données que nous venons de sauvegarder.

importer matplotlib.pyplot en tant que plt 
importer seaborn en tant que sns 
sns.set() 

car_data = pd.read_csv("car_data.csv") 
car_data.head()
png
Image par l’auteur

Comme je ne m’intéresse qu’aux voitures, j’ai décidé d’écrire une fonction ici pour supprimer les motos des données, puisque ce n’est qu’à des fins de visualisation, j’ai décidé de la laisser ici plutôt qu’à l’étape du nettoyage des données.

png
Image par l’auteur

Examinons maintenant quelques statistiques concernant les prix des voitures

Moyenne et médiane des prix des voitures

données_voiture["prix_voiture"].mean()29240.494587843463données_voiture["prix_voiture"].médiane()23490.0

Statistiques générales pour la colonne des prix des voitures

car_data["car_price"].describe()nombre 1201.000000 
moyenne 29240.494588 
std 16434.262979 
min 7990.000000 
25% 18990.000000 
50% 23490.000000 
75% 33900.000000 
max 189900.000000 
Nom: car_price64, dtype

Prix ​​moyen par voiture d’une année donnée

Maintenant, comme c’est la première fois que j’achète une voiture, je ne sais pas quel est le taux de dévaluation des voitures au fil des années, j’ai donc décidé de me pencher là-dessus.

png
Image par l’auteur

Qu’en est-il du prix moyen d’une voiture pour différentes marques ? Cela pourrait m’aider à choisir le modèle de voiture idéal compte tenu de mon budget.

png

Maintenant, je veux regarder les voitures à une gamme de prix spécifique pour voir quelles options se présentent.

# voitures de moins de 12 000
 car_data[car_data["car_price"]<12 000]
png
Image par l’auteur
# voitures de moins de 10 000
 car_data[car_data["car_price"]<10 000]
png
Image par l’auteur

Ok, comme nous pouvons le constater, j’ai pu trouver pas mal d’options viables pour moins de 12 000 et même 10 000 euros.

Maintenant, je veux nettoyer un peu plus les données pour obtenir un nombre plus complet de modèles de voitures. J’ai dû le faire car des erreurs dans la description du modèle de voiture dans la description de l’annonce peuvent conduire à ce que le même modèle soit considéré comme différent lors de l’exécution de l’analyse des données (si je rationalise cette analyse à l’avenir, je déplacerai probablement cette fonction vers le nettoyage des données organiser).

455

Selon cela, nous avons 455 types différents de modèles de voitures disponibles à l’achat, traçons le prix moyen des modèles d’une marque donnée.

png
Image par l’auteur
# traçage pour citroen 

plot_price_models_brand(car_data,'CITROEN')
png
Image par l’auteur
plot_price_models_brand(car_data, "KIA")
png
Image par l’auteur

A partir de ces parcelles je me vois converger vers des modèles comme la fiat lounge 1.2 ou la Citroen c1 vti.

Bien sûr, tout cela est préliminaire et je devrais effectuer une analyse plus approfondie avant de tirer des conclusions.

Conclusion

Pour l’instant, je pense que je vais m’arrêter ici, ce sujet est infini et on pourrait passer des heures à faire toutes sortes d’analyses sur ces données, ce que j’ai l’intention de faire au cours des prochaines semaines, alors attendez-vous à un nouvel article bientôt avec des mises à jour sur ce projet!

Retour en haut