1. 程式人生 > >快學資料探勘—資料探索—異常值分析

快學資料探勘—資料探索—異常值分析

缺失值分析

缺失值產生的原因

  1. 有些資訊暫時無法獲取,或者獲取資訊的代價太大。
  2. 有些資訊是被遺漏的。可能是因為輸入時認為不重要、忘記填寫或對資料理解錯誤等一些人為因素而遺漏,也可能是由於資料採集裝置的故障、儲存介質的故障、傳輸媒體的故障等非人為原因而丟失。
  3. 屬性值不存在。在某些情況下,缺失值並不意味著資料有錯誤。對一些物件來說某些屬性值是不存在的,如一個未婚者的配偶姓名、一個兒童的固定收入等。

使用描述性統計分析,可以得到含有缺失值的屬性的個數,以及每個屬性的未缺失數、缺失數與缺失率等。

異常值分析

異常可能由於測量、輸入錯誤或系統執行錯誤而造成,也可能是由資料內在特性引起的,或異常行為所導致。異常值分析是檢驗資料是否含有不合理的資料。由於異常產生的機制是不確定的,因此,異常檢測演算法檢測出的“異常”是否真正地對應為實際的異常行為,不是由異常檢測演算法來說明、解釋的,只能由領域專家來解釋。

異常值分析方法

  • 基於統計的方法
  • 基於距離的方法
  • 基於密度的方法
  • 基於聚類的方法
  • 基於分類的方法
  • 基於深度的方法
  • 基於小波變換的方法
  • 基於圖的方法
  • 基於模式的方法
  • 基於神經網路的方法

基於統計的方法

  • 描述性統計分析
  • Z得分
  • 箱形圖分析

本文只檢測缺失值,並使用箱型圖檢測異常值

資料集

日期 銷量
2015/3/1 51
2015/2/28 2618.2
2015/2/27 2608.4
2015/2/26 2651.9
2015/2/25 3442.1
2015/2/24 3393.1
2015/2/23 3136.6
2015/2/22 3744.1
2015/2/21 6607.4
2015/2/20 4060.3
2015/2/19 3614.7
2015/2/18 3295.5

...

缺失值分析

我們使用SPSS進行缺失值分析,設定如下

img

img

img

img

缺失值分析結果

img

img

結論分析

1. 日期沒有缺失值2. 銷量存在一個缺失值,對應的日誌為2015-02-143. 銷量的缺失率:0.5%

缺失值替換

img

箱型圖分析

img

img

img

img

img

箱型圖分析結果

1. 箱型圖超過3倍IQR的一共5個值,分別是 22, 51, 60 和 6607.40, 9106.442. 根據具體業務我們把日銷量在400以下或5000以上設定為異常資料

Python程式

#coding: utf-8

import matplotlib.pyplot as plt
from numpy import nan as NA
import pandas as pd

# 讀取資料來源
xlsFilename = "catering_sale.xls"
df = pd.read_excel(xlsFilename)

########################################################
# 缺失值
# 獲得缺失值的個數
missingNumCountDf = df.isnull().sum()
print("\n缺失值個數")
print(missingNumCountDf)

# 獲得缺失率
missingPercentDf = 100 * (missingNumCountDf / df.count())
print("\n缺失率")
print(missingPercentDf)

# 獲得缺失記錄
missingDf = df[df.iloc[:,1].isnull()]
print("\n缺失記錄")
print(missingDf)

# 過濾掉缺失值
df2 = df.dropna()

# 顯示箱圖
plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號
#bp = df2.boxplot()
bp = plt.boxplot(df2.values[:,1], patch_artist=True)

fliers = bp['fliers']
for fly in fliers:
    data = fly.get_data()
    for (x,y) in fly.get_xydata():
        plt.text(x, y, "%.2f" % y, verticalalignment="top", horizontalalignment='right')
    
    print("\n異常值")
    print(data[1])

plt.show()


缺失值個數
日期0
銷量1
dtype: int6488888888888888888888

缺失率
日期0.0
銷量0.5
dtype: float64
![img](http://)
缺失記錄
   日期  銷量
14 2015-02-14 NaN

異常值
[51.0 865.0 22.0 60.0 6607.4 4060.3 9106.44 4065.2]

img