データのクリーニングと整形
データのクリーニングと整形は、機械学習プロジェクトにおけるデータ前処理の重要なステップです。生データには欠損値や異常値、重複データ、形式の不一致などが含まれていることが多く、そのままではモデルの性能低下につながる場合があります。データを適切に整理し、分析や学習に適した状態へ変換することで、より信頼性の高いモデルを構築できます。
データクリーニングと整形を図で理解する

データのクリーニングとは
データクリーニングは、データセットからノイズや異常値を取り除いたり、欠損値を処理したり、フォーマットを整えたりする作業です。この工程によってデータ品質が向上し、機械学習モデルの精度向上につながります。
データのクリーニングの主な作業
- 欠損値の処理: 欠損データの削除や補完を行う
- 異常値の処理: 外れ値を検出し、削除または補正する
- データ型の変換: 数値や日付など適切な形式へ変換する
- 重複データの削除: 同一レコードを除去する
欠損値の処理
欠損値は、データが入力されていない状態を表します。欠損値が多いと分析結果やモデル学習に悪影響を与えるため、削除や補完による処理が必要です。
欠損データの削除と補完
import pandas as pd
# サンプルデータの作成
data = {'col1': [1, 2, None], 'col2': [4, None, 6], 'col3': [None, 8, 9]}
df = pd.DataFrame(data)
# 欠損データの削除
df_cleaned = df.dropna()
# 欠損データを平均値で補完
df_filled = df.fillna(df.mean())
print(df_cleaned)
print(df_filled)
このコードでは、dropna()で欠損値を含む行を削除し、fillna()で欠損値を平均値で補完しています。
異常値の処理
異常値は、他のデータから大きく外れた値です。測定ミスや入力ミスによって発生することがあり、モデルの学習結果に悪影響を与える場合があります。
異常値の検出と除去
# 基本統計量を確認
print(df.describe())
# 例として3以上の値を除外
df_no_outliers = df[df['col1'] < 3]
print(df_no_outliers)
この例では、統計情報を確認した上で条件を指定し、異常値を除外しています。
データ型の変換
数値が文字列として保存されている場合など、適切なデータ型へ変換する必要があります。正しいデータ型にすることで計算や分析が正しく行えるようになります。
データ型変換の例
# サンプルデータ
data = {'col1': ['1', '2', '3'], 'col2': ['4.0', '5.0', '6.0']}
df = pd.DataFrame(data)
# 数値型へ変換
df['col1'] = pd.to_numeric(df['col1'], downcast='integer')
df['col2'] = pd.to_numeric(df['col2'], downcast='float')
print(df.dtypes)
pd.to_numeric()を使用すると、文字列として保存された数値を適切な数値型へ変換できます。
重複データの削除
同じデータが複数回登録されている場合、分析結果に偏りが生じることがあります。そのため、重複データを削除してデータ品質を維持します。
重複データの削除例
# 重複データの作成
df = pd.DataFrame({
'col1': [1, 2, 2, 3],
'col2': ['A', 'B', 'B', 'C']
})
df_unique = df.drop_duplicates()
print(df_unique)
drop_duplicates()を利用することで、重複行を簡単に削除できます。
データの整形とは
データ整形は、分析や機械学習モデルで利用しやすい形へ変換する作業です。クリーニング後のデータに対して、特徴量として利用しやすい形式へ加工します。
主な整形処理
- 列や行の並び替え: データを扱いやすい順序へ整理
- カテゴリ変数のエンコード: 文字列データを数値へ変換
- 正規化・標準化: 特徴量のスケールを統一
カテゴリ変数のエンコード
機械学習モデルは文字列を直接扱えないことが多いため、カテゴリデータを数値へ変換します。
ダミー変数化の例
# カテゴリ変数
df = pd.DataFrame({
'col1': ['A', 'B', 'A', 'C']
})
df_encoded = pd.get_dummies(df, columns=['col1'])
print(df_encoded)
この例では、カテゴリ値を複数の列に分割して数値化しています。
データの正規化
特徴量ごとの値の範囲が大きく異なる場合は、スケールを揃えるために正規化を行います。
正規化の例
from sklearn.preprocessing import MinMaxScaler
# サンプルデータ
data = {'col1': [1, 2, 3], 'col2': [10, 20, 30]}
df = pd.DataFrame(data)
# 正規化
scaler = MinMaxScaler()
df_scaled = pd.DataFrame(
scaler.fit_transform(df),
columns=df.columns
)
print(df_scaled)
このコードでは、各列の値を0〜1の範囲へ変換しています。
データクリーニングと整形が重要な理由
| 処理 | 目的 |
|---|---|
| 欠損値処理 | 学習時のエラーや精度低下を防ぐ |
| 異常値処理 | 予測結果への悪影響を抑える |
| データ型変換 | 計算や分析を正しく行う |
| 重複削除 | データの偏りを防ぐ |
| エンコード | カテゴリデータを学習可能にする |
| 正規化 | 特徴量のスケールを統一する |