「なし」は一つではなく、「同じ」も一つではない
一言でいうと
同じファイルの中で「なし」は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桁のようなものが、ブロックのキーになります。ブロッキングはただではありません。ブロックが違えば、永遠に出会えません。そのため、ブロックのキーを選んだら、「このキーが見逃す組が何組あるか」を、小さなサンプルで総当たりの比較によって測り、その損失を文書に書きます。
実務で本当に大切なこと
- 直す前に数えます。表記ごとの件数の表が、すべての判断の根拠です。
- 平均を言うときは、分母も一緒に言います。数字が1つだけ書かれたレポートは、必ず聞き返されます。
- 0となしは別の事実です。ファイルだけを見てわからなければ業務に尋ね、答えを文書に書きます。
- 正規化は比較用、判定はルールで行います。そして、欠損が入った列はキーに使いません。
- ブロッキングの損失を測っておきます。出会えなかった組は静かです。
次のラボですること
3つのシステムから統合してきた顧客名簿を自分で作り、なしの表記を種類別に数え、欠損を0で埋めた平均と、除いて出した平均と、0まで除いた平均の3つを並べて出します。センチネル日付が平均処理期間をどう壊すかも、数字で見ます。そのあと、完全重複とキー重複を分け、正規化とブロッキングで比べる候補を減らし、判定ルールで同じ人をまとめます。最後に、ブロッキングが見逃した組を総当たりの比較で測り、その損失まで報告します。採点ツールは、毎回違う名簿を作り、作成したツールを実際に実行して答えを照合します。