1. 程式人生 > >異常資料分析與處理

異常資料分析與處理

一.分析

異常值分析是檢驗資料是否有錄入錯誤以及含有不合常理的資料。忽視異常值的存在是十分危險的,不加剔除地把異常值包括進資料的計算分析過程中,會給結果帶來不良影響;重視異常值的出現,分析其產生的原因,常常成為發現問題改進決策的契機。

異常值是指樣本中的個別值,其數值明顯偏移其餘的觀測值。異常值也成為離群點,異常值的分析也稱為離群點分析。

1.簡單統計量分析

可以對變數做一個描述性統計,進而檢視那些資料是不合理的。最常用的統量是最大值和最小值,用來判斷這個變數的取值是否超出了取值範圍。

2 . 3δ原則

經驗法則告訴我們,幾乎所有的資料與平均數之差都在3個標準差之內,所有異常值被定義為一組測定值中與平均值的偏差超過3倍標準差的值(|z-score|>3)。

3.箱線圖分析 

1).箱線圖分析原理

箱型圖可以通過程式設定一個識別異常值的標準,即大於或小於箱型圖設定的上下界的數值則識別為異常值,箱型圖如下圖所示:

                                                                   圖1 

首先我們定義下上四分位和下四分位:上四分位我們設為 U,表示的是所有樣本中只有1/4的數值大於U ,即從大到小排序時U處於25%處;同理,下四分位我們設為 L,表示的是所有樣本中只有1/4的數值小於L,即從大到小排序時L處於75%處。然後我們定義上界和下界:我們設上四分位與下四分位的插值為IQR,即:IQR=U-L上界設為 U+1.5IQR ,下界設為: L - 1.5IQR箱型圖選取異常值比較客觀,在識別異常值方面有一定的優越性。

2).R語言箱線圖分析

 

# 設定工作空間
# 把“資料及程式”資料夾拷貝到F盤下,再用setwd設定工作空間
setwd("F:/資料及程式/chapter3/示例程式")
# 讀入資料
saledata <- read.csv(file = "./data/catering_sale.csv", header = TRUE) 

# 缺失值檢測 並列印結果,由於R把TRUE和FALSE分別當作1、0,可以用sum()和mean()函式來分別獲取缺失樣本數、缺失比例
sum(complete.cases(saledata))
sum(!complete.cases(saledata))
mean(!complete.cases(saledata))
saledata[!complete.cases(saledata), ]

# 異常值檢測箱線圖
sp <- boxplot(saledata$"sale", boxwex = 0.7)
title("銷量異常值檢測箱線圖")
xi <- 1.1
sd.s <- sd(saledata[complete.cases(saledata), ]$"sale")
mn.s <- mean(saledata[complete.cases(saledata), ]$"sale")
points(xi, mn.s, col = "red", pch = 18)
arrows(xi, mn.s - sd.s, xi, mn.s + sd.s, code = 3, col = "pink", angle = 75, length = .1)
text(rep(c(1.05, 1.05, 0.95, 0.95), length = length(sp$out)), 
     labels = sp$out[order(sp$out)], sp$out[order(sp$out)] + 
       rep(c(150, -150, 150, -150), length = length(sp$out)), col = "red")

 

                                                                                                    圖2

3).python箱線圖分析 

import pandas as pd

catering_sale = 'F:/資料及程式/chapter3/示例程式/chapter3/demo/data/catering_sale.xls' #餐飲資料
data = pd.read_excel(catering_sale, index_col = u'日期') #讀取資料,指定“日期”列為索引列

import matplotlib.pyplot as plt #匯入影象庫
plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號

plt.figure() #建立影象
p = data.boxplot(return_type='dict') #畫箱線圖,直接使用DataFrame的方法
x = p['fliers'][0].get_xdata() # 'flies'即為異常值的標籤
y = p['fliers'][0].get_ydata()
y.sort() #從小到大排序,該方法直接改變原物件

#用annotate添加註釋
#其中有些相近的點,註解會出現重疊,難以看清,需要一些技巧來控制。
#以下引數都是經過除錯的,需要具體問題具體除錯。
for i in range(len(x)): 
  if i>0:
    plt.annotate(y[i], xy = (x[i],y[i]), xytext=(x[i]+0.05 -0.8/(y[i]-y[i-1]),y[i]))
  else:
    plt.annotate(y[i], xy = (x[i],y[i]), xytext=(x[i]+0.08,y[i]))

plt.show() #展示箱線圖

二.處理 

在資料預處理時,異常值是否剔除,需要按照實際情況來定,常用處理方法如下:

異常值處理方法 方法描述
刪除含有異常值的記錄          直接將含有異常值的資料刪除(在資料集較小的情況下不適用)
將異常值視為缺失值 然後使用處理缺失值的方法來處理異常值
平均值修正 異常值前後兩條資料取均值
不處理 原資料集不做任何處理來進行資料探勘

 

 

 

 

 

 

 

圖1來源:https://blog.csdn.net/xzfreewind/article/details/77014587