1. 程式人生 > >資料建模講解和案例分析

資料建模講解和案例分析

第一部分:資料建模理論和邏輯

一、從資料分析的定義開始

維基百科對資料分析的定義如下:

Analysis of data is a process of inspecting, cleaning, transforming, and modeling data with the goal of discovering useful information, suggesting conclusions, and supporting decision making. Data analysis has multiple facets and approaches, encompassing diverse techniques under a variety of names, in different business, science, and social science domains.
(來源:

Data analysis

簡單翻譯:資料分析是一個包含資料檢驗、資料清洗、資料重構,以及資料建模的過程,目的在於發現有用的資訊,有建設性的結論,輔助決策的制定。資料分析有多種形式和方法,涵蓋了多種技術,應用於商業、科學、社會學等多個不同的領域。

和上篇文章中我畫的圖對比一下:

我在上篇文章中為了讓初學者更容易走通全流程,簡化了資料清洗的過程,實際上資料清洗絕非一次完成,“檢驗-清洗-檢驗”的過程可能會重複數次乃至數十次。

而建模呢?再次引用維基上對資料建模的定義:

Data modeling is a process used to define and analyze data requirements needed to support the business processes within the scope of corresponding information systems in organizations. Therefore, the process of data modeling involves professional data modelers working closely with business stakeholders, as well as potential users of the information system.(來源:

Data modeling
簡單翻譯:資料建模是一個用於定義和分析在組織的資訊系統的範圍內支援商業流程所需的資料要求的過程。因此,資料建模的過程需要專業建模師與商業人員和資訊系統潛在使用者的緊密合作。這段話的定義更偏向資訊系統和商業資料建模,我之所以在此引用這段話,是為了明確接下來的討論內容主要方向是商業資料分析和建模,至於科學研究方向的資料建模,不在這篇文章的討論範圍以內。

請注意上邊這段話中的一個核心:支援商業流程。商業資料建模,乃至商業資料分析,其最終目的都是要支援某種商業流程,要麼優化原有流程,提高各部分效率;要麼重構原有流程,減少步驟;要麼告訴決策者,哪些流程改造方向是錯誤的,以避免走錯路。最終的目標,一定是提升效率。但在不同的情況下,提升效率的方式也是不同的,因此在每個模型建立時,都需要確定其解決的具體目標問題。

再往前走一步,數學—主要是統計學,在建模的過程中又扮演什麼樣的角色呢?繼續引用維基:

Mathematical formulas or models called algorithms may be applied to the data to identify relationships among the variables, such as correlation or causation. In general terms, models may be developed to evaluate a particular variable in the data based on other variable(s) in the data, with some residual error depending on model accuracy (i.e., Data = Model + Error)(來源:Data modeling

簡單翻譯:數學公式或模型稱為演算法,可應用於資料以確定變數之間的關係,如相關性或因果關係。在一般情況下,模型開發出來後用於評估一個特定的變數與資料中其他其他變數的關係,根據模型的準確性不同,這些關係中會包含殘差(即,資料=模型+錯誤)

這段描述很明確,統計學在資料建模的過程中,主要用於幫助我們找出變數之間的關係,並對這種關係進行定量的描述,輸出可用於資料集的演算法。一個好的資料模型,需要通過多次的測試和優化迭代來完成。

綜上,給出一個我認為的“資料建模”定義:資料集+商業目標+演算法+優化迭代= 資料建模。定義中的每一部分都必不可少。

二、資料模型的建立過程

照例,先上流程圖:

上圖的流程顏色對應資料分析全流程,為了方便大家閱讀,我把全流程圖再貼一次:

接下來,我重點解讀明黃色(淺黃?)部分的內容:

  • 選擇變數與重構變數

在進行建模之前,首先要考慮的是使用哪些變數來建立模型,需要從業務邏輯和資料邏輯兩個方面來考慮:

業務邏輯:變數基於收集到的資料,而資料在收集時,會產生與業務層面相關的邏輯,比如在汽車引數中,一旦我們定義了“家用轎車”這個類別,那麼無論什麼品牌什麼車型,“輪胎數量(不計備胎)”這個變數就有99%以上機率為4……當然在接下來的建模中,我們不會選擇這個變數。這一類情況是業務知識來告訴我們哪些變數可以選擇,哪些不能選擇。

資料邏輯:通常從資料的完整性、集中度、是否與其他變數強相關(甚至有因果關係)等角度來考慮,比如某個變數在業務上很有價值,但缺失率達到90%,或者一個非布林值變數卻集中於兩個值,那麼這個時候我們就要考慮,加入這個變數是否對後續分析有價值。

我個人認為,在選擇變數時,業務邏輯應該優先於資料邏輯,蓋因業務邏輯是從實際情況中自然產生,而建模的結果也要反饋到實際中去,因此選擇變數時,業務邏輯重要程度相對更高。

而在變數本身不適合直接拿來建模時,例如調查問卷中的滿意度,是漢字的“不滿意”“一般”“滿意”,那麼需要將其重構成“1”(對應不滿意)“2”(對應一般)“3”(對應滿意)的數字形式,便於後續建模使用。

除這種重構方式之外,將變數進行單獨計算(如取均值)和組合計算(如A*B)也是常用的重構方法。其他的重構方法還有很多種,在此不一一闡述。

  • 選擇演算法

我們在建模時,目標是解決商業問題,而不是為了建模而建模,故此我們需要選擇適合的演算法。常用建模演算法包括相關、聚類、分類(決策樹)、時間序列、迴歸、神經網路等。

以對消費者的建模為例,舉一些場景下的常用演算法對應:

劃分消費者群體:聚類,分類;

購物籃分析:相關,聚類;

購買額預測:迴歸,時間序列;

滿意度調查:迴歸,聚類,分類;

等等。

確定演算法後,要再看一下變數是否滿足演算法要求,如果不滿足,回到選擇/重構變數,再來一遍吧。如果滿足,進入下一步。

  • 設定引數

演算法選定後,需要用資料分析工具進行建模。針對不同的模型,需要調整引數,例如聚類模型中的K-means演算法,需要給出希望聚成的類別數量,更進一步需要給出的起始的聚類中心和迭代次數上限。

這些引數在後續測試中會經過多次調整,很少有一次測試成功的情況,因此請做好心理準備。

  • 載入演算法與測試結果

演算法跑完之後,要根據演算法的輸出結果來確定該演算法是否能夠解決問題,比如K-means的結果不好,那麼考慮換成系統聚類演算法來解決。或者回歸模型輸出的結果不滿足需求,考慮用時間序列來做。

如果不需要換演算法,那麼就測試一下演算法輸出的結果是否有提升空間,比如聚類演算法中指定聚類結果包含4類人群,但發現其中的兩類特徵很接近,或者某一類人群沒有明顯特徵,那麼可以調整引數後再試。

在不斷的調整引數,優化模型過程中,模型的解釋能力和實用性會不斷的提升。當你認為模型已經能夠滿足目標需求了,那就可以輸出結果了。一個報告,一些規則,一段程式碼,都可能成為模型的輸出。在輸出之後,還有最後一步:接收業務人員的反饋,看看模型是否解決了他們的問題,如果沒有,回到第一步,再來一次吧少年……

以上,就是建模的一般過程。如果你有些地方覺得比較生澀,難以理解,也沒有關係。下一篇專欄中,我將向你們介紹一個具體的資料模型,我會對建模的過程一步步進行拆解,力求簡明易懂。

第二部分:資料建模的應用

我寫了個建模的流程,有過建模經驗的人自然懂,沒有經驗的各位也不要著急,這次我以一個真實模型為例,給大家詳細講述建模的各個步驟。照例,先上流程圖:

大家可以看到,這個圖是由我之前文章中的兩張圖拼合而來,而我今天講的這個真實模型,將把圖中所有的流程都走一遍,保證一個步驟都不漏。

Step 0:專案背景

話說這個專案跟我加入百度有直接關係……

2013年的最後一天,我結束了在三亞的假期,準備坐飛機回家,這時候接到一個知乎私信,問我對百度的一個數據科學家(其實就是資料分析師啦)職位是否感興趣,我立刻回信,定了元旦假期以後去面試。兩輪面試過後,面試官——也是我加入百度後的直屬Leader——打電話給我,說他們對我的經歷很滿意,但是需要我給他們一份能體現建模能力的報告。

按說這也不是一件難事,但我翻了翻電腦後發現一個問題:我從上家公司離職時,為了裝13,一份跟建模相關的報告檔案都沒帶……最後雙方商定,我有一個星期時間來做一份報告,這份報告決定了我是否能加入百度。

那麼,是時候展示我的技術了!我的回合,抽卡!

Step 1:目標確定

看看報告的要求:

資料最好是通過抓取得來,需要用到至少一種(除描述統計以外)的建模技術,最好有資料視覺化的展示

看來是道開放題,那麼自然要選擇一個我比較熟悉的領域,因此我選擇了……《二手主機遊戲交易論壇使用者行為分析》

為啥選這個呢?你們看了我那麼多的Mario圖,自然知道我會選主機遊戲領域,但為什麼是二手?這要說到我待在國企的最後半年,那時候我一個月忙三天,剩下基本沒事幹,因此泡在論壇上倒賣了一段時間的二手遊戲……

咳咳……總之,目標就確定了:分析某二手主機遊戲交易論壇上的帖子,從中得出其使用者行為的描述,為使用者進行分類,輸出洞察報告。

Step 2:資料獲取

簡單來說,就是用python寫了個定向爬蟲,抓了某個著名遊戲論壇的二手區所有的發帖資訊,包括帖子內容、發帖人資訊等,基本上就是長這個樣子:

(打碼方式比較簡單粗暴,請湊合看吧……)

Step 3:資料清洗

這個模型中的資料清洗,主要是洗掉帖子中的無效資訊,包括以下兩類:

1、論壇由於其特殊性,很多人成交後會把帖子改成《已出》等標題,這一類資料需要刪除:

2、有一部分人用直接貼圖的方式放求購資訊,這部分體現為只抓到圖片連結,需要刪除。

資料清洗結束了麼?其實並沒有,後邊會再進行一輪清洗……不過到時再說。

Step 4:資料整理

用上面的那些帖子資料其實是跑不出啥結果的,我們需要把資料整理成可以進一步分析的格式。

首先,我們給每條帖子打標籤,標籤分為三類:行為型別(買 OR 賣 OR 換),目標廠商(微軟 OR 索尼 OR 任天堂),目標物件(主機 OR 遊戲軟體)。打標籤模式是”符合關鍵詞—打相應標籤“的方法,關鍵詞表樣例如下:

(主機掌機那個標籤後來我在實際操作時沒有使用)

打完標籤之後,會發現有很多帖子沒有打上標籤,原因有兩種:一是關鍵詞沒有涵蓋所有的產品表述(比如三公主這種暱稱),二是有一部分人發的帖子跟買賣遊戲無關……

這讓人怎麼玩……第二次資料清洗開始,把這部分帖子也洗掉吧。

其次,我們用發帖使用者作為視角,輸出一份使用者的統計表格,裡邊包含每個使用者的發帖數、求購次數、出售次數、交換次數、每一類主機/遊戲的行為次數等等,作為後續搭建使用者分析模型之用。表格大概長這個樣子:

之後這個表的列數會越來越多,因為資料重構的工作都在此表中進行。

整理之後,我們準備進行描述統計。

Step 5 & 6:描述統計 & 洞察結論

描述統計在這個專案中的意義在於,描述這一社群的二手遊戲及主機市場的基本情況,為後續使用者模型的建立提供基礎資訊。

具體如何進行統計就不說了,直接放成品圖,分別是從各主機市場份額、使用者相互轉化情況、地域分佈情況進行的洞察。

Step 7 & 8:選擇變數 & 選擇演算法

因為我要研究的是這些使用者與二手交易相關的行為,因此初步選擇變數為發帖數量、微軟主機擁有臺數、索尼主機擁有臺數、任天堂主機擁有臺數。

演算法上面,我們的目標是將使用者分群,因此選擇聚類,方法選擇最簡單的K-means演算法。

Step 9 & 10:設定引數 & 載入演算法

K-means演算法除了輸入變數以外,還需要設定聚類數,我們先拍腦袋聚個五類吧!

(別笑,實際操作中很多初始引數都是靠拍腦袋得來的,要通過結果來逐步優化)

看看結果:

第一類別的使用者數跟總體已經很接近了,完全沒有區分度啊!

Step 7‘ & 8’ & 9‘ & 10’ & 11:選擇變數 & 選擇演算法 &設定引數 & 載入演算法 &重構變數

這一節你看標題都這麼長……

既然我們用原始值來聚類的結果不太好,那麼我把原始值重構成若干檔次,比如發帖1-10的轉換為1,10-50的轉換為2,依次類推,再聚一次看看結果。

哦哦!看上去有那麼點意思了!不過有一類的數量還是有一點少,我們聚成四類試試:

哦哦,完美! 我們運氣不錯,一次變數重構就輸出了一個看上去還可以的模型結果,接下來去測試一下吧。

Step 12:結果測試

測試過程中,很重要的一步是要看模型的可解釋性,如果可解釋性較差,那麼打回重做……

接下來,我們看看每一類的統計資料:

這個表出來以後,基本上可以對我們聚類結果中的每一類人群進行解讀了。結果測試通過!

Step 13 & 14 & 15:輸出規則 & 模型載入 & 報告撰寫

這個模型不用回朔到系統中,因為僅僅是一個我們用來研究的模型而已。因此,輸出規則和模型載入兩步可以跳過,直接進入報告撰寫。

聚類模型的結果可歸結為下圖:

眼熟不?在我的第二篇專欄文章第一份資料報告的誕生 – 一個數據分析師的自我修養  中,我用這張圖來說明了洞察結論的重要性,現在你們應該知道這張圖是如何得來的了。

撰寫報告的另外一部分,在描述統計-洞察結論的過程中已經提到了,把兩部分放在一次,加上背景、研究方法等內容,就是完整的報告啦!

最後附送幾張各類使用者發帖內容中的關鍵詞詞雲圖:

那麼,這篇文章就到此結束了,最後的最後,公佈一下我做這份報告用到的工具:

大家可以看到,要當一個數據分析師,要用到很多類別的工具,多學一點總是沒有壞處的,在此與大家共勉。