Analisis komparatif dari pasar bekas Mobil Jerman dan Prancis di segmen B dan C

Halo, Habr!

Dalam posting ini saya ingin berbagi pengalaman menggunakan beberapa alat python untuk analisis perbandingan pasar untuk mobil bekas di Eropa menggunakan contoh Jerman dan Perancis.

gambar

Dari sudut pandang implementasi, semuanya akan menjadi sangat vanilla. Kebun binatang dari teknologi yang digunakan agak berlebihan, karena itu adalah tujuan itu sendiri - saya ingin mengujinya.

Latar belakang Pikiran untuk melakukan analisis semacam itu mengunjungi saya ketika saya membuka-buka situs iklan Prancis. Saya jelas merasa bahwa Citroën C3 adalah mobil yang sangat buruk, yang terdepresiasi 20 persen per tahun, tetapi Opel Corsa hampir abadi, sehingga harganya tidak berubah dengan bertambahnya usia (atau akan naik sebaik Rolex). Itu adalah pengamatan yang lucu, mengingat bahwa orang Jerman menganggap Corsa pada orang dewasa sebagai tanda kegagalan dalam implementasi profesional. Dan bahkan ada lelucon tentang fakta bahwa dalam 10 tahun setiap mobil berubah menjadi Opel. Dengan tidak adanya Trabant Jerman Barat, peran Zaporozhets dalam cerita rakyat Jerman dilakukan oleh merek khusus ini. C3, sejauh yang saya tahu, tidak terwakili secara khusus di Rusia, tetapi penting untuk diketahui bahwa itu adalah pewaris spiritual dari 2CV klasik dari gambar judul, mobil legendaris yang merindukan Internet selama beberapa tahun (dalam produksi sebelum 1989) dan menawarkan kepada sembilan tenaga kuda yang luar biasa.

Jadi, turunlah ke bisnis. Untuk mendapatkan statistik, Anda memerlukan sumber dengan sampel yang cukup. Di Jerman, autoscout24.de di Perancis ini adalah yang terbaik yang pernah saya jumpai dengan jumlah pengumuman - www.lacentrale.fr (versi pramuka Perancis ada, tetapi kurang populer).

Kami akan memilih menurut kelas-B sebagai yang paling populer dan di mana pertanyaan awal muncul (dengan entri kecil ke dalam kelas-C). Untuk mengumpulkan data, kami akan memilih model-model yang memiliki data selama 10 tahun terakhir, dan untuk yang ada setidaknya 1000 iklan di kedua situs. Kalau tidak, sampel akan sangat bising.

Jika Anda ingin mendapatkan data orang yang sehat - autoscout menawarkan RESTful API jika Anda mendaftar dan mendapatkan kunci.

Tentu saja, saya tidak melakukan ini dan mulai menambang perokok - secara langsung melalui browser tanpa kepala.

Penambangan perokok terlihat seperti ini - berdasarkan filter yang diinginkan (yang dijelaskan di bawah), kami membentuk string kueri, meneruskannya sebagai alamat ke browser tanpa kepala PhantomJS (sejak saya menginstalnya, ia telah ditangguhkan karena beberapa alasan).

Dari yang tidak jelas pada tahap ini - saya menambahkan harapan memuat elemen dengan kelas karakteristik, yang berisi data pada sejumlah opsi untuk permintaan yang sesuai.

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 yang dihasilkan di browser diumpankan ke parser BeautifulSoup dan kami mencarinya di dalam elemen yang berisi gambar hasil yang ditemukan.

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

Seperti yang Anda tebak, permintaan yang dihasilkan termasuk model, harga kecil dan rentang usia, yaitu, ada banyak permintaan, dengan jumlah permintaan lebih dari 500 server memutuskan koneksi. Jika Anda ingin menyelesaikan masalah dengan indah, lebih baik untuk mengakses layanan tersebut melalui proxy yang diubah sepanjang jalan (dan jika Anda memiliki kunci API, maka Anda tidak perlu melakukannya). Di Habré ada artikel pintar tentang cara bekerja melalui proxy. Saya memecahkan masalah berteknologi rendah - harga mengikuti hukum linear seiring bertambahnya usia, jadi saya membayangkan cakupan garis ini dan membatasi permintaan hanya + + .- 30-50 persen dari harga linear, dan memasukkan jeda 10 detik di antara permintaan. Itu sudah cukup untuk tidak dilarang. Mengumpulkan data untuk satu model membutuhkan sekitar setengah jam untuk secara diam-diam berkedip di konsol.

