異常值處理

'''
【課程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()
# 圖表表達

  輸出:dom

均值爲: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()
# 圖表表達

  輸出:spa

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條

相關文章
相關標籤/搜索