【完全マニュアル】Pythonで業務データを自動クレンジング

ソニック

半日仕事を5分に

「データ分析の8割は、データクレンジングに費やされる」

これはデータサイエンスの世界では有名な格言です。実際、現場のデータは表記ゆれ・空白・重複・全角半角の混在など、そのままでは使えない汚れた状態であることがほとんどです。

私自身、データサイエンス業務でクライアントから受け取るデータは、ほぼ全て「クレンジングが必要な状態」で届きます。しかし、Pythonとpandasを使えば、半日かかっていた手作業のデータ整形が、わずか数分で完了します。

この記事では、業務でよく出会う10パターンのクレンジング手法を、コピペで使えるコード付きで完全解説します。読み終わる頃には、汚れたデータも怖くない状態になっているはずです。

第1章|なぜデータクレンジングが業務の8割を占めるのか

目次

現場のデータは「汚れている」のが普通

教科書や入門書のデータは、最初から綺麗に整理されています。しかし、実際の業務データはまったく違います。

  • 入力者によって表記が違う(株式会社・(株)・㈱)
  • セルに余分なスペースが入っている
  • 全角と半角が混在している(1 と 1)
  • 同じ顧客が複数行に分かれている(重複)
  • 日付の形式がバラバラ(2026/04/01・2026.4.1・令和8年4月1日)
  • 空欄やNULLが大量にある

これらを手作業で修正していると、本来の分析業務に入る前に1日が終わります。

クレンジングを自動化する3つのメリット

  1. 時間短縮:半日仕事が数分で完了
  2. ヒューマンエラー削減:見落とし・修正ミスがゼロに
  3. 再現性:同じ処理を何度でも同じ結果で実行可能

一度クレンジングコードを書けば、来月も再来月も使い回せます。「業務の積立貯金」のような効果があります。

第2章|クレンジングの典型10パターン

業務データのクレンジングで遭遇する典型パターンを10個に整理しました。この記事では特に重要な3パターンをコード付きで解説します。

Noパターン具体例
1表記ゆれの統一「株式会社」「(株)」「㈱」を統一
2全角半角の統一「123」を「123」に
3空白・改行の除去セル内の余分な空白・改行を削除
4重複データの除去同じ顧客が複数行ある場合の対処
5欠損値の処理空欄を0や平均値で埋める
6日付形式の統一様々な日付表記を1つに揃える
7数値の型変換文字列の数字を数値型に変換
8外れ値の検出・除外異常な値を特定して除外
9特殊文字の除去制御文字や絵文字の処理
10カラム名の整形列名のスペース・改行を削除

第3章|環境準備(uv環境前提)

この記事は、uv環境でPythonを使う前提で進めます。まだuvをインストールしていない方は、別記事「【完全版】uv入門」をご覧ください。

必要なライブラリ

プロジェクトフォルダで、以下のコマンドを実行します。

uv add pandas openpyxl

第4章|実例1|表記ゆれ・全角半角の統一

ケース:会社名の表記ゆれ

こんなデータ、ありませんか?

会社名売上
株式会社ABC100000
(株)ABC80000
㈱ABC60000

これらは全て同じ会社ですが、表記がバラバラのため別会社として集計されてしまいます。

解決コード

import pandas as pd

df = pd.read_excel("売上データ.xlsx")

# 会社名の表記を統一
df["会社名"] = df["会社名"].str.replace("(株)", "株式会社", regex=False)
df["会社名"] = df["会社名"].str.replace("㈱", "株式会社", regex=False)

# 結果確認
print(df.groupby("会社名")["売上"].sum())

3つの表記がすべて「株式会社ABC」に統一され、正しい合計が出ます。

全角半角の統一

「123」と「123」が混在している場合、jaconv(日本語特化の変換ライブラリ)を使うと一発で解決します。

uv add jaconv
import pandas as pd
import jaconv

df = pd.read_excel("顧客データ.xlsx")

# 全角→半角変換(数字とアルファベット)
df["電話番号"] = df["電話番号"].apply(lambda x: jaconv.z2h(str(x), digit=True, ascii=True))

# カタカナを全角に統一(半角カナ→全角カナ)
df["氏名カナ"] = df["氏名カナ"].apply(lambda x: jaconv.h2z(str(x), kana=True))

print(df)

数字・アルファベットは半角、カタカナは全角――業務データの定番ルールを一発で適用できます。

第5章|実例2|空白・改行・特殊文字の除去

ケース:見えない空白でデータが一致しない

「 田中太郎」と「田中太郎」――先頭にスペースが入っているだけで、別人として扱われてしまいます。

解決コード

import pandas as pd

df = pd.read_excel("顧客データ.xlsx")

# 前後の空白を削除
df["氏名"] = df["氏名"].str.strip()

# 全角スペースも削除
df["氏名"] = df["氏名"].str.strip(" ")

# 文字列内の改行を削除
df["備考"] = df["備考"].str.replace("\n", "", regex=False)
df["備考"] = df["備考"].str.replace("\r", "", regex=False)

print(df)

複数の空白を1つに統一

文字列の途中に複数のスペースが入っている場合の対処。

# 連続する空白を1つに
df["住所"] = df["住所"].str.replace(r"\s+", " ", regex=True)

カラム名のクレンジング

Excelからの読み込み時、カラム名にスペースや改行が混入することがあります。

# 連続する空白を1つに
df["住所"] = df["住所"].str.replace(r"\s+", " ", regex=True)

第6章|実例3|重複データの除去

ケース:同じ顧客が複数行ある

名簿データに同じ人が何度も登録されている――よくあるパターンです。

完全一致の重複削除

import pandas as pd

df = pd.read_excel("顧客データ.xlsx")

# 完全に同じ行を削除
df_unique = df.drop_duplicates()

print(f"元データ: {len(df)}行")
print(f"重複削除後: {len(df_unique)}行")

特定列の重複だけ削除

「メールアドレスが同じなら同一人物」とみなしたい場合:

# メールアドレス列で重複削除(最初の出現を残す)
df_unique = df.drop_duplicates(subset=["メールアドレス"], keep="first")

# 最後の出現を残したい場合
df_unique = df.drop_duplicates(subset=["メールアドレス"], keep="last")

複数列の組み合わせで重複判定

# 氏名+電話番号の組み合わせで重複判定
df_unique = df.drop_duplicates(subset=["氏名", "電話番号"])

重複している行だけ確認

削除する前に、重複している行を確認したい場合:

# 重複行のみ表示(2回目以降の出現すべて)
duplicates = df[df.duplicated(subset=["メールアドレス"], keep=False)]
print(duplicates)

第7章|実務で使える完成スクリプト

ここまでの内容をまとめた、実務でそのまま使える完成スクリプトです。1つの関数として書いてあるので、コピペして自分の業務データに合わせてください。

汎用クレンジング関数

import pandas as pd
import jaconv
from datetime import datetime

def clean_dataframe(df):
    """
    業務データを一括クレンジングする関数
    """
    # カラム名の整形
    df.columns = df.columns.str.strip()
    df.columns = df.columns.str.replace("\n", "", regex=False)
    
    # 文字列カラムを取得
    str_cols = df.select_dtypes(include=["object"]).columns
    
    for col in str_cols:
        # 前後の空白削除(半角・全角)
        df[col] = df[col].astype(str).str.strip()
        df[col] = df[col].str.strip(" ")
        
        # 改行削除
        df[col] = df[col].str.replace("\n", "", regex=False)
        df[col] = df[col].str.replace("\r", "", regex=False)
        
        # 連続空白を1つに
        df[col] = df[col].str.replace(r"\s+", " ", regex=True)
    
    # 完全重複行を削除
    df = df.drop_duplicates()
    
    return df

# === 使用例 ===
INPUT_FILE = "元データ.xlsx"
OUTPUT_FILE = f"クレンジング済み_{datetime.now().strftime('%Y%m%d')}.xlsx"

# 読み込み・クレンジング・出力
df = pd.read_excel(INPUT_FILE)
print(f"元データ: {len(df)}行 × {len(df.columns)}列")

df_clean = clean_dataframe(df)
print(f"クレンジング後: {len(df_clean)}行 × {len(df_clean.columns)}列")

df_clean.to_excel(OUTPUT_FILE, index=False)
print(f"完了:{OUTPUT_FILE}")

このスクリプトでできること

  • カラム名のスペース・改行を自動除去
  • 全文字列カラムの前後空白を一括削除
  • セル内の改行・連続空白を整形
  • 完全重複行を自動削除
  • 実行日付付きで結果を保存

自分の業務に合わせて、表記ゆれ統一・全角半角変換・特定列の重複削除などを追加していけば、専用のクレンジングツールが完成します。

第8章|つまずき対処&まとめ

よくあるトラブル

トラブル1:str.replaceでエラーが出る

原因:

対象列に欠損値(NaN)が含まれていて、文字列処理ができない。

対処:

# 欠損値を空文字に置換してから処理
df["列名"] = df["列名"].fillna("").str.strip()

トラブル2:drop_duplicatesが効かない

原因:

見た目は同じでも、実は空白や全角半角が違う。

対処:

先に空白除去・全角半角統一などのクレンジングを行ってから重複削除する。

トラブル3:日本語が文字化けする

対処:

# CSV読み込み時にencodingを指定
df = pd.read_csv("file.csv", encoding="cp932")

トラブル4:型変換でエラーが出る

原因:

数値列に「-」「*」などの記号が混入している。

対処:

# 数値変換できない値はNaNに(errors="coerce")
df["金額"] = pd.to_numeric(df["金額"], errors="coerce")

この記事のまとめ

  • 実務データの8割は「クレンジングが必要な状態」で届く
  • 典型10パターンを押さえれば、ほとんどのデータに対応できる
  • 表記ゆれ・全角半角・空白・重複の4つが最頻出
  • 汎用関数を作っておけば、毎回数行のコードで一括処理が可能
  • 一度書けば、毎月毎週使い回せる「業務の積立貯金」になる

FAQ

Q1. クレンジングはどこまでやればいいですか?

「分析や集計に支障が出ない程度」が目安です。完璧を目指すより、業務で使えるレベルまで整える方が現実的です。表記ゆれ・空白・重複の3つを押さえれば、ほとんどの業務に対応できます。

Q2. 元データを書き換えるのは怖いです

Pythonでは元ファイルを直接書き換えず、新しいファイルとして保存する運用が一般的です。元データはそのまま残るので、何度でもやり直せます。

Q3. クレンジングで間違って消してしまったら?

重要なデータの場合は、削除前に必ずバックアップを取りましょう。drop_duplicates の代わりに duplicated で「重複している行を確認するだけ」から始めるのが安全です。

Q4. 大量のクレンジングルールがある場合はどうすれば?

ルールが10個以上になる場合は、Excelファイルにルールを書いて、それを読み込んで処理する方式がおすすめです。プログラミング知識がない人もメンテナンスできるようになります。

Q5. クレンジングを自動化するベストな方法は?

1. クレンジング関数を作る、2. 関数を使ったスクリプトを書く、3. Windowsのタスクスケジューラ等で定期実行――この3ステップで完全自動化できます。

汚れたデータも、もう怖くない

データクレンジングは、データ分析の地味な準備作業に見えがちです。しかし、ここを自動化できれば、本当の意味でデータを使いこなせるようになります。

「半日かけてクレンジングしていた業務が、5分で終わる」――その瞬間、Pythonの本当の威力を実感できるはずです。

最新の解説記事は、新着記事から順次公開しています。X(旧Twitter)でも更新情報を発信していますので、ぜひフォローしてください。

この記事を書いた人

ソニック|バックオフィス7年目の業務効率化ブロガー。データサイエンス業務でクライアントデータのクレンジングを日常的に行っており、現場で得たノウハウを発信中。

→ 詳しいプロフィールはこちら→ はじめての方へ

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次