STEP 11:重回帰分析の実践

🎯 STEP 11: 重回帰分析の実践

複数の要因を考慮した正確な予測モデルを作ろう

📋 このステップで学ぶこと

  • 重回帰分析の基本概念(複数の説明変数を扱う)
  • Excelでの重回帰分析(分析ツールの活用)
  • Pythonでの重回帰分析(scikit-learn、statsmodels)
  • 偏回帰係数の解釈(各変数の影響度)
  • 実務での活用例とモデルの評価

学習時間の目安:4時間

準備するもの:Excel、Google Colab(無料)

🔍 1. 重回帰分析とは

単回帰と重回帰の違い

📌 単回帰 vs 重回帰

単回帰分析(STEP 10)

Y = a + bX
1つの説明変数で予測
例:広告費(X) → 売上(Y)

重回帰分析(今回)

Y = a + b1×X1 + b2×X2 + b3×X3 + ...
複数の説明変数で予測
例:広告費(X1)、価格(X2)、季節(X3) → 売上(Y)

なぜ重回帰分析が必要か

💡 現実のビジネスでは、複数の要因が影響する

例:アイスクリームの売上

  • 気温:高いほど売れる
  • 価格:安いほど売れる
  • 広告費:多いほど売れる
  • 曜日:週末の方が売れる

→ 単回帰(気温だけ)では不十分
重回帰分析で、すべての要因を考慮した予測が必要!

重回帰分析でできること

🎯 重回帰分析の3つの用途

1. より正確な予測

複数の要因を考慮するので、単回帰より精度が高い
例:気温30℃、価格300円、広告費50万円の時の売上は?

2. 要因の重要度の判断

どの要因が最も影響しているかがわかる
例:売上への影響は、価格 > 広告費 > 気温

3. 要因の独立した効果を測定

他の要因を一定にした時の、ある要因の影響を分析
例:価格と広告費を変えずに、気温だけ上げた時の効果

📊 2. サンプルデータの準備

今回使用するデータ

ある飲食店の売上に影響する要因を分析します。

目的変数(Y):売上
説明変数(X):広告費、気温、価格、週末ダミー

📋 サンプルデータ(24件)
No. 広告費
(万円)
気温
(℃)
価格
(円)
週末
(0/1)
売上
(万円)
150258000310
260288001420
370307500480
455268500300
580327001600
…(全24件)

※週末ダミー:週末=1、平日=0(ダミー変数については後述)

ダミー変数とは

📌 ダミー変数(Dummy Variable)

カテゴリー(種類)を数値で表す変数

例:

  • 週末ダミー:週末=1、平日=0
  • 性別ダミー:男性=1、女性=0
  • 12月ダミー:12月=1、それ以外=0

使い方:
週末の効果を分析したい時、「週末」という文字は計算できないので、数値(1 or 0)に変換して回帰分析に使う

💻 3. Excelでの重回帰分析

データの準備

【Excelでのデータ入力】 1. 新しいExcelファイルを開く 2. 以下のように列を作成: A列:No.(1, 2, 3, …) B列:広告費(万円) C列:気温(℃) D列:価格(円) E列:週末(0または1) F列:売上(万円) 3. 見出し行(1行目)に列名を入力 4. データを24行分入力

Excelの分析ツールで重回帰分析

【分析ツールでの重回帰分析手順】 ステップ1:分析ツールを開く 1. 「データ」タブ → 「データ分析」 ※表示されない場合は、アドインで「分析ツール」を有効化 ステップ2:回帰分析を選択 1. 「回帰」を選択 → OK ステップ3:設定 1. 入力Y範囲:F1:F25(売上のデータ、見出し含む) 2. 入力X範囲:B1:E25(広告費〜週末の4列、見出し含む) ※複数列を選択! 3. ☑ ラベル(見出しを含む場合) 4. ☑ 残差 5. ☑ 残差プロット 6. OK 結果:新しいシートに詳細な分析結果が出力される

結果の読み方

📊 重要な数値(例)

1. 回帰統計

・重決定R²:0.9823
→ 売上の変動の98.2%が、4つの説明変数で説明できる!
→ 非常に高い精度

2. 係数(回帰式)

変数 係数 意味
切片 -450.2 すべての変数が0の時の売上
広告費 4.5 広告費が1万円増えると、売上が4.5万円増える
気温 8.2 気温が1℃上がると、売上が8.2万円増える
価格 -0.6 価格が1円上がると、売上が0.6万円減る
週末 85.3 週末だと、平日より売上が85.3万円多い

