名寄せとは?意味・やり方・つまずきやすいポイントをPythonで解説|顧客データから預金保険まで

名寄せ(なよせ)とは、バラバラに登録されている同じ人や同じ会社のデータを見つけ出して、1つにまとめる作業のことです。たとえば顧客名簿に「山田 太郎」「山田太郎」「ヤマダ タロウ」と3回登録されていたら、それが同じ1人だと判断して、1件の顧客としてまとめます。
名寄せは、顧客管理や営業リスト、データ分析の現場でよく使われる言葉ですが、銀行の預金保険や年金の記録でも使われます。この記事では、名寄せの意味と使われる場面、なぜ必要なのか、どうやって進めるのかを、名寄せの手順をPythonで実際に動かしながら解説します。
名寄せとは
名寄せは、もともと「名前を寄せる(集める)」という意味で、同じ名義のものを1か所に集めることを指します。今では主に次のような場面で使われます。
| 場面 | 名寄せでやること |
|---|---|
| 顧客データ・営業リスト | 同じ人や会社が重複して登録されているデータを見つけて、1件にまとめる |
| 銀行の預金保険 | 銀行が破綻したとき、同じ人が持っている複数の口座の預金をまとめて、保護される金額を計算する |
| 年金・行政の記録 | 同じ人の記録が別々の番号や名前で登録されているのを、1人の記録としてまとめる |
| 不動産(固定資産税) | 市区町村が、同じ所有者の土地や建物をまとめた一覧を作る。この一覧は「名寄帳(なよせちょう)」と呼ばれる |
英語では、データの名寄せを「レコードリンケージ(record linkage)」や「エンティティ解決(entity resolution)」、重複をまとめる作業を「重複排除(deduplication)」と呼びます。この記事では、主に顧客データの名寄せを中心に説明し、後半で銀行や年金の名寄せにも触れます。
なぜ名寄せが必要なのか
同じ顧客が複数登録されたままだと、次のような問題が起きます。
- 同じ人に同じ案内を何通も送ってしまう:郵送費やメールの手間がむだになり、受け取った人の印象も悪くなる
- 顧客の全体像が見えない:同じ人の購入履歴や問い合わせが別々の顧客に分かれ、「よく買ってくれるお客さん」を見落とす
- 数字が実態とずれる:顧客数が実際より多く数えられ、分析や経営判断を誤る
- 営業がぶつかる:同じ会社に、別々の営業担当が知らずに連絡してしまう
重複はなぜ生まれるのでしょうか。同じ人でも、入力する人や時期によって、名前の書き方(スペースのあり・なし、全角・半角)、住所の書き方(「2-17-17」と「2丁目17番17号」)、会社名の書き方(「株式会社」と「(株)」)がバラバラになるからです。Webのフォーム、展示会の名刺、電話の問い合わせなど、入口が増えるほど重複も増えます。
名寄せの進め方
データの名寄せは、大きく次の4つの手順で進めます。
- 表記を統一する(正規化・クレンジング):全角と半角、スペース、大文字と小文字、住所や会社名の書き方をそろえる
- 確実な手がかりで照合する:電話番号、メールアドレス、会員番号など、同じなら同じ人だとほぼ言える項目で突き合わせる
- あいまいな手がかりで候補を探す:名前や住所がどれくらい似ているかを数値にして、同じ人かもしれない組み合わせを探す
- 人が確認して、まとめる:自信のないものは人が確認し、最後に1件のデータに統合する。どの情報を残すかのルールも決めておく
Pythonで名寄せをやってみる
この4つの手順を、Pythonの標準機能だけで再現してみます。6件の顧客データのうち、山田太郎さんが3通り、テックジムが2通りの書き方で登録されています。
import re
import unicodedata
from difflib import SequenceMatcher
# 名寄せ前の顧客データ(同じ人・会社が、別々の書き方で登録されている)
records = [
{"id": 1, "name": "山田 太郎", "phone": "03-1234-5678", "email": "Taro.Yamada@example.com", "address": "東京都千代田区永田町2-17-17"},
{"id": 2, "name": "山田太郎", "phone": "0312345678", "email": "", "address": "千代田区永田町2丁目17番17号"},
{"id": 3, "name": "ヤマダ タロウ", "phone": "", "email": "taro.yamada@EXAMPLE.com", "address": ""},
{"id": 4, "name": "株式会社テックジム", "phone": "03-9999-0000", "email": "", "address": "東京都千代田区永田町2-17-17"},
{"id": 5, "name": "(株)テックジム", "phone": "", "email": "", "address": "東京都千代田区永田町2-17-17"},
{"id": 6, "name": "山田 次郎", "phone": "06-1111-2222", "email": "jiro@example.com", "address": "大阪府大阪市北区梅田1-1-1"},
]
# ---- 1. 表記を統一する(正規化) ----
def norm_text(s):
s = unicodedata.normalize("NFKC", s) # 全角英数・半角カナなどをそろえる
s = re.sub(r"\s+", "", s) # 空白を消す
s = s.replace("(株)", "株式会社").replace("㈱", "株式会社")
return s
def norm_address(s):
s = norm_text(s)
s = re.sub(r"^東京都", "", s) # 都道府県のあり・なしをそろえる(例として東京都だけ)
s = re.sub(r"(\d+)丁目(\d+)番(?:地)?(\d+)号?", r"--", s)
s = s.replace("−", "-").replace("ー", "-")
return s
def normalize(r):
return {
"id": r["id"],
"name": norm_text(r["name"]),
"phone": re.sub(r"\D", "", r["phone"]), # 数字だけにする
"email": r["email"].strip().lower(), # 大文字・小文字をそろえる
"address": norm_address(r["address"]),
}
data = [normalize(r) for r in records]
for d in data:
print(d)
# ---- 2. 確実な手がかり(電話・メール)が一致したら同じ人とみなす ----
parent = {d["id"]: d["id"] for d in data}
def find(x):
while parent[x] != x:
x = parent[x]
return x
def union(a, b):
parent[find(a)] = find(b)
for i, a in enumerate(data):
for b in data[i + 1:]:
if (a["phone"] and a["phone"] == b["phone"]) or (a["email"] and a["email"] == b["email"]):
union(a["id"], b["id"])
# ---- 3. あいまいな一致(名前と住所の似ている度合い)は「確認待ち」に回す ----
review = []
for i, a in enumerate(data):
for b in data[i + 1:]:
if find(a["id"]) == find(b["id"]):
continue
name_sim = SequenceMatcher(None, a["name"], b["name"]).ratio()
same_addr = a["address"] and a["address"] == b["address"]
if name_sim >= 0.8 and same_addr:
union(a["id"], b["id"]) # 名前がよく似ていて住所も同じ → 同じとみなす
elif name_sim >= 0.6:
review.append((a["id"], b["id"], round(name_sim, 2)))
groups = {}
for d in data:
groups.setdefault(find(d["id"]), []).append(d["id"])
print("名寄せの結果:", list(groups.values()))
print("人の確認が必要な組み合わせ:", review)
実行結果は次のとおりです(Python 3.9で実行)。
{'id': 1, 'name': '山田太郎', 'phone': '0312345678', 'email': 'taro.yamada@example.com', 'address': '千代田区永田町2-17-17'}
{'id': 2, 'name': '山田太郎', 'phone': '0312345678', 'email': '', 'address': '千代田区永田町2-17-17'}
{'id': 3, 'name': 'ヤマダタロウ', 'phone': '', 'email': 'taro.yamada@example.com', 'address': ''}
{'id': 4, 'name': '株式会社テックジム', 'phone': '0399990000', 'email': '', 'address': '千代田区永田町2-17-17'}
{'id': 5, 'name': '株式会社テックジム', 'phone': '', 'email': '', 'address': '千代田区永田町2-17-17'}
{'id': 6, 'name': '山田次郎', 'phone': '0611112222', 'email': 'jiro@example.com', 'address': '大阪府大阪市北区梅田1-1-1'}
名寄せの結果: [[1, 2, 3], [4, 5], [6]]
人の確認が必要な組み合わせ: [(1, 6, 0.75), (2, 6, 0.75)]
結果の読み方
- 表記の統一:「山田 太郎」と「山田太郎」は同じ書き方になり、半角カナの「ヤマダ タロウ」は全角の「ヤマダタロウ」になりました。電話番号は数字だけ、メールアドレスは小文字にそろい、住所の「2丁目17番17号」も「2-17-17」になっています
- 確実な手がかりでの照合:1番と2番は電話番号が、1番と3番はメールアドレスが一致したので、3件とも同じ人(山田太郎さん)としてまとまりました。3番はカタカナで名前が違いますが、メールアドレスでつながっています
- あいまいな照合:4番と5番は「株式会社」と「(株)」の違いをそろえた結果、名前も住所も一致し、同じ会社としてまとまりました
- 人の確認:「山田太郎」と「山田次郎」は、名前の似ている度合いが0.75と高めですが、住所が違うので、自動ではまとめず「人の確認が必要」としました
最後の点が、名寄せで一番大事なところです。名前が似ていても、別人であることはよくあります。違う人をまとめてしまう(誤統合)と、ある人の情報が別の人に見えてしまうなど、重複よりも深刻な問題になります。そのため、自信のない組み合わせは自動でまとめず、人が確認するのが基本です。
表記の統一に使ったunicodedata.normalize("NFKC", ...)は、全角の英数字や半角カナなどをまとめてそろえる便利な方法です。全角・半角の変換は「mojimojiライブラリとは?」、文字の一括置換は「Python maketrans()とは?」でも解説しています。
名寄せでつまずきやすいポイント
日本語ならではの表記ゆれ
- 名前:旧字体と新字体(「斉藤」「斎藤」「齋藤」)、結婚などによる姓の変更、読み仮名だけの登録
- 住所:「丁目・番地・号」と「ハイフン」、都道府県の省略、マンション名のあり・なし、市町村合併による地名の変更
- 会社名:「株式会社」「(株)」「㈱」の違い、会社名の前につくか後につくか、英語表記、社名変更
注意したいのは、「株式会社テックジム」と「テックジム株式会社」のように、法人格が前か後ろかで別の会社になることがある点です。機械的に「株式会社」を消して比べると、別の会社をまとめてしまうおそれがあります。
会社の名寄せには法人番号が使える
会社の名寄せでは、国税庁が会社ごとに割り当てている13桁の法人番号が強い手がかりになります。法人番号は「国税庁法人番号公表サイト」で、会社名や所在地から誰でも調べることができ、データのダウンロードやAPIでの取得もできます。社名の書き方がバラバラでも、法人番号が同じなら同じ会社だと判断できます。
どの情報を残すか決めておく
同じ人のデータをまとめるとき、住所が2通り登録されていたら、どちらを残すのでしょうか。「更新日が新しいほうを残す」「本人が入力したものを優先する」など、統合のルールを先に決めておかないと、正しい情報を消してしまうことがあります。統合前のデータは、元に戻せるよう保存しておきましょう。
個人情報の扱い
名寄せは個人情報をまとめる作業です。別々の目的で集めた情報をつなげて使うことになるので、個人情報保護法にもとづく利用目的の範囲で行っているか、社内のルールに沿っているかを確認しておく必要があります。
名寄せに使えるツール
| 種類 | 例 | 向いている場面 |
|---|---|---|
| 表計算ソフト | Excel、Googleスプレッドシート | 数百件程度。関数で表記をそろえ、並べ替えて目で確認する |
| Pythonのライブラリ | pandas、recordlinkage、dedupe、Splinkなど | 数千〜数百万件。表記の統一から照合までを自動化する |
| 顧客管理(CRM)・営業支援ツール | Salesforce、HubSpotなどの重複管理機能 | 登録の時点で重複を見つけ、まとめる |
| 名寄せ・データクレンジングの専用サービス | 企業データベースを持つ各社のサービス | 法人データを、外部の企業情報と照らし合わせて整える |
件数が多い場合は、すべての組み合わせを比べると時間がかかりすぎるため、「同じ郵便番号どうしだけ比べる」のように、比べる範囲を絞る工夫(ブロッキング)も使います。pandasの基本は「pandasの使い方を初心者向けに解説」をご覧ください。
銀行の預金保険での「名寄せ」
銀行などの金融機関が破綻したときに預金を守る預金保険制度でも、名寄せという言葉が使われます。預金保険機構によると、一般の預金は1つの金融機関ごとに、預金者1人あたり元本1,000万円までと、破綻日までの利息が保護されます。このとき、同じ人が同じ金融機関に複数の口座を持っていれば、それをまとめて計算します。この作業が預金保険の名寄せです。
金融機関は、万が一の破綻に備えて、名寄せに必要な預金者のデータを速やかに預金保険機構へ提出できるよう、ふだんからデータとシステムを整えておくことが、法律で義務づけられています。住所や名字が変わったときに、金融機関に届け出ておくことは、預金者自身が名寄せを正しく行ってもらうためにも大切です。
年金記録の「名寄せ」
2007年に大きな問題になった、いわゆる「消えた年金記録」も、名寄せの問題でした。基礎年金番号にまとめられていない年金の記録が約5,000万件見つかり、名前の読み方の誤りや、転職・結婚による記録の分散などが原因で、持ち主がわからなくなっていたのです。この問題をきっかけに、記録を持ち主ごとにまとめ直す名寄せの作業が大規模に行われました。
行政の分野では、マイナンバーのように1人に1つの番号を割り当てることで、こうした名寄せを確実に行えるようにする取り組みが進められています。ただし、番号を登録するときの誤りがあれば、別人の情報がつながってしまうおそれもあり、仕組みを作る側にも、データを正しく扱う力が求められます。
よくある質問
名寄せとは簡単に言うと何ですか?
バラバラに登録されている同じ人や同じ会社のデータを見つけて、1つにまとめる作業です。顧客データの整理のほか、銀行の預金保険や年金の記録でも使われる言葉です。
名寄せとデータクレンジングの違いは何ですか?
データクレンジングは、表記ゆれや誤りを直してデータをきれいにする作業全体を指します。名寄せは、その中でも「同じ人・同じ会社のデータをまとめる」ことに重点を置いた作業で、クレンジングは名寄せの最初の手順にもなります。
名寄せはExcelでもできますか?
数百件程度なら、関数で表記をそろえ、並べ替えて目で確認する方法でできます。件数が多い場合や、定期的に行う場合は、Pythonなどで自動化すると効率的です。
名前が似ているデータは、まとめてしまってよいですか?
名前が似ていても別人のことはよくあります。電話番号やメールアドレスなど確実な手がかりが一致しない場合は、自動でまとめず、人が確認するのが安全です。
まとめ
名寄せは、表記をそろえ、確実な手がかりで照合し、あいまいなものは人が確認して、同じ人や会社のデータを1つにまとめる作業です。Pythonの例で見たように、表記の統一だけでも多くの重複が見つかりますが、「山田太郎」と「山田次郎」のように似ていても別人のデータもあるため、自動化と人の確認を組み合わせることが大切です。銀行の預金保険や年金の記録でも、同じ考え方で名寄せが行われています。
名寄せのようなデータの整理は、Pythonを少し学ぶだけで大きく効率化できます。テックジムの無料のプログラミング講座でPythonの基礎から始めてみてください。AIを使ったデータ処理の自動化を学びたい人は、AI駆動開発/生成AIエンジニアコースもご覧ください。






