数据清洗---占据了数据分析师80%的时间
以點一份披薩為例,講清數據分析全流程。
01播種
農場的西紅柿提供了披薩的配料,在農場播種西紅柿種子。這就相當于數據生成過程,比如用戶操作,觸發傳感器,前端埋點等。
02收獲
采摘成熟的西紅柿。這就相當于數據收集,將用戶的交互行為記錄為實際數據。友盟等就提供了第三方的埋點支持。
03運輸
西紅柿被運往目的地。這就相當于數據被存儲在數據庫或數據湖中。
04選擇廚具和設備
每種食材都有適合自己的工具,要切土豆絲就用刀,要攪拌就用勺子,設備上,要加熱就用烤箱,要炒菜就用微波爐。“工具”這就好比數據分析中的數據預處理技術。“設備”就好比線性回歸,隨機森林等算法。需要注意的是,并不是設備越復雜,做出的菜越好吃。
05選擇菜譜
你做菜所需要的所有步驟。這就相當于模型,模型與算法不同。模型包括所有算法需要的預處理和之后的處理過程。
06準備材料
削皮,洗蔬菜,因為沒人想吃沒有洗過的蔬菜。這就好比數據預處理過程。比如,處理缺失值,重復值,更改數據類型,進行啞變量編碼,選擇數據子集,確保數據合法(比如出現年齡超過150歲的老妖婆就得刪除)。
07特別的處理
你可以將胡蘿卜削成玫瑰花瓣的樣子,也可以將豬肉熏干獲得獨特的口味。這就好比特征工程。特征工程做好了,可以顯著提高模型的性能。
08烹飪
這是最重要的步驟,你鹽放多了,顯得咸,火大了就糊了。這就好比模型訓練的環節,你將數據提供給模型,調整參數期待好的結果。
09嘗一嘗
品嘗就好比模型評估過程。很多時候,你的模型并不能得出好的結果,不要氣餒,換個模型繼續嘗試。好的結果都是靠試錯試出來的(對于沒有經驗的新手而言尤其如此)。
10送餐
送餐同樣重要,客戶對你的第一映像來自于你的包裝。對于數據分析而言,同樣如此。這就意味著你要有好的可視化呈現,生動且富含數據洞察的數據結論,如有必要,你還得添加預測功能。
總結:
沒有任何方法可以幫你解決原料問題。數據質量不好,再好的模型也解決不了問題。
送餐至關重要。數據分析師特別需要包裝數據產品的能力,這也是你工作價值的體現。
有時候,最簡單的模型同樣可以做出很好的預測。
Tips:
數據質量的準則
我將數據清洗規則總結為以下 4 個關鍵點,統一起來叫“完全合一”。
完整性:單條數據是否存在空值,統計的字段是否完善。
全面性:觀察某一列的全部數值,比如在 Excel 表中,我們選中一列,可以看到該列的平均值、最大值、最小值。我們可以通過常識來判斷該列是否有問題,比如:數據定義、單位標識、數值本身。
合法性:數據的類型、內容、大小的合法性。比如數據中存在非 ASCII 字符,性別存在了未知,年齡超過了 150 歲等。
唯一性:數據是否存在重復記錄,因為數據通常來自不同渠道的匯總,重復的情況是常見的。
1. 完整性問題
? ? 1:缺失值
刪除:刪除數據缺失的記錄;
均值:使用當前列的均值;
高頻:使用當前列出現頻率最高的數據。
比如我們想對 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)問題 2:空行
Pandas 的 read_csv() 并沒有可選參數來忽略空行
# 刪除全空的行 df.dropna(how='all',inplace=True)2. 全面性問題:列數據的單位不統一
這里我使用千克作為統一的度量單位,將磅(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)3. 合理性問題:非 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)4. 唯一性問題
? ? 1:一列有多個參數
在數據中不難發現,姓名列(Name)包含了兩個參數 Firtname 和 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)? ?2:重復數據
使用 Pandas 提供的 drop_duplicates() 來刪除重復數據。
# 刪除重復數據行 df.drop_duplicates(['first_name','last_name'],inplace=True)清理完后的數據就很規整了。
第三方的數據要清洗,自有產品的數據,也需要數據清洗。比如美團自身做數據挖掘的時候,也需要去除爬蟲抓取,作弊數據等。可以說沒有高質量的數據,就沒有高質量的數據挖掘,而數據清洗是高質量數據的一道保障。
終有一天,你會進入這樣一種境界:看一眼數據,差不多 7 秒鐘的時間,就能知道這個數據是否存在問題。為了這一眼的功力,我們要做很多練習。
?
總結
以上是生活随笔為你收集整理的数据清洗---占据了数据分析师80%的时间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据分析步骤
- 下一篇: 数据集成--ETL工具