古鎮(zhèn) 網(wǎng)站建設(shè)滄州網(wǎng)站優(yōu)化

本文目錄
1. 基礎(chǔ)概念
1.1. 缺失值分類
1.2. 缺失值處理方法
2. 缺失觀測及其類型
2.1. 了解缺失信息
2.2. 三種缺失符號
2.3. Nullable類型與NA符號
2.4. NA的特性
2.5. convert_dtypes方法
3. 缺失數(shù)據(jù)的運算與分組
3.1. 加號與乘號規(guī)則
3.2. groupby方法中的缺失值
4. 填充與剔除
4.1. fillna方法
4.2. dropna方法
5. 插值
5.1. 線性插值
5.2. 高級插值方法
5.3. interpolate中的限制參數(shù)
基礎(chǔ)概念
1.1缺失值的分類
按照數(shù)據(jù)缺失機制可分為:
可忽略的缺失
完全隨機缺失(missing completely at random, MCAR),所缺失的數(shù)據(jù)發(fā)生的概率既與已觀察到的數(shù)據(jù)無關(guān),也與未觀察到的數(shù)據(jù)無關(guān)
隨機缺失(missing at random, MAR),假設(shè)缺失數(shù)據(jù)發(fā)生的概率與所觀察到的變量是有關(guān)的,而與未觀察到的數(shù)據(jù)的特征是無關(guān)的。
不可忽略的缺失(non-ignorable missing ,NIM) 或非隨機缺失(not missing at random, NMAR, or, missing not at random, MNAR),如果不完全變量中數(shù)據(jù)的缺失既依賴于完全變量又依賴于不完全變量本身,這種缺失即為不可忽略的缺失。
【注意】:Panda讀取的數(shù)值型數(shù)據(jù),缺失數(shù)據(jù)顯示“NaN”(not a number)。
1.2數(shù)據(jù)值的處理方法
主要就是兩種方法:
刪除存在缺失值的個案;
缺失值插補。
【注意】缺失值的插補只能用于客觀數(shù)據(jù)。由于主觀數(shù)據(jù)受人的影響,其所涉及的真實值不能保證。
1、刪除含有缺失值的個案(2種方法)
(1)簡單刪除法
簡單刪除法是對缺失值進行處理的最原始方法。它將存在缺失值的個案刪除。如果數(shù)據(jù)缺失問題可以通過簡單的刪除小部分樣本來達到目標,那么這個方法是最有效的。
(2)權(quán)重法
當缺失值的類型為非完全隨機缺失的時候,可以通過對完整的數(shù)據(jù)加權(quán)來減小偏差。把數(shù)據(jù)不完全的個案標記后,將完整的數(shù)據(jù)個案賦予不同的權(quán)重,個案的權(quán)重可以通過logistic或probit回歸求得。
如果解釋變量中存在對權(quán)重估計起決定行因素的變量,那么這種方法可以有效減小偏差。如果解釋變量和權(quán)重并不相關(guān),它并不能減小偏差。
對于存在多個屬性缺失的情況,就需要對不同屬性的缺失組合賦不同的權(quán)重,這將大大增加計算的難度,降低預(yù)測的準確性,這時權(quán)重法并不理想。
2、可能值插補缺失值
【思想來源】:以最可能的值來插補缺失值比全部刪除不完全樣本所產(chǎn)生的信息丟失要少。
(1)均值插補
屬于單值插補。數(shù)據(jù)的屬性分為定距型和非定距型。如果缺失值是定距型的,就以該屬性存在值的平均值來插補缺失的值;如果缺失值是非定距型的,就用該屬性的眾數(shù)來補齊缺失的值。
(2)利用同類均值插補
屬于單值插補。用層次聚類模型預(yù)測缺失變量的類型,再以該類型的均值插補。
假設(shè)為信息完全的變量,為存在缺失值的變量,那么首先對或其子集行聚類,然后按缺失個案所屬類來插補不同類的均值。
如果在以后統(tǒng)計分析中還需以引入的解釋變量和做分析,那么這種插補方法將在模型中引入自相關(guān),給分析造成障礙。
(3)極大似然估計(Max Likelihood ,ML)
在缺失類型為隨機缺失的條件下,假設(shè)模型對于完整的樣本是正確的,那么通過觀測數(shù)據(jù)的邊際分布可以對未知參數(shù)進行極大似然估計(Little and Rubin)。
這種方法也被稱為忽略缺失值的極大似然估計,對于極大似然的參數(shù)估計實際中常采用的計算方法是期望值最大化(Expectation Maximization,EM)。
該方法比刪除個案和單值插補更有吸引力,前提是適用于大樣本,有效樣本的數(shù)量足夠以保證ML估計值是漸近無偏的并服從正態(tài)分布。這種方法可能會陷入局部極值,收斂速度也不是很快,并且計算很復(fù)雜。
(4)多重插補(Multiple Imputation,MI)
多值插補的思想來源于貝葉斯估計,認為待插補的值是隨機的,它的值來自于已觀測到的值。具體實踐上通常是估計出待插補的值,然后再加上不同的噪聲,形成多組可選插補值。根據(jù)某種選擇依據(jù),選取最合適的插補值。
多重插補方法的三個步驟:
為每個空值產(chǎn)生一套可能的插補值,這些值反映了無響應(yīng)模型的不確定性;每個值都可以被用來插補數(shù)據(jù)集中的缺失值,產(chǎn)生若干個完整數(shù)據(jù)集合。
每個插補數(shù)據(jù)集合都用針對完整數(shù)據(jù)集的統(tǒng)計方法進行統(tǒng)計分析。
對來自各個插補數(shù)據(jù)集的結(jié)果,根據(jù)評分函數(shù)進行選擇,產(chǎn)生最終的插補值。
多重插補方法舉例:
假設(shè)一組數(shù)據(jù),包括三個變量,它們的聯(lián)合分布為正態(tài)分布,將這組數(shù)據(jù)處理成三組,A組保持原始數(shù)據(jù),B組僅缺失
,C組缺失
和
。在多值插補時,對A組將不進行任何處理,對B組產(chǎn)生的
一組估計值(作
關(guān)于
,
的回歸),對C組作
和
產(chǎn)生和的一組成對估計值(作
,
關(guān)于
的回歸)。
當用多值插補時,對A組將不進行處理,對B、C組將完整的樣本隨機抽取形成為m組(m為可選擇的m組插補值),每組個案數(shù)只要能夠有效估計參數(shù)就可以了。對存在缺失值的屬性的分布作出估計,然后基于這m組觀測值,對于這m組樣本分別產(chǎn)生關(guān)于參數(shù)的m組估計值,給出相應(yīng)的預(yù)測即,這時采用的估計方法為極大似然法,在計算機中具體的實現(xiàn)算法為期望最大化法(EM)。對B組估計出一組的值,對C將利用
它們的聯(lián)合分布為正態(tài)分布這一前提,估計出一組(
,
)。
上例中假定了的聯(lián)合分布為正態(tài)分布。這個假設(shè)是人為的,但是已經(jīng)通過驗證(Graham和Schafer于1999),非正態(tài)聯(lián)合分布的變量,在這個假定下仍然可以估計到很接近真實值的結(jié)果。
多重插補彌補貝葉斯估計的不足之處:
貝葉斯估計以極大似然的方法估計,極大似然的方法要求模型的形式必須準確,如果參數(shù)形式不正確,將得到錯誤得結(jié)論,即先驗分布將影響后驗分布的準確性。而多重插補所依據(jù)的是大樣本漸近完整的數(shù)據(jù)的理論,在數(shù)據(jù)挖掘中的數(shù)據(jù)量都很大,先驗分布將極小的影響結(jié)果,所以先驗分布的對結(jié)果的影響不大。
貝葉斯估計僅要求知道未知參數(shù)的先驗分布,沒有利用與參數(shù)的關(guān)系。而多重插補對參數(shù)的聯(lián)合分布作出了估計,利用了參數(shù)間的相互關(guān)系。
缺失觀測及其類型
首先導(dǎo)入數(shù)據(jù):
import pandas as pd
import numpy as np
df = pd.read_csv('data/table_missing.csv')
df.head()

