
作者 | 劉順祥
來源 | 數據分析1480
前言
在《Python數據清洗(一):類型轉換和冗余數據刪除》中分享了有關數據類型轉換和冗余信息刪除的兩個知識點,接下來繼續講解缺失值的識別和處理辦法。缺失值指的是由于人為或機器等原因導致數據記錄的丟失或隱瞞,缺失值的存在一定程度上會影響后續數據分析和挖掘的結果,所以對他的處理將顯得尤為重要。
缺失值的識別
判斷一個數據集是否存在缺失觀測,通常從兩個方面入手,一個是變量的角度,即判斷每個變量中是否包含缺失值;另一個是數據行的角度,即判斷每行數據中是否包含缺失值。關于缺失值的判斷可以使用isnull方法。下面使用isnull方法對data3數據(數據可至中---下載)進行判斷,統計輸出的結果如下表所示。
# 判斷各變量中是否存在缺失值data3.isnull().any(axis = 0)# 各變量中缺失值的數量data3.isnull().sum(axis = 0)# 各變量中缺失值的比例data3.isnull().sum(axis = 0)/data3.shape[0]
如上結果所示,數據集data3中有三個變量存在缺失值,即gender、age和edu,它們的缺失數量分別為136、100和1,927,缺失比例分別為4.53%、3.33%和64.23%。
需要說明的是,判斷數據是否為缺失值NaN,可以使用isnull“方法”,它會返回與原數據行列數相同的矩陣,并且矩陣的元素為bool類型的值,為了得到每一列的判斷結果,仍然需要any“方法”(且設置“方法”內的axis參數為0);統計各變量的缺失值個數可以在isnull的基礎上使用sum“方法”(同樣需要設置axis參數為0);計算缺失比例就是在缺失數量的基礎上除以總的樣本量(shape方法返回數據集的行數和列數,[0]表示取出對應的數據行數)。
讀者可能對代碼中的“axis=0”感到困惑,它代表了什么?為什么是0?是否還可以寫其他值?下面通過圖表的形式來說明axis參數的用法:
假設上圖為學生的考試成績表,如果直接對成績表中的分數進行加和操作,得到的是所有學生的分數總和(很顯然沒有什么意義),如果按學生分別計算總分,將是上圖從左到右的轉換。該轉換的特征是列數發生了變化(可以是列數減少,也可以是列數增多),類似于在水平方向上受了外部的壓力或拉力,這樣的外力就理解為軸axis為1的效果(便于理解,可以想象為飛機在有動力的情況下,可以保持水平飛行狀態)。
同樣對于如上的學生成績表,如果直接對成績表中的分數計算平均值,得到的是所有學生的平均分數(很顯然也沒有什么意義),如果按學科分別計算平均分,將是上圖中從上到下的轉換。該轉換的特征是行數發生了變化(可以是行數減少,也可以是行數增多),類似于在垂直方向上受了外部的擠壓或拉伸,這樣的外力就理解為軸axis為0的效果(便于理解,可以想象為飛機在沒有動力的情況下,呈下降趨勢)。
如上是關于變量方面的缺失值判斷過程,還可以利用下方的代碼識別數據行的缺失值分布情況:
# 判斷數據行中是否存在缺失值
如上結果所示,返回True值,說明data3中的數據行存在缺失值。代碼中使用了兩次any“方法”,第一次用于判斷每一行對應的True(即行內有缺失值)或False值(即行內沒有缺失值);第二次則用于綜合判斷所有數據行中是否包含缺失值。同理,進一步還可以判斷缺失行的具體數量和占比,代碼如下:
# 缺失觀測的行數data3.isnull().any(axis = 1).sum()# 缺失觀測的比例data3.isnull().any(axis = 1).sum()/data3.shape[0]
如上結果所示,3000行的數據集中有2024行存在缺失值,缺失行的比例約67.47%。不管是變量角度的缺失值判斷,還是數據行角度的缺失值判斷,一旦發現缺失值,都需要對其作相應的處理,否則一定程度上都會影響數據分析或挖掘的準確性。
缺失值的處理辦法
通常對于缺失值的處理,最常用的方法無外乎刪除法、替換法和插補法。刪除法是指將缺失值所在的觀測行刪除(前提是缺失行的比例非常低,如5%以內),或者刪除缺失值所對應的變量(前提是該變量中包含的缺失值比例非常高,如70%左右);替換法是指直接利用缺失變量的均值、中位數或眾數替換該變量中的缺失值,其好處是缺失值的處理速度快,弊端是易產生有偏估計,導致缺失值替換的準確性下降;插補法則是利用有監督的機器學習方法(如回歸模型、樹模型、網絡模型等)對缺失值作預測,其優勢在于預測的準確性高,缺點是需要大量的計算,導致缺失值的處理速度大打折扣。下面將選擇刪除法、替換法和插補法對缺失值進行處理,代碼如下:
# 刪除字段 -- 如刪除缺失率非常高的edu變量data3.drop(labels = 'edu', axis = 1, inplace=True)# 數據預覽data3.head()
如上結果所示,表中的edu變量已被成功刪除。對于字段的刪除可以選擇drop“方法”,其中labels參數用于指定需要刪除的變量名稱,如果是多個變量,則需要將這些變量名稱寫在一對中括號內(如['var1','var2','var3']);刪除變量一定要設置axis參數為1,因為變量個數發生了變化(所以,借助于axis參數也可以刪除觀測行啦);inplace則表示是否原地修改,即是否直接將原表中的字段進行刪除,這里設置為True,如果設置為False,則將刪除變量的預覽效果輸出來,而非真正改變原始數據。
# 刪除觀測,-- 如刪除age變量中所對應的缺失觀測data3_new = data3.drop(labels = data3.index[data3['age'].isnull()],
axis = 0)# 查看數據的規模data3_new.shapeout:(2900, 5)
如上結果所示,利用drop“方法”實現了數據行的刪除,但必須將axis參數設置為0,而此時的labels參數則需要指定待刪除的行編號。這里的行編號是借助于index“方法”(用于返回原始數據的行編號)和isnull“方法”(用于判斷數據是否為缺失狀態,如果是缺失則返回True)實現的,其邏輯就是將True對應的行編號取出來,傳遞給labels參數。
如果變量的缺失比例非常大,或者缺失行的比例非常小時,使用刪除法是一個不錯的選擇,反之,將會丟失大量的數據信息而得不償失。接下來講解如何使用替換法處理缺失值,代碼如下:
# 替換法處理缺失值data3.fillna(value = {'gender': data3['gender'].mode()[0],
# 使用性別的眾數替換缺失性別 'age':data3['age'].mean()
# 使用年齡的平均值替換缺失年齡 }, inplace = True # 原地修改數據 )
# 再次查看各變量的缺失比例data3.isnull().sum(axis = 0)
如上結果所示,采用替換法后,原始數據中的變量不再含有缺失值。缺失值的填充使用的是fillna“方法”,其中value參數可以通過字典的形式對不同的變量指定不同的值。需要強調的是,如果計算某個變量的眾數,一定要使用索引技術,例如代碼中的[0],表示取出眾數序列中的第一個(我們知道,眾數是指出現頻次最高的值,假設一個變量中有多個值共享最高頻次,那么Python將會把這些值以序列的形式存儲起來,故取出指定的眾數值,必須使用索引)。
正如前文所說,雖然替換法思想簡單、效率高效,但是其替換的值往往不具有很高的準確性,于是出現了插補方法。該方法需要使用機器學習算法,不妨以KNN算法為例,對Titanic數據集中的Age變量做插補法完成缺失值的處理。代碼如下:
# 讀取數據titanic = pd.read_csv('Titanic.csv')# 刪除缺失嚴重的Cabin變量titanic.drop(labels='Cabin', axis = 1,
inplace=True)# 根據Embarked變量,刪除對應的缺失行titanic.dropna(subset=['Embarked'], inplace=True)
# 刪除無關緊要的變量(這些變量對后面預測年齡沒有太多的幫助)
titanic.drop(labels=['PassengerId','Name','Ticket','Embarked'], axis = 1, inplace=True)
# 將字符型的性別變量映射為數值變量titanic.Sex = titanic.Sex.map({'male':1, 'female':0})
# 將數據拆分為兩組,一是年齡缺失組,二是年齡非缺失組,后續基于非缺失值構建KNN模型,再對缺失組做預測
nomissing = titanic.loc[~titanic.Age.isnull(),]missing = titanic.loc[titanic.Age.isnull(),]
# 導入機器學習的第三方包from sklearn import neighbors
# 提取出所有的自變量X = nomissing.columns[nomissing.columns != 'Age']
# 構建模型knn = neighbors.KNeighborsRegressor()
# 模型擬合knn.fit(nomissing[X], nomissing.Age)
# 年齡預測pred_age = knn.predict(missing[X])
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
解碼數據基因:從數字敏感度到邏輯思維 每當看到超市貨架上商品的排列變化,你是否會聯想到背后的銷售數據波動?三年前在零售行 ...
2025-05-23在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25在當今數字化時代,數據分析師的重要性與日俱增。但許多人在踏上這條職業道路時,往往充滿疑惑: 如何成為一名數據分析師?成為 ...
2025-04-24