數據清洗(一)----- 清洗數據的目的及基本格式、類型與編碼

一、數據清洗的目的

         簡單的來說不乾淨的數據會導致分析過程中的錯誤以及結果的錯誤。舉個簡單的例子,以前我們上學時做柱形圖這種類型的圖時,如果大部分數據集中在某個區間而一兩個數據離得很遠,如果不去除這一兩個有問題的數據,那整體的圖畫出來就會有問題,不能反映數據的情況。

二、數據科學的過程

1. 問題陳述

      清楚的瞭解你要解決的問題是什麼。

2. 數據的收集與存儲

      從哪裏收集數據?收集來的數據在哪裏存放?格式又是什麼?

3. 數據清洗

      簡單的查看一下數據,有哪些地方需要處理?有沒有需要刪除的?有沒有需要轉換的?怎樣調整數據才能適應接下來的分析和挖掘?

4. 數據分析和機器學習

     數據需要進一步進行怎樣的處理?使用什麼樣的算法?運用什麼公式?怎樣的順序?

5. 數據展現和可視化

     數據的處理結果該怎樣呈現出來?採用什麼樣的圖或表能更加直觀的達到說明問題的效果?有沒有更好的可視化方案?有沒有替代方案?

6 問題決議

    第一步中問題的答案究竟是什麼?數據處理的結果還有哪些方面的不足?這個方法能徹底解決問題麼?還有沒有別的辦法?接下來要做的又是什麼?

       其實在處理這些問題時步驟大概按照這六步走,但是劃分也不那麼絕對。比如你在數據收集的時候就可以進行清洗,處理之後還要繼續清洗,等等;步驟有時會有交叉,但最終的目的都是一樣的。

三、記錄數據處理的過程

        認真記錄下曾經按什麼樣的順序處理過什麼樣的事情很有必要,因爲哪怕再小的項目,如果你不記錄,幾個月之後你可能就不知道當時對數據幹了啥,也說不清其中的原由,更談不上重新做一次。

       解決這個問題最好的辦法就是留一份工作日誌。這個日誌應該包含鏈接、屏幕截圖、複製粘貼關鍵的命令、解釋這樣處理原因的關鍵性文字等等。如果你對版本控制系統比較熟的話,可以使用Git或SVN來記錄處理的過程。

四、基礎知識——格式、類型與編碼

1. 文件格式

      在網上收集數據的時候可能會遇到以下幾種情況:

  • 數據可以以文件的形式下載
  • 數據可以通過交互界面訪問,比如利用查詢接口來訪問數據庫系統
  • 數據通過持續不斷的流的形式進行訪問
  • 通過應用程序接口(API)來訪問

      在計算機中廣義存在的兩種文件類型是文本文件和二進制文件;簡單來說,平時我們能看懂的記事本、表格等都是文本文件,計算機能讀懂但由非人類可讀字符組成的文件是二進制文件。

1.1 常見的文本文件格式

      最常見的文本文件類型主要有三種:

  • 分隔格式(結構化數據)
  • JSON格式(半結構化數據)
  • HTML格式(非結構化數據)

