2019年4月18日 星期四

機器學習 百日馬拉松 - Day 2. EDA-1/讀取資料EDA: Data summary

藉由 Kaggle 上的題目 Home Credit Default Risk 來練習資料的讀取。
我們需要先了解資料的樣子是什麼?
我們會遇到許多具體的問題,例如資料如何讀取? 有多少筆資料? 有多少欄位? 有無缺失值?..等
以上這些問題的本質其實是為了分析資料,也就是探索式數據分析(EDA; Exploratory Data Analysis)
Day2 作業:可參考 my Github - Day_002_HW.ipynb
Day 2. 主要是練習 Pandas 的操作:
1. 資料的讀取 :
import os import numpy as np import pandas as pd import seaborn as sns
# 設定 data_path dir_data = './data/' f_app = os.path.join(dir_data, 'application_train.csv') #讀取train_data print('Path of read in data: %s' % (f_app)) app_train = pd.read_csv(f_app) f_app_test = os.path.join(dir_data, 'application_test.csv') #讀取test_data app_test = pd.read_csv(f_app_test)
Path of read in data: ./data/application_train.csv
2. 資料的操作
pd.info() 可以看資料的整體架構資訊
app_train.info() , app_test.info()
資料的row = 307511 , columns = 122 , data_type : float64(65), int64(41), object(16) , 佔記憶體286.2+ MB…等等,一目了然。
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 307511 entries, 0 to 307510
Columns: 122 entries, SK_ID_CURR to AMT_REQ_CREDIT_BUREAU_YEAR
dtypes: float64(65), int64(41), object(16)
memory usage: 286.2+ MB
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 48744 entries, 0 to 48743
Columns: 121 entries, SK_ID_CURR to AMT_REQ_CREDIT_BUREAU_YEAR
dtypes: float64(65), int64(40), object(16)
memory usage: 45.0+ MB
pd.columns 可以看 columns 總共有哪些?
app_train.columns , app_test.columns
可以看到 train 的 length=122 比 test 多 1,即 ‘TARGET’ 這項。
(Index(['SK_ID_CURR', 'TARGET', 'NAME_CONTRACT_TYPE', 'CODE_GENDER',
        'FLAG_OWN_CAR', 'FLAG_OWN_REALTY', 'CNT_CHILDREN', 'AMT_INCOME_TOTAL',
        'AMT_CREDIT', 'AMT_ANNUITY',
        ...
        'FLAG_DOCUMENT_18', 'FLAG_DOCUMENT_19', 'FLAG_DOCUMENT_20',
        'FLAG_DOCUMENT_21', 'AMT_REQ_CREDIT_BUREAU_HOUR',
        'AMT_REQ_CREDIT_BUREAU_DAY', 'AMT_REQ_CREDIT_BUREAU_WEEK',
        'AMT_REQ_CREDIT_BUREAU_MON', 'AMT_REQ_CREDIT_BUREAU_QRT',
        'AMT_REQ_CREDIT_BUREAU_YEAR'],
       dtype='object', length=122),
 Index(['SK_ID_CURR', 'NAME_CONTRACT_TYPE', 'CODE_GENDER', 'FLAG_OWN_CAR',
        'FLAG_OWN_REALTY', 'CNT_CHILDREN', 'AMT_INCOME_TOTAL', 'AMT_CREDIT',
        'AMT_ANNUITY', 'AMT_GOODS_PRICE',
        ...
        'FLAG_DOCUMENT_18', 'FLAG_DOCUMENT_19', 'FLAG_DOCUMENT_20',
        'FLAG_DOCUMENT_21', 'AMT_REQ_CREDIT_BUREAU_HOUR',
        'AMT_REQ_CREDIT_BUREAU_DAY', 'AMT_REQ_CREDIT_BUREAU_WEEK',
        'AMT_REQ_CREDIT_BUREAU_MON', 'AMT_REQ_CREDIT_BUREAU_QRT',
        'AMT_REQ_CREDIT_BUREAU_YEAR'],
       dtype='object', length=121))
試著將 data 的 target 從資料集分出。
target = app_train['TARGET'] target.shape , print(target) train = app_train.drop(labels = ["TARGET"],axis = 1) # Drop 'TARGET' column print('train.shape :', train.shape,'target.shape :', target.shape)
train.shape : (307511, 121) target.shape : (307511,)
看看 target 分布:
sns.countplot(app_train['TARGET'], palette='Set3')
print("There are {}% target values with 1".format(100 * app_train['TARGET'].value_counts()[1]/app_train.shape[0]))
There are 8.072881945686495% target values with 1
是否有缺失值?
定義缺失值函數
def missing_data(data): total = data.isnull().sum().sort_values(ascending = False) percent = (data.isnull().sum()/data.isnull().count()*100).sort_values(ascending = False) tt = pd.concat([total, percent], axis=1, keys=['Total', 'Percent']) types = [] for col in data.columns: dtype = str(data[col].dtype) types.append(dtype) tt['Types'] = types return(np.transpose(tt))
missing_data(app_train)
將缺失值drop
train_dropna = app_train.dropna()
train_dropna.shape
(8602, 122)
將缺失值補0
train_fillna = app_train.fillna(0)
train_fillna.shape
(307511, 122)
總共有298909筆資料有缺失值,這個問題的補值工作會很重要!!
以上是 Day 2 的練習。許多 Pandas 的操作技巧,對日後遇到問題時所需要 EDA 非常有幫助!!

以下來個小抄方便日後查閱:

沒有留言:

張貼留言