狠狠撸

狠狠撸Share a Scribd company logo
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
ヒストグラムよりもさらに正規性が目視でわかりやすいのでよく使用されるのが 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 や負の数
のデータがある場合は変換ができないため、全て正の数になるようデータを平行移動する
のが定石とされているが、この操作はどの程度動かすかによって結果が変わってしまうた
め、あまり薦められない。
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
○ データ変換
パラメータ 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="対数正規分布        対数変換後")

More Related Content

搁による叠辞虫-颁辞虫変换

  • 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="対数正規分布 対数変換後")