[Python] 機械学習「重回帰分析」を行うプログラムを実装する
重回帰分析は、複数の独立変数を用いて1つの従属変数を予測する手法です。
Pythonでは、主にscikit-learn
ライブラリを使用して重回帰分析を実装します。
まず、データを準備し、train_test_split
で訓練データとテストデータに分割します。
次に、LinearRegressionクラス
を用いてモデルを作成し、fitメソッド
で訓練データに基づいてモデルを学習させます。
最後に、predictメソッド
でテストデータに対する予測を行い、mean_squared_error
などで精度を評価します。
重回帰分析とは
重回帰分析は、複数の独立変数(説明変数)が1つの従属変数(目的変数)に与える影響を分析する手法です。
この手法は、経済学、社会学、マーケティングなど多くの分野で広く利用されています。
重回帰分析では、独立変数の組み合わせによって従属変数を予測することが可能であり、モデルの精度を高めるために、変数選択や正則化手法を用いることが一般的です。
重回帰分析の結果は、回帰係数として表現され、各独立変数が従属変数に与える影響の大きさを示します。
これにより、データの背後にある関係性を明らかにし、意思決定に役立てることができます。
Pythonで重回帰分析を行うための準備
必要なライブラリのインストール
重回帰分析を行うためには、以下のPythonライブラリが必要です。
これらは、データの操作やモデルの構築に役立ちます。
ライブラリ名 | 用途 |
---|---|
numpy | 数値計算 |
pandas | データ操作 |
scikit-learn | 機械学習モデルの構築 |
matplotlib | データの可視化 |
seaborn | 高度なデータ可視化 |
これらのライブラリは、以下のコマンドでインストールできます。
pip install numpy pandas scikit-learn matplotlib seaborn
データセットの準備
重回帰分析を行うためには、適切なデータセットが必要です。
データセットは、サンプルデータを作成するか、実データを取得する方法があります。
サンプルデータの作成
以下のコードを使用して、簡単なサンプルデータを作成できます。
このデータは、独立変数として「広告費」と「販売促進費」、従属変数として「売上」を持っています。
import pandas as pd
import numpy as np
# サンプルデータの作成
np.random.seed(0)
広告費 = np.random.rand(100) * 1000 # 0から1000の範囲の広告費
販売促進費 = np.random.rand(100) * 500 # 0から500の範囲の販売促進費
売上 = 200 + 1.5 * 広告費 + 2.0 * 販売促進費 + np.random.randn(100) * 50 # 売上の計算
# データフレームの作成
データ = pd.DataFrame({
'広告費': 広告費,
'販売促進費': 販売促進費,
'売上': 売上
})
print(データ.head())
広告費 販売促進費 売上
0 548.813504 215.189366 1090.155202
1 715.189366 204.236208 1160.052052
2 602.763376 164.882278 1030.052052
3 544.883183 196.582363 1090.155202
4 423.654799 186.193202 1000.052052
実データの取得方法(例:CSVファイルの読み込み)
実データを使用する場合、CSVファイルからデータを読み込むことが一般的です。
以下のコードは、CSVファイルを読み込む方法を示しています。
import pandas as pd
# CSVファイルの読み込み
データ = pd.read_csv('データセット.csv')
# データの確認
print(データ.head())
このようにして、重回帰分析に必要なデータセットを準備することができます。
データの前処理
データの前処理は、重回帰分析を行う上で非常に重要なステップです。
適切な前処理を行うことで、モデルの精度を向上させることができます。
以下に、主要な前処理手法を説明します。
欠損値の処理
データセットに欠損値が含まれている場合、モデルの学習に悪影響を及ぼす可能性があります。
欠損値の処理方法には、以下のような方法があります。
方法 | 説明 |
---|---|
削除 | 欠損値を含む行を削除する |
平均値・中央値での補完 | 欠損値を平均値や中央値で埋める |
モデルによる補完 | 他の変数を用いて欠損値を予測する |
以下のコードは、pandas
を使用して欠損値を平均値で補完する例です。
import pandas as pd
# データの読み込み
データ = pd.read_csv('データセット.csv')
# 欠損値の確認
print(データ.isnull().sum())
# 平均値で欠損値を補完
データ.fillna(データ.mean(), inplace=True)
カテゴリ変数のエンコーディング
重回帰分析では、カテゴリ変数を数値に変換する必要があります。
一般的なエンコーディング手法には、以下のものがあります。
方法 | 説明 |
---|---|
ラベルエンコーディング | 各カテゴリに整数を割り当てる |
ワンホットエンコーディング | 各カテゴリをバイナリの列に変換する |
以下のコードは、pandas
を使用してワンホットエンコーディングを行う例です。
# カテゴリ変数のワンホットエンコーディング
データ = pd.get_dummies(データ, columns=['カテゴリ変数名'], drop_first=True)
データの標準化・正規化
データのスケールを揃えることで、モデルの学習が安定し、精度が向上します。
標準化と正規化の主な違いは以下の通りです。
方法 | 説明 |
---|---|
標準化 | 平均を0、標準偏差を1に変換する |
正規化 | データを0から1の範囲にスケーリングする |
以下のコードは、scikit-learn
を使用して標準化を行う例です。
from sklearn.preprocessing import StandardScaler
# 標準化の実施
scaler = StandardScaler()
データ[['広告費', '販売促進費']] = scaler.fit_transform(データ[['広告費', '販売促進費']])
訓練データとテストデータの分割
モデルの性能を評価するためには、データを訓練データとテストデータに分割する必要があります。
一般的には、70%を訓練データ、30%をテストデータとして分割します。
以下のコードは、scikit-learn
を使用してデータを分割する例です。
from sklearn.model_selection import train_test_split
# 特徴量とターゲットの分割
X = データ[['広告費', '販売促進費']]
y = データ['売上']
# 訓練データとテストデータの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
print(X_train.shape, X_test.shape)
このようにして、データの前処理を行い、重回帰分析に適したデータセットを準備することができます。
重回帰モデルの実装
重回帰分析を行うためには、scikit-learn
ライブラリを使用してモデルを構築し、学習させ、評価する必要があります。
以下にその手順を詳しく説明します。
scikit-learnを使った重回帰モデルの作成
scikit-learn
では、重回帰モデルを作成するためにLinearRegressionクラス
を使用します。
以下のコードは、重回帰モデルを作成する例です。
from sklearn.linear_model import LinearRegression
# 重回帰モデルの作成
モデル = LinearRegression()
モデルの学習 (fitメソッド)
モデルを作成したら、訓練データを用いて学習させます。
fitメソッド
を使用して、モデルにデータを適合させます。
# モデルの学習
モデル.fit(X_train, y_train)
モデルの予測 (predictメソッド)
学習が完了したら、テストデータを用いて予測を行います。
predictメソッド
を使用して、従属変数の予測値を取得します。
# モデルの予測
y_pred = モデル.predict(X_test)
# 予測結果の表示
print(y_pred)
モデルの評価指標
モデルの性能を評価するために、いくつかの指標を使用します。
ここでは、決定係数(R²スコア)と平均二乗誤差(MSE)を紹介します。
決定係数(R²スコア)
決定係数は、モデルがどれだけデータの変動を説明できるかを示す指標です。
値は0から1の範囲で、1に近いほどモデルの説明力が高いことを意味します。
from sklearn.metrics import r2_score
# 決定係数の計算
r2 = r2_score(y_test, y_pred)
print(f'決定係数(R²スコア): {r2:.2f}')
平均二乗誤差(MSE)
平均二乗誤差は、予測値と実際の値の差の二乗の平均を示す指標です。
値が小さいほど、モデルの予測精度が高いことを意味します。
from sklearn.metrics import mean_squared_error
# 平均二乗誤差の計算
mse = mean_squared_error(y_test, y_pred)
print(f'平均二乗誤差(MSE): {mse:.2f}')
これらの評価指標を用いることで、重回帰モデルの性能を定量的に評価し、改善の余地を見つけることができます。
重回帰分析の結果の解釈
重回帰分析の結果を正しく解釈することは、モデルの理解や意思決定において非常に重要です。
以下に、回帰係数の意味や多重共線性の確認方法について説明します。
回帰係数の意味
重回帰分析の結果として得られる回帰係数は、各独立変数が従属変数に与える影響の大きさを示します。
具体的には、回帰係数が正の値であれば、その独立変数が増加することで従属変数も増加することを意味し、負の値であれば逆の関係を示します。
例えば、広告費の回帰係数が1.5であれば、広告費が1単位増加するごとに売上が1.5単位増加することを示します。
偏回帰係数と標準偏回帰係数
- 偏回帰係数: 各独立変数が他の変数の影響を受けずに従属変数に与える影響を示します。
これは、モデルの出力に対する各変数の寄与度を理解するのに役立ちます。
- 標準偏回帰係数: 各独立変数を標準化した後の回帰係数で、異なるスケールの変数間での比較を可能にします。
標準偏回帰係数が大きい変数は、従属変数に対してより強い影響を持つことを示します。
多重共線性の確認
多重共線性は、独立変数同士が強く相関している状態を指し、モデルの解釈を難しくする要因となります。
多重共線性が存在すると、回帰係数の推定が不安定になり、解釈が困難になります。
Variance Inflation Factor (VIF)の計算
VIFは、多重共線性の程度を測る指標で、各独立変数が他の独立変数によってどれだけ説明されるかを示します。
VIFの値が高いほど、多重共線性が強いことを意味します。
一般的に、VIFが10を超える場合は多重共線性が懸念されます。
以下のコードは、statsmodels
ライブラリを使用してVIFを計算する例です。
import pandas as pd
from statsmodels.stats.outliers_influence import variance_inflation_factor
# VIFの計算
X = データ[['広告費', '販売促進費']] # 独立変数のデータフレーム
vif_data = pd.DataFrame()
vif_data['特徴量'] = X.columns
vif_data['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print(vif_data)
出力結果は、各独立変数のVIF値を示します。
これにより、多重共線性の影響を確認し、必要に応じて変数の選択やモデルの修正を行うことができます。
完全なサンプルコード
以下に、重回帰分析を行うための完全なサンプルコードを示します。
このコードでは、サンプルデータの作成からモデルの学習、予測、評価までの一連の流れを実装しています。
# 必要なライブラリのインポート
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error
from sklearn.preprocessing import StandardScaler
from statsmodels.stats.outliers_influence import variance_inflation_factor
# サンプルデータの作成
np.random.seed(0)
advertising_cost = np.random.rand(100) * 1000 # 0から1000の範囲の広告費
promotion_cost = np.random.rand(100) * 500 # 0から500の範囲の販売促進費
sales = 200 + 1.5 * advertising_cost + 2.0 * promotion_cost + np.random.randn(100) * 50 # 売上の計算
# データフレームの作成
data = pd.DataFrame({
'Advertising Cost': advertising_cost,
'Promotion Cost': promotion_cost,
'Sales': sales
})
# データの前処理
data.fillna(data.mean(), inplace=True) # 欠損値の補完
scaler = StandardScaler()
data[['Advertising Cost', 'Promotion Cost']] = scaler.fit_transform(data[['Advertising Cost', 'Promotion Cost']]) # 標準化
# 特徴量とターゲットの分割
X = data[['Advertising Cost', 'Promotion Cost']]
y = data['Sales']
# 訓練データとテストデータの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
# 重回帰モデルの作成と学習
model = LinearRegression()
model.fit(X_train, y_train)
# モデルの予測
y_pred = model.predict(X_test)
# モデルの評価
r2 = r2_score(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
print(f'決定係数(R²スコア): {r2:.2f}')
print(f'平均二乗誤差(MSE): {mse:.2f}')
# VIFの計算
vif_data = pd.DataFrame()
vif_data['Feature'] = X.columns
vif_data['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print(vif_data)
コードの説明
- ライブラリのインポート: 必要なライブラリをインポートします。
- サンプルデータの作成: 広告費、販売促進費、売上のサンプルデータを生成します。
- データフレームの作成: 作成したデータを
pandas
のデータフレームに格納します。 - データの前処理: 欠損値の補完とデータの標準化を行います。
- 特徴量とターゲットの分割: 説明変数と目的変数を分けます。
- 訓練データとテストデータの分割: データを訓練用とテスト用に分割します。
- 重回帰モデルの作成と学習: モデルを作成し、訓練データで学習させます。
- モデルの予測: テストデータを用いて予測を行います。
- モデルの評価: 決定係数と平均二乗誤差を計算し、結果を表示します。
- VIFの計算: 多重共線性を確認するためにVIFを計算し、結果を表示します。
このサンプルコードを実行することで、重回帰分析の一連の流れを体験することができます。
モデルの改善方法
重回帰モデルの性能を向上させるためには、特徴量選択や正則化手法を導入することが重要です。
以下に、これらの手法について詳しく説明します。
特徴量選択の方法
特徴量選択は、モデルの精度を向上させるために重要なステップです。
不要な特徴量を削除することで、モデルの複雑さを減らし、過学習を防ぐことができます。
前進選択法
前進選択法は、最初は何も特徴量を持たないモデルから始め、最も説明力の高い特徴量を1つずつ追加していく方法です。
各ステップで、追加する特徴量は、モデルの性能を最も改善するものが選ばれます。
以下は、前進選択法の簡単な実装例です。
import statsmodels.api as sm
# 初期モデル
X_train_with_const = sm.add_constant(X_train) # 定数項を追加
best_model = sm.OLS(y_train, X_train_with_const).fit() # 最初のモデルをフィット
# 特徴量の選択
for feature in X_train_with_const.columns[1:]: # 定数項を除く
temp_model = sm.OLS(y_train, X_train_with_const[best_model.model.exog_names + [feature]]).fit()
if temp_model.rsquared > best_model.rsquared: # R²スコアが改善される場合
best_model = temp_model
print(best_model.summary())
後退除去法
後退除去法は、全ての特徴量を含むモデルから始め、最も影響の少ない特徴量を1つずつ削除していく方法です。
各ステップで、削除する特徴量は、モデルの性能を最も悪化させるものが選ばれます。
以下は、後退除去法の簡単な実装例です。
import statsmodels.api as sm
# 全ての特徴量を含むモデル
X_train_with_const = sm.add_constant(X_train)
best_model = sm.OLS(y_train, X_train_with_const).fit()
# 特徴量の削除
while len(best_model.params) > 1: # Exclude the constant term
p_values = best_model.pvalues
max_p_value = p_values.max()
if max_p_value > 0.05: # If p-value exceeds significance level
feature_to_remove = p_values.idxmax()
X_train_with_const = X_train_with_const.drop(columns=[feature_to_remove])
best_model = sm.OLS(y_train, X_train_with_const).fit()
else:
break
print(best_model.summary())
正則化手法の導入
正則化手法は、モデルの複雑さを制御し、過学習を防ぐために使用されます。
主にリッジ回帰とラッソ回帰の2つの手法があります。
リッジ回帰
リッジ回帰は、L2正則化を使用して回帰係数の大きさを制限します。
これにより、モデルの複雑さを抑え、過学習を防ぐことができます。
以下は、リッジ回帰の実装例です。
from sklearn.linear_model import Ridge
# リッジ回帰モデルの作成
ridge_model = Ridge(alpha=1.0) # alphaは正則化パラメータ
ridge_model.fit(X_train, y_train)
# モデルの予測
y_pred_ridge = ridge_model.predict(X_test)
# モデルの評価
print(f'Ridge Regression R² Score: {r2_score(y_test, y_pred_ridge):.2f}')
ラッソ回帰
ラッソ回帰は、L1正則化を使用して回帰係数をゼロにすることができます。
これにより、特徴量の選択が自動的に行われ、モデルの解釈性が向上します。
以下は、ラッソ回帰の実装例です。
from sklearn.linear_model import Lasso
# ラッソ回帰モデルの作成
lasso_model = Lasso(alpha=0.1) # alphaは正則化パラメータ
lasso_model.fit(X_train, y_train)
# モデルの予測
y_pred_lasso = lasso_model.predict(X_test)
# モデルの評価
print(f'Lasso Regression R² Score: {r2_score(y_test, y_pred_lasso):.2f}')
これらの手法を用いることで、重回帰モデルの性能を向上させ、より信頼性の高い予測を行うことができます。
応用例
重回帰分析は、さまざまな分野でのデータ分析や予測に利用されています。
以下に、具体的な応用例をいくつか紹介します。
重回帰分析を用いた売上予測
売上予測は、企業が将来の収益を見積もるために重回帰分析を活用する一般的な方法です。
例えば、広告費、販売促進費、季節要因などの複数の独立変数を用いて、売上を予測するモデルを構築します。
このモデルを使用することで、企業はマーケティング戦略を最適化し、リソースの配分を効率化することができます。
- 独立変数: 広告費、販売促進費、競合他社の価格
- 従属変数: 売上
重回帰分析を用いたマーケティング効果の分析
マーケティング活動の効果を評価するために、重回帰分析を使用することができます。
例えば、異なるマーケティングチャネル(テレビ広告、オンライン広告、イベントなど)の投資額を独立変数として、最終的な売上や顧客獲得数を従属変数としてモデルを構築します。
この分析により、どのチャネルが最も効果的であるかを明らかにし、今後のマーケティング戦略に役立てることができます。
- 独立変数: テレビ広告費、オンライン広告費、イベント費用
- 従属変数: 新規顧客数、売上
重回帰分析を用いた不動産価格の予測
不動産市場において、重回帰分析は物件の価格を予測するために広く利用されています。
物件の面積、部屋数、立地、築年数などの特徴を独立変数として、物件の価格を従属変数としてモデルを構築します。
このモデルを使用することで、投資家や不動産業者は市場の動向を把握し、適正価格を設定することができます。
- 独立変数: 面積、部屋数、立地、築年数
- 従属変数: 物件価格
これらの応用例を通じて、重回帰分析がどのように実務に役立つかを理解することができます。
データに基づいた意思決定を行うための強力なツールとして、重回帰分析は多くの分野で活用されています。
まとめ
この記事では、Pythonを用いた重回帰分析の基本から応用例までを詳しく解説しました。
重回帰分析は、複数の独立変数が従属変数に与える影響を分析する強力な手法であり、売上予測やマーケティング効果の分析、不動産価格の予測など、さまざまな分野で活用されています。
これらの知識を活かして、実際のデータ分析に挑戦し、より良い意思決定を行うための一歩を踏み出してみてください。