2016年9月28日水曜日

データ操作:Data Transformations(データ変換)

NA の取扱い方」からの続き。

本書の "4.1.2 Data transformations" をもとにした。

The purpose of data transformation is to make data easier to model—and easier to understand. 
データ変換の目的は、モデル化しやすいデータにすること、つまり読みやすいデータにすること。

例えば、生活費は州ごとに異なるので、保険契約予測モデルの入力値に「収入」を使う場合、「収入」を顧客の住む州の代表値で正規化する、など。


離散値への変換

次は図 4.2 (に相当。スクリプトが掲載されていないため、独自で作成。また、income の無効値を排除した custdata2 を使用)。
> ggplot(custdata2,aes(x=income,y=as.numeric(health.ins))) +
 geom_point(position=position_jitter(w=0.05,h=0.05)) + geom_smooth() +
 scale_x_log10(breaks=c(10^3,10^4,10^5)) +
 annotation_logticks(sides="bt") 


曲線が右上がり転じようとしている地点を、income の約 $20,000 と見積る。つまり、y 軸の「健康保険加入状況」は、この地点を境に「加入」に転じるとして、数値である income 変数を boolean 値へ変更する。

> custdata$income.lt.20K <- custdata$income < 20000
> summary(custdata$income.lt.20K)
   Mode   FALSE    TRUE    NA's 
logical     678     322       0 


より単純な方法として、年齢で分ける方法もある。

> brks <- c(0, 25, 65, Inf)
> custdata$age.range <- cut(custdata$age, breaks=brks, include.lowest=T)
> summary(custdata$age.range)
  [0,25]  (25,65] (65,Inf] 
      56      732      212 


正規化(Normalization and Rescaling)

ある分析対象の数値を、絶対値で分析することはあまり意味がないと思っている。データ分析とは関係ない日常でも、年齢が「若いとか歳食ってる」とか、「金持ちとかそうじゃない」とか、「頭が良いとか悪い」とか...、絶対値で測っても意味ないよね(笑)

Normalization is useful when absolute quantities are less meaningful than relative ones.
正規化は絶対値が相対値より意味をなさない場合に有効。
For example, you might be less interested in a customer’s absolute age than you are in how old or young they are relative to a “typical” customer. 
例えば、顧客の「絶対値」の年齢よりも、典型的な顧客と比べて「相対的に若いか年上か」に興味がある、など。

視覚的には、左のように確率密度で。

> ggplot(custdata,aes(x=custdata$age)) +
 geom_density()


とはいえ、ここでは視覚化よりも、正規化した summary の方が情報量は多い。

次の例は、平均値で正規化した顧客の年齢。

> summary(custdata$age)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    0.0    38.0    50.0    51.7    64.0   146.7 
> summary(custdata$age/mean(custdata$age))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.0000  0.7350  0.9671  1.0000  1.2380  2.8370 


個人的には、標準偏差で正規化した方がわかりやすい。

> summary((custdata$age-mean(custdata$age))/sd(custdata$age))
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-2.74100 -0.72630 -0.09011  0.00000  0.65210  5.03500 


対数変換(Log Transformations)


4.4 は「収入の確率密度分布」で、下段は対数スケールに変換したもの。
> p1 <- ggplot(custdata, aes(x=income)) + geom_density() + scale_x_continuous(labels=scales::dollar)
> p2 <- ggplot(custdata, aes(x=log10(income))) + geom_density()
> library(grid)
> nplot(list(p1,p2))
# nplot の定義は「R コード」参照。

For the purposes of modeling, which logarithm you use—natural logarithm, log base 10, or log base 2—is generally not critical. 
自然対数、10 や 2 の底数のどれを使うかは、一般的には重要ではない。

金額に関しては、log base 10 の方が読みやすい効果がある程度の違い。図 4.4 の下段は、x 軸が対数スケールか金額かの違いで「HistogramDensity Plot:対数スケール」の3.5 と同じ。

0 件のコメント:

コメントを投稿