極簡數據分析(上) - 10分鐘掌握關鍵數據分析方法

“ 數據分析作爲一項未來產品及運營人員必須掌握的技能,在工作中扮演着愈發重要的角色,相信大家目前也或多或少涉及到相關的工作。但平時更多時候可能是憑經驗直覺在做分析,經驗和直覺作爲一種短決策快思考的方式,有時候會很好用,但風險是很大的。好一點的情況可能只是影響產出的效率,壞一點的話可能沒法得出有價值的結論,甚至錯誤的結論。

因此本文更希望的是對我們已經在進行的數據分析行爲和潛意識裏存儲的知識點進行系統性的梳理,形成常規作業的方法。在下次遇到需要數據分析的場景時,能夠有一套相對高效科學的流程,而不是憑經驗直覺。

工欲善其事必先利其器,選擇正確的數據分析工具很重要,工具決定了你處理問題的效率和可處理的問題上限,但越專業的工具通常也意味着更高的上手門檻,因此不論是最常用的excel,還是數據分析類平臺,例如SPSS、MATLAB,或者編程語言,例如Python、R,只有與自己需解決的實際問題相匹配的工具纔是最合適的。殺雞用牛刀不好,反過來也做不到,當然這不是本文討論的要點。比工具更重要的,可能是數據思維,真正決定你能否從數據中挖掘本質事實的其實是思維,可惜這也不是本文討論的要點。畢竟接下來的十分鐘要講的是直接的分析套路,這麼看來本文其實是授人以魚了。但魚也是我們需要的,特別是在解決眼下實際問題時,即插即用可能更高效。萬一等學會捕魚,出海歸來,食客已餓死大半呢?”

任何工作都是有一定套路的,數據分析也不例外,簡單來看,可以分爲以下5步:

1. 明確目標

2. 數據預處理

3. 特徵分析

4. 算法建模

5. 數據表達

本文分爲上下兩篇,此篇涉及前3步,完成前3步已經可以進行常規的數據分析和基礎的數據可視化工作了。下篇會講解後2步,包括了迴歸、分類和聚類等分析時常用的算法建模,以及最終的數據表達。(其實是寫到一半寫不動了,希望下篇不鴿...)

01 明確目標


在動手前,先想清楚本次分析的目的是什麼。數據分析一定是要形成結論的,結論來源於在分析前確定的目標,目標可以以設問或假設等形式被定義。例如提出問題:某類目下的暢銷品是什麼?再根據分析結果去調整暢銷品的備貨情況。或給出假設:假設市場上的紅酒價格集中在100元左右。再根據分析結果去驗證假設。

還可以定義需要由數據分析直接給出指導的問題,例如對未來銷售數據的預測,則還需要在完成特徵分析後,選擇合適的算法建模。

02 數據預處理


在分析前,需要先對採集的數據進行預處理(以數據清洗爲主)以適合分析。通常原始數據由於獲取方式、渠道和格式等的多樣,其質量是不夠直接用於分析的。如果數據本身質量太差,即便分析手段再科學,過程再嚴謹,也只會是“garbage in,garbage out”。因此數據預處理的工作非常重要,也會花費大量時間,甚至會佔據整個分析過程60%以上的時間。限於篇幅,只介紹最常見的情況和處理方式。

1. 缺失值處理

根據缺失的數據量和數據的重要程度進行判斷。缺失數據不重要時可直接丟棄或作簡單填充,缺失數據比較重要時,若缺失量也較大,說明這份數據質量太低,其實不適合做分析,建議尋找新數據源替換或補全,若缺失量在可接收範圍內則需要進行插補填充。通常可使用整份數據的均值/中位數/衆數進行插補,若數據有明顯趨勢或可用一定函數表達,可使用臨近值插補(上一行數據或下一行數據)或多項式插值法(例如拉格朗日插值法)。Python中自帶了拉格朗日插值法,可直接使用作出函數。

from scipy.interpolate import lagrange

2. 異常值處理

異常值代表和數據集偏離程度過高的數據,異常值不一定意味着錯誤數據,有可能是業務特殊波動造成的影響,例如在雙11當天的交易量對比平日來說,很可能就是異常值了。要考慮實際分析目的,判斷是否需要處理。異常值的處理方式和缺失值類似,更重要的是如何找出異常值,這裏介紹3σ原則,即對於服從正態分佈的數據,具體數值與整體平均值的差值大於3倍標準差時,可認定爲異常值(p(|x - μ| > 3σ) ≤ 0.003),簡單作圖可看出這類異常數據的分佈和佔比情況(紅點爲異常值)。

3. 數據歸一化