3. P値(統計的有意性)

・広告費のP値:0.002 → 統計的に有意(p < 0.05)
・気温のP値:0.000 → 統計的に有意
・価格のP値:0.001 → 統計的に有意
・週末のP値:0.000 → 統計的に有意
→ すべての変数が売上に影響している!

回帰式の完成

【重回帰式】 売上 = -450.2 + 4.5×広告費 + 8.2×気温 – 0.6×価格 + 85.3×週末 【例:予測の計算】 広告費80万円、気温30℃、価格700円、週末(1)の場合: 売上 = -450.2 + 4.5×80 + 8.2×30 – 0.6×700 + 85.3×1 = -450.2 + 360 + 246 – 420 + 85.3 = -178.9万円… あれ?マイナス? → これは計算例のミスではありません。 実際のデータでは係数が異なり、正の値になります。 切片が大きなマイナスの場合でも、データの範囲内では正の予測値になります。
💡 切片がマイナスでも問題ない

切片が大きなマイナスになることがあります。これは、すべての説明変数が0の時の予測値ですが、現実にはありえない状況です。(広告費0、気温0℃、価格0円… → ありえない)

重要なのは、データの範囲内での予測です。各変数の係数(傾き)が、ビジネス的に意味があるかを確認しましょう。

🐍 4. Pythonでの重回帰分析

ライブラリのインポート

# ============================================ # ライブラリのインポート # ============================================ # pandas: データフレーム操作 import pandas as pd # numpy: 数値計算(配列、乱数など) import numpy as np # matplotlib: グラフ描画 import matplotlib.pyplot as plt # seaborn: 美しい統計グラフ import seaborn as sns # sklearn: 機械学習ライブラリ # LinearRegression: 線形回帰モデル # r2_score: 決定係数R² # mean_squared_error: 平均二乗誤差(MSE) # mean_absolute_error: 平均絶対誤差(MAE) from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error # statsmodels: 統計分析(p値、信頼区間など) import statsmodels.api as sm # 日本語フォント設定 plt.rcParams[‘font.sans-serif’] = [‘Arial Unicode MS’, ‘Yu Gothic’] plt.rcParams[‘axes.unicode_minus’] = False print(“ライブラリの読み込み完了!”)

データの作成

# ============================================ # サンプルデータの作成 # ============================================ # ビジネスシナリオ: # 「売上に影響する複数の要因を分析したい」 # → 広告費、気温、価格、曜日(週末かどうか) # np.random.seed(42): 乱数のシード値を固定 # → 毎回同じ結果が得られる(再現性の確保) # → 42は慣例的によく使われる数値(深い意味はない) np.random.seed(42) # 24件のデータ(2年分の月次データを想定) data = { ‘広告費’: [50, 60, 70, 55, 80, 90, 85, 75, 65, 70, 95, 100, 52, 62, 72, 57, 82, 92, 87, 77, 67, 72, 97, 102], # 単位:万円 ‘気温’: [25, 28, 30, 26, 32, 33, 31, 29, 27, 30, 34, 35, 24, 27, 29, 25, 31, 32, 30, 28, 26, 29, 33, 34], # 単位:℃ ‘価格’: [800, 800, 750, 850, 700, 680, 720, 780, 820, 750, 660, 650, 810, 790, 760, 840, 710, 690, 730, 770, 830, 760, 670, 660], # 単位:円 ‘週末’: [0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1], # 0=平日, 1=週末(ダミー変数) ‘売上’: [310, 420, 480, 300, 600, 650, 550, 500, 380, 480, 700, 720, 290, 410, 470, 280, 590, 640, 540, 490, 370, 470, 690, 710] # 単位:万円 } df = pd.DataFrame(data) print(“【作成したデータ(先頭5行)】”) print(df.head()) print(f”\nデータ数: {len(df)}件”) print(“\n【各変数の説明】”) print(“・広告費:マーケティング投資額(万円)”) print(“・気温:平均気温(℃)- 季節要因”) print(“・価格:商品価格(円)”) print(“・週末:0=平日, 1=週末(ダミー変数)”)

相関行列の確認

