【データサイエンス入門】機械学習で民泊部屋の最適価格を求める🏠Airbnbデータセット

#
はじめに🏠💰
今回もオープンデータで遊んでみる企画です😋
Airbnbは利用したことないので細かいことはわからないですが
ホテルの部屋のダイナミックプライシングや、ユーザーが価格を決めるときのサポートとして、機械学習による価格予測が利用されてきていますね！
👇OYOでは機械学習を利用し部屋の価格を1日4,300万回も変動させ、利益を最大化しているみたいですね。
[OYO、インターコンチネンタルが「ダイナミックプライシング」を推進する一方で、真逆の戦略を採るホテルも | https://airstair.jp/oyo-dynamic-pricing/](https://airstair.jp/oyo-dynamic-pricing/)

#データ📊
Signateのデータを利用します。
[【練習問題】民泊サービスの宿泊価格予測 | https://signate.jp/competitions/266](https://signate.jp/competitions/266)
<img width="2030" alt="スクリーンショット 2020-06-19 20.32.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/41e7f711-065a-a6dd-4b0a-a8cab7f5e934.png">

構成は以下のようになってます。

| カラム | ヘッダ名称 | データ型 | 説明 |
|--:|:--|:--|:--|
| 0 | id | int | インデックスとして使用 |
| 1 | accommodates | int | 収容可能人数 |
| 2 | amenities | char | アメニティ |
| 3 | bathrooms | float | 風呂数 |
| 4 | bed_type | char | ベッドの種類 |
| 5 | bedrooms | float | ベッドルーム数 |
| 6 | beds | float | ベッド数 |
| 7 | cancellation_policy | char | キャンセルポリシー |
| 8 | city | char | 都市 |
| 9 | cleaning_fee | int | クリーニング料金を含むか |
| 10 | description | char | 説明 |
| 11 | first_review | char | 最初のレビュー日 |
| 12 | host_has_profile_pic | int | ホストの写真があるかどうか |
| 13 | host_identity_verified | int | ホストの身元確認が取れているか |
| 14 | host_response_rate | char | ホストの返信率 |
| 15 | host_since | char | ホストの登録日 |
| 16 | instant_bookable | char | 即時予約可能か |
| 17 | last_review | char | 最後のレビュー日 |
| 18 | latitudes | float | 緯度 |
| 19 | longitude | float | 経度 |
| 20 | name | char | 物件名 |
| 21 | neighbourhood | char | 近隣情報 |
| 22 | number_of_reviews | int | レビュー数 |
| 23 | property_type | char | 物件の種類 |
| 24 | review_scores_rating | float | レビュースコア |
| 25 | room_type | char | 部屋の種類 |
| 26 | thumbnail_url | char | サムネイル画像リンク |
| 27 | zipcode | int | 郵便番号 |
| 28 | y | float | 宿泊価格 |

#AutoMLツール「VARISTA」
プログラミング知識ゼロの初心者でも安心なAutoMLツールを利用します！
varista.aiはAutoMLツールと言われる、機械学習のパイプラインを自動化してくれるサービスです。
ノンコーディングで、データの可視化、学習、予測などが行える優れものです。
普段Python/Rで機械学習をしている方も、実装前のデータ調査などで役立つ機能が利用できるツールでもあります。
EmailかSNSアカウントがあれば無料で開始できるのでおすすめです。
👉[VARISTA | https://www.varista.ai/](https://www.varista.ai/)
<img width="1519" alt="スクリーンショット 2020-06-19 20.35.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/23d171d3-d586-aa5b-f877-3b5153e4c118.png">

#プロジェクトのセットアップ✌️
<img width="1674" alt="スクリーンショット 2020-06-19 20.53.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/4798d1e6-8867-32e2-9d91-d08008fd6e7c.png">
<img width="1674" alt="スクリーンショット 2020-06-19 20.54.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/8a0d59a2-bfad-e2a7-5a02-a49b67e35de2.png">
プロジェクト名を入力し、予測する列を設定します。
今回は「y」が予測する価格になります。

#データセットアップ🍔
###不要な列の削除
上の列のうち学習に利用しない方がいい不要な列を指定します。

**「id」列**
無規則なユニークな列は学習に影響がないので削除します。
<img width="585" alt="スクリーンショット 2020-06-19 20.59.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/154e3dec-b9a9-81e3-eb1b-eaae7e4f8739.png">

**「amenities」列**
内容が構造体になっているため、利用するとしたら別途パースが必要なため、今回は削除
<img width="583" alt="スクリーンショット 2020-06-19 20.59.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/5fc4647c-2d4a-41db-70eb-5730b014046f.png">

**「description」列**
自然言語列のため、利用するとしたら別途作業が必要なため、今回は削除
<img width="585" alt="スクリーンショット 2020-06-19 21.02.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/43443bf5-8fcf-dee2-35ac-f1f40eff0178.png">

**「name」列**
自然言語列のため、利用するとしたら別途作業が必要なため、今回は削除
<img width="577" alt="スクリーンショット 2020-06-19 21.03.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/106de31a-bd9a-a201-1c5b-7e83da0f049b.png">

**「thumbnail_url」列**
画像分析を行う場合は、ここからダウンロードしたデータを利用しますが、テーブルデータのみで学習を行うため、今回は不要
<img width="581" alt="スクリーンショット 2020-06-19 21.04.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/f582b76a-422a-d815-ba45-4061f5a1695a.png">

以上５列を削除します。

###相関関係の確認
varistaのビジュアライズ機能を利用して、相関関係の高い特徴を確認してみましょう。

第１位**「accoummodates」列**
相関度：**52.2**
部屋の収容可能人数です。確かに部屋が広く、収容人数が上がれば上がるほど、部屋の価格は高いのがあってそうですね🤔
<img width="590" alt="スクリーンショット 2020-06-19 21.11.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/1f09243e-20d0-f83b-7b06-1f6336eaaf7e.png">

第２位**「bedrooms」列**
相関度：**49.6**
ベッドの数です。部屋の収容可能人数と同じく、ベッド数も増えれば増えるほど、価格が高くなるのも理解できます🤔
<img width="583" alt="スクリーンショット 2020-06-19 21.15.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/8aa99374-560c-a599-abcc-28dcdd3d9d20.png">

第３位**「bathrooms」列**
相関度：**45.6**
風呂の数です。うん🤔
<img width="588" alt="スクリーンショット 2020-06-19 21.18.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/10a98a84-61a7-c472-4625-254382e8e34a.png">

学習させた際にこれらの特徴がどう影響してくるのか、見てみましょう。

#学習🔥
まずはとりあえず、何も設定せずに学習を行ってみます。
<img width="1312" alt="スクリーンショット 2020-06-19 21.39.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/d84b7305-ad0b-65d0-d2f7-101b0d11c355.png">
#学習結果１
約6分で学習完了しました。
<img width="1674" alt="スクリーンショット 2020-06-20 16.26.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/b6bb15d2-a78d-de87-6a27-0feafbcee726.png">

各結果の詳細をみていきます。

###精度
全体のスコアは51となっています。
VARISTAではモデルの評価を1〜100のスコアで表示してくれます。
細かな精度は横に表示されている、精度を確認することでわかります。

**平均誤差**
RMSEと呼ばれる誤差の表示です。
単位が目的変数と同じため、感覚的に誤差の大きさを把握することができます。
今回の場合「平均で約±113.9ドルくらいの誤差が出るモデルですよ」っていうのがわかります。
SignateでのAirbnbコンペでも、この評価指標が使われています。
<img width="915" alt="スクリーンショット 2020-06-19 21.53.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/e087824d-0752-db99-d50e-54e70167d9c7.png">
参考(https://funatsu-lab.github.io/open-course-ware/basic-theory/accuracy-index/#rmse)

**平均誤差率**
RMSPEと呼ばれる指標です。
<img width="603" alt="スクリーンショット 2020-06-19 22.00.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/56b2a652-a19b-2071-aad9-8b1ad76ac3bb.png">
参考（https://qiita.com/23tk/items/2dbb930242eddcbb75fb）

###影響度の高い要因
<img width="523" alt="スクリーンショット 2020-06-19 22.05.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/c0c721f4-421f-c2e8-2e9f-96abe2624aa7.png">
予測結果におおきく影響を与える要因が確認できます。

**１位は「room_typeごとのyの平均」**
一軒家の平均価格、プライベートルームの平均価格、シェアルームの平均価格が大きく影響しているようです。
これはvaristaの自動特徴量エンジニアリングの機能によって作られた特徴です。
通常では人の手でこう言った特徴をひとつづつ追加するのですが、知識がなくても自動で価値のある列を生成してくれるのもAutoMLの強みだと思います。
<img width="580" alt="スクリーンショット 2020-06-19 22.09.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/d06ec85f-e623-0f86-2f48-50f03925e9c5.png">

**２位、３位...は「accommodates」、「bedrooms」...**
これらの列は相関関係で確認した通り、元から相関度の高い列でしたね。
しっかりと価格予測時に参考にされているのがわかります。

**zipcodeごとのyの平均**
要するに地区毎の平均価格も影響を与えているようです。
日本で言うと千代田区での平均価格、世田谷区での平均価格といったようなものなので、確かに価格設定時には参考になりそうです。
<img width="581" alt="スクリーンショット 2020-06-19 22.19.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/4ef32d9b-7f7f-5c17-1782-0e6d214ea0e2.png">

#モデルの改善⚡️
機械学習において精度を改善するためにとる手段は大きく分けて以下の4つがあります。
1. データの改善
2. アルゴリズムの変更
3. パラメータの調整
4. 学習パイプラインの改善

まずは４の学習パイプラインの改善を行います。
varistaでは学習時の設定で、学習レベル、検証データの割合、交差検証の分割数を変更することができます。
<img width="820" alt="スクリーンショット 2020-06-19 22.28.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/e3f7dd7b-ac57-877d-b64c-ab455b4ca5e9.png">
学習レベルを変更することで、探索するアルゴリズム数、探索時のイテレーション数などを増やすことができます。
また検証データの割合を減らすことで、簡単に精度の改善が見込めます。
しかし、あまりにデータセット数が少ない場合だと、スコア算出時のデータに偏りが生じてしまい、精度の信憑性が下がってしまう可能性があるので要注意です。
さらに、交差検証の分割数を増やすことで、パラメータチューニングや特徴選択の精度をあげることができますが、デメリットとして学習時間が長くなることが挙げられます。

以下の変更をして再学習します。
学習レベル：1 -> 3
検証データの割合:20 -> 5%
交差検証の分割数:3（そのまま）

#学習結果2
<img width="1674" alt="スクリーンショット 2020-06-20 16.29.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620435/41b2ebd7-9381-2e91-7dee-2e9ced740d19.png">
###改善結果
スコアが３上昇しました🔥
平均誤差もわずかですがよくなりました。

このように学習データを少し増やすだけでも、精度が改善されるのがわかります。
もっと大きく改善したい場合は通してもデータそのものをいじる必要が出てくるので、それはまたの機会に。

#おわり🍕
ノンコーディングでもデータサイエンスを行うのに便利なツールがたくさんで始めています。
さまざまな技術を駆使して、データから得られる有益な情報を活用してみましょう！
これから機械学習を学ぼうと思っている方も、AutoMLを利用して、基礎概念を体系的に身に付けておくのもありだと思います。