今回は機械学習入門として線形回帰を学びます!
部屋の「面積」と「家賃」の関係をデータで調べたいこと、ありませんか?
Pythonの「線形回帰」を使うと、簡単に面積が家賃にどのように影響しているかをモデル化し、結果をグラフや数値で確認できます!
線形回帰とは?
線形回帰は、「1つまたは複数の説明変数(面積など)」が「目的変数(家賃など)」にどのように影響しているかを調べる方法です。
簡単に言えば、「直線」でデータの傾向を表します。
その直線の方程式は以下の形になります:
- 家賃 = 傾き × 面積 + 切片
ここで、
- 傾き: 面積が1㎡増えるごとに家賃がどれだけ増えるかを示します。
- 切片: 面積が0㎡だった場合の基準値を示します。
必要な準備
まず、Pythonで必要なライブラリをインストールします。グラフを日本語で表示するためにjapanize-matplotlib
もインストールしましょう。
コード
!pip install japanize-matplotlib
サンプルデータを作成する
今回はランダムなデータを使って、面積と家賃の関係をシミュレーションします。現実的な値になるよう、面積や家賃が0以上になるように調整します。
コード
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})
線形回帰モデルを作成
データを使って、面積と家賃の関係を表すモデルを作成します。
コード
from sklearn.linear_model import LinearRegression
# モデルを作成して学習
model = LinearRegression()
model.fit(data[['面積']], data['家賃'])
グラフで結果を確認
データ点(面積と家賃の関係)と、線形回帰の結果で得られた「回帰直線」をグラフに描画します。
コード
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()
結果の評価
モデルの結果を数値で確認し、どのように評価するかを説明します。
コード
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㎡あたりの家賃の増加額を示します。例えば「1927円/㎡」であれば、面積が1㎡増えるごとに家賃が1927円増加します。
-
切片(b):
- 面積が0㎡のときの家賃を示します。現実では面積0の部屋はありませんが、モデルの基準値として重要です。
-
平均二乗誤差(MSE):
- 実際の家賃と予測家賃のズレを数値化したものです。値が小さいほど良いモデルといえます。
-
決定係数(R²スコア):
- モデルの説明力を示します。値が1に近いほど「データをよく説明できている」と言えます。
予測をしてみる
面積が45㎡の部屋の家賃を予測します。
コード
# 面積45㎡のときの家賃を予測
new_data = pd.DataFrame({'面積': [45]})
predicted_rent = model.predict(new_data)
print(f"面積45㎡のときの予測家賃: {predicted_rent[0]:.2f} 円")
実行結果
グラフ
- 青い点はデータ点。
- 赤い線は回帰直線(予測の傾向を示す線)。
数値出力
回帰係数(傾き): 1927.03 円/㎡
切片(b): 32899.25 円
平均二乗誤差(MSE): 15490255.78
決定係数(R²スコア): 0.92
面積45㎡のときの予測家賃: 119714.69 円
全コード
# 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と高いため、このモデルは「面積」と「家賃」の関係をよく説明していると言えます。
- このモデルを応用すれば、さまざまなデータの傾向を可視化できます!