zoukankan      html  css  js  c++  java
  • 异常值处理

    '''
    【课程2.2】  异常值处理
    
    异常值是指样本中的个别值,其数值明显偏离其余的观测值。
    异常值也称离群点,异常值的分析也称为离群点的分析
    
    异常值分析 → 3σ原则 / 箱型图分析
    异常值处理方法 → 删除 / 修正填补
    
    '''
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from scipy import stats
    % matplotlib inline
    # 异常值分析
    # (1)3σ原则:如果数据服从正态分布,异常值被定义为一组测定值中与平均值的偏差超过3倍的值 → p(|x - μ| > 3σ) ≤ 0.003
    
    data = pd.Series(np.random.randn(10000)*100)
    # 创建数据
    
    u = data.mean()  # 计算均值
    std = data.std()  # 计算标准差
    stats.kstest(data, 'norm', (u, std))
    print('均值为:%.3f,标准差为:%.3f' % (u,std))
    print('------')
    # 正态性检验
    
    fig = plt.figure(figsize = (10,6))
    ax1 = fig.add_subplot(2,1,1)
    data.plot(kind = 'kde',grid = True,style = '-k',title = '密度曲线')
    plt.axvline(3*std,hold=None,color='r',linestyle="--",alpha=0.8) 
    plt.axvline(-3*std,hold=None,color='r',linestyle="--",alpha=0.8) 
    # 绘制数据密度曲线
    
    ax2 = fig.add_subplot(2,1,2)
    error = data[np.abs(data - u) > 3*std]
    data_c = data[np.abs(data - u) <= 3*std]
    print('异常值共%i条' % len(error))
    # 筛选出异常值error、剔除异常值之后的数据data_c
    
    plt.scatter(data_c.index,data_c,color = 'k',marker='.',alpha = 0.3)
    plt.scatter(error.index,error,color = 'r',marker='.',alpha = 0.5)
    plt.xlim([-10,10010])
    plt.grid()
    # 图表表达

      输出:

    均值为:0.594,标准差为:100.301
    ------
    异常值共26条

    # 异常值分析
    # (2)箱型图分析
    
    fig = plt.figure(figsize = (10,6))
    ax1 = fig.add_subplot(2,1,1)
    color = dict(boxes='DarkGreen', whiskers='DarkOrange', medians='DarkBlue', caps='Gray')
    data.plot.box(vert=False, grid = True,color = color,ax = ax1,label = '样本数据')
    # 箱型图看数据分布情况
    # 以内限为界
    
    s = data.describe()
    print(s)
    print('------')
    # 基本统计量
    
    q1 = s['25%']
    q3 = s['75%']
    iqr = q3 - q1
    mi = q1 - 1.5*iqr
    ma = q3 + 1.5*iqr
    print('分位差为:%.3f,下限为:%.3f,上限为:%.3f' % (iqr,mi,ma))
    print('------')
    # 计算分位差
    
    ax2 = fig.add_subplot(2,1,2)
    error = data[(data < mi) | (data > ma)]
    data_c = data[(data >= mi) & (data <= ma)]
    print('异常值共%i条' % len(error))
    # 筛选出异常值error、剔除异常值之后的数据data_c
    
    plt.scatter(data_c.index,data_c,color = 'k',marker='.',alpha = 0.3)
    plt.scatter(error.index,error,color = 'r',marker='.',alpha = 0.5)
    plt.xlim([-10,10010])
    plt.grid()
    # 图表表达

      输出:

    count    10000.000000
    mean         0.594413
    std        100.300761
    min       -403.701752
    25%        -67.282512
    50%          0.169174
    75%         68.517439
    max        371.346823
    dtype: float64
    ------
    分位差为:135.800,下限为:-270.982,上限为:272.217
    ------
    异常值共71条

  • 相关阅读:
    2019 牛客多校第五场 B generator 1
    POJ 1797 Heavy Transportation
    POJ 3352 Road Construction
    POJ 2553 The Bottom of a Graph
    POJ 1236 Network of Schools
    POJ 1144 Network
    POJ 3761 Bubble Sort
    2019 牛客多校第三场 B Crazy Binary String
    2019 牛客多校第三场 H Magic Line
    Codeforces Round #592 (Div. 2)
  • 原文地址:https://www.cnblogs.com/654321cc/p/9601974.html
Copyright © 2011-2022 走看看