菜鳥的數據挖掘實戰(二)-數據的探索性分析EDA

  • 學習框架:零基礎入門數據挖掘-菜鳥的學習路徑
  • 這是一個菜鳥的數據挖掘實戰記錄,目的是快速入門數據挖掘,少走彎路。內容上,由於自己的確是菜得不行,所以在跟隨入門級比賽:二手車價格預測進行實戰中,會重點敘述學習方法和思路,並補充其他學習資料。
  • 內容預計分爲六篇正文,本篇是第二篇正文:數據的探索性分析(Exploratory Data Analysis),上一篇我們瞭解了賽題和數據挖掘流程(“捏泥人”),這一篇將從實戰角度探索數據,總結數據分析技巧,依然會將重點放在“爲什麼這樣做”上。

內容大綱如下:

  • 預測值分佈(查看預測值總體分佈與具體頻數)
  • 數據統覽(通過數據形狀、類型與相關統計量,把握之後的發展方向)
  • 數據缺失與異常(介紹判斷數據缺失與異常的技巧,並進行初步處理)
  • 數值特徵與類型特徵(區分字段類型,針對兩種數據類型分別挖掘,基礎分析與相關可視化)
  • 數據報告(介紹好用的數分神器pandas_profiling與那些年我安裝時走過的坑)
    篇幅原因,數值特徵與類型特徵部分放在下一篇來講

開始前,先導入包和數據集:

# 基礎工具包即可
import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
import seaborn as sns
import missingno as msno   # 缺失值的可視化處理


"""導入數據集"""
train_data = pd.read_csv('./dataset/used_car_train_20200313.csv', sep=' ')   # 這個地方注意需要指定分隔符空格
test_data = pd.read_csv('./dataset/used_car_testA_20200313.csv', sep=' ')

1.數據通覽

這一步通過數據查看(head,tail),數據信息(info,瞭解除nan外符號異常),行列信息(shape),數據的統計特徵(describe)等大致瞭解數據。

# 查看數據的形狀 注意數據的行和列
print('train_data_shape:', train_data.shape)
print('test_data_shape:', test_data.shape)

# 數據簡要概覽
train_data.head().append(train_data.tail())
test_data.head().append(test_data.tail())

圖片來自https://blog.csdn.net/wuzhongqiang/article/details/105001485

  • trick:經常看數據集的head()以及shape是個好習慣,初學者建議執行一步看一下,有問題也可以及時發現,同時有效避免一個問題沒解決,帶來更大的錯誤。
    從忠哥那裏瞭解到,數據的維度也很重要:“太多的行會導致花費大量時間來訓練算法得到模型, 太少的數據會導致對算法訓練不充分,得不到合適的模型 如果數據有太多的特徵,會引起某些算法性能低下的問題。” 所以數據列數也要熟記於心。
# 數據信息查看 .info()可以看到每列的type,以及NAN缺失信息
train_data.info()

圖片來自https://blog.csdn.net/wuzhongqiang/article/details/105001485
看框裏圈出的部分,發現:1.有一些字段不是150000個,說明存在空值,清洗時要處理缺失;2.字段的類型中有一個是object,而不是數值型(int或者float),前文提到過info()就是用於查看符號異常的,這不,發現了一個。

# 通過.columns查看列名
train_data.columns

# 數據的統計信息概覽 數據記錄數,平均值,標準方差, 最小值,下四分位數, 中位數, 上四分位數,最大值
train_data.describe()

describe中有每列(數值列)的統計量,個數count、平均值mean、方差std、最小值min、中位數25% 50% 75% 、以 及最大值。用於瞬間掌握數據的大概的範圍以及每個值的異常值的判斷,比如有的時候會發現 999 9999 -1 等值這些其實都是nan的另外一種表達方式,有的時候需要注意下。
圖片來自https://blog.csdn.net/wuzhongqiang/article/details/105001485
會發現,統計特徵有30列,但前面輸出特徵train_data有31列,是因爲這裏面是不包括那個object類型的那個字段的統計的,不是數值類型的, 沒有中位數,均值,與數值型用describe的區別:

train_data['notRepairedDamage'].describe()

# 結果:
count     150000
unique         3
top          0.0
freq      111361
Name: notRepairedDamage, dtype: object

2.數據缺失與異常

先看下哪些存在nan值,小的填充大的刪除,其中尤其注意object型數據。

# 用isnull()查看每列的存在nan的情況
train_data.isnull().sum()
test_data.isnull().sum()

圖片來自https://blog.csdn.net/wuzhongqiang/article/details/105001485
很明顯,存在空值的是 bodytype, fueltype和gearbox。還可以用可視化更明顯地看看nan值多少:

missing = train_data.isnull().sum()
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing.plot.bar()

https://blog.csdn.net/wuzhongqiang/article/details/105001485

  • trick:通過以上兩句可以很直觀的瞭解哪些列存在 “nan”, 並可以把nan的個數打印,主要的目的在於 nan存在的個數是 否真的很大,如果很小一般選擇填充,如果使用lgb等樹模型可以直接空缺,讓樹自己去優化,但如果nan存在的過多、可以考慮刪掉。
    用msno包可視化缺省值:
# 可視化看下缺省值
msno.matrix(train_data.sample(250))  # sample(250)表示抽取250個樣本。
#msno.matrix(test_data.sample(250))
# 上圖是代碼運行後得到的結果,白色的是缺失值

#msno.bar(train_data.sample(1000))
msno.bar(test_data.sample(1000))   # 這個結果不在這裏顯示了

https://blog.csdn.net/wuzhongqiang/article/details/105001485
更多msno包處理缺失值技巧查看缺失值可視化處理–missingno
以上是基礎操作,這裏還有一個大魚不要放過!之前有個object字段還記得嗎?拿出來單獨看一下值

  • 要對數據保持懷疑謹慎的態度,尤其object字段。因爲很可能出現錯誤或缺失。
# 看看object這個字段的取值情況
train_data['notRepairedDamage'].value_counts()

## 結果:
0.0    111361
-       24324
1.0     14315
Name: notRepairedDamage, dtype: int64

這個“-”很明顯是缺失的一種表示,恭喜你逮住一條落網之魚!
因爲很多模型對nan有直接的處理, 這裏我們可以先不做處理,先替換爲nan。

train_data['notRepairedDamage'].replace('-', np.nan, inplace=True)
# test_data['notRepairedDamage'].replace('-', np.nan, inplace=True)

# 這時候再看缺失  就會發現缺省值最多的是這個notRepairedDamage字段
train_data.isnull().sum()

https://blog.csdn.net/wuzhongqiang/article/details/105001485

3.預測值分佈

這次是個迴歸題,離羣點對預測的影響特別大,要格外當心。
若訓練集中有影響較大的離羣點,可以考慮去掉,但測試集中的離羣點就沒辦法了。

先把訓練集讀進來,重點看預測目標price的情況。

import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore')
pd.set_option('display.max_columns', None)


train_df = pd.read_csv('used_car_train_20200313.csv', sep=' ')
print(train_df.shape)
train_df.describe()

發現均值在5900左右,標準差在7500左右,而最大值居然有99999,離羣點自由飛翔着…

  • trick:describe()用於查看數據基本特性,是EDA中最常用的操作

參考資料

簡單eda+baseline
零基礎數據挖掘入門系列(二) - 數據的探索性(EDA)分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章