はじめに
今回は重回帰分析の実装と結果の考察を行います。実装はsklaernを使って行っていきます。
また本記事におけるコードはGoogle Colabで実装することを前提としています。
今回使用するデータセットの詳細は以下の通りです。
データセット: UCI Machine Learning Repository, Wine Quality
URL: https://archive.ics.uci.edu/dataset/186/wine+quality
目次
- 重回帰分析について
- データセットの確認
- 重回帰分析の実装
- 結果の可視化と解釈
- まとめ
前回の記事では単回帰分析を扱っていますので、そちらを読んでいただくと今回の内容がより理解しやすくなると思います。あわせて読んでいただけると嬉しいです。
本記事は初学者による学習記録を兼ねています。内容に誤りがある可能性もありますので、その際はコメント等でご指摘いただけると嬉しいです。
また実装を目的としていますので数学的な詳細な解説は省略します。今後、数式の導出や統計的な背景についての記事も投稿予定です。
1. 重回帰分析について
重回帰分析とは複数の特徴量$x$を使って従属変数$y$を説明または予測する統計的手法のことを言います。
回帰式は次のように表されます。
$$
y = w_0 + w_1x_1 + w_2x_2+…+w_nx_n
$$
ここで$w_0$は定数項、$w$は回帰係数、$x$は特徴量を表しています。
例えば家賃予測では、間取り・駅からの距離・築年数などの要素が複雑に関わって家賃が決まります。この場合、家賃が $y$、各要素が $x_1, x_2, ..., x_n$ に対応します。
また重回帰分析の注意点として多重共線性というものがあります。これはある変数が他のある変数で説明できる状態のことを指す言葉で多重共線性が発生してしまうと回帰係数が不安定になり、分析の信頼性が下がってしまいます
2. データセットの確認
本記事で使用する Wine Quality データセット には、赤ワイン(red)と白ワイン(white)の2種類のデータが含まれています。それぞれサンプル数が異なりますが、本記事では赤ワインデータ(red) を対象にモデルを構築します。
赤ワインデータには 11個の特徴量(酸度・糖分・pH・アルコール度数などの化学的性質)が含まれており、これらを説明変数として使用します。従属変数は ワインの品質スコア(quality) で、専門家の評価に基づき 1〜10の整数値 でラベル付けされています。まずはデ-タを読み込んでいきます。
import pandas as pd
import numpy as np
data = pd.read_csv('winequality_red.csv',sep = ';')
注意点としてこのwinequality_red.csvは セミコロン ; で区切られているためsep = ' ; 'という引数を指定しないとデータを正しく読み取れません。
2-1. 特徴量と統計量の確認
次に、各特徴量の統計量を確認します。
以下のコードを実行すると、count(データ数)
・mean(平均)
・std(標準偏差)
・min/max(最小/最大値)
などの基礎統計量が表示されます。
data.describe()
実行結果
fixed acidity volatile acidity citric acid residual sugar chlorides free sulfur dioxide total sulfur dioxide density pH sulphates alcohol quality
count 1599.000000 1599.000000 1599.000000 1599.000000 1599.000000 1599.000000 1599.000000 1599.000000 1599.000000 1599.000000 1599.000000 1599.000000
mean 8.319637 0.527821 0.270976 2.538806 0.087467 15.874922 46.467792 0.996747 3.311113 0.658149 10.422983 5.636023
std 1.741096 0.179060 0.194801 1.409928 0.047065 10.460157 32.895324 0.001887 0.154386 0.169507 1.065668 0.807569
min 4.600000 0.120000 0.000000 0.900000 0.012000 1.000000 6.000000 0.990070 2.740000 0.330000 8.400000 3.000000
25% 7.100000 0.390000 0.090000 1.900000 0.070000 7.000000 22.000000 0.995600 3.210000 0.550000 9.500000 5.000000
50% 7.900000 0.520000 0.260000 2.200000 0.079000 14.000000 38.000000 0.996750 3.310000 0.620000 10.200000 6.000000
75% 9.200000 0.640000 0.420000 2.600000 0.090000 21.000000 62.000000 0.997835 3.400000 0.730000 11.100000 6.000000
max 15.900000 1.580000 1.000000 15.500000 0.611000 72.000000 289.000000 1.003690 4.010000 2.000000 14.900000 8.000000
countが1599ですべての値が同じ数値であることから欠損値は確認できません。また目標値である qualityは1~10の範囲の整数値を取りますがmax
が 8 とmin
が 3 となっており、データが偏っていることが見て取れます。
また特徴量を見ると多重共線性が発生するようなものはないことが確認できます。
次にデータセットの分割していきます。
x = data.iloc[:,:-1].values
y = data.iloc[:,-1].values
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.2,random_state = 0)
これでデータセットの準備が完了したので実装に移ります。
3. 重回帰分析の実装
以下のコードでモデルを作成していきます。
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(x_train,y_train)
次にモデルを使って予測をしていきます。
y_pred = reg.predict(x_test)
これでモデルと予測が完了しました。
4. 結果の可視化と解釈
決定係数と二乗平均平方根誤差(RMSE)を使ってモデルの評価をしていきます。決定係数はデータに対するモデルの当てはまりの良さを表す指標で値が1に近いほど当てはまりが良いということになります。RMSEは、各予測値と実測値の差の二乗平均の平方根で表される指標です。値が小さいほど、モデルの予測が実測値に近いことを示します。
from sklearn.metrics import r2_score
r2score = r2_score(y_test,y_pred)
print(f"決定係数: {r2score:.3f}")
実行結果
決定係数: 0.328
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
print(f"RMSE: {rmse:.3f}")
実行結果
RMSE: 0.620
決定係数 0.328 は、モデルが品質のばらつきの約 33% を説明できていることを意味します。一方、RMSE が 0.62 であることから、品質スコアの予測誤差はおおよそ ±0.6 ポイント程度であることがわかります。
今回のモデルは、決定係数から見ると十分な精度を得られていません。
その要因としては、データが偏っていることに加え、ワインの品質評価には主観的な要素が多く含まれていることが考えられます。
そのため、化学的指標だけで品質スコアを正確に予測するのは難しいと言えます。
また、線形回帰は線形関係を前提としているため、非線形な要因を十分に捉えられない可能性もあります。
一方、RMSEは 0.62 で、品質スコアの範囲(3〜8)を考えるとまずまずの精度だと言えます。
このことから、モデルは完全ではないものの、予測の目安として一定の精度はあると考えられます。
5. まとめ
今回は赤ワインの品質スコアを説明するため、11個の化学的特徴量を用いて重回帰分析を実施しました。決定係数は 0.328 で、モデルは品質のばらつきの約 33% を説明できる結果となりました。しかし、ワインの評価には主観的要素が多く、化学的指標だけでは十分に予測できなかったと考えられます。
また、線形回帰は非線形な関係を捉えられないため、精度向上には非線形モデルの導入や特徴量の工夫が必要です。
本分析を通して、重回帰分析の実装方法や評価指標の読み方について理解を深めることができました。
説明が不十分なところもありますが、今後も学習内容を更新していく予定です。ぜひ読んでいただけると嬉しいです。