最近読んでいる本で、pythonの前処理について、データの前処理について、とてもシンプルに書かれていて良かったので、アウトプットしておこうかと思います。
この記事で分かること
pythonでデータ分析をする前の、データ内に未入力箇所(欠損値、null)が入っていた時、とりあえずのデータ処理方法が順に進められます。
参考文献はこちら
データに欠損値があるかどうか確認する方法
1 2 |
# df:データフレーム display(df.isnull().sum()) |
df.isnull()で、nullとなっているフィールドを.sum()でカウントし、それをdisplayで表示させています。
出力はこんな感じ
(参考文献のとおり『タイタニックデータセット』を使っています。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 出力結果 生存 0 等室 0 性別 0 年齢 177 兄弟配偶者 0 両親子供数 0 料金 0 乗船港コード 2 男女子供 0 成人男子 0 デッキ 688 独身 0 dtype: int64 |
これでそれぞれ
年齢、乗船港コード、デッキにそれぞれ欠損値があることが分かりました。
それぞれの処理について書いていきます。
全体に影響が出ないほど少ない→行ごと削除する
dropna()関数:欠損値の削除
1 2 3 4 |
# 欠損値の削除:dropna関数を使う # 乗船港コードの欠損値は 2 しかないので、行ごと削除する。 df = df.dropna(subset = ['乗船コード']) |
数値データは、平均値を代入する
fillna()関数:欠損値に代入
1 2 3 4 5 6 7 |
# 欠損値以外の数値データの平均値で代用する # 平均値の計算 age_average = df['年齢'].mean() # fillna関数の利用 df = df.fillna({'年齢': age_average}) |
質的データは、ダミーコードを代入する
replace()関数:指定のフィールドに代入
1 2 3 4 5 |
# 欠損を意味するダミーコード'N'を代入する df = df.replace({'デッキ': {np.nan: 'N'}}) # 予め nuppy を np としてインポートしておくこと |
2値のラベルを数値化する
例えば、male/femaleという2値のデータはそのままでは、学習モデルに入れられないので、
male → 1
female → 0
に置き換える。replace()関数でも良いが、map関数が便利
1 2 3 4 5 6 7 8 9 10 11 |
# 辞書 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関数を使う
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 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 の範囲内の方が制度がよくなるため、正規化を行う
1 2 3 4 5 6 7 8 9 |
# standardization df13 = df12.copy() from sklearn.preprocessing import StandardScalar stdsc = StandardScaler() df13[['年齢', '料金']] = stdsc.fit_transform(df13[['年齢', '料金']]) # 結果確認 display(df13.head()) |
だいたいこれでOKなんじゃないでしょうか。
![]() |
![]() |
---|
コメントを残す