ブログ一覧へ
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呼び出し

まとめ

  1. 完全一致drop_duplicates で即解決
  2. 表記ゆれ → 正規化してから重複検出
  3. 類似名 → SequenceMatcher or fuzzy-wuzzy
  4. 最終判定 → AIに判断させる(データは最小限)

段階的に適用することで、精度と処理速度を両立できます。

ご意見・お問い合わせ

記事の内容についてご質問・ご意見はお気軽に。

サービス改善のためCookieを使用しています。プライバシーポリシー