2.1了解缺失信息
1、isna和notna方法
對Series使用會返回布爾列表
df['Physics'].isna().head()

df['Physics'].notna().head()

對DataFrame使用會返回布爾表
df.isna().head()

但對于DataFrame我們更關(guān)心到底每列有多少缺失值
df.isna().sum()

此外,可以通過第1章中介紹的info函數(shù)查看缺失信息
df.info()

2、查看缺失值的所以在行
以最后一列為例,挑出該列缺失值的行
df[df['Physics'].isna()]

3、挑選出所有非缺失值列
使用all就是全部非缺失值,如果是any就是至少有一個不是缺失值
df[df.notna().all(1)]

缺失數(shù)據(jù)的運算與分組
加號與乘號規(guī)則
使用加法時,缺失值為0
s = pd.Series([2,3,np.nan,4])s.sum()
9.0
使用乘法時,缺失值為1
s.prod()
24.0
使用累計函數(shù)時,缺失值自動略過
s.cumsum()

s.cumprod()

s.pct_change()

groupby方法中的缺失值
自動忽略為缺失值的組
df_g = pd.DataFrame({'one':['A','B','C','D',np.nan],'two':np.random.randn(5)})df_g

df_g.groupby('one').groups

填充與剔除???????????????????????????????????????????????????????????????????
4.1 fillna方法
1、值填充與前后向填充(分別與ffill方法和bfill方法等價)
df['Physics'].fillna('missing').head()

