よつぴいてひやふつと射る

化学メーカー勤務の弱小技術職がチラシの裏風に雑然と書いていきます

車を購入しようと思う―中古車市場の相場を調べる

諸々の理由により車を購入しようと思う。車種は、諸々の理由からマツダCX-5にしようと思っている。しかしCX-5は高い。そして2015年のMC後にさらに値段が上がってしまった。上位グレードのXD PROACTIVE(ディーゼル、自動ブレーキ付き)でも選ぼうものなら350万は軽く吹っ飛んでしまう程に高い。下位グレードの20S(ガソリン、自動ブレーキなし)でも車両本体だけで250万近くはかかってしまい、金のない私にとっては、おいそれと手が出せない価格である。私は車も欲しいが、自転車も植物栽培もアクアリウムもカメラも天文も投資もやりたいのでそんな余裕は無い!

そこで中古車・新古車となるわけです。なんとかセンサーや、マツダユーカーなんとか、といった中古車サイトを当たりましたが、どうも相場がつかみにくい。いや、価格.com行けば年式-価格や走行距離-価格の関係がマップで表示されているのですが、グレードや修復歴の有無に関係なく表示されているのでわかりにくいんですね。私が欲しいのは、20Sで修復歴の無い車なのです。

というわけで、pythonの勉強がてら、某中古車情報サイトからスクレイピングしてくれるコードを書いてみた。素人のコードなので、汚い・無駄が多いのは見逃してください。

以下のコードでは、CX-5全車種、修復歴なし、衝突被害軽減ブレーキ有、フィルターしている。
上記以外の場合はtarget_urlをいじれば大丈夫。

#!/usr/local/bin/python3
# -*- coding: utf-8 -*-

import lxml.html
import requests
import csv
import datetime

car_urls = []
for i in range(1,100):
    target_url = 'http://www.carsensor.net/usedcar/search.php?STID=CS210610&SORT=2&CARC=MA_S087&YMIN=2012&OPTCD=REP0*PCS1&DLR=1&PAGE='+str(i)
    try:
        root=lxml.html.parse(target_url).getroot()
        els =[el.get('id') for el in root.cssselect('#bukkenCas div')]
    except:
        break
        
    ids = [i for i in els if i]
    for id in ids:
        car_urls.append('http://www.carsensor.net/' + root.cssselect('#'+ id +' a')[0].get('href'))


#List for write to CSVfile
car_info = [[]]
car_info[0] = ['本体価格', '支払総額', '年式', '走行距離(万km)', '車検有無', '車検残', '修復歴', '地域']

#Get each car info and Append to csv list
for car_url in car_urls:
    root=lxml.html.parse(car_url).getroot()
    res = root.xpath('string(//div[@class="l-box bknDtl_info"])').replace('\t','').replace(' ','')
    res = [r for r in res.split('\n') if r]
    res  = [r for r in res if r]
    #print(res)
    kyori = res[res.index('走行距離')+1]
    if '万' not in res[res.index('走行距離')+2]:
        kyori = (float(kyori) / 10000)
        
    td = datetime.datetime.today()    
    syaken_y = res[res.index('車検有無')+1].split('(')[0]
    syaken_m = res[res.index('車検有無')+2].strip('年').strip('月')
    if '整備付'in syaken_y:
        syaken_y = str(td.year + 2)
        syaken_m = str(td.month)
    elif '整備別'in syaken_y:
        syaken_y = str(td.year)
        syaken_m = str(td.month)

    syakenzan = (int(syaken_y)-td.year)*12 + (int(syaken_m)-td.month)
    
    car_info.append([res[res.index('本体価格')+1].strip('万円'),
                     res[res.index('支払総額')+1].strip('万円'),
                     res[res.index('年式')+1],
                     kyori,
                     syaken_y + '/' + syaken_m,
                     syakenzan,
                     res[res.index('修復歴')+1],
                     res[res.index('地域')+1]
                    ])
print(car_info)

with open(u'E:\\CAR\\car_info.csv', 'w')as f:
    writer = csv.writer(f,lineterminator='\n')
    writer.writerows(car_info)

car_infoを適当にプロットするとこんな感じ。

年式-本体価格の関係
f:id:vitaaeterna:20160730165306p:plain

 

走行距離-年式-本体価格の関係
f:id:vitaaeterna:20160730165301p:plain

これを見ると、走行距離も年式も少ない所謂新古車は、たいして安くなってないことがわかる。
また、走行距離だけに関していえば、20万円/10000km くらいの割合で安くなっているように見える。新車本体300万円とすると、15万km走行での減価償却を想定してのことなのか?

とりあえず、車を購入するときはこの図と見比べて値段の妥当性を判断しよう。

次にやること候補としては、
 ・グレード別の価格調査
 ・走行距離や年式を機械学習させて、本体価格を出すプログラムを作る。
はい…機械学習とか面白そうだから…手を出してみたいんですよ…