異常資料分析與處理
一.分析
異常值分析是檢驗資料是否有錄入錯誤以及含有不合常理的資料。忽視異常值的存在是十分危險的,不加剔除地把異常值包括進資料的計算分析過程中,會給結果帶來不良影響;重視異常值的出現,分析其產生的原因,常常成為發現問題改進決策的契機。
異常值是指樣本中的個別值,其數值明顯偏移其餘的觀測值。異常值也成為離群點,異常值的分析也稱為離群點分析。
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