Vergleichende Analyse der Gebrauchtmärkte Deutsche und französische Autos im B- und C-Segment

Hallo Habr!

In diesem Beitrag wollte ich die Erfahrungen mit der Verwendung mehrerer Python-Tools zur vergleichenden Analyse des Gebrauchtwagenmarktes in Europa am Beispiel Deutschlands und Frankreichs teilen.

Bild

Aus Sicht der Umsetzung wird alles ganz vanillig sein. Der Zoo der verwendeten Technologien ist etwas überflüssig, weil es ein Selbstzweck war - ich wollte es testen.

Hintergrund. Der Gedanke, eine solche Analyse durchzuführen, besuchte mich einmal, als ich eine Website mit französischen Anzeigen durchblätterte. Ich hatte eindeutig das Gefühl, dass der Citroën C3 ein extrem schlechtes Auto ist, das um 20 Prozent pro Jahr abwertet, aber der Opel Corsa ist fast unsterblich, so dass sich sein Preis nicht mit dem Alter ändert (oder er wird so gut steigen Rolex). Es war eine lustige Beobachtung, da die Deutschen Corsa als Erwachsenen als Zeichen eines Fiaskos bei der professionellen Umsetzung betrachteten. Und selbst es gab Witze darüber, dass sich in 10 Jahren jedes Auto in einen Opel verwandelt. In Abwesenheit des Westdeutschen Trabant wurde die Rolle von Zaporozhets in der deutschen Folklore von dieser besonderen Marke übernommen. Soweit ich weiß, ist der C3 in Russland nicht besonders vertreten, aber es ist nützlich zu wissen, dass er der geistige Erbe des klassischen 2CV aus dem Titelbild ist, dem legendären Auto, das das Internet einige Jahre lang verpasst hat (in Produktion vor 1989) und dem Fahrer erstaunliche neun PS bot.

Also, mach dich an die Arbeit. Um Statistiken zu erhalten, benötigen Sie eine Quelle mit einer ausreichenden Stichprobe. In Deutschland ist diese autoscout24.de in Frankreich die beste, die mir bei der Anzahl der Anzeigen begegnet ist - www.lacentrale.fr (die französische Version von Scout existiert, ist aber weniger beliebt).

Wir werden nach der B-Klasse als die beliebteste auswählen und in der die erste Frage auftauchte (mit einem kleinen Einstieg in die C-Klasse). Um Daten zu sammeln, wählen wir diejenigen Modelle aus, für die Daten der letzten 10 Jahre vorliegen und für die auf beiden Websites mindestens 1000 Anzeigen geschaltet sind. Andernfalls ist die Probe sehr verrauscht.

Wenn Sie eine Datenerfassung für eine gesunde Person wünschen, bietet autoscout eine RESTful-API, wenn Sie sich registrieren und einen Schlüssel erhalten.

Natürlich habe ich das nicht getan und angefangen, den Raucher abzubauen - frontal über einen kopflosen Browser.

Smoker Mining sah so aus - basierend auf den gewünschten Filtern (die unten beschrieben werden) bilden wir eine Abfragezeichenfolge und übergeben sie als Adresse an den kopflosen PhantomJS- Browser (seit ich sie installiert habe, wurde sie aus irgendeinem Grund ausgesetzt).

Aus dem zu diesem Zeitpunkt nicht offensichtlichen Grund habe ich die Erwartung hinzugefügt, ein Element mit einer Merkmalsklasse zu laden, die Daten zur Anzahl der Optionen für die entsprechende Anforderung enthielt.

with io.open("dump.html", "w", encoding="utf-8") as f: f.write(html) try: element = WebDriverWait(browser, 20).until( EC.presence_of_element_located((By.CLASS_NAME, "cl-filters-summary-counter")) ) # wait until element with summry statistics is present or drop after 20 sec 

Das im Browser generierte HTML wird dem BeautifulSoup-Parser zugeführt, und wir suchen darin nach einem Element, das die Abbildung der gefundenen Ergebnisse enthält.

 value = bsObj.findAll("span", {"class": "cl-filters-summary-counter"})[0].text value = value.replace(u'\xa0', u' ') # removes delimeter if results exceed 1000 

