中古市場の比較分析 BおよびCセグメントのドイツ車およびフランス車

こんにちは、Habr!



この投稿では、ドイツとフランスの例を使用してヨーロッパの中古車の市場を比較分析するために、いくつかのpythonツールを使用した経験を共有したかったのです。



画像



実装の観点から見ると、すべてが非常にバニラになります。 使用された技術の動物園は、それ自体が目的であったため、いくぶん冗長です-私はそれをテストしたかったのです。



バックグラウンド。 このような分析を行うというアイデアは、フランスの広告のサイトをめくっていたときに一度訪れました。 シトロエンC3は非常に貧弱な車で、年に20%減価するという印象がありましたが、オペルコルサはほぼ不変であるため、価格は年齢に応じて変化しません(または良い値に上昇します)ロレックス)。 ドイツ人が成人のコルサを職業的実施における大失敗の兆候であると見なしたことを考えると、それは面白い観察でした。 そして、10年でどんな車もオペルに変わるという事実についてのジョークさえありました。 西ドイツ人トラバントの不在下で、ドイツの民間伝承におけるザポロジェトの役割は、この特定のブランドによって実行されました。 私が知る限り、C3はロシアでは特に代表されていませんが、タイトル写真からの古典的な2CVの精神的な相続人であることを知っていると便利です。



だから、ビジネスに取り掛かる。 統計を取得するには、十分なサンプルのソースが必要です。 ドイツでは、このフランスのautoscout24.deが多くの発表で出会った中で最高です-www.lacentrale.fr (スカウトのフランス語版は存在しますが、あまり人気がありません)。



最も人気のあるものとしてBクラスに従って選択し、最初の質問が発生したものを選択します(Cクラスへの小さなエントリがあります)。 データを収集するために、過去10年間のデータがあり、両方のサイトに少なくとも1000の広告があるモデルを選択します。 そうしないと、サンプルのノイズが非常に大きくなります。



健康な人のデータマイニングを取得したい場合-登録してキーを取得すると、autoscoutはRESTful APIを提供します。



もちろん、私はこれを行わず、喫煙者の採掘を始めました-ヘッドレスブラウザから真正面から。



喫煙者のマイニングは次のようになりました-目的のフィルター(後述)に基づいて、クエリ文字列を作成し、アドレスとしてPhantomJSヘッドレスブラウザーに転送します(インストールしたため、何らかの理由で中断されています)。



この段階での非自明性から-対応するリクエストのオプションの数に関するデータを含む特性クラスを持つ要素をロードするという期待を追加しました。



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
      
      





ブラウザーで生成されたhtmlはBeautifulSoupパーサーに送られ、見つかった結果の図を含む要素を探します。



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





ご想像のとおり、生成されたリクエストには、モデル、小さな価格、年齢の範囲が含まれていました。つまり、リクエストが多数あり、500を超えるリクエストがサーバーで接続を切断しました。 問題を美しく解決したい場合は、途中で変更されたプロキシを介してそのようなサービスにアクセスする方が適切です(APIキーをお持ちの場合は必要ありません)。 Habréには、プロキシを介した作業方法に関するスマートな記事があります。 ローテクの問題を解決しました-価格は年齢とともに線形法則に従うため、このラインの範囲を把握し、リクエストを線形価格の+ .- 30-50%に制限し、リクエスト間に10秒の休止を入力しました。 それは禁止されないために十分でした。 1つのモデルのデータを収集するには、コンソールで約30分静かに点滅していました。



フィルターに関するいくつかの言葉。 有益な選択を得るために、次のフィルターを適用しました。





エンジンとギアボックスは特化されていませんが、99%は整備士であり、フランスの場合、ディーゼルゲートの10年前に推進されたという理由だけで、そこには多くのディーゼルがあります。 そして今、彼らは、政府の道徳のそのような気まぐれさに対する悔しさから、2週間目のフランス人が2つの愛される国民の娯楽にふける-車のストライクと放火から、彼と一緒にみんなを移植したい。



