日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据分析之 缺失值分析

發(fā)布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据分析之 缺失值分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
  • 查看缺失情況:
dataframe.isnull() 元素級別的判斷,把對應(yīng)的所有元素的位置都列出來,元素為空或者NA就顯示True,否則就是Falsedataframe.isnull().any()列級別的判斷,只要該列有為空或者NA的元素,就為True,否則Falsemissing = dataframe.columns[ dataframe.isnull().any() ].tolist() 將為空或者NA的列找出來dataframe [ missing ].isnull().sum()將列中為空或者NA的個數(shù)統(tǒng)計出來len(data["feature"] [ pd.isnull(data["feature"]) ]) / len(data))缺失值比例
  • 缺失值處理方法:
    總圖:

  • 處理方式

    • 直接刪除:
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False) 功能:根據(jù)各標(biāo)簽的值中是否存在缺失數(shù)據(jù)對軸標(biāo)簽進(jìn)行過濾,可通過閾值調(diào)節(jié)對缺失值的容忍度 參數(shù):axis : {0 or ‘index’, 1 or ‘columns’},或 tuple/list how : {‘a(chǎn)ny’, ‘a(chǎn)ll’}any : 如果存在任何NA值,則放棄該標(biāo)簽all : 如果所有的值都為NA值,則放棄該標(biāo)簽thresh : int, 默認(rèn)值 Noneint value :要求每排至少N個非NA值  subset : 類似數(shù)組inplace : boolean, 默認(rèn)值 False如果為True,則進(jìn)行操作并返回None。 返回:被刪除的DataFrame ** - 常見刪除方法:** new_drop = dataframe.dropna ( axis=0,subset=["Age","Sex"] ) 【在子集中有缺失值,按行刪除】new_drop = dataframe.dropna ( axis=1) 【將dataframe中含有缺失值的所有列刪除】
  • 插補(bǔ)法
    • data.Age.fillna(data.Age.mean(),inplace=True) 均值插補(bǔ)法 正態(tài)分布
    • df[‘price’].fillna(df[‘price’].median()) 中值法 偏長尾分布
    • 最近插補(bǔ)法
      dataframe [‘a(chǎn)ge’].fillna(method=‘pad’) # 使用前一個數(shù)值替代空值或者NA,就是NA前面最近的非空數(shù)值替換
      dataframe [‘a(chǎn)ge’].fillna(method=‘bfill’,limit=1) # 使用后一個數(shù)值替代空值或者NA,limit=1就是限制如果幾個連續(xù)的空值,只能最近的一個空值可以被填充。
  • 回歸插補(bǔ)法:
    選擇若干個預(yù)測缺失值的自變量,建立回歸方程估計缺失值即用缺失數(shù)據(jù)的條件期望值對缺失值進(jìn)行替換。
    弊端:無偏估計,容易忽略其他未知性質(zhì)的屬性,而且這一現(xiàn)象當(dāng)數(shù)據(jù)缺失信息越多越明顯。第二很多時候這種假設(shè)的線性關(guān)系并不存在。
  • 拉格朗日插值法:
    維基百科拉個朗日插值法描述 很清楚
    python實現(xiàn):
# -*- coding: utf-8 -*- """ 拉格朗日插值代碼 """ import pandas as pd #導(dǎo)入數(shù)據(jù)分析庫 from scipy.interpolate import lagrange #導(dǎo)入拉格朗日插值函數(shù) inputfile = './missing_data.xls' #輸入數(shù)據(jù)路徑,需要使用Excel格式 outputfile = './missing_data_processed.xls' #輸出數(shù)據(jù)路徑,需要使用Excel格式 #header表示數(shù)據(jù)中是否存在列名,如果在第0行就寫0,并且開始讀數(shù)據(jù)時跳過相應(yīng)的行數(shù),不存在可以寫None data = pd.read_excel(inputfile, header = None) #自定義列向量插值函數(shù) #s為列向量,n為被插值的位置,K為取前后的數(shù)據(jù)個數(shù),默認(rèn)為5 def ployinterp_column(s, n, k=5):y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取數(shù),轉(zhuǎn)換成列表y = y[y.notnull()] #剔除空值return lagrange(y.index, list(y))(n) #插值并返回插值結(jié)果,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) #輸出結(jié)果 - 注意事項:- 穩(wěn)定性不好 出現(xiàn)不穩(wěn)定現(xiàn)象稱為龍格現(xiàn)象,解決方法是分段低次數(shù)的插值多項式
  • 牛頓插值法
  • 分段插值
  • k-means
    • 通過K均值的聚類方法將所有樣本進(jìn)行聚類劃分,然后再通過劃分的種類的均值對各自類中的缺失值進(jìn)行填補(bǔ)。歸其本質(zhì)還是通過找相似來填補(bǔ)缺失值。缺失值填補(bǔ)的準(zhǔn)確性就要看聚類結(jié)果的好壞了,而聚類結(jié)果的可變性很大,通常與初始選擇點有關(guān),因此使用時要慎重。
    • knn填補(bǔ)空值
