アパートの家賃データで重回帰分析を行う

# はじめに
本記事ではPythonで重回帰分析を行い、アパートの「家賃」を「面積」、「築年数」、「駅徒歩分」の3つの情報から推定します。実績データは「[応用情報処理 | 第11回 重回帰分析(1) | アパートの家賃][multiple]」からお借りしました。

[multiple]:https://www3.cuc.ac.jp/~nagaoka/2011/ouyou/11/rent/index.html

# 環境
python 3.10.4
Windows 11 Home

# 重回帰分析とは
重回帰分析とは、予測したいデータ（目的変数）に対して、複数の要因データ（説明変数）との関係を数式で表現する統計的な手法で、教師あり学習のひとつである回帰分析に分類されます。今回は目的変数の「家賃」を、説明変数の「面積」、「築年数」、「駅徒歩分」を使って予測します。

# 使用するデータの構造
実績データをもとに予測データの家賃を推測します。（予測データは新規に作成しました。）

## 実績データ（一部省略）
| 所在地 | 家賃 | 面積 | 築年数 | 駅徒歩分 |
| ---- | ---- | ---- | ---- | ---- |
| 市川市真間 | 60000 | 23.15 | 19 | 7 |
| 市川市新田 | 77000 | 23.19 | 16 | 2 |
| 市川市真間 | 60000 | 32.05 | 19 | 10 |
| 市川市新田 | 62000 | 18.0 | 14 | 11 |
|市川市市川南 | 64000 | 21.11 | 0 | 2 |
| 以降データが続く |  | | | | 

## 予測データ
| 面積 | 築年数 | 駅徒歩分 |
| ---- | ---- | ---- |
| 20.00 | 5 | 10 | 
| 18.50 | 10 | 5 | 
| 25.00 | 3 | 15 | 
| 30.00 | 20 | 10 | 
| 22.00 | 1 | 3 | 

# 使用するライブラリ
使用するライブラリは以下の3つで、「openpyxl」はExcelファイルを読み込むのに、「statsmodels」は重回帰分析を行うのに使用します。

```python
pip install pandas
pip install openpyxl
pip install statsmodels
```
# 作成コード
作成したコードは以下になります。

```python
import pandas as pd
import numpy as np
import statsmodels.api as sm

df_rent = pd.read_excel("rent.xlsx", index_col=0) #実績データ

#説明変数の設定
exp_val = ['面積','築年数','駅徒歩分']
x = df_rent[exp_val]
x2 = sm.add_constant(x) #切片を計算するために説明変数のデータの中に全て1からなる列を追加

#目的変数の設定
obj_val = ['家賃'] 
y = df_rent[obj_val]

#線形回帰モデルを作る
model = sm.OLS(y,x2)
result = model.fit()

#サマリを表示する
print(result.summary())

#予測結果を表示する
df_guess = pd.read_csv("rent_guess.csv") #予測データ
print(result.predict(sm.add_constant(df_guess[exp_val])))
```

# 実行結果
プログラムを実行し、サマリと家賃予測を取得しました。

## サマリ
サマリは以下の通りです。
※重要な項目を赤枠で囲んでいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292716/2e4d5c42-189c-be82-48bc-ccfba03314e2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292716/b705d5a3-e51b-23ae-892f-4d7caaf461f8.png)
- `Adj. R-squared`
自由度調整済み決定係数。0から1までの値を取り、値が高いほど説明変数が目的変数を説明できている。
- `coef`
回帰分析により推定された偏回帰係数。
- `P>|t|`
P値。一般的に0.05未満なら説明変数が目的変数に関係があり、0.05以上なら関係がない。

今回のデータでは、自由度調整済み決定係数は`0.637`となったため、「家賃」は「面積」、「築年数」、「駅徒歩分」でそれなりに説明ができていると言えそうです。


偏回帰係数の結果から、家賃は以下の式で推定できます。

`(家賃) = 5.03e+04 + 1049.4559 × (面積) - 528.4512 × (築年数) - 450.3272 × (駅徒歩分)`

面積が広くなると家賃が上がり、築年数、駅徒歩分が上がると家賃が下がることが分かります。


P値は全て`0.000`となったため、「面積」、「築年数」、「駅徒歩分」は「家賃」に関係していることが分かります。

## 予測結果
家賃の予測結果は以下の通りです。

| 家賃予測（円） | 
| ---- | 
| 64142.260655 |  
| 62177.457174 |  
| 68194.806480 |  
| 66710.052752 |  
| 71507.267938 |  

予測データの情報と並べると以下のようになります。
| 面積 | 築年数 | 駅徒歩分 | 家賃予測（円） |
| ---- | ---- | ---- | ---- |
| 20.00 | 5 | 10 | 64142.260655 | 
| 18.50 | 10 | 5 | 62177.457174 | 
| 25.00 | 3 | 15 | 68194.806480 | 
| 30.00 | 20 | 10 | 66710.052752 | 
| 22.00 | 1 | 3 | 71507.267938 |

# 終わりに
今回はアパートの家賃データで重回帰分析を行いました。
今回のデータはP値が全て`0.000`であったため、説明変数の数を調整する必要がありませんでした。ですが実際のデータを使って分析をする場合、P値が0.05以上になる説明変数を削除して、自由度調整済み決定係数の数値を上げる工程が必要になると考えられます。

# 参考
この記事は以下の動画・記事を参考にして執筆しました。
・[Pythonで重回帰分析をしてみよう【Python機械学習#4】](https://www.youtube.com/watch?v=XH1kdoF1vF8)
・[重回帰分析完全ガイド：基礎から応用事例まで](https://www.intra-mart.jp/im-press/useful/multi-regression_analysis)
・[統計検定WEB 2-4.回帰分析2](https://bellcurve.jp/statistics/course/25851.html)