将来の不動産価格を予測する
不動産価格の予測モデルを構築したうえで、そのモデルにより簡易的に将来の不動産価格の予測を行ってみました。

将来の価格は何で決まる?

前回の記事でまとめたように、不動産価格はさまざま要因で決定されていることが分かりました。

私の興味のひとつとして、不動産の将来的な価格の推移です。

今回収集したデータの中で、将来の価格に影響を与える要因は何でしょうか? 最も分かりやすい要因として、例えば築年数が考えられます。

不動産価格の予測モデルらか不動産の将来価値を予測することはできるでしょうか?

とにかくはじめます🍛

予測モデルを作る

今回は予測モデルの構築はメインでは無いのでサクッと作成します。

モデルとして LightGBM を採用しました。 LightGBM は以前利用した XGBoost 同様に、勾配ブースティングを利用した人気のあるモデルの一つです。

また最適化には optunaLightGBMTuner を試してみました。 LightGBMTuner を使用すると、ハイパーパラメータの探索だけでなく、その探索空間の指定さえも自動化してくれるoptunaの新機能です。

つまり私は何も考えずに、データを放り込むだけで予測モデルが構築できるはずで、今回の用途には良さそうです。

なお学習の方法は通常のLightGBMとほぼ同じですが、最適化されたパラメータが格納される best_params などが指定可能です。12

import optuna.integration.lightgbm as lgb

lgb_params = {
  'objective': 'regression',
  'metric': 'rmse'
}
best_params = {}
tuning_history = []
model = lgb.train(lgb_params,
                  lgb_train,
                  num_boost_round=10000,
                  valid_sets=lgb_valid,
                  early_stopping_rounds=100,
                  verbose_eval=500,
                  best_params=best_params,
                  time_budget=60 * 60,
                  tuning_history=tuning_history)

ちなみに交差項を加えたり、モデルを変えたり多少試行錯誤しましたが、大きな改善は見られませんでした。

残差プロット

予測結果の残差プロットは以下のようになりました。 横軸の0近辺に分布しているほど正しい予測と言えるのですが、結果を見る限りあまり精度の高いモデルとは言えないかもしれませんね。 相対的な差を求めると、平均で約17%の差異が発生しているレベルなので、そのまま予測値を信頼するのは微妙です。 特に価格が大きいほどバラつきが大きいようですが、これは価格が高いほど、データ数が少ないことも関係しています。

res.png

ただ今回使用している損失関数のrmseは、上記グラフの残差(予測値と実測値の差)や、前述の相対的な差を直接最小化しているわけでは無いです。 結局のところ何を達成したいかによって予測モデルに求める指標は大きく変わるわけですが、今回はこれで十分なのでモデル精度の向上はまた別の機会にしましょう。

ちなみに築年数に対する残差プロットも示しておきます。 こっちの方がバラつきが少ないことが分かりますね。

res_vs_age.png

予測の上で重要な要因

構築したモデルにおいて物件価格の予測に大きく寄与している要因は feature_importance により取得可能です。

fn = model.feature_name()
fi = model.feature_importance()
fi = fi / max(fi) # %換算
idx = np.argsort(-fi)
np.dstack((fn, fi))[0, idx[:5]]
N要因比率[%]
1建築年月13.1
2築年数12.1
3最寄駅までの徒歩時間10.1
415分圏内のコンビニ数9.2
5面積8.7

どうやら建築された時期と築年数という時間に関連のある項目が大きく価格に影響を与えているようです。 当然ながら建築年月は購入後に変更できないので、どんな物件を買うかはもちろん大事ですが、いつ買うか/売るかは重要な検討ポイントになりそうです。

他の重要度指標

予測に寄与する要因を見つける方法は、feature_importance だけではありません。

例えば eli5 という機械学習のデバッグ用ライブラリを使用して、gain による重要度を見てみましょう。

# reg は best_params で LGBMRegressor を再フィッティングしたモデル
# -> eli5 では estimator はサポートしていないため
eli5.explain_weights(reg, top=5, importance_type='gain')
N要因比率[%]
1築年数30.0
2面積24.6
315分圏内のコンビニ数7.2
4建築年月5.9
510分圏内のコンビニ数4.8

築年須と面積がトップ2に変わりました。

またPermutation Importanceも同じくeli5で簡単に求められます。3

# x_test_wo_na は欠損値を補完したテストデータ
# -> 欠損値があるとエラーとなるため
perm = PermutationImportance(reg).fit(x_test_wo_na, y_test)
eli5.show_weights(perm, feature_names=x_test_wo_na.columns.values)
N要因重み
1面積0.67 ± 0.015
2築年数0.62 ± 0.024
3建築年月0.11 ± 0.009
410分圏内のコンビニ数0.06 ± 0.004
5部屋の数0.03 ± 0.002

今度は面積がトップになりましたので、やはり面積も価格に大きく影響を与え無視できないことが分かります。

どの重要度が良いという話ではなく、様々視点から総合的に判断するのが良さそうです。

20年先までの予測

この予測モデルに対して適当な物件を選び、築年数を1年ずつ増加させながら繰り返し予測価格を求めていきます。

以下が築年数+20年先までの予測を行ってみた、とある1サンプルの結果です。

predict_01.png

上記はたまたま実価格通りに予測されていますが、もちろん実価格を外している例もあるので、他のサンプルも適当にのせておきます。

predict_02.png

下落の仕方に多少の違いはあれど、いずれにしても築年数が増加すると、物件価格もそれに合わせて減少するという傾向は捉えているようです。

とはいえ予測モデルを作るまでも無く、これぐらい結果は前回の統計結果より容易に想像できますけどね…😓

うまくいかない例

とはいえちゃんと予測できない物件もあります。 例えば以下のようにそれなりに築年数が経っている物件の場合、予測結果はかなり怪しいです。

predict_03.png

左の物件のように40年目で突然価格が上昇するとは考えにくいですし、右の物件のように45年目以降から全く変わらないというのも不自然です。

この理由は築年数が40年以上の学習データ自体が少ないため、築年数が長い物件の学習が不十分であるからだと考えられます。

何を予測したいかによって、適切な学習データを収集することの重要性を再確認できました。

まぁそもそも現在価格を予測するモデルを、将来価格の予測にそのまま転用していることに無理があるのですが。

リフォームすべき?

次にリフォームされていない物件を対象に、先ほどと同様に将来価格を予測してみます。 以下のようにリフォームした場合の価格も同時にプロットしてみました。

築年数が増すにしたがって、リフォームありとなしの差が拡大しているのが分かります。

predict_reform_01.png

この傾向は他のサンプルも同様ですが、失敗例(?)としてはリフォームの有無で全く価格が変わらない物件がありましたが。(重なっているので線が紫に見えています)

predict_reform_02.png

このリフォームの有無の価格差と、リフォーム費用を比較することで、リフォームをすべきかを検討する際の、参考情報として使えるかもしれません。 とはいえリフォームといってもその規模もまちまちですから、さすがにざっくりしすぎではあります。

[参考] Partial Dependence

さきほどまで将来価格を予測するにあたって予測モデルの築年数を変化させてました。

実はこれを全サンプルで実施して平均を求めれば Partial Dependence が求まります。 この機能は scikit-learn で標準実装されており4、築年数が予測価格にどのように影響を与えるのかを知ることができます。

scikit-learnで求めた実際のPDP(Partial dependence plots)を以下に示します。

pdp_age.png

なおPartial DependencePDPbox というライブラリを利用しても求められます。 同じように築年数の増加に伴い予測価格は減少していく様がよく分かりますが、こちらの場合は標準偏差なども併せて描画できます。

pdp_age_lib.png

まとめ

将来の不動産価格を予測してみましたが、だいたい想定通りの結果が得られたかと思います。

ただ本文中でも記載している通り、実運用するならまだまだ改良は必要です。(少なくとも私はこの結果を信じて取引するのは怖いですし)

また当然ながら、将来の不動産価格は、今回対象としていない要因による影響も強く受けます。 近くに駅ができたり、カジノが建ったり、治安が悪化したり、地盤の問題が発覚したり、優秀な不動産営業マンが頑張ったり、など。 今回示した結果は、あくまで対象とした要因のみで価格予測している点には注意してください。


  1. Python: Optuna の LightGBMTuner で Stepwise Tuning を試す - CUBE SUGAR CONTAINER ↩︎

  2. LightGBMTuner for Titanic | Kaggle ↩︎

  3. Permutation Importanceを使ってモデルがどの特徴量から学習したかを定量化する ↩︎

  4. 4.1. Partial dependence plots — scikit-learn 0.22 documentation ↩︎

最終更新:2020/01/29 12:39 (Wed)