Python中寻找数据异常值的3种方法

  • Post category:Python

当我们在使用Python进行数据分析时,可能会遇到一些异常或者错误的数据。这些异常值可能会导致我们的分析结果出现偏差或者错误。因此,对于数据异常值的处理是数据分析工作中非常重要的一步。本文将介绍三种寻找Python中数据异常值的方法。

方法1:使用箱线图技术

使用箱线图来检测数据中的异常值。使用如下代码绘制箱线图:

# 载入绘图包
import matplotlib.pyplot as plt

# 进行数据可视化
plt.boxplot(x)
plt.show()

其中,x为需要进行分析的数据。如果数据中存在异常值,那么箱线图中的点将会出现在箱子之外。

示例1:

import matplotlib.pyplot as plt
import numpy as np

# 创建一个含有异常值的数组
np.random.seed(0)
x = np.random.normal(0, 1, 100)
x[98:] = 100

# 绘制箱线图进行异常值检测
plt.boxplot(x)
plt.show()

上述代码中,我们创建了一个长度为100的数组x,其中有两个数值是异常值。运行代码后,我们会发现在箱线图中有两个点出现在箱子之外,这就表示数据中存在异常值。

示例2:

我们可以使用鸢尾花数据集(Iris)进行异常值检测。首先,我们需要加载数据集:

from sklearn.datasets import load_iris
import pandas as pd

# 加载Iris数据集
iris = load_iris()

# 将数据集转为DataFrame格式
iris_df = pd.DataFrame(iris['data'], columns=iris['feature_names'])

接着,我们可以绘制箱线图来检测是否存在异常值:

# 针对花萼长度进行异常值检测
plt.boxplot(iris_df['sepal length (cm)'])
plt.show()

运行上述代码后,我们可以发现箱线图中并没有任何点出现在箱子之外,因此花萼长度这一特征在Iris数据集中不存在异常值。

方法2:使用3σ原则

使用3σ原则来检测数据中的异常值。3σ原则又称为3倍标准差原则,它认为在正态分布的情况下,大约有99.7%的数据位于±3σ之间,而剩下的0.3%的数据则视为异常值。

下面是使用3σ原则来检测数据中的异常值的示例代码:

# 载入数据分析包
import numpy as np

# 创建一个含有异常值的数组
np.random.seed(0)
x = np.random.normal(0, 1, 100)
x[98:] = 100

# 计算均值和标准差
mean = np.mean(x)
std = np.std(x)

# 计算上下阈值
up_threshold = mean + 3*std
down_threshold = mean - 3*std

# 输出异常值
for i in x:
    if (i > up_threshold) | (i < down_threshold):
        print(i)

运行上述代码后,我们可以发现在数据中存在两个异常值。

方法3:使用聚类算法

使用聚类算法来检测数据中的异常值。常用的聚类算法包括K-means、DBSCAN、LOF等。聚类算法可以将数据点分为不同的簇,如果某个数据点被分到离其他点很远的簇中,则可以将其视为异常值。

下面是使用DBSCAN算法来检测数据中的异常值的示例代码:

# 载入聚类算法包
from sklearn.cluster import DBSCAN
import numpy as np

# 创建一个示例数据集
x = np.array([[1, 1], [1, 2], [2, 2], [2, 3], [8, 8], [8, 9], [9, 8], [9, 9]])

# 进行异常值检测
dbscan = DBSCAN(eps=2, min_samples=2)
dbscan.fit(x)
labels = dbscan.labels_
core_samples_mask = np.zeros_like(labels, dtype=bool)
core_samples_mask[dbscan.core_sample_indices_] = True
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
unique_labels = set(labels)
colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))]
for k, col in zip(unique_labels, colors):
    if k == -1:
        col = [0, 0, 0, 1]
    class_member_mask = (labels == k)
    xy = x[class_member_mask & core_samples_mask]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col), markeredgecolor='k',
             markersize=6)
    xy = x[class_member_mask & ~core_samples_mask]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col), markeredgecolor='k',
             markersize=3)
plt.title('number of clusters: %d' % n_clusters_)
plt.show()

运行上述代码后,我们可以发现在数据中存在一个离其他点很远的点(图中黑色点),这可以被视为一个异常值。

综上所述,以上是Python中寻找数据异常值的三种方法。对于数据分析工作人员来说,及时发现并处理异常值是非常关键的。