2.9 清理异常值

2.9 清理异常值

1、如何清理来自真实世界的数据集合,并且在可视化之前对数据进行处理呢?

2、首先我们需要了解给定的数据,需要知道异常(outlier)是什么,并且要明白展示什么数据

3、在统计学上,中位数绝对偏差(Median absolute deviation,MAD)是用来描述单变量(包含一个变量)样本在定量数据中可变性的一种标准。它常用来度量统计分布,因为它会落在一组稳健统计数据中,因此对异常值有抵抗能力

4、那如何用MAD来检测数据中的异常值。下面是操作步骤

(1)生成 0~1 之间的随机数据
(2)加入一些异常值
(3)用is_outlier()方法检测异常值
(4)绘制出两个数据集合(x和filtered)的图表,观察它们的区别

5、代码实现如下

import numpy as np
import matplotlib.pyplot as plt

"""
清理异常值
"""


def is_outlier(points, threshold=3.5):
    """
    如果点是离群值,则返回带True的布尔数组;否则返回带False的布尔数组
    :param points:
    :param threshold:
    :return:
    """
    # 变换为向量
    if len(points.shape) == 1:
        points = points[:, None]
    # 计算中值
    median = np.median(points, axis=0)
    # 沿轴计算微分和
    diff = np.sum((points - median) ** 2, axis=1)
    diff = np.sqrt(diff)
    # 计算MDA()中位数绝对偏差
    med_abs_deviation = np.median(diff)
    # 计算修正的Z分数
    modified_z_score = 0.6745 * diff / med_abs_deviation
    # 为每一个异常值返回一个掩码
    return modified_z_score > threshold


# 随机数据
x = np.random.random(100)

# 直方图桶
buckets = 50

# 添加一些异常值
x = np.r_[x, -49, 95, 100, -100]

# 保持内部数据点;
# 在NumPy中,“~”操作符被重载为一个逻辑操作符,作用在布尔数组上时为取非操作
filtered = x[~is_outlier(x)]

# 绘制直方图
plt.figure()
# 第一个直方图除了一个最大的异常值之外什么都没有
plt.subplot(211)
plt.hist(x, buckets)
plt.xlabel('Raw')
# 第二个直方图因为剔除掉了异常值,显示了多样化的数据
plt.subplot(212)
plt.hist(filtered, buckets)
plt.xlabel('Cleaned')

plt.show()

6、运行测试
2.9 清理异常值_第1张图片
7、简单说明

第一幅图除了一个最大的异常值之外什么都没有,第二幅图中因为剔除掉了异常值,显示了多样化的数据。

你可能感兴趣的:(Python数据可视化,numpy,matplotlib,python)