私は似たような多くのデータフレームを持っています
times = c("2015-12-30 20:00:00", "2016-01-06 20:00:00",
"2016-01-08 20:00:00", "2016-01-11 20:00:00",
"2016-01-13 20:00:00", "2016-01-14 20:00:00",
"2016-01-15 20:00:00", "2016-01-18 20:00:00",
"2016-01-20 20:00:00", "2016-01-21 20:00:00",
"2016-01-25 20:00:00")
counts = c(7, 14, 61, 1, 2, 66, 10, 35, 1, 304, 2)
df <- data.frame(timestamp = as.POSIXct(times, format="%Y-%m-%d %H:%M:%S",
tz="Pacific/Auckland"),
count = counts)
上記と同様のデータセットで外れ値を特定しようとしています。通常の QQ プロットとヒストグラムを見ると、このサンプルが正規分布からのものではないことが明らかです。
hist(df$count)
qqnorm(df$count)
qqline(df$count)
次に、Box-Cox ベキ変換を使用して、データを正規分布データに近づけようとします。
lambda <- geoR::boxcoxfit(df$count)$lambda
df$transformed <- car::bcPower(df$count, lambda=lambda)
注:forecast
、またはcar
パッケージを使用するなど、Box-Cox 変換パラメーターを見つける他の方法を認識しています。Box-Cox 変換関数の拡張ファミリを使用し、https://stats.stackexchange.com/a/35717/101902回答のように変数を最適化する方法もあります。私が使用しない理由の 1 つは、forecast
ほとんどの場合、データが等距離ではなく、典型的な時系列特性を持たないことです。もう1つは、プロセスを自動化する必要があるという事実です。GLMに適合するメソッド、またはLMは盲目的に何も返さないだけです。
データを変換し、変換されたデータの z スコアを計算すると、次のようになります。
timestamp count transformed zscore
1 2015-12-30 20:00:00 7 1.7922836 -0.14446864
2 2016-01-06 20:00:00 14 2.3618561 0.22598616
3 2016-01-08 20:00:00 61 3.4646761 0.94326978
4 2016-01-11 20:00:00 1 0.0000000 -1.31018523
5 2016-01-13 20:00:00 2 0.6729577 -0.87248782
6 2016-01-14 20:00:00 66 3.5198741 0.97917102
7 2016-01-15 20:00:00 10 2.0895953 0.04890541
8 2016-01-18 20:00:00 35 3.0646823 0.68311037
9 2016-01-20 20:00:00 1 0.0000000 -1.31018523
10 2016-01-21 20:00:00 304 4.5195550 1.62937200
11 2016-01-25 20:00:00 2 0.6729577 -0.87248782
変換後、データは正規分布データにより近くなりますが、データ ポイントが 1 であると、標準化プロセスが歪められます。したがって、明確な外れ値はまったく検出されません。データの標準化に関するほとんどの記事、ブログ投稿、または同様のメディアでは、これらの極端なケースについては決して言及されていません。
この質問を入力し始めたとき、1 を処理できる他の変換方法があるかどうかを尋ねるつもりでしたが、それは問題ではないことに気付きました。
データセットに同じ値が多数ある場合、どのように処理しますか? 特に、データセットの最小値または最大値のように両極端にある場合。