第135回 実務で使える表データ前処理:Pythonで作る堅牢なCSV/Excelクリーニングパイプライン

はじめに — つまずきに寄り添って

表データを扱うと、文字化け、区切り文字の混在、見出しがずれている、日付形式がバラバラ、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と品質チェックを組み込むことをおすすめします。

次回は、ここで作った正規化データをバッチ推論に流す際の実例とスケジューリング、監視設計について紹介します。