''' 【課程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條