官术网_书友最值得收藏!

3.2.6 廣告缺失值處理

數(shù)據(jù)缺失在數(shù)據(jù)分析工作中是普遍存在的,而造成數(shù)據(jù)缺失的原因又是多種多樣的,有的是因?yàn)閿?shù)據(jù)無法獲取或者獲取數(shù)據(jù)的代價(jià)太大,有的是因?yàn)樾畔⒉杉捌诒贿z漏或者設(shè)備故障問題導(dǎo)致數(shù)據(jù)丟失,還有的可能是因?yàn)閿?shù)據(jù)不可用而舍棄導(dǎo)致的缺失。

按缺失的情況,我們一般將數(shù)據(jù)缺失分為完全隨機(jī)缺失、隨機(jī)缺失和完全非隨機(jī)缺失。它們的具體定義如下。

1)完全隨機(jī)缺失:數(shù)據(jù)的缺失是完全隨機(jī)的,與其他變量無關(guān)。

2)隨機(jī)缺失:該類數(shù)據(jù)的缺失依賴于其他變量,與所觀察的變量有關(guān),與未觀察的變量無關(guān)。

3)完全非隨機(jī)缺失:數(shù)據(jù)的缺失與變量自身的取值有關(guān)。

所以缺失值的處理要具體問題具體分析。在廣告行業(yè)中,數(shù)據(jù)的缺失主要是因?yàn)闊o法獲取數(shù)據(jù)導(dǎo)致的。缺失值的處理方法主要包括三種:不處理、刪除缺失數(shù)據(jù)、填充缺失值。只有當(dāng)我們對數(shù)據(jù)進(jìn)行刪除或者填充操作會(huì)對當(dāng)前分析結(jié)果帶來影響,或者我們明確知道該缺失數(shù)據(jù)對分析結(jié)果完全不會(huì)有影響時(shí),我們才會(huì)對缺失值進(jìn)行不處理操作。除此之外,我們一般都會(huì)對缺失數(shù)據(jù)進(jìn)行相應(yīng)的處理,而刪除缺失數(shù)據(jù)和填充缺失值是比較常用的方法。Pandas提供了一些常用的數(shù)據(jù)缺失值處理方法,使得數(shù)據(jù)缺失值的處理簡單高效了。

在Pandas的數(shù)據(jù)對象中一般用NaN表示缺失值,比如前面我們在進(jìn)行數(shù)據(jù)拼接時(shí)就出現(xiàn)了因?yàn)樽笥覂蓚€(gè)表部分?jǐn)?shù)據(jù)拼接不上而導(dǎo)致數(shù)據(jù)缺失的情況。在Pandas中我們通常使用isnull方法來獲取缺失值的位置:


In [3]: df = pd.DataFrame({"ID":[1,2,np.NaN,4,5],
   ...:                  "Name":['A',np.NaN,np.NaN,"D","E"],
   ...                   "No":[100,101,102,103,105]})

In [4]: df.isnull()
Out[4]:
      ID   Name     No
0  False  False  False
1  False   True  False
2   True   True  False
3  False  False  False
4  False  False  False

也可以在isnull方法后使用聚合函數(shù)來進(jìn)行匯總,以便后續(xù)觀察字段的整體缺失情況:


In [5]: df.isnull().mean()
Out[5]:
ID      0.2
Name    0.4
No      0.0
dtype: float64

從以上結(jié)果可以看出,ID和Name字段的缺失值比例分別為0.2和0.4。

還可以使用notnull方法來獲取非缺失值的位置:


In [6]: df.notnull()
Out[6]:
      ID   Name    No
0   True   True  True
1   True  False  True
2  False  False  True
3   True   True  True
4   True   True  True

可以看到,返回的結(jié)果剛好與isnull方法相反。

前面我們介紹了如何通過isnull/notnull方法來判斷缺失值的位置,從而快速找出缺失值,下面將分別介紹在廣告數(shù)據(jù)分析中常用的兩種缺失值處理方法:刪除缺失值和填充缺失值。

(1)刪除缺失值

在Pandas中,通常使用dropna方法刪除缺失數(shù)據(jù):


In [7]: df.dropna()
Out[7]:
    ID Name   No
0  1.0    A  100
3  4.0    D  103
4  5.0    E  105

可以發(fā)現(xiàn),dropna方法刪除了所有含有缺失值的行。在上面的例子中,在刪除缺失值后只保留了第1、4、5行的數(shù)據(jù)。但在實(shí)際中往往只需要?jiǎng)h除全為缺失值的行,這里只需要修改參數(shù)how=‘a(chǎn)ll’即可:


In [8]: df.dropna(how = 'all')
Out[8]:
    ID Name   No
0  1.0    A  100
1  2.0  NaN  101
2  NaN  NaN  102
3  4.0    D  103
4  5.0    E  105

通過dropna方法我們還可以刪除含缺失值的列:


In [9]: df.dropna(axis=1)
Out[9]:
    No
0  100
1  101
2  102
3  103
4  105

(2)填充缺失值

通過fillna方法我們可以將缺失值填充為任何我們想要的值,如下所示:


In [10]: df.fillna('miss')
Out[10]:
     ID  Name   No
0     1     A  100
1     2  miss  101
2  miss  miss  102
3     4     D  103
4     5     E  105

在以上情況下所有缺失值都會(huì)替換為miss,如果想在不同的列中填充不同的值,可以傳入一個(gè)字典,字典的鍵指定需要填充的列名,字典的值指定需要填充的值,如下所示:


In [11]: df.fillna({'ID':3,"Name":'miss'})
Out[11]:
    ID  Name   No
0  1.0     A  100
1  2.0  miss  101
2  3.0  miss  102
3  4.0     D  103
4  5.0     E  105

在廣告數(shù)據(jù)分析中,我們也經(jīng)常采用列的平均值(mean)、中位數(shù)(median)或者眾數(shù)(mode)來填充缺失值。這樣做的好處是可以盡量減少噪聲對整體數(shù)據(jù)的影響。


In [12]: df.loc[4,'ID'] = np.NaN

In [13]: df
Out[13]:
    ID Name   No
0  1.0    A  100
1  2.0  NaN  101
2  NaN  NaN  102
3  4.0    D  103
4  NaN    E  105

In [14]: df.fillna(df.mean())
Out[14]:
         ID Name   No
0  1.000000    A  100
1  2.000000  NaN  101
2  2.333333  NaN  102
3  4.000000    D  103
4  2.333333    E  105

因?yàn)榫堤畛渲粚B續(xù)變量有效,所以Name列的缺失值會(huì)被忽略。如果我們想對離散變量也進(jìn)行相應(yīng)的缺失值填充,可以有針對性地單獨(dú)指定需要填充的值,類似前面的miss填充,這里不再贅述。

主站蜘蛛池模板: 乐至县| 长治县| 龙门县| 武川县| 正蓝旗| 大石桥市| 乃东县| 长乐市| 锡林浩特市| 界首市| 外汇| 大余县| 景德镇市| 龙里县| 新和县| 南投县| 丰县| 长岛县| 八宿县| 门头沟区| 涿鹿县| 中卫市| 璧山县| 秭归县| 兴国县| 特克斯县| 鲜城| 偃师市| 墨江| 济宁市| 忻州市| 新营市| 黄冈市| 章丘市| 仁布县| 格尔木市| 正镶白旗| 息烽县| 石林| 呼和浩特市| 咸阳市|