Python數據分析與挖掘進階篇1——異常值分析、一致性分析、數據特徵分析等(附實例!)

閱讀提示

本文將提到Python數據分析與挖掘中的數據探索與數據特徵分析

一、數據探索

​    根據觀測、調查收集到初步的樣本數據集後,接下來要考慮的問題是:樣本數據集的數量和質量是否滿足模型構建的要求?是否出現從未設想過的數據狀態?其中有沒有什麼明顯的規律和趨勢?各因素之間有什麼樣的關聯性?
​    通過檢驗數據集的數據質量、繪製圖表、計算某些特徵量等手段,對樣本數據集的結構和規律進行分析的過程就是數據探索。數據探索有助於選擇合適的數據預處理和建模方法,甚至可以完成一些通常由數據挖掘解決的問題。
​ 後續將從數據質量分析和數據特徵分析兩個角度對數據進行探索。

1、數據質量的分析

​    數據質量分析是數據挖掘中數據準備過程的重要一環,是數據預處理的前提,也是數據挖掘分析結論有效性和準確性的基礎,沒有可信的數據,數據挖掘構建的模型將是空中樓閣。
​    數據質量分析的主要任務是檢查原始數據中是否存在髒數據,髒數據一般是指不符合要求,以及不能直接進行相應分析的數據。在常見的數據挖掘工作中,髒數據包括如下內容:

  • 缺失值
  • 異常值
  • 不一致的值
  • 重複數據以及含有特殊符號(如 #、¥、*)的 數據

在後面我將主要對數據中的缺失值、異常值和一致性進行分析。

產生缺失值的原因:

​ a.有的信息暫時無法獲取,或者獲取信息的代價太大

​ b.有些信息是被遺漏的。可能是因爲輸入時認爲不重要、忘記填寫或對數據理解錯誤等一些人爲因素而遺漏,也可能是由於數據採集設備的故障、存儲介質的故障、傳輸媒體的故障等非人爲原因而丟失。

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

缺失值的影響:

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

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

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

2、異常值的分析

​    異常值是指樣本中的個別值,其數值明顯偏離其餘的觀測值。異常值也稱爲離羣點,異常值的分析也稱爲離羣點分析。

a.簡單統計量分析:

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

b.3σ原則:

​    如果數據服從正態分佈,在3σ原則下,異常值被定義爲一組測定值中與平均值的偏差超過3倍標準差的值。在正態分佈的假設下,距離平均值3σ之外的值出現的概率爲P( |x-μ| >3σ)≤0.003,屬於極個別的小概率事件。如果數據不服從正態分佈,也可以用遠離平均值的多少倍標準差來描述。

c.箱型圖分析

​    箱型圖依據實際數據繪製,沒有對數據作任何限制性要求(如服從某種特定的分佈形式),它只是真實直觀地表現數據分佈i的本來面貌;另一方面,箱型圖判斷異常值的標準以四分位數和四分位距爲礎,四分位數具有一定的魯棒性:多達25%的數據可以變得任意遠而不會很大地擾動四分位數,所以異常值不能對這個標準施加影響。由此可見,箱型圖識別異常值的結果比較客觀,在識別異常值方面有一定的優越性。

Alt

實例:

​    數據來源:C:\Users\lenovo\Desktop\Python數據分析與挖掘\chapter3\demo\data

如需數據集請私聊我

時間 2015/2/13 2015/2/14
銷量額(元) 3036.8

​    分析餐飲系統日銷量額數據可以發現,其中有部分數據是缺失的,但是如果數據記錄和屬性較多,使用人工分辨的方法就不切合實際,所以這裏需要編寫程序來檢測出含有缺失值的記錄和屬性以及缺失率個數和缺失率等。
​    在Python的Pandas庫中,只需要讀入數據,然後使用describe()函數就可以查看數的基本情況。

餐飲銷售額數據異常監測:

   爲了更直觀的檢測缺失值,使用箱線圖方法。

#-*- coding: utf-8 -*-
import pandas as pd

catering_sale = '../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() #從小到大排序,該方法直接改變原對象
print("異常值的個數是:%d個"%len(y))

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

   我們可以輕鬆的根據輸出語句:

print("異常值的個數是:%d個"%len(y))

   得出結果:

異常值的個數是:8個
Process finished with exit code 0

Alt
​    從圖中可以看出,箱型圖中的超過上下界的8個銷售額數據可能爲異常值。結合實際的具體業務可以把865、4060.3、4065.2歸爲正常值,將22、51、60、6607.4. 9106.44歸爲異常值。
​    最後確定過濾規則爲:日銷量在400以下5000以上則屬於異常數據,編寫過濾程序進行後續處理。

3、一致性分析

​    數據不一致性指的是數據的矛盾性、不相容性。直接對不一致的數據進行挖掘,可能會產生與實際想違背的挖掘結果。不一致的產生原因有很多,可能被挖掘的數據來自不同的數據源、對於重複存放的數據未能進行一致性更新等造成的。

二、數據特徵分析

​    對數據進行質量分析過後,我們可以通過繪製表格、計算某些特殊值、特徵量等手段對數據進行更進一步的特徵分析。

1、分步分析

​    分佈分析能揭示數據的分佈特徵和分佈類型。對於定量數據,欲瞭解其分佈形式是對稱的還是非對稱的,發現某些特大或特小的可疑值,可通過繪製頻率分佈表、繪製頻率分佈直方圖、繪製莖葉圖進行直觀地分析;對於定性分類數據,可用餅圖和條形直觀地顯示分佈情況。

定量數據的分佈分析:

​    對於定量變量而言,選擇“組數”和“組寬”是做頻率分佈分析時最主要的問題,一般按照以下步驟進行。

  • 求極差
  • 決定組距與組數
  • 決定分點
  • 列出頻率分佈表
  • 繪製頻率分佈直方圖

遵循的主要原則:

  • 各組之間必須是相互排斥的
  • 各組必須將所有的數據包含在內
  • 各組的組寬最好相等

“撈起生魚片”的銷售情況:

日期 銷售額(元) 日期 銷售額(元) 日期 銷售額(元)
2014/4/1 420 2014/5/1 1770 2014/6/1 3960
2014/5/31 1800

如需要數據請私聊我

對於上面我們已經拿到的數據集:

(1)求極差

極差 = 最大值 - 最小值 = 3960 - 40 = 3915

(2)分組

這裏可以根據業務數據的含義對數據進行取組距,值爲500。

組數 = 極差 / 組距 = 3915 / 500 = 7.83 => 可看做爲8

(3)決定分點

分佈區間如表所示:

[0,500) [500,1000) [1000,1500) [1500,2000)
[2000,2500) [2500,3000) [3000,3500) [3500,4000)

(4)繪製頻率分佈表

組段 組中值x 頻數 頻率f 累計頻率
[500,1000) 750 24 26.37% 42.85%
[1000,1500) 1250 17 18.68% 61.54%
[1500,2000) 1750 15 16.84% 78.02%
[4000,4500) 4250 1 1.10% 100.00%

(5)繪製頻率分佈直方圖

​    以撈起生魚片的銷售額爲橫軸,各組段的頻率密度(頻率/組距)爲縱軸,繪製頻率分佈直方圖。

2、對比分析

​    對比分析是指把兩個相互聯繫的指標進行比較,從數量上展示和說明研究對象規模的大小,水平的高低,速度的快慢,以及各種關係是否協調。特別適用於指標間的橫縱向比較、時間序列的比較分析。在對比分析中,選擇合適的對比標準是十分關鍵的步驟,只有選擇合適,才能做出客觀的評價,選擇不合適,評價可能得出錯誤的結論。對比分析主要有以下兩種形式。

(1 )絕對數比較
   絕對數比較是利用絕對數進行對比,從而尋找差異的一種方法。

(2)相對數比較
   相對數比較是由兩個有聯繫的指標對比計算的,用以反映客觀現象之間數量聯繫程度的綜合指標,其數值表現爲相對數。由於研究目的和對比基礎不同,相對數可以分成以下幾種。

  1. 結構相對數:將同一總體內的部分數值與全部數值對比求得比重,用以說明事物的性質、結構或質量。如居民食品支出額佔消費支出總額比重、產品合格率等。
  2. 比例相對數:將同一總體內不同部分的數值進行對比,表明總體內各部分的比例關係。如人口性別比例、投資與消費比例等。
  3. 比較相對數:將同一時期兩個性質相同的指標數值進行對比,說明同類現象在不同空間條件下的數量對比關係。如不同地區商品價格對比,不同行業、不同企業間某指標對比等。
  4. 強度相對數:將兩個性質不同但有一定聯繫的總量指標進行對比,用以說明現象的強度、密度和普遍程度。如人均國內生產總值用“元/人”表示,人口密度用“人/平方公里”表示,也有用百分數或千分數表示的,如人口出生率用‰表示。
  5. 計劃完成程度相對數:是某一時期實際完成數與計劃數的對比,用以說明計劃完成程度。
  6. 動態相對數:將同一現象在不同時期的指標數值進行對比,用以說明發展方向和變化的速度。如發展速度、增長速度等。

3、統計量分析

   用統計指標對定量數據進行統計描述,常從集中趨勢和離中趨勢兩個方面進行分析。

集中趨勢度量:

  • 均值
  • 中位數
  • 衆數

離中趨勢度量:

  • 極差
  • 標準差
  • 變異係數
  • 四分位數間距

若詳細介紹篇幅將會過長,請大家自行查閱上述名詞及實例

餐飲銷量數據統計量分析:

#-*- coding: utf-8 -*-
#餐飲銷量數據統計量分析
from __future__ import print_function
import pandas as pd

catering_sale = '../data/catering_sale.xls' #餐飲數據
data = pd.read_excel(catering_sale, index_col = u'日期') #讀取數據,指定“日期”列爲索引列
data = data[(data[u'銷量'] > 400)&(data[u'銷量'] < 5000)] #過濾異常數據
statistics = data.describe() #保存基本統計量

statistics.loc['range'] = statistics.loc['max']-statistics.loc['min'] #極差
statistics.loc['var'] = statistics.loc['std']/statistics.loc['mean'] #變異係數
statistics.loc['dis'] = statistics.loc['75%']-statistics.loc['25%'] #四分位數間距
print(statistics)

運行程序,我們可以得到如下結果:

           銷量
count   195.000000
mean   2744.595385
std     424.739407
min     865.000000
25%    2460.600000
50%    2655.900000
75%    3023.200000
max    4065.200000
range  3200.200000
var       0.154755
dis     562.600000

Process finished with exit code 0

4、週期性分析

​    週期性分析是探索某個變量是否隨着時間變化而呈現出某種週期變化趨勢。時間尺度相對較長的週期性趨勢有年度週期性趨勢、季節性週期趨勢,相對較短的有月度週期性趨勢、周度週期性趨勢,甚至更短的天、小時週期性趨勢。

5、貢獻度分析

​    貢獻度分析又稱帕累託分析,它的原理是帕累托法則,又稱20/80定律。同樣的投入放在不同的地方會產生不同的效益。例如,對一個公司來講,80% 的利潤常常來自於20%最暢銷的產品,而其他80%的產品只產生了20%的利潤。

菜品盈利帕累託圖

#-*- coding: utf-8 -*-
#菜品盈利數據 帕累託圖
from __future__ import print_function
import pandas as pd

#初始化參數
dish_profit = '../data/catering_dish_profit.xls' #餐飲菜品盈利數據
data = pd.read_excel(dish_profit, index_col = u'菜品名')
data = data[u'盈利'].copy()
# data.sort(ascending = False)

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

plt.figure()
data.plot(kind='bar')
plt.ylabel(u'盈利(元)')
p = 1.0*data.cumsum()/data.sum()
p.plot(color = 'r', secondary_y = True, style = '-o',linewidth = 2)
plt.annotate(format(p[6], '.4%'), xy = (6, p[6]), xytext=(6*0.9, p[6]*0.9), arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2")) #添加註釋,即85%處的標記。這裏包括了指定箭頭樣式。
plt.ylabel(u'盈利(比例)')
plt.show()

在這裏插入圖片描述

6、相關性分析

​    分析連續變量之間線性相關程度的強弱,並用適當的統計指標表示出來的過程稱爲相關分析。

  • 直接繪製散點圖

    ​ 判斷兩個變量是否具有線性相關關係最直觀的方法就是繪製散點圖

在這裏插入圖片描述

  • 繪製散點圖矩陣

    ​    需要同時考察多個變量間的相關關係時,一一繪製它們間的簡單散點圖是十分麻煩的。此時可利用散點圖矩陣同時繪製各變量間的散點圖,從而快速發現多個變量間主要相關性,這在進行多元線性迴歸時顯得尤爲重要。

在這裏插入圖片描述

  • 計算相關係數

​    爲了更加準確地描述變量之間的線性相關程度,可以通過計算相關係數來進行相關分析。在二元變量的相關分析過程中比較常用的有Pearson相關係數、Spearman秩關係數和判定係數。

餐飲銷量數據相關性分析:

#-*- coding: utf-8 -*-
#餐飲銷量數據相關性分析
from __future__ import print_function
import pandas as pd

catering_sale = '../data/catering_sale_all.xls' #餐飲數據,含有其他屬性
data = pd.read_excel(catering_sale, index_col = u'日期') #讀取數據,指定“日期”列爲索引列

a = data.corr() #相關係數矩陣,即給出了任意兩款菜式之間的相關係數
b = data.corr()[u'百合醬蒸鳳爪'] #只顯示“百合醬蒸鳳爪”與其他菜式的相關係數
c = data[u'百合醬蒸鳳爪'].corr(data[u'翡翠蒸香茜餃']) #計算“百合醬蒸鳳爪”與“翡翠蒸香茜餃”的相關係數
print(b)

這裏我們將

data.corr()[u'百合醬蒸鳳爪']

命名爲b,輸出b我們可以得到“百合醬蒸鳳爪”與其他菜式的相關係數

百合醬蒸鳳爪     1.000000
翡翠蒸香茜餃     0.009206
金銀蒜汁蒸排骨    0.016799
樂膳真味雞      0.455638
蜜汁焗餐包      0.098085
生炒菜心       0.308496
鐵板酸菜豆腐     0.204898
香煎韭菜餃      0.127448
香煎羅卜糕     -0.090276
原汁原味菜心     0.428316
Name: 百合醬蒸鳳爪, dtype: float64

Process finished with exit code 0

​    從上面的結果可以看到,如果顧客點了“百合醬蒸鳳爪”,則和點“翡翠蒸香茜餃”“金銀蒜汁蒸排骨”“香煎蘿蔔糕”“鐵板酸菜豆腐”“香煎韭菜餃”等主食類的相關性比較低,反而點“樂膳真味雞”“生炒菜心”“原汁原味菜心”的相關性比較高。

★如有不足或錯誤還請指出,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章