最近読んでいる本で、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なんじゃないでしょうか。
|
---|
コメントを残す