Wie Sie sich vorstellen können, enthielt die generierte Anfrage das Modell, einen kleinen Preis und eine kleine Altersspanne, dh es gab viele Anfragen, wobei die Anzahl der Anfragen über 500 vom Server unterbrochen wurde. Wenn Sie das Problem auf wunderbare Weise lösen möchten, ist es besser, über Proxys, die unterwegs geändert werden, auf solche Dienste zuzugreifen (und wenn Sie einen API-Schlüssel haben, müssen Sie dies nicht tun). Auf Habré gibt es einen intelligenten Artikel darüber, wie man über einen Proxy arbeitet. Ich habe das Problem Low-Tech gelöst - der Preis folgt einem linearen Gesetz mit dem Alter, also habe ich den Umfang dieser Zeile berechnet und die Anfragen auf nur + .- 30-50 Prozent des linearen Preises beschränkt und zwischen den Anfragen 10 Sekunden Pause eingelegt. Das war genug, um nicht verboten zu werden. Das Sammeln von Daten für ein Modell dauerte ungefähr eine halbe Stunde, um in der Konsole lautlos zu blinken.

Ein paar Worte zu den Filtern. Um eine informative Auswahl zu erhalten, habe ich die folgenden Filter angewendet:

  • Alle Autos sind in 4-5-türigen Konfigurationen erhältlich (Kors, Klio und einige der vorgestellten Modelle haben günstigere 3-Türer-Optionen).
  • Alle Autos sind mit 4-5 Sitzen besetzt - dies ist eine andere Funktion als die vorherige, da Clio, C3 und 308 eine Société (Entreprise) -Version haben und es einige auf dem Markt gibt - dies sind Servicewagen aller Elektriker und Monteure, es gibt eine Box anstelle des Rücksitzes für Junk, und sie kosten weniger um ein paar Kiloeuvres ceteris paribus.
  • Die Motorleistung ist auf 129 PS begrenzt. Denn weiter in diesem Segment beginnen kostenpflichtige Versionen und die Preise dort entsprechen überhaupt nicht ihrem bescheidenen Status. Wenn Sie die Achtung wiederholen, verbraucht ein Autoscout in der Adresse Leistung nicht in PS, sondern in Kilowatt.

Motoren und Getriebe sind nicht spezialisiert, aber zu 99% Mechaniker, und im Falle Frankreichs gibt es dort viel Diesel, einfach weil er dort 10 Jahre vor dem Dieseltor beworben wurde. Und jetzt wollen sie alle mit ihm verpflanzen, aus dem Leidwesen über die Unbeständigkeit der Regierungsmoral, die die Franzosen seit zwei Wochen ihren zweitbeliebtesten nationalen Freizeitbeschäftigungen nachgehen - dem Streik und der Brandstiftung von Autos.

Die Daten werden gesammelt und modellweise in Tabellen in Excel-Dateien angeordnet (welche Daten ohne Excel, was sind Sie! Danke openpyxl - für die Bequemlichkeit des Verschiebens). Zur Visualisierung werden alle Daten aller Modelle in einer CSV-Datei zusammengefasst.

Zur Visualisierung wollte ich eine einfache Weboberfläche einreichen. Grundsätzlich benötigt die aktuelle Version kein Backend. Es gibt wenig Daten, die Verarbeitung ist rudimentär, Sie können alles mit einem langen JSON zusammen mit den Grafiken sichern und auf der Clientseite verarbeiten. Aber ich wollte den Server mit einem Auge testen, um ihn später für Aufgaben mit nicht so trivialen Berechnungen zu verwenden. Und ich weiß nicht, wie man JS benutzt, also müsste ich mich mit der Client-Seite quälen, und der Server kann auch auf Python gemountet werden, da es Tools gibt.