#用KNN填充空值 def knn_fill_nan(data,K):#計算每一行的空值,如果有空值,就進(jìn)行填充;沒有空值的行用于做訓(xùn)練數(shù)據(jù)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#非空行,原始數(shù)據(jù)data_no_nan = data.drop(data_row_nan,axis=0)#空行,原始數(shù)據(jù)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#根據(jù)row和col值確定需要填充的數(shù)據(jù)的具體位置(可能是多個)#填充的數(shù)據(jù)為最近的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('填補(bǔ)完成')return data_no_nan

【2】擬合(適用于缺失值多)

  • 回歸預(yù)測:缺失值是連續(xù)的,即定量的類型,才可以使用回歸來預(yù)測。
  • 極大似然估計(Maximum likelyhood):在缺失類型為隨機(jī)缺失的條件下,假設(shè)模型對于完整的樣本是正確的,那么通過觀測數(shù)據(jù)的邊際分布可以對未知參數(shù)進(jìn)行極大似然估計(Little and Rubin)。這種方法也被稱為忽略缺失值的極大似然估計,對于極大似然的參數(shù)估計實際中常采用的計算方法是期望值最大化(Expectation Maximization,EM)。該方法比刪除個案和單值插補(bǔ)更有吸引力,它一個重要前提:適用于大樣本。有效樣本的數(shù)量足夠以保證ML估計值是漸近無偏的并服從正態(tài)分布。但是這種方法可能會陷入局部極值,收斂速度也不是很快,并且計算很復(fù)雜,且僅限于線性模型。
  • 多重插補(bǔ)(Mutiple imputation):多值插補(bǔ)的思想來源于貝葉斯估計,認(rèn)為待插補(bǔ)的值是隨機(jī)的,它的值來自于已觀測到的值。具體實踐上通常是估計出待插補(bǔ)的值,然后再加上不同的噪聲,形成多組可選插補(bǔ)值。根據(jù)某種選擇依據(jù),選取最合適的插補(bǔ)值。  
    三步驟:
    為每個缺失值產(chǎn)生一套可能的插補(bǔ)值,這些值反映了無響應(yīng)模型的不確定性;
    每個插補(bǔ)數(shù)據(jù)集合都用針對完整數(shù)據(jù)集的統(tǒng)計方法進(jìn)行統(tǒng)計分析;
    對來自各個插補(bǔ)數(shù)據(jù)集的結(jié)果,根據(jù)評分函數(shù)進(jìn)行選擇,產(chǎn)生最終的插補(bǔ)值;

根據(jù)數(shù)據(jù)缺失機(jī)制、模式以及變量類型,可分別采用回歸、預(yù)測均數(shù)匹配( predictive mean matching, PMM )、趨勢得分( propensity score, PS )、Logistic回歸、判別分析以及馬爾可夫鏈蒙特卡羅( Markov Chain Monte Carlo, MCMC) 等不同的方法進(jìn)行填補(bǔ)。

-隨機(jī)森林:將缺失值作為目標(biāo)變量 def set_missing_ages(df):# 把已有的數(shù)值型特征取出來丟進(jìn)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即目標(biāo)年齡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)# 用得到的模型進(jìn)行未知年齡結(jié)果預(yù)測predictedAges = rfr.predict(unknown_age[:, 1:]) # print predictedAges# 用得到的預(yù)測結(jié)果填補(bǔ)原缺失數(shù)據(jù)df.loc[ (df.Age.isnull()), 'Age' ] = predictedAges return df, rfr

衍生

總結(jié)

以上是生活随笔為你收集整理的数据分析之 缺失值分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。