特定の製品を買ったことがあるかどうか顧客ごとにラベルづけする方法

今回は売上データを使用していきます。

このデータは一行が一注文のデータになっていて、顧客ID(Customer ID)や製品のカテゴリー(Category)、売上(Sales)の列があります。

今回の目的としては、アートを買ったことがある人は他にどんな商品を注文しているのかを知りたいとします。

そのため、アートを買ったことがある人たちにTRUE、アートを買ったことがない人にはFALSEのラベルをつけたいです。

この問題は、anyという集計関数を使うことで解決することができます。

any関数は下記のシンタックスとなります。

any(<条件式>)

今回の場合は、アートを買ったことがあるかどうかが条件式になるので、下記のようになります。

any(Category == "Art")

ちなみに、集計とはグループごとに複数ある行を一行にまとめることを言います。

以下はsumという集計関数を使って、顧客ごとに売上の合計値を集計したものです。

any関数の場合、顧客ごとにアートを一度でも買ったことがあるとTRUEを返すことができます。

それでは、集計(Summarize)を使って顧客ごとにアートを買ったことがあるかどうかをany関数を使ってラベルをつけていきます。

Customer IDの列ヘッダメニューから集計(Summarize) を選択します。

集計のダイアログが表示されました。

値にはデフォルトでは行の数が選択されているので、顧客ごとの注文数(行数)が集計されています。

アートを買ったことがあるかラベルをつけたいので、値にCategoryを選択します。

しかし、集計関数を見るとanyが見つかりません。

そんな時は、値にカスタムを選択します。

カスタムの計算を作成のダイアログが表示されました。

下記の計算式を入力してOKボタンをクリックします。

any(Category == "Art")

プレビューを見ると、アートを一度でも買ったことがある人はTRUEとなっています。

実行ボタンをクリックすると、顧客ごとに一度でもアートを買ったことがある人にTRUEのラベルをつけることができました。

しかし、ここで一つ問題点があります。

集計は行を集約するので元の注文データが失われてしまいます。

もし顧客ごとにアートを買ったことがあるかどうかだけをみたいのであれば、集計で問題ありません。

しかし、今回はアートを買ったことのある顧客が他にどんな注文をしたのかをみたいです。つまり、元の注文の詳細データを残しておいた上で顧客にTRUEのラベルをつける必要があります。

元の行を残したまま行ごとに計算したい場合は、「計算を作成」を使用しますが、実はここでも集計関数を使うことができます。

集計関数sumを「計算の作成」で使った場合を見てみましょう。

Salesの列ヘッダメニューから計算を作成(Mutate) を選択します。

計算を作成のダイアログが表示されました。

計算エディタに下記の計算式を入力して実行します。

sum(Sales)

sumなどの集計関数を使うと全ての行に対して計算した結果が返されます。

次に、集計関数anyを「計算の作成」で使った場合も見てみます。

Categoryの列ヘッダメニューから計算を作成(Mutate) を選択します。

計算を作成のダイアログが表示されました。

計算エディタに下記の計算式を入力して実行します。

any(Category == "Art")

any関数も他の集計関数と同じく、全ての行に対して計算した結果が返されるため、一行でもアートを買った注文があれば、TRUEが全ての行に返されてしまいます。

では、計算を作成で顧客ごとに計算するためにはどうすればよいのでしょうか?

実は、集計でグループごとに計算されていたのは、裏でグループ化の処理が行われているからです。

そのため、グループ化を計算を作成の前に使用することで、顧客ごとにアートを一度でも買ったことがあるかどうかラベルをつけられます。

具体的には、Customer IDでグループ化をします。

グループ化により、Customer IDごとに、Artを一度でも買ったことがあればTRUEを返すことができます。

計算を作成の前のステップを選択します。

Customer IDの列ヘッダメニューからグループ化を選択します。

Customer IDでグループ化することができました。

あとはもう簡単です!

any関数を使った計算を作成のステップを選択します。

行をまとめずに、アートを一度でも買ったことがある人にTRUEのラベルをつけることができました!

集計は行をまとめて計算結果を返すのに対し、計算を作成は元の行を保持したまま計算結果を返すことができるという違いがあります。