線形回帰モデルの評価指標
決定係数(R-squared)は、線形回帰モデルの適合度を示す指標です。0から1の範囲で値を取り、1に近いほどモデルの説明力が高いことを示します。
調整済み決定係数(Adjusted R-squared)は、変数の数を考慮した適合度指標です。同様に0から1の範囲で値を取り、1に近いほどモデルの適合度が高いことを示します。
P値は、説明変数の統計的有意性を示す確率値です。0から1の範囲で値を取り、通常0.05以下の場合、その変数は目的変数と有意な関係があると判断されます。
事前に必要なライブラリをインストールします:
pip install statsmodels scikit-learn pandas matplotlib
単回帰分析の実装と評価
データ読み込みとモデル構築
# データの読み込み
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
# データセットの読み込み
data = pd.read_excel('IT業界給与データ.xlsx')
# 説明変数(勤続年数)
X = data[['勤続年数']].values
# 目的変数(給与)
y = data['給与'].values
# 線形回帰モデルの作成と学習
model = LinearRegression()
model.fit(X, y)
# 回帰直線の可視化
plt.figure(figsize=(10, 6))
plt.scatter(X, y, alpha=0.6, label='実際のデータ')
plt.plot(X, model.predict(X), color='red', linewidth=2, label='回帰直線')
plt.title('勤続年数と給与の関係')
plt.xlabel('勤続年数(年)')
plt.ylabel('給与(円)')
plt.legend()
plt.grid(True)
plt.show()
print(f'傾き: {model.coef_[0]:.2f}')
print(f'切片: {model.intercept_:.2f}')
統計的評価の実行
import statsmodels.api as sm
# 定数項の追加
X_with_const = sm.add_constant(X)
# OLSモデルの適合
ols_model = sm.OLS(y, X_with_const).fit()
# 詳細な統計結果の表示
print(ols_model.summary())
結果の解釈例
出力結果に基づき、以下の点を確認します:
- R-squared値が0.85以上であれば、モデルの適合度が高い
- 各係数のP値が0.05以下であれば、統計的に有意
- 切片と傾きの信頼区間を確認
多項式回帰の実装
二次回帰モデルの構築
from sklearn.preprocessing import PolynomialFeatures
# 二次特徴量の生成
poly_features = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly_features.fit_transform(X)
# 多項式回帰モデルの学習
poly_model = LinearRegression()
poly_model.fit(X_poly, y)
# 結果の可視化
plt.figure(figsize=(10, 6))
plt.scatter(X, y, alpha=0.6, label='実際のデータ')
X_sorted = np.sort(X, axis=0)
plt.plot(X_sorted, poly_model.predict(poly_features.transform(X_sorted)),
color='green', linewidth=2, label='二次回帰曲線')
plt.title('勤続年数と給与の関係(二次回帰)')
plt.xlabel('勤続年数(年)')
plt.ylabel('給与(円)')
plt.legend()
plt.grid(True)
plt.show()
print(f'回帰式: y = {poly_model.coef_[1]:.2f}x + {poly_model.coef_[0]:.2f}x² + {poly_model.intercept_:.2f}')
多項式回帰の評価
# 定数項を追加して統計的評価
X_poly_const = sm.add_constant(X_poly)
poly_ols = sm.OLS(y, X_poly_const).fit()
print(poly_ols.summary())
モデル性能の比較
R²値の算出と比較
from sklearn.metrics import r2_score
# 線形回帰のR²
linear_r2 = r2_score(y, model.predict(X))
# 多項式回帰のR²
poly_r2 = r2_score(y, poly_model.predict(X_poly))
print(f'線形回帰 R²: {linear_r2:.4f}')
print(f'多項式回帰 R²: {poly_r2:.4f}')
print(f'R²の差: {poly_r2 - linear_r2:.4f}')
多項式回帰の方が高いR²値を示す場合、非線形の関係性が存在する可能性があります。ただし、過学習に注意が必要です。
実践的な応用例
交互作用項を含む回帰
# 交互作用項の作成例
# 新しい特徴量として経験年数とスキルレベルの交互作用を追加
data['経験_スキル交互作用'] = data['勤続年数'] * data['スキルレベル']
# 複数の説明変数を含むモデル
X_multi = data[['勤続年数', 'スキルレベル', '経験_スキル交互作用']]
X_multi_const = sm.add_constant(X_multi)
multi_model = sm.OLS(y, X_multi_const).fit()
print(multi_model.summary())
モデル診断
# 残差のプロット
residuals = ols_model.resid
fitted_vals = ols_model.fittedvalues
plt.figure(figsize=(12, 4))
# 残差 vs. フィット値
plt.subplot(1, 2, 1)
plt.scatter(fitted_vals, residuals, alpha=0.6)
plt.axhline(y=0, color='red', linestyle='--')
plt.xlabel('フィット値')
plt.ylabel('残差')
plt.title('残差プロット')
# Q-Qプロット
plt.subplot(1, 2, 2)
sm.qqplot(residuals, fit=True, line='45', ax=plt.gca())
plt.title('正規Q-Qプロット')
plt.tight_layout()
plt.show()
これらの可視化により、モデルの仮定(線形性、正規性、等分散性)が満たされているかを確認できます。