本文將提到Python數據分析與挖掘中的 數據探索與數據特征分析
目錄
-
-
-
閱讀提示
-
-
一、數據探索
-
-
1、數據質量的分析
-
2、異常值的分析
-
3、一致性分析
-
-
二、數據特征分析
-
-
1、分步分析
-
2、對比分析
-
3、統計量分析
-
4、周期性分析
-
5、貢獻度分析
-
6、相關性分析
-
-
一、數據探索
根據觀測、調查收集到初步的樣本數據集后,接下來要考慮的問題是:樣本數據集的數量和質量是否滿足模型構建的要求?是否出現從未設想過的數據狀態?其中有沒有什么明顯的規律和趨勢?各因素之間有什么樣的關聯性? 通過檢驗數據集的數據質量、繪制圖表、計算某些特征量等手段,對樣本數據集的結構和規律進行分析的過程就是數據探索。數據探索有助於選擇合適的數據預處理和建模方法,甚至可以完成一些通常由數據挖掘解決的問題。 后續將從數據質量分析和數據特征分析兩個角度對數據進行探索。
1、數據質量的分析
數據質量分析是數據挖掘中數據准備過程的重要一環,是數據預處理的前提,也是數據挖掘分析結論有效性和准確性的基礎,沒有可信的數據,數據挖掘構建的模型將是空中樓閣。 數據質量分析的主要任務是檢查原始數據中是否存在臟數據,臟數據一般是指不符合要求,以及不能直接進行相應分析的數據。在常見的數據挖掘工作中,臟數據包括如下內容:
-
缺失值
-
異常值
-
不一致的值
-
重復數據以及含有特殊符號(如 #、¥、*)的 數據
在后面我將主要對數據中的缺失值、異常值和一致性進行分析。
產生缺失值的原因:
a.有的信息暫時無法獲取,或者獲取信息的代價太大
b.有些信息是被遺漏的。可能是因為輸入時認為不重要、忘記填寫或對數據理解錯誤等一些人為因素而遺漏,也可能是由於數據采集設備的故障、存儲介質的故障、傳輸媒體的故障等非人為原因而丟失。
c.屬性值不存在。在某些情況下,缺失值並不意味着數據有錯誤。對一些對象來說某些屬性值是不存在的,如一個未婚者的配偶姓名、一個兒童的固定收入等。
缺失值的影響:
a.數據挖掘建模將丟失大量的有用信息。
b.數據挖掘模型所表現出的不確定性更加顯著,模型中蘊涵的規律更難把握。
c.包含空值的數據會使建模過程陷入混亂,導致不可靠的輸出。
2、異常值的分析
異常值是指樣本中的個別值,其數值明顯偏離其余的觀測值。異常值也稱為離群點,異常值的分析也稱為離群點分析。
a.簡單統計量分析:
可以先對變量做一個描述性統計,進而查看哪些數據是不合理的。最常用的統計量是最大值和最小值,用來判斷這個變量的取值是否超出了合理的范圍。如客戶年齡的最大值為199歲,則該變量的取值存在異常。
b.3σ原則:
如果數據服從正態分布,在3σ原則下,異常值被定義為一組測定值中與平均值的偏差超過3倍標准差的值。在正態分布的假設下,距離平均值3σ之外的值出現的概率為P( |x-μ| >3σ)≤0.003,屬於極個別的小概率事件。如果數據不服從正態分布,也可以用遠離平均值的多少倍標准差來描述。
c.箱型圖分析
箱型圖依據實際數據繪制,沒有對數據作任何限制性要求(如服從某種特定的分布形式),它只是真實直觀地表現數據分布i的本來面貌;另一方面,箱型圖判斷異常值的標准以四分位數和四分位距為礎,四分位數具有一定的魯棒性:多達25%的數據可以變得任意遠而不會很大地擾動四分位數,所以異常值不能對這個標准施加影響。由此可見,箱型圖識別異常值的結果比較客觀,在識別異常值方面有一定的優越性。
實例:
數據來源: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
從圖中可以看出,箱型圖中的超過上下界的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)相對數比較 相對數比較是由兩個有聯系的指標對比計算的,用以反映客觀現象之間數量聯系程度的綜合指標,其數值表現為相對數。由於研究目的和對比基礎不同,相對數可以分成以下幾種。
-
結構相對數:將同一總體內的部分數值與全部數值對比求得比重,用以說明事物的性質、結構或質量。如居民食品支出額占消費支出總額比重、產品合格率等。
-
比例相對數:將同一總體內不同部分的數值進行對比,表明總體內各部分的比例關系。如人口性別比例、投資與消費比例等。
-
比較相對數:將同一時期兩個性質相同的指標數值進行對比,說明同類現象在不同空間條件下的數量對比關系。如不同地區商品價格對比,不同行業、不同企業間某指標對比等。
-
強度相對數:將兩個性質不同但有一定聯系的總量指標進行對比,用以說明現象的強度、密度和普遍程度。如人均國內生產總值用“元/人”表示,人口密度用“人/平方公里”表示,也有用百分數或千分數表示的,如人口出生率用‰表示。
-
計划完成程度相對數:是某一時期實際完成數與計划數的對比,用以說明計划完成程度。
-
動態相對數:將同一現象在不同時期的指標數值進行對比,用以說明發展方向和變化的速度。如發展速度、增長速度等。
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
從上面的結果可以看到,如果顧客點了“百合醬蒸鳳爪”,則和點“翡翠蒸香茜餃”“金銀蒜汁蒸排骨”“香煎蘿卜糕”“鐵板酸菜豆腐”“香煎韭菜餃”等主食類的相關性比較低,反而點“樂膳真味雞”“生炒菜心”“原汁原味菜心”的相關性比較高。
★如有不足或錯誤還請指出,謝謝。