En tant que programmeur, une nouvelle machine a été sélectionnée

Dans des articles précédents ( I , II , III ), j'ai parlé en détail du développement d'un service de recherche de voitures d'occasion rentables en Fédération de Russie.

Ayant voyagé longtemps sur différentes voitures d'occasion, j'ai pensé à acheter une nouvelle voiture et j'ai décidé d'étudier cette question en détail. Dans les grandes villes, il existe un grand nombre de revendeurs officiels, du moins pour les marques populaires. Les concessionnaires diffèrent les uns des autres dans la liste des voitures disponibles et dans le montant des remises pour les différents modèles. A la recherche des voitures qui m'intéressent, je n'ai pas voulu téléphoner et rendre visite à tous les concessionnaires de suite. À mon avis, il était raisonnable de ne sélectionner au préalable, sur la base d'informations a priori, que les concessionnaires qui proposent les prix les plus bas pour les modèles et équipements qui m'intéressent. Le fait que dans la communication en face à face, si vous pouvez négocier, le taux d'actualisation peut augmenter de manière significative ne contredit pas l'objectif en premier lieu de rendre visite aux concessionnaires offrant les prix les plus favorables du marché.

J'ai collecté des données sur les voitures neuves, les ai analysées, les ai conçues comme un service et à la fin de l'année, lorsque les concessionnaires ont des réductions, j'ai décidé de les partager avec vous.


Aperçu des concurrents


Runet a déjà un service pour sélectionner et acheter de nouvelles voitures - autospot.ru, mais il présente les inconvénients importants suivants:

  1. Sur le site, il n'y a aucun moyen de connaître les contacts des concessionnaires où se trouvent les voitures qui vous intéressent, vous ne pouvez que laisser votre téléphone pour des commentaires. Le gestionnaire autospot.ru vous contactera dans une demi-heure, vérifiera avec vous la marque, le modèle et l'équipement, puis informera votre téléphone des concessionnaires qui ont des voitures qui répondent à vos besoins. Vous attendez au moins une heure pour attendre l'appel initial du revendeur. Un facteur extrêmement ennuyeux dans cette communication est l’importance. Après la conversation, le gestionnaire autospot.ru et divers concessionnaires vous appelleront assez souvent, vous rappelant d'eux-mêmes, même si vous leur demandez le contraire.
  2. Le site présente environ 30000 voitures neuves de toute la Russie, ce qui représente moins de 30% du nombre moyen de voitures neuves vendues par mois en 2018 .
  3. Le site ne dispose pas d'une estimation du coût d'une voiture par rapport au marché en fonction de la configuration et supplémentaire. c'est-à-dire qu'il est impossible de comprendre quelles offres sont les plus rentables.

Pour les tableaux d'affichage auto.ru, drom.ru et avito.ru, la faille n ° 2 est pertinente à des degrés divers et la n ° 3 est entièrement applicable à tout le monde.

Ainsi, un cercle de tâches fondamentales que j'ai dû résoudre dans le processus de développement du service a été tracé.

Collecte de données


Les données sur les voitures neuves des concessionnaires officiels sont collectées auprès de diverses sources, traitées, systématisées et unifiées. Les données sont mises à jour et de nouvelles sources sont ajoutées régulièrement. Le volume de données est d'environ 75 000 voitures neuves provenant de plus de 650 concessionnaires de plus de 70 villes de Russie.

Le processus de collecte et de traitement des données dépasse le cadre de cet article et peut être couvert dans l'un des articles suivants.

Transformation des données et construction de modèles


Pour rechercher individuellement des voitures rentables pour chaque modèle de voiture, un modèle de régression prédictif a été formé, dont la variable cible était le prix de la voiture, et des prédicteurs ont été formés à partir des données de base de la voiture, de l'équipement et des modules complémentaires installés. les options. Les paramètres avec plusieurs valeurs non numériques étaient représentés dans le modèle comme une variable fictive n-1.

Pour plus de clarté, l'ensemble de régresseurs pour le Volkswagen Tiguan a la forme:

