当我们在使用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中寻找数据异常值的三种方法。对于数据分析工作人员来说,及时发现并处理异常值是非常关键的。