本書の "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 軸が対数スケールか金額かの違いで「Histogram と Density Plot:対数スケール」の図 3.5 と同じ。
0 件のコメント:
コメントを投稿