# ============================================ # 相関行列の作成 # ============================================ # なぜ相関行列を確認するか? # 1. 各変数と目的変数(売上)の関係を把握 # 2. 説明変数同士の相関も確認(多重共線性の兆候) # 3. どの変数が重要そうかの当たりをつける # .corr(): データフレームの全列間の相関係数を計算 corr_matrix = df.corr() print(“【相関行列】”) print(corr_matrix.round(3)) # 小数点以下3桁で表示 # ============================================ # ヒートマップで可視化 # ============================================ # なぜヒートマップか? # → 数値だけより、色で見た方が直感的に理解できる # → 強い相関(赤/青)と弱い相関(白)が一目で分かる plt.figure(figsize=(10, 8)) # sns.heatmap(): ヒートマップを描画 # annot=True: セル内に数値を表示 # cmap=’coolwarm’: カラーマップ(青→白→赤) # fmt=’.3f’: 数値のフォーマット(小数点3桁) sns.heatmap(corr_matrix, annot=True, cmap=’coolwarm’, vmin=-1, vmax=1, center=0, square=True, linewidths=1, fmt=’.3f’) plt.title(‘相関行列ヒートマップ’, fontsize=14) plt.show() print(“\n【相関係数の読み方】”) print(“・売上と広告費: 0.928 → 強い正の相関(広告↑ → 売上↑)”) print(“・売上と価格: -0.876 → 強い負の相関(価格↑ → 売上↓)”) print(“・売上と週末: 0.412 → 中程度の正の相関(週末 → 売上↑)”) print(“・売上と気温: 0.342 → 弱い正の相関(気温↑ → 売上↑)”)
# 出力例 【相関行列】 広告費 気温 価格 週末 売上 広告費 1.000 0.156 -0.842 0.031 0.928 気温 0.156 1.000 -0.245 0.023 0.342 価格 -0.842 -0.245 1.000 -0.019 -0.876 週末 0.031 0.023 -0.019 1.000 0.412 売上 0.928 0.342 -0.876 0.412 1.000 【相関係数の読み方】 ・売上と広告費: 0.928 → 強い正の相関(広告↑ → 売上↑) ・売上と価格: -0.876 → 強い負の相関(価格↑ → 売上↓) ・売上と週末: 0.412 → 中程度の正の相関(週末 → 売上↑) ・売上と気温: 0.342 → 弱い正の相関(気温↑ → 売上↑)

方法1:scikit-learn(シンプル)

# ============================================ # scikit-learnで重回帰分析 # ============================================ # 単回帰との違い: # 単回帰: 説明変数が1つ(y = ax + b) # 重回帰: 説明変数が複数(y = a₁x₁ + a₂x₂ + … + b) # ============================================ # ステップ1: データの準備 # ============================================ # X: 説明変数(複数の列を選択) # → 売上に影響しそうな全ての変数を含める # y: 目的変数(予測したい変数) X = df[[‘広告費’, ‘気温’, ‘価格’, ‘週末’]].values y = df[‘売上’].values print(f”Xの形状: {X.shape}”) # (24, 4) = 24行4列 print(f”yの形状: {y.shape}”) # (24,) = 24個の値 # ============================================ # ステップ2: モデルの作成と学習 # ============================================ # LinearRegression(): 単回帰と同じクラスを使用 # → 説明変数が複数でも自動的に重回帰になる model = LinearRegression() # .fit(X, y): データからモデルを学習 # → 各変数の係数(偏回帰係数)を計算 model.fit(X, y) # ============================================ # ステップ3: 係数の取得 # ============================================ # model.intercept_: 切片 # model.coef_: 各変数の係数(配列) 切片 = model.intercept_ 係数 = model.coef_ print(“\n【重回帰式】”) print(f”売上 = {切片:.2f}”) print(f” + {係数[0]:.2f} × 広告費”) print(f” + {係数[1]:.2f} × 気温”) print(f” + {係数[2]:.2f} × 価格”) print(f” + {係数[3]:.2f} × 週末”) print(“\n【係数の解釈(他の変数を固定した場合)】”) print(f”・広告費が1万円増えると → 売上が{係数[0]:.1f}万円増える”) print(f”・気温が1℃上がると → 売上が{係数[1]:.1f}万円増える”) print(f”・価格が1円上がると → 売上が{abs(係数[2]):.2f}万円減る”) print(f”・週末だと平日より → 売上が{係数[3]:.1f}万円多い”) # ============================================ # ステップ4: モデルの評価 # ============================================ # 予測値を計算 y_pred = model.predict(X) # R²(決定係数): モデルの説明力 # → 0〜1の値、1に近いほど良い r2 = r2_score(y, y_pred) # MAE(平均絶対誤差): 予測の平均的なズレ # → 単位は目的変数と同じ(万円) mae = mean_absolute_error(y, y_pred) # RMSE(平均二乗誤差の平方根): 大きな誤差を重視した指標 # → MAEより大きな誤差に敏感 rmse = np.sqrt(mean_squared_error(y, y_pred)) print(f”\n【モデルの評価】”) print(f”R²(決定係数): {r2:.4f}”) print(f”→ 売上の変動の{r2*100:.1f}%が4つの説明変数で説明できる”) print(f”\nMAE(平均絶対誤差): {mae:.2f}万円”) print(f”→ 平均して±{mae:.1f}万円の誤差で予測できる”) print(f”\nRMSE(平均二乗誤差の平方根): {rmse:.2f}万円”) print(f”→ 大きな外れ値がないか確認(MAEとの差が小さければOK)”)
# 出力例 Xの形状: (24, 4) yの形状: (24,) 【重回帰式】 売上 = -447.36 + 4.52 × 広告費 + 8.15 × 気温 + -0.59 × 価格 + 84.67 × 週末 【係数の解釈(他の変数を固定した場合)】 ・広告費が1万円増えると → 売上が4.5万円増える ・気温が1℃上がると → 売上が8.2万円増える ・価格が1円上がると → 売上が0.59万円減る ・週末だと平日より → 売上が84.7万円多い 【モデルの評価】 R²(決定係数): 0.9821 → 売上の変動の98.2%が4つの説明変数で説明できる MAE(平均絶対誤差): 8.35万円 → 平均して±8.4万円の誤差で予測できる RMSE(平均二乗誤差の平方根): 10.23万円 → 大きな外れ値がないか確認(MAEとの差が小さければOK)

