クイックリンク
単回帰: 傾向を見つける
重回帰: 次元を増やして予測する
非線形回帰: 曲線を当てはめる
ロジスティック回帰: 2値分類を扱う
はじめに
単にデータを集めるだけでは十分ではありません。表に数字を並べても、それが行動につながらなければ意味がありません。回帰分析はデータの中の関係性を定量化し、予測や意思決定を支援するための強力な統計手法です。Pythonはこの作業を簡潔かつ柔軟に実行できるツール群を備えています。ここでは実用的なコード例、解釈の仕方、注意点、そして実務での適用フローを示します。
重要用語(1行定義)
- 回帰: ある変数(目的変数)を他の変数(説明変数)で説明・予測する統計手法。
- 説明変数(独立変数): 予測に使う変数。
- 目的変数(従属変数): 予測される変数。
- r²: モデルが目的変数の分散をどれだけ説明するかを示す指標。
- p値: 帰無仮説を棄却する強さを示す統計量(小さいほど有意)。
重要: この記事のコード例はJupyter Notebook環境での実行を想定しています。必要なライブラリは seaborn, pingouin, numpy, pandas, matplotlib などです。
前提: 環境とデータ
このシリーズではSeabornに含まれるサンプルデータ(tips, titanic など)を使って説明します。Mambaやcondaなどで環境を作成しておくと依存関係の管理が楽です。
必要なライブラリの例:
pip install seaborn pingouin numpy pandas matplotlib
ノートブックで図をインライン表示する場合:
%matplotlib inline
単回帰: 傾向を見つける
単回帰は最も基本的な回帰で、2つの変数間の直線的な関係を確認します。x 軸に説明変数、y 軸に目的変数を置いて散布図を作り、最もよく当てはまる直線を求めます。ここではニューヨーク市のレストランのチップ(tip)と総請求額(total_bill)の関係を例にします。
まずSeabornをインポートして、データを読み込みます。
import seaborn as sns
# サンプルデータ読み込み
tips = sns.load_dataset('tips')
散布図を描く:
sns.relplot(x='total_bill',y='tip',data=tips)
散布図は概ね線形の関係を示しています。回帰直線を描くには:
sns.regplot(x='total_bill',y='tip',data=tips)
より正式な推定と係数の取得には Pingouin を使います。
import pingouin as pg
pg.linear_regression(tips['total_bill'],tips['tip']).round(2)
この出力で注目すべきは r²(決定係数)です。ソース例では r² = 0.46 となっており、これはモデルが目標変数の約46%の分散を説明できることを意味します。r² の平方根(相関係数)は約0.68で、0に近いより1に近いほど強い線形関係を示します。
回帰直線は y = mx + b の形で表され、ここで m が傾き、b が切片です。例の結果から係数を読み取ると実用的な予測式は次のようになります。
tip = 0.11 * total_bill + 0.92
Pythonで単純な予測関数を作ると:
def tip(total_bill):
return 0.92 + 0.11 * total_bill
重要: 上の return 行はインデントが必要です。Pythonのインデントは通常4スペースです。
100ドル(100ドル)の請求に対する予測チップ:
print(tip(100))
出力(期待値)は約12ドルです。
考え方のヒント(メンタルモデル):
- 傾き m は「請求額が1単位増えたときにチップがどれだけ増えるか」を表します。
- 切片 b は請求額が0のときの予測チップ(実務的には外挿に注意)。
受け入れ基準(単回帰):
- r²が十分に高い(問題領域に依存)
- 残差プロットにパターンがない(等分散性)
- 外れ値や影響点が許容範囲にある
重回帰: 次元を増やして予測する
説明変数を複数使うと、平面や高次元の超平面をデータにフィットさせることになります。再び tips データセットを使い、パーティの人数(size)を加えてチップを予測してみます。
pg.linear_regression(tips[['total_bill','size']],tips['tip']).round(2)
注意点: pandas で複数列を指定する場合は二重の角括弧 [[…]] を使います。
この例では r² が単回帰と同じであったため、total_bill と size がともに有効な予測子であることを示唆します。得られた係数を用いたモデルは例えば次のようになります。
def tip(total_bill, size):
return 0.67 + 0.09 * total_bill + 0.19 * size
解釈のポイント:
- 各係数は「他の変数を固定したときにその変数が1単位増えたら目的変数がどれだけ変わるか」を示します。
- 切片はすべての説明変数が0のときの予測値(現実的でない状況もあり得る)。
注意(多重共線性):
説明変数が互いに高い相関を持つと、係数の不安定化(分散増大)を招きます。VIF(分散拡大係数)でチェックしましょう。一般的な目安は VIF > 5 や 10 を警戒することです。
サンプルVIF計算(pandas, statsmodels を使う例):
from statsmodels.stats.outliers_influence import variance_inflation_factor
import numpy as np
X = tips[['total_bill','size']].dropna().values
vifs = [variance_inflation_factor(X, i) for i in range(X.shape[1])]
print(vifs)
代替アプローチ(重回帰が合わない場合):
- 特徴量エンジニアリング(交互作用項、対数変換など)
- 主成分分析(次元削減)
- 正則化(Ridge, Lasso)で係数の分散を抑える
- 非線形モデル(決定木、ランダムフォレスト、勾配ブースティング)
非線形回帰: 曲線を当てはめる
回帰は必ずしも直線である必要はありません。多項式回帰やその他の非線形変換を用いることで、曲線を当てはめられます。ここでは人工データで2次(放物線)を例にします。
NumPyでxを生成してyを2次式で作成します。
import numpy as np
x = np.linspace(-100,100,1000)
y = 4*x**2 + 2*x + 3
PandasのDataFrameに詰めます。
import pandas as pd
df = pd.DataFrame({'x':x,'y':y})
先頭を確認:
df.head()
散布図を見ると放物線の形状が確認できます。
sns.relplot(x='x',y='y',data=df)
Seabornの regplot に order=2 を指定すると2次多項式で当てはめられます。
sns.regplot(x='x',y='y',order=2,data=df)
Pingouinを使って線形回帰により多項式を当てはめる場合、xの2乗を特徴量として追加します。
df['x2'] = df['x']**2
pg.linear_regression(df[['x','x2']],df['y']).round(2)
人工データなのでr²が1になっていますが、実世界のデータではここまでの一致は稀です。
2次関数の予測関数例:
def quad(x):
return 3 + 2*x + 4*x**2
多項式の次数を上げれば、より複雑な曲線を当てはめられますが、高次にすると過学習のリスクが高まるため、交差検証で次数を選ぶことが重要です。
ロジスティック回帰: 2値分類を扱う
目的変数が0/1のようなカテゴリ(生存/死亡、合格/不合格など)のときはロジスティック回帰を使います。Seabornは lmplot の logistic=True で可視化を簡単に行えます。ここでは Titanic データの運賃(fare)が生存(survived)を予測できるかを見ます。
titanic = sns.load_dataset('titanic')
titanic.head()
可視化:
sns.lmplot(x='fare',y='survived',logistic=True,data=titanic)
Pingouinでロジスティック回帰を実行できます。
pg.logistic_regression(titanic['fare'],titanic['survived']).round(2)
出力の注目点: p値(pval)。ソースでは pval = 0.0 と示されており、運賃は生存の強い予測因子であることを示しています(ただしこの結論はデータの欠損や交絡因子の有無に依存します)。
ロジスティック回帰の評価指標:
- AUC-ROC
- 精度(accuracy)、適合率(precision)、再現率(recall)
- 混同行列
クラス不均衡がある場合は精度だけでは不十分です。適切な指標を選び、閾値調整やリサンプリングを検討します。
モデル診断と仮定のチェック
線形回帰やロジスティック回帰を使う際は、モデルの仮定を検証することが重要です。主なチェック項目:
- 残差プロット: 残差が平均0でランダムに散らばるか
- 等分散性: 残差の分散が一定か(異分散に注意)
- 正規性: 残差が正規分布に近いか(小サンプルでは重要)
- 独立性: 時系列データでは自己相関をチェック(Durbin-Watson)
- 外れ値・影響点: LeverageやCookの距離で検出
- 多重共線性: VIFで確認
残差プロットの例(Seaborn / matplotlib):
import matplotlib.pyplot as plt
preds = model.predict(X_test)
residuals = y_test - preds
plt.scatter(preds, residuals)
plt.axhline(0, color='red', linestyle='--')
plt.xlabel('Predicted')
plt.ylabel('Residuals')
plt.show()
異分散が疑われる場合は対数変換や加重最小二乗法(WLS)を検討します。外れ値はモデルの係数を大きく変える可能性があるため、原因を調査し、削除、修正、ロバスト回帰などの対応を検討します。
代替手法と拡張
回帰の前提が成り立たない、もしくはより高精度を求める場合の選択肢:
- 正則化: Ridge(L2)、Lasso(L1)で過学習と係数のばらつきを抑える
- 決定木系: 決定木、ランダムフォレスト、XGBoost(非線形関係に強い)
- サポートベクターマシン: 特に高次元で有効
- Generalized Additive Models (GAM): 各特徴量に対して非線形関数を適用
- ロバスト回帰: 外れ値に影響されにくい手法
- ベイズ回帰: 事前知識を取り込める
選択のヒント(経験則):
- 変数同士の直線的関係が予想され、解釈性が重要なら線形/正則化モデル。
- 非線形・複雑な相互作用が疑われるなら決定木系。
- 不確実性の推定が欲しいならベイズ手法。
実務プレイブック(SOP: データ→モデル→評価→配備)
- ビジネス課題を定義する(何を予測するか、どの指標を使うか)。
- データ収集と概要把握(欠損・分布・外れ値の確認)。
- 特徴量エンジニアリング(カテゴリ変数のエンコード、スケーリング、交互作用、多項式)。
- 訓練/検証/テスト分割(時系列なら時間順、ランダムならstratifyを検討)。
- 基本モデル(線形回帰/ロジスティック)を作成、評価指標を取得。
- モデル診断(残差、VIF、AUC、混同行列)。
- 必要ならチューニングや代替手法を適用(正則化、木系、ブースティング)。
- 最終モデルを選定し、モデルアーティファクトを保存(係数、スケーラ、エンコーダ)。
- 本番環境でのモニタリング計画を作成(データドリフト、性能劣化)。
- 部署向けドキュメントと受け入れテストを用意して配備。
役割別チェックリスト(要点):
- データサイエンティスト: 特徴量設計、交差検証、モデル解釈
- データエンジニア: データパイプライン、前処理の確実な自動化
- プロダクト担当: KPI、モデルの導入基準、A/Bテスト計画
- MLOps: モデルのデプロイ、監視、ロールバック手順
受け入れ基準(Критерии приёмки):
- テストセットでの主要な評価指標が事前合意の閾値を満たす
- デプロイ後のモニタリングが実装されている
- 再現性が保証され、入力データの要件が文書化されている
テストケースと受け入れ条件
例: チップの予測モデル
- 正常系: total_bill=50, size=2 のときモデルが合理的なチップ(例: 6〜8ドル)を返す
- 境界値: total_bill=0 のとき挙動を確認(外挿に注意)
- 異常系: 欠損値や負の請求額が入力された場合は明確にエラーハンドリングする
- 性能: 予測のレイテンシが要件内(例: <100ms)
よくある誤解と失敗例(カウンターケース)
- 散布図で直線に見えるからといって線形回帰が最適とは限らない。残差にパターンがあれば非線形モデルが適切。
- 高いr²が常に良いとは限らない。過学習やデータ漏洩の可能性を疑う必要がある。
- p値が小さい=因果関係ではない。交絡因子の影響やサンプリングバイアスを考慮すべき。
セキュリティとプライバシーの注意点
- 個人データを含む場合は匿名化や最小化を行う。
- モデルに機微な属性(人種、宗教など)が含まれている場合は公平性の検査を行う。
- GDPRなどの適用法令下では説明責任とデータ主体の権利を確保する。
1行用語集
- 決定係数(r²): モデルが説明する分散の割合。
- VIF: 多重共線性を測る指標。
- AUC: 分類モデルの識別能力を表す指標。
- 過学習: 訓練データに過度に適合して一般化できない状態。
意思決定フロー(簡易)
flowchart TD
A[問題定義] --> B{目的変数は連続か分類か}
B -->|連続| C[線形/多項式回帰を検討]
B -->|分類| D[ロジスティック回帰/分類器を検討]
C --> E{残差やr2が良好か}
D --> F{AUCや混同行列が良好か}
E -->|Yes| G[本番化と監視]
E -->|No| H[特徴量改善 or 非線形モデル]
F -->|Yes| G
F -->|No| H
ソーシャルプレビュー案
- OGタイトル: Pythonで学ぶ回帰入門 — 単回帰からロジスティック回帰まで
- OG説明: SeabornとPingouinで実例を動かしながら学ぶ回帰の基本、診断、実務フロー。
短い告知文(100–200語):
Pythonと主要ライブラリを使って回帰分析の基礎から実務での適用までをカバーする入門記事です。単回帰、重回帰、非線形回帰、ロジスティック回帰の実例、モデル診断、代替手法、受け入れ基準、運用上の注意点をまとめています。データの可視化、係数の解釈、VIFや残差解析などの診断手法を具体的なコードとともに紹介します。データ分析業務やモデル導入の際に手元に置いておきたいチェックリスト付き。
まとめ
- 回帰はデータの関係性を定量化して予測や意思決定を支援する基礎的手法です。
- 単回帰・重回帰・多項式回帰・ロジスティック回帰を使い分け、モデルの仮定と診断を必ず行ってください。
- 正則化や非線形モデルなどの代替手法は、仮定違反や過学習に対する実用的な解決策を提供します。
- 実務ではデータの前処理、交差検証、モデル監視、プライバシー配慮を含む標準化されたワークフローが重要です。
重要: 実データに適用する際は常にデータ理解とドメイン知識を優先し、得られた数値の意味を慎重に解釈してください。