如果數據不在一個量級下,直接進行分析其實是沒有太大意義的,因此需要對這類數據進行歸一化(Normalization)處理。最典型的0-1歸一化是將絕對數值映射到(0,1)區間內的一個小數,這樣大家都是一個相對的比例,便於分析比較。

0-1歸一化的公式爲:x' = (x - X_min) / (X_max - X_min),分子爲數值與最小值的差,分母爲極差(最大值與最小值的差)。

03 特徵分析


完成數據預處理後,我們認爲已獲得了一份高質量可分析的數據,從而可展開分析工作。數據分析是伴隨着製圖進行的,但此時作圖主要是便於分析,並非最終的數據可視化。

以下列舉常見的數據分析場景。

1. 分佈分析

主要用於觀察數據的分佈特徵和分佈類型,適用於非時間序列的數據,例如分析房屋交易數據或班級內考試分數數據等。

對目標字段進行切片,若是定量字段(例如分數)則根據極差進行分段,若是定性字段(例如籍貫)則根據計數統計並進行分段。分段數通常在10個左右比較合適,我們就以10個爲例,將目標字段的極差平均分爲10個區間,再計算落在每個區間的頻數、頻率以及累計頻率,可大致觀察出數據的分佈情況。

下圖即爲對一份房產交易數據進行的分佈分析,以房產總價(萬元)爲目標字段,切分爲10個區間,再觀察整體的分佈情況。可以初步發現交易數集中在低價和高價的房產,中等價位的交易數較少。

2. 對比分析

主要用於觀察兩個或多個有聯繫的樣本數據之間的比較情況。

最常見的是絕對數間的比較,適用於對比指標基本處於相似量級的情況,例如團隊對比各銷售人員的銷售情況以評定績效。可使用基礎的多系列折線圖或柱狀圖進行比較。在重點分析兩者間對比時,可以輔以兩者的差值折線圖進行分析,例如下圖對A、B兩名銷售人員在一個月內每天的的銷售額進行對比,可明顯觀察出兩人的差距變化。

絕對數比較難以看出整體結構性的變化,因此需要通過相對數比較去觀察單一數據與總體間的佔比關係。計算每份數據在其自身數據總和中的佔比,再以折線圖表示可觀察數據的相對情況。例如下圖對比2家不同量級的門店銷售數據以觀察整體銷售趨勢時,觀察絕對數時,低量級的數據無法反映任何有效信息,轉化爲相對數據後,即便量級不同,也可對比兩者的銷售趨勢。

除去不同樣本間的對比,還存在單一樣本在總樣本之和中的佔比分析,如下圖表示了某銷售人員在全組銷售額情況中的佔比,很好理解。

以上3種對比均是不同時間上的對比(橫軸均爲時間),此外還存在空間對比,即同類指標在同一時間不同空間內的對比,例如對比全部銷售人員的年度銷售額,可以用簡單的柱狀圖表示。

更爲複雜的是動態對比,即同一現象在不同時間上的對比,說起來繞口,但其實卻非常常見,最常見的應該就是同比和環比了。快速和大家複習下同比和環比的定義。

同比:與上一時間段內同一期相比,通常比較月同比,例如2019年10月數據與2018年10月數據相比。

同比增速(%) = (本期數 - 上一時段同期數) / 上一時段同期數 = 本期數 / 上時段一同期數 - 1

環比:直接和上一期相比,通常比較月環比,例如2019年10月數據與2019年9月數據相比。

環比增速(%) = (本期數 - 上期數) / 上期數 = 本期數 / 上期數 - 1

3. 統計分析

主要是對數據進行整體統計值的描述,以及觀察數據的集中趨勢和離中趨勢。

集中趨勢旨在度量數據向某一中心靠攏的傾向,衡量指標包括了基礎的算數平均數、衆數和中位數。衆數和中位數又稱作位置平均數。

離中趨勢旨在度量數據以不同維度的距離偏移中心的趨勢。衡量指標包括了大家熟悉的極差、方差與標準差。額外介紹一下分位差,它是將數據由小到大排序後的上四分位數(Q3,即位於75%)與下四分位數(Q1,即位於25%)的差,其反映了中間50%數據的離散程度。分位差在後面介紹的箱型圖中會有更詳細的描述。

4. 帕累託分析

帕累托法則有個更被大衆熟知的名稱,即二八法則。帕累託分析的目的也是爲了找出帶來80%收益的關鍵因素。在其基礎上還有衍生出ABC分析法,在零售等行業會經常被使用。

例如下圖,假設對全部10款產品銷量進行分析,先對商品按照銷量由高到低排序,再計算出佔比和累積佔比,即可觀察出80%銷量主要由前4款產品貢獻,進而可以指導相應商品的庫存等計劃。