Beberapa kata tentang filter. Untuk mendapatkan pilihan informatif, saya menerapkan filter berikut:

  • Semua mobil datang dalam konfigurasi 4-5 pintu (Kors, Klio dan beberapa model yang disajikan memiliki opsi 3 pintu yang lebih murah).
  • Semua mobil diambil dengan 4-5 kursi - ini adalah fitur yang terpisah dari yang sebelumnya, karena Clio, C3 dan 308 memiliki versi Société (Entreprise) dan ada beberapa di pasaran - ini adalah mobil layanan dari semua tukang listrik dan tukang, ada kotak alih-alih kursi belakang untuk sampah, dan biayanya lebih murah beberapa kilouvres ceteris paribus.
  • Tenaga mesin dibatasi hingga 129 hp. Karena lebih lanjut dalam segmen ini, versi yang dibebankan mulai dan harga di sana sama sekali tidak sesuai dengan status mereka yang sederhana. Jika Anda mengulangi Achtung - autoscout di alamat menggunakan daya bukan pada tenaga kuda, tetapi dalam kilowatt.

Mesin dan gearbox tidak terspesialisasi, tetapi pada 99% mereka adalah mekanik, dan dalam kasus Perancis, ada banyak diesel di sana, hanya karena dipromosikan di sana 10 tahun sebelum dieselgate. Dan sekarang mereka ingin mencangkokkan semua orang bersamanya, dari kesesalan dengan moral pemerintah yang berubah-ubah, Prancis telah menikmati hiburan nasional favorit kedua mereka selama dua minggu - pemogokan dan pembakaran mobil.

Data dikumpulkan, ditata dengan model dalam lembar di file Excel (apa datasaens tanpa Excel, apa yang Anda! Terima kasih openpyxl - untuk kenyamanan pemindahan). Untuk visualisasi, semua data pada semua model dirangkum dalam satu file CSV.

Untuk visualisasi, saya ingin mengajukan antarmuka web yang sederhana. Pada prinsipnya, versi saat ini tidak memerlukan backend. Ada sedikit data, pemrosesan tidak sempurna, Anda dapat membuang semuanya dengan JSON panjang bersama dengan grafik dan memprosesnya di sisi klien. Tapi saya ingin menguji server dengan mata untuk menggunakannya nanti untuk tugas-tugas dengan perhitungan yang tidak begitu sepele. Dan saya tidak tahu cara menggunakan JS, jadi saya harus menyiksa diri sendiri dengan sisi klien, dan server juga bisa dipasang di python, karena ada alat.

Untuk mengimplementasikan server, saya tersiksa di antara bokeh yang telah saya atasi sebelumnya dan bundel Plotly + Dash. Dalam beberapa tugas di masa lalu, saya sangat senang dengan bokeh, terutama karena dapat tertanam dalam Notebook Jupyter (dengan Jupyter Labs, itu tidak begitu sederhana) dan fakta bahwa cukup mudah untuk mengatur komponen interaktif di dalam notebook tanpa memulai server bokeh (). Bokeh adalah pintu gerbang ke dunia d3.js bagi mereka yang tidak tahu cara menggunakan JS.

Untuk tugas ini, saya memutuskan untuk menggunakan bundel Plotly + Dash (yang terakhir adalah pintu gerbang ke dunia Bereaksi bagi mereka yang tidak tahu cara menggunakan JS). Pilihannya lebih mungkin untuk dicoba. Seperti yang Anda lihat dari perbandingan - perbedaannya tidak mendasar

Kami melanjutkan ke implementasi antarmuka.

Kami menarik CSV kami, mendorongnya ke beberapa bingkai data.

Untuk gaya halaman yang benar dan menggunakan desain responsif, kami mengaktifkan CSS lokal.

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

Selanjutnya, kami membuat tata letak paling sederhana menggunakan satu tabel dari dua kolom, 6 dari 12 standar untuk tata letak adaptif.

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

Kontrol diterapkan dengan sangat bersahaja, dari fitur - mungkin ada banyak input, dan hanya satu jalan keluar (misalnya, bagan kiri menerima data dari menu drop-down dan dari slider tahun, tetapi hanya satu elemen yang dapat memperbarui, ini adalah fitur Dash, kruk akan diperlukan untuk memotong).

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

Antarmuka siap pakai - http://eu-carmarket.herokuapp.com/

Untuk data Jerman, dalam kurung adalah (DE) untuk Perancis (FR).