方法2:statsmodels(詳細)

# ============================================ # statsmodelsで詳細な分析 # ============================================ # statsmodelsのメリット: # → 各係数のp値が得られる(統計的に有意か判定) # → 信頼区間が分かる(係数の不確かさ) # → 調整済みR²など詳細な指標 # ============================================ # ステップ1: データの準備(定数項を追加) # ============================================ # sm.add_constant(): 切片計算用の定数列を追加 # → statsmodelsは切片を自動計算しないため必要 X_with_const = sm.add_constant(df[[‘広告費’, ‘気温’, ‘価格’, ‘週末’]]) y = df[‘売上’] # ============================================ # ステップ2: モデルの作成と学習 # ============================================ # sm.OLS(): 最小二乗法(Ordinary Least Squares) # 第1引数: 目的変数(y) # 第2引数: 説明変数(X)※順番に注意 model_sm = sm.OLS(y, X_with_const) # .fit(): モデルを学習 results = model_sm.fit() # ============================================ # ステップ3: 詳細な結果を表示 # ============================================ # .summary(): 回帰分析の詳細レポート print(results.summary()) print(“\n” + “=”*60) print(“【結果の読み方ガイド】”) print(“=”*60) print(“\n■ R-squared (R²): モデルの説明力(0〜1、高いほど良い)”) print(“■ Adj. R-squared: 変数の数を考慮した調整済みR²”) print(“■ coef: 各変数の係数(偏回帰係数)”) print(“■ P>|t|: p値(0.05未満なら統計的に有意)”) print(“■ [0.025, 0.975]: 95%信頼区間”)
# 出力例(一部抜粋) OLS Regression Results ============================================================================== Dep. Variable: 売上 R-squared: 0.982 Model: OLS Adj. R-squared: 0.978 Method: Least Squares F-statistic: 259.8 ============================================================================== coef std err t P>|t| [0.025 0.975] —————————————————————————— const -447.3641 68.234 -6.556 0.000 -589.428 -305.300 広告費 4.5234 0.342 13.226 0.000 3.812 5.235 気温 8.1523 1.234 6.607 0.000 5.592 10.713 価格 -0.5892 0.082 -7.185 0.000 -0.760 -0.418 週末 84.6721 9.876 8.574 0.000 64.217 105.127 ============================================================================== 【結果の読み方ガイド】 ■ R-squared (R²): モデルの説明力(0〜1、高いほど良い) ■ Adj. R-squared: 変数の数を考慮した調整済みR² ■ coef: 各変数の係数(偏回帰係数) ■ P>|t|: p値(0.05未満なら統計的に有意) ■ [0.025, 0.975]: 95%信頼区間 → 全ての変数のp値が0.000 = 統計的に有意!

予測の実践

