TT Lab
はじめる
学ぶ 学習パス コース

顧客データを扱う

「なし」は一つではなく、「同じ」も一つではない

TT Labで続きを見る

一言でいうと

同じファイルの中で「なし」は5つの形で書かれて届き、「同じ」は3つの意味で使われます。どちらも表記ではなくルールで扱ってこそ、数字がぶれません。

なぜ必要なのか

顧客名簿を受け取って、平均購入額を出しました。57,500ウォンと出ました。顧客企業は46,000ウォンだと言います。同じファイルを見ているのに、答えが違います。

原因は、たいてい1か所です。金額の列に値がない行を、片方は除いて数え、もう片方は0で埋めて数えたのです。ところが、もっと困るのは、どちらも自分がそうしていることに気づいていないという点です。スプレッドシートの平均関数は空欄を除き、Pythonで書いたコードは、しばしばfloat(x or 0)で0を埋めます。どちらもエラーを出しません。

ここに表記の問題が重なります。1つのファイルの中で、なしが、空欄、NULL、NA、-、0、そして9999-12-31のようなセンチネル日付として混ざって届きます。システムが3つなら表記も3つで、統合するときに誰も統一しなかったからです。

どう動くのか

最初の仕事は数えることです。直す前に、表記ごとに何件かをまず出します。その表がなければ、どんな処理をしても、その処理が正しかったかどうかを判定できません。

2つ目は、0となしを分けることです。この2つは別の事実です。購入額が0ウォンの顧客は「登録はしたがまだ買っていない」で、購入額が空欄の顧客は「いくらかわからない」です。平均を出すとき、前者は分母に入り、後者は除かれる必要があります。ところが、ファイルに0と書かれていると、どちらなのかはファイルだけを見てもわかりません。そのため、0の件数を別に数えて報告し、どちらなのかは業務に尋ねます。

같은 400행, 같은 금액 칸
  결측을 0 으로 채운 평균     46,000원   분모 400
  결측을 뺀 평균              57,500원   분모 320
  0 까지 뺀 평균              61,333원   분모 300

3つの数字はすべて正しいです。違うのは何を数えたかで、それを言わないレポートは、間違ったレポートです。

3つ目がセンチネル値です。9999-12-31は、「まだ終わっていない」を日付の列に無理やり入れた表記です。これを日付として受け入れて処理期間を平均すると、数千年が出ます。滑稽に見えますが、実際には、こうした値が数件混ざるだけで平均が静かに膨らむだけで、目立ちません。

現場での姿

次は重複です。「同じ」には3つの意味があります。

種類 何か どう扱うべきか
完全重複 1文字まで同じ行が2回 1つだけ残す。判断することはない
キー重複 同じ識別子なのに内容が違う 自動では直せない。どちらが正しいかを業務に尋ねる
人の目にだけ同じもの 表記だけが違う同じ対象 正規化して、ルールを立てて判定する

3つ目が難しいです。문샵、(주)문샵、문샵 주식회사(社名の表記違いの例です)は、人には1つですが、機械には3つです。そのため、比較の前に正規化します。前後の空白を取り除き、法人の表記を取り除き、大文字小文字をそろえ、電話番号から数字だけを残します。

ここで最もよくある事故が起きます。正規化は比較のためのものであって、マージの根拠ではありません。名前を正規化したら2つの値が同じになったからといって、同じ会社とは限りません。支店が違うのかもしれず、社名がたまたま同じなのかもしれません。そのため、判定ルールは複数の列を一緒に見ます。たとえば、「正規化したメールアドレスが同じなら同じ人」、あるいは「名前と電話番号が両方とも同じなら同じ人」です。

そして、欠損が入った列は、判定のキーに使えません。メールアドレスが空の行どうしを「メールアドレスが同じ」としてまとめると、互いに別の顧客数十人が1人になります。この事故は静かで、結果だけを見ると、重複の除去がとてもうまくいったように見えます。

最後はブロッキングです。1万行をすべて組み合わせて比べると、約5千万組です。そこで、まず安いキーで行を分け、同じブロックの中だけで比べます。電話番号の下4桁のようなものが、ブロックのキーになります。ブロッキングはただではありません。ブロックが違えば、永遠に出会えません。そのため、ブロックのキーを選んだら、「このキーが見逃す組が何組あるか」を、小さなサンプルで総当たりの比較によって測り、その損失を文書に書きます。

実務で本当に大切なこと

次のラボですること

3つのシステムから統合してきた顧客名簿を自分で作り、なしの表記を種類別に数え、欠損を0で埋めた平均と、除いて出した平均と、0まで除いた平均の3つを並べて出します。センチネル日付が平均処理期間をどう壊すかも、数字で見ます。そのあと、完全重複とキー重複を分け、正規化とブロッキングで比べる候補を減らし、判定ルールで同じ人をまとめます。最後に、ブロッキングが見逃した組を総当たりの比較で測り、その損失まで報告します。採点ツールは、毎回違う名簿を作り、作成したツールを実際に実行して答えを照合します。