Di sebelah kiri kita melihat harga untuk seluruh periode rata-rata setiap tahun. Selanjutnya, semua harga dalam euro, sesuai dengan aturan pengeposan di situs web - harga sudah termasuk PPN. Di sebelah kanan adalah distribusi penawaran berdasarkan harga pada tahun yang dipilih. Distribusinya berisik untuk banyak model, jadi ketika membangunnya diperhalus tetangga terdekat dengan inti 5 elemen (dengan melihatnya saya memutuskan untuk tidak mengambil model dengan kurang dari 1000 iklan)

Jadi apa yang kita lihat dalam data?

Menjawab pertanyaan yang memotivasi penelitian - tidak, Citroen tidak mengalami depresiasi pada kecepatan yang mengerikan dibandingkan dengan Corsa yang abadi.

gambar

Perbedaan harga yang tajam pada tahun 2017 bukanlah depresiasi kuat utama Citroens pada tahun pertama. Ini sebenarnya kenaikan harga mereka dengan transisi ke generasi baru. Sekarang, alih-alih homolog ke 2CV Citroen yang lama, mereka lebih seperti mitra Mini, dengan bidik bergaya untuk crossover - pemuda yang modis dan modis.

Jika Anda menggunakan satu model, perbedaan di pasar Jerman dan Prancis mengejutkan karena tidak ada, baik dalam nilai maupun dalam tingkat depresiasi (meskipun mobil yang tidak rusak yang lebih tua dari 2 tahun di Perancis hanya ditemukan jika disimpan dengan garasi yang terkunci).

gambar

gambar

gambar

Jika Anda mengambil pasar, yang populer di kalangan orang-orang IT Rusia untuk memindahkan Belanda, maka Anda perlu membayar 20 persen dari harga Jerman. Terlepas dari kenyataan bahwa tidak ada perbatasan bea cukai antara negara-negara di Eropa, itu tidak akan berfungsi hanya dengan mengangkut mobil yang dibeli jika tidak lulus sebagai barang pribadi yang bergerak dengan olehmu Ini mengharuskan Anda untuk tinggal di negara sebelumnya selama lebih dari enam bulan. Jika tidak, semua manfaat yang dimaksudkan akan dihapus dari Anda ketika Anda mencoba untuk mendaftarkan mobil.

Jika Anda membandingkan model dalam tumpukan besar, Anda dapat melihat beberapa pengamatan menarik. Setelah 10 tahun, semuanya bertemu sekitar satu titik, meskipun penyusutan Peugeot, Mazda atau Seat lebih kuat dari Volkswagen Polo, Opel Meriva atau Skoda Fabia. Jadi ya, setelah 10 tahun, mobil apa saja menjadi Opel, tetapi bukan Corsa, hanya favorit seperti C3 yang menjadi Corsa.

gambar

Tingkat penyusutan tidak tergantung secara signifikan pada model. Dan dari negara. Penyimpangan kecil dari keseragaman linear universal (mis. Renault Megane
di 2016, Ford Fiesta di 2017) hanyalah perubahan generasi model.

gambar

gambar

Karena penyusutan dalam hal ini bukan konsep fisik, itu tidak berarti bahwa mobil akan berada dalam kondisi yang sama. Di Prancis, akan ada sisi keriput, lecet, bumper pecah, cermin terikat pada pita, dan warisan ribuan kilometer jauhnya dengan permainan catur. Tetapi orang Prancis yakin bahwa tingkat depresiasi sama dengan orang Jerman dan membayar sesuai dengan kepercayaan mereka. Tetapi untuk membujuk orang Jerman agar membeli bekas sebuah mobil dari tangan penuh perhatian pengemudi dan mekanik Prancis - akankah mereka berbohong?

Mengenai harga dibandingkan dengan Rusia. Ada beberapa masalah dengan fakta bahwa banyak model yang dijelaskan tidak dijual di Rusia. Dari beberapa fitur umum untuk kedua pasar, Anda dapat menemukan Polo baru di situs web Volkswagen (meskipun di Rusia itu adalah sedan, dan di Eropa hatchback). Di Rusia, biayanya mulai dari 8300 baru, di Jerman baru dari 13500, dan untuk 8300 baru 2012 (di luar meja Holland yang disebutkan - 16200 baru). Perbandingan yang baik dapat diwakili di mana-mana Kia Rio: Rusia - 9000, Jerman - 11950 (dumping yang jelas terhadap autopatriotisme Jerman), Prancis - 13700, Belanda - 19950 (Ja-ja, satu setengah lama untuk Kirusha dengan harga Volkswagen Tiguan / Hyundai Tussan / Nissan X -trail: pelukan, menangis dan ingat bagaimana mengayuh sepeda).

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


All Articles