「うわっ…理想の賃貸、相場高すぎ…？」アプリを作ってみた。


こちらの記事をご覧いただきありがとうございます。
~~うわっ私の年収、低すぎ…？のネタってもう古いよな…？~~

SUUMOの物件情報について機械学習モデルを使っていろいろ調べていました。
この度は機械学習モデルをweb上で動かし、物件の条件を入力すると家賃相場を予測してくれるアプリを作りました。
アプリ開発についてはまだまだ勉強中なので大したものではありませんが、ぜひ使ってみてください。

※11月28日追記
heroku有料化に伴いherokuからアプリを削除しました。
代わりにAWS EBを利用してデプロイしたのでそちらが利用できます。

※12月15日追記
AWS EBの環境を停止しました。現在は利用できませんので、ご了承ください。


# 「うわっ…理想の賃貸、相場高すぎ…？」アプリの概要

↓のurlから利用できます。

http://flask-env.eba-pv9ep326.ap-northeast-1.elasticbeanstalk.com/predict

↓こんな感じの画面が出てきます。

<img width=500 alt='predict-rent_app.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/75aa36f2-3590-2344-3866-bc61006c3b42.png'>

フォームに理想的な条件を入れると…

<img width='500' alt='predict-rent-perfect-home.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/896db2d7-ab04-4e8d-ae05-7e3b1082f9e3.png'>

相場の予測をしてくれます。

<img width=500 alt='predict-rent-prefect-result.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/32c7941a-5532-9463-7730-4c39f4b14730.png'>

一応、どう考えてもあり得ない物件でも予測を出してくれます。

<img width=500 alt='predict-rent-paradocs-home.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/a5eea1e2-1033-301a-b19d-90d4ea151f37.png'>

ただしこの結果に何の意味があるのかはわかりません。
現実に存在したらこうなるって意味合いもないような気がします。

<img width=500 alt='predict-rent-paradocs-result.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/6a737f97-1481-4429-6b00-2261d6f7ca79.png'>


# 遊び方

↓が思いついた一例です。もちろんこれ以外でも思いついた通りに好きに使っていただいて構いません。
* 理想の賃貸の条件を入れて現実を思い知る
* 自分が今住んでいる賃貸の条件を入れて、予測と実際の家賃を比べてみる
* ひたすら家賃が高く（低く）なる条件を探す
* 現実に存在しない条件を入れてみる



# 仕組み

__flask__ を使用して作りました。中の仕組みはいたって簡単です。

* フォームから物件の条件を受け取る
* →学習済みモデルを呼び出し、条件から家賃の予測値を返す
* →結果画面を出力する

これだけです。
私がとりあえず画面上で動くものを作りたいと思って作成したので、かなり簡素です。
そのためcssのレイアウト調整とかUIとかはしていません。

↓の記事を大いに参考にしました。

https://qiita.com/kiyokiyo_kzsby/items/f8aa0bf68007e18d6882

# モデルとデータについて

以前からアプリ化をちまちまと進めていたこともあり、[前回記事](https://qiita.com/tomyu/items/be380a099ff5fb32d90b)と異なります。
詳細データをスクレイピングする前のモデル[(この記事と同じ)](https://qiita.com/tomyu/items/cd90f3bb8dafc7c23835)の改良版を使用しています。

## 使用した機械学習モデル

__LightGBM__ を使用しました。以下のパラメータを調整して適当な数値を利用しています。
* n_estimators
* learning_rate
* num_leaves
* max_depth
* colsample_bytree

## 使用したデータ

SUUMOをスクレイピングして得た物件データ __156943件__ を使用しました。
これを学習用とテストで5:5に分けて利用しました。

また、特徴量として（家賃以外に）以下9種を持っています。
* 最寄り駅からの距離
* 築年数
* 階数（建物の最上階から地下まで全部）
* 専有面積
* カテゴリ（アパート、マンション、など）
* 市区町村
* 路線
* 駅
* 間取り

また家賃は10を底にした対数で変換し、学習と予測をしています。

## 予測精度

テストデータの予測から得たスコアは、
* r2スコア(対数変換のまま) : 0.962
* r2スコア(対数変換を戻す) : 0.902
* mse(対数変換のまま) : 0.00141
* mse(対数変換を戻す) : 6.83

となっています。それなりの精度だと思います。

# 改良案

とりあえずで作ってみたのレベルなので、改良できる点はたくさんあると思います。
私が思いついたものを書いておきます。他にもご意見があればぜひコメントをお願いします。

* cssでレイアウト調整（Bootstrapとか)
* 未入力項があってもOKにする
　（利用者は細かい希望を持っていない場合が多いがモデル側は値がないと困る点をどう解消するか）
* 「専有面積」「最寄駅からの距離」とかをわかりやすい値に変える or 不要にする
　（最寄駅からの距離→駅徒歩の時間　とか）
* 「市区町村」「路線」「駅」のプルダウンを連動させる
　（路線を選択するとその路線にある駅だけ表示できる　とか）
* 条件に似たような物件をおススメしてくれる機能


# 終わり。

いかがでしたでしょうか。
かなり簡素な仕上がりなので味気ないと感じた方も多いかもしれません。
まだまだ勉強中なのでそのあたりはご容赦ください。

個人的には、自分で作ったものが画面上で動いたときは「おぉー！」と感動したものです。こんな簡素でも。
herokuにデプロイしてurlいれて動いたときも「ほぉー！」ってなりました。
自分でものを作れるようになるって面白いですね。

余裕があればもう少し改良して、良いものを作りたいですね。
特におススメ物件を出してくれる機能は機械学習の使いどころだと思うので、ぜひ作りたいです。




# 他のSUUMO記事


まとめ記事書いたのでぜひご覧ください。

https://qiita.com/tomyu/items/aa565490f48612e00535