下面是详细讲解使用Python检测和删除异常值的步骤。
首先,导入必要的库
使用Python处理异常值,需要导入以下库:
import numpy as np
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
numpy
:用于矩阵运算和统计计算。pandas
:用于数据处理和数据分析。scipy.stats
:用于统计学处理。matplotlib.pyplot
:用于数据可视化。
1. 数据准备
我们需要准备一个数据集,用于展示异常值检测和处理的过程。这里我们使用Pandas自带的一个数据集iris。
data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None)
data.columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species']
使用pd.read_csv()
读取iris数据集,并将列命名。这个数据集有五列,分别是花萼长度、花萼宽度、花瓣长度、花瓣宽度和该行数据表示的鸢尾花的品种。
2. 检测异常值
2.1 箱线图检测异常值
箱线图是数据处理中常用的一种图形展示方式,箱线图中箱子的长度表示 Quartile Range,箱子端点的延长线表示最大值和最小值,箱子中间的线表示中位数。箱子内的点表示数据中的观测值。
使用Matplotlib的boxplot()
函数画出箱线图:
fig, ax = plt.subplots(figsize=(10, 6))
ax.boxplot([data['sepal_length'], data['sepal_width'], data['petal_length'], data['petal_width']], labels=['sepal_length', 'sepal_width', 'petal_length', 'petal_width'])
plt.show()
从上面的箱线图中可以看出,花萼宽度(sepal_width)这一列有一些异常值,它们的值比其他数据点远离中位数。
2.2 3 Sigma检测异常值
3 Sigma检测异常值方法是基于正态分布假设的,首先计算数据的均值和标准差,然后通过随机变量的概率密度函数计算出3 Sigma范围,此范围内的数据被认为是常规观测值,超出此范围的数据则被认为是异常值。
sepal_width_mean, sepal_width_std = data['sepal_width'].mean(), data['sepal_width'].std()
cut_off = sepal_width_std * 3
lower, upper = sepal_width_mean - cut_off, sepal_width_mean + cut_off
sepal_width_outliers = [x for x in data['sepal_width'] if x < lower or x > upper]
print('异常值数量:{}'.format(len(sepal_width_outliers)))
执行上述代码后会得到花萼宽度列的异常值数量,这里输出结果为3,即花萼宽度列的前三个数据点是异常值。
3. 处理异常值
如果检测到了异常值,需要处理这些值。处理异常值的方法通常有以下几种:
3.1 删除异常值
将被认为是异常值的数据点从数据集中删除。
data = data[data['sepal_width'] > lower]
data = data[data['sepal_width'] < upper]
3.2 用均值或中位数替换异常值
用整个样本的均值或中位数来替换异常值。
# 使用改进的3 Sigma法替换异常值
data.loc[data['sepal_width'] < lower, 'sepal_width'] = sepal_width_mean
data.loc[data['sepal_width'] > upper, 'sepal_width'] = sepal_width_mean
将小于下限值和大于上限值的数据点用均值代替。
总结
异常值会对数据的准确性和稳定性造成影响,因此在数据分析过程中需要检测和处理异常值。在Python中,我们可以使用箱线图和3 Sigma方法来检测异常值,并用删除或替换等方法处理这些异常值。最后,数据的准备和质量保证是数据分析过程中的关键步骤之一。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用Python检测和删除异常值 - Python技术站