python异常值处理代码_python —— 异常值处理

#异常值是指样本中的个别值,其数值明显偏离其余的观测值。

#异常值也称离群点,异常值的分析也称为离群点的分析

#异常值分析 → 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

u = data.mean() # 计算均值

std = data.std() # 计算标准差

stats.kstest(data, 'norm', (u, std))

print('均值为:%.3f,标准差为:%.3f' % (u,std))

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)

# 绘制数据密度曲线

error = data[np.abs(data - u) > 3*std]

data_c = data[np.abs(data - u) <= 3*std]

print('异常值共%i条' % len(error))

# 筛选出异常值error、剔除异常值之后的数据data_c

ax2 = fig.add_subplot(2,1,2)

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()

# 图表表达

8e6d81c839e8

image.png

# (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 = '样本数据')

# 箱型图看数据分布情况

# 以内限为界

8e6d81c839e8

image.png

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))

[output]:

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

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()

# 图表表达

8e6d81c839e8

image.png