Um den Server zu implementieren, wurde ich zwischen dem Bokeh, an dem ich zuvor herumgebastelt hatte, und dem Plotly + Dash-Bundle gequält. Bei einigen früheren Aufgaben war ich sehr zufrieden mit Bokeh, insbesondere weil es in ein Jupyter-Notizbuch eingebettet werden kann (mit Jupyter Labs ist es nicht so einfach) und weil es recht einfach ist, interaktive Komponenten in Notizbüchern zu organisieren, ohne den Bokeh-Server zu starten (). Bokeh ist das Tor zur Welt von d3.js für diejenigen, die nicht wissen, wie man JS benutzt.

Für diese Aufgabe habe ich mich für das Plotly + Dash-Bundle entschieden (letzteres ist das Tor zur React-Welt für diejenigen, die nicht wissen, wie man JS verwendet). Die Wahl ist eher zu versuchen. Wie Sie dem Vergleich entnehmen können, ist der Unterschied nicht grundlegend

Wir fahren mit der Implementierung der Schnittstelle fort.

Wir rufen unsere CSV auf und schieben sie über ein paar Datenrahmen.

Um die Seite richtig zu gestalten und ein responsives Design zu verwenden, aktivieren wir lokales CSS.

 app = dash.Dash(__name__, static_folder='assets') # resource folder app.scripts.config.serve_locally = True app.css.config.serve_locally = True 