1.2 分隔格式

      分隔文件就是文本格式文件,這種文件行和列由統一的符號分隔;分隔的字符就叫做分隔符。最常見的分隔符就是製表符和逗號,這兩種方案分別出現在製表符分隔值(TSV)和逗號分隔值(CSV)中。

      1.2.1  查看不可見的分隔字符

                分隔文件中的換行符、回車符等都是不可見的,如何讓他們可見呢?比如用notepad++打開的文件,要顯示分隔符可以這麼操作:視圖 --> 顯示符號 -->  在 顯示所有字符 處打勾就可以了;其它的軟件文本行都可以找到各自的方式查看。

      1.2.2  封閉錯誤數據

               舉個例子:在一個以 “ , ” 爲分隔符的分隔文件中,如果有一個工資數據的格式是這樣 “ 76,888 ” ,這個逗號是工資中的千位分隔符,但在此分隔文件中,逗號又是分隔符,因此引起錯誤;處理方案主要有以下兩種:

  • 創建分隔文件時檢查確保沒有引起歧義的逗號(也就是說刪掉上面工資中的逗號,不使用那種格式的工資)
  • 使用額外的符號來對數據進行封閉處理(比如上面的工資數據用引號包含,將裏面的逗號封閉起來)

      1.2.3  字符轉義

              如果字符本身就含有引號,那麼此時再用引號進行封閉顯然不合適;也許你會說可以用單引號、雙引號進行區別,但是單引號在英文中又與名詞所有格衝突,因此也不算是最好的辦法,遇到這種問題最好的解決辦法就是使用轉義字符:

               比如“ light \”red blue\“ ”,這樣,通過  \ 反斜槓對雙引號進行轉義就不會與外面的雙引號又衝突了。

      1.2.4  JSON格式

               JSON格式的數據是當前較爲流行的數據格式,它是一個半結構化的數據,使用鍵值對的字典類型格式,數據的順序無關緊要,還可以缺失某些值,它還支持多層級結構和多值屬性

       1.2.5  HTML格式

               HTML文件是一種網頁文件,非格式化的;裏面包含很多冗餘的數據,針對這種數據目前也有很對提取辦法,網絡信息爬蟲就是專門針對這種網頁數據爬取的,各式各樣的提取規則以後會涉及到。

2. 歸檔文件

      歸檔文件就是內部包含(文本文件或二進制文件)等許多文件的獨立文件。

磁帶歸檔(TAR)文件:

      通常以.tar爲後綴名,這種文件一般只歸檔並不會壓縮;通常windows系統下直接使用相應的軟件就可以歸檔了,而linux系統下則需要相應命令:tar cvf name.tar name1.csv name2.csv (創建歸檔文件) tar xvf name.tar(打開歸檔文件)    

3. 壓縮、解壓文件

       壓縮文件其實與歸檔文件類似,只是後綴名不同,一般ZIP、RAR文件既歸檔又壓縮。windows下壓縮、解壓都很方便,最主要的是利用程序來壓縮解壓,這個以後再探討。Linux下的壓縮解壓命令可以查看我之前的博客LINUX常用命令

       壓縮、解壓的格式有非常多的選擇,影響我們選擇壓縮、解壓方式的主要有以下三個關鍵因素:

  • 壓縮和解壓縮的速度
  • 壓縮比率(文件到底能縮減多少)
  • 壓縮方案的互操作性(文件容易解壓嗎?)

        對於上面的因素考慮,一般沒有定論,只有一些經驗參考:gzip壓縮和解壓縮都比較快,但一般windows上沒有;bzip2壓縮的文件比gzip和zip都要小,但花費的時間稍微長一點,windows上同樣也很少有這個;zip在各系統上都存在,壓縮和解壓速度也不賴,只是壓縮比率不怎麼高;rar是windows上獨有的歸檔解決方案,歸檔速度不是特別理想。

4. 數據類型、空值與編碼

4.1 數據類型

      數據類型基本上其它地方介紹的非常多而且詳細,這裏就不多做介紹,基本上在數據處理上接觸到的最多數據類型爲:數字、日期、字符串。

4.2 數據類型間的相互轉換

      數據轉換在數據清洗過程中必不可少,但是在介紹具體的轉換之前我們先介紹一下轉換過程中數據損耗的問題。

      數據損耗

       數據損耗有時會發生有時不會發生,有時的數據損耗是允許的,有時卻不被允許,這就要看具體的情況來對待;一般損耗的風險因素有以下兩個:

  • 同種類型間不同範圍的轉換:比如200長的字符串轉換到100長的字符串上,超過長度的都會被截取掉;最容易忽略的就是數字類型上,比如長整型轉換爲整型,等等;
  • 不同精度間的轉換:比如原本四位精度的數字轉爲兩位精度,那麼多餘的精度信息將會被捨棄,造成數據的丟失。

