Python數據分析與挖掘實戰學習筆記(2)

Chapter3 數據探索

序言

 根據觀測、調查收集到初步的樣本數據集後,接下來要考慮的問題是:樣本數據集的數量和質量是否滿足模型構建的要求?是否出現從未想過的數據狀態?其中有沒有什麼明顯的規律和趨勢?各因素之間有什麼樣的關聯性?
 通過檢驗數據集的數據質量、繪製圖表、計算某些特徵量等手段,對樣本數據集的結構和規律進行分析的過程就是數據探索。
 本章從數據質量分析和數據特徵分析兩個角度對數據進行探索。

數據質量分析

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

  1. 缺失值
  2. 異常值
  3. 不一致的值
  4. 重複數據及含有特殊符號的數據

缺失值分析

 數據的缺失主要包括記錄的缺失和記錄中某個字段信息的缺失,兩者都會造成分析結果的不準確,以下從缺失值產生的原因及影響等方面展開分析。
(1). 缺失值產生的原因
1). 有些信息暫時無法獲取,或者獲取信息的代價太大。
2). 有些信息是被遺漏的。可能是因爲輸入時認爲不重要、忘記填寫或對數據理解錯誤等一些人爲因素而遺漏,也可能是由於數據採集設備的故障、存儲介質的故障、傳輸媒體的故障等非人爲原因而丟失。
3). 屬性值不存在。在某些情況下,缺失值並不意味着數據有錯誤。對一些對象來說某些屬性值是不存在的,如一個未婚者的配偶姓名、一個兒童的固定收入等。
(2). 缺失值的影響
1). 數據挖掘建模將丟失大量的有用信息。
2). 數據挖掘模型所表現出的不確定性更加顯著,模型中蘊含的規律更難把握。
3). 包含空值的數據會使建模過程陷入混亂,導致不可靠的輸出。
(3) 缺失值的分析
 使用簡單的統計分析,可以得到含有缺失值的屬性的個數,以及每個屬性的未缺失數、缺失數與缺失率等。
 從總體上來說,缺失值的處理分爲刪除存在缺失值的記錄、對可能值進行插補和不處理3種情況。

異常值分析

 異常值分析是檢驗數據中是否含有錄入錯誤以及含有不合常理的數據。忽視異常值的存在是十分危險的,不加剔除地把異常值包括進數據的計算分析過程中,對結果會產生不良的影響;重視異常值的出現,分析其產生的原因,常常成爲發現問題進而改進決策的契機。
 異常值是指樣本中的個別值,其數值明顯偏離其餘的觀測值。異常值也稱爲離羣點,異常值分析也稱爲離羣點分析。

# 查看餐飲系統的日銷量數據的基本情況
import pandas as pd
catering_sale = './data/catering_sale.xls'  # 餐飲數據
data = pd.read_excel(catering_sale, index_col=u'日期')  # 讀取數據,指定"日期"列爲索引樹
print(data.describe())
          銷量
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。

# 餐飲銷額數據異常值檢測代碼
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()  # 'fliers'即爲異常值的標籤
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()  # 展示箱線圖

結果:
在這裏插入圖片描述
 從上圖可以看出,箱型圖中的超過上下界的7個銷售額數據可能爲異常值。結合具體業務可以把865、4060.3、4065.2歸爲正常值,將22、51、60、6607.4、9106.44歸爲異常值。

一致性分析

 數據不一致性是指數據的矛盾性、不相容性。直接對不一致的數據進行挖掘,可能會產生與實際相違背的挖掘結果。
 在數據挖掘過程中,不一致數據的產生主要發生在數據集成的過程中,這可能是由於被挖掘數據來自於從不同的數據源、對於重複存放的數據未能進行一致性更新造成的。

數據特徵分析

 對數據進行質量分析以後,接下來可通過繪製圖表、計算某些特徵量等手段進行數據的特徵分析。

分佈分析

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

對比分析

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

  1. 絕對數比較
  2. 相對數比較
    相對數比較是由兩個有聯繫的指標對比計算的,用以反映客觀現象之間數量聯繫程度的綜合指標,其數值表現爲相對數。

