搁による叠辞虫-颁辞虫変换
- 1. 2009.12 作成
データを正規分布に近づける: Box-Cox 変換
Box-Cox 変換(Box-Cox transformation)とは、正規分布に従わないデータを正規分布に近
づける方法。
正の値をとる確率変数 X に対し、
変換パラメータλを用いて以下のように変換すると、
変換後のデータ X*は正規分布に従う。λ=-1 では逆数変換、λ=0 で対数変換、λ=0.5 で平
方根変換と同じものになる。
下の図は、Tweedie 分布及び対数正規分布に従う乱数データについて、Box-Cox 変換
(λ=0)を行い、もとのデータと変換後のデータをそれぞれヒストグラムにしたもの。
Tweedie分布 対数正規分布
0.6
0.6
0.5
0.5
0.4
0.4
0.3
0.3
0.2
0.2
0.1
0.1
0.0
0.0
0 1 2 3 4 5 0 2 4 6 8 10
Tweedie、変換後 対数正規分布、変換後
0.6
0.6
0.5
0.5
0.4
0.4
0.3
0.3
0.2
0.2
0.1
0.1
0.0
0.0
-3 -2 -1 0 1 2 3 -2 -1 0 1 2
- 2. ヒストグラムよりもさらに正規性が目視でわかりやすいのでよく使用されるのが Q-Q プ
ロットで、データを昇順にソートし、カイ二乗分布を想定した理論値と実際の値を仮定し
てデータをプロットする。
データが正規分布に従っていれば、プロット点が原点を通る傾き 1 の直線上にのる。
Tweedie 分布データも、対数化すれば正規分布になる対数正規分布データとおなじくらい
きれいに直線上にのることが確認できる。
Tweedie分布 対数正規分布
20
6
15
4
10
2
5
0
0
-3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3
norm quantiles norm quantiles
変換後 変換後
2
1
1
0
0
-1
-1
-2
-2
-3
-3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3
norm quantiles norm quantiles
注意事項
Box-Cox 変換は単変量データに対する手法であり、もとのデータが他の変数と何らかの
関係性がある場合は、変換によってその関係が崩れることに注意が必要。また、0 や負の数
のデータがある場合は変換ができないため、全て正の数になるようデータを平行移動する
のが定石とされているが、この操作はどの程度動かすかによって結果が変わってしまうた
め、あまり薦められない。
- 3. R プログラム
○ データ作成
rm(list=ls(all=TRUE)) # ワークスペースのクリア
setwd("d:/test/") # 必要に応じて作業ディレクトリを指定
# Tweedie 分布データ
library(tweedie) # Tweedie 分布乱数発生用
p <- 2.5 # べき乗のパラメータ
mu <- 1 # 平均値パラメータ
ph <- 1 # 分散パラメータ
Tdat<- rtweedie(100, power=p, mu=mu, phi=ph)
# 対数正規分布データ
Ndat<- exp(rnorm(100)) # デフォルトで平均 0 分散 1
○ λ(ラムダ)の推計
ライブラリ car を使用する。
library(car)
box.cox.powers(Tdat) # 最適なのは 0
box.cox.powers(Ndat) # 最適なのは 0
コンソール出力は以下のとおり。水色でマークしたのが推計結果だが、実際の変換は
通常きりのいい数字を使用する。この場合、両者ともラムダは 0 を使う。
>box.cox.powers(Tdat)# 最適なのは 0
Box-Cox Transformation to Normality
Est.PowerStd.Err. Wald(Power=0) Wald(Power=1)
0.0605 0.0834 0.7251 -11.2662
L.R. test, power = 0: 0.5275 df = 1 p = 0.4677
L.R. test, power = 1: 114.9119 df = 1 p = 0
>box.cox.powers(Ndat)
Box-Cox Transformation to Normality
Est.PowerStd.Err. Wald(Power=0) Wald(Power=1)
-0.0832 0.103 -0.8082 -10.5186
L.R. test, power = 0: 0.6629 df = 1 p = 0.4155
L.R. test, power = 1: 127.4005 df = 1 p = 0
- 4. ○ データ変換
パラメータ p に、推計したλの値を代入する。
Tdat2 <- box.cox(Tdat, p=0)
Ndat2 <- box.cox(Ndat, p=0)
○ ヒストグラム表示
library(MASS) # truehist 用
par(mfrow=c(2,2)) # グラフィック画面を 2×2 分割
truehist(Tdat, main="Tweedie 分布 変換前")
lines(density(Tdat), col="red", lwd=2) # 密度関数表示
truehist(Ndat, main="対数正規分布 変換前")
lines(density(Ndat), col="red", lwd=2) # 密度関数表示
truehist(Tdat2, main="Tweedie 分布 対数変換後")
lines(density(Tdat2), col="red", lwd=2)# 密度関数表示
truehist(Ndat2, main="対数正規分布 対数変換後")
lines(density(Ndat2), col="red", lwd=2)# 密度関数表示
○ Q-Q プロット表示
par(mfrow=c(2,2)) # グラフィック画面を 2×2 分割
qq.plot(Tdat, main="Tweedie 分布 変換前")
qq.plot(Ndat, main="対数正規分布 変換前")
qq.plot(Tdat2, main="Tweedie 分布 対数変換後")
qq.plot(Ndat2, main="対数正規分布 対数変換後")