本文へスキップ
ひもとくAI

データの前処理

レッスン 4/5

欠損値(データの空白)を扱う

現実のデータには、値が入っていない箇所がよくあります。例えば、アンケートで一部の質問に答えていない人がいたり、センサーが一時的に故障して記録が取れなかったりする場合です。このような「値が入っていない箇所」を 欠損値 と呼びます。

pandasでは、欠損値はNaN(Not a Number)として表されます。

import pandas as pd
import numpy as np

data = {"name": ["太郎", "花子", "次郎"], "score": [80, np.nan, 65]}
df = pd.DataFrame(data)

df.isna()          # 各値が欠損値かどうかをTrue/Falseで確認
df["score"].isna().sum()  # 欠損値の個数を数える

欠損値の扱いは、道具によって違います。pandasのdf["score"].mean()は、欠損値を 自動的に飛ばして 残りの値だけで平均を計算します(この例では80と65の平均で72.5)。一方、NumPyの配列で平均を計算すると、答えがnanになってしまいます。また、多くの機械学習のモデルは、欠損値が混ざったデータをそのまま学習できません。

気づかないうちに計算から外れていたり、エラーになったりするのを避けるため、欠損値は前処理の段階で自分で扱い方を決めます。代表的な対処方法が2つあります。

df.dropna()                       # 欠損値がある行を削除する
df.fillna(df["score"].mean())     # 欠損値を平均値などで埋める

どちらを選ぶかは状況次第です。「削除しても十分なデータ量が残るか」「欠損していること自体に意味がないか」を考えて判断します。この判断そのものが、データ分析の重要なスキルの一つです。

外れ値とデータ型の一貫性

前のレッスンで、散布図の中で他の点から大きく離れた点を「外れ値」と呼ぶと説明しました。前処理の段階でも、この外れ値をどう扱うかを検討します。

例えば、年齢のデータに150という値が混ざっていたら、明らかな入力ミスの可能性が高いでしょう。こうした「ありえない値」は、削除するか、調査して修正するのが一般的です。一方で、外れ値に見えても実は重要な意味を持つデータ(不正利用の検知など)もあるため、「とりあえず消す」と機械的に判断しないことが大切です。

また、Pythonの基礎の単元で学んだ「データ型」も、前処理で重要な確認ポイントです。

df.dtypes  # 各列のデータ型を確認する

例えば、本来は数値であるべき列が、何らかの理由で文字列型になっていることがあります(空白や記号が混ざっているなど)。これに気づかずに計算しようとすると、以前学んだTypeErrorのようなエラーの原因になります。

値の大きさをそろえる

項目によって数値の大きさが大きく違うことがあります。例えば、「年齢(0〜100くらい)」と「年収(万円、数百〜数千)」を一緒に使うと、数値の大きい年収の方ばかりが目立ってしまい、学習がうまく進まないことがあります。そこで、それぞれの項目を割り算して、0〜1のような同じくらいの範囲にそろえる前処理を行います。例えば、値が0〜16の範囲なら、16で割れば0〜1にそろいます(第6章の手書き数字のデータで、実際にこの処理を行います)。

前処理は地味に見えますが、「ゴミからはゴミしか作れない(Garbage In, Garbage Out)」と言われるほど、この後の分析・モデルの精度を左右する重要な工程です。

演習

演習を読み込んでいます…