初心者でも理解できる機械学習の前処理入門
はじめに
機械学習で成果を出すためには、まずデータの「質」を高めることが重要ではないでしょうか。 生の状態のデータは、しばしば欠損値が含まれていたり、数値のスケールが統一されていなかったりします。 そのままの状態でアルゴリズムに渡すと、学習結果が偏ることや、そもそもエラーが起きることもあります。 そういった問題を解決するために必要なのが「前処理」です。 前処理を適切に行うことで、機械学習モデルの性能が大きく変わることがあります。
前処理の流れは、データクレンジング、欠損値補完、スケーリングなど、段階的に整理して考えるのがポイントですね。 実務でもよくある売上や在庫の分析、マーケティング領域での顧客分析など、ありとあらゆるシーンで必須の工程となっています。 この記事では、初心者でも理解しやすいように具体的な例を交えながら、機械学習における前処理を整理してみたいと思います。
この記事を読むとわかること
- 前処理が必要となる理由と実務での活用シーン
- データクレンジングや欠損値補完、カテゴリ変数のエンコーディングの手順
- 正規化や標準化など、スケーリング処理の具体例
- 外れ値処理の考え方と対応策
- Pythonを使った前処理のサンプルコードの流れ
前処理が必要となる理由
多くの現場では、データが蓄積されるシステムやフォーマットが統一されていないケースがあります。 たとえば売上データ、在庫データ、ユーザー情報などが異なる管理ツールで別々に扱われ、結合しようとするとフォーマットがバラバラということも珍しくありません。
前処理はそういったデータの混乱を整理し、機械学習に利用できる統一的な形へ近づけるための大切なステップです。 もし前処理が不十分だと、アルゴリズムの学習過程でノイズとして扱われたり、モデルの評価指標が低下する原因になったりします。 ですから、どのようなアルゴリズムを使うかを検討する前に、まずはデータを「クリーン」に整える段階が不可欠ではないでしょうか。
データが汚いと何が起きるか
例えば数値が欠損している状態のデータをそのまま学習モデルに入れると、エラーが発生することがあります。 エラーまではいかなくても、カテゴリ変数が文字列のままだと数値的な演算ができないため、誤った処理につながることもあります。 またデータのスケールが整っていないと、重回帰などのアルゴリズムで特定の変数だけが大きく影響してしまうかもしれません。
このようなデータを放置して学習を進めると、結果の解釈が難しくなるだけでなく、ビジネスの場面での活用にも支障が出ます。 結局、手戻りが大きくなり、開発工数が増えてしまうことも考えられますね。
実務でのよくある活用シーン
実務の観点では、売上予測や顧客離反率の予測などで、前処理が大きな意味を持ちます。 たとえば小売業界ではPOSシステムから取得した売上データと在庫データを組み合わせる際、日付フォーマットや店舗コードが合わないケースがよくあります。 こうしたデータ同士を結合するためには、フォーマットを合わせ、時系列に沿った整理が必須です。
また、マーケティング領域では顧客プロフィールの情報が部分的に抜けている(欠損している)ことが多いものです。 これを補完せずに放置すると、顧客分析の精度が低くなる恐れがあります。 実務のどんな場面であっても「データをきれいに整える」ことが成果につながるのですね。
前処理のステップ
前処理にはさまざまな工程がありますが、大きく分けて下記のようなステップが考えられます。
項目 | 説明 |
---|---|
欠損値 | 空欄やNullになっているデータ |
外れ値 | 他と比べて大きく乖離したデータ |
正規化 | スケールを0~1に合わせる手法 |
標準化 | 平均0、分散1に近づける手法 |
もちろんこれらだけが全てではありませんが、初心者がまず押さえておきたいポイントといえるでしょう。
データクレンジング
多くのデータセットには不要な文字列や重複行、誤った日付形式などが含まれています。 こうした不整合を取り除くことで、後の分析や学習で余計なエラーが発生しにくくなります。 よくある手法としては、重複行の削除やカラムの型変換があります。
たとえば売上データで、日付が文字列になっている場合は、日付型に変換することが多いです。 このような型変換を怠ると、時系列分析や集計がうまくできません。
欠損値の補完
欠損値がある場合、そのままにするとアルゴリズムがエラーを起こすことがあります。 そこで、欠損値を補完する手法を考えますが、補完方法の選択はとても重要ですね。 平均値や中央値で埋める単純なやり方もあれば、線形補完や前後の値を使った補完など、さまざまな方法があります。
どの方法を選ぶかはデータの性質によります。 例えば売上データの欠損が休日にあたるのか、それともシステム障害でデータが抜けたのかによって、妥当な補完方法は変わってきます。
カテゴリ変数のエンコーディング
文字列のままのカテゴリ変数は、そのままでは数値演算を行うアルゴリズムで扱えません。 そこでエンコーディングが必要になります。 代表的な方法としては、One-HotエンコーディングやLabelエンコーディングが挙げられます。
One-Hotエンコーディングでは、カテゴリの種類ごとに新たなカラムを作り、そのカテゴリのときだけ1、それ以外は0を入れます。 一方、Labelエンコーディングはカテゴリを整数値に置き換える手法です。 どちらを使うかはアルゴリズムの性質やカテゴリ数によって選ぶといいですね。
正規化と標準化
数値データの範囲が大きく異なると、勾配降下法を用いたアルゴリズムで学習速度が遅くなることや、精度に偏りが出ることがあります。 そこで役立つのが正規化や標準化です。 正規化は0~1の範囲に収める方法であり、標準化は平均を0、分散を1にする方法を指します。
どちらもスケーリング手法の一種ですが、データの分布状況やアルゴリズムの特徴によって使い分けることが多いです。 一般的に、多くのアルゴリズムは標準化されたデータを想定していることが多いため、標準化を行うケースはよく見られます。
外れ値処理
外れ値は、他のデータと比べて極端に大きいか小さい数値であることが多いです。 外れ値があると、平均値や分散といった統計量が大きく歪む可能性があります。 そのため、外れ値を削除するか、適切に補正するかを検討する必要があります。
実務では、たとえば売上データで異常に高い金額が記録されている場合、それが実際に一度に大量購入があったのか、それとも入力ミスなのかを判断することも大切ですね。 どうしても判定が難しい場合は、一旦除外して検証する手法を試すことがあります。
実践的なコード例
ここからはPythonを使った前処理の一例を見てみましょう。 データ分析の現場では、pandasやNumPy、scikit-learnなどのライブラリを組み合わせて前処理を行います。
import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler, MinMaxScaler # データフレームの例を作成 data = { "store": ["A", "A", "B", "B", "C", "C"], "sales": [1000, np.nan, 2000, 8000, 500, 700], "date": ["2023-01-01", "2023-01-02", "2023-01-01", "2023-01-02", "2023-01-01", "2023-01-02"] } df = pd.DataFrame(data) # 日付列を日付型に変換 df["date"] = pd.to_datetime(df["date"]) # 欠損値の確認と平均値補完 null_counts = df.isnull().sum() print("欠損値の数:") print(null_counts) mean_sales = df["sales"].mean() df["sales"] = df["sales"].fillna(mean_sales) # カテゴリ変数のOne-Hotエンコーディング df_encoded = pd.get_dummies(df, columns=["store"]) # スケーリングの例(標準化) scaler = StandardScaler() df_encoded["sales_standard"] = scaler.fit_transform(df_encoded[["sales"]]) # スケーリングの例(正規化) minmax_scaler = MinMaxScaler() df_encoded["sales_minmax"] = minmax_scaler.fit_transform(df_encoded[["sales"]]) print(df_encoded)
上記のコードは、以下のような流れで前処理を行っています。
df["date"]
を日付型に変換し、データクレンジングの一環として扱うdf.isnull().sum()
で欠損値を確認し、平均値で補完するpd.get_dummies
で店舗名をOne-HotエンコーディングStandardScaler
とMinMaxScaler
を使い、標準化と正規化を実行する
こうした手順を踏むことで、機械学習で扱いやすい形へと変換できるわけですね。
補完や外れ値処理などを変更する際は、分析目的やデータの特性を踏まえた上で慎重に選ぶことが多いです。
外れ値の簡単な扱い方
もう少し踏み込んだ例として、外れ値のチェック方法を考えてみましょう。 簡易的には統計量を利用するケースがあります。 例えば四分位範囲(IQR)を用いて外れ値候補を探します。
q1 = df_encoded["sales"].quantile(0.25) q3 = df_encoded["sales"].quantile(0.75) iqr = q3 - q1 lower_bound = q1 - 1.5 * iqr upper_bound = q3 + 1.5 * iqr # 外れ値候補をフィルタリング outliers = df_encoded[(df_encoded["sales"] < lower_bound) | (df_encoded["sales"] > upper_bound)] print("外れ値候補:") print(outliers)
実務では、この外れ値が本当にノイズなのか、それとも意味のあるデータなのかを慎重に判断する必要があります。 単純に削除してしまうと、貴重な情報を失う可能性もあります。
前処理における注意点
前処理はデータ分析や機械学習の入口ですが、実際には奥が深い作業です。 機械学習の性能を高めるためだけではなく、予測結果を正しく解釈するためにも重要となります。
統計的手法やドメイン知識を踏まえずにむやみにデータを補完・削除すると、誤った分析結果を導く恐れがあります。
目的との整合性を意識する
売上予測か、在庫最適化か、あるいは顧客クラスター分析かによって、前処理の重点は変わってきます。 欠損値の取り扱い方やカテゴリ変数の作り方は、目的が異なれば選択が異なることも考えられますね。
さらに、目的との整合性を保つために、必要以上にデータを加工しすぎないよう意識することも大切です。 過剰な前処理は、重要な特徴をそぎ落とす可能性があります。
再現性を確保する
実務のプロジェクトでは、前処理の手順を把握しておかないと、同じデータセットでも別の人が作業すると結果がブレることがあります。 したがって、変換処理や補完の内容を整理し、再度実行できるようにスクリプト化することが多いですね。 継続的にデータが蓄積される業務では、特にこの再現性が欠かせません。
学習データとテストデータの扱い
機械学習で前処理を行う場合、学習用データに適用したスケーリングやエンコーディングのパラメータを、テストデータにも同じように適用する必要があります。 学習データで求めた平均値や分散、あるいはダミー変数の順番といった要素は、テストデータでも共有しなければいけません。
このあたりは初心者にとってつまずきやすいポイントです。 学習データとテストデータの前処理を別々に行うと、微妙なズレが生じてモデルの評価がおかしくなることがあるので注意ですね。
まとめ
機械学習のアルゴリズムに目が行きがちですが、前処理はそれと同じくらい大切ではないでしょうか。 データに含まれる欠損値や外れ値、カテゴリ変数の扱い方を理解しないと、どんな優れたアルゴリズムを使っても望む結果は得にくいものです。 初心者のうちから前処理の基本をしっかり押さえておくことで、将来的にさまざまなデータ分析に応用できるようになります。
この記事で紹介した内容は、あくまで一例です。 実務ではデータの特性や目的に合わせて、より詳細な手順や独自の工夫が加わる場合が多いです。 まずは自分の扱うデータで、欠損値や外れ値のチェック、スケーリングなどを試してみるのが理解を深める近道ですね。
皆さんの学習や実務で、前処理がスムーズに進むことを願っています。 ぜひ今回の内容を参考にして、自分なりの前処理手順を見つけてください。