5.10.4
04 変換(Box-Cox)
まとめ
- Weibull 分布や対数ガンマ分布など歪んだデータを生成し、ヒストグラムで偏りを確認します。
scipy.stats.boxcoxで正の値のみを扱う場合と、負の値を含む場合はyeojohnsonを使うケースを比較します。- 変換前後で線形回帰(Ridge)の残差を観察し、分布を整えるメリットを実感します。
- STL で季節性とトレンドを分解する の概念を先に学ぶと理解がスムーズです
1. ライブラリ #
| |
2. 歪んだ分布を可視化 #
| |
裾が長い(heavy-tail)ため、そのまま学習に放り込むと損失関数が不安定になります。
3. Box-Cox 変換(正の値のみ) #
boxcox はデータが正の値のときに使います。λ(lambda)は最尤推定で自動的に決まります。
| |
4. Yeo-Johnson 変換(負の値もOK) #
Box-Cox はゼロ/負の値を扱えないため、ログガンマのような分布には Yeo-Johnson を使います。
| |
yeojohnsonはデータを正規性に近づけるよう λ を推定し、ゼロをまたぐ場合も自動で扱ってくれます。
5. 変換前後で回帰の残差を比較 #
目的変数 y に歪みがあると、線形回帰の残差に偏りが生じます。以下の例では Ridge 回帰を用います。
| |
変換なし #
| |
偏り(ヒストグラムの歪み)が大きいのが分かります。
Yeo-Johnson 変換後 #
| |
残差がほぼ対称になり、誤差分布が改善されました。推定 λ は yeojohnson(y)[1] から取得でき、逆変換には scipy.stats.yeojohnson_normmax / yeojohnson の inv_boxcox 相当を使用します。
6. 実務での指針 #
| 変換 | 適用条件 | 補足 |
|---|---|---|
| Box-Cox | 0 より大きい実数のみ | λ=0 に近いと log 変換に近づく |
| Yeo-Johnson | 負値・ゼロを含む | scikit-learn にも PowerTransformer 実装あり |
| Log | 正の値かつスケールが大きいときの手軽な選択肢 | 零点回避のため log1p を使うことも多い |
- 予測後に逆変換するロジックを忘れずに実装する。
- λ は訓練データから求め、本番では固定して使う。
- 変換後に標準化(
StandardScaler)を挟むとより安定します。
7. まとめ #
- 目的変数が正の値のみ → Box-Cox、負値を含む → Yeo-Johnson を検討。
- 変換後はモデルの残差を再チェックし、改善がみられるかを指標(MSE / MAE)で確認。
- 逆変換の実装漏れが事故につながりやすいので、ユーティリティ関数としてまとめておくと安全です。
- STLで季節性とトレンドを分解 — STLによる柔軟な季節・トレンド分離
- インフレ調整で実質値に揃える — CPIを考慮して時価を実質値に変換
- 差分による定常化を比較 — 原系列と差分系列で定常化効果を確認