不少人說,數據準備工做真是個「體力活」,耗時耗力不說,還異常的枯燥無味。建模以前的數據處理確實是平淡的,它每每不須要多高的智商,多牛的編程技巧,多麼高大上的統計模型。可是,它卻能時時觸發你的興奮點,由於它須要足夠的耐心和細心,稍不留神就前功盡棄。在此次的內容裏,我首先會從「數據理解」、「變量類型」和「質量檢查」三個方面進行闡述,而後會以一個本身作過的實際數據爲例進行展現。ios
1、數據理解程序員
拿到數據後要作的第一步就是理解數據。什麼是理解數據呢?不是簡單看下有多少Excel表,有多少行,多少列,而是要結合本身的分析目標,帶着具體的業務需求去看。面試
首先,咱們須要明確數據記錄的詳細程度,比方說某個網站的訪問量數據是以每小時爲單位仍是天天爲單位;一份銷售數據記錄的是每家門店的銷售額仍是每一個地區的總銷售額。算法
其次,咱們須要肯定研究羣體。研究羣體的肯定必定和業務目標是密切相關的。比方說,若是咱們想研究用戶對產品的滿意度與哪些因素有關,就應該把購買該產品的全部客戶做爲研究羣體;若是咱們想研究用戶的購買行爲受哪些因素影響,就應該同時考察購買人羣和非購買人羣,在兩類人羣的對比中尋找關鍵因素。數據庫
研究羣體的肯定有時也和數據的詳細程度有關。好比咱們想研究「觀衆影評」對「電影票房」的影響,咱們既能夠把「每部電影」當作一個個體,研究「影評總數」對「電影總票房」的影響,也能夠把「每部電影天天的票房」當作一個個體,研究「天天的影評數」對「天天的電影票房」的影響。具體選擇哪種取決於咱們手上有什麼樣的數據,若是隻有總票房和總影評數的數據,那咱們只能選擇第一種;若是有更詳細的數據,那就能夠考慮第二種方案。編程
須要注意的是,這兩種方案還會影響咱們對於模型的選擇。例如,若是研究「天天的影評數」對「天天電影票房」的影響,那每部電影又被細分爲數日,同一部電影不一樣時間的票房會有較高的類似性,這就造成了一種層次結構,能夠考慮使用層次模型(hierarchical model)進行分析。網絡
最後,當咱們肯定了研究目標和研究羣體後,咱們須要逐一理解每一個變量的含義。有些變量和業務目標明顯無關,能夠直接從研究中剔除。有些變量雖然有意義,可是在所有樣本上取值都同樣,這樣的變量就是冗餘變量,也須要從研究中剔除。還有一些變量具備重複的含義,如「省份名稱」和「省份簡稱」,這時只須要保留一個就能夠了。分佈式
2、變量類型學習
全部變量按其測量尺度能夠分紅兩大類,一類是「分類變量」,一類是「數值變量」。不一樣類型的變量在處理方法和後期的模型選擇上會有顯著差異。大數據
【分類變量】
分類變量又稱屬性變量或離散變量,它的取值每每用有限的幾個類別名稱就能夠表示了,例如「性別」,「教育程度」,「收入水平」,「星期幾」等。細分的話,分類變量又可分爲兩類,一類是「名義變量」,即各個類別間沒有順序和程度的差異,就像「手機系統」中ios和安卓並無明顯的好壞差異,「電影類型」中「動做片」和「科幻片」也都是同樣的,說不上哪一個更好或更差。另一類是定序變量,即不一樣類別之間存在有意義的排序,如「空氣污染程度」能夠用「差、良、優」來表示、「教育程度」能夠用「小學、初中、高中、大學」來表示。
當研究的因變量是分類變量時,每每對應特定的分析方法,咱們在後面的章節會陸續講到,這裏暫且不談。當研究中的自變量是分類變量時,也會限制模型選擇的範圍。有些數據挖掘模型能夠直接處理分類自變量,如決策樹模型;但不少數據挖掘模型不能直接處理分類自變量,如線性迴歸、神經網絡等,所以須要將分類變量轉換成數值變量。
對於定序自變量,最經常使用的轉換方法就是按照類別程度將其直接轉換成數值自變量,例如將空氣污染程度 「差、良、優」轉換爲「1,2,3」。
對於名義自變量,最經常使用的轉換方法就是構造0-1型啞變量。例如,對於「性別」,能夠定義「1=男,0=女」。當某個名義變量有K個類別取值時,則須要構造K-1個啞變量。例如教育程度「小學,初中,高中,大學及以上」,能夠構造三個啞變量分別爲:x1:1=小學,0=其它;x2:1=初中,0=其它;x3:1=高中,0=其它。當x1,x2,x3三個啞變量取值都爲0時,則對應着「大學及以上」。
須要注意的是,有時候名義變量的取值太多,會生成太多的啞變量,這很容易形成模型的過分擬合。這時能夠考慮只把觀測比較多的幾個類別單獨拿出來,而把剩下全部的類別都歸爲「其它」。例如,中國一共包含56個民族,若是每一個民族都生成一個啞變量就會有55個,這時咱們能夠只考慮設置「是否爲漢族」這一個0-1啞變量。歡迎加入大數據學習交流分享羣: 658558542 一塊兒吹水交流學習(☛點擊便可加入羣聊)
【數值變量】
咱們再來看看數值變量。數值變量就是用數值描述,而且能夠直接進行代數運算的變量,如「銷售收入」、「固定資本」、「評論總數」、「訪問量」、「學生成績」等等都是數值變量。
須要注意的是,用數值表示的變量不必定就是數值型變量,只有在代數運算下有意義的變量纔是數值型變量。例如財務報表的年份,上市時間等,雖然也是用數值表示的,但咱們一般不將它們按照數值型變量來處理。
上面咱們講到,分類變量一般要轉換成數值型變量,其實有些時候,數值型變量也須要轉換成分類變量,這就用到了「數據分箱」的方法。爲何要進行數據分箱呢?一般有如下幾個緣由:
1. 數據的測量可能存在必定偏差,沒有那麼準確,所以按照取值範圍轉換成不一樣類別是一個有效的平滑方法;
2.有些算法,如決策樹模型,雖然能夠處理數值型變量,可是當該變量有大量不重複的取值時,使用大於、小於、等於這些運算符時會考慮不少的狀況,所以效率會很低,數據分箱的方法能很好的提升算法效率;
3.有些模型算法只能處理分類型自變量(如關聯規則),所以也須要將數值變量進行分箱處理。
數據分箱後,可使用每一個分箱內的均值、中位數、臨界值等做爲這個類別的表明值,也能夠直接將不一樣取值範圍定義成不一樣的類別,如:將污染程度劃分後定義爲「低、中、高」等。
那如何進行數據分箱呢?經常使用的數據分箱的方法有:等寬分箱(將變量的取值範圍劃分紅等寬的幾個區間)、等頻分箱(按照變量取值的分位數進行劃分)、基於k均值聚類的分箱(將全部數據進行k均值聚類,所得的不一樣類別即爲不一樣的分箱),還有一些有監督分箱方法,如:使分箱後的結果達到最小熵或最小描述長度等。這裏不詳細介紹了,有興趣的童鞋能夠自行百度。
3、質量檢查
對數據中的各個變量有了初步瞭解後,咱們還須要對數據進行嚴格的質量檢查,若是數據質量不過關,還須要進行數據的清洗或修補工做。通常來講,質量檢查包括檢查每一個變量的缺失程度以及取值範圍的合理性。
【缺失檢查】
原始數據中常常會存在各類各樣的缺失現象。有些指標的缺失是合理的,例如顧客只有使用過某個產品才能對這個產品的滿意度進行評價,一筆貸款的抵押物中只有存在房地產,纔會記錄相應的房地產的價值狀況等。像這種容許缺失的變量是最難搞的,由於咱們很難判斷它的缺失是合理的,仍是因爲漏報形成的。
但不管哪一種狀況,若是變量的缺失率太高,都會影響數據的總體質量,由於數據所反映的信息實在太少,很難從中挖掘到有用的東西。
對於不容許缺失的變量來講,若是存在缺失狀況,就必須進行相應的處理。若是一個變量的缺失程度很是大,比方說達到了70%,那就考慮直接踢掉吧,估計沒救了。若是缺失比例還能夠接受的話,能夠嘗試用缺失值插補的方法進行補救。
插補的目的是使插補值能最大可能的接近其真實的取值,因此若是能夠從其餘途徑獲得變量的真實值,那必定優先選擇這種方法。好比某個公司的財務信息中缺失了「最終控制人類型」和「是否國家控股」這兩個取值,這些能夠經過網上的公開信息獲得真實值;再好比缺失了「淨利潤率」這個指標的取值,可是卻有「淨利潤」和「總收入」的取值,那就能夠經過變量間的關係獲得相應的缺失值,即淨利潤率=淨利潤/總收入。
固然,更多的時候,咱們沒法獲得缺失值的真實信息,這時就只能借用已有的數據來進行插補了。對數值變量來講,能夠用已觀測值的均值、中位數來插補缺失值;對分類型變量來講,能夠用已觀測數據中出現比例最高的類別取值來進行插補。這些方法操做起來很是簡單,但它們都是對全部缺失值賦予了相同的取值,因此當缺失比例較大時,可能會扭曲被插補變量與其他變量的關係。
更復雜一點的,咱們能夠選擇模型插補方法,即針對被插補變量和其它自變量之間的關係創建統計模型(如迴歸、決策樹等),將模型預測值做爲插補值。
如何處理缺失值是一個很大的研究課題,咱們這裏只是介紹了最簡單可行的方法,有興趣的讀者能夠參閱Little和Rubin 2002年的專著「Statistical Analysis with Missing Data」。歡迎加入大數據學習交流分享羣: 658558542 一塊兒吹水交流學習(☛點擊便可加入羣聊)
【變量取值合理性檢查】
除了缺失外,咱們還要考察每一個變量的取值合理性。每一個變量都會有本身的取值範圍,好比「用戶訪問量」、「下載次數」必定是非負的,「投資收益率」必定在0~1之間。經過判斷變量的取值是否超出它應有的取值範圍,能夠簡單的對異常值進行甄別。
除了根據變量的取值範圍來檢查變量質量外,還能夠根據變量之間的相互關係進行判斷。例如一家公司的「淨利潤率」不該該大於「總利潤率」等。只有經過了各個方面檢測的數據纔是一份高質量的數據,纔有可能帶來有價值的模型結果。
4、實例分析——電影票房分析
最後,咱們給出一個實例分析。在這個例子中,咱們的目標是研究電影哪些方面的特徵對電影票房有影響。
咱們有兩方面的數據,一是描述電影特徵的數據,二是描述電影票房的數據。因爲咱們關注的是北美的票房市場,因此描述電影特徵的數據能夠從IMDB網站獲得,它是一個關於演員、電影、電視節目、電視明星和電影製做的在線數據庫,裏面能夠找到每部上映電影的衆多信息;電影天天的票房數據能夠從美國權威的票房網站Box Office Mojo獲得,上面記錄了每部電影上映期間內天天的票房數據。
咱們將從IMDB獲得的數據放到「movieinfor.csv」文件中,將從Box Office Mojo中獲得的數據放到「boxoffice.csv」文件中。這裏,咱們以2012年北美票房市場最高的前100部電影爲例進行講解。下表給出了這兩個數據集中包含的全部變量以及相應的解釋。
兩個數據集中包含的全部變量以及相應的解釋
在這兩個數據中,movieinfor.csv數據的記錄是精確到每部電影的,而boxoffice.csv數據精確到了每部電影中天天的票房數據,是精確到天的。上表中給出的變量中,除了電影名稱和ID外,「電影類型」「MPAA評級」(美國電影協會對電影的評級)和「星期幾」是分類型變量;「放映時長」、「製做預算」、「電影天天的票房」和「天天放映的影院數」是數值型變量。兩份數據都不存在缺失值。
咱們首先對兩個數據集分別進行變量預處理,而後再根據電影ID將兩個數據整合到一塊兒。下面給出了每一個變量的處理方法:
【電影類型】
電影類型是一個分類變量。在這個變量中咱們發現每部電影都不止一個類型,例如「The Dark Knight Rises」這部電影就有「Action」、「Crime」和「Thriller」三個類型,而且它們以「|」爲分隔符寫在了一塊兒。同時,不一樣電影之間可能有相同的類型,也可能有不一樣的類型,例如票房排名第二的電影「Skyfall」,它的類型是「Action |Adventure |Thriller」。所以,咱們首先須要作的是把每部電影所屬的類型逐一取出來,而後將全部出現過的類型分別造成一個0-1啞變量,若是這部電影在某個類型上出現了,則相應變量的取值就是1,不然是0.
經過上面一步,咱們知道這個數據集中出現過的全部電影類型一共有11個。那是否是按照以前所講的,應該把它轉換爲10個啞變量呢?這裏須要注意的是,全部的電影類型之間並非互斥的(即有了action,就不能有其餘的類型),因此咱們無需由於共線性的緣由去掉其中一個。也就是說,若是把每個電影類型單獨做爲一個獨立的變量,能夠衍生出11個新的0-1變量,這徹底沒有問題。但11個變量未免有點過多,因此咱們根據不一樣電影類型的頻數分佈狀況,只把出現次數明顯較多的類型單獨拿出來,最終生成了6個0-1型變量,分別爲Adventure,Fantasy,Comedy,Action,Animation,Others。
【MPAA評級】
對於這個分類型變量,咱們首先能夠看一下數據中它所包含的所有取值,發現一共有「PG」,「PG-13」和「R」三個。和上面的電影類型(Genre)不一樣,對於一部電影而言,它只能有一個MPAA取值。所以,在MPAA變量中,咱們須要選擇一個做爲基準,將另外兩個構形成啞變量。例如,咱們以「PG」爲基準,構造的兩個啞變量分別爲PG13和R,若是這兩個啞變量的取值同時爲0,那就至關於電影的MPAA評級是PG。
【放映當天是星期幾】
這個變量同MPAA評級同樣,每部電影只能有一個取值。若是它在星期一到星期日上都有取值的話,咱們能夠衍生出6個0-1型啞變量。由於這裏咱們更關注週末和非週末對電影票房的影響,而並不關注具體是哪一天,因此咱們將其進一步歸納成一個變量,即「是不是週末」。
【放映時長和製做預算】
放映時長和製做預算這兩個變量都是取值大於0的數值型變量,咱們能夠分別檢查它們的取值是否在合理的範圍內,而後直接保留它們的數值信息。同時,對「製做預算」而言,假設咱們這裏關心的不是製做預算的具體數值,而是「小成本電影」和「大成本電影」的票房差別,那咱們就能夠將這個數值型變量進行分箱處理,轉換爲一個0-1型的分類變量,即 「是否爲小成本電影」。在決定按照什麼標準來劃分是否爲小成本電影時,咱們根據以前文獻裏的研究結果,將製做預算在100 million如下的電影當作是小成本電影。
上述全部變量的處理過程均可以使用R中最基本的語句(table,rep,which等)完成,因爲篇幅限制,小編這裏就不列出詳細的code了,你們感興趣的話,能夠閱讀狗熊會的「R語千尋」系列(戳這裏),相信會在R語言的學習上受到更多啓發。最後,咱們將全部新生成的變量按照電影ID整合到一塊兒,就大功告成啦。
5、總結
最後總結一下,小編在此次內容中向你們介紹了拿到數據後的數據理解和預處理工做,內容雖然不難,但一樣須要咱們認真對待。就好像生活同樣,只有踏踏實實走好前面的路,纔有可能迎接後面的高潮迭起!
結語
感謝您的觀看,若有不足之處,歡迎批評指正。
若是有對大數據感興趣的小夥伴或者是從事大數據的老司機能夠加羣:
658558542 (☛點擊便可加入羣聊)
裏面整理了一大份學習資料,全都是些乾貨,包括大數據技術入門,海量數據高級分析語言,海量數據存儲分佈式存儲,以及海量數據分析分佈式計算等部分,送給每一位大數據小夥伴,這裏不止是小白彙集地,還有大牛在線解答!歡迎初學和進階中的小夥伴一塊兒進羣學習交流,共同進步!
最後祝福全部遇到瓶頸的大數據程序員們突破本身,祝福你們在日後的工做與面試中一切順利。