Challenge #8: Aggregate Consumer Purchases 〜購買パターンを集計する〜 Alteryx Weekly Challenge

2018.10.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、にいのです。

Alteryx Communityでは毎週課題が与えられ、条件を満たすワークフロー作成に挑戦できるWeekly Challengeというコンテンツがあります。 当ブログでも挑戦した成果を発表するWeekly Challengeシリーズが盛り上がっており、ブログを公開するとメンバーから「こういうやり方もあるよ!」と別解を教えてもらえることもあります。

今回は「Challenge #8: Aggregate Consumer Purchases」で購買パターンの集計に挑戦しました。

問題内容

Challenge#8のお題は、対象となる購買パターンの集計です。

とあるお店がMeal Dealというセット割引の制度を導入しようとしており、 BurgerPizza と一緒に SideDrink を購入するパターンの割引を検討しています。

インプットファイルには「購買実績(Point of Sale)」と「商品のタイプテーブル(Lookup Table)」の2種類が用意されています。

購買実績(269375レコードあります!):

商品のタイプテーブル:

上記インプットファイルを、下記の形でアウトプットすることがゴールです。

  • Potential Meal Deal 2013/7/1以降のMeal Dealに該当するパターンの購買実績の総数
  • Total 2013/7/1以降の購買の総数
  • % 購買総数に占めるMeal Dealに該当するパターンの購買実績の割合

購買実績の商品をタイプ分けし、該当の購買パターンを集計することが今回のポイントとなります。それでは、早速実践していきます。

実践!

私が作成したワークフローはこちらです。

ツール数が多くなってしまいましたが、このフローで実現している処理は下記の通りです。

  1. 購買実績を2013/7/1以降のレコードに絞る
  2. 購買実績の商品にタイプを付与する
  3. Meal Deal対象の商品にフラグを付与
  4. Meal Deal対象となる購買パターンとそうでないものに分ける
  5. 購買総数に占めるMeal Dealに該当するパターンの購買実績の割合を計算

購買実績を2013/7/1以降のレコードに絞る

今回の対象は2013/7/1以降のデータですので、初期段階で日付を絞ります。データをフィルターするのに適しているFilter Toolを使い、2013/7/1以降のデータを抽出します。

購買実績の商品にタイプを付与する

購買実績には商品名は記載されていますが、タイプがないのでPizzaなのかDrinkなのかわかりません(なんとなくはわかりますが…)。そこで、購買実績と商品タイプテーブルとを商品名をキーにして突合させ、購買実績にタイプを付与しましょう。ExcelであればVLookup関数を使用しますが、AlteryxではJoin Toolを使って実現可能です。

「Join by Specific Fields」をキーとなる「Desc」に設定し、商品タイプテーブルの「Desc」は不要なためチェックを外します。

実行すると右端にタイプが付与されました。

Meal Deal対象の商品にフラグを付与

購買実績にタイプが付与されたはいいのですが、実は商品タイプにはSoupSaladといったMeal Dealの割引対象外のものがあります。Formula Toolを使って対象となるBurgerPizzaDrinkSideのみにフラグを付与しましょう。

今回はswitch文を使い、新たに「Flag」列を作成しました。対象のタイプにはフラグを付与し、そうでないものに関してはNullをセットしています。

実行すると、右端にFlag列が追加されました。

Meal Deal対象となる購買パターンとそうでないものに分ける

購買実績ごとにタイプを付与し、Meal Deal対象のタイプにフラグをつけることができました。次はMeal Dealに該当するパターンの実績とそうでないものに分けます。まずはCross Tab Toolを使って、購買実績をタイプ別に確認できるようにしましょう。

以下はCross Tab Toolの設定です。購買実績の単位(TicketID)でグループ化し、ヘッダは商品タイプ(Type)、値に前項で付与したFlagがセットされるよう設定しました。「Method for Aggregating Values」には、最初に見つかった文字を表示させる「First」を設定します。

実行するとタイプが列となり、値にフラグがセットされました。例えば、TicketID:102398の実績はDrink、Pizza、Sideの注文だったことがわかります。

Meal Dealの対象とならないSoupSaladは不要なため、Select Toolで消しておきましょう。

必要な項目のみに絞ることができました。スッキリです。

ついにMeal Dealのパターンにマッチするレコードとそうでないものを分けられる段階にやってきました。再びFilter Toolの出番です。注文した商品のタイプにはフラグが立っており、そうでないものにはNullがセットされているので、パターンにマッチするかどうかをIsNullを使って判断します。

Meal Dealの対象となるパターンは下記の3通りです。

Burger Pizza Drink Side
1 1 1 1
1 0 1 1
0 1 1 1

実行するとパターンにマッチするものはTrueに、

マッチしないものはFalseに出力されます。

購買総数に占める該当パターンの購買実績の割合を計算

購買実績に占めるMeal Dealのパターンの割合を、 Meal Dealのパターンに該当するレコード数 / 購買実績の総数 * 100で算出します。 前項で抽出した結果を元に、まずはMeal Dealのパターンに該当するレコード数を算出しましょう。ここではSummarize Toolを使用します。Fieldより「TicketID」を選択し、Actionsのドロップダウンリストより「Count」を選びます。

Meal Dealの対象となるパターンは10964件あるとわかりました。

購買実績の総数は、Filter Toolでデータをフィルタする直前のTicketIDをカウントします。実行結果は15497件です。

Summarize Toolが二手に分かれているので、Join Toolで結合します。

今回は単純に列を結合するだけなので「Join by Record Position」を選択し、列名を指定の通りリネームします。

必要な数値が揃ったので、Formula Toolを使って割合を計算します。

実行すると、ゴールと同じ形になりました!

おわりに

Weekly Challengeには難易度が設定されていますので、自分にあったレベルからスタートしてみるのもいいかもしれません。今回挑戦したWeekly Challenge#8はBeginnerレベルでしたが、そこそこのツール数となりました。特にCross Tab Toolの使い方の理解を深められるので、未挑戦の方はぜひチャレンジしてみてください。

Alteryxの導入なら、クラスメソッドにおまかせください

日本初のAlteryxビジネスパートナーであるクラスメソッドが、Alteryxの導入から活用方法までサポートします。14日間の無料トライアルも実施中ですので、お気軽にご相談ください。

alteryx_960x400