4.3 數據類型間相互轉換的策略

      SQL級別的類型轉換

       例子一:將MySQL數據格式化爲字符串

       比如數據庫中查到一條日期數據 2000-01-21 04:51:00,我們希望得到4:51am,Friday,January 21,2000,我們可以這樣操作:

select concat( 
              concat(hour(date),':',minute(date)),
              if (hour(date) < 12, 'am', 'pm'),
              concat(', ', dayname(date), ', ', monthname(date), ' ', day(date), ', ', year(date))
              )
from table_name where mid=21;

或者使用date_format()函數:

select date_format(date, '%1:%i%p, %W, %M %e, %Y') from tbl_name where mid=21;
用這個語句查出的唯一不同是AM是大寫的,只需要將am那一部分拆開轉化爲小寫再用concat函數鏈接即可。

      例子二:從字符串類型轉換到MySQL日期類型

      比如有一段字符串“ ....>....>.....>sent:Thursday, August 17, 2000 6:29 PM>...."是這樣子的,我們要提取裏面的日期並轉化爲MySQL的datetime類型:

select str_to_date(
                   substring_index(
                                   substring_index(reference, '>', 3),
                                   'sent:',
                                   -1),
                   '%W, %M,%e, %Y, %h:%i %p')
from referenceinfo where mid =22;
substring_index()函數按指定字符對字符串進行分割,並得到指定位置的字符串;
str_to_date()函數就是將字符串格式的日期轉化爲datetime類型。

       例子三:將字符串類型轉換數據轉化爲小數

       比如有某個字符串 ” .......$18.47/bbl....“ ,現在需要提取字符串裏面的數字並轉化爲小數:

select convert(substring_index(
                               substring(body,locate('$', body) + 1),
                               '/bbl',
                               1),
              decimal(4,2)
              ) 
as price from tbl_name where body like '%$%' and body like '%/bbl%' ;
substring()函數定位,substring_index()函數分割,convert()函數將字符轉換爲數字

      文件級別的類型轉換

       例子一:excel中的類型轉換

       一般這種表格中可以直接設置單元格格式,修改數據的類型;使用函數判斷,例如=istext(A2)就可以判斷A2中的內容是不是文本,是返回TRUE,不是則返回FALSE;同樣isnumber()函數也是如此。

       另外,還有這樣的轉換方式 =TEXT(A4, "yyyy-mm-dd"),這樣就可以直接將數字類型的日期轉換爲字符串類型的。

4.4 隱藏在數據森林中的空值

       在數據處理時有一些是我們不需要的數據,比如0值、空值和null值,這三種值不進行處理往往會導致一些錯誤,並且這三種值是不同的,在具體的情景下處理方式不一。

       

       0值是最容易處理的空值,因爲它具有一定的意義;可以拿他進行排序、比較、數學運算(不能當除數);有了這些基礎,0值處理起來就很容易了。

       

       與0值相比,空值的處理要難一些,因爲它在不同的情況下產生的含義不同。比如”“兩個引號緊挨着,這時可以說他爲空值,” “兩個引號之間有個空格,這時可以說它是空格;需要注意這些問題。

       null

      null不等於任何值,甚至是它本身。只有在不希望出現任何數據的情況下才應該使用NULL。一般對於null值的處理通常都是用指定的值去替換掉(一般用0),不過這種替換應該做好規劃,使它有利於接下來的數據處理,並做好記錄一面以後遺忘。

4.5 字符編碼

      不管是數據庫裏數據還是文本文件內中的數據,在存儲時都採用了一定的編碼解碼格式,當使用不同的編碼格式來對文件或數據庫內容進行讀取時就會產生編碼衝突,因此要通過調整編碼使之一致,或使用向下兼容的編碼類型。

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