df['Physics'].fillna(method='ffill').head()

df['Physics'].fillna(method='backfill').head()

2、填充中的對齊特性
df_f = pd.DataFrame({'A':[1,3,np.nan],'B':[2,4,np.nan],'C':[3,5,np.nan]})df_f.fillna(df_f.mean())

返回的結(jié)果中沒有C,根據(jù)對齊特點不會被填充
df_f.fillna(df_f.mean()[['A','B']])

4.2 dropna方法
1、axis參數(shù)
df_d = pd.DataFrame({'A':[np.nan,np.nan,np.nan],'B':[np.nan,3,2],'C':[3,2,1]})df_d

df_d.dropna(axis=0)

df_d.dropna(axis=1)

2、how參數(shù)(可以選all或者any,表示全為缺失去除和存在缺失去除)
df_d.dropna(axis=1,how='all')

3、subset參數(shù)(即在某一組列范圍中搜索缺失值)?
df_d.dropna(axis=0,subset=['B','C'])

插值
5.1線性插值
1、索引無關(guān)的線性插值
默認狀態(tài)下,interpolate會對缺失的值進行線性插值
s = pd.Series([1,10,15,-5,-2,np.nan,np.nan,28])s

s.interpolate()

s.interpolate().plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7fe7df20af50>

此時的插值與索引無關(guān)
s.index = np.sort(np.random.randint(50,300,8))s.interpolate()#值不變

s.interpolate().plot()#后面三個點不是線性的(如果幾乎為線性函數(shù),請重新運行上面的一個代碼塊,這是隨機性導(dǎo)致的)
<matplotlib.axes._subplots.AxesSubplot at 0x7fe7dfc69890>

2、與索引有關(guān)的插值
method中的index和time選項可以使插值線性地依賴索引,即插值為索引的線性函數(shù)
s.interpolate(method='index').plot()#可以看到與上面的區(qū)別
<matplotlib.axes._subplots.AxesSubplot at 0x7fe7dca0c4d0>

如果索引是時間,那么可以按照時間長短插值,對于時間序列將在第9章詳細介紹
s_t = pd.Series([0,np.nan,10] ,index=[pd.Timestamp('2012-05-01'),pd.Timestamp('2012-05-07'),pd.Timestamp('2012-06-03')])s_t

s_t.interpolate().plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7fe7dc964850>

s_t.interpolate(method='time').plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7fe7dc8eda10>

5.2 高級插值方法
此處的高級指的是與線性插值相比較,例如樣條插值、多項式插值、阿基瑪插值等(需要安裝Scipy)。
關(guān)于這部分僅給出一個官方的例子,因為插值方法是數(shù)值分析的內(nèi)容,而不是Pandas中的基本知識:
ser = pd.Series(np.arange(1, 10.1, .25) ** 2 + np.random.randn(37))missing = np.array([4, 13, 14, 15, 16, 17, 18, 20, 29])ser[missing] = np.nanmethods = ['linear', 'quadratic', 'cubic']df = pd.DataFrame({m: ser.interpolate(method=m) for m in methods})df.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7fe7dc86f810>

5.3 interpolate中的限制參數(shù)
1、limit表示最多插入多少個
s = pd.Series([1,np.nan,np.nan,np.nan,5])s.interpolate(limit=2)

2、limit_direction表示插值方向,可選forward,backward,both,默認前向。
s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])s.interpolate(limit_direction='backward')

3、limit_area表示插值區(qū)域,可選inside,outside,默認None
s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])s.interpolate(limit_area='inside')

s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])s.interpolate(limit_area='outside')

聲明:部分內(nèi)容來源于網(wǎng)絡(luò),僅供讀者學(xué)術(shù)交流之目的。文章版權(quán)歸原作者所有。如有不妥,請聯(lián)系刪除。