Python 実践 データ加工/可視化 100本ノック に挑戦 ノック88

ノック88 :欠損値の処理をやってみよう

欠損値の数を確認します。

 
import seaborn as sns
from sklearn.model_selection import train_test_split
import pandas as pd

dataset = sns.load_dataset('titanic')
label = dataset.pop('survived')

train_ds,test_ds,train_label,test_label=train_test_split(
    dataset,label,random_state=2021,stratify=label)

train_ds.drop(columns=['embark_town','alive'],inplace=True)

one_hot_encoded = pd.get_dummies(train_ds)
one_hot_encoded = pd.get_dummies(one_hot_encoded,columns=['pclass'])
train_ds = one_hot_encoded

#ノック86
from sklearn.preprocessing import RobustScaler,StandardScaler

age_scaler   = StandardScaler()
sibsp_scaler = RobustScaler()
parch_scaler = RobustScaler()
fare_scaler  = RobustScaler()

train_ds['age']    = age_scaler  .fit_transform(train_ds['age']  .values.reshape(-1,1))
train_ds['sibsp']  = sibsp_scaler.fit_transform(train_ds['sibsp'].values.reshape(-1,1))
train_ds['parch']  = parch_scaler.fit_transform(train_ds['parch'].values.reshape(-1,1))
train_ds['fare']   = fare_scaler .fit_transform(train_ds['fare'] .values.reshape(-1,1))

#ノック88
print(train_ds.isna().sum())
 

 

実行結果

age             137
sibsp             0
parch             0
fare              0
adult_male        0
alone             0
sex_female        0
sex_male          0
embarked_C        0
embarked_Q        0
embarked_S        0
class_First       0
class_Second      0
class_Third       0
who_child         0
who_man           0
who_woman         0
deck_A            0
deck_B            0
deck_C            0
deck_D            0
deck_E            0
deck_F            0
deck_G            0
pclass_1          0
pclass_2          0
pclass_3          0
dtype: int64

 

ageだけ欠損値が137個あることがわかります。

欠損値の処理は2通りあります。

・欠損値のあるデータを除外すること。

・別の値に補完すること。

 

今回は中央値で補完します。

from sklearn.impute import SimpleImputer

age_imputer = SimpleImputer(strategy='median')
train_ds['age'] = age_imputer.fit_transform(train_ds['age'].values.reshape(-1,1))

 

strategyは平均値 (mean)、中央値 (median)、最頻値 (most_frequent)、定数 (constant) の4つの中か

ら選択して指定できます。

 

欠損値がなくなったか確認します。

print(train_ds['age'].isna().sum())

 

実行結果

0

 

最後に欠損値の亡くなったデータをPickleファイルに保存します。

import os
import pickle
os.makedirs('data/imputers/',exist_ok=1)
with open('data/imputers/age_imputer.pkl',mode='wb') as f :
    pickle.dump(age_imputer,f)

 

 

/* -----codeの行番号----- */