ブログ一覧へ
Excel/CSV処理
顧客リストの重複をなくす方法
顧客リストの名寄せ・重複削除を、pandas + OpenAI APIで自動化する実践的な手法を紹介します。
2026-05-07Excel/CSV処理
顧客リストの重複問題
複数のシステムや担当者が管理する顧客リストには、こんな重複が潜んでいます:
| 問題 | 例 |
|---|---|
| 表記ゆれ | 「株式会社ABC」「(株)ABC」「ABC株式会社」 |
| 入力ミス | 「yamada@example.com」「yamad@example.com」 |
| 旧住所と新住所 | 「東京都千代田区○○1-1」「千代田区○○1-1-1」 |
| 姓名の順序 | 「山田 太郎」「太郎 山田」 |
これを手作業で見つけるのは限界があります。
pandasでの完全一致重複削除
まず基本——完全に同じ行を削除するケース。
import pandas as pd
df = pd.read_csv('customers.csv')
# メールアドレスが完全一致する重複を削除
# keep='first' で最初の出現を残す
df_deduped = df.drop_duplicates(subset=['email'], keep='first')
print(f"削除前: {len(df)}件 → 削除後: {len(df_deduped)}件")表記ゆれの正規化
会社名の表記ゆれを正規化してから重複検出します。
import unicodedata
import re
def normalize_company_name(name: str) -> str:
if not isinstance(name, str):
return ''
# 全角→半角変換
name = unicodedata.normalize('NFKC', name)
# 法人格の統一(前後両方に対応)
name = re.sub(r'(株)|㈱|\(株\)', '株式会社', name)
name = re.sub(r'株式会社$', '', name) # 末尾の株式会社を除去
name = re.sub(r'^株式会社', '', name) # 先頭の株式会社を除去
# スペース・記号の除去
name = re.sub(r'[\s ・\-_]', '', name)
return name.strip().lower()
df['company_normalized'] = df['会社名'].apply(normalize_company_name)類似度でのファジーマッチング
完全一致しない重複はfuzzy matchingで検出します。
from difflib import SequenceMatcher
def similarity(a: str, b: str) -> float:
return SequenceMatcher(None, a, b).ratio()
# 類似度80%以上のペアを検出
duplicates = []
companies = df['company_normalized'].tolist()
for i in range(len(companies)):
for j in range(i + 1, len(companies)):
sim = similarity(companies[i], companies[j])
if sim >= 0.8:
duplicates.append({
'index_a': i,
'index_b': j,
'company_a': df.iloc[i]['会社名'],
'company_b': df.iloc[j]['会社名'],
'similarity': f"{sim:.1%}"
})
print(f"類似ペア: {len(duplicates)}件")AIで判定を自動化
大量のデータでは、類似度でフラグを立てた後にAIで最終判定させます。 ただしこの場合も、実データをAIに渡すのは最小限にします。
def is_same_company(name_a: str, name_b: str) -> bool:
"""
2つの会社名が同一企業かどうかをAIに判定させる。
メールや住所など機密情報は渡さない。
"""
prompt = f"""
以下の2つの会社名は同一企業ですか? yes/no で答えてください。
会社名A: {name_a}
会社名B: {name_b}
"""
# ... OpenAI API呼び出しまとめ
- 完全一致 →
drop_duplicatesで即解決 - 表記ゆれ → 正規化してから重複検出
- 類似名 → SequenceMatcher or fuzzy-wuzzy
- 最終判定 → AIに判断させる(データは最小限)
段階的に適用することで、精度と処理速度を両立できます。