先複習一下前幾天,我們學習了數據分析的框架:
今天我們開始對框架進行詳細的拆解:
今天首先給大家介紹一下數據分析前的準備工作,一共分為四部分:首先是對問題的分析,其次是數據的收集,然後是數據的預處理,最後是數據的預分析。
首先是對問題的分析:
對問題的分析不是今天想要說的重點,但是為了框架的完整性,今天做一些簡單的介紹。關於對問題本身的分析,人類的知識體系在這方面沉澱了大量的智慧和經驗。
其中尤其是以維根斯坦的語言哲學分析,還有諾貝爾獎得主西蒙的滿意決策論,還有大量關於宗教哲學政治關於標準和價值觀方面探討的積累。任何一個緯度的敘述,都有可能會窮盡一個人一生的經歷。所以今天只能點到為止,簡單給大家做一個介紹。
關於問題的提出
首先是關於問題的提出。
問題的提出可能來自老闆,也可能來自同事。關於公司人際關係的分析,不是我們探討的重點。當然這一點在實際工作中尤其重要,因為每個人的精力都是有限的,然而每個人面對的任務其實是無限的,我們必須有選擇的去完成一些對我們同時對公司重要的項目。
我們首先來看一下,當我們面對一個提出的問題的時候,我們是在提問什麼?
在大多數時候都覺得當我們需要去解決一個問題的時候,我們需要創造性的提供一種解決方案,實際情況可能和我們的常識不是很一樣。
我們可以想像這樣一種情景:
通常認為,在回答一個問題之前,你必須提出那個問題。或者,換個比喻的說法,要找的東西必須是已經丟失的東西。但這是不是真的呢?當一個人發現了一個金礦脈時,是不是大自然丟失了這個金礦脈呢?如果我們能找到我們不曾丟失的金子,我們就有可能回答我們未曾問過的問題。
現實工作中,我們很多時候當面對一個問題的時候,我們往往需要自己尋找一個解決方案,而不是去創造一個解決方法,所以我們工作的重點應該是怎麼去和我們已有的積累形成聯繫,或者用更加數學化的語言描述說。怎麼將現實問題映射到我們的模型空間中去,這應該是我們的工作重點。
關於問題種類的分析
有問題種類的分析,我們先來看一下我們為什麼要分析一個問題的種類。現實中我們面臨的實際問題,它的表達形式可能是千變萬化的。然而我們資源是有限的,又不能為每一種問題都去積累經驗,都去建立模型。我們只能為一些包含重要特徵的問題,去建立模型空間。
所以當我們面臨一個問題的時候,首先應該去看一下這個問題,它本質上在說什麼,它的標準形式是什麼樣的。
這個過程中,我們首先要做的第一步需要剝離自然語言。這一點比較容易理解,我們平時在說話的過程中,語言中有很多冗餘的成分。我們首先要做的就是把這些冗餘的成分刪除掉,其次是把我們一些似是而非的名詞替換成我們的標準名詞。經過對自然語言的整理之後,我們更容易發現一個問題的本質。
舉個例子:可能大家會更加明白,比如:甲方爸爸給了這樣一個需求:俺們公司最近遇到了一件特別鬧心的事情,一舉辦活動,活躍用戶就少很多,我們很著急,你們快來幫我們看看巴拉巴拉。以上這段話轉化一下就是: 舉辦活動 和 活躍用戶的相關性分析。
用集合的語言和系統泡泡圖,去重新描述問題。去把一個在複雜現實情景中的問題,轉化為若干研究對象和這些研究對象之間的關係的問題。
當工作進行到這一步的時候,我們就已經已經可以清晰的看出一個問題說出的類別了。 一般在世界上所有的問題都大概可以分為三類:
首先是一類探索是什麼的問題,也就是關於一些科學性的問題。這一類問題的核心特徵是科學研究中對準確率要求非常高,一般要達到99.7%以上。在工作中,要求可能並不需要這麼高。還有一類問題是關於為什麼的問題,也就是關於一些價值評價標準的問題。日常所說的宗教哲學政治探討的問題,都屬於這個範疇。這個問題的特徵是特別講究多遠,從本質上來看,各個價值觀之間它們是沒有可比性的。然而這只是理論上的,實際生活中還是會看到很多大家因為不同價值觀真的面紅耳赤的情況,這一類問題在研究過程中非常體現的是組織的價值觀,還有上級的價值觀。還有一個問題是關於怎麼辦的問題,這一類問題本質上是屬於一類工程問題。在這類問題中我們要注意的是,我們並不是像求解第一類是什麼問題,要追求極高的準確率,我們追求的是在資源有限的情況下,我們如何把一件事情做到流暢,也就是60分到80分的樣子。也就是說在大多數的時候,我們求解的不是最優解,我們求解的僅僅是一個滿意解而已。 現實生活中我遇到遇到的本質性的三類問題,其他任何問題都可以轉化為這三類問題,或者轉化為這三類問題的組合。這三類問題在模型空間裡也有標準的對應形式,價值觀的探索問題,本質是一類標記或者分類問題。關於是什麼的探索問題,往往是一類預測相關性的問題。 關於怎麼辦一類的工程問題,本質上是一類關於過程描述模型和概率描述模型的問題。
對問題邊界的邊界分析
對問題的邊界分析就是我們這個問題解決之後,最好可以達到什麼樣的效果,如果問題沒有能夠解決,最壞的結果是什麼樣的。
為什麼我們要對問題進行邊界分析?因為我們工作中,面臨的大多數問題,都是在給定限制條件下尋求滿意解,因為給定了資源限制,也給定了我們能力的邊界。
從更深層次上來看,一個工程問題優化的空間永遠都是有限的。
為什麼呢?
因為從本質上來看首先對問題的測量就有很大誤差,然後圖靈機限制/哥德爾不完備定理/摩爾定律這些底層規律都對工程問題的優化做了邊界上的限定。所以,千萬不能以科學的態度和方法對待工程問題.。
那麼我們如何對問題進行邊界分析呢?這裡給出一個參考思路,我們工作中往往面臨來自三方面的限制:時間/質量/成本;我麼可以選擇一個必須達到要求的,然後去調節另外倆者的關係。
比如:我們現在要在放假之前,完成集中周作業/考試/談戀愛等等若干項目,我們先抓住主要因素:時間,必須在放假之前完成,然後就是質量和成本的關係,成本方面可以削減項目,比如相比交作業和考試,戀愛就可以先不談了,質量方面,追求中等質量,作業不返圖,考試不掛科就可以.
數據的收集:
數據收集分為內部數據讀取和外部數據收集倆部分,今天主要談內部數據讀取的問題。
內部數據收集
1. 資料庫種類
關係型資料庫,是指採用了關係模型來組織數據的資料庫。關係模型是在1970年由IBM的研究員E.F.Codd博士首先提出的,在之後的幾十年中,關係模型的概念得到了充分的發展並逐漸成為主流資料庫結構的主流模型。
簡單來說,關係模型指的就是二維表格模型,而一個關係型資料庫就是由二維表及其之間的聯繫所組成的一個數據組織。
關係型資料庫的最大特點就是事務的一致性:傳統的關係型資料庫讀寫操作都是事務的,具有ACID的特點,這個特性使得關係型資料庫可以用於幾乎所有對一致性有要求的系統中,如典型的銀行系統。
但是,在網頁應用中,尤其是SNS應用中,一致性卻不是顯得那麼重要,用戶A看到的內容和用戶B看到同一用戶C內容更新不一致是可以容忍的。或者說,兩個人看到同一好友的數據更新的時間差那麼幾秒是可以容忍的。因此,關係型資料庫的最大特點在這裡已經無用武之地,起碼不是那麼重要了。
相反地,關係型資料庫為了維護一致性所付出的巨大代價就是其讀寫性能比較差,而像微博、facebook這類SNS的應用,對並發讀寫能力要求極高,關係型資料庫已經無法應付(在讀方面,傳統上為了克服關係型資料庫缺陷,提高性能,都是增加一級memcache來靜態化網頁。
而在SNS中,變化太快,memchache已經無能為力了),因此,必須用新的一種數據結構存儲來代替關係資料庫。
關係資料庫的另一個特點就是其具有固定的表結構,因此,其擴展性極差,而在SNS中,系統的升級,功能的增加,往往意味著數據結構巨大變動,這一點關係型資料庫也難以應付,需要新的結構化數據存儲。
於是,非關係型資料庫應運而生,由於不可能用一種數據結構化存儲應付所有的新的需求。因此,非關係型資料庫嚴格上不是一種資料庫,應該是一種數據結構化存儲方法的集合。必須強調的是,數據的持久存儲,尤其是海量數據的持久存儲,還是需要一種關係資料庫這員老將。
2. 資料庫讀取工具
SQL概述
結構化查詢語言(Structured Query Language)簡稱SQL(發音:/es kju el/ 「S-Q-L」),是一種特殊目的的程式語言,是一種資料庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關係資料庫系統,同時也是資料庫腳本文件的擴展名。
結構化查詢語言是高級的非過程化程式語言,允許用戶在高層數據結構上工作。它不要求用戶指定對數據的存放方法,也不需要用戶了解具體的數據存放方式,所以具有完全不同底層結構的不同資料庫系統, 可以使用相同的結構化查詢語言作為數據輸入與管理的接口。結構化查詢語言語句可以嵌套,這使它具有極大的靈活性和強大的功能。
SQL語法總結:
(選擇全部)SELECT * from celebs;(創建表格)CREATE TABLE celebs (id INTEGER, name TEXT, age INTEGER); (插入行數據)INSERT INTO celebs (id, name, age) VALUES (1, 『Justin Bieber』, 21);(選擇某列)SELECT name FROM celebs;(更新信息)UPDATE celebs SET age = 22 WHERE id =1;(添加表列)ALTER TABLE celebs ADD COLUMN twitterhandle TEXT;(處理缺失值)DELETE FROM celebs WHERE twitterhandle IS NULL;(多變量篩選)SELECT name ,imdbrating FROM movies;(唯一篩選)SELECT DISTINCT genre FROM movies;(條件匹配)SELECT * FROM movies WHERE imdbrating > 8;(文本部分匹配單)SELECT * FROM movies WHERE name LIKE 『Seen』;(文本部分匹配多)SELECT * FROM movies WHERE name LIKE 『a%』 ;(範圍內的數據)SELECT * FROM movies WHERE name BETWEEN 『A』 AND 『J』;(與條件選擇)SELECT * FROM movies WHERE year BETWEEN 1990 AND 2000 AND genre = 『comedy』;(或條件選擇)SELECT * FROM movies WHERE genre = 『comedy』 OR year < 1980;(排序)SELECT * FROM movies ORDER BY imdbrating DESC;(選取前幾個)SELECT * FROM movies ORDER BY imdbrating ASC LIMIT 3;(計數)SELECT COUNT(* ) FROM fakeapps;(條件計數) SELECT COUNT(* ) FROM fakeapps WHERE price = 0;(分組計數)SELECT price ,COUNT(*) FROM fakeapps GROUP BY price;等等等。hive概述
Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張資料庫表,並提供完整的sql查詢功能,可以將sql語句轉換為MapReduce任務進行運行。其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析。
Hvie是建立在Hadoop上的數據倉庫基礎架構。它提供了一系列的工具,可以用來進行數據提取轉化加載(ETL),這是一種可以存儲、查詢和分析存儲在Hadoop中的大規模數據的機制。
Hive定義了簡單的類SQL查詢語句,稱為HQL,它允許熟悉SQL的用戶查詢數據。同時,這個語言也允許熟悉MapReduce開發者的開發自定義的mapper和reducer來處理內建的mapper和reducer無法完成的複雜的分析工作。
由於Hive採用了SQL的查詢語言HQL,因此很容易將Hive理解為資料庫。其實從結構上來看,Hive和資料庫除了擁有類似的查詢語言,再無類似之處。
本文將從多個方面來闡述Hive和資料庫的差異,資料庫可以用在Online的應用中,但是Hive是為數據倉庫而設計的,清楚這一點,有助於從應用角度理解Hive的特性。傳統資料庫都使用的SQL語句,而Hive使用的是HQL語句,在大部分情況下其增刪改查的語句都是類似的。因此廣義上而言,學會了SQL語句的語法也就學會了HQL語句。
外部數據收集
外部數據的收集往往作為我們數據收集的補充,對於我們對問題獲得一個外部性的概括認知有一定幫助。
優秀數據源:
國家數據 - http://data.stats.gov.cn/index.htmCEIC - http://www.ceicdata.com/zh-hanswind(萬得)- http://www.wind.com.cn/搜數網 - http://www.soshoo.com/中國統計信息網 - http://www.tjcn.org/亞馬遜aws - http://aws.amazon.com/cn/datasets/?nc1=h_ls 來自亞馬遜的跨科學雲數據平臺,包含化學、生物、經濟等多個領域的數據集。figshare - https://figshare.com/ 研究成果共享平臺,在這裡你會發現來自世界的大牛們的研究成果分享,同時get其中的研究數據,內容很有啟發性,網站頗具設計感。github - https://github.com/caesar0301/awesome-public-datasets 如果覺得前面的數據源還不夠,github上的大神已經為大家整理好了一個非常全面的數據獲取渠道,包含各個細分領域的資料庫資源,自然科學和社會科學的覆蓋都很全面,簡直是做研究和數據分析的利器。數據的預處理(數據清洗):
數據清洗(Data cleaning)– 對數據進行重新審查和校驗的過程,目的在於刪除重複信息、糾正存在的錯誤,並提供數據一致性。
主要有三種類型:
(1)殘缺數據
這一類數據主要是一些應該有的信息缺失,如供應商的名稱、分公司的名稱、客戶的區域信息缺失、業務系統中主表與明細表不能匹配等。對於這一類數據過濾出來,按缺失的內容分別寫入不同Excel文件向客戶提交,要求在規定的時間內補全。補全後才寫入數據倉庫。
(2)錯誤數據
這一類錯誤產生的原因是業務系統不夠健全,在接收輸入後沒有進行判斷直接寫入後臺資料庫造成的,比如:數值數據輸成全形數字字符、字符串數據後面有一個回車操作、日期格式不正確、日期越界等。
這一類數據也要分類,對於類似於全形字符、數據前後有不可見字符的問題,只能通過寫SQL語句的方式找出來,然後要求客戶在業務系統修正之後抽取。日期格式不正確的或者是日期越界的這一類錯誤會導致ETL運行失敗,這一類錯誤需要去業務系統資料庫用SQL的方式挑出來,交給業務主管部門要求限期修正,修正之後再抽取。
(3)重複數據
對於這一類數據——特別是維表中會出現這種情況——將重複數據記錄的所有欄位導出來,讓客戶確認並整理。 數據清洗是一個反覆的過程,不可能在幾天內完成,只有不斷的發現問題,解決問題。
對於是否過濾,是否修正一般要求客戶確認,對於過濾掉的數據,寫入Excel文件或者將過濾數據寫入數據表,在ETL開發的初期可以每天向業務單位發送過濾數據的郵件,促使他們儘快地修正錯誤,同時也可以做為將來驗證數據的依據。
數據清洗需要注意的是不要將有用的數據過濾掉,對於每個過濾規則認真進行驗證,並要用戶確認。
數據清洗方法
一般來說,數據清理是將資料庫精簡以除去重複記錄,並使剩餘部分轉換成標準可接收格式的過程。數據清理標準模型是將數據輸入到數據清理處理器,通過一系列步驟「 清理」數據,然後以期望的格式輸出清理過的數據(如上圖所示)。
數據清理從數據的準確性、完整性、一致性、惟一性、適時性、有效性幾個方面來處理數據的丟失值、越界值、不一致代碼、重複數據等問題。
數據清理一般針對具體應用,因而難以歸納統一的方法和步驟,但是根據數據不同可以給出相應的數據清理方法。
解決不完整數據( 即值缺失)的方法 大多數情況下,缺失的值必須手工填入( 即手工清理)。當然,某些缺失值可以從本數據源或其它數據源推導出來,這就可以用平均值、最大值、最小值或更為複雜的概率估計代替缺失的值,從而達到清理的目的。錯誤值的檢測及解決方法 用統計分析的方法識別可能的錯誤值或異常值,如偏差分析、識別不遵守分布或回歸方程的值,也可以用簡單規則庫( 常識性規則、業務特定規則等)檢查數據值,或使用不同屬性間的約束、外部的數據來檢測和清理數據。重複記錄的檢測及消除方法 資料庫中屬性值相同的記錄被認為是重複記錄,通過判斷記錄間的屬性值是否相等來檢測記錄是否相等,相等的記錄合併為一條記錄(即合併/清除)。合併/清除是消重的基本方法。不一致性( 數據源內部及數據源之間)的檢測及解決方法 從多數據源集成的數據可能有語義衝突,可定義完整性約束用於檢測不一致性,也可通過分析數據發現聯繫,從而使得數據保持一致。目前開發的數據清理工具大致可分為三類。
數據遷移工具允許指定簡單的轉換規則,如:將字符串gender替換成sex。sex公司的PrismWarehouse是一個流行的工具,就屬於這類。數據清洗工具使用領域特有的知識( 如:郵政地址)對數據作清洗。它們通常採用語法分析和模糊匹配技術完成對多數據源數據的清理。某些工具可以指明源的「 相對清潔程度」,工具Integrity和Trillum屬於這一類。數據審計工具可以通過掃描數據發現規律和聯繫。因此,這類工具可以看作是數據挖掘工具的變形。
數據清洗工具:Python簡介
Python是一種電腦程式設計語言,是一種動態的、面向對象的腳本語言,最初被設計用於編寫自動化腳本(shell),隨著版本的不斷更新和語言新功能的添加,越來越多被用於獨立的、大型項目的開發。
設計者開發時總的指導思想是,對於一個特定的問題,只要有一種最好的方法來解決就好了。這在由Tim Peters寫的Python格言(稱為The Zen of Python)裡面表述為:There should be one– and preferably only one –obvious way to do it. 這正好和Perl語言(另一種功能類似的高級動態語言)的中心思想TMTOWTDI(There’s More Than One Way To Do It)完全相反。
Python的數據清洗實現示:
Python學習的一點心理體會
Python的學習又是一個大的模塊,本質我們其實只是在學習如何使用Python的包而已,新人最容易有畏懼心理:我從來沒學過任何語言,會不會很難?
其實,我們只是把以前用在記憶軟體操作上的時間用在了記憶代碼上,並沒有什麼非常難的問題要解決,我們前期只需要明白輸入/輸出是什麼就可以,至於中間的原理可以後期去學,甚至可以跳過。
我簡單提兩點注意事項:
輸入法配置:搜狗輸入法的英文狀態,記得設置標點為英文.找有源碼的教程:一邊看,一邊打。有源碼很關鍵,因為有一個完全正確的對照,比較容易發現自己錯誤的地方。否則一處代碼錯誤,可能是環境錯誤,可能是語法錯誤,可能是標點錯誤,可能是…..數據的預分析:
數據的描述統計分析:
描述性統計,是指運用制表和分類,圖形以及計算概括性數據來描述數據特徵的各項活動。描述性統計分析要對調查總體所有變量的有關數據進行統計性描述,主要包括數據的頻數分析、集中趨勢分析、離散程度分析、分布以及一些基本的統計圖形。
數據的頻數分析:在數據的預處理部分,利用頻數分析和交叉頻數分析可以檢驗異常值。數據的集中趨勢分析:用來反映數據的一般水平,常用的指標有平均值、中位數和眾數等。數據的離散程度分析:主要是用來反映數據之間的差異程度,常用的指標有方差和標準差。數據的分布:在統計分析中,通常要假設樣本所屬總體的分布屬於正態分布,因此需要用偏度和峰度兩個指標來檢查樣本數據是否符合正態分布。繪製統計圖:用圖形的形式來表達數據,比用文字表達更清晰、更簡明。在SPSS軟體裡,可以很容易地繪製各個變量的統計圖形,包括條形圖、餅圖和折線圖等。
數據的相關性探索分析
數據(data)是事實或觀察的結果,是對客觀事物的邏輯歸納,是用於表示客觀事物的未經加工的的原始素材。數據可以是連續的值,比如聲音、圖像,稱為模擬數據。也可以是離散的,如:符號、文字,稱為數字數據。
數據相關性是指數據之間存在某種關係,如正相關,負相關。 數據相關性是指數據之間存在某種關係。大數據時代,數據相關分析因其具有可以快捷、高效地發現事物間內在關聯的優勢而受到廣泛關注,並有效地應用於推薦系統、商業分析、公共管理、醫療診斷等領域。
數據相關性可以時序分析、空間分析等方法進行分析。數據相關性分析也面對著高維數據、多變量數據、大規模數據、增長性數據及其可計算方面等挑戰。
對於不同測量尺度的變數,有不同的相關係數可用:
Pearson相關係數(Pearson’s r):衡量兩個等距尺度或等比尺度變數之相關性。是最常見的,也是學習統計學時第一個接觸的相關係數。 淨相關(partial correlation):在模型中有多個自變數(或解釋變數)時,去除掉其他自變數的影響,只衡量特定一個自變數與因變數之間的相關性。自變數和因變數皆為連續變數。相關比(correlation ratio):衡量兩個連續變數之相關性。 Gamma相關係數:衡量兩個次序尺度變數之相關性。Spearman等級相關係數:衡量兩個次序尺度變數之相關性。 Kendall等級相關係數(Kendall tau rank correlation coefficient):衡量兩個人為次序尺度變數(原始資料為等距尺度)之相關性。Kendall和諧係數:衡量兩個次序尺度變數之相關性。Phi相關係數(Phi coefficient):衡量兩個真正名目尺度的二分變數之相關性。 列聯相關係數(contingency coefficient):衡量兩個真正名目尺度變數之相關性。四分相關(tetrachoric correlation):衡量兩個人為名目尺度(原始資料為等距尺度)的二分變數之相關性。 Kappa一致性係數(K coefficient of agreement):衡量兩個名目尺度變數之相關性。點二系列相關係數(point-biserial correlation):X變數是真正名目尺度二分變數。Y變數是連續變數。二系列相關係數(biserial correlation):X變數是人為名目尺度二分變數。Y變數是連續變數。
可視化探索分析
數據可視化主要旨在藉助於圖形化手段,清晰有效地傳達與溝通信息。但是,這並不就意味著數據可視化就一定因為要實現其功能用途而令人感到枯燥乏味,或者是為了看上去絢麗多彩而顯得極端複雜。
為了有效地傳達思想概念,美學形式與功能需要齊頭並進,通過直觀地傳達關鍵的方面與特徵,從而實現對於相當稀疏而又複雜的數據集的深入洞察。然而,設計人員往往並不能很好地把握設計與功能之間的平衡,從而創造出華而不實的數據可視化形式,無法達到其主要目的,也就是傳達與溝通信息。
推薦學習網站:博客園/知乎/網易雲課堂/人人都是產品經理社區/GitHub
最後講個小故事:
七十六歲這一年,愛因斯坦因為腹主動脈瘤破裂引起內出血,被送到醫院。這不是什麼疑難雜症,醫生建議馬上手術,但是愛因斯坦拒絕了。
愛因斯坦說:「當我想要離去的時候請讓我離去,一味地延長生命是毫無意義的。我已經完成了我該做的,現在是該離去的時候了,我要優雅地離去。」
希望我們離開這個世界的時候也可以這樣說一句:我要優雅的離去
本文由 @小祁愛數據 原創發布於人人都是產品經理。未經許可,禁止轉載
題圖來自Unsplash,基於CC0協議