はじめに
データ分析の最初のステップは、データ準備 → 可視化 → データ概観 です。
現実データは乱れていたり、整っていないことが多いので、このステップの前に前処理を行わなければならない場合があります。
この前処理は、かなり手間を要します。乱れたデータを見を見た瞬間にあきらめている方も多いかもしれません。
例えば、
- データに欠損値がある:通常 欠損値は「空白」ですが、わざわざある記号("---"等)で識別している場合もある
- 異常データが混在している:数値データの中に文字データが混在している、通常はあり得ない数値や文字のデータがある
- 16進数の値のデータがある:16進数は数値ですがPythonは数値なのに文字と認識します。10進数に変換しないといけない。
- 「/区切り」で複数データが入力されたデータ:Excelのひとつのセルに”/”区切りで、複数データがインプットされていると表現するとわかっていただけると思います。
これらへの対処は、順序も意識しないといけません。
-
16進数データがある場合、先に「文字データ」を除去すると(文字と認識される)16進数データはすべて除去されてしまいます。
-
あるデータ列のみ欠損値がとても多い場合、「欠損値」を削除=多くのデータを削除することになります。
(初心者なので)Pythonで前処理を実施するだけでも大変なのに、処理する順序にも気を配らないといけませんので、なかなか大変です。
確実かつ丁寧にやるならPythonではなくてEXCELで対応すればいいんじゃないか・・・ これもカラム数が多いとやってられませんので、なんとか効率よくやりたいんですよね。
「すべての欠損データや異常データは捨てる」と割り切れば、すこしは楽になれるのですが。。。諦めたら負けです。
そこで、以下3パターンの前処理をPythonで実行してみることにしました。 -
① すべてのデータを生かすため、異常データを-99、Nanを-1に置換
-
② すべてのデータのうち、異常データだけを-99に置換、Nanはそのまま
-
③ 異常データ、Nanデータをすべて削除
※Pythonでの前処理は、以下記事でも触れています。
実行条件など
- Google colabで実行
- 任意のデータUploadだけではなく、機械学習データセット Boston_housing :regression / Diabetes :regression / Breast_cancer :binary / Titanic :binary / Iris :classification / Loan_prediction :binary も実行できるようにしています。
- 実行コードは以下
実施したデータ前処理の内容と順序
データ前処理における悩み
1. 異常データと欠損値は消したくない
例えば、検査データの場合、検査NGデータには必ず欠損値があります。
NGとなった時点で検査は停止し、停止以降の検査は実行されないからです。
「欠損値があるデータ行は除く」ということを行うと、検査NGデータの多くを捨ててしまうことになります。
また、異常データも同様です。「数値カラムに文字が混在している」等のデータを異常データと認識していますが、これに傾向があれば検査NGの原因に近づけるかもしれません。データを消してしまえば この可能性も消してしまうことになります。
では、「異常データと欠損値は残せばいいじゃん」ということなのですが、異常データは数値カラムに混在した文字、欠損値も「---」等で識別されている場合があり、数値に置換するなど適切に処理しないと、該当カラムは数値として扱うことができません。
2. カラムには数値しか入力されていないのに文字認識されることがある
intとfloatが混在しているとobject(文字)として認識されるようです。
先の異常データや欠損値の処理を行っただけでは安心できません。各カラムのデータ型を確認し、状態に応じ、データを適切な型に変える必要があります。
3. カラム数が膨大である場合、データ前処理をカラム毎に行うのは面倒
1カラムづつ処理を行うならば、EXCELで十分です。
Pythonで実行するなら、データセット全体に1アクションで処理を行えるようにした方が効率的です。
例えば以下のような処理です。
- 異常値やN.A.を指定数値に置換
- ラベルエンコードしない文字列は一気にカラムごと削除
- 分析で文字化けしないよう、カラムを英字に翻訳
objectラベルは、一気にラベルエンコードするか否かで迷いましたが、エンコードするカラムを個別に指定、指定しなかったカラムはまとめて削除としました。
最後に
データ前処理は単純なようで、単純ではないところがあります。
データセットが「欠損なし、すべて数値」という場合は可視化に直行できますが、現実は甘くありませんね。
参考