熱線電話:13121318867

登錄
首頁精彩閱讀什么是臟數據?怎樣用箱型圖分析異常值?終于有人講明白了
什么是臟數據?怎樣用箱型圖分析異常值?終于有人講明白了
2020-07-13
收藏

作者:張良均 譚立云 劉名軍 江建明

來源:大數據DT(ID:hzdashuju)

內容摘編自《Python數據分析與挖掘實戰》(第2版)

導讀:數據質量分析是數據挖掘中數據準備過程的重要一環,是數據預處理的前提,也是數據挖掘分析結論有效性和準確性的基礎。沒有可信的數據,數據挖掘構建的模型將是空中樓閣。

數據質量分析的主要任務是檢查原始數據中是否存在臟數據。臟數據一般是指不符合要求以及不能直接進行相應分析的數據。在常見的數據挖掘工作中,臟數據包括:缺失值、異常值、不一致的值、重復數據及含有特殊符號(如#、¥、*)的數據。

本文將主要對數據中的缺失值、異常值和一致性進行分析。

01 缺失值分析

數據的缺失主要包括記錄的缺失和記錄中某個字段信息的缺失,兩者都會造成分析結果不準確。下面從缺失值產生的原因及影響等方面展開分析。

1. 缺失值產生的原因

缺失值產生的原因主要有以下3點:

有些信息暫時無法獲取,或者獲取信息的代價太大。

有些信息是被遺漏的??赡苁且驗檩斎霑r認為該信息不重要、忘記填寫或對數據理解錯誤等一些人為因素而遺漏,也可能是由于數據采集設備故障、存儲介質故障、傳輸媒體故障等非人為原因而丟失。

屬性值不存在。在某些情況下,缺失值并不意味著數據有錯誤。對一些對象來說某些屬性值是不存在的,如一個未婚者的配偶姓名、一個兒童的固定收入等。

2. 缺失值的影響

缺失值會產生以下的影響:

數據挖掘建模將丟失大量的有用信息。

數據挖掘模型所表現出的不確定性更加顯著,模型中蘊含的規律更難把握。

包含空值的數據會使建模過程陷入混亂,導致不可靠的輸出。

3. 缺失值的分析

對缺失值的分析主要從以下兩方面進行:

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

對于缺失值的處理,從總體上來說分為刪除存在缺失值的記錄、對可能值進行插補和不處理3種情況。

02 異常值分析

異常值分析是檢驗數據是否有錄入錯誤,是否含有不合常理的數據。忽視異常值的存在是十分危險的,不加剔除地將異常值放入數據的計算分析過程中,會對結果造成不良影響;重視異常值的出現,分析其產生的原因,常常成為發現問題進而改進決策的契機。

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

1. 簡單統計量分析

在進行異常值分析時,可以先對變量做一個描述性統計,進而查看哪些數據是不合理的。最常用的統計量是最大值和最小值,用來判斷這個變量的取值是否超出了合理范圍。如客戶年齡的最大值為199歲,則判斷該變量的取值存在異常。

2. 3σ原則

如果數據服從正態分布,在3σ原則下,異常值被定義為一組測定值中與平均值的偏差超過3倍標準差的值。在正態分布的假設下,距離平均值3σ之外的值出現的概率為P(|x-μ|>3σ)≤0.003.屬于極個別的小概率事件。

如果數據不服從正態分布,也可以用遠離平均值的標準差倍數來描述。

3. 箱型圖分析

箱型圖提供了識別異常值的一個標準:異常值通常被定義為小于QL -1.5IQR或大于QU +1.5IQR的值。

QL稱為下四分位數,表示全部觀察值中有四分之一的數據取值比它小;

QU稱為上四分位數,表示全部觀察值中有四分之一的數據取值比它大;

IQR稱為四分位數間距,是上四分位數QU與下四分位數QL之差,其間包含了全部觀察值的一半。

箱型圖依據實際數據繪制,對數據沒有任何限制性要求,如服從某種特定的分布形式,它只是真實直觀地表現數據分布的本來面貌;另一方面,箱型圖判斷異常值的標準以四分位數和四分位距為基礎,四分位數具有一定的魯棒性:多達25%的數據可以變得任意遠而不會嚴重擾動四分位數,所以異常值不能對這個標準施加影響。

由此可見,箱型圖識別異常值的結果比較客觀,在識別異常值方面有一定的優越性,如圖3-1所示。

▲圖3-1 箱型圖檢測異常值

餐飲系統中的銷量數據可能出現缺失值和異常值,例如表3-1中數據所示。

▲表3-1 餐飲日銷額數據示例

分析餐飲系統日銷額數據可以發現,其中有部分數據是缺失的,但是如果數據記錄和屬性較多,使用人工分辨的方法就不切實際,所以這里需要編寫程序來檢測出含有缺失值的記錄和屬性以及缺失率個數和缺失率等。

在Python的pandas庫中,只需要讀入數據,然后使用describe()方法即可查看數據的基本情況,如代碼清單3-1所示。

代碼清單3-1 使用describe()方法查看數據的基本情況

import pandas as pd

catering_sale = '../data/catering_sale.xls'  # 餐飲數據

data = pd.read_excel(catering_sale, index_col='日期')

# 讀取數據,指定“日期”列為索引列

print(data.describe())

代碼清單3-1的運行結果如下:

本文摘編自《Python數據分析與挖掘實戰》(第2版)           銷量

count   200.000000

mean   2755.214700

std     751.029772

min      22.000000

25%    2451.975000

50%    2655.850000

75%    3026.125000

max    9106.440000

其中count是非空值數,通過len(data)可以知道數據記錄為201條,因此缺失值數為1.另外,提供的基本參數還有平均值(mean)、標準差(std)、最小值(min)、最大值(max)以及1/4、1/2、3/4分位數(25%、50%、75%)。

更直觀地展示這些數據并且可以檢測異常值的方法是使用箱型圖。其Python檢測代碼如代碼清單3-2所示。

代碼清單3-2 餐飲日銷額數據異常值檢測

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()  # 展示箱型圖

運行代碼清單3-2.可以得到圖3-2所示的箱型圖。

▲圖3-2 異常值檢測箱型圖

從圖3-2可以看出,箱型圖中超過上下界的7個日銷售額數據可能為異常值。結合具體業務可以把865.0、4060.3、4065.2歸為正常值,將22.0、51.0、60.0、6607.4、9106.44歸為異常值。最后確定過濾規則為日銷額在400元以下或5000元以上則屬于異常數據,編寫過濾程序,進行后續處理。

03 一致性分析

數據不一致性是指數據的矛盾性、不相容性。直接對不一致的數據進行挖掘,可能會產生與實際相違背的挖掘結果。

數據挖掘過程中,不一致數據的產生主要發生在數據集成的過程中,可能是由于被挖掘數據來自于不同的數據源、對于重復存放的數據未能進行一致性更新造成的。

例如,兩張表中都存儲了用戶的電話號碼,但在用戶的電話號碼發生改變時只更新了一張表中的數據,那么這兩張表中就有了不一致的數據。

本文摘編自《Python數據分析與挖掘實戰》(第2版),經出版方授權發布。

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