見出し画像

第3回 数値化と再分類でデータをもっとリッチに

シティズンデータサイエンスラボは「データサイエンスを全ての人に」を掲げる株式会社データビークル(https://www.dtvcl.com/)が運営する公式noteです。

活用できるデータの項目

前節では「顧客ごと」「レシート1行ごと」という粒度の異なる形式のデータを結合し、集計することで「活用のためのデータ」に加工する考え方を学びました。「活用のためのデータ」は顧客ごとあるいは商品ごとに一行ずつ、という形式にそろえた1枚の表となる必要があり、こうした作業が必要になります。

また、1枚の表になっているというだけではなく、データ分析で使える説明変数やAIで活用できる特徴量は、基本的に「(大小が意味を持つ)数値」であるか「(数十個程度への)分類」といったものでなければなりません。ここまで題材としたデータにおける、顧客の生年月日と住所、購買商品と購買日時といった項目はまだこの形式ではないので、「活用のためのデータ」にはなっていません。

せっかく蓄積されたデータを利用しない、あるいは捨ててしまうというのはたいへんもったいないことですので、こうした項目についても何とか、数値や分類という状態に加工することを考えてみましょう。

「大小が意味を持つ数値」とは

念のためこの「大小が意味を持つ」という意味を少し補足しておきましょう。たとえば身長が170㎝だとか体重が60㎏だとかの数値は「大小が意味を持つ」という条件を満たしています。170㎝の人よりも180㎝の方が長身だとか、60㎏の人より50㎏の人の方が軽い、という比較を私たちは日常的に行なっています。もちろん前節で取り扱った、商品の金額だとか、その件数をカウントした「総購買商品点数」といった集計値も大小が意味を持つ数値です。

先ほど「顧客の生年月日」という項目については、このままでは大小が意味を持つ数値ではない、と述べましたが、皆さんは生年月日から「年齢」というその大小が意味を持つ数値を計算するための方法をご存じのはずです。生年月日に限らず、現在の日付との差分を考えれば数値化できる日付データはたくさんあります。たとえばポイントカードをいつ作ったか、という登録日の情報があった時、現在日付との差分は「お店と顧客の付き合いの長さ」を表わすと考えられるでしょう。また、顧客ごとに複数ある購買日時に対して最大値( つまり最新のもの)という集計を行った後、現在日付との差分を考えれば「最近来店してくれているか」を表わす数値だと考えることもできます。

これが郵便番号や野球の背番号だとどうでしょうか?たとえばハイフンなしで書くと、東京都庁の郵便番号は1638001、仙台市役所の郵便番号は9808671、鳥取市役所については6808571という数になります。これを仮に数字として扱った場合に「大小が意味を持つ」比較は考えられるでしょうか?地域の人口や所在地の緯度経度を示しているわけでもなく、単に郵便物を円滑に配達するための記号でしかありません。

同様に、高校野球であれば、レギュラーメンバーについてはキャッチャーが2番で、ショートが6番というように背番号が割り振られますが、「数が小さければ小さいほど偉い」というわけでもありません。異なるポジションを数字で区別しているだけです。

日本のスーパーマーケットの多くが、「何の商品を買ったか」という情報をJANコードで管理しているかと思います。それ以外のビジネスでも商品を識別するためのIDは、整数を用いていることが多いかもしれません。こうした数値は郵便番号や背番号と同様に「大小が意味を持つ」わけではないため、数値だからといってそのまま活用のためのデータにはなりません。

数字を使っていようが、文字を使っていようが、商品や場所などを「区別するための項目」であれば、そのように扱わなければいけません。ここで注意しておきたいのが「あまりに細かく区別するような項目は活用のためのデータにおいて役に立たない」というポイントです。

数十個程度に分類する意味と方法

活用のためのデータにおいて「もっとも細かく区別する項目」は、顧客ごとなら顧客ID、商品ごとなら商品ID、というように1行ずつの形式にまとめられた際のユニークなIDです。1行ごとに重複なく1つずつの値が割り振られており、これ以上細かく分けることはできません。

このようなIDは慣例的に、後々データを確認できるよう最終的なデータの左端に、「念のため」つけられることがありますが、実際にいざデータ分析をする、あるいはAIに用いようとする場合に説明変数や特徴量として使われることはありません。なぜでしょうか?

ここでは、顧客ごとに1行という「活用のためのデータ」を作って、「どのような顧客の総購買金額が高いか」という分析を行なう際のことを考えてみましょう。顧客ごとの購買金額の差を「説明するかもしれない変数」の候補として顧客IDを含めていれば、「顧客IDが123456の顧客の総購買金額は平均よりも1万円高い」という結果が得られるかもしれませんが、そんな情報は役に立つでしょうか?

おそらく役には立ちません。その条件を満たす顧客はこの世にたった1人しかおらず、今後別の顧客にゲンがいいからと「顧客IDを123456 に割り振る」といったことをしても売上はまったくあがりません。単に顧客IDがユニークでなくなり、データが活用できなくなるだけの話です。

優良顧客をリストアップするというだけなら、データ分析の必要などありません。後の章で詳述しますが、データ分析をする意味とは、データの背後に存在する「なぜか購買金額の高い顧客に共通した条件」を見つけることです。

仮にたった1人の優良顧客だけが当てはまる条件を見つけても、それは「たまたまその人が当てはまっているだけ」で今後役に立たない情報かもしれません。しかし、たとえば数十名以上の優良顧客には高い割合で当てはまって、数十名以上のそうでない顧客についてはほとんど当てはまらない、という条件を見つければ、統計学は「これがたまたまと言えるような傾向なのかどうか」を判断することができます。したがって、「顧客IDが123456 の顧客の総購買金額は平均よりも1万円高い」というような結果は、統計学を使ったデータ分析を行なうと「たまたまかもしれない」と判定されてしまうだけの無意味なものになってしまうでしょう。

これはAIでも同じことです。現在主流のAI技術では「統計的機械学習」と呼ばれている計算が行なわれていますが、たった1人にしか該当しないような「顧客IDがいくつか」という特徴を使って、顧客の購買金額を予測させるようなAIを作ったとしても、新しい顧客が来た時にその情報は役に立ちません。なぜなら顧客IDをユニークに管理し続ける限り、二度と「顧客IDが123456」という新規顧客が現れることはないからです。

このように、活用のためデータを1行ずつ完全に区別するような項目は「後々確認するため」以外の目的で使うことはできません。これが「あまりに細かく区別するような項目は活用のためのデータにおいて役に立たない」という状況の一番極端な例です。ではどれぐらいの細かさであれば活用のためのデータにおいて役に立つのでしょうか?

技術的な最低ラインの目安は、活用のためのデータにおいて「最低数十行程度は該当するもの/しないものがあるように」というものです。つまり、顧客ごとに1行ずつ、という形式に加工しているならば、最低数十人程度以上の該当する顧客もいるし、最低数十人程度以上該当しない顧客もいる、という分け方なら無意味というわけではありません。この水準を満たせば、統計学やAIが「偶然とは言いがたい」と、分析結果やAIのアルゴリズムに採用する可能性がないわけではない、ということです。

ただし、最初からとにかく細かく分けておけばよいかというとそうとも言い切れません。細かく分ければ分けるほど分析結果に目を通す手間が増え、その解釈から価値を生むアクションにつなげる際に困難が伴います。たとえば全国展開するスーパーマーケットのチェーンにおいて、最低数十人くらいは該当するだろうと、顧客の住所を細かく「何丁目」という区分で分析すれば、途方もない数の「大事なエリアがどこか」という情報が出力されることになります。その確認はたいへんな手間を生み、折り込みチラシなどの広告媒体をこの「何丁目」というレベルで管理するのもとんでもない手間です。

またAIを開発する場合にも、このような細かい粒度で区分するような特徴量を用いては計算量が増え、その分開発の時間やコストが跳ね上がってしまいます。だからといって実用上、今後の優良顧客の識別に役立つかというとそうでもありません。数十万人の既存顧客のうち、数十人だけが該当するような特徴をAIが利用したとして、そのメリットが得られるのは1万人の新規顧客のうちわずか1人だけ、ということになるでしょう。

分析結果が理解しやすくなるように、という私たちの慣例的な目安は「まずは数十個程度に分類」というものです。たとえば全国の顧客の住所を分類するのであれば、まずは都道府県のレベルに分けて考えます。あるいは同じ項目から「政令指定都市かどうか」「首都圏かどうか」という分類を考えても構いません。また同じ元データからこれら複数の分類が考えられる際に、同時に「活用のためのデータ」内に含めてしまっても構いません。個別の商品IDも、ひとまずは生鮮食料品か、惣菜か、というように数十個程度の大分類を用いましょう。商品IDとしてJANコードを使っているのであれば、JICFS分類という標準的な分け方を採用するのもよいでしょう。

また、地域を区別するような文字列(住所)や商品を区別するような数字(商品ID)だけでなく、生年月日や購買日時といった日時についても、分類すれば説明変数や特徴量として使うことができます。「その日付が何月か」という分け方であれば12に分類できます。「何曜日か」であれば7つ、「月の上旬か中旬か下旬か」と3つに分けられます。いずれにしても数十個程度以内に分けることができれば、興味深い説明変数やよい特徴量として使うことができるでしょう。

なお顧客ごとに1行ずつという形式に加工すれば、購買した商品のジャンルを数十程度に再分類しても、その情報は1人につき複数存在しえます。顧客が複数回来店していれば、お菓子を買うことも雑貨を買うこともあるでしょう。このような場合も集計が必要で、「過去に何個のお菓子を買ったか」というカウントや「過去に買った商品数に占めるお菓子の割合は何%か」というように割合を計算します。

顧客1人につき複数行存在しうる購買日時についても同様で、「それが何月か」と分類した上で、「過去12月に購買した商品は何個あるか」とカウントしたり、「過去の購買に占める8月の割合は何%か」と割合を求めたりすることができます。このように分類したものを集計すれば、立派な「大小が意味を持つ数値」となるわけです。ただし、このような数値化や再分類ができるのも「データがキレイに管理されているかどうか」に大きく依存します。現実にはデータの抜け漏れや異常値、結合のキーと同様の表記の揺れ、という問題などにより、数値化や再分類が難しくなる場合があります。次節ではこれらの対処法について詳しく学んでいきましょう。