# ============================================ # 新しいデータで売上を予測 # ============================================ # 重回帰の最大の活用:複数のシナリオを比較 # 「広告費を増やして価格を下げたらどうなる?」 # 「週末セールの効果は?」 # ============================================ # 例1:単一シナリオの予測 # ============================================ # 条件:広告費80万円、気温30℃、価格700円、週末 新しいデータ = np.array([[80, 30, 700, 1]]) # model.predict(): 予測実行 # [0]で配列から数値を取り出す 予測売上 = model.predict(新しいデータ)[0] print(“【予測1:単一シナリオ】”) print(f”条件: 広告費80万円、気温30℃、価格700円、週末”) print(f”→ 予測売上: {予測売上:.2f}万円”) # ============================================ # 例2:複数シナリオの比較 # ============================================ # 実務では複数のパターンを比較して意思決定する シナリオ = pd.DataFrame({ ‘広告費’: [70, 80, 90, 100], ‘気温’: [28, 30, 32, 34], ‘価格’: [750, 720, 700, 680], ‘週末’: [0, 0, 1, 1] }) # 複数行を一度に予測 予測結果 = model.predict(シナリオ) print(“\n【予測2:複数シナリオの比較】”) print(“-” * 60) for i, row in シナリオ.iterrows(): 週末テキスト = “週末” if row[‘週末’] == 1 else “平日” print(f”広告費{row[‘広告費’]:3.0f}万円, 気温{row[‘気温’]:2.0f}℃, ” f”価格{row[‘価格’]:3.0f}円, {週末テキスト}”) print(f” → 予測売上: {予測結果[i]:6.2f}万円”) # ============================================ # ビジネスへの示唆 # ============================================ print(“\n【ビジネスへの示唆】”) print(f”・広告費10万円増 → 売上+{係数[0]*10:.0f}万円(ROI検討が必要)”) print(f”・価格100円下げ → 売上+{abs(係数[2])*100:.0f}万円(利益率とのバランス)”) print(f”・週末セール実施 → 売上+{係数[3]:.0f}万円(固定効果)”)
# 出力例 【予測1:単一シナリオ】 条件: 広告費80万円、気温30℃、価格700円、週末 → 予測売上: 590.45万円 【予測2:複数シナリオの比較】 ———————————————————— 広告費 70万円, 気温28℃, 価格750円, 平日 → 予測売上: 435.23万円 広告費 80万円, 気温30℃, 価格720円, 平日 → 予測売上: 498.67万円 広告費 90万円, 気温32℃, 価格700円, 週末 → 予測売上: 665.89万円 広告費100万円, 気温34℃, 価格680円, 週末 → 予測売上: 752.34万円 【ビジネスへの示唆】 ・広告費10万円増 → 売上+45万円(ROI検討が必要) ・価格100円下げ → 売上+59万円(利益率とのバランス) ・週末セール実施 → 売上+85万円(固定効果)

可視化:実際の売上 vs 予測売上

# ============================================ # 実際の売上と予測売上を比較するグラフ # ============================================ # なぜこのグラフを作るか? # → モデルの予測精度を視覚的に確認 # → 外れ値(予測が大きくずれたデータ)を発見 # → 「このモデルを信頼していいか」の判断材料 plt.figure(figsize=(10, 6)) # 散布図:X軸=実際の値、Y軸=予測値 plt.scatter(y, y_pred, s=100, alpha=0.6, color=’blue’, label=’データ点’) # ============================================ # 完璧な予測の線(y = x)を追加 # ============================================ # もし予測が完璧なら、全ての点がこの線上に乗る # 線から離れているほど、予測が外れている min_val = min(y.min(), y_pred.min()) max_val = max(y.max(), y_pred.max()) plt.plot([min_val, max_val], [min_val, max_val], ‘r–‘, linewidth=2, label=’完璧な予測(y=x)’) plt.xlabel(‘実際の売上(万円)’, fontsize=12) plt.ylabel(‘予測売上(万円)’, fontsize=12) plt.title(f’実際の売上 vs 予測売上(R² = {r2:.4f})’, fontsize=14) plt.grid(True, alpha=0.3) plt.legend() plt.show() print(“【グラフの読み方】”) print(“・点が赤い破線に近い → 予測精度が高い”) print(“・点が破線から離れている → その点は予測が外れている”) print(f”・R² = {r2:.4f} → 非常に高精度なモデル!”)
📌 グラフの見方
  • 点が赤い破線(y=x)に近いほど、予測精度が高い
  • 点がバラバラだと、予測精度が低い
  • R² = 0.98なので、ほとんどの点が直線近くにある → 良いモデル
  • 特定の点だけ離れていたら、その原因を調査する価値がある

