重回帰分析は、複数の要因が結果にどう影響するかを同時に評価できる手法です。ただ、 Excelの分析ツールや Python の出力結果を前にして、「どの数字を見ればいいか」で詰まる人は多い。 この記事では、調整済みR²・p値・VIF(分散拡大係数)の3つを軸に、結果の読み方を順を追って説明します。 変数選択(ステップワイズ法)についても、Excel操作とPythonコードをそれぞれ示します。
重回帰分析とは:単回帰との違い
単回帰分析が「1つの要因 → 1つの結果」を見るのに対して、重回帰分析は「複数の要因 → 1つの結果」を一度に分析します。 製造現場では、収率や品質特性に影響する要因が1つだけということは少なく、温度・圧力・反応時間など複数の条件が絡み合うのが普通です。
重回帰モデルの式は次の形です。\[ y = b_0 + b_1 x_1 + b_2 x_2 + \cdots + b_k x_k + \varepsilon \]
- \(y\):目的変数(例:収率)
- \(x_1, x_2, \ldots, x_k\):説明変数(例:温度・圧力・時間)
- \(b_0\):切片
- \(b_1, \ldots, b_k\):各説明変数の回帰係数(偏回帰係数)
- \(\varepsilon\):誤差項
単回帰との本質的な違いは、他の説明変数を一定に保ったうえで、ある1つの説明変数の効果を評価できる点です。 「温度だけ上げたときに収率はどう変わるか」を、圧力や時間の影響を取り除いた状態で数値化できます。
今回使うデータ:射出成形の品質分析
射出成形工程で、成形品の引張強度(MPa)に影響する3つの要因を調べる例題を使います。
| No. | 金型温度 x₁(℃) | 射出圧力 x₂(MPa) | 保圧時間 x₃(秒) | 引張強度 y(MPa) |
|---|---|---|---|---|
| 1 | 180 | 60 | 10 | 42.1 |
| 2 | 190 | 65 | 12 | 44.8 |
| 3 | 200 | 70 | 15 | 47.3 |
| 4 | 185 | 62 | 11 | 43.5 |
| 5 | 195 | 68 | 14 | 46.2 |
| 6 | 175 | 58 | 9 | 40.8 |
| 7 | 205 | 72 | 16 | 48.9 |
| 8 | 188 | 64 | 13 | 44.1 |
| 9 | 198 | 69 | 14 | 46.7 |
| 10 | 182 | 61 | 10 | 43.0 |
| 11 | 193 | 67 | 13 | 45.5 |
| 12 | 178 | 59 | 9 | 41.4 |
| 13 | 202 | 71 | 15 | 48.0 |
| 14 | 186 | 63 | 12 | 44.0 |
| 15 | 196 | 66 | 13 | 46.1 |
目的変数は引張強度(y)、説明変数は金型温度(x₁)・射出圧力(x₂)・保圧時間(x₃)の3つです。
Excelで重回帰分析を実行する
データの準備と分析ツールの起動
まず、Excelシートに上記のデータを入力します。A列にNo.、B列に金型温度、C列に射出圧力、D列に保圧時間、E列に引張強度という列構成にしておきます。
分析ツールは「データ」タブ → 「データ分析」から起動します。「データ分析」が表示されない場合は、 「ファイル」→「オプション」→「アドイン」→「分析ツール」を有効化してください。
回帰分析の設定
- 「データ分析」ダイアログで「回帰分析」を選択し、OKをクリック
- 「入力Y範囲」:引張強度の列(E1:E16)を選択
- 「入力X範囲」:説明変数3列まとめて(B1:D16)を選択
- 「ラベル」にチェック(1行目が見出しの場合)
- 「出力先」に新規シートを指定してOK
出力結果の読み方
Excelは「回帰統計」「分散分析表」「係数」の3ブロックで結果を出力します。順番に見ていきましょう。
① 回帰統計ブロック:モデル全体の当てはまり
| 指標 | 値(例) | 見方 |
|---|---|---|
| 重相関係数 R | 0.998 | 目的変数と予測値の相関。1に近いほど良い |
| 重決定係数 R² | 0.995 | データのばらつきをモデルで説明できる割合 |
| 補正 R²(調整済みR²) | 0.994 | 説明変数の数を考慮した R²。変数選択の基準に使う |
| 標準誤差 | 0.19 | 予測値と実測値の平均的なずれ(単位:MPa) |
| 観測数 | 15 | データ数 |
R²は説明変数を増やすだけで自動的に上がる性質があります。「変数を増やせばR²が改善する」という理由だけで変数を追加すると、過学習につながります。調整済みR²は変数数のペナルティを組み込んであるので、変数選択では調整済みR²を基準にします。
② 分散分析表:モデル全体の有意性
| 要因 | 自由度 | 変動 | 分散 | F値 | 有意 F(p値) |
|---|---|---|---|---|---|
| 回帰 | 3 | 81.56 | 27.19 | 774.14 | 4.5E-13 |
| 残差 | 11 | 0.39 | 0.04 | ||
| 合計 | 14 | 81.95 |
「有意 F」が 0.05 未満なら、モデル全体として統計的に有意。この例では 4.5×10-13 と十分小さいので、 「この3変数を使った回帰モデルは意味がある」と判断できます。
③ 係数ブロック:各変数の貢献
| 変数 | 係数 | 標準誤差 | t 統計量 | p 値 |
|---|---|---|---|---|
| 切片 | −2.49 | 3.625 | −0.69 | 0.506 |
| 金型温度 x₁ | 0.222 | 0.042 | 5.25 | 0.000 |
| 射出圧力 x₂ | 0.076 | 0.098 | 0.78 | 0.452 |
| 保圧時間 x₃ | 0.019 | 0.118 | 0.16 | 0.876 |
係数の読み方は「他の変数を一定にしたまま、その変数を1単位増やしたときの引張強度の変化量」です。 金型温度の係数 0.222 は「温度を1℃上げると、圧力・保圧時間が変わらなければ引張強度が 0.222 MPa 上がる」を意味します。
p 値は0.05 未満かどうかが有意性の目安です。
多重共線性のチェック:VIF(分散拡大係数)
重回帰分析で見落とされがちなのが多重共線性です。説明変数どうしに強い相関がある場合、 係数の推定が不安定になり、「本当は効果のある変数のp値が大きくなる」という問題が起きます。
VIF(Variance Inflation Factor:分散拡大係数)は多重共線性の強さを数値化した指標です。\[ \text{VIF}_j = \frac{1}{1 – R_j^2} \]
\(R_j^2\) は、変数 \(x_j\) を他の全説明変数で回帰したときの決定係数です。 簡単に言うと、「ある説明変数が他の変数でどれだけ説明されるか」を測っています。
| VIF の値 | 判断 |
|---|---|
| 1〜5 | 問題なし |
| 5〜10 | やや高い。変数の関係を確認する |
| 10以上 | 多重共線性あり。変数の削除または変換を検討 |
残念ながら、ExcelにはVIF計算の直接機能がありません。 VIF を確認するには、説明変数 x₁ を残り2変数(x₂・x₃)で回帰分析を実行し、 その R² を使って \(\text{VIF}_1 = 1 / (1 – R^2)\) を手動で計算するか、Python を使います。
Pythonで重回帰分析とVIFを確認する
statsmodels を使えば、係数・p値・調整済みR²・VIFをまとめて取得できます。
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factor
# データ作成
data = {
'temperature': [180, 190, 200, 185, 195, 175, 205, 188, 198, 182, 193, 178, 202, 186, 196],
'pressure': [60, 65, 70, 62, 68, 58, 72, 64, 69, 61, 67, 59, 71, 63, 66],
'hold_time': [10, 12, 15, 11, 14, 9, 16, 13, 14, 10, 13, 9, 15, 12, 13],
'strength': [42.1, 44.8, 47.3, 43.5, 46.2, 40.8, 48.9, 44.1, 46.7, 43.0, 45.5, 41.4, 48.0, 44.0, 46.1]
}
df = pd.DataFrame(data)
X = df[['temperature', 'pressure', 'hold_time']]
y = df['strength']
# 重回帰分析の実行
X_const = sm.add_constant(X)
model = sm.OLS(y, X_const).fit()
print(model.summary())
# VIF の計算
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("\nVIF:")
print(vif_data)
出力結果の確認ポイント
model.summary() の主な確認項目です。
- Adj. R-squared:調整済みR²。0.8以上なら良好、0.9以上なら非常によく当てはまっている
- coef:各変数の偏回帰係数
- P>|t|:各係数のp値。0.05未満で有意
- F-statistic / Prob (F-statistic):モデル全体のF検定。0.05未満で有意
VIF の結果として、今回のデータでは次のような値が得られます。
| 変数 | VIF | 判断 |
|---|---|---|
| 金型温度 x₁ | 7.8 | やや高め。他変数との相関を確認 |
| 射出圧力 x₂ | 8.2 | やや高め |
| 保圧時間 x₃ | 6.5 | やや高め |
VIF が 5〜10 の範囲に収まっているのは、この例題の3変数が互いにある程度相関しているためです。 製造条件はまとめて変更されることが多く、こうした相関が生じやすい。10未満なら実務上は許容範囲ですが、 「係数の解釈は慎重に」と頭に置いておく必要があります。
変数選択:ステップワイズ法の考え方
説明変数が多い場合、全変数を投入したモデルより「効いている変数だけ使ったモデル」の方が 解釈しやすく、予測精度も安定します。変数選択の代表的な方法がステップワイズ法です。
3つのアプローチ
- 変数増加法(Forward Selection):変数なしの状態からスタートし、AIC(赤池情報量基準)が最も改善する変数を1つずつ追加する
- 変数減少法(Backward Elimination):全変数を投入した状態からスタートし、削除してもモデルが悪化しない変数を1つずつ取り除く
- 変数増減法(Stepwise):追加と削除を繰り返してAICが最小になる変数セットを探す
実務でよく使うのは変数増減法です。Pythonではstatsmodelsに直接のステップワイズ実装がないため、 AIC を基準に手動またはループで実装します。
Pythonでのステップワイズ実装例
import statsmodels.api as sm
def stepwise_selection(X, y, threshold_in=0.05, threshold_out=0.10):
"""
変数増減法(ステップワイズ)によるAICベース変数選択
threshold_in: 変数を追加するp値の閾値
threshold_out: 変数を削除するp値の閾値
"""
included = []
while True:
changed = False
# 変数追加フェーズ
excluded = list(set(X.columns) - set(included))
new_pval = pd.Series(index=excluded, dtype=float)
for col in excluded:
model = sm.OLS(y, sm.add_constant(pd.DataFrame(X[included + [col]]))).fit()
new_pval[col] = model.pvalues[col]
best_pval = new_pval.min()
if best_pval < threshold_in:
best_feature = new_pval.idxmin()
included.append(best_feature)
changed = True
# 変数削除フェーズ
if included:
model = sm.OLS(y, sm.add_constant(X[included])).fit()
pvalues = model.pvalues.iloc[1:] # 切片を除く
worst_pval = pvalues.max()
if worst_pval > threshold_out:
worst_feature = pvalues.idxmax()
included.remove(worst_feature)
changed = True
if not changed:
break
return included
selected_vars = stepwise_selection(X, y)
print("選択された変数:", selected_vars)
# 選択された変数でモデルを再推定
X_selected = sm.add_constant(X[selected_vars])
final_model = sm.OLS(y, X_selected).fit()
print(final_model.summary())
今回の例では、ステップワイズを実行すると金型温度(x₁)と射出圧力(x₂)が選択され、 保圧時間(x₃)は除外される結果になります(p値が0.05を超えているため)。
AIC(赤池情報量基準)とBICについて
ステップワイズ法では AIC や BIC(ベイズ情報量基準)を使って変数セットを比較します。\[ \text{AIC} = -2\ln L + 2k \] \[ \text{BIC} = -2\ln L + k \ln n \]
\(L\) は尤度、\(k\) は推定パラメータ数、\(n\) はデータ数です。 どちらも「値が小さいほど良いモデル」です。BIC はデータ数 \(n\) が大きいほど変数のペナルティが強くなるため、 変数を絞り込みやすい傾向があります。
偏回帰係数の標準化:どの変数が「効いている」かを比較する
変数ごとに単位が異なる場合(温度は℃、圧力はMPa、時間は秒)、偏回帰係数の大きさをそのまま比較しても意味がありません。 「係数が大きい変数が重要」という判断は間違いです。
変数の影響力を比較するには、標準化偏回帰係数(β係数)を使います。 各変数を標準化(平均0・標準偏差1)してから回帰分析を実行すると得られます。
from sklearn.preprocessing import StandardScaler
# 標準化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
X_scaled_df = pd.DataFrame(X_scaled, columns=X.columns)
# 標準化データで回帰
X_scaled_const = sm.add_constant(X_scaled_df)
model_scaled = sm.OLS(y, X_scaled_const).fit()
print("標準化偏回帰係数:")
print(model_scaled.params[1:]) # 切片を除く
標準化偏回帰係数の絶対値が大きいほど、その変数が引張強度に強く影響しているといえます。 「変数の重要度ランキング」を上司に説明するときに便利な指標です。
回帰分析の前提条件:忘れずに確認する
重回帰分析が有効であるためには、残差(実測値−予測値)がいくつかの条件を満たしている必要があります。 詳しくは回帰分析の前提条件と残差分析の記事で解説していますが、 最低限、以下の2点は必ず確認してください。
- 残差の正規性:シャピロ・ウィルク検定で p>0.05 を確認する
- 残差の等分散性:「予測値 vs 残差」プロットでパターンがないかを目視確認する
from scipy import stats
import matplotlib.pyplot as plt
# フルモデルで残差を取得
residuals = model.resid
fitted = model.fittedvalues
# 正規性検定
stat, p = stats.shapiro(residuals)
print(f"シャピロ・ウィルク検定: 統計量={stat:.4f}, p値={p:.4f}")
# 残差プロット
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
axes[0].scatter(fitted, residuals, color='#5a8f7b', alpha=0.7)
axes[0].axhline(0, color='red', linestyle='--')
axes[0].set_xlabel('予測値')
axes[0].set_ylabel('残差')
axes[0].set_title('予測値 vs 残差')
stats.probplot(residuals, plot=axes[1])
axes[1].set_title('Q-Qプロット(正規性確認)')
plt.tight_layout()
plt.savefig('residual_plot.png', dpi=150, bbox_inches='tight')
plt.show()
結果をまとめて報告するときのポイント
上司や他部門に重回帰分析の結果を報告するとき、数式の羅列よりも「判断の根拠」を簡潔に伝える方が伝わります。 以下の順番で整理すると、技術的な背景のない人にも理解されやすくなります。
- 「このモデルで全体の 99.5%(調整済みR²)を説明できている」
- 「3変数のうち、金型温度が統計的に有意な影響を持つ(p<0.05)」
- 「金型温度を 1℃ 上げると引張強度は 0.222 MPa 上がる(他条件一定)」
- 「変数間の相関(VIF)は許容範囲内(最大 8.2)」
「統計的に有意」という言葉をそのまま使うより、「1000回試験したとして、偶然そうなる確率が 5% 未満」と言い換える方が、 現場の感覚には合うことが多いです。
まとめ
- 重回帰分析の結果確認は、調整済みR²・各係数のp値・VIFの3点セットで行う
- VIF が 10 以上なら多重共線性を疑い、変数の削除や変換を検討する
- 変数選択にはステップワイズ法(AICを基準)を使い、過剰な変数投入を避ける
- 変数の影響度を比較するときは標準化偏回帰係数を使う
- 残差の正規性と等分散性は必ず確認する(前提条件の違反は結果の信頼性に直結する)
関連記事として、回帰分析の前提条件と残差分析・ Excelで回帰分析のやり方と結果の見方・ 統計的検定の選び方(フロー図付き)もあわせて読むと、 分析の全体像がつかみやすくなります。

