欠損値の処理【python前処理覚書】

pythonLOGO

最近読んでいる本で、pythonの前処理について、データの前処理について、とてもシンプルに書かれていて良かったので、アウトプットしておこうかと思います。

この記事で分かること

pythonでデータ分析をする前の、データ内に未入力箇所(欠損値、null)が入っていた時、とりあえずのデータ処理方法が順に進められます。

参考文献はこちら

データに欠損値があるかどうか確認する方法

# df:データフレーム
display(df.isnull().sum())

df.isnull()で、nullとなっているフィールドを.sum()でカウントし、それをdisplayで表示させています。

出力はこんな感じ
(参考文献のとおり『タイタニックデータセット』を使っています。)

# 出力結果
生存    0
等室    0
性別    0
年齢  177
兄弟配偶者    0
両親子供数    0
料金    0
乗船港コード    2
男女子供    0
成人男子    0
デッキ    688
独身    0
dtype: int64

これでそれぞれ

年齢、乗船港コード、デッキにそれぞれ欠損値があることが分かりました。
それぞれの処理について書いていきます。

全体に影響が出ないほど少ない→行ごと削除する

dropna()関数:欠損値の削除

# 欠損値の削除:dropna関数を使う
# 乗船港コードの欠損値は 2 しかないので、行ごと削除する。

df = df.dropna(subset = ['乗船コード'])

数値データは、平均値を代入する

fillna()関数:欠損値に代入

# 欠損値以外の数値データの平均値で代用する

# 平均値の計算
age_average = df['年齢'].mean()

# fillna関数の利用
df = df.fillna({'年齢': age_average})

質的データは、ダミーコードを代入する

replace()関数:指定のフィールドに代入

# 欠損を意味するダミーコード'N'を代入する

df = df.replace({'デッキ': {np.nan: 'N'}})

# 予め nuppy を np としてインポートしておくこと

2値のラベルを数値化する

例えば、male/femaleという2値のデータはそのままでは、学習モデルに入れられないので、

male → 1
female → 0

に置き換える。replace()関数でも良いが、map関数が便利

# 辞書 mf_map の定義
mf_map = {'male': 1, 'female': 0}

# df1に値渡しをしてからmap関数を利用して数値化
import copy
df1 = df.copy()
df1['性別'] = df1['性別'].map(mf_map)

#結果確認
display(df1.head())

多値ラベルの数値化はOne-Hotエンコーディング

get_dummies関数を使う

# df 対象データフレーム
# column対象列

def enc(df, column):
    # One Hot Vector生成
    df_dummy = pd.get_dummies(df[column], prefix=column)
    # 元列の削除
    df_drop = df.drop([column], axis=1)
    # 削除したデータフレームと、One Hot生成列を連結
    df1 = pd.concat([df_drop,df_dummy], axis=1)
    return df1

# 使用例
df10 = enc(df8, '男女子供')

正規化する

入力データの絶対値は -1 ~ 1 の範囲内の方が制度がよくなるため、正規化を行う

# standardization

df13 = df12.copy()
from sklearn.preprocessing import StandardScalar
stdsc = StandardScaler()
df13[['年齢', '料金']] = stdsc.fit_transform(df13[['年齢', '料金']])

# 結果確認
display(df13.head())

だいたいこれでOKなんじゃないでしょうか。




 

あ、宜しければ・・・。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です