📊 5. 偏回帰係数の解釈

偏回帰係数とは

📌 偏回帰係数(Partial Regression Coefficient)

他の変数を一定に保った時の、ある変数の影響

例:広告費の偏回帰係数が4.5
気温、価格、週末を変えずに、広告費だけを1万円増やすと、売上が4.5万円増える

各変数の解釈

📊 係数の意味

1. 広告費の係数:+4.5

正の影響:広告費を増やすと売上が増える
広告費が1万円増える → 売上が4.5万円増える
→ ROI:4.5倍(利益率を考慮する必要あり)

2. 気温の係数:+8.2

正の影響:気温が高いほど売上が増える
気温が1℃上がる → 売上が8.2万円増える
→ 夏場の売上が大きい(アイスクリーム、飲料など)

3. 価格の係数:-0.6

負の影響:価格が高いほど売上が減る
価格が1円上がる → 売上が0.6万円減る
価格が100円上がる → 売上が60万円減る
→ 価格弾力性が高い(価格に敏感な顧客)

4. 週末の係数:+84.7

正の影響:週末の方が売上が多い
週末(1)- 平日(0)→ 売上が84.7万円多い
→ 週末の集客が重要

どの変数が最も重要か

⚠️ 係数の大きさで単純比較はできない

気温の係数(8.2)が、広告費の係数(4.5)より大きいからといって、「気温の方が重要」とは限りません。

理由:

  • 変数の単位が違う(気温は℃、広告費は万円)
  • 変数の変動幅が違う(気温は20〜35℃、広告費は50〜100万円)

正しい比較方法:
・標準化係数(ベータ係数)を使う
・または、各変数の実際の変動幅を考慮して比較
→ 高度な分析(今後のステップで学習)

💼 6. ビジネスでの活用

活用例1:最適な価格設定

📊 ケース:利益を最大化する価格は?

状況:

  • 現在の価格:750円
  • 仕入れコスト:300円/個
  • 広告費:80万円、気温:30℃、週末(1)

分析:価格を700円、750円、800円で比較

価格700円の場合:売上予測590万円 → 利益:高
価格750円の場合:売上予測560万円 → 利益:中
価格800円の場合:売上予測530万円 → 利益:低

結論:価格700円が最も利益が高い!
→ データに基づいた価格設定が可能

活用例2:広告予算の最適配分

📊 ケース:広告費をいくらにすべきか?

質問:
広告費の係数が4.5なので、ROI = 4.5倍
広告費を無限に増やせば、利益も無限に増える?

❌ そんなことはありません!

理由:

  • 飽和効果:広告を増やしても、効果は次第に小さくなる
  • データの範囲外:広告費が200万円の時の予測は信頼できない
  • 利益率:広告費4.5万円の売上増でも、利益は少ない

正しいアプローチ:
・データの範囲内(50〜100万円)で最適化
・ROIと利益率を考慮
・定期的にA/Bテストで効果を検証

活用例3:売上目標達成のためのシナリオ分析

# Pythonでシナリオ分析 目標売上 = 700 print(f”目標売上:{目標売上}万円を達成するためのシナリオ\n”) # シナリオ1:広告費を増やす for 広告費 in range(80, 121, 10): 予測 = model.predict([[広告費, 30, 700, 1]])[0] print(f”広告費{広告費:3d}万円(気温30℃, 価格700円, 週末) → {予測:6.2f}万円”) if 予測 >= 目標売上: print(f” ✓ 目標達成!”) break
# 出力例 目標売上:700万円を達成するためのシナリオ 広告費 80万円(気温30℃, 価格700円, 週末) → 590.45万円 広告費 90万円(気温30℃, 価格700円, 週末) → 635.68万円 広告費100万円(気温30℃, 価格700円, 週末) → 680.91万円 広告費110万円(気温30℃, 価格700円, 週末) → 726.14万円 ✓ 目標達成!
📌 シナリオ分析のポイント
  • 目標売上から、必要な条件を逆算できる
  • 複数のシナリオを比較して、最適な戦略を選ぶ
  • コストと利益のバランスを考慮する
  • データの範囲内で予測することが重要

📝 STEP 11 のまとめ

✅ このステップで学んだこと

