【数据分析&数据挖掘】异常值的判断与去除——3σ & 箱线图分析

Norsaa 2019-12-29

import pandas as pd

# 异常值 ——远离正常值范围的错误值
# 异常值 ——删掉

# 异常值判断 ——3σ 箱线图分析

# 3σ 接住标准正态部分得到的规律——99.73%都在(μ-3α,μ+3α)之间,超过这个范围的数据认为是异常的

def three_sigma(data):
    """
    进行3sigma异常值剔除
    :param data: 原数据——series
    :return: bool数组
    """

    # 上限
    up = data.mean() + 3 * data.std()
    # 下线
    low = data.mean() - 3 * data.std()

    # 在上限与下限之间的数据是正常的
    bool_index = (data < up) & (data > low)

    return bool_index


def box_analysis(data):
    """
    箱线图分析去除异常值
    :param data: 原数据——series
    :return: bool数组
    """
    # 上四分位数
    qu = data.quantile(q=0.75)
    # 下四分位数
    ql = data.quantile(q=0.25)
    # 计算四分位间距
    iqr = qu - ql

    # 上限
    up = qu + 1.5 * iqr
    # 下限
    low = ql - 1.5 * iqr

    bool_index = (data < up) & (data > low)

    return bool_index


# 验证——加载detail
detail = pd.read_excel("../day05/meal_order_detail.xlsx")
print("detail的列索引: \n", detail.columns)
print("detail的形状: \n", detail.shape)

# 对amounts列进行异常值处理
bool_index = three_sigma(detail.loc[:, "amounts"])
bool_index = box_analysis(detail.loc[:, "amounts"])
print("bool_index: \n", bool_index)

# 获取异常值处理之后的结果
detail = detail.loc[bool_index, :]
print("异常值处理之后的结果: \n", detail.shape)

相关推荐