Automatiser la recherche de voitures avec Python et la science des données
Trouver de bonnes affaires de voiture avec Python, le grattage Web et les cahiers Jupyter
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 :
- Définir les données cibles
- Grattez les données pertinentes
- Nettoyage et prétraitement des données
- 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 beautifulsoup
et les requests
packages pour le grattage Web, ainsi que les packages pandas
et numpy
pour 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 divs
trouvés sur la page de recherche du site Web. Pour la marque et le modèle, nous avons dû trouver les en h2
– h3
têtes et et de la même manière nous avons utilisé la header
balise 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()

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.

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.

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

Maintenant, cette fonction supprime la Kms
chaî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

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()

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.

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.

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.

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]

# voitures de moins de 10 000
car_data[car_data["car_price"]<10 000]

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.

# traçage pour citroen
plot_price_models_brand(car_data,'CITROEN')

plot_price_models_brand(car_data, "KIA")

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!
Si vous préférez la vidéo, regardez ma vidéo Youtube sur ce sujet ici :
Le code source du projet peut être trouvé ici .