Box-Cox変換・逆変換
分布を正規分布に近づける変換です。指数・対数変換より柔軟で、データに合わせて変換の強さ(λ)を自動で決めます。逆変換で元のスケールに戻せます。
入出力
| ポート | 内容 |
|---|---|
| 入力データ | データ |
| 出力データ | データ |
| λ値 | データ |
出力が 2 つあります。 2 つ目の λ値 には、変数名 と λ値 の 2 列が入ります。逆変換のときに必要なので控えておいてください。
Spark エンジンでも動きます。
行の数は変わりません。 変換した結果は新しい列として増えます。
設定項目
- 処理を選択
- Box-Cox変換(既定)かBox-Cox逆変換。選んだ側の設定項目だけが出ます。
Box-Cox変換を選んだとき
- 処理対象列を選択
- 変換する列。数値の列だけ選べます。複数選べます。
Box-Cox逆変換を選んだとき
逆変換の設定という組になっていて、いくつでも足せます。
- 結果の挿入先を設定
- 新規列に挿入(既定)か既存列に上書き。
- 新規列名を入力必須
- 新規列に挿入のときだけ出ます。
- 処理対象列を選択
- 元に戻す列。数値の列だけ選べます。1 つの組につき 1 列です。
- BoxCox変換時のλの値を設定必須
- 変換したときに λ値 に出力された値。数値として読めない字を入れると
0として扱われます。
増える列の名前
| 処理 | できる列 |
|---|---|
| Box-Cox変換 | BoxCox変換後_<元の列名>。元の列はそのまま残ります |
| Box-Cox逆変換 | 新規列に挿入なら入力した名前、既存列に上書きなら元の列名 |
逆変換の結果は小数第 5 位に丸められます。 変換前の値と完全には一致しないことがあります。
扱えない値
0 以下の値を含む列は変換できません。 Box-Cox 変換は正の値にしか定義されていないためです。0 や負の値があるときは、先に数値列同士の演算で下駄を履かせてから変換してください。
欠損値と無限大は欠損値のまま残り、変換の計算からも外れます。 列が全部欠損のときは λ も欠損になります。
変換と逆変換の流れ
- Box-Cox変換を掛ける。λ値 の出力に、列ごとの λ が出る
- 変換した列でモデルを作る・予測する
- Box-Cox逆変換に、1 で出た λ を入れて元のスケールに戻す
λ を取り違えると、戻した値が合いません。 λ はデータごとに決まるので、2 つ目の出力を記録しておいてください。
エラーと対処
新規列名が既存の列名とぶつかっている
Box-Cox逆変換で、すでにある列と同じ名前を入れたときに出ます。
新規列名(
{{new_col}})が既存の列名と重複しています。
直し方 — 別の名前にするか、既存列に上書きに切り替えます。
処理対象列に数値以外がある
Box-Cox変換で、数値に見えても文字列型になっている列を選んだときに出ます。
処理対象列に数値型以外のデータが含まれてます。型変換をするか、数値型以外の列を除去してください。
直し方 — 列の型変更で数値にするか、その列を外します。
処理対象列を選んでいない
Box-Cox変換で、処理対象列を選択が空のまま実行したときに出ます。
対象の列が選択されていません。
直し方 — 処理対象列を選択で列を選んでください。
選んだ列が入力データにない
前のノードで列名を変えたり列を削ったりして、選んである列がなくなったときに出ます。
対象の列が存在しません。
直し方 — 列を選び直してください。
列の値がすべて同じ(Spark エンジンのみ)
Spark エンジンで、値が 1 種類しかない列を変換しようとしたときに出ます。
列 ‘
{{col}}’ のデータがすべて同じ値です。Box-Cox変換には変動のあるデータが必要です。
直し方 — その列を対象から外してください。値が変わらない列は変換しても意味がありません。
よく使う例
1. 偏った分布を正規分布に近づける
線形回帰のように「誤差が正規分布している」ことを前提にするモデルに、裾の長い売上を入れたいとき。
入力
| 店舗 | 売上 |
|---|---|
| 渋谷 | 12000 |
| 新宿 | 800 |
| 池袋 | 400 |
設定
| 設定項目 | 値 |
|---|---|
| 処理を選択 | Box-Cox変換 |
| 処理対象列を選択 | 売上 |
出力 — BoxCox変換後_売上 が増えます。
| 店舗 | 売上 | BoxCox変換後_売上 |
|---|---|---|
| 渋谷 | 12000 | 2.263273 |
| 新宿 | 800 | 2.175980 |
| 池袋 | 400 | 2.131636 |
λ値 の出力は 1 行です。
| 変数名 | λ値 |
|---|---|
| 売上 | −0.4343666060665149 |
30 倍あった値の差が 0.13 の差になります。 変換後の値そのものには意味がなく、分布の形を整えるためのものです。元の金額に戻すには逆変換が要ります。
2. 予測値を元のスケールに戻す
変換した値で予測したので、金額の単位に戻して報告したいとき。
入力(例 1 の列でモデルを作り、その予測値が出てきたところ)
| 店舗 | 予測値 |
|---|---|
| 渋谷 | 2.2 |
| 新宿 | 2.1 |
設定
| 設定項目 | 値 |
|---|---|
| 処理を選択 | Box-Cox逆変換 |
| 結果の挿入先を設定 | 新規列に挿入 |
| 新規列名を入力 | 予測売上 |
| 処理対象列を選択 | 予測値 |
| BoxCox変換時のλの値を設定 | -0.4343666060665149(例 1 の λ値 出力) |
出力 — 予測売上 が増えます。
| 店舗 | 予測値 | 予測売上 |
|---|---|---|
| 渋谷 | 2.2 | 1300.60613 |
| 新宿 | 2.1 | 270.36273 |
3. 複数の列をまとめて変換する
説明変数が何本もあり、まとめて分布を整えたいとき。
入力
| 売上 | 単価 | 客数 |
|---|---|---|
| 12000 | 980 | 12 |
| 800 | 420 | 2 |
設定
| 設定項目 | 値 |
|---|---|
| 処理を選択 | Box-Cox変換 |
| 処理対象列を選択 | 売上、単価、客数 |
出力 — BoxCox変換後_売上 BoxCox変換後_単価 BoxCox変換後_客数 の 3 列が増え、λ値 には 3 行出ます。λ は列ごとに別の値なので、戻すときは行を取り違えないようにしてください。
4. 0 を含む列を変換できるようにする
売上が 0 の日があって、そのままでは変換できないとき。
入力
| 日付 | 売上 |
|---|---|
| 2024-04-01 | 0 |
| 2024-04-02 | 3200 |
設定 — 先に数値列同士の演算で 売上 + 1 の列を作り、その列を Box-Cox変換 の処理対象列に指定します。
出力 — すべて正の値になるので変換できます。戻すときは逆変換のあとに 1 を引きます。