こんにちは、JS2IIUです。
データ分析や機械学習の精度を高めるためには、「データクリーニング(前処理)」が欠かせません。どんなに高度なモデルを使っても、入力データが汚れていれば結果は信頼できません。
本記事では、Pythonの代表的なデータ処理ライブラリである Pandas を使って、実務でも頻繁に使われる10個のデータクリーニングテクニックを解説します。実際に動作するサンプルコードを通して、「なぜ」「どのように」使うのかを理解していきましょう。今回もよろしくお願いします。
1. データクリーニングとは何か
データクリーニングとは、
「誤った・欠けた・不整合のあるデータを修正・整形し、分析可能な状態にする」
というプロセスです。
例えば、次のような問題が現実のデータにはよく含まれます:
- 一部の値が欠損している
- 数値データに文字列が混じっている
- 同じ行が重複している
- カテゴリ値の表記ゆれ(”Male” と “male” など)
これらを放置すると、機械学習モデルの性能が大幅に低下することがあります。
そのため、Pandasを使って適切にデータを整形することが重要です。
2. Pandasで使える10のデータクリーニングテクニック
以下では、代表的な10のテクニックを順番に紹介します。
実際にPythonコードを試しながら進めてみましょう。
2.1 欠損値(NaN)の確認と処理
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', None],
'age': [25, None, 30, 22],
'city': ['Tokyo', 'Osaka', None, 'Nagoya']
})
# 欠損値の確認
print(df.isna().sum())
# 平均値で補完
df['age'] = df['age'].fillna(df['age'].mean())
# 欠損行を削除
df = df.dropna(subset=['name'])
print(df)解説:isna().sum() で列ごとの欠損数を確認できます。fillna() では平均値・中央値などを使って補完が可能です。
一方、dropna() は欠損行を削除する場合に使います。
2.2 データ型の変換(astype)
df['age'] = df['age'].astype(int)
df['date'] = pd.to_datetime(['2023-01-01', '2023-02-01', '2023-03-01', '2023-04-01'])
print(df.dtypes)型変換を行うことで、分析・機械学習モデルが正しく処理できる形式に整えます。
2.3 重複データの検出と削除
df = pd.DataFrame({
'id': [1, 2, 2, 3],
'name': ['Alice', 'Bob', 'Bob', 'Charlie']
})
df = df.drop_duplicates()
print(df)重複を削除することで、学習データのバイアスを防ぎます。
2.4 外れ値の検出と処理(IQR法)
import numpy as np
df = pd.DataFrame({'value': [10, 12, 13, 14, 100, 15, 13]})
Q1 = df['value'].quantile(0.25)
Q3 = df['value'].quantile(0.75)
IQR = Q3 - Q1
filtered_df = df[(df['value'] >= Q1 - 1.5*IQR) & (df['value'] <= Q3 + 1.5*IQR)]
print(filtered_df)IQR法 は、データのばらつきに基づいて外れ値を自動的に除外できます。
2.5 カテゴリ変数の処理
df = pd.DataFrame({'city': ['Tokyo', 'Osaka', 'Nagoya']})
encoded = pd.get_dummies(df, columns=['city'])
print(encoded)ワンホットエンコーディングにより、カテゴリデータを数値化して機械学習モデルに入力できます。
2.6 文字列データのクレンジング
df = pd.DataFrame({'name': [' Alice ', 'bob ', 'CHARLIE']})
df['name'] = df['name'].str.strip().str.lower().str.capitalize()
print(df)str アクセサを使えば、列全体の文字列整形を簡単に行えます。
2.7 列名・行名の整理
df = pd.DataFrame({'Full Name': ['Alice', 'Bob']})
df = df.rename(columns={'Full Name': 'full_name'})
print(df)列名を一貫した命名に統一することで、後工程でのミスを減らせます。
2.8 条件フィルタリングの効率化
df = pd.DataFrame({'age': [18, 25, 30, 45]})
filtered = df.query('age >= 25 and age <= 40')
print(filtered)query() は、複雑な条件でも読みやすく記述できる便利なメソッドです。
2.9 日付データの整形と抽出
df = pd.DataFrame({'date': pd.to_datetime(['2024-01-01', '2024-02-15', '2024-03-30'])})
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['weekday'] = df['date'].dt.day_name()
print(df)日付データを分解することで、季節性や曜日パターンなどの特徴量を作成できます。
2.10 スケーリング・標準化
from sklearn.preprocessing import StandardScaler
df = pd.DataFrame({'height': [150, 160, 170, 180]})
scaler = StandardScaler()
df['height_scaled'] = scaler.fit_transform(df[['height']])
print(df)特徴量のスケールを統一することで、学習アルゴリズムが安定します。
コラム:データクリーニングとデータクレンジングの違い
「データクリーニング」と「データクレンジング」は似た言葉ですが、実務では微妙に意味が異なります。
| 観点 | データクリーニング | データクレンジング |
|---|---|---|
| 主な目的 | 技術的にデータを整形 | 意味的にデータを正す |
| 主な利用分野 | データ分析・機械学習 | CRM・業務データ管理 |
| 処理対象 | 欠損値・型・フォーマット | 顧客名・住所・メールなど |
| 視点 | アルゴリズムが理解できるか | 人間が正しいと判断できるか |
| 実施者 | データサイエンティスト | データ管理者・業務担当者 |
例で考えると
| name | age | city | |
|---|---|---|---|
| TARO Yamada | 25 | taro@example | Tokoy |
| 山田太郎 | NaN | yamada@example.com | Tokyo |
- データクリーニング:
NaNの補完cityの typo 修正(”Tokoy” → “Tokyo”)ageの型変換
- データクレンジング:
- 「TARO Yamada」と「山田太郎」を同一人物として統合
- 無効なメールアドレスの削除
つまり、
クリーニングは「機械が扱いやすい形に整える」
クレンジングは「人間が信頼できるデータにする」
という違いがあります。
3. 応用例:実務でのクリーニングワークフロー
df = (pd.read_csv('data.csv')
.drop_duplicates()
.fillna({'age': 0})
.assign(age=lambda x: x['age'].astype(int))
.query('age > 18')
)
print(df.head())このように複数の手法をメソッドチェーンで組み合わせると、
可読性が高く再利用しやすい前処理パイプラインを構築できます。
4. まとめ
データクリーニングは、単なる前準備ではなく分析品質を左右する核心工程です。
今回紹介した10のテクニックを使いこなせば、Pandasで実務レベルの前処理ができるようになります。
| テクニック | 概要 |
|---|---|
| 欠損値処理 | fillna, dropna |
| 型変換 | astype, to_datetime |
| 重複削除 | drop_duplicates |
| 外れ値処理 | IQR法 |
| カテゴリ変数 | get_dummies |
| 文字列整形 | str アクセサ |
| 列名整理 | rename |
| 条件抽出 | query |
| 日付整形 | dt アクセサ |
| スケーリング | StandardScaler |
参考リンク
最後まで読んでいただきありがとうございました。


コメント