Apache Sparkで外れ値を除去する方法
コラビットの川原です。
本日はApache Sparkで利用できる外れ値を除去するテクニックを紹介します。
Tukey法による外れ値除去
第一分位点および第三分位点からIQR(四分位範囲)の1.5倍離れた値を除去する方法です。
あまり統計に詳しくない人にも説明がしやすく、実装も簡単なので活用しやすいです。
def rejectOutliers(colName: String, df: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row]) = {
val quantiles = df.stat.approxQuantile(colName, Array(0.25, 0.5, 0.75), 0.0)
val q1 = quantiles(0)
val median = quantiles(1)
val q3 = quantiles(2)
val iqr = q3 - q1
val lowerRange = q1 - 1.5 * iqr
val upperRange = q3 + 1.5 * iqr
println(s"* $colName median: $median q1: $q1 q3: $q3 lowerRange: $lowerRange upperRange: $upperRange")
df.filter(s"$colName >= $lowerRange and $colName <= $upperRange")
}
下記のように実行します
// 適当なcase classを定義します
case class Record(value: Int)
// 検証用の適当なdfを作成します
val df = spark.createDataFrame(Seq(1,1,1,1,1,1,1,1,1,1,1,1,100,101).map(Record(_)))
// 100と101が除かれています。
rejectOutliers("value", df).show
参考URL
https://bellcurve.jp/statistics/blog/14292.html
http://blog.madhukaraphatak.com/statistical-data-exploration-spark-part-3/
最後に
コラビットは現在エンジニアを募集しています!
- webサービスを作りたい!
- AIを作りたい、学びたい!
- 未経験だけどモノづくりが大好き!プログラミングを仕事にしたい!
な方は当HPからぜひお問い合わせください!お待ちしています。