線形回帰モデルによる価格予測機能を組み込んだ空き家貸し借りアプリをRuby on Railsで開発

# はじめに
Ruby on Railsを使って、空き家を貸し借りできるwebアプリを開発しました。ただし、正式に公開する前提で開発はしておらず、あくまでデモとして開発しました。

開発した目的としては、rails開発の訓練のためと、ポートフォリオを作成したかったためです。

この記事ではそのwebアプリの解説をしております。

線形回帰モデルによる価格予測の実装については中盤辺りに記載してます。

## 注意点

1.このwebアプリはRuby on Railsチュートリアルで公開されているソースコードをベースに開発しました。

2.サーバーサイドの実装の訓練が目的で開発をしたため、フロントエンド関連はほとんど手を入れておりません。

## ソースコード
ソースコードはgithubで公開しております。
https://github.com/Ryota7101/null_house


## 参考にさせていただいた記事
[Ruby on Railsチュートリアル](https://railstutorial.jp/)
[rails 予約機能をつける。（一回目） ](https://qiita.com/kitaokeita/items/77f66016075a2b773376)
[Railsでコメント機能をつくってみよう](https://qiita.com/nojinoji/items/2034764897c6e91ef982)
[Railsで「投稿お気に入り追加機能」を実装する](https://qiita.com/YukiWebTech/items/ad4e85fb64b00a771aa3)
[railsで検索フォームを作ろう！！](https://qiita.com/yusuko/items/cff4e46aeafbc3beecf2)

大変お世話になりました。ありがとうございます。

## HOME画面
ログインしてない場合のHome画面です
<img width="1433" alt="スクリーンショット 2019-07-28 15.20.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239266/3183599b-4722-b019-e505-d27bc986e95f.png">

サインアップ画面です
<img width="1432" alt="スクリーンショット 2019-07-28 15.23.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239266/e7f93a38-e5ca-dd62-de21-18bfdb0c5fe5.png">


届いたメールのURLをクリックし、アカウント有効化をすると自身のプロフィール画面にジャンプします。
<img width="1219" alt="スクリーンショット 2019-07-28 15.52.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239266/427f9532-43d1-57ff-bc5e-b2c98805ed80.png">

## 空き家を貸し出す

空き家を貸出しします
<img width="1092" alt="スクリーンショット 2019-07-28 15.55.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239266/2ba487e2-20f9-e3e9-9376-6f0fb4fc92bf.png">

作成すると、自身のプロフィールページにある「あなたが貸しに出してる空き家」の箇所に作成した空き家のタイトル名が表示されます。

<img width="1124" alt="スクリーンショット 2019-07-28 15.56.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239266/7a72c940-7e94-b0b3-05b6-79567baca7c6.png">

## 空き家の詳細ページ

以下は作成された空き家の詳細ページになります。
1.空き家のタイトル
2.空き家の説明文
3.空き家の貸出者
4.お気に入り機能
5.空き家へのコメント
6.空き家の内覧予約
7.空き家の適正価格算出
8.空き家の借用に対してされたオファーの内容(後述)

<img width="1318" alt="スクリーンショット 2019-07-28 16.18.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239266/343a6e54-9929-7c20-6442-da449f935d2f.png">



### 様々な機能
* お気に入りボタンを押すと、その空き家がお気に入りに登録されます。
* コメント欄に文章を入力すると、コメントが表示されます。
* 内覧予約の開始時間と終了時間に日時を入力すると、予約が表示されます。
<img width="1285" alt="スクリーンショット 2019-07-28 16.22.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239266/43bb969f-9922-c074-3a27-d572b2c3d4b2.png">

自身のプロフィールページにある「あなたがお気に入りに追加した空き家」の欄に、お気に入りに登録した空き家のタイトルが表示されます。

<img width="1197" alt="スクリーンショット 2019-07-28 16.23.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239266/8b4e5a46-4e3a-0805-e568-e68f2852cfc8.png">



### 家賃適正価格予測機能
回帰分析を用いて、空き家作成時に入力したサイズなどの値を元に、家賃の適正価格を表示します。


```python:(モデル作成ソース)
import numpy as np 
import pandas as pd 
from sklearn import linear_model

##データセットはランダムに作成
data = {'layout' : [2, 1, 3, 4, 5], 
        'land_area' : [40, 20, 30, 55, 65],
        'building_area' : [50, 20, 35, 60, 70],
        'age_of_a_building' : [40, 50, 30,20,10],
        'adoress' : [7, 3, 8, 4, 1],
        'price' : [48000, 29000, 33000,55000,67000]}
         
df = pd.DataFrame(data)

Y_train = df['price']
X_train = df.drop("price", axis=1)

lm_model = linear_model.LinearRegression()
lm_model.fit(X_train,Y_train)

print("切片 =",lm_model.intercept_)
print("回帰係数 =",lm_model.coef_)
```

```
切片 = 27073.62274689006
回帰係数 = [    4.82355928 -1097.43589744  1625.64102564   -48.23559279
 -2076.92307692]
```

```ruby
def lm(x1,x2,x3,x4,x5)
   (27073 + 4.82355928*x1 - 1097.43589744*x2 + 1625.64102564*x3  - 48.23559279*x4 - 2076.92307692*x5).to_i
  end
```


```erb
<% if current_user.id == @house.user_id %>
    <h3>家賃予測価格</h3>
    <p>この空き家の１ヶ月の適正価格は<%= lm(x1,x2,x3,x4,x5) %>円です</p>
  <% end %>
```

## プレミアム会員機能
プレミアム会員のユーザーに対して、特定の表示を行います。
<img width="1218" alt="スクリーンショット 2019-07-28 16.32.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239266/54461c8e-cd4d-6cf1-c7a6-93a8b357febb.png">

```erb
<% if @user.premium? %>
    <h4>あなたはプレミアム会員です!!</h4>
  <% end %>
```

## オファーを出す

空き家を借りたいときに、オファーを出すフォーム画面です。
<img width="1214" alt="スクリーンショット 2019-07-28 16.56.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239266/4f5fdb50-9bc5-96d3-3a57-a29d0e16d1ff.png">

オファーを出すと、出された側の空き家ページにオファーの内容が表示されます。

```erb

<h3>オファー一覧</h3>
  <% if @offer %>
    user id : <%= @offer.user_id%><%= @offer.use %>
  <% end %>
```

<img width="1262" alt="スクリーンショット 2019-07-28 17.04.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239266/d91ab481-3466-d5ae-c9da-c0b902bc1dfb.png">

## 管理画面

管理者のみがアクセスできる管理画面を作成しました。

```ruby

def ensure_correct_user
    if current_user.admin?
      #何もしない
    else
      flash[:notice] = "アクセス権限がありません"
      redirect_to root_url
    end
  end
```

### ユーザー一覧
<img width="1219" alt="スクリーンショット 2019-07-28 16.35.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239266/e99ecd8c-7d07-273f-e8c9-9cf4ed6c3eb1.png">

### コメント一覧
<img width="1207" alt="スクリーンショット 2019-07-28 16.47.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239266/70037803-5af8-6660-b324-218c2d1967f1.png">

### 内覧予約一覧
<img width="1203" alt="スクリーンショット 2019-07-28 16.50.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239266/050dd6c8-02be-25f2-042e-cd7955e89ea4.png">

### データ視覚化画面
<img width="1256" alt="スクリーンショット 2019-07-28 16.52.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239266/4036adfe-fe54-ee14-02f2-45571161f6d5.png">

##　運営からのお知らせ機能

管理画面と同じく、管理者のみがアクセスできるページで、お知らせを作成したりできます
。

### 作成
<img width="1221" alt="スクリーンショット 2019-07-28 17.08.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239266/960c1c3f-b6d2-8911-84c6-7b4ae1655cbc.png">

### 一覧
<img width="1205" alt="スクリーンショット 2019-07-28 17.10.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239266/5c75a0e3-804f-77aa-3340-3b7c1ebd7747.png">

### 詳細
<img width="1207" alt="スクリーンショット 2019-07-28 17.10.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239266/823b3c1c-364b-6139-a0b4-4c270ffd120e.png">

# 今後の課題
* テストがおざなりになってしまったので、テストを書く訓練を今後したい。
* 大規模な機械学習モデルを使用できるようにしたい(GCPにモデルをデプロイして予測を取得したり等)


# 最後に
webアプリ開発において、基本的な機能は実装できるようになったとは思います。
今後実践の機会を増やして、レベルアップしていきたいです。

※コメントやツッコミあればどんどんください！