在做归一化时,往往需要过滤掉异常值,来消除异常值对归一化的影响,接下来我们看看异常值的定义,以及如何处理异常值。
四分位数(quartile)是指在统计学中把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值。四分位数也被称为四分位点,它是将全部数据分成相等的四部分,其中每部分包括 25%的数据,处在各分位点的数值就是四分位数。四分位数有三个,第一个四分位数是下四分位数,第二个四分位数就是中位数,第三个四分位数称为上四分位数,分别用 Q1、Q2、Q3表示
四分位距IQR:是Q3-Q1,也就是说上下四分位数的差值。
上下限:上下限并不是整个数据样本的最大值和最小值,而是上限 = Q3+1.5IQR和下限 = Q1-1.5IQR ,在上下限这里分别划出两条线段作为异常值的分界点。
那么在箱线图中,上下限之间就是数据样本的正常分布区间,超出上下限就定义为异常值。而异常值又可以细分为温和异常值和极端异常值。
温和异常值: 介于Q3+1.5IQR与Q3+3IQR之间,或Q1-3IQR 与Q1-1.5IQR之间的异常点。
极端异常值:超出Q3+3IQR或Q1-3IQR之外的异常点。
R语言过滤极端异常值
将极端异常值替换为Q3+3IQR或Q1-3IQR
# 加载包
library(tidyverse)
# 自定义函数,传入数据列,返回经过处理的数据列(将极端异常值替换为Q3+3IQR或Q1-3IQR)
IQRFilter = function(x){
myQuart =quantile(x,na.rm=T) # 找出数据列的Q123分位数
IQR = myQuart[4] - myQuart[2] # IQR = Q3-Q1
outliers_top = myQuart[4] + 3 * IQR # 计算上方的极端异常值 Q3+3IQR
outliers_bottom = myQuart[2] - 3 * IQR # 计算下方的极端异常值 Q1-3IQR
x[x>outliers_top] = outliers_top # 将数据中大于Q3+3IQR的数替为Q3+3IQR
x[x<outliers_bottom] = outliers_bottom # 将数据中小于Q1-3IQR的数替为Q1-3IQR
return(x)
}
# 将数据框中的数字类型的数据一列一列的传入自定义函数IQRFilter
iris %>%
mutate(across(where(is.numeric),IQRFilter))