機械学習入門（面積と家賃の関係をPythonで分析）

---
今回は機械学習入門として線形回帰を学びます！

---
部屋の「面積」と「家賃」の関係をデータで調べたいこと、ありませんか？  
Pythonの「線形回帰」を使うと、簡単に面積が家賃にどのように影響しているかをモデル化し、結果をグラフや数値で確認できます！

---

## 線形回帰とは？

**線形回帰**は、「1つまたは複数の説明変数（面積など）」が「目的変数（家賃など）」にどのように影響しているかを調べる方法です。  
簡単に言えば、「直線」でデータの傾向を表します。

その直線の方程式は以下の形になります：

- **家賃 = 傾き × 面積 + 切片**

ここで、
- **傾き**: 面積が1㎡増えるごとに家賃がどれだけ増えるかを示します。
- **切片**: 面積が0㎡だった場合の基準値を示します。

---

## 必要な準備

まず、Pythonで必要なライブラリをインストールします。グラフを日本語で表示するために`japanize-matplotlib`もインストールしましょう。

### コード
```python
!pip install japanize-matplotlib
```

---

## サンプルデータを作成する

今回はランダムなデータを使って、面積と家賃の関係をシミュレーションします。現実的な値になるよう、面積や家賃が0以上になるように調整します。

### コード
```python
import japanize_matplotlib
from sklearn.datasets import make_regression
import pandas as pd

# データ生成
# サンプル数20、特徴量1、ノイズあり
X, y = make_regression(n_samples=20, n_features=1, noise=10, random_state=42)

# 面積と家賃が0以上になるよう調整
X = X - X.min()  # 面積を0以上にする
y = y - y.min()  # 家賃を0以上にする
y = y * 1000     # 家賃を現実的な値にスケールアップ

# データフレームに変換
data = pd.DataFrame({'面積': X.flatten(), '家賃': y})
```

---

## 線形回帰モデルを作成

データを使って、面積と家賃の関係を表すモデルを作成します。

### コード
```python
from sklearn.linear_model import LinearRegression

# モデルを作成して学習
model = LinearRegression()
model.fit(data[['面積']], data['家賃'])
```

---

## グラフで結果を確認

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911921/46108d01-8442-5033-206b-2ff29a0204fb.png)


データ点（面積と家賃の関係）と、線形回帰の結果で得られた「回帰直線」をグラフに描画します。

### コード
```python
import matplotlib.pyplot as plt

# 散布図と回帰直線を描画
plt.scatter(data['面積'], data['家賃'], color='blue', label='データ点')
plt.plot(data['面積'], model.predict(data[['面積']]), color='red', label='回帰直線')
plt.xlabel('面積 (㎡)')
plt.ylabel('家賃 (円)')
plt.title('回帰分析: 面積と家賃の関係')
plt.legend()
plt.grid()
plt.show()
```

---

## 結果の評価

モデルの結果を数値で確認し、どのように評価するかを説明します。

### コード
```python
from sklearn.metrics import mean_squared_error, r2_score

# 回帰係数（傾き）と切片
print(f"回帰係数（傾き）: {model.coef_[0]:.2f} 円/㎡")
print(f"切片（b）: {model.intercept_:.2f} 円")

# モデルの予測値
y_pred = model.predict(data[['面積']])

# 平均二乗誤差 (MSE)
mse = mean_squared_error(data['家賃'], y_pred)
print(f"平均二乗誤差（MSE）: {mse:.2f}")

# 決定係数 (R²スコア)
r2 = r2_score(data['家賃'], y_pred)
print(f"決定係数（R²スコア）: {r2:.2f}")
```

### 解説

1. **回帰係数（傾き）:**
   - 1㎡あたりの家賃の増加額を示します。例えば「1927円/㎡」であれば、面積が1㎡増えるごとに家賃が1927円増加します。

2. **切片（b）:**
   - 面積が0㎡のときの家賃を示します。現実では面積0の部屋はありませんが、モデルの基準値として重要です。

3. **平均二乗誤差（MSE）:**
   - 実際の家賃と予測家賃のズレを数値化したものです。値が小さいほど良いモデルといえます。

4. **決定係数（R²スコア）:**
   - モデルの説明力を示します。値が1に近いほど「データをよく説明できている」と言えます。

---

## 予測をしてみる

面積が45㎡の部屋の家賃を予測します。

### コード
```python
# 面積45㎡のときの家賃を予測
new_data = pd.DataFrame({'面積': [45]})
predicted_rent = model.predict(new_data)
print(f"面積45㎡のときの予測家賃: {predicted_rent[0]:.2f} 円")
```

---

## 実行結果

### グラフ
- 青い点はデータ点。
- 赤い線は回帰直線（予測の傾向を示す線）。

### 数値出力
```plaintext
回帰係数（傾き）: 1927.03 円/㎡
切片（b）: 32899.25 円
平均二乗誤差（MSE）: 15490255.78
決定係数（R²スコア）: 0.92
面積45㎡のときの予測家賃: 119714.69 円
```
## 全コード　
```python
# matplotlibで日本語を扱えるようにする
!pip install japanize-matplotlib  # 日本語化モジュールをインストールする
import japanize_matplotlib

# ライブラリのインポート
from sklearn.datasets import make_regression
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

# データの生成
# サンプル数20、特徴量1、ノイズあり
X, y = make_regression(n_samples=20, n_features=1, noise=10, random_state=42)

# 面積 (X) と 家賃 (y) を 0 以上に調整
X = X - X.min()  # 面積が負にならないように調整
y = y - y.min()  # 家賃が負にならないように調整
y = y * 1000     # 家賃をスケールアップ

# データフレームに変換
data = pd.DataFrame({'面積': X.flatten(), '家賃': y})
X = data[['面積']]
y = data['家賃']

# モデルの作成
model = LinearRegression()
model.fit(X, y)

# 散布図と回帰直線の描画
plt.scatter(X, y, color='blue', label='データ点')
plt.plot(X, model.predict(X), color='red', label='回帰直線')
plt.xlabel('面積 (㎡)')
plt.ylabel('家賃 (円)')
plt.title('回帰分析: 面積と家賃の関係')
plt.legend()
plt.grid()
plt.show()

# モデルの性能評価
print(f"回帰係数（傾き）: {model.coef_[0]:.2f} 円/㎡")
print(f"切片（b）: {model.intercept_:.2f} 円")
y_pred = model.predict(X)
print(f"平均二乗誤差（MSE）: {mean_squared_error(y, y_pred):.2f}")
print(f"決定係数（R²スコア）: {r2_score(y, y_pred):.2f}")

# 面積が45㎡のときの家賃を予測
new_data = pd.DataFrame({'面積': [45]})
predicted_rent = model.predict(new_data)
print(f"面積45㎡のときの予測家賃: {predicted_rent[0]:.2f} 円")


```
---

## まとめ

- 線形回帰を使うと、面積と家賃の関係を簡単にモデル化できます。
- 決定係数（R²）が0.92と高いため、このモデルは「面積」と「家賃」の関係をよく説明していると言えます。
- このモデルを応用すれば、さまざまなデータの傾向を可視化できます！

---