5. 正態性分析

正態分佈又名高斯分佈,在真實世界中正態分佈幾乎無處不在,我們實際生產中分析的數據大部分也滿足正態分佈。本文假定大家對正態分佈都有足夠的知識,不做過多解釋。若對象服從正態分佈,所有針對正態分佈的定理和經驗都可以直接套用。例如在服從正態分佈的市場中尋找優先攻克的用戶羣,再如上述帕累托法則的應用,對於正態分佈的樣本才能體現其最大價值。因此檢驗數據是否服從正態分佈,有很重要的意義。

通常可直接繪製直方圖和密度圖進行圖形的粗判,或者也可以使用KS檢驗,若返回pvalue>0.05表示不能拒絕數據服從正態分佈的假設,可以認爲數據服從正態分佈,若pvalue<0.05表示數據絕對不服從正態分佈。Python實現方法如下。

from scipy import stats import numpy as np x = np.random.randn(1000)mean = x.mean() # 計算均值std = x.std() # 計算標準差stats.kstest(x,'norm',(mean,std))# .kstest方法:KS檢驗,參數爲:待檢驗的數據,檢驗方法(norm爲正態分佈),均值與標準差>>>KstestResult(statistic=0.019774695987113344, pvalue=0.8290731977218249)

6. 相關性分析

在對數據進行更深入的分析時,我們期望能挖掘出一些不那麼容易觀察到的現象,比較常見的便是分析連續變量之間的線性相關程度。分析對象間的相關性也是普遍存在,並且非常有價值的信息。例如電商網站推薦的商品組合,一般都是進行關聯分析後,尋找到的有強關聯的購買組合。

在沒有介紹到具體的機器學習算法之前,我們只從數據分析角度去尋找相關性。利用散點圖可以進行初步判斷,以變量A爲橫座標,變量B爲縱座標,即可觀察兩者的線性相關程度。例如下圖分別對變量A、B和變量B、C進行分析,可以看出A、B間存在正相關,B、C間存在負相關。

在有超過2個變量時,可以利用散點圖矩陣在一張圖中表現所有變量兩兩之間的關係,十分高效。矩陣是呈對角線對稱的,我們看其中一半就好。例如下圖將A、B、C、D,4個變量放入散點圖矩陣中,可以看出其中不止一種相關性,具體關係交給大家判斷一下。

評估相關性還可以利用一系列相關係數,選擇不同的相關係數評估的結果也不一樣,選擇的方式一定程度取決於數據本身的分佈情況,我們只介紹2個常用的相關係數。

皮爾遜係數:該係數用r表示,適用於服從正態分佈的數據,因此需要先做正態性檢驗。對服從正態分佈的數據,若|r|>0.5,可認爲兩者有顯著線性相關,若|r|>0.8,則兩者高度線性相關,在Python中直接使用.corr()方法調用。

data.corr(method='pearson')

該方法會返回變量間相關係數的矩陣,可以看出A和B之間存在線性相關。

ABCD

A1.00000.8985-0.0482-0.0563

B0.89851.0000-0.0710-0.0413

C-0.0482-0.07101.00000.0712

D-0.0563-0.04130.07121.0000

斯皮爾曼係數:該係數用希臘字母ρ表示,當數據不服從正態分佈時可使用斯皮爾曼係數判斷,斯皮爾曼係數和皮爾遜係數的計算公式很類似,但其計算採用的是取值的等級(或者說是由小到大的排序序號),而不是取值本身。其判斷範圍和在Python中的使用方式都和皮爾遜係數一樣,注意修改method參數爲spearman。

data.corr(method='spearman')

小結


本篇介紹了數據分析工作的前3步:明確目標,預處理和特徵分析。根據個人經驗,熟練掌握數據預處理和特徵分析的方法已經足夠解決80%的數據分析問題了。

預處理階段包括了對缺失值的處理,異常值的判斷和處理,以及數據差距過大時的歸一化。特徵分析包括了觀察整體結構組成情況的分佈分析,觀察不同維度下數據間比較的對比分析,個別彙總描述代表性數值的統計分析,驗證二八法則的帕累託分析,以及判斷數據分佈情況的正態性分析相關性分析

下篇(如有)將邁入算法建模和數據表達,嘗試利用機器學習挖掘更深層次的數據特徵和運用更高階的展示技巧進行數據可視化。

See you~


歡迎關注公衆號:羅老師別這樣

公衆號將持續更新深度學習筆記及個人心得,不輕易更新,但更新一定保證價值,望你和作者共同進步

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