探索性資料分析EDA(二) 缺失值處理

2021-10-08 21:02:34 字數 2891 閱讀 6301

為什麼需要處理缺失值

為什麼資料有缺失值

缺失值的處理方法

這就是個廢問題,不處理就會影響結果準確性,但處理不好也會幫倒忙、增加噪音。所以要根據每個缺失值的具體情況,選擇適合的處理方法。

缺失值的產生的原因多種多樣,主要分為機械原因和人為原因:

缺失值可能出現在兩個階段:

完全隨機缺失指的是資料的缺失是隨機的,資料的缺失不依賴於任何不完全變數或完全變數。

當資料是完全隨機丟失的時候,資料丟失的機率對於所有觀測值都是一樣的。比如,資料收集過程中的受訪者決定在擲硬幣後宣布他們的收入。如果出現人頭,受訪者會申報其收入;如果出現圖案,則不申報。在這裡,每乙個觀察值都有相同的丟失值的機會。

指的是資料的缺失不是完全隨機的,即該類資料的缺失依賴於其他完全變數。

資料的缺失的機率受其他變數的影響。例如,當收集年齡資料時,女性更不願公開自己的年齡,因此女性的缺失值會遠遠大於男性。

指的是資料的缺失依賴於不完全變數自身,這裡有兩種情況:

1)缺失值與未觀察的輸入變數相關(missing that depends on unobserved predictors):

缺失值不是隨機的,而是與未觀察的輸入變數相關。

比如在醫學研究中,如果某一特定**導致不適,那麼患者退出研究的可能性就會更高,因此這些「不適」的患者沒有被觀察和測量,產生了缺失值。如果我們刪除這部分缺失樣本,則完全把不適的患者排除在分析樣本之外。

這個缺失的值不是隨機產生的,而是依賴於「不適」這個未被觀察到的變數。

2)缺失情況與變數本身直接相關(missing that depends on the missing value itself):

缺失是因為變數本身,比如高/低收入的人更不願意提供自己的收入資訊。

適合完全隨機缺失missing completely at random,有兩種刪除方法:

成列刪除list wise deletion:將整個樣本刪掉。

成對刪除pair wise deletion:只刪掉缺失值的部分;一些樣本雖然有缺失值,但是依舊可以使用其他未缺失的部分進行分析。

即用將缺失值填充掉,使用均值/中位數/眾數替代缺失值。

廣義插補(generalized imputation): 使用所有已知的資料,計算平均數/中位數替代缺失值。例如,上面的例子中,manpower 的缺失值可用其平均數28.33填充。

相似插補(similar case imputation): 按照每個缺失值的樣本特性,選擇已知相似樣本的平均數/中位數來插補缺失值。例如按性別計算平均數, 「male」 (29.75) 和「female」 (25) ;然後根據每個樣本的性別來選擇替代缺失值的平均數,男性則插補29.75,若樣本為女性則使用25。

首先,將資料集分成兩組,一組沒有缺失值,另一組包含缺失值。則第一組資料作為模型的訓練集,而第二組為測試集,缺失值即是目標變數。

然後,可以用方差分析,邏輯回歸等方法建模並計算出缺失值。

這個方法有兩個缺點:

模型估計值通常比真實值表現得更好

如果與資料集中的屬性和缺失值的屬性沒有關係,那麼模型將不能精確地估計缺失值

在該方法中,使用給定數量的與缺失值的屬性最相似的屬性進行缺失值的賦值。兩個屬性的相似性是通過距離函式來確定的。眾所周知,它也有一定的優勢和劣勢。

在訓練集train中做處理:

檢查統計缺失值:train.isnull().sum()

刪除train.dropna(inplace=true)

眾數插補:train['gender'].fillna(train['gender'].mode()[0],inplace=true)

中位數插補:train['loanamount'].fillna(train['loanamount'].median(), inplace=true)

平均數train['loanamount'].fillna(train['loanamount'].mean(), inplace=true)

當有資料集有很多列時,使用train.isnull().sum()顯示不全,可以用下面**檢查缺失值情況

def

missing_value_table

(df)

:#計算所有的缺失值

mis_val = df.isnull().

sum(

)# %比

mis_val_percent =

100*df.isnull().

sum()/

len(df)

#合併 mis_val_table = pd.concat(

[mis_val,mis_val_percent]

,axis=1)

mis_val_rename = mis_val_table.rename(columns =

)#剔除沒有缺失值的列,然後排序

mis_val_rename = mis_val_rename[mis_val_rename.iloc[:,

1]!=0

].sort_values(

'% of total values'

,ascending=

false

)return mis_val_rename

參考資料:

a comprehensive guide to data exploration

EDA 探索性資料分析

引導資料科學從業者進行資料處理以及特徵工程的步驟,使資料集的結構和特徵集讓接下來的 問題更加可靠。值得注意的是,eda過程中是對原始資料的特徵 統計特徵 分布特徵 相關性等 進行挖掘,但是沒有刪除或構造任何特徵 花式查詢,不包括增 刪 改 1 載入各種資料科學以及視覺化庫 資料科學庫 pandas ...

EDA(探索性資料分析)

1 什麼是eda分析?exploratory data analysis 在特徵 資料處理的過程中,對資料進行探索,找到他們之間的更多潛在關係。2 怎麼去做eda分析?主要是通過資料視覺化來顯示資料之間的關聯,從而對資料進行處理。首先,我們應該思考的是是否會出現下列問題 1 資料是否缺失,有沒有離群...

探索性資料EDA

import numpy as np import seaborn as sns import matplotlib.pyplot as plt from pandas import dataframe import pandas as pd from sklearn.datasets import...