Plus de détails
[1] "prix"
[2] "disponibilité"
[3] "année"
[4] "volume"
[5] "pouvoir"
[6] "front_drive"
[7] "Rear_drive"
[8] "mkpp"
[9] benzine
[10] "dizel"
[11] "body_tsvet_kuzova_chernyy_metallik"
[12] "interior_tsvet_peredney_paneli_temnyy"
[13] "interior_tsvet_obivki_sideniy_temnyy"
[14] "interior_tsvet_potolka_temnyy"
[15] "interior_tsvet_kovrovogo_pokrytiya_temnyy"
[16] "equip_dnevnoy_svet"
[17] "equip_avtokorrektor_far_s_dinamicheskim_povorotnym_svetom"
[18] "equip_paket_innovation"
[19] "equip_fary_svetodiodnye"
[20] "equip_omyvatel_far"
[21] "equip_bortovoy_kompyuter"
[22] "safety_avtomaticheskaya_regulirovka_dalnosti_sveta"
[23] "body_tsvet_kuzova_siniy_metallik"
[24] "body_tsvet_kuzova_serebristyy_metallik"
[25] "equip_sistema_avtomaticheskoy_parkovki"
[26] "equip_tekhnicheskiy_kod"
[27] "equip_paket_media"
[28] "equip_usb_interfeysvklyuchaya_auxin"
[29] "equip_interfeys_appconnect"
[30] "equip_paket_zimnie_tekhnologii"
[31] "equip_multimediynaya_sistema_audio"
[32] "equip_parktronik"
[33] safety_videokamera
[34] "main_komplektatsiya_city_20_tdi_150hp_7dsg_4motion"
[35] "body_shiny_21565_r17_99_v"
[36] "body_razmer_diskov_r17"
[37] "body_diski_legkosplavnye"
[38] "interior_tip_sideniy_sportivnye"
[39] "interior_obivka_sideniy_kozha"
[40] "equip_distantsionnoe_otkryvanie_bagazhnika"
[41] "equip_zapusk_bez_povorota_klyucha"
[42] "equip_dostup_bez_klyucha"
[43] "equip_interfeys_dlya_smartfonov_appconnect"
[44] "equip_kruizkontrol"
[45] "equip_pamyat_nastroek"
[46] "equip_dopolnitelnyy_otopitel"
[47] "safety_sistema_kontrolya_mertvykh_zon"
[48] ​​"equip_sidenya_ergoactive_dlya_voditelya_s_14pozitsionnoy_regulirovkoy"
[49] "equip_elektroprivod_zerkal"
[50] "equip_paket_tekhnika"
[51] "safety_datchiki_davleniya_v_shinakh"
[52] "safety_okhrannaya_signalizatsiya"
[53] "body_tsvet_kuzova_belyy"
[54] "equip_spetsialnaya_seriya_city"
[55] "main_komplektatsiya_city_14_tsi_150hp_6dsg_4motion"
[56] "equip_panoramnaya_krysha"
[57] "body_bamper_s_uvelichennym_uglom_vezda_24_gradusa"
[58] "body_paket_offroad"
[59] "body_nakladki_na_dvernye_porogi"
[60] "interior_nakladki_na_dvernye_porogi"
[61] "main_komplektatsiya_city_20_tsi_180hp_7dsg_4motion"
[62] "body_shiny_23550_r19_99v"
[63] "body_razmer_diskov_r19"
[64] "interior_dvernye_paneli_skozhanoy_otdelkoy"
[65] "equip_elektroprivod_sideniy"
[66] "main_komplektatsiya_city_14_tsi_150hp_6dsg"
[67] "equip_vybor_rezhimov_vozhdeniya"
[68] "interior_yashchik_dlya_khraneniya_pod_perednim_passazhirskim_kreslom"
[69] "interior_ergonomichnye_perednie_sidenya"
[70] "equip_voditelskoe_sidene_s_regulirovkoy_po_vysote_dline_uglu_naklona_spinki"
[71] "equip_massazhnye_sideniya"
[72] "body_tsvet_kuzova_bezhevyy_metallik"
[73] "body_tsvet_kuzova_krasnyy_metallik"
[74] "body_shiny_23555_r18_100v"
[75] "body_razmer_diskov_r18"
[76] "interior_nakladki_na_porogi_s_podsvetkoy"
[77] "interior_dekorativnye_vstavki_dark_grid"
[78] "interior_dve_lampy_dlya_chteniya_speredi"
[79] "equip_paket_osveshchenie"
[80] "equip_fonovaya_podsvetka_interera"
[81] "equip_svetodiodnye_zadnie_fonari_3d"
[82] "main_komplektatsiya_offroad_20_tsi_180hp_7dsg_4motion"
[83] "body_korpusa_naruzhnykh_zerkal_okrashennye_v_chernyy_tsvet"
[84] "body_polnorazmernoe_stalnoe_zapasnoe_koleso_65x17"
[85] "body_peredniy_bamper_s_uvelichennym_uglom_vezda_26_gradusov_zadniy_bamper_s_dekorativnymi_vstavkami_dekorativnye_nakladki_na_dveri"
[86] "body_spoyler_na_zadney_dveri"
[87] "interior_dekorativnye_vstavki_dlya_spetsialnoy_versii"
[88] "interior_peredniy_podlokotnik_s_dvumya_podstakannikami_i_shtorkoy"
[89] "interior_ploskiy_pol_bagazhnogo_otdeleniy"
[90] "interior_yashchiki_dlya_khraneniya_pod_perednimi_kreslami"
[91] "interior_skladnye_stoliki_v_spinkakh_perednikh_kresel"
[92] "interior_alyuminievye_nakladki_na_pedali"
[93] "interior_rezinovye_salonnye_kovriki_speredi_i_szadi_s_logotipom_offroad"
[94] "interior_nakladki_na_dvernye_porogi_offroad"
[95] "interior_stekla_atermalnye_tonirovannye"
[96] "equip_datchik_sveta"
[97] "equip_spetsialnaya_versiya_offroad"
[98] "equip_klavishi_mekhanicheskoy_razblokirovki_spinok_zadnikh_sideniy_v_bagazhnom_otseke"
[99] "equip_vnutrennee_zerkalo_zadnego_vida_s_avtozatemneniem"
[100] "equip_poyasnichnyy_podpor_dlya_perednikh_sideniy"
[101] "equip_polnostyu_skladnaya_spinka_perednego_passazhirskogo_kresla"
[102] "equip_avtokorrektor_far"
[103] "equip_funktsiya_coming_homeleaving_home"
[104] "equip_2_usb_razema_v_peredney_konsoli_1_usb_razem_v_tsentralnoy_konsoli_dlya_zaryadki"
[105] "equip_datchik_dozhdya"
[106] "equip_obogrev_lobovogo_stekla"
[107] "safety_hdc_sistema_pomoshchi_pri_spuske_so_sklona"
[108] "body_tsvet_kuzova_korichnevyy_metallik"
[109] "equip_navigatsionnaya_sistema"
[110] "equip_paket_navigatsiya"
[111] "equip_golosovoe_upravlenie"
[112] "equip_usb_interfeys_ipodiphonevklyuchaya_auxin"
[113] "equip_multimediynaya_sistema_audiovideo"
[114] "main_komplektatsiya_sportline_20_tsi_220hp_7dsg_4motion"
[115] "body_paket_vneshnikh_elementov_sportline"
[116] "body_shiny_airstop_25545_r_19"
[117] "body_bampery_v_sportivnom_stile_i_nakladki_na_porogi_v_tsvet_kuzova_rasshiriteli_kolesnykh_arok"
[118] "equip_individualnaya_sborka"
[119] "equip_rulevoe_upravlenie_s_peremennym_peredatochnym_otnosheniem"
[120] "equip_multifunktsionalnyy_rul"
[121] "interior_dvernye_paneli_s_kozhanoy_otdelkoy"
[122] "main_komplektatsiya_offroad_14_tsi_150hp_6dsg_4motion"
[123] "equip_zerkalo_zadnego_vida_s_avtozatemneniem"
[124] "equip_tsentralnyy_zamok"
[125] "main_komplektatsiya_sportline_20_tsi_180hp_7dsg_4motion"
[126] "safety_podushki_bezopasnosti_sht_11"
[127] "safety_paket_bezopasnost"
[128] "safety_proaktivnaya_sistema_zashchity_passazhirov_presafe"
[129] "interior_otdelka_dverey"
[130] "main_komplektatsiya_sportline_20_tdi_150hp_7dsg_4motion"
[131] "main_komplektatsiya_offroad_14_tsi_150hp_6mt_4motion"
[132] "main_komplektatsiya_offroad_20_tdi_150hp_7dsg_4motion"
[133] "interior_salonnye_kovriki_speredi_i_szadi"
[134] "interior_tsvet_obivki_sideniy_kombinirovannyy"
[135] "equip_paket_discover_pro"
[136] "interior_paket_khranenie"
[137] "interior_makiyazhnye_zerkala_s_podsvetkoy_v_solntsezashchitnykh_kozyrkakh"
[138] "interior_bagazhnaya_setka"
[139] "interior_potolochnaya_konsol_s_otsekami_dlya_khraneniya"
[140] "body_tsvet_kuzova_belyy_metallik"
[141] "body_pritsepnoe_ustroystvo"
[142] "equip_obogrev_zerkal"
[143] "interior_obivka_sideniy_velyur"
[144] "body_tsvet_kuzova_seryy"
[145] "body_standartnyy_bamper_s_khromirovannoy_otdelkoy"
[146] "interior_khromirovannaya_otdelka_elementov_interera"
[147] "equip_paket_style"
[148] "equip_paket_premium"
[149] "equip_generator_180a"

