一、數據探索
數據探索的目的:及早發現數據的一些簡單規律或特征
數據清洗的目的:留下可靠數據,避免臟數據的干擾。
兩者沒有嚴格的先后順序,經常在一個階段進行。
分為:
(1)數據質量分析(跟數據清洗密切聯系):缺失值分析、異常值分析、一致性分析、重復數據或含有特殊符號的數據分析
(2)數據特征分析(分布、對比、周期性、相關性、常見統計量等):
二、數據探索操作
- 查看數據前5行:dataframe.head()
- #查看dataframe的大小:dataframe.shape
三、缺失值分析
(通過describe與len直接發現,通過0數據發現)
(1)缺失值發現:
比方說一個dataframe:dataframe.describe()得到count結果與len(dataframe[某個屬性])對比,若少則表明有缺失值。
若一個dataframe中的0數據過多且不合理,則表明這個屬性也存在缺失值。
操作:
- dataframe.isnull() #元素級別的判斷,把對應的所有元素的位置都列出來,元素為空或者NA就顯示True,否則就是False
- dataframe.isnull().any() #列級別的判斷,只要該列有為空或者NA的元素,就為True,否則False
- missing = dataframe.columns [ dataframe.isnull().any() ].tolist() #將為空或者NA的列找出來
- dataframe [ missing ].isnull().sum() #將列中為空或者NA的個數統計出來
- # 缺失值比例 len(data["Age"] [ pda.isnull(data["Age"]) ]) / len(data))
(2)缺失值處理方式:(刪除、插補、不處理)
- 缺失值少:插補(均值插補、中位數插補、眾數插補、固定值插補、最近數據插補、回歸插補、拉格朗日插值、牛頓插值法、分段插值、用預測值填充 等)
- 缺失值多:不處理,不使用該類型數據
- 缺失值適中:將缺失當做新的一類,如one-hot來處理
操作:
插補:
- dataframe.loc [ dataframe [ column ] .isnull() , column ] = value 將某一列column中缺失元素的值,用value值進行填充。
- data.Age.fillna(data.Age.mean(),inplace=True) 將age列缺失值填充均值。
- dataframe [age] [ dataframe.age.isnull() ] = dataframe.age.dropna().mode().values #眾數填補 , mode()函數就是取出現次數最多的元素。
- dataframe ['age'].fillna(method='pad') #使用前一個數值替代空值或者NA,就是NA前面最近的非空數值替換
- dataframe ['age'].fillna(method='bfill',limit=1) #使用后一個數值替代空值或者NA,limit=1就是限制如果幾個連續的空值,只能最近的一個空值可以被填充。
- df.interpolate():對於時間序列的缺失,可以使用這種方法。
- import lightgbm as lgb :采用lgb來預測缺失值填補
刪除:
- new_drop = dataframe.dropna ( axis=0,subset=["Age","Sex"] ) 【在子集中有缺失值,按行刪除】
- new_drop = dataframe.dropna ( axis=1) 【將dataframe中含有缺失值的所有列刪除】
(2)異常值發現:(通過散點圖和箱型圖發現)
異常值發現:
先畫數據的散點圖。觀察偏差過大的數據,判斷其是否為異常值。
或者畫箱型圖,箱型圖識別異常值比較客觀,因為它是根據3σ原則,如果數據服從正態分布,若超過平均值的3倍標准差的值被視為異常值。
異常值處理方式:視為缺失值、刪除、修補(平均數、中位數等)、不處理。
中位數比平均值插值好一點,因為受異常值影響較小。
4、數據特征分析:
分布分析:(畫直方圖)
先確定極差(max-min)、組數、組距,然后根據這三個來畫直方圖(hist函數)。
可以大范圍查看數據,也可以縮小范圍進行分析,這需要具體數據具體分析。
通常數據有很多屬性,可以將屬性兩兩畫直方圖,通過直方圖來分析數據符合什么分布,比如正態分布,線性分布等。如果使用上所有的數據范圍過大,分布過於集中不明顯,可以將其集中的數據縮小到一個小范圍中再畫直方圖進行分析。
小例子:將data中price列數據值為0的變為缺失值,然后再給其賦值為中位數,假設中位數為36
import pandas as pd data['price'][(data['price']==0)]=None for i in data.columns: for j in data.index: if (data[i].isnull())[j]: data[i][j]='36'