(プログラマーでもIT業界の人でもないのにw)
【散布図】
色や車検残についてはグラフで表すような代物ではないので、割愛させていただきます。
んでは!
ほんと、自動処理から分析まで万能にこなせるんですよね~。
割と複雑な処理を比較的簡単に書けるので、本当に重宝しています。
(とは言ってもオブジェクト指向とかになってくると少し別。私はそこまでできません。)
で、もともと中古車相場の重回帰分析にPythonを使っていたわけですが。
で、もともと中古車相場の重回帰分析にPythonを使っていたわけですが。
せっかくなら、Pythonが得意とするAIで分析してみないなと思い立ち。
ちょっとやってみたら割とあっさりできたので、ネタにしてみます。
ちなみに、コードもいずれは公開したいと思っていますが、その準備に時間がかかりそうなので、今回は概要と結果だけの記事にしたいと思います。
そんなわけで、ある程度タマ数が多くないと機械学習はできないので、メルセデスベンツ C200 アバンギャルド AMGライン でやってみることにしました。
そんなわけで、ある程度タマ数が多くないと機械学習はできないので、メルセデスベンツ C200 アバンギャルド AMGライン でやってみることにしました。
(単位:万円)
走行距離 | 2019 | 2018 | 2017 | 2016 | 2015 | 2014 |
---|---|---|---|---|---|---|
0.5万km | 407 | 378 | 349 | 320 | 291 | 262 |
1.0万km | 402 | 373 | 344 | 315 | 286 | 257 |
1.5万km | 396 | 368 | 339 | 310 | 281 | 252 |
2.0万km | 391 | 362 | 333 | 305 | 276 | 247 |
2.5万km | 386 | 357 | 328 | 299 | 270 | 242 |
3.0万km | 381 | 352 | 323 | 294 | 265 | 236 |
3.5万km | 376 | 347 | 318 | 289 | 260 | 231 |
4.0万km | 370 | 342 | 313 | 284 | 255 | 226 |
4.5万km | 365 | 336 | 307 | 279 | 250 | 221 |
5.0万km | 360 | 331 | 302 | 273 | 244 | 216 |
6.0万km | 350 | 321 | 292 | 263 | 234 | 205 |
7.0万km | 339 | 310 | 281 | 253 | 224 | 195 |
8.0万km | 329 | 300 | 271 | 242 | 213 | 184 |
9.0万km | 318 | 290 | 261 | 232 | 203 | 174 |
決定係数が78出ましたので、なかなかの精度です。
ただ、こちらは距離と年式から価格を求める重回帰分析を行っているだけですので、車検の残り期間やボディカラーなどは反映されていません。
実は、この分析に用いた車両にボディカラーが白のものが多く含まれていれば、白の相場にとっては精度が高くなりますが、例えば赤などであればこれより低い価格がより適正ということになるのです。
それを補完するためには、色や車検なども重回帰分析にしてしまうという方法がありますが、データ前処理が必要になります。
データ前処理をどうせするのであれば、じゃあ機械学習にかけた方がいいんじゃないってことで、やってみたわけです。
と、ちょっと駆け足になりましたが。
せっかくなので、年式・距離・価格について、どのような分布になっているか、グラフで見てみましょう。
以下、年式は「year_」、距離は「odo」、価格は「price」となっています。
価格が指数表示になってしまっていますが、le6は0が6個付く、つまり百万円という意味です。
【ヒストグラム】
そんなこんなで、機械学習にかけてみます。
(データ前処理含む全容は、そのうちネタにします。たぶん。)
ちなみに、年式・距離・車検残月数・ボディカラーを入力し、価格を出力するという形になります。
オプションなども頑張ればできるのですが、現状、データをそこまで細かく収集していなかったのでやりません。
というわけで、実行。
ロジスティック回帰 と XGBRegressor とをいっぺんにかけ、スコアがいい方を採用します。
# 入力データと正解データの分割 x = df3.drop('price', axis=1) y = df3['price'].values # 正解データと検証データの分割 test_size = 0.2 from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=test_size, random_state=random_seed) # アルゴリズムの選択 from sklearn.metrics import r2_score # ロジスティック回帰 from sklearn.linear_model import LogisticRegression algorithm_LR = LogisticRegression(random_state=random_seed) algorithm_LR.fit(x_train, y_train) ypred_LR = algorithm_LR.predict(x_test) score_LR = r2_score(y_test, ypred_LR) print(f'score LogisticRegression: {score_LR}') # XGBRegressor from xgboost import XGBRegressor algorithm_XGBR = XGBRegressor(random_state=random_seed) algorithm_XGBR.fit(x_train, y_train) ypred_XGBR = algorithm_XGBR.predict(x_test) score_XGBR = r2_score(y_test, ypred_XGBR) print(f'score XGBRegressor: {score_XGBR}')
出力結果です。
# 出力結果 score LogisticRegression: 0.5156457395038976 score XGBRegressor: 0.7591830242454256
XGBRegressorがいい値を出していますね。
というわけで、XGBRegressorを採用します。
XGBRegressorには重要度分析が付いていますので、せっかくなので見てみます。
こちらを見る限り、XGBRegressorによる価格決定で重要なのは突出して年式ですね。意外だったのが、距離はさほど重要じゃないということ。
また、車検残は重要性が低いようですが、これは何となく車検が無い方が総額に含めてローンを組むなど資金計画を立てやすいことが影響していると思います。
ボディカラーについては、不人気色ほど影響(負)が出やすいですね。
というわけで、上記で学習させたアルゴリズムを使って、算出させてみましょう。
ひとまず、「2016年式 走行距離2万km ボディカラー:白 車検:なし」という条件でやってみます。
dic = {'year_': 2016, 'odo': 20000, 'ins_left': 0, 'color_灰': 0, 'color_白': 1, 'color_紺': 0, 'color_緑': 0, 'color_茶': 0, 'color_赤': 0, 'color_銀': 0, 'color_青': 0, 'color_黒': 0} df_pred = pd.DataFrame([dic]) XGB_pred = algorithm_XGBR.predict(df_pred) print(f'price: {XGB_pred}') # 出力結果 # price: [2749624.]
約275万円と出ましたね。
重回帰分析では305万円と出てましたが、思ったより開きがありますね。
ただ、実際にこの条件で中古車を見てみると、認定中古車を除けば、XGBRegressorで出した275万円というのは概ねいい線を行ってる感じです。
これ、結構使えるかも。
ただし、タマ数が少ないものだとスコアが全くでないので、タマ数豊富な車種に限られるのが玉に瑕です。
まあそんなときでも、重回帰分析の方では決定係数が出ることもあるので、いずれ併用していくのがいいんでしょうね。
そんなわけで、AI分析(機械学習)に挑戦して中古車価格を出してみた、といった記事でした。
その内、全コードも公開しようと思います。
んでは!
0 件のコメント :
コメントを投稿