Pour construire les modèles de régression dans la première version, j'ai utilisé l'algorithme Random Forest qui fonctionnait bien pour les voitures d'occasion ( II ).

#    library(reshape2) library(caret) library(randomForest) new_cars_data <- read.csv('new_cars_data_tiguan.txt') #    R new_cars_data_cor <- as.matrix(cor(new_cars_data)) #     new_cars_data_cor [lower.tri(CM, diag = TRUE)] <- NA #  NA      high_cor_vars <- subset(melt(new_cars_data_cor , na.rm = TRUE), value == 1.0) #       #          if(length(high_cor_vars[,2])) { dataset <- new_cars_data[(-c(high_cor_vars[,2]))] } else { dataset <- new_cars_data } set.seed(1) #     ( ) split <- runif(dim(dataset)[1]) > 0.2 #    train <- dataset[split,] #      (cross-validation)  test <- dataset[!split,] #  (hold-out)  

Pour la validation croisée, j'ai utilisé le package caret , qui offre un grand nombre de possibilités pour évaluer la qualité du modèle.

 fit.control <- trainControl(method = "repeatedcv", number = 10, repeats = 10) train.rf.model <- train(price~., data=train, method="rf", trControl=fit.control , metric = "RMSE") #  10-  10-  -    train.rf.model #    - 

