Seaborn 箱线图中如何确定异常值?


什么是异常值?

异常值是指数据集中的数据点或观测值,它们远离其他点。异常值可能是由测量误差、数据输入误差或实验误差等原因造成的。异常值会歪曲数据集,从而影响统计分析,并可能增加数据集的标准差,进一步影响模型预测。

异常值可能是有效的数据点,也可能是噪声。

为了更好地理解,让我们来看一个示例场景。假设您正在收集学生身高数据(年龄在 9 到 12 岁之间)。大多数学生身高都在 4 英尺左右。但有一些学生输入了错误的身高,例如 7 英尺。这个不寻常且不正确的数值就是异常值,因为它与其他数值有显著差异。简单来说,异常值就像“异类”,与组中其他成员不太相符。

为什么要移除异常值?

移除异常值是数据预处理的重要步骤。如果数据集包含异常值,如果不移除并在该数据集上训练机器学习模型,则模型也会尝试覆盖异常值点,这会导致预测模型的泛化能力差。

在这种情况下,在覆盖异常值时,模型变得复杂,从而导致过拟合并在新数据集上产生错误预测。移除异常值最简单的方法之一是使用箱线图,以下部分讨论了如何借助箱线图识别异常值。

箱线图的统计分析

箱线图也称为盒须图,它是数据集分布的图形表示。它可以帮助我们解释数据点是分散还是集中。它还解释了数据集的偏度。

使用箱线图,我们可以了解数据集的最小值、最大值和四分位数范围(Q1、Q2、Q3)的统计信息。

其中 -

  • 最小值 - 最小值确定数据集中的最小数据点。

  • 最大值 - 最大值确定数据集中的最大数据点。

  • 第一四分位数 (Q1) - 当数据点分成两半时,Q1 是数据点下半部分的中位数。它是数据点的第 25 个百分位数。

  • 第二四分位数或中位数 (Q2) - Q2 是所有数据点的中位数。

  • 第三四分位数 (Q3) - 当数据点分成两半时,Q3 是数据点上半部分的中位数。它是数据点的第 75 个百分位数。

在任何数据集中,大于 Q3+1.5IQR 或小于 Q1-1.5IQR 的记录都被认为是异常值。

盒子越长,数据越分散,盒子越短,数据越集中。

使用 Seaborn 检测异常值

Seaborn 是一个基于 matplotlib 的数据可视化库,它可以创建复杂的可视化绘图,并提供默认调色板,从而生成美观的绘图。

我们可以使用 Seaborn 中的 boxplot() 函数创建箱线图。以下是 Seaborn 中 boxplot() 函数的语法:

seaborn.boxplot(x=, y=, heu=, data=)

其中,

  • x、y、hue - 数据集中特征的名称。

  • data - 用于绘图的数据集。

示例

在以下示例中,我们将使用箱线图绘制泰坦尼克号数据集,并尝试确定其中的异常值。

在这个泰坦尼克号数据集中,我们有 891 条记录和 15 个特征,描述了泰坦尼克号上乘客的生存状况。

以下是数据集中的前五行。

当我们使用“sns.boxplot()”为“age”特征绘制箱线图时,高于最大值和低于最小值的数据点被认为是异常值。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

dataset= sns.load_dataset('titanic')
sns.boxplot(y=dataset['age'])
plt.show()

输出

执行上述程序后,您将获得以下输出:

考虑到输出,可以看出,Age>65 是异常值点。

示例

由于我们在上述示例中使用了单个数值特征,因此我们在此考虑了 x 轴上的一个分类特征(alive)和 y 轴上的一个数值特征(age)。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

dataset= sns.load_dataset('titanic')
sns.boxplot(data=dataset, x="alive", y="age")
plt.show()

输出

执行上述程序后,您将获得以下输出:

示例

在这里,我们考虑了一个分类特征(class)并确定了相对于年龄特征的异常值,将图与另一个分类特征(sex)进行比较。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

dataset= sns.load_dataset('titanic')
sns.boxplot(x="class",y="age",hue="sex",data=dataset)
plt.show()

输出

执行上述程序后,您将获得以下输出:

删除异常值

删除异常值的一种方法是识别最小值和最大值,并丢弃超出此范围的数据点(将其设为空值并删除它们)。

示例

在以下示例中,我们选择年龄特征并移除识别的异常值:

  • 我们首先必须计算 Q1 和 Q3 值,然后计算四分位数范围 (Q3-Q1)。

  • 计算完四分位数范围后,计算 Q3+1.5IQR 和 Q1-1.5IQR 的值,如指定的那样,如果数据点大于 Q3+1.5IQR 且小于 Q1-1.5IQR,则认为这些数据点是异常值。

  • 最后,将这些异常值替换为空值,然后使用 .dropna 删除这些空值。再次绘制箱线图检查是否已移除异常值。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

dataset= sns.load_dataset('titanic')
for i in ['age']:
   q75,q25=np.percentile(dataset.loc[:,i],[75,25])
   intr_qr= q75-q25
   max = q75+(1.5*intr_qr)
   min = q25-(1.5*intr_qr)
   dataset.loc[dataset[i]<min,i]=np.nan
   dataset.loc[dataset[i]>max,i]=np.nan  
dataset=dataset.dropna(axis=0)
sns.boxplot(y=dataset['age'])
plt.show()

输出

执行上述程序后,您将获得以下输出:

更新于: 2024年4月23日

924 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告