データが収集され、モデルごとにExcelファイルにレイアウトされます(Excelなしでどのようなデータが得られるのか、あなたは何ですか! 視覚化のために、すべてのモデルのすべてのデータが1つのCSVファイルにまとめられています。



視覚化のために、単純なWebインターフェースを作成したかったのです。 原則として、現在のバージョンはバックエンドを必要としません。 少しのデータ、処理は初歩的であり、グラフィックスとともに長いJSONですべてをダンプし、クライアント側で処理できます。 しかし、私はサーバーをテストして、後ほど簡単でない計算でタスクに使用したいと考えました。 また、JSの使用方法がわからないので、クライアント側で苦労しなければなりません。また、ツールがあるため、サーバーをpythonにマウントすることもできます。



サーバーを実装するために、前にいじくり回したボケとPlotly + Dashバンドルの間で苦しめられました。 過去の多くのタスクでは、特にJupyter Notebookに埋め込むことができるため(Jupyter Labsではそれほど単純ではありません)、bokehサーバーを起動せずにノートブック内のインタラクティブコンポーネントを非常に簡単に整理できるため、bokehに非常に満足していました()。 Bokehは、JSの使用方法を知らない人にとってのd3.jsの世界への入り口です。



このタスクでは、Plotly + Dashバンドルを使用することにしました(後者は、JSの使用方法がわからない人のためのReactワールドへのゲートウェイです)。 選択する可能性が高くなります。 比較からわかるように、違いは根本的なものではありません



インターフェースの実装に進みます。



CSVをプルアップして、データフレームのペアにプッシュします。



ページのスタイルを適切に設定し、レスポンシブデザインを使用するために、ローカルCSSを有効にします。



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





次に、アダプティブレイアウトの12の標準のうち6つの2つの列の1つのテーブルを使用して、最も単純なレイアウトを作成します。



 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") ])
      
      





コントロールは、機能の非常に気取らずに実装されています-多くの入力があり、片道しかありません(たとえば、左のグラフはドロップダウンメニューと年スライダーからデータを受け入れますが、更新できるのは1つの要素のみです、これはダッシュ機能であり、バイパスするには松葉杖が必要です)



 @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) ) }
      
      





準備ができたインターフェイス-http://eu-carmarket.herokuapp.com/



括弧内のドイツのデータは、フランス(FR)の場合(DE)です。



左側には、各年の平均期間全体の価格が表示されます。 以下、サイトへの掲載ルールに従って、ユーロでのすべての価格-価格にはVATが含まれます。 右側は、選択した年の価格によるオファーの分布です。 分布は多くのモデルでノイズが多かったため、構築時に5つの要素のコアを持つ最も近い近隣で平滑化されました(広告を1000個未満しないモデルを採用しないことにしました)



それでは、データには何が見えますか?



研究の動機付けとなった質問に答える-いいえ、シトロエンは時代を超越したコルサと比較してひどいスピードで減価しません。



画像



2017年の急激な価格差は、初年度のシトロエンの主な強力な減価ではありません。 これは実際、新世代への移行に伴う価格の上昇です。 今では、古い2CVシトロエンを認証する代わりに、それらはMiniの類似物に似ており、クロスオーバー用のファッショナブルな十字線-スタイリッシュでファッショナブルな若者を持っています。



あるモデルをとると、ドイツの市場とフランスの市場の違いは、価値も減価償却率も存在しないため、衝撃的です(ただし、フランスで2歳以上の破損していない車は、ロックされたガレージに保管されている場合にのみ見つかります)。



画像



画像



画像



オランダを引っ越すためにロシアのIT関係者に人気のある市場を利用する場合、ドイツの価格に20%を支払う必要があります。ヨーロッパの国々の間には税関の国境はありませんが、購入した車をそのように移動することはできません。あなたによって。 これには、6か月以上前の国に住んでいる必要があります。 それ以外の場合、車を登録しようとすると、意図したすべての特典が削除されます。



大きな山のモデルを比較すると、いくつかの興味深い観察結果を見ることができます。 10年後、プジョー、マツダまたはシートの減価償却はフォルクスワーゲンポロ、オペルメリバまたはシュコダファビアよりも強いものの、すべてが約1ポイントに収束します。 はい、そうです、10年後、どんな車もオペルになりますが、コルサではなく、C3のようなお気に入りだけがコルサになります。



画像



減価償却率はモデルに大きく依存しません。 そして国から。 普遍的な線形均一性からのわずかな偏差(例:ルノーメガーヌ

2016年、2017年のフォードフィエスタ)は、単にモデル生成の変更です。



画像



画像



この場合の減価償却は物理的な概念ではないため、車が同じ状態になるという意味ではありません。 フランス語では、しわ、擦り傷、欠けたバンパー、スコッチテープで包まれた鏡、およびチェッカーのゲームで数千キロ離れた遺産があります。 しかし、フランス人は摩耗の程度がドイツ人のそれと同じであると確信していて、彼らの信念に従って支払います。 しかし、ドイツ人に中古品を買うように説得するには フランスのドライバーとメカニックの思いやりのある手からの車-彼らは嘘をついていますか?



ロシアと比較した価格について。 説明されているモデルの多くがロシアで販売されていないという事実には、いくつかの問題があります。 両方の市場に共通するいくつかの機能のうち、フォルクスワーゲンのWebサイトで新しいポロを見つけることができます(ただし、ロシアではセダンであり、ヨーロッパではハッチバックです)。 ロシアでは8300ドルから、ドイツでは13500ドルから新しくなり、8300で2012年になります(言及されたオランダのテーブルではなく、16,200ドル)。 キア・リオ:ロシア-9000、ドイツ-11950(ドイツの自己愛国主義に対する明らかな投棄)、フランス-13700、オランダ-19950(Ja-ja、フォルクスワーゲンティグアン/ヒュンダイトゥサン/日産Xの価格でキルシャの1.5ラマ-トレイル:抱擁、泣き、自転車をこぐ方法を覚えておいてください)。



All Articles