Plus de détails
Forêt aléatoire

1858 échantillons
Prédicteur 111

Pas de prétraitement
Rééchantillonnage: validation croisée (10 fois, répétée 10 fois)
Résumé des tailles d'échantillon: 1673, 1672, 1672, 1672, 1671, 1673, ...
Rééchantillonnage des résultats sur les paramètres de réglage:

mtry rms rsquared
2 132963,50 0,7264413
56 79757,67 0,8626671
111 80 401,10 0,8605166

RMSE a été utilisé pour sélectionner le modèle optimal en utilisant la plus petite valeur.
La valeur finale utilisée pour le modèle était mtry = 56.

La valeur obtenue du coefficient de détermination ( Rsquared ) signifie que la variable dépendante (prix) est très bien expliquée par le modèle considéré.

 train.rf.model <- randomForest(price ~ ., train,mtry=56) #        -  varImpPlot(train.rf.model) #   30    



 rf.model.predictions <- predict(train.rf.model, test) #       print(sqrt(sum((as.vector(rf.model.predictions - test$price))^2)/length(rf.model.predictions))) #     ( ) [1] 82512.59 

Test d'algorithme


Nous vérifierons quels avantages réels peuvent être attendus grâce à l'algorithme développé.

 rf.model <- randomForest(price ~ ., dataset,mtry=56) predicted.price <- predict(rf.model, dataset) real.price <- dataset$price profit <- predicted.price - real.price 

Nous traçons le gain en fonction du prix.

 plot(real.price,profit) abline(0,0) 



Calculez l'avantage en pourcentage.

 sorted <- sort(predicted.price /real.price, decreasing = TRUE) sorted[1:8] 195 193 6 207 202 203 906 206 1.184079 1.176262 1.132920 1.126626 1.123967 1.123967 1.116736 1.116344 

Compte tenu du fait que l'avantage est calculé selon les informations a priori du concessionnaire, et lors d'une réunion personnelle, vous pouvez toujours négocier, le bénéfice maximum de 18% est un très bon résultat.

Implémentation de service Web


Une fois que vous avez trié la partie technique, il est temps de commencer à rechercher la voiture qui vous intéresse.

Par exemple, je regarde de près le Volkswagen Tiguan en choisissant City 2.0 TSI 180hp 7DSG 4Motio .









En utilisant le service, vous saurez quels concessionnaires il est raisonnable d'appeler en premier lieu, spécifiez la disponibilité de la voiture, le prix, les conditions et la visite pour inspection, et achat potentiel.

En fin de compte


J'ai donc mis en place un assistant pour sélectionner une nouvelle voiture chez un concessionnaire agréé au meilleur prix du marché, en tenant compte de tous les add-ons établis. les options.
J'attire votre attention sur le fait que le prix bas d'une voiture peut être fourni par le concessionnaire sous certaines conditions (crédit, coque, échange, etc.), ce qui introduit en général une erreur dans l'appréciation des prestations. À mon avis, dans le but d'une bonne remise, il est rationnel de profiter de certains des services similaires imposés par le concessionnaire, que ce soit CASCO avec un partenaire ou, par exemple, un prêt que vous remboursez à la première occasion. Il s'agit d'un problème purement individuel, mais dans tous les cas, il est conseillé, afin d'éviter tout malentendu, de clarifier les conditions par téléphone avant de visiter le salon.

L'heure de sortie du service n'a pas été choisie par hasard, car la fin de l'année est le meilleur moment pour acheter une nouvelle voiture lorsque les concessionnaires sont prêts à offrir les remises les plus importantes.
Pour le moment, le service est en version bêta et est absolument gratuit.

Au fur et à mesure que les statistiques s'accumulent, de nouvelles analyses et infographies apparaîtront sur le service, qui intéresseront à la fois les consommateurs finaux et les revendeurs officiels, mais j'en parlerai dans le prochain article.

Les références


Choix pour Volkswagen Tiguan

Source: https://habr.com/ru/post/fr430336/


All Articles