做完數據採集就可以直接進行分析了嗎?肯定不是的。
就拿做飯打個比方吧,對於很多人來說,熱油下鍋、掌勺翻炒一定是做飯中最過癮的環節,但實際上炒菜這個過程只佔做飯時間的20%,剩下80%的時間都是在做準備,比如買菜、擇菜、洗菜等等。
在數據分析中,數據清洗就是這樣的前期準備工作。對於數據分析師來說,我們會遇到各種各樣的數據,在分析前,要投入大量的時間和精力把數據「整理裁剪」成自己想要或需要的樣子。
為什麼呢?因為我們採集到的數據往往有很多問題。
我們先看一個例子,假設老闆給你以下的數據,讓你做數據分析,你看到這個數據後有什麼感覺呢?
你剛看到這些數據可能會比較懵,因為這些數據缺少標註。
我們在收集整理數據的時候,一定要對數據做標註,數據表頭很重要。比如這份數據表,就缺少列名的標註,這樣一來我們就不知道每列數據所代表的含義,無法從業務中理解這些數值的作用,以及這些數值是否正確。但在實際工作中,也可能像這個案例一樣,數據是缺少標註的。
我簡單解釋下這些數據代表的含義。這是一家服裝店統計的會員數據。最上面的一行是列坐標,最左側一列是行坐標。列坐標中,第0列代表的是序號,第1列代表的會員的姓名,第2列代表年齡,第3列代表體重,第4~6列代表男性會員的三圍尺寸,第7~9列代表女性會員的三圍尺寸。
了解含義以後,我們再看下中間部分具體的數據,你可能會想,這些數據怎麼這麼「髒亂差」啊,有很多值是空的(NaN),還有空行的情況。
是的,這還僅僅是一家商店的部分會員數據,我們一眼看過去就能發現一些問題。日常工作中的數據業務會複雜很多,通常我們要統計更多的數據維度,比如100個指標,數據量通常都是超過TB、EB級別的,所以整個數據分析的處理難度是呈指數級增加的。這個時候,僅僅通過肉眼就很難找到問題所在了。
我舉了這樣一個簡單的例子,帶你理解在數據分析之前為什麼要有數據清洗這個重要的準備工作。有經驗的數據分析師都知道,好的數據分析師必定是一名數據清洗高手,要知道在整個數據分析過程中,不論是在時間還是功夫上,數據清洗大概都佔到了 80%。
數據質量的準則
在上面這個服裝店會員數據的案例中,一看到這些數據,你肯定能發現幾個問題。你是不是想知道,有沒有一些準則來規範這些數據的質量呢?
準則肯定是有的。不過如果數據存在七八種甚至更多的問題,我們很難將這些規則都記住。有研究說一個人的短期記憶,最多可以記住7條內容或信息,超過7條就記不住了。而數據清洗要解決的問題,遠不止7條,我們萬一漏掉一項該怎麼辦呢?有沒有一種方法,我們既可以很方便地記住,又能保證我們的數據得到很好的清洗,提升數據質量呢?
在這裡,我將數據清洗規則總結為以下4個關鍵點,統一起來叫「完全合一」,下面我來解釋下:
完整性:單條數據是否存在空值,統計的欄位是否完善;
全面性:觀察某一列的全部數值,比如在Excel表中,我們選中一列,可以看到該列的平均值、最大值、最小值。我們可以通過常識來判斷該列是否有問題,比如:數據定義、單位標識、數值本身;
合法性:數據的類型、內容、大小的合法性。比如數據中存在非ASCII字符,性別存在了未知,年齡超過了 200歲等;
唯一性:數據是否存在重複記錄,因為數據通常來自不同渠道的匯總,重複的情況是常見的。行數據、列數據都需要是唯一的,比如一個人不能重複記錄多次,且一個人的體重也不能在列指標中重複記錄多次;
按照以上的原則,我們能解決數據清理中遇到的大部分問題,使得數據標準、乾淨、連續,為後續數據統計、數據分析做好準備。如果想要進一步優化數據質量,還需要在實際案例中靈活使用。
清洗數據
了解了數據質量準則之後,我們針對上面服裝店會員數據案例中的問題進行一一擊破。
這裡你就需要Python的Pandas工具了。它是基於NumPy的工具,專門為解決數據分析任務而創建。Pandas納入了大量庫,我們可以利用這些庫高效地進行數據清理工作。
這裡我補充說明一下,如果你對Python還不是很熟悉,但是很想從事數據挖掘、數據分析相關的工作,那麼花一些時間和精力來學習一下Python是很有必要的。Python擁有豐富的庫,堪稱數據挖掘利器。當然了,數據清洗的工具也還有很多,這裡我們只是以Pandas為例,幫你應用數據清洗準則,帶你更加直觀地了解數據清洗到底是怎麼回事兒。
下面,我們就依照「完全合一」的準則,使用Pandas來進行清洗。
完整性
在數據中有些年齡、體重數值是缺失的,這往往是因為數據量較大,在過程中,有些數值沒有採集到。通常我我們可以採用以下三種方法:
刪除:刪除數據缺失的記錄
均值:使用當前列的均值
高頻:使用當前列出現頻率最高的數據
比如我們想對 df[『Age』]中缺失的數值用平均年齡進行填充,可以這樣寫:
df['Age'].fillna(df['Age'].mean(), inplace=True)
如果我們用最高頻的數據進行填充,可以先通過value_counts獲取Age欄位最高頻次age_maxf,然後再對 Age 欄位中缺失的數據用age_maxf進行填充:
age_maxf=train_features['Age'].value_counts().index[0]
train_features['Age'].fillna(age_maxf,inplace=True)
我們發現數據中有一個空行,除了index之外,全部的值都是NaN。Pandas的read_csv()並沒有可選參數來忽略空行,這樣,我們就需要在數據被讀入之後再使用dropna()進行處理,刪除空行。
# 刪除全空的行
df.dropna(how='all',inplace=True)
全面性
觀察weight列的數值,我們能發現weight列的單位不統一。有的單位是千克(kgs),有的單位是磅(lbs)。
這裡我使用千克作為統一的度量單位,將磅(lbs)轉化為千克(kgs):
# 獲取 weight 數據列中單位為 lbs 的數據
rows_with_lbs = df['weight'].str.contains('lbs').fillna(False)
print df[rows_with_lbs]
# 將 lbs轉換為 kgs, 2.2lbs=1kgs
for i,lbs_row in df[rows_with_lbs].iterrows():
# 截取從頭開始到倒數第三個字符之前,即去掉lbs。
weight = int(float(lbs_row['weight'][:-3])/2.2)
df.at[i,'weight'] = '{}kgs'.format(weight)
合理性
我們可以看到在數據集中Firstname和Lastname有一些非ASCII的字符。我們可以採用刪除或者替換的方式來解決非ASCII問題,這裡我們使用刪除方法:
# 刪除非 ASCII 字符
df['first_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
df['last_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
唯一性
在數據中不難發現,姓名列(Name)包含了兩個參數Firstname和Lastname。為了達到數據整潔目的,我們將Name列拆分成Firstname和Lastname兩個欄位。我們使用Python的split方法,str.split(expand=True),將列表拆成新的列,再將原來的Name列刪除。
# 切分名字,刪除源數據列
df[['first_name','last_name']] = df['name'].str.split(expand=True)
df.drop('name', axis=1, inplace=True)
我們校驗一下數據中是否存在重複記錄。如果存在重複記錄,就使用Pandas提供的drop_duplicates()來刪除重複數據。
# 刪除重複數據行
df.drop_duplicates(['first_name','last_name'],inplace=True)
這樣,我們就將上面案例中的會員數據進行了清理,來看看清理之後的數據結果。怎麼樣?是不是又乾淨又標準?
養成數據審核的習慣
現在,你是不是能感受到數據問題不是小事,上面這個簡單的例子裡都有 6 處錯誤。所以我們常說,現實世界的數據是「骯髒的」,需要清洗。
第三方的數據要清洗,自有產品的數據,也需要數據清洗。可以說沒有高質量的數據,就沒有高質量的數據分析,而數據清洗是高質量數據的一道保障。
當你從事這方面工作的時候,你會發現養成數據審核的習慣非常重要。而且越是優秀的數據分析人員,越會有「數據審核」的「職業病」。這就好比編輯非常在意文章中的錯別字、語法一樣。
數據的規範性,就像是你的作品一樣,通過清洗之後,會變得非常乾淨、標準。當然了,這也是一門需要不斷修煉的功夫。終有一天,你會進入這樣一種境界:看一眼數據,差不多7秒鐘的時間,就能知道這個數據是否存在問題。為了這一眼的功力,我們要做很多練習。
剛開始接觸數據分析工作的時候,一定會覺得數據分析是件很酷、很有價值的事。確實如此,不過今天我還要告訴你,再酷炫的事也離不開基礎性的工作,就像我們今天講的數據清洗工作。對於這些基礎性的工作,我們需要耐下性子,一個坑一個坑地去解決。
了解IT相關內容——各平臺同名「職坐標在線」
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺「網易號」用戶上傳並發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.