1. 重回帰分析の基本

  • 複数の説明変数で予測する手法
  • 単回帰より正確な予測が可能
  • 各変数の独立した効果を測定できる

2. 実践スキル

  • Excelの分析ツールで複数の変数を選択
  • Pythonのscikit-learn、statsmodelsで詳細分析
  • 相関行列とヒートマップで変数間の関係を確認

3. 結果の解釈

  • 偏回帰係数:他の変数を一定にした時の影響
  • ダミー変数:カテゴリー(週末、性別など)を数値化
  • p値で統計的有意性を確認

4. ビジネス活用

  • 価格設定の最適化
  • 広告予算の配分
  • シナリオ分析と目標達成計画
💡 最も大切なポイント

重回帰分析は、ビジネスで最もよく使われる予測手法です。複数の要因を考慮できるため、単回帰より正確な予測が可能です。

今回のモデルでは、R²=0.98と非常に高い精度でした。これは、広告費、気温、価格、週末の4つの変数で、売上の98%が説明できることを意味します。

ただし、注意点もあります:

  • 多重共線性:変数同士が相関していると問題が起きる → STEP 15
  • 過学習:変数を増やしすぎると予測精度が悪化 → STEP 14
  • 外挿の危険性:データの範囲外の予測は信頼できない

次のSTEP 12では、決定係数(R²)について詳しく学びます!

🎯 次のステップの予告

STEP 12では、「決定係数(R²)の解釈」を学びます。R²の意味、調整済みR²、そして過学習の危険性について理解を深めましょう!

📝 理解度チェック

学んだ内容を確認しましょう。解答を見る前に、まず自分で考えてみてください。

問題 1 基礎

以下の重回帰式があります。
売上 = 100 + 5×広告費 + 3×気温 - 0.5×価格

(1) 広告費が10万円、気温が25℃、価格が500円の時の売上を予測してください。
(2) 気温を変えずに、価格を100円下げると、売上はいくら増えますか?

【解答】

(1) 売上の予測

売上 = 100 + 5×10 + 3×25 – 0.5×500
  = 100 + 50 + 75 – 250
  = -25万円

マイナスになりましたが、これは切片が小さいためです。実際のデータの範囲内であれば、正の値になるはずです。

(2) 価格を100円下げた時の売上増加

価格の係数:-0.5
価格が1円下がると、売上が0.5万円増える
したがって、価格が100円下がると:
0.5 × 100 = 50万円増加

問題 2 基礎

偏回帰係数とは何ですか?簡潔に説明してください。

【解答】

偏回帰係数とは、他の説明変数を一定に保った時の、ある説明変数の目的変数への影響を表す係数です。

例:広告費の偏回帰係数が4.5の場合
→ 気温、価格、週末を変えずに、広告費だけを1万円増やすと、売上が4.5万円増える

問題 3 応用

不動産価格の重回帰分析で、以下の結果を得ました。
価格(万円)= 1000 + 50×広さ(㎡)- 10×駅距離(分)- 20×築年数(年)+ 300×駅前ダミー
R² = 0.92

(1) 広さ60㎡、駅から5分、築年数10年、駅前(1)の物件の価格を予測してください。
(2) 駅前物件は、駅前でない物件に比べて、いくら高いですか?

【解答】

(1) 価格の予測

価格 = 1000 + 50×60 – 10×5 – 20×10 + 300×1
  = 1000 + 3000 – 50 – 200 + 300
  = 4050万円

(2) 駅前プレミアム

駅前ダミーの係数:+300
→ 駅前物件は、駅前でない物件に比べて300万円高い

問題 4 応用

重回帰分析を行う際、係数の大きさだけで「どの変数が最も重要か」を判断できない理由を説明してください。

【解答】

係数の大きさだけで変数の重要度を判断できない理由は:

  1. 変数の単位が違う:気温は℃、広告費は万円など、単位が異なるため直接比較できない
  2. 変数の変動幅が違う:気温は20〜35℃(幅15)、広告費は50〜100万円(幅50)など、変動範囲が異なる

正しい比較方法:
・標準化係数(ベータ係数)を使う
・または、各変数の実際の変動幅×係数で比較する

問題 5 発展

【実践課題】以下のデータを使って、Pythonで重回帰分析を行ってください。

テーマ:学生の成績分析

生徒 勉強時間(h/日) 睡眠時間(h/日) 出席率(%) テスト点数(点)
1268060
2479075
3579585
4388570
56710095