統計量分析

 用統計指標對定量數據進行統計描述,常從集中趨勢和離中趨勢兩個方面進行分析。
 平均水平的指標是對個體集中趨勢的度量,使用最廣泛的是均值和中位數;反映變異程度的指標則是對個體離開平均水平的度量,使用較廣泛的是標準差(方差)、四分位間距。

# 餐飲銷量數據統計量分析
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

週期性分析

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

貢獻度分析

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

# 對餐飲企業來講,應用貢獻度分析可以重點改善菜系盈利最高的前80%的菜品,
# 或者重點發展綜合影響最高的80%的部門。這種結果可以通過帕累託圖直觀地呈現出來。
# 下圖是海鮮系列的10個菜品A1-A10某個月的盈利額(已按照從大到小排序)
from __future__ import print_function
import pandas as pd
import matplotlib.pyplot as plt
# 初始化參數
dish_profit = './data/catering_dish_profit.xls'
data = pd.read_excel(dish_profit, index_col=u'菜品名')
data = data[u'盈利'].copy()
data.sort_values(ascending=False)
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()

結果:
在這裏插入圖片描述
由上圖可知,菜品A1-A7共7個菜品,佔菜品種類數的70%,總盈利額佔該月盈利額的85.0033%。根據帕累托法則,應該增加對菜品A1-A7的成本投入,減少對菜品A8-A10的投入以獲得更高的盈利額。

相關性分析

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

  1. 直接繪製散點圖
    判斷兩個變量是否具有線性相關關係的最直觀的方法是直接繪製散點圖。
  2. 繪製散點圖矩陣
    利用散點圖矩陣同時繪製各變量間的散點圖,從而快速發現多個變量間的主要相關性,這在進行多元線性迴歸時顯得尤爲重要。
  3. 計算相關係數
    爲了更加準確地描述變量之間的線性相關程度,可以通過計算相關係數來進行相關分析。在二元變量的相關分析過程中比較常用的有Pearson相關係數、Spearman秩相關係數和判定係數。
# 相關性分析------餐飲銷量數據相關性分析(判定係數)
# 判定係數是相關係數的平方,用r^2表示;
# 用來衡量回歸方程對y的解釋度。判定係數取值範圍:0<=r^2<=1。
# r^2越接近與1,表明x與y之間的相關性越強;r^2越接近於0,
# 表明兩個變量之間幾乎沒有直線相關關係。
# 分析這些菜品銷售量之間的相關性可以得到不同菜品之間的關係,
# 比如是替補菜品、互補菜品或者沒有關係,爲原材料採購提供材料。
import pandas as pd
catering_sale = './data/catering_sale_all.xls'  # 餐飲數據,含有其他屬性
data = pd.read_excel(catering_sale, index_col=u'日期')  # 讀取數據,指定“日期”列爲索引樹
corr1 = data.corr()  # 相關係數矩陣,即給出了任意兩款菜式之間的相關係數
corr2 = data.corr()[u'百合醬蒸鳳爪']  # 只顯示“百合醬蒸鳳爪”與其他菜式的相關係數
corr3 = data[u'百合醬蒸鳳爪'].corr(data[u'翡翠蒸香茜餃'])  # 計算“百合醬蒸鳳爪”與“翡翠蒸香茜餃”的相關係數
print(corr2)  # 輸出corr2
百合醬蒸鳳爪     1.000000
翡翠蒸香茜餃     0.009206
金銀蒜汁蒸排骨    0.016799
樂膳真味雞      0.455638
蜜汁焗餐包      0.098085
生炒菜心       0.308496
鐵板酸菜豆腐     0.204898
香煎韭菜餃      0.127448
香煎羅卜糕     -0.090276
原汁原味菜心     0.428316
Name: 百合醬蒸鳳爪, dtype: float64

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

總結

 本章從應用的角度出發,從數據質量分析和數據特徵分析兩個方面對數據進行探索分析。數據質量分析要求我們拿到數據之後先檢測是否存在缺失值和異常值;數據特徵分析要求我們在數據挖掘建模前,通過頻率分佈分析、對比分析、帕累託分析、週期性分析、相關性分析等方法,對採集的樣本數據的特徵規律進行分析,以瞭解數據的規律和趨勢,爲數據挖掘的後續環節提供支持。

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