Cette présentation fait suite au tools in action que nous avons donné à Devoxx cette année. L’objectif étant de montrer l’intérêt de R pour découvrir, nettoyer puis enrichir nos données avec des approches de type machine learning.
Chez Car&Boat Media, grâce au site de dépot d’annonces de véhicules d’occasions lacentrale.fr, nous avons à notre disposition plus de 280 000 annonces en publication. Nous souhaitons dans cette présentation vous montrer ce que l’on peut faire très facilement avec R pour découvrir, manipuler et jouer avec la donnée en partant d’un simple dump de ces annonces.
Pour illustrer cela de façon concrète nous allons élaborer un modèle simple de prédiction de prix de vente d’un véhicule (algo supervisé), un équivalent de la cote automobile.
Ensuite nous formerons des groupes de données proches en utilisant un algo non supervisé cette fois (kmeans) pour définir des catégories de véhicules.
Partie 1 : découverte du dataset
Nous avons obtenu un dump au format CSV de toutes les annonces en cours de publication, nous allons l’explorer pour déterminer ce que nous allons pouvoir en faire.
- Chargement du fichier csv :
cars <- read.csv("finalcars.csv", sep=",", header=TRUE)
Nous créeons ainsi le dataframe cars, structure composée de lignes et de colonnes, que l’on peut assimiler à une table en BDD relationelle.
- A quoi ressemblent nos premières lignes :
head(cars)
## brand model version yearModel mileage
## 1 ABARTH 500 1.4 16V T-JET 595 50EME ANNIVERSAIRE 2014 500
## 2 ABARTH 500 1.4 16V T-JET ABARTH 2012 46750
## 3 ABARTH 500 1.4 16V TURBO T-JET 140 2012 52250
## 4 ABARTH 500 1.4 16V TURBO T-JET 160CH 595 TURISMO BVR 2012 8800
## 5 ABARTH 500 1.4 16V TURBO T-JET 160CH 595 TURISMO BVR 2013 17850
## 6 ABARTH 500 1.4 16V TURBO T-JET 160CH 595 TURISMO BVR 2013 6911
## gearbox energy doors powerDin priceNew price
## 1 1 1 3 999999 0 31990
## 2 2 1 3 134 0 13500
## 3 2 1 2 999999 0 14500
## 4 1 1 3 140 0 20690
## 5 1 1 2 140 0 19990
## 6 1 1 2 160 0 21980
- Quels sont les types de données de notre dataframe :
str(cars)
## 'data.frame': 258320 obs. of 11 variables:
## $ brand : Factor w/ 132 levels "ABARTH","AC",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ model : Factor w/ 1135 levels "100","100 NX",..: 109 109 109 109 109 109 109 109 109 109 ...
## $ version : Factor w/ 43125 levels "","''UP''","-2 1.5 DCI 70 CONFORT EXPRESSION",..: 7996 7997 8002 8003 8003 8003 8003 8001 8498 8498 ...
## $ yearModel: Factor w/ 198 levels " ''S LINE'' QUATTRO",..: 125 123 123 123 124 124 125 124 119 119 ...
## $ mileage : Factor w/ 84146 levels "0","0.00","1",..: 52249 49920 53890 77243 23567 65389 33182 44183 44914 52964 ...
## $ gearbox : int 1 2 2 1 1 1 1 2 2 2 ...
## $ energy : int 1 1 1 1 1 1 1 1 1 1 ...
## $ doors : int 3 3 2 3 2 2 3 3 3 3 ...
## $ powerDin : int 999999 134 999999 140 140 160 999999 134 135 135 ...
## $ priceNew : int 0 0 0 0 0 0 0 0 18300 18300 ...
## $ price : num 31990 13500 14500 20690 19990 ...
Un Factor est un type de donnée R équivalent à une enumération dans d’autre langage. Cela permet entre autre d’optimiser l’espace occupé en mémoire. Par défaut, au chargement, R détecte ce type de données.
- Que trouve-t-on globalement comme données colonne par colonne :
summary(cars)
## brand model
## RENAULT :45716 CLIO : 11034
## PEUGEOT :37671 MEGANE : 8459
## CITROEN :37616 308 : 7307
## VOLKSWAGEN:16582 C3 : 6410
## BMW :15045 SCENIC : 6015
## AUDI :13808 208 : 5632
## (Other) :91882 (Other):213463
## version yearModel mileage
## II 1.4 HDI 70 FAP CONFORT : 1758 2014 :59003 10 : 7924
## 1.4 HDI FAP 68 ACTIVE 5P : 1435 2013 :42580 5000 : 1336
## 1.6 E-HDI FAP 92 ACTIVE 5P : 1056 2012 :34247 1 : 1133
## II 1.2 8V 69 LOUNGE : 969 2011 :34052 100 : 1046
## II 1.6 E-HDI 115 INTENSIVE BV6: 758 2010 :21026 5 : 989
## II 1.6 HDI 92 FAP ACTIVE : 668 2009 :14067 8000 : 831
## (Other) :251676 (Other):53345 (Other):245061
## gearbox energy doors powerDin
## Min. : 0.0 Min. : 1.000 Min. : 0.000 Min. : -1
## 1st Qu.: 2.0 1st Qu.: 2.000 1st Qu.: 4.000 1st Qu.: 90
## Median : 2.0 Median : 2.000 Median : 5.000 Median : 111
## Mean : 13.7 Mean : 1.905 Mean : 4.314 Mean : 65529
## 3rd Qu.: 2.0 3rd Qu.: 2.000 3rd Qu.: 5.000 3rd Qu.: 149
## Max. :999999.0 Max. :11.000 Max. :11.000 Max. :999999
## NA's :123 NA's :7 NA's :1
## priceNew price
## Min. : 0 Min. : 0
## 1st Qu.: 17200 1st Qu.: 9600
## Median : 24000 Median : 13990
## Mean : 26400 Mean : 17384
## 3rd Qu.: 31000 3rd Qu.: 20500
## Max. :1076400 Max. :4190000
##
- Quelles sont les marques présentes :
table(cars$brand)
##
## ABARTH AC AIXAM ALFA ROMEO ALPINA
## 135 10 74 2541 1
## ALPINE RENAULT AMC ASTON MARTIN AUDI AUSTIN
## 8 2 226 13808 43
## AUSTIN HEALEY AUTOBIANCHI BELLIER BENTLEY BERCE
## 26 1 10 207 1
## BMW BOLLORE BUICK CADILLAC CASALINI
## 15045 1 9 76 8
## CATERHAM CHATENET CHEVROLET CHRYSLER CITROEN
## 8 35 1152 256 37616
## CORVETTE DACIA DAEWOO DAF DAIHATSU
## 38 2222 29 2 24
## DANGEL DE LA CHAPELLE DE TOMASO DODGE DONKERVOORT
## 3 1 2 251 1
## DONNET ZEDEL DUE ESTRIMA EXCALIBUR FERRARI
## 1 3 1 6 551
## FIAT FISKER FORD FORD USA GAC GONOW
## 6403 6 9301 152 3
## GME HONDA HOTCHKISS HUMMER HYUNDAI
## 1 884 1 54 2941
## INFINITI INNOCENTI ISO ISUZU IVECO
## 193 5 1 123 417
## JAGUAR JDM JDM SIMPA JEEP KENWORTH
## 870 1 10 897 1
## KIA KTM LADA LAMBORGHINI LANCIA
## 2418 8 20 125 650
## LAND ROVER LEXUS LIGIER LINCOLN LOTUS
## 1342 748 60 7 84
## MAHINDRA MAN MANDRINOISE MARQUIS MARTIN
## 1 3 2 1 4
## MASERATI MATRA MAYBACH MAZDA MCLAREN
## 430 1 1 1268 37
## MEGA MERCEDES MERCURY MG MIA ELECTRIC
## 5 12415 1 93 2
## MICROCAR MINI MITSUBISHI MORGAN MORRIS
## 43 4462 919 22 2
## MULTICAR NISSAN OLDSMOBILE OPEL PACKARD
## 1 8279 1 7215 1
## PAGANI PANTHER PEUGEOT PGO PIAGGIO
## 1 1 37671 2 4
## PLYMOUTH PONTIAC PORSCHE RADICAL RENAULT
## 3 13 2634 1 45716
## ROLLS ROYCE ROVER SAAB SANTANA SCANIA
## 84 71 171 5 1
## SEAT SHELBY SIMCA SKODA SMART
## 3191 2 3 2076 1011
## SPYKER SSANGYONG STUDEBAKER SUBARU SUNBEAM
## 1 108 3 223 1
## Suzuki SUZUKI TESLA TOYOTA TRIUMPH
## 1 1289 9 7347 64
## TVR VENTURI VEZEKO VOLKSWAGEN VOLVO
## 5 1 1 16582 2652
## WESTFIELD WOLSELEY
## 2 1
- Visuellement, les marques pour lesquelles nous avons plus de 10 000 véhicules :
pie(subset(table(cars$brand), table(cars$brand)>10000))
La commande subset permet de créer un sous-ensemble du dataframe passé en premier argument, en filtrant sur les conditions du second argument.
- Comment le prix de vente est réparti :
summary(cars$price)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0 9600 13990 17380 20500 4190000
Prochain épisode : Nettoyage du dataset
Par Philippe Vasconcelos & Nathaniel Richand
Une réflexion sur “Quand nos annonces prennent l’R”