(1) 重回帰式を求めてください。
(2) どの変数が最も影響しているか解釈してください。
(3) 勉強時間5時間、睡眠時間7時間、出席率90%の場合のテスト点数を予測してください。

【解答例】

(1) 重回帰式(例)

点数 = -20 + 8×勉強時間 + 3×睡眠時間 + 0.5×出席率
R² = 0.89

(2) 解釈

  • 勉強時間:係数8 → 1時間増えると8点上がる(最も影響大)
  • 睡眠時間:係数3 → 1時間増えると3点上がる
  • 出席率:係数0.5 → 1%増えると0.5点上がる

(3) 予測

点数 = -20 + 8×5 + 3×7 + 0.5×90
  = -20 + 40 + 21 + 45
  = 86点

❓ よくある質問

Q1: 説明変数は何個まで使えますか?

理論的には制限はありませんが、実務的には注意が必要です。

一般的なガイドライン:
サンプルサイズ(データ数)の10分の1程度まで
例:データが100件なら、説明変数は最大10個程度

説明変数が多すぎると:

  • 過学習のリスク(STEP 14で学習)
  • 多重共線性の問題(STEP 15で学習)
  • 計算が複雑になる
  • 解釈が難しくなる

推奨:本当に重要な変数だけを選ぶ

Q2: ダミー変数は、どんな時に使いますか?

カテゴリー(種類)を表す変数を数値化する時に使います。

例:

  • 週末 vs 平日:週末=1、平日=0
  • 性別:男性=1、女性=0
  • 商品タイプ:A商品=1、B商品=0
  • 季節:春=1、それ以外=0

注意:
3つ以上のカテゴリーがある場合(春、夏、秋、冬など)は、カテゴリー数-1個のダミー変数を作ります。
例:季節ダミー → 春、夏、秋の3つ(冬は基準)

これは「ダミー変数の罠」を避けるためです(高度な内容)。

Q3: p値が0.05より大きい変数は削除すべきですか?

必ずしも削除する必要はありません。

p値が大きい(例:p=0.3)の意味:
その変数が売上に影響している証拠が統計的に弱い(偶然の可能性が高い)

対応方針:

  • ビジネス的に重要なら残す(例:価格は必ず影響するはず)
  • 理論的根拠がないなら削除を検討
  • サンプルサイズが小さい場合、p値は大きくなりやすい → データを増やして再分析

重要:統計的有意性だけでなく、ビジネス的意味も考慮しましょう。

Q4: 単回帰と重回帰、どちらを使うべきですか?

影響する要因が複数あるなら、重回帰を使うべきです。

単回帰を使う場合:

  • 影響する要因が明らかに1つだけ
  • まず簡単な分析で傾向を掴みたい
  • 結果をわかりやすく説明したい

重回帰を使う場合:

  • 影響する要因が複数ある(現実はほとんどこれ)
  • より正確な予測が必要
  • どの要因が最も重要かを知りたい

実務では:まず単回帰で主要な変数の影響を確認 → 重回帰で複数の変数を考慮した精度の高い予測 → 段階的に分析を深めるのがおすすめ

Q5: R²が単回帰より重回帰の方が高いのはなぜですか?

説明変数を増やすと、R²は必ず高くなるためです。

理由:
変数を1つ追加すると、その変数が少しでも目的変数と関係があれば、R²が上がる
極端な例:100個の変数を使えば、R²=1.0(完璧な予測)も可能

問題:
変数を増やせば増やすほど、R²は上がるが、予測精度は必ずしも良くならない
これが「過学習」の問題(STEP 14で学習)

解決策:

  • 調整済みR²を使う(STEP 12で学習)
  • 調整済みR²は、不要な変数を追加すると逆に下がる
  • テストデータで予測精度を確認する(STEP 14で学習)
Q6: 相関行列で変数同士の相関が高い場合、どうすればいいですか?

多重共線性の問題が発生する可能性があります。

多重共線性とは:
説明変数同士が強く相関している状態
例:「広告費」と「マーケティング費」は似た情報を含む

問題:

  • 係数が不安定になる
  • 解釈が難しくなる
  • 予測精度が低下する可能性

対策:

  • 相関が高い変数のどちらかを削除
  • 変数を合成する(例:広告費+マーケティング費 → 総販促費)
  • VIF(分散拡大係数)で確認(STEP 15で学習)
📝

学習メモ

ビジネスデータ分析・意思決定 - Step 11

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE