表記揺れ、データ連携の絶望
CSVファイルを開くと、そこには絶望が広がっている。人事担当者なら一度は経験があるはずだ。新しいタレントマネジメントシステムを導入した。しかし、既存の給与システムとのデータ連携は手作業だという。毎月末、システム担当者から送られてくるCSVファイルをデスクトップに並べ。両者のデータを結合して最新の従業員リストを作成する。言葉にするのは簡単だが、実際に手を動かすと泥沼の作業が待ち受けている。
社員番号が完全に統一されていれば苦労はない。しかし現実の企業環境は甘くない。古いシステムには社員番号の概念すらないこともある。派遣社員や業務委託のメンバーが含まれると、途端に管理コードの体系は崩壊する。結局、氏名だけが唯一のキー項目になっているシステムが社内には山ほどある。

表記揺れが招く非生産工数
ここで立ちはだかるのが、表記揺れという名の魔物だ。「山田 太郎」と「山田太郎」。人間の目には間違いなく同一人物に見える。しかし、ExcelのVLOOKUP関数は冷酷に「#N/A」を突きつけてくる。パソコンは、文字と文字の間に潜む見えない隙間を許してくれありません。
まず、給与システムと勤怠管理システムのCSVをVLOOKUPで結合した際。エラーの「#N/A」が数百件発生した。原因は氏名間のスペースが全角か半角かの違いだけ。目視で一つずつスペースを削る作業を3時間続け。終わる頃にはドライアイで目が真っ赤に充血し、首の後ろが鉛のように重くなっていた。
システムごとにデータの入力規則がバラバラなのだ。入社手続きの際に人事担当者が手打ちしたデータ。社員自身がスマホから登録したデータ。それぞれに全角スペース、半角スペース、スペースなしが入り乱れている。氏名のスペース、全角、半角が不一致の9割以上の原因です。
表記ゆれ修正の不毛な手作業と負担
例えば、1000名規模の企業であれば。この「表記ゆれの目視確認と修正」だけで毎月15時間以上の非生産的な工数が発生している計算になる。
次に、月末の締め切りが迫る中、神経をすり減らしながら数千件の目視照合を繰り返す。CSV/Excelによる手作業の名寄せには数時間の工数がかかる。担当者が退職すれば、新しい担当者が同じ苦しみを味わう。引き継ぎマニュアルには「気をつけて目視する」としか書かれていない。この不毛な連鎖を断ち切る方法が必要です。
Pythonで業務自動化
手作業の限界はすぐそこに来ている。気合いと根性で乗り切るのも限度がある。

人間が目で見て判断しているルールを、プログラミング言語に翻訳してしまえばいい。ここで圧倒的な威力を発揮するのがPythonだ。数万件のデータであっても、コードを実行すれば一瞬で処理が終わる。もちろん、Excelの関数でも置換は行える。SUBSTITUTE関数を何重にもネストして、スペースを消し。全角を半角に変換する。数式は異様に長くなり、セルの奥深くに呪文のように刻み込まれる。
後から見たときに何をどう処理しているのか、作った本人でさえ理解できなくなる。属人化の極みだ。Pythonであれば、データの読み込みから文字の変換、不要なデータの削除まで。一連の流れを上から下へ分かりやすいコードとして記述できる。一度書いたコードは何度でも使い回せる。毎月の名寄せ作業は、ボタンを一つ押すだけで完了する。
Pythonがもたらす業務効率と心の余裕
一方で、Excelの複雑なネスト数式を組んで得意げになっていたが。翌月に別の担当者が数式を壊してしまい復旧に丸1日かかった。その点Pythonのスクリプトはファイルとして独立しているため。誤って誰かに壊される心配がなく、心に圧倒的な余裕が生まれた。
単純な文字列の置き換えにとどまらない。データの形を自在に変え、複数の条件を組み合わせた複雑な照合も可能になる。プログラミングの知識がないバックオフィスの担当者にとって。黒い画面にコードを打ち込むのは最初は敷居が高く感じる。エラーメッセージの英語を見るだけで胃が痛くなる人もいるだろう。しかし、名寄せに特化した数行のコードを覚えるだけで、業務の世界は劇的に変わる。プロのエンジニアになる必要はない。
ただ自分の目の前にある煩わしい作業を。少しだけ賢く片付けるための道具として使えばいいのです。
Pandasで汚いデータを高速正規化
具体的な作業に入ろう。Pythonで表計算データのような二次元データを扱う際。pandasという強力なライブラリを使用する。Excelで行うような行と列の操作を、より高速に。より柔軟に実行できるツールです。

データクリーニング:正規化とPandas
そのため、最初のステップとして。システムから出力されたCSVファイルをpandasに読み込ませる。たった一行のコードで、数千件のデータがPythonのメモリ上に展開される。ここからが本番のデータクリーニングだ。読み込んだデータは汚い。空欄があり、不要な記号が混ざり、文字の形が揃っていない。これらを綺麗に整える作業を、ITの専門用語で「正規化」と呼ぶ。正規化を行わずにデータを比較するのは。
泥水の中でコンタクトレンズを探すようなものだ。どれだけ目を凝らしても見つからない。pandasには、特定の列に対して文字列の操作を一括で行う機能が備わっている。たとえば、氏名の列を指定し。そこに含まれる空白文字をすべて削除するという命令を出せる。行を一つずつループして処理する必要はない。列全体に対して一度に操作を適用するため、処理速度も桁違いです。
Pythonによる高速データクリーニング
事実、10万件の文字列置換処理で比較した場合。Excel VBAが数分かかってフリーズするような処理であっても。Pythonのpandasであればわずか1〜2秒で平然と完了する。
データの中には、氏名そのものが欠損している行も存在するかもしれない。退職者のデータが不完全に残っているケースや。システムエラーで空行が紛れ込んだケースだ。こうした不要な行を事前に取り除くことも。名寄せの精度を高めるための必須条件になる。データを比較する前に、比較するに値する状態まで磨き上げる。それがデータクリーニングの本質です。
ここで一度立ち止まって考えてみてください
Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。
`unicodedata`による氏名データの正規化
しかし、いよいよ核心に迫る。不一致の最大の原因である「スペース」と「文字幅」をどう制圧するかです。

unicodedataで氏名統一
ただスペースを消すだけでは足りない。「齊藤」と「斉藤」のような異体字は別問題として。英数字やカタカナの全角半角が混在しているケースも厄介だ。ここで強力な助っ人が登場する。Pythonの標準機能であるunicodedataライブラリだ。unicodedataライブラリによる正規化が氏名照合には不可欠である。このライブラリの「normalize」という機能を使うと。
全角の英数字やカタカナを強制的に半角に揃える。あるいはその逆に揃えるといった処理を確実に行える。文字の内部的なコード基準(Unicode)に従って機械的に変換するため。人間が思いつかないような特殊な文字が混ざっていても漏れがない。氏名列に対して、はじめにunicodedataで全角半角を統一する。その上で。文字列操作のメソッドを使って全角スペースと半角スペースを完全に削除する。
この2ステップの処理を経たデータは、美しく磨き上げられた純金のような状態になる。
unicodedata、文字の表記ゆれ解消
unicodedataの存在を知らず。replaceで思いつく限りの全角文字を一つずつ半角に変換する辞書を自作していた時期があった。コードが500行を超えたあたりで「絶対に何か間違っている」と気づき。標準ライブラリの1行で同じことができると知った時は。恥ずかしさでパソコンの電源をそっと落とした。
さらに、これで「山田 太郎」も「山田 太郎」も「山田太郎」も。すべて同じ「山田太郎」という文字列に変換される。システムAとシステムBのデータが、ようやく同じ土俵に立ったのだ。人間の目には見えないデータのゆがみが。Pythonの力によって完全に矯正された瞬間です。
人事データ重複排除の落とし穴と安全策
データの形が整えば、あとは重複しているデータを取り除くだけだ。pandasには重複排除のための専用メソッド「drop_duplicates()」が用意されている。

人事名寄せ、同姓同名の惨事回避
これを呼び出すだけで、同じ氏名の行が複数あった場合。一つだけを残して残りを消去してくれる。いかにも簡単そうに見える。しかし、ここには恐ろしい罠が潜んでいる。pandasのdrop_duplicates()だけでは表記揺れに対応できない。事前に徹底した正規化を行っていない状態でこのメソッドを実行しても。期待した結果は得られない。「山田 太郎」と「山田太郎」は依然として別人と見なされ。
重複排除をすり抜けてしまうからだ。だからこそ、前段での徹底したクリーニングが活きてくる。そしてもう一つ、人事データ特有の致命的な問題がある。同姓同名だ。数百人規模の企業になれば「鈴木一郎」が複数人存在する可能性は十分にある。正規化によって名前の文字列を完全に一致させてしまった場合。本来別人物である二人を「重複している」と判定し。片方のデータを消し去ってしまう危険性がある。
名寄せの恐怖、給与を守る多要素連携
まず、テスト環境で名寄せスクリプトを回した際。同姓同名の新入社員とベテラン社員のデータが一つに統合されてしまった。役職が消え、基本給が新入社員のものに上書きされた結果を見た瞬間。全身の血の気が引いて手汗が止まらなくなった。本番環境でやらなくて本当に良かった。
給与システムに連携するデータでこの事故が起きれば、大惨事になる。他人の口座に給与が振り込まれるか、あるいは給与未払いが発生する。背筋が凍る事態だ。これを防ぐためには、氏名以外の要素を組み合わせる必要がある。生年月日や入社年月、所属部署のコードなどだ。drop_duplicates()は、複数の列を条件として指定できる。氏名が同じでも、生年月日が異なれば別人として扱う。
そうした安全装置を組み込んだ上で、はじめて名寄せの自動化は完成する。単にコードが動けばいいわけではない。データの背景にある「人間」を想像する力が、人事データの取り扱いには求められる。
Pythonで実現する時間と精神的余裕
システムの壁に阻まれ、無駄な照合に時間を溶かす日々には終止符を打つべきです。

Pythonが解放する時間と人間が為すべきこと
次に、Pythonという武器を手に入れれば、月末の恐怖はなくなる。数時間の作業が、ほんの数十秒のスクリプト実行に置き換わる。手作業による見落としやコピペミスという人的エラーも、完全に排除されるのだ。ツールを導入すること自体が目的ではない。本当に手に入れたいのは。泥臭い作業から解放されたことによって生まれる「時間」と「精神的余裕」である。
何時間も画面を睨みつけ、目を酷使する作業は人間のやることではない。システムが吐き出した不完全なデータを。人間が必死にパッチワークしてシステムに戻す。そんな矛盾した光景は、一刻も早く終わらせるべきだ。名寄せの苦痛から解放されたら、その時間を何に使うべきか。従業員のモチベーション向上施策の企画、採用面接の質を高めるための準備。あるいは働きやすい環境づくり。
本来、人事・バックオフィス部門が取り組むべきコア業務はいくらでもある。データの手直しに追われている間は、そうした前向きな仕事には決して着手できない。データの整形は機械に任せ、人間は人間にしかできない仕事に向き合う。それこそが、テクノロジーを業務に取り入れる最大の意義だ。今日からPythonを立ち上げ、あの忌まわしいCSVファイルに立ち向かうのです。
関連リンクとチェックリスト
著者はこうして解決の糸口を見つけた
著者も同じ境遇から始まりました。独学でここまで自動化した道のりを参考にしてみてください。
学習サービスとアンケート
このスキルを活かしてさらに前へ進むなら
Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。

