目录
- 中位数绝对偏差(MAD)方法
- 四分位距(IQR)方法
- 3 Sigma 方法
前言
异常值通常是由于测量误差、数据输入错误或数据中的特殊情况导致的。在很多情况下,异常值可能会对数据分析结果产生显著影响,因此在进行数据分析之前,识别和处理异常值是至关重要的。
作用
异常值可能是离群点,即与整体数据情况偏离很大的数据点(常见的3σ准则),也可能是超过某个不合理范围的数据点,在分析中应该首先排除掉异常值,异常值检测逻辑是对变量的数据集(类似于列)按照设置的或值进行判定,筛选出落在异常值检测范围内的数据,并对异常值进行置空或者是填补为其它有效值。
三种常用的异常值处理方法分别是中位数绝对偏差(MAD)方法、四分位距(IQR)方法和 3 Sigma 方法。这些方法各有特点,适用于不同的数据集和应用场景。
中位数绝对偏差(MAD)方法
:这种方法通过计算每个数据点与中位数之间的绝对偏差
来识别异常值。由于中位数比平均数对极端值更为稳健,因此这种方法对极端值的敏感性较低,适用于小数据集和有明显离群值的数据。四分位距(IQR)方法
:这种方法通过计算数据集的四分位距
来识别异常值。四分位距是上四分位数与下四分位数之间的差值,这种方法对偏态分布的数据处理较好,不受极端值的影响。3 Sigma 方法
:这种方法基于正态分布
的性质,适用于连续变量且符合正态分布假设的数据。根据正态分布的特点,数据点落在均值加减三倍标准差范围之外的概率非常低,因此超出这个范围的数据点可以被视为异常值。
异常值处理方法的具体实现及其比较
中位数绝对偏差(MAD)方法
在统计学中,中位数绝对偏差(MAD)是衡量统计离散度的一种方法,它是对定量数据单变量样本变异性的一个稳健度量。对于 MAD,少量的异常值不会影响实验的结果。
计算每列的中位数和 MAD
def mad(arr):
median = np.median(arr)
return np.median(np.abs(arr - median))
medians = df.median()
mads = df.apply(mad)
使用 MAD 方法识别异常值
公式:
M
A
D
=
M
e
d
i
a
n
(
∣
x
i
−
x
m
∣
)
MAD=Median(∣x_i−x_m∣)
MAD=Median(∣xi−xm∣)
其中,
x
i
x_i
xi表示第
i
i
i个数据点,
x
m
x_m
xm 表示中位数
为了识别异常值,我们需要设置一个阈值(Threshold):
T
h
r
e
s
h
o
l
d
=
M
e
d
i
a
n
+
k
×
M
A
D
Threshold=Median+k \times MAD
Threshold=Median+k×MAD
其中,
k
k
k 是一个经验常数,通常取 2 或 3
threshold = 3 # 常用的异常值阈值
outliers_mad = (np.abs(df - medians) / mads) > threshold
用各列的中位数替换异常值
df_mad = df.mask(outliers_mad, medians, axis=1)
四分位距(IQR)方法
四分位距 (InterQuartile Range, IQR) 就是上四分位与下四分位的差值。我们通过 IQR 的 1.5 倍为标准,规定异常值。
计算 IQR 并识别异常值
公式:
I
Q
R
=
Q
3
−
Q
1
IQR=Q3−Q1
IQR=Q3−Q1
其中,
Q
1
Q_1
Q1是第 25 百分位数,
Q
3
Q_3
Q3 是第 75 百分位数。
为了识别异常值,我们需要设置两个阈值(Threshold):
T
h
r
e
s
h
o
l
d
l
o
w
=
Q
1
−
1.5
×
I
Q
R
Threshold_{low}=Q1−1.5×IQR
Thresholdlow=Q1−1.5×IQR
T
h
r
e
s
h
o
l
d
h
i
g
h
=
Q
3
+
1.5
×
I
Q
R
Threshold_{high}=Q3+1.5×IQR
Thresholdhigh=Q3+1.5×IQR
Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1
outliers_iqr = (df < (Q1 - 1.5 * IQR)) | (df > (Q3 + 1.5 * IQR))
用各列的中位数替换异常值
df_iqr = df.mask(outliers_iqr, medians, axis=1)
3 Sigma 方法
3 Sigma 准则基于正态分布的性质,通常适用于连续变量且符合正态分布假设的数据。在正态分布的假设下,如果一个数据点的值超过了均值加减三倍标准差的范围,即超出 μ ± 3 σ μ±3σ μ±3σ,那么可以将该数据点视为异常值或者离群点。
计算每列的均值和标准差
means = df.mean()
std_devs = df.std()
使用 3 Sigma 法识别异常值
公式: T h r e s h o l d l o w = μ − 3 σ Threshold_{low}=μ−3σ Thresholdlow=μ−3σ
T
h
r
e
s
h
o
l
d
h
i
g
h
=
μ
+
3
σ
Threshold_{high}=μ+3σ
Thresholdhigh=μ+3σ
其中,
μ
μ
μ 为均值,
σ
σ
σ 为标准差。
threshold = 3
outliers_3sigma = (np.abs(df - means) > threshold * std_devs)
用各列的中位数替换异常值
df_3sigma = df.mask(outliers_3sigma, medians, axis=1)
小结
通过对比 MAD、IQR 和 3 Sigma 三种方法处理后的数据,我们可以发现各方法在识别和处理异常值时有不同的效果和适用场景。
- MAD 方法:对极端值的敏感性较低,适用于小数据集和有明显离群值的数据。
- IQR 方法:对偏态分布数据处理较好,不受极端值影响。
- 3 Sigma 方法:适用于正态分布数据的异常值处理,适用于大数据集。