生活随笔
收集整理的這篇文章主要介紹了
数据分析之 缺失值分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
dataframe.isnull() 元素級別的判斷,把對應的所有元素的位置都列出來,元素為空或者NA就顯示True,否則就是Falsedataframe.isnull().any()列級別的判斷,只要該列有為空或者NA的元素,就為True,否則Falsemissing = dataframe.columns[ dataframe.isnull().any() ].tolist() 將為空或者NA的列找出來dataframe [ missing ].isnull().sum()將列中為空或者NA的個數統計出來len(data["feature"] [ pd.isnull(data["feature"]) ]) / len(data))缺失值比例
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
功能:根據各標簽的值中是否存在缺失數據對軸標簽進行過濾,可通過閾值調節對缺失值的容忍度
參數:axis : {0 or ‘index’, 1 or ‘columns’},或 tuple/list how : {‘any’, ‘all’}any : 如果存在任何NA值,則放棄該標簽all : 如果所有的值都為NA值,則放棄該標簽thresh : int, 默認值 Noneint value :要求每排至少N個非NA值 subset : 類似數組inplace : boolean, 默認值 False如果為True,則進行操作并返回None。
返回:被刪除的DataFrame
** - 常見刪除方法:**
new_drop = dataframe.dropna ( axis=0,subset=["Age","Sex"] ) 【在子集中有缺失值,按行刪除】new_drop = dataframe.dropna ( axis=1) 【將dataframe中含有缺失值的所有列刪除】
插補法 data.Age.fillna(data.Age.mean(),inplace=True) 均值插補法 正態分布 df[‘price’].fillna(df[‘price’].median()) 中值法 偏長尾分布 最近插補法 dataframe [‘age’].fillna(method=‘pad’) # 使用前一個數值替代空值或者NA,就是NA前面最近的非空數值替換 dataframe [‘age’].fillna(method=‘bfill’,limit=1) # 使用后一個數值替代空值或者NA,limit=1就是限制如果幾個連續的空值,只能最近的一個空值可以被填充。 回歸插補法: 選擇若干個預測缺失值的自變量,建立回歸方程估計缺失值即用缺失數據的條件期望值對缺失值進行替換。 弊端:無偏估計,容易忽略其他未知性質的屬性,而且這一現象當數據缺失信息越多越明顯。第二很多時候這種假設的線性關系并不存在。 拉格朗日插值法: 維基百科拉個朗日插值法描述 很清楚 python實現:
# -*- coding: utf-8 -*-
"""
拉格朗日插值代碼
"""
import pandas as pd #導入數據分析庫
from scipy.interpolate import lagrange #導入拉格朗日插值函數
inputfile = './missing_data.xls' #輸入數據路徑,需要使用Excel格式
outputfile = './missing_data_processed.xls' #輸出數據路徑,需要使用Excel格式
#header表示數據中是否存在列名,如果在第0行就寫0,并且開始讀數據時跳過相應的行數,不存在可以寫None
data = pd.read_excel(inputfile, header = None)
#自定義列向量插值函數
#s為列向量,n為被插值的位置,K為取前后的數據個數,默認為5
def ployinterp_column(s, n, k=5):y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取數,轉換成列表y = y[y.notnull()] #剔除空值return lagrange(y.index, list(y))(n) #插值并返回插值結果,n是被插值的位置#逐個元素判斷是否需要插值
for i in data.columns:for j in range(len(data)):if (data[i].isnull())[j]: #如果為空即插值data[i][j] = ployinterp_column(data[i], j)data.to_excel(outputfile, header = None, index = False) #輸出結果
- 注意事項:- 穩定性不好 出現不穩定現象稱為龍格現象,解決方法是分段低次數的插值多項式
牛頓插值法 分段插值 k-means 通過K均值的聚類方法將所有樣本進行聚類劃分,然后再通過劃分的種類的均值對各自類中的缺失值進行填補。歸其本質還是通過找相似來填補缺失值。缺失值填補的準確性就要看聚類結果的好壞了,而聚類結果的可變性很大,通常與初始選擇點有關,因此使用時要慎重。 knn填補空值
#用KNN填充空值
def knn_fill_nan(data,K):#計算每一行的空值,如果有空值,就進行填充;沒有空值的行用于做訓練數據data_row = data.isnull().sum(axis=1).reset_index()data_row.columns = ['raw_row','nan_count']#空值行(需要填充的行)data_row_nan = data_row[data_row.nan_count>0].raw_row.values#非空行,原始數據data_no_nan = data.drop(data_row_nan,axis=0)#空行,原始數據data_nan = data.loc[data_row_nan]for row in data_row_nan:data_row_need_fill = data_nan.loc[row]#找出空列,并用非空列做KNNdata_col_index = data_row_need_fill.isnull().reset_index()data_col_index.columns = ['col','is_null']is_null_col = data_col_index[data_col_index.is_null == 1].col.valuesdata_col_no_nan_index = data_col_index[data_col_index.is_null == 0].col.values#保存需要填充的行的非空列data_row_fill = data_row_need_fill[data_col_no_nan_index]#廣播,矩陣-向量data_diff = data_no_nan[data_col_no_nan_index] - data_row_need_fill[data_col_no_nan_index]#求歐式距離data_diff = (data_diff ** 2).sum(axis=1)data_diff = data_diff.apply(lambda x:np.sqrt(x))data_diff = data_diff.reset_index()data_diff.columns = ['raw_row','diff_val']data_diff_sum = data_diff.sort_values(by='diff_val',ascending=True)data_diff_sum_sorted = data_diff_sum.reset_index()#取出k個距離最近的rowtop_k_diff_val = data_diff_sum_sorted.loc[0:K-1].raw_row.values#根據row和col值確定需要填充的數據的具體位置(可能是多個)#填充的數據為最近的K個值的平均值top_k_diff_val = data.loc[top_k_diff_val][is_null_col].sum(axis=0)/K#將計算出來的列添加至非空列data_row_fill = pd.concat([data_row_fill,pd.DataFrame(top_k_diff_val)]).Tdata_no_nan = data_no_nan.append(data_row_fill,ignore_index=True)print('填補完成')return data_no_nan
【2】擬合(適用于缺失值多)
回歸預測:缺失值是連續的,即定量的類型,才可以使用回歸來預測。 極大似然估計(Maximum likelyhood):在缺失類型為隨機缺失的條件下,假設模型對于完整的樣本是正確的,那么通過觀測數據的邊際分布可以對未知參數進行極大似然估計(Little and Rubin)。這種方法也被稱為忽略缺失值的極大似然估計,對于極大似然的參數估計實際中常采用的計算方法是期望值最大化(Expectation Maximization,EM)。該方法比刪除個案和單值插補更有吸引力,它一個重要前提:適用于大樣本。有效樣本的數量足夠以保證ML估計值是漸近無偏的并服從正態分布。但是這種方法可能會陷入局部極值,收斂速度也不是很快,并且計算很復雜,且僅限于線性模型。 多重插補(Mutiple imputation):多值插補的思想來源于貝葉斯估計,認為待插補的值是隨機的,它的值來自于已觀測到的值。具體實踐上通常是估計出待插補的值,然后再加上不同的噪聲,形成多組可選插補值。根據某種選擇依據,選取最合適的插補值。 三步驟: 為每個缺失值產生一套可能的插補值,這些值反映了無響應模型的不確定性; 每個插補數據集合都用針對完整數據集的統計方法進行統計分析; 對來自各個插補數據集的結果,根據評分函數進行選擇,產生最終的插補值;
根據數據缺失機制、模式以及變量類型,可分別采用回歸、預測均數匹配( predictive mean matching, PMM )、趨勢得分( propensity score, PS )、Logistic回歸、判別分析以及馬爾可夫鏈蒙特卡羅( Markov Chain Monte Carlo, MCMC) 等不同的方法進行填補。
-隨機森林:將缺失值作為目標變量
def set_missing_ages(df):# 把已有的數值型特征取出來丟進Random Forest Regressor中age_df = df[['Age','Fare', 'Parch', 'SibSp', 'Pclass']]# 乘客分成已知年齡和未知年齡兩部分known_age = age_df[age_df.Age.notnull()].as_matrix()unknown_age = age_df[age_df.Age.isnull()].as_matrix()# y即目標年齡y = known_age[:, 0]# X即特征屬性值X = known_age[:, 1:]# fit到RandomForestRegressor之中rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1)rfr.fit(X, y)# 用得到的模型進行未知年齡結果預測predictedAges = rfr.predict(unknown_age[:, 1:])
# print predictedAges# 用得到的預測結果填補原缺失數據df.loc[ (df.Age.isnull()), 'Age' ] = predictedAges return df, rfr
衍生
總結
以上是生活随笔 為你收集整理的数据分析之 缺失值分析 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。