コンテンツにスキップ

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 や負の値があるときは、先に数値列同士の演算で下駄を履かせてから変換してください。

欠損値と無限大は欠損値のまま残り、変換の計算からも外れます。 列が全部欠損のときは λ も欠損になります。

変換と逆変換の流れ

  1. Box-Cox変換を掛ける。λ値 の出力に、列ごとの λ が出る
  2. 変換した列でモデルを作る・予測する
  3. 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変換後_売上
渋谷120002.263273
新宿8002.175980
池袋4002.131636

λ値 の出力は 1 行です。

変数名λ値
売上−0.4343666060665149

30 倍あった値の差が 0.13 の差になります。 変換後の値そのものには意味がなく、分布の形を整えるためのものです。元の金額に戻すには逆変換が要ります。

2. 予測値を元のスケールに戻す

変換した値で予測したので、金額の単位に戻して報告したいとき。

入力(例 1 の列でモデルを作り、その予測値が出てきたところ)

店舗予測値
渋谷2.2
新宿2.1

設定

設定項目値
処理を選択Box-Cox逆変換
結果の挿入先を設定新規列に挿入
新規列名を入力予測売上
処理対象列を選択予測値
BoxCox変換時のλの値を設定-0.4343666060665149(例 1 の λ値 出力)

出力 — 予測売上 が増えます。

店舗予測値予測売上
渋谷2.21300.60613
新宿2.1270.36273

3. 複数の列をまとめて変換する

説明変数が何本もあり、まとめて分布を整えたいとき。

入力

売上単価客数
1200098012
8004202

設定

設定項目値
処理を選択Box-Cox変換
処理対象列を選択売上、単価、客数

出力 — BoxCox変換後_売上 BoxCox変換後_単価 BoxCox変換後_客数 の 3 列が増え、λ値 には 3 行出ます。λ は列ごとに別の値なので、戻すときは行を取り違えないようにしてください。

4. 0 を含む列を変換できるようにする

売上が 0 の日があって、そのままでは変換できないとき。

入力

日付売上
2024-04-010
2024-04-023200

設定 — 先に数値列同士の演算で 売上 + 1 の列を作り、その列を Box-Cox変換 の処理対象列に指定します。

出力 — すべて正の値になるので変換できます。戻すときは逆変換のあとに 1 を引きます。

関連