中古車相場をAI(機械学習)で分析してみた ~ロジスティック回帰やらXGBRegressorやら~

最近、すっかりPythonにはまっています。
(プログラマーでもIT業界の人でもないのにw)

ほんと、自動処理から分析まで万能にこなせるんですよね~。
割と複雑な処理を比較的簡単に書けるので、本当に重宝しています。
(とは言ってもオブジェクト指向とかになってくると少し別。私はそこまでできません。)

で、もともと中古車相場の重回帰分析にPythonを使っていたわけですが。

せっかくなら、Pythonが得意とするAIで分析してみないなと思い立ち。
ちょっとやってみたら割とあっさりできたので、ネタにしてみます。

ちなみに、コードもいずれは公開したいと思っていますが、その準備に時間がかかりそうなので、今回は概要と結果だけの記事にしたいと思います。

そんなわけで、ある程度タマ数が多くないと機械学習はできないので、メルセデスベンツ 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分析(機械学習)に挑戦して中古車価格を出してみた、といった記事でした。
その内、全コードも公開しようと思います。

んでは!

LihatTutupKomentar