猿でもわかるAIプログラミングシリーズ 🐵💻 Pythonで始めるAI用データの前処理入門



## 1. はじめに：AI開発は「前処理」で決まる？

機械学習やAIモデルの開発において、データの前処理（Preprocessing）はあまり目立たないけれど、実は精度や再現性に大きな影響を与える“裏方”の存在です。
現場でよくあるのは、「モデルを変えても精度が上がらない」というケース。実はその原因の多くは、**前処理の質**にあります。

本記事では、Pythonを使ったAI開発の基礎中の基礎である「データの前処理」にフォーカスし、現場でそのまま使えるコードと共に解説していきます。

---

## 2. 前処理ってそもそも何？どんな役割？

前処理とは、**生データ（Raw Data）をAIモデルが学習できる状態に変換する一連の作業**を指します。たとえば：

* 欠損値の処理
* 異常値の除去
* カテゴリ変数の数値化（One-hot encoding）
* 正規化・標準化
* テキストのクリーニング
* 特徴量エンジニアリング

前処理の良し悪しが、モデルの性能や過学習のリスクに直結します。

---

## 3. Pythonで実践！データ前処理のステップ

ここでは、Python（pandas + scikit-learn）を使って前処理の基本的な流れを見ていきます。使用するのはKaggleでもよく見かけるタイタニックデータセットです。

```python
import pandas as pd
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline

# データの読み込み
df = pd.read_csv('https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv')

# 特徴量とターゲットに分離
X = df[['Pclass', 'Sex', 'Age', 'Fare', 'Embarked']]
y = df['Survived']
```

### ステップ① 欠損値の補完

```python
# 数値とカテゴリで別々の処理を定義
numeric_features = ['Age', 'Fare']
numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='mean')),     # 平均値で補完
    ('scaler', StandardScaler())                     # 標準化
])

categorical_features = ['Sex', 'Embarked']
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')), # 最頻値で補完
    ('onehot', OneHotEncoder(handle_unknown='ignore'))     # One-hot
])
```

### ステップ② ColumnTransformerで統合

```python
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)
    ])
```

### ステップ③ Pipeline化で本番対応

```python
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

# 前処理 + モデル をPipeline化
clf = Pipeline(steps=[
    ('preprocessor', preprocessor),
    ('classifier', LogisticRegression())
])

# 学習・評価
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
clf.fit(X_train, y_train)
print("テスト精度: {:.2f}".format(clf.score(X_test, y_test)))
```

---

## 4. 現場で使えるTIPSとよくあるミス

### ✅ 現場Tips

* **前処理はPipelineで一元管理**：開発・本番での再現性を高める
* **訓練データだけでfit()**：情報リーク防止
* **前処理を外部化する場合はスキーマ管理を明確に**

### ❌ よくあるミス

* `SimpleImputer`をtestデータに直接fitしてしまう
* One-hotの次元不一致エラー（train/testでカテゴリ数が違う）
* 正規化の前に欠損値が残っている → NaNが伝染

---

## 5. 応用編：前処理の自動化やML Opsへの展開

現場では毎回データが違うため、再利用性の高い**前処理テンプレート**や\*\*自動化ライブラリ（Auto-sklearn, Optunaなど）\*\*を導入するケースもあります。

また、最近では前処理パイプラインをそのままMLflowやKubeflowで運用する「前処理のMLOps化」も進んでいます。

---

## 6. まとめ：地味だけど最強のスキル

| 項目     | 説明                                  |
| ------ | ----------------------------------- |
| ✅ 長所   | 精度・再現性の向上、再利用性の向上、本番運用しやすい          |
| ⚠️ 短所  | 地味、手間がかかる、試行錯誤が多い                   |
| 🚀 将来性 | AutoML、Data-centric AI、MLOpsでさらに重要に |

**前処理を制する者がAI開発を制す**。
地味だけど確実にスキルアップにつながる領域なので、ぜひ本記事を参考に、自分のプロジェクトに前処理パイプラインを取り入れてみてください！

---

## 📎 関連リンク

* [scikit-learn公式ドキュメント](https://scikit-learn.org/stable/)
* [Kaggle Titanicデータセット](https://www.kaggle.com/c/titanic)
* [Feature-engine: 高度な特徴量前処理ライブラリ](https://feature-engine.trainindata.com/en/latest/)