Als Nächstes erstellen wir das einfachste Layout mit einer Tabelle mit zwei Spalten, 6 von 12 Standard für adaptive Layouts.

 app.layout = html.Div([ # include custom local css to allow two-column responsive html.Link(href='/assets/twocolumns_dash.css', rel='stylesheet'), html.Div([ # row div html.Div([ # column div html.H3('Average'), dcc.Graph(id='market-app', ), html.H4('Select model'), dcc.Dropdown(id='model_pick', options=model_options, value=None, multi=True) ], className="six columns"), html.Div([ # column div html.H3('Distribution'), dcc.Graph(id='market-app2', ), html.H4('Select year'), dcc.Slider( id='year-slider', min=years.min(), max=years.max(), value=years.min(), step=None, marks={str(year): str(year) for year in years} ) ], className="six columns"), ], className="row") ]) 

Die Steuerelemente der Funktionen sind sehr unprätentiös implementiert - es kann viele Eingaben und nur einen Ausweg geben (das linke Diagramm akzeptiert beispielsweise Daten aus dem Dropdown-Menü und aus dem Jahresregler, aber nur ein Element kann aktualisiert werden. Dies ist eine Dash-Funktion. Krücken werden benötigt, um sie zu umgehen).

 @app.callback(Output('market-app2', 'figure'), [Input('model_pick', 'value'), Input('year-slider', 'value')]) def update_figure_dist(selected_models, year_picked): traces = [] for model in selected_models: traces.append(go.Bar( x=df_filtered.loc[model, year_picked, :].index.values.tolist(), y=df_filtered.loc[model, year_picked, :]['results'].values.tolist(), name=model )) return { 'data': traces, 'layout': go.Layout( xaxis={'title': 'price'}, yaxis={'title': 'offers'}, hovermode='closest', legend=dict(orientation="h", xanchor="center", y=1.2, x=0.5) ) } 

Bereit Schnittstelle - http://eu-carmarket.herokuapp.com/

Für deutsche Daten steht in Klammern (DE) für Frankreich (FR).

Links sehen wir die Preise für den gesamten Zeitraum gemittelt über jedes Jahr. Im Folgenden alle Preise in Euro gemäß den Regeln für die Veröffentlichung auf Websites - die Preise enthalten die gesetzliche Mehrwertsteuer. Rechts ist die Verteilung der Angebote nach Preis im ausgewählten Jahr. Die Verteilung war für viele Modelle verrauscht, daher wird sie beim Erstellen über die nächsten Nachbarn mit einem Kern aus 5 Elementen geglättet (wenn ich mir das nur ansehe, habe ich beschlossen, keine Modelle mit weniger als 1000 Anzeigen zu verwenden).

Was sehen wir also in den Daten?

Beantwortung einer Frage, die die Studie motiviert hat - nein, der Citroen wertet im Vergleich zum zeitlosen Corsa nicht mit schrecklicher Geschwindigkeit ab.

Bild

Der starke Preisunterschied im Jahr 2017 ist nicht die primäre starke Abwertung der Citroens im ersten Jahr. Dies ist tatsächlich ihr Preisanstieg mit dem Übergang zu einer neuen Generation. Anstatt den alten 2CV Citroen zu homologieren, ähneln sie eher einem Analogon des Mini mit modischem Fadenkreuz für den Crossover - stilvolle, modische Jugend.

Wenn Sie ein Modell nehmen, ist der Unterschied auf dem deutschen und dem französischen Markt schockierend, da er weder in Bezug auf die Werte noch in Bezug auf die Abschreibungsrate existiert (obwohl ein nicht zerstörtes Auto, das in Frankreich älter als 2 Jahre ist, nur gefunden wird, wenn es mit einer verschlossenen Garage gelagert wird).

Bild

Bild

Bild

Wenn Sie den Markt nehmen, der bei russischen IT-Mitarbeitern für den Umzug nach Holland beliebt ist, müssen Sie 20 Prozent des deutschen Preises zahlen. Trotz der Tatsache, dass es keine Zollgrenzen zwischen Ländern in Europa gibt, funktioniert es nicht, nur ein gekauftes Auto zu transportieren, wenn es nicht als persönliche Dinge gilt, die sich bewegen von dir. Dazu müssen Sie länger als sechs Monate im vorherigen Land leben. Andernfalls werden Ihnen alle beabsichtigten Vorteile entzogen, wenn Sie versuchen, das Auto bei der Registrierung zu registrieren.

Wenn Sie die Modelle in einem großen Stapel vergleichen, können Sie einige interessante Beobachtungen sehen. Nach 10 Jahren konvergiert alles auf ungefähr einen Punkt, obwohl die Abwertung von Peugeot, Mazda oder Seat stärker ist als die von Volkswagen Polo, Opel Meriva oder Skoda Fabia. Also ja, nach 10 Jahren wird jedes Auto zu Opel, aber nicht zu Corsa, nur Favoriten wie C3 werden zu Corsa.

Bild

Die Abschreibungsrate hängt nicht wesentlich vom Modell ab. Und vom Land. Kleine Abweichungen von der universellen linearen Gleichmäßigkeit (z. B. Renault Megane)
im Jahr 2016, Ford Fiesta im Jahr 2017) ist einfach ein Wechsel der Modellgeneration.

Bild

Bild

Da die Abschreibung in diesem Fall kein physikalisches Konzept ist, bedeutet dies nicht, dass sich die Autos in demselben Zustand befinden. Auf Französisch wird es faltige Seiten, Schürfwunden, abgebrochene Stoßstangen, an Klebeband gebundene Spiegel und ein Vermächtnis von Tausenden von Kilometern Entfernung mit einem Spiel der Kontrolleure geben. Die Franzosen sind jedoch davon überzeugt, dass der Grad der Abschreibung der gleiche ist wie der der Deutschen, und zahlen entsprechend ihrer Überzeugung. Aber um die Deutschen zum Kauf von Gebrauchtwagen zu überreden ein Auto aus den fürsorglichen Händen französischer Fahrer und Mechaniker - werden sie lügen?

In Bezug auf die Preise im Vergleich zu Russland. Es gibt ein Problem mit der Tatsache, dass viele der beschriebenen Modelle nicht in Russland verkauft werden. Von den wenigen Gemeinsamkeiten für beide Märkte finden Sie den neuen Polo auf der Volkswagen Website (obwohl es sich in Russland um eine Limousine und in Europa um ein Fließheck handelt). In Russland kostet es ab 8300 neu, in Deutschland ab 13500 neu und für 8300 2012 (im Off-Table des genannten Holland - 16200 neu). Ein guter Vergleich kann überall vertreten werden Kia Rio: Russland - 9000, Deutschland - 11950 (offensichtliches Dumping gegen deutschen Autopatriotismus), Frankreich - 13700, Holland - 19950 (Ja-ja, eineinhalb Lamas für eine Kirusha zum Preis von Volkswagen Tiguan / Hyundai Tussan / Nissan X. -trail: umarmen, weinen und daran denken, wie man das Fahrrad tritt).

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


All Articles