将来の価格は何で決まる?
前回の記事でまとめたように、不動産価格はさまざま要因で決定されていることが分かりました。
私の興味のひとつとして、不動産の将来的な価格の推移です。
今回収集したデータの中で、将来の価格に影響を与える要因は何でしょうか? 最も分かりやすい要因として、例えば築年数が考えられます。
不動産価格の予測モデルらか不動産の将来価値を予測することはできるでしょうか?
とにかくはじめます🍛
予測モデルを作る
今回は予測モデルの構築はメインでは無いのでサクッと作成します。
モデルとして LightGBM を採用しました。
LightGBM
は以前利用した XGBoost
同様に、勾配ブースティングを利用した人気のあるモデルの一つです。
また最適化には optuna の LightGBMTuner を試してみました。
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%の差異が発生しているレベルなので、そのまま予測値を信頼するのは微妙です。 特に価格が大きいほどバラつきが大きいようですが、これは価格が高いほど、データ数が少ないことも関係しています。
ただ今回使用している損失関数のrmse
は、上記グラフの残差(予測値と実測値の差)や、前述の相対的な差を直接最小化しているわけでは無いです。
結局のところ何を達成したいかによって予測モデルに求める指標は大きく変わるわけですが、今回はこれで十分なのでモデル精度の向上はまた別の機会にしましょう。
ちなみに築年数に対する残差プロットも示しておきます。 こっちの方がバラつきが少ないことが分かりますね。
予測の上で重要な要因
構築したモデルにおいて物件価格の予測に大きく寄与している要因は 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 |
4 | 15分圏内のコンビニ数 | 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 |
3 | 15分圏内のコンビニ数 | 7.2 |
4 | 建築年月 | 5.9 |
5 | 10分圏内のコンビニ数 | 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 |
4 | 10分圏内のコンビニ数 | 0.06 ± 0.004 |
5 | 部屋の数 | 0.03 ± 0.002 |
今度は面積がトップになりましたので、やはり面積も価格に大きく影響を与え無視できないことが分かります。
どの重要度が良いという話ではなく、様々視点から総合的に判断するのが良さそうです。
20年先までの予測
この予測モデルに対して適当な物件を選び、築年数を1年ずつ増加させながら繰り返し予測価格を求めていきます。
以下が築年数+20年先までの予測を行ってみた、とある1サンプルの結果です。
上記はたまたま実価格通りに予測されていますが、もちろん実価格を外している例もあるので、他のサンプルも適当にのせておきます。
下落の仕方に多少の違いはあれど、いずれにしても築年数が増加すると、物件価格もそれに合わせて減少するという傾向は捉えているようです。
とはいえ予測モデルを作るまでも無く、これぐらい結果は前回の統計結果より容易に想像できますけどね…😓
うまくいかない例
とはいえちゃんと予測できない物件もあります。 例えば以下のようにそれなりに築年数が経っている物件の場合、予測結果はかなり怪しいです。
左の物件のように40年目で突然価格が上昇するとは考えにくいですし、右の物件のように45年目以降から全く変わらないというのも不自然です。
この理由は築年数が40年以上の学習データ自体が少ないため、築年数が長い物件の学習が不十分であるからだと考えられます。
何を予測したいかによって、適切な学習データを収集することの重要性を再確認できました。
まぁそもそも現在価格を予測するモデルを、将来価格の予測にそのまま転用していることに無理があるのですが。
リフォームすべき?
次にリフォームされていない物件を対象に、先ほどと同様に将来価格を予測してみます。 以下のようにリフォームした場合の価格も同時にプロットしてみました。
築年数が増すにしたがって、リフォームありとなしの差が拡大しているのが分かります。
この傾向は他のサンプルも同様ですが、失敗例(?)としてはリフォームの有無で全く価格が変わらない物件がありましたが。(重なっているので線が紫に見えています)
このリフォームの有無の価格差と、リフォーム費用を比較することで、リフォームをすべきかを検討する際の、参考情報として使えるかもしれません。 とはいえリフォームといってもその規模もまちまちですから、さすがにざっくりしすぎではあります。
[参考] Partial Dependence
さきほどまで将来価格を予測するにあたって予測モデルの築年数を変化させてました。
実はこれを全サンプルで実施して平均を求めれば Partial Dependence
が求まります。
この機能は scikit-learn
で標準実装されており4、築年数が予測価格にどのように影響を与えるのかを知ることができます。
scikit-learn
で求めた実際のPDP(Partial dependence plots
)を以下に示します。
なおPartial Dependence
は PDPbox というライブラリを利用しても求められます。
同じように築年数の増加に伴い予測価格は減少していく様がよく分かりますが、こちらの場合は標準偏差なども併せて描画できます。
まとめ
将来の不動産価格を予測してみましたが、だいたい想定通りの結果が得られたかと思います。
ただ本文中でも記載している通り、実運用するならまだまだ改良は必要です。(少なくとも私はこの結果を信じて取引するのは怖いですし)
また当然ながら、将来の不動産価格は、今回対象としていない要因による影響も強く受けます。 近くに駅ができたり、カジノが建ったり、治安が悪化したり、地盤の問題が発覚したり、優秀な不動産営業マンが頑張ったり、など。 今回示した結果は、あくまで対象とした要因のみで価格予測している点には注意してください。