UPDATE: 2022-10-28 19:42:49
ここではWinsorizationという変換の方法についてまとめる。
データ分析をしていると、外れ値はやっかななわけです。外れ値の影響を大きく受けて、平均が大きくずれることもしばしば。典型的な戦略は、外れ値に該当するレコードを除外するとかですが、Winsorization変換では、指定したパーセンタイルで上限下限を設定し、外れ値を上限下限に丸める変換を行う。たとえば、90%のWinsorization変換では、5パーセンタイルより下のすべてのデータと、95パーセンタイルより上のデータが、上限下限に丸められます。
サンプルデータとして、コーシー分布から生成される乱数を利用する。コーシー分布から乱数を生成すれば突然、極端に大きな値をとってくれるので、winsorization変換のサンプル例としてありがたい。正規分布でももちろん良い。緑の点が、90%のWinsorization変換での外れ値。
library(tidyverse)
set.seed(1989)
<- tibble(x = rcauchy(n = 500, location = 0, scale = 0.5),
df id = 1:500) %>%
mutate(outlier = if_else(x < quantile(x, probs = c(0.05, 0.95))[1] |
> quantile(x, probs = c(0.05, 0.95))[2],
x
T,F))
ggplot(df, aes(id, x, col = outlier)) + geom_point()
これを90%のWinsorization変換を行うと、外れ値である緑の点が上限下限に変換される。これがwinsorization変換。
<- function (x, probs = c(0.05, 0.95)){
winsor <- quantile(x, probs = probs)
limit
< limit[1]] <- limit[1]
x[x > limit[2]] <- limit[2]
x[x
x
}
<- df %>%
df mutate(x_winsored = winsor(x))
ggplot(df, aes(id, x_winsored, col = outlier)) + geom_point()
このwinsorization変換を使って、ユーザーをスコアリングしたりする。AppやHP上での各アクションにスコアをつけ、そのアクションを直近nヶ月以内に実行した回数と掛け合わせて、各ユーザーのスコアリングを行う。こうすることで、極端にスコアが低い(高い顧客)を除くことができる。今回はここまで。