はじめに — つまずきに寄り添って
表データを扱うと、文字化け、区切り文字の混在、見出しがずれている、日付形式がバラバラ、Excel特有の余計なセル……といった問題に直面します。AIや機械学習に投入する前にこれらをそのままにしておくと、結果が不安定になったりエラーで処理が止まったりします。本稿では、現場で繰り返し発生する問題に対し、再現性のある手順と小さな関数群で構成する実務的なクリーニングパイプラインを示します。まずは落ち着いて、段階的に確認していきましょう。
全体の流れ(概要)
本記事で示す手順は次の5ステップです。各ステップはログ出力と中間成果物の保存を前提にしており、失敗時はロールバック方針に従って安全に戻せるようにします。
| ステップ | 主な作業 | 出力物(例) |
|---|---|---|
| 1) サンプリングによる事前点検 | ファイル種別・encoding・delimiter・シート構造の判定 | 検査レポート(JSON) |
| 2) 安全な読み込み | チャンク/ジェネレータ読み込み、エラー回避設定 | 標準化されたDataFrameストリーム |
| 3) 型推定と正規化 | 数値・日付・カテゴリの推定と一貫化 | スキーマ(JSON) |
| 4) 欠損・異常値の実務対応 | 置換、補完、除外の方針決定と適用 | クリーニング済データ(中間保存) |
| 5) 出力とメタ情報 | JSONL/圧縮出力、チェックサム、品質レポート | 最終ファイル + メタ(checksum, schema) |
小さな関数群で設計するメリット
関数を細かく分けると、例外処理・ログ・ユニットテストが組み込みやすくなります。ここでは推奨する関数名と役割を表にまとめます。
| 関数名 | 役割 | エラー処理・戻り値 |
|---|---|---|
| detect_encoding() | 少量サンプリングで文字コードを判定(chardet等) | 見つからなければ既定のutf-8を返す。例外はログ化してデフォルトにフォールバック |
| detect_delimiter() | CSVの区切り文字を推定(カンマ/タブ/セミコロン等) | 候補とスコアを返す。スコアが低ければユーザー確認フラグを立てる |
| infer_schema() | カラムごとの型推定(数値/日付/カテゴリ/混在) | 型推定結果と不確実性メタを返す。閾値未満はstring指定 |
| normalize_dates() | 日付を標準形式(ISO 8601)に変換 | 変換失敗行は別ファイルに分離しログ化 |
| clean_numeric() | 数値列の小数点・カンマ・通貨記号の除去とnull化 | 変換失敗はNaNにしてカウントを返す |
| write_canonical_jsonl() | 正規化された行をJSONLで出力+gzip圧縮+チェックサム生成 | チェックサムを返し、失敗時は中間ファイルを残してエラーコードを返却 |
ツールとライブラリの実務的な使い分け
標準ライブラリと外部ライブラリの利点・注意点を比較します。現場では「目的に合わせた使い分け」が大切です。
| ツール | 利点 | 注意点 |
|---|---|---|
| csv (標準) | 軽量・低依存。ストリーム処理が容易 | 複雑な型変換やExcelは不得手 |
| pandas | 複雑な変換・集計、Excel読み込みに強い | メモリ消費に注意。大ファイルはチャンク化必須 |
| chardet / charset-normalizer | 文字コード推定に有効 | 100%ではないのでサンプリング+ルールが必要 |
| python-dateutil | 柔軟な日付解析 | あいまい解析は誤解析の可能性あり。明示変換を優先 |
| openpyxl | Excelの細かいフォーマット読み書きが可能 | Excel固有の余計なセルや数式の扱いに注意 |
実務的チェックリスト(出力前に必ず実行)
自動化するべき基本的な品質チェックを示します。閾値を超えた場合はアラートを出し、手動確認を促します。
| チェック項目 | 目的 | 例:閾値と対応 |
|---|---|---|
| 欠損率 | データ欠落の程度を把握 | 列欠損率 > 30% → 列除外または収集元確認 |
| ユニーク数 | カテゴリ安定性の確認 | 想定より多すぎる(例:ID列が重複)→ 対象列の再評価 |
| 分布差異 | 期待分布からの逸脱検出 | 大きな差異→ ログ詳細出力・差分確認 |
| 日付整合性 | 未来日や極端に古い日付の検出 | 不自然な日付が一定割合以上→ 分離して手動確認 |
実務上の注意点(運用を見据えて)
- メモリ対策:大ファイルはチャンク読み込みと生成器で処理。pandasはchunksizeを活用。
- 冪等性:同一入力から同一出力を得るため、変換ルール・タイムゾーン・乱数シードを明示的に保存。
- 中間成果物保存:各ステップでメタ(schema, checksum, ログ)を保存し、失敗時は最後の安全な状態にロールバック。
- エラーと戻りコード:関数は例外を投げるだけでなくエラーコードと説明を返す仕様にすると運用が楽。
CIと自動化のヒント
テストケースは代表的な不良データ(文字化け、複数区切り、混在型日付、Excelの余白行など)を用意し、パイプラインの各関数に対してユニットテストを用意します。CIでは小さなサンプルを使って差分チェックとスキーマ整合性テストを実行します。
現場でよくある失敗パターンと対策(簡潔)
| 失敗例 | 原因 | 対策 |
|---|---|---|
| 文字化けで読み込めない | 未知のエンコード | detect_encoding()でサンプリング判定+明示的エンコード指定 |
| 区切り文字が混在 | 手作業で編集されたCSV | detect_delimiter()で上位候補を提示し、最も一貫した解析結果を採用 |
| 日付が複数形式混在 | ユーザー入力や外部システムの差異 | normalize_dates()でISO化し、変換不能行は分離して報告 |
シリーズとの接続(次の一歩)
本稿で得た正規化データは、第122回/129回で扱ったバッチ推論やスケジューリングに直接つなげられます。さらに第117回のテスト/CIや第123回の可観測性の仕組みに組み込むことで、運用の信頼性を高められます。
まとめ
現場の表データは想定外の欠陥を多く含みます。重要なのは「一度きりの手直し」ではなく、再現性のある手順とログ/メタ情報を残すことです。本稿で示した5ステップと小さな関数群をベースにすれば、AIや機械学習に安全にデータを渡すための堅牢なパイプラインを作れます。まずはサンプリング→安全読み込み→型の明確化→欠損・異常の方針適用→出力とメタ保存、の順に実装して、CIと品質チェックを組み込むことをおすすめします。
次回は、ここで作った正規化データをバッチ推論に流す際の実例とスケジューリング、監視設計について紹介します。