ソニック半日仕事を5分に
「データ分析の8割は、データクレンジングに費やされる」
これはデータサイエンスの世界では有名な格言です。実際、現場のデータは表記ゆれ・空白・重複・全角半角の混在など、そのままでは使えない汚れた状態であることがほとんどです。
私自身、データサイエンス業務でクライアントから受け取るデータは、ほぼ全て「クレンジングが必要な状態」で届きます。しかし、Pythonとpandasを使えば、半日かかっていた手作業のデータ整形が、わずか数分で完了します。
この記事では、業務でよく出会う10パターンのクレンジング手法を、コピペで使えるコード付きで完全解説します。読み終わる頃には、汚れたデータも怖くない状態になっているはずです。
第1章|なぜデータクレンジングが業務の8割を占めるのか
現場のデータは「汚れている」のが普通
教科書や入門書のデータは、最初から綺麗に整理されています。しかし、実際の業務データはまったく違います。
- 入力者によって表記が違う(株式会社・(株)・㈱)
- セルに余分なスペースが入っている
- 全角と半角が混在している(1 と 1)
- 同じ顧客が複数行に分かれている(重複)
- 日付の形式がバラバラ(2026/04/01・2026.4.1・令和8年4月1日)
- 空欄やNULLが大量にある
これらを手作業で修正していると、本来の分析業務に入る前に1日が終わります。
クレンジングを自動化する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|表記ゆれ・全角半角の統一
ケース:会社名の表記ゆれ
こんなデータ、ありませんか?
| 会社名 | 売上 |
|---|---|
| 株式会社ABC | 100000 |
| (株)ABC | 80000 |
| ㈱ABC | 60000 |
これらは全て同じ会社ですが、表記がバラバラのため別会社として集計されてしまいます。
解決コード
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 jaconvimport 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
汚れたデータも、もう怖くない
データクレンジングは、データ分析の地味な準備作業に見えがちです。しかし、ここを自動化できれば、本当の意味でデータを使いこなせるようになります。
「半日かけてクレンジングしていた業務が、5分で終わる」――その瞬間、Pythonの本当の威力を実感できるはずです。
最新の解説記事は、新着記事から順次公開しています。X(旧Twitter)でも更新情報を発信していますので、ぜひフォローしてください。
この記事を書いた人
ソニック|バックオフィス7年目の業務効率化ブロガー。データサイエンス業務でクライアントデータのクレンジングを日常的に行っており、現